<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://wiki.callooh.com/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Alois</id>
	<title>Callooh Wiki - Benutzerbeiträge [de]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.callooh.com/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Alois"/>
	<link rel="alternate" type="text/html" href="https://wiki.callooh.com/index.php?title=Spezial:Beitr%C3%A4ge/Alois"/>
	<updated>2026-10-03T05:37:03Z</updated>
	<subtitle>Benutzerbeiträge</subtitle>
	<generator>MediaWiki 1.45.1</generator>
	<entry>
		<id>https://wiki.callooh.com/index.php?title=MaDeCo&amp;diff=920</id>
		<title>MaDeCo</title>
		<link rel="alternate" type="text/html" href="https://wiki.callooh.com/index.php?title=MaDeCo&amp;diff=920"/>
		<updated>2011-06-26T23:20:51Z</updated>

		<summary type="html">&lt;p&gt;Alois: /* MaDeCo - Protokoll zur Kommunikation im RoLoMa Projekt */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;MaDeCo ist ein sehr einfaches textbasiertes Protokoll für die Kommunikation zwischen den Beteiligten im [[RoLoMa]] Projekt, den [[NIBObee]] Einheiten und der Basisstation, dem [[LPC2478]].&lt;br /&gt;
&lt;br /&gt;
== Rollen ==&lt;br /&gt;
Es gibt unter den Beteiligten zwei festgelegte Rollen, Sender und Empfänger. Der Sender überträgt Information, der Empfänger hingegen hat eine überwiegend passive Funktion, er quittiert Nachrichten und übermittelt einen Acknowledge Code.&lt;br /&gt;
Während der Kommunikation werden diese Rollen nicht gewechselt.&lt;br /&gt;
&lt;br /&gt;
== Format ==&lt;br /&gt;
Eine Nachricht besteht aus genau zwei Datensätzen, ein Datensatz besteht jeweils aus einem 3 Zeichen breiten Header Teil, einem 2 Zeichen breiten Datenteil (je nach Kommando optional oder mandatory) und einem Zeilenende (&amp;quot;\n&amp;quot;), das als einzelnes Zeichen CR (0x0d) realisiert ist.&lt;br /&gt;
&lt;br /&gt;
Beide Teile der Nachricht werden unmittelbar hintereinander gesendet, also z.B. als &#039;&#039;SEQ13\nOPMSM\n&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Eine Nachricht, wie sie ein Sender erstellt, besteht aus:&lt;br /&gt;
 &amp;lt;Sequence&amp;gt;&lt;br /&gt;
 &amp;lt;Command&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;&amp;lt;Sequence&amp;gt;&lt;br /&gt;
: besteht aus dem Header &#039;&#039;SEQ&#039;&#039;, der Datenteil aus einer Nummer zwischen 1 und 99.&lt;br /&gt;
;&amp;lt;Command&amp;gt;&lt;br /&gt;
: besteht aus dem 3 Zeichen langen [[MaDeCo#Commands|Command-Code]], und einem entsprechenden Datenteil.&lt;br /&gt;
&lt;br /&gt;
Eine Nachricht muss mit einer Antwort quittiert werden. Diese besteht aus:&lt;br /&gt;
 &amp;lt;Acknowledge&amp;gt;&lt;br /&gt;
 &amp;lt;Acknowledge Code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;&amp;lt;Acknowledge&amp;gt;&lt;br /&gt;
: besteht aus dem Header &#039;&#039;ACK&#039;&#039; und der zu bestätigenden Sequence Number.&lt;br /&gt;
;&amp;lt;Acknowledge Code&amp;gt;&lt;br /&gt;
: besteht aus den Header &#039;&#039;ACC&#039;&#039; und dem [[MaDeCo#Acknowledge Codes|Code]].&lt;br /&gt;
&lt;br /&gt;
Beispiel sind be den jeweiligen [[MaDeCo#Use Cases|Use Cases]] zu finden.&lt;br /&gt;
&lt;br /&gt;
=== Commands ===&lt;br /&gt;
 EOC ... end of communication, signalisiert das Ende einer Kommunikation&lt;br /&gt;
 OPM ... Operation Mode (siehe [[MaDeCo#Betriebsmodus|Betriebsmodus]])&lt;br /&gt;
 WAP ... Waypoint (siehe [[MaDeCo#Wegpunkte|Wegpunkte]])&lt;br /&gt;
 DIR ... Angabe der Richtung im GO Betriebsmodus (siehe Kürzester Weg)&lt;br /&gt;
&lt;br /&gt;
=== Acknowledge Codes ===&lt;br /&gt;
 00 .. OK, Command acknowledged&lt;br /&gt;
 01 .. unknown Command&lt;br /&gt;
 02 .. invalid data&lt;br /&gt;
 03 .. overflow (kann z.B. derzeit keine weiteren Richtungsanweisungen entgegennehmen)&lt;br /&gt;
 11 .. unbekannter Betriebsmodus (e.g. OPMXX)&lt;br /&gt;
 21 .. command refused, Labyrinth erkunden (OPMSM) vor [[NIBObee#Kalibrierung]] (OPMGA)&lt;br /&gt;
&lt;br /&gt;
=== Betriebsmodus ===&lt;br /&gt;
 GA ... Kalibrieren (siehe [[NIBObee#Kalibrierung]])&lt;br /&gt;
 SM ... Labyrinth erkunden&lt;br /&gt;
 GO ... kürzesten Weg nehmen (siehe Kürzester Weg)&lt;br /&gt;
&lt;br /&gt;
=== Wegpunkte ===&lt;br /&gt;
Die Übertragung eines Wegpunkts erfolgt durch Angabe der Richtung (S,W,N,E), gefolgt von der Anzahl der Streckenteile.&lt;br /&gt;
 Beispiel: WAPS4   der Wegpunkt befindet sich 4 Streckenteile südlich des zuletzt übertragenen Wegpunkts&lt;br /&gt;
&lt;br /&gt;
== Ablauf ==&lt;br /&gt;
Im [[RoLoMa]] Projekt muss die Kommunikation aus Nachricht-Antwort Sequenzen bestehen. Wird eine gesendete Nachricht nicht bestätigt, erfolgt eine Neuübertragung nach dem RETRANSMISSION_TIMEOUT Interval.&lt;br /&gt;
Erfolgt auch nach RETRANSMISSION_COUNT Wiederholungen keine Antwort, wird die Übertragung abgebrochen und ein Fehler signalisiert.&lt;br /&gt;
&lt;br /&gt;
Kommunikationen überschneiden sich nicht, das bedeutet, es findet zu jedem Zeitpunkt nur eine Kommunikation zwischen den Beteiligten statt. Daher ist auch zu jedem Zeitpunkt genau ein Teilnehmer der Sender, und ein Teilnehmer der Empfänger.&lt;br /&gt;
&lt;br /&gt;
== Use Cases ==&lt;br /&gt;
Im folgenden werden Beispiele für die Kommunikation der unterschiedlichen Betriebsarten dargestellt. Daten vom Board werden normal, die von der NIBObee &#039;&#039;&#039;fett&#039;&#039;&#039; dargestellt.&lt;br /&gt;
&lt;br /&gt;
=== Kalibrieren ===&lt;br /&gt;
Beim Kalibrieren wird das Kommando vom Board an die NIBObee geschickt und auch bei Erhalt sofort quittiert (sonst würde es zu einem Timeout kommen). Nachdem die Kalibrierung abgeschlossen ist wird die Verbindung getrennt.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Beispiel:&#039;&#039;&lt;br /&gt;
 SEQ1 &lt;br /&gt;
 OPMGA&lt;br /&gt;
 &lt;br /&gt;
 &#039;&#039;&#039;ACK1&#039;&#039;&#039; &lt;br /&gt;
 &#039;&#039;&#039;ACC00&#039;&#039;&#039;&lt;br /&gt;
 &lt;br /&gt;
 &#039;&#039;&#039;SEQ2&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;EOC&#039;&#039;&#039;&lt;br /&gt;
 &lt;br /&gt;
 ACK2 &lt;br /&gt;
 ACC00&lt;br /&gt;
&lt;br /&gt;
=== Labyrinth erkunden===&lt;br /&gt;
Das Kommando wird vom Board an die NIBObee geschickt und auch bei Erhalt sofort quittiert (es muss vorher allerdings eine Kalibrierung durchgeführt worden sein). Danach werden laufend die Punkte geschickt die abgefahren werden. Wenn das ganze Labyrinth erfasst wurde wir die Kommunikation wieder beendet.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Beispiel:&#039;&#039;&lt;br /&gt;
 SEQ1 &lt;br /&gt;
 OPMSM&lt;br /&gt;
 &lt;br /&gt;
 &#039;&#039;&#039;ACK1&#039;&#039;&#039; &lt;br /&gt;
 &#039;&#039;&#039;ACC00&#039;&#039;&#039;&lt;br /&gt;
 &lt;br /&gt;
 &#039;&#039;&#039;SEQ2&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;WAPN3&#039;&#039;&#039;&lt;br /&gt;
 &lt;br /&gt;
 ACK2 &lt;br /&gt;
 ACC00&lt;br /&gt;
 &lt;br /&gt;
 &#039;&#039;&#039;SEQ3&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;WAPE1&#039;&#039;&#039;&lt;br /&gt;
 &lt;br /&gt;
 ...&lt;br /&gt;
 &lt;br /&gt;
 &#039;&#039;&#039;SEQ32&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;EOC&#039;&#039;&#039;&lt;br /&gt;
 &lt;br /&gt;
 ACK32 &lt;br /&gt;
 ACC00&lt;br /&gt;
&lt;br /&gt;
=== Kürzester Weg === &lt;br /&gt;
Hier werden Richtungsanweisungen übertragen, die es der [[NIBObee]] ermöglichen, in einem Labyrinth den kürzesten Weg zu nehmen. Die Richtungen werden wieder mit Himmelsrichtungen beschrieben, diesmal allerdings ohne Längenangabe da immer bis zur nächsten Kreuzung gefahren wird. &lt;br /&gt;
In dem Beispiel wird der kürzeste Weg als S(üd)-W(est)-N(ord)-W(est) angegeben:&lt;br /&gt;
 SEQ1 &lt;br /&gt;
 OPMGO&lt;br /&gt;
 &lt;br /&gt;
 &#039;&#039;&#039;ACK1&#039;&#039;&#039; &lt;br /&gt;
 &#039;&#039;&#039;ACC00&#039;&#039;&#039;&lt;br /&gt;
 &lt;br /&gt;
 SEQ2 &lt;br /&gt;
 DIRS &lt;br /&gt;
 &lt;br /&gt;
 &#039;&#039;&#039;ACK2&#039;&#039;&#039; &lt;br /&gt;
 &#039;&#039;&#039;ACC00&#039;&#039;&#039;&lt;br /&gt;
 &lt;br /&gt;
 SEQ3 &lt;br /&gt;
 DIRW &lt;br /&gt;
 &lt;br /&gt;
 &#039;&#039;&#039;ACK3&#039;&#039;&#039; &lt;br /&gt;
 &#039;&#039;&#039;ACC00&#039;&#039;&#039;&lt;br /&gt;
 &lt;br /&gt;
 SEQ4 &lt;br /&gt;
 DIRN &lt;br /&gt;
 &lt;br /&gt;
 &#039;&#039;&#039;ACK4&#039;&#039;&#039; &lt;br /&gt;
 &#039;&#039;&#039;ACC00&#039;&#039;&#039;&lt;br /&gt;
 &lt;br /&gt;
 SEQ5 &lt;br /&gt;
 DIRW &lt;br /&gt;
 &lt;br /&gt;
 &#039;&#039;&#039;ACK5&#039;&#039;&#039; &lt;br /&gt;
 &#039;&#039;&#039;ACC00&#039;&#039;&#039;&lt;br /&gt;
 &lt;br /&gt;
 SEQ6 &lt;br /&gt;
 EOC&lt;br /&gt;
 &lt;br /&gt;
 &#039;&#039;&#039;ACK6&#039;&#039;&#039; &lt;br /&gt;
 &#039;&#039;&#039;ACC00&#039;&#039;&#039;&lt;br /&gt;
 &lt;br /&gt;
[[Kategorie:FH]]&lt;/div&gt;</summary>
		<author><name>Alois</name></author>
	</entry>
	<entry>
		<id>https://wiki.callooh.com/index.php?title=MaDeCo&amp;diff=919</id>
		<title>MaDeCo</title>
		<link rel="alternate" type="text/html" href="https://wiki.callooh.com/index.php?title=MaDeCo&amp;diff=919"/>
		<updated>2011-06-26T23:04:52Z</updated>

		<summary type="html">&lt;p&gt;Alois: /* Format */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= MaDeCo - Protokoll zur Kommunikation im [[RoLoMa]] Projekt =&lt;br /&gt;
&lt;br /&gt;
MaDeCo ist ein sehr einfaches textbasiertes Protokoll für die Kommunikation zwischen den Beteiligten im [[RoLoMa]] Projekt, den [[NIBObee]] Einheiten und der Basisstation, dem [[LPC2478]].&lt;br /&gt;
&lt;br /&gt;
== Rollen ==&lt;br /&gt;
Es gibt unter den Beteiligten zwei festgelegte Rollen, Sender und Empfänger. Der Sender überträgt Information, der Empfänger hingegen hat eine überwiegend passive Funktion, er quittiert Nachrichten und übermittelt einen Acknowledge Code.&lt;br /&gt;
Während der Kommunikation werden diese Rollen nicht gewechselt.&lt;br /&gt;
&lt;br /&gt;
== Format ==&lt;br /&gt;
Eine Nachricht besteht aus genau zwei Datensätzen, ein Datensatz besteht jeweils aus einem 3 Zeichen breiten Header Teil, einem 2 Zeichen breiten Datenteil (je nach Kommando optional oder mandatory) und einem Zeilenende (&amp;quot;\n&amp;quot;), das als einzelnes Zeichen CR (0x0d) realisiert ist.&lt;br /&gt;
&lt;br /&gt;
Beide Teile der Nachricht werden unmittelbar hintereinander gesendet, also z.B. als &#039;&#039;SEQ13\nOPMSM\n&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Eine Nachricht, wie sie ein Sender erstellt, besteht aus:&lt;br /&gt;
 &amp;lt;Sequence&amp;gt;&lt;br /&gt;
 &amp;lt;Command&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;&amp;lt;Sequence&amp;gt;&lt;br /&gt;
: besteht aus dem Header &#039;&#039;SEQ&#039;&#039;, der Datenteil aus einer Nummer zwischen 1 und 99.&lt;br /&gt;
;&amp;lt;Command&amp;gt;&lt;br /&gt;
: besteht aus dem 3 Zeichen langen [[MaDeCo#Commands|Command-Code]], und einem entsprechenden Datenteil.&lt;br /&gt;
&lt;br /&gt;
Eine Nachricht muss mit einer Antwort quittiert werden. Diese besteht aus:&lt;br /&gt;
 &amp;lt;Acknowledge&amp;gt;&lt;br /&gt;
 &amp;lt;Acknowledge Code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;&amp;lt;Acknowledge&amp;gt;&lt;br /&gt;
: besteht aus dem Header &#039;&#039;ACK&#039;&#039; und der zu bestätigenden Sequence Number.&lt;br /&gt;
;&amp;lt;Acknowledge Code&amp;gt;&lt;br /&gt;
: besteht aus den Header &#039;&#039;ACC&#039;&#039; und dem [[MaDeCo#Acknowledge Codes|Code]].&lt;br /&gt;
&lt;br /&gt;
Beispiel sind be den jeweiligen [[MaDeCo#Use Cases|Use Cases]] zu finden.&lt;br /&gt;
&lt;br /&gt;
=== Commands ===&lt;br /&gt;
 EOC ... end of communication, signalisiert das Ende einer Kommunikation&lt;br /&gt;
 OPM ... Operation Mode (siehe [[MaDeCo#Betriebsmodus|Betriebsmodus]])&lt;br /&gt;
 WAP ... Waypoint (siehe [[MaDeCo#Wegpunkte|Wegpunkte]])&lt;br /&gt;
 DIR ... Angabe der Richtung im GO Betriebsmodus (siehe Kürzester Weg)&lt;br /&gt;
&lt;br /&gt;
=== Acknowledge Codes ===&lt;br /&gt;
 00 .. OK, Command acknowledged&lt;br /&gt;
 01 .. unknown Command&lt;br /&gt;
 02 .. invalid data&lt;br /&gt;
 03 .. overflow (kann z.B. derzeit keine weiteren Richtungsanweisungen entgegennehmen)&lt;br /&gt;
 11 .. unbekannter Betriebsmodus (e.g. OPMXX)&lt;br /&gt;
 21 .. command refused, Labyrinth erkunden (OPMSM) vor [[NIBObee#Kalibrierung]] (OPMGA)&lt;br /&gt;
&lt;br /&gt;
=== Betriebsmodus ===&lt;br /&gt;
 GA ... Kalibrieren (siehe [[NIBObee#Kalibrierung]])&lt;br /&gt;
 SM ... Labyrinth erkunden&lt;br /&gt;
 GO ... kürzesten Weg nehmen (siehe Kürzester Weg)&lt;br /&gt;
&lt;br /&gt;
=== Wegpunkte ===&lt;br /&gt;
Die Übertragung eines Wegpunkts erfolgt durch Angabe der Richtung (S,W,N,E), gefolgt von der Anzahl der Streckenteile.&lt;br /&gt;
 Beispiel: WAPS4   der Wegpunkt befindet sich 4 Streckenteile südlich des zuletzt übertragenen Wegpunkts&lt;br /&gt;
&lt;br /&gt;
== Ablauf ==&lt;br /&gt;
Im [[RoLoMa]] Projekt muss die Kommunikation aus Nachricht-Antwort Sequenzen bestehen. Wird eine gesendete Nachricht nicht bestätigt, erfolgt eine Neuübertragung nach dem RETRANSMISSION_TIMEOUT Interval.&lt;br /&gt;
Erfolgt auch nach RETRANSMISSION_COUNT Wiederholungen keine Antwort, wird die Übertragung abgebrochen und ein Fehler signalisiert.&lt;br /&gt;
&lt;br /&gt;
Kommunikationen überschneiden sich nicht, das bedeutet, es findet zu jedem Zeitpunkt nur eine Kommunikation zwischen den Beteiligten statt. Daher ist auch zu jedem Zeitpunkt genau ein Teilnehmer der Sender, und ein Teilnehmer der Empfänger.&lt;br /&gt;
&lt;br /&gt;
== Use Cases ==&lt;br /&gt;
Im folgenden werden Beispiele für die Kommunikation der unterschiedlichen Betriebsarten dargestellt. Daten vom Board werden normal, die von der NIBObee &#039;&#039;&#039;fett&#039;&#039;&#039; dargestellt.&lt;br /&gt;
&lt;br /&gt;
=== Kalibrieren ===&lt;br /&gt;
Beim Kalibrieren wird das Kommando vom Board an die NIBObee geschickt und auch bei Erhalt sofort quittiert (sonst würde es zu einem Timeout kommen). Nachdem die Kalibrierung abgeschlossen ist wird die Verbindung getrennt.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Beispiel:&#039;&#039;&lt;br /&gt;
 SEQ1 &lt;br /&gt;
 OPMGA&lt;br /&gt;
 &lt;br /&gt;
 &#039;&#039;&#039;ACK1&#039;&#039;&#039; &lt;br /&gt;
 &#039;&#039;&#039;ACC00&#039;&#039;&#039;&lt;br /&gt;
 &lt;br /&gt;
 &#039;&#039;&#039;SEQ2&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;EOC&#039;&#039;&#039;&lt;br /&gt;
 &lt;br /&gt;
 ACK2 &lt;br /&gt;
 ACC00&lt;br /&gt;
&lt;br /&gt;
=== Labyrinth erkunden===&lt;br /&gt;
Das Kommando wird vom Board an die NIBObee geschickt und auch bei Erhalt sofort quittiert (es muss vorher allerdings eine Kalibrierung durchgeführt worden sein). Danach werden laufend die Punkte geschickt die abgefahren werden. Wenn das ganze Labyrinth erfasst wurde wir die Kommunikation wieder beendet.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Beispiel:&#039;&#039;&lt;br /&gt;
 SEQ1 &lt;br /&gt;
 OPMSM&lt;br /&gt;
 &lt;br /&gt;
 &#039;&#039;&#039;ACK1&#039;&#039;&#039; &lt;br /&gt;
 &#039;&#039;&#039;ACC00&#039;&#039;&#039;&lt;br /&gt;
 &lt;br /&gt;
 &#039;&#039;&#039;SEQ2&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;WAPN3&#039;&#039;&#039;&lt;br /&gt;
 &lt;br /&gt;
 ACK2 &lt;br /&gt;
 ACC00&lt;br /&gt;
 &lt;br /&gt;
 &#039;&#039;&#039;SEQ3&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;WAPE1&#039;&#039;&#039;&lt;br /&gt;
 &lt;br /&gt;
 ...&lt;br /&gt;
 &lt;br /&gt;
 &#039;&#039;&#039;SEQ32&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;EOC&#039;&#039;&#039;&lt;br /&gt;
 &lt;br /&gt;
 ACK32 &lt;br /&gt;
 ACC00&lt;br /&gt;
&lt;br /&gt;
=== Kürzester Weg === &lt;br /&gt;
Hier werden Richtungsanweisungen übertragen, die es der [[NIBObee]] ermöglichen, in einem Labyrinth den kürzesten Weg zu nehmen. Die Richtungen werden wieder mit Himmelsrichtungen beschrieben, diesmal allerdings ohne Längenangabe da immer bis zur nächsten Kreuzung gefahren wird. &lt;br /&gt;
In dem Beispiel wird der kürzeste Weg als S(üd)-W(est)-N(ord)-W(est) angegeben:&lt;br /&gt;
 SEQ1 &lt;br /&gt;
 OPMGO&lt;br /&gt;
 &lt;br /&gt;
 &#039;&#039;&#039;ACK1&#039;&#039;&#039; &lt;br /&gt;
 &#039;&#039;&#039;ACC00&#039;&#039;&#039;&lt;br /&gt;
 &lt;br /&gt;
 SEQ2 &lt;br /&gt;
 DIRS &lt;br /&gt;
 &lt;br /&gt;
 &#039;&#039;&#039;ACK2&#039;&#039;&#039; &lt;br /&gt;
 &#039;&#039;&#039;ACC00&#039;&#039;&#039;&lt;br /&gt;
 &lt;br /&gt;
 SEQ3 &lt;br /&gt;
 DIRW &lt;br /&gt;
 &lt;br /&gt;
 &#039;&#039;&#039;ACK3&#039;&#039;&#039; &lt;br /&gt;
 &#039;&#039;&#039;ACC00&#039;&#039;&#039;&lt;br /&gt;
 &lt;br /&gt;
 SEQ4 &lt;br /&gt;
 DIRN &lt;br /&gt;
 &lt;br /&gt;
 &#039;&#039;&#039;ACK4&#039;&#039;&#039; &lt;br /&gt;
 &#039;&#039;&#039;ACC00&#039;&#039;&#039;&lt;br /&gt;
 &lt;br /&gt;
 SEQ5 &lt;br /&gt;
 DIRW &lt;br /&gt;
 &lt;br /&gt;
 &#039;&#039;&#039;ACK5&#039;&#039;&#039; &lt;br /&gt;
 &#039;&#039;&#039;ACC00&#039;&#039;&#039;&lt;br /&gt;
 &lt;br /&gt;
 SEQ6 &lt;br /&gt;
 EOC&lt;br /&gt;
 &lt;br /&gt;
 &#039;&#039;&#039;ACK6&#039;&#039;&#039; &lt;br /&gt;
 &#039;&#039;&#039;ACC00&#039;&#039;&#039;&lt;br /&gt;
 &lt;br /&gt;
[[Kategorie:FH]]&lt;/div&gt;</summary>
		<author><name>Alois</name></author>
	</entry>
	<entry>
		<id>https://wiki.callooh.com/index.php?title=NIBObee&amp;diff=918</id>
		<title>NIBObee</title>
		<link rel="alternate" type="text/html" href="https://wiki.callooh.com/index.php?title=NIBObee&amp;diff=918"/>
		<updated>2011-06-26T18:50:29Z</updated>

		<summary type="html">&lt;p&gt;Alois: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;NIBObee ist der Roboter der im Projekt [[RoLoMa]] verwendet wird.&lt;br /&gt;
== Technische Daten ==&lt;br /&gt;
Hier wird nur ein kleiner Ausschnitt der technischen Daten dargestellt. Es handelt sich nur um jenen Teil der für die Bewertung oder Implementierung der gestellten Aufgaben relevant ist:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Art&lt;br /&gt;
!Typ&lt;br /&gt;
!Bemerkung&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|Mikrocontroller&lt;br /&gt;
|ATMEL ATMega16, , 15 MHz&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|Integrierter UART wird verwendet um den Bluetooth Modul anzubinden.&lt;br /&gt;
&lt;br /&gt;
Sollte die Leistung nicht ausreichen kann entweder der Erweiterungssatz von Nicai-Systems verwendet werden oder nur der Controller wird gegen einen Pinkompatiblen Typ ausgetauscht (z.B. ATMega32, ATMega644, ATMega1284)&lt;br /&gt;
|-&lt;br /&gt;
|Flash:	16	kB&lt;br /&gt;
|-&lt;br /&gt;
|RAM:	1	kB&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|Maße&lt;br /&gt;
|Radumfang: 11,8 cm&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|Diese Maße sind wichtig um den NIBObee so exakt wie möglich am Mittelpunkt des Labyrinthfeldes positionieren zu können.&lt;br /&gt;
|-&lt;br /&gt;
|Abstand Liniensensor zu Radachse: 10,4 cm&lt;br /&gt;
|-&lt;br /&gt;
|Impulse pro Umdrehung: 20&lt;br /&gt;
|}&lt;br /&gt;
=== Ports ===&lt;br /&gt;
Über den UART wird der Bluetooth Modul [[BTM-222]] angebunden. Am NIObee ist diese Schnittstelle am Port X5 verfügbar.&lt;br /&gt;
&lt;br /&gt;
Zwei Analoge Eingänge werden für die Fototransistoren der zusätzlichen Linienerkennung verwendet. Diese sind am NIBObee am Port X1 verfügbar.&lt;br /&gt;
&lt;br /&gt;
Ein Ausgang dient zum ein- und ausschalten der zusätzlichen IR-LEDs. Dafür wird der PIN 1 des Port X4 verwendet.&lt;br /&gt;
&lt;br /&gt;
=== Resourcen ===&lt;br /&gt;
Folgende Resourcen werden für unsere Implementierung verwendet (&#039;&#039;kursiv&#039;&#039; markierte Resourcen werden bereits durch die Bibliothek belegt):&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Resource&lt;br /&gt;
!Verwendung&lt;br /&gt;
!Interrupts&lt;br /&gt;
!Dateien&lt;br /&gt;
|-&lt;br /&gt;
|Timer 1&lt;br /&gt;
|Motor PWM&lt;br /&gt;
|TIMER1_COMPA_vect, TIMER1_COMPB_vect&lt;br /&gt;
|motpwm.c&lt;br /&gt;
|-&lt;br /&gt;
|ADC&lt;br /&gt;
|Analog, Line&lt;br /&gt;
|ADC_vect&lt;br /&gt;
|analog.c, line.c&lt;br /&gt;
|-&lt;br /&gt;
|EEPROM&lt;br /&gt;
|Line (12 Byte)&lt;br /&gt;
|&lt;br /&gt;
|line.c&lt;br /&gt;
|-&lt;br /&gt;
|Ext. IRQ&lt;br /&gt;
|Odometrie&lt;br /&gt;
|INT0_vect, INT1_vect&lt;br /&gt;
|odometry.c&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Eine für den NIBObee allgemein gültige Auflistung findet man im [http://www.nibo-roboter.de/wiki/NIBObee/Lib/Resourcen NIBObee Wiki].&lt;br /&gt;
&lt;br /&gt;
=== Besondere Erkenntnisse ===&lt;br /&gt;
&lt;br /&gt;
==== ATMega16 ====&lt;br /&gt;
Die Speichergröße scheint durchaus ausreichend zu sein. Nach Implementierung aller wichtigen Grundfunktionen ist erst weniger als die Hälfte des Programmspeichers belegt.&lt;br /&gt;
&lt;br /&gt;
Problematisch war anfangs nur der geringe RAM der auch alle konstanten Strings enthält. Dies ist zwar nicht notwendig, ist mit dieser Entwicklungsumgebung allerdings so gelöst. Besonders die umfangreichen Debug-Informationen die über Bluetooth an den PC gesendet werden führten dabei zu massiven Problemen. Durch kurze symbolische Debugausgaben, die dann am PC im eigens entwickelten Terminalprogramm auf sprechende symbolische Ausgabe konvertiert wird, konnte das Problem behoben werden.&lt;br /&gt;
&lt;br /&gt;
==== Liniensensoren ====&lt;br /&gt;
Es hat sich, nach einigen Fehlschlägen bei der Linienverfolung, herausgestellt dass es ungünstig ist den NIBObee in eine optisch ansprechende waagrechte Position zu bringen indem eine kleinere Halbkugel auf der Unterseite angebracht wird. Der Grund: Nur mit der original Halbkugel und dem damit nach vorne ansteigenden Bodenabstand sind die IR-LED&#039;s weit genug vom Boden entfernt um einen Lichtkegen zu erzeugen der auch vernünftig vom Phototransistor erfasst werden kann. Bei waagrechter Ausrichtung des NIBObee ist dieser Kegel, aufgrund des geringeren Abstands zum Boden, zu klein!&lt;br /&gt;
&lt;br /&gt;
=== Bibliotheksfunktionen ===&lt;br /&gt;
==== Liniensensoren ====&lt;br /&gt;
Die original NIBObee Biliothek wird nicht verwendet. Sie wurde durch eine eigene Implementierung im [[NIBObee#Line-Modul|Line-Modul]] ersetzt. Der Grund ist die Notwendigkeit die zusätzlichen Liniensensoren in der gleichen Weise wie die drei Originalsensoren zu behandeln.&lt;br /&gt;
&lt;br /&gt;
==== Motorensteuerung ====&lt;br /&gt;
 motpwm.h&lt;br /&gt;
Die Motoren des NIBObee werden mit PWM ([http://de.wikipedia.org/wiki/Pulsweitenmodulation Pulsweitenmodulation]) angesteuert. Das garantiert natürlich ohne Regelung noch keinen Gleichlauf der beiden Motoren was sich je nach Zustand des Getriebes in einer weiteren oder engernen Kurve zeigt.&lt;br /&gt;
 motpid.h&lt;br /&gt;
Hier stehen Funktionen zur Verfügung die mit Hilfe der Odometrie die Motoren regeln. Diese Funktionen sind für unsere Zwecke allerdings nicht geeignet.&lt;br /&gt;
&lt;br /&gt;
== Aufgaben ==&lt;br /&gt;
Folgende Aufgaben sind im Rahmen des Projekts [[RoLoMa]] vom NIBObee Team zu lösen:&lt;br /&gt;
* Herstellung der Bluetooth Hardware-Erweiterung&lt;br /&gt;
* Softwaremodul zum Bedienen der Bluetooth-Schnittstelle via RS232&lt;br /&gt;
* Softwaremodul zum Erkennen der Linie im Labyrinth und im speziellen der unterschiedlichen Kreuzungstypen&lt;br /&gt;
* Messen des zurückgelegten Weges&lt;br /&gt;
* Steuerung, die den Abstand des Sensors zur Radachse berücksichtigt um den Roboter an der korrekten Stelle um die eigene Achse zu drehen&lt;br /&gt;
* Erstellen eines Abbilds des Labyrinths im Speicher und navigieren bis der Roboter wieder am Startpunkt gelandet ist (z.B. immer Links abbiegen)&lt;br /&gt;
* Implementieren des [[MaDeCo]] Protokolls&lt;br /&gt;
&lt;br /&gt;
Nach einigen ersten Tests ist folgende weitere Aufgabe hinzugekommen:&lt;br /&gt;
* Herstellung der Hardware-Erweiterung mit zusätzlichen Liniensensoren&lt;br /&gt;
&lt;br /&gt;
=== Aufgabenteilung ===&lt;br /&gt;
Alle Aufgaben wurden im Team gelöst wobei für manche dieser Aufgaben der Schwerpunkt bei nur einem oder zwei Teammitgliedern lag. Die folgende Tabelle gibt eine ungefähre Zuordnung der Aufgaben auf die einzelnen Personen:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|colspan=&amp;quot;3&amp;quot;|&#039;&#039;&#039;Dokumentation&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|&amp;amp;nbsp; &lt;br /&gt;
|Projektfortschritt, Controlling&lt;br /&gt;
|Robert Peterfi&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Hardware, Software (Wiki)&lt;br /&gt;
|Alois Pochmann, Reinhard Weismann&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Codedokumentation&lt;br /&gt;
|Robert Peterfi, Alois Pochmann, Reinhard Weismann&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|colspan=&amp;quot;3&amp;quot;|&#039;&#039;&#039;Hardware&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|&amp;amp;nbsp; &lt;br /&gt;
|Entwurf, Design&lt;br /&gt;
|Alois Pochmann&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Bestellung, Aufbau&lt;br /&gt;
|Robert Peterfi, Alois Pochmann&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Test&lt;br /&gt;
|Robert Peterfi, Alois Pochmann, Reinhard Weismann&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|colspan=&amp;quot;3&amp;quot;|&#039;&#039;&#039;Software&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;8&amp;quot;|&amp;amp;nbsp; &lt;br /&gt;
|Design, Funktionsaufteilung&lt;br /&gt;
|Robert Peterfi, Alois Pochmann, Reinhard Weismann&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Kommunikationsprotokoll&lt;br /&gt;
|Reinhard Weismann&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Scheduler, Event Handling, zentrale Funktionen&lt;br /&gt;
|Alois Pochmann&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Sensoren (Hardwareanbindung)&lt;br /&gt;
|Robert Peterfi&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Kalibrierung&lt;br /&gt;
|Robert Peterfi&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Odometrie&lt;br /&gt;
|Reinhard Weismann&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Bewegungssteuerung&lt;br /&gt;
|Robert Peterfi, Alois Pochmann, Reinhard Weismann&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Testapplikation (Windows)&lt;br /&gt;
|Alois Pochmann&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
&lt;br /&gt;
=== Bluetooth ===&lt;br /&gt;
Der Bluetooth Modul ist im Detail auf den Seiten des [[BTM-222]] beschrieben.&lt;br /&gt;
&lt;br /&gt;
=== Liniensensoren ===&lt;br /&gt;
Zum Erkennen der Kreuzungen bei gleichzeitigem Folgen der Linie war es notwendig zusätzliche Liniensensoren zu verwenden. Diese wurden mit einer Zusatzplatine in einer Reihe mit den bereits vorhandenen Liniensensoren, allerdings so weit wie möglich linke und rechts außen, montiert. Das Einlesen der Analogwerte erfolgt über die beiden Analogeingänge am Stecker X1. Die IR-LEDs sind, analog zu den bestehenden IR-LEDs der vorhandenen Liniensensoren, über den Ausgang 1 am Stecker X4 schaltbar. Dies ist notwendig da jeweils eine Messung mit eingschalteter LED und eine mit ausgeschalteter LED durchgeführt wird. Damit wird der Einfluß des Umgebungslichts korrigiert.&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
Die Aufgaben der Software sollen in möglichst unabhängigen Modulen realisiert werden um das Testen einfacher zu gestalten. Die einzelnen Module sind im Folgenden beschrieben.&lt;br /&gt;
&lt;br /&gt;
=== Architektur ===&lt;br /&gt;
Das Gesamtsystem besteht aus einem zentralen Taktgeber, einem Scheduler und mehreren State Maschinen. Die Kommunikation erfolgt über Events und, wenn nur eine spezielle Funktionalität eines anderen Moduls verwendet werden soll ohne dessen Zustand zu beeinflussen, über Funktionsaufrufe (z.B. senden einer MaDeCo-Meldung zum reporten eines Wegpunktes direkt vom drive Modul). Die Module können mittels Subscribe einen Event, den ein anderer Modul zur Verfügung steht, abonnieren.&lt;br /&gt;
&lt;br /&gt;
==== Systemtakt, Scheduler ====&lt;br /&gt;
Im Main Modul befindet sich der zentrale Taktgeber der aus dem Interrupt des Timer 1 einen gleichmäßigen Takt von 100Hz erzeugt. Dieser Takt kann von anderen Modulen verwendet werden um zyklische Aufgaben zu erfüllen (z.B. überprüfen des Status der &amp;quot;Fühler&amp;quot;). Im Main Modul befindet sich auch der Scheduler der ganz einfach in der Endlosschleife sequenziell jeden Modul aufruft um anstehende Events zu bearbeiten.&lt;br /&gt;
&lt;br /&gt;
==== State / Event Maschinen ====&lt;br /&gt;
Die State / Event Maschinen sind in allen Modulen gleich aufgebaut. Es gibt die folgenden Funktionen (wobei statt &amp;quot;&amp;lt;xx&amp;gt;&amp;quot; das Kürzel des Moduls steht, z.B &amp;quot;dr&amp;quot; für Drive):&lt;br /&gt;
; eine Funktion mit dem Namen &amp;lt;xx&amp;gt;_main (intern)&lt;br /&gt;
: Das ist die eigentliche State Maschine. Wird direkt vom Scheduler mit dem aktuell zu verarbeitenden Event aufgerufen. Hier gibt es ein switch Statement über den aktuellen Zustand und für jeden Zustand ein switch Statement über den empfangenen Event.&lt;br /&gt;
; eine Funktion mit dem Namen &amp;lt;xx&amp;gt;_init (extern)&lt;br /&gt;
: Hier werden Variableninitialisierungen gemacht und eventuell die ersten subscribe Aufrufe um Events zu abonnieren. Diese Funktion wird beim Systemstart vom Main Modul aufgerufen.&lt;br /&gt;
; optional Funktionen mit den Namen &amp;lt;xx&amp;gt;_subscribe_&amp;lt;event&amp;gt; und &amp;lt;xx&amp;gt;_unsubscribe_&amp;lt;event&amp;gt; (extern)&lt;br /&gt;
: für jeden Event den dieser Modul optional verschicken kann ist sowohl eine Subscribe Funktion als auch ein Unsubscribe Funktion vorhanden. Mit diesen Funktionen kann der Event von einem anderen Modul abboniert werden.&lt;br /&gt;
&lt;br /&gt;
=== Module ===&lt;br /&gt;
Im folgenden sind alle Module und deren Hauptfunktionen aufgelistet.&lt;br /&gt;
&lt;br /&gt;
==== Analog-Modul ====&lt;br /&gt;
Digitalisieren der Analogeingänge&lt;br /&gt;
 Dateien: analog.c&lt;br /&gt;
          analog.h&lt;br /&gt;
Dieser Modul ist abgeleitet von den gleichnamigen Dateien der original NIBObee Bibliothek. Der Austausch war notwendig da wir zusätzliche Liniensensoren verwenden und deren Ansteuerung in gleicher Weise erfolgen sollte. Das bedeutet, dass für die entsprechenden Analogeingänge Messungen mit ein- und ausgeschalteten IR-LEDs durchgeführt werden müssen. Außerdem wurde, entsprechend dem Datenblatt des ATMega16, die Behandlung der Messung der Batteriespannung verbessert. Da hier die Referenzspannung umgeschalten wird muss eine Messung verworfen werden bevor mit einem richtigen Ergebnis gerechnet werden kann. Das wurde in der Originalbibliothek nicht berücksichtigt.&lt;br /&gt;
Die einzelnen Werte werden weiterhin über einen A/D-Wandler ermittelt und zwischengespeichert. Es gibt nun 13 analoge Werte (statt bisher 11) die zyklisch digitalisiert werden. Dieser Vorgang wird mit einer Frequenz von ca 117 kHz durchgeführt, d.h. dass jeder dieser Werte ca. alle 111 µs (statt bisher 94 µs) aktualisiert wird.&lt;br /&gt;
&lt;br /&gt;
==== Line-Modul ====&lt;br /&gt;
Ermitteln der Werte der Liniensensoren&lt;br /&gt;
 Dateien: line.c&lt;br /&gt;
          line.h&lt;br /&gt;
Dieser Modul ersetzt die originalen Bibliotheksfunktionen der Liniensensoren. Dies war notwendig da wir zusätzliche Liniensensoren verwenden.&lt;br /&gt;
&lt;br /&gt;
Die Werte der Liniensensoren können nun mit der Funktion&lt;br /&gt;
&amp;lt;code&amp;gt;ln_get(index)&amp;lt;/code&amp;gt;&lt;br /&gt;
gelesen werden. Die Werte selbst werden über den [[NIBObee#Analog-Modul|Analog-Modul]] ermittelt.&lt;br /&gt;
&lt;br /&gt;
==== Bluetooth-Modul ====&lt;br /&gt;
Wickelt die Kommunikation über den Bluetooth Modul ab. Zur Kommunikation wird allerdings nur der USART als Terminal angesprochen, der Bluetooth Stack ist im [[BTM-222]] implementiert.&lt;br /&gt;
 Dateien: bluetooth.c&lt;br /&gt;
          bluetooth.h&lt;br /&gt;
&lt;br /&gt;
==== Common-Modul ====&lt;br /&gt;
Stellt gemeinsame Funktionen zurVerfügung&lt;br /&gt;
 Dateien: common.c&lt;br /&gt;
          common.h&lt;br /&gt;
&lt;br /&gt;
==== Distance-Modul ====&lt;br /&gt;
Behandelt die Odometrie Sensoren&lt;br /&gt;
 Dateien: distance.c&lt;br /&gt;
          distance.h&lt;br /&gt;
&lt;br /&gt;
==== Drive-Modul ====&lt;br /&gt;
Bewegt den NIBObee&lt;br /&gt;
 Dateien: drive.c&lt;br /&gt;
          drive.h&lt;br /&gt;
&lt;br /&gt;
==== Follow-Modul ====&lt;br /&gt;
Ist für die Linienverfolgung zuständig&lt;br /&gt;
 Dateien: follow.c&lt;br /&gt;
          follow.h&lt;br /&gt;
&lt;br /&gt;
==== MaDeCo-Modul ====&lt;br /&gt;
Behandelt das MaDeCo Protokoll&lt;br /&gt;
 Dateien: madeco.c&lt;br /&gt;
          madeco.h&lt;br /&gt;
&lt;br /&gt;
==== Main-Modul ====&lt;br /&gt;
Scheduler und zentraler Taktgeber&lt;br /&gt;
 Dateien: main.c&lt;br /&gt;
          main.h&lt;br /&gt;
&lt;br /&gt;
==== Sensor-Modul ====&lt;br /&gt;
Ist für die &amp;quot;Fühler&amp;quot; zuständig&lt;br /&gt;
 Dateien: follow.c&lt;br /&gt;
          follow.h&lt;br /&gt;
&lt;br /&gt;
=== Applikationen ===&lt;br /&gt;
==== Labyrinth erkunden ====&lt;br /&gt;
Das ist die Hauptaufgabe des NIBObee. Der Anstoß kommt über einen Befehl vom Board. Ausgewertet wird das vom MaDeCo Modul der auch überprüft ob bereits eine Kalibrierung durchgeführt wurde. Wenn diese Prüfung erfolgreich ist wird der Drive Modul beauftragt das Labyrinth abzufahren. Dort wird nun von einer Kreuzung zur nächsten navigiert und jeder Punkt über den MaDeCo Modul an das Bord gemeldet. Bei jeder Kreuzung wird so weit wie möglich rechts abgebogen bis der NIBObee wieder am Ausgangspunkt angelangt ist.&lt;br /&gt;
&lt;br /&gt;
==== Kürzesten Weg durch Labyrinth ====&lt;br /&gt;
Der MaDeCo Modul erhält vom Board die Richtungsanweisungen für den NIBObee und speichert diese in einem Buffer. Die erste Anweisung wird an den Drive Modul gesendet und der navigiert dann zum nächsten Kreuzungspunkt. Dann wird eine Anfrage an den MaDeCo Modul gesendet um den nächsten Punkt aus dem Buffer zu bekommen. Das passiert solange Daten vorhanden sind und nicht das Ende vom Board signalisiert wurde.&lt;br /&gt;
&lt;br /&gt;
==== Kalibrierung ====&lt;br /&gt;
Zur Kalibrierung fährt der NIBObee ein Viereck entlang dass genau die Seitenlänge eines der Felder des Labyrinths hat. Dies ist notwendig um relativ einfach die Karte des Labyrinths erstellen zu können. Es werden dabei die Anzahl der Schritte der Odometrie für die Länge eines Feldes sowie für eine 90° Rotation als Referenzwerte ermittelt und im EEPROM gespeichert.&lt;br /&gt;
&lt;br /&gt;
=== Protokolle und deren Implementierung ===&lt;br /&gt;
==== [[MaDeCo]] ====&lt;br /&gt;
Neben der State Machine die per Event kommuniziert ist auch noch ein Funktionsinterface vorhanden&lt;br /&gt;
===== Message Interface Definition =====&lt;br /&gt;
* Empfang der Kommandos vom Bluetooth Modul&lt;br /&gt;
* Start/Ende and Drive Modul&lt;br /&gt;
* Status und Ende vom Drive Modul&lt;br /&gt;
===== Function Interface Definition =====&lt;br /&gt;
* void ma_sendWap(uint8_t direction, uint8_t length);&lt;br /&gt;
** Senden eines Wegpunktes an das Board direkt vom Drive Modul&lt;br /&gt;
&lt;br /&gt;
==== Schnittstelle [[MaDeCo]] - RS232-Schnittstelle ====&lt;br /&gt;
* read_data&lt;br /&gt;
* send_data&lt;br /&gt;
&lt;br /&gt;
=== Steuerungssoftware ===&lt;br /&gt;
==== Bluetooth Modul einschalten ====&lt;br /&gt;
Auf explizites Einschalten, z.B. durch Bewegen der &amp;quot;Fühler&amp;quot; der NIBObee nach oben bis Einrasten, des Bluetooth Moduls wird verzichtet. Der Bluetooth Modul wird beim Systemstart aktiviert und ab diesem Zeitpunkt muss auf eingehenden Bluetooth Traffic gelauscht werden.&lt;br /&gt;
&lt;br /&gt;
==== Blink Codes ====&lt;br /&gt;
Die Status LEDs werden verwendet um Basisinformationen über das System zu signalisieren. Die LED 3 (rechte gelbe LED) dient als Heartbeat. Sie blinkt im 1 Sekunden-Takt sobald das System läuft. Die Beiden roten LEDs werden verwendet um Exception Situationen zu signalisieren wie zum Beispiel:&lt;br /&gt;
* Überschneidender Aufruf der Timerinterrupt Behandlungsroutine (nested Interrupt)&lt;br /&gt;
* Overflow des Empfangsbuffers für Bluetooth-Verbindung&lt;br /&gt;
&lt;br /&gt;
==== Gerade fahren ====&lt;br /&gt;
Das Problem beim geradeaus fahren ist dass der Roboter von der Spur abweichen kann und dann neu ausgerichtet werden muss. Üblicherweise erfolgt das mit Hilfe der Liniensensoren indem, sobald einer der seitlichen Sensoren die Linie erkennt, durch beschleunigen oder bremsen eines Rades in diese Richtung korrigierend gelenkt wird.&lt;br /&gt;
&lt;br /&gt;
In unserem Fall kann das aber auch bedeuten dass wir soeben eine Kreuzung überfahren. Das kann durch die zusätzlichen Sensoren festgestellt werden und solange müssen wir diese Korrektur auch verzögern. Erst nachdem die zusätzlichen Sensoren keine querende Linie mehr erkennen können wir feststellen ob wir nur die schwarze Linie einer Kreuzung überfahren haben oder ob tatsächlich eine Abweichung vorliegt. &lt;br /&gt;
&lt;br /&gt;
===== Funktionsaufteilung =====&lt;br /&gt;
Die Zuständigkeiten für diese Aufgabe sind wie folgt:&lt;br /&gt;
;drive Modul&lt;br /&gt;
:sorgt für die Steuerung der Motoren. Reduzieren der Geschwindigkeit eines Rades um eine ausgleichende Kurve zu fahren und stoppen wenn das Ende der geraden Linie erreicht wurde. Dazu bekommt der Modul die Events des line Modul die eine Abweichung von der Linie melden und vom distance Modul den Event zum fahren der Distanz zwischen Liniensensoren und Achse der Räder.&lt;br /&gt;
;line Modul&lt;br /&gt;
:prüft zyklisch die position der Linie unter dem NIBObee und meldet Abweichungen mittels Events. Dieses Melden wird allerdings im Falle einer Kreuzung verzögert bis diese überfahren wurde.&lt;br /&gt;
;distance Modul&lt;br /&gt;
:meldet auf Anforderung das zurücklegen einer Strecke in der Länge der Distanz zwischen Liniensensoren und Achse der Räder.&lt;br /&gt;
&lt;br /&gt;
==== Kreuzung fahren ====&lt;br /&gt;
An einer Kreuzung wird abgebogen indem der NIBObee zuerst unbeirrt geradeaus fährt bis die Achse genau auf dem Mittelpunkt der Kreuzung zu stehen kommt. Danach wird eine Drehung nach rechts oder links durchgeführt bis sich die Linie wieder genau unter dem mittleren Sensor befindet.&lt;br /&gt;
&lt;br /&gt;
Die Sensoren sind von der Achse 10,4 cm entfernt, eine Radumdrehung bewegt den NIBObee um 11,8 cm weiter und bei dieser Umdrehung werden vom Odometriesensor 20 Impulse abgegeben. Die Linienbreite wird 1 cm betragen. Daher errechnet sich die Strecke die nach Erkennen der Kreuzung gefahren werden muss folgendermassen:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;Impulse pro Radumdrehung&amp;gt; / &amp;lt;Radumfang&amp;gt; * (&amp;lt;Achsabstand&amp;gt; - &amp;lt;halbe Linienbreite&amp;gt;) =&lt;br /&gt;
 20 / 11,8 * (10,4 - 0,5) = 16,779661&lt;br /&gt;
&lt;br /&gt;
Nach passieren der Kreuzung muss der NIBObee also noch 17 Impulse über den Odometriesensor empfangen bevor er stoppt.&lt;br /&gt;
&lt;br /&gt;
== Risikoanalyse ==&lt;br /&gt;
Im Folgenden wird versucht für die möglichen Risikopunkte Alternativen aufzuzeigen.&lt;br /&gt;
&lt;br /&gt;
; ATmega16 ist nicht Leisungsfägig genug&lt;br /&gt;
: Es kann auf den [http://www.nicai-systems.com/de/zubehoer/nibobee-tuning-kit.html Tuning-Kit von Nicai-Systems] zurückgerifffen werden. Dies könnte eine nicht akzeptable Verzögerung verursachen (erkennen, bestellen, NIBObee umrüsten)&lt;br /&gt;
&lt;br /&gt;
: Ein beliebiger PIN-kompatiber Microcontroller ATmega... wird statt dem ATmega16 eingesetzt. Die funktioniert soange der Ersatz-µC mit der Frequenz vom 15 MHz betrieben werden kann. Wichtig ist auch dass es adaptierte Bibliotheken gibt die auf den Ersatz-µC abgestimmt sind (z.B. andere Register oder geänderte Adressen für Register, ...)&lt;br /&gt;
&lt;br /&gt;
: &#039;&#039;Mit Fortschreiten des Projekts hat sich immer mehr gezeigt dass die Anforderung die Leistungsfähigleiten des Controllers nicht überfordern. Bereits mit einem Großteil der Implementierung wurde nur ca die Hälfte des Verfügbareb Speichers verbraucht&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
; Signale am UART mit Bordspannung im Gegensatz zu RS232-Level (12V)&lt;br /&gt;
: Die Signale am UART werden mit Bordspannung erzeugt/erwartet. Für die Kommunikation mit dem BT-Modul ist daher keine Anpassung durchzuführen.&lt;br /&gt;
&lt;br /&gt;
: Soll zu Testzwecken ein PC über RS232 angeschalten werden ist unbedingt auf die Spannung achten. Möglicherweise verwendet ein USB-RS232 Adapter nicht die 12V sonder nur 5V.&lt;br /&gt;
&lt;br /&gt;
: &#039;&#039;Es war nicht notwendig auf PC-Kabellösungen zu setzen da der Bluetooth Modul ausreichend schnell fertiggestellt werden konnte (ohne kritische Verzögerungen im Projekt zu verursachen) und dann auch sehr schnell in Betrieb genommen werden konnte&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Open Issues ==&lt;br /&gt;
* Es muss noch überprüft werden ob die NIBObee Hardware ausreichend leistungsfähig ist oder ein Upgrade gemacht werden muss.&lt;br /&gt;
** Nachdem ein Großteil der Funktionalität implementiert war hat eine Überprüfung ausreichende Reserven gezeigt (ca 50% freier Speicher verfügbar)&lt;br /&gt;
* Wie kann das Verlassen der Spur von dem Überfahren einer Kreuzung unterschieden werden? Wenn es hier zu Problemen kommt könnten zwei zusätzliche lichtempfindliche Sensoren rechts und links oder noch ein Element mit drei zusätzlichen Sensoren auf Höhe der Achsen angebracht werden -&amp;gt; Mehraufwand!&lt;br /&gt;
** Zusatzsensoren mussten gebaut werden. Die Wartezeit konnte mit anderen Tätigkeiten gefüllt werden so dass die Auswirkungen auf das Projekt in Summe gring waren. &lt;br /&gt;
* Soll Aktivierung der BT-Schnittstelle manuell erfolgen?&lt;br /&gt;
** Es wurde beschlossen die Bluetooth Schnittstelle sofort zu aktivieren wenn das System gestartet wir. Das vereinfacht die Implementierung und ermöglicht ausserdem Debuginformationen über dieses Interface zu senden.&lt;br /&gt;
* Soll der Betriebsmodus gewählt werden können?&lt;br /&gt;
** Der Betriebsmodus wird vom Board per [[MaDeCo]] Kommando ausgewählt&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* [http://www.nicai-systems.de/nibobee.html NIBObee Homepage bei Nicai Systems]&lt;br /&gt;
* [http://download.nicai-systems.com/nibo/Tutorial_NIBObee_20091123.pdf NIBObee - Tutorial zur Programmierung]&lt;br /&gt;
* [http://www.nicai-systems.com/de/zubehoer/nibobee-tuning-kit.html NIBObee - Tuning-Kit von Nicai-Systems]&lt;br /&gt;
* [http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/Der_UART Tutorial zur USART Programmierung]&lt;br /&gt;
[[Kategorie:FH]]&lt;/div&gt;</summary>
		<author><name>Alois</name></author>
	</entry>
	<entry>
		<id>https://wiki.callooh.com/index.php?title=NIBObee&amp;diff=913</id>
		<title>NIBObee</title>
		<link rel="alternate" type="text/html" href="https://wiki.callooh.com/index.php?title=NIBObee&amp;diff=913"/>
		<updated>2011-06-25T08:09:33Z</updated>

		<summary type="html">&lt;p&gt;Alois: /* Protokolle und deren Implementierung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;NIBObee ist der Roboter der im Projekt [[RoLoMa]] verwendet wird.&lt;br /&gt;
== Technische Daten ==&lt;br /&gt;
Hier wird nur ein kleiner Ausschnitt der technischen Daten dargestellt. Es handelt sich nur um jenen Teil der für die Bewertung oder Implementierung der gestellten Aufgaben relevant ist:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Art&lt;br /&gt;
!Typ&lt;br /&gt;
!Bemerkung&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|Mikrocontroller&lt;br /&gt;
|ATMEL ATMega16, , 15 MHz&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|Integrierter UART wird verwendet um den Bluetooth Modul anzubinden.&lt;br /&gt;
&lt;br /&gt;
Sollte die Leistung nicht ausreichen kann entweder der Erweiterungssatz von Nicai-Systems verwendet werden oder nur der Controller wird gegen einen Pinkompatiblen Typ ausgetauscht (z.B. ATMega32, ATMega644, ATMega1284)&lt;br /&gt;
|-&lt;br /&gt;
|Flash:	16	kB&lt;br /&gt;
|-&lt;br /&gt;
|RAM:	1	kB&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|Maße&lt;br /&gt;
|Radumfang: 11,8 cm&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|Diese Maße sind wichtig um den NIBObee so exakt wie möglich am Mittelpunkt des Labyrinthfeldes positionieren zu können.&lt;br /&gt;
|-&lt;br /&gt;
|Abstand Liniensensor zu Radachse: 10,4 cm&lt;br /&gt;
|-&lt;br /&gt;
|Impulse pro Umdrehung: 20&lt;br /&gt;
|}&lt;br /&gt;
=== Ports ===&lt;br /&gt;
Über den UART wird der Bluetooth Modul [[BTM-222]] angebunden. Am NIObee ist diese Schnittstelle am Port X5 verfügbar.&lt;br /&gt;
&lt;br /&gt;
Zwei Analoge Eingänge werden für die Fototransistoren der zusätzlichen Linienerkennung verwendet. Diese sind am NIBObee am Port X1 verfügbar.&lt;br /&gt;
&lt;br /&gt;
Ein Ausgang dient zum ein- und ausschalten der zusätzlichen IR-LEDs. Dafür wird der PIN 1 des Port X4 verwendet.&lt;br /&gt;
&lt;br /&gt;
=== Resourcen ===&lt;br /&gt;
Folgende Resourcen werden für unsere Implementierung verwendet (&#039;&#039;kursiv&#039;&#039; markierte Resourcen werden bereits durch die Bibliothek belegt):&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Resource&lt;br /&gt;
!Verwendung&lt;br /&gt;
!Interrupts&lt;br /&gt;
!Dateien&lt;br /&gt;
|-&lt;br /&gt;
|Timer 1&lt;br /&gt;
|Motor PWM&lt;br /&gt;
|TIMER1_COMPA_vect, TIMER1_COMPB_vect&lt;br /&gt;
|motpwm.c&lt;br /&gt;
|-&lt;br /&gt;
|ADC&lt;br /&gt;
|Analog, Line&lt;br /&gt;
|ADC_vect&lt;br /&gt;
|analog.c, line.c&lt;br /&gt;
|-&lt;br /&gt;
|EEPROM&lt;br /&gt;
|Line (12 Byte)&lt;br /&gt;
|&lt;br /&gt;
|line.c&lt;br /&gt;
|-&lt;br /&gt;
|Ext. IRQ&lt;br /&gt;
|Odometrie&lt;br /&gt;
|INT0_vect, INT1_vect&lt;br /&gt;
|odometry.c&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Eine für den NIBObee allgemein gültige Auflistung findet man im [http://www.nibo-roboter.de/wiki/NIBObee/Lib/Resourcen NIBObee Wiki].&lt;br /&gt;
&lt;br /&gt;
=== Besondere Erkenntnisse ===&lt;br /&gt;
&lt;br /&gt;
==== ATMega16 ====&lt;br /&gt;
Die Speichergröße scheint durchaus ausreichend zu sein. Nach Implementierung aller wichtigen Grundfunktionen ist erst weniger als die Hälfte des Programmspeichers belegt.&lt;br /&gt;
&lt;br /&gt;
Problematisch war anfangs nur der geringe RAM der auch alle konstanten Strings enthält. Dies ist zwar nicht notwendig, ist mit dieser Entwicklungsumgebung allerdings so gelöst. Besonders die umfangreichen Debug-Informationen die über Bluetooth an den PC gesendet werden führten dabei zu massiven Problemen. Durch kurze symbolische Debugausgaben, die dann am PC im eigens entwickelten Terminalprogramm auf sprechende symbolische Ausgabe konvertiert wird, konnte das Problem behoben werden.&lt;br /&gt;
&lt;br /&gt;
==== Liniensensoren ====&lt;br /&gt;
Es hat sich, nach einigen Fehlschlägen bei der Linienverfolung, herausgestellt dass es ungünstig ist den NIBObee in eine optisch ansprechende waagrechte Position zu bringen indem eine kleinere Halbkugel auf der Unterseite angebracht wird. Der Grund: Nur mit der original Halbkugel und dem damit nach vorne ansteigenden Bodenabstand sind die IR-LED&#039;s weit genug vom Boden entfernt um einen Lichtkegen zu erzeugen der auch vernünftig vom Phototransistor erfasst werden kann. Bei waagrechter Ausrichtung des NIBObee ist dieser Kegel, aufgrund des geringeren Abstands zum Boden, zu klein!&lt;br /&gt;
&lt;br /&gt;
=== Bibliotheksfunktionen ===&lt;br /&gt;
==== Liniensensoren ====&lt;br /&gt;
Die original NIBObee Biliothek wird nicht verwendet. Sie wurde durch eine eigene Implementierung im [[NIBObee#Line-Modul|Line-Modul]] ersetzt. Der Grund ist die Notwendigkeit die zusätzlichen Liniensensoren in der gleichen Weise wie die drei Originalsensoren zu behandeln.&lt;br /&gt;
&lt;br /&gt;
==== Motorensteuerung ====&lt;br /&gt;
 motpwm.h&lt;br /&gt;
Die Motoren des NIBObee werden mit PWM ([http://de.wikipedia.org/wiki/Pulsweitenmodulation Pulsweitenmodulation]) angesteuert. Das garantiert natürlich ohne Regelung noch keinen Gleichlauf der beiden Motoren was sich je nach Zustand des Getriebes in einer weiteren oder engernen Kurve zeigt.&lt;br /&gt;
 motpid.h&lt;br /&gt;
Hier stehen Funktionen zur Verfügung die mit Hilfe der Odometrie die Motoren regeln. Diese Funktionen sind für unsere Zwecke allerdings nicht geeignet.&lt;br /&gt;
&lt;br /&gt;
== Aufgaben ==&lt;br /&gt;
Folgende Aufgaben sind im Rahmen des Projekts [[RoLoMa]] vom NIBObee Team zu lösen:&lt;br /&gt;
* Herstellung der Bluetooth Hardware-Erweiterung&lt;br /&gt;
* Softwaremodul zum Bedienen der Bluetooth-Schnittstelle via RS232&lt;br /&gt;
* Softwaremodul zum Erkennen der Linie im Labyrinth und im speziellen der unterschiedlichen Kreuzungstypen&lt;br /&gt;
* Messen des zurückgelegten Weges&lt;br /&gt;
* Steuerung, die den Abstand des Sensors zur Radachse berücksichtigt um den Roboter an der korrekten Stelle um die eigene Achse zu drehen&lt;br /&gt;
* Erstellen eines Abbilds des Labyrinths im Speicher und navigieren bis der Roboter wieder am Startpunkt gelandet ist (z.B. immer Links abbiegen)&lt;br /&gt;
* Implementieren des [[MaDeCo]] Protokolls&lt;br /&gt;
&lt;br /&gt;
Nach einigen ersten Tests ist folgende weitere Aufgabe hinzugekommen:&lt;br /&gt;
* Herstellung der Hardware-Erweiterung mit zusätzlichen Liniensensoren&lt;br /&gt;
&lt;br /&gt;
=== Aufgabenteilung ===&lt;br /&gt;
Alle Aufgaben wurden im Team gelöst wobei für manche dieser Aufgaben der Schwerpunkt bei nur einem oder zwei Teammitgliedern lag. Die folgende Tabelle gibt eine ungefähre Zuordnung der Aufgaben auf die einzelnen Personen:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|colspan=&amp;quot;3&amp;quot;|&#039;&#039;&#039;Dokumentation&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|&amp;amp;nbsp; &lt;br /&gt;
|Projektfortschritt, Controlling&lt;br /&gt;
|Robert Peterfi&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Hardware, Software (Wiki)&lt;br /&gt;
|Alois Pochmann, Reinhard Weismann&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Codedokumentation&lt;br /&gt;
|Robert Peterfi, Alois Pochmann, Reinhard Weismann&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|colspan=&amp;quot;3&amp;quot;|&#039;&#039;&#039;Hardware&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|&amp;amp;nbsp; &lt;br /&gt;
|Entwurf, Design&lt;br /&gt;
|Alois Pochmann&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Bestellung, Aufbau&lt;br /&gt;
|Robert Peterfi, Alois Pochmann&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Test&lt;br /&gt;
|Robert Peterfi, Alois Pochmann, Reinhard Weismann&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|colspan=&amp;quot;3&amp;quot;|&#039;&#039;&#039;Software&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;8&amp;quot;|&amp;amp;nbsp; &lt;br /&gt;
|Design, Funktionsaufteilung&lt;br /&gt;
|Robert Peterfi, Alois Pochmann, Reinhard Weismann&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Kommunikationsprotokoll&lt;br /&gt;
|Reinhard Weismann&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Scheduler, Event Handling, zentrale Funktionen&lt;br /&gt;
|Alois Pochmann&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Sensoren (Hardwareanbindung)&lt;br /&gt;
|Robert Peterfi&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Kalibrierung&lt;br /&gt;
|Robert Peterfi&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Odometrie&lt;br /&gt;
|Reinhard Weismann&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Bewegungssteuerung&lt;br /&gt;
|Robert Peterfi, Alois Pochmann, Reinhard Weismann&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Testapplikation (Windows)&lt;br /&gt;
|Alois Pochmann&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
&lt;br /&gt;
=== Bluetooth ===&lt;br /&gt;
Der Bluetooth Modul ist im Detail auf den Seiten des [[BTM-222]] beschrieben.&lt;br /&gt;
&lt;br /&gt;
=== Liniensensoren ===&lt;br /&gt;
Zum Erkennen der Kreuzungen bei gleichzeitigem Folgen der Linie war es notwendig zusätzliche Liniensensoren zu verwenden. Diese wurden mit einer Zusatzplatine in einer Reihe mit den bereits vorhandenen Liniensensoren, allerdings so weit wie möglich linke und rechts außen, montiert. Das Einlesen der Analogwerte erfolgt über die beiden Analogeingänge am Stecker X1. Die IR-LEDs sind, analog zu den bestehenden IR-LEDs der vorhandenen Liniensensoren, über den Ausgang 1 am Stecker X4 schaltbar. Dies ist notwendig da jeweils eine Messung mit eingschalteter LED und eine mit ausgeschalteter LED durchgeführt wird. Damit wird der Einfluß des Umgebungslichts korrigiert.&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
Die Aufgaben der Software sollen in möglichst unabhängigen Modulen realisiert werden um das Testen einfacher zu gestalten. Die einzelnen Module sind im Folgenden beschrieben.&lt;br /&gt;
&lt;br /&gt;
=== Architektur ===&lt;br /&gt;
Das Gesamtsystem besteht aus einem zentralen Taktgeber, einem Scheduler und mehreren State Maschinen. Die Kommunikation erfolgt über Events und, wenn nur eine spezielle Funktionalität eines anderen Moduls verwendet werden soll ohne dessen Zustand zu beeinflussen, über Funktionsaufrufe (z.B. senden einer MaDeCo-Meldung zum reporten eines Wegpunktes direkt vom drive Modul). Die Module können mittels Subscribe einen Event, den ein anderer Modul zur Verfügung steht, abonnieren.&lt;br /&gt;
&lt;br /&gt;
==== Systemtakt, Scheduler ====&lt;br /&gt;
Im Main Modul befindet sich der zentrale Taktgeber der aus dem Interrupt des Timer 1 einen gleichmäßigen Takt von 100Hz erzeugt. Dieser Takt kann von anderen Modulen verwendet werden um zyklische Aufgaben zu erfüllen (z.B. überprüfen des Status der &amp;quot;Fühler&amp;quot;). Im Main Modul befindet sich auch der Scheduler der ganz einfach in der Endlosschleife sequenziell jeden Modul aufruft um anstehende Events zu bearbeiten.&lt;br /&gt;
&lt;br /&gt;
==== State / Event Maschinen ====&lt;br /&gt;
Die State / Event Maschinen sind in allen Modulen gleich aufgebaut. Es gibt die folgenden Funktionen (wobei statt &amp;quot;&amp;lt;xx&amp;gt;&amp;quot; das Kürzel des Moduls steht, z.B &amp;quot;dr&amp;quot; für Drive):&lt;br /&gt;
; eine Funktion mit dem Namen &amp;lt;xx&amp;gt;_main (intern)&lt;br /&gt;
: Das ist die eigentliche State Maschine. Wird direkt vom Scheduler mit dem aktuell zu verarbeitenden Event aufgerufen. Hier gibt es ein switch Statement über den aktuellen Zustand und für jeden Zustand ein switch Statement über den empfangenen Event.&lt;br /&gt;
; eine Funktion mit dem Namen &amp;lt;xx&amp;gt;_init (extern)&lt;br /&gt;
: Hier werden Variableninitialisierungen gemacht und eventuell die ersten subscribe Aufrufe um Events zu abonnieren. Diese Funktion wird beim Systemstart vom Main Modul aufgerufen.&lt;br /&gt;
; optional Funktionen mit den Namen &amp;lt;xx&amp;gt;_subscribe_&amp;lt;event&amp;gt; und &amp;lt;xx&amp;gt;_unsubscribe_&amp;lt;event&amp;gt; (extern)&lt;br /&gt;
: für jeden Event den dieser Modul optional verschicken kann ist sowohl eine Subscribe Funktion als auch ein Unsubscribe Funktion vorhanden. Mit diesen Funktionen kann der Event von einem anderen Modul abboniert werden.&lt;br /&gt;
&lt;br /&gt;
=== Module ===&lt;br /&gt;
Im folgenden sind alle Module und deren Hauptfunktionen aufgelistet.&lt;br /&gt;
&lt;br /&gt;
==== Analog-Modul ====&lt;br /&gt;
Digitalisieren der Analogeingänge&lt;br /&gt;
 Dateien: analog.c&lt;br /&gt;
          analog.h&lt;br /&gt;
Dieser Modul ist abgeleitet von den gleichnamigen Dateien der original NIBObee Bibliothek. Der Austausch war notwendig da wir zusätzliche Liniensensoren verwenden und deren Ansteuerung in gleicher Weise erfolgen sollte. Das bedeutet, dass für die entsprechenden Analogeingänge Messungen mit ein- und ausgeschalteten IR-LEDs durchgeführt werden müssen. Außerdem wurde, entsprechend dem Datenblatt des ATMega16, die Behandlung der Messung der Batteriespannung verbessert. Da hier die Referenzspannung umgeschalten wird muss eine Messung verworfen werden bevor mit einem richtigen Ergebnis gerechnet werden kann. Das wurde in der Originalbibliothek nicht berücksichtigt.&lt;br /&gt;
Die einzelnen Werte werden weiterhin über einen A/D-Wandler ermittelt und zwischengespeichert. Es gibt nun 13 analoge Werte (statt bisher 11) die zyklisch digitalisiert werden. Dieser Vorgang wird mit einer Frequenz von ca 117 kHz durchgeführt, d.h. dass jeder dieser Werte ca. alle 111 µs (statt bisher 94 µs) aktualisiert wird.&lt;br /&gt;
&lt;br /&gt;
==== Line-Modul ====&lt;br /&gt;
Ermitteln der Werte der Liniensensoren&lt;br /&gt;
 Dateien: line.c&lt;br /&gt;
          line.h&lt;br /&gt;
Dieser Modul ersetzt die originalen Bibliotheksfunktionen der Liniensensoren. Dies war notwendig da wir zusätzliche Liniensensoren verwenden.&lt;br /&gt;
&lt;br /&gt;
Die Werte der Liniensensoren können nun mit der Funktion&lt;br /&gt;
&amp;lt;code&amp;gt;ln_get(index)&amp;lt;/code&amp;gt;&lt;br /&gt;
gelesen werden. Die Werte selbst werden über den [[NIBObee#Analog-Modul|Analog-Modul]] ermittelt.&lt;br /&gt;
&lt;br /&gt;
==== Bluetooth-Modul ====&lt;br /&gt;
Wickelt die Kommunikation über den Bluetooth Modul ab. Zur Kommunikation wird allerdings nur der USART als Terminal angesprochen, der Bluetooth Stack ist im [[BTM-222]] implementiert.&lt;br /&gt;
 Dateien: bluetooth.c&lt;br /&gt;
          bluetooth.h&lt;br /&gt;
&lt;br /&gt;
==== Common-Modul ====&lt;br /&gt;
Stellt gemeinsame Funktionen zurVerfügung&lt;br /&gt;
 Dateien: common.c&lt;br /&gt;
          common.h&lt;br /&gt;
&lt;br /&gt;
==== Distance-Modul ====&lt;br /&gt;
Behandelt die Odometrie Sensoren&lt;br /&gt;
 Dateien: distance.c&lt;br /&gt;
          distance.h&lt;br /&gt;
&lt;br /&gt;
==== Drive-Modul ====&lt;br /&gt;
Bewegt den NIBObee&lt;br /&gt;
 Dateien: drive.c&lt;br /&gt;
          drive.h&lt;br /&gt;
&lt;br /&gt;
==== Follow-Modul ====&lt;br /&gt;
Ist für die Linienverfolgung zuständig&lt;br /&gt;
 Dateien: follow.c&lt;br /&gt;
          follow.h&lt;br /&gt;
&lt;br /&gt;
==== MaDeCo-Modul ====&lt;br /&gt;
Behandelt das MaDeCo Protokoll&lt;br /&gt;
 Dateien: madeco.c&lt;br /&gt;
          madeco.h&lt;br /&gt;
&lt;br /&gt;
==== Main-Modul ====&lt;br /&gt;
Scheduler und zentraler Taktgeber&lt;br /&gt;
 Dateien: main.c&lt;br /&gt;
          main.h&lt;br /&gt;
&lt;br /&gt;
==== Sensor-Modul ====&lt;br /&gt;
Ist für die &amp;quot;Fühler&amp;quot; zuständig&lt;br /&gt;
 Dateien: follow.c&lt;br /&gt;
          follow.h&lt;br /&gt;
&lt;br /&gt;
=== Applikationen ===&lt;br /&gt;
==== Labyrinth erkunden ====&lt;br /&gt;
Das ist die Hauptaufgabe des NIBObee. Der Anstoß kommt über einen Befehl vom Board. Ausgewertet wird das vom MaDeCo Modul der auch überprüft ob bereits eine Kalibrierung durchgeführt wurde. Wenn diese Prüfung erfolgreich ist wird der Drive Modul beauftragt das Labyrinth abzufahren. Dort wird nun von einer Kreuzung zur nächsten navigiert und jeder Punkt über den MaDeCo Modul an das Bord gemeldet. Bei jeder Kreuzung wird so weit wie möglich rechts abgebogen bis der NIBObee wieder am Ausgangspunkt angelangt ist.&lt;br /&gt;
&lt;br /&gt;
==== Kürzesten Weg durch Labyrinth ====&lt;br /&gt;
Der MaDeCo Modul erhält vom Board die Richtungsanweisungen für den NIBObee und speichert diese in einem Buffer. Die erste Anweisung wird an den Drive Modul gesendet und der navigiert dann zum nächsten Kreuzungspunkt. Dann wird eine Anfrage an den MaDeCo Modul gesendet um den nächsten Punkt aus dem Buffer zu bekommen. Das passiert solange Daten vorhanden sind und nicht das Ende vom Board signalisiert wurde.&lt;br /&gt;
&lt;br /&gt;
==== Kalibrierung ====&lt;br /&gt;
Zur Kalibrierung fährt der NIBObee ein Viereck entlang dass genau die Seitenlänge eines der Felder des Labyrinths hat. Dies ist notwendig um relativ einfach die Karte des Labyrinths erstellen zu können. Es werden dabei die Anzahl der Schritte der Odometrie für die Länge eines Feldes sowie für eine 90° Rotation als Referenzwerte ermittelt und im EEPROM gespeichert.&lt;br /&gt;
&lt;br /&gt;
=== Protokolle und deren Implementierung ===&lt;br /&gt;
==== [[MaDeCo]] ====&lt;br /&gt;
Neben der State Machine die per Event kommuniziert ist auch noch ein Funktionsinterface vorhanden&lt;br /&gt;
===== Message Interface Definition =====&lt;br /&gt;
* Empfang der Kommandos vom Bluetooth Modul&lt;br /&gt;
* Start/Ende and Drive Modul&lt;br /&gt;
* Status und Ende vom Drive Modul&lt;br /&gt;
===== Function Interface Definition =====&lt;br /&gt;
* void ma_sendWap(uint8_t direction, uint8_t length);&lt;br /&gt;
** Senden eines Wegpunktes an das Board direkt vom Drive Modul&lt;br /&gt;
&lt;br /&gt;
==== Schnittstelle [[MaDeCo]] - RS232-Schnittstelle ====&lt;br /&gt;
* read_data&lt;br /&gt;
* send_data&lt;br /&gt;
&lt;br /&gt;
=== Steuerungssoftware ===&lt;br /&gt;
==== Bluetooth Modul einschalten ====&lt;br /&gt;
Durch Bewegen der &amp;quot;Fühler&amp;quot; der NIBObee nach oben bis Einrasten wird das Bluetooth Modul eingeschalten.&lt;br /&gt;
Daraufhin muss auf eingehenden Bluetooth Traffic gelauscht werden.&lt;br /&gt;
&lt;br /&gt;
==== Blink Codes ====&lt;br /&gt;
Bestimmte Events oder Commands lösen bestimmte Blink- oder Leuchtmuster der Status LEDs aus.&lt;br /&gt;
&#039;&#039;&#039;TODO:&#039;&#039;&#039; Spezifikation der Blink Codes&lt;br /&gt;
&lt;br /&gt;
==== Gerade fahren ====&lt;br /&gt;
Das Problem beim geradeaus fahren ist dass der Roboter von der Spur abweichen kann und dann neu ausgerichtet werden muss. Üblicherweise erfolgt das mit Hilfe der Liniensensoren indem, sobald einer der seitlichen Sensoren die Linie erkennt, durch beschleunigen oder bremsen eines Rades in diese Richtung korrigierend gelenkt wird.&lt;br /&gt;
&lt;br /&gt;
In unserem Fall müssen wir diese Korrektur solange verzögern bis der seitliche Liniensensor eine mögliche Kreuzung passiert hat. Erst danach können wir feststellen ob wir nur die schwarze Linie einer Kreuzung überfahren sind oder ob tatsächlich eine Abweichung vorliegt. Die Anzahl der zu ignorierenden Odometrie-Impule kann folgendermaßen errechnet werden:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;Impulse pro Radumdrehung&amp;gt; / &amp;lt;Radumfang&amp;gt; * &amp;lt;Linienbreite&amp;gt; =&lt;br /&gt;
 20 / 11,8 * 1 = 1,69491525&lt;br /&gt;
&lt;br /&gt;
Wir werden also nur zwei Impulse abwarten bevor wir mit der Korrektur beginnen&lt;br /&gt;
&lt;br /&gt;
===== Funktionsaufteilung =====&lt;br /&gt;
Die Zuständigkeiten für diese Aufgabe sind wie folgt:&lt;br /&gt;
;drive Modul&lt;br /&gt;
:sorgt für die Steuerung der Motoren. Reduzieren der Geschwindigkeit eines Rades um eine ausgleichende Kurve zu fahren und stoppen wenn das Ende der geraden Linie erreicht wurde. Dazu aboniert der Modul die Events des line Modul die eine Abweichung von der Linie melden und vom distance Modul den Event zum fahren der Distanz zwischen Liniensensoren und Achse der Räder.&lt;br /&gt;
;line Modul&lt;br /&gt;
:prüft zyklisch die position der Linie unter dem NIBObee und meldet Abweichungen mittels Events. Dieses Melden wird allerdings verzögert bis zumindest die Breite der Linie überfahren wurde. Dazu aboniert der Modul den Event vom distance Modul den Event zum fahren der der Breite der Linie.&lt;br /&gt;
;distance Modul&lt;br /&gt;
:meldet auf Anforderung das zurücklegen einer Strecke in der Länge der Distanz zwischen Liniensensoren und Achse der Räder oder der Breite der Linie.&lt;br /&gt;
&lt;br /&gt;
==== Kreuzung fahren ====&lt;br /&gt;
An einer Kreuzung wird abgebogen indem der NIBObee zuerst unbeirrt geradeaus fährt bis die Achse genau auf dem Mittelpunkt der Kreuzung zu stehen kommt. Danach wird eine Drehung nach rechts oder links durchgeführt bis sich die Linie wieder genau unter dem mittleren Sensor befindet.&lt;br /&gt;
&lt;br /&gt;
Die Sensoren sind von der Achse 10,4 cm entfernt, eine Radumdrehung bewegt den NIBObee um 11,8 cm weiter und bei dieser Umdrehung werden vom Odometriesensor 20 Impulse abgegeben. Die Linienbreite wird 2 cm betragen. Daher errechnet sich die Strecke die nach Erkennen der Kreuzung gefahren werden muss folgendermassen:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;Impulse pro Radumdrehung&amp;gt; / &amp;lt;Radumfang&amp;gt; * (&amp;lt;Achsabstand&amp;gt; - &amp;lt;halbe Linienbreite&amp;gt;) =&lt;br /&gt;
 20 / 11,8 * (10,4 - 0,5) = 16,779661&lt;br /&gt;
&lt;br /&gt;
Nach passieren der Kreuzung muss der NIBObee also noch 17 Impulse über den Odometriesensor empfangen bevor er stoppt.&lt;br /&gt;
&lt;br /&gt;
== Risikoanalyse ==&lt;br /&gt;
Im Folgenden wird versucht für die möglichen Risikopunkte Alternativen aufzuzeigen.&lt;br /&gt;
&lt;br /&gt;
; ATmega16 ist nicht Leisungsfägig genug&lt;br /&gt;
: Es kann auf den [http://www.nicai-systems.com/de/zubehoer/nibobee-tuning-kit.html Tuning-Kit von Nicai-Systems] zurückgerifffen werden. Dies könnte eine nicht akzeptable Verzögerung verursachen (erkennen, bestellen, NIBObee umrüsten)&lt;br /&gt;
&lt;br /&gt;
: Ein beliebiger PIN-kompatiber Microcontroller ATmega... wird statt dem ATmega16 eingesetzt. Die funktioniert soange der Ersatz-µC mit der Frequenz vom 15 MHz betrieben werden kann. Wichtig ist auch dass es adaptierte Bibliotheken gibt die auf den Ersatz-µC abgestimmt sind (z.B. andere Register oder geänderte Adressen für Register, ...)&lt;br /&gt;
&lt;br /&gt;
; Signale am UART mit Bordspannung im Gegensatz zu RS232-Level (12V)&lt;br /&gt;
: Die Signale am UART werden mit Bordspannung erzeugt/erwartet. Für die Kommunikation mit dem BT-Modul ist daher keine Anpassung durchzuführen.&lt;br /&gt;
&lt;br /&gt;
: Soll zu Testzwecken ein PC über RS232 angeschalten werden ist unbedingt auf die Spannung achten. Möglicherweise verwendet ein USB-RS232 Adapter nicht die 12V sonder nur 5V.&lt;br /&gt;
&lt;br /&gt;
== Open Issues ==&lt;br /&gt;
* Es muss noch überprüft werden ob die NIBObee Hardware ausreichend leistungsfähig ist oder ein Upgrade gemacht werden muss.&lt;br /&gt;
* Wie kann das verlassen der Spur von dem Überfahren einer Kreuzung unterschieden werden? Wenn es hier zu Problemen kommt könnten zwei zusätzliche lichtempfindliche Sensoren rechts und links oder noch ein Element mit drei zusätzlichen Sensoren auf Höhe der Achsen angebracht werden -&amp;gt; Mehraufwand!&lt;br /&gt;
* Soll Aktivierung der BT-Schnittstelle manuell erfolgen?&lt;br /&gt;
* Soll der Betriebsmodus gewählt werden können?&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* [http://www.nicai-systems.de/nibobee.html NIBObee Homepage bei Nicai Systems]&lt;br /&gt;
* [http://download.nicai-systems.com/nibo/Tutorial_NIBObee_20091123.pdf NIBObee - Tutorial zur Programmierung]&lt;br /&gt;
* [http://www.nicai-systems.com/de/zubehoer/nibobee-tuning-kit.html NIBObee - Tuning-Kit von Nicai-Systems]&lt;br /&gt;
* [http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/Der_UART Tutorial zur USART Programmierung]&lt;br /&gt;
[[Kategorie:FH]]&lt;/div&gt;</summary>
		<author><name>Alois</name></author>
	</entry>
	<entry>
		<id>https://wiki.callooh.com/index.php?title=NIBObee&amp;diff=912</id>
		<title>NIBObee</title>
		<link rel="alternate" type="text/html" href="https://wiki.callooh.com/index.php?title=NIBObee&amp;diff=912"/>
		<updated>2011-06-25T08:04:29Z</updated>

		<summary type="html">&lt;p&gt;Alois: /* MaDeCo */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;NIBObee ist der Roboter der im Projekt [[RoLoMa]] verwendet wird.&lt;br /&gt;
== Technische Daten ==&lt;br /&gt;
Hier wird nur ein kleiner Ausschnitt der technischen Daten dargestellt. Es handelt sich nur um jenen Teil der für die Bewertung oder Implementierung der gestellten Aufgaben relevant ist:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Art&lt;br /&gt;
!Typ&lt;br /&gt;
!Bemerkung&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|Mikrocontroller&lt;br /&gt;
|ATMEL ATMega16, , 15 MHz&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|Integrierter UART wird verwendet um den Bluetooth Modul anzubinden.&lt;br /&gt;
&lt;br /&gt;
Sollte die Leistung nicht ausreichen kann entweder der Erweiterungssatz von Nicai-Systems verwendet werden oder nur der Controller wird gegen einen Pinkompatiblen Typ ausgetauscht (z.B. ATMega32, ATMega644, ATMega1284)&lt;br /&gt;
|-&lt;br /&gt;
|Flash:	16	kB&lt;br /&gt;
|-&lt;br /&gt;
|RAM:	1	kB&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|Maße&lt;br /&gt;
|Radumfang: 11,8 cm&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|Diese Maße sind wichtig um den NIBObee so exakt wie möglich am Mittelpunkt des Labyrinthfeldes positionieren zu können.&lt;br /&gt;
|-&lt;br /&gt;
|Abstand Liniensensor zu Radachse: 10,4 cm&lt;br /&gt;
|-&lt;br /&gt;
|Impulse pro Umdrehung: 20&lt;br /&gt;
|}&lt;br /&gt;
=== Ports ===&lt;br /&gt;
Über den UART wird der Bluetooth Modul [[BTM-222]] angebunden. Am NIObee ist diese Schnittstelle am Port X5 verfügbar.&lt;br /&gt;
&lt;br /&gt;
Zwei Analoge Eingänge werden für die Fototransistoren der zusätzlichen Linienerkennung verwendet. Diese sind am NIBObee am Port X1 verfügbar.&lt;br /&gt;
&lt;br /&gt;
Ein Ausgang dient zum ein- und ausschalten der zusätzlichen IR-LEDs. Dafür wird der PIN 1 des Port X4 verwendet.&lt;br /&gt;
&lt;br /&gt;
=== Resourcen ===&lt;br /&gt;
Folgende Resourcen werden für unsere Implementierung verwendet (&#039;&#039;kursiv&#039;&#039; markierte Resourcen werden bereits durch die Bibliothek belegt):&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Resource&lt;br /&gt;
!Verwendung&lt;br /&gt;
!Interrupts&lt;br /&gt;
!Dateien&lt;br /&gt;
|-&lt;br /&gt;
|Timer 1&lt;br /&gt;
|Motor PWM&lt;br /&gt;
|TIMER1_COMPA_vect, TIMER1_COMPB_vect&lt;br /&gt;
|motpwm.c&lt;br /&gt;
|-&lt;br /&gt;
|ADC&lt;br /&gt;
|Analog, Line&lt;br /&gt;
|ADC_vect&lt;br /&gt;
|analog.c, line.c&lt;br /&gt;
|-&lt;br /&gt;
|EEPROM&lt;br /&gt;
|Line (12 Byte)&lt;br /&gt;
|&lt;br /&gt;
|line.c&lt;br /&gt;
|-&lt;br /&gt;
|Ext. IRQ&lt;br /&gt;
|Odometrie&lt;br /&gt;
|INT0_vect, INT1_vect&lt;br /&gt;
|odometry.c&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Eine für den NIBObee allgemein gültige Auflistung findet man im [http://www.nibo-roboter.de/wiki/NIBObee/Lib/Resourcen NIBObee Wiki].&lt;br /&gt;
&lt;br /&gt;
=== Besondere Erkenntnisse ===&lt;br /&gt;
&lt;br /&gt;
==== ATMega16 ====&lt;br /&gt;
Die Speichergröße scheint durchaus ausreichend zu sein. Nach Implementierung aller wichtigen Grundfunktionen ist erst weniger als die Hälfte des Programmspeichers belegt.&lt;br /&gt;
&lt;br /&gt;
Problematisch war anfangs nur der geringe RAM der auch alle konstanten Strings enthält. Dies ist zwar nicht notwendig, ist mit dieser Entwicklungsumgebung allerdings so gelöst. Besonders die umfangreichen Debug-Informationen die über Bluetooth an den PC gesendet werden führten dabei zu massiven Problemen. Durch kurze symbolische Debugausgaben, die dann am PC im eigens entwickelten Terminalprogramm auf sprechende symbolische Ausgabe konvertiert wird, konnte das Problem behoben werden.&lt;br /&gt;
&lt;br /&gt;
==== Liniensensoren ====&lt;br /&gt;
Es hat sich, nach einigen Fehlschlägen bei der Linienverfolung, herausgestellt dass es ungünstig ist den NIBObee in eine optisch ansprechende waagrechte Position zu bringen indem eine kleinere Halbkugel auf der Unterseite angebracht wird. Der Grund: Nur mit der original Halbkugel und dem damit nach vorne ansteigenden Bodenabstand sind die IR-LED&#039;s weit genug vom Boden entfernt um einen Lichtkegen zu erzeugen der auch vernünftig vom Phototransistor erfasst werden kann. Bei waagrechter Ausrichtung des NIBObee ist dieser Kegel, aufgrund des geringeren Abstands zum Boden, zu klein!&lt;br /&gt;
&lt;br /&gt;
=== Bibliotheksfunktionen ===&lt;br /&gt;
==== Liniensensoren ====&lt;br /&gt;
Die original NIBObee Biliothek wird nicht verwendet. Sie wurde durch eine eigene Implementierung im [[NIBObee#Line-Modul|Line-Modul]] ersetzt. Der Grund ist die Notwendigkeit die zusätzlichen Liniensensoren in der gleichen Weise wie die drei Originalsensoren zu behandeln.&lt;br /&gt;
&lt;br /&gt;
==== Motorensteuerung ====&lt;br /&gt;
 motpwm.h&lt;br /&gt;
Die Motoren des NIBObee werden mit PWM ([http://de.wikipedia.org/wiki/Pulsweitenmodulation Pulsweitenmodulation]) angesteuert. Das garantiert natürlich ohne Regelung noch keinen Gleichlauf der beiden Motoren was sich je nach Zustand des Getriebes in einer weiteren oder engernen Kurve zeigt.&lt;br /&gt;
 motpid.h&lt;br /&gt;
Hier stehen Funktionen zur Verfügung die mit Hilfe der Odometrie die Motoren regeln. Diese Funktionen sind für unsere Zwecke allerdings nicht geeignet.&lt;br /&gt;
&lt;br /&gt;
== Aufgaben ==&lt;br /&gt;
Folgende Aufgaben sind im Rahmen des Projekts [[RoLoMa]] vom NIBObee Team zu lösen:&lt;br /&gt;
* Herstellung der Bluetooth Hardware-Erweiterung&lt;br /&gt;
* Softwaremodul zum Bedienen der Bluetooth-Schnittstelle via RS232&lt;br /&gt;
* Softwaremodul zum Erkennen der Linie im Labyrinth und im speziellen der unterschiedlichen Kreuzungstypen&lt;br /&gt;
* Messen des zurückgelegten Weges&lt;br /&gt;
* Steuerung, die den Abstand des Sensors zur Radachse berücksichtigt um den Roboter an der korrekten Stelle um die eigene Achse zu drehen&lt;br /&gt;
* Erstellen eines Abbilds des Labyrinths im Speicher und navigieren bis der Roboter wieder am Startpunkt gelandet ist (z.B. immer Links abbiegen)&lt;br /&gt;
* Implementieren des [[MaDeCo]] Protokolls&lt;br /&gt;
&lt;br /&gt;
Nach einigen ersten Tests ist folgende weitere Aufgabe hinzugekommen:&lt;br /&gt;
* Herstellung der Hardware-Erweiterung mit zusätzlichen Liniensensoren&lt;br /&gt;
&lt;br /&gt;
=== Aufgabenteilung ===&lt;br /&gt;
Alle Aufgaben wurden im Team gelöst wobei für manche dieser Aufgaben der Schwerpunkt bei nur einem oder zwei Teammitgliedern lag. Die folgende Tabelle gibt eine ungefähre Zuordnung der Aufgaben auf die einzelnen Personen:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|colspan=&amp;quot;3&amp;quot;|&#039;&#039;&#039;Dokumentation&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|&amp;amp;nbsp; &lt;br /&gt;
|Projektfortschritt, Controlling&lt;br /&gt;
|Robert Peterfi&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Hardware, Software (Wiki)&lt;br /&gt;
|Alois Pochmann, Reinhard Weismann&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Codedokumentation&lt;br /&gt;
|Robert Peterfi, Alois Pochmann, Reinhard Weismann&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|colspan=&amp;quot;3&amp;quot;|&#039;&#039;&#039;Hardware&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|&amp;amp;nbsp; &lt;br /&gt;
|Entwurf, Design&lt;br /&gt;
|Alois Pochmann&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Bestellung, Aufbau&lt;br /&gt;
|Robert Peterfi, Alois Pochmann&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Test&lt;br /&gt;
|Robert Peterfi, Alois Pochmann, Reinhard Weismann&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|colspan=&amp;quot;3&amp;quot;|&#039;&#039;&#039;Software&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;8&amp;quot;|&amp;amp;nbsp; &lt;br /&gt;
|Design, Funktionsaufteilung&lt;br /&gt;
|Robert Peterfi, Alois Pochmann, Reinhard Weismann&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Kommunikationsprotokoll&lt;br /&gt;
|Reinhard Weismann&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Scheduler, Event Handling, zentrale Funktionen&lt;br /&gt;
|Alois Pochmann&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Sensoren (Hardwareanbindung)&lt;br /&gt;
|Robert Peterfi&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Kalibrierung&lt;br /&gt;
|Robert Peterfi&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Odometrie&lt;br /&gt;
|Reinhard Weismann&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Bewegungssteuerung&lt;br /&gt;
|Robert Peterfi, Alois Pochmann, Reinhard Weismann&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Testapplikation (Windows)&lt;br /&gt;
|Alois Pochmann&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
&lt;br /&gt;
=== Bluetooth ===&lt;br /&gt;
Der Bluetooth Modul ist im Detail auf den Seiten des [[BTM-222]] beschrieben.&lt;br /&gt;
&lt;br /&gt;
=== Liniensensoren ===&lt;br /&gt;
Zum Erkennen der Kreuzungen bei gleichzeitigem Folgen der Linie war es notwendig zusätzliche Liniensensoren zu verwenden. Diese wurden mit einer Zusatzplatine in einer Reihe mit den bereits vorhandenen Liniensensoren, allerdings so weit wie möglich linke und rechts außen, montiert. Das Einlesen der Analogwerte erfolgt über die beiden Analogeingänge am Stecker X1. Die IR-LEDs sind, analog zu den bestehenden IR-LEDs der vorhandenen Liniensensoren, über den Ausgang 1 am Stecker X4 schaltbar. Dies ist notwendig da jeweils eine Messung mit eingschalteter LED und eine mit ausgeschalteter LED durchgeführt wird. Damit wird der Einfluß des Umgebungslichts korrigiert.&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
Die Aufgaben der Software sollen in möglichst unabhängigen Modulen realisiert werden um das Testen einfacher zu gestalten. Die einzelnen Module sind im Folgenden beschrieben.&lt;br /&gt;
&lt;br /&gt;
=== Architektur ===&lt;br /&gt;
Das Gesamtsystem besteht aus einem zentralen Taktgeber, einem Scheduler und mehreren State Maschinen. Die Kommunikation erfolgt über Events und, wenn nur eine spezielle Funktionalität eines anderen Moduls verwendet werden soll ohne dessen Zustand zu beeinflussen, über Funktionsaufrufe (z.B. senden einer MaDeCo-Meldung zum reporten eines Wegpunktes direkt vom drive Modul). Die Module können mittels Subscribe einen Event, den ein anderer Modul zur Verfügung steht, abonnieren.&lt;br /&gt;
&lt;br /&gt;
==== Systemtakt, Scheduler ====&lt;br /&gt;
Im Main Modul befindet sich der zentrale Taktgeber der aus dem Interrupt des Timer 1 einen gleichmäßigen Takt von 100Hz erzeugt. Dieser Takt kann von anderen Modulen verwendet werden um zyklische Aufgaben zu erfüllen (z.B. überprüfen des Status der &amp;quot;Fühler&amp;quot;). Im Main Modul befindet sich auch der Scheduler der ganz einfach in der Endlosschleife sequenziell jeden Modul aufruft um anstehende Events zu bearbeiten.&lt;br /&gt;
&lt;br /&gt;
==== State / Event Maschinen ====&lt;br /&gt;
Die State / Event Maschinen sind in allen Modulen gleich aufgebaut. Es gibt die folgenden Funktionen (wobei statt &amp;quot;&amp;lt;xx&amp;gt;&amp;quot; das Kürzel des Moduls steht, z.B &amp;quot;dr&amp;quot; für Drive):&lt;br /&gt;
; eine Funktion mit dem Namen &amp;lt;xx&amp;gt;_main (intern)&lt;br /&gt;
: Das ist die eigentliche State Maschine. Wird direkt vom Scheduler mit dem aktuell zu verarbeitenden Event aufgerufen. Hier gibt es ein switch Statement über den aktuellen Zustand und für jeden Zustand ein switch Statement über den empfangenen Event.&lt;br /&gt;
; eine Funktion mit dem Namen &amp;lt;xx&amp;gt;_init (extern)&lt;br /&gt;
: Hier werden Variableninitialisierungen gemacht und eventuell die ersten subscribe Aufrufe um Events zu abonnieren. Diese Funktion wird beim Systemstart vom Main Modul aufgerufen.&lt;br /&gt;
; optional Funktionen mit den Namen &amp;lt;xx&amp;gt;_subscribe_&amp;lt;event&amp;gt; und &amp;lt;xx&amp;gt;_unsubscribe_&amp;lt;event&amp;gt; (extern)&lt;br /&gt;
: für jeden Event den dieser Modul optional verschicken kann ist sowohl eine Subscribe Funktion als auch ein Unsubscribe Funktion vorhanden. Mit diesen Funktionen kann der Event von einem anderen Modul abboniert werden.&lt;br /&gt;
&lt;br /&gt;
=== Module ===&lt;br /&gt;
Im folgenden sind alle Module und deren Hauptfunktionen aufgelistet.&lt;br /&gt;
&lt;br /&gt;
==== Analog-Modul ====&lt;br /&gt;
Digitalisieren der Analogeingänge&lt;br /&gt;
 Dateien: analog.c&lt;br /&gt;
          analog.h&lt;br /&gt;
Dieser Modul ist abgeleitet von den gleichnamigen Dateien der original NIBObee Bibliothek. Der Austausch war notwendig da wir zusätzliche Liniensensoren verwenden und deren Ansteuerung in gleicher Weise erfolgen sollte. Das bedeutet, dass für die entsprechenden Analogeingänge Messungen mit ein- und ausgeschalteten IR-LEDs durchgeführt werden müssen. Außerdem wurde, entsprechend dem Datenblatt des ATMega16, die Behandlung der Messung der Batteriespannung verbessert. Da hier die Referenzspannung umgeschalten wird muss eine Messung verworfen werden bevor mit einem richtigen Ergebnis gerechnet werden kann. Das wurde in der Originalbibliothek nicht berücksichtigt.&lt;br /&gt;
Die einzelnen Werte werden weiterhin über einen A/D-Wandler ermittelt und zwischengespeichert. Es gibt nun 13 analoge Werte (statt bisher 11) die zyklisch digitalisiert werden. Dieser Vorgang wird mit einer Frequenz von ca 117 kHz durchgeführt, d.h. dass jeder dieser Werte ca. alle 111 µs (statt bisher 94 µs) aktualisiert wird.&lt;br /&gt;
&lt;br /&gt;
==== Line-Modul ====&lt;br /&gt;
Ermitteln der Werte der Liniensensoren&lt;br /&gt;
 Dateien: line.c&lt;br /&gt;
          line.h&lt;br /&gt;
Dieser Modul ersetzt die originalen Bibliotheksfunktionen der Liniensensoren. Dies war notwendig da wir zusätzliche Liniensensoren verwenden.&lt;br /&gt;
&lt;br /&gt;
Die Werte der Liniensensoren können nun mit der Funktion&lt;br /&gt;
&amp;lt;code&amp;gt;ln_get(index)&amp;lt;/code&amp;gt;&lt;br /&gt;
gelesen werden. Die Werte selbst werden über den [[NIBObee#Analog-Modul|Analog-Modul]] ermittelt.&lt;br /&gt;
&lt;br /&gt;
==== Bluetooth-Modul ====&lt;br /&gt;
Wickelt die Kommunikation über den Bluetooth Modul ab. Zur Kommunikation wird allerdings nur der USART als Terminal angesprochen, der Bluetooth Stack ist im [[BTM-222]] implementiert.&lt;br /&gt;
 Dateien: bluetooth.c&lt;br /&gt;
          bluetooth.h&lt;br /&gt;
&lt;br /&gt;
==== Common-Modul ====&lt;br /&gt;
Stellt gemeinsame Funktionen zurVerfügung&lt;br /&gt;
 Dateien: common.c&lt;br /&gt;
          common.h&lt;br /&gt;
&lt;br /&gt;
==== Distance-Modul ====&lt;br /&gt;
Behandelt die Odometrie Sensoren&lt;br /&gt;
 Dateien: distance.c&lt;br /&gt;
          distance.h&lt;br /&gt;
&lt;br /&gt;
==== Drive-Modul ====&lt;br /&gt;
Bewegt den NIBObee&lt;br /&gt;
 Dateien: drive.c&lt;br /&gt;
          drive.h&lt;br /&gt;
&lt;br /&gt;
==== Follow-Modul ====&lt;br /&gt;
Ist für die Linienverfolgung zuständig&lt;br /&gt;
 Dateien: follow.c&lt;br /&gt;
          follow.h&lt;br /&gt;
&lt;br /&gt;
==== MaDeCo-Modul ====&lt;br /&gt;
Behandelt das MaDeCo Protokoll&lt;br /&gt;
 Dateien: madeco.c&lt;br /&gt;
          madeco.h&lt;br /&gt;
&lt;br /&gt;
==== Main-Modul ====&lt;br /&gt;
Scheduler und zentraler Taktgeber&lt;br /&gt;
 Dateien: main.c&lt;br /&gt;
          main.h&lt;br /&gt;
&lt;br /&gt;
==== Sensor-Modul ====&lt;br /&gt;
Ist für die &amp;quot;Fühler&amp;quot; zuständig&lt;br /&gt;
 Dateien: follow.c&lt;br /&gt;
          follow.h&lt;br /&gt;
&lt;br /&gt;
=== Applikationen ===&lt;br /&gt;
==== Labyrinth erkunden ====&lt;br /&gt;
Das ist die Hauptaufgabe des NIBObee. Der Anstoß kommt über einen Befehl vom Board. Ausgewertet wird das vom MaDeCo Modul der auch überprüft ob bereits eine Kalibrierung durchgeführt wurde. Wenn diese Prüfung erfolgreich ist wird der Drive Modul beauftragt das Labyrinth abzufahren. Dort wird nun von einer Kreuzung zur nächsten navigiert und jeder Punkt über den MaDeCo Modul an das Bord gemeldet. Bei jeder Kreuzung wird so weit wie möglich rechts abgebogen bis der NIBObee wieder am Ausgangspunkt angelangt ist.&lt;br /&gt;
&lt;br /&gt;
==== Kürzesten Weg durch Labyrinth ====&lt;br /&gt;
Der MaDeCo Modul erhält vom Board die Richtungsanweisungen für den NIBObee und speichert diese in einem Buffer. Die erste Anweisung wird an den Drive Modul gesendet und der navigiert dann zum nächsten Kreuzungspunkt. Dann wird eine Anfrage an den MaDeCo Modul gesendet um den nächsten Punkt aus dem Buffer zu bekommen. Das passiert solange Daten vorhanden sind und nicht das Ende vom Board signalisiert wurde.&lt;br /&gt;
&lt;br /&gt;
==== Kalibrierung ====&lt;br /&gt;
Zur Kalibrierung fährt der NIBObee ein Viereck entlang dass genau die Seitenlänge eines der Felder des Labyrinths hat. Dies ist notwendig um relativ einfach die Karte des Labyrinths erstellen zu können. Es werden dabei die Anzahl der Schritte der Odometrie für die Länge eines Feldes sowie für eine 90° Rotation als Referenzwerte ermittelt und im EEPROM gespeichert.&lt;br /&gt;
&lt;br /&gt;
=== Protokolle und deren Implementierung ===&lt;br /&gt;
==== [[MaDeCo]] ====&lt;br /&gt;
Neben der State Machine die per Event kommuniziert ist auch noch ein Funktionsinterface vorhanden&lt;br /&gt;
===== Message Interface Definition =====&lt;br /&gt;
Das Bild zeigt die State Machine des MaDeCo Moduls mit den unterstützten Events&lt;br /&gt;
===== Function Interface Definition =====&lt;br /&gt;
;void ma_sendWap(uint8_t direction, uint8_t length);&lt;br /&gt;
:Senden eines Wegpunktes an das Board direkt vom Drive Modul&lt;br /&gt;
&lt;br /&gt;
==== Schnittstelle [[MaDeCo]] - RS232-Schnittstelle ====&lt;br /&gt;
* pairing&lt;br /&gt;
* Konfigurations-Commands&lt;br /&gt;
* ack&lt;br /&gt;
* read_command&lt;br /&gt;
* send_command&lt;br /&gt;
&lt;br /&gt;
=== Steuerungssoftware ===&lt;br /&gt;
==== Bluetooth Modul einschalten ====&lt;br /&gt;
Durch Bewegen der &amp;quot;Fühler&amp;quot; der NIBObee nach oben bis Einrasten wird das Bluetooth Modul eingeschalten.&lt;br /&gt;
Daraufhin muss auf eingehenden Bluetooth Traffic gelauscht werden.&lt;br /&gt;
&lt;br /&gt;
==== Blink Codes ====&lt;br /&gt;
Bestimmte Events oder Commands lösen bestimmte Blink- oder Leuchtmuster der Status LEDs aus.&lt;br /&gt;
&#039;&#039;&#039;TODO:&#039;&#039;&#039; Spezifikation der Blink Codes&lt;br /&gt;
&lt;br /&gt;
==== Gerade fahren ====&lt;br /&gt;
Das Problem beim geradeaus fahren ist dass der Roboter von der Spur abweichen kann und dann neu ausgerichtet werden muss. Üblicherweise erfolgt das mit Hilfe der Liniensensoren indem, sobald einer der seitlichen Sensoren die Linie erkennt, durch beschleunigen oder bremsen eines Rades in diese Richtung korrigierend gelenkt wird.&lt;br /&gt;
&lt;br /&gt;
In unserem Fall müssen wir diese Korrektur solange verzögern bis der seitliche Liniensensor eine mögliche Kreuzung passiert hat. Erst danach können wir feststellen ob wir nur die schwarze Linie einer Kreuzung überfahren sind oder ob tatsächlich eine Abweichung vorliegt. Die Anzahl der zu ignorierenden Odometrie-Impule kann folgendermaßen errechnet werden:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;Impulse pro Radumdrehung&amp;gt; / &amp;lt;Radumfang&amp;gt; * &amp;lt;Linienbreite&amp;gt; =&lt;br /&gt;
 20 / 11,8 * 1 = 1,69491525&lt;br /&gt;
&lt;br /&gt;
Wir werden also nur zwei Impulse abwarten bevor wir mit der Korrektur beginnen&lt;br /&gt;
&lt;br /&gt;
===== Funktionsaufteilung =====&lt;br /&gt;
Die Zuständigkeiten für diese Aufgabe sind wie folgt:&lt;br /&gt;
;drive Modul&lt;br /&gt;
:sorgt für die Steuerung der Motoren. Reduzieren der Geschwindigkeit eines Rades um eine ausgleichende Kurve zu fahren und stoppen wenn das Ende der geraden Linie erreicht wurde. Dazu aboniert der Modul die Events des line Modul die eine Abweichung von der Linie melden und vom distance Modul den Event zum fahren der Distanz zwischen Liniensensoren und Achse der Räder.&lt;br /&gt;
;line Modul&lt;br /&gt;
:prüft zyklisch die position der Linie unter dem NIBObee und meldet Abweichungen mittels Events. Dieses Melden wird allerdings verzögert bis zumindest die Breite der Linie überfahren wurde. Dazu aboniert der Modul den Event vom distance Modul den Event zum fahren der der Breite der Linie.&lt;br /&gt;
;distance Modul&lt;br /&gt;
:meldet auf Anforderung das zurücklegen einer Strecke in der Länge der Distanz zwischen Liniensensoren und Achse der Räder oder der Breite der Linie.&lt;br /&gt;
&lt;br /&gt;
==== Kreuzung fahren ====&lt;br /&gt;
An einer Kreuzung wird abgebogen indem der NIBObee zuerst unbeirrt geradeaus fährt bis die Achse genau auf dem Mittelpunkt der Kreuzung zu stehen kommt. Danach wird eine Drehung nach rechts oder links durchgeführt bis sich die Linie wieder genau unter dem mittleren Sensor befindet.&lt;br /&gt;
&lt;br /&gt;
Die Sensoren sind von der Achse 10,4 cm entfernt, eine Radumdrehung bewegt den NIBObee um 11,8 cm weiter und bei dieser Umdrehung werden vom Odometriesensor 20 Impulse abgegeben. Die Linienbreite wird 2 cm betragen. Daher errechnet sich die Strecke die nach Erkennen der Kreuzung gefahren werden muss folgendermassen:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;Impulse pro Radumdrehung&amp;gt; / &amp;lt;Radumfang&amp;gt; * (&amp;lt;Achsabstand&amp;gt; - &amp;lt;halbe Linienbreite&amp;gt;) =&lt;br /&gt;
 20 / 11,8 * (10,4 - 0,5) = 16,779661&lt;br /&gt;
&lt;br /&gt;
Nach passieren der Kreuzung muss der NIBObee also noch 17 Impulse über den Odometriesensor empfangen bevor er stoppt.&lt;br /&gt;
&lt;br /&gt;
== Risikoanalyse ==&lt;br /&gt;
Im Folgenden wird versucht für die möglichen Risikopunkte Alternativen aufzuzeigen.&lt;br /&gt;
&lt;br /&gt;
; ATmega16 ist nicht Leisungsfägig genug&lt;br /&gt;
: Es kann auf den [http://www.nicai-systems.com/de/zubehoer/nibobee-tuning-kit.html Tuning-Kit von Nicai-Systems] zurückgerifffen werden. Dies könnte eine nicht akzeptable Verzögerung verursachen (erkennen, bestellen, NIBObee umrüsten)&lt;br /&gt;
&lt;br /&gt;
: Ein beliebiger PIN-kompatiber Microcontroller ATmega... wird statt dem ATmega16 eingesetzt. Die funktioniert soange der Ersatz-µC mit der Frequenz vom 15 MHz betrieben werden kann. Wichtig ist auch dass es adaptierte Bibliotheken gibt die auf den Ersatz-µC abgestimmt sind (z.B. andere Register oder geänderte Adressen für Register, ...)&lt;br /&gt;
&lt;br /&gt;
; Signale am UART mit Bordspannung im Gegensatz zu RS232-Level (12V)&lt;br /&gt;
: Die Signale am UART werden mit Bordspannung erzeugt/erwartet. Für die Kommunikation mit dem BT-Modul ist daher keine Anpassung durchzuführen.&lt;br /&gt;
&lt;br /&gt;
: Soll zu Testzwecken ein PC über RS232 angeschalten werden ist unbedingt auf die Spannung achten. Möglicherweise verwendet ein USB-RS232 Adapter nicht die 12V sonder nur 5V.&lt;br /&gt;
&lt;br /&gt;
== Open Issues ==&lt;br /&gt;
* Es muss noch überprüft werden ob die NIBObee Hardware ausreichend leistungsfähig ist oder ein Upgrade gemacht werden muss.&lt;br /&gt;
* Wie kann das verlassen der Spur von dem Überfahren einer Kreuzung unterschieden werden? Wenn es hier zu Problemen kommt könnten zwei zusätzliche lichtempfindliche Sensoren rechts und links oder noch ein Element mit drei zusätzlichen Sensoren auf Höhe der Achsen angebracht werden -&amp;gt; Mehraufwand!&lt;br /&gt;
* Soll Aktivierung der BT-Schnittstelle manuell erfolgen?&lt;br /&gt;
* Soll der Betriebsmodus gewählt werden können?&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* [http://www.nicai-systems.de/nibobee.html NIBObee Homepage bei Nicai Systems]&lt;br /&gt;
* [http://download.nicai-systems.com/nibo/Tutorial_NIBObee_20091123.pdf NIBObee - Tutorial zur Programmierung]&lt;br /&gt;
* [http://www.nicai-systems.com/de/zubehoer/nibobee-tuning-kit.html NIBObee - Tuning-Kit von Nicai-Systems]&lt;br /&gt;
* [http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/Der_UART Tutorial zur USART Programmierung]&lt;br /&gt;
[[Kategorie:FH]]&lt;/div&gt;</summary>
		<author><name>Alois</name></author>
	</entry>
	<entry>
		<id>https://wiki.callooh.com/index.php?title=NIBObee&amp;diff=911</id>
		<title>NIBObee</title>
		<link rel="alternate" type="text/html" href="https://wiki.callooh.com/index.php?title=NIBObee&amp;diff=911"/>
		<updated>2011-06-25T07:55:49Z</updated>

		<summary type="html">&lt;p&gt;Alois: /* Kalibrierung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;NIBObee ist der Roboter der im Projekt [[RoLoMa]] verwendet wird.&lt;br /&gt;
== Technische Daten ==&lt;br /&gt;
Hier wird nur ein kleiner Ausschnitt der technischen Daten dargestellt. Es handelt sich nur um jenen Teil der für die Bewertung oder Implementierung der gestellten Aufgaben relevant ist:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Art&lt;br /&gt;
!Typ&lt;br /&gt;
!Bemerkung&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|Mikrocontroller&lt;br /&gt;
|ATMEL ATMega16, , 15 MHz&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|Integrierter UART wird verwendet um den Bluetooth Modul anzubinden.&lt;br /&gt;
&lt;br /&gt;
Sollte die Leistung nicht ausreichen kann entweder der Erweiterungssatz von Nicai-Systems verwendet werden oder nur der Controller wird gegen einen Pinkompatiblen Typ ausgetauscht (z.B. ATMega32, ATMega644, ATMega1284)&lt;br /&gt;
|-&lt;br /&gt;
|Flash:	16	kB&lt;br /&gt;
|-&lt;br /&gt;
|RAM:	1	kB&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|Maße&lt;br /&gt;
|Radumfang: 11,8 cm&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|Diese Maße sind wichtig um den NIBObee so exakt wie möglich am Mittelpunkt des Labyrinthfeldes positionieren zu können.&lt;br /&gt;
|-&lt;br /&gt;
|Abstand Liniensensor zu Radachse: 10,4 cm&lt;br /&gt;
|-&lt;br /&gt;
|Impulse pro Umdrehung: 20&lt;br /&gt;
|}&lt;br /&gt;
=== Ports ===&lt;br /&gt;
Über den UART wird der Bluetooth Modul [[BTM-222]] angebunden. Am NIObee ist diese Schnittstelle am Port X5 verfügbar.&lt;br /&gt;
&lt;br /&gt;
Zwei Analoge Eingänge werden für die Fototransistoren der zusätzlichen Linienerkennung verwendet. Diese sind am NIBObee am Port X1 verfügbar.&lt;br /&gt;
&lt;br /&gt;
Ein Ausgang dient zum ein- und ausschalten der zusätzlichen IR-LEDs. Dafür wird der PIN 1 des Port X4 verwendet.&lt;br /&gt;
&lt;br /&gt;
=== Resourcen ===&lt;br /&gt;
Folgende Resourcen werden für unsere Implementierung verwendet (&#039;&#039;kursiv&#039;&#039; markierte Resourcen werden bereits durch die Bibliothek belegt):&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Resource&lt;br /&gt;
!Verwendung&lt;br /&gt;
!Interrupts&lt;br /&gt;
!Dateien&lt;br /&gt;
|-&lt;br /&gt;
|Timer 1&lt;br /&gt;
|Motor PWM&lt;br /&gt;
|TIMER1_COMPA_vect, TIMER1_COMPB_vect&lt;br /&gt;
|motpwm.c&lt;br /&gt;
|-&lt;br /&gt;
|ADC&lt;br /&gt;
|Analog, Line&lt;br /&gt;
|ADC_vect&lt;br /&gt;
|analog.c, line.c&lt;br /&gt;
|-&lt;br /&gt;
|EEPROM&lt;br /&gt;
|Line (12 Byte)&lt;br /&gt;
|&lt;br /&gt;
|line.c&lt;br /&gt;
|-&lt;br /&gt;
|Ext. IRQ&lt;br /&gt;
|Odometrie&lt;br /&gt;
|INT0_vect, INT1_vect&lt;br /&gt;
|odometry.c&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Eine für den NIBObee allgemein gültige Auflistung findet man im [http://www.nibo-roboter.de/wiki/NIBObee/Lib/Resourcen NIBObee Wiki].&lt;br /&gt;
&lt;br /&gt;
=== Besondere Erkenntnisse ===&lt;br /&gt;
&lt;br /&gt;
==== ATMega16 ====&lt;br /&gt;
Die Speichergröße scheint durchaus ausreichend zu sein. Nach Implementierung aller wichtigen Grundfunktionen ist erst weniger als die Hälfte des Programmspeichers belegt.&lt;br /&gt;
&lt;br /&gt;
Problematisch war anfangs nur der geringe RAM der auch alle konstanten Strings enthält. Dies ist zwar nicht notwendig, ist mit dieser Entwicklungsumgebung allerdings so gelöst. Besonders die umfangreichen Debug-Informationen die über Bluetooth an den PC gesendet werden führten dabei zu massiven Problemen. Durch kurze symbolische Debugausgaben, die dann am PC im eigens entwickelten Terminalprogramm auf sprechende symbolische Ausgabe konvertiert wird, konnte das Problem behoben werden.&lt;br /&gt;
&lt;br /&gt;
==== Liniensensoren ====&lt;br /&gt;
Es hat sich, nach einigen Fehlschlägen bei der Linienverfolung, herausgestellt dass es ungünstig ist den NIBObee in eine optisch ansprechende waagrechte Position zu bringen indem eine kleinere Halbkugel auf der Unterseite angebracht wird. Der Grund: Nur mit der original Halbkugel und dem damit nach vorne ansteigenden Bodenabstand sind die IR-LED&#039;s weit genug vom Boden entfernt um einen Lichtkegen zu erzeugen der auch vernünftig vom Phototransistor erfasst werden kann. Bei waagrechter Ausrichtung des NIBObee ist dieser Kegel, aufgrund des geringeren Abstands zum Boden, zu klein!&lt;br /&gt;
&lt;br /&gt;
=== Bibliotheksfunktionen ===&lt;br /&gt;
==== Liniensensoren ====&lt;br /&gt;
Die original NIBObee Biliothek wird nicht verwendet. Sie wurde durch eine eigene Implementierung im [[NIBObee#Line-Modul|Line-Modul]] ersetzt. Der Grund ist die Notwendigkeit die zusätzlichen Liniensensoren in der gleichen Weise wie die drei Originalsensoren zu behandeln.&lt;br /&gt;
&lt;br /&gt;
==== Motorensteuerung ====&lt;br /&gt;
 motpwm.h&lt;br /&gt;
Die Motoren des NIBObee werden mit PWM ([http://de.wikipedia.org/wiki/Pulsweitenmodulation Pulsweitenmodulation]) angesteuert. Das garantiert natürlich ohne Regelung noch keinen Gleichlauf der beiden Motoren was sich je nach Zustand des Getriebes in einer weiteren oder engernen Kurve zeigt.&lt;br /&gt;
 motpid.h&lt;br /&gt;
Hier stehen Funktionen zur Verfügung die mit Hilfe der Odometrie die Motoren regeln. Diese Funktionen sind für unsere Zwecke allerdings nicht geeignet.&lt;br /&gt;
&lt;br /&gt;
== Aufgaben ==&lt;br /&gt;
Folgende Aufgaben sind im Rahmen des Projekts [[RoLoMa]] vom NIBObee Team zu lösen:&lt;br /&gt;
* Herstellung der Bluetooth Hardware-Erweiterung&lt;br /&gt;
* Softwaremodul zum Bedienen der Bluetooth-Schnittstelle via RS232&lt;br /&gt;
* Softwaremodul zum Erkennen der Linie im Labyrinth und im speziellen der unterschiedlichen Kreuzungstypen&lt;br /&gt;
* Messen des zurückgelegten Weges&lt;br /&gt;
* Steuerung, die den Abstand des Sensors zur Radachse berücksichtigt um den Roboter an der korrekten Stelle um die eigene Achse zu drehen&lt;br /&gt;
* Erstellen eines Abbilds des Labyrinths im Speicher und navigieren bis der Roboter wieder am Startpunkt gelandet ist (z.B. immer Links abbiegen)&lt;br /&gt;
* Implementieren des [[MaDeCo]] Protokolls&lt;br /&gt;
&lt;br /&gt;
Nach einigen ersten Tests ist folgende weitere Aufgabe hinzugekommen:&lt;br /&gt;
* Herstellung der Hardware-Erweiterung mit zusätzlichen Liniensensoren&lt;br /&gt;
&lt;br /&gt;
=== Aufgabenteilung ===&lt;br /&gt;
Alle Aufgaben wurden im Team gelöst wobei für manche dieser Aufgaben der Schwerpunkt bei nur einem oder zwei Teammitgliedern lag. Die folgende Tabelle gibt eine ungefähre Zuordnung der Aufgaben auf die einzelnen Personen:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|colspan=&amp;quot;3&amp;quot;|&#039;&#039;&#039;Dokumentation&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|&amp;amp;nbsp; &lt;br /&gt;
|Projektfortschritt, Controlling&lt;br /&gt;
|Robert Peterfi&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Hardware, Software (Wiki)&lt;br /&gt;
|Alois Pochmann, Reinhard Weismann&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Codedokumentation&lt;br /&gt;
|Robert Peterfi, Alois Pochmann, Reinhard Weismann&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|colspan=&amp;quot;3&amp;quot;|&#039;&#039;&#039;Hardware&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|&amp;amp;nbsp; &lt;br /&gt;
|Entwurf, Design&lt;br /&gt;
|Alois Pochmann&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Bestellung, Aufbau&lt;br /&gt;
|Robert Peterfi, Alois Pochmann&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Test&lt;br /&gt;
|Robert Peterfi, Alois Pochmann, Reinhard Weismann&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|colspan=&amp;quot;3&amp;quot;|&#039;&#039;&#039;Software&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;8&amp;quot;|&amp;amp;nbsp; &lt;br /&gt;
|Design, Funktionsaufteilung&lt;br /&gt;
|Robert Peterfi, Alois Pochmann, Reinhard Weismann&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Kommunikationsprotokoll&lt;br /&gt;
|Reinhard Weismann&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Scheduler, Event Handling, zentrale Funktionen&lt;br /&gt;
|Alois Pochmann&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Sensoren (Hardwareanbindung)&lt;br /&gt;
|Robert Peterfi&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Kalibrierung&lt;br /&gt;
|Robert Peterfi&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Odometrie&lt;br /&gt;
|Reinhard Weismann&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Bewegungssteuerung&lt;br /&gt;
|Robert Peterfi, Alois Pochmann, Reinhard Weismann&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Testapplikation (Windows)&lt;br /&gt;
|Alois Pochmann&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
&lt;br /&gt;
=== Bluetooth ===&lt;br /&gt;
Der Bluetooth Modul ist im Detail auf den Seiten des [[BTM-222]] beschrieben.&lt;br /&gt;
&lt;br /&gt;
=== Liniensensoren ===&lt;br /&gt;
Zum Erkennen der Kreuzungen bei gleichzeitigem Folgen der Linie war es notwendig zusätzliche Liniensensoren zu verwenden. Diese wurden mit einer Zusatzplatine in einer Reihe mit den bereits vorhandenen Liniensensoren, allerdings so weit wie möglich linke und rechts außen, montiert. Das Einlesen der Analogwerte erfolgt über die beiden Analogeingänge am Stecker X1. Die IR-LEDs sind, analog zu den bestehenden IR-LEDs der vorhandenen Liniensensoren, über den Ausgang 1 am Stecker X4 schaltbar. Dies ist notwendig da jeweils eine Messung mit eingschalteter LED und eine mit ausgeschalteter LED durchgeführt wird. Damit wird der Einfluß des Umgebungslichts korrigiert.&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
Die Aufgaben der Software sollen in möglichst unabhängigen Modulen realisiert werden um das Testen einfacher zu gestalten. Die einzelnen Module sind im Folgenden beschrieben.&lt;br /&gt;
&lt;br /&gt;
=== Architektur ===&lt;br /&gt;
Das Gesamtsystem besteht aus einem zentralen Taktgeber, einem Scheduler und mehreren State Maschinen. Die Kommunikation erfolgt über Events und, wenn nur eine spezielle Funktionalität eines anderen Moduls verwendet werden soll ohne dessen Zustand zu beeinflussen, über Funktionsaufrufe (z.B. senden einer MaDeCo-Meldung zum reporten eines Wegpunktes direkt vom drive Modul). Die Module können mittels Subscribe einen Event, den ein anderer Modul zur Verfügung steht, abonnieren.&lt;br /&gt;
&lt;br /&gt;
==== Systemtakt, Scheduler ====&lt;br /&gt;
Im Main Modul befindet sich der zentrale Taktgeber der aus dem Interrupt des Timer 1 einen gleichmäßigen Takt von 100Hz erzeugt. Dieser Takt kann von anderen Modulen verwendet werden um zyklische Aufgaben zu erfüllen (z.B. überprüfen des Status der &amp;quot;Fühler&amp;quot;). Im Main Modul befindet sich auch der Scheduler der ganz einfach in der Endlosschleife sequenziell jeden Modul aufruft um anstehende Events zu bearbeiten.&lt;br /&gt;
&lt;br /&gt;
==== State / Event Maschinen ====&lt;br /&gt;
Die State / Event Maschinen sind in allen Modulen gleich aufgebaut. Es gibt die folgenden Funktionen (wobei statt &amp;quot;&amp;lt;xx&amp;gt;&amp;quot; das Kürzel des Moduls steht, z.B &amp;quot;dr&amp;quot; für Drive):&lt;br /&gt;
; eine Funktion mit dem Namen &amp;lt;xx&amp;gt;_main (intern)&lt;br /&gt;
: Das ist die eigentliche State Maschine. Wird direkt vom Scheduler mit dem aktuell zu verarbeitenden Event aufgerufen. Hier gibt es ein switch Statement über den aktuellen Zustand und für jeden Zustand ein switch Statement über den empfangenen Event.&lt;br /&gt;
; eine Funktion mit dem Namen &amp;lt;xx&amp;gt;_init (extern)&lt;br /&gt;
: Hier werden Variableninitialisierungen gemacht und eventuell die ersten subscribe Aufrufe um Events zu abonnieren. Diese Funktion wird beim Systemstart vom Main Modul aufgerufen.&lt;br /&gt;
; optional Funktionen mit den Namen &amp;lt;xx&amp;gt;_subscribe_&amp;lt;event&amp;gt; und &amp;lt;xx&amp;gt;_unsubscribe_&amp;lt;event&amp;gt; (extern)&lt;br /&gt;
: für jeden Event den dieser Modul optional verschicken kann ist sowohl eine Subscribe Funktion als auch ein Unsubscribe Funktion vorhanden. Mit diesen Funktionen kann der Event von einem anderen Modul abboniert werden.&lt;br /&gt;
&lt;br /&gt;
=== Module ===&lt;br /&gt;
Im folgenden sind alle Module und deren Hauptfunktionen aufgelistet.&lt;br /&gt;
&lt;br /&gt;
==== Analog-Modul ====&lt;br /&gt;
Digitalisieren der Analogeingänge&lt;br /&gt;
 Dateien: analog.c&lt;br /&gt;
          analog.h&lt;br /&gt;
Dieser Modul ist abgeleitet von den gleichnamigen Dateien der original NIBObee Bibliothek. Der Austausch war notwendig da wir zusätzliche Liniensensoren verwenden und deren Ansteuerung in gleicher Weise erfolgen sollte. Das bedeutet, dass für die entsprechenden Analogeingänge Messungen mit ein- und ausgeschalteten IR-LEDs durchgeführt werden müssen. Außerdem wurde, entsprechend dem Datenblatt des ATMega16, die Behandlung der Messung der Batteriespannung verbessert. Da hier die Referenzspannung umgeschalten wird muss eine Messung verworfen werden bevor mit einem richtigen Ergebnis gerechnet werden kann. Das wurde in der Originalbibliothek nicht berücksichtigt.&lt;br /&gt;
Die einzelnen Werte werden weiterhin über einen A/D-Wandler ermittelt und zwischengespeichert. Es gibt nun 13 analoge Werte (statt bisher 11) die zyklisch digitalisiert werden. Dieser Vorgang wird mit einer Frequenz von ca 117 kHz durchgeführt, d.h. dass jeder dieser Werte ca. alle 111 µs (statt bisher 94 µs) aktualisiert wird.&lt;br /&gt;
&lt;br /&gt;
==== Line-Modul ====&lt;br /&gt;
Ermitteln der Werte der Liniensensoren&lt;br /&gt;
 Dateien: line.c&lt;br /&gt;
          line.h&lt;br /&gt;
Dieser Modul ersetzt die originalen Bibliotheksfunktionen der Liniensensoren. Dies war notwendig da wir zusätzliche Liniensensoren verwenden.&lt;br /&gt;
&lt;br /&gt;
Die Werte der Liniensensoren können nun mit der Funktion&lt;br /&gt;
&amp;lt;code&amp;gt;ln_get(index)&amp;lt;/code&amp;gt;&lt;br /&gt;
gelesen werden. Die Werte selbst werden über den [[NIBObee#Analog-Modul|Analog-Modul]] ermittelt.&lt;br /&gt;
&lt;br /&gt;
==== Bluetooth-Modul ====&lt;br /&gt;
Wickelt die Kommunikation über den Bluetooth Modul ab. Zur Kommunikation wird allerdings nur der USART als Terminal angesprochen, der Bluetooth Stack ist im [[BTM-222]] implementiert.&lt;br /&gt;
 Dateien: bluetooth.c&lt;br /&gt;
          bluetooth.h&lt;br /&gt;
&lt;br /&gt;
==== Common-Modul ====&lt;br /&gt;
Stellt gemeinsame Funktionen zurVerfügung&lt;br /&gt;
 Dateien: common.c&lt;br /&gt;
          common.h&lt;br /&gt;
&lt;br /&gt;
==== Distance-Modul ====&lt;br /&gt;
Behandelt die Odometrie Sensoren&lt;br /&gt;
 Dateien: distance.c&lt;br /&gt;
          distance.h&lt;br /&gt;
&lt;br /&gt;
==== Drive-Modul ====&lt;br /&gt;
Bewegt den NIBObee&lt;br /&gt;
 Dateien: drive.c&lt;br /&gt;
          drive.h&lt;br /&gt;
&lt;br /&gt;
==== Follow-Modul ====&lt;br /&gt;
Ist für die Linienverfolgung zuständig&lt;br /&gt;
 Dateien: follow.c&lt;br /&gt;
          follow.h&lt;br /&gt;
&lt;br /&gt;
==== MaDeCo-Modul ====&lt;br /&gt;
Behandelt das MaDeCo Protokoll&lt;br /&gt;
 Dateien: madeco.c&lt;br /&gt;
          madeco.h&lt;br /&gt;
&lt;br /&gt;
==== Main-Modul ====&lt;br /&gt;
Scheduler und zentraler Taktgeber&lt;br /&gt;
 Dateien: main.c&lt;br /&gt;
          main.h&lt;br /&gt;
&lt;br /&gt;
==== Sensor-Modul ====&lt;br /&gt;
Ist für die &amp;quot;Fühler&amp;quot; zuständig&lt;br /&gt;
 Dateien: follow.c&lt;br /&gt;
          follow.h&lt;br /&gt;
&lt;br /&gt;
=== Applikationen ===&lt;br /&gt;
==== Labyrinth erkunden ====&lt;br /&gt;
Das ist die Hauptaufgabe des NIBObee. Der Anstoß kommt über einen Befehl vom Board. Ausgewertet wird das vom MaDeCo Modul der auch überprüft ob bereits eine Kalibrierung durchgeführt wurde. Wenn diese Prüfung erfolgreich ist wird der Drive Modul beauftragt das Labyrinth abzufahren. Dort wird nun von einer Kreuzung zur nächsten navigiert und jeder Punkt über den MaDeCo Modul an das Bord gemeldet. Bei jeder Kreuzung wird so weit wie möglich rechts abgebogen bis der NIBObee wieder am Ausgangspunkt angelangt ist.&lt;br /&gt;
&lt;br /&gt;
==== Kürzesten Weg durch Labyrinth ====&lt;br /&gt;
Der MaDeCo Modul erhält vom Board die Richtungsanweisungen für den NIBObee und speichert diese in einem Buffer. Die erste Anweisung wird an den Drive Modul gesendet und der navigiert dann zum nächsten Kreuzungspunkt. Dann wird eine Anfrage an den MaDeCo Modul gesendet um den nächsten Punkt aus dem Buffer zu bekommen. Das passiert solange Daten vorhanden sind und nicht das Ende vom Board signalisiert wurde.&lt;br /&gt;
&lt;br /&gt;
==== Kalibrierung ====&lt;br /&gt;
Zur Kalibrierung fährt der NIBObee ein Viereck entlang dass genau die Seitenlänge eines der Felder des Labyrinths hat. Dies ist notwendig um relativ einfach die Karte des Labyrinths erstellen zu können. Es werden dabei die Anzahl der Schritte der Odometrie für die Länge eines Feldes sowie für eine 90° Rotation als Referenzwerte ermittelt und im EEPROM gespeichert.&lt;br /&gt;
&lt;br /&gt;
=== Protokolle und deren Implementierung ===&lt;br /&gt;
==== [[MaDeCo]] ====&lt;br /&gt;
===== Interface Definition =====&lt;br /&gt;
* int set_opmode(OPMODE)&lt;br /&gt;
* int send_waypoint(WAYPOINT)&lt;br /&gt;
* int direct(DIRECTION[])&lt;br /&gt;
* int ack()&lt;br /&gt;
&lt;br /&gt;
==== Schnittstelle [[MaDeCo]] - RS232-Schnittstelle ====&lt;br /&gt;
* pairing&lt;br /&gt;
* Konfigurations-Commands&lt;br /&gt;
* ack&lt;br /&gt;
* read_command&lt;br /&gt;
* send_command&lt;br /&gt;
&lt;br /&gt;
=== Steuerungssoftware ===&lt;br /&gt;
==== Bluetooth Modul einschalten ====&lt;br /&gt;
Durch Bewegen der &amp;quot;Fühler&amp;quot; der NIBObee nach oben bis Einrasten wird das Bluetooth Modul eingeschalten.&lt;br /&gt;
Daraufhin muss auf eingehenden Bluetooth Traffic gelauscht werden.&lt;br /&gt;
&lt;br /&gt;
==== Blink Codes ====&lt;br /&gt;
Bestimmte Events oder Commands lösen bestimmte Blink- oder Leuchtmuster der Status LEDs aus.&lt;br /&gt;
&#039;&#039;&#039;TODO:&#039;&#039;&#039; Spezifikation der Blink Codes&lt;br /&gt;
&lt;br /&gt;
==== Gerade fahren ====&lt;br /&gt;
Das Problem beim geradeaus fahren ist dass der Roboter von der Spur abweichen kann und dann neu ausgerichtet werden muss. Üblicherweise erfolgt das mit Hilfe der Liniensensoren indem, sobald einer der seitlichen Sensoren die Linie erkennt, durch beschleunigen oder bremsen eines Rades in diese Richtung korrigierend gelenkt wird.&lt;br /&gt;
&lt;br /&gt;
In unserem Fall müssen wir diese Korrektur solange verzögern bis der seitliche Liniensensor eine mögliche Kreuzung passiert hat. Erst danach können wir feststellen ob wir nur die schwarze Linie einer Kreuzung überfahren sind oder ob tatsächlich eine Abweichung vorliegt. Die Anzahl der zu ignorierenden Odometrie-Impule kann folgendermaßen errechnet werden:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;Impulse pro Radumdrehung&amp;gt; / &amp;lt;Radumfang&amp;gt; * &amp;lt;Linienbreite&amp;gt; =&lt;br /&gt;
 20 / 11,8 * 1 = 1,69491525&lt;br /&gt;
&lt;br /&gt;
Wir werden also nur zwei Impulse abwarten bevor wir mit der Korrektur beginnen&lt;br /&gt;
&lt;br /&gt;
===== Funktionsaufteilung =====&lt;br /&gt;
Die Zuständigkeiten für diese Aufgabe sind wie folgt:&lt;br /&gt;
;drive Modul&lt;br /&gt;
:sorgt für die Steuerung der Motoren. Reduzieren der Geschwindigkeit eines Rades um eine ausgleichende Kurve zu fahren und stoppen wenn das Ende der geraden Linie erreicht wurde. Dazu aboniert der Modul die Events des line Modul die eine Abweichung von der Linie melden und vom distance Modul den Event zum fahren der Distanz zwischen Liniensensoren und Achse der Räder.&lt;br /&gt;
;line Modul&lt;br /&gt;
:prüft zyklisch die position der Linie unter dem NIBObee und meldet Abweichungen mittels Events. Dieses Melden wird allerdings verzögert bis zumindest die Breite der Linie überfahren wurde. Dazu aboniert der Modul den Event vom distance Modul den Event zum fahren der der Breite der Linie.&lt;br /&gt;
;distance Modul&lt;br /&gt;
:meldet auf Anforderung das zurücklegen einer Strecke in der Länge der Distanz zwischen Liniensensoren und Achse der Räder oder der Breite der Linie.&lt;br /&gt;
&lt;br /&gt;
==== Kreuzung fahren ====&lt;br /&gt;
An einer Kreuzung wird abgebogen indem der NIBObee zuerst unbeirrt geradeaus fährt bis die Achse genau auf dem Mittelpunkt der Kreuzung zu stehen kommt. Danach wird eine Drehung nach rechts oder links durchgeführt bis sich die Linie wieder genau unter dem mittleren Sensor befindet.&lt;br /&gt;
&lt;br /&gt;
Die Sensoren sind von der Achse 10,4 cm entfernt, eine Radumdrehung bewegt den NIBObee um 11,8 cm weiter und bei dieser Umdrehung werden vom Odometriesensor 20 Impulse abgegeben. Die Linienbreite wird 2 cm betragen. Daher errechnet sich die Strecke die nach Erkennen der Kreuzung gefahren werden muss folgendermassen:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;Impulse pro Radumdrehung&amp;gt; / &amp;lt;Radumfang&amp;gt; * (&amp;lt;Achsabstand&amp;gt; - &amp;lt;halbe Linienbreite&amp;gt;) =&lt;br /&gt;
 20 / 11,8 * (10,4 - 0,5) = 16,779661&lt;br /&gt;
&lt;br /&gt;
Nach passieren der Kreuzung muss der NIBObee also noch 17 Impulse über den Odometriesensor empfangen bevor er stoppt.&lt;br /&gt;
&lt;br /&gt;
== Risikoanalyse ==&lt;br /&gt;
Im Folgenden wird versucht für die möglichen Risikopunkte Alternativen aufzuzeigen.&lt;br /&gt;
&lt;br /&gt;
; ATmega16 ist nicht Leisungsfägig genug&lt;br /&gt;
: Es kann auf den [http://www.nicai-systems.com/de/zubehoer/nibobee-tuning-kit.html Tuning-Kit von Nicai-Systems] zurückgerifffen werden. Dies könnte eine nicht akzeptable Verzögerung verursachen (erkennen, bestellen, NIBObee umrüsten)&lt;br /&gt;
&lt;br /&gt;
: Ein beliebiger PIN-kompatiber Microcontroller ATmega... wird statt dem ATmega16 eingesetzt. Die funktioniert soange der Ersatz-µC mit der Frequenz vom 15 MHz betrieben werden kann. Wichtig ist auch dass es adaptierte Bibliotheken gibt die auf den Ersatz-µC abgestimmt sind (z.B. andere Register oder geänderte Adressen für Register, ...)&lt;br /&gt;
&lt;br /&gt;
; Signale am UART mit Bordspannung im Gegensatz zu RS232-Level (12V)&lt;br /&gt;
: Die Signale am UART werden mit Bordspannung erzeugt/erwartet. Für die Kommunikation mit dem BT-Modul ist daher keine Anpassung durchzuführen.&lt;br /&gt;
&lt;br /&gt;
: Soll zu Testzwecken ein PC über RS232 angeschalten werden ist unbedingt auf die Spannung achten. Möglicherweise verwendet ein USB-RS232 Adapter nicht die 12V sonder nur 5V.&lt;br /&gt;
&lt;br /&gt;
== Open Issues ==&lt;br /&gt;
* Es muss noch überprüft werden ob die NIBObee Hardware ausreichend leistungsfähig ist oder ein Upgrade gemacht werden muss.&lt;br /&gt;
* Wie kann das verlassen der Spur von dem Überfahren einer Kreuzung unterschieden werden? Wenn es hier zu Problemen kommt könnten zwei zusätzliche lichtempfindliche Sensoren rechts und links oder noch ein Element mit drei zusätzlichen Sensoren auf Höhe der Achsen angebracht werden -&amp;gt; Mehraufwand!&lt;br /&gt;
* Soll Aktivierung der BT-Schnittstelle manuell erfolgen?&lt;br /&gt;
* Soll der Betriebsmodus gewählt werden können?&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* [http://www.nicai-systems.de/nibobee.html NIBObee Homepage bei Nicai Systems]&lt;br /&gt;
* [http://download.nicai-systems.com/nibo/Tutorial_NIBObee_20091123.pdf NIBObee - Tutorial zur Programmierung]&lt;br /&gt;
* [http://www.nicai-systems.com/de/zubehoer/nibobee-tuning-kit.html NIBObee - Tuning-Kit von Nicai-Systems]&lt;br /&gt;
* [http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/Der_UART Tutorial zur USART Programmierung]&lt;br /&gt;
[[Kategorie:FH]]&lt;/div&gt;</summary>
		<author><name>Alois</name></author>
	</entry>
	<entry>
		<id>https://wiki.callooh.com/index.php?title=NIBObee&amp;diff=910</id>
		<title>NIBObee</title>
		<link rel="alternate" type="text/html" href="https://wiki.callooh.com/index.php?title=NIBObee&amp;diff=910"/>
		<updated>2011-06-25T07:52:59Z</updated>

		<summary type="html">&lt;p&gt;Alois: /* Kürzesten Weg durch Labyrinth */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;NIBObee ist der Roboter der im Projekt [[RoLoMa]] verwendet wird.&lt;br /&gt;
== Technische Daten ==&lt;br /&gt;
Hier wird nur ein kleiner Ausschnitt der technischen Daten dargestellt. Es handelt sich nur um jenen Teil der für die Bewertung oder Implementierung der gestellten Aufgaben relevant ist:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Art&lt;br /&gt;
!Typ&lt;br /&gt;
!Bemerkung&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|Mikrocontroller&lt;br /&gt;
|ATMEL ATMega16, , 15 MHz&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|Integrierter UART wird verwendet um den Bluetooth Modul anzubinden.&lt;br /&gt;
&lt;br /&gt;
Sollte die Leistung nicht ausreichen kann entweder der Erweiterungssatz von Nicai-Systems verwendet werden oder nur der Controller wird gegen einen Pinkompatiblen Typ ausgetauscht (z.B. ATMega32, ATMega644, ATMega1284)&lt;br /&gt;
|-&lt;br /&gt;
|Flash:	16	kB&lt;br /&gt;
|-&lt;br /&gt;
|RAM:	1	kB&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|Maße&lt;br /&gt;
|Radumfang: 11,8 cm&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|Diese Maße sind wichtig um den NIBObee so exakt wie möglich am Mittelpunkt des Labyrinthfeldes positionieren zu können.&lt;br /&gt;
|-&lt;br /&gt;
|Abstand Liniensensor zu Radachse: 10,4 cm&lt;br /&gt;
|-&lt;br /&gt;
|Impulse pro Umdrehung: 20&lt;br /&gt;
|}&lt;br /&gt;
=== Ports ===&lt;br /&gt;
Über den UART wird der Bluetooth Modul [[BTM-222]] angebunden. Am NIObee ist diese Schnittstelle am Port X5 verfügbar.&lt;br /&gt;
&lt;br /&gt;
Zwei Analoge Eingänge werden für die Fototransistoren der zusätzlichen Linienerkennung verwendet. Diese sind am NIBObee am Port X1 verfügbar.&lt;br /&gt;
&lt;br /&gt;
Ein Ausgang dient zum ein- und ausschalten der zusätzlichen IR-LEDs. Dafür wird der PIN 1 des Port X4 verwendet.&lt;br /&gt;
&lt;br /&gt;
=== Resourcen ===&lt;br /&gt;
Folgende Resourcen werden für unsere Implementierung verwendet (&#039;&#039;kursiv&#039;&#039; markierte Resourcen werden bereits durch die Bibliothek belegt):&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Resource&lt;br /&gt;
!Verwendung&lt;br /&gt;
!Interrupts&lt;br /&gt;
!Dateien&lt;br /&gt;
|-&lt;br /&gt;
|Timer 1&lt;br /&gt;
|Motor PWM&lt;br /&gt;
|TIMER1_COMPA_vect, TIMER1_COMPB_vect&lt;br /&gt;
|motpwm.c&lt;br /&gt;
|-&lt;br /&gt;
|ADC&lt;br /&gt;
|Analog, Line&lt;br /&gt;
|ADC_vect&lt;br /&gt;
|analog.c, line.c&lt;br /&gt;
|-&lt;br /&gt;
|EEPROM&lt;br /&gt;
|Line (12 Byte)&lt;br /&gt;
|&lt;br /&gt;
|line.c&lt;br /&gt;
|-&lt;br /&gt;
|Ext. IRQ&lt;br /&gt;
|Odometrie&lt;br /&gt;
|INT0_vect, INT1_vect&lt;br /&gt;
|odometry.c&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Eine für den NIBObee allgemein gültige Auflistung findet man im [http://www.nibo-roboter.de/wiki/NIBObee/Lib/Resourcen NIBObee Wiki].&lt;br /&gt;
&lt;br /&gt;
=== Besondere Erkenntnisse ===&lt;br /&gt;
&lt;br /&gt;
==== ATMega16 ====&lt;br /&gt;
Die Speichergröße scheint durchaus ausreichend zu sein. Nach Implementierung aller wichtigen Grundfunktionen ist erst weniger als die Hälfte des Programmspeichers belegt.&lt;br /&gt;
&lt;br /&gt;
Problematisch war anfangs nur der geringe RAM der auch alle konstanten Strings enthält. Dies ist zwar nicht notwendig, ist mit dieser Entwicklungsumgebung allerdings so gelöst. Besonders die umfangreichen Debug-Informationen die über Bluetooth an den PC gesendet werden führten dabei zu massiven Problemen. Durch kurze symbolische Debugausgaben, die dann am PC im eigens entwickelten Terminalprogramm auf sprechende symbolische Ausgabe konvertiert wird, konnte das Problem behoben werden.&lt;br /&gt;
&lt;br /&gt;
==== Liniensensoren ====&lt;br /&gt;
Es hat sich, nach einigen Fehlschlägen bei der Linienverfolung, herausgestellt dass es ungünstig ist den NIBObee in eine optisch ansprechende waagrechte Position zu bringen indem eine kleinere Halbkugel auf der Unterseite angebracht wird. Der Grund: Nur mit der original Halbkugel und dem damit nach vorne ansteigenden Bodenabstand sind die IR-LED&#039;s weit genug vom Boden entfernt um einen Lichtkegen zu erzeugen der auch vernünftig vom Phototransistor erfasst werden kann. Bei waagrechter Ausrichtung des NIBObee ist dieser Kegel, aufgrund des geringeren Abstands zum Boden, zu klein!&lt;br /&gt;
&lt;br /&gt;
=== Bibliotheksfunktionen ===&lt;br /&gt;
==== Liniensensoren ====&lt;br /&gt;
Die original NIBObee Biliothek wird nicht verwendet. Sie wurde durch eine eigene Implementierung im [[NIBObee#Line-Modul|Line-Modul]] ersetzt. Der Grund ist die Notwendigkeit die zusätzlichen Liniensensoren in der gleichen Weise wie die drei Originalsensoren zu behandeln.&lt;br /&gt;
&lt;br /&gt;
==== Motorensteuerung ====&lt;br /&gt;
 motpwm.h&lt;br /&gt;
Die Motoren des NIBObee werden mit PWM ([http://de.wikipedia.org/wiki/Pulsweitenmodulation Pulsweitenmodulation]) angesteuert. Das garantiert natürlich ohne Regelung noch keinen Gleichlauf der beiden Motoren was sich je nach Zustand des Getriebes in einer weiteren oder engernen Kurve zeigt.&lt;br /&gt;
 motpid.h&lt;br /&gt;
Hier stehen Funktionen zur Verfügung die mit Hilfe der Odometrie die Motoren regeln. Diese Funktionen sind für unsere Zwecke allerdings nicht geeignet.&lt;br /&gt;
&lt;br /&gt;
== Aufgaben ==&lt;br /&gt;
Folgende Aufgaben sind im Rahmen des Projekts [[RoLoMa]] vom NIBObee Team zu lösen:&lt;br /&gt;
* Herstellung der Bluetooth Hardware-Erweiterung&lt;br /&gt;
* Softwaremodul zum Bedienen der Bluetooth-Schnittstelle via RS232&lt;br /&gt;
* Softwaremodul zum Erkennen der Linie im Labyrinth und im speziellen der unterschiedlichen Kreuzungstypen&lt;br /&gt;
* Messen des zurückgelegten Weges&lt;br /&gt;
* Steuerung, die den Abstand des Sensors zur Radachse berücksichtigt um den Roboter an der korrekten Stelle um die eigene Achse zu drehen&lt;br /&gt;
* Erstellen eines Abbilds des Labyrinths im Speicher und navigieren bis der Roboter wieder am Startpunkt gelandet ist (z.B. immer Links abbiegen)&lt;br /&gt;
* Implementieren des [[MaDeCo]] Protokolls&lt;br /&gt;
&lt;br /&gt;
Nach einigen ersten Tests ist folgende weitere Aufgabe hinzugekommen:&lt;br /&gt;
* Herstellung der Hardware-Erweiterung mit zusätzlichen Liniensensoren&lt;br /&gt;
&lt;br /&gt;
=== Aufgabenteilung ===&lt;br /&gt;
Alle Aufgaben wurden im Team gelöst wobei für manche dieser Aufgaben der Schwerpunkt bei nur einem oder zwei Teammitgliedern lag. Die folgende Tabelle gibt eine ungefähre Zuordnung der Aufgaben auf die einzelnen Personen:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|colspan=&amp;quot;3&amp;quot;|&#039;&#039;&#039;Dokumentation&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|&amp;amp;nbsp; &lt;br /&gt;
|Projektfortschritt, Controlling&lt;br /&gt;
|Robert Peterfi&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Hardware, Software (Wiki)&lt;br /&gt;
|Alois Pochmann, Reinhard Weismann&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Codedokumentation&lt;br /&gt;
|Robert Peterfi, Alois Pochmann, Reinhard Weismann&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|colspan=&amp;quot;3&amp;quot;|&#039;&#039;&#039;Hardware&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|&amp;amp;nbsp; &lt;br /&gt;
|Entwurf, Design&lt;br /&gt;
|Alois Pochmann&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Bestellung, Aufbau&lt;br /&gt;
|Robert Peterfi, Alois Pochmann&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Test&lt;br /&gt;
|Robert Peterfi, Alois Pochmann, Reinhard Weismann&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|colspan=&amp;quot;3&amp;quot;|&#039;&#039;&#039;Software&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;8&amp;quot;|&amp;amp;nbsp; &lt;br /&gt;
|Design, Funktionsaufteilung&lt;br /&gt;
|Robert Peterfi, Alois Pochmann, Reinhard Weismann&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Kommunikationsprotokoll&lt;br /&gt;
|Reinhard Weismann&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Scheduler, Event Handling, zentrale Funktionen&lt;br /&gt;
|Alois Pochmann&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Sensoren (Hardwareanbindung)&lt;br /&gt;
|Robert Peterfi&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Kalibrierung&lt;br /&gt;
|Robert Peterfi&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Odometrie&lt;br /&gt;
|Reinhard Weismann&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Bewegungssteuerung&lt;br /&gt;
|Robert Peterfi, Alois Pochmann, Reinhard Weismann&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Testapplikation (Windows)&lt;br /&gt;
|Alois Pochmann&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
&lt;br /&gt;
=== Bluetooth ===&lt;br /&gt;
Der Bluetooth Modul ist im Detail auf den Seiten des [[BTM-222]] beschrieben.&lt;br /&gt;
&lt;br /&gt;
=== Liniensensoren ===&lt;br /&gt;
Zum Erkennen der Kreuzungen bei gleichzeitigem Folgen der Linie war es notwendig zusätzliche Liniensensoren zu verwenden. Diese wurden mit einer Zusatzplatine in einer Reihe mit den bereits vorhandenen Liniensensoren, allerdings so weit wie möglich linke und rechts außen, montiert. Das Einlesen der Analogwerte erfolgt über die beiden Analogeingänge am Stecker X1. Die IR-LEDs sind, analog zu den bestehenden IR-LEDs der vorhandenen Liniensensoren, über den Ausgang 1 am Stecker X4 schaltbar. Dies ist notwendig da jeweils eine Messung mit eingschalteter LED und eine mit ausgeschalteter LED durchgeführt wird. Damit wird der Einfluß des Umgebungslichts korrigiert.&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
Die Aufgaben der Software sollen in möglichst unabhängigen Modulen realisiert werden um das Testen einfacher zu gestalten. Die einzelnen Module sind im Folgenden beschrieben.&lt;br /&gt;
&lt;br /&gt;
=== Architektur ===&lt;br /&gt;
Das Gesamtsystem besteht aus einem zentralen Taktgeber, einem Scheduler und mehreren State Maschinen. Die Kommunikation erfolgt über Events und, wenn nur eine spezielle Funktionalität eines anderen Moduls verwendet werden soll ohne dessen Zustand zu beeinflussen, über Funktionsaufrufe (z.B. senden einer MaDeCo-Meldung zum reporten eines Wegpunktes direkt vom drive Modul). Die Module können mittels Subscribe einen Event, den ein anderer Modul zur Verfügung steht, abonnieren.&lt;br /&gt;
&lt;br /&gt;
==== Systemtakt, Scheduler ====&lt;br /&gt;
Im Main Modul befindet sich der zentrale Taktgeber der aus dem Interrupt des Timer 1 einen gleichmäßigen Takt von 100Hz erzeugt. Dieser Takt kann von anderen Modulen verwendet werden um zyklische Aufgaben zu erfüllen (z.B. überprüfen des Status der &amp;quot;Fühler&amp;quot;). Im Main Modul befindet sich auch der Scheduler der ganz einfach in der Endlosschleife sequenziell jeden Modul aufruft um anstehende Events zu bearbeiten.&lt;br /&gt;
&lt;br /&gt;
==== State / Event Maschinen ====&lt;br /&gt;
Die State / Event Maschinen sind in allen Modulen gleich aufgebaut. Es gibt die folgenden Funktionen (wobei statt &amp;quot;&amp;lt;xx&amp;gt;&amp;quot; das Kürzel des Moduls steht, z.B &amp;quot;dr&amp;quot; für Drive):&lt;br /&gt;
; eine Funktion mit dem Namen &amp;lt;xx&amp;gt;_main (intern)&lt;br /&gt;
: Das ist die eigentliche State Maschine. Wird direkt vom Scheduler mit dem aktuell zu verarbeitenden Event aufgerufen. Hier gibt es ein switch Statement über den aktuellen Zustand und für jeden Zustand ein switch Statement über den empfangenen Event.&lt;br /&gt;
; eine Funktion mit dem Namen &amp;lt;xx&amp;gt;_init (extern)&lt;br /&gt;
: Hier werden Variableninitialisierungen gemacht und eventuell die ersten subscribe Aufrufe um Events zu abonnieren. Diese Funktion wird beim Systemstart vom Main Modul aufgerufen.&lt;br /&gt;
; optional Funktionen mit den Namen &amp;lt;xx&amp;gt;_subscribe_&amp;lt;event&amp;gt; und &amp;lt;xx&amp;gt;_unsubscribe_&amp;lt;event&amp;gt; (extern)&lt;br /&gt;
: für jeden Event den dieser Modul optional verschicken kann ist sowohl eine Subscribe Funktion als auch ein Unsubscribe Funktion vorhanden. Mit diesen Funktionen kann der Event von einem anderen Modul abboniert werden.&lt;br /&gt;
&lt;br /&gt;
=== Module ===&lt;br /&gt;
Im folgenden sind alle Module und deren Hauptfunktionen aufgelistet.&lt;br /&gt;
&lt;br /&gt;
==== Analog-Modul ====&lt;br /&gt;
Digitalisieren der Analogeingänge&lt;br /&gt;
 Dateien: analog.c&lt;br /&gt;
          analog.h&lt;br /&gt;
Dieser Modul ist abgeleitet von den gleichnamigen Dateien der original NIBObee Bibliothek. Der Austausch war notwendig da wir zusätzliche Liniensensoren verwenden und deren Ansteuerung in gleicher Weise erfolgen sollte. Das bedeutet, dass für die entsprechenden Analogeingänge Messungen mit ein- und ausgeschalteten IR-LEDs durchgeführt werden müssen. Außerdem wurde, entsprechend dem Datenblatt des ATMega16, die Behandlung der Messung der Batteriespannung verbessert. Da hier die Referenzspannung umgeschalten wird muss eine Messung verworfen werden bevor mit einem richtigen Ergebnis gerechnet werden kann. Das wurde in der Originalbibliothek nicht berücksichtigt.&lt;br /&gt;
Die einzelnen Werte werden weiterhin über einen A/D-Wandler ermittelt und zwischengespeichert. Es gibt nun 13 analoge Werte (statt bisher 11) die zyklisch digitalisiert werden. Dieser Vorgang wird mit einer Frequenz von ca 117 kHz durchgeführt, d.h. dass jeder dieser Werte ca. alle 111 µs (statt bisher 94 µs) aktualisiert wird.&lt;br /&gt;
&lt;br /&gt;
==== Line-Modul ====&lt;br /&gt;
Ermitteln der Werte der Liniensensoren&lt;br /&gt;
 Dateien: line.c&lt;br /&gt;
          line.h&lt;br /&gt;
Dieser Modul ersetzt die originalen Bibliotheksfunktionen der Liniensensoren. Dies war notwendig da wir zusätzliche Liniensensoren verwenden.&lt;br /&gt;
&lt;br /&gt;
Die Werte der Liniensensoren können nun mit der Funktion&lt;br /&gt;
&amp;lt;code&amp;gt;ln_get(index)&amp;lt;/code&amp;gt;&lt;br /&gt;
gelesen werden. Die Werte selbst werden über den [[NIBObee#Analog-Modul|Analog-Modul]] ermittelt.&lt;br /&gt;
&lt;br /&gt;
==== Bluetooth-Modul ====&lt;br /&gt;
Wickelt die Kommunikation über den Bluetooth Modul ab. Zur Kommunikation wird allerdings nur der USART als Terminal angesprochen, der Bluetooth Stack ist im [[BTM-222]] implementiert.&lt;br /&gt;
 Dateien: bluetooth.c&lt;br /&gt;
          bluetooth.h&lt;br /&gt;
&lt;br /&gt;
==== Common-Modul ====&lt;br /&gt;
Stellt gemeinsame Funktionen zurVerfügung&lt;br /&gt;
 Dateien: common.c&lt;br /&gt;
          common.h&lt;br /&gt;
&lt;br /&gt;
==== Distance-Modul ====&lt;br /&gt;
Behandelt die Odometrie Sensoren&lt;br /&gt;
 Dateien: distance.c&lt;br /&gt;
          distance.h&lt;br /&gt;
&lt;br /&gt;
==== Drive-Modul ====&lt;br /&gt;
Bewegt den NIBObee&lt;br /&gt;
 Dateien: drive.c&lt;br /&gt;
          drive.h&lt;br /&gt;
&lt;br /&gt;
==== Follow-Modul ====&lt;br /&gt;
Ist für die Linienverfolgung zuständig&lt;br /&gt;
 Dateien: follow.c&lt;br /&gt;
          follow.h&lt;br /&gt;
&lt;br /&gt;
==== MaDeCo-Modul ====&lt;br /&gt;
Behandelt das MaDeCo Protokoll&lt;br /&gt;
 Dateien: madeco.c&lt;br /&gt;
          madeco.h&lt;br /&gt;
&lt;br /&gt;
==== Main-Modul ====&lt;br /&gt;
Scheduler und zentraler Taktgeber&lt;br /&gt;
 Dateien: main.c&lt;br /&gt;
          main.h&lt;br /&gt;
&lt;br /&gt;
==== Sensor-Modul ====&lt;br /&gt;
Ist für die &amp;quot;Fühler&amp;quot; zuständig&lt;br /&gt;
 Dateien: follow.c&lt;br /&gt;
          follow.h&lt;br /&gt;
&lt;br /&gt;
=== Applikationen ===&lt;br /&gt;
==== Labyrinth erkunden ====&lt;br /&gt;
Das ist die Hauptaufgabe des NIBObee. Der Anstoß kommt über einen Befehl vom Board. Ausgewertet wird das vom MaDeCo Modul der auch überprüft ob bereits eine Kalibrierung durchgeführt wurde. Wenn diese Prüfung erfolgreich ist wird der Drive Modul beauftragt das Labyrinth abzufahren. Dort wird nun von einer Kreuzung zur nächsten navigiert und jeder Punkt über den MaDeCo Modul an das Bord gemeldet. Bei jeder Kreuzung wird so weit wie möglich rechts abgebogen bis der NIBObee wieder am Ausgangspunkt angelangt ist.&lt;br /&gt;
&lt;br /&gt;
==== Kürzesten Weg durch Labyrinth ====&lt;br /&gt;
Der MaDeCo Modul erhält vom Board die Richtungsanweisungen für den NIBObee und speichert diese in einem Buffer. Die erste Anweisung wird an den Drive Modul gesendet und der navigiert dann zum nächsten Kreuzungspunkt. Dann wird eine Anfrage an den MaDeCo Modul gesendet um den nächsten Punkt aus dem Buffer zu bekommen. Das passiert solange Daten vorhanden sind und nicht das Ende vom Board signalisiert wurde.&lt;br /&gt;
&lt;br /&gt;
==== Kalibrierung ====&lt;br /&gt;
Zur Kalibrierung fährt der NIBObee ein Viereck entlang dass genau die Seitenlänge eines der Felder des Labyrinths hat. Dies ist notwendig um relativ einfach die Karte des Labyrinths erstellen zu können.&lt;br /&gt;
&lt;br /&gt;
=== Protokolle und deren Implementierung ===&lt;br /&gt;
==== [[MaDeCo]] ====&lt;br /&gt;
===== Interface Definition =====&lt;br /&gt;
* int set_opmode(OPMODE)&lt;br /&gt;
* int send_waypoint(WAYPOINT)&lt;br /&gt;
* int direct(DIRECTION[])&lt;br /&gt;
* int ack()&lt;br /&gt;
&lt;br /&gt;
==== Schnittstelle [[MaDeCo]] - RS232-Schnittstelle ====&lt;br /&gt;
* pairing&lt;br /&gt;
* Konfigurations-Commands&lt;br /&gt;
* ack&lt;br /&gt;
* read_command&lt;br /&gt;
* send_command&lt;br /&gt;
&lt;br /&gt;
=== Steuerungssoftware ===&lt;br /&gt;
==== Bluetooth Modul einschalten ====&lt;br /&gt;
Durch Bewegen der &amp;quot;Fühler&amp;quot; der NIBObee nach oben bis Einrasten wird das Bluetooth Modul eingeschalten.&lt;br /&gt;
Daraufhin muss auf eingehenden Bluetooth Traffic gelauscht werden.&lt;br /&gt;
&lt;br /&gt;
==== Blink Codes ====&lt;br /&gt;
Bestimmte Events oder Commands lösen bestimmte Blink- oder Leuchtmuster der Status LEDs aus.&lt;br /&gt;
&#039;&#039;&#039;TODO:&#039;&#039;&#039; Spezifikation der Blink Codes&lt;br /&gt;
&lt;br /&gt;
==== Gerade fahren ====&lt;br /&gt;
Das Problem beim geradeaus fahren ist dass der Roboter von der Spur abweichen kann und dann neu ausgerichtet werden muss. Üblicherweise erfolgt das mit Hilfe der Liniensensoren indem, sobald einer der seitlichen Sensoren die Linie erkennt, durch beschleunigen oder bremsen eines Rades in diese Richtung korrigierend gelenkt wird.&lt;br /&gt;
&lt;br /&gt;
In unserem Fall müssen wir diese Korrektur solange verzögern bis der seitliche Liniensensor eine mögliche Kreuzung passiert hat. Erst danach können wir feststellen ob wir nur die schwarze Linie einer Kreuzung überfahren sind oder ob tatsächlich eine Abweichung vorliegt. Die Anzahl der zu ignorierenden Odometrie-Impule kann folgendermaßen errechnet werden:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;Impulse pro Radumdrehung&amp;gt; / &amp;lt;Radumfang&amp;gt; * &amp;lt;Linienbreite&amp;gt; =&lt;br /&gt;
 20 / 11,8 * 1 = 1,69491525&lt;br /&gt;
&lt;br /&gt;
Wir werden also nur zwei Impulse abwarten bevor wir mit der Korrektur beginnen&lt;br /&gt;
&lt;br /&gt;
===== Funktionsaufteilung =====&lt;br /&gt;
Die Zuständigkeiten für diese Aufgabe sind wie folgt:&lt;br /&gt;
;drive Modul&lt;br /&gt;
:sorgt für die Steuerung der Motoren. Reduzieren der Geschwindigkeit eines Rades um eine ausgleichende Kurve zu fahren und stoppen wenn das Ende der geraden Linie erreicht wurde. Dazu aboniert der Modul die Events des line Modul die eine Abweichung von der Linie melden und vom distance Modul den Event zum fahren der Distanz zwischen Liniensensoren und Achse der Räder.&lt;br /&gt;
;line Modul&lt;br /&gt;
:prüft zyklisch die position der Linie unter dem NIBObee und meldet Abweichungen mittels Events. Dieses Melden wird allerdings verzögert bis zumindest die Breite der Linie überfahren wurde. Dazu aboniert der Modul den Event vom distance Modul den Event zum fahren der der Breite der Linie.&lt;br /&gt;
;distance Modul&lt;br /&gt;
:meldet auf Anforderung das zurücklegen einer Strecke in der Länge der Distanz zwischen Liniensensoren und Achse der Räder oder der Breite der Linie.&lt;br /&gt;
&lt;br /&gt;
==== Kreuzung fahren ====&lt;br /&gt;
An einer Kreuzung wird abgebogen indem der NIBObee zuerst unbeirrt geradeaus fährt bis die Achse genau auf dem Mittelpunkt der Kreuzung zu stehen kommt. Danach wird eine Drehung nach rechts oder links durchgeführt bis sich die Linie wieder genau unter dem mittleren Sensor befindet.&lt;br /&gt;
&lt;br /&gt;
Die Sensoren sind von der Achse 10,4 cm entfernt, eine Radumdrehung bewegt den NIBObee um 11,8 cm weiter und bei dieser Umdrehung werden vom Odometriesensor 20 Impulse abgegeben. Die Linienbreite wird 2 cm betragen. Daher errechnet sich die Strecke die nach Erkennen der Kreuzung gefahren werden muss folgendermassen:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;Impulse pro Radumdrehung&amp;gt; / &amp;lt;Radumfang&amp;gt; * (&amp;lt;Achsabstand&amp;gt; - &amp;lt;halbe Linienbreite&amp;gt;) =&lt;br /&gt;
 20 / 11,8 * (10,4 - 0,5) = 16,779661&lt;br /&gt;
&lt;br /&gt;
Nach passieren der Kreuzung muss der NIBObee also noch 17 Impulse über den Odometriesensor empfangen bevor er stoppt.&lt;br /&gt;
&lt;br /&gt;
== Risikoanalyse ==&lt;br /&gt;
Im Folgenden wird versucht für die möglichen Risikopunkte Alternativen aufzuzeigen.&lt;br /&gt;
&lt;br /&gt;
; ATmega16 ist nicht Leisungsfägig genug&lt;br /&gt;
: Es kann auf den [http://www.nicai-systems.com/de/zubehoer/nibobee-tuning-kit.html Tuning-Kit von Nicai-Systems] zurückgerifffen werden. Dies könnte eine nicht akzeptable Verzögerung verursachen (erkennen, bestellen, NIBObee umrüsten)&lt;br /&gt;
&lt;br /&gt;
: Ein beliebiger PIN-kompatiber Microcontroller ATmega... wird statt dem ATmega16 eingesetzt. Die funktioniert soange der Ersatz-µC mit der Frequenz vom 15 MHz betrieben werden kann. Wichtig ist auch dass es adaptierte Bibliotheken gibt die auf den Ersatz-µC abgestimmt sind (z.B. andere Register oder geänderte Adressen für Register, ...)&lt;br /&gt;
&lt;br /&gt;
; Signale am UART mit Bordspannung im Gegensatz zu RS232-Level (12V)&lt;br /&gt;
: Die Signale am UART werden mit Bordspannung erzeugt/erwartet. Für die Kommunikation mit dem BT-Modul ist daher keine Anpassung durchzuführen.&lt;br /&gt;
&lt;br /&gt;
: Soll zu Testzwecken ein PC über RS232 angeschalten werden ist unbedingt auf die Spannung achten. Möglicherweise verwendet ein USB-RS232 Adapter nicht die 12V sonder nur 5V.&lt;br /&gt;
&lt;br /&gt;
== Open Issues ==&lt;br /&gt;
* Es muss noch überprüft werden ob die NIBObee Hardware ausreichend leistungsfähig ist oder ein Upgrade gemacht werden muss.&lt;br /&gt;
* Wie kann das verlassen der Spur von dem Überfahren einer Kreuzung unterschieden werden? Wenn es hier zu Problemen kommt könnten zwei zusätzliche lichtempfindliche Sensoren rechts und links oder noch ein Element mit drei zusätzlichen Sensoren auf Höhe der Achsen angebracht werden -&amp;gt; Mehraufwand!&lt;br /&gt;
* Soll Aktivierung der BT-Schnittstelle manuell erfolgen?&lt;br /&gt;
* Soll der Betriebsmodus gewählt werden können?&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* [http://www.nicai-systems.de/nibobee.html NIBObee Homepage bei Nicai Systems]&lt;br /&gt;
* [http://download.nicai-systems.com/nibo/Tutorial_NIBObee_20091123.pdf NIBObee - Tutorial zur Programmierung]&lt;br /&gt;
* [http://www.nicai-systems.com/de/zubehoer/nibobee-tuning-kit.html NIBObee - Tuning-Kit von Nicai-Systems]&lt;br /&gt;
* [http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/Der_UART Tutorial zur USART Programmierung]&lt;br /&gt;
[[Kategorie:FH]]&lt;/div&gt;</summary>
		<author><name>Alois</name></author>
	</entry>
	<entry>
		<id>https://wiki.callooh.com/index.php?title=NIBObee&amp;diff=909</id>
		<title>NIBObee</title>
		<link rel="alternate" type="text/html" href="https://wiki.callooh.com/index.php?title=NIBObee&amp;diff=909"/>
		<updated>2011-06-25T07:52:38Z</updated>

		<summary type="html">&lt;p&gt;Alois: /* Kürzesten Weg durch Labyrinth */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;NIBObee ist der Roboter der im Projekt [[RoLoMa]] verwendet wird.&lt;br /&gt;
== Technische Daten ==&lt;br /&gt;
Hier wird nur ein kleiner Ausschnitt der technischen Daten dargestellt. Es handelt sich nur um jenen Teil der für die Bewertung oder Implementierung der gestellten Aufgaben relevant ist:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Art&lt;br /&gt;
!Typ&lt;br /&gt;
!Bemerkung&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|Mikrocontroller&lt;br /&gt;
|ATMEL ATMega16, , 15 MHz&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|Integrierter UART wird verwendet um den Bluetooth Modul anzubinden.&lt;br /&gt;
&lt;br /&gt;
Sollte die Leistung nicht ausreichen kann entweder der Erweiterungssatz von Nicai-Systems verwendet werden oder nur der Controller wird gegen einen Pinkompatiblen Typ ausgetauscht (z.B. ATMega32, ATMega644, ATMega1284)&lt;br /&gt;
|-&lt;br /&gt;
|Flash:	16	kB&lt;br /&gt;
|-&lt;br /&gt;
|RAM:	1	kB&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|Maße&lt;br /&gt;
|Radumfang: 11,8 cm&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|Diese Maße sind wichtig um den NIBObee so exakt wie möglich am Mittelpunkt des Labyrinthfeldes positionieren zu können.&lt;br /&gt;
|-&lt;br /&gt;
|Abstand Liniensensor zu Radachse: 10,4 cm&lt;br /&gt;
|-&lt;br /&gt;
|Impulse pro Umdrehung: 20&lt;br /&gt;
|}&lt;br /&gt;
=== Ports ===&lt;br /&gt;
Über den UART wird der Bluetooth Modul [[BTM-222]] angebunden. Am NIObee ist diese Schnittstelle am Port X5 verfügbar.&lt;br /&gt;
&lt;br /&gt;
Zwei Analoge Eingänge werden für die Fototransistoren der zusätzlichen Linienerkennung verwendet. Diese sind am NIBObee am Port X1 verfügbar.&lt;br /&gt;
&lt;br /&gt;
Ein Ausgang dient zum ein- und ausschalten der zusätzlichen IR-LEDs. Dafür wird der PIN 1 des Port X4 verwendet.&lt;br /&gt;
&lt;br /&gt;
=== Resourcen ===&lt;br /&gt;
Folgende Resourcen werden für unsere Implementierung verwendet (&#039;&#039;kursiv&#039;&#039; markierte Resourcen werden bereits durch die Bibliothek belegt):&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Resource&lt;br /&gt;
!Verwendung&lt;br /&gt;
!Interrupts&lt;br /&gt;
!Dateien&lt;br /&gt;
|-&lt;br /&gt;
|Timer 1&lt;br /&gt;
|Motor PWM&lt;br /&gt;
|TIMER1_COMPA_vect, TIMER1_COMPB_vect&lt;br /&gt;
|motpwm.c&lt;br /&gt;
|-&lt;br /&gt;
|ADC&lt;br /&gt;
|Analog, Line&lt;br /&gt;
|ADC_vect&lt;br /&gt;
|analog.c, line.c&lt;br /&gt;
|-&lt;br /&gt;
|EEPROM&lt;br /&gt;
|Line (12 Byte)&lt;br /&gt;
|&lt;br /&gt;
|line.c&lt;br /&gt;
|-&lt;br /&gt;
|Ext. IRQ&lt;br /&gt;
|Odometrie&lt;br /&gt;
|INT0_vect, INT1_vect&lt;br /&gt;
|odometry.c&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Eine für den NIBObee allgemein gültige Auflistung findet man im [http://www.nibo-roboter.de/wiki/NIBObee/Lib/Resourcen NIBObee Wiki].&lt;br /&gt;
&lt;br /&gt;
=== Besondere Erkenntnisse ===&lt;br /&gt;
&lt;br /&gt;
==== ATMega16 ====&lt;br /&gt;
Die Speichergröße scheint durchaus ausreichend zu sein. Nach Implementierung aller wichtigen Grundfunktionen ist erst weniger als die Hälfte des Programmspeichers belegt.&lt;br /&gt;
&lt;br /&gt;
Problematisch war anfangs nur der geringe RAM der auch alle konstanten Strings enthält. Dies ist zwar nicht notwendig, ist mit dieser Entwicklungsumgebung allerdings so gelöst. Besonders die umfangreichen Debug-Informationen die über Bluetooth an den PC gesendet werden führten dabei zu massiven Problemen. Durch kurze symbolische Debugausgaben, die dann am PC im eigens entwickelten Terminalprogramm auf sprechende symbolische Ausgabe konvertiert wird, konnte das Problem behoben werden.&lt;br /&gt;
&lt;br /&gt;
==== Liniensensoren ====&lt;br /&gt;
Es hat sich, nach einigen Fehlschlägen bei der Linienverfolung, herausgestellt dass es ungünstig ist den NIBObee in eine optisch ansprechende waagrechte Position zu bringen indem eine kleinere Halbkugel auf der Unterseite angebracht wird. Der Grund: Nur mit der original Halbkugel und dem damit nach vorne ansteigenden Bodenabstand sind die IR-LED&#039;s weit genug vom Boden entfernt um einen Lichtkegen zu erzeugen der auch vernünftig vom Phototransistor erfasst werden kann. Bei waagrechter Ausrichtung des NIBObee ist dieser Kegel, aufgrund des geringeren Abstands zum Boden, zu klein!&lt;br /&gt;
&lt;br /&gt;
=== Bibliotheksfunktionen ===&lt;br /&gt;
==== Liniensensoren ====&lt;br /&gt;
Die original NIBObee Biliothek wird nicht verwendet. Sie wurde durch eine eigene Implementierung im [[NIBObee#Line-Modul|Line-Modul]] ersetzt. Der Grund ist die Notwendigkeit die zusätzlichen Liniensensoren in der gleichen Weise wie die drei Originalsensoren zu behandeln.&lt;br /&gt;
&lt;br /&gt;
==== Motorensteuerung ====&lt;br /&gt;
 motpwm.h&lt;br /&gt;
Die Motoren des NIBObee werden mit PWM ([http://de.wikipedia.org/wiki/Pulsweitenmodulation Pulsweitenmodulation]) angesteuert. Das garantiert natürlich ohne Regelung noch keinen Gleichlauf der beiden Motoren was sich je nach Zustand des Getriebes in einer weiteren oder engernen Kurve zeigt.&lt;br /&gt;
 motpid.h&lt;br /&gt;
Hier stehen Funktionen zur Verfügung die mit Hilfe der Odometrie die Motoren regeln. Diese Funktionen sind für unsere Zwecke allerdings nicht geeignet.&lt;br /&gt;
&lt;br /&gt;
== Aufgaben ==&lt;br /&gt;
Folgende Aufgaben sind im Rahmen des Projekts [[RoLoMa]] vom NIBObee Team zu lösen:&lt;br /&gt;
* Herstellung der Bluetooth Hardware-Erweiterung&lt;br /&gt;
* Softwaremodul zum Bedienen der Bluetooth-Schnittstelle via RS232&lt;br /&gt;
* Softwaremodul zum Erkennen der Linie im Labyrinth und im speziellen der unterschiedlichen Kreuzungstypen&lt;br /&gt;
* Messen des zurückgelegten Weges&lt;br /&gt;
* Steuerung, die den Abstand des Sensors zur Radachse berücksichtigt um den Roboter an der korrekten Stelle um die eigene Achse zu drehen&lt;br /&gt;
* Erstellen eines Abbilds des Labyrinths im Speicher und navigieren bis der Roboter wieder am Startpunkt gelandet ist (z.B. immer Links abbiegen)&lt;br /&gt;
* Implementieren des [[MaDeCo]] Protokolls&lt;br /&gt;
&lt;br /&gt;
Nach einigen ersten Tests ist folgende weitere Aufgabe hinzugekommen:&lt;br /&gt;
* Herstellung der Hardware-Erweiterung mit zusätzlichen Liniensensoren&lt;br /&gt;
&lt;br /&gt;
=== Aufgabenteilung ===&lt;br /&gt;
Alle Aufgaben wurden im Team gelöst wobei für manche dieser Aufgaben der Schwerpunkt bei nur einem oder zwei Teammitgliedern lag. Die folgende Tabelle gibt eine ungefähre Zuordnung der Aufgaben auf die einzelnen Personen:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|colspan=&amp;quot;3&amp;quot;|&#039;&#039;&#039;Dokumentation&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|&amp;amp;nbsp; &lt;br /&gt;
|Projektfortschritt, Controlling&lt;br /&gt;
|Robert Peterfi&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Hardware, Software (Wiki)&lt;br /&gt;
|Alois Pochmann, Reinhard Weismann&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Codedokumentation&lt;br /&gt;
|Robert Peterfi, Alois Pochmann, Reinhard Weismann&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|colspan=&amp;quot;3&amp;quot;|&#039;&#039;&#039;Hardware&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|&amp;amp;nbsp; &lt;br /&gt;
|Entwurf, Design&lt;br /&gt;
|Alois Pochmann&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Bestellung, Aufbau&lt;br /&gt;
|Robert Peterfi, Alois Pochmann&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Test&lt;br /&gt;
|Robert Peterfi, Alois Pochmann, Reinhard Weismann&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|colspan=&amp;quot;3&amp;quot;|&#039;&#039;&#039;Software&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;8&amp;quot;|&amp;amp;nbsp; &lt;br /&gt;
|Design, Funktionsaufteilung&lt;br /&gt;
|Robert Peterfi, Alois Pochmann, Reinhard Weismann&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Kommunikationsprotokoll&lt;br /&gt;
|Reinhard Weismann&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Scheduler, Event Handling, zentrale Funktionen&lt;br /&gt;
|Alois Pochmann&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Sensoren (Hardwareanbindung)&lt;br /&gt;
|Robert Peterfi&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Kalibrierung&lt;br /&gt;
|Robert Peterfi&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Odometrie&lt;br /&gt;
|Reinhard Weismann&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Bewegungssteuerung&lt;br /&gt;
|Robert Peterfi, Alois Pochmann, Reinhard Weismann&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Testapplikation (Windows)&lt;br /&gt;
|Alois Pochmann&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
&lt;br /&gt;
=== Bluetooth ===&lt;br /&gt;
Der Bluetooth Modul ist im Detail auf den Seiten des [[BTM-222]] beschrieben.&lt;br /&gt;
&lt;br /&gt;
=== Liniensensoren ===&lt;br /&gt;
Zum Erkennen der Kreuzungen bei gleichzeitigem Folgen der Linie war es notwendig zusätzliche Liniensensoren zu verwenden. Diese wurden mit einer Zusatzplatine in einer Reihe mit den bereits vorhandenen Liniensensoren, allerdings so weit wie möglich linke und rechts außen, montiert. Das Einlesen der Analogwerte erfolgt über die beiden Analogeingänge am Stecker X1. Die IR-LEDs sind, analog zu den bestehenden IR-LEDs der vorhandenen Liniensensoren, über den Ausgang 1 am Stecker X4 schaltbar. Dies ist notwendig da jeweils eine Messung mit eingschalteter LED und eine mit ausgeschalteter LED durchgeführt wird. Damit wird der Einfluß des Umgebungslichts korrigiert.&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
Die Aufgaben der Software sollen in möglichst unabhängigen Modulen realisiert werden um das Testen einfacher zu gestalten. Die einzelnen Module sind im Folgenden beschrieben.&lt;br /&gt;
&lt;br /&gt;
=== Architektur ===&lt;br /&gt;
Das Gesamtsystem besteht aus einem zentralen Taktgeber, einem Scheduler und mehreren State Maschinen. Die Kommunikation erfolgt über Events und, wenn nur eine spezielle Funktionalität eines anderen Moduls verwendet werden soll ohne dessen Zustand zu beeinflussen, über Funktionsaufrufe (z.B. senden einer MaDeCo-Meldung zum reporten eines Wegpunktes direkt vom drive Modul). Die Module können mittels Subscribe einen Event, den ein anderer Modul zur Verfügung steht, abonnieren.&lt;br /&gt;
&lt;br /&gt;
==== Systemtakt, Scheduler ====&lt;br /&gt;
Im Main Modul befindet sich der zentrale Taktgeber der aus dem Interrupt des Timer 1 einen gleichmäßigen Takt von 100Hz erzeugt. Dieser Takt kann von anderen Modulen verwendet werden um zyklische Aufgaben zu erfüllen (z.B. überprüfen des Status der &amp;quot;Fühler&amp;quot;). Im Main Modul befindet sich auch der Scheduler der ganz einfach in der Endlosschleife sequenziell jeden Modul aufruft um anstehende Events zu bearbeiten.&lt;br /&gt;
&lt;br /&gt;
==== State / Event Maschinen ====&lt;br /&gt;
Die State / Event Maschinen sind in allen Modulen gleich aufgebaut. Es gibt die folgenden Funktionen (wobei statt &amp;quot;&amp;lt;xx&amp;gt;&amp;quot; das Kürzel des Moduls steht, z.B &amp;quot;dr&amp;quot; für Drive):&lt;br /&gt;
; eine Funktion mit dem Namen &amp;lt;xx&amp;gt;_main (intern)&lt;br /&gt;
: Das ist die eigentliche State Maschine. Wird direkt vom Scheduler mit dem aktuell zu verarbeitenden Event aufgerufen. Hier gibt es ein switch Statement über den aktuellen Zustand und für jeden Zustand ein switch Statement über den empfangenen Event.&lt;br /&gt;
; eine Funktion mit dem Namen &amp;lt;xx&amp;gt;_init (extern)&lt;br /&gt;
: Hier werden Variableninitialisierungen gemacht und eventuell die ersten subscribe Aufrufe um Events zu abonnieren. Diese Funktion wird beim Systemstart vom Main Modul aufgerufen.&lt;br /&gt;
; optional Funktionen mit den Namen &amp;lt;xx&amp;gt;_subscribe_&amp;lt;event&amp;gt; und &amp;lt;xx&amp;gt;_unsubscribe_&amp;lt;event&amp;gt; (extern)&lt;br /&gt;
: für jeden Event den dieser Modul optional verschicken kann ist sowohl eine Subscribe Funktion als auch ein Unsubscribe Funktion vorhanden. Mit diesen Funktionen kann der Event von einem anderen Modul abboniert werden.&lt;br /&gt;
&lt;br /&gt;
=== Module ===&lt;br /&gt;
Im folgenden sind alle Module und deren Hauptfunktionen aufgelistet.&lt;br /&gt;
&lt;br /&gt;
==== Analog-Modul ====&lt;br /&gt;
Digitalisieren der Analogeingänge&lt;br /&gt;
 Dateien: analog.c&lt;br /&gt;
          analog.h&lt;br /&gt;
Dieser Modul ist abgeleitet von den gleichnamigen Dateien der original NIBObee Bibliothek. Der Austausch war notwendig da wir zusätzliche Liniensensoren verwenden und deren Ansteuerung in gleicher Weise erfolgen sollte. Das bedeutet, dass für die entsprechenden Analogeingänge Messungen mit ein- und ausgeschalteten IR-LEDs durchgeführt werden müssen. Außerdem wurde, entsprechend dem Datenblatt des ATMega16, die Behandlung der Messung der Batteriespannung verbessert. Da hier die Referenzspannung umgeschalten wird muss eine Messung verworfen werden bevor mit einem richtigen Ergebnis gerechnet werden kann. Das wurde in der Originalbibliothek nicht berücksichtigt.&lt;br /&gt;
Die einzelnen Werte werden weiterhin über einen A/D-Wandler ermittelt und zwischengespeichert. Es gibt nun 13 analoge Werte (statt bisher 11) die zyklisch digitalisiert werden. Dieser Vorgang wird mit einer Frequenz von ca 117 kHz durchgeführt, d.h. dass jeder dieser Werte ca. alle 111 µs (statt bisher 94 µs) aktualisiert wird.&lt;br /&gt;
&lt;br /&gt;
==== Line-Modul ====&lt;br /&gt;
Ermitteln der Werte der Liniensensoren&lt;br /&gt;
 Dateien: line.c&lt;br /&gt;
          line.h&lt;br /&gt;
Dieser Modul ersetzt die originalen Bibliotheksfunktionen der Liniensensoren. Dies war notwendig da wir zusätzliche Liniensensoren verwenden.&lt;br /&gt;
&lt;br /&gt;
Die Werte der Liniensensoren können nun mit der Funktion&lt;br /&gt;
&amp;lt;code&amp;gt;ln_get(index)&amp;lt;/code&amp;gt;&lt;br /&gt;
gelesen werden. Die Werte selbst werden über den [[NIBObee#Analog-Modul|Analog-Modul]] ermittelt.&lt;br /&gt;
&lt;br /&gt;
==== Bluetooth-Modul ====&lt;br /&gt;
Wickelt die Kommunikation über den Bluetooth Modul ab. Zur Kommunikation wird allerdings nur der USART als Terminal angesprochen, der Bluetooth Stack ist im [[BTM-222]] implementiert.&lt;br /&gt;
 Dateien: bluetooth.c&lt;br /&gt;
          bluetooth.h&lt;br /&gt;
&lt;br /&gt;
==== Common-Modul ====&lt;br /&gt;
Stellt gemeinsame Funktionen zurVerfügung&lt;br /&gt;
 Dateien: common.c&lt;br /&gt;
          common.h&lt;br /&gt;
&lt;br /&gt;
==== Distance-Modul ====&lt;br /&gt;
Behandelt die Odometrie Sensoren&lt;br /&gt;
 Dateien: distance.c&lt;br /&gt;
          distance.h&lt;br /&gt;
&lt;br /&gt;
==== Drive-Modul ====&lt;br /&gt;
Bewegt den NIBObee&lt;br /&gt;
 Dateien: drive.c&lt;br /&gt;
          drive.h&lt;br /&gt;
&lt;br /&gt;
==== Follow-Modul ====&lt;br /&gt;
Ist für die Linienverfolgung zuständig&lt;br /&gt;
 Dateien: follow.c&lt;br /&gt;
          follow.h&lt;br /&gt;
&lt;br /&gt;
==== MaDeCo-Modul ====&lt;br /&gt;
Behandelt das MaDeCo Protokoll&lt;br /&gt;
 Dateien: madeco.c&lt;br /&gt;
          madeco.h&lt;br /&gt;
&lt;br /&gt;
==== Main-Modul ====&lt;br /&gt;
Scheduler und zentraler Taktgeber&lt;br /&gt;
 Dateien: main.c&lt;br /&gt;
          main.h&lt;br /&gt;
&lt;br /&gt;
==== Sensor-Modul ====&lt;br /&gt;
Ist für die &amp;quot;Fühler&amp;quot; zuständig&lt;br /&gt;
 Dateien: follow.c&lt;br /&gt;
          follow.h&lt;br /&gt;
&lt;br /&gt;
=== Applikationen ===&lt;br /&gt;
==== Labyrinth erkunden ====&lt;br /&gt;
Das ist die Hauptaufgabe des NIBObee. Der Anstoß kommt über einen Befehl vom Board. Ausgewertet wird das vom MaDeCo Modul der auch überprüft ob bereits eine Kalibrierung durchgeführt wurde. Wenn diese Prüfung erfolgreich ist wird der Drive Modul beauftragt das Labyrinth abzufahren. Dort wird nun von einer Kreuzung zur nächsten navigiert und jeder Punkt über den MaDeCo Modul an das Bord gemeldet. Bei jeder Kreuzung wird so weit wie möglich rechts abgebogen bis der NIBObee wieder am Ausgangspunkt angelangt ist.&lt;br /&gt;
&lt;br /&gt;
==== Kürzesten Weg durch Labyrinth ====&lt;br /&gt;
Der MaDeCo Modul erhält vom Board die Richtungsanweisungen für den NIBObee und speichert diese in einem Buffer. Die erste Anweisung wird an den Drive Modul gesendet und der navigiert dann zum nächsten Kreuzungspunkt. Dann wird eine Anfrage an den MaDeCo Modul gesendet um den nächsten Punkt aus dem Buffer zu bekommen. Das passiert solange Daten vorhanden sind und nicht das Ende vom Borad signalisiert wurde.&lt;br /&gt;
&lt;br /&gt;
==== Kalibrierung ====&lt;br /&gt;
Zur Kalibrierung fährt der NIBObee ein Viereck entlang dass genau die Seitenlänge eines der Felder des Labyrinths hat. Dies ist notwendig um relativ einfach die Karte des Labyrinths erstellen zu können.&lt;br /&gt;
&lt;br /&gt;
=== Protokolle und deren Implementierung ===&lt;br /&gt;
==== [[MaDeCo]] ====&lt;br /&gt;
===== Interface Definition =====&lt;br /&gt;
* int set_opmode(OPMODE)&lt;br /&gt;
* int send_waypoint(WAYPOINT)&lt;br /&gt;
* int direct(DIRECTION[])&lt;br /&gt;
* int ack()&lt;br /&gt;
&lt;br /&gt;
==== Schnittstelle [[MaDeCo]] - RS232-Schnittstelle ====&lt;br /&gt;
* pairing&lt;br /&gt;
* Konfigurations-Commands&lt;br /&gt;
* ack&lt;br /&gt;
* read_command&lt;br /&gt;
* send_command&lt;br /&gt;
&lt;br /&gt;
=== Steuerungssoftware ===&lt;br /&gt;
==== Bluetooth Modul einschalten ====&lt;br /&gt;
Durch Bewegen der &amp;quot;Fühler&amp;quot; der NIBObee nach oben bis Einrasten wird das Bluetooth Modul eingeschalten.&lt;br /&gt;
Daraufhin muss auf eingehenden Bluetooth Traffic gelauscht werden.&lt;br /&gt;
&lt;br /&gt;
==== Blink Codes ====&lt;br /&gt;
Bestimmte Events oder Commands lösen bestimmte Blink- oder Leuchtmuster der Status LEDs aus.&lt;br /&gt;
&#039;&#039;&#039;TODO:&#039;&#039;&#039; Spezifikation der Blink Codes&lt;br /&gt;
&lt;br /&gt;
==== Gerade fahren ====&lt;br /&gt;
Das Problem beim geradeaus fahren ist dass der Roboter von der Spur abweichen kann und dann neu ausgerichtet werden muss. Üblicherweise erfolgt das mit Hilfe der Liniensensoren indem, sobald einer der seitlichen Sensoren die Linie erkennt, durch beschleunigen oder bremsen eines Rades in diese Richtung korrigierend gelenkt wird.&lt;br /&gt;
&lt;br /&gt;
In unserem Fall müssen wir diese Korrektur solange verzögern bis der seitliche Liniensensor eine mögliche Kreuzung passiert hat. Erst danach können wir feststellen ob wir nur die schwarze Linie einer Kreuzung überfahren sind oder ob tatsächlich eine Abweichung vorliegt. Die Anzahl der zu ignorierenden Odometrie-Impule kann folgendermaßen errechnet werden:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;Impulse pro Radumdrehung&amp;gt; / &amp;lt;Radumfang&amp;gt; * &amp;lt;Linienbreite&amp;gt; =&lt;br /&gt;
 20 / 11,8 * 1 = 1,69491525&lt;br /&gt;
&lt;br /&gt;
Wir werden also nur zwei Impulse abwarten bevor wir mit der Korrektur beginnen&lt;br /&gt;
&lt;br /&gt;
===== Funktionsaufteilung =====&lt;br /&gt;
Die Zuständigkeiten für diese Aufgabe sind wie folgt:&lt;br /&gt;
;drive Modul&lt;br /&gt;
:sorgt für die Steuerung der Motoren. Reduzieren der Geschwindigkeit eines Rades um eine ausgleichende Kurve zu fahren und stoppen wenn das Ende der geraden Linie erreicht wurde. Dazu aboniert der Modul die Events des line Modul die eine Abweichung von der Linie melden und vom distance Modul den Event zum fahren der Distanz zwischen Liniensensoren und Achse der Räder.&lt;br /&gt;
;line Modul&lt;br /&gt;
:prüft zyklisch die position der Linie unter dem NIBObee und meldet Abweichungen mittels Events. Dieses Melden wird allerdings verzögert bis zumindest die Breite der Linie überfahren wurde. Dazu aboniert der Modul den Event vom distance Modul den Event zum fahren der der Breite der Linie.&lt;br /&gt;
;distance Modul&lt;br /&gt;
:meldet auf Anforderung das zurücklegen einer Strecke in der Länge der Distanz zwischen Liniensensoren und Achse der Räder oder der Breite der Linie.&lt;br /&gt;
&lt;br /&gt;
==== Kreuzung fahren ====&lt;br /&gt;
An einer Kreuzung wird abgebogen indem der NIBObee zuerst unbeirrt geradeaus fährt bis die Achse genau auf dem Mittelpunkt der Kreuzung zu stehen kommt. Danach wird eine Drehung nach rechts oder links durchgeführt bis sich die Linie wieder genau unter dem mittleren Sensor befindet.&lt;br /&gt;
&lt;br /&gt;
Die Sensoren sind von der Achse 10,4 cm entfernt, eine Radumdrehung bewegt den NIBObee um 11,8 cm weiter und bei dieser Umdrehung werden vom Odometriesensor 20 Impulse abgegeben. Die Linienbreite wird 2 cm betragen. Daher errechnet sich die Strecke die nach Erkennen der Kreuzung gefahren werden muss folgendermassen:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;Impulse pro Radumdrehung&amp;gt; / &amp;lt;Radumfang&amp;gt; * (&amp;lt;Achsabstand&amp;gt; - &amp;lt;halbe Linienbreite&amp;gt;) =&lt;br /&gt;
 20 / 11,8 * (10,4 - 0,5) = 16,779661&lt;br /&gt;
&lt;br /&gt;
Nach passieren der Kreuzung muss der NIBObee also noch 17 Impulse über den Odometriesensor empfangen bevor er stoppt.&lt;br /&gt;
&lt;br /&gt;
== Risikoanalyse ==&lt;br /&gt;
Im Folgenden wird versucht für die möglichen Risikopunkte Alternativen aufzuzeigen.&lt;br /&gt;
&lt;br /&gt;
; ATmega16 ist nicht Leisungsfägig genug&lt;br /&gt;
: Es kann auf den [http://www.nicai-systems.com/de/zubehoer/nibobee-tuning-kit.html Tuning-Kit von Nicai-Systems] zurückgerifffen werden. Dies könnte eine nicht akzeptable Verzögerung verursachen (erkennen, bestellen, NIBObee umrüsten)&lt;br /&gt;
&lt;br /&gt;
: Ein beliebiger PIN-kompatiber Microcontroller ATmega... wird statt dem ATmega16 eingesetzt. Die funktioniert soange der Ersatz-µC mit der Frequenz vom 15 MHz betrieben werden kann. Wichtig ist auch dass es adaptierte Bibliotheken gibt die auf den Ersatz-µC abgestimmt sind (z.B. andere Register oder geänderte Adressen für Register, ...)&lt;br /&gt;
&lt;br /&gt;
; Signale am UART mit Bordspannung im Gegensatz zu RS232-Level (12V)&lt;br /&gt;
: Die Signale am UART werden mit Bordspannung erzeugt/erwartet. Für die Kommunikation mit dem BT-Modul ist daher keine Anpassung durchzuführen.&lt;br /&gt;
&lt;br /&gt;
: Soll zu Testzwecken ein PC über RS232 angeschalten werden ist unbedingt auf die Spannung achten. Möglicherweise verwendet ein USB-RS232 Adapter nicht die 12V sonder nur 5V.&lt;br /&gt;
&lt;br /&gt;
== Open Issues ==&lt;br /&gt;
* Es muss noch überprüft werden ob die NIBObee Hardware ausreichend leistungsfähig ist oder ein Upgrade gemacht werden muss.&lt;br /&gt;
* Wie kann das verlassen der Spur von dem Überfahren einer Kreuzung unterschieden werden? Wenn es hier zu Problemen kommt könnten zwei zusätzliche lichtempfindliche Sensoren rechts und links oder noch ein Element mit drei zusätzlichen Sensoren auf Höhe der Achsen angebracht werden -&amp;gt; Mehraufwand!&lt;br /&gt;
* Soll Aktivierung der BT-Schnittstelle manuell erfolgen?&lt;br /&gt;
* Soll der Betriebsmodus gewählt werden können?&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* [http://www.nicai-systems.de/nibobee.html NIBObee Homepage bei Nicai Systems]&lt;br /&gt;
* [http://download.nicai-systems.com/nibo/Tutorial_NIBObee_20091123.pdf NIBObee - Tutorial zur Programmierung]&lt;br /&gt;
* [http://www.nicai-systems.com/de/zubehoer/nibobee-tuning-kit.html NIBObee - Tuning-Kit von Nicai-Systems]&lt;br /&gt;
* [http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/Der_UART Tutorial zur USART Programmierung]&lt;br /&gt;
[[Kategorie:FH]]&lt;/div&gt;</summary>
		<author><name>Alois</name></author>
	</entry>
	<entry>
		<id>https://wiki.callooh.com/index.php?title=NIBObee&amp;diff=908</id>
		<title>NIBObee</title>
		<link rel="alternate" type="text/html" href="https://wiki.callooh.com/index.php?title=NIBObee&amp;diff=908"/>
		<updated>2011-06-25T07:49:44Z</updated>

		<summary type="html">&lt;p&gt;Alois: /* Labyrinth erkunden */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;NIBObee ist der Roboter der im Projekt [[RoLoMa]] verwendet wird.&lt;br /&gt;
== Technische Daten ==&lt;br /&gt;
Hier wird nur ein kleiner Ausschnitt der technischen Daten dargestellt. Es handelt sich nur um jenen Teil der für die Bewertung oder Implementierung der gestellten Aufgaben relevant ist:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Art&lt;br /&gt;
!Typ&lt;br /&gt;
!Bemerkung&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|Mikrocontroller&lt;br /&gt;
|ATMEL ATMega16, , 15 MHz&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|Integrierter UART wird verwendet um den Bluetooth Modul anzubinden.&lt;br /&gt;
&lt;br /&gt;
Sollte die Leistung nicht ausreichen kann entweder der Erweiterungssatz von Nicai-Systems verwendet werden oder nur der Controller wird gegen einen Pinkompatiblen Typ ausgetauscht (z.B. ATMega32, ATMega644, ATMega1284)&lt;br /&gt;
|-&lt;br /&gt;
|Flash:	16	kB&lt;br /&gt;
|-&lt;br /&gt;
|RAM:	1	kB&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|Maße&lt;br /&gt;
|Radumfang: 11,8 cm&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|Diese Maße sind wichtig um den NIBObee so exakt wie möglich am Mittelpunkt des Labyrinthfeldes positionieren zu können.&lt;br /&gt;
|-&lt;br /&gt;
|Abstand Liniensensor zu Radachse: 10,4 cm&lt;br /&gt;
|-&lt;br /&gt;
|Impulse pro Umdrehung: 20&lt;br /&gt;
|}&lt;br /&gt;
=== Ports ===&lt;br /&gt;
Über den UART wird der Bluetooth Modul [[BTM-222]] angebunden. Am NIObee ist diese Schnittstelle am Port X5 verfügbar.&lt;br /&gt;
&lt;br /&gt;
Zwei Analoge Eingänge werden für die Fototransistoren der zusätzlichen Linienerkennung verwendet. Diese sind am NIBObee am Port X1 verfügbar.&lt;br /&gt;
&lt;br /&gt;
Ein Ausgang dient zum ein- und ausschalten der zusätzlichen IR-LEDs. Dafür wird der PIN 1 des Port X4 verwendet.&lt;br /&gt;
&lt;br /&gt;
=== Resourcen ===&lt;br /&gt;
Folgende Resourcen werden für unsere Implementierung verwendet (&#039;&#039;kursiv&#039;&#039; markierte Resourcen werden bereits durch die Bibliothek belegt):&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Resource&lt;br /&gt;
!Verwendung&lt;br /&gt;
!Interrupts&lt;br /&gt;
!Dateien&lt;br /&gt;
|-&lt;br /&gt;
|Timer 1&lt;br /&gt;
|Motor PWM&lt;br /&gt;
|TIMER1_COMPA_vect, TIMER1_COMPB_vect&lt;br /&gt;
|motpwm.c&lt;br /&gt;
|-&lt;br /&gt;
|ADC&lt;br /&gt;
|Analog, Line&lt;br /&gt;
|ADC_vect&lt;br /&gt;
|analog.c, line.c&lt;br /&gt;
|-&lt;br /&gt;
|EEPROM&lt;br /&gt;
|Line (12 Byte)&lt;br /&gt;
|&lt;br /&gt;
|line.c&lt;br /&gt;
|-&lt;br /&gt;
|Ext. IRQ&lt;br /&gt;
|Odometrie&lt;br /&gt;
|INT0_vect, INT1_vect&lt;br /&gt;
|odometry.c&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Eine für den NIBObee allgemein gültige Auflistung findet man im [http://www.nibo-roboter.de/wiki/NIBObee/Lib/Resourcen NIBObee Wiki].&lt;br /&gt;
&lt;br /&gt;
=== Besondere Erkenntnisse ===&lt;br /&gt;
&lt;br /&gt;
==== ATMega16 ====&lt;br /&gt;
Die Speichergröße scheint durchaus ausreichend zu sein. Nach Implementierung aller wichtigen Grundfunktionen ist erst weniger als die Hälfte des Programmspeichers belegt.&lt;br /&gt;
&lt;br /&gt;
Problematisch war anfangs nur der geringe RAM der auch alle konstanten Strings enthält. Dies ist zwar nicht notwendig, ist mit dieser Entwicklungsumgebung allerdings so gelöst. Besonders die umfangreichen Debug-Informationen die über Bluetooth an den PC gesendet werden führten dabei zu massiven Problemen. Durch kurze symbolische Debugausgaben, die dann am PC im eigens entwickelten Terminalprogramm auf sprechende symbolische Ausgabe konvertiert wird, konnte das Problem behoben werden.&lt;br /&gt;
&lt;br /&gt;
==== Liniensensoren ====&lt;br /&gt;
Es hat sich, nach einigen Fehlschlägen bei der Linienverfolung, herausgestellt dass es ungünstig ist den NIBObee in eine optisch ansprechende waagrechte Position zu bringen indem eine kleinere Halbkugel auf der Unterseite angebracht wird. Der Grund: Nur mit der original Halbkugel und dem damit nach vorne ansteigenden Bodenabstand sind die IR-LED&#039;s weit genug vom Boden entfernt um einen Lichtkegen zu erzeugen der auch vernünftig vom Phototransistor erfasst werden kann. Bei waagrechter Ausrichtung des NIBObee ist dieser Kegel, aufgrund des geringeren Abstands zum Boden, zu klein!&lt;br /&gt;
&lt;br /&gt;
=== Bibliotheksfunktionen ===&lt;br /&gt;
==== Liniensensoren ====&lt;br /&gt;
Die original NIBObee Biliothek wird nicht verwendet. Sie wurde durch eine eigene Implementierung im [[NIBObee#Line-Modul|Line-Modul]] ersetzt. Der Grund ist die Notwendigkeit die zusätzlichen Liniensensoren in der gleichen Weise wie die drei Originalsensoren zu behandeln.&lt;br /&gt;
&lt;br /&gt;
==== Motorensteuerung ====&lt;br /&gt;
 motpwm.h&lt;br /&gt;
Die Motoren des NIBObee werden mit PWM ([http://de.wikipedia.org/wiki/Pulsweitenmodulation Pulsweitenmodulation]) angesteuert. Das garantiert natürlich ohne Regelung noch keinen Gleichlauf der beiden Motoren was sich je nach Zustand des Getriebes in einer weiteren oder engernen Kurve zeigt.&lt;br /&gt;
 motpid.h&lt;br /&gt;
Hier stehen Funktionen zur Verfügung die mit Hilfe der Odometrie die Motoren regeln. Diese Funktionen sind für unsere Zwecke allerdings nicht geeignet.&lt;br /&gt;
&lt;br /&gt;
== Aufgaben ==&lt;br /&gt;
Folgende Aufgaben sind im Rahmen des Projekts [[RoLoMa]] vom NIBObee Team zu lösen:&lt;br /&gt;
* Herstellung der Bluetooth Hardware-Erweiterung&lt;br /&gt;
* Softwaremodul zum Bedienen der Bluetooth-Schnittstelle via RS232&lt;br /&gt;
* Softwaremodul zum Erkennen der Linie im Labyrinth und im speziellen der unterschiedlichen Kreuzungstypen&lt;br /&gt;
* Messen des zurückgelegten Weges&lt;br /&gt;
* Steuerung, die den Abstand des Sensors zur Radachse berücksichtigt um den Roboter an der korrekten Stelle um die eigene Achse zu drehen&lt;br /&gt;
* Erstellen eines Abbilds des Labyrinths im Speicher und navigieren bis der Roboter wieder am Startpunkt gelandet ist (z.B. immer Links abbiegen)&lt;br /&gt;
* Implementieren des [[MaDeCo]] Protokolls&lt;br /&gt;
&lt;br /&gt;
Nach einigen ersten Tests ist folgende weitere Aufgabe hinzugekommen:&lt;br /&gt;
* Herstellung der Hardware-Erweiterung mit zusätzlichen Liniensensoren&lt;br /&gt;
&lt;br /&gt;
=== Aufgabenteilung ===&lt;br /&gt;
Alle Aufgaben wurden im Team gelöst wobei für manche dieser Aufgaben der Schwerpunkt bei nur einem oder zwei Teammitgliedern lag. Die folgende Tabelle gibt eine ungefähre Zuordnung der Aufgaben auf die einzelnen Personen:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|colspan=&amp;quot;3&amp;quot;|&#039;&#039;&#039;Dokumentation&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|&amp;amp;nbsp; &lt;br /&gt;
|Projektfortschritt, Controlling&lt;br /&gt;
|Robert Peterfi&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Hardware, Software (Wiki)&lt;br /&gt;
|Alois Pochmann, Reinhard Weismann&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Codedokumentation&lt;br /&gt;
|Robert Peterfi, Alois Pochmann, Reinhard Weismann&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|colspan=&amp;quot;3&amp;quot;|&#039;&#039;&#039;Hardware&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|&amp;amp;nbsp; &lt;br /&gt;
|Entwurf, Design&lt;br /&gt;
|Alois Pochmann&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Bestellung, Aufbau&lt;br /&gt;
|Robert Peterfi, Alois Pochmann&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Test&lt;br /&gt;
|Robert Peterfi, Alois Pochmann, Reinhard Weismann&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|colspan=&amp;quot;3&amp;quot;|&#039;&#039;&#039;Software&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;8&amp;quot;|&amp;amp;nbsp; &lt;br /&gt;
|Design, Funktionsaufteilung&lt;br /&gt;
|Robert Peterfi, Alois Pochmann, Reinhard Weismann&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Kommunikationsprotokoll&lt;br /&gt;
|Reinhard Weismann&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Scheduler, Event Handling, zentrale Funktionen&lt;br /&gt;
|Alois Pochmann&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Sensoren (Hardwareanbindung)&lt;br /&gt;
|Robert Peterfi&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Kalibrierung&lt;br /&gt;
|Robert Peterfi&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Odometrie&lt;br /&gt;
|Reinhard Weismann&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Bewegungssteuerung&lt;br /&gt;
|Robert Peterfi, Alois Pochmann, Reinhard Weismann&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Testapplikation (Windows)&lt;br /&gt;
|Alois Pochmann&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
&lt;br /&gt;
=== Bluetooth ===&lt;br /&gt;
Der Bluetooth Modul ist im Detail auf den Seiten des [[BTM-222]] beschrieben.&lt;br /&gt;
&lt;br /&gt;
=== Liniensensoren ===&lt;br /&gt;
Zum Erkennen der Kreuzungen bei gleichzeitigem Folgen der Linie war es notwendig zusätzliche Liniensensoren zu verwenden. Diese wurden mit einer Zusatzplatine in einer Reihe mit den bereits vorhandenen Liniensensoren, allerdings so weit wie möglich linke und rechts außen, montiert. Das Einlesen der Analogwerte erfolgt über die beiden Analogeingänge am Stecker X1. Die IR-LEDs sind, analog zu den bestehenden IR-LEDs der vorhandenen Liniensensoren, über den Ausgang 1 am Stecker X4 schaltbar. Dies ist notwendig da jeweils eine Messung mit eingschalteter LED und eine mit ausgeschalteter LED durchgeführt wird. Damit wird der Einfluß des Umgebungslichts korrigiert.&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
Die Aufgaben der Software sollen in möglichst unabhängigen Modulen realisiert werden um das Testen einfacher zu gestalten. Die einzelnen Module sind im Folgenden beschrieben.&lt;br /&gt;
&lt;br /&gt;
=== Architektur ===&lt;br /&gt;
Das Gesamtsystem besteht aus einem zentralen Taktgeber, einem Scheduler und mehreren State Maschinen. Die Kommunikation erfolgt über Events und, wenn nur eine spezielle Funktionalität eines anderen Moduls verwendet werden soll ohne dessen Zustand zu beeinflussen, über Funktionsaufrufe (z.B. senden einer MaDeCo-Meldung zum reporten eines Wegpunktes direkt vom drive Modul). Die Module können mittels Subscribe einen Event, den ein anderer Modul zur Verfügung steht, abonnieren.&lt;br /&gt;
&lt;br /&gt;
==== Systemtakt, Scheduler ====&lt;br /&gt;
Im Main Modul befindet sich der zentrale Taktgeber der aus dem Interrupt des Timer 1 einen gleichmäßigen Takt von 100Hz erzeugt. Dieser Takt kann von anderen Modulen verwendet werden um zyklische Aufgaben zu erfüllen (z.B. überprüfen des Status der &amp;quot;Fühler&amp;quot;). Im Main Modul befindet sich auch der Scheduler der ganz einfach in der Endlosschleife sequenziell jeden Modul aufruft um anstehende Events zu bearbeiten.&lt;br /&gt;
&lt;br /&gt;
==== State / Event Maschinen ====&lt;br /&gt;
Die State / Event Maschinen sind in allen Modulen gleich aufgebaut. Es gibt die folgenden Funktionen (wobei statt &amp;quot;&amp;lt;xx&amp;gt;&amp;quot; das Kürzel des Moduls steht, z.B &amp;quot;dr&amp;quot; für Drive):&lt;br /&gt;
; eine Funktion mit dem Namen &amp;lt;xx&amp;gt;_main (intern)&lt;br /&gt;
: Das ist die eigentliche State Maschine. Wird direkt vom Scheduler mit dem aktuell zu verarbeitenden Event aufgerufen. Hier gibt es ein switch Statement über den aktuellen Zustand und für jeden Zustand ein switch Statement über den empfangenen Event.&lt;br /&gt;
; eine Funktion mit dem Namen &amp;lt;xx&amp;gt;_init (extern)&lt;br /&gt;
: Hier werden Variableninitialisierungen gemacht und eventuell die ersten subscribe Aufrufe um Events zu abonnieren. Diese Funktion wird beim Systemstart vom Main Modul aufgerufen.&lt;br /&gt;
; optional Funktionen mit den Namen &amp;lt;xx&amp;gt;_subscribe_&amp;lt;event&amp;gt; und &amp;lt;xx&amp;gt;_unsubscribe_&amp;lt;event&amp;gt; (extern)&lt;br /&gt;
: für jeden Event den dieser Modul optional verschicken kann ist sowohl eine Subscribe Funktion als auch ein Unsubscribe Funktion vorhanden. Mit diesen Funktionen kann der Event von einem anderen Modul abboniert werden.&lt;br /&gt;
&lt;br /&gt;
=== Module ===&lt;br /&gt;
Im folgenden sind alle Module und deren Hauptfunktionen aufgelistet.&lt;br /&gt;
&lt;br /&gt;
==== Analog-Modul ====&lt;br /&gt;
Digitalisieren der Analogeingänge&lt;br /&gt;
 Dateien: analog.c&lt;br /&gt;
          analog.h&lt;br /&gt;
Dieser Modul ist abgeleitet von den gleichnamigen Dateien der original NIBObee Bibliothek. Der Austausch war notwendig da wir zusätzliche Liniensensoren verwenden und deren Ansteuerung in gleicher Weise erfolgen sollte. Das bedeutet, dass für die entsprechenden Analogeingänge Messungen mit ein- und ausgeschalteten IR-LEDs durchgeführt werden müssen. Außerdem wurde, entsprechend dem Datenblatt des ATMega16, die Behandlung der Messung der Batteriespannung verbessert. Da hier die Referenzspannung umgeschalten wird muss eine Messung verworfen werden bevor mit einem richtigen Ergebnis gerechnet werden kann. Das wurde in der Originalbibliothek nicht berücksichtigt.&lt;br /&gt;
Die einzelnen Werte werden weiterhin über einen A/D-Wandler ermittelt und zwischengespeichert. Es gibt nun 13 analoge Werte (statt bisher 11) die zyklisch digitalisiert werden. Dieser Vorgang wird mit einer Frequenz von ca 117 kHz durchgeführt, d.h. dass jeder dieser Werte ca. alle 111 µs (statt bisher 94 µs) aktualisiert wird.&lt;br /&gt;
&lt;br /&gt;
==== Line-Modul ====&lt;br /&gt;
Ermitteln der Werte der Liniensensoren&lt;br /&gt;
 Dateien: line.c&lt;br /&gt;
          line.h&lt;br /&gt;
Dieser Modul ersetzt die originalen Bibliotheksfunktionen der Liniensensoren. Dies war notwendig da wir zusätzliche Liniensensoren verwenden.&lt;br /&gt;
&lt;br /&gt;
Die Werte der Liniensensoren können nun mit der Funktion&lt;br /&gt;
&amp;lt;code&amp;gt;ln_get(index)&amp;lt;/code&amp;gt;&lt;br /&gt;
gelesen werden. Die Werte selbst werden über den [[NIBObee#Analog-Modul|Analog-Modul]] ermittelt.&lt;br /&gt;
&lt;br /&gt;
==== Bluetooth-Modul ====&lt;br /&gt;
Wickelt die Kommunikation über den Bluetooth Modul ab. Zur Kommunikation wird allerdings nur der USART als Terminal angesprochen, der Bluetooth Stack ist im [[BTM-222]] implementiert.&lt;br /&gt;
 Dateien: bluetooth.c&lt;br /&gt;
          bluetooth.h&lt;br /&gt;
&lt;br /&gt;
==== Common-Modul ====&lt;br /&gt;
Stellt gemeinsame Funktionen zurVerfügung&lt;br /&gt;
 Dateien: common.c&lt;br /&gt;
          common.h&lt;br /&gt;
&lt;br /&gt;
==== Distance-Modul ====&lt;br /&gt;
Behandelt die Odometrie Sensoren&lt;br /&gt;
 Dateien: distance.c&lt;br /&gt;
          distance.h&lt;br /&gt;
&lt;br /&gt;
==== Drive-Modul ====&lt;br /&gt;
Bewegt den NIBObee&lt;br /&gt;
 Dateien: drive.c&lt;br /&gt;
          drive.h&lt;br /&gt;
&lt;br /&gt;
==== Follow-Modul ====&lt;br /&gt;
Ist für die Linienverfolgung zuständig&lt;br /&gt;
 Dateien: follow.c&lt;br /&gt;
          follow.h&lt;br /&gt;
&lt;br /&gt;
==== MaDeCo-Modul ====&lt;br /&gt;
Behandelt das MaDeCo Protokoll&lt;br /&gt;
 Dateien: madeco.c&lt;br /&gt;
          madeco.h&lt;br /&gt;
&lt;br /&gt;
==== Main-Modul ====&lt;br /&gt;
Scheduler und zentraler Taktgeber&lt;br /&gt;
 Dateien: main.c&lt;br /&gt;
          main.h&lt;br /&gt;
&lt;br /&gt;
==== Sensor-Modul ====&lt;br /&gt;
Ist für die &amp;quot;Fühler&amp;quot; zuständig&lt;br /&gt;
 Dateien: follow.c&lt;br /&gt;
          follow.h&lt;br /&gt;
&lt;br /&gt;
=== Applikationen ===&lt;br /&gt;
==== Labyrinth erkunden ====&lt;br /&gt;
Das ist die Hauptaufgabe des NIBObee. Der Anstoß kommt über einen Befehl vom Board. Ausgewertet wird das vom MaDeCo Modul der auch überprüft ob bereits eine Kalibrierung durchgeführt wurde. Wenn diese Prüfung erfolgreich ist wird der Drive Modul beauftragt das Labyrinth abzufahren. Dort wird nun von einer Kreuzung zur nächsten navigiert und jeder Punkt über den MaDeCo Modul an das Bord gemeldet. Bei jeder Kreuzung wird so weit wie möglich rechts abgebogen bis der NIBObee wieder am Ausgangspunkt angelangt ist.&lt;br /&gt;
&lt;br /&gt;
==== Kürzesten Weg durch Labyrinth ====&lt;br /&gt;
&lt;br /&gt;
==== Kalibrierung ====&lt;br /&gt;
Zur Kalibrierung fährt der NIBObee ein Viereck entlang dass genau die Seitenlänge eines der Felder des Labyrinths hat. Dies ist notwendig um relativ einfach die Karte des Labyrinths erstellen zu können.&lt;br /&gt;
&lt;br /&gt;
=== Protokolle und deren Implementierung ===&lt;br /&gt;
==== [[MaDeCo]] ====&lt;br /&gt;
===== Interface Definition =====&lt;br /&gt;
* int set_opmode(OPMODE)&lt;br /&gt;
* int send_waypoint(WAYPOINT)&lt;br /&gt;
* int direct(DIRECTION[])&lt;br /&gt;
* int ack()&lt;br /&gt;
&lt;br /&gt;
==== Schnittstelle [[MaDeCo]] - RS232-Schnittstelle ====&lt;br /&gt;
* pairing&lt;br /&gt;
* Konfigurations-Commands&lt;br /&gt;
* ack&lt;br /&gt;
* read_command&lt;br /&gt;
* send_command&lt;br /&gt;
&lt;br /&gt;
=== Steuerungssoftware ===&lt;br /&gt;
==== Bluetooth Modul einschalten ====&lt;br /&gt;
Durch Bewegen der &amp;quot;Fühler&amp;quot; der NIBObee nach oben bis Einrasten wird das Bluetooth Modul eingeschalten.&lt;br /&gt;
Daraufhin muss auf eingehenden Bluetooth Traffic gelauscht werden.&lt;br /&gt;
&lt;br /&gt;
==== Blink Codes ====&lt;br /&gt;
Bestimmte Events oder Commands lösen bestimmte Blink- oder Leuchtmuster der Status LEDs aus.&lt;br /&gt;
&#039;&#039;&#039;TODO:&#039;&#039;&#039; Spezifikation der Blink Codes&lt;br /&gt;
&lt;br /&gt;
==== Gerade fahren ====&lt;br /&gt;
Das Problem beim geradeaus fahren ist dass der Roboter von der Spur abweichen kann und dann neu ausgerichtet werden muss. Üblicherweise erfolgt das mit Hilfe der Liniensensoren indem, sobald einer der seitlichen Sensoren die Linie erkennt, durch beschleunigen oder bremsen eines Rades in diese Richtung korrigierend gelenkt wird.&lt;br /&gt;
&lt;br /&gt;
In unserem Fall müssen wir diese Korrektur solange verzögern bis der seitliche Liniensensor eine mögliche Kreuzung passiert hat. Erst danach können wir feststellen ob wir nur die schwarze Linie einer Kreuzung überfahren sind oder ob tatsächlich eine Abweichung vorliegt. Die Anzahl der zu ignorierenden Odometrie-Impule kann folgendermaßen errechnet werden:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;Impulse pro Radumdrehung&amp;gt; / &amp;lt;Radumfang&amp;gt; * &amp;lt;Linienbreite&amp;gt; =&lt;br /&gt;
 20 / 11,8 * 1 = 1,69491525&lt;br /&gt;
&lt;br /&gt;
Wir werden also nur zwei Impulse abwarten bevor wir mit der Korrektur beginnen&lt;br /&gt;
&lt;br /&gt;
===== Funktionsaufteilung =====&lt;br /&gt;
Die Zuständigkeiten für diese Aufgabe sind wie folgt:&lt;br /&gt;
;drive Modul&lt;br /&gt;
:sorgt für die Steuerung der Motoren. Reduzieren der Geschwindigkeit eines Rades um eine ausgleichende Kurve zu fahren und stoppen wenn das Ende der geraden Linie erreicht wurde. Dazu aboniert der Modul die Events des line Modul die eine Abweichung von der Linie melden und vom distance Modul den Event zum fahren der Distanz zwischen Liniensensoren und Achse der Räder.&lt;br /&gt;
;line Modul&lt;br /&gt;
:prüft zyklisch die position der Linie unter dem NIBObee und meldet Abweichungen mittels Events. Dieses Melden wird allerdings verzögert bis zumindest die Breite der Linie überfahren wurde. Dazu aboniert der Modul den Event vom distance Modul den Event zum fahren der der Breite der Linie.&lt;br /&gt;
;distance Modul&lt;br /&gt;
:meldet auf Anforderung das zurücklegen einer Strecke in der Länge der Distanz zwischen Liniensensoren und Achse der Räder oder der Breite der Linie.&lt;br /&gt;
&lt;br /&gt;
==== Kreuzung fahren ====&lt;br /&gt;
An einer Kreuzung wird abgebogen indem der NIBObee zuerst unbeirrt geradeaus fährt bis die Achse genau auf dem Mittelpunkt der Kreuzung zu stehen kommt. Danach wird eine Drehung nach rechts oder links durchgeführt bis sich die Linie wieder genau unter dem mittleren Sensor befindet.&lt;br /&gt;
&lt;br /&gt;
Die Sensoren sind von der Achse 10,4 cm entfernt, eine Radumdrehung bewegt den NIBObee um 11,8 cm weiter und bei dieser Umdrehung werden vom Odometriesensor 20 Impulse abgegeben. Die Linienbreite wird 2 cm betragen. Daher errechnet sich die Strecke die nach Erkennen der Kreuzung gefahren werden muss folgendermassen:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;Impulse pro Radumdrehung&amp;gt; / &amp;lt;Radumfang&amp;gt; * (&amp;lt;Achsabstand&amp;gt; - &amp;lt;halbe Linienbreite&amp;gt;) =&lt;br /&gt;
 20 / 11,8 * (10,4 - 0,5) = 16,779661&lt;br /&gt;
&lt;br /&gt;
Nach passieren der Kreuzung muss der NIBObee also noch 17 Impulse über den Odometriesensor empfangen bevor er stoppt.&lt;br /&gt;
&lt;br /&gt;
== Risikoanalyse ==&lt;br /&gt;
Im Folgenden wird versucht für die möglichen Risikopunkte Alternativen aufzuzeigen.&lt;br /&gt;
&lt;br /&gt;
; ATmega16 ist nicht Leisungsfägig genug&lt;br /&gt;
: Es kann auf den [http://www.nicai-systems.com/de/zubehoer/nibobee-tuning-kit.html Tuning-Kit von Nicai-Systems] zurückgerifffen werden. Dies könnte eine nicht akzeptable Verzögerung verursachen (erkennen, bestellen, NIBObee umrüsten)&lt;br /&gt;
&lt;br /&gt;
: Ein beliebiger PIN-kompatiber Microcontroller ATmega... wird statt dem ATmega16 eingesetzt. Die funktioniert soange der Ersatz-µC mit der Frequenz vom 15 MHz betrieben werden kann. Wichtig ist auch dass es adaptierte Bibliotheken gibt die auf den Ersatz-µC abgestimmt sind (z.B. andere Register oder geänderte Adressen für Register, ...)&lt;br /&gt;
&lt;br /&gt;
; Signale am UART mit Bordspannung im Gegensatz zu RS232-Level (12V)&lt;br /&gt;
: Die Signale am UART werden mit Bordspannung erzeugt/erwartet. Für die Kommunikation mit dem BT-Modul ist daher keine Anpassung durchzuführen.&lt;br /&gt;
&lt;br /&gt;
: Soll zu Testzwecken ein PC über RS232 angeschalten werden ist unbedingt auf die Spannung achten. Möglicherweise verwendet ein USB-RS232 Adapter nicht die 12V sonder nur 5V.&lt;br /&gt;
&lt;br /&gt;
== Open Issues ==&lt;br /&gt;
* Es muss noch überprüft werden ob die NIBObee Hardware ausreichend leistungsfähig ist oder ein Upgrade gemacht werden muss.&lt;br /&gt;
* Wie kann das verlassen der Spur von dem Überfahren einer Kreuzung unterschieden werden? Wenn es hier zu Problemen kommt könnten zwei zusätzliche lichtempfindliche Sensoren rechts und links oder noch ein Element mit drei zusätzlichen Sensoren auf Höhe der Achsen angebracht werden -&amp;gt; Mehraufwand!&lt;br /&gt;
* Soll Aktivierung der BT-Schnittstelle manuell erfolgen?&lt;br /&gt;
* Soll der Betriebsmodus gewählt werden können?&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* [http://www.nicai-systems.de/nibobee.html NIBObee Homepage bei Nicai Systems]&lt;br /&gt;
* [http://download.nicai-systems.com/nibo/Tutorial_NIBObee_20091123.pdf NIBObee - Tutorial zur Programmierung]&lt;br /&gt;
* [http://www.nicai-systems.com/de/zubehoer/nibobee-tuning-kit.html NIBObee - Tuning-Kit von Nicai-Systems]&lt;br /&gt;
* [http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/Der_UART Tutorial zur USART Programmierung]&lt;br /&gt;
[[Kategorie:FH]]&lt;/div&gt;</summary>
		<author><name>Alois</name></author>
	</entry>
	<entry>
		<id>https://wiki.callooh.com/index.php?title=NIBObee&amp;diff=907</id>
		<title>NIBObee</title>
		<link rel="alternate" type="text/html" href="https://wiki.callooh.com/index.php?title=NIBObee&amp;diff=907"/>
		<updated>2011-06-25T07:40:44Z</updated>

		<summary type="html">&lt;p&gt;Alois: /* Analog-Modul */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;NIBObee ist der Roboter der im Projekt [[RoLoMa]] verwendet wird.&lt;br /&gt;
== Technische Daten ==&lt;br /&gt;
Hier wird nur ein kleiner Ausschnitt der technischen Daten dargestellt. Es handelt sich nur um jenen Teil der für die Bewertung oder Implementierung der gestellten Aufgaben relevant ist:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Art&lt;br /&gt;
!Typ&lt;br /&gt;
!Bemerkung&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|Mikrocontroller&lt;br /&gt;
|ATMEL ATMega16, , 15 MHz&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|Integrierter UART wird verwendet um den Bluetooth Modul anzubinden.&lt;br /&gt;
&lt;br /&gt;
Sollte die Leistung nicht ausreichen kann entweder der Erweiterungssatz von Nicai-Systems verwendet werden oder nur der Controller wird gegen einen Pinkompatiblen Typ ausgetauscht (z.B. ATMega32, ATMega644, ATMega1284)&lt;br /&gt;
|-&lt;br /&gt;
|Flash:	16	kB&lt;br /&gt;
|-&lt;br /&gt;
|RAM:	1	kB&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|Maße&lt;br /&gt;
|Radumfang: 11,8 cm&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|Diese Maße sind wichtig um den NIBObee so exakt wie möglich am Mittelpunkt des Labyrinthfeldes positionieren zu können.&lt;br /&gt;
|-&lt;br /&gt;
|Abstand Liniensensor zu Radachse: 10,4 cm&lt;br /&gt;
|-&lt;br /&gt;
|Impulse pro Umdrehung: 20&lt;br /&gt;
|}&lt;br /&gt;
=== Ports ===&lt;br /&gt;
Über den UART wird der Bluetooth Modul [[BTM-222]] angebunden. Am NIObee ist diese Schnittstelle am Port X5 verfügbar.&lt;br /&gt;
&lt;br /&gt;
Zwei Analoge Eingänge werden für die Fototransistoren der zusätzlichen Linienerkennung verwendet. Diese sind am NIBObee am Port X1 verfügbar.&lt;br /&gt;
&lt;br /&gt;
Ein Ausgang dient zum ein- und ausschalten der zusätzlichen IR-LEDs. Dafür wird der PIN 1 des Port X4 verwendet.&lt;br /&gt;
&lt;br /&gt;
=== Resourcen ===&lt;br /&gt;
Folgende Resourcen werden für unsere Implementierung verwendet (&#039;&#039;kursiv&#039;&#039; markierte Resourcen werden bereits durch die Bibliothek belegt):&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Resource&lt;br /&gt;
!Verwendung&lt;br /&gt;
!Interrupts&lt;br /&gt;
!Dateien&lt;br /&gt;
|-&lt;br /&gt;
|Timer 1&lt;br /&gt;
|Motor PWM&lt;br /&gt;
|TIMER1_COMPA_vect, TIMER1_COMPB_vect&lt;br /&gt;
|motpwm.c&lt;br /&gt;
|-&lt;br /&gt;
|ADC&lt;br /&gt;
|Analog, Line&lt;br /&gt;
|ADC_vect&lt;br /&gt;
|analog.c, line.c&lt;br /&gt;
|-&lt;br /&gt;
|EEPROM&lt;br /&gt;
|Line (12 Byte)&lt;br /&gt;
|&lt;br /&gt;
|line.c&lt;br /&gt;
|-&lt;br /&gt;
|Ext. IRQ&lt;br /&gt;
|Odometrie&lt;br /&gt;
|INT0_vect, INT1_vect&lt;br /&gt;
|odometry.c&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Eine für den NIBObee allgemein gültige Auflistung findet man im [http://www.nibo-roboter.de/wiki/NIBObee/Lib/Resourcen NIBObee Wiki].&lt;br /&gt;
&lt;br /&gt;
=== Besondere Erkenntnisse ===&lt;br /&gt;
&lt;br /&gt;
==== ATMega16 ====&lt;br /&gt;
Die Speichergröße scheint durchaus ausreichend zu sein. Nach Implementierung aller wichtigen Grundfunktionen ist erst weniger als die Hälfte des Programmspeichers belegt.&lt;br /&gt;
&lt;br /&gt;
Problematisch war anfangs nur der geringe RAM der auch alle konstanten Strings enthält. Dies ist zwar nicht notwendig, ist mit dieser Entwicklungsumgebung allerdings so gelöst. Besonders die umfangreichen Debug-Informationen die über Bluetooth an den PC gesendet werden führten dabei zu massiven Problemen. Durch kurze symbolische Debugausgaben, die dann am PC im eigens entwickelten Terminalprogramm auf sprechende symbolische Ausgabe konvertiert wird, konnte das Problem behoben werden.&lt;br /&gt;
&lt;br /&gt;
==== Liniensensoren ====&lt;br /&gt;
Es hat sich, nach einigen Fehlschlägen bei der Linienverfolung, herausgestellt dass es ungünstig ist den NIBObee in eine optisch ansprechende waagrechte Position zu bringen indem eine kleinere Halbkugel auf der Unterseite angebracht wird. Der Grund: Nur mit der original Halbkugel und dem damit nach vorne ansteigenden Bodenabstand sind die IR-LED&#039;s weit genug vom Boden entfernt um einen Lichtkegen zu erzeugen der auch vernünftig vom Phototransistor erfasst werden kann. Bei waagrechter Ausrichtung des NIBObee ist dieser Kegel, aufgrund des geringeren Abstands zum Boden, zu klein!&lt;br /&gt;
&lt;br /&gt;
=== Bibliotheksfunktionen ===&lt;br /&gt;
==== Liniensensoren ====&lt;br /&gt;
Die original NIBObee Biliothek wird nicht verwendet. Sie wurde durch eine eigene Implementierung im [[NIBObee#Line-Modul|Line-Modul]] ersetzt. Der Grund ist die Notwendigkeit die zusätzlichen Liniensensoren in der gleichen Weise wie die drei Originalsensoren zu behandeln.&lt;br /&gt;
&lt;br /&gt;
==== Motorensteuerung ====&lt;br /&gt;
 motpwm.h&lt;br /&gt;
Die Motoren des NIBObee werden mit PWM ([http://de.wikipedia.org/wiki/Pulsweitenmodulation Pulsweitenmodulation]) angesteuert. Das garantiert natürlich ohne Regelung noch keinen Gleichlauf der beiden Motoren was sich je nach Zustand des Getriebes in einer weiteren oder engernen Kurve zeigt.&lt;br /&gt;
 motpid.h&lt;br /&gt;
Hier stehen Funktionen zur Verfügung die mit Hilfe der Odometrie die Motoren regeln. Diese Funktionen sind für unsere Zwecke allerdings nicht geeignet.&lt;br /&gt;
&lt;br /&gt;
== Aufgaben ==&lt;br /&gt;
Folgende Aufgaben sind im Rahmen des Projekts [[RoLoMa]] vom NIBObee Team zu lösen:&lt;br /&gt;
* Herstellung der Bluetooth Hardware-Erweiterung&lt;br /&gt;
* Softwaremodul zum Bedienen der Bluetooth-Schnittstelle via RS232&lt;br /&gt;
* Softwaremodul zum Erkennen der Linie im Labyrinth und im speziellen der unterschiedlichen Kreuzungstypen&lt;br /&gt;
* Messen des zurückgelegten Weges&lt;br /&gt;
* Steuerung, die den Abstand des Sensors zur Radachse berücksichtigt um den Roboter an der korrekten Stelle um die eigene Achse zu drehen&lt;br /&gt;
* Erstellen eines Abbilds des Labyrinths im Speicher und navigieren bis der Roboter wieder am Startpunkt gelandet ist (z.B. immer Links abbiegen)&lt;br /&gt;
* Implementieren des [[MaDeCo]] Protokolls&lt;br /&gt;
&lt;br /&gt;
Nach einigen ersten Tests ist folgende weitere Aufgabe hinzugekommen:&lt;br /&gt;
* Herstellung der Hardware-Erweiterung mit zusätzlichen Liniensensoren&lt;br /&gt;
&lt;br /&gt;
=== Aufgabenteilung ===&lt;br /&gt;
Alle Aufgaben wurden im Team gelöst wobei für manche dieser Aufgaben der Schwerpunkt bei nur einem oder zwei Teammitgliedern lag. Die folgende Tabelle gibt eine ungefähre Zuordnung der Aufgaben auf die einzelnen Personen:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|colspan=&amp;quot;3&amp;quot;|&#039;&#039;&#039;Dokumentation&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|&amp;amp;nbsp; &lt;br /&gt;
|Projektfortschritt, Controlling&lt;br /&gt;
|Robert Peterfi&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Hardware, Software (Wiki)&lt;br /&gt;
|Alois Pochmann, Reinhard Weismann&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Codedokumentation&lt;br /&gt;
|Robert Peterfi, Alois Pochmann, Reinhard Weismann&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|colspan=&amp;quot;3&amp;quot;|&#039;&#039;&#039;Hardware&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|&amp;amp;nbsp; &lt;br /&gt;
|Entwurf, Design&lt;br /&gt;
|Alois Pochmann&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Bestellung, Aufbau&lt;br /&gt;
|Robert Peterfi, Alois Pochmann&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Test&lt;br /&gt;
|Robert Peterfi, Alois Pochmann, Reinhard Weismann&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|colspan=&amp;quot;3&amp;quot;|&#039;&#039;&#039;Software&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;8&amp;quot;|&amp;amp;nbsp; &lt;br /&gt;
|Design, Funktionsaufteilung&lt;br /&gt;
|Robert Peterfi, Alois Pochmann, Reinhard Weismann&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Kommunikationsprotokoll&lt;br /&gt;
|Reinhard Weismann&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Scheduler, Event Handling, zentrale Funktionen&lt;br /&gt;
|Alois Pochmann&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Sensoren (Hardwareanbindung)&lt;br /&gt;
|Robert Peterfi&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Kalibrierung&lt;br /&gt;
|Robert Peterfi&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Odometrie&lt;br /&gt;
|Reinhard Weismann&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Bewegungssteuerung&lt;br /&gt;
|Robert Peterfi, Alois Pochmann, Reinhard Weismann&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Testapplikation (Windows)&lt;br /&gt;
|Alois Pochmann&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
&lt;br /&gt;
=== Bluetooth ===&lt;br /&gt;
Der Bluetooth Modul ist im Detail auf den Seiten des [[BTM-222]] beschrieben.&lt;br /&gt;
&lt;br /&gt;
=== Liniensensoren ===&lt;br /&gt;
Zum Erkennen der Kreuzungen bei gleichzeitigem Folgen der Linie war es notwendig zusätzliche Liniensensoren zu verwenden. Diese wurden mit einer Zusatzplatine in einer Reihe mit den bereits vorhandenen Liniensensoren, allerdings so weit wie möglich linke und rechts außen, montiert. Das Einlesen der Analogwerte erfolgt über die beiden Analogeingänge am Stecker X1. Die IR-LEDs sind, analog zu den bestehenden IR-LEDs der vorhandenen Liniensensoren, über den Ausgang 1 am Stecker X4 schaltbar. Dies ist notwendig da jeweils eine Messung mit eingschalteter LED und eine mit ausgeschalteter LED durchgeführt wird. Damit wird der Einfluß des Umgebungslichts korrigiert.&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
Die Aufgaben der Software sollen in möglichst unabhängigen Modulen realisiert werden um das Testen einfacher zu gestalten. Die einzelnen Module sind im Folgenden beschrieben.&lt;br /&gt;
&lt;br /&gt;
=== Architektur ===&lt;br /&gt;
Das Gesamtsystem besteht aus einem zentralen Taktgeber, einem Scheduler und mehreren State Maschinen. Die Kommunikation erfolgt über Events und, wenn nur eine spezielle Funktionalität eines anderen Moduls verwendet werden soll ohne dessen Zustand zu beeinflussen, über Funktionsaufrufe (z.B. senden einer MaDeCo-Meldung zum reporten eines Wegpunktes direkt vom drive Modul). Die Module können mittels Subscribe einen Event, den ein anderer Modul zur Verfügung steht, abonnieren.&lt;br /&gt;
&lt;br /&gt;
==== Systemtakt, Scheduler ====&lt;br /&gt;
Im Main Modul befindet sich der zentrale Taktgeber der aus dem Interrupt des Timer 1 einen gleichmäßigen Takt von 100Hz erzeugt. Dieser Takt kann von anderen Modulen verwendet werden um zyklische Aufgaben zu erfüllen (z.B. überprüfen des Status der &amp;quot;Fühler&amp;quot;). Im Main Modul befindet sich auch der Scheduler der ganz einfach in der Endlosschleife sequenziell jeden Modul aufruft um anstehende Events zu bearbeiten.&lt;br /&gt;
&lt;br /&gt;
==== State / Event Maschinen ====&lt;br /&gt;
Die State / Event Maschinen sind in allen Modulen gleich aufgebaut. Es gibt die folgenden Funktionen (wobei statt &amp;quot;&amp;lt;xx&amp;gt;&amp;quot; das Kürzel des Moduls steht, z.B &amp;quot;dr&amp;quot; für Drive):&lt;br /&gt;
; eine Funktion mit dem Namen &amp;lt;xx&amp;gt;_main (intern)&lt;br /&gt;
: Das ist die eigentliche State Maschine. Wird direkt vom Scheduler mit dem aktuell zu verarbeitenden Event aufgerufen. Hier gibt es ein switch Statement über den aktuellen Zustand und für jeden Zustand ein switch Statement über den empfangenen Event.&lt;br /&gt;
; eine Funktion mit dem Namen &amp;lt;xx&amp;gt;_init (extern)&lt;br /&gt;
: Hier werden Variableninitialisierungen gemacht und eventuell die ersten subscribe Aufrufe um Events zu abonnieren. Diese Funktion wird beim Systemstart vom Main Modul aufgerufen.&lt;br /&gt;
; optional Funktionen mit den Namen &amp;lt;xx&amp;gt;_subscribe_&amp;lt;event&amp;gt; und &amp;lt;xx&amp;gt;_unsubscribe_&amp;lt;event&amp;gt; (extern)&lt;br /&gt;
: für jeden Event den dieser Modul optional verschicken kann ist sowohl eine Subscribe Funktion als auch ein Unsubscribe Funktion vorhanden. Mit diesen Funktionen kann der Event von einem anderen Modul abboniert werden.&lt;br /&gt;
&lt;br /&gt;
=== Module ===&lt;br /&gt;
Im folgenden sind alle Module und deren Hauptfunktionen aufgelistet.&lt;br /&gt;
&lt;br /&gt;
==== Analog-Modul ====&lt;br /&gt;
Digitalisieren der Analogeingänge&lt;br /&gt;
 Dateien: analog.c&lt;br /&gt;
          analog.h&lt;br /&gt;
Dieser Modul ist abgeleitet von den gleichnamigen Dateien der original NIBObee Bibliothek. Der Austausch war notwendig da wir zusätzliche Liniensensoren verwenden und deren Ansteuerung in gleicher Weise erfolgen sollte. Das bedeutet, dass für die entsprechenden Analogeingänge Messungen mit ein- und ausgeschalteten IR-LEDs durchgeführt werden müssen. Außerdem wurde, entsprechend dem Datenblatt des ATMega16, die Behandlung der Messung der Batteriespannung verbessert. Da hier die Referenzspannung umgeschalten wird muss eine Messung verworfen werden bevor mit einem richtigen Ergebnis gerechnet werden kann. Das wurde in der Originalbibliothek nicht berücksichtigt.&lt;br /&gt;
Die einzelnen Werte werden weiterhin über einen A/D-Wandler ermittelt und zwischengespeichert. Es gibt nun 13 analoge Werte (statt bisher 11) die zyklisch digitalisiert werden. Dieser Vorgang wird mit einer Frequenz von ca 117 kHz durchgeführt, d.h. dass jeder dieser Werte ca. alle 111 µs (statt bisher 94 µs) aktualisiert wird.&lt;br /&gt;
&lt;br /&gt;
==== Line-Modul ====&lt;br /&gt;
Ermitteln der Werte der Liniensensoren&lt;br /&gt;
 Dateien: line.c&lt;br /&gt;
          line.h&lt;br /&gt;
Dieser Modul ersetzt die originalen Bibliotheksfunktionen der Liniensensoren. Dies war notwendig da wir zusätzliche Liniensensoren verwenden.&lt;br /&gt;
&lt;br /&gt;
Die Werte der Liniensensoren können nun mit der Funktion&lt;br /&gt;
&amp;lt;code&amp;gt;ln_get(index)&amp;lt;/code&amp;gt;&lt;br /&gt;
gelesen werden. Die Werte selbst werden über den [[NIBObee#Analog-Modul|Analog-Modul]] ermittelt.&lt;br /&gt;
&lt;br /&gt;
==== Bluetooth-Modul ====&lt;br /&gt;
Wickelt die Kommunikation über den Bluetooth Modul ab. Zur Kommunikation wird allerdings nur der USART als Terminal angesprochen, der Bluetooth Stack ist im [[BTM-222]] implementiert.&lt;br /&gt;
 Dateien: bluetooth.c&lt;br /&gt;
          bluetooth.h&lt;br /&gt;
&lt;br /&gt;
==== Common-Modul ====&lt;br /&gt;
Stellt gemeinsame Funktionen zurVerfügung&lt;br /&gt;
 Dateien: common.c&lt;br /&gt;
          common.h&lt;br /&gt;
&lt;br /&gt;
==== Distance-Modul ====&lt;br /&gt;
Behandelt die Odometrie Sensoren&lt;br /&gt;
 Dateien: distance.c&lt;br /&gt;
          distance.h&lt;br /&gt;
&lt;br /&gt;
==== Drive-Modul ====&lt;br /&gt;
Bewegt den NIBObee&lt;br /&gt;
 Dateien: drive.c&lt;br /&gt;
          drive.h&lt;br /&gt;
&lt;br /&gt;
==== Follow-Modul ====&lt;br /&gt;
Ist für die Linienverfolgung zuständig&lt;br /&gt;
 Dateien: follow.c&lt;br /&gt;
          follow.h&lt;br /&gt;
&lt;br /&gt;
==== MaDeCo-Modul ====&lt;br /&gt;
Behandelt das MaDeCo Protokoll&lt;br /&gt;
 Dateien: madeco.c&lt;br /&gt;
          madeco.h&lt;br /&gt;
&lt;br /&gt;
==== Main-Modul ====&lt;br /&gt;
Scheduler und zentraler Taktgeber&lt;br /&gt;
 Dateien: main.c&lt;br /&gt;
          main.h&lt;br /&gt;
&lt;br /&gt;
==== Sensor-Modul ====&lt;br /&gt;
Ist für die &amp;quot;Fühler&amp;quot; zuständig&lt;br /&gt;
 Dateien: follow.c&lt;br /&gt;
          follow.h&lt;br /&gt;
&lt;br /&gt;
=== Applikationen ===&lt;br /&gt;
==== Labyrinth erkunden ====&lt;br /&gt;
&lt;br /&gt;
==== Kürzesten Weg durch Labyrinth ====&lt;br /&gt;
&lt;br /&gt;
==== Kalibrierung ====&lt;br /&gt;
Zur Kalibrierung fährt der NIBObee ein Viereck entlang dass genau die Seitenlänge eines der Felder des Labyrinths hat. Dies ist notwendig um relativ einfach die Karte des Labyrinths erstellen zu können.&lt;br /&gt;
&lt;br /&gt;
=== Protokolle und deren Implementierung ===&lt;br /&gt;
==== [[MaDeCo]] ====&lt;br /&gt;
===== Interface Definition =====&lt;br /&gt;
* int set_opmode(OPMODE)&lt;br /&gt;
* int send_waypoint(WAYPOINT)&lt;br /&gt;
* int direct(DIRECTION[])&lt;br /&gt;
* int ack()&lt;br /&gt;
&lt;br /&gt;
==== Schnittstelle [[MaDeCo]] - RS232-Schnittstelle ====&lt;br /&gt;
* pairing&lt;br /&gt;
* Konfigurations-Commands&lt;br /&gt;
* ack&lt;br /&gt;
* read_command&lt;br /&gt;
* send_command&lt;br /&gt;
&lt;br /&gt;
=== Steuerungssoftware ===&lt;br /&gt;
==== Bluetooth Modul einschalten ====&lt;br /&gt;
Durch Bewegen der &amp;quot;Fühler&amp;quot; der NIBObee nach oben bis Einrasten wird das Bluetooth Modul eingeschalten.&lt;br /&gt;
Daraufhin muss auf eingehenden Bluetooth Traffic gelauscht werden.&lt;br /&gt;
&lt;br /&gt;
==== Blink Codes ====&lt;br /&gt;
Bestimmte Events oder Commands lösen bestimmte Blink- oder Leuchtmuster der Status LEDs aus.&lt;br /&gt;
&#039;&#039;&#039;TODO:&#039;&#039;&#039; Spezifikation der Blink Codes&lt;br /&gt;
&lt;br /&gt;
==== Gerade fahren ====&lt;br /&gt;
Das Problem beim geradeaus fahren ist dass der Roboter von der Spur abweichen kann und dann neu ausgerichtet werden muss. Üblicherweise erfolgt das mit Hilfe der Liniensensoren indem, sobald einer der seitlichen Sensoren die Linie erkennt, durch beschleunigen oder bremsen eines Rades in diese Richtung korrigierend gelenkt wird.&lt;br /&gt;
&lt;br /&gt;
In unserem Fall müssen wir diese Korrektur solange verzögern bis der seitliche Liniensensor eine mögliche Kreuzung passiert hat. Erst danach können wir feststellen ob wir nur die schwarze Linie einer Kreuzung überfahren sind oder ob tatsächlich eine Abweichung vorliegt. Die Anzahl der zu ignorierenden Odometrie-Impule kann folgendermaßen errechnet werden:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;Impulse pro Radumdrehung&amp;gt; / &amp;lt;Radumfang&amp;gt; * &amp;lt;Linienbreite&amp;gt; =&lt;br /&gt;
 20 / 11,8 * 1 = 1,69491525&lt;br /&gt;
&lt;br /&gt;
Wir werden also nur zwei Impulse abwarten bevor wir mit der Korrektur beginnen&lt;br /&gt;
&lt;br /&gt;
===== Funktionsaufteilung =====&lt;br /&gt;
Die Zuständigkeiten für diese Aufgabe sind wie folgt:&lt;br /&gt;
;drive Modul&lt;br /&gt;
:sorgt für die Steuerung der Motoren. Reduzieren der Geschwindigkeit eines Rades um eine ausgleichende Kurve zu fahren und stoppen wenn das Ende der geraden Linie erreicht wurde. Dazu aboniert der Modul die Events des line Modul die eine Abweichung von der Linie melden und vom distance Modul den Event zum fahren der Distanz zwischen Liniensensoren und Achse der Räder.&lt;br /&gt;
;line Modul&lt;br /&gt;
:prüft zyklisch die position der Linie unter dem NIBObee und meldet Abweichungen mittels Events. Dieses Melden wird allerdings verzögert bis zumindest die Breite der Linie überfahren wurde. Dazu aboniert der Modul den Event vom distance Modul den Event zum fahren der der Breite der Linie.&lt;br /&gt;
;distance Modul&lt;br /&gt;
:meldet auf Anforderung das zurücklegen einer Strecke in der Länge der Distanz zwischen Liniensensoren und Achse der Räder oder der Breite der Linie.&lt;br /&gt;
&lt;br /&gt;
==== Kreuzung fahren ====&lt;br /&gt;
An einer Kreuzung wird abgebogen indem der NIBObee zuerst unbeirrt geradeaus fährt bis die Achse genau auf dem Mittelpunkt der Kreuzung zu stehen kommt. Danach wird eine Drehung nach rechts oder links durchgeführt bis sich die Linie wieder genau unter dem mittleren Sensor befindet.&lt;br /&gt;
&lt;br /&gt;
Die Sensoren sind von der Achse 10,4 cm entfernt, eine Radumdrehung bewegt den NIBObee um 11,8 cm weiter und bei dieser Umdrehung werden vom Odometriesensor 20 Impulse abgegeben. Die Linienbreite wird 2 cm betragen. Daher errechnet sich die Strecke die nach Erkennen der Kreuzung gefahren werden muss folgendermassen:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;Impulse pro Radumdrehung&amp;gt; / &amp;lt;Radumfang&amp;gt; * (&amp;lt;Achsabstand&amp;gt; - &amp;lt;halbe Linienbreite&amp;gt;) =&lt;br /&gt;
 20 / 11,8 * (10,4 - 0,5) = 16,779661&lt;br /&gt;
&lt;br /&gt;
Nach passieren der Kreuzung muss der NIBObee also noch 17 Impulse über den Odometriesensor empfangen bevor er stoppt.&lt;br /&gt;
&lt;br /&gt;
== Risikoanalyse ==&lt;br /&gt;
Im Folgenden wird versucht für die möglichen Risikopunkte Alternativen aufzuzeigen.&lt;br /&gt;
&lt;br /&gt;
; ATmega16 ist nicht Leisungsfägig genug&lt;br /&gt;
: Es kann auf den [http://www.nicai-systems.com/de/zubehoer/nibobee-tuning-kit.html Tuning-Kit von Nicai-Systems] zurückgerifffen werden. Dies könnte eine nicht akzeptable Verzögerung verursachen (erkennen, bestellen, NIBObee umrüsten)&lt;br /&gt;
&lt;br /&gt;
: Ein beliebiger PIN-kompatiber Microcontroller ATmega... wird statt dem ATmega16 eingesetzt. Die funktioniert soange der Ersatz-µC mit der Frequenz vom 15 MHz betrieben werden kann. Wichtig ist auch dass es adaptierte Bibliotheken gibt die auf den Ersatz-µC abgestimmt sind (z.B. andere Register oder geänderte Adressen für Register, ...)&lt;br /&gt;
&lt;br /&gt;
; Signale am UART mit Bordspannung im Gegensatz zu RS232-Level (12V)&lt;br /&gt;
: Die Signale am UART werden mit Bordspannung erzeugt/erwartet. Für die Kommunikation mit dem BT-Modul ist daher keine Anpassung durchzuführen.&lt;br /&gt;
&lt;br /&gt;
: Soll zu Testzwecken ein PC über RS232 angeschalten werden ist unbedingt auf die Spannung achten. Möglicherweise verwendet ein USB-RS232 Adapter nicht die 12V sonder nur 5V.&lt;br /&gt;
&lt;br /&gt;
== Open Issues ==&lt;br /&gt;
* Es muss noch überprüft werden ob die NIBObee Hardware ausreichend leistungsfähig ist oder ein Upgrade gemacht werden muss.&lt;br /&gt;
* Wie kann das verlassen der Spur von dem Überfahren einer Kreuzung unterschieden werden? Wenn es hier zu Problemen kommt könnten zwei zusätzliche lichtempfindliche Sensoren rechts und links oder noch ein Element mit drei zusätzlichen Sensoren auf Höhe der Achsen angebracht werden -&amp;gt; Mehraufwand!&lt;br /&gt;
* Soll Aktivierung der BT-Schnittstelle manuell erfolgen?&lt;br /&gt;
* Soll der Betriebsmodus gewählt werden können?&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* [http://www.nicai-systems.de/nibobee.html NIBObee Homepage bei Nicai Systems]&lt;br /&gt;
* [http://download.nicai-systems.com/nibo/Tutorial_NIBObee_20091123.pdf NIBObee - Tutorial zur Programmierung]&lt;br /&gt;
* [http://www.nicai-systems.com/de/zubehoer/nibobee-tuning-kit.html NIBObee - Tuning-Kit von Nicai-Systems]&lt;br /&gt;
* [http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/Der_UART Tutorial zur USART Programmierung]&lt;br /&gt;
[[Kategorie:FH]]&lt;/div&gt;</summary>
		<author><name>Alois</name></author>
	</entry>
	<entry>
		<id>https://wiki.callooh.com/index.php?title=NIBObee&amp;diff=906</id>
		<title>NIBObee</title>
		<link rel="alternate" type="text/html" href="https://wiki.callooh.com/index.php?title=NIBObee&amp;diff=906"/>
		<updated>2011-06-24T23:00:32Z</updated>

		<summary type="html">&lt;p&gt;Alois: /* Architektur */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;NIBObee ist der Roboter der im Projekt [[RoLoMa]] verwendet wird.&lt;br /&gt;
== Technische Daten ==&lt;br /&gt;
Hier wird nur ein kleiner Ausschnitt der technischen Daten dargestellt. Es handelt sich nur um jenen Teil der für die Bewertung oder Implementierung der gestellten Aufgaben relevant ist:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Art&lt;br /&gt;
!Typ&lt;br /&gt;
!Bemerkung&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|Mikrocontroller&lt;br /&gt;
|ATMEL ATMega16, , 15 MHz&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|Integrierter UART wird verwendet um den Bluetooth Modul anzubinden.&lt;br /&gt;
&lt;br /&gt;
Sollte die Leistung nicht ausreichen kann entweder der Erweiterungssatz von Nicai-Systems verwendet werden oder nur der Controller wird gegen einen Pinkompatiblen Typ ausgetauscht (z.B. ATMega32, ATMega644, ATMega1284)&lt;br /&gt;
|-&lt;br /&gt;
|Flash:	16	kB&lt;br /&gt;
|-&lt;br /&gt;
|RAM:	1	kB&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|Maße&lt;br /&gt;
|Radumfang: 11,8 cm&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|Diese Maße sind wichtig um den NIBObee so exakt wie möglich am Mittelpunkt des Labyrinthfeldes positionieren zu können.&lt;br /&gt;
|-&lt;br /&gt;
|Abstand Liniensensor zu Radachse: 10,4 cm&lt;br /&gt;
|-&lt;br /&gt;
|Impulse pro Umdrehung: 20&lt;br /&gt;
|}&lt;br /&gt;
=== Ports ===&lt;br /&gt;
Über den UART wird der Bluetooth Modul [[BTM-222]] angebunden. Am NIObee ist diese Schnittstelle am Port X5 verfügbar.&lt;br /&gt;
&lt;br /&gt;
Zwei Analoge Eingänge werden für die Fototransistoren der zusätzlichen Linienerkennung verwendet. Diese sind am NIBObee am Port X1 verfügbar.&lt;br /&gt;
&lt;br /&gt;
Ein Ausgang dient zum ein- und ausschalten der zusätzlichen IR-LEDs. Dafür wird der PIN 1 des Port X4 verwendet.&lt;br /&gt;
&lt;br /&gt;
=== Resourcen ===&lt;br /&gt;
Folgende Resourcen werden für unsere Implementierung verwendet (&#039;&#039;kursiv&#039;&#039; markierte Resourcen werden bereits durch die Bibliothek belegt):&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Resource&lt;br /&gt;
!Verwendung&lt;br /&gt;
!Interrupts&lt;br /&gt;
!Dateien&lt;br /&gt;
|-&lt;br /&gt;
|Timer 1&lt;br /&gt;
|Motor PWM&lt;br /&gt;
|TIMER1_COMPA_vect, TIMER1_COMPB_vect&lt;br /&gt;
|motpwm.c&lt;br /&gt;
|-&lt;br /&gt;
|ADC&lt;br /&gt;
|Analog, Line&lt;br /&gt;
|ADC_vect&lt;br /&gt;
|analog.c, line.c&lt;br /&gt;
|-&lt;br /&gt;
|EEPROM&lt;br /&gt;
|Line (12 Byte)&lt;br /&gt;
|&lt;br /&gt;
|line.c&lt;br /&gt;
|-&lt;br /&gt;
|Ext. IRQ&lt;br /&gt;
|Odometrie&lt;br /&gt;
|INT0_vect, INT1_vect&lt;br /&gt;
|odometry.c&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Eine für den NIBObee allgemein gültige Auflistung findet man im [http://www.nibo-roboter.de/wiki/NIBObee/Lib/Resourcen NIBObee Wiki].&lt;br /&gt;
&lt;br /&gt;
=== Besondere Erkenntnisse ===&lt;br /&gt;
&lt;br /&gt;
==== ATMega16 ====&lt;br /&gt;
Die Speichergröße scheint durchaus ausreichend zu sein. Nach Implementierung aller wichtigen Grundfunktionen ist erst weniger als die Hälfte des Programmspeichers belegt.&lt;br /&gt;
&lt;br /&gt;
Problematisch war anfangs nur der geringe RAM der auch alle konstanten Strings enthält. Dies ist zwar nicht notwendig, ist mit dieser Entwicklungsumgebung allerdings so gelöst. Besonders die umfangreichen Debug-Informationen die über Bluetooth an den PC gesendet werden führten dabei zu massiven Problemen. Durch kurze symbolische Debugausgaben, die dann am PC im eigens entwickelten Terminalprogramm auf sprechende symbolische Ausgabe konvertiert wird, konnte das Problem behoben werden.&lt;br /&gt;
&lt;br /&gt;
==== Liniensensoren ====&lt;br /&gt;
Es hat sich, nach einigen Fehlschlägen bei der Linienverfolung, herausgestellt dass es ungünstig ist den NIBObee in eine optisch ansprechende waagrechte Position zu bringen indem eine kleinere Halbkugel auf der Unterseite angebracht wird. Der Grund: Nur mit der original Halbkugel und dem damit nach vorne ansteigenden Bodenabstand sind die IR-LED&#039;s weit genug vom Boden entfernt um einen Lichtkegen zu erzeugen der auch vernünftig vom Phototransistor erfasst werden kann. Bei waagrechter Ausrichtung des NIBObee ist dieser Kegel, aufgrund des geringeren Abstands zum Boden, zu klein!&lt;br /&gt;
&lt;br /&gt;
=== Bibliotheksfunktionen ===&lt;br /&gt;
==== Liniensensoren ====&lt;br /&gt;
Die original NIBObee Biliothek wird nicht verwendet. Sie wurde durch eine eigene Implementierung im [[NIBObee#Line-Modul|Line-Modul]] ersetzt. Der Grund ist die Notwendigkeit die zusätzlichen Liniensensoren in der gleichen Weise wie die drei Originalsensoren zu behandeln.&lt;br /&gt;
&lt;br /&gt;
==== Motorensteuerung ====&lt;br /&gt;
 motpwm.h&lt;br /&gt;
Die Motoren des NIBObee werden mit PWM ([http://de.wikipedia.org/wiki/Pulsweitenmodulation Pulsweitenmodulation]) angesteuert. Das garantiert natürlich ohne Regelung noch keinen Gleichlauf der beiden Motoren was sich je nach Zustand des Getriebes in einer weiteren oder engernen Kurve zeigt.&lt;br /&gt;
 motpid.h&lt;br /&gt;
Hier stehen Funktionen zur Verfügung die mit Hilfe der Odometrie die Motoren regeln. Diese Funktionen sind für unsere Zwecke allerdings nicht geeignet.&lt;br /&gt;
&lt;br /&gt;
== Aufgaben ==&lt;br /&gt;
Folgende Aufgaben sind im Rahmen des Projekts [[RoLoMa]] vom NIBObee Team zu lösen:&lt;br /&gt;
* Herstellung der Bluetooth Hardware-Erweiterung&lt;br /&gt;
* Softwaremodul zum Bedienen der Bluetooth-Schnittstelle via RS232&lt;br /&gt;
* Softwaremodul zum Erkennen der Linie im Labyrinth und im speziellen der unterschiedlichen Kreuzungstypen&lt;br /&gt;
* Messen des zurückgelegten Weges&lt;br /&gt;
* Steuerung, die den Abstand des Sensors zur Radachse berücksichtigt um den Roboter an der korrekten Stelle um die eigene Achse zu drehen&lt;br /&gt;
* Erstellen eines Abbilds des Labyrinths im Speicher und navigieren bis der Roboter wieder am Startpunkt gelandet ist (z.B. immer Links abbiegen)&lt;br /&gt;
* Implementieren des [[MaDeCo]] Protokolls&lt;br /&gt;
&lt;br /&gt;
Nach einigen ersten Tests ist folgende weitere Aufgabe hinzugekommen:&lt;br /&gt;
* Herstellung der Hardware-Erweiterung mit zusätzlichen Liniensensoren&lt;br /&gt;
&lt;br /&gt;
=== Aufgabenteilung ===&lt;br /&gt;
Alle Aufgaben wurden im Team gelöst wobei für manche dieser Aufgaben der Schwerpunkt bei nur einem oder zwei Teammitgliedern lag. Die folgende Tabelle gibt eine ungefähre Zuordnung der Aufgaben auf die einzelnen Personen:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|colspan=&amp;quot;3&amp;quot;|&#039;&#039;&#039;Dokumentation&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|&amp;amp;nbsp; &lt;br /&gt;
|Projektfortschritt, Controlling&lt;br /&gt;
|Robert Peterfi&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Hardware, Software (Wiki)&lt;br /&gt;
|Alois Pochmann, Reinhard Weismann&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Codedokumentation&lt;br /&gt;
|Robert Peterfi, Alois Pochmann, Reinhard Weismann&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|colspan=&amp;quot;3&amp;quot;|&#039;&#039;&#039;Hardware&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|&amp;amp;nbsp; &lt;br /&gt;
|Entwurf, Design&lt;br /&gt;
|Alois Pochmann&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Bestellung, Aufbau&lt;br /&gt;
|Robert Peterfi, Alois Pochmann&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Test&lt;br /&gt;
|Robert Peterfi, Alois Pochmann, Reinhard Weismann&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|colspan=&amp;quot;3&amp;quot;|&#039;&#039;&#039;Software&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;8&amp;quot;|&amp;amp;nbsp; &lt;br /&gt;
|Design, Funktionsaufteilung&lt;br /&gt;
|Robert Peterfi, Alois Pochmann, Reinhard Weismann&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Kommunikationsprotokoll&lt;br /&gt;
|Reinhard Weismann&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Scheduler, Event Handling, zentrale Funktionen&lt;br /&gt;
|Alois Pochmann&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Sensoren (Hardwareanbindung)&lt;br /&gt;
|Robert Peterfi&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Kalibrierung&lt;br /&gt;
|Robert Peterfi&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Odometrie&lt;br /&gt;
|Reinhard Weismann&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Bewegungssteuerung&lt;br /&gt;
|Robert Peterfi, Alois Pochmann, Reinhard Weismann&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Testapplikation (Windows)&lt;br /&gt;
|Alois Pochmann&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
&lt;br /&gt;
=== Bluetooth ===&lt;br /&gt;
Der Bluetooth Modul ist im Detail auf den Seiten des [[BTM-222]] beschrieben.&lt;br /&gt;
&lt;br /&gt;
=== Liniensensoren ===&lt;br /&gt;
Zum Erkennen der Kreuzungen bei gleichzeitigem Folgen der Linie war es notwendig zusätzliche Liniensensoren zu verwenden. Diese wurden mit einer Zusatzplatine in einer Reihe mit den bereits vorhandenen Liniensensoren, allerdings so weit wie möglich linke und rechts außen, montiert. Das Einlesen der Analogwerte erfolgt über die beiden Analogeingänge am Stecker X1. Die IR-LEDs sind, analog zu den bestehenden IR-LEDs der vorhandenen Liniensensoren, über den Ausgang 1 am Stecker X4 schaltbar. Dies ist notwendig da jeweils eine Messung mit eingschalteter LED und eine mit ausgeschalteter LED durchgeführt wird. Damit wird der Einfluß des Umgebungslichts korrigiert.&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
Die Aufgaben der Software sollen in möglichst unabhängigen Modulen realisiert werden um das Testen einfacher zu gestalten. Die einzelnen Module sind im Folgenden beschrieben.&lt;br /&gt;
&lt;br /&gt;
=== Architektur ===&lt;br /&gt;
Das Gesamtsystem besteht aus einem zentralen Taktgeber, einem Scheduler und mehreren State Maschinen. Die Kommunikation erfolgt über Events und, wenn nur eine spezielle Funktionalität eines anderen Moduls verwendet werden soll ohne dessen Zustand zu beeinflussen, über Funktionsaufrufe (z.B. senden einer MaDeCo-Meldung zum reporten eines Wegpunktes direkt vom drive Modul). Die Module können mittels Subscribe einen Event, den ein anderer Modul zur Verfügung steht, abonnieren.&lt;br /&gt;
&lt;br /&gt;
==== Systemtakt, Scheduler ====&lt;br /&gt;
Im Main Modul befindet sich der zentrale Taktgeber der aus dem Interrupt des Timer 1 einen gleichmäßigen Takt von 100Hz erzeugt. Dieser Takt kann von anderen Modulen verwendet werden um zyklische Aufgaben zu erfüllen (z.B. überprüfen des Status der &amp;quot;Fühler&amp;quot;). Im Main Modul befindet sich auch der Scheduler der ganz einfach in der Endlosschleife sequenziell jeden Modul aufruft um anstehende Events zu bearbeiten.&lt;br /&gt;
&lt;br /&gt;
==== State / Event Maschinen ====&lt;br /&gt;
Die State / Event Maschinen sind in allen Modulen gleich aufgebaut. Es gibt die folgenden Funktionen (wobei statt &amp;quot;&amp;lt;xx&amp;gt;&amp;quot; das Kürzel des Moduls steht, z.B &amp;quot;dr&amp;quot; für Drive):&lt;br /&gt;
; eine Funktion mit dem Namen &amp;lt;xx&amp;gt;_main (intern)&lt;br /&gt;
: Das ist die eigentliche State Maschine. Wird direkt vom Scheduler mit dem aktuell zu verarbeitenden Event aufgerufen. Hier gibt es ein switch Statement über den aktuellen Zustand und für jeden Zustand ein switch Statement über den empfangenen Event.&lt;br /&gt;
; eine Funktion mit dem Namen &amp;lt;xx&amp;gt;_init (extern)&lt;br /&gt;
: Hier werden Variableninitialisierungen gemacht und eventuell die ersten subscribe Aufrufe um Events zu abonnieren. Diese Funktion wird beim Systemstart vom Main Modul aufgerufen.&lt;br /&gt;
; optional Funktionen mit den Namen &amp;lt;xx&amp;gt;_subscribe_&amp;lt;event&amp;gt; und &amp;lt;xx&amp;gt;_unsubscribe_&amp;lt;event&amp;gt; (extern)&lt;br /&gt;
: für jeden Event den dieser Modul optional verschicken kann ist sowohl eine Subscribe Funktion als auch ein Unsubscribe Funktion vorhanden. Mit diesen Funktionen kann der Event von einem anderen Modul abboniert werden.&lt;br /&gt;
&lt;br /&gt;
=== Module ===&lt;br /&gt;
Im folgenden sind alle Module und deren Hauptfunktionen aufgelistet.&lt;br /&gt;
&lt;br /&gt;
==== Analog-Modul ====&lt;br /&gt;
Digitalisieren der Analogeingänge&lt;br /&gt;
 Dateien: analog.c&lt;br /&gt;
          analog.h&lt;br /&gt;
Dieser Modul ist abgeleitet von den gleichnamigen Dateien der original NIBObee Bibliothek. Dies war notwendig da wir zusätzliche Liniensensoren verwenden und deren Ansteuerung in gleicher Weise erfolgen sollte. Das bedeutet dass für die entsprechenden Analogeingänge Messungen mit ein- und ausgeschalteten IR-LEDs durchgeführt werden müssen. Außerdem wurde, entsprechend dem Datenblatt des ATMega16 die Behandlung der Messung der Batteriespannung verbessert. Da hier die Referenzspannung umgeschalten wird muss eine Messung verworfen werden bevor mit einem richtigen Ergebnis gerechnet werden kann. Das wurde in der Originalbibliothek nicht berücksichtigt.&lt;br /&gt;
Die einzelnen Werte werden weiterhin über einen A/D-Wandler ermittelt und zwischengespeichert. Es gibt nun 13 analoge Werte (statt bisher 11) die zyklisch digitalisiert werden. Dieser Vorgang wird mit einer Frequenz von ca 117 kHz durchgeführt, d.h. dass jeder dieser Werte ca. alle 111 µs (statt bisher 94 µs) aktualisiert wird.&lt;br /&gt;
&lt;br /&gt;
==== Line-Modul ====&lt;br /&gt;
Ermitteln der Werte der Liniensensoren&lt;br /&gt;
 Dateien: line.c&lt;br /&gt;
          line.h&lt;br /&gt;
Dieser Modul ersetzt die originalen Bibliotheksfunktionen der Liniensensoren. Dies war notwendig da wir zusätzliche Liniensensoren verwenden.&lt;br /&gt;
&lt;br /&gt;
Die Werte der Liniensensoren können nun mit der Funktion&lt;br /&gt;
&amp;lt;code&amp;gt;ln_get(index)&amp;lt;/code&amp;gt;&lt;br /&gt;
gelesen werden. Die Werte selbst werden über den [[NIBObee#Analog-Modul|Analog-Modul]] ermittelt.&lt;br /&gt;
&lt;br /&gt;
==== Bluetooth-Modul ====&lt;br /&gt;
Wickelt die Kommunikation über den Bluetooth Modul ab. Zur Kommunikation wird allerdings nur der USART als Terminal angesprochen, der Bluetooth Stack ist im [[BTM-222]] implementiert.&lt;br /&gt;
 Dateien: bluetooth.c&lt;br /&gt;
          bluetooth.h&lt;br /&gt;
&lt;br /&gt;
==== Common-Modul ====&lt;br /&gt;
Stellt gemeinsame Funktionen zurVerfügung&lt;br /&gt;
 Dateien: common.c&lt;br /&gt;
          common.h&lt;br /&gt;
&lt;br /&gt;
==== Distance-Modul ====&lt;br /&gt;
Behandelt die Odometrie Sensoren&lt;br /&gt;
 Dateien: distance.c&lt;br /&gt;
          distance.h&lt;br /&gt;
&lt;br /&gt;
==== Drive-Modul ====&lt;br /&gt;
Bewegt den NIBObee&lt;br /&gt;
 Dateien: drive.c&lt;br /&gt;
          drive.h&lt;br /&gt;
&lt;br /&gt;
==== Follow-Modul ====&lt;br /&gt;
Ist für die Linienverfolgung zuständig&lt;br /&gt;
 Dateien: follow.c&lt;br /&gt;
          follow.h&lt;br /&gt;
&lt;br /&gt;
==== MaDeCo-Modul ====&lt;br /&gt;
Behandelt das MaDeCo Protokoll&lt;br /&gt;
 Dateien: madeco.c&lt;br /&gt;
          madeco.h&lt;br /&gt;
&lt;br /&gt;
==== Main-Modul ====&lt;br /&gt;
Scheduler und zentraler Taktgeber&lt;br /&gt;
 Dateien: main.c&lt;br /&gt;
          main.h&lt;br /&gt;
&lt;br /&gt;
==== Sensor-Modul ====&lt;br /&gt;
Ist für die &amp;quot;Fühler&amp;quot; zuständig&lt;br /&gt;
 Dateien: follow.c&lt;br /&gt;
          follow.h&lt;br /&gt;
&lt;br /&gt;
=== Applikationen ===&lt;br /&gt;
==== Labyrinth erkunden ====&lt;br /&gt;
&lt;br /&gt;
==== Kürzesten Weg durch Labyrinth ====&lt;br /&gt;
&lt;br /&gt;
==== Kalibrierung ====&lt;br /&gt;
Zur Kalibrierung fährt der NIBObee ein Viereck entlang dass genau die Seitenlänge eines der Felder des Labyrinths hat. Dies ist notwendig um relativ einfach die Karte des Labyrinths erstellen zu können.&lt;br /&gt;
&lt;br /&gt;
=== Protokolle und deren Implementierung ===&lt;br /&gt;
==== [[MaDeCo]] ====&lt;br /&gt;
===== Interface Definition =====&lt;br /&gt;
* int set_opmode(OPMODE)&lt;br /&gt;
* int send_waypoint(WAYPOINT)&lt;br /&gt;
* int direct(DIRECTION[])&lt;br /&gt;
* int ack()&lt;br /&gt;
&lt;br /&gt;
==== Schnittstelle [[MaDeCo]] - RS232-Schnittstelle ====&lt;br /&gt;
* pairing&lt;br /&gt;
* Konfigurations-Commands&lt;br /&gt;
* ack&lt;br /&gt;
* read_command&lt;br /&gt;
* send_command&lt;br /&gt;
&lt;br /&gt;
=== Steuerungssoftware ===&lt;br /&gt;
==== Bluetooth Modul einschalten ====&lt;br /&gt;
Durch Bewegen der &amp;quot;Fühler&amp;quot; der NIBObee nach oben bis Einrasten wird das Bluetooth Modul eingeschalten.&lt;br /&gt;
Daraufhin muss auf eingehenden Bluetooth Traffic gelauscht werden.&lt;br /&gt;
&lt;br /&gt;
==== Blink Codes ====&lt;br /&gt;
Bestimmte Events oder Commands lösen bestimmte Blink- oder Leuchtmuster der Status LEDs aus.&lt;br /&gt;
&#039;&#039;&#039;TODO:&#039;&#039;&#039; Spezifikation der Blink Codes&lt;br /&gt;
&lt;br /&gt;
==== Gerade fahren ====&lt;br /&gt;
Das Problem beim geradeaus fahren ist dass der Roboter von der Spur abweichen kann und dann neu ausgerichtet werden muss. Üblicherweise erfolgt das mit Hilfe der Liniensensoren indem, sobald einer der seitlichen Sensoren die Linie erkennt, durch beschleunigen oder bremsen eines Rades in diese Richtung korrigierend gelenkt wird.&lt;br /&gt;
&lt;br /&gt;
In unserem Fall müssen wir diese Korrektur solange verzögern bis der seitliche Liniensensor eine mögliche Kreuzung passiert hat. Erst danach können wir feststellen ob wir nur die schwarze Linie einer Kreuzung überfahren sind oder ob tatsächlich eine Abweichung vorliegt. Die Anzahl der zu ignorierenden Odometrie-Impule kann folgendermaßen errechnet werden:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;Impulse pro Radumdrehung&amp;gt; / &amp;lt;Radumfang&amp;gt; * &amp;lt;Linienbreite&amp;gt; =&lt;br /&gt;
 20 / 11,8 * 1 = 1,69491525&lt;br /&gt;
&lt;br /&gt;
Wir werden also nur zwei Impulse abwarten bevor wir mit der Korrektur beginnen&lt;br /&gt;
&lt;br /&gt;
===== Funktionsaufteilung =====&lt;br /&gt;
Die Zuständigkeiten für diese Aufgabe sind wie folgt:&lt;br /&gt;
;drive Modul&lt;br /&gt;
:sorgt für die Steuerung der Motoren. Reduzieren der Geschwindigkeit eines Rades um eine ausgleichende Kurve zu fahren und stoppen wenn das Ende der geraden Linie erreicht wurde. Dazu aboniert der Modul die Events des line Modul die eine Abweichung von der Linie melden und vom distance Modul den Event zum fahren der Distanz zwischen Liniensensoren und Achse der Räder.&lt;br /&gt;
;line Modul&lt;br /&gt;
:prüft zyklisch die position der Linie unter dem NIBObee und meldet Abweichungen mittels Events. Dieses Melden wird allerdings verzögert bis zumindest die Breite der Linie überfahren wurde. Dazu aboniert der Modul den Event vom distance Modul den Event zum fahren der der Breite der Linie.&lt;br /&gt;
;distance Modul&lt;br /&gt;
:meldet auf Anforderung das zurücklegen einer Strecke in der Länge der Distanz zwischen Liniensensoren und Achse der Räder oder der Breite der Linie.&lt;br /&gt;
&lt;br /&gt;
==== Kreuzung fahren ====&lt;br /&gt;
An einer Kreuzung wird abgebogen indem der NIBObee zuerst unbeirrt geradeaus fährt bis die Achse genau auf dem Mittelpunkt der Kreuzung zu stehen kommt. Danach wird eine Drehung nach rechts oder links durchgeführt bis sich die Linie wieder genau unter dem mittleren Sensor befindet.&lt;br /&gt;
&lt;br /&gt;
Die Sensoren sind von der Achse 10,4 cm entfernt, eine Radumdrehung bewegt den NIBObee um 11,8 cm weiter und bei dieser Umdrehung werden vom Odometriesensor 20 Impulse abgegeben. Die Linienbreite wird 2 cm betragen. Daher errechnet sich die Strecke die nach Erkennen der Kreuzung gefahren werden muss folgendermassen:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;Impulse pro Radumdrehung&amp;gt; / &amp;lt;Radumfang&amp;gt; * (&amp;lt;Achsabstand&amp;gt; - &amp;lt;halbe Linienbreite&amp;gt;) =&lt;br /&gt;
 20 / 11,8 * (10,4 - 0,5) = 16,779661&lt;br /&gt;
&lt;br /&gt;
Nach passieren der Kreuzung muss der NIBObee also noch 17 Impulse über den Odometriesensor empfangen bevor er stoppt.&lt;br /&gt;
&lt;br /&gt;
== Risikoanalyse ==&lt;br /&gt;
Im Folgenden wird versucht für die möglichen Risikopunkte Alternativen aufzuzeigen.&lt;br /&gt;
&lt;br /&gt;
; ATmega16 ist nicht Leisungsfägig genug&lt;br /&gt;
: Es kann auf den [http://www.nicai-systems.com/de/zubehoer/nibobee-tuning-kit.html Tuning-Kit von Nicai-Systems] zurückgerifffen werden. Dies könnte eine nicht akzeptable Verzögerung verursachen (erkennen, bestellen, NIBObee umrüsten)&lt;br /&gt;
&lt;br /&gt;
: Ein beliebiger PIN-kompatiber Microcontroller ATmega... wird statt dem ATmega16 eingesetzt. Die funktioniert soange der Ersatz-µC mit der Frequenz vom 15 MHz betrieben werden kann. Wichtig ist auch dass es adaptierte Bibliotheken gibt die auf den Ersatz-µC abgestimmt sind (z.B. andere Register oder geänderte Adressen für Register, ...)&lt;br /&gt;
&lt;br /&gt;
; Signale am UART mit Bordspannung im Gegensatz zu RS232-Level (12V)&lt;br /&gt;
: Die Signale am UART werden mit Bordspannung erzeugt/erwartet. Für die Kommunikation mit dem BT-Modul ist daher keine Anpassung durchzuführen.&lt;br /&gt;
&lt;br /&gt;
: Soll zu Testzwecken ein PC über RS232 angeschalten werden ist unbedingt auf die Spannung achten. Möglicherweise verwendet ein USB-RS232 Adapter nicht die 12V sonder nur 5V.&lt;br /&gt;
&lt;br /&gt;
== Open Issues ==&lt;br /&gt;
* Es muss noch überprüft werden ob die NIBObee Hardware ausreichend leistungsfähig ist oder ein Upgrade gemacht werden muss.&lt;br /&gt;
* Wie kann das verlassen der Spur von dem Überfahren einer Kreuzung unterschieden werden? Wenn es hier zu Problemen kommt könnten zwei zusätzliche lichtempfindliche Sensoren rechts und links oder noch ein Element mit drei zusätzlichen Sensoren auf Höhe der Achsen angebracht werden -&amp;gt; Mehraufwand!&lt;br /&gt;
* Soll Aktivierung der BT-Schnittstelle manuell erfolgen?&lt;br /&gt;
* Soll der Betriebsmodus gewählt werden können?&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* [http://www.nicai-systems.de/nibobee.html NIBObee Homepage bei Nicai Systems]&lt;br /&gt;
* [http://download.nicai-systems.com/nibo/Tutorial_NIBObee_20091123.pdf NIBObee - Tutorial zur Programmierung]&lt;br /&gt;
* [http://www.nicai-systems.com/de/zubehoer/nibobee-tuning-kit.html NIBObee - Tuning-Kit von Nicai-Systems]&lt;br /&gt;
* [http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/Der_UART Tutorial zur USART Programmierung]&lt;br /&gt;
[[Kategorie:FH]]&lt;/div&gt;</summary>
		<author><name>Alois</name></author>
	</entry>
	<entry>
		<id>https://wiki.callooh.com/index.php?title=NIBObee&amp;diff=905</id>
		<title>NIBObee</title>
		<link rel="alternate" type="text/html" href="https://wiki.callooh.com/index.php?title=NIBObee&amp;diff=905"/>
		<updated>2011-06-24T22:53:21Z</updated>

		<summary type="html">&lt;p&gt;Alois: /* Liniensensoren */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;NIBObee ist der Roboter der im Projekt [[RoLoMa]] verwendet wird.&lt;br /&gt;
== Technische Daten ==&lt;br /&gt;
Hier wird nur ein kleiner Ausschnitt der technischen Daten dargestellt. Es handelt sich nur um jenen Teil der für die Bewertung oder Implementierung der gestellten Aufgaben relevant ist:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Art&lt;br /&gt;
!Typ&lt;br /&gt;
!Bemerkung&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|Mikrocontroller&lt;br /&gt;
|ATMEL ATMega16, , 15 MHz&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|Integrierter UART wird verwendet um den Bluetooth Modul anzubinden.&lt;br /&gt;
&lt;br /&gt;
Sollte die Leistung nicht ausreichen kann entweder der Erweiterungssatz von Nicai-Systems verwendet werden oder nur der Controller wird gegen einen Pinkompatiblen Typ ausgetauscht (z.B. ATMega32, ATMega644, ATMega1284)&lt;br /&gt;
|-&lt;br /&gt;
|Flash:	16	kB&lt;br /&gt;
|-&lt;br /&gt;
|RAM:	1	kB&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|Maße&lt;br /&gt;
|Radumfang: 11,8 cm&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|Diese Maße sind wichtig um den NIBObee so exakt wie möglich am Mittelpunkt des Labyrinthfeldes positionieren zu können.&lt;br /&gt;
|-&lt;br /&gt;
|Abstand Liniensensor zu Radachse: 10,4 cm&lt;br /&gt;
|-&lt;br /&gt;
|Impulse pro Umdrehung: 20&lt;br /&gt;
|}&lt;br /&gt;
=== Ports ===&lt;br /&gt;
Über den UART wird der Bluetooth Modul [[BTM-222]] angebunden. Am NIObee ist diese Schnittstelle am Port X5 verfügbar.&lt;br /&gt;
&lt;br /&gt;
Zwei Analoge Eingänge werden für die Fototransistoren der zusätzlichen Linienerkennung verwendet. Diese sind am NIBObee am Port X1 verfügbar.&lt;br /&gt;
&lt;br /&gt;
Ein Ausgang dient zum ein- und ausschalten der zusätzlichen IR-LEDs. Dafür wird der PIN 1 des Port X4 verwendet.&lt;br /&gt;
&lt;br /&gt;
=== Resourcen ===&lt;br /&gt;
Folgende Resourcen werden für unsere Implementierung verwendet (&#039;&#039;kursiv&#039;&#039; markierte Resourcen werden bereits durch die Bibliothek belegt):&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Resource&lt;br /&gt;
!Verwendung&lt;br /&gt;
!Interrupts&lt;br /&gt;
!Dateien&lt;br /&gt;
|-&lt;br /&gt;
|Timer 1&lt;br /&gt;
|Motor PWM&lt;br /&gt;
|TIMER1_COMPA_vect, TIMER1_COMPB_vect&lt;br /&gt;
|motpwm.c&lt;br /&gt;
|-&lt;br /&gt;
|ADC&lt;br /&gt;
|Analog, Line&lt;br /&gt;
|ADC_vect&lt;br /&gt;
|analog.c, line.c&lt;br /&gt;
|-&lt;br /&gt;
|EEPROM&lt;br /&gt;
|Line (12 Byte)&lt;br /&gt;
|&lt;br /&gt;
|line.c&lt;br /&gt;
|-&lt;br /&gt;
|Ext. IRQ&lt;br /&gt;
|Odometrie&lt;br /&gt;
|INT0_vect, INT1_vect&lt;br /&gt;
|odometry.c&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Eine für den NIBObee allgemein gültige Auflistung findet man im [http://www.nibo-roboter.de/wiki/NIBObee/Lib/Resourcen NIBObee Wiki].&lt;br /&gt;
&lt;br /&gt;
=== Besondere Erkenntnisse ===&lt;br /&gt;
&lt;br /&gt;
==== ATMega16 ====&lt;br /&gt;
Die Speichergröße scheint durchaus ausreichend zu sein. Nach Implementierung aller wichtigen Grundfunktionen ist erst weniger als die Hälfte des Programmspeichers belegt.&lt;br /&gt;
&lt;br /&gt;
Problematisch war anfangs nur der geringe RAM der auch alle konstanten Strings enthält. Dies ist zwar nicht notwendig, ist mit dieser Entwicklungsumgebung allerdings so gelöst. Besonders die umfangreichen Debug-Informationen die über Bluetooth an den PC gesendet werden führten dabei zu massiven Problemen. Durch kurze symbolische Debugausgaben, die dann am PC im eigens entwickelten Terminalprogramm auf sprechende symbolische Ausgabe konvertiert wird, konnte das Problem behoben werden.&lt;br /&gt;
&lt;br /&gt;
==== Liniensensoren ====&lt;br /&gt;
Es hat sich, nach einigen Fehlschlägen bei der Linienverfolung, herausgestellt dass es ungünstig ist den NIBObee in eine optisch ansprechende waagrechte Position zu bringen indem eine kleinere Halbkugel auf der Unterseite angebracht wird. Der Grund: Nur mit der original Halbkugel und dem damit nach vorne ansteigenden Bodenabstand sind die IR-LED&#039;s weit genug vom Boden entfernt um einen Lichtkegen zu erzeugen der auch vernünftig vom Phototransistor erfasst werden kann. Bei waagrechter Ausrichtung des NIBObee ist dieser Kegel, aufgrund des geringeren Abstands zum Boden, zu klein!&lt;br /&gt;
&lt;br /&gt;
=== Bibliotheksfunktionen ===&lt;br /&gt;
==== Liniensensoren ====&lt;br /&gt;
Die original NIBObee Biliothek wird nicht verwendet. Sie wurde durch eine eigene Implementierung im [[NIBObee#Line-Modul|Line-Modul]] ersetzt. Der Grund ist die Notwendigkeit die zusätzlichen Liniensensoren in der gleichen Weise wie die drei Originalsensoren zu behandeln.&lt;br /&gt;
&lt;br /&gt;
==== Motorensteuerung ====&lt;br /&gt;
 motpwm.h&lt;br /&gt;
Die Motoren des NIBObee werden mit PWM ([http://de.wikipedia.org/wiki/Pulsweitenmodulation Pulsweitenmodulation]) angesteuert. Das garantiert natürlich ohne Regelung noch keinen Gleichlauf der beiden Motoren was sich je nach Zustand des Getriebes in einer weiteren oder engernen Kurve zeigt.&lt;br /&gt;
 motpid.h&lt;br /&gt;
Hier stehen Funktionen zur Verfügung die mit Hilfe der Odometrie die Motoren regeln. Diese Funktionen sind für unsere Zwecke allerdings nicht geeignet.&lt;br /&gt;
&lt;br /&gt;
== Aufgaben ==&lt;br /&gt;
Folgende Aufgaben sind im Rahmen des Projekts [[RoLoMa]] vom NIBObee Team zu lösen:&lt;br /&gt;
* Herstellung der Bluetooth Hardware-Erweiterung&lt;br /&gt;
* Softwaremodul zum Bedienen der Bluetooth-Schnittstelle via RS232&lt;br /&gt;
* Softwaremodul zum Erkennen der Linie im Labyrinth und im speziellen der unterschiedlichen Kreuzungstypen&lt;br /&gt;
* Messen des zurückgelegten Weges&lt;br /&gt;
* Steuerung, die den Abstand des Sensors zur Radachse berücksichtigt um den Roboter an der korrekten Stelle um die eigene Achse zu drehen&lt;br /&gt;
* Erstellen eines Abbilds des Labyrinths im Speicher und navigieren bis der Roboter wieder am Startpunkt gelandet ist (z.B. immer Links abbiegen)&lt;br /&gt;
* Implementieren des [[MaDeCo]] Protokolls&lt;br /&gt;
&lt;br /&gt;
Nach einigen ersten Tests ist folgende weitere Aufgabe hinzugekommen:&lt;br /&gt;
* Herstellung der Hardware-Erweiterung mit zusätzlichen Liniensensoren&lt;br /&gt;
&lt;br /&gt;
=== Aufgabenteilung ===&lt;br /&gt;
Alle Aufgaben wurden im Team gelöst wobei für manche dieser Aufgaben der Schwerpunkt bei nur einem oder zwei Teammitgliedern lag. Die folgende Tabelle gibt eine ungefähre Zuordnung der Aufgaben auf die einzelnen Personen:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|colspan=&amp;quot;3&amp;quot;|&#039;&#039;&#039;Dokumentation&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|&amp;amp;nbsp; &lt;br /&gt;
|Projektfortschritt, Controlling&lt;br /&gt;
|Robert Peterfi&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Hardware, Software (Wiki)&lt;br /&gt;
|Alois Pochmann, Reinhard Weismann&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Codedokumentation&lt;br /&gt;
|Robert Peterfi, Alois Pochmann, Reinhard Weismann&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|colspan=&amp;quot;3&amp;quot;|&#039;&#039;&#039;Hardware&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|&amp;amp;nbsp; &lt;br /&gt;
|Entwurf, Design&lt;br /&gt;
|Alois Pochmann&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Bestellung, Aufbau&lt;br /&gt;
|Robert Peterfi, Alois Pochmann&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Test&lt;br /&gt;
|Robert Peterfi, Alois Pochmann, Reinhard Weismann&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|colspan=&amp;quot;3&amp;quot;|&#039;&#039;&#039;Software&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;8&amp;quot;|&amp;amp;nbsp; &lt;br /&gt;
|Design, Funktionsaufteilung&lt;br /&gt;
|Robert Peterfi, Alois Pochmann, Reinhard Weismann&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Kommunikationsprotokoll&lt;br /&gt;
|Reinhard Weismann&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Scheduler, Event Handling, zentrale Funktionen&lt;br /&gt;
|Alois Pochmann&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Sensoren (Hardwareanbindung)&lt;br /&gt;
|Robert Peterfi&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Kalibrierung&lt;br /&gt;
|Robert Peterfi&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Odometrie&lt;br /&gt;
|Reinhard Weismann&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Bewegungssteuerung&lt;br /&gt;
|Robert Peterfi, Alois Pochmann, Reinhard Weismann&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Testapplikation (Windows)&lt;br /&gt;
|Alois Pochmann&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
&lt;br /&gt;
=== Bluetooth ===&lt;br /&gt;
Der Bluetooth Modul ist im Detail auf den Seiten des [[BTM-222]] beschrieben.&lt;br /&gt;
&lt;br /&gt;
=== Liniensensoren ===&lt;br /&gt;
Zum Erkennen der Kreuzungen bei gleichzeitigem Folgen der Linie war es notwendig zusätzliche Liniensensoren zu verwenden. Diese wurden mit einer Zusatzplatine in einer Reihe mit den bereits vorhandenen Liniensensoren, allerdings so weit wie möglich linke und rechts außen, montiert. Das Einlesen der Analogwerte erfolgt über die beiden Analogeingänge am Stecker X1. Die IR-LEDs sind, analog zu den bestehenden IR-LEDs der vorhandenen Liniensensoren, über den Ausgang 1 am Stecker X4 schaltbar. Dies ist notwendig da jeweils eine Messung mit eingschalteter LED und eine mit ausgeschalteter LED durchgeführt wird. Damit wird der Einfluß des Umgebungslichts korrigiert.&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
Die Aufgaben der Software sollen in möglichst unabhängigen Modulen realisiert werden um das Testen einfacher zu gestalten. Die einzelnen Module sind im Folgenden beschrieben.&lt;br /&gt;
&lt;br /&gt;
=== Architektur ===&lt;br /&gt;
Das Gesamtsystem besteht aus einem zentralen Taktgeber, einem Scheduler und mehreren State Maschinen. Die Kommunikation erfolgt ausschließlich über Events. Die Module können mittels Subscribe einen Event, den ein anderer Modul zur Verfügung steht, abonnieren.&lt;br /&gt;
&lt;br /&gt;
==== Systemtakt, Scheduler ====&lt;br /&gt;
Im Main Modul befindet sich der zentrale Taktgeber der aus dem Interrupt des Timer 2 einen gleichmäßigen Takt von 100Hz erzeugt. Dieser Takt kann von anderen Modulen verwendet werden um zyklische Aufgaben zu erfüllen (z.B. lesen der Liniensensoren). Im Main Modul befindet sich auch der Scheduler der ganz einfach in der Endlosschleife sequenziell jeden Modul aufruft um anstehende Events zu bearbeiten.&lt;br /&gt;
&lt;br /&gt;
==== State / Event Maschinen ====&lt;br /&gt;
Die State / Event Maschinen sind in allen Modulen gleich aufgebaut. Es gibt die folgenden Funktionen (wobei statt &amp;quot;&amp;lt;xx&amp;gt;&amp;quot; das Kürzel des Moduls steht, z.B &amp;quot;dr&amp;quot; für Drive):&lt;br /&gt;
; eine Funktion mit dem Namen &amp;lt;xx&amp;gt;_main (intern)&lt;br /&gt;
: Das ist die eigentliche State Maschine. Wird nicht direkt vom Scheduler aufgerufen sondern über die Funktion &amp;lt;xx&amp;gt;_eventHandler. Hier gibt es ein switch Statement über den aktuellen Zustand und für jeden Zustand ein switch Statement über den empfangenen Event.&lt;br /&gt;
; eine Funktion mit dem Namen &amp;lt;xx&amp;gt;_init (extern)&lt;br /&gt;
: Hier werden Variableninitialisierungen gemacht und die ersten subscribe Aufrufe um Events zu abonnieren. Diese Funktion wird beim Systemstart vom Main Modul aufgerufen.&lt;br /&gt;
; eine Funktion mit dem Namen &amp;lt;xx&amp;gt;_eventHandler (extern)&lt;br /&gt;
: Ist die Funktion die vom Scheduler aufgerufen wird damit die Statemaschine mit dem aktuellen Event, sofern vorhanden, durchlaufen wird.&lt;br /&gt;
; optional Funktionen mit den Namen &amp;lt;xx&amp;gt;_subscribe_&amp;lt;event&amp;gt; und &amp;lt;xx&amp;gt;_unsubscribe_&amp;lt;event&amp;gt; (extern)&lt;br /&gt;
: für jeden Event den dieser Modul verschicken kann ist sowohl eine Subscribe Funktion als auch ein Unsubscribe Funktion vorhanden. Mit diesen Funktionen kann der Event von einem anderen Modul abboniert werden.&lt;br /&gt;
; eine Funktion mit dem Namen &amp;lt;xx&amp;gt;_receiveEvent (intern)&lt;br /&gt;
: ReceiveEvent ist eigentlich eine interne Funktion (wird also nicht im Header File deklariert), der Pointer auf diese Funktion wird allerdings als Callback beim Subscribe übergeben damit der Event dem Modul zugestellt werden kann.&lt;br /&gt;
&lt;br /&gt;
=== Module ===&lt;br /&gt;
Im folgenden sind alle Module und deren Hauptfunktionen aufgelistet.&lt;br /&gt;
&lt;br /&gt;
==== Analog-Modul ====&lt;br /&gt;
Digitalisieren der Analogeingänge&lt;br /&gt;
 Dateien: analog.c&lt;br /&gt;
          analog.h&lt;br /&gt;
Dieser Modul ist abgeleitet von den gleichnamigen Dateien der original NIBObee Bibliothek. Dies war notwendig da wir zusätzliche Liniensensoren verwenden und deren Ansteuerung in gleicher Weise erfolgen sollte. Das bedeutet dass für die entsprechenden Analogeingänge Messungen mit ein- und ausgeschalteten IR-LEDs durchgeführt werden müssen. Außerdem wurde, entsprechend dem Datenblatt des ATMega16 die Behandlung der Messung der Batteriespannung verbessert. Da hier die Referenzspannung umgeschalten wird muss eine Messung verworfen werden bevor mit einem richtigen Ergebnis gerechnet werden kann. Das wurde in der Originalbibliothek nicht berücksichtigt.&lt;br /&gt;
Die einzelnen Werte werden weiterhin über einen A/D-Wandler ermittelt und zwischengespeichert. Es gibt nun 13 analoge Werte (statt bisher 11) die zyklisch digitalisiert werden. Dieser Vorgang wird mit einer Frequenz von ca 117 kHz durchgeführt, d.h. dass jeder dieser Werte ca. alle 111 µs (statt bisher 94 µs) aktualisiert wird.&lt;br /&gt;
&lt;br /&gt;
==== Line-Modul ====&lt;br /&gt;
Ermitteln der Werte der Liniensensoren&lt;br /&gt;
 Dateien: line.c&lt;br /&gt;
          line.h&lt;br /&gt;
Dieser Modul ersetzt die originalen Bibliotheksfunktionen der Liniensensoren. Dies war notwendig da wir zusätzliche Liniensensoren verwenden.&lt;br /&gt;
&lt;br /&gt;
Die Werte der Liniensensoren können nun mit der Funktion&lt;br /&gt;
&amp;lt;code&amp;gt;ln_get(index)&amp;lt;/code&amp;gt;&lt;br /&gt;
gelesen werden. Die Werte selbst werden über den [[NIBObee#Analog-Modul|Analog-Modul]] ermittelt.&lt;br /&gt;
&lt;br /&gt;
==== Bluetooth-Modul ====&lt;br /&gt;
Wickelt die Kommunikation über den Bluetooth Modul ab. Zur Kommunikation wird allerdings nur der USART als Terminal angesprochen, der Bluetooth Stack ist im [[BTM-222]] implementiert.&lt;br /&gt;
 Dateien: bluetooth.c&lt;br /&gt;
          bluetooth.h&lt;br /&gt;
&lt;br /&gt;
==== Common-Modul ====&lt;br /&gt;
Stellt gemeinsame Funktionen zurVerfügung&lt;br /&gt;
 Dateien: common.c&lt;br /&gt;
          common.h&lt;br /&gt;
&lt;br /&gt;
==== Distance-Modul ====&lt;br /&gt;
Behandelt die Odometrie Sensoren&lt;br /&gt;
 Dateien: distance.c&lt;br /&gt;
          distance.h&lt;br /&gt;
&lt;br /&gt;
==== Drive-Modul ====&lt;br /&gt;
Bewegt den NIBObee&lt;br /&gt;
 Dateien: drive.c&lt;br /&gt;
          drive.h&lt;br /&gt;
&lt;br /&gt;
==== Follow-Modul ====&lt;br /&gt;
Ist für die Linienverfolgung zuständig&lt;br /&gt;
 Dateien: follow.c&lt;br /&gt;
          follow.h&lt;br /&gt;
&lt;br /&gt;
==== MaDeCo-Modul ====&lt;br /&gt;
Behandelt das MaDeCo Protokoll&lt;br /&gt;
 Dateien: madeco.c&lt;br /&gt;
          madeco.h&lt;br /&gt;
&lt;br /&gt;
==== Main-Modul ====&lt;br /&gt;
Scheduler und zentraler Taktgeber&lt;br /&gt;
 Dateien: main.c&lt;br /&gt;
          main.h&lt;br /&gt;
&lt;br /&gt;
==== Sensor-Modul ====&lt;br /&gt;
Ist für die &amp;quot;Fühler&amp;quot; zuständig&lt;br /&gt;
 Dateien: follow.c&lt;br /&gt;
          follow.h&lt;br /&gt;
&lt;br /&gt;
=== Applikationen ===&lt;br /&gt;
==== Labyrinth erkunden ====&lt;br /&gt;
&lt;br /&gt;
==== Kürzesten Weg durch Labyrinth ====&lt;br /&gt;
&lt;br /&gt;
==== Kalibrierung ====&lt;br /&gt;
Zur Kalibrierung fährt der NIBObee ein Viereck entlang dass genau die Seitenlänge eines der Felder des Labyrinths hat. Dies ist notwendig um relativ einfach die Karte des Labyrinths erstellen zu können.&lt;br /&gt;
&lt;br /&gt;
=== Protokolle und deren Implementierung ===&lt;br /&gt;
==== [[MaDeCo]] ====&lt;br /&gt;
===== Interface Definition =====&lt;br /&gt;
* int set_opmode(OPMODE)&lt;br /&gt;
* int send_waypoint(WAYPOINT)&lt;br /&gt;
* int direct(DIRECTION[])&lt;br /&gt;
* int ack()&lt;br /&gt;
&lt;br /&gt;
==== Schnittstelle [[MaDeCo]] - RS232-Schnittstelle ====&lt;br /&gt;
* pairing&lt;br /&gt;
* Konfigurations-Commands&lt;br /&gt;
* ack&lt;br /&gt;
* read_command&lt;br /&gt;
* send_command&lt;br /&gt;
&lt;br /&gt;
=== Steuerungssoftware ===&lt;br /&gt;
==== Bluetooth Modul einschalten ====&lt;br /&gt;
Durch Bewegen der &amp;quot;Fühler&amp;quot; der NIBObee nach oben bis Einrasten wird das Bluetooth Modul eingeschalten.&lt;br /&gt;
Daraufhin muss auf eingehenden Bluetooth Traffic gelauscht werden.&lt;br /&gt;
&lt;br /&gt;
==== Blink Codes ====&lt;br /&gt;
Bestimmte Events oder Commands lösen bestimmte Blink- oder Leuchtmuster der Status LEDs aus.&lt;br /&gt;
&#039;&#039;&#039;TODO:&#039;&#039;&#039; Spezifikation der Blink Codes&lt;br /&gt;
&lt;br /&gt;
==== Gerade fahren ====&lt;br /&gt;
Das Problem beim geradeaus fahren ist dass der Roboter von der Spur abweichen kann und dann neu ausgerichtet werden muss. Üblicherweise erfolgt das mit Hilfe der Liniensensoren indem, sobald einer der seitlichen Sensoren die Linie erkennt, durch beschleunigen oder bremsen eines Rades in diese Richtung korrigierend gelenkt wird.&lt;br /&gt;
&lt;br /&gt;
In unserem Fall müssen wir diese Korrektur solange verzögern bis der seitliche Liniensensor eine mögliche Kreuzung passiert hat. Erst danach können wir feststellen ob wir nur die schwarze Linie einer Kreuzung überfahren sind oder ob tatsächlich eine Abweichung vorliegt. Die Anzahl der zu ignorierenden Odometrie-Impule kann folgendermaßen errechnet werden:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;Impulse pro Radumdrehung&amp;gt; / &amp;lt;Radumfang&amp;gt; * &amp;lt;Linienbreite&amp;gt; =&lt;br /&gt;
 20 / 11,8 * 1 = 1,69491525&lt;br /&gt;
&lt;br /&gt;
Wir werden also nur zwei Impulse abwarten bevor wir mit der Korrektur beginnen&lt;br /&gt;
&lt;br /&gt;
===== Funktionsaufteilung =====&lt;br /&gt;
Die Zuständigkeiten für diese Aufgabe sind wie folgt:&lt;br /&gt;
;drive Modul&lt;br /&gt;
:sorgt für die Steuerung der Motoren. Reduzieren der Geschwindigkeit eines Rades um eine ausgleichende Kurve zu fahren und stoppen wenn das Ende der geraden Linie erreicht wurde. Dazu aboniert der Modul die Events des line Modul die eine Abweichung von der Linie melden und vom distance Modul den Event zum fahren der Distanz zwischen Liniensensoren und Achse der Räder.&lt;br /&gt;
;line Modul&lt;br /&gt;
:prüft zyklisch die position der Linie unter dem NIBObee und meldet Abweichungen mittels Events. Dieses Melden wird allerdings verzögert bis zumindest die Breite der Linie überfahren wurde. Dazu aboniert der Modul den Event vom distance Modul den Event zum fahren der der Breite der Linie.&lt;br /&gt;
;distance Modul&lt;br /&gt;
:meldet auf Anforderung das zurücklegen einer Strecke in der Länge der Distanz zwischen Liniensensoren und Achse der Räder oder der Breite der Linie.&lt;br /&gt;
&lt;br /&gt;
==== Kreuzung fahren ====&lt;br /&gt;
An einer Kreuzung wird abgebogen indem der NIBObee zuerst unbeirrt geradeaus fährt bis die Achse genau auf dem Mittelpunkt der Kreuzung zu stehen kommt. Danach wird eine Drehung nach rechts oder links durchgeführt bis sich die Linie wieder genau unter dem mittleren Sensor befindet.&lt;br /&gt;
&lt;br /&gt;
Die Sensoren sind von der Achse 10,4 cm entfernt, eine Radumdrehung bewegt den NIBObee um 11,8 cm weiter und bei dieser Umdrehung werden vom Odometriesensor 20 Impulse abgegeben. Die Linienbreite wird 2 cm betragen. Daher errechnet sich die Strecke die nach Erkennen der Kreuzung gefahren werden muss folgendermassen:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;Impulse pro Radumdrehung&amp;gt; / &amp;lt;Radumfang&amp;gt; * (&amp;lt;Achsabstand&amp;gt; - &amp;lt;halbe Linienbreite&amp;gt;) =&lt;br /&gt;
 20 / 11,8 * (10,4 - 0,5) = 16,779661&lt;br /&gt;
&lt;br /&gt;
Nach passieren der Kreuzung muss der NIBObee also noch 17 Impulse über den Odometriesensor empfangen bevor er stoppt.&lt;br /&gt;
&lt;br /&gt;
== Risikoanalyse ==&lt;br /&gt;
Im Folgenden wird versucht für die möglichen Risikopunkte Alternativen aufzuzeigen.&lt;br /&gt;
&lt;br /&gt;
; ATmega16 ist nicht Leisungsfägig genug&lt;br /&gt;
: Es kann auf den [http://www.nicai-systems.com/de/zubehoer/nibobee-tuning-kit.html Tuning-Kit von Nicai-Systems] zurückgerifffen werden. Dies könnte eine nicht akzeptable Verzögerung verursachen (erkennen, bestellen, NIBObee umrüsten)&lt;br /&gt;
&lt;br /&gt;
: Ein beliebiger PIN-kompatiber Microcontroller ATmega... wird statt dem ATmega16 eingesetzt. Die funktioniert soange der Ersatz-µC mit der Frequenz vom 15 MHz betrieben werden kann. Wichtig ist auch dass es adaptierte Bibliotheken gibt die auf den Ersatz-µC abgestimmt sind (z.B. andere Register oder geänderte Adressen für Register, ...)&lt;br /&gt;
&lt;br /&gt;
; Signale am UART mit Bordspannung im Gegensatz zu RS232-Level (12V)&lt;br /&gt;
: Die Signale am UART werden mit Bordspannung erzeugt/erwartet. Für die Kommunikation mit dem BT-Modul ist daher keine Anpassung durchzuführen.&lt;br /&gt;
&lt;br /&gt;
: Soll zu Testzwecken ein PC über RS232 angeschalten werden ist unbedingt auf die Spannung achten. Möglicherweise verwendet ein USB-RS232 Adapter nicht die 12V sonder nur 5V.&lt;br /&gt;
&lt;br /&gt;
== Open Issues ==&lt;br /&gt;
* Es muss noch überprüft werden ob die NIBObee Hardware ausreichend leistungsfähig ist oder ein Upgrade gemacht werden muss.&lt;br /&gt;
* Wie kann das verlassen der Spur von dem Überfahren einer Kreuzung unterschieden werden? Wenn es hier zu Problemen kommt könnten zwei zusätzliche lichtempfindliche Sensoren rechts und links oder noch ein Element mit drei zusätzlichen Sensoren auf Höhe der Achsen angebracht werden -&amp;gt; Mehraufwand!&lt;br /&gt;
* Soll Aktivierung der BT-Schnittstelle manuell erfolgen?&lt;br /&gt;
* Soll der Betriebsmodus gewählt werden können?&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* [http://www.nicai-systems.de/nibobee.html NIBObee Homepage bei Nicai Systems]&lt;br /&gt;
* [http://download.nicai-systems.com/nibo/Tutorial_NIBObee_20091123.pdf NIBObee - Tutorial zur Programmierung]&lt;br /&gt;
* [http://www.nicai-systems.com/de/zubehoer/nibobee-tuning-kit.html NIBObee - Tuning-Kit von Nicai-Systems]&lt;br /&gt;
* [http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/Der_UART Tutorial zur USART Programmierung]&lt;br /&gt;
[[Kategorie:FH]]&lt;/div&gt;</summary>
		<author><name>Alois</name></author>
	</entry>
	<entry>
		<id>https://wiki.callooh.com/index.php?title=NIBObee&amp;diff=904</id>
		<title>NIBObee</title>
		<link rel="alternate" type="text/html" href="https://wiki.callooh.com/index.php?title=NIBObee&amp;diff=904"/>
		<updated>2011-06-24T22:52:20Z</updated>

		<summary type="html">&lt;p&gt;Alois: /* Liniensensoren */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;NIBObee ist der Roboter der im Projekt [[RoLoMa]] verwendet wird.&lt;br /&gt;
== Technische Daten ==&lt;br /&gt;
Hier wird nur ein kleiner Ausschnitt der technischen Daten dargestellt. Es handelt sich nur um jenen Teil der für die Bewertung oder Implementierung der gestellten Aufgaben relevant ist:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Art&lt;br /&gt;
!Typ&lt;br /&gt;
!Bemerkung&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|Mikrocontroller&lt;br /&gt;
|ATMEL ATMega16, , 15 MHz&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|Integrierter UART wird verwendet um den Bluetooth Modul anzubinden.&lt;br /&gt;
&lt;br /&gt;
Sollte die Leistung nicht ausreichen kann entweder der Erweiterungssatz von Nicai-Systems verwendet werden oder nur der Controller wird gegen einen Pinkompatiblen Typ ausgetauscht (z.B. ATMega32, ATMega644, ATMega1284)&lt;br /&gt;
|-&lt;br /&gt;
|Flash:	16	kB&lt;br /&gt;
|-&lt;br /&gt;
|RAM:	1	kB&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|Maße&lt;br /&gt;
|Radumfang: 11,8 cm&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|Diese Maße sind wichtig um den NIBObee so exakt wie möglich am Mittelpunkt des Labyrinthfeldes positionieren zu können.&lt;br /&gt;
|-&lt;br /&gt;
|Abstand Liniensensor zu Radachse: 10,4 cm&lt;br /&gt;
|-&lt;br /&gt;
|Impulse pro Umdrehung: 20&lt;br /&gt;
|}&lt;br /&gt;
=== Ports ===&lt;br /&gt;
Über den UART wird der Bluetooth Modul [[BTM-222]] angebunden. Am NIObee ist diese Schnittstelle am Port X5 verfügbar.&lt;br /&gt;
&lt;br /&gt;
Zwei Analoge Eingänge werden für die Fototransistoren der zusätzlichen Linienerkennung verwendet. Diese sind am NIBObee am Port X1 verfügbar.&lt;br /&gt;
&lt;br /&gt;
Ein Ausgang dient zum ein- und ausschalten der zusätzlichen IR-LEDs. Dafür wird der PIN 1 des Port X4 verwendet.&lt;br /&gt;
&lt;br /&gt;
=== Resourcen ===&lt;br /&gt;
Folgende Resourcen werden für unsere Implementierung verwendet (&#039;&#039;kursiv&#039;&#039; markierte Resourcen werden bereits durch die Bibliothek belegt):&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Resource&lt;br /&gt;
!Verwendung&lt;br /&gt;
!Interrupts&lt;br /&gt;
!Dateien&lt;br /&gt;
|-&lt;br /&gt;
|Timer 1&lt;br /&gt;
|Motor PWM&lt;br /&gt;
|TIMER1_COMPA_vect, TIMER1_COMPB_vect&lt;br /&gt;
|motpwm.c&lt;br /&gt;
|-&lt;br /&gt;
|ADC&lt;br /&gt;
|Analog, Line&lt;br /&gt;
|ADC_vect&lt;br /&gt;
|analog.c, line.c&lt;br /&gt;
|-&lt;br /&gt;
|EEPROM&lt;br /&gt;
|Line (12 Byte)&lt;br /&gt;
|&lt;br /&gt;
|line.c&lt;br /&gt;
|-&lt;br /&gt;
|Ext. IRQ&lt;br /&gt;
|Odometrie&lt;br /&gt;
|INT0_vect, INT1_vect&lt;br /&gt;
|odometry.c&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Eine für den NIBObee allgemein gültige Auflistung findet man im [http://www.nibo-roboter.de/wiki/NIBObee/Lib/Resourcen NIBObee Wiki].&lt;br /&gt;
&lt;br /&gt;
=== Besondere Erkenntnisse ===&lt;br /&gt;
&lt;br /&gt;
==== ATMega16 ====&lt;br /&gt;
Die Speichergröße scheint durchaus ausreichend zu sein. Nach Implementierung aller wichtigen Grundfunktionen ist erst weniger als die Hälfte des Programmspeichers belegt.&lt;br /&gt;
&lt;br /&gt;
Problematisch war anfangs nur der geringe RAM der auch alle konstanten Strings enthält. Dies ist zwar nicht notwendig, ist mit dieser Entwicklungsumgebung allerdings so gelöst. Besonders die umfangreichen Debug-Informationen die über Bluetooth an den PC gesendet werden führten dabei zu massiven Problemen. Durch kurze symbolische Debugausgaben, die dann am PC im eigens entwickelten Terminalprogramm auf sprechende symbolische Ausgabe konvertiert wird, konnte das Problem behoben werden.&lt;br /&gt;
&lt;br /&gt;
==== Liniensensoren ====&lt;br /&gt;
Es hat sich, nach einigen Fehlschlägen bei der Linienverfolung, herausgestellt dass es ungünstig ist den NIBObee in eine optisch ansprechende waagrechte Position zu bringen indem eine kleinere Halbkugel auf der Unterseite angebracht wird. Der Grund: Nur mit der original Halbkugel und dem damit nach vorne ansteigenden Bodenabstand sind die IR-LED&#039;s weit genug vom Boden entfernt um einen Lichtkegen zu erzeugen der auch vernünftig vom Phototransistor erfasst werden kann. Bei waagrechter Ausrichtung des NIBObee ist dieser Kegel, aufgrund des geringeren Abstands zum Boden, zu klein!&lt;br /&gt;
&lt;br /&gt;
=== Bibliotheksfunktionen ===&lt;br /&gt;
==== Liniensensoren ====&lt;br /&gt;
Die original NIBObee Biliothek wird nicht verwendet. Sie wurde durch eine eigene Implementierung im [[NIBObee#Line-Modul|Line-Modul]] ersetzt. Der Grund ist die Notwendigkeit die zusätzlichen Liniensensoren in der gleichen Weise wie die drei Originalsensoren zu behandeln.&lt;br /&gt;
&lt;br /&gt;
==== Motorensteuerung ====&lt;br /&gt;
 motpwm.h&lt;br /&gt;
Die Motoren des NIBObee werden mit PWM ([http://de.wikipedia.org/wiki/Pulsweitenmodulation Pulsweitenmodulation]) angesteuert. Das garantiert natürlich ohne Regelung noch keinen Gleichlauf der beiden Motoren was sich je nach Zustand des Getriebes in einer weiteren oder engernen Kurve zeigt.&lt;br /&gt;
 motpid.h&lt;br /&gt;
Hier stehen Funktionen zur Verfügung die mit Hilfe der Odometrie die Motoren regeln. Diese Funktionen sind für unsere Zwecke allerdings nicht geeignet.&lt;br /&gt;
&lt;br /&gt;
== Aufgaben ==&lt;br /&gt;
Folgende Aufgaben sind im Rahmen des Projekts [[RoLoMa]] vom NIBObee Team zu lösen:&lt;br /&gt;
* Herstellung der Bluetooth Hardware-Erweiterung&lt;br /&gt;
* Softwaremodul zum Bedienen der Bluetooth-Schnittstelle via RS232&lt;br /&gt;
* Softwaremodul zum Erkennen der Linie im Labyrinth und im speziellen der unterschiedlichen Kreuzungstypen&lt;br /&gt;
* Messen des zurückgelegten Weges&lt;br /&gt;
* Steuerung, die den Abstand des Sensors zur Radachse berücksichtigt um den Roboter an der korrekten Stelle um die eigene Achse zu drehen&lt;br /&gt;
* Erstellen eines Abbilds des Labyrinths im Speicher und navigieren bis der Roboter wieder am Startpunkt gelandet ist (z.B. immer Links abbiegen)&lt;br /&gt;
* Implementieren des [[MaDeCo]] Protokolls&lt;br /&gt;
&lt;br /&gt;
Nach einigen ersten Tests ist folgende weitere Aufgabe hinzugekommen:&lt;br /&gt;
* Herstellung der Hardware-Erweiterung mit zusätzlichen Liniensensoren&lt;br /&gt;
&lt;br /&gt;
=== Aufgabenteilung ===&lt;br /&gt;
Alle Aufgaben wurden im Team gelöst wobei für manche dieser Aufgaben der Schwerpunkt bei nur einem oder zwei Teammitgliedern lag. Die folgende Tabelle gibt eine ungefähre Zuordnung der Aufgaben auf die einzelnen Personen:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|colspan=&amp;quot;3&amp;quot;|&#039;&#039;&#039;Dokumentation&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|&amp;amp;nbsp; &lt;br /&gt;
|Projektfortschritt, Controlling&lt;br /&gt;
|Robert Peterfi&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Hardware, Software (Wiki)&lt;br /&gt;
|Alois Pochmann, Reinhard Weismann&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Codedokumentation&lt;br /&gt;
|Robert Peterfi, Alois Pochmann, Reinhard Weismann&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|colspan=&amp;quot;3&amp;quot;|&#039;&#039;&#039;Hardware&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|&amp;amp;nbsp; &lt;br /&gt;
|Entwurf, Design&lt;br /&gt;
|Alois Pochmann&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Bestellung, Aufbau&lt;br /&gt;
|Robert Peterfi, Alois Pochmann&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Test&lt;br /&gt;
|Robert Peterfi, Alois Pochmann, Reinhard Weismann&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|colspan=&amp;quot;3&amp;quot;|&#039;&#039;&#039;Software&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;8&amp;quot;|&amp;amp;nbsp; &lt;br /&gt;
|Design, Funktionsaufteilung&lt;br /&gt;
|Robert Peterfi, Alois Pochmann, Reinhard Weismann&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Kommunikationsprotokoll&lt;br /&gt;
|Reinhard Weismann&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Scheduler, Event Handling, zentrale Funktionen&lt;br /&gt;
|Alois Pochmann&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Sensoren (Hardwareanbindung)&lt;br /&gt;
|Robert Peterfi&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Kalibrierung&lt;br /&gt;
|Robert Peterfi&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Odometrie&lt;br /&gt;
|Reinhard Weismann&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Bewegungssteuerung&lt;br /&gt;
|Robert Peterfi, Alois Pochmann, Reinhard Weismann&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Testapplikation (Windows)&lt;br /&gt;
|Alois Pochmann&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
&lt;br /&gt;
=== Bluetooth ===&lt;br /&gt;
Der Bluetooth Modul ist im Detail auf den Seiten des [[BTM-222]] beschrieben.&lt;br /&gt;
&lt;br /&gt;
=== Liniensensoren ===&lt;br /&gt;
Zum Erkennen der Kreuzungen bei gleichzeitigem Folgen der Linie war es notwendig zusätzliche Liniensensoren zu verwenden. Diese wurden mit einer Zusätzplatine in einer Reihe mit den bereits vorhandenen Liniensensoren, allerdings so weit wie möglich linke und rechts außen, montiert. Das einlesen der Analogwerte erfolgt über die beiden Analogeingänge am Stecker X1. Die IR-LEDs sind, analog zu den bestehenden IR-LEDs der vorhandenen Liniensensoren, über den Ausgang 1 am Stecker X4 schaltbar. Dies ist notwendig da jeweils eine Messung mit eingschalteter LED und eine mit ausgeschalteter LED durchgeführt wird. Damit wird der Einfluß des Umgebungslichts korrigiert.&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
Die Aufgaben der Software sollen in möglichst unabhängigen Modulen realisiert werden um das Testen einfacher zu gestalten. Die einzelnen Module sind im Folgenden beschrieben.&lt;br /&gt;
&lt;br /&gt;
=== Architektur ===&lt;br /&gt;
Das Gesamtsystem besteht aus einem zentralen Taktgeber, einem Scheduler und mehreren State Maschinen. Die Kommunikation erfolgt ausschließlich über Events. Die Module können mittels Subscribe einen Event, den ein anderer Modul zur Verfügung steht, abonnieren.&lt;br /&gt;
&lt;br /&gt;
==== Systemtakt, Scheduler ====&lt;br /&gt;
Im Main Modul befindet sich der zentrale Taktgeber der aus dem Interrupt des Timer 2 einen gleichmäßigen Takt von 100Hz erzeugt. Dieser Takt kann von anderen Modulen verwendet werden um zyklische Aufgaben zu erfüllen (z.B. lesen der Liniensensoren). Im Main Modul befindet sich auch der Scheduler der ganz einfach in der Endlosschleife sequenziell jeden Modul aufruft um anstehende Events zu bearbeiten.&lt;br /&gt;
&lt;br /&gt;
==== State / Event Maschinen ====&lt;br /&gt;
Die State / Event Maschinen sind in allen Modulen gleich aufgebaut. Es gibt die folgenden Funktionen (wobei statt &amp;quot;&amp;lt;xx&amp;gt;&amp;quot; das Kürzel des Moduls steht, z.B &amp;quot;dr&amp;quot; für Drive):&lt;br /&gt;
; eine Funktion mit dem Namen &amp;lt;xx&amp;gt;_main (intern)&lt;br /&gt;
: Das ist die eigentliche State Maschine. Wird nicht direkt vom Scheduler aufgerufen sondern über die Funktion &amp;lt;xx&amp;gt;_eventHandler. Hier gibt es ein switch Statement über den aktuellen Zustand und für jeden Zustand ein switch Statement über den empfangenen Event.&lt;br /&gt;
; eine Funktion mit dem Namen &amp;lt;xx&amp;gt;_init (extern)&lt;br /&gt;
: Hier werden Variableninitialisierungen gemacht und die ersten subscribe Aufrufe um Events zu abonnieren. Diese Funktion wird beim Systemstart vom Main Modul aufgerufen.&lt;br /&gt;
; eine Funktion mit dem Namen &amp;lt;xx&amp;gt;_eventHandler (extern)&lt;br /&gt;
: Ist die Funktion die vom Scheduler aufgerufen wird damit die Statemaschine mit dem aktuellen Event, sofern vorhanden, durchlaufen wird.&lt;br /&gt;
; optional Funktionen mit den Namen &amp;lt;xx&amp;gt;_subscribe_&amp;lt;event&amp;gt; und &amp;lt;xx&amp;gt;_unsubscribe_&amp;lt;event&amp;gt; (extern)&lt;br /&gt;
: für jeden Event den dieser Modul verschicken kann ist sowohl eine Subscribe Funktion als auch ein Unsubscribe Funktion vorhanden. Mit diesen Funktionen kann der Event von einem anderen Modul abboniert werden.&lt;br /&gt;
; eine Funktion mit dem Namen &amp;lt;xx&amp;gt;_receiveEvent (intern)&lt;br /&gt;
: ReceiveEvent ist eigentlich eine interne Funktion (wird also nicht im Header File deklariert), der Pointer auf diese Funktion wird allerdings als Callback beim Subscribe übergeben damit der Event dem Modul zugestellt werden kann.&lt;br /&gt;
&lt;br /&gt;
=== Module ===&lt;br /&gt;
Im folgenden sind alle Module und deren Hauptfunktionen aufgelistet.&lt;br /&gt;
&lt;br /&gt;
==== Analog-Modul ====&lt;br /&gt;
Digitalisieren der Analogeingänge&lt;br /&gt;
 Dateien: analog.c&lt;br /&gt;
          analog.h&lt;br /&gt;
Dieser Modul ist abgeleitet von den gleichnamigen Dateien der original NIBObee Bibliothek. Dies war notwendig da wir zusätzliche Liniensensoren verwenden und deren Ansteuerung in gleicher Weise erfolgen sollte. Das bedeutet dass für die entsprechenden Analogeingänge Messungen mit ein- und ausgeschalteten IR-LEDs durchgeführt werden müssen. Außerdem wurde, entsprechend dem Datenblatt des ATMega16 die Behandlung der Messung der Batteriespannung verbessert. Da hier die Referenzspannung umgeschalten wird muss eine Messung verworfen werden bevor mit einem richtigen Ergebnis gerechnet werden kann. Das wurde in der Originalbibliothek nicht berücksichtigt.&lt;br /&gt;
Die einzelnen Werte werden weiterhin über einen A/D-Wandler ermittelt und zwischengespeichert. Es gibt nun 13 analoge Werte (statt bisher 11) die zyklisch digitalisiert werden. Dieser Vorgang wird mit einer Frequenz von ca 117 kHz durchgeführt, d.h. dass jeder dieser Werte ca. alle 111 µs (statt bisher 94 µs) aktualisiert wird.&lt;br /&gt;
&lt;br /&gt;
==== Line-Modul ====&lt;br /&gt;
Ermitteln der Werte der Liniensensoren&lt;br /&gt;
 Dateien: line.c&lt;br /&gt;
          line.h&lt;br /&gt;
Dieser Modul ersetzt die originalen Bibliotheksfunktionen der Liniensensoren. Dies war notwendig da wir zusätzliche Liniensensoren verwenden.&lt;br /&gt;
&lt;br /&gt;
Die Werte der Liniensensoren können nun mit der Funktion&lt;br /&gt;
&amp;lt;code&amp;gt;ln_get(index)&amp;lt;/code&amp;gt;&lt;br /&gt;
gelesen werden. Die Werte selbst werden über den [[NIBObee#Analog-Modul|Analog-Modul]] ermittelt.&lt;br /&gt;
&lt;br /&gt;
==== Bluetooth-Modul ====&lt;br /&gt;
Wickelt die Kommunikation über den Bluetooth Modul ab. Zur Kommunikation wird allerdings nur der USART als Terminal angesprochen, der Bluetooth Stack ist im [[BTM-222]] implementiert.&lt;br /&gt;
 Dateien: bluetooth.c&lt;br /&gt;
          bluetooth.h&lt;br /&gt;
&lt;br /&gt;
==== Common-Modul ====&lt;br /&gt;
Stellt gemeinsame Funktionen zurVerfügung&lt;br /&gt;
 Dateien: common.c&lt;br /&gt;
          common.h&lt;br /&gt;
&lt;br /&gt;
==== Distance-Modul ====&lt;br /&gt;
Behandelt die Odometrie Sensoren&lt;br /&gt;
 Dateien: distance.c&lt;br /&gt;
          distance.h&lt;br /&gt;
&lt;br /&gt;
==== Drive-Modul ====&lt;br /&gt;
Bewegt den NIBObee&lt;br /&gt;
 Dateien: drive.c&lt;br /&gt;
          drive.h&lt;br /&gt;
&lt;br /&gt;
==== Follow-Modul ====&lt;br /&gt;
Ist für die Linienverfolgung zuständig&lt;br /&gt;
 Dateien: follow.c&lt;br /&gt;
          follow.h&lt;br /&gt;
&lt;br /&gt;
==== MaDeCo-Modul ====&lt;br /&gt;
Behandelt das MaDeCo Protokoll&lt;br /&gt;
 Dateien: madeco.c&lt;br /&gt;
          madeco.h&lt;br /&gt;
&lt;br /&gt;
==== Main-Modul ====&lt;br /&gt;
Scheduler und zentraler Taktgeber&lt;br /&gt;
 Dateien: main.c&lt;br /&gt;
          main.h&lt;br /&gt;
&lt;br /&gt;
==== Sensor-Modul ====&lt;br /&gt;
Ist für die &amp;quot;Fühler&amp;quot; zuständig&lt;br /&gt;
 Dateien: follow.c&lt;br /&gt;
          follow.h&lt;br /&gt;
&lt;br /&gt;
=== Applikationen ===&lt;br /&gt;
==== Labyrinth erkunden ====&lt;br /&gt;
&lt;br /&gt;
==== Kürzesten Weg durch Labyrinth ====&lt;br /&gt;
&lt;br /&gt;
==== Kalibrierung ====&lt;br /&gt;
Zur Kalibrierung fährt der NIBObee ein Viereck entlang dass genau die Seitenlänge eines der Felder des Labyrinths hat. Dies ist notwendig um relativ einfach die Karte des Labyrinths erstellen zu können.&lt;br /&gt;
&lt;br /&gt;
=== Protokolle und deren Implementierung ===&lt;br /&gt;
==== [[MaDeCo]] ====&lt;br /&gt;
===== Interface Definition =====&lt;br /&gt;
* int set_opmode(OPMODE)&lt;br /&gt;
* int send_waypoint(WAYPOINT)&lt;br /&gt;
* int direct(DIRECTION[])&lt;br /&gt;
* int ack()&lt;br /&gt;
&lt;br /&gt;
==== Schnittstelle [[MaDeCo]] - RS232-Schnittstelle ====&lt;br /&gt;
* pairing&lt;br /&gt;
* Konfigurations-Commands&lt;br /&gt;
* ack&lt;br /&gt;
* read_command&lt;br /&gt;
* send_command&lt;br /&gt;
&lt;br /&gt;
=== Steuerungssoftware ===&lt;br /&gt;
==== Bluetooth Modul einschalten ====&lt;br /&gt;
Durch Bewegen der &amp;quot;Fühler&amp;quot; der NIBObee nach oben bis Einrasten wird das Bluetooth Modul eingeschalten.&lt;br /&gt;
Daraufhin muss auf eingehenden Bluetooth Traffic gelauscht werden.&lt;br /&gt;
&lt;br /&gt;
==== Blink Codes ====&lt;br /&gt;
Bestimmte Events oder Commands lösen bestimmte Blink- oder Leuchtmuster der Status LEDs aus.&lt;br /&gt;
&#039;&#039;&#039;TODO:&#039;&#039;&#039; Spezifikation der Blink Codes&lt;br /&gt;
&lt;br /&gt;
==== Gerade fahren ====&lt;br /&gt;
Das Problem beim geradeaus fahren ist dass der Roboter von der Spur abweichen kann und dann neu ausgerichtet werden muss. Üblicherweise erfolgt das mit Hilfe der Liniensensoren indem, sobald einer der seitlichen Sensoren die Linie erkennt, durch beschleunigen oder bremsen eines Rades in diese Richtung korrigierend gelenkt wird.&lt;br /&gt;
&lt;br /&gt;
In unserem Fall müssen wir diese Korrektur solange verzögern bis der seitliche Liniensensor eine mögliche Kreuzung passiert hat. Erst danach können wir feststellen ob wir nur die schwarze Linie einer Kreuzung überfahren sind oder ob tatsächlich eine Abweichung vorliegt. Die Anzahl der zu ignorierenden Odometrie-Impule kann folgendermaßen errechnet werden:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;Impulse pro Radumdrehung&amp;gt; / &amp;lt;Radumfang&amp;gt; * &amp;lt;Linienbreite&amp;gt; =&lt;br /&gt;
 20 / 11,8 * 1 = 1,69491525&lt;br /&gt;
&lt;br /&gt;
Wir werden also nur zwei Impulse abwarten bevor wir mit der Korrektur beginnen&lt;br /&gt;
&lt;br /&gt;
===== Funktionsaufteilung =====&lt;br /&gt;
Die Zuständigkeiten für diese Aufgabe sind wie folgt:&lt;br /&gt;
;drive Modul&lt;br /&gt;
:sorgt für die Steuerung der Motoren. Reduzieren der Geschwindigkeit eines Rades um eine ausgleichende Kurve zu fahren und stoppen wenn das Ende der geraden Linie erreicht wurde. Dazu aboniert der Modul die Events des line Modul die eine Abweichung von der Linie melden und vom distance Modul den Event zum fahren der Distanz zwischen Liniensensoren und Achse der Räder.&lt;br /&gt;
;line Modul&lt;br /&gt;
:prüft zyklisch die position der Linie unter dem NIBObee und meldet Abweichungen mittels Events. Dieses Melden wird allerdings verzögert bis zumindest die Breite der Linie überfahren wurde. Dazu aboniert der Modul den Event vom distance Modul den Event zum fahren der der Breite der Linie.&lt;br /&gt;
;distance Modul&lt;br /&gt;
:meldet auf Anforderung das zurücklegen einer Strecke in der Länge der Distanz zwischen Liniensensoren und Achse der Räder oder der Breite der Linie.&lt;br /&gt;
&lt;br /&gt;
==== Kreuzung fahren ====&lt;br /&gt;
An einer Kreuzung wird abgebogen indem der NIBObee zuerst unbeirrt geradeaus fährt bis die Achse genau auf dem Mittelpunkt der Kreuzung zu stehen kommt. Danach wird eine Drehung nach rechts oder links durchgeführt bis sich die Linie wieder genau unter dem mittleren Sensor befindet.&lt;br /&gt;
&lt;br /&gt;
Die Sensoren sind von der Achse 10,4 cm entfernt, eine Radumdrehung bewegt den NIBObee um 11,8 cm weiter und bei dieser Umdrehung werden vom Odometriesensor 20 Impulse abgegeben. Die Linienbreite wird 2 cm betragen. Daher errechnet sich die Strecke die nach Erkennen der Kreuzung gefahren werden muss folgendermassen:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;Impulse pro Radumdrehung&amp;gt; / &amp;lt;Radumfang&amp;gt; * (&amp;lt;Achsabstand&amp;gt; - &amp;lt;halbe Linienbreite&amp;gt;) =&lt;br /&gt;
 20 / 11,8 * (10,4 - 0,5) = 16,779661&lt;br /&gt;
&lt;br /&gt;
Nach passieren der Kreuzung muss der NIBObee also noch 17 Impulse über den Odometriesensor empfangen bevor er stoppt.&lt;br /&gt;
&lt;br /&gt;
== Risikoanalyse ==&lt;br /&gt;
Im Folgenden wird versucht für die möglichen Risikopunkte Alternativen aufzuzeigen.&lt;br /&gt;
&lt;br /&gt;
; ATmega16 ist nicht Leisungsfägig genug&lt;br /&gt;
: Es kann auf den [http://www.nicai-systems.com/de/zubehoer/nibobee-tuning-kit.html Tuning-Kit von Nicai-Systems] zurückgerifffen werden. Dies könnte eine nicht akzeptable Verzögerung verursachen (erkennen, bestellen, NIBObee umrüsten)&lt;br /&gt;
&lt;br /&gt;
: Ein beliebiger PIN-kompatiber Microcontroller ATmega... wird statt dem ATmega16 eingesetzt. Die funktioniert soange der Ersatz-µC mit der Frequenz vom 15 MHz betrieben werden kann. Wichtig ist auch dass es adaptierte Bibliotheken gibt die auf den Ersatz-µC abgestimmt sind (z.B. andere Register oder geänderte Adressen für Register, ...)&lt;br /&gt;
&lt;br /&gt;
; Signale am UART mit Bordspannung im Gegensatz zu RS232-Level (12V)&lt;br /&gt;
: Die Signale am UART werden mit Bordspannung erzeugt/erwartet. Für die Kommunikation mit dem BT-Modul ist daher keine Anpassung durchzuführen.&lt;br /&gt;
&lt;br /&gt;
: Soll zu Testzwecken ein PC über RS232 angeschalten werden ist unbedingt auf die Spannung achten. Möglicherweise verwendet ein USB-RS232 Adapter nicht die 12V sonder nur 5V.&lt;br /&gt;
&lt;br /&gt;
== Open Issues ==&lt;br /&gt;
* Es muss noch überprüft werden ob die NIBObee Hardware ausreichend leistungsfähig ist oder ein Upgrade gemacht werden muss.&lt;br /&gt;
* Wie kann das verlassen der Spur von dem Überfahren einer Kreuzung unterschieden werden? Wenn es hier zu Problemen kommt könnten zwei zusätzliche lichtempfindliche Sensoren rechts und links oder noch ein Element mit drei zusätzlichen Sensoren auf Höhe der Achsen angebracht werden -&amp;gt; Mehraufwand!&lt;br /&gt;
* Soll Aktivierung der BT-Schnittstelle manuell erfolgen?&lt;br /&gt;
* Soll der Betriebsmodus gewählt werden können?&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* [http://www.nicai-systems.de/nibobee.html NIBObee Homepage bei Nicai Systems]&lt;br /&gt;
* [http://download.nicai-systems.com/nibo/Tutorial_NIBObee_20091123.pdf NIBObee - Tutorial zur Programmierung]&lt;br /&gt;
* [http://www.nicai-systems.com/de/zubehoer/nibobee-tuning-kit.html NIBObee - Tuning-Kit von Nicai-Systems]&lt;br /&gt;
* [http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/Der_UART Tutorial zur USART Programmierung]&lt;br /&gt;
[[Kategorie:FH]]&lt;/div&gt;</summary>
		<author><name>Alois</name></author>
	</entry>
	<entry>
		<id>https://wiki.callooh.com/index.php?title=NIBObee&amp;diff=903</id>
		<title>NIBObee</title>
		<link rel="alternate" type="text/html" href="https://wiki.callooh.com/index.php?title=NIBObee&amp;diff=903"/>
		<updated>2011-06-24T22:51:41Z</updated>

		<summary type="html">&lt;p&gt;Alois: /* Aufgaben */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;NIBObee ist der Roboter der im Projekt [[RoLoMa]] verwendet wird.&lt;br /&gt;
== Technische Daten ==&lt;br /&gt;
Hier wird nur ein kleiner Ausschnitt der technischen Daten dargestellt. Es handelt sich nur um jenen Teil der für die Bewertung oder Implementierung der gestellten Aufgaben relevant ist:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Art&lt;br /&gt;
!Typ&lt;br /&gt;
!Bemerkung&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|Mikrocontroller&lt;br /&gt;
|ATMEL ATMega16, , 15 MHz&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|Integrierter UART wird verwendet um den Bluetooth Modul anzubinden.&lt;br /&gt;
&lt;br /&gt;
Sollte die Leistung nicht ausreichen kann entweder der Erweiterungssatz von Nicai-Systems verwendet werden oder nur der Controller wird gegen einen Pinkompatiblen Typ ausgetauscht (z.B. ATMega32, ATMega644, ATMega1284)&lt;br /&gt;
|-&lt;br /&gt;
|Flash:	16	kB&lt;br /&gt;
|-&lt;br /&gt;
|RAM:	1	kB&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|Maße&lt;br /&gt;
|Radumfang: 11,8 cm&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|Diese Maße sind wichtig um den NIBObee so exakt wie möglich am Mittelpunkt des Labyrinthfeldes positionieren zu können.&lt;br /&gt;
|-&lt;br /&gt;
|Abstand Liniensensor zu Radachse: 10,4 cm&lt;br /&gt;
|-&lt;br /&gt;
|Impulse pro Umdrehung: 20&lt;br /&gt;
|}&lt;br /&gt;
=== Ports ===&lt;br /&gt;
Über den UART wird der Bluetooth Modul [[BTM-222]] angebunden. Am NIObee ist diese Schnittstelle am Port X5 verfügbar.&lt;br /&gt;
&lt;br /&gt;
Zwei Analoge Eingänge werden für die Fototransistoren der zusätzlichen Linienerkennung verwendet. Diese sind am NIBObee am Port X1 verfügbar.&lt;br /&gt;
&lt;br /&gt;
Ein Ausgang dient zum ein- und ausschalten der zusätzlichen IR-LEDs. Dafür wird der PIN 1 des Port X4 verwendet.&lt;br /&gt;
&lt;br /&gt;
=== Resourcen ===&lt;br /&gt;
Folgende Resourcen werden für unsere Implementierung verwendet (&#039;&#039;kursiv&#039;&#039; markierte Resourcen werden bereits durch die Bibliothek belegt):&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Resource&lt;br /&gt;
!Verwendung&lt;br /&gt;
!Interrupts&lt;br /&gt;
!Dateien&lt;br /&gt;
|-&lt;br /&gt;
|Timer 1&lt;br /&gt;
|Motor PWM&lt;br /&gt;
|TIMER1_COMPA_vect, TIMER1_COMPB_vect&lt;br /&gt;
|motpwm.c&lt;br /&gt;
|-&lt;br /&gt;
|ADC&lt;br /&gt;
|Analog, Line&lt;br /&gt;
|ADC_vect&lt;br /&gt;
|analog.c, line.c&lt;br /&gt;
|-&lt;br /&gt;
|EEPROM&lt;br /&gt;
|Line (12 Byte)&lt;br /&gt;
|&lt;br /&gt;
|line.c&lt;br /&gt;
|-&lt;br /&gt;
|Ext. IRQ&lt;br /&gt;
|Odometrie&lt;br /&gt;
|INT0_vect, INT1_vect&lt;br /&gt;
|odometry.c&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Eine für den NIBObee allgemein gültige Auflistung findet man im [http://www.nibo-roboter.de/wiki/NIBObee/Lib/Resourcen NIBObee Wiki].&lt;br /&gt;
&lt;br /&gt;
=== Besondere Erkenntnisse ===&lt;br /&gt;
&lt;br /&gt;
==== ATMega16 ====&lt;br /&gt;
Die Speichergröße scheint durchaus ausreichend zu sein. Nach Implementierung aller wichtigen Grundfunktionen ist erst weniger als die Hälfte des Programmspeichers belegt.&lt;br /&gt;
&lt;br /&gt;
Problematisch war anfangs nur der geringe RAM der auch alle konstanten Strings enthält. Dies ist zwar nicht notwendig, ist mit dieser Entwicklungsumgebung allerdings so gelöst. Besonders die umfangreichen Debug-Informationen die über Bluetooth an den PC gesendet werden führten dabei zu massiven Problemen. Durch kurze symbolische Debugausgaben, die dann am PC im eigens entwickelten Terminalprogramm auf sprechende symbolische Ausgabe konvertiert wird, konnte das Problem behoben werden.&lt;br /&gt;
&lt;br /&gt;
==== Liniensensoren ====&lt;br /&gt;
Es hat sich, nach einigen Fehlschlägen bei der Linienverfolung, herausgestellt dass es ungünstig ist den NIBObee in eine optisch ansprechende waagrechte Position zu bringen indem eine kleinere Halbkugel auf der Unterseite angebracht wird. Der Grund: Nur mit der original Halbkugel und dem damit nach vorne ansteigenden Bodenabstand sind die IR-LED&#039;s weit genug vom Boden entfernt um einen Lichtkegen zu erzeugen der auch vernünftig vom Phototransistor erfasst werden kann. Bei waagrechter Ausrichtung des NIBObee ist dieser Kegel, aufgrund des geringeren Abstands zum Boden, zu klein!&lt;br /&gt;
&lt;br /&gt;
=== Bibliotheksfunktionen ===&lt;br /&gt;
==== Liniensensoren ====&lt;br /&gt;
Die original NIBObee Biliothek wird nicht verwendet. Sie wurde durch eine eigene Implementierung im [[NIBObee#Line-Modul|Line-Modul]] ersetzt. Der Grund ist die Notwendigkeit die zusätzlichen Liniensensoren in der gleichen Weise wie die drei Originalsensoren zu behandeln.&lt;br /&gt;
&lt;br /&gt;
==== Motorensteuerung ====&lt;br /&gt;
 motpwm.h&lt;br /&gt;
Die Motoren des NIBObee werden mit PWM ([http://de.wikipedia.org/wiki/Pulsweitenmodulation Pulsweitenmodulation]) angesteuert. Das garantiert natürlich ohne Regelung noch keinen Gleichlauf der beiden Motoren was sich je nach Zustand des Getriebes in einer weiteren oder engernen Kurve zeigt.&lt;br /&gt;
 motpid.h&lt;br /&gt;
Hier stehen Funktionen zur Verfügung die mit Hilfe der Odometrie die Motoren regeln. Diese Funktionen sind für unsere Zwecke allerdings nicht geeignet.&lt;br /&gt;
&lt;br /&gt;
== Aufgaben ==&lt;br /&gt;
Folgende Aufgaben sind im Rahmen des Projekts [[RoLoMa]] vom NIBObee Team zu lösen:&lt;br /&gt;
* Herstellung der Bluetooth Hardware-Erweiterung&lt;br /&gt;
* Softwaremodul zum Bedienen der Bluetooth-Schnittstelle via RS232&lt;br /&gt;
* Softwaremodul zum Erkennen der Linie im Labyrinth und im speziellen der unterschiedlichen Kreuzungstypen&lt;br /&gt;
* Messen des zurückgelegten Weges&lt;br /&gt;
* Steuerung, die den Abstand des Sensors zur Radachse berücksichtigt um den Roboter an der korrekten Stelle um die eigene Achse zu drehen&lt;br /&gt;
* Erstellen eines Abbilds des Labyrinths im Speicher und navigieren bis der Roboter wieder am Startpunkt gelandet ist (z.B. immer Links abbiegen)&lt;br /&gt;
* Implementieren des [[MaDeCo]] Protokolls&lt;br /&gt;
&lt;br /&gt;
Nach einigen ersten Tests ist folgende weitere Aufgabe hinzugekommen:&lt;br /&gt;
* Herstellung der Hardware-Erweiterung mit zusätzlichen Liniensensoren&lt;br /&gt;
&lt;br /&gt;
=== Aufgabenteilung ===&lt;br /&gt;
Alle Aufgaben wurden im Team gelöst wobei für manche dieser Aufgaben der Schwerpunkt bei nur einem oder zwei Teammitgliedern lag. Die folgende Tabelle gibt eine ungefähre Zuordnung der Aufgaben auf die einzelnen Personen:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|colspan=&amp;quot;3&amp;quot;|&#039;&#039;&#039;Dokumentation&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|&amp;amp;nbsp; &lt;br /&gt;
|Projektfortschritt, Controlling&lt;br /&gt;
|Robert Peterfi&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Hardware, Software (Wiki)&lt;br /&gt;
|Alois Pochmann, Reinhard Weismann&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Codedokumentation&lt;br /&gt;
|Robert Peterfi, Alois Pochmann, Reinhard Weismann&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|colspan=&amp;quot;3&amp;quot;|&#039;&#039;&#039;Hardware&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|&amp;amp;nbsp; &lt;br /&gt;
|Entwurf, Design&lt;br /&gt;
|Alois Pochmann&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Bestellung, Aufbau&lt;br /&gt;
|Robert Peterfi, Alois Pochmann&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Test&lt;br /&gt;
|Robert Peterfi, Alois Pochmann, Reinhard Weismann&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|colspan=&amp;quot;3&amp;quot;|&#039;&#039;&#039;Software&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;8&amp;quot;|&amp;amp;nbsp; &lt;br /&gt;
|Design, Funktionsaufteilung&lt;br /&gt;
|Robert Peterfi, Alois Pochmann, Reinhard Weismann&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Kommunikationsprotokoll&lt;br /&gt;
|Reinhard Weismann&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Scheduler, Event Handling, zentrale Funktionen&lt;br /&gt;
|Alois Pochmann&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Sensoren (Hardwareanbindung)&lt;br /&gt;
|Robert Peterfi&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Kalibrierung&lt;br /&gt;
|Robert Peterfi&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Odometrie&lt;br /&gt;
|Reinhard Weismann&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Bewegungssteuerung&lt;br /&gt;
|Robert Peterfi, Alois Pochmann, Reinhard Weismann&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Testapplikation (Windows)&lt;br /&gt;
|Alois Pochmann&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
&lt;br /&gt;
=== Bluetooth ===&lt;br /&gt;
Der Bluetooth Modul ist im Detail auf den Seiten des [[BTM-222]] beschrieben.&lt;br /&gt;
&lt;br /&gt;
=== Liniensensoren ===&lt;br /&gt;
Zum Erkennen der Kreuzungen bei gleichzeitigem folgen der Linie war es notwendig zusätzliche Liniensensoren zu verwenden. Diese wurden mit einer Zusätzplatine in einer Reihe mit den bereits vorhandenen Liniensensoren, allerdings so weit wie möglich linke und rechts außen, montiert. Das einlesen der Analogwerte erfolgt über die beiden Analogeingänge am Stecker X1. Die IR-LEDs sind, analog zu den bestehenden IR-LEDs der vorhandenen Liniensensoren, über den Ausgang 1 am Stecker X4 schaltbar. Dies ist notwendig da jeweils eine Messung mit eingschalteter LED und eine mit ausgeschalteter LED durchgeführt wird. Damit wird der Einfluß des Umgebungslichts korrigiert.&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
Die Aufgaben der Software sollen in möglichst unabhängigen Modulen realisiert werden um das Testen einfacher zu gestalten. Die einzelnen Module sind im Folgenden beschrieben.&lt;br /&gt;
&lt;br /&gt;
=== Architektur ===&lt;br /&gt;
Das Gesamtsystem besteht aus einem zentralen Taktgeber, einem Scheduler und mehreren State Maschinen. Die Kommunikation erfolgt ausschließlich über Events. Die Module können mittels Subscribe einen Event, den ein anderer Modul zur Verfügung steht, abonnieren.&lt;br /&gt;
&lt;br /&gt;
==== Systemtakt, Scheduler ====&lt;br /&gt;
Im Main Modul befindet sich der zentrale Taktgeber der aus dem Interrupt des Timer 2 einen gleichmäßigen Takt von 100Hz erzeugt. Dieser Takt kann von anderen Modulen verwendet werden um zyklische Aufgaben zu erfüllen (z.B. lesen der Liniensensoren). Im Main Modul befindet sich auch der Scheduler der ganz einfach in der Endlosschleife sequenziell jeden Modul aufruft um anstehende Events zu bearbeiten.&lt;br /&gt;
&lt;br /&gt;
==== State / Event Maschinen ====&lt;br /&gt;
Die State / Event Maschinen sind in allen Modulen gleich aufgebaut. Es gibt die folgenden Funktionen (wobei statt &amp;quot;&amp;lt;xx&amp;gt;&amp;quot; das Kürzel des Moduls steht, z.B &amp;quot;dr&amp;quot; für Drive):&lt;br /&gt;
; eine Funktion mit dem Namen &amp;lt;xx&amp;gt;_main (intern)&lt;br /&gt;
: Das ist die eigentliche State Maschine. Wird nicht direkt vom Scheduler aufgerufen sondern über die Funktion &amp;lt;xx&amp;gt;_eventHandler. Hier gibt es ein switch Statement über den aktuellen Zustand und für jeden Zustand ein switch Statement über den empfangenen Event.&lt;br /&gt;
; eine Funktion mit dem Namen &amp;lt;xx&amp;gt;_init (extern)&lt;br /&gt;
: Hier werden Variableninitialisierungen gemacht und die ersten subscribe Aufrufe um Events zu abonnieren. Diese Funktion wird beim Systemstart vom Main Modul aufgerufen.&lt;br /&gt;
; eine Funktion mit dem Namen &amp;lt;xx&amp;gt;_eventHandler (extern)&lt;br /&gt;
: Ist die Funktion die vom Scheduler aufgerufen wird damit die Statemaschine mit dem aktuellen Event, sofern vorhanden, durchlaufen wird.&lt;br /&gt;
; optional Funktionen mit den Namen &amp;lt;xx&amp;gt;_subscribe_&amp;lt;event&amp;gt; und &amp;lt;xx&amp;gt;_unsubscribe_&amp;lt;event&amp;gt; (extern)&lt;br /&gt;
: für jeden Event den dieser Modul verschicken kann ist sowohl eine Subscribe Funktion als auch ein Unsubscribe Funktion vorhanden. Mit diesen Funktionen kann der Event von einem anderen Modul abboniert werden.&lt;br /&gt;
; eine Funktion mit dem Namen &amp;lt;xx&amp;gt;_receiveEvent (intern)&lt;br /&gt;
: ReceiveEvent ist eigentlich eine interne Funktion (wird also nicht im Header File deklariert), der Pointer auf diese Funktion wird allerdings als Callback beim Subscribe übergeben damit der Event dem Modul zugestellt werden kann.&lt;br /&gt;
&lt;br /&gt;
=== Module ===&lt;br /&gt;
Im folgenden sind alle Module und deren Hauptfunktionen aufgelistet.&lt;br /&gt;
&lt;br /&gt;
==== Analog-Modul ====&lt;br /&gt;
Digitalisieren der Analogeingänge&lt;br /&gt;
 Dateien: analog.c&lt;br /&gt;
          analog.h&lt;br /&gt;
Dieser Modul ist abgeleitet von den gleichnamigen Dateien der original NIBObee Bibliothek. Dies war notwendig da wir zusätzliche Liniensensoren verwenden und deren Ansteuerung in gleicher Weise erfolgen sollte. Das bedeutet dass für die entsprechenden Analogeingänge Messungen mit ein- und ausgeschalteten IR-LEDs durchgeführt werden müssen. Außerdem wurde, entsprechend dem Datenblatt des ATMega16 die Behandlung der Messung der Batteriespannung verbessert. Da hier die Referenzspannung umgeschalten wird muss eine Messung verworfen werden bevor mit einem richtigen Ergebnis gerechnet werden kann. Das wurde in der Originalbibliothek nicht berücksichtigt.&lt;br /&gt;
Die einzelnen Werte werden weiterhin über einen A/D-Wandler ermittelt und zwischengespeichert. Es gibt nun 13 analoge Werte (statt bisher 11) die zyklisch digitalisiert werden. Dieser Vorgang wird mit einer Frequenz von ca 117 kHz durchgeführt, d.h. dass jeder dieser Werte ca. alle 111 µs (statt bisher 94 µs) aktualisiert wird.&lt;br /&gt;
&lt;br /&gt;
==== Line-Modul ====&lt;br /&gt;
Ermitteln der Werte der Liniensensoren&lt;br /&gt;
 Dateien: line.c&lt;br /&gt;
          line.h&lt;br /&gt;
Dieser Modul ersetzt die originalen Bibliotheksfunktionen der Liniensensoren. Dies war notwendig da wir zusätzliche Liniensensoren verwenden.&lt;br /&gt;
&lt;br /&gt;
Die Werte der Liniensensoren können nun mit der Funktion&lt;br /&gt;
&amp;lt;code&amp;gt;ln_get(index)&amp;lt;/code&amp;gt;&lt;br /&gt;
gelesen werden. Die Werte selbst werden über den [[NIBObee#Analog-Modul|Analog-Modul]] ermittelt.&lt;br /&gt;
&lt;br /&gt;
==== Bluetooth-Modul ====&lt;br /&gt;
Wickelt die Kommunikation über den Bluetooth Modul ab. Zur Kommunikation wird allerdings nur der USART als Terminal angesprochen, der Bluetooth Stack ist im [[BTM-222]] implementiert.&lt;br /&gt;
 Dateien: bluetooth.c&lt;br /&gt;
          bluetooth.h&lt;br /&gt;
&lt;br /&gt;
==== Common-Modul ====&lt;br /&gt;
Stellt gemeinsame Funktionen zurVerfügung&lt;br /&gt;
 Dateien: common.c&lt;br /&gt;
          common.h&lt;br /&gt;
&lt;br /&gt;
==== Distance-Modul ====&lt;br /&gt;
Behandelt die Odometrie Sensoren&lt;br /&gt;
 Dateien: distance.c&lt;br /&gt;
          distance.h&lt;br /&gt;
&lt;br /&gt;
==== Drive-Modul ====&lt;br /&gt;
Bewegt den NIBObee&lt;br /&gt;
 Dateien: drive.c&lt;br /&gt;
          drive.h&lt;br /&gt;
&lt;br /&gt;
==== Follow-Modul ====&lt;br /&gt;
Ist für die Linienverfolgung zuständig&lt;br /&gt;
 Dateien: follow.c&lt;br /&gt;
          follow.h&lt;br /&gt;
&lt;br /&gt;
==== MaDeCo-Modul ====&lt;br /&gt;
Behandelt das MaDeCo Protokoll&lt;br /&gt;
 Dateien: madeco.c&lt;br /&gt;
          madeco.h&lt;br /&gt;
&lt;br /&gt;
==== Main-Modul ====&lt;br /&gt;
Scheduler und zentraler Taktgeber&lt;br /&gt;
 Dateien: main.c&lt;br /&gt;
          main.h&lt;br /&gt;
&lt;br /&gt;
==== Sensor-Modul ====&lt;br /&gt;
Ist für die &amp;quot;Fühler&amp;quot; zuständig&lt;br /&gt;
 Dateien: follow.c&lt;br /&gt;
          follow.h&lt;br /&gt;
&lt;br /&gt;
=== Applikationen ===&lt;br /&gt;
==== Labyrinth erkunden ====&lt;br /&gt;
&lt;br /&gt;
==== Kürzesten Weg durch Labyrinth ====&lt;br /&gt;
&lt;br /&gt;
==== Kalibrierung ====&lt;br /&gt;
Zur Kalibrierung fährt der NIBObee ein Viereck entlang dass genau die Seitenlänge eines der Felder des Labyrinths hat. Dies ist notwendig um relativ einfach die Karte des Labyrinths erstellen zu können.&lt;br /&gt;
&lt;br /&gt;
=== Protokolle und deren Implementierung ===&lt;br /&gt;
==== [[MaDeCo]] ====&lt;br /&gt;
===== Interface Definition =====&lt;br /&gt;
* int set_opmode(OPMODE)&lt;br /&gt;
* int send_waypoint(WAYPOINT)&lt;br /&gt;
* int direct(DIRECTION[])&lt;br /&gt;
* int ack()&lt;br /&gt;
&lt;br /&gt;
==== Schnittstelle [[MaDeCo]] - RS232-Schnittstelle ====&lt;br /&gt;
* pairing&lt;br /&gt;
* Konfigurations-Commands&lt;br /&gt;
* ack&lt;br /&gt;
* read_command&lt;br /&gt;
* send_command&lt;br /&gt;
&lt;br /&gt;
=== Steuerungssoftware ===&lt;br /&gt;
==== Bluetooth Modul einschalten ====&lt;br /&gt;
Durch Bewegen der &amp;quot;Fühler&amp;quot; der NIBObee nach oben bis Einrasten wird das Bluetooth Modul eingeschalten.&lt;br /&gt;
Daraufhin muss auf eingehenden Bluetooth Traffic gelauscht werden.&lt;br /&gt;
&lt;br /&gt;
==== Blink Codes ====&lt;br /&gt;
Bestimmte Events oder Commands lösen bestimmte Blink- oder Leuchtmuster der Status LEDs aus.&lt;br /&gt;
&#039;&#039;&#039;TODO:&#039;&#039;&#039; Spezifikation der Blink Codes&lt;br /&gt;
&lt;br /&gt;
==== Gerade fahren ====&lt;br /&gt;
Das Problem beim geradeaus fahren ist dass der Roboter von der Spur abweichen kann und dann neu ausgerichtet werden muss. Üblicherweise erfolgt das mit Hilfe der Liniensensoren indem, sobald einer der seitlichen Sensoren die Linie erkennt, durch beschleunigen oder bremsen eines Rades in diese Richtung korrigierend gelenkt wird.&lt;br /&gt;
&lt;br /&gt;
In unserem Fall müssen wir diese Korrektur solange verzögern bis der seitliche Liniensensor eine mögliche Kreuzung passiert hat. Erst danach können wir feststellen ob wir nur die schwarze Linie einer Kreuzung überfahren sind oder ob tatsächlich eine Abweichung vorliegt. Die Anzahl der zu ignorierenden Odometrie-Impule kann folgendermaßen errechnet werden:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;Impulse pro Radumdrehung&amp;gt; / &amp;lt;Radumfang&amp;gt; * &amp;lt;Linienbreite&amp;gt; =&lt;br /&gt;
 20 / 11,8 * 1 = 1,69491525&lt;br /&gt;
&lt;br /&gt;
Wir werden also nur zwei Impulse abwarten bevor wir mit der Korrektur beginnen&lt;br /&gt;
&lt;br /&gt;
===== Funktionsaufteilung =====&lt;br /&gt;
Die Zuständigkeiten für diese Aufgabe sind wie folgt:&lt;br /&gt;
;drive Modul&lt;br /&gt;
:sorgt für die Steuerung der Motoren. Reduzieren der Geschwindigkeit eines Rades um eine ausgleichende Kurve zu fahren und stoppen wenn das Ende der geraden Linie erreicht wurde. Dazu aboniert der Modul die Events des line Modul die eine Abweichung von der Linie melden und vom distance Modul den Event zum fahren der Distanz zwischen Liniensensoren und Achse der Räder.&lt;br /&gt;
;line Modul&lt;br /&gt;
:prüft zyklisch die position der Linie unter dem NIBObee und meldet Abweichungen mittels Events. Dieses Melden wird allerdings verzögert bis zumindest die Breite der Linie überfahren wurde. Dazu aboniert der Modul den Event vom distance Modul den Event zum fahren der der Breite der Linie.&lt;br /&gt;
;distance Modul&lt;br /&gt;
:meldet auf Anforderung das zurücklegen einer Strecke in der Länge der Distanz zwischen Liniensensoren und Achse der Räder oder der Breite der Linie.&lt;br /&gt;
&lt;br /&gt;
==== Kreuzung fahren ====&lt;br /&gt;
An einer Kreuzung wird abgebogen indem der NIBObee zuerst unbeirrt geradeaus fährt bis die Achse genau auf dem Mittelpunkt der Kreuzung zu stehen kommt. Danach wird eine Drehung nach rechts oder links durchgeführt bis sich die Linie wieder genau unter dem mittleren Sensor befindet.&lt;br /&gt;
&lt;br /&gt;
Die Sensoren sind von der Achse 10,4 cm entfernt, eine Radumdrehung bewegt den NIBObee um 11,8 cm weiter und bei dieser Umdrehung werden vom Odometriesensor 20 Impulse abgegeben. Die Linienbreite wird 2 cm betragen. Daher errechnet sich die Strecke die nach Erkennen der Kreuzung gefahren werden muss folgendermassen:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;Impulse pro Radumdrehung&amp;gt; / &amp;lt;Radumfang&amp;gt; * (&amp;lt;Achsabstand&amp;gt; - &amp;lt;halbe Linienbreite&amp;gt;) =&lt;br /&gt;
 20 / 11,8 * (10,4 - 0,5) = 16,779661&lt;br /&gt;
&lt;br /&gt;
Nach passieren der Kreuzung muss der NIBObee also noch 17 Impulse über den Odometriesensor empfangen bevor er stoppt.&lt;br /&gt;
&lt;br /&gt;
== Risikoanalyse ==&lt;br /&gt;
Im Folgenden wird versucht für die möglichen Risikopunkte Alternativen aufzuzeigen.&lt;br /&gt;
&lt;br /&gt;
; ATmega16 ist nicht Leisungsfägig genug&lt;br /&gt;
: Es kann auf den [http://www.nicai-systems.com/de/zubehoer/nibobee-tuning-kit.html Tuning-Kit von Nicai-Systems] zurückgerifffen werden. Dies könnte eine nicht akzeptable Verzögerung verursachen (erkennen, bestellen, NIBObee umrüsten)&lt;br /&gt;
&lt;br /&gt;
: Ein beliebiger PIN-kompatiber Microcontroller ATmega... wird statt dem ATmega16 eingesetzt. Die funktioniert soange der Ersatz-µC mit der Frequenz vom 15 MHz betrieben werden kann. Wichtig ist auch dass es adaptierte Bibliotheken gibt die auf den Ersatz-µC abgestimmt sind (z.B. andere Register oder geänderte Adressen für Register, ...)&lt;br /&gt;
&lt;br /&gt;
; Signale am UART mit Bordspannung im Gegensatz zu RS232-Level (12V)&lt;br /&gt;
: Die Signale am UART werden mit Bordspannung erzeugt/erwartet. Für die Kommunikation mit dem BT-Modul ist daher keine Anpassung durchzuführen.&lt;br /&gt;
&lt;br /&gt;
: Soll zu Testzwecken ein PC über RS232 angeschalten werden ist unbedingt auf die Spannung achten. Möglicherweise verwendet ein USB-RS232 Adapter nicht die 12V sonder nur 5V.&lt;br /&gt;
&lt;br /&gt;
== Open Issues ==&lt;br /&gt;
* Es muss noch überprüft werden ob die NIBObee Hardware ausreichend leistungsfähig ist oder ein Upgrade gemacht werden muss.&lt;br /&gt;
* Wie kann das verlassen der Spur von dem Überfahren einer Kreuzung unterschieden werden? Wenn es hier zu Problemen kommt könnten zwei zusätzliche lichtempfindliche Sensoren rechts und links oder noch ein Element mit drei zusätzlichen Sensoren auf Höhe der Achsen angebracht werden -&amp;gt; Mehraufwand!&lt;br /&gt;
* Soll Aktivierung der BT-Schnittstelle manuell erfolgen?&lt;br /&gt;
* Soll der Betriebsmodus gewählt werden können?&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* [http://www.nicai-systems.de/nibobee.html NIBObee Homepage bei Nicai Systems]&lt;br /&gt;
* [http://download.nicai-systems.com/nibo/Tutorial_NIBObee_20091123.pdf NIBObee - Tutorial zur Programmierung]&lt;br /&gt;
* [http://www.nicai-systems.com/de/zubehoer/nibobee-tuning-kit.html NIBObee - Tuning-Kit von Nicai-Systems]&lt;br /&gt;
* [http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/Der_UART Tutorial zur USART Programmierung]&lt;br /&gt;
[[Kategorie:FH]]&lt;/div&gt;</summary>
		<author><name>Alois</name></author>
	</entry>
	<entry>
		<id>https://wiki.callooh.com/index.php?title=NIBObee&amp;diff=902</id>
		<title>NIBObee</title>
		<link rel="alternate" type="text/html" href="https://wiki.callooh.com/index.php?title=NIBObee&amp;diff=902"/>
		<updated>2011-06-24T22:36:45Z</updated>

		<summary type="html">&lt;p&gt;Alois: /* Liniensensoren */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;NIBObee ist der Roboter der im Projekt [[RoLoMa]] verwendet wird.&lt;br /&gt;
== Technische Daten ==&lt;br /&gt;
Hier wird nur ein kleiner Ausschnitt der technischen Daten dargestellt. Es handelt sich nur um jenen Teil der für die Bewertung oder Implementierung der gestellten Aufgaben relevant ist:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Art&lt;br /&gt;
!Typ&lt;br /&gt;
!Bemerkung&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|Mikrocontroller&lt;br /&gt;
|ATMEL ATMega16, , 15 MHz&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|Integrierter UART wird verwendet um den Bluetooth Modul anzubinden.&lt;br /&gt;
&lt;br /&gt;
Sollte die Leistung nicht ausreichen kann entweder der Erweiterungssatz von Nicai-Systems verwendet werden oder nur der Controller wird gegen einen Pinkompatiblen Typ ausgetauscht (z.B. ATMega32, ATMega644, ATMega1284)&lt;br /&gt;
|-&lt;br /&gt;
|Flash:	16	kB&lt;br /&gt;
|-&lt;br /&gt;
|RAM:	1	kB&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|Maße&lt;br /&gt;
|Radumfang: 11,8 cm&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|Diese Maße sind wichtig um den NIBObee so exakt wie möglich am Mittelpunkt des Labyrinthfeldes positionieren zu können.&lt;br /&gt;
|-&lt;br /&gt;
|Abstand Liniensensor zu Radachse: 10,4 cm&lt;br /&gt;
|-&lt;br /&gt;
|Impulse pro Umdrehung: 20&lt;br /&gt;
|}&lt;br /&gt;
=== Ports ===&lt;br /&gt;
Über den UART wird der Bluetooth Modul [[BTM-222]] angebunden. Am NIObee ist diese Schnittstelle am Port X5 verfügbar.&lt;br /&gt;
&lt;br /&gt;
Zwei Analoge Eingänge werden für die Fototransistoren der zusätzlichen Linienerkennung verwendet. Diese sind am NIBObee am Port X1 verfügbar.&lt;br /&gt;
&lt;br /&gt;
Ein Ausgang dient zum ein- und ausschalten der zusätzlichen IR-LEDs. Dafür wird der PIN 1 des Port X4 verwendet.&lt;br /&gt;
&lt;br /&gt;
=== Resourcen ===&lt;br /&gt;
Folgende Resourcen werden für unsere Implementierung verwendet (&#039;&#039;kursiv&#039;&#039; markierte Resourcen werden bereits durch die Bibliothek belegt):&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Resource&lt;br /&gt;
!Verwendung&lt;br /&gt;
!Interrupts&lt;br /&gt;
!Dateien&lt;br /&gt;
|-&lt;br /&gt;
|Timer 1&lt;br /&gt;
|Motor PWM&lt;br /&gt;
|TIMER1_COMPA_vect, TIMER1_COMPB_vect&lt;br /&gt;
|motpwm.c&lt;br /&gt;
|-&lt;br /&gt;
|ADC&lt;br /&gt;
|Analog, Line&lt;br /&gt;
|ADC_vect&lt;br /&gt;
|analog.c, line.c&lt;br /&gt;
|-&lt;br /&gt;
|EEPROM&lt;br /&gt;
|Line (12 Byte)&lt;br /&gt;
|&lt;br /&gt;
|line.c&lt;br /&gt;
|-&lt;br /&gt;
|Ext. IRQ&lt;br /&gt;
|Odometrie&lt;br /&gt;
|INT0_vect, INT1_vect&lt;br /&gt;
|odometry.c&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Eine für den NIBObee allgemein gültige Auflistung findet man im [http://www.nibo-roboter.de/wiki/NIBObee/Lib/Resourcen NIBObee Wiki].&lt;br /&gt;
&lt;br /&gt;
=== Besondere Erkenntnisse ===&lt;br /&gt;
&lt;br /&gt;
==== ATMega16 ====&lt;br /&gt;
Die Speichergröße scheint durchaus ausreichend zu sein. Nach Implementierung aller wichtigen Grundfunktionen ist erst weniger als die Hälfte des Programmspeichers belegt.&lt;br /&gt;
&lt;br /&gt;
Problematisch war anfangs nur der geringe RAM der auch alle konstanten Strings enthält. Dies ist zwar nicht notwendig, ist mit dieser Entwicklungsumgebung allerdings so gelöst. Besonders die umfangreichen Debug-Informationen die über Bluetooth an den PC gesendet werden führten dabei zu massiven Problemen. Durch kurze symbolische Debugausgaben, die dann am PC im eigens entwickelten Terminalprogramm auf sprechende symbolische Ausgabe konvertiert wird, konnte das Problem behoben werden.&lt;br /&gt;
&lt;br /&gt;
==== Liniensensoren ====&lt;br /&gt;
Es hat sich, nach einigen Fehlschlägen bei der Linienverfolung, herausgestellt dass es ungünstig ist den NIBObee in eine optisch ansprechende waagrechte Position zu bringen indem eine kleinere Halbkugel auf der Unterseite angebracht wird. Der Grund: Nur mit der original Halbkugel und dem damit nach vorne ansteigenden Bodenabstand sind die IR-LED&#039;s weit genug vom Boden entfernt um einen Lichtkegen zu erzeugen der auch vernünftig vom Phototransistor erfasst werden kann. Bei waagrechter Ausrichtung des NIBObee ist dieser Kegel, aufgrund des geringeren Abstands zum Boden, zu klein!&lt;br /&gt;
&lt;br /&gt;
=== Bibliotheksfunktionen ===&lt;br /&gt;
==== Liniensensoren ====&lt;br /&gt;
Die original NIBObee Biliothek wird nicht verwendet. Sie wurde durch eine eigene Implementierung im [[NIBObee#Line-Modul|Line-Modul]] ersetzt. Der Grund ist die Notwendigkeit die zusätzlichen Liniensensoren in der gleichen Weise wie die drei Originalsensoren zu behandeln.&lt;br /&gt;
&lt;br /&gt;
==== Motorensteuerung ====&lt;br /&gt;
 motpwm.h&lt;br /&gt;
Die Motoren des NIBObee werden mit PWM ([http://de.wikipedia.org/wiki/Pulsweitenmodulation Pulsweitenmodulation]) angesteuert. Das garantiert natürlich ohne Regelung noch keinen Gleichlauf der beiden Motoren was sich je nach Zustand des Getriebes in einer weiteren oder engernen Kurve zeigt.&lt;br /&gt;
 motpid.h&lt;br /&gt;
Hier stehen Funktionen zur Verfügung die mit Hilfe der Odometrie die Motoren regeln. Diese Funktionen sind für unsere Zwecke allerdings nicht geeignet.&lt;br /&gt;
&lt;br /&gt;
== Aufgaben ==&lt;br /&gt;
Folgende Aufgaben sind im Rahmen des Projekts [[RoLoMa]] vom NIBObee Team zu lösen:&lt;br /&gt;
* Herstellung der Bluetooth Hardware-Erweiterung&lt;br /&gt;
* Softwaremodul zum Bedienen der Bluetooth-Schnittstelle via RS232&lt;br /&gt;
* Softwaremodul zum Erkennen der Linie im Labyrinth und im speziellen der unterschiedlichen Kreuzungstypen&lt;br /&gt;
* Messen des zurückgelegten Weges&lt;br /&gt;
* Steuerung, die den Abstand des Sensors zur Radachse berücksichtigt um den Roboter an der korrekten Stelle um die eigene Achse zu drehen&lt;br /&gt;
* Erstellen eines Abbilds des Labyrinths im Speicher und navigieren bis der Roboter wieder am Startpunkt gelandet ist (z.B. immer Links abbiegen)&lt;br /&gt;
* Implementieren des [[MaDeCo]] Protokolls&lt;br /&gt;
&lt;br /&gt;
Nach einigen ersten Tests ist folgende weitere Aufgabe hinzugekommen:&lt;br /&gt;
* Herstellung der Hardware-Erweiterung mit zusätzlichen Liniensensoren&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
&lt;br /&gt;
=== Bluetooth ===&lt;br /&gt;
Der Bluetooth Modul ist im Detail auf den Seiten des [[BTM-222]] beschrieben.&lt;br /&gt;
&lt;br /&gt;
=== Liniensensoren ===&lt;br /&gt;
Zum Erkennen der Kreuzungen bei gleichzeitigem folgen der Linie war es notwendig zusätzliche Liniensensoren zu verwenden. Diese wurden mit einer Zusätzplatine in einer Reihe mit den bereits vorhandenen Liniensensoren, allerdings so weit wie möglich linke und rechts außen, montiert. Das einlesen der Analogwerte erfolgt über die beiden Analogeingänge am Stecker X1. Die IR-LEDs sind, analog zu den bestehenden IR-LEDs der vorhandenen Liniensensoren, über den Ausgang 1 am Stecker X4 schaltbar. Dies ist notwendig da jeweils eine Messung mit eingschalteter LED und eine mit ausgeschalteter LED durchgeführt wird. Damit wird der Einfluß des Umgebungslichts korrigiert.&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
Die Aufgaben der Software sollen in möglichst unabhängigen Modulen realisiert werden um das Testen einfacher zu gestalten. Die einzelnen Module sind im Folgenden beschrieben.&lt;br /&gt;
&lt;br /&gt;
=== Architektur ===&lt;br /&gt;
Das Gesamtsystem besteht aus einem zentralen Taktgeber, einem Scheduler und mehreren State Maschinen. Die Kommunikation erfolgt ausschließlich über Events. Die Module können mittels Subscribe einen Event, den ein anderer Modul zur Verfügung steht, abonnieren.&lt;br /&gt;
&lt;br /&gt;
==== Systemtakt, Scheduler ====&lt;br /&gt;
Im Main Modul befindet sich der zentrale Taktgeber der aus dem Interrupt des Timer 2 einen gleichmäßigen Takt von 100Hz erzeugt. Dieser Takt kann von anderen Modulen verwendet werden um zyklische Aufgaben zu erfüllen (z.B. lesen der Liniensensoren). Im Main Modul befindet sich auch der Scheduler der ganz einfach in der Endlosschleife sequenziell jeden Modul aufruft um anstehende Events zu bearbeiten.&lt;br /&gt;
&lt;br /&gt;
==== State / Event Maschinen ====&lt;br /&gt;
Die State / Event Maschinen sind in allen Modulen gleich aufgebaut. Es gibt die folgenden Funktionen (wobei statt &amp;quot;&amp;lt;xx&amp;gt;&amp;quot; das Kürzel des Moduls steht, z.B &amp;quot;dr&amp;quot; für Drive):&lt;br /&gt;
; eine Funktion mit dem Namen &amp;lt;xx&amp;gt;_main (intern)&lt;br /&gt;
: Das ist die eigentliche State Maschine. Wird nicht direkt vom Scheduler aufgerufen sondern über die Funktion &amp;lt;xx&amp;gt;_eventHandler. Hier gibt es ein switch Statement über den aktuellen Zustand und für jeden Zustand ein switch Statement über den empfangenen Event.&lt;br /&gt;
; eine Funktion mit dem Namen &amp;lt;xx&amp;gt;_init (extern)&lt;br /&gt;
: Hier werden Variableninitialisierungen gemacht und die ersten subscribe Aufrufe um Events zu abonnieren. Diese Funktion wird beim Systemstart vom Main Modul aufgerufen.&lt;br /&gt;
; eine Funktion mit dem Namen &amp;lt;xx&amp;gt;_eventHandler (extern)&lt;br /&gt;
: Ist die Funktion die vom Scheduler aufgerufen wird damit die Statemaschine mit dem aktuellen Event, sofern vorhanden, durchlaufen wird.&lt;br /&gt;
; optional Funktionen mit den Namen &amp;lt;xx&amp;gt;_subscribe_&amp;lt;event&amp;gt; und &amp;lt;xx&amp;gt;_unsubscribe_&amp;lt;event&amp;gt; (extern)&lt;br /&gt;
: für jeden Event den dieser Modul verschicken kann ist sowohl eine Subscribe Funktion als auch ein Unsubscribe Funktion vorhanden. Mit diesen Funktionen kann der Event von einem anderen Modul abboniert werden.&lt;br /&gt;
; eine Funktion mit dem Namen &amp;lt;xx&amp;gt;_receiveEvent (intern)&lt;br /&gt;
: ReceiveEvent ist eigentlich eine interne Funktion (wird also nicht im Header File deklariert), der Pointer auf diese Funktion wird allerdings als Callback beim Subscribe übergeben damit der Event dem Modul zugestellt werden kann.&lt;br /&gt;
&lt;br /&gt;
=== Module ===&lt;br /&gt;
Im folgenden sind alle Module und deren Hauptfunktionen aufgelistet.&lt;br /&gt;
&lt;br /&gt;
==== Analog-Modul ====&lt;br /&gt;
Digitalisieren der Analogeingänge&lt;br /&gt;
 Dateien: analog.c&lt;br /&gt;
          analog.h&lt;br /&gt;
Dieser Modul ist abgeleitet von den gleichnamigen Dateien der original NIBObee Bibliothek. Dies war notwendig da wir zusätzliche Liniensensoren verwenden und deren Ansteuerung in gleicher Weise erfolgen sollte. Das bedeutet dass für die entsprechenden Analogeingänge Messungen mit ein- und ausgeschalteten IR-LEDs durchgeführt werden müssen. Außerdem wurde, entsprechend dem Datenblatt des ATMega16 die Behandlung der Messung der Batteriespannung verbessert. Da hier die Referenzspannung umgeschalten wird muss eine Messung verworfen werden bevor mit einem richtigen Ergebnis gerechnet werden kann. Das wurde in der Originalbibliothek nicht berücksichtigt.&lt;br /&gt;
Die einzelnen Werte werden weiterhin über einen A/D-Wandler ermittelt und zwischengespeichert. Es gibt nun 13 analoge Werte (statt bisher 11) die zyklisch digitalisiert werden. Dieser Vorgang wird mit einer Frequenz von ca 117 kHz durchgeführt, d.h. dass jeder dieser Werte ca. alle 111 µs (statt bisher 94 µs) aktualisiert wird.&lt;br /&gt;
&lt;br /&gt;
==== Line-Modul ====&lt;br /&gt;
Ermitteln der Werte der Liniensensoren&lt;br /&gt;
 Dateien: line.c&lt;br /&gt;
          line.h&lt;br /&gt;
Dieser Modul ersetzt die originalen Bibliotheksfunktionen der Liniensensoren. Dies war notwendig da wir zusätzliche Liniensensoren verwenden.&lt;br /&gt;
&lt;br /&gt;
Die Werte der Liniensensoren können nun mit der Funktion&lt;br /&gt;
&amp;lt;code&amp;gt;ln_get(index)&amp;lt;/code&amp;gt;&lt;br /&gt;
gelesen werden. Die Werte selbst werden über den [[NIBObee#Analog-Modul|Analog-Modul]] ermittelt.&lt;br /&gt;
&lt;br /&gt;
==== Bluetooth-Modul ====&lt;br /&gt;
Wickelt die Kommunikation über den Bluetooth Modul ab. Zur Kommunikation wird allerdings nur der USART als Terminal angesprochen, der Bluetooth Stack ist im [[BTM-222]] implementiert.&lt;br /&gt;
 Dateien: bluetooth.c&lt;br /&gt;
          bluetooth.h&lt;br /&gt;
&lt;br /&gt;
==== Common-Modul ====&lt;br /&gt;
Stellt gemeinsame Funktionen zurVerfügung&lt;br /&gt;
 Dateien: common.c&lt;br /&gt;
          common.h&lt;br /&gt;
&lt;br /&gt;
==== Distance-Modul ====&lt;br /&gt;
Behandelt die Odometrie Sensoren&lt;br /&gt;
 Dateien: distance.c&lt;br /&gt;
          distance.h&lt;br /&gt;
&lt;br /&gt;
==== Drive-Modul ====&lt;br /&gt;
Bewegt den NIBObee&lt;br /&gt;
 Dateien: drive.c&lt;br /&gt;
          drive.h&lt;br /&gt;
&lt;br /&gt;
==== Follow-Modul ====&lt;br /&gt;
Ist für die Linienverfolgung zuständig&lt;br /&gt;
 Dateien: follow.c&lt;br /&gt;
          follow.h&lt;br /&gt;
&lt;br /&gt;
==== MaDeCo-Modul ====&lt;br /&gt;
Behandelt das MaDeCo Protokoll&lt;br /&gt;
 Dateien: madeco.c&lt;br /&gt;
          madeco.h&lt;br /&gt;
&lt;br /&gt;
==== Main-Modul ====&lt;br /&gt;
Scheduler und zentraler Taktgeber&lt;br /&gt;
 Dateien: main.c&lt;br /&gt;
          main.h&lt;br /&gt;
&lt;br /&gt;
==== Sensor-Modul ====&lt;br /&gt;
Ist für die &amp;quot;Fühler&amp;quot; zuständig&lt;br /&gt;
 Dateien: follow.c&lt;br /&gt;
          follow.h&lt;br /&gt;
&lt;br /&gt;
=== Applikationen ===&lt;br /&gt;
==== Labyrinth erkunden ====&lt;br /&gt;
&lt;br /&gt;
==== Kürzesten Weg durch Labyrinth ====&lt;br /&gt;
&lt;br /&gt;
==== Kalibrierung ====&lt;br /&gt;
Zur Kalibrierung fährt der NIBObee ein Viereck entlang dass genau die Seitenlänge eines der Felder des Labyrinths hat. Dies ist notwendig um relativ einfach die Karte des Labyrinths erstellen zu können.&lt;br /&gt;
&lt;br /&gt;
=== Protokolle und deren Implementierung ===&lt;br /&gt;
==== [[MaDeCo]] ====&lt;br /&gt;
===== Interface Definition =====&lt;br /&gt;
* int set_opmode(OPMODE)&lt;br /&gt;
* int send_waypoint(WAYPOINT)&lt;br /&gt;
* int direct(DIRECTION[])&lt;br /&gt;
* int ack()&lt;br /&gt;
&lt;br /&gt;
==== Schnittstelle [[MaDeCo]] - RS232-Schnittstelle ====&lt;br /&gt;
* pairing&lt;br /&gt;
* Konfigurations-Commands&lt;br /&gt;
* ack&lt;br /&gt;
* read_command&lt;br /&gt;
* send_command&lt;br /&gt;
&lt;br /&gt;
=== Steuerungssoftware ===&lt;br /&gt;
==== Bluetooth Modul einschalten ====&lt;br /&gt;
Durch Bewegen der &amp;quot;Fühler&amp;quot; der NIBObee nach oben bis Einrasten wird das Bluetooth Modul eingeschalten.&lt;br /&gt;
Daraufhin muss auf eingehenden Bluetooth Traffic gelauscht werden.&lt;br /&gt;
&lt;br /&gt;
==== Blink Codes ====&lt;br /&gt;
Bestimmte Events oder Commands lösen bestimmte Blink- oder Leuchtmuster der Status LEDs aus.&lt;br /&gt;
&#039;&#039;&#039;TODO:&#039;&#039;&#039; Spezifikation der Blink Codes&lt;br /&gt;
&lt;br /&gt;
==== Gerade fahren ====&lt;br /&gt;
Das Problem beim geradeaus fahren ist dass der Roboter von der Spur abweichen kann und dann neu ausgerichtet werden muss. Üblicherweise erfolgt das mit Hilfe der Liniensensoren indem, sobald einer der seitlichen Sensoren die Linie erkennt, durch beschleunigen oder bremsen eines Rades in diese Richtung korrigierend gelenkt wird.&lt;br /&gt;
&lt;br /&gt;
In unserem Fall müssen wir diese Korrektur solange verzögern bis der seitliche Liniensensor eine mögliche Kreuzung passiert hat. Erst danach können wir feststellen ob wir nur die schwarze Linie einer Kreuzung überfahren sind oder ob tatsächlich eine Abweichung vorliegt. Die Anzahl der zu ignorierenden Odometrie-Impule kann folgendermaßen errechnet werden:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;Impulse pro Radumdrehung&amp;gt; / &amp;lt;Radumfang&amp;gt; * &amp;lt;Linienbreite&amp;gt; =&lt;br /&gt;
 20 / 11,8 * 1 = 1,69491525&lt;br /&gt;
&lt;br /&gt;
Wir werden also nur zwei Impulse abwarten bevor wir mit der Korrektur beginnen&lt;br /&gt;
&lt;br /&gt;
===== Funktionsaufteilung =====&lt;br /&gt;
Die Zuständigkeiten für diese Aufgabe sind wie folgt:&lt;br /&gt;
;drive Modul&lt;br /&gt;
:sorgt für die Steuerung der Motoren. Reduzieren der Geschwindigkeit eines Rades um eine ausgleichende Kurve zu fahren und stoppen wenn das Ende der geraden Linie erreicht wurde. Dazu aboniert der Modul die Events des line Modul die eine Abweichung von der Linie melden und vom distance Modul den Event zum fahren der Distanz zwischen Liniensensoren und Achse der Räder.&lt;br /&gt;
;line Modul&lt;br /&gt;
:prüft zyklisch die position der Linie unter dem NIBObee und meldet Abweichungen mittels Events. Dieses Melden wird allerdings verzögert bis zumindest die Breite der Linie überfahren wurde. Dazu aboniert der Modul den Event vom distance Modul den Event zum fahren der der Breite der Linie.&lt;br /&gt;
;distance Modul&lt;br /&gt;
:meldet auf Anforderung das zurücklegen einer Strecke in der Länge der Distanz zwischen Liniensensoren und Achse der Räder oder der Breite der Linie.&lt;br /&gt;
&lt;br /&gt;
==== Kreuzung fahren ====&lt;br /&gt;
An einer Kreuzung wird abgebogen indem der NIBObee zuerst unbeirrt geradeaus fährt bis die Achse genau auf dem Mittelpunkt der Kreuzung zu stehen kommt. Danach wird eine Drehung nach rechts oder links durchgeführt bis sich die Linie wieder genau unter dem mittleren Sensor befindet.&lt;br /&gt;
&lt;br /&gt;
Die Sensoren sind von der Achse 10,4 cm entfernt, eine Radumdrehung bewegt den NIBObee um 11,8 cm weiter und bei dieser Umdrehung werden vom Odometriesensor 20 Impulse abgegeben. Die Linienbreite wird 2 cm betragen. Daher errechnet sich die Strecke die nach Erkennen der Kreuzung gefahren werden muss folgendermassen:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;Impulse pro Radumdrehung&amp;gt; / &amp;lt;Radumfang&amp;gt; * (&amp;lt;Achsabstand&amp;gt; - &amp;lt;halbe Linienbreite&amp;gt;) =&lt;br /&gt;
 20 / 11,8 * (10,4 - 0,5) = 16,779661&lt;br /&gt;
&lt;br /&gt;
Nach passieren der Kreuzung muss der NIBObee also noch 17 Impulse über den Odometriesensor empfangen bevor er stoppt.&lt;br /&gt;
&lt;br /&gt;
== Risikoanalyse ==&lt;br /&gt;
Im Folgenden wird versucht für die möglichen Risikopunkte Alternativen aufzuzeigen.&lt;br /&gt;
&lt;br /&gt;
; ATmega16 ist nicht Leisungsfägig genug&lt;br /&gt;
: Es kann auf den [http://www.nicai-systems.com/de/zubehoer/nibobee-tuning-kit.html Tuning-Kit von Nicai-Systems] zurückgerifffen werden. Dies könnte eine nicht akzeptable Verzögerung verursachen (erkennen, bestellen, NIBObee umrüsten)&lt;br /&gt;
&lt;br /&gt;
: Ein beliebiger PIN-kompatiber Microcontroller ATmega... wird statt dem ATmega16 eingesetzt. Die funktioniert soange der Ersatz-µC mit der Frequenz vom 15 MHz betrieben werden kann. Wichtig ist auch dass es adaptierte Bibliotheken gibt die auf den Ersatz-µC abgestimmt sind (z.B. andere Register oder geänderte Adressen für Register, ...)&lt;br /&gt;
&lt;br /&gt;
; Signale am UART mit Bordspannung im Gegensatz zu RS232-Level (12V)&lt;br /&gt;
: Die Signale am UART werden mit Bordspannung erzeugt/erwartet. Für die Kommunikation mit dem BT-Modul ist daher keine Anpassung durchzuführen.&lt;br /&gt;
&lt;br /&gt;
: Soll zu Testzwecken ein PC über RS232 angeschalten werden ist unbedingt auf die Spannung achten. Möglicherweise verwendet ein USB-RS232 Adapter nicht die 12V sonder nur 5V.&lt;br /&gt;
&lt;br /&gt;
== Open Issues ==&lt;br /&gt;
* Es muss noch überprüft werden ob die NIBObee Hardware ausreichend leistungsfähig ist oder ein Upgrade gemacht werden muss.&lt;br /&gt;
* Wie kann das verlassen der Spur von dem Überfahren einer Kreuzung unterschieden werden? Wenn es hier zu Problemen kommt könnten zwei zusätzliche lichtempfindliche Sensoren rechts und links oder noch ein Element mit drei zusätzlichen Sensoren auf Höhe der Achsen angebracht werden -&amp;gt; Mehraufwand!&lt;br /&gt;
* Soll Aktivierung der BT-Schnittstelle manuell erfolgen?&lt;br /&gt;
* Soll der Betriebsmodus gewählt werden können?&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* [http://www.nicai-systems.de/nibobee.html NIBObee Homepage bei Nicai Systems]&lt;br /&gt;
* [http://download.nicai-systems.com/nibo/Tutorial_NIBObee_20091123.pdf NIBObee - Tutorial zur Programmierung]&lt;br /&gt;
* [http://www.nicai-systems.com/de/zubehoer/nibobee-tuning-kit.html NIBObee - Tuning-Kit von Nicai-Systems]&lt;br /&gt;
* [http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/Der_UART Tutorial zur USART Programmierung]&lt;br /&gt;
[[Kategorie:FH]]&lt;/div&gt;</summary>
		<author><name>Alois</name></author>
	</entry>
	<entry>
		<id>https://wiki.callooh.com/index.php?title=NIBObee&amp;diff=901</id>
		<title>NIBObee</title>
		<link rel="alternate" type="text/html" href="https://wiki.callooh.com/index.php?title=NIBObee&amp;diff=901"/>
		<updated>2011-06-24T22:35:53Z</updated>

		<summary type="html">&lt;p&gt;Alois: /* ATMega16 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;NIBObee ist der Roboter der im Projekt [[RoLoMa]] verwendet wird.&lt;br /&gt;
== Technische Daten ==&lt;br /&gt;
Hier wird nur ein kleiner Ausschnitt der technischen Daten dargestellt. Es handelt sich nur um jenen Teil der für die Bewertung oder Implementierung der gestellten Aufgaben relevant ist:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Art&lt;br /&gt;
!Typ&lt;br /&gt;
!Bemerkung&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|Mikrocontroller&lt;br /&gt;
|ATMEL ATMega16, , 15 MHz&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|Integrierter UART wird verwendet um den Bluetooth Modul anzubinden.&lt;br /&gt;
&lt;br /&gt;
Sollte die Leistung nicht ausreichen kann entweder der Erweiterungssatz von Nicai-Systems verwendet werden oder nur der Controller wird gegen einen Pinkompatiblen Typ ausgetauscht (z.B. ATMega32, ATMega644, ATMega1284)&lt;br /&gt;
|-&lt;br /&gt;
|Flash:	16	kB&lt;br /&gt;
|-&lt;br /&gt;
|RAM:	1	kB&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|Maße&lt;br /&gt;
|Radumfang: 11,8 cm&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|Diese Maße sind wichtig um den NIBObee so exakt wie möglich am Mittelpunkt des Labyrinthfeldes positionieren zu können.&lt;br /&gt;
|-&lt;br /&gt;
|Abstand Liniensensor zu Radachse: 10,4 cm&lt;br /&gt;
|-&lt;br /&gt;
|Impulse pro Umdrehung: 20&lt;br /&gt;
|}&lt;br /&gt;
=== Ports ===&lt;br /&gt;
Über den UART wird der Bluetooth Modul [[BTM-222]] angebunden. Am NIObee ist diese Schnittstelle am Port X5 verfügbar.&lt;br /&gt;
&lt;br /&gt;
Zwei Analoge Eingänge werden für die Fototransistoren der zusätzlichen Linienerkennung verwendet. Diese sind am NIBObee am Port X1 verfügbar.&lt;br /&gt;
&lt;br /&gt;
Ein Ausgang dient zum ein- und ausschalten der zusätzlichen IR-LEDs. Dafür wird der PIN 1 des Port X4 verwendet.&lt;br /&gt;
&lt;br /&gt;
=== Resourcen ===&lt;br /&gt;
Folgende Resourcen werden für unsere Implementierung verwendet (&#039;&#039;kursiv&#039;&#039; markierte Resourcen werden bereits durch die Bibliothek belegt):&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Resource&lt;br /&gt;
!Verwendung&lt;br /&gt;
!Interrupts&lt;br /&gt;
!Dateien&lt;br /&gt;
|-&lt;br /&gt;
|Timer 1&lt;br /&gt;
|Motor PWM&lt;br /&gt;
|TIMER1_COMPA_vect, TIMER1_COMPB_vect&lt;br /&gt;
|motpwm.c&lt;br /&gt;
|-&lt;br /&gt;
|ADC&lt;br /&gt;
|Analog, Line&lt;br /&gt;
|ADC_vect&lt;br /&gt;
|analog.c, line.c&lt;br /&gt;
|-&lt;br /&gt;
|EEPROM&lt;br /&gt;
|Line (12 Byte)&lt;br /&gt;
|&lt;br /&gt;
|line.c&lt;br /&gt;
|-&lt;br /&gt;
|Ext. IRQ&lt;br /&gt;
|Odometrie&lt;br /&gt;
|INT0_vect, INT1_vect&lt;br /&gt;
|odometry.c&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Eine für den NIBObee allgemein gültige Auflistung findet man im [http://www.nibo-roboter.de/wiki/NIBObee/Lib/Resourcen NIBObee Wiki].&lt;br /&gt;
&lt;br /&gt;
=== Besondere Erkenntnisse ===&lt;br /&gt;
&lt;br /&gt;
==== ATMega16 ====&lt;br /&gt;
Die Speichergröße scheint durchaus ausreichend zu sein. Nach Implementierung aller wichtigen Grundfunktionen ist erst weniger als die Hälfte des Programmspeichers belegt.&lt;br /&gt;
&lt;br /&gt;
Problematisch war anfangs nur der geringe RAM der auch alle konstanten Strings enthält. Dies ist zwar nicht notwendig, ist mit dieser Entwicklungsumgebung allerdings so gelöst. Besonders die umfangreichen Debug-Informationen die über Bluetooth an den PC gesendet werden führten dabei zu massiven Problemen. Durch kurze symbolische Debugausgaben, die dann am PC im eigens entwickelten Terminalprogramm auf sprechende symbolische Ausgabe konvertiert wird, konnte das Problem behoben werden.&lt;br /&gt;
&lt;br /&gt;
==== Liniensensoren ====&lt;br /&gt;
Es hat sich, nach einigen Fehlschlägen bei der Linienverfolung, herausgestellt dass es ungünstig ist den NIBObee in eine optisch ansprechende waagrechte Position zu bringen indem eine kleinere Halbkugel auf der Unterseite angebracht wird. Der Grund: Nur mit der original Halbkugel und dem damit nach vorne ansteigenden Bodenabstand sind die IR-LED&#039;s weit genug vom Boden entfernt um einen Lichtkegen zu erzeugen der auch vernünftig vom Phototransistor erfasst werden kann. Bei waagrechter Ausrichtung des NIBObee ist dieser Kegel, aufgrund des geringeren Abstands zum Boden, zu klein!&lt;br /&gt;
&lt;br /&gt;
=== Bibliotheksfunktionen ===&lt;br /&gt;
==== Liniensensoren ====&lt;br /&gt;
Die original NIBObee Biliothek wird nicht verwendet. Sie wurde durch eine eigene Implementierung im [[NIBObee#Line-Modul|Line-Modul]] ersetzt. Der Grund ist die Notwendigkeit die zusätzlichen Liniensensoren in der gleichen weise wie die drei Originalsensoren zu behandeln.&lt;br /&gt;
&lt;br /&gt;
==== Motorensteuerung ====&lt;br /&gt;
 motpwm.h&lt;br /&gt;
Die Motoren des NIBObee werden mit PWM ([http://de.wikipedia.org/wiki/Pulsweitenmodulation Pulsweitenmodulation]) angesteuert. Das garantiert natürlich ohne Regelung noch keinen Gleichlauf der beiden Motoren was sich je nach Zustand des Getriebes in einer weiteren oder engernen Kurve zeigt.&lt;br /&gt;
 motpid.h&lt;br /&gt;
Hier stehen Funktionen zur Verfügung die mit Hilfe der Odometrie die Motoren regeln. Diese Funktionen sind für unsere Zwecke allerdings nicht geeignet.&lt;br /&gt;
&lt;br /&gt;
== Aufgaben ==&lt;br /&gt;
Folgende Aufgaben sind im Rahmen des Projekts [[RoLoMa]] vom NIBObee Team zu lösen:&lt;br /&gt;
* Herstellung der Bluetooth Hardware-Erweiterung&lt;br /&gt;
* Softwaremodul zum Bedienen der Bluetooth-Schnittstelle via RS232&lt;br /&gt;
* Softwaremodul zum Erkennen der Linie im Labyrinth und im speziellen der unterschiedlichen Kreuzungstypen&lt;br /&gt;
* Messen des zurückgelegten Weges&lt;br /&gt;
* Steuerung, die den Abstand des Sensors zur Radachse berücksichtigt um den Roboter an der korrekten Stelle um die eigene Achse zu drehen&lt;br /&gt;
* Erstellen eines Abbilds des Labyrinths im Speicher und navigieren bis der Roboter wieder am Startpunkt gelandet ist (z.B. immer Links abbiegen)&lt;br /&gt;
* Implementieren des [[MaDeCo]] Protokolls&lt;br /&gt;
&lt;br /&gt;
Nach einigen ersten Tests ist folgende weitere Aufgabe hinzugekommen:&lt;br /&gt;
* Herstellung der Hardware-Erweiterung mit zusätzlichen Liniensensoren&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
&lt;br /&gt;
=== Bluetooth ===&lt;br /&gt;
Der Bluetooth Modul ist im Detail auf den Seiten des [[BTM-222]] beschrieben.&lt;br /&gt;
&lt;br /&gt;
=== Liniensensoren ===&lt;br /&gt;
Zum Erkennen der Kreuzungen bei gleichzeitigem folgen der Linie war es notwendig zusätzliche Liniensensoren zu verwenden. Diese wurden mit einer Zusätzplatine in einer Reihe mit den bereits vorhandenen Liniensensoren, allerdings so weit wie möglich linke und rechts außen, montiert. Das einlesen der Analogwerte erfolgt über die beiden Analogeingänge am Stecker X1. Die IR-LEDs sind, analog zu den bestehenden IR-LEDs der vorhandenen Liniensensoren, über den Ausgang 1 am Stecker X4 schaltbar. Dies ist notwendig da jeweils eine Messung mit eingschalteter LED und eine mit ausgeschalteter LED durchgeführt wird. Damit wird der Einfluß des Umgebungslichts korrigiert.&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
Die Aufgaben der Software sollen in möglichst unabhängigen Modulen realisiert werden um das Testen einfacher zu gestalten. Die einzelnen Module sind im Folgenden beschrieben.&lt;br /&gt;
&lt;br /&gt;
=== Architektur ===&lt;br /&gt;
Das Gesamtsystem besteht aus einem zentralen Taktgeber, einem Scheduler und mehreren State Maschinen. Die Kommunikation erfolgt ausschließlich über Events. Die Module können mittels Subscribe einen Event, den ein anderer Modul zur Verfügung steht, abonnieren.&lt;br /&gt;
&lt;br /&gt;
==== Systemtakt, Scheduler ====&lt;br /&gt;
Im Main Modul befindet sich der zentrale Taktgeber der aus dem Interrupt des Timer 2 einen gleichmäßigen Takt von 100Hz erzeugt. Dieser Takt kann von anderen Modulen verwendet werden um zyklische Aufgaben zu erfüllen (z.B. lesen der Liniensensoren). Im Main Modul befindet sich auch der Scheduler der ganz einfach in der Endlosschleife sequenziell jeden Modul aufruft um anstehende Events zu bearbeiten.&lt;br /&gt;
&lt;br /&gt;
==== State / Event Maschinen ====&lt;br /&gt;
Die State / Event Maschinen sind in allen Modulen gleich aufgebaut. Es gibt die folgenden Funktionen (wobei statt &amp;quot;&amp;lt;xx&amp;gt;&amp;quot; das Kürzel des Moduls steht, z.B &amp;quot;dr&amp;quot; für Drive):&lt;br /&gt;
; eine Funktion mit dem Namen &amp;lt;xx&amp;gt;_main (intern)&lt;br /&gt;
: Das ist die eigentliche State Maschine. Wird nicht direkt vom Scheduler aufgerufen sondern über die Funktion &amp;lt;xx&amp;gt;_eventHandler. Hier gibt es ein switch Statement über den aktuellen Zustand und für jeden Zustand ein switch Statement über den empfangenen Event.&lt;br /&gt;
; eine Funktion mit dem Namen &amp;lt;xx&amp;gt;_init (extern)&lt;br /&gt;
: Hier werden Variableninitialisierungen gemacht und die ersten subscribe Aufrufe um Events zu abonnieren. Diese Funktion wird beim Systemstart vom Main Modul aufgerufen.&lt;br /&gt;
; eine Funktion mit dem Namen &amp;lt;xx&amp;gt;_eventHandler (extern)&lt;br /&gt;
: Ist die Funktion die vom Scheduler aufgerufen wird damit die Statemaschine mit dem aktuellen Event, sofern vorhanden, durchlaufen wird.&lt;br /&gt;
; optional Funktionen mit den Namen &amp;lt;xx&amp;gt;_subscribe_&amp;lt;event&amp;gt; und &amp;lt;xx&amp;gt;_unsubscribe_&amp;lt;event&amp;gt; (extern)&lt;br /&gt;
: für jeden Event den dieser Modul verschicken kann ist sowohl eine Subscribe Funktion als auch ein Unsubscribe Funktion vorhanden. Mit diesen Funktionen kann der Event von einem anderen Modul abboniert werden.&lt;br /&gt;
; eine Funktion mit dem Namen &amp;lt;xx&amp;gt;_receiveEvent (intern)&lt;br /&gt;
: ReceiveEvent ist eigentlich eine interne Funktion (wird also nicht im Header File deklariert), der Pointer auf diese Funktion wird allerdings als Callback beim Subscribe übergeben damit der Event dem Modul zugestellt werden kann.&lt;br /&gt;
&lt;br /&gt;
=== Module ===&lt;br /&gt;
Im folgenden sind alle Module und deren Hauptfunktionen aufgelistet.&lt;br /&gt;
&lt;br /&gt;
==== Analog-Modul ====&lt;br /&gt;
Digitalisieren der Analogeingänge&lt;br /&gt;
 Dateien: analog.c&lt;br /&gt;
          analog.h&lt;br /&gt;
Dieser Modul ist abgeleitet von den gleichnamigen Dateien der original NIBObee Bibliothek. Dies war notwendig da wir zusätzliche Liniensensoren verwenden und deren Ansteuerung in gleicher Weise erfolgen sollte. Das bedeutet dass für die entsprechenden Analogeingänge Messungen mit ein- und ausgeschalteten IR-LEDs durchgeführt werden müssen. Außerdem wurde, entsprechend dem Datenblatt des ATMega16 die Behandlung der Messung der Batteriespannung verbessert. Da hier die Referenzspannung umgeschalten wird muss eine Messung verworfen werden bevor mit einem richtigen Ergebnis gerechnet werden kann. Das wurde in der Originalbibliothek nicht berücksichtigt.&lt;br /&gt;
Die einzelnen Werte werden weiterhin über einen A/D-Wandler ermittelt und zwischengespeichert. Es gibt nun 13 analoge Werte (statt bisher 11) die zyklisch digitalisiert werden. Dieser Vorgang wird mit einer Frequenz von ca 117 kHz durchgeführt, d.h. dass jeder dieser Werte ca. alle 111 µs (statt bisher 94 µs) aktualisiert wird.&lt;br /&gt;
&lt;br /&gt;
==== Line-Modul ====&lt;br /&gt;
Ermitteln der Werte der Liniensensoren&lt;br /&gt;
 Dateien: line.c&lt;br /&gt;
          line.h&lt;br /&gt;
Dieser Modul ersetzt die originalen Bibliotheksfunktionen der Liniensensoren. Dies war notwendig da wir zusätzliche Liniensensoren verwenden.&lt;br /&gt;
&lt;br /&gt;
Die Werte der Liniensensoren können nun mit der Funktion&lt;br /&gt;
&amp;lt;code&amp;gt;ln_get(index)&amp;lt;/code&amp;gt;&lt;br /&gt;
gelesen werden. Die Werte selbst werden über den [[NIBObee#Analog-Modul|Analog-Modul]] ermittelt.&lt;br /&gt;
&lt;br /&gt;
==== Bluetooth-Modul ====&lt;br /&gt;
Wickelt die Kommunikation über den Bluetooth Modul ab. Zur Kommunikation wird allerdings nur der USART als Terminal angesprochen, der Bluetooth Stack ist im [[BTM-222]] implementiert.&lt;br /&gt;
 Dateien: bluetooth.c&lt;br /&gt;
          bluetooth.h&lt;br /&gt;
&lt;br /&gt;
==== Common-Modul ====&lt;br /&gt;
Stellt gemeinsame Funktionen zurVerfügung&lt;br /&gt;
 Dateien: common.c&lt;br /&gt;
          common.h&lt;br /&gt;
&lt;br /&gt;
==== Distance-Modul ====&lt;br /&gt;
Behandelt die Odometrie Sensoren&lt;br /&gt;
 Dateien: distance.c&lt;br /&gt;
          distance.h&lt;br /&gt;
&lt;br /&gt;
==== Drive-Modul ====&lt;br /&gt;
Bewegt den NIBObee&lt;br /&gt;
 Dateien: drive.c&lt;br /&gt;
          drive.h&lt;br /&gt;
&lt;br /&gt;
==== Follow-Modul ====&lt;br /&gt;
Ist für die Linienverfolgung zuständig&lt;br /&gt;
 Dateien: follow.c&lt;br /&gt;
          follow.h&lt;br /&gt;
&lt;br /&gt;
==== MaDeCo-Modul ====&lt;br /&gt;
Behandelt das MaDeCo Protokoll&lt;br /&gt;
 Dateien: madeco.c&lt;br /&gt;
          madeco.h&lt;br /&gt;
&lt;br /&gt;
==== Main-Modul ====&lt;br /&gt;
Scheduler und zentraler Taktgeber&lt;br /&gt;
 Dateien: main.c&lt;br /&gt;
          main.h&lt;br /&gt;
&lt;br /&gt;
==== Sensor-Modul ====&lt;br /&gt;
Ist für die &amp;quot;Fühler&amp;quot; zuständig&lt;br /&gt;
 Dateien: follow.c&lt;br /&gt;
          follow.h&lt;br /&gt;
&lt;br /&gt;
=== Applikationen ===&lt;br /&gt;
==== Labyrinth erkunden ====&lt;br /&gt;
&lt;br /&gt;
==== Kürzesten Weg durch Labyrinth ====&lt;br /&gt;
&lt;br /&gt;
==== Kalibrierung ====&lt;br /&gt;
Zur Kalibrierung fährt der NIBObee ein Viereck entlang dass genau die Seitenlänge eines der Felder des Labyrinths hat. Dies ist notwendig um relativ einfach die Karte des Labyrinths erstellen zu können.&lt;br /&gt;
&lt;br /&gt;
=== Protokolle und deren Implementierung ===&lt;br /&gt;
==== [[MaDeCo]] ====&lt;br /&gt;
===== Interface Definition =====&lt;br /&gt;
* int set_opmode(OPMODE)&lt;br /&gt;
* int send_waypoint(WAYPOINT)&lt;br /&gt;
* int direct(DIRECTION[])&lt;br /&gt;
* int ack()&lt;br /&gt;
&lt;br /&gt;
==== Schnittstelle [[MaDeCo]] - RS232-Schnittstelle ====&lt;br /&gt;
* pairing&lt;br /&gt;
* Konfigurations-Commands&lt;br /&gt;
* ack&lt;br /&gt;
* read_command&lt;br /&gt;
* send_command&lt;br /&gt;
&lt;br /&gt;
=== Steuerungssoftware ===&lt;br /&gt;
==== Bluetooth Modul einschalten ====&lt;br /&gt;
Durch Bewegen der &amp;quot;Fühler&amp;quot; der NIBObee nach oben bis Einrasten wird das Bluetooth Modul eingeschalten.&lt;br /&gt;
Daraufhin muss auf eingehenden Bluetooth Traffic gelauscht werden.&lt;br /&gt;
&lt;br /&gt;
==== Blink Codes ====&lt;br /&gt;
Bestimmte Events oder Commands lösen bestimmte Blink- oder Leuchtmuster der Status LEDs aus.&lt;br /&gt;
&#039;&#039;&#039;TODO:&#039;&#039;&#039; Spezifikation der Blink Codes&lt;br /&gt;
&lt;br /&gt;
==== Gerade fahren ====&lt;br /&gt;
Das Problem beim geradeaus fahren ist dass der Roboter von der Spur abweichen kann und dann neu ausgerichtet werden muss. Üblicherweise erfolgt das mit Hilfe der Liniensensoren indem, sobald einer der seitlichen Sensoren die Linie erkennt, durch beschleunigen oder bremsen eines Rades in diese Richtung korrigierend gelenkt wird.&lt;br /&gt;
&lt;br /&gt;
In unserem Fall müssen wir diese Korrektur solange verzögern bis der seitliche Liniensensor eine mögliche Kreuzung passiert hat. Erst danach können wir feststellen ob wir nur die schwarze Linie einer Kreuzung überfahren sind oder ob tatsächlich eine Abweichung vorliegt. Die Anzahl der zu ignorierenden Odometrie-Impule kann folgendermaßen errechnet werden:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;Impulse pro Radumdrehung&amp;gt; / &amp;lt;Radumfang&amp;gt; * &amp;lt;Linienbreite&amp;gt; =&lt;br /&gt;
 20 / 11,8 * 1 = 1,69491525&lt;br /&gt;
&lt;br /&gt;
Wir werden also nur zwei Impulse abwarten bevor wir mit der Korrektur beginnen&lt;br /&gt;
&lt;br /&gt;
===== Funktionsaufteilung =====&lt;br /&gt;
Die Zuständigkeiten für diese Aufgabe sind wie folgt:&lt;br /&gt;
;drive Modul&lt;br /&gt;
:sorgt für die Steuerung der Motoren. Reduzieren der Geschwindigkeit eines Rades um eine ausgleichende Kurve zu fahren und stoppen wenn das Ende der geraden Linie erreicht wurde. Dazu aboniert der Modul die Events des line Modul die eine Abweichung von der Linie melden und vom distance Modul den Event zum fahren der Distanz zwischen Liniensensoren und Achse der Räder.&lt;br /&gt;
;line Modul&lt;br /&gt;
:prüft zyklisch die position der Linie unter dem NIBObee und meldet Abweichungen mittels Events. Dieses Melden wird allerdings verzögert bis zumindest die Breite der Linie überfahren wurde. Dazu aboniert der Modul den Event vom distance Modul den Event zum fahren der der Breite der Linie.&lt;br /&gt;
;distance Modul&lt;br /&gt;
:meldet auf Anforderung das zurücklegen einer Strecke in der Länge der Distanz zwischen Liniensensoren und Achse der Räder oder der Breite der Linie.&lt;br /&gt;
&lt;br /&gt;
==== Kreuzung fahren ====&lt;br /&gt;
An einer Kreuzung wird abgebogen indem der NIBObee zuerst unbeirrt geradeaus fährt bis die Achse genau auf dem Mittelpunkt der Kreuzung zu stehen kommt. Danach wird eine Drehung nach rechts oder links durchgeführt bis sich die Linie wieder genau unter dem mittleren Sensor befindet.&lt;br /&gt;
&lt;br /&gt;
Die Sensoren sind von der Achse 10,4 cm entfernt, eine Radumdrehung bewegt den NIBObee um 11,8 cm weiter und bei dieser Umdrehung werden vom Odometriesensor 20 Impulse abgegeben. Die Linienbreite wird 2 cm betragen. Daher errechnet sich die Strecke die nach Erkennen der Kreuzung gefahren werden muss folgendermassen:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;Impulse pro Radumdrehung&amp;gt; / &amp;lt;Radumfang&amp;gt; * (&amp;lt;Achsabstand&amp;gt; - &amp;lt;halbe Linienbreite&amp;gt;) =&lt;br /&gt;
 20 / 11,8 * (10,4 - 0,5) = 16,779661&lt;br /&gt;
&lt;br /&gt;
Nach passieren der Kreuzung muss der NIBObee also noch 17 Impulse über den Odometriesensor empfangen bevor er stoppt.&lt;br /&gt;
&lt;br /&gt;
== Risikoanalyse ==&lt;br /&gt;
Im Folgenden wird versucht für die möglichen Risikopunkte Alternativen aufzuzeigen.&lt;br /&gt;
&lt;br /&gt;
; ATmega16 ist nicht Leisungsfägig genug&lt;br /&gt;
: Es kann auf den [http://www.nicai-systems.com/de/zubehoer/nibobee-tuning-kit.html Tuning-Kit von Nicai-Systems] zurückgerifffen werden. Dies könnte eine nicht akzeptable Verzögerung verursachen (erkennen, bestellen, NIBObee umrüsten)&lt;br /&gt;
&lt;br /&gt;
: Ein beliebiger PIN-kompatiber Microcontroller ATmega... wird statt dem ATmega16 eingesetzt. Die funktioniert soange der Ersatz-µC mit der Frequenz vom 15 MHz betrieben werden kann. Wichtig ist auch dass es adaptierte Bibliotheken gibt die auf den Ersatz-µC abgestimmt sind (z.B. andere Register oder geänderte Adressen für Register, ...)&lt;br /&gt;
&lt;br /&gt;
; Signale am UART mit Bordspannung im Gegensatz zu RS232-Level (12V)&lt;br /&gt;
: Die Signale am UART werden mit Bordspannung erzeugt/erwartet. Für die Kommunikation mit dem BT-Modul ist daher keine Anpassung durchzuführen.&lt;br /&gt;
&lt;br /&gt;
: Soll zu Testzwecken ein PC über RS232 angeschalten werden ist unbedingt auf die Spannung achten. Möglicherweise verwendet ein USB-RS232 Adapter nicht die 12V sonder nur 5V.&lt;br /&gt;
&lt;br /&gt;
== Open Issues ==&lt;br /&gt;
* Es muss noch überprüft werden ob die NIBObee Hardware ausreichend leistungsfähig ist oder ein Upgrade gemacht werden muss.&lt;br /&gt;
* Wie kann das verlassen der Spur von dem Überfahren einer Kreuzung unterschieden werden? Wenn es hier zu Problemen kommt könnten zwei zusätzliche lichtempfindliche Sensoren rechts und links oder noch ein Element mit drei zusätzlichen Sensoren auf Höhe der Achsen angebracht werden -&amp;gt; Mehraufwand!&lt;br /&gt;
* Soll Aktivierung der BT-Schnittstelle manuell erfolgen?&lt;br /&gt;
* Soll der Betriebsmodus gewählt werden können?&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* [http://www.nicai-systems.de/nibobee.html NIBObee Homepage bei Nicai Systems]&lt;br /&gt;
* [http://download.nicai-systems.com/nibo/Tutorial_NIBObee_20091123.pdf NIBObee - Tutorial zur Programmierung]&lt;br /&gt;
* [http://www.nicai-systems.com/de/zubehoer/nibobee-tuning-kit.html NIBObee - Tuning-Kit von Nicai-Systems]&lt;br /&gt;
* [http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/Der_UART Tutorial zur USART Programmierung]&lt;br /&gt;
[[Kategorie:FH]]&lt;/div&gt;</summary>
		<author><name>Alois</name></author>
	</entry>
	<entry>
		<id>https://wiki.callooh.com/index.php?title=RoLoMa&amp;diff=900</id>
		<title>RoLoMa</title>
		<link rel="alternate" type="text/html" href="https://wiki.callooh.com/index.php?title=RoLoMa&amp;diff=900"/>
		<updated>2011-06-24T22:30:08Z</updated>

		<summary type="html">&lt;p&gt;Alois: /* Projektfortschritt */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;RoLoMa ist der, vielleicht wenig einfallsreiche, Name des ESE-Projekts im 4. Semester. Es ist die Abkürzung für &amp;quot;Robots Lost in Maze&amp;quot;.&lt;br /&gt;
== Projektbeschreibung ==&lt;br /&gt;
=== Aufgabe ===&lt;br /&gt;
Bei diesem Projekt soll ein autonomer Roboter ein Labyrinth analysieren, alle vorhandenen Abzweigungen protokollieren und diese Daten an eine zentrale Einheit senden. Die zentrale Einheit soll einen zweiten autonomen Roboter mit diesen Daten auf dem berechneten kürzesten Weg durch das Labyrinth lotsen können. Dazu muss eine Kommunikation zwischen dem Roboter und der zentralen Einheit hergestellt werden.&lt;br /&gt;
Die oben erwähnte zentrale Einheit wird im weiteren Dokument als „Board“ bezeichnet und der autonome Roboter, aufgrund des gewählten Produkts „[[NIBObee]]“.&lt;br /&gt;
=== Details ===&lt;br /&gt;
[[File:ExampleMaze.png|thumb|120px|Beispiellabyrinth]]&lt;br /&gt;
Das Labyrinth wird eine Matrix mit vordefinierter Größe sein (z.B. 8x8) bei dem die möglichen Wege als schwarze Linie dargestellt sind. Auf dieser Linie wird sich der [[NIBObee]] bewegen. Die Aufgabe des ersten [[NIBObee]] besteht nun darin das gesamt Labyrinth abzufahren und eine Karte zu erstellen.&lt;br /&gt;
&lt;br /&gt;
Diese gesammelte Information wird dann an das Board übertragen. Dort wird das Labyrinth auf einer grafischen Ausgabe dargestellt und der Benutzer kann einen beliebigen Zielpunkt für den zweiten [[NIBObee]] festlegen. Der optimale Weg wird berechnet und der zweite [[NIBObee]] über diesen Weg an das definierte Ziel geleitet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- IMPORTANT: The following line shall be at the end of the &amp;quot;Details&amp;quot; Section to ensure that following section will start in a new line after the image! --&amp;gt;&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Aufgabenteilung ===&lt;br /&gt;
An dem Projekt sind zwei Gruppen beteiligt, eine die sich um die Roboter kümmert (Gruppe NIBObee), eine zweite die die Implementierung der zentralen Einheit (Gruppe Board) vornimmt. Gemeinsam muss die Übertragungstechnik (Hardware und Protokoll) erarbeitet werden. Die Implementierung kann dann getrennt erfolgen und am Ende des Projekts ist eine gemeinsame Testphase notwendig.&lt;br /&gt;
&lt;br /&gt;
Da noch einige Festlegungen bezüglich der verwendeten Hardware und der Übertragungstechnik ausständig sind können sich im Zuge des weiteren Projektfortschritts durchaus noch Änderungen ergeben. Für alle kritischen Elemente wird so früh wie möglich auch eine alternative Lösung als Fallback vorgesehen. Das ist notwendig für den Fall, dass sich für ein Problem keine, zumindest im Rahmen dieses Semesters, realisierbare Implementierung ergibt.&lt;br /&gt;
&lt;br /&gt;
==== Team Board ====&lt;br /&gt;
Teammitglieder dieser Gruppe sind:&lt;br /&gt;
* Michaela Escuyer&lt;br /&gt;
* Thomas Neuber&lt;br /&gt;
* Robert Pavljuk&lt;br /&gt;
==== Team NIBObee ====&lt;br /&gt;
Teammitglieder dieser Gruppe sind:&lt;br /&gt;
* Robert Peterfi&lt;br /&gt;
* Alois Pochmann&lt;br /&gt;
* Reinhard Weismann&lt;br /&gt;
&lt;br /&gt;
== Realisierung ==&lt;br /&gt;
&lt;br /&gt;
=== Plattformen / Hardware ===&lt;br /&gt;
Die Plattformen der Roboter und der Kontrolleinheit sind im Folgenden aufgelistet und stehen (wenn auch teilweise nur als Bausatz) fertig zur Verfügung. Die Hardware der Kommunikationseinrichtung wird im Zuge dieses Projekts erstellt.&lt;br /&gt;
&lt;br /&gt;
==== Roboter ====&lt;br /&gt;
Der eingesetzte Roboter ist eine [[NIBObee]] von [http://www.nicai-systems.com/de/nibobee.html Nicai-Systems]. Dieser Roboter verfügt über einen Liniensensor der es prinzipiell ermöglicht einer kontrastreichen Linie, vorzugsweise schwarze Linie auf weißem Boden, zu folgen.&lt;br /&gt;
&lt;br /&gt;
Weitere Dateils können der [[NIBObee]]-Seite entnommen werden.&lt;br /&gt;
&lt;br /&gt;
==== Kontrolleinheit ====&lt;br /&gt;
Die Zentrale Kontrolleinheit wird auf dem vom 3. Semester bekannten [[LPC2478]] realisiert.&lt;br /&gt;
&lt;br /&gt;
==== Kommunikation ====&lt;br /&gt;
Die Kommunikation der [[NIBObee]]-Roboter mit der zentralen Steuerung erfolgt über Bluetooth. Dazu wird über den auf beiden Plattformen bestehenden UART Anschluss ein Modul mit RS232-BT Umsetzung verwendet. &lt;br /&gt;
Die im Folgenden aufgelisteten Module kommen für die Umsetzung in Frage:&lt;br /&gt;
* BTM-112&lt;br /&gt;
* [[BTM-222]]&lt;br /&gt;
Die Entscheidung ist zugunsten des [[BTM-222]] gefallen. Details dazu können der [[BTM-222]]-Seite entnommen werden.&lt;br /&gt;
&lt;br /&gt;
=== Software ===&lt;br /&gt;
Details zur Software sind auf den Seiten von [[NIBObee#Software|NIBObee]] und [[LPC2478#Software|LPC2478]] zu finden.&lt;br /&gt;
&lt;br /&gt;
=== Protokolle ===&lt;br /&gt;
==== Bluetooth ====&lt;br /&gt;
Der gesamte Bluetooth Stack ist im [[BTM-222]] realsiert und muss daher im Projekt nicht betrachtet werden.&lt;br /&gt;
==== [[MaDeCo]] ====&lt;br /&gt;
Das projektspezifische Protokol zur Übertragung der Labyrinthdaten nach / bei der Erkundung und dann zu Steuerung durch das Labyrinth (&#039;&#039;&#039;Ma&#039;&#039;&#039;ze &#039;&#039;&#039;De&#039;&#039;&#039;tection and &#039;&#039;&#039;Co&#039;&#039;&#039;ntrol) ist zu definieren.&lt;br /&gt;
&lt;br /&gt;
=== Testumgebung ===&lt;br /&gt;
==== Labyrinth ====&lt;br /&gt;
Wie schon in der Angabe zu sehen ist gelten für das Labyrinth einige Annahmen die als Voraussetzungen für die Implementierung festgelegt werden:&lt;br /&gt;
* Es gibt nur gerade Linien&lt;br /&gt;
* Alle Kreuzungen sind rechtwinkelig&lt;br /&gt;
* Alle Abstände sind genau ein Vielfaches der kürzesten Verbindung der Mittelpunkte zweier Felder&lt;br /&gt;
* Alle (nicht sichtbaren) Felder sind gleich groß&lt;br /&gt;
* Das gesamte Labyrinth entspricht einer Baumstruktur, d.h. es gibt niemals zwei paralelle Wege von einem Punkt zu einem Anderen, also keine geschlossenen Schleifen.&lt;br /&gt;
* Da die Steuerung ausschließlich über die Liniensensoren implementiert wird ist die Strecke kollisionsfrei zu halten, d.h. der [[NIBObee]] wird nicht auf Kontakt mit den Fühlern durch Ausweichmanöver reagieren. &lt;br /&gt;
&lt;br /&gt;
==== Simulationen ====&lt;br /&gt;
Damit ein unabhängiges Testen der einzelnen Teile des Projekts möglich ist werden in einigen Bereichen Simulationen eingesetzt:&lt;br /&gt;
* Bluetooth-Verbindung kann mit einem PC und Terminalprogramm getestet werden&lt;br /&gt;
* [[MaDeCo]]-Protokoll wird textbasiert entworfen um mit einfachen Textfiles auf beiden Seiten testen zu können&lt;br /&gt;
&lt;br /&gt;
== Projektfortschritt ==&lt;br /&gt;
Der Projektfortschritt wird im gleichen Intervall verfolgt in dem die Lehrveranstaltung abgehalten wird&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Woche&lt;br /&gt;
!Block&lt;br /&gt;
!Tätigkeiten / Erkenntnisse&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|14.02.2011 - 20.02.2011&lt;br /&gt;
|Gemeinsam&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
* Projektdefinition: Festlegen des Projektinhalts und grobe Abstimmung der einzelnen beteiligten Komponenten.&lt;br /&gt;
* Erstellung eines Dokuments zur Projektbeschreibung&lt;br /&gt;
* Erstellen eines Projektplans &lt;br /&gt;
&amp;lt;!-- Ende Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|&#039;&#039;&#039;21.02.2011&#039;&#039;&#039;&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|&#039;&#039;&#039;Projekt akzeptiert -&amp;gt; Projektstart&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|21.02.2011 - 27.02.2011&lt;br /&gt;
|Gemeinsam&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
* Bestellungen besprochen.&lt;br /&gt;
* Wiki eingerichtet.&lt;br /&gt;
* Bestelliste für Bluetooth Module erstellt&lt;br /&gt;
** Auflistung siehe [[BTM-222#Hardware|BTM-222 Stückliste]]&lt;br /&gt;
* Gesamte Hardware bestellt:&lt;br /&gt;
** 2 NIBObee - Programmierbarer Roboter-Bausatz&lt;br /&gt;
** 5 x [[BTM-222#Hardware|BTM-222 Stückliste]] (3 x für das Nibobee und 2 x für das board) erstellt.&lt;br /&gt;
&amp;lt;!-- Ende Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Board&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Board --&amp;gt;&lt;br /&gt;
* Display Erfahrungsberichte recherchiert.&lt;br /&gt;
* Grafik Konzept (Blöcke) besprochen&lt;br /&gt;
* Beispiel Implementierungen für Touchscreen und Grafik von [[LPC2478|LPC 2478]] gesucht &lt;br /&gt;
&amp;lt;!-- Ende Inhalt Board --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|NIBObee&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt NIBObee --&amp;gt;&lt;br /&gt;
* Bestellungen besprochen.&lt;br /&gt;
* nach Bauanleitungen und Datenblätter recherchiert.&lt;br /&gt;
* Printlayout des BT-Modul für NIBObee erstellt&lt;br /&gt;
* Recherche der BTM-222 Konfigurationsmöglichkeiten.&lt;br /&gt;
* Sammeln offener Punkte, auflisten von Risiken und möglicher Massnahmen&lt;br /&gt;
&amp;lt;!-- Ende Inhalt NIBObee --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|28.02.2011 - 06.03.2011&lt;br /&gt;
|Gemeinsam&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
* Definition des proprietären Kommunikationsprotokolls [[MaDeCo| MaDeCo (&#039;&#039;&#039;Ma&#039;&#039;&#039;ze &#039;&#039;&#039;De&#039;&#039;&#039;tection and &#039;&#039;&#039;Co&#039;&#039;&#039;ntrol)]]&lt;br /&gt;
&amp;lt;!-- Ende Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Board&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Board --&amp;gt;&lt;br /&gt;
* Weitere Analyse für Touchscreen und Grafikausgabe&lt;br /&gt;
* Demo Implementierung von Hr. Kramer angefordert und eingelesen&lt;br /&gt;
* Sourcen Demo Projekt in Eclipse Ganymed geladen und Debug Optionen ergänzt&lt;br /&gt;
* Debuggingversuche, Ursachensuche für fehlende Anzeige &lt;br /&gt;
&amp;lt;!-- Ende Inhalt Board --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|NIBObee&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt NIBObee --&amp;gt;&lt;br /&gt;
* Bestellung eingetroffen. Zusammenbau der Roboter durchgeführt&lt;br /&gt;
* Detailabsprache der benötigten Roboterfunktionen&lt;br /&gt;
* Analyse der Probleme beim Befahren des Labyrinths und Abbildung auf notwendige Funktionen.&lt;br /&gt;
&amp;lt;!-- Ende Inhalt NIBObee --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|07.03.2011 - 13.03.2011&lt;br /&gt;
|Gemeinsam&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
* Recherche Ergebnisse besprochen&lt;br /&gt;
* Bauteile für Bluetooth Modul sind teilweise nicht optimal (vor allem wegen der Größe). Es werden noch Alternativen gesucht und das Layout und der Bestückungspan wurden geändert.&lt;br /&gt;
&amp;lt;!-- Ende Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Board&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Board --&amp;gt;&lt;br /&gt;
* Mehrstündiger Versuch, das Display mit Demo Applikationen zu testen&lt;br /&gt;
* daraus resultierende Tests haben ergeben dass das Display defekt war. Das Board wurde gegen ein neues getauscht&lt;br /&gt;
* neuerliche Inbetriebnahme mit Demo Applikationen&lt;br /&gt;
&amp;lt;!-- Ende Inhalt Board --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|NIBObee&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt NIBObee --&amp;gt;&lt;br /&gt;
* Installation der Entwicklungsumbegung&lt;br /&gt;
* Testen der Beispielprogramme&lt;br /&gt;
* Kalibrierung der Liniensensoren&lt;br /&gt;
* Erstellen eines Testprogramms für die Liniensensoren um die optimale Linienbreite für das Labyrinth ermitteln zu können (2 cm scheint zu breit, Kontrastwert nicht über 128).&lt;br /&gt;
&amp;lt;!-- Ende Inhalt NIBObee --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|14.03.2011 - 20.03.2011&lt;br /&gt;
|Gemeinsam&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
* Besprechung der jeweiligen Ergebnisse&lt;br /&gt;
* neue Bestückungsliste besprechen und fehlende Teile organisieren&lt;br /&gt;
&amp;lt;!-- Ende Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Board&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Board --&amp;gt;&lt;br /&gt;
* weitere Recherche nach lauffähigen Demoapplikationen&lt;br /&gt;
* Für speziell dieses Board frustrierend wenige bis keine Ergebnisse&lt;br /&gt;
&amp;lt;!-- Ende Inhalt Board --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|NIBObee&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt NIBObee --&amp;gt;&lt;br /&gt;
* Versuche mit zwei unterschiedlichen Ansätzen des Geradeauslaufs des NIBObee:&lt;br /&gt;
** Korrektur mittles Regelkreis unter Berücksichtigung der Odometriesensoren&lt;br /&gt;
** Korrektur nur mttels der Werte von den Liniensensoren&lt;br /&gt;
* Obwohl der Regelkreis eine gradeausfahrt auch ohne Linie schafft ist der Start problematisch und daher für unsere Zwecke ungeeignet&lt;br /&gt;
&amp;lt;!-- Ende Inhalt NIBObee --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|21.03.2011 - 27.03.2011&lt;br /&gt;
|Gemeinsam&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
* gegenseitiges Update&lt;br /&gt;
* fast alle Bauteile eingetroffen bzw. vorhanden, Ausnahme: Printplatte&lt;br /&gt;
** voraussichtlicher Liefertermin der Printplatte kommende Woche&lt;br /&gt;
&amp;lt;!-- Ende Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Board&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Board --&amp;gt;&lt;br /&gt;
* vergebliche Versuche, den UART in Betrieb zu nehmen&lt;br /&gt;
* gemeinsam mit Hrn. Wenzl nochmals versucht, auch ergebnislos&lt;br /&gt;
* Entschluss, das Vorgehen zu ändern&lt;br /&gt;
* neues Projekt auf Basis Interrupt Template vom 3. Semester&lt;br /&gt;
* Anpassung auf unsere Umgebung&lt;br /&gt;
&amp;lt;!-- Ende Inhalt Board --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|NIBObee&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt NIBObee --&amp;gt;&lt;br /&gt;
* Implementierung gestartet mit folgenden Funktionen:&lt;br /&gt;
* Systemtimer mit 100Hz Taktfrequenz&lt;br /&gt;
* Statemachine für folgende Module:&lt;br /&gt;
** Drive, zuständig für das fahren entlang der Linie des Labyrinths&lt;br /&gt;
** Sensor, zuständig für die Fühler. Entprellen und melden von Änderungen.&lt;br /&gt;
** Line, zuständig für das erkennen der Linie und melden von Abweichungen&lt;br /&gt;
* Scheduler, der alle Module die einen Event bearbeiten müssen aufruft.&lt;br /&gt;
&amp;lt;!-- Ende Inhalt NIBObee --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|28.03.2011 - 03.04.2011&lt;br /&gt;
|Gemeinsam&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
*Leiterplatten eingetroffen, Beginn des Aufbaus der Bluetooth Module&lt;br /&gt;
&amp;lt;!-- Ende Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Board&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Board --&amp;gt;&lt;br /&gt;
&amp;lt;!-- Ende Inhalt Board --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|NIBObee&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt NIBObee --&amp;gt;&lt;br /&gt;
*Implementieren der Linienverfolgung mit den Statemachines&lt;br /&gt;
*Neuer Modul für Distanzmessung. Wurde von der Implementierung der Odometrie-Bibliothek abgeleitet.&lt;br /&gt;
*Erfolgreiches Ausrichten des NIBObee im Zentrum eines Felds des Labyrinths&lt;br /&gt;
*Probleme beim Unterscheiden von Spurabweichung und Kreuzung. Kann mit den vorhandenen Sensoren nicht gelöst werden. Es wird eine Erweiterung des NIBObee geplant.&lt;br /&gt;
*Zusätzliche 6 LEDs für Debugzwecke über Erweiterungsports angeschlossen und Ansteuerung implementiert&lt;br /&gt;
&amp;lt;!-- Ende Inhalt NIBObee --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|04.04.2011 - 10.04.2011&lt;br /&gt;
|Gemeinsam&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
*Nochmals Bauteile für BT-Modul getauscht da ein leistungfähiger Low-Drop-Out Spannungsregeler verwendet werden soll um auch mit abgesunkener Akkuspannung noch eine konstante Spannung am BTM-222 zu haben.&lt;br /&gt;
*Das machte allerdings eine Korrektur an den fertigen Leiterplatten notwendig :-(&lt;br /&gt;
&amp;lt;!-- Ende Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Board&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Board --&amp;gt;&lt;br /&gt;
&amp;lt;!-- Ende Inhalt Board --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|NIBObee&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt NIBObee --&amp;gt;&lt;br /&gt;
*Fertigstellen des ersten Bluetooth Moduls&lt;br /&gt;
*Verbindung von NIBObee mit PC hergestellt&lt;br /&gt;
*Neue Funktionen zur Kommunikation. Senden und Empfangen mittels Interrupts implementiert&lt;br /&gt;
*Start Implementierung der State Maschine für das MaDeCo Protokoll&lt;br /&gt;
*Debug Möglichkeit mittels BT-Verbindung zum PC implementiert&lt;br /&gt;
*PC Testapplikation für die Bluetooth Verbindung mit spezieller Unterstützung des MaDeCo Protokolls implementiert.&lt;br /&gt;
*Erzeugen von DoxyGen Dokumentation&lt;br /&gt;
&amp;lt;!-- Ende Inhalt NIBObee --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|11.04.2011 - 01.05.2011&lt;br /&gt;
|Gemeinsam&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
&amp;lt;!-- Ende Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Board&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Board --&amp;gt;&lt;br /&gt;
&amp;lt;!-- Ende Inhalt Board --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|NIBObee&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt NIBObee --&amp;gt;&lt;br /&gt;
*Überarbeiten des Event-Machanismus&lt;br /&gt;
*Optimieren der Debug-Protokollierung über Bluetooth. Strings belegten zu viel Speicher. Das führte zu undefinierbarem Verhalten wegen Überschreiben von Stack und Daten.&lt;br /&gt;
*Erweitern der PC Applikation zum bedienen der NIBObee BT-Schnittstelle. Die optimierte Debug-Ausgabe kann auf Basis von speziellen Kommentaren der NIBObee-Source (debug.h) symbolisch aufbereitet werden.&lt;br /&gt;
*Erweiterung mit zusätliche Liniensensoren angefertigt&lt;br /&gt;
*Wegen zusätzlicher Liniensensoren neue Applikation zum Kalibrieren der Liniensensoren (jetzt 5 Sück) erstellt.&lt;br /&gt;
*Wegen zusätzlicher Liniensensoren ersetzen des original Moduls zum Einlesen der Analogwerte.&lt;br /&gt;
*Wegen zusätzlicher Liniensensoren ersetzen des original Moduls zum ermitteln der Werte der Liniensensoren.&lt;br /&gt;
*Kreuzungserkennung und Linienverfolgung funktionieren nun parallel, NIBObee fährt kleines Testlabyrinth gezielt ab.&lt;br /&gt;
*Waagrechte Ausrichtung des NIBObee korrigiert da der Abstand der Liniensensoren zum Boden von essentieller Bedeutung ist.&lt;br /&gt;
*Doxygen Kommentare in Code eingefügt&lt;br /&gt;
*Doxygen in Entwicklungsumgebung eingebunden&lt;br /&gt;
&amp;lt;!-- Ende Inhalt NIBObee --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|02.05.2011 - 08.05.2011&lt;br /&gt;
|Gemeinsam&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
&amp;lt;!-- Ende Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Board&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Board --&amp;gt;&lt;br /&gt;
* verschiedene UART sourcecodes aus fremden Demoapplikationen versucht auf das board zu portieren&lt;br /&gt;
&amp;lt;!-- Ende Inhalt Board --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|NIBObee&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt NIBObee --&amp;gt;&lt;br /&gt;
*Tests mit neuen, zusätzlichen Liniensensoren.&lt;br /&gt;
*Probleme mit Hardwareausfällen der neuen Erweiterung. Die Phototransistoren reagieren nicht so gut wie erwartet. Ausserdem scheinen sie sehr leicht bei den Lötarbeiten defekt zu werden. Austausch notwendig&lt;br /&gt;
*Weitere Optimierungender Debugausgaben notwendig. Zusätzliche Funktionen in Testapplikation implementiert um nicht nur die Testpunkte, sondern auch die unterschiedlichen dezimalen Werte in symbolische Ausgaben umrechnen zu können.&lt;br /&gt;
*Fehlerhafte Linienendeerkennung, optimieren des Algorithmus.&lt;br /&gt;
&amp;lt;!-- Ende Inhalt NIBObee --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|09.05.2011 - 15.05.2011&lt;br /&gt;
|Gemeinsam&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
&amp;lt;!-- Ende Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Board&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Board --&amp;gt;&lt;br /&gt;
&amp;lt;!-- Ende Inhalt Board --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|NIBObee&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt NIBObee --&amp;gt;&lt;br /&gt;
*Fertigstellen der MaDeCo State Machine für die unterschiedlichen Betriebsmodi und der Kommunikation mit dem drive Modul&lt;br /&gt;
*Implementieren der unterschiedlichen Betriebsmodi im drive Modul&lt;br /&gt;
*Test des Calibrate Modus zeigt Probleme beim Geradeauslauf nach Linienende, Kalibrierungsvorlage muss überarbeitet werden.&lt;br /&gt;
&amp;lt;!-- Ende Inhalt NIBObee --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|16.05.2011 - 22.05.2011&lt;br /&gt;
|Gemeinsam&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
&amp;lt;!-- Ende Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Board&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Board --&amp;gt;&lt;br /&gt;
&amp;lt;!-- Ende Inhalt Board --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|NIBObee&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt NIBObee --&amp;gt;&lt;br /&gt;
*Zusätzliche MaDeCo Funktionen für den Testbetrieb&lt;br /&gt;
*Erweiterung des MaDeCo Protokolls für einfachere Implementierung&lt;br /&gt;
*Überarbeiten der Inlinedokumentation&lt;br /&gt;
&amp;lt;!-- Ende Inhalt NIBObee --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|23.05.2011 - 29.05.2011&lt;br /&gt;
|Gemeinsam&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
&amp;lt;!-- Ende Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Board&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Board --&amp;gt;&lt;br /&gt;
&amp;lt;!-- Ende Inhalt Board --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|NIBObee&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt NIBObee --&amp;gt;&lt;br /&gt;
*Aktualisieren der Wiki Dokumentation&lt;br /&gt;
*Modus Calibration erfolgreich abgeschlossen, EEPROM wird mit korrekten Werten versorgt&lt;br /&gt;
*Linienverfolgung funktioniert nicht zufriedenstellend, Analyse aufwendig da beim Fehlersuchen sehr viele Daten der Liniensensoren anfallen, übertragen und ausgewertet müssen. Dabei stossen wir immer wieder an die Leistungsgrenzen des Systems.&lt;br /&gt;
&amp;lt;!-- Ende Inhalt NIBObee --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|30.05.2011 - 05.06.2011&lt;br /&gt;
|Gemeinsam&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
&amp;lt;!-- Ende Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Board&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Board --&amp;gt;&lt;br /&gt;
* PLL Initialisierung kontrolliert, marginaler Fehler korrigiert&lt;br /&gt;
* UART Initialisierung kontrolliert, nichts gefunden. UART0 Senden OK, UART1 NOK&lt;br /&gt;
* UART1 Initialisierung auf P3.16 und P3.17 führt zum Erfolg&lt;br /&gt;
* Die nötigen UART Funktionen identifiziert und modular implementiert.&lt;br /&gt;
* UART Funktionen Interrupt getrieben implementiert&lt;br /&gt;
* bluetooth Modul aufgebaut&lt;br /&gt;
&amp;lt;!-- Ende Inhalt Board --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|NIBObee&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt NIBObee --&amp;gt;&lt;br /&gt;
*Weiter massive Probleme bei der Linienverfolgung&lt;br /&gt;
*Nach Rotation entstehen üblicherweise Positionierungsfehler die sich danach aufschaukeln&lt;br /&gt;
*Follow und Drive Modul werden überarbeitet um &amp;quot;weichere&amp;quot; korrektur zu imlpementieren&lt;br /&gt;
&amp;lt;!-- Ende Inhalt NIBObee --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|06.06.2011 - 19.06.2011&lt;br /&gt;
|Gemeinsam&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
* Funktionstest für bluetooth Modul am board und interruptgetriebene UART Funktionen&lt;br /&gt;
&amp;lt;!-- Ende Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Board&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Board --&amp;gt;&lt;br /&gt;
* Interrupt Handler erweitert: signalisiert wenn message komplett (CR) empfangen&lt;br /&gt;
* Handling für Sequenz- und Acknowledge-Nummern&lt;br /&gt;
* state machine für MaDeCo Protokoll&lt;br /&gt;
* Interface zu PC-Applikation&lt;br /&gt;
&amp;lt;!-- Ende Inhalt Board --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|NIBObee&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt NIBObee --&amp;gt;&lt;br /&gt;
*Überarbeiten des Scheduling um Linienverfolgung mit mehr Priorität zu versehen&lt;br /&gt;
*Weitere Überarbeitung der Linienerkennung&lt;br /&gt;
*Verbesserung der Schnittstelle zum Board (ACK strikt nach Protokoll, keine unnötigen Ausgaben)&lt;br /&gt;
*Korrigieren des problematischen Verhaltens wegen der Meldungen des BTM-222 in der Initialisierungsphase&lt;br /&gt;
&amp;lt;!-- Ende Inhalt NIBObee --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|&#039;&#039;&#039;20.06.2011&#039;&#039;&#039;&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|&#039;&#039;&#039;Projekt präsentiert -&amp;gt; Projektende&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:FH]]&lt;/div&gt;</summary>
		<author><name>Alois</name></author>
	</entry>
	<entry>
		<id>https://wiki.callooh.com/index.php?title=RoLoMa&amp;diff=899</id>
		<title>RoLoMa</title>
		<link rel="alternate" type="text/html" href="https://wiki.callooh.com/index.php?title=RoLoMa&amp;diff=899"/>
		<updated>2011-06-24T20:04:44Z</updated>

		<summary type="html">&lt;p&gt;Alois: /* Projektfortschritt */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;RoLoMa ist der, vielleicht wenig einfallsreiche, Name des ESE-Projekts im 4. Semester. Es ist die Abkürzung für &amp;quot;Robots Lost in Maze&amp;quot;.&lt;br /&gt;
== Projektbeschreibung ==&lt;br /&gt;
=== Aufgabe ===&lt;br /&gt;
Bei diesem Projekt soll ein autonomer Roboter ein Labyrinth analysieren, alle vorhandenen Abzweigungen protokollieren und diese Daten an eine zentrale Einheit senden. Die zentrale Einheit soll einen zweiten autonomen Roboter mit diesen Daten auf dem berechneten kürzesten Weg durch das Labyrinth lotsen können. Dazu muss eine Kommunikation zwischen dem Roboter und der zentralen Einheit hergestellt werden.&lt;br /&gt;
Die oben erwähnte zentrale Einheit wird im weiteren Dokument als „Board“ bezeichnet und der autonome Roboter, aufgrund des gewählten Produkts „[[NIBObee]]“.&lt;br /&gt;
=== Details ===&lt;br /&gt;
[[File:ExampleMaze.png|thumb|120px|Beispiellabyrinth]]&lt;br /&gt;
Das Labyrinth wird eine Matrix mit vordefinierter Größe sein (z.B. 8x8) bei dem die möglichen Wege als schwarze Linie dargestellt sind. Auf dieser Linie wird sich der [[NIBObee]] bewegen. Die Aufgabe des ersten [[NIBObee]] besteht nun darin das gesamt Labyrinth abzufahren und eine Karte zu erstellen.&lt;br /&gt;
&lt;br /&gt;
Diese gesammelte Information wird dann an das Board übertragen. Dort wird das Labyrinth auf einer grafischen Ausgabe dargestellt und der Benutzer kann einen beliebigen Zielpunkt für den zweiten [[NIBObee]] festlegen. Der optimale Weg wird berechnet und der zweite [[NIBObee]] über diesen Weg an das definierte Ziel geleitet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- IMPORTANT: The following line shall be at the end of the &amp;quot;Details&amp;quot; Section to ensure that following section will start in a new line after the image! --&amp;gt;&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Aufgabenteilung ===&lt;br /&gt;
An dem Projekt sind zwei Gruppen beteiligt, eine die sich um die Roboter kümmert (Gruppe NIBObee), eine zweite die die Implementierung der zentralen Einheit (Gruppe Board) vornimmt. Gemeinsam muss die Übertragungstechnik (Hardware und Protokoll) erarbeitet werden. Die Implementierung kann dann getrennt erfolgen und am Ende des Projekts ist eine gemeinsame Testphase notwendig.&lt;br /&gt;
&lt;br /&gt;
Da noch einige Festlegungen bezüglich der verwendeten Hardware und der Übertragungstechnik ausständig sind können sich im Zuge des weiteren Projektfortschritts durchaus noch Änderungen ergeben. Für alle kritischen Elemente wird so früh wie möglich auch eine alternative Lösung als Fallback vorgesehen. Das ist notwendig für den Fall, dass sich für ein Problem keine, zumindest im Rahmen dieses Semesters, realisierbare Implementierung ergibt.&lt;br /&gt;
&lt;br /&gt;
==== Team Board ====&lt;br /&gt;
Teammitglieder dieser Gruppe sind:&lt;br /&gt;
* Michaela Escuyer&lt;br /&gt;
* Thomas Neuber&lt;br /&gt;
* Robert Pavljuk&lt;br /&gt;
==== Team NIBObee ====&lt;br /&gt;
Teammitglieder dieser Gruppe sind:&lt;br /&gt;
* Robert Peterfi&lt;br /&gt;
* Alois Pochmann&lt;br /&gt;
* Reinhard Weismann&lt;br /&gt;
&lt;br /&gt;
== Realisierung ==&lt;br /&gt;
&lt;br /&gt;
=== Plattformen / Hardware ===&lt;br /&gt;
Die Plattformen der Roboter und der Kontrolleinheit sind im Folgenden aufgelistet und stehen (wenn auch teilweise nur als Bausatz) fertig zur Verfügung. Die Hardware der Kommunikationseinrichtung wird im Zuge dieses Projekts erstellt.&lt;br /&gt;
&lt;br /&gt;
==== Roboter ====&lt;br /&gt;
Der eingesetzte Roboter ist eine [[NIBObee]] von [http://www.nicai-systems.com/de/nibobee.html Nicai-Systems]. Dieser Roboter verfügt über einen Liniensensor der es prinzipiell ermöglicht einer kontrastreichen Linie, vorzugsweise schwarze Linie auf weißem Boden, zu folgen.&lt;br /&gt;
&lt;br /&gt;
Weitere Dateils können der [[NIBObee]]-Seite entnommen werden.&lt;br /&gt;
&lt;br /&gt;
==== Kontrolleinheit ====&lt;br /&gt;
Die Zentrale Kontrolleinheit wird auf dem vom 3. Semester bekannten [[LPC2478]] realisiert.&lt;br /&gt;
&lt;br /&gt;
==== Kommunikation ====&lt;br /&gt;
Die Kommunikation der [[NIBObee]]-Roboter mit der zentralen Steuerung erfolgt über Bluetooth. Dazu wird über den auf beiden Plattformen bestehenden UART Anschluss ein Modul mit RS232-BT Umsetzung verwendet. &lt;br /&gt;
Die im Folgenden aufgelisteten Module kommen für die Umsetzung in Frage:&lt;br /&gt;
* BTM-112&lt;br /&gt;
* [[BTM-222]]&lt;br /&gt;
Die Entscheidung ist zugunsten des [[BTM-222]] gefallen. Details dazu können der [[BTM-222]]-Seite entnommen werden.&lt;br /&gt;
&lt;br /&gt;
=== Software ===&lt;br /&gt;
Details zur Software sind auf den Seiten von [[NIBObee#Software|NIBObee]] und [[LPC2478#Software|LPC2478]] zu finden.&lt;br /&gt;
&lt;br /&gt;
=== Protokolle ===&lt;br /&gt;
==== Bluetooth ====&lt;br /&gt;
Der gesamte Bluetooth Stack ist im [[BTM-222]] realsiert und muss daher im Projekt nicht betrachtet werden.&lt;br /&gt;
==== [[MaDeCo]] ====&lt;br /&gt;
Das projektspezifische Protokol zur Übertragung der Labyrinthdaten nach / bei der Erkundung und dann zu Steuerung durch das Labyrinth (&#039;&#039;&#039;Ma&#039;&#039;&#039;ze &#039;&#039;&#039;De&#039;&#039;&#039;tection and &#039;&#039;&#039;Co&#039;&#039;&#039;ntrol) ist zu definieren.&lt;br /&gt;
&lt;br /&gt;
=== Testumgebung ===&lt;br /&gt;
==== Labyrinth ====&lt;br /&gt;
Wie schon in der Angabe zu sehen ist gelten für das Labyrinth einige Annahmen die als Voraussetzungen für die Implementierung festgelegt werden:&lt;br /&gt;
* Es gibt nur gerade Linien&lt;br /&gt;
* Alle Kreuzungen sind rechtwinkelig&lt;br /&gt;
* Alle Abstände sind genau ein Vielfaches der kürzesten Verbindung der Mittelpunkte zweier Felder&lt;br /&gt;
* Alle (nicht sichtbaren) Felder sind gleich groß&lt;br /&gt;
* Das gesamte Labyrinth entspricht einer Baumstruktur, d.h. es gibt niemals zwei paralelle Wege von einem Punkt zu einem Anderen, also keine geschlossenen Schleifen.&lt;br /&gt;
* Da die Steuerung ausschließlich über die Liniensensoren implementiert wird ist die Strecke kollisionsfrei zu halten, d.h. der [[NIBObee]] wird nicht auf Kontakt mit den Fühlern durch Ausweichmanöver reagieren. &lt;br /&gt;
&lt;br /&gt;
==== Simulationen ====&lt;br /&gt;
Damit ein unabhängiges Testen der einzelnen Teile des Projekts möglich ist werden in einigen Bereichen Simulationen eingesetzt:&lt;br /&gt;
* Bluetooth-Verbindung kann mit einem PC und Terminalprogramm getestet werden&lt;br /&gt;
* [[MaDeCo]]-Protokoll wird textbasiert entworfen um mit einfachen Textfiles auf beiden Seiten testen zu können&lt;br /&gt;
&lt;br /&gt;
== Projektfortschritt ==&lt;br /&gt;
Der Projektfortschritt wird im gleichen Intervall verfolgt in dem die Lehrveranstaltung abgehalten wird&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Woche&lt;br /&gt;
!Block&lt;br /&gt;
!Tätigkeiten / Erkenntnisse&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|14.02.2011 - 20.02.2011&lt;br /&gt;
|Gemeinsam&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
* Projektdefinition: Festlegen des Projektinhalts und grobe Abstimmung der einzelnen beteiligten Komponenten.&lt;br /&gt;
* Erstellung eines Dokuments zur Projektbeschreibung&lt;br /&gt;
* Erstellen eines Projektplans &lt;br /&gt;
&amp;lt;!-- Ende Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|&#039;&#039;&#039;21.02.2011&#039;&#039;&#039;&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|&#039;&#039;&#039;Projekt akzeptiert -&amp;gt; Projektstart&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|21.02.2011 - 27.02.2011&lt;br /&gt;
|Gemeinsam&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
* Bestellungen besprochen.&lt;br /&gt;
* Wiki eingerichtet.&lt;br /&gt;
* Bestelliste für Bluetooth Module erstellt&lt;br /&gt;
** Auflistung siehe [[BTM-222#Hardware|BTM-222 Stückliste]]&lt;br /&gt;
* Gesamte Hardware bestellt:&lt;br /&gt;
** 2 NIBObee - Programmierbarer Roboter-Bausatz&lt;br /&gt;
** 5 x [[BTM-222#Hardware|BTM-222 Stückliste]] (3 x für das Nibobee und 2 x für das board) erstellt.&lt;br /&gt;
&amp;lt;!-- Ende Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Board&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Board --&amp;gt;&lt;br /&gt;
* Display Erfahrungsberichte recherchiert.&lt;br /&gt;
* Grafik Konzept (Blöcke) besprochen&lt;br /&gt;
* Beispiel Implementierungen für Touchscreen und Grafik von [[LPC2478|LPC 2478]] gesucht &lt;br /&gt;
&amp;lt;!-- Ende Inhalt Board --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|NIBObee&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt NIBObee --&amp;gt;&lt;br /&gt;
* Bestellungen besprochen.&lt;br /&gt;
* nach Bauanleitungen und Datenblätter recherchiert.&lt;br /&gt;
* Printlayout des BT-Modul für NIBObee erstellt&lt;br /&gt;
* Recherche der BTM-222 Konfigurationsmöglichkeiten.&lt;br /&gt;
* Sammeln offener Punkte, auflisten von Risiken und möglicher Massnahmen&lt;br /&gt;
&amp;lt;!-- Ende Inhalt NIBObee --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|28.02.2011 - 06.03.2011&lt;br /&gt;
|Gemeinsam&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
* Definition des proprietären Kommunikationsprotokolls [[MaDeCo| MaDeCo (&#039;&#039;&#039;Ma&#039;&#039;&#039;ze &#039;&#039;&#039;De&#039;&#039;&#039;tection and &#039;&#039;&#039;Co&#039;&#039;&#039;ntrol)]]&lt;br /&gt;
&amp;lt;!-- Ende Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Board&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Board --&amp;gt;&lt;br /&gt;
* Weitere Analyse für Touchscreen und Grafikausgabe&lt;br /&gt;
* Demo Implementierung von Hr. Kramer angefordert und eingelesen&lt;br /&gt;
* Sourcen Demo Projekt in Eclipse Ganymed geladen und Debug Optionen ergänzt&lt;br /&gt;
* Debuggingversuche, Ursachensuche für fehlende Anzeige &lt;br /&gt;
&amp;lt;!-- Ende Inhalt Board --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|NIBObee&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt NIBObee --&amp;gt;&lt;br /&gt;
* Bestellung eingetroffen. Zusammenbau der Roboter durchgeführt&lt;br /&gt;
* Detailabsprache der benötigten Roboterfunktionen&lt;br /&gt;
* Analyse der Probleme beim Befahren des Labyrinths und Abbildung auf notwendige Funktionen.&lt;br /&gt;
&amp;lt;!-- Ende Inhalt NIBObee --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|7.3.2011-13.3.2011&lt;br /&gt;
|Gemeinsam&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
* Recherche Ergebnisse besprochen&lt;br /&gt;
* Bauteile für Bluetooth Modul sind teilweise nicht optimal (vor allem wegen der Größe). Es werden noch Alternativen gesucht und das Layout und der Bestückungspan wurden geändert.&lt;br /&gt;
&amp;lt;!-- Ende Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Board&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Board --&amp;gt;&lt;br /&gt;
* Mehrstündiger Versuch, das Display mit Demo Applikationen zu testen&lt;br /&gt;
* daraus resultierende Tests haben ergeben dass das Display defekt war. Das Board wurde gegen ein neues getauscht&lt;br /&gt;
* neuerliche Inbetriebnahme mit Demo Applikationen&lt;br /&gt;
&amp;lt;!-- Ende Inhalt Board --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|NIBObee&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt NIBObee --&amp;gt;&lt;br /&gt;
* Installation der Entwicklungsumbegung&lt;br /&gt;
* Testen der Beispielprogramme&lt;br /&gt;
* Kalibrierung der Liniensensoren&lt;br /&gt;
* Erstellen eines Testprogramms für die Liniensensoren um die optimale Linienbreite für das Labyrinth ermitteln zu können (2 cm scheint zu breit, Kontrastwert nicht über 128).&lt;br /&gt;
&amp;lt;!-- Ende Inhalt NIBObee --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|14.3.2011-20.3.2011&lt;br /&gt;
|Gemeinsam&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
* Besprechung der jeweiligen Ergebnisse&lt;br /&gt;
* neue Bestückungsliste besprechen und fehlende Teile organisieren&lt;br /&gt;
&amp;lt;!-- Ende Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Board&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Board --&amp;gt;&lt;br /&gt;
* weitere Recherche nach lauffähigen Demoapplikationen&lt;br /&gt;
* Für speziell dieses Board frustrierend wenige bis keine Ergebnisse&lt;br /&gt;
&amp;lt;!-- Ende Inhalt Board --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|NIBObee&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt NIBObee --&amp;gt;&lt;br /&gt;
* Versuche mit zwei unterschiedlichen Ansätzen des Geradeauslaufs des NIBObee:&lt;br /&gt;
** Korrektur mittles Regelkreis unter Berücksichtigung der Odometriesensoren&lt;br /&gt;
** Korrektur nur mttels der Werte von den Liniensensoren&lt;br /&gt;
* Obwohl der Regelkreis eine gradeausfahrt auch ohne Linie schafft ist der Start problematisch und daher für unsere Zwecke ungeeignet&lt;br /&gt;
&amp;lt;!-- Ende Inhalt NIBObee --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|21.3.2011-27.3.2011&lt;br /&gt;
|Gemeinsam&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
* gegenseitiges Update&lt;br /&gt;
* fast alle Bauteile eingetroffen bzw. vorhanden, Ausnahme: Printplatte&lt;br /&gt;
** voraussichtlicher Liefertermin der Printplatte kommende Woche&lt;br /&gt;
&amp;lt;!-- Ende Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Board&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Board --&amp;gt;&lt;br /&gt;
* vergebliche Versuche, den UART in Betrieb zu nehmen&lt;br /&gt;
* gemeinsam mit Hrn. Wenzl nochmals versucht, auch ergebnislos&lt;br /&gt;
* Entschluss, das Vorgehen zu ändern&lt;br /&gt;
* neues Projekt auf Basis Interrupt Template vom 3. Semester&lt;br /&gt;
* Anpassung auf unsere Umgebung&lt;br /&gt;
&amp;lt;!-- Ende Inhalt Board --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|NIBObee&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt NIBObee --&amp;gt;&lt;br /&gt;
* Implementierung gestartet mit folgenden Funktionen:&lt;br /&gt;
* Systemtimer mit 100Hz Taktfrequenz&lt;br /&gt;
* Statemachine für folgende Module:&lt;br /&gt;
** Drive, zuständig für das fahren entlang der Linie des Labyrinths&lt;br /&gt;
** Sensor, zuständig für die Fühler. Entprellen und melden von Änderungen.&lt;br /&gt;
** Line, zuständig für das erkennen der Linie und melden von Abweichungen&lt;br /&gt;
* Scheduler, der alle Module die einen Event bearbeiten müssen aufruft.&lt;br /&gt;
&amp;lt;!-- Ende Inhalt NIBObee --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|28.3.2011-3.4.2011&lt;br /&gt;
|Gemeinsam&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
*Leiterplatten eingetroffen, Beginn des Aufbaus der Bluetooth Module&lt;br /&gt;
&amp;lt;!-- Ende Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Board&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Board --&amp;gt;&lt;br /&gt;
&amp;lt;!-- Ende Inhalt Board --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|NIBObee&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt NIBObee --&amp;gt;&lt;br /&gt;
*Implementieren der Linienverfolgung mit den Statemachines&lt;br /&gt;
*Neuer Modul für Distanzmessung. Wurde von der Implementierung der Odometrie-Bibliothek abgeleitet.&lt;br /&gt;
*Erfolgreiches Ausrichten des NIBObee im Zentrum eines Felds des Labyrinths&lt;br /&gt;
*Probleme beim Unterscheiden von Spurabweichung und Kreuzung. Kann mit den vorhandenen Sensoren nicht gelöst werden. Es wird eine Erweiterung des NIBObee geplant.&lt;br /&gt;
*Zusätzliche 6 LEDs für Debugzwecke über Erweiterungsports angeschlossen und Ansteuerung implementiert&lt;br /&gt;
&amp;lt;!-- Ende Inhalt NIBObee --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|4.4.2011-10.4.2011&lt;br /&gt;
|Gemeinsam&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
*Nochmals Bauteile für BT-Modul getauscht da ein leistungfähiger Low-Drop-Out Spannungsregeler verwendet werden soll um auch mit abgesunkener Akkuspannung noch eine konstante Spannung am BTM-222 zu haben.&lt;br /&gt;
*Das machte allerdings eine Korrektur an den fertigen Leiterplatten notwendig :-(&lt;br /&gt;
&amp;lt;!-- Ende Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Board&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Board --&amp;gt;&lt;br /&gt;
&amp;lt;!-- Ende Inhalt Board --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|NIBObee&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt NIBObee --&amp;gt;&lt;br /&gt;
*Fertigstellen des ersten Bluetooth Moduls&lt;br /&gt;
*Verbindung von NIBObee mit PC hergestellt&lt;br /&gt;
*Neue Funktionen zur Kommunikation. Senden und Empfangen mittels Interrupts implementiert&lt;br /&gt;
*Start Implementierung der State Maschine für das MaDeCo Protokoll&lt;br /&gt;
*Debug Möglichkeit mittels BT-Verbindung zum PC implementiert&lt;br /&gt;
*PC Testapplikation für die Bluetooth Verbindung mit spezieller Unterstützung des MaDeCo Protokolls implementiert.&lt;br /&gt;
*Erzeugen von DoxyGen Dokumentation&lt;br /&gt;
&amp;lt;!-- Ende Inhalt NIBObee --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|11.4.2011-1.5.2011&lt;br /&gt;
|Gemeinsam&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
&amp;lt;!-- Ende Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Board&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Board --&amp;gt;&lt;br /&gt;
&amp;lt;!-- Ende Inhalt Board --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|NIBObee&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt NIBObee --&amp;gt;&lt;br /&gt;
*Überarbeiten des Event-Machanismus&lt;br /&gt;
*Optimieren der Debug-Protokollierung über Bluetooth. Strings belegten zu viel Speicher. Das führte zu undefinierbarem Verhalten wegen Überschreiben von Stack und Daten.&lt;br /&gt;
*Erweitern der PC Applikation zum bedienen der NIBObee BT-Schnittstelle. Die optimierte Debug-Ausgabe kann auf Basis von speziellen Kommentaren der NIBObee-Source (debug.h) symbolisch aufbereitet werden.&lt;br /&gt;
*Erweiterung mit zusätliche Liniensensoren angefertigt&lt;br /&gt;
*Wegen zusätzlicher Liniensensoren neue Applikation zum Kalibrieren der Liniensensoren (jetzt 5 Sück) erstellt.&lt;br /&gt;
*Wegen zusätzlicher Liniensensoren ersetzen des original Moduls zum Einlesen der Analogwerte.&lt;br /&gt;
*Wegen zusätzlicher Liniensensoren ersetzen des original Moduls zum ermitteln der Werte der Liniensensoren.&lt;br /&gt;
*Kreuzungserkennung und Linienverfolgung funktionieren nun parallel, NIBObee fährt kleines Testlabyrinth gezielt ab.&lt;br /&gt;
*Waagrechte Ausrichtung des NIBObee korrigiert da der Abstand der Liniensensoren zum Boden von essentieller Bedeutung ist.&lt;br /&gt;
*Doxygen Kommentare in Code eingefügt&lt;br /&gt;
*Doxygen in Entwicklungsumgebung eingebunden&lt;br /&gt;
&amp;lt;!-- Ende Inhalt NIBObee --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|2.5.2011-8.5.2011&lt;br /&gt;
|Gemeinsam&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
&amp;lt;!-- Ende Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Board&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Board --&amp;gt;&lt;br /&gt;
* verschiedene UART sourcecodes aus fremden Demoapplikationen versucht auf das board zu portieren&lt;br /&gt;
&amp;lt;!-- Ende Inhalt Board --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|NIBObee&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt NIBObee --&amp;gt;&lt;br /&gt;
*Tests mit neuen, zusätzlichen Liniensensoren.&lt;br /&gt;
*Probleme mit Hardwareausfällen der neuen Erweiterung. Die Phototransistoren reagieren nicht so gut wie erwartet. Ausserdem scheinen sie sehr leicht bei den Lötarbeiten defekt zu werden. Austausch notwendig&lt;br /&gt;
*Weitere Optimierungender Debugausgaben notwendig. Zusätzliche Funktionen in Testapplikation implementiert um nicht nur die Testpunkte, sondern auch die unterschiedlichen dezimalen Werte in symbolische Ausgaben umrechnen zu können.&lt;br /&gt;
*Fehlerhafte Linienendeerkennung, optimieren des Algorithmus.&lt;br /&gt;
&amp;lt;!-- Ende Inhalt NIBObee --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|9.5.2011-15.5.2011&lt;br /&gt;
|Gemeinsam&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
&amp;lt;!-- Ende Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Board&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Board --&amp;gt;&lt;br /&gt;
&amp;lt;!-- Ende Inhalt Board --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|NIBObee&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt NIBObee --&amp;gt;&lt;br /&gt;
*Fertigstellen der MaDeCo State Machine für die unterschiedlichen Betriebsmodi und der Kommunikation mit dem drive Modul&lt;br /&gt;
*Implementieren der unterschiedlichen Betriebsmodi im drive Modul&lt;br /&gt;
*Test des Calibrate Modus zeigt Probleme beim Geradeauslauf nach Linienende, Kalibrierungsvorlage muss überarbeitet werden.&lt;br /&gt;
&amp;lt;!-- Ende Inhalt NIBObee --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|16.5.2011-22.5.2011&lt;br /&gt;
|Gemeinsam&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
&amp;lt;!-- Ende Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Board&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Board --&amp;gt;&lt;br /&gt;
&amp;lt;!-- Ende Inhalt Board --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|NIBObee&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt NIBObee --&amp;gt;&lt;br /&gt;
*Zusätzliche MaDeCo Funktionen für den Testbetrieb&lt;br /&gt;
*Erweiterung des MaDeCo Protokolls für einfachere Implementierung&lt;br /&gt;
*Überarbeiten der Inlinedokumentation&lt;br /&gt;
&amp;lt;!-- Ende Inhalt NIBObee --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|23.5.2011-29.5.2011&lt;br /&gt;
|Gemeinsam&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
&amp;lt;!-- Ende Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Board&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Board --&amp;gt;&lt;br /&gt;
&amp;lt;!-- Ende Inhalt Board --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|NIBObee&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt NIBObee --&amp;gt;&lt;br /&gt;
*Aktualisieren der Wiki Dokumentation&lt;br /&gt;
*Modus Calibration erfolgreich abgeschlossen, EEPROM wird mit korrekten Werten versorgt&lt;br /&gt;
*Linienverfolgung funktioniert nicht zufriedenstellend, Analyse aufwendig da beim Fehlersuchen sehr viele Daten der Liniensensoren anfallen, übertragen und ausgewertet müssen. Dabei stossen wir immer wieder an die Leistungsgrenzen des Systems.&lt;br /&gt;
&amp;lt;!-- Ende Inhalt NIBObee --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|30.5.2011-5.6.2011&lt;br /&gt;
|Gemeinsam&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
&amp;lt;!-- Ende Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Board&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Board --&amp;gt;&lt;br /&gt;
* PLL Initialisierung kontrolliert, marginaler Fehler korrigiert&lt;br /&gt;
* UART Initialisierung kontrolliert, nichts gefunden. UART0 Senden OK, UART1 NOK&lt;br /&gt;
* UART1 Initialisierung auf P3.16 und P3.17 führt zum Erfolg&lt;br /&gt;
* Die nötigen UART Funktionen identifiziert und modular implementiert.&lt;br /&gt;
* UART Funktionen Interrupt getrieben implementiert&lt;br /&gt;
* bluetooth Modul aufgebaut&lt;br /&gt;
&amp;lt;!-- Ende Inhalt Board --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|NIBObee&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt NIBObee --&amp;gt;&lt;br /&gt;
*Weiter massive Probleme bei der Linienverfolgung&lt;br /&gt;
*Nach Rotation entstehen üblicherweise Positionierungsfehler die sich danach aufschaukeln&lt;br /&gt;
*Follow und Drive Modul werden überarbeitet um &amp;quot;weichere&amp;quot; korrektur zu imlpementieren&lt;br /&gt;
&amp;lt;!-- Ende Inhalt NIBObee --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|6.6.2011-19.6.2011&lt;br /&gt;
|Gemeinsam&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
* Funktionstest für bluetooth Modul am board und interruptgetriebene UART Funktionen&lt;br /&gt;
&amp;lt;!-- Ende Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Board&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Board --&amp;gt;&lt;br /&gt;
* Interrupt Handler erweitert: signalisiert wenn message komplett (CR) empfangen&lt;br /&gt;
* Handling für Sequenz- und Acknowledge-Nummern&lt;br /&gt;
* state machine für MaDeCo Protokoll&lt;br /&gt;
* Interface zu PC-Applikation&lt;br /&gt;
&amp;lt;!-- Ende Inhalt Board --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|NIBObee&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt NIBObee --&amp;gt;&lt;br /&gt;
*Überarbeiten des Scheduling um Linienverfolgung mit mehr Priorität zu versehen&lt;br /&gt;
*Weitere Überarbeitung der Linienerkennung&lt;br /&gt;
*Verbesserung der Schnittstelle zum Board (ACK strikt nach Protokoll, keine unnötigen Ausgaben)&lt;br /&gt;
*Korrigieren des problematischen Verhaltens wegen der Meldungen des BTM-222 in der Initialisierungsphase&lt;br /&gt;
&amp;lt;!-- Ende Inhalt NIBObee --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|&#039;&#039;&#039;20.06.2011&#039;&#039;&#039;&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|&#039;&#039;&#039;Projekt präsentiert -&amp;gt; Projektende&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:FH]]&lt;/div&gt;</summary>
		<author><name>Alois</name></author>
	</entry>
	<entry>
		<id>https://wiki.callooh.com/index.php?title=RoLoMa&amp;diff=898</id>
		<title>RoLoMa</title>
		<link rel="alternate" type="text/html" href="https://wiki.callooh.com/index.php?title=RoLoMa&amp;diff=898"/>
		<updated>2011-06-24T19:53:39Z</updated>

		<summary type="html">&lt;p&gt;Alois: /* Projektfortschritt */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;RoLoMa ist der, vielleicht wenig einfallsreiche, Name des ESE-Projekts im 4. Semester. Es ist die Abkürzung für &amp;quot;Robots Lost in Maze&amp;quot;.&lt;br /&gt;
== Projektbeschreibung ==&lt;br /&gt;
=== Aufgabe ===&lt;br /&gt;
Bei diesem Projekt soll ein autonomer Roboter ein Labyrinth analysieren, alle vorhandenen Abzweigungen protokollieren und diese Daten an eine zentrale Einheit senden. Die zentrale Einheit soll einen zweiten autonomen Roboter mit diesen Daten auf dem berechneten kürzesten Weg durch das Labyrinth lotsen können. Dazu muss eine Kommunikation zwischen dem Roboter und der zentralen Einheit hergestellt werden.&lt;br /&gt;
Die oben erwähnte zentrale Einheit wird im weiteren Dokument als „Board“ bezeichnet und der autonome Roboter, aufgrund des gewählten Produkts „[[NIBObee]]“.&lt;br /&gt;
=== Details ===&lt;br /&gt;
[[File:ExampleMaze.png|thumb|120px|Beispiellabyrinth]]&lt;br /&gt;
Das Labyrinth wird eine Matrix mit vordefinierter Größe sein (z.B. 8x8) bei dem die möglichen Wege als schwarze Linie dargestellt sind. Auf dieser Linie wird sich der [[NIBObee]] bewegen. Die Aufgabe des ersten [[NIBObee]] besteht nun darin das gesamt Labyrinth abzufahren und eine Karte zu erstellen.&lt;br /&gt;
&lt;br /&gt;
Diese gesammelte Information wird dann an das Board übertragen. Dort wird das Labyrinth auf einer grafischen Ausgabe dargestellt und der Benutzer kann einen beliebigen Zielpunkt für den zweiten [[NIBObee]] festlegen. Der optimale Weg wird berechnet und der zweite [[NIBObee]] über diesen Weg an das definierte Ziel geleitet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- IMPORTANT: The following line shall be at the end of the &amp;quot;Details&amp;quot; Section to ensure that following section will start in a new line after the image! --&amp;gt;&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Aufgabenteilung ===&lt;br /&gt;
An dem Projekt sind zwei Gruppen beteiligt, eine die sich um die Roboter kümmert (Gruppe NIBObee), eine zweite die die Implementierung der zentralen Einheit (Gruppe Board) vornimmt. Gemeinsam muss die Übertragungstechnik (Hardware und Protokoll) erarbeitet werden. Die Implementierung kann dann getrennt erfolgen und am Ende des Projekts ist eine gemeinsame Testphase notwendig.&lt;br /&gt;
&lt;br /&gt;
Da noch einige Festlegungen bezüglich der verwendeten Hardware und der Übertragungstechnik ausständig sind können sich im Zuge des weiteren Projektfortschritts durchaus noch Änderungen ergeben. Für alle kritischen Elemente wird so früh wie möglich auch eine alternative Lösung als Fallback vorgesehen. Das ist notwendig für den Fall, dass sich für ein Problem keine, zumindest im Rahmen dieses Semesters, realisierbare Implementierung ergibt.&lt;br /&gt;
&lt;br /&gt;
==== Team Board ====&lt;br /&gt;
Teammitglieder dieser Gruppe sind:&lt;br /&gt;
* Michaela Escuyer&lt;br /&gt;
* Thomas Neuber&lt;br /&gt;
* Robert Pavljuk&lt;br /&gt;
==== Team NIBObee ====&lt;br /&gt;
Teammitglieder dieser Gruppe sind:&lt;br /&gt;
* Robert Peterfi&lt;br /&gt;
* Alois Pochmann&lt;br /&gt;
* Reinhard Weismann&lt;br /&gt;
&lt;br /&gt;
== Realisierung ==&lt;br /&gt;
&lt;br /&gt;
=== Plattformen / Hardware ===&lt;br /&gt;
Die Plattformen der Roboter und der Kontrolleinheit sind im Folgenden aufgelistet und stehen (wenn auch teilweise nur als Bausatz) fertig zur Verfügung. Die Hardware der Kommunikationseinrichtung wird im Zuge dieses Projekts erstellt.&lt;br /&gt;
&lt;br /&gt;
==== Roboter ====&lt;br /&gt;
Der eingesetzte Roboter ist eine [[NIBObee]] von [http://www.nicai-systems.com/de/nibobee.html Nicai-Systems]. Dieser Roboter verfügt über einen Liniensensor der es prinzipiell ermöglicht einer kontrastreichen Linie, vorzugsweise schwarze Linie auf weißem Boden, zu folgen.&lt;br /&gt;
&lt;br /&gt;
Weitere Dateils können der [[NIBObee]]-Seite entnommen werden.&lt;br /&gt;
&lt;br /&gt;
==== Kontrolleinheit ====&lt;br /&gt;
Die Zentrale Kontrolleinheit wird auf dem vom 3. Semester bekannten [[LPC2478]] realisiert.&lt;br /&gt;
&lt;br /&gt;
==== Kommunikation ====&lt;br /&gt;
Die Kommunikation der [[NIBObee]]-Roboter mit der zentralen Steuerung erfolgt über Bluetooth. Dazu wird über den auf beiden Plattformen bestehenden UART Anschluss ein Modul mit RS232-BT Umsetzung verwendet. &lt;br /&gt;
Die im Folgenden aufgelisteten Module kommen für die Umsetzung in Frage:&lt;br /&gt;
* BTM-112&lt;br /&gt;
* [[BTM-222]]&lt;br /&gt;
Die Entscheidung ist zugunsten des [[BTM-222]] gefallen. Details dazu können der [[BTM-222]]-Seite entnommen werden.&lt;br /&gt;
&lt;br /&gt;
=== Software ===&lt;br /&gt;
Details zur Software sind auf den Seiten von [[NIBObee#Software|NIBObee]] und [[LPC2478#Software|LPC2478]] zu finden.&lt;br /&gt;
&lt;br /&gt;
=== Protokolle ===&lt;br /&gt;
==== Bluetooth ====&lt;br /&gt;
Der gesamte Bluetooth Stack ist im [[BTM-222]] realsiert und muss daher im Projekt nicht betrachtet werden.&lt;br /&gt;
==== [[MaDeCo]] ====&lt;br /&gt;
Das projektspezifische Protokol zur Übertragung der Labyrinthdaten nach / bei der Erkundung und dann zu Steuerung durch das Labyrinth (&#039;&#039;&#039;Ma&#039;&#039;&#039;ze &#039;&#039;&#039;De&#039;&#039;&#039;tection and &#039;&#039;&#039;Co&#039;&#039;&#039;ntrol) ist zu definieren.&lt;br /&gt;
&lt;br /&gt;
=== Testumgebung ===&lt;br /&gt;
==== Labyrinth ====&lt;br /&gt;
Wie schon in der Angabe zu sehen ist gelten für das Labyrinth einige Annahmen die als Voraussetzungen für die Implementierung festgelegt werden:&lt;br /&gt;
* Es gibt nur gerade Linien&lt;br /&gt;
* Alle Kreuzungen sind rechtwinkelig&lt;br /&gt;
* Alle Abstände sind genau ein Vielfaches der kürzesten Verbindung der Mittelpunkte zweier Felder&lt;br /&gt;
* Alle (nicht sichtbaren) Felder sind gleich groß&lt;br /&gt;
* Das gesamte Labyrinth entspricht einer Baumstruktur, d.h. es gibt niemals zwei paralelle Wege von einem Punkt zu einem Anderen, also keine geschlossenen Schleifen.&lt;br /&gt;
* Da die Steuerung ausschließlich über die Liniensensoren implementiert wird ist die Strecke kollisionsfrei zu halten, d.h. der [[NIBObee]] wird nicht auf Kontakt mit den Fühlern durch Ausweichmanöver reagieren. &lt;br /&gt;
&lt;br /&gt;
==== Simulationen ====&lt;br /&gt;
Damit ein unabhängiges Testen der einzelnen Teile des Projekts möglich ist werden in einigen Bereichen Simulationen eingesetzt:&lt;br /&gt;
* Bluetooth-Verbindung kann mit einem PC und Terminalprogramm getestet werden&lt;br /&gt;
* [[MaDeCo]]-Protokoll wird textbasiert entworfen um mit einfachen Textfiles auf beiden Seiten testen zu können&lt;br /&gt;
&lt;br /&gt;
== Projektfortschritt ==&lt;br /&gt;
Der Projektfortschritt wird im gleichen Intervall verfolgt in dem die Lehrveranstaltung abgehalten wird&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Woche&lt;br /&gt;
!Block&lt;br /&gt;
!Tätigkeiten / Erkenntnisse&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|14.02.2011 - 20.02.2011&lt;br /&gt;
|Gemeinsam&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
* Projektdefinition: Festlegen des Projektinhalts und grobe Abstimmung der einzelnen beteiligten Komponenten.&lt;br /&gt;
* Erstellung eines Dokuments zur Projektbeschreibung&lt;br /&gt;
* Erstellen eines Projektplans &lt;br /&gt;
&amp;lt;!-- Ende Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|&#039;&#039;&#039;21.02.2011&#039;&#039;&#039;&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|&#039;&#039;&#039;Projekt akzeptiert -&amp;gt; Projektstart&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|21.02.2011 - 27.02.2011&lt;br /&gt;
|Gemeinsam&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
* Bestellungen besprochen.&lt;br /&gt;
* Wiki eingerichtet.&lt;br /&gt;
* Bestelliste für Bluetooth Module erstellt&lt;br /&gt;
** Auflistung siehe [[BTM-222#Hardware|BTM-222 Stückliste]]&lt;br /&gt;
* Gesamte Hardware bestellt:&lt;br /&gt;
** 2 NIBObee - Programmierbarer Roboter-Bausatz&lt;br /&gt;
** 5 x [[BTM-222#Hardware|BTM-222 Stückliste]] (3 x für das Nibobee und 2 x für das board) erstellt.&lt;br /&gt;
&amp;lt;!-- Ende Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Board&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Board --&amp;gt;&lt;br /&gt;
* Display Erfahrungsberichte recherchiert.&lt;br /&gt;
* Grafik Konzept (Blöcke) besprochen&lt;br /&gt;
* Beispiel Implementierungen für Touchscreen und Grafik von [[LPC2478|LPC 2478]] gesucht &lt;br /&gt;
&amp;lt;!-- Ende Inhalt Board --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|NIBObee&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt NIBObee --&amp;gt;&lt;br /&gt;
* Bestellungen besprochen.&lt;br /&gt;
* nach Bauanleitungen und Datenblätter recherchiert.&lt;br /&gt;
* Printlayout des BT-Modul für NIBObee erstellt&lt;br /&gt;
* Recherche der BTM-222 Konfigurationsmöglichkeiten.&lt;br /&gt;
* Sammeln offener Punkte, auflisten von Risiken und möglicher Massnahmen&lt;br /&gt;
&amp;lt;!-- Ende Inhalt NIBObee --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|28.02.2011 - 06.03.2011&lt;br /&gt;
|Gemeinsam&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
* Definition des proprietären Kommunikationsprotokolls [[MaDeCo| MaDeCo (&#039;&#039;&#039;Ma&#039;&#039;&#039;ze &#039;&#039;&#039;De&#039;&#039;&#039;tection and &#039;&#039;&#039;Co&#039;&#039;&#039;ntrol)]]&lt;br /&gt;
&amp;lt;!-- Ende Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Board&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Board --&amp;gt;&lt;br /&gt;
* Weitere Analyse für Touchscreen und Grafikausgabe&lt;br /&gt;
* Demo Implementierung von Hr. Kramer angefordert und eingelesen&lt;br /&gt;
* Sourcen Demo Projekt in Eclipse Ganymed geladen und Debug Optionen ergänzt&lt;br /&gt;
* Debuggingversuche, Ursachensuche für fehlende Anzeige &lt;br /&gt;
&amp;lt;!-- Ende Inhalt Board --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|NIBObee&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt NIBObee --&amp;gt;&lt;br /&gt;
* Bestellung eingetroffen. Zusammenbau der Roboter durchgeführt&lt;br /&gt;
* Detailabsprache der benötigten Roboterfunktionen&lt;br /&gt;
* Analyse der Probleme beim Befahren des Labyrinths und Abbildung auf notwendige Funktionen.&lt;br /&gt;
&amp;lt;!-- Ende Inhalt NIBObee --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|7.3.2011-13.3.2011&lt;br /&gt;
|Gemeinsam&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
* Recherche Ergebnisse besprochen&lt;br /&gt;
* Bauteile für Bluetooth Modul sind teilweise nicht optimal (vor allem wegen der Größe). Es werden noch Alternativen gesucht und das Layout und der Bestückungspan wurden geändert.&lt;br /&gt;
&amp;lt;!-- Ende Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Board&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Board --&amp;gt;&lt;br /&gt;
* Mehrstündiger Versuch, das Display mit Demo Applikationen zu testen&lt;br /&gt;
* daraus resultierende Tests haben ergeben dass das Display defekt war. Das Board wurde gegen ein neues getauscht&lt;br /&gt;
* neuerliche Inbetriebnahme mit Demo Applikationen&lt;br /&gt;
&amp;lt;!-- Ende Inhalt Board --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|NIBObee&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt NIBObee --&amp;gt;&lt;br /&gt;
* Installation der Entwicklungsumbegung&lt;br /&gt;
* Testen der Beispielprogramme&lt;br /&gt;
* Kalibrierung der Liniensensoren&lt;br /&gt;
* Erstellen eines Testprogramms für die Liniensensoren um die optimale Linienbreite für das Labyrinth ermitteln zu können (2 cm scheint zu breit, Kontrastwert nicht über 128).&lt;br /&gt;
&amp;lt;!-- Ende Inhalt NIBObee --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|14.3.2011-20.3.2011&lt;br /&gt;
|Gemeinsam&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
* Besprechung der jeweiligen Ergebnisse&lt;br /&gt;
* neue Bestückungsliste besprechen und fehlende Teile organisieren&lt;br /&gt;
&amp;lt;!-- Ende Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Board&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Board --&amp;gt;&lt;br /&gt;
* weitere Recherche nach lauffähigen Demoapplikationen&lt;br /&gt;
* Für speziell dieses Board frustrierend wenige bis keine Ergebnisse&lt;br /&gt;
&amp;lt;!-- Ende Inhalt Board --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|NIBObee&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt NIBObee --&amp;gt;&lt;br /&gt;
* Versuche mit zwei unterschiedlichen Ansätzen des Geradeauslaufs des NIBObee:&lt;br /&gt;
** Korrektur mittles Regelkreis unter Berücksichtigung der Odometriesensoren&lt;br /&gt;
** Korrektur nur mttels der Werte von den Liniensensoren&lt;br /&gt;
* Obwohl der Regelkreis eine gradeausfahrt auch ohne Linie schafft ist der Start problematisch und daher für unsere Zwecke ungeeignet&lt;br /&gt;
&amp;lt;!-- Ende Inhalt NIBObee --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|21.3.2011-27.3.2011&lt;br /&gt;
|Gemeinsam&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
* gegenseitiges Update&lt;br /&gt;
* fast alle Bauteile eingetroffen bzw. vorhanden, Ausnahme: Printplatte&lt;br /&gt;
** voraussichtlicher Liefertermin der Printplatte kommende Woche&lt;br /&gt;
&amp;lt;!-- Ende Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Board&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Board --&amp;gt;&lt;br /&gt;
* vergebliche Versuche, den UART in Betrieb zu nehmen&lt;br /&gt;
* gemeinsam mit Hrn. Wenzl nochmals versucht, auch ergebnislos&lt;br /&gt;
* Entschluss, das Vorgehen zu ändern&lt;br /&gt;
* neues Projekt auf Basis Interrupt Template vom 3. Semester&lt;br /&gt;
* Anpassung auf unsere Umgebung&lt;br /&gt;
&amp;lt;!-- Ende Inhalt Board --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|NIBObee&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt NIBObee --&amp;gt;&lt;br /&gt;
* Implementierung gestartet mit folgenden Funktionen:&lt;br /&gt;
* Systemtimer mit 100Hz Taktfrequenz&lt;br /&gt;
* Statemachine für folgende Module:&lt;br /&gt;
** Drive, zuständig für das fahren entlang der Linie des Labyrinths&lt;br /&gt;
** Sensor, zuständig für die Fühler. Entprellen und melden von Änderungen.&lt;br /&gt;
** Line, zuständig für das erkennen der Linie und melden von Abweichungen&lt;br /&gt;
* Scheduler, der alle Module die einen Event bearbeiten müssen aufruft.&lt;br /&gt;
&amp;lt;!-- Ende Inhalt NIBObee --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|28.3.2011-3.4.2011&lt;br /&gt;
|Gemeinsam&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
*Leiterplatten eingetroffen, Beginn des Aufbaus der Bluetooth Module&lt;br /&gt;
&amp;lt;!-- Ende Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Board&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Board --&amp;gt;&lt;br /&gt;
&amp;lt;!-- Ende Inhalt Board --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|NIBObee&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt NIBObee --&amp;gt;&lt;br /&gt;
*Implementieren der Linienverfolgung mit den Statemachines&lt;br /&gt;
*Neuer Modul für Distanzmessung. Wurde von der Implementierung der Odometrie-Bibliothek abgeleitet.&lt;br /&gt;
*Erfolgreiches Ausrichten des NIBObee im Zentrum eines Felds des Labyrinths&lt;br /&gt;
*Probleme beim Unterscheiden von Spurabweichung und Kreuzung. Kann mit den vorhandenen Sensoren nicht gelöst werden. Es wird eine Erweiterung des NIBObee geplant.&lt;br /&gt;
*Zusätzliche 6 LEDs für Debugzwecke über Erweiterungsports angeschlossen und Ansteuerung implementiert&lt;br /&gt;
&amp;lt;!-- Ende Inhalt NIBObee --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|4.4.2011-10.4.2011&lt;br /&gt;
|Gemeinsam&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
&amp;lt;!-- Ende Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Board&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Board --&amp;gt;&lt;br /&gt;
&amp;lt;!-- Ende Inhalt Board --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|NIBObee&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt NIBObee --&amp;gt;&lt;br /&gt;
*Fertigstellen des ersten Bluetooth Moduls&lt;br /&gt;
*Verbindung von NIBObee mit PC hergestellt&lt;br /&gt;
*Neue Funktionen zur Kommunikation. Senden und Empfangen mittels Interrupts implementiert&lt;br /&gt;
*Start Implementierung der State Maschine für das MaDeCo Protokoll&lt;br /&gt;
*Debug Möglichkeit mittels BT-Verbindung zum PC implementiert&lt;br /&gt;
*PC Testapplikation für die Bluetooth Verbindung mit spezieller Unterstützung des MaDeCo Protokolls implementiert.&lt;br /&gt;
*Erzeugen von DoxyGen Dokumentation&lt;br /&gt;
&amp;lt;!-- Ende Inhalt NIBObee --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|11.4.2011-1.5.2011&lt;br /&gt;
|Gemeinsam&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
&amp;lt;!-- Ende Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Board&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Board --&amp;gt;&lt;br /&gt;
&amp;lt;!-- Ende Inhalt Board --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|NIBObee&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt NIBObee --&amp;gt;&lt;br /&gt;
*Überarbeiten des Event-Machanismus&lt;br /&gt;
*Optimieren der Debug-Protokollierung über Bluetooth. Strings belegten zu viel Speicher. Das führte zu undefinierbarem Verhalten wegen Überschreiben von Stack und Daten.&lt;br /&gt;
*Erweitern der PC Applikation zum bedienen der NIBObee BT-Schnittstelle. Die optimierte Debug-Ausgabe kann auf Basis von speziellen Kommentaren der NIBObee-Source (debug.h) symbolisch aufbereitet werden.&lt;br /&gt;
*Erweiterung mit zusätliche Liniensensoren angefertigt&lt;br /&gt;
*Wegen zusätzlicher Liniensensoren neue Applikation zum Kalibrieren der Liniensensoren (jetzt 5 Sück) erstellt.&lt;br /&gt;
*Wegen zusätzlicher Liniensensoren ersetzen des original Moduls zum Einlesen der Analogwerte.&lt;br /&gt;
*Wegen zusätzlicher Liniensensoren ersetzen des original Moduls zum ermitteln der Werte der Liniensensoren.&lt;br /&gt;
*Kreuzungserkennung und Linienverfolgung funktionieren nun parallel, NIBObee fährt kleines Testlabyrinth gezielt ab.&lt;br /&gt;
*Waagrechte Ausrichtung des NIBObee korrigiert da der Abstand der Liniensensoren zum Boden von essentieller Bedeutung ist.&lt;br /&gt;
*Doxygen Kommentare in Code eingefügt&lt;br /&gt;
*Doxygen in Entwicklungsumgebung eingebunden&lt;br /&gt;
&amp;lt;!-- Ende Inhalt NIBObee --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|2.5.2011-8.5.2011&lt;br /&gt;
|Gemeinsam&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
&amp;lt;!-- Ende Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Board&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Board --&amp;gt;&lt;br /&gt;
* verschiedene UART sourcecodes aus fremden Demoapplikationen versucht auf das board zu portieren&lt;br /&gt;
&amp;lt;!-- Ende Inhalt Board --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|NIBObee&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt NIBObee --&amp;gt;&lt;br /&gt;
*Tests mit neuen, zusätzlichen Liniensensoren.&lt;br /&gt;
*Probleme mit Hardwareausfällen der neuen Erweiterung. Die Phototransistoren reagieren nicht so gut wie erwartet. Ausserdem scheinen sie sehr leicht bei den Lötarbeiten defekt zu werden. Austausch notwendig&lt;br /&gt;
*Weitere Optimierungender Debugausgaben notwendig. Zusätzliche Funktionen in Testapplikation implementiert um nicht nur die Testpunkte, sondern auch die unterschiedlichen dezimalen Werte in symbolische Ausgaben umrechnen zu können.&lt;br /&gt;
*Fehlerhafte Linienendeerkennung, optimieren des Algorithmus.&lt;br /&gt;
&amp;lt;!-- Ende Inhalt NIBObee --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|9.5.2011-15.5.2011&lt;br /&gt;
|Gemeinsam&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
&amp;lt;!-- Ende Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Board&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Board --&amp;gt;&lt;br /&gt;
&amp;lt;!-- Ende Inhalt Board --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|NIBObee&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt NIBObee --&amp;gt;&lt;br /&gt;
*Fertigstellen der MaDeCo State Machine für die unterschiedlichen Betriebsmodi und der Kommunikation mit dem drive Modul&lt;br /&gt;
*Implementieren der unterschiedlichen Betriebsmodi im drive Modul&lt;br /&gt;
*Test des Calibrate Modus zeigt Probleme beim Geradeauslauf nach Linienende, Kalibrierungsvorlage muss überarbeitet werden.&lt;br /&gt;
&amp;lt;!-- Ende Inhalt NIBObee --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|16.5.2011-22.5.2011&lt;br /&gt;
|Gemeinsam&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
&amp;lt;!-- Ende Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Board&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Board --&amp;gt;&lt;br /&gt;
&amp;lt;!-- Ende Inhalt Board --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|NIBObee&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt NIBObee --&amp;gt;&lt;br /&gt;
*Zusätzliche MaDeCo Funktionen für den Testbetrieb&lt;br /&gt;
*Erweiterung des MaDeCo Protokolls für einfachere Implementierung&lt;br /&gt;
*Überarbeiten der Inlinedokumentation&lt;br /&gt;
&amp;lt;!-- Ende Inhalt NIBObee --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|23.5.2011-29.5.2011&lt;br /&gt;
|Gemeinsam&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
&amp;lt;!-- Ende Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Board&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Board --&amp;gt;&lt;br /&gt;
&amp;lt;!-- Ende Inhalt Board --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|NIBObee&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt NIBObee --&amp;gt;&lt;br /&gt;
*Aktualisieren der Wiki Dokumentation&lt;br /&gt;
*Modus Calibration erfolgreich abgeschlossen, EEPROM wird mit korrekten Werten versorgt&lt;br /&gt;
*Linienverfolgung funktioniert nicht zufriedenstellend, Analyse aufwendig da beim Fehlersuchen sehr viele Daten der Liniensensoren anfallen, übertragen und ausgewertet müssen. Dabei stossen wir immer wieder an die Leistungsgrenzen des Systems.&lt;br /&gt;
&amp;lt;!-- Ende Inhalt NIBObee --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|30.5.2011-5.6.2011&lt;br /&gt;
|Gemeinsam&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
&amp;lt;!-- Ende Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Board&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Board --&amp;gt;&lt;br /&gt;
* PLL Initialisierung kontrolliert, marginaler Fehler korrigiert&lt;br /&gt;
* UART Initialisierung kontrolliert, nichts gefunden. UART0 Senden OK, UART1 NOK&lt;br /&gt;
* UART1 Initialisierung auf P3.16 und P3.17 führt zum Erfolg&lt;br /&gt;
* Die nötigen UART Funktionen identifiziert und modular implementiert.&lt;br /&gt;
* UART Funktionen Interrupt getrieben implementiert&lt;br /&gt;
* bluetooth Modul aufgebaut&lt;br /&gt;
&amp;lt;!-- Ende Inhalt Board --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|NIBObee&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt NIBObee --&amp;gt;&lt;br /&gt;
*Weiter massive Probleme bei der Linienverfolgung&lt;br /&gt;
*Nach Rotation entstehen üblicherweise Positionierungsfehler die sich danach aufschaukeln&lt;br /&gt;
*Follow und Drive Modul werden überarbeitet um &amp;quot;weichere&amp;quot; korrektur zu imlpementieren&lt;br /&gt;
&amp;lt;!-- Ende Inhalt NIBObee --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|6.6.2011-19.6.2011&lt;br /&gt;
|Gemeinsam&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
* Funktionstest für bluetooth Modul am board und interruptgetriebene UART Funktionen&lt;br /&gt;
&amp;lt;!-- Ende Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Board&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Board --&amp;gt;&lt;br /&gt;
* Interrupt Handler erweitert: signalisiert wenn message komplett (CR) empfangen&lt;br /&gt;
* Handling für Sequenz- und Acknowledge-Nummern&lt;br /&gt;
* state machine für MaDeCo Protokoll&lt;br /&gt;
* Interface zu PC-Applikation&lt;br /&gt;
&amp;lt;!-- Ende Inhalt Board --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|NIBObee&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt NIBObee --&amp;gt;&lt;br /&gt;
*Überarbeiten des Scheduling um Linienverfolgung mit mehr Priorität zu versehen&lt;br /&gt;
*Weitere Überarbeitung der Linienerkennung&lt;br /&gt;
*Verbesserung der Schnittstelle zum Board (ACK strikt nach Protokoll, keine unnötigen Ausgaben)&lt;br /&gt;
*Korrigieren des problematischen Verhaltens wegen der Meldungen des BTM-222 in der Initialisierungsphase&lt;br /&gt;
&amp;lt;!-- Ende Inhalt NIBObee --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|&#039;&#039;&#039;20.06.2011&#039;&#039;&#039;&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|&#039;&#039;&#039;Projekt präsentiert -&amp;gt; Projektende&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:FH]]&lt;/div&gt;</summary>
		<author><name>Alois</name></author>
	</entry>
	<entry>
		<id>https://wiki.callooh.com/index.php?title=RoLoMa&amp;diff=897</id>
		<title>RoLoMa</title>
		<link rel="alternate" type="text/html" href="https://wiki.callooh.com/index.php?title=RoLoMa&amp;diff=897"/>
		<updated>2011-06-24T19:47:28Z</updated>

		<summary type="html">&lt;p&gt;Alois: /* Projektfortschritt */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;RoLoMa ist der, vielleicht wenig einfallsreiche, Name des ESE-Projekts im 4. Semester. Es ist die Abkürzung für &amp;quot;Robots Lost in Maze&amp;quot;.&lt;br /&gt;
== Projektbeschreibung ==&lt;br /&gt;
=== Aufgabe ===&lt;br /&gt;
Bei diesem Projekt soll ein autonomer Roboter ein Labyrinth analysieren, alle vorhandenen Abzweigungen protokollieren und diese Daten an eine zentrale Einheit senden. Die zentrale Einheit soll einen zweiten autonomen Roboter mit diesen Daten auf dem berechneten kürzesten Weg durch das Labyrinth lotsen können. Dazu muss eine Kommunikation zwischen dem Roboter und der zentralen Einheit hergestellt werden.&lt;br /&gt;
Die oben erwähnte zentrale Einheit wird im weiteren Dokument als „Board“ bezeichnet und der autonome Roboter, aufgrund des gewählten Produkts „[[NIBObee]]“.&lt;br /&gt;
=== Details ===&lt;br /&gt;
[[File:ExampleMaze.png|thumb|120px|Beispiellabyrinth]]&lt;br /&gt;
Das Labyrinth wird eine Matrix mit vordefinierter Größe sein (z.B. 8x8) bei dem die möglichen Wege als schwarze Linie dargestellt sind. Auf dieser Linie wird sich der [[NIBObee]] bewegen. Die Aufgabe des ersten [[NIBObee]] besteht nun darin das gesamt Labyrinth abzufahren und eine Karte zu erstellen.&lt;br /&gt;
&lt;br /&gt;
Diese gesammelte Information wird dann an das Board übertragen. Dort wird das Labyrinth auf einer grafischen Ausgabe dargestellt und der Benutzer kann einen beliebigen Zielpunkt für den zweiten [[NIBObee]] festlegen. Der optimale Weg wird berechnet und der zweite [[NIBObee]] über diesen Weg an das definierte Ziel geleitet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- IMPORTANT: The following line shall be at the end of the &amp;quot;Details&amp;quot; Section to ensure that following section will start in a new line after the image! --&amp;gt;&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Aufgabenteilung ===&lt;br /&gt;
An dem Projekt sind zwei Gruppen beteiligt, eine die sich um die Roboter kümmert (Gruppe NIBObee), eine zweite die die Implementierung der zentralen Einheit (Gruppe Board) vornimmt. Gemeinsam muss die Übertragungstechnik (Hardware und Protokoll) erarbeitet werden. Die Implementierung kann dann getrennt erfolgen und am Ende des Projekts ist eine gemeinsame Testphase notwendig.&lt;br /&gt;
&lt;br /&gt;
Da noch einige Festlegungen bezüglich der verwendeten Hardware und der Übertragungstechnik ausständig sind können sich im Zuge des weiteren Projektfortschritts durchaus noch Änderungen ergeben. Für alle kritischen Elemente wird so früh wie möglich auch eine alternative Lösung als Fallback vorgesehen. Das ist notwendig für den Fall, dass sich für ein Problem keine, zumindest im Rahmen dieses Semesters, realisierbare Implementierung ergibt.&lt;br /&gt;
&lt;br /&gt;
==== Team Board ====&lt;br /&gt;
Teammitglieder dieser Gruppe sind:&lt;br /&gt;
* Michaela Escuyer&lt;br /&gt;
* Thomas Neuber&lt;br /&gt;
* Robert Pavljuk&lt;br /&gt;
==== Team NIBObee ====&lt;br /&gt;
Teammitglieder dieser Gruppe sind:&lt;br /&gt;
* Robert Peterfi&lt;br /&gt;
* Alois Pochmann&lt;br /&gt;
* Reinhard Weismann&lt;br /&gt;
&lt;br /&gt;
== Realisierung ==&lt;br /&gt;
&lt;br /&gt;
=== Plattformen / Hardware ===&lt;br /&gt;
Die Plattformen der Roboter und der Kontrolleinheit sind im Folgenden aufgelistet und stehen (wenn auch teilweise nur als Bausatz) fertig zur Verfügung. Die Hardware der Kommunikationseinrichtung wird im Zuge dieses Projekts erstellt.&lt;br /&gt;
&lt;br /&gt;
==== Roboter ====&lt;br /&gt;
Der eingesetzte Roboter ist eine [[NIBObee]] von [http://www.nicai-systems.com/de/nibobee.html Nicai-Systems]. Dieser Roboter verfügt über einen Liniensensor der es prinzipiell ermöglicht einer kontrastreichen Linie, vorzugsweise schwarze Linie auf weißem Boden, zu folgen.&lt;br /&gt;
&lt;br /&gt;
Weitere Dateils können der [[NIBObee]]-Seite entnommen werden.&lt;br /&gt;
&lt;br /&gt;
==== Kontrolleinheit ====&lt;br /&gt;
Die Zentrale Kontrolleinheit wird auf dem vom 3. Semester bekannten [[LPC2478]] realisiert.&lt;br /&gt;
&lt;br /&gt;
==== Kommunikation ====&lt;br /&gt;
Die Kommunikation der [[NIBObee]]-Roboter mit der zentralen Steuerung erfolgt über Bluetooth. Dazu wird über den auf beiden Plattformen bestehenden UART Anschluss ein Modul mit RS232-BT Umsetzung verwendet. &lt;br /&gt;
Die im Folgenden aufgelisteten Module kommen für die Umsetzung in Frage:&lt;br /&gt;
* BTM-112&lt;br /&gt;
* [[BTM-222]]&lt;br /&gt;
Die Entscheidung ist zugunsten des [[BTM-222]] gefallen. Details dazu können der [[BTM-222]]-Seite entnommen werden.&lt;br /&gt;
&lt;br /&gt;
=== Software ===&lt;br /&gt;
Details zur Software sind auf den Seiten von [[NIBObee#Software|NIBObee]] und [[LPC2478#Software|LPC2478]] zu finden.&lt;br /&gt;
&lt;br /&gt;
=== Protokolle ===&lt;br /&gt;
==== Bluetooth ====&lt;br /&gt;
Der gesamte Bluetooth Stack ist im [[BTM-222]] realsiert und muss daher im Projekt nicht betrachtet werden.&lt;br /&gt;
==== [[MaDeCo]] ====&lt;br /&gt;
Das projektspezifische Protokol zur Übertragung der Labyrinthdaten nach / bei der Erkundung und dann zu Steuerung durch das Labyrinth (&#039;&#039;&#039;Ma&#039;&#039;&#039;ze &#039;&#039;&#039;De&#039;&#039;&#039;tection and &#039;&#039;&#039;Co&#039;&#039;&#039;ntrol) ist zu definieren.&lt;br /&gt;
&lt;br /&gt;
=== Testumgebung ===&lt;br /&gt;
==== Labyrinth ====&lt;br /&gt;
Wie schon in der Angabe zu sehen ist gelten für das Labyrinth einige Annahmen die als Voraussetzungen für die Implementierung festgelegt werden:&lt;br /&gt;
* Es gibt nur gerade Linien&lt;br /&gt;
* Alle Kreuzungen sind rechtwinkelig&lt;br /&gt;
* Alle Abstände sind genau ein Vielfaches der kürzesten Verbindung der Mittelpunkte zweier Felder&lt;br /&gt;
* Alle (nicht sichtbaren) Felder sind gleich groß&lt;br /&gt;
* Das gesamte Labyrinth entspricht einer Baumstruktur, d.h. es gibt niemals zwei paralelle Wege von einem Punkt zu einem Anderen, also keine geschlossenen Schleifen.&lt;br /&gt;
* Da die Steuerung ausschließlich über die Liniensensoren implementiert wird ist die Strecke kollisionsfrei zu halten, d.h. der [[NIBObee]] wird nicht auf Kontakt mit den Fühlern durch Ausweichmanöver reagieren. &lt;br /&gt;
&lt;br /&gt;
==== Simulationen ====&lt;br /&gt;
Damit ein unabhängiges Testen der einzelnen Teile des Projekts möglich ist werden in einigen Bereichen Simulationen eingesetzt:&lt;br /&gt;
* Bluetooth-Verbindung kann mit einem PC und Terminalprogramm getestet werden&lt;br /&gt;
* [[MaDeCo]]-Protokoll wird textbasiert entworfen um mit einfachen Textfiles auf beiden Seiten testen zu können&lt;br /&gt;
&lt;br /&gt;
== Projektfortschritt ==&lt;br /&gt;
Der Projektfortschritt wird im gleichen Intervall verfolgt in dem die Lehrveranstaltung abgehalten wird&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Woche&lt;br /&gt;
!Block&lt;br /&gt;
!Tätigkeiten / Erkenntnisse&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|14.02.2011 - 20.02.2011&lt;br /&gt;
|Gemeinsam&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
* Projektdefinition: Festlegen des Projektinhalts und grobe Abstimmung der einzelnen beteiligten Komponenten.&lt;br /&gt;
* Erstellung eines Dokuments zur Projektbeschreibung&lt;br /&gt;
* Erstellen eines Projektplans &lt;br /&gt;
&amp;lt;!-- Ende Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|&#039;&#039;&#039;21.02.2011&#039;&#039;&#039;&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|&#039;&#039;&#039;Projekt akzeptiert -&amp;gt; Projektstart&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|21.02.2011 - 27.02.2011&lt;br /&gt;
|Gemeinsam&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
* Bestellungen besprochen.&lt;br /&gt;
* Wiki eingerichtet.&lt;br /&gt;
* Bestelliste für Bluetooth Module erstellt&lt;br /&gt;
** Auflistung siehe [[BTM-222#Hardware|BTM-222 Stückliste]]&lt;br /&gt;
* Gesamte Hardware bestellt:&lt;br /&gt;
** 2 NIBObee - Programmierbarer Roboter-Bausatz&lt;br /&gt;
** 5 x [[BTM-222#Hardware|BTM-222 Stückliste]] (3 x für das Nibobee und 2 x für das board) erstellt.&lt;br /&gt;
&amp;lt;!-- Ende Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Board&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Board --&amp;gt;&lt;br /&gt;
* Display Erfahrungsberichte recherchiert.&lt;br /&gt;
* Grafik Konzept (Blöcke) besprochen&lt;br /&gt;
* Beispiel Implementierungen für Touchscreen und Grafik von [[LPC2478|LPC 2478]] gesucht &lt;br /&gt;
&amp;lt;!-- Ende Inhalt Board --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|NIBObee&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt NIBObee --&amp;gt;&lt;br /&gt;
* Bestellungen besprochen.&lt;br /&gt;
* nach Bauanleitungen und Datenblätter recherchiert.&lt;br /&gt;
* Printlayout des BT-Modul für NIBObee erstellt&lt;br /&gt;
* Recherche der BTM-222 Konfigurationsmöglichkeiten.&lt;br /&gt;
* Sammeln offener Punkte, auflisten von Risiken und möglicher Massnahmen&lt;br /&gt;
&amp;lt;!-- Ende Inhalt NIBObee --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|28.02.2011 - 06.03.2011&lt;br /&gt;
|Gemeinsam&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
* Definition des proprietären Kommunikationsprotokolls [[MaDeCo| MaDeCo (&#039;&#039;&#039;Ma&#039;&#039;&#039;ze &#039;&#039;&#039;De&#039;&#039;&#039;tection and &#039;&#039;&#039;Co&#039;&#039;&#039;ntrol)]]&lt;br /&gt;
&amp;lt;!-- Ende Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Board&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Board --&amp;gt;&lt;br /&gt;
* Weitere Analyse für Touchscreen und Grafikausgabe&lt;br /&gt;
* Demo Implementierung von Hr. Kramer angefordert und eingelesen&lt;br /&gt;
* Sourcen Demo Projekt in Eclipse Ganymed geladen und Debug Optionen ergänzt&lt;br /&gt;
* Debuggingversuche, Ursachensuche für fehlende Anzeige &lt;br /&gt;
&amp;lt;!-- Ende Inhalt Board --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|NIBObee&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt NIBObee --&amp;gt;&lt;br /&gt;
* Bestellung eingetroffen. Zusammenbau der Roboter durchgeführt&lt;br /&gt;
* Detailabsprache der benötigten Roboterfunktionen&lt;br /&gt;
* Analyse der Probleme beim Befahren des Labyrinths und Abbildung auf notwendige Funktionen.&lt;br /&gt;
&amp;lt;!-- Ende Inhalt NIBObee --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|7.3.2011-13.3.2011&lt;br /&gt;
|Gemeinsam&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
* Recherche Ergebnisse besprochen&lt;br /&gt;
* Bauteile für Bluetooth Modul sind teilweise nicht optimal (vor allem wegen der Größe). Es werden noch Alternativen gesucht und das Layout und der Bestückungspan wurden geändert.&lt;br /&gt;
&amp;lt;!-- Ende Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Board&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Board --&amp;gt;&lt;br /&gt;
* Mehrstündiger Versuch, das Display mit Demo Applikationen zu testen&lt;br /&gt;
* daraus resultierende Tests haben ergeben dass das Display defekt war. Das Board wurde gegen ein neues getauscht&lt;br /&gt;
* neuerliche Inbetriebnahme mit Demo Applikationen&lt;br /&gt;
&amp;lt;!-- Ende Inhalt Board --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|NIBObee&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt NIBObee --&amp;gt;&lt;br /&gt;
* Installation der Entwicklungsumbegung&lt;br /&gt;
* Testen der Beispielprogramme&lt;br /&gt;
* Kalibrierung der Liniensensoren&lt;br /&gt;
* Erstellen eines Testprogramms für die Liniensensoren um die optimale Linienbreite für das Labyrinth ermitteln zu können (2 cm scheint zu breit, Kontrastwert nicht über 128).&lt;br /&gt;
&amp;lt;!-- Ende Inhalt NIBObee --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|14.3.2011-20.3.2011&lt;br /&gt;
|Gemeinsam&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
* Besprechung der jeweiligen Ergebnisse&lt;br /&gt;
* neue Bestückungsliste besprechen und fehlende Teile organisieren&lt;br /&gt;
&amp;lt;!-- Ende Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Board&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Board --&amp;gt;&lt;br /&gt;
* weitere Recherche nach lauffähigen Demoapplikationen&lt;br /&gt;
* Für speziell dieses Board frustrierend wenige bis keine Ergebnisse&lt;br /&gt;
&amp;lt;!-- Ende Inhalt Board --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|NIBObee&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt NIBObee --&amp;gt;&lt;br /&gt;
* Versuche mit zwei unterschiedlichen Ansätzen des Geradeauslaufs des NIBObee:&lt;br /&gt;
** Korrektur mittles Regelkreis unter Berücksichtigung der Odometriesensoren&lt;br /&gt;
** Korrektur nur mttels der Werte von den Liniensensoren&lt;br /&gt;
* Obwohl der Regelkreis eine gradeausfahrt auch ohne Linie schafft ist der Start problematisch und daher für unsere Zwecke ungeeignet&lt;br /&gt;
&amp;lt;!-- Ende Inhalt NIBObee --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|21.3.2011-27.3.2011&lt;br /&gt;
|Gemeinsam&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
* gegenseitiges Update&lt;br /&gt;
* fast alle Bauteile eingetroffen bzw. vorhanden, Ausnahme: Printplatte&lt;br /&gt;
** voraussichtlicher Liefertermin der Printplatte kommende Woche&lt;br /&gt;
&amp;lt;!-- Ende Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Board&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Board --&amp;gt;&lt;br /&gt;
* vergebliche Versuche, den UART in Betrieb zu nehmen&lt;br /&gt;
* gemeinsam mit Hrn. Wenzl nochmals versucht, auch ergebnislos&lt;br /&gt;
* Entschluss, das Vorgehen zu ändern&lt;br /&gt;
* neues Projekt auf Basis Interrupt Template vom 3. Semester&lt;br /&gt;
* Anpassung auf unsere Umgebung&lt;br /&gt;
&amp;lt;!-- Ende Inhalt Board --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|NIBObee&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt NIBObee --&amp;gt;&lt;br /&gt;
* Implementierung gestartet mit folgenden Funktionen:&lt;br /&gt;
* Systemtimer mit 100Hz Taktfrequenz&lt;br /&gt;
* Statemachine für folgende Module:&lt;br /&gt;
** Drive, zuständig für das fahren entlang der Linie des Labyrinths&lt;br /&gt;
** Sensor, zuständig für die Fühler. Entprellen und melden von Änderungen.&lt;br /&gt;
** Line, zuständig für das erkennen der Linie und melden von Abweichungen&lt;br /&gt;
* Scheduler, der alle Module die einen Event bearbeiten müssen aufruft.&lt;br /&gt;
&amp;lt;!-- Ende Inhalt NIBObee --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|28.3.2011-3.4.2011&lt;br /&gt;
|Gemeinsam&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
*Leiterplatten eingetroffen, Beginn des Aufbaus der Bluetooth Module&lt;br /&gt;
&amp;lt;!-- Ende Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Board&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Board --&amp;gt;&lt;br /&gt;
&amp;lt;!-- Ende Inhalt Board --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|NIBObee&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt NIBObee --&amp;gt;&lt;br /&gt;
*Implementieren der Linienverfolgung mit den Statemachines&lt;br /&gt;
*Neuer Modul für Distanzmessung. Wurde von der Implementierung der Odometrie-Bibliothek abgeleitet.&lt;br /&gt;
*Erfolgreiches Ausrichten des NIBObee im Zentrum eines Felds des Labyrinths&lt;br /&gt;
*Probleme beim Unterscheiden von Spurabweichung und Kreuzung. Kann mit den vorhandenen Sensoren nicht gelöst werden. Es wird eine Erweiterung des NIBObee geplant.&lt;br /&gt;
*Zusätzliche 6 LEDs für Debugzwecke über Erweiterungsports angeschlossen und Ansteuerung implementiert&lt;br /&gt;
&amp;lt;!-- Ende Inhalt NIBObee --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|4.4.2011-10.4.2011&lt;br /&gt;
|Gemeinsam&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
&amp;lt;!-- Ende Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Board&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Board --&amp;gt;&lt;br /&gt;
&amp;lt;!-- Ende Inhalt Board --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|NIBObee&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt NIBObee --&amp;gt;&lt;br /&gt;
*Fertigstellen des ersten Bluetooth Moduls&lt;br /&gt;
*Verbindung von NIBObee mit PC hergestellt&lt;br /&gt;
*Neue Funktionen zur Kommunikation. Senden und Empfangen mittels Interrupts implementiert&lt;br /&gt;
*Start Implementierung der State Maschine für das MaDeCo Protokoll&lt;br /&gt;
*Debug Möglichkeit mittels BT-Verbindung zum PC implementiert&lt;br /&gt;
*PC Testapplikation für die Bluetooth Verbindung mit spezieller Unterstützung des MaDeCo Protokolls implementiert.&lt;br /&gt;
*Erzeugen von DoxyGen Dokumentation&lt;br /&gt;
&amp;lt;!-- Ende Inhalt NIBObee --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|11.4.2011-1.5.2011&lt;br /&gt;
|Gemeinsam&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
&amp;lt;!-- Ende Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Board&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Board --&amp;gt;&lt;br /&gt;
&amp;lt;!-- Ende Inhalt Board --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|NIBObee&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt NIBObee --&amp;gt;&lt;br /&gt;
*Überarbeiten des Event-Machanismus&lt;br /&gt;
*Optimieren der Debug-Protokollierung über Bluetooth. Strings belegten zu viel Speicher. Das führte zu undefinierbarem Verhalten wegen Überschreiben von Stack und Daten.&lt;br /&gt;
*Erweitern der PC Applikation zum bedienen der NIBObee BT-Schnittstelle. Die optimierte Debug-Ausgabe kann auf Basis von speziellen Kommentaren der NIBObee-Source (debug.h) symbolisch aufbereitet werden.&lt;br /&gt;
*Erweiterung mit zusätliche Liniensensoren angefertigt&lt;br /&gt;
*Wegen zusätzlicher Liniensensoren neue Applikation zum Kalibrieren der Liniensensoren (jetzt 5 Sück) erstellt.&lt;br /&gt;
*Wegen zusätzlicher Liniensensoren ersetzen des original Moduls zum Einlesen der Analogwerte.&lt;br /&gt;
*Wegen zusätzlicher Liniensensoren ersetzen des original Moduls zum ermitteln der Werte der Liniensensoren.&lt;br /&gt;
*Kreuzungserkennung und Linienverfolgung funktionieren nun parallel, NIBObee fährt kleines Testlabyrinth gezielt ab.&lt;br /&gt;
*Waagrechte Ausrichtung des NIBObee korrigiert da der Abstand der Liniensensoren zum Boden von essentieller Bedeutung ist.&lt;br /&gt;
*Doxygen Kommentare in Code eingefügt&lt;br /&gt;
*Doxygen in Entwicklungsumgebung eingebunden&lt;br /&gt;
&amp;lt;!-- Ende Inhalt NIBObee --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|2.5.2011-8.5.2011&lt;br /&gt;
|Gemeinsam&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
&amp;lt;!-- Ende Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Board&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Board --&amp;gt;&lt;br /&gt;
* verschiedene UART sourcecodes aus fremden Demoapplikationen versucht auf das board zu portieren&lt;br /&gt;
&amp;lt;!-- Ende Inhalt Board --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|NIBObee&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt NIBObee --&amp;gt;&lt;br /&gt;
*Tests mit neuen, zusätzlichen Liniensensoren.&lt;br /&gt;
*Probleme mit Hardwareausfällen der neuen Erweiterung. Die Phototransistoren reagieren nicht so gut wie erwartet. Ausserdem scheinen sie sehr leicht bei den Lötarbeiten defekt zu werden. Austausch notwendig&lt;br /&gt;
*Weitere Optimierungender Debugausgaben notwendig. Zusätzliche Funktionen in Testapplikation implementiert um nicht nur die Testpunkte, sondern auch die unterschiedlichen dezimalen Werte in symbolische Ausgaben umrechnen zu können.&lt;br /&gt;
*Fehlerhafte Linienendeerkennung, optimieren des Algorithmus.&lt;br /&gt;
&amp;lt;!-- Ende Inhalt NIBObee --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|9.5.2011-15.5.2011&lt;br /&gt;
|Gemeinsam&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
&amp;lt;!-- Ende Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Board&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Board --&amp;gt;&lt;br /&gt;
&amp;lt;!-- Ende Inhalt Board --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|NIBObee&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt NIBObee --&amp;gt;&lt;br /&gt;
*Fertigstellen der MaDeCo State Machine für die unterschiedlichen Betriebsmodi und der Kommunikation mit dem drive Modul&lt;br /&gt;
*Implementieren der unterschiedlichen Betriebsmodi im drive Modul&lt;br /&gt;
*Test des Calibrate Modus zeigt Probleme beim Geradeauslauf nach Linienende, Kalibrierungsvorlage muss überarbeitet werden.&lt;br /&gt;
&amp;lt;!-- Ende Inhalt NIBObee --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|16.5.2011-22.5.2011&lt;br /&gt;
|Gemeinsam&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
&amp;lt;!-- Ende Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Board&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Board --&amp;gt;&lt;br /&gt;
&amp;lt;!-- Ende Inhalt Board --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|NIBObee&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt NIBObee --&amp;gt;&lt;br /&gt;
*Zusätzliche MaDeCo Funktionen für den Testbetrieb&lt;br /&gt;
*Erweiterung des MaDeCo Protokolls für einfachere Implementierung&lt;br /&gt;
*Überarbeiten der Inlinedokumentation&lt;br /&gt;
&amp;lt;!-- Ende Inhalt NIBObee --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|23.5.2011-29.5.2011&lt;br /&gt;
|Gemeinsam&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
&amp;lt;!-- Ende Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Board&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Board --&amp;gt;&lt;br /&gt;
&amp;lt;!-- Ende Inhalt Board --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|NIBObee&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt NIBObee --&amp;gt;&lt;br /&gt;
*Aktualisieren der Wiki Dokumentation&lt;br /&gt;
*Modus Calibration erfolgreich abgeschlossen, EEPROM wird mit korrekten Werten versorgt&lt;br /&gt;
&amp;lt;!-- Ende Inhalt NIBObee --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|30.5.2011-5.6.2011&lt;br /&gt;
|Gemeinsam&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
&amp;lt;!-- Ende Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Board&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Board --&amp;gt;&lt;br /&gt;
* PLL Initialisierung kontrolliert, marginaler Fehler korrigiert&lt;br /&gt;
* UART Initialisierung kontrolliert, nichts gefunden. UART0 Senden OK, UART1 NOK&lt;br /&gt;
* UART1 Initialisierung auf P3.16 und P3.17 führt zum Erfolg&lt;br /&gt;
* Die nötigen UART Funktionen identifiziert und modular implementiert.&lt;br /&gt;
* UART Funktionen Interrupt getrieben implementiert&lt;br /&gt;
* bluetooth Modul aufgebaut&lt;br /&gt;
&amp;lt;!-- Ende Inhalt Board --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|NIBObee&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt NIBObee --&amp;gt;&lt;br /&gt;
&amp;lt;!-- Ende Inhalt NIBObee --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|6.6.2011-19.6.2011&lt;br /&gt;
|Gemeinsam&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
* Funktionstest für bluetooth Modul am board und interruptgetriebene UART Funktionen&lt;br /&gt;
&amp;lt;!-- Ende Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Board&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Board --&amp;gt;&lt;br /&gt;
* Interrupt Handler erweitert: signalisiert wenn message komplett (CR) empfangen&lt;br /&gt;
* Handling für Sequenz- und Acknowledge-Nummern&lt;br /&gt;
* state machine für MaDeCo Protokoll&lt;br /&gt;
* Interface zu PC-Applikation&lt;br /&gt;
&amp;lt;!-- Ende Inhalt Board --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|NIBObee&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt NIBObee --&amp;gt;&lt;br /&gt;
*Überarbeiten des Scheduling um Linienverfolgung mit mehr Priorität zu versehen&lt;br /&gt;
*Weitere Überarbeitung der Linienerkennung&lt;br /&gt;
*Verbesserung der Schnittstelle zum Board (ACK strikt nach Protokoll, keine unnötigen Ausgaben)&lt;br /&gt;
*Korrigieren des problematischen Verhaltens wegen der Meldungen des BTM-222 in der Initialisierungsphase&lt;br /&gt;
&amp;lt;!-- Ende Inhalt NIBObee --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|&#039;&#039;&#039;20.06.2011&#039;&#039;&#039;&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|&#039;&#039;&#039;Projekt präsentiert -&amp;gt; Projektende&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:FH]]&lt;/div&gt;</summary>
		<author><name>Alois</name></author>
	</entry>
	<entry>
		<id>https://wiki.callooh.com/index.php?title=RoLoMa&amp;diff=896</id>
		<title>RoLoMa</title>
		<link rel="alternate" type="text/html" href="https://wiki.callooh.com/index.php?title=RoLoMa&amp;diff=896"/>
		<updated>2011-06-24T19:30:36Z</updated>

		<summary type="html">&lt;p&gt;Alois: /* Projektfortschritt */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;RoLoMa ist der, vielleicht wenig einfallsreiche, Name des ESE-Projekts im 4. Semester. Es ist die Abkürzung für &amp;quot;Robots Lost in Maze&amp;quot;.&lt;br /&gt;
== Projektbeschreibung ==&lt;br /&gt;
=== Aufgabe ===&lt;br /&gt;
Bei diesem Projekt soll ein autonomer Roboter ein Labyrinth analysieren, alle vorhandenen Abzweigungen protokollieren und diese Daten an eine zentrale Einheit senden. Die zentrale Einheit soll einen zweiten autonomen Roboter mit diesen Daten auf dem berechneten kürzesten Weg durch das Labyrinth lotsen können. Dazu muss eine Kommunikation zwischen dem Roboter und der zentralen Einheit hergestellt werden.&lt;br /&gt;
Die oben erwähnte zentrale Einheit wird im weiteren Dokument als „Board“ bezeichnet und der autonome Roboter, aufgrund des gewählten Produkts „[[NIBObee]]“.&lt;br /&gt;
=== Details ===&lt;br /&gt;
[[File:ExampleMaze.png|thumb|120px|Beispiellabyrinth]]&lt;br /&gt;
Das Labyrinth wird eine Matrix mit vordefinierter Größe sein (z.B. 8x8) bei dem die möglichen Wege als schwarze Linie dargestellt sind. Auf dieser Linie wird sich der [[NIBObee]] bewegen. Die Aufgabe des ersten [[NIBObee]] besteht nun darin das gesamt Labyrinth abzufahren und eine Karte zu erstellen.&lt;br /&gt;
&lt;br /&gt;
Diese gesammelte Information wird dann an das Board übertragen. Dort wird das Labyrinth auf einer grafischen Ausgabe dargestellt und der Benutzer kann einen beliebigen Zielpunkt für den zweiten [[NIBObee]] festlegen. Der optimale Weg wird berechnet und der zweite [[NIBObee]] über diesen Weg an das definierte Ziel geleitet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- IMPORTANT: The following line shall be at the end of the &amp;quot;Details&amp;quot; Section to ensure that following section will start in a new line after the image! --&amp;gt;&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Aufgabenteilung ===&lt;br /&gt;
An dem Projekt sind zwei Gruppen beteiligt, eine die sich um die Roboter kümmert (Gruppe NIBObee), eine zweite die die Implementierung der zentralen Einheit (Gruppe Board) vornimmt. Gemeinsam muss die Übertragungstechnik (Hardware und Protokoll) erarbeitet werden. Die Implementierung kann dann getrennt erfolgen und am Ende des Projekts ist eine gemeinsame Testphase notwendig.&lt;br /&gt;
&lt;br /&gt;
Da noch einige Festlegungen bezüglich der verwendeten Hardware und der Übertragungstechnik ausständig sind können sich im Zuge des weiteren Projektfortschritts durchaus noch Änderungen ergeben. Für alle kritischen Elemente wird so früh wie möglich auch eine alternative Lösung als Fallback vorgesehen. Das ist notwendig für den Fall, dass sich für ein Problem keine, zumindest im Rahmen dieses Semesters, realisierbare Implementierung ergibt.&lt;br /&gt;
&lt;br /&gt;
==== Team Board ====&lt;br /&gt;
Teammitglieder dieser Gruppe sind:&lt;br /&gt;
* Michaela Escuyer&lt;br /&gt;
* Thomas Neuber&lt;br /&gt;
* Robert Pavljuk&lt;br /&gt;
==== Team NIBObee ====&lt;br /&gt;
Teammitglieder dieser Gruppe sind:&lt;br /&gt;
* Robert Peterfi&lt;br /&gt;
* Alois Pochmann&lt;br /&gt;
* Reinhard Weismann&lt;br /&gt;
&lt;br /&gt;
== Realisierung ==&lt;br /&gt;
&lt;br /&gt;
=== Plattformen / Hardware ===&lt;br /&gt;
Die Plattformen der Roboter und der Kontrolleinheit sind im Folgenden aufgelistet und stehen (wenn auch teilweise nur als Bausatz) fertig zur Verfügung. Die Hardware der Kommunikationseinrichtung wird im Zuge dieses Projekts erstellt.&lt;br /&gt;
&lt;br /&gt;
==== Roboter ====&lt;br /&gt;
Der eingesetzte Roboter ist eine [[NIBObee]] von [http://www.nicai-systems.com/de/nibobee.html Nicai-Systems]. Dieser Roboter verfügt über einen Liniensensor der es prinzipiell ermöglicht einer kontrastreichen Linie, vorzugsweise schwarze Linie auf weißem Boden, zu folgen.&lt;br /&gt;
&lt;br /&gt;
Weitere Dateils können der [[NIBObee]]-Seite entnommen werden.&lt;br /&gt;
&lt;br /&gt;
==== Kontrolleinheit ====&lt;br /&gt;
Die Zentrale Kontrolleinheit wird auf dem vom 3. Semester bekannten [[LPC2478]] realisiert.&lt;br /&gt;
&lt;br /&gt;
==== Kommunikation ====&lt;br /&gt;
Die Kommunikation der [[NIBObee]]-Roboter mit der zentralen Steuerung erfolgt über Bluetooth. Dazu wird über den auf beiden Plattformen bestehenden UART Anschluss ein Modul mit RS232-BT Umsetzung verwendet. &lt;br /&gt;
Die im Folgenden aufgelisteten Module kommen für die Umsetzung in Frage:&lt;br /&gt;
* BTM-112&lt;br /&gt;
* [[BTM-222]]&lt;br /&gt;
Die Entscheidung ist zugunsten des [[BTM-222]] gefallen. Details dazu können der [[BTM-222]]-Seite entnommen werden.&lt;br /&gt;
&lt;br /&gt;
=== Software ===&lt;br /&gt;
Details zur Software sind auf den Seiten von [[NIBObee#Software|NIBObee]] und [[LPC2478#Software|LPC2478]] zu finden.&lt;br /&gt;
&lt;br /&gt;
=== Protokolle ===&lt;br /&gt;
==== Bluetooth ====&lt;br /&gt;
Der gesamte Bluetooth Stack ist im [[BTM-222]] realsiert und muss daher im Projekt nicht betrachtet werden.&lt;br /&gt;
==== [[MaDeCo]] ====&lt;br /&gt;
Das projektspezifische Protokol zur Übertragung der Labyrinthdaten nach / bei der Erkundung und dann zu Steuerung durch das Labyrinth (&#039;&#039;&#039;Ma&#039;&#039;&#039;ze &#039;&#039;&#039;De&#039;&#039;&#039;tection and &#039;&#039;&#039;Co&#039;&#039;&#039;ntrol) ist zu definieren.&lt;br /&gt;
&lt;br /&gt;
=== Testumgebung ===&lt;br /&gt;
==== Labyrinth ====&lt;br /&gt;
Wie schon in der Angabe zu sehen ist gelten für das Labyrinth einige Annahmen die als Voraussetzungen für die Implementierung festgelegt werden:&lt;br /&gt;
* Es gibt nur gerade Linien&lt;br /&gt;
* Alle Kreuzungen sind rechtwinkelig&lt;br /&gt;
* Alle Abstände sind genau ein Vielfaches der kürzesten Verbindung der Mittelpunkte zweier Felder&lt;br /&gt;
* Alle (nicht sichtbaren) Felder sind gleich groß&lt;br /&gt;
* Das gesamte Labyrinth entspricht einer Baumstruktur, d.h. es gibt niemals zwei paralelle Wege von einem Punkt zu einem Anderen, also keine geschlossenen Schleifen.&lt;br /&gt;
* Da die Steuerung ausschließlich über die Liniensensoren implementiert wird ist die Strecke kollisionsfrei zu halten, d.h. der [[NIBObee]] wird nicht auf Kontakt mit den Fühlern durch Ausweichmanöver reagieren. &lt;br /&gt;
&lt;br /&gt;
==== Simulationen ====&lt;br /&gt;
Damit ein unabhängiges Testen der einzelnen Teile des Projekts möglich ist werden in einigen Bereichen Simulationen eingesetzt:&lt;br /&gt;
* Bluetooth-Verbindung kann mit einem PC und Terminalprogramm getestet werden&lt;br /&gt;
* [[MaDeCo]]-Protokoll wird textbasiert entworfen um mit einfachen Textfiles auf beiden Seiten testen zu können&lt;br /&gt;
&lt;br /&gt;
== Projektfortschritt ==&lt;br /&gt;
Der Projektfortschritt wird im gleichen Intervall verfolgt in dem die Lehrveranstaltung abgehalten wird&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Woche&lt;br /&gt;
!Block&lt;br /&gt;
!Tätigkeiten / Erkenntnisse&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|14.02.2011 - 20.02.2011&lt;br /&gt;
|Gemeinsam&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
* Projektdefinition: Festlegen des Projektinhalts und grobe Abstimmung der einzelnen beteiligten Komponenten.&lt;br /&gt;
* Erstellung eines Dokuments zur Projektbeschreibung&lt;br /&gt;
* Erstellen eines Projektplans &lt;br /&gt;
&amp;lt;!-- Ende Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|&#039;&#039;&#039;21.02.2011&#039;&#039;&#039;&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|&#039;&#039;&#039;Projekt akzeptiert -&amp;gt; Projektstart&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|21.02.2011 - 27.02.2011&lt;br /&gt;
|Gemeinsam&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
* Bestellungen besprochen.&lt;br /&gt;
* Wiki eingerichtet.&lt;br /&gt;
* Bestelliste für Bluetooth Module erstellt&lt;br /&gt;
** Auflistung siehe [[BTM-222#Hardware|BTM-222 Stückliste]]&lt;br /&gt;
* Gesamte Hardware bestellt:&lt;br /&gt;
** 2 NIBObee - Programmierbarer Roboter-Bausatz&lt;br /&gt;
** 5 x [[BTM-222#Hardware|BTM-222 Stückliste]] (3 x für das Nibobee und 2 x für das board) erstellt.&lt;br /&gt;
&amp;lt;!-- Ende Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Board&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Board --&amp;gt;&lt;br /&gt;
* Display Erfahrungsberichte recherchiert.&lt;br /&gt;
* Grafik Konzept (Blöcke) besprochen&lt;br /&gt;
* Beispiel Implementierungen für Touchscreen und Grafik von [[LPC2478|LPC 2478]] gesucht &lt;br /&gt;
&amp;lt;!-- Ende Inhalt Board --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|NIBObee&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt NIBObee --&amp;gt;&lt;br /&gt;
* Bestellungen besprochen.&lt;br /&gt;
* nach Bauanleitungen und Datenblätter recherchiert.&lt;br /&gt;
* Printlayout des BT-Modul für NIBObee erstellt&lt;br /&gt;
* Recherche der BTM-222 Konfigurationsmöglichkeiten.&lt;br /&gt;
* Sammeln offener Punkte, auflisten von Risiken und möglicher Massnahmen&lt;br /&gt;
&amp;lt;!-- Ende Inhalt NIBObee --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|28.02.2011 - 06.03.2011&lt;br /&gt;
|Gemeinsam&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
* Definition des proprietären Kommunikationsprotokolls [[MaDeCo| MaDeCo (&#039;&#039;&#039;Ma&#039;&#039;&#039;ze &#039;&#039;&#039;De&#039;&#039;&#039;tection and &#039;&#039;&#039;Co&#039;&#039;&#039;ntrol)]]&lt;br /&gt;
&amp;lt;!-- Ende Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Board&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Board --&amp;gt;&lt;br /&gt;
* Weitere Analyse für Touchscreen und Grafikausgabe&lt;br /&gt;
* Demo Implementierung von Hr. Kramer angefordert und eingelesen&lt;br /&gt;
* Sourcen Demo Projekt in Eclipse Ganymed geladen und Debug Optionen ergänzt&lt;br /&gt;
* Debuggingversuche, Ursachensuche für fehlende Anzeige &lt;br /&gt;
&amp;lt;!-- Ende Inhalt Board --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|NIBObee&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt NIBObee --&amp;gt;&lt;br /&gt;
* Bestellung eingetroffen. Zusammenbau der Roboter durchgeführt&lt;br /&gt;
* Detailabsprache der benötigten Roboterfunktionen&lt;br /&gt;
* Analyse der Probleme beim Befahren des Labyrinths und Abbildung auf notwendige Funktionen.&lt;br /&gt;
&amp;lt;!-- Ende Inhalt NIBObee --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|7.3.2011-13.3.2011&lt;br /&gt;
|Gemeinsam&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
* Recherche Ergebnisse besprochen&lt;br /&gt;
* Bauteile für Bluetooth Modul sind teilweise nicht optimal (vor allem wegen der Größe). Es werden noch Alternativen gesucht und das Layout und der Bestückungspan wurden geändert.&lt;br /&gt;
&amp;lt;!-- Ende Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Board&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Board --&amp;gt;&lt;br /&gt;
* Mehrstündiger Versuch, das Display mit Demo Applikationen zu testen&lt;br /&gt;
* daraus resultierende Tests haben ergeben dass das Display defekt war. Das Board wurde gegen ein neues getauscht&lt;br /&gt;
* neuerliche Inbetriebnahme mit Demo Applikationen&lt;br /&gt;
&amp;lt;!-- Ende Inhalt Board --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|NIBObee&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt NIBObee --&amp;gt;&lt;br /&gt;
* Installation der Entwicklungsumbegung&lt;br /&gt;
* Testen der Beispielprogramme&lt;br /&gt;
* Kalibrierung der Liniensensoren&lt;br /&gt;
* Erstellen eines Testprogramms für die Liniensensoren um die optimale Linienbreite für das Labyrinth ermitteln zu können (2 cm scheint zu breit, Kontrastwert nicht über 128).&lt;br /&gt;
&amp;lt;!-- Ende Inhalt NIBObee --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|14.3.2011-20.3.2011&lt;br /&gt;
|Gemeinsam&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
* Besprechung der jeweiligen Ergebnisse&lt;br /&gt;
* neue Bestückungsliste besprechen und fehlende Teile organisieren&lt;br /&gt;
&amp;lt;!-- Ende Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Board&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Board --&amp;gt;&lt;br /&gt;
* weitere Recherche nach lauffähigen Demoapplikationen&lt;br /&gt;
* Für speziell dieses Board frustrierend wenige bis keine Ergebnisse&lt;br /&gt;
&amp;lt;!-- Ende Inhalt Board --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|NIBObee&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt NIBObee --&amp;gt;&lt;br /&gt;
* Versuche mit zwei unterschiedlichen Ansätzen des Geradeauslaufs des NIBObee:&lt;br /&gt;
** Korrektur mittles Regelkreis unter Berücksichtigung der Odometriesensoren&lt;br /&gt;
** Korrektur nur mttels der Werte von den Liniensensoren&lt;br /&gt;
* Obwohl der Regelkreis eine gradeausfahrt auch ohne Linie schafft ist der Start problematisch und daher für unsere Zwecke ungeeignet&lt;br /&gt;
&amp;lt;!-- Ende Inhalt NIBObee --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|21.3.2011-27.3.2011&lt;br /&gt;
|Gemeinsam&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
* gegenseitiges Update&lt;br /&gt;
* fast alle Bauteile eingetroffen bzw. vorhanden, Ausnahme: Printplatte&lt;br /&gt;
** voraussichtlicher Liefertermin der Printplatte kommende Woche&lt;br /&gt;
&amp;lt;!-- Ende Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Board&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Board --&amp;gt;&lt;br /&gt;
* vergebliche Versuche, den UART in Betrieb zu nehmen&lt;br /&gt;
* gemeinsam mit Hrn. Wenzl nochmals versucht, auch ergebnislos&lt;br /&gt;
* Entschluss, das Vorgehen zu ändern&lt;br /&gt;
* neues Projekt auf Basis Interrupt Template vom 3. Semester&lt;br /&gt;
* Anpassung auf unsere Umgebung&lt;br /&gt;
&amp;lt;!-- Ende Inhalt Board --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|NIBObee&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt NIBObee --&amp;gt;&lt;br /&gt;
* Implementierung gestartet mit folgenden Funktionen:&lt;br /&gt;
* Systemtimer mit 100Hz Taktfrequenz&lt;br /&gt;
* Statemachine für folgende Module:&lt;br /&gt;
** Drive, zuständig für das fahren entlang der Linie des Labyrinths&lt;br /&gt;
** Sensor, zuständig für die Fühler. Entprellen und melden von Änderungen.&lt;br /&gt;
** Line, zuständig für das erkennen der Linie und melden von Abweichungen&lt;br /&gt;
* Scheduler, der alle Module die einen Event bearbeiten müssen aufruft.&lt;br /&gt;
&amp;lt;!-- Ende Inhalt NIBObee --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|28.3.2011-3.4.2011&lt;br /&gt;
|Gemeinsam&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
*Leiterplatten eingetroffen, Beginn des Aufbaus der Bluetooth Module&lt;br /&gt;
&amp;lt;!-- Ende Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Board&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Board --&amp;gt;&lt;br /&gt;
&amp;lt;!-- Ende Inhalt Board --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|NIBObee&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt NIBObee --&amp;gt;&lt;br /&gt;
*Implementieren der Linienverfolgung mit den Statemachines&lt;br /&gt;
*Neuer Modul für Distanzmessung. Wurde von der Implementierung der Odometrie-Bibliothek abgeleitet.&lt;br /&gt;
*Erfolgreiches Ausrichten des NIBObee im Zentrum eines Felds des Labyrinths&lt;br /&gt;
*Probleme beim Unterscheiden von Spurabweichung und Kreuzung. Kann mit den vorhandenen Sensoren nicht gelöst werden. Es wird eine Erweiterung des NIBObee geplant.&lt;br /&gt;
&amp;lt;!-- Ende Inhalt NIBObee --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|4.4.2011-10.4.2011&lt;br /&gt;
|Gemeinsam&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
&amp;lt;!-- Ende Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Board&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Board --&amp;gt;&lt;br /&gt;
&amp;lt;!-- Ende Inhalt Board --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|NIBObee&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt NIBObee --&amp;gt;&lt;br /&gt;
*Fertigstellen des ersten Bluetooth Moduls&lt;br /&gt;
*Verbindung von NIBObee mit PC hergestellt&lt;br /&gt;
*Neue Funktionen zur Kommunikation. Senden und Empfangen mittels Interrupts implementiert&lt;br /&gt;
*Start Implementierung der State Maschine für das MaDeCo Protokoll&lt;br /&gt;
*Debug Möglichkeit mittels BT-Verbindung zum PC implementiert&lt;br /&gt;
*PC Testapplikation für die Bluetooth Verbindung mit spezieller Unterstützung des MaDeCo Protokolls implementiert.&lt;br /&gt;
*Erzeugen von DoxyGen Dokumentation&lt;br /&gt;
&amp;lt;!-- Ende Inhalt NIBObee --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|11.4.2011-1.5.2011&lt;br /&gt;
|Gemeinsam&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
&amp;lt;!-- Ende Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Board&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Board --&amp;gt;&lt;br /&gt;
&amp;lt;!-- Ende Inhalt Board --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|NIBObee&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt NIBObee --&amp;gt;&lt;br /&gt;
*Überarbeiten des Event-Machanismus&lt;br /&gt;
*Optimieren der Debug-Protokollierung über Bluetooth. Strings belegten zu viel Speicher. Das führte zu undefinierbarem Verhalten wegen Überschreiben von Stack und Daten.&lt;br /&gt;
*Erweitern der PC Applikation zum bedienen der NIBObee BT-Schnittstelle. Die optimierte Debug-Ausgabe kann auf Basis von speziellen Kommentaren der NIBObee-Source (debug.h) symbolisch aufbereitet werden.&lt;br /&gt;
*Erweiterung mit zusätliche Liniensensoren angefertigt&lt;br /&gt;
*Wegen zusätzlicher Liniensensoren neue Applikation zum Kalibrieren der Liniensensoren (jetzt 5 Sück) erstellt.&lt;br /&gt;
*Wegen zusätzlicher Liniensensoren ersetzen des original Moduls zum Einlesen der Analogwerte.&lt;br /&gt;
*Wegen zusätzlicher Liniensensoren ersetzen des original Moduls zum ermitteln der Werte der Liniensensoren.&lt;br /&gt;
*Kreuzungserkennung und Linienverfolgung funktionieren nun parallel, NIBObee fährt kleines Testlabyrinth gezielt ab.&lt;br /&gt;
*Waagrechte Ausrichtung des NIBObee korrigiert da der Abstand der Liniensensoren zum Boden von essentieller Bedeutung ist.&lt;br /&gt;
&amp;lt;!-- Ende Inhalt NIBObee --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|2.5.2011-8.5.2011&lt;br /&gt;
|Gemeinsam&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
&amp;lt;!-- Ende Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Board&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Board --&amp;gt;&lt;br /&gt;
* verschiedene UART sourcecodes aus fremden Demoapplikationen versucht auf das board zu portieren&lt;br /&gt;
&amp;lt;!-- Ende Inhalt Board --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|NIBObee&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt NIBObee --&amp;gt;&lt;br /&gt;
*Tests mit neuen, zusätzlichen Liniensensoren.&lt;br /&gt;
*Probleme mit Hardwareausfällen der neuen Erweiterung. Die Phototransistoren reagieren nicht so gut wie erwartet. Ausserdem scheinen sie sehr leicht bei den Lötarbeiten defekt zu werden. Austausch notwendig&lt;br /&gt;
*Weitere Optimierungender Debugausgaben notwendig. Zusätzliche Funktionen in Testapplikation implementiert um nicht nur die Testpunkte, sondern auch die unterschiedlichen dezimalen Werte in symbolische Ausgaben umrechnen zu können.&lt;br /&gt;
&amp;lt;!-- Ende Inhalt NIBObee --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|9.5.2011-15.5.2011&lt;br /&gt;
|Gemeinsam&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
&amp;lt;!-- Ende Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Board&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Board --&amp;gt;&lt;br /&gt;
&amp;lt;!-- Ende Inhalt Board --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|NIBObee&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt NIBObee --&amp;gt;&lt;br /&gt;
*Implementieren der MaDeCo State Machine und der Kommunikation mit dem drive Modul&lt;br /&gt;
&amp;lt;!-- Ende Inhalt NIBObee --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|16.5.2011-22.5.2011&lt;br /&gt;
|Gemeinsam&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
&amp;lt;!-- Ende Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Board&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Board --&amp;gt;&lt;br /&gt;
&amp;lt;!-- Ende Inhalt Board --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|NIBObee&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt NIBObee --&amp;gt;&lt;br /&gt;
*Zusätzliche MaDeCo Funktionen für den Testbetrieb&lt;br /&gt;
*Erweiterung des MaDeCo Protokolls für einfachere Implementierung&lt;br /&gt;
&amp;lt;!-- Ende Inhalt NIBObee --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|23.5.2011-29.5.2011&lt;br /&gt;
|Gemeinsam&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
&amp;lt;!-- Ende Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Board&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Board --&amp;gt;&lt;br /&gt;
&amp;lt;!-- Ende Inhalt Board --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|NIBObee&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt NIBObee --&amp;gt;&lt;br /&gt;
*Aktualisieren der Wiki Dokumentation&lt;br /&gt;
&amp;lt;!-- Ende Inhalt NIBObee --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|30.5.2011-5.6.2011&lt;br /&gt;
|Gemeinsam&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
&amp;lt;!-- Ende Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Board&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Board --&amp;gt;&lt;br /&gt;
* PLL Initialisierung kontrolliert, marginaler Fehler korrigiert&lt;br /&gt;
* UART Initialisierung kontrolliert, nichts gefunden. UART0 Senden OK, UART1 NOK&lt;br /&gt;
* UART1 Initialisierung auf P3.16 und P3.17 führt zum Erfolg&lt;br /&gt;
* Die nötigen UART Funktionen identifiziert und modular implementiert.&lt;br /&gt;
* UART Funktionen Interrupt getrieben implementiert&lt;br /&gt;
* bluetooth Modul aufgebaut&lt;br /&gt;
&amp;lt;!-- Ende Inhalt Board --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|NIBObee&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt NIBObee --&amp;gt;&lt;br /&gt;
&amp;lt;!-- Ende Inhalt NIBObee --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|6.6.2011-19.6.2011&lt;br /&gt;
|Gemeinsam&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
* Funktionstest für bluetooth Modul am board und interruptgetriebene UART Funktionen&lt;br /&gt;
&amp;lt;!-- Ende Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Board&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Board --&amp;gt;&lt;br /&gt;
* Interrupt Handler erweitert: signalisiert wenn message komplett (CR) empfangen&lt;br /&gt;
* Handling für Sequenz- und Acknowledge-Nummern&lt;br /&gt;
* state machine für MaDeCo Protokoll&lt;br /&gt;
* Interface zu PC-Applikation&lt;br /&gt;
&amp;lt;!-- Ende Inhalt Board --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|NIBObee&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt NIBObee --&amp;gt;&lt;br /&gt;
&amp;lt;!-- Ende Inhalt NIBObee --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|&#039;&#039;&#039;20.06.2011&#039;&#039;&#039;&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|&#039;&#039;&#039;Projekt präsentiert -&amp;gt; Projektende&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:FH]]&lt;/div&gt;</summary>
		<author><name>Alois</name></author>
	</entry>
	<entry>
		<id>https://wiki.callooh.com/index.php?title=RoLoMa&amp;diff=895</id>
		<title>RoLoMa</title>
		<link rel="alternate" type="text/html" href="https://wiki.callooh.com/index.php?title=RoLoMa&amp;diff=895"/>
		<updated>2011-06-24T19:21:52Z</updated>

		<summary type="html">&lt;p&gt;Alois: /* Projektfortschritt */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;RoLoMa ist der, vielleicht wenig einfallsreiche, Name des ESE-Projekts im 4. Semester. Es ist die Abkürzung für &amp;quot;Robots Lost in Maze&amp;quot;.&lt;br /&gt;
== Projektbeschreibung ==&lt;br /&gt;
=== Aufgabe ===&lt;br /&gt;
Bei diesem Projekt soll ein autonomer Roboter ein Labyrinth analysieren, alle vorhandenen Abzweigungen protokollieren und diese Daten an eine zentrale Einheit senden. Die zentrale Einheit soll einen zweiten autonomen Roboter mit diesen Daten auf dem berechneten kürzesten Weg durch das Labyrinth lotsen können. Dazu muss eine Kommunikation zwischen dem Roboter und der zentralen Einheit hergestellt werden.&lt;br /&gt;
Die oben erwähnte zentrale Einheit wird im weiteren Dokument als „Board“ bezeichnet und der autonome Roboter, aufgrund des gewählten Produkts „[[NIBObee]]“.&lt;br /&gt;
=== Details ===&lt;br /&gt;
[[File:ExampleMaze.png|thumb|120px|Beispiellabyrinth]]&lt;br /&gt;
Das Labyrinth wird eine Matrix mit vordefinierter Größe sein (z.B. 8x8) bei dem die möglichen Wege als schwarze Linie dargestellt sind. Auf dieser Linie wird sich der [[NIBObee]] bewegen. Die Aufgabe des ersten [[NIBObee]] besteht nun darin das gesamt Labyrinth abzufahren und eine Karte zu erstellen.&lt;br /&gt;
&lt;br /&gt;
Diese gesammelte Information wird dann an das Board übertragen. Dort wird das Labyrinth auf einer grafischen Ausgabe dargestellt und der Benutzer kann einen beliebigen Zielpunkt für den zweiten [[NIBObee]] festlegen. Der optimale Weg wird berechnet und der zweite [[NIBObee]] über diesen Weg an das definierte Ziel geleitet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- IMPORTANT: The following line shall be at the end of the &amp;quot;Details&amp;quot; Section to ensure that following section will start in a new line after the image! --&amp;gt;&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Aufgabenteilung ===&lt;br /&gt;
An dem Projekt sind zwei Gruppen beteiligt, eine die sich um die Roboter kümmert (Gruppe NIBObee), eine zweite die die Implementierung der zentralen Einheit (Gruppe Board) vornimmt. Gemeinsam muss die Übertragungstechnik (Hardware und Protokoll) erarbeitet werden. Die Implementierung kann dann getrennt erfolgen und am Ende des Projekts ist eine gemeinsame Testphase notwendig.&lt;br /&gt;
&lt;br /&gt;
Da noch einige Festlegungen bezüglich der verwendeten Hardware und der Übertragungstechnik ausständig sind können sich im Zuge des weiteren Projektfortschritts durchaus noch Änderungen ergeben. Für alle kritischen Elemente wird so früh wie möglich auch eine alternative Lösung als Fallback vorgesehen. Das ist notwendig für den Fall, dass sich für ein Problem keine, zumindest im Rahmen dieses Semesters, realisierbare Implementierung ergibt.&lt;br /&gt;
&lt;br /&gt;
==== Team Board ====&lt;br /&gt;
Teammitglieder dieser Gruppe sind:&lt;br /&gt;
* Michaela Escuyer&lt;br /&gt;
* Thomas Neuber&lt;br /&gt;
* Robert Pavljuk&lt;br /&gt;
==== Team NIBObee ====&lt;br /&gt;
Teammitglieder dieser Gruppe sind:&lt;br /&gt;
* Robert Peterfi&lt;br /&gt;
* Alois Pochmann&lt;br /&gt;
* Reinhard Weismann&lt;br /&gt;
&lt;br /&gt;
== Realisierung ==&lt;br /&gt;
&lt;br /&gt;
=== Plattformen / Hardware ===&lt;br /&gt;
Die Plattformen der Roboter und der Kontrolleinheit sind im Folgenden aufgelistet und stehen (wenn auch teilweise nur als Bausatz) fertig zur Verfügung. Die Hardware der Kommunikationseinrichtung wird im Zuge dieses Projekts erstellt.&lt;br /&gt;
&lt;br /&gt;
==== Roboter ====&lt;br /&gt;
Der eingesetzte Roboter ist eine [[NIBObee]] von [http://www.nicai-systems.com/de/nibobee.html Nicai-Systems]. Dieser Roboter verfügt über einen Liniensensor der es prinzipiell ermöglicht einer kontrastreichen Linie, vorzugsweise schwarze Linie auf weißem Boden, zu folgen.&lt;br /&gt;
&lt;br /&gt;
Weitere Dateils können der [[NIBObee]]-Seite entnommen werden.&lt;br /&gt;
&lt;br /&gt;
==== Kontrolleinheit ====&lt;br /&gt;
Die Zentrale Kontrolleinheit wird auf dem vom 3. Semester bekannten [[LPC2478]] realisiert.&lt;br /&gt;
&lt;br /&gt;
==== Kommunikation ====&lt;br /&gt;
Die Kommunikation der [[NIBObee]]-Roboter mit der zentralen Steuerung erfolgt über Bluetooth. Dazu wird über den auf beiden Plattformen bestehenden UART Anschluss ein Modul mit RS232-BT Umsetzung verwendet. &lt;br /&gt;
Die im Folgenden aufgelisteten Module kommen für die Umsetzung in Frage:&lt;br /&gt;
* BTM-112&lt;br /&gt;
* [[BTM-222]]&lt;br /&gt;
Die Entscheidung ist zugunsten des [[BTM-222]] gefallen. Details dazu können der [[BTM-222]]-Seite entnommen werden.&lt;br /&gt;
&lt;br /&gt;
=== Software ===&lt;br /&gt;
Details zur Software sind auf den Seiten von [[NIBObee#Software|NIBObee]] und [[LPC2478#Software|LPC2478]] zu finden.&lt;br /&gt;
&lt;br /&gt;
=== Protokolle ===&lt;br /&gt;
==== Bluetooth ====&lt;br /&gt;
Der gesamte Bluetooth Stack ist im [[BTM-222]] realsiert und muss daher im Projekt nicht betrachtet werden.&lt;br /&gt;
==== [[MaDeCo]] ====&lt;br /&gt;
Das projektspezifische Protokol zur Übertragung der Labyrinthdaten nach / bei der Erkundung und dann zu Steuerung durch das Labyrinth (&#039;&#039;&#039;Ma&#039;&#039;&#039;ze &#039;&#039;&#039;De&#039;&#039;&#039;tection and &#039;&#039;&#039;Co&#039;&#039;&#039;ntrol) ist zu definieren.&lt;br /&gt;
&lt;br /&gt;
=== Testumgebung ===&lt;br /&gt;
==== Labyrinth ====&lt;br /&gt;
Wie schon in der Angabe zu sehen ist gelten für das Labyrinth einige Annahmen die als Voraussetzungen für die Implementierung festgelegt werden:&lt;br /&gt;
* Es gibt nur gerade Linien&lt;br /&gt;
* Alle Kreuzungen sind rechtwinkelig&lt;br /&gt;
* Alle Abstände sind genau ein Vielfaches der kürzesten Verbindung der Mittelpunkte zweier Felder&lt;br /&gt;
* Alle (nicht sichtbaren) Felder sind gleich groß&lt;br /&gt;
* Das gesamte Labyrinth entspricht einer Baumstruktur, d.h. es gibt niemals zwei paralelle Wege von einem Punkt zu einem Anderen, also keine geschlossenen Schleifen.&lt;br /&gt;
* Da die Steuerung ausschließlich über die Liniensensoren implementiert wird ist die Strecke kollisionsfrei zu halten, d.h. der [[NIBObee]] wird nicht auf Kontakt mit den Fühlern durch Ausweichmanöver reagieren. &lt;br /&gt;
&lt;br /&gt;
==== Simulationen ====&lt;br /&gt;
Damit ein unabhängiges Testen der einzelnen Teile des Projekts möglich ist werden in einigen Bereichen Simulationen eingesetzt:&lt;br /&gt;
* Bluetooth-Verbindung kann mit einem PC und Terminalprogramm getestet werden&lt;br /&gt;
* [[MaDeCo]]-Protokoll wird textbasiert entworfen um mit einfachen Textfiles auf beiden Seiten testen zu können&lt;br /&gt;
&lt;br /&gt;
== Projektfortschritt ==&lt;br /&gt;
Der Projektfortschritt wird im gleichen Intervall verfolgt in dem die Lehrveranstaltung abgehalten wird&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Woche&lt;br /&gt;
!Block&lt;br /&gt;
!Tätigkeiten / Erkenntnisse&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|14.02.2011 - 20.02.2011&lt;br /&gt;
|Gemeinsam&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
* Projektdefinition: Festlegen des Projektinhalts und grobe Abstimmung der einzelnen beteiligten Komponenten.&lt;br /&gt;
* Erstellung eines Dokuments zur Projektbeschreibung&lt;br /&gt;
* Erstellen eines Projektplans &lt;br /&gt;
&amp;lt;!-- Ende Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|&#039;&#039;&#039;21.02.2011&#039;&#039;&#039;&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|&#039;&#039;&#039;Projekt akzeptiert -&amp;gt; Projektstart&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|21.02.2011 - 27.02.2011&lt;br /&gt;
|Gemeinsam&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
* Bestellungen besprochen.&lt;br /&gt;
* Wiki eingerichtet.&lt;br /&gt;
* Bestelliste für Bluetooth Module erstellt&lt;br /&gt;
** Auflistung siehe [[BTM-222#Hardware|BTM-222 Stückliste]]&lt;br /&gt;
* Gesamte Hardware bestellt:&lt;br /&gt;
** 2 NIBObee - Programmierbarer Roboter-Bausatz&lt;br /&gt;
** 5 x [[BTM-222#Hardware|BTM-222 Stückliste]] (3 x für das Nibobee und 2 x für das board) erstellt.&lt;br /&gt;
&amp;lt;!-- Ende Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Board&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Board --&amp;gt;&lt;br /&gt;
* Display Erfahrungsberichte recherchiert.&lt;br /&gt;
* Grafik Konzept (Blöcke) besprochen&lt;br /&gt;
* Beispiel Implementierungen für Touchscreen und Grafik von [[LPC2478|LPC 2478]] gesucht &lt;br /&gt;
&amp;lt;!-- Ende Inhalt Board --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|NIBObee&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt NIBObee --&amp;gt;&lt;br /&gt;
* Bestellungen besprochen.&lt;br /&gt;
* nach Bauanleitungen und Datenblätter recherchiert.&lt;br /&gt;
* Printlayout des BT-Modul für NIBObee erstellt&lt;br /&gt;
* Recherche der BTM-222 Konfigurationsmöglichkeiten.&lt;br /&gt;
* Sammeln offener Punkte, auflisten von Risiken und möglicher Massnahmen&lt;br /&gt;
&amp;lt;!-- Ende Inhalt NIBObee --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|28.02.2011 - 06.03.2011&lt;br /&gt;
|Gemeinsam&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
* Definition des proprietären Kommunikationsprotokolls [[MaDeCo| MaDeCo (&#039;&#039;&#039;Ma&#039;&#039;&#039;ze &#039;&#039;&#039;De&#039;&#039;&#039;tection and &#039;&#039;&#039;Co&#039;&#039;&#039;ntrol)]]&lt;br /&gt;
&amp;lt;!-- Ende Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Board&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Board --&amp;gt;&lt;br /&gt;
* Weitere Analyse für Touchscreen und Grafikausgabe&lt;br /&gt;
* Demo Implementierung von Hr. Kramer angefordert und eingelesen&lt;br /&gt;
* Sourcen Demo Projekt in Eclipse Ganymed geladen und Debug Optionen ergänzt&lt;br /&gt;
* Debuggingversuche, Ursachensuche für fehlende Anzeige &lt;br /&gt;
&amp;lt;!-- Ende Inhalt Board --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|NIBObee&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt NIBObee --&amp;gt;&lt;br /&gt;
* Bestellung eingetroffen. Zusammenbau der Roboter durchgeführt&lt;br /&gt;
* Detailabsprache der benötigten Roboterfunktionen&lt;br /&gt;
* Analyse der Probleme beim Befahren des Labyrinths und Abbildung auf notwendige Funktionen.&lt;br /&gt;
&amp;lt;!-- Ende Inhalt NIBObee --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|7.3.2011-13.3.2011&lt;br /&gt;
|Gemeinsam&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
* Recherche Ergebnisse besprochen&lt;br /&gt;
* Bauteile für Bluetooth Modul sind teilweise nicht optimal (vor allem wegen der Größe). Es werden noch Alternativen gesucht und das Layout und der Bestückungspan wurden geändert.&lt;br /&gt;
&amp;lt;!-- Ende Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Board&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Board --&amp;gt;&lt;br /&gt;
* Mehrstündiger Versuch, das Display mit Demo Applikationen zu testen&lt;br /&gt;
* daraus resultierende Tests haben ergeben dass das Display defekt war. Das Board wurde gegen ein neues getauscht&lt;br /&gt;
* neuerliche Inbetriebnahme mit Demo Applikationen&lt;br /&gt;
&amp;lt;!-- Ende Inhalt Board --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|NIBObee&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt NIBObee --&amp;gt;&lt;br /&gt;
* Installation der Entwicklungsumbegung&lt;br /&gt;
* Testen der Beispielprogramme&lt;br /&gt;
* Kalibrierung der Liniensensoren&lt;br /&gt;
* Erstellen eines Testprogramms für die Liniensensoren um die optimale Linienbreite für das Labyrinth ermitteln zu können (2 cm scheint zu breit, Kontrastwert nicht über 128).&lt;br /&gt;
&amp;lt;!-- Ende Inhalt NIBObee --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|14.3.2011-20.3.2011&lt;br /&gt;
|Gemeinsam&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
* Besprechung der jeweiligen Ergebnisse&lt;br /&gt;
* neue Bestückungsliste besprechen und fehlende Teile organisieren&lt;br /&gt;
&amp;lt;!-- Ende Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Board&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Board --&amp;gt;&lt;br /&gt;
* weitere Recherche nach lauffähigen Demoapplikationen&lt;br /&gt;
* Für speziell dieses Board frustrierend wenige bis keine Ergebnisse&lt;br /&gt;
&amp;lt;!-- Ende Inhalt Board --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|NIBObee&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt NIBObee --&amp;gt;&lt;br /&gt;
* Versuche mit zwei unterschiedlichen Ansätzen des Geradeauslaufs des NIBObee:&lt;br /&gt;
** Korrektur mittles Regelkreis unter Berücksichtigung der Odometriesensoren&lt;br /&gt;
** Korrektur nur mttels der Werte von den Liniensensoren&lt;br /&gt;
* Obwohl der Regelkreis eine gradeausfahrt auch ohne Linie schafft ist der Start problematisch und daher für unsere Zwecke ungeeignet&lt;br /&gt;
&amp;lt;!-- Ende Inhalt NIBObee --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|21.3.2011-27.3.2011&lt;br /&gt;
|Gemeinsam&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
* gegenseitiges Update&lt;br /&gt;
* fast alle Bauteile eingetroffen bzw. vorhanden, Ausnahme: Printplatte&lt;br /&gt;
** voraussichtlicher Liefertermin der Printplatte kommende Woche&lt;br /&gt;
&amp;lt;!-- Ende Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Board&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Board --&amp;gt;&lt;br /&gt;
* vergebliche Versuche, den UART in Betrieb zu nehmen&lt;br /&gt;
* gemeinsam mit Hrn. Wenzl nochmals versucht, auch ergebnislos&lt;br /&gt;
* Entschluss, das Vorgehen zu ändern&lt;br /&gt;
* neues Projekt auf Basis Interrupt Template vom 3. Semester&lt;br /&gt;
* Anpassung auf unsere Umgebung&lt;br /&gt;
&amp;lt;!-- Ende Inhalt Board --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|NIBObee&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt NIBObee --&amp;gt;&lt;br /&gt;
* Implementierung gestartet mit folgenden Funktionen:&lt;br /&gt;
* Systemtimer mit 100Hz Taktfrequenz&lt;br /&gt;
* Statemachine für folgende Module:&lt;br /&gt;
** Drive, zuständig für das fahren entlang der Linie des Labyrinths&lt;br /&gt;
** Sensor, zuständig für die Fühler. Entprellen und melden von Änderungen.&lt;br /&gt;
** Line, zuständig für das erkennen der Linie und melden von Abweichungen&lt;br /&gt;
* Scheduler, der alle Module die einen Event bearbeiten müssen aufruft.&lt;br /&gt;
&amp;lt;!-- Ende Inhalt NIBObee --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|28.3.2011-3.4.2011&lt;br /&gt;
|Gemeinsam&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
*Leiterplatten eingetroffen, Beginn des Aufbaus der Bluetooth Module&lt;br /&gt;
&amp;lt;!-- Ende Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Board&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Board --&amp;gt;&lt;br /&gt;
&amp;lt;!-- Ende Inhalt Board --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|NIBObee&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt NIBObee --&amp;gt;&lt;br /&gt;
*Implementieren der Linienverfolgung mit den Statemachines&lt;br /&gt;
*Neuer Modul für Distanzmessung. Wurde von der Implementierung der Odometrie-Bibliothek abgeleitet.&lt;br /&gt;
*Erfolgreiches Ausrichten des NIBObee im Zentrum eines Felds des Labyrinths&lt;br /&gt;
*Probleme beim Unterscheiden von Spurabweichung und Kreuzung. Kann mit den vorhandenen Sensoren nicht gelöst werden. Es wird eine Erweiterung des NIBObee geplant.&lt;br /&gt;
&amp;lt;!-- Ende Inhalt NIBObee --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|4.4.2011-10.4.2011&lt;br /&gt;
|Gemeinsam&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
&amp;lt;!-- Ende Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Board&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Board --&amp;gt;&lt;br /&gt;
&amp;lt;!-- Ende Inhalt Board --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|NIBObee&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt NIBObee --&amp;gt;&lt;br /&gt;
*Fertigstellen des ersten Bluetooth Moduls&lt;br /&gt;
*Verbindung von NIBObee mit PC hergestellt&lt;br /&gt;
*Neue Funktionen zur Kommunikation. Senden und Empfangen mittels Interrupts implementiert&lt;br /&gt;
*Start Implementierung der State Maschine für das MaDeCo Protokoll&lt;br /&gt;
*Debug Möglichkeit mittels BT-Verbindung zum PC implementiert&lt;br /&gt;
*PC Testapplikation für die Bluetooth Verbindung mit spezieller Unterstützung des MaDeCo Protokolls implementiert.&lt;br /&gt;
*Erzeugen von DoxyGen Dokumentation&lt;br /&gt;
&amp;lt;!-- Ende Inhalt NIBObee --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|11.4.2011-1.5.2011&lt;br /&gt;
|Gemeinsam&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
&amp;lt;!-- Ende Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Board&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Board --&amp;gt;&lt;br /&gt;
&amp;lt;!-- Ende Inhalt Board --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|NIBObee&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt NIBObee --&amp;gt;&lt;br /&gt;
*Überarbeiten des Event-Machanismus&lt;br /&gt;
*Optimieren der Debug-Protokollierung über Bluetooth. Strings belegten zu viel Speicher. Das führte zu undefinierbarem Verhalten wegen Überschreiben von Stack und Daten.&lt;br /&gt;
*Erweitern der PC Applikation zum bedienen der NIBObee BT-Schnittstelle. Die optimierte Debug-Ausgabe kann auf Basis von speziellen Kommentaren der NIBObee-Source (debug.h) symbolisch aufbereitet werden.&lt;br /&gt;
*Erweiterung mit zusätliche Liniensensoren angefertigt&lt;br /&gt;
*Wegen zusätzlicher Liniensensoren neue Applikation zum Kalibrieren der Liniensensoren (jetzt 5 Sück) erstellt.&lt;br /&gt;
*Wegen zusätzlicher Liniensensoren ersetzen des original Moduls zum Einlesen der Analogwerte.&lt;br /&gt;
*Wegen zusätzlicher Liniensensoren ersetzen des original Moduls zum ermitteln der Werte der Liniensensoren.&lt;br /&gt;
*Kreuzungserkennung und Linienverfolgung funktionieren nun parallel, NIBObee fährt kleines Testlabyrinth gezielt ab.&lt;br /&gt;
*Waagrechte Ausrichtung des NIBObee korrigiert da der Abstand der Liniensensoren zum Boden von essentieller Bedeutung ist.&lt;br /&gt;
&amp;lt;!-- Ende Inhalt NIBObee --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|2.5.2011-8.5.2011&lt;br /&gt;
|Gemeinsam&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
&amp;lt;!-- Ende Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Board&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Board --&amp;gt;&lt;br /&gt;
* verschiedene UART sourcecodes aus fremden Demoapplikationen versucht auf das board zu portieren&lt;br /&gt;
&amp;lt;!-- Ende Inhalt Board --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|NIBObee&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt NIBObee --&amp;gt;&lt;br /&gt;
*Tests mit neuen, zusätzlichen Liniensensoren.&lt;br /&gt;
*Probleme mit Hardwareausfällen der neuen Erweiterung. Die Phototransistoren reagieren nicht so gut wie erwartet. Ausserdem scheinen sie sehr leicht bei den Lötarbeiten defekt zu werden. Austausch notwendig&lt;br /&gt;
*Weitere Optimierungender Debugausgaben notwendig. Zusätzliche Funktionen in Testapplikation implementiert um nicht nur die Testpunkte, sondern auch die unterschiedlichen dezimalen Werte in symbolische Ausgaben umrechnen zu können.&lt;br /&gt;
&amp;lt;!-- Ende Inhalt NIBObee --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|9.5.2011-15.5.2011&lt;br /&gt;
|Gemeinsam&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
&amp;lt;!-- Ende Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Board&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Board --&amp;gt;&lt;br /&gt;
&amp;lt;!-- Ende Inhalt Board --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|NIBObee&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt NIBObee --&amp;gt;&lt;br /&gt;
&amp;lt;!-- Ende Inhalt NIBObee --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|16.5.2011-22.5.2011&lt;br /&gt;
|Gemeinsam&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
&amp;lt;!-- Ende Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Board&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Board --&amp;gt;&lt;br /&gt;
&amp;lt;!-- Ende Inhalt Board --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|NIBObee&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt NIBObee --&amp;gt;&lt;br /&gt;
&amp;lt;!-- Ende Inhalt NIBObee --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|23.5.2011-29.5.2011&lt;br /&gt;
|Gemeinsam&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
&amp;lt;!-- Ende Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Board&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Board --&amp;gt;&lt;br /&gt;
&amp;lt;!-- Ende Inhalt Board --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|NIBObee&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt NIBObee --&amp;gt;&lt;br /&gt;
&amp;lt;!-- Ende Inhalt NIBObee --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|30.5.2011-5.6.2011&lt;br /&gt;
|Gemeinsam&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
&amp;lt;!-- Ende Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Board&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Board --&amp;gt;&lt;br /&gt;
* PLL Initialisierung kontrolliert, marginaler Fehler korrigiert&lt;br /&gt;
* UART Initialisierung kontrolliert, nichts gefunden. UART0 Senden OK, UART1 NOK&lt;br /&gt;
* UART1 Initialisierung auf P3.16 und P3.17 führt zum Erfolg&lt;br /&gt;
* Die nötigen UART Funktionen identifiziert und modular implementiert.&lt;br /&gt;
* UART Funktionen Interrupt getrieben implementiert&lt;br /&gt;
* bluetooth Modul aufgebaut&lt;br /&gt;
&amp;lt;!-- Ende Inhalt Board --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|NIBObee&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt NIBObee --&amp;gt;&lt;br /&gt;
&amp;lt;!-- Ende Inhalt NIBObee --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|6.6.2011-19.6.2011&lt;br /&gt;
|Gemeinsam&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
* Funktionstest für bluetooth Modul am board und interruptgetriebene UART Funktionen&lt;br /&gt;
&amp;lt;!-- Ende Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Board&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Board --&amp;gt;&lt;br /&gt;
* Interrupt Handler erweitert: signalisiert wenn message komplett (CR) empfangen&lt;br /&gt;
* Handling für Sequenz- und Acknowledge-Nummern&lt;br /&gt;
* state machine für MaDeCo Protokoll&lt;br /&gt;
* Interface zu PC-Applikation&lt;br /&gt;
&amp;lt;!-- Ende Inhalt Board --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|NIBObee&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt NIBObee --&amp;gt;&lt;br /&gt;
&amp;lt;!-- Ende Inhalt NIBObee --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|&#039;&#039;&#039;20.06.2011&#039;&#039;&#039;&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|&#039;&#039;&#039;Projekt präsentiert -&amp;gt; Projektende&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:FH]]&lt;/div&gt;</summary>
		<author><name>Alois</name></author>
	</entry>
	<entry>
		<id>https://wiki.callooh.com/index.php?title=RoLoMa&amp;diff=894</id>
		<title>RoLoMa</title>
		<link rel="alternate" type="text/html" href="https://wiki.callooh.com/index.php?title=RoLoMa&amp;diff=894"/>
		<updated>2011-06-24T19:07:19Z</updated>

		<summary type="html">&lt;p&gt;Alois: /* Projektfortschritt */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;RoLoMa ist der, vielleicht wenig einfallsreiche, Name des ESE-Projekts im 4. Semester. Es ist die Abkürzung für &amp;quot;Robots Lost in Maze&amp;quot;.&lt;br /&gt;
== Projektbeschreibung ==&lt;br /&gt;
=== Aufgabe ===&lt;br /&gt;
Bei diesem Projekt soll ein autonomer Roboter ein Labyrinth analysieren, alle vorhandenen Abzweigungen protokollieren und diese Daten an eine zentrale Einheit senden. Die zentrale Einheit soll einen zweiten autonomen Roboter mit diesen Daten auf dem berechneten kürzesten Weg durch das Labyrinth lotsen können. Dazu muss eine Kommunikation zwischen dem Roboter und der zentralen Einheit hergestellt werden.&lt;br /&gt;
Die oben erwähnte zentrale Einheit wird im weiteren Dokument als „Board“ bezeichnet und der autonome Roboter, aufgrund des gewählten Produkts „[[NIBObee]]“.&lt;br /&gt;
=== Details ===&lt;br /&gt;
[[File:ExampleMaze.png|thumb|120px|Beispiellabyrinth]]&lt;br /&gt;
Das Labyrinth wird eine Matrix mit vordefinierter Größe sein (z.B. 8x8) bei dem die möglichen Wege als schwarze Linie dargestellt sind. Auf dieser Linie wird sich der [[NIBObee]] bewegen. Die Aufgabe des ersten [[NIBObee]] besteht nun darin das gesamt Labyrinth abzufahren und eine Karte zu erstellen.&lt;br /&gt;
&lt;br /&gt;
Diese gesammelte Information wird dann an das Board übertragen. Dort wird das Labyrinth auf einer grafischen Ausgabe dargestellt und der Benutzer kann einen beliebigen Zielpunkt für den zweiten [[NIBObee]] festlegen. Der optimale Weg wird berechnet und der zweite [[NIBObee]] über diesen Weg an das definierte Ziel geleitet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- IMPORTANT: The following line shall be at the end of the &amp;quot;Details&amp;quot; Section to ensure that following section will start in a new line after the image! --&amp;gt;&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Aufgabenteilung ===&lt;br /&gt;
An dem Projekt sind zwei Gruppen beteiligt, eine die sich um die Roboter kümmert (Gruppe NIBObee), eine zweite die die Implementierung der zentralen Einheit (Gruppe Board) vornimmt. Gemeinsam muss die Übertragungstechnik (Hardware und Protokoll) erarbeitet werden. Die Implementierung kann dann getrennt erfolgen und am Ende des Projekts ist eine gemeinsame Testphase notwendig.&lt;br /&gt;
&lt;br /&gt;
Da noch einige Festlegungen bezüglich der verwendeten Hardware und der Übertragungstechnik ausständig sind können sich im Zuge des weiteren Projektfortschritts durchaus noch Änderungen ergeben. Für alle kritischen Elemente wird so früh wie möglich auch eine alternative Lösung als Fallback vorgesehen. Das ist notwendig für den Fall, dass sich für ein Problem keine, zumindest im Rahmen dieses Semesters, realisierbare Implementierung ergibt.&lt;br /&gt;
&lt;br /&gt;
==== Team Board ====&lt;br /&gt;
Teammitglieder dieser Gruppe sind:&lt;br /&gt;
* Michaela Escuyer&lt;br /&gt;
* Thomas Neuber&lt;br /&gt;
* Robert Pavljuk&lt;br /&gt;
==== Team NIBObee ====&lt;br /&gt;
Teammitglieder dieser Gruppe sind:&lt;br /&gt;
* Robert Peterfi&lt;br /&gt;
* Alois Pochmann&lt;br /&gt;
* Reinhard Weismann&lt;br /&gt;
&lt;br /&gt;
== Realisierung ==&lt;br /&gt;
&lt;br /&gt;
=== Plattformen / Hardware ===&lt;br /&gt;
Die Plattformen der Roboter und der Kontrolleinheit sind im Folgenden aufgelistet und stehen (wenn auch teilweise nur als Bausatz) fertig zur Verfügung. Die Hardware der Kommunikationseinrichtung wird im Zuge dieses Projekts erstellt.&lt;br /&gt;
&lt;br /&gt;
==== Roboter ====&lt;br /&gt;
Der eingesetzte Roboter ist eine [[NIBObee]] von [http://www.nicai-systems.com/de/nibobee.html Nicai-Systems]. Dieser Roboter verfügt über einen Liniensensor der es prinzipiell ermöglicht einer kontrastreichen Linie, vorzugsweise schwarze Linie auf weißem Boden, zu folgen.&lt;br /&gt;
&lt;br /&gt;
Weitere Dateils können der [[NIBObee]]-Seite entnommen werden.&lt;br /&gt;
&lt;br /&gt;
==== Kontrolleinheit ====&lt;br /&gt;
Die Zentrale Kontrolleinheit wird auf dem vom 3. Semester bekannten [[LPC2478]] realisiert.&lt;br /&gt;
&lt;br /&gt;
==== Kommunikation ====&lt;br /&gt;
Die Kommunikation der [[NIBObee]]-Roboter mit der zentralen Steuerung erfolgt über Bluetooth. Dazu wird über den auf beiden Plattformen bestehenden UART Anschluss ein Modul mit RS232-BT Umsetzung verwendet. &lt;br /&gt;
Die im Folgenden aufgelisteten Module kommen für die Umsetzung in Frage:&lt;br /&gt;
* BTM-112&lt;br /&gt;
* [[BTM-222]]&lt;br /&gt;
Die Entscheidung ist zugunsten des [[BTM-222]] gefallen. Details dazu können der [[BTM-222]]-Seite entnommen werden.&lt;br /&gt;
&lt;br /&gt;
=== Software ===&lt;br /&gt;
Details zur Software sind auf den Seiten von [[NIBObee#Software|NIBObee]] und [[LPC2478#Software|LPC2478]] zu finden.&lt;br /&gt;
&lt;br /&gt;
=== Protokolle ===&lt;br /&gt;
==== Bluetooth ====&lt;br /&gt;
Der gesamte Bluetooth Stack ist im [[BTM-222]] realsiert und muss daher im Projekt nicht betrachtet werden.&lt;br /&gt;
==== [[MaDeCo]] ====&lt;br /&gt;
Das projektspezifische Protokol zur Übertragung der Labyrinthdaten nach / bei der Erkundung und dann zu Steuerung durch das Labyrinth (&#039;&#039;&#039;Ma&#039;&#039;&#039;ze &#039;&#039;&#039;De&#039;&#039;&#039;tection and &#039;&#039;&#039;Co&#039;&#039;&#039;ntrol) ist zu definieren.&lt;br /&gt;
&lt;br /&gt;
=== Testumgebung ===&lt;br /&gt;
==== Labyrinth ====&lt;br /&gt;
Wie schon in der Angabe zu sehen ist gelten für das Labyrinth einige Annahmen die als Voraussetzungen für die Implementierung festgelegt werden:&lt;br /&gt;
* Es gibt nur gerade Linien&lt;br /&gt;
* Alle Kreuzungen sind rechtwinkelig&lt;br /&gt;
* Alle Abstände sind genau ein Vielfaches der kürzesten Verbindung der Mittelpunkte zweier Felder&lt;br /&gt;
* Alle (nicht sichtbaren) Felder sind gleich groß&lt;br /&gt;
* Das gesamte Labyrinth entspricht einer Baumstruktur, d.h. es gibt niemals zwei paralelle Wege von einem Punkt zu einem Anderen, also keine geschlossenen Schleifen.&lt;br /&gt;
* Da die Steuerung ausschließlich über die Liniensensoren implementiert wird ist die Strecke kollisionsfrei zu halten, d.h. der [[NIBObee]] wird nicht auf Kontakt mit den Fühlern durch Ausweichmanöver reagieren. &lt;br /&gt;
&lt;br /&gt;
==== Simulationen ====&lt;br /&gt;
Damit ein unabhängiges Testen der einzelnen Teile des Projekts möglich ist werden in einigen Bereichen Simulationen eingesetzt:&lt;br /&gt;
* Bluetooth-Verbindung kann mit einem PC und Terminalprogramm getestet werden&lt;br /&gt;
* [[MaDeCo]]-Protokoll wird textbasiert entworfen um mit einfachen Textfiles auf beiden Seiten testen zu können&lt;br /&gt;
&lt;br /&gt;
== Projektfortschritt ==&lt;br /&gt;
Der Projektfortschritt wird im gleichen Intervall verfolgt in dem die Lehrveranstaltung abgehalten wird&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Woche&lt;br /&gt;
!Block&lt;br /&gt;
!Tätigkeiten / Erkenntnisse&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|14.02.2011 - 20.02.2011&lt;br /&gt;
|Gemeinsam&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
* Projektdefinition: Festlegen des Projektinhalts und grobe Abstimmung der einzelnen beteiligten Komponenten.&lt;br /&gt;
* Erstellung eines Dokuments zur Projektbeschreibung&lt;br /&gt;
* Erstellen eines Projektplans &lt;br /&gt;
&amp;lt;!-- Ende Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|&#039;&#039;&#039;21.02.2011&#039;&#039;&#039;&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|&#039;&#039;&#039;Projekt akzeptiert -&amp;gt; Projektstart&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|21.02.2011 - 27.02.2011&lt;br /&gt;
|Gemeinsam&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
* Bestellungen besprochen.&lt;br /&gt;
* Wiki eingerichtet.&lt;br /&gt;
* Bestelliste für Bluetooth Module erstellt&lt;br /&gt;
** Auflistung siehe [[BTM-222#Hardware|BTM-222 Stückliste]]&lt;br /&gt;
* Gesamte Hardware bestellt:&lt;br /&gt;
** 2 NIBObee - Programmierbarer Roboter-Bausatz&lt;br /&gt;
** 5 x [[BTM-222#Hardware|BTM-222 Stückliste]] (3 x für das Nibobee und 2 x für das board) erstellt.&lt;br /&gt;
&amp;lt;!-- Ende Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Board&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Board --&amp;gt;&lt;br /&gt;
* Display Erfahrungsberichte recherchiert.&lt;br /&gt;
* Grafik Konzept (Blöcke) besprochen&lt;br /&gt;
* Beispiel Implementierungen für Touchscreen und Grafik von [[LPC2478|LPC 2478]] gesucht &lt;br /&gt;
&amp;lt;!-- Ende Inhalt Board --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|NIBObee&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt NIBObee --&amp;gt;&lt;br /&gt;
* Bestellungen besprochen.&lt;br /&gt;
* nach Bauanleitungen und Datenblätter recherchiert.&lt;br /&gt;
* Printlayout des BT-Modul für NIBObee erstellt&lt;br /&gt;
* Recherche der BTM-222 Konfigurationsmöglichkeiten.&lt;br /&gt;
* Sammeln offener Punkte, auflisten von Risiken und möglicher Massnahmen&lt;br /&gt;
&amp;lt;!-- Ende Inhalt NIBObee --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|28.02.2011 - 06.03.2011&lt;br /&gt;
|Gemeinsam&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
* Definition des proprietären Kommunikationsprotokolls [[MaDeCo| MaDeCo (&#039;&#039;&#039;Ma&#039;&#039;&#039;ze &#039;&#039;&#039;De&#039;&#039;&#039;tection and &#039;&#039;&#039;Co&#039;&#039;&#039;ntrol)]]&lt;br /&gt;
&amp;lt;!-- Ende Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Board&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Board --&amp;gt;&lt;br /&gt;
* Weitere Analyse für Touchscreen und Grafikausgabe&lt;br /&gt;
* Demo Implementierung von Hr. Kramer angefordert und eingelesen&lt;br /&gt;
* Sourcen Demo Projekt in Eclipse Ganymed geladen und Debug Optionen ergänzt&lt;br /&gt;
* Debuggingversuche, Ursachensuche für fehlende Anzeige &lt;br /&gt;
&amp;lt;!-- Ende Inhalt Board --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|NIBObee&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt NIBObee --&amp;gt;&lt;br /&gt;
* Bestellung eingetroffen. Zusammenbau der Roboter durchgeführt&lt;br /&gt;
* Detailabsprache der benötigten Roboterfunktionen&lt;br /&gt;
* Analyse der Probleme beim Befahren des Labyrinths und Abbildung auf notwendige Funktionen.&lt;br /&gt;
&amp;lt;!-- Ende Inhalt NIBObee --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|7.3.2011-13.3.2011&lt;br /&gt;
|Gemeinsam&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
* Recherche Ergebnisse besprochen&lt;br /&gt;
* Bauteile für Bluetooth Modul sind teilweise nicht optimal (vor allem wegen der Größe). Es werden noch Alternativen gesucht und das Layout und der Bestückungspan wurden geändert.&lt;br /&gt;
&amp;lt;!-- Ende Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Board&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Board --&amp;gt;&lt;br /&gt;
* Mehrstündiger Versuch, das Display mit Demo Applikationen zu testen&lt;br /&gt;
* daraus resultierende Tests haben ergeben dass das Display defekt war. Das Board wurde gegen ein neues getauscht&lt;br /&gt;
* neuerliche Inbetriebnahme mit Demo Applikationen&lt;br /&gt;
&amp;lt;!-- Ende Inhalt Board --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|NIBObee&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt NIBObee --&amp;gt;&lt;br /&gt;
* Installation der Entwicklungsumbegung&lt;br /&gt;
* Testen der Beispielprogramme&lt;br /&gt;
* Kalibrierung der Liniensensoren&lt;br /&gt;
* Erstellen eines Testprogramms für die Liniensensoren um die optimale Linienbreite für das Labyrinth ermitteln zu können (2 cm scheint zu breit, Kontrastwert nicht über 128).&lt;br /&gt;
&amp;lt;!-- Ende Inhalt NIBObee --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|14.3.2011-20.3.2011&lt;br /&gt;
|Gemeinsam&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
* Besprechung der jeweiligen Ergebnisse&lt;br /&gt;
* neue Bestückungsliste besprechen und fehlende Teile organisieren&lt;br /&gt;
&amp;lt;!-- Ende Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Board&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Board --&amp;gt;&lt;br /&gt;
* weitere Recherche nach lauffähigen Demoapplikationen&lt;br /&gt;
* Für speziell dieses Board frustrierend wenige bis keine Ergebnisse&lt;br /&gt;
&amp;lt;!-- Ende Inhalt Board --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|NIBObee&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt NIBObee --&amp;gt;&lt;br /&gt;
* Versuche mit zwei unterschiedlichen Ansätzen des Geradeauslaufs des NIBObee:&lt;br /&gt;
** Korrektur mittles Regelkreis unter Berücksichtigung der Odometriesensoren&lt;br /&gt;
** Korrektur nur mttels der Werte von den Liniensensoren&lt;br /&gt;
* Obwohl der Regelkreis eine gradeausfahrt auch ohne Linie schafft ist der Start problematisch und daher für unsere Zwecke ungeeignet&lt;br /&gt;
&amp;lt;!-- Ende Inhalt NIBObee --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|21.3.2011-27.3.2011&lt;br /&gt;
|Gemeinsam&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
* gegenseitiges Update&lt;br /&gt;
* fast alle Bauteile eingetroffen bzw. vorhanden, Ausnahme: Printplatte&lt;br /&gt;
** voraussichtlicher Liefertermin der Printplatte kommende Woche&lt;br /&gt;
&amp;lt;!-- Ende Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Board&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Board --&amp;gt;&lt;br /&gt;
* vergebliche Versuche, den UART in Betrieb zu nehmen&lt;br /&gt;
* gemeinsam mit Hrn. Wenzl nochmals versucht, auch ergebnislos&lt;br /&gt;
* Entschluss, das Vorgehen zu ändern&lt;br /&gt;
* neues Projekt auf Basis Interrupt Template vom 3. Semester&lt;br /&gt;
* Anpassung auf unsere Umgebung&lt;br /&gt;
&amp;lt;!-- Ende Inhalt Board --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|NIBObee&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt NIBObee --&amp;gt;&lt;br /&gt;
* Implementierung gestartet mit folgenden Funktionen:&lt;br /&gt;
* Systemtimer mit 100Hz Taktfrequenz&lt;br /&gt;
* Statemachine für folgende Module:&lt;br /&gt;
** Drive, zuständig für das fahren entlang der Linie des Labyrinths&lt;br /&gt;
** Sensor, zuständig für die Fühler. Entprellen und melden von Änderungen.&lt;br /&gt;
** Line, zuständig für das erkennen der Linie und melden von Abweichungen&lt;br /&gt;
* Scheduler, der alle Module die einen Event bearbeiten müssen aufruft.&lt;br /&gt;
&amp;lt;!-- Ende Inhalt NIBObee --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|28.3.2011-3.4.2011&lt;br /&gt;
|Gemeinsam&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
*Leiterplatten eingetroffen, Beginn des Aufbaus der Bluetooth Module&lt;br /&gt;
&amp;lt;!-- Ende Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Board&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Board --&amp;gt;&lt;br /&gt;
&amp;lt;!-- Ende Inhalt Board --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|NIBObee&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt NIBObee --&amp;gt;&lt;br /&gt;
*Implementieren der Linienverfolgung mit den Statemachines&lt;br /&gt;
*Neuer Modul für Distanzmessung. Wurde von der Implementierung der Odometrie-Bibliothek abgeleitet.&lt;br /&gt;
*Erfolgreiches Ausrichten des NIBObee im Zentrum eines Felds des Labyrinths&lt;br /&gt;
*Probleme beim Unterscheiden von Spurabweichung und Kreuzung. Kann mit den vorhandenen Sensoren nicht gelöst werden. Es wird eine Erweiterung des NIBObee geplant.&lt;br /&gt;
&amp;lt;!-- Ende Inhalt NIBObee --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|4.4.2011-10.4.2011&lt;br /&gt;
|Gemeinsam&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
&amp;lt;!-- Ende Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Board&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Board --&amp;gt;&lt;br /&gt;
&amp;lt;!-- Ende Inhalt Board --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|NIBObee&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt NIBObee --&amp;gt;&lt;br /&gt;
*Fertigstellen des ersten Bluetooth Moduls&lt;br /&gt;
*Verbindung von NIBObee mit PC hergestellt&lt;br /&gt;
*Neue Funktionen zur Kommunikation. Senden und Empfangen mittels Interrupts implementiert&lt;br /&gt;
*Start Implementierung der State Maschine für das MaDeCo Protokoll&lt;br /&gt;
*Debug Möglichkeit mittels BT-Verbindung zum PC implementiert&lt;br /&gt;
*PC Testapplikation für die Bluetooth Verbindung mit spezieller Unterstützung des MaDeCo Protokolls implementiert.&lt;br /&gt;
*Erzeugen von DoxyGen Dokumentation&lt;br /&gt;
&amp;lt;!-- Ende Inhalt NIBObee --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|11.4.2011-1.5.2011&lt;br /&gt;
|Gemeinsam&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
&amp;lt;!-- Ende Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Board&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Board --&amp;gt;&lt;br /&gt;
&amp;lt;!-- Ende Inhalt Board --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|NIBObee&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt NIBObee --&amp;gt;&lt;br /&gt;
*Überarbeiten des Event-Machanismus&lt;br /&gt;
*Optimieren der Debug-Protokollierung über Bluetooth. Strings belegten zu viel Speicher. Das führte zu undefinierbarem Verhalten wegen Überschreiben von Stack und Daten.&lt;br /&gt;
*Erweitern der PC Applikation zum bedienen der NIBObee BT-Schnittstelle. Die optimierte Debug-Ausgabe kann auf Basis von speziellen Kommentaren der NIBObee-Source (debug.h) symbolisch aufbereitet werden.&lt;br /&gt;
*Erweiterung mit zusätliche Liniensensoren angefertigt&lt;br /&gt;
*Wegen zusätzlicher Liniensensoren neue Applikation zum Kalibrieren der Liniensensoren (jetzt 5 Sück) erstellt.&lt;br /&gt;
*Wegen zusätzlicher Liniensensoren ersetzen des original Moduls zum Einlesen der Analogwerte.&lt;br /&gt;
*Wegen zusätzlicher Liniensensoren ersetzen des original Moduls zum ermitteln der Werte der Liniensensoren.&lt;br /&gt;
*Kreuzungserkennung und Linienverfolgung funktionieren nun parallel, NIBObee fährt kleines Testlabyrinth gezielt ab.&lt;br /&gt;
&amp;lt;!-- Ende Inhalt NIBObee --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|2.5.2011-8.5.2011&lt;br /&gt;
|Gemeinsam&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
&amp;lt;!-- Ende Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Board&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Board --&amp;gt;&lt;br /&gt;
* verschiedene UART sourcecodes aus fremden Demoapplikationen versucht auf das board zu portieren&lt;br /&gt;
&amp;lt;!-- Ende Inhalt Board --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|NIBObee&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt NIBObee --&amp;gt;&lt;br /&gt;
&amp;lt;!-- Ende Inhalt NIBObee --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|9.5.2011-15.5.2011&lt;br /&gt;
|Gemeinsam&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
&amp;lt;!-- Ende Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Board&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Board --&amp;gt;&lt;br /&gt;
&amp;lt;!-- Ende Inhalt Board --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|NIBObee&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt NIBObee --&amp;gt;&lt;br /&gt;
&amp;lt;!-- Ende Inhalt NIBObee --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|16.5.2011-22.5.2011&lt;br /&gt;
|Gemeinsam&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
&amp;lt;!-- Ende Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Board&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Board --&amp;gt;&lt;br /&gt;
&amp;lt;!-- Ende Inhalt Board --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|NIBObee&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt NIBObee --&amp;gt;&lt;br /&gt;
&amp;lt;!-- Ende Inhalt NIBObee --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|23.5.2011-29.5.2011&lt;br /&gt;
|Gemeinsam&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
&amp;lt;!-- Ende Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Board&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Board --&amp;gt;&lt;br /&gt;
&amp;lt;!-- Ende Inhalt Board --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|NIBObee&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt NIBObee --&amp;gt;&lt;br /&gt;
&amp;lt;!-- Ende Inhalt NIBObee --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|30.5.2011-5.6.2011&lt;br /&gt;
|Gemeinsam&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
&amp;lt;!-- Ende Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Board&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Board --&amp;gt;&lt;br /&gt;
* PLL Initialisierung kontrolliert, marginaler Fehler korrigiert&lt;br /&gt;
* UART Initialisierung kontrolliert, nichts gefunden. UART0 Senden OK, UART1 NOK&lt;br /&gt;
* UART1 Initialisierung auf P3.16 und P3.17 führt zum Erfolg&lt;br /&gt;
* Die nötigen UART Funktionen identifiziert und modular implementiert.&lt;br /&gt;
* UART Funktionen Interrupt getrieben implementiert&lt;br /&gt;
* bluetooth Modul aufgebaut&lt;br /&gt;
&amp;lt;!-- Ende Inhalt Board --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|NIBObee&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt NIBObee --&amp;gt;&lt;br /&gt;
&amp;lt;!-- Ende Inhalt NIBObee --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|6.6.2011-19.6.2011&lt;br /&gt;
|Gemeinsam&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
* Funktionstest für bluetooth Modul am board und interruptgetriebene UART Funktionen&lt;br /&gt;
&amp;lt;!-- Ende Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Board&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Board --&amp;gt;&lt;br /&gt;
* Interrupt Handler erweitert: signalisiert wenn message komplett (CR) empfangen&lt;br /&gt;
* Handling für Sequenz- und Acknowledge-Nummern&lt;br /&gt;
* state machine für MaDeCo Protokoll&lt;br /&gt;
* Interface zu PC-Applikation&lt;br /&gt;
&amp;lt;!-- Ende Inhalt Board --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|NIBObee&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt NIBObee --&amp;gt;&lt;br /&gt;
&amp;lt;!-- Ende Inhalt NIBObee --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|&#039;&#039;&#039;20.06.2011&#039;&#039;&#039;&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|&#039;&#039;&#039;Projekt präsentiert -&amp;gt; Projektende&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:FH]]&lt;/div&gt;</summary>
		<author><name>Alois</name></author>
	</entry>
	<entry>
		<id>https://wiki.callooh.com/index.php?title=MaDeCo&amp;diff=889</id>
		<title>MaDeCo</title>
		<link rel="alternate" type="text/html" href="https://wiki.callooh.com/index.php?title=MaDeCo&amp;diff=889"/>
		<updated>2011-06-19T16:56:23Z</updated>

		<summary type="html">&lt;p&gt;Alois: /* Kürzester Weg */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= MaDeCo - Protokoll zur Kommunikation im [[RoLoMa]] Projekt =&lt;br /&gt;
&lt;br /&gt;
MaDeCo ist ein sehr einfaches textbasiertes Protokoll für die Kommunikation zwischen den Beteiligten im [[RoLoMa]] Projekt, den [[NIBObee]] Einheiten und der Basisstation, dem [[LPC2478]].&lt;br /&gt;
&lt;br /&gt;
== Rollen ==&lt;br /&gt;
Es gibt unter den Beteiligten zwei festgelegte Rollen, Sender und Empfänger. Der Sender überträgt Information, der Empfänger hingegen hat eine überwiegend passive Funktion, er quittiert Nachrichten und übermittelt einen Acknowledge Code.&lt;br /&gt;
Während der Kommunikation werden diese Rollen nicht gewechselt.&lt;br /&gt;
&lt;br /&gt;
== Format ==&lt;br /&gt;
Eine Nachricht besteht aus genau zwei Datensätzen, ein Datensatz besteht jeweils aus einem 3 Zeichen breiten Header Teil, einem 2 Zeichen breiten Datenteil (je nach Kommando optional oder mandatory) und einem Zeilenende (&amp;quot;\n&amp;quot;), das als einzelnes Zeichen CR (0x0d) realisiert ist.&amp;lt;strike&amp;gt; Für kleinere Datenteile erfolgt ein Padding mit Leerzeichen.&amp;lt;/strike&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beide Teile der Nachricht werden unmittelbar hintereinander gesendet, also z.B. als &#039;&#039;SEQ13\nOPMSM\n&#039;&#039;.&amp;lt;strike&amp;gt; In untenstehenden Beispielen werden die beiden Teile der Nachricht allerdings durch einen Zeilenumbruch getrennt, um die Nachricht lesbarer zu machen.&amp;lt;/strike&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Eine Nachricht, wie sie ein Sender erstellt, besteht aus:&lt;br /&gt;
 &amp;lt;Sequence&amp;gt;&lt;br /&gt;
 &amp;lt;Command&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;&amp;lt;Sequence&amp;gt;&lt;br /&gt;
: besteht aus dem Header &#039;&#039;SEQ&#039;&#039;, der Datenteil aus einer Nummer zwischen 1 und 99.&lt;br /&gt;
;&amp;lt;Command&amp;gt;&lt;br /&gt;
: besteht aus dem 3 Zeichen langen [[MaDeCo#Commands|Command-Code]], und einem entsprechenden Datenteil.&lt;br /&gt;
&lt;br /&gt;
Eine Nachricht muss mit einer Antwort quittiert werden. Diese besteht aus:&lt;br /&gt;
 &amp;lt;Acknowledge&amp;gt;&lt;br /&gt;
 &amp;lt;Acknowledge Code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;&amp;lt;Acknowledge&amp;gt;&lt;br /&gt;
: besteht aus dem Header &#039;&#039;ACK&#039;&#039; und der zu bestätigenden Sequence Number.&lt;br /&gt;
;&amp;lt;Acknowledge Code&amp;gt;&lt;br /&gt;
: besteht aus den Header &#039;&#039;ACC&#039;&#039; und dem [[MaDeCo#Acknowledge Codes|Code]].&lt;br /&gt;
&lt;br /&gt;
Beispiel sind be den jeweiligen [[MaDeCo#Use Cases|Use Cases]] zu finden.&lt;br /&gt;
&lt;br /&gt;
=== Commands ===&lt;br /&gt;
 EOC ... end of communication, signalisiert das Ende einer Kommunikation&lt;br /&gt;
 OPM ... Operation Mode (siehe [[MaDeCo#Betriebsmodus|Betriebsmodus]])&lt;br /&gt;
 WAP ... Waypoint (siehe [[MaDeCo#Wegpunkte|Wegpunkte]])&lt;br /&gt;
 DIR ... Angabe der Richtung im GO Betriebsmodus (siehe Kürzester Weg)&lt;br /&gt;
&lt;br /&gt;
=== Acknowledge Codes ===&lt;br /&gt;
 00 .. OK, Command acknowledged&lt;br /&gt;
 01 .. unknown Command&lt;br /&gt;
 02 .. invalid data&lt;br /&gt;
 03 .. overflow (kann z.B. derzeit keine weiteren Richtungsanweisungen entgegennehmen)&lt;br /&gt;
 11 .. unbekannter Betriebsmodus (e.g. OPMXX)&lt;br /&gt;
 21 .. command refused, Labyrinth erkunden (OPMSM) vor [[NIBObee#Kalibrierung]] (OPMGA)&lt;br /&gt;
&lt;br /&gt;
=== Betriebsmodus ===&lt;br /&gt;
 GA ... Kalibrieren (siehe [[NIBObee#Kalibrierung]])&lt;br /&gt;
 SM ... Labyrinth erkunden&lt;br /&gt;
 GO ... kürzesten Weg nehmen (siehe Kürzester Weg)&lt;br /&gt;
&lt;br /&gt;
=== Wegpunkte ===&lt;br /&gt;
Die Übertragung eines Wegpunkts erfolgt durch Angabe der Richtung (S,W,N,E), gefolgt von der Anzahl der Streckenteile.&lt;br /&gt;
 Beispiel: WAPS4   der Wegpunkt befindet sich 4 Streckenteile südlich des zuletzt übertragenen Wegpunkts&lt;br /&gt;
&lt;br /&gt;
== Ablauf ==&lt;br /&gt;
Im [[RoLoMa]] Projekt muss die Kommunikation aus Nachricht-Antwort Sequenzen bestehen. Wird eine gesendete Nachricht nicht bestätigt, erfolgt eine Neuübertragung nach dem RETRANSMISSION_TIMEOUT Interval.&lt;br /&gt;
Erfolgt auch nach RETRANSMISSION_COUNT Wiederholungen keine Antwort, wird die Übertragung abgebrochen und ein Fehler signalisiert.&lt;br /&gt;
&lt;br /&gt;
Kommunikationen überschneiden sich nicht, das bedeutet, es findet zu jedem Zeitpunkt nur eine Kommunikation zwischen den Beteiligten statt. Daher ist auch zu jedem Zeitpunkt genau ein Teilnehmer der Sender, und ein Teilnehmer der Empfänger.&lt;br /&gt;
&lt;br /&gt;
== Use Cases ==&lt;br /&gt;
Im folgenden werden Beispiele für die Kommunikation der unterschiedlichen Betriebsarten dargestellt. Daten vom Board werden normal, die von der NIBObee &#039;&#039;&#039;fett&#039;&#039;&#039; dargestellt.&lt;br /&gt;
&lt;br /&gt;
=== Kalibrieren ===&lt;br /&gt;
Beim Kalibrieren wird das Kommando vom Board an die NIBObee geschickt und auch bei Erhalt sofort quittiert (sonst würde es zu einem Timeout kommen). Nachdem die Kalibrierung abgeschlossen ist wird die Verbindung getrennt.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Beispiel:&#039;&#039;&lt;br /&gt;
 SEQ1 &lt;br /&gt;
 OPMGA&lt;br /&gt;
 &lt;br /&gt;
 &#039;&#039;&#039;ACK1&#039;&#039;&#039; &lt;br /&gt;
 &#039;&#039;&#039;ACC00&#039;&#039;&#039;&lt;br /&gt;
 &lt;br /&gt;
 &#039;&#039;&#039;SEQ2&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;EOC&#039;&#039;&#039;&lt;br /&gt;
 &lt;br /&gt;
 ACK2 &lt;br /&gt;
 ACC00&lt;br /&gt;
&lt;br /&gt;
=== Labyrinth erkunden===&lt;br /&gt;
Das Kommando wird vom Board an die NIBObee geschickt und auch bei Erhalt sofort quittiert (es muss vorher allerdings eine Kalibrierung durchgeführt worden sein). Danach werden laufend die Punkte geschickt die abgefahren werden. Wenn das ganze Labyrinth erfasst wurde wir die Kommunikation wieder beendet.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Beispiel:&#039;&#039;&lt;br /&gt;
 SEQ1 &lt;br /&gt;
 OPMSM&lt;br /&gt;
 &lt;br /&gt;
 &#039;&#039;&#039;ACK1&#039;&#039;&#039; &lt;br /&gt;
 &#039;&#039;&#039;ACC00&#039;&#039;&#039;&lt;br /&gt;
 &lt;br /&gt;
 &#039;&#039;&#039;SEQ2&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;WAPN3&#039;&#039;&#039;&lt;br /&gt;
 &lt;br /&gt;
 ACK2 &lt;br /&gt;
 ACC00&lt;br /&gt;
 &lt;br /&gt;
 &#039;&#039;&#039;SEQ3&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;WAPE1&#039;&#039;&#039;&lt;br /&gt;
 &lt;br /&gt;
 ...&lt;br /&gt;
 &lt;br /&gt;
 &#039;&#039;&#039;SEQ32&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;EOC&#039;&#039;&#039;&lt;br /&gt;
 &lt;br /&gt;
 ACK32 &lt;br /&gt;
 ACC00&lt;br /&gt;
&lt;br /&gt;
=== Kürzester Weg === &lt;br /&gt;
Hier werden Richtungsanweisungen übertragen, die es der [[NIBObee]] ermöglichen, in einem Labyrinth den kürzesten Weg zu nehmen. Die Richtungen werden wieder mit Himmelsrichtungen beschrieben, diesmal allerdings ohne Längenangabe da immer bis zur nächsten Kreuzung gefahren wird. &lt;br /&gt;
In dem Beispiel wird der kürzeste Weg als S(üd)-W(est)-N(ord)-W(est) angegeben:&lt;br /&gt;
 SEQ1 &lt;br /&gt;
 OPMGO&lt;br /&gt;
 &lt;br /&gt;
 &#039;&#039;&#039;ACK1&#039;&#039;&#039; &lt;br /&gt;
 &#039;&#039;&#039;ACC00&#039;&#039;&#039;&lt;br /&gt;
 &lt;br /&gt;
 SEQ2 &lt;br /&gt;
 DIRS &lt;br /&gt;
 &lt;br /&gt;
 &#039;&#039;&#039;ACK2&#039;&#039;&#039; &lt;br /&gt;
 &#039;&#039;&#039;ACC00&#039;&#039;&#039;&lt;br /&gt;
 &lt;br /&gt;
 SEQ3 &lt;br /&gt;
 DIRW &lt;br /&gt;
 &lt;br /&gt;
 &#039;&#039;&#039;ACK3&#039;&#039;&#039; &lt;br /&gt;
 &#039;&#039;&#039;ACC00&#039;&#039;&#039;&lt;br /&gt;
 &lt;br /&gt;
 SEQ4 &lt;br /&gt;
 DIRN &lt;br /&gt;
 &lt;br /&gt;
 &#039;&#039;&#039;ACK4&#039;&#039;&#039; &lt;br /&gt;
 &#039;&#039;&#039;ACC00&#039;&#039;&#039;&lt;br /&gt;
 &lt;br /&gt;
 SEQ5 &lt;br /&gt;
 DIRW &lt;br /&gt;
 &lt;br /&gt;
 &#039;&#039;&#039;ACK5&#039;&#039;&#039; &lt;br /&gt;
 &#039;&#039;&#039;ACC00&#039;&#039;&#039;&lt;br /&gt;
 &lt;br /&gt;
 SEQ6 &lt;br /&gt;
 EOC&lt;br /&gt;
 &lt;br /&gt;
 &#039;&#039;&#039;ACK6&#039;&#039;&#039; &lt;br /&gt;
 &#039;&#039;&#039;ACC00&#039;&#039;&#039;&lt;br /&gt;
 &lt;br /&gt;
[[Kategorie:FH]]&lt;/div&gt;</summary>
		<author><name>Alois</name></author>
	</entry>
	<entry>
		<id>https://wiki.callooh.com/index.php?title=MaDeCo&amp;diff=883</id>
		<title>MaDeCo</title>
		<link rel="alternate" type="text/html" href="https://wiki.callooh.com/index.php?title=MaDeCo&amp;diff=883"/>
		<updated>2011-05-26T08:13:06Z</updated>

		<summary type="html">&lt;p&gt;Alois: /* Acknowledge Codes */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= MaDeCo - Protokoll zur Kommunikation im [[RoLoMa]] Projekt =&lt;br /&gt;
&lt;br /&gt;
MaDeCo ist ein sehr einfaches textbasiertes Protokoll für die Kommunikation zwischen den Beteiligten im [[RoLoMa]] Projekt, den [[NIBObee]] Einheiten und der Basisstation, dem [[LPC2478]].&lt;br /&gt;
&lt;br /&gt;
== Rollen ==&lt;br /&gt;
Es gibt unter den Beteiligten zwei festgelegte Rollen, Sender und Empfänger. Der Sender überträgt Information, der Empfänger hingegen hat eine überwiegend passive Funktion, er quittiert Nachrichten und übermittelt einen Acknowledge Code.&lt;br /&gt;
Während der Kommunikation werden diese Rollen nicht gewechselt.&lt;br /&gt;
&lt;br /&gt;
== Format ==&lt;br /&gt;
Eine Nachricht besteht aus genau zwei Datensätzen, ein Datensatz besteht jeweils aus einem 3 Zeichen breiten Header Teil, einem 2 Zeichen breiten Datenteil (je nach Kommando optional oder mandatory) und einem Zeilenende (&amp;quot;\n&amp;quot;).&amp;lt;strike&amp;gt; Für kleinere Datenteile erfolgt ein Padding mit Leerzeichen.&amp;lt;/strike&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beide Teile der Nachricht werden unmittelbar hintereinander gesendet, also z.B. als &#039;&#039;SEQ13\nOPMSM\n&#039;&#039;.&amp;lt;strike&amp;gt; In untenstehenden Beispielen werden die beiden Teile der Nachricht allerdings durch einen Zeilenumbruch getrennt, um die Nachricht lesbarer zu machen.&amp;lt;/strike&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Eine Nachricht, wie sie ein Sender erstellt, besteht aus:&lt;br /&gt;
 &amp;lt;Sequence&amp;gt;&lt;br /&gt;
 &amp;lt;Command&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;&amp;lt;Sequence&amp;gt;&lt;br /&gt;
: besteht aus dem Header &#039;&#039;SEQ&#039;&#039;, der Datenteil aus einer Nummer zwischen 1 und 99.&lt;br /&gt;
;&amp;lt;Command&amp;gt;&lt;br /&gt;
: besteht aus dem 3 Zeichen langen [[MaDeCo#Commands|Command-Code]], und einem entsprechenden Datenteil.&lt;br /&gt;
&lt;br /&gt;
Eine Nachricht muss mit einer Antwort quittiert werden. Diese besteht aus:&lt;br /&gt;
 &amp;lt;Acknowledge&amp;gt;&lt;br /&gt;
 &amp;lt;Acknowledge Code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;&amp;lt;Acknowledge&amp;gt;&lt;br /&gt;
: besteht aus dem Header &#039;&#039;ACK&#039;&#039; und der zu bestätigenden Sequence Number.&lt;br /&gt;
;&amp;lt;Acknowledge Code&amp;gt;&lt;br /&gt;
: besteht aus den Header &#039;&#039;ACC&#039;&#039; und dem [[MaDeCo#Acknowledge Codes|Code]].&lt;br /&gt;
&lt;br /&gt;
Beispiel sind be den jeweiligen [[MaDeCo#Use Cases|Use Cases]] zu finden.&lt;br /&gt;
&lt;br /&gt;
=== Commands ===&lt;br /&gt;
 EOC ... end of communication, signalisiert das Ende einer Kommunikation&lt;br /&gt;
 OPM ... Operation Mode (siehe [[MaDeCo#Betriebsmodus|Betriebsmodus]])&lt;br /&gt;
 WAP ... Waypoint (siehe [[MaDeCo#Wegpunkte|Wegpunkte]])&lt;br /&gt;
 DIR ... Angabe der Richtung im GO Betriebsmodus (siehe Kürzester Weg)&lt;br /&gt;
&lt;br /&gt;
=== Acknowledge Codes ===&lt;br /&gt;
 00 .. OK, Command acknowledged&lt;br /&gt;
 01 .. unknown Command&lt;br /&gt;
 02 .. invalid data&lt;br /&gt;
 03 .. overflow (kann z.B. derzeit keine weiteren Richtungsanweisungen entgegennehmen)&lt;br /&gt;
 11 .. unbekannter Betriebsmodus (e.g. OPMXX)&lt;br /&gt;
 21 .. command refused, Labyrinth erkunden (OPMSM) vor [[NIBObee#Kalibrierung]] (OPMGA)&lt;br /&gt;
&lt;br /&gt;
=== Betriebsmodus ===&lt;br /&gt;
 GA ... Kalibrieren (siehe [[NIBObee#Kalibrierung]])&lt;br /&gt;
 SM ... Labyrinth erkunden&lt;br /&gt;
 GO ... kürzesten Weg nehmen (siehe Kürzester Weg)&lt;br /&gt;
&lt;br /&gt;
=== Wegpunkte ===&lt;br /&gt;
Die Übertragung eines Wegpunkts erfolgt durch Angabe der Richtung (S,W,N,E), gefolgt von der Anzahl der Streckenteile.&lt;br /&gt;
 Beispiel: WAPS4   der Wegpunkt befindet sich 4 Streckenteile südlich des zuletzt übertragenen Wegpunkts&lt;br /&gt;
&lt;br /&gt;
== Ablauf ==&lt;br /&gt;
Im [[RoLoMa]] Projekt muss die Kommunikation aus Nachricht-Antwort Sequenzen bestehen. Wird eine gesendete Nachricht nicht bestätigt, erfolgt eine Neuübertragung nach dem RETRANSMISSION_TIMEOUT Interval.&lt;br /&gt;
Erfolgt auch nach RETRANSMISSION_COUNT Wiederholungen keine Antwort, wird die Übertragung abgebrochen und ein Fehler signalisiert.&lt;br /&gt;
&lt;br /&gt;
Kommunikationen überschneiden sich nicht, das bedeutet, es findet zu jedem Zeitpunkt nur eine Kommunikation zwischen den Beteiligten statt. Daher ist auch zu jedem Zeitpunkt genau ein Teilnehmer der Sender, und ein Teilnehmer der Empfänger.&lt;br /&gt;
&lt;br /&gt;
== Use Cases ==&lt;br /&gt;
Im folgenden werden Beispiele für die Kommunikation der unterschiedlichen Betriebsarten dargestellt. Daten vom Board werden normal, die von der NIBObee &#039;&#039;&#039;fett&#039;&#039;&#039; dargestellt.&lt;br /&gt;
&lt;br /&gt;
=== Kalibrieren ===&lt;br /&gt;
Beim Kalibrieren wird das Kommando vom Board an die NIBObee geschickt und auch bei Erhalt sofort quittiert (sonst würde es zu einem Timeout kommen). Nachdem die Kalibrierung abgeschlossen ist wird die Verbindung getrennt.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Beispiel:&#039;&#039;&lt;br /&gt;
 SEQ1 &lt;br /&gt;
 OPMGA&lt;br /&gt;
 &lt;br /&gt;
 &#039;&#039;&#039;ACK1&#039;&#039;&#039; &lt;br /&gt;
 &#039;&#039;&#039;ACC00&#039;&#039;&#039;&lt;br /&gt;
 &lt;br /&gt;
 &#039;&#039;&#039;SEQ2&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;EOC&#039;&#039;&#039;&lt;br /&gt;
 &lt;br /&gt;
 ACK2 &lt;br /&gt;
 ACC00&lt;br /&gt;
&lt;br /&gt;
=== Labyrinth erkunden===&lt;br /&gt;
Das Kommando wird vom Board an die NIBObee geschickt und auch bei Erhalt sofort quittiert (es muss vorher allerdings eine Kalibrierung durchgeführt worden sein). Danach werden laufend die Punkte geschickt die abgefahren werden. Wenn das ganze Labyrinth erfasst wurde wir die Kommunikation wieder beendet.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Beispiel:&#039;&#039;&lt;br /&gt;
 SEQ1 &lt;br /&gt;
 OPMSM&lt;br /&gt;
 &lt;br /&gt;
 &#039;&#039;&#039;ACK1&#039;&#039;&#039; &lt;br /&gt;
 &#039;&#039;&#039;ACC00&#039;&#039;&#039;&lt;br /&gt;
 &lt;br /&gt;
 &#039;&#039;&#039;SEQ2&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;WAPN3&#039;&#039;&#039;&lt;br /&gt;
 &lt;br /&gt;
 ACK2 &lt;br /&gt;
 ACC00&lt;br /&gt;
 &lt;br /&gt;
 &#039;&#039;&#039;SEQ3&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;WAPE1&#039;&#039;&#039;&lt;br /&gt;
 &lt;br /&gt;
 ...&lt;br /&gt;
 &lt;br /&gt;
 &#039;&#039;&#039;SEQ32&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;EOC&#039;&#039;&#039;&lt;br /&gt;
 &lt;br /&gt;
 ACK32 &lt;br /&gt;
 ACC00&lt;br /&gt;
&lt;br /&gt;
=== Kürzester Weg === &lt;br /&gt;
Hier werden Richtungsanweisungen übertragen, die es der [[NIBObee]] ermöglichen, in einem Labyrinth den kürzesten Weg zu nehmen. Die Richtungen werden wieder mit Himmelsrichtungen beschrieben, diesmal allerdings ohne Längenangabe da immer bis zur nächsten Kreuzung gefahren wird. &lt;br /&gt;
Beispiel (ohne ACKs), der kürzeste Weg wird als S(üd)-N(ord)-W(est)-S(üd) angegeben:&lt;br /&gt;
 SEQ1 &lt;br /&gt;
 OPMGO&lt;br /&gt;
 &lt;br /&gt;
 SEQ2 &lt;br /&gt;
 DIRS &lt;br /&gt;
 &lt;br /&gt;
 SEQ3 &lt;br /&gt;
 DIRN &lt;br /&gt;
 &lt;br /&gt;
 SEQ4 &lt;br /&gt;
 DIRW &lt;br /&gt;
 &lt;br /&gt;
 SEQ5 &lt;br /&gt;
 DIRS &lt;br /&gt;
 &lt;br /&gt;
 SEQ6 &lt;br /&gt;
 EOC&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:FH]]&lt;/div&gt;</summary>
		<author><name>Alois</name></author>
	</entry>
	<entry>
		<id>https://wiki.callooh.com/index.php?title=MaDeCo&amp;diff=882</id>
		<title>MaDeCo</title>
		<link rel="alternate" type="text/html" href="https://wiki.callooh.com/index.php?title=MaDeCo&amp;diff=882"/>
		<updated>2011-05-26T07:13:20Z</updated>

		<summary type="html">&lt;p&gt;Alois: /* Use Cases */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= MaDeCo - Protokoll zur Kommunikation im [[RoLoMa]] Projekt =&lt;br /&gt;
&lt;br /&gt;
MaDeCo ist ein sehr einfaches textbasiertes Protokoll für die Kommunikation zwischen den Beteiligten im [[RoLoMa]] Projekt, den [[NIBObee]] Einheiten und der Basisstation, dem [[LPC2478]].&lt;br /&gt;
&lt;br /&gt;
== Rollen ==&lt;br /&gt;
Es gibt unter den Beteiligten zwei festgelegte Rollen, Sender und Empfänger. Der Sender überträgt Information, der Empfänger hingegen hat eine überwiegend passive Funktion, er quittiert Nachrichten und übermittelt einen Acknowledge Code.&lt;br /&gt;
Während der Kommunikation werden diese Rollen nicht gewechselt.&lt;br /&gt;
&lt;br /&gt;
== Format ==&lt;br /&gt;
Eine Nachricht besteht aus genau zwei Datensätzen, ein Datensatz besteht jeweils aus einem 3 Zeichen breiten Header Teil, einem 2 Zeichen breiten Datenteil (je nach Kommando optional oder mandatory) und einem Zeilenende (&amp;quot;\n&amp;quot;).&amp;lt;strike&amp;gt; Für kleinere Datenteile erfolgt ein Padding mit Leerzeichen.&amp;lt;/strike&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beide Teile der Nachricht werden unmittelbar hintereinander gesendet, also z.B. als &#039;&#039;SEQ13\nOPMSM\n&#039;&#039;.&amp;lt;strike&amp;gt; In untenstehenden Beispielen werden die beiden Teile der Nachricht allerdings durch einen Zeilenumbruch getrennt, um die Nachricht lesbarer zu machen.&amp;lt;/strike&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Eine Nachricht, wie sie ein Sender erstellt, besteht aus:&lt;br /&gt;
 &amp;lt;Sequence&amp;gt;&lt;br /&gt;
 &amp;lt;Command&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;&amp;lt;Sequence&amp;gt;&lt;br /&gt;
: besteht aus dem Header &#039;&#039;SEQ&#039;&#039;, der Datenteil aus einer Nummer zwischen 1 und 99.&lt;br /&gt;
;&amp;lt;Command&amp;gt;&lt;br /&gt;
: besteht aus dem 3 Zeichen langen [[MaDeCo#Commands|Command-Code]], und einem entsprechenden Datenteil.&lt;br /&gt;
&lt;br /&gt;
Eine Nachricht muss mit einer Antwort quittiert werden. Diese besteht aus:&lt;br /&gt;
 &amp;lt;Acknowledge&amp;gt;&lt;br /&gt;
 &amp;lt;Acknowledge Code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;&amp;lt;Acknowledge&amp;gt;&lt;br /&gt;
: besteht aus dem Header &#039;&#039;ACK&#039;&#039; und der zu bestätigenden Sequence Number.&lt;br /&gt;
;&amp;lt;Acknowledge Code&amp;gt;&lt;br /&gt;
: besteht aus den Header &#039;&#039;ACC&#039;&#039; und dem [[MaDeCo#Acknowledge Codes|Code]].&lt;br /&gt;
&lt;br /&gt;
Beispiel sind be den jeweiligen [[MaDeCo#Use Cases|Use Cases]] zu finden.&lt;br /&gt;
&lt;br /&gt;
=== Commands ===&lt;br /&gt;
 EOC ... end of communication, signalisiert das Ende einer Kommunikation&lt;br /&gt;
 OPM ... Operation Mode (siehe [[MaDeCo#Betriebsmodus|Betriebsmodus]])&lt;br /&gt;
 WAP ... Waypoint (siehe [[MaDeCo#Wegpunkte|Wegpunkte]])&lt;br /&gt;
 DIR ... Angabe der Richtung im GO Betriebsmodus (siehe Kürzester Weg)&lt;br /&gt;
&lt;br /&gt;
=== Acknowledge Codes ===&lt;br /&gt;
 00 .. OK, Command acknowledged&lt;br /&gt;
 01 .. unknown Command&lt;br /&gt;
 02 .. invalid data&lt;br /&gt;
 11 .. unbekannter Betriebsmodus (e.g. OPMXX)&lt;br /&gt;
 21 .. Command refused, Labyrinth erkunden (OPMSM) vor [[NIBObee#Kalibrierung]] (OPMGA)&lt;br /&gt;
&lt;br /&gt;
=== Betriebsmodus ===&lt;br /&gt;
 GA ... Kalibrieren (siehe [[NIBObee#Kalibrierung]])&lt;br /&gt;
 SM ... Labyrinth erkunden&lt;br /&gt;
 GO ... kürzesten Weg nehmen (siehe Kürzester Weg)&lt;br /&gt;
&lt;br /&gt;
=== Wegpunkte ===&lt;br /&gt;
Die Übertragung eines Wegpunkts erfolgt durch Angabe der Richtung (S,W,N,E), gefolgt von der Anzahl der Streckenteile.&lt;br /&gt;
 Beispiel: WAPS4   der Wegpunkt befindet sich 4 Streckenteile südlich des zuletzt übertragenen Wegpunkts&lt;br /&gt;
&lt;br /&gt;
== Ablauf ==&lt;br /&gt;
Im [[RoLoMa]] Projekt muss die Kommunikation aus Nachricht-Antwort Sequenzen bestehen. Wird eine gesendete Nachricht nicht bestätigt, erfolgt eine Neuübertragung nach dem RETRANSMISSION_TIMEOUT Interval.&lt;br /&gt;
Erfolgt auch nach RETRANSMISSION_COUNT Wiederholungen keine Antwort, wird die Übertragung abgebrochen und ein Fehler signalisiert.&lt;br /&gt;
&lt;br /&gt;
Kommunikationen überschneiden sich nicht, das bedeutet, es findet zu jedem Zeitpunkt nur eine Kommunikation zwischen den Beteiligten statt. Daher ist auch zu jedem Zeitpunkt genau ein Teilnehmer der Sender, und ein Teilnehmer der Empfänger.&lt;br /&gt;
&lt;br /&gt;
== Use Cases ==&lt;br /&gt;
Im folgenden werden Beispiele für die Kommunikation der unterschiedlichen Betriebsarten dargestellt. Daten vom Board werden normal, die von der NIBObee &#039;&#039;&#039;fett&#039;&#039;&#039; dargestellt.&lt;br /&gt;
&lt;br /&gt;
=== Kalibrieren ===&lt;br /&gt;
Beim Kalibrieren wird das Kommando vom Board an die NIBObee geschickt und auch bei Erhalt sofort quittiert (sonst würde es zu einem Timeout kommen). Nachdem die Kalibrierung abgeschlossen ist wird die Verbindung getrennt.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Beispiel:&#039;&#039;&lt;br /&gt;
 SEQ1 &lt;br /&gt;
 OPMGA&lt;br /&gt;
 &lt;br /&gt;
 &#039;&#039;&#039;ACK1&#039;&#039;&#039; &lt;br /&gt;
 &#039;&#039;&#039;ACC00&#039;&#039;&#039;&lt;br /&gt;
 &lt;br /&gt;
 &#039;&#039;&#039;SEQ2&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;EOC&#039;&#039;&#039;&lt;br /&gt;
 &lt;br /&gt;
 ACK2 &lt;br /&gt;
 ACC00&lt;br /&gt;
&lt;br /&gt;
=== Labyrinth erkunden===&lt;br /&gt;
Das Kommando wird vom Board an die NIBObee geschickt und auch bei Erhalt sofort quittiert (es muss vorher allerdings eine Kalibrierung durchgeführt worden sein). Danach werden laufend die Punkte geschickt die abgefahren werden. Wenn das ganze Labyrinth erfasst wurde wir die Kommunikation wieder beendet.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Beispiel:&#039;&#039;&lt;br /&gt;
 SEQ1 &lt;br /&gt;
 OPMSM&lt;br /&gt;
 &lt;br /&gt;
 &#039;&#039;&#039;ACK1&#039;&#039;&#039; &lt;br /&gt;
 &#039;&#039;&#039;ACC00&#039;&#039;&#039;&lt;br /&gt;
 &lt;br /&gt;
 &#039;&#039;&#039;SEQ2&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;WAPN3&#039;&#039;&#039;&lt;br /&gt;
 &lt;br /&gt;
 ACK2 &lt;br /&gt;
 ACC00&lt;br /&gt;
 &lt;br /&gt;
 &#039;&#039;&#039;SEQ3&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;WAPE1&#039;&#039;&#039;&lt;br /&gt;
 &lt;br /&gt;
 ...&lt;br /&gt;
 &lt;br /&gt;
 &#039;&#039;&#039;SEQ32&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;EOC&#039;&#039;&#039;&lt;br /&gt;
 &lt;br /&gt;
 ACK32 &lt;br /&gt;
 ACC00&lt;br /&gt;
&lt;br /&gt;
=== Kürzester Weg === &lt;br /&gt;
Hier werden Richtungsanweisungen übertragen, die es der [[NIBObee]] ermöglichen, in einem Labyrinth den kürzesten Weg zu nehmen. Die Richtungen werden wieder mit Himmelsrichtungen beschrieben, diesmal allerdings ohne Längenangabe da immer bis zur nächsten Kreuzung gefahren wird. &lt;br /&gt;
Beispiel (ohne ACKs), der kürzeste Weg wird als S(üd)-N(ord)-W(est)-S(üd) angegeben:&lt;br /&gt;
 SEQ1 &lt;br /&gt;
 OPMGO&lt;br /&gt;
 &lt;br /&gt;
 SEQ2 &lt;br /&gt;
 DIRS &lt;br /&gt;
 &lt;br /&gt;
 SEQ3 &lt;br /&gt;
 DIRN &lt;br /&gt;
 &lt;br /&gt;
 SEQ4 &lt;br /&gt;
 DIRW &lt;br /&gt;
 &lt;br /&gt;
 SEQ5 &lt;br /&gt;
 DIRS &lt;br /&gt;
 &lt;br /&gt;
 SEQ6 &lt;br /&gt;
 EOC&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:FH]]&lt;/div&gt;</summary>
		<author><name>Alois</name></author>
	</entry>
	<entry>
		<id>https://wiki.callooh.com/index.php?title=MaDeCo&amp;diff=881</id>
		<title>MaDeCo</title>
		<link rel="alternate" type="text/html" href="https://wiki.callooh.com/index.php?title=MaDeCo&amp;diff=881"/>
		<updated>2011-05-26T06:51:12Z</updated>

		<summary type="html">&lt;p&gt;Alois: /* Format */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= MaDeCo - Protokoll zur Kommunikation im [[RoLoMa]] Projekt =&lt;br /&gt;
&lt;br /&gt;
MaDeCo ist ein sehr einfaches textbasiertes Protokoll für die Kommunikation zwischen den Beteiligten im [[RoLoMa]] Projekt, den [[NIBObee]] Einheiten und der Basisstation, dem [[LPC2478]].&lt;br /&gt;
&lt;br /&gt;
== Rollen ==&lt;br /&gt;
Es gibt unter den Beteiligten zwei festgelegte Rollen, Sender und Empfänger. Der Sender überträgt Information, der Empfänger hingegen hat eine überwiegend passive Funktion, er quittiert Nachrichten und übermittelt einen Acknowledge Code.&lt;br /&gt;
Während der Kommunikation werden diese Rollen nicht gewechselt.&lt;br /&gt;
&lt;br /&gt;
== Format ==&lt;br /&gt;
Eine Nachricht besteht aus genau zwei Datensätzen, ein Datensatz besteht jeweils aus einem 3 Zeichen breiten Header Teil, einem 2 Zeichen breiten Datenteil (je nach Kommando optional oder mandatory) und einem Zeilenende (&amp;quot;\n&amp;quot;).&amp;lt;strike&amp;gt; Für kleinere Datenteile erfolgt ein Padding mit Leerzeichen.&amp;lt;/strike&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beide Teile der Nachricht werden unmittelbar hintereinander gesendet, also z.B. als &#039;&#039;SEQ13\nOPMSM\n&#039;&#039;.&amp;lt;strike&amp;gt; In untenstehenden Beispielen werden die beiden Teile der Nachricht allerdings durch einen Zeilenumbruch getrennt, um die Nachricht lesbarer zu machen.&amp;lt;/strike&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Eine Nachricht, wie sie ein Sender erstellt, besteht aus:&lt;br /&gt;
 &amp;lt;Sequence&amp;gt;&lt;br /&gt;
 &amp;lt;Command&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;&amp;lt;Sequence&amp;gt;&lt;br /&gt;
: besteht aus dem Header &#039;&#039;SEQ&#039;&#039;, der Datenteil aus einer Nummer zwischen 1 und 99.&lt;br /&gt;
;&amp;lt;Command&amp;gt;&lt;br /&gt;
: besteht aus dem 3 Zeichen langen [[MaDeCo#Commands|Command-Code]], und einem entsprechenden Datenteil.&lt;br /&gt;
&lt;br /&gt;
Eine Nachricht muss mit einer Antwort quittiert werden. Diese besteht aus:&lt;br /&gt;
 &amp;lt;Acknowledge&amp;gt;&lt;br /&gt;
 &amp;lt;Acknowledge Code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;&amp;lt;Acknowledge&amp;gt;&lt;br /&gt;
: besteht aus dem Header &#039;&#039;ACK&#039;&#039; und der zu bestätigenden Sequence Number.&lt;br /&gt;
;&amp;lt;Acknowledge Code&amp;gt;&lt;br /&gt;
: besteht aus den Header &#039;&#039;ACC&#039;&#039; und dem [[MaDeCo#Acknowledge Codes|Code]].&lt;br /&gt;
&lt;br /&gt;
Beispiel sind be den jeweiligen [[MaDeCo#Use Cases|Use Cases]] zu finden.&lt;br /&gt;
&lt;br /&gt;
=== Commands ===&lt;br /&gt;
 EOC ... end of communication, signalisiert das Ende einer Kommunikation&lt;br /&gt;
 OPM ... Operation Mode (siehe [[MaDeCo#Betriebsmodus|Betriebsmodus]])&lt;br /&gt;
 WAP ... Waypoint (siehe [[MaDeCo#Wegpunkte|Wegpunkte]])&lt;br /&gt;
 DIR ... Angabe der Richtung im GO Betriebsmodus (siehe Kürzester Weg)&lt;br /&gt;
&lt;br /&gt;
=== Acknowledge Codes ===&lt;br /&gt;
 00 .. OK, Command acknowledged&lt;br /&gt;
 01 .. unknown Command&lt;br /&gt;
 02 .. invalid data&lt;br /&gt;
 11 .. unbekannter Betriebsmodus (e.g. OPMXX)&lt;br /&gt;
 21 .. Command refused, Labyrinth erkunden (OPMSM) vor [[NIBObee#Kalibrierung]] (OPMGA)&lt;br /&gt;
&lt;br /&gt;
=== Betriebsmodus ===&lt;br /&gt;
 GA ... Kalibrieren (siehe [[NIBObee#Kalibrierung]])&lt;br /&gt;
 SM ... Labyrinth erkunden&lt;br /&gt;
 GO ... kürzesten Weg nehmen (siehe Kürzester Weg)&lt;br /&gt;
&lt;br /&gt;
=== Wegpunkte ===&lt;br /&gt;
Die Übertragung eines Wegpunkts erfolgt durch Angabe der Richtung (S,W,N,E), gefolgt von der Anzahl der Streckenteile.&lt;br /&gt;
 Beispiel: WAPS4   der Wegpunkt befindet sich 4 Streckenteile südlich des zuletzt übertragenen Wegpunkts&lt;br /&gt;
&lt;br /&gt;
== Ablauf ==&lt;br /&gt;
Im [[RoLoMa]] Projekt muss die Kommunikation aus Nachricht-Antwort Sequenzen bestehen. Wird eine gesendete Nachricht nicht bestätigt, erfolgt eine Neuübertragung nach dem RETRANSMISSION_TIMEOUT Interval.&lt;br /&gt;
Erfolgt auch nach RETRANSMISSION_COUNT Wiederholungen keine Antwort, wird die Übertragung abgebrochen und ein Fehler signalisiert.&lt;br /&gt;
&lt;br /&gt;
Kommunikationen überschneiden sich nicht, das bedeutet, es findet zu jedem Zeitpunkt nur eine Kommunikation zwischen den Beteiligten statt. Daher ist auch zu jedem Zeitpunkt genau ein Teilnehmer der Sender, und ein Teilnehmer der Empfänger.&lt;br /&gt;
&lt;br /&gt;
== Use Cases ==&lt;br /&gt;
Im folgenden werden Beispiele für die Kommunikation der unterschiedlichen Betriebsarten dargestellt. Daten vom Borad werden normal, die von der NIBObee &#039;&#039;&#039;fett&#039;&#039;&#039; dargestellt.&lt;br /&gt;
&lt;br /&gt;
=== Kalibrieren ===&lt;br /&gt;
Beim Kalibrieren wird das Kommando vom Board an die NIBObee geschickt und auch bei Erhalt sofort quittiert (sonst würde es zu einem Timeout kommen). Nachdem die Kalibrierung abgeschlossen ist wird die Verbindung getrennt.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Beispiel:&#039;&#039;&lt;br /&gt;
 SEQ1 &lt;br /&gt;
 OPMGA&lt;br /&gt;
 &lt;br /&gt;
 &#039;&#039;&#039;ACK1&#039;&#039;&#039; &lt;br /&gt;
 &#039;&#039;&#039;ACC00&#039;&#039;&#039;&lt;br /&gt;
 &lt;br /&gt;
 &#039;&#039;&#039;SEQ2&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;EOC&#039;&#039;&#039;&lt;br /&gt;
 &lt;br /&gt;
 ACK2 &lt;br /&gt;
 ACC00&lt;br /&gt;
&lt;br /&gt;
=== Labyrinth erkunden===&lt;br /&gt;
Das Kommando wird vom Board an die NIBObee geschickt und auch bei Erhalt sofort quittiert (es muss vorher allerdings eine Kalibrierung durchgeführt worden sein). Danach werden laufend die Punkte geschickt die abgefahren werden. Wenn das ganze Labyrinth erfasst wurde wir die Kommunikation wieder beendet.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Beispiel:&#039;&#039;&lt;br /&gt;
 SEQ1 &lt;br /&gt;
 OPMSM&lt;br /&gt;
 &lt;br /&gt;
 &#039;&#039;&#039;ACK1&#039;&#039;&#039; &lt;br /&gt;
 &#039;&#039;&#039;ACC00&#039;&#039;&#039;&lt;br /&gt;
 &lt;br /&gt;
 &#039;&#039;&#039;SEQ2&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;WAPN3&#039;&#039;&#039;&lt;br /&gt;
 &lt;br /&gt;
 ACK2 &lt;br /&gt;
 ACC00&lt;br /&gt;
 &lt;br /&gt;
 &#039;&#039;&#039;SEQ3&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;WAPE1&#039;&#039;&#039;&lt;br /&gt;
 &lt;br /&gt;
 ...&lt;br /&gt;
 &lt;br /&gt;
 &#039;&#039;&#039;SEQ32&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;EOC&#039;&#039;&#039;&lt;br /&gt;
 &lt;br /&gt;
 ACK32 &lt;br /&gt;
 ACC00&lt;br /&gt;
&lt;br /&gt;
=== Kürzester Weg === &lt;br /&gt;
Hier werden Richtungsanweisungen übertragen, die es der [[NIBObee]] ermöglichen, in einem Labyrinth den kürzesten Weg zu nehmen.&lt;br /&gt;
Beispiel (ohne ACKs), der kürzeste Weg wird als S(üd)-N(ord)-W(est)-S(üd) angegeben:&lt;br /&gt;
 SEQ1 &lt;br /&gt;
 OPMGO&lt;br /&gt;
 &lt;br /&gt;
 SEQ2 &lt;br /&gt;
 DIRS &lt;br /&gt;
 &lt;br /&gt;
 SEQ3 &lt;br /&gt;
 DIRN &lt;br /&gt;
 &lt;br /&gt;
 SEQ4 &lt;br /&gt;
 DIRW &lt;br /&gt;
 &lt;br /&gt;
 SEQ5 &lt;br /&gt;
 DIRS &lt;br /&gt;
 &lt;br /&gt;
 SEQ6 &lt;br /&gt;
 EOC&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:FH]]&lt;/div&gt;</summary>
		<author><name>Alois</name></author>
	</entry>
	<entry>
		<id>https://wiki.callooh.com/index.php?title=MaDeCo&amp;diff=880</id>
		<title>MaDeCo</title>
		<link rel="alternate" type="text/html" href="https://wiki.callooh.com/index.php?title=MaDeCo&amp;diff=880"/>
		<updated>2011-05-26T06:31:43Z</updated>

		<summary type="html">&lt;p&gt;Alois: /* Labyrinth erkunden */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= MaDeCo - Protokoll zur Kommunikation im [[RoLoMa]] Projekt =&lt;br /&gt;
&lt;br /&gt;
MaDeCo ist ein sehr einfaches textbasiertes Protokoll für die Kommunikation zwischen den Beteiligten im [[RoLoMa]] Projekt, den [[NIBObee]] Einheiten und der Basisstation, dem [[LPC2478]].&lt;br /&gt;
&lt;br /&gt;
== Rollen ==&lt;br /&gt;
Es gibt unter den Beteiligten zwei festgelegte Rollen, Sender und Empfänger. Der Sender überträgt Information, der Empfänger hingegen hat eine überwiegend passive Funktion, er quittiert Nachrichten und übermittelt einen Acknowledge Code.&lt;br /&gt;
Während der Kommunikation werden diese Rollen nicht gewechselt.&lt;br /&gt;
&lt;br /&gt;
== Format ==&lt;br /&gt;
Eine Nachricht besteht aus genau zwei Datensätzen, ein Datensatz besteht jeweils aus einem 3 Zeichen breiten Header Teil, und einem 2 Zeichen breiten Datenteil. Für kleinere Datenteile erfolgt ein Padding mit Leerzeichen.&lt;br /&gt;
&lt;br /&gt;
Beide Teile der Nachricht werden unmittelbar hintereinander gesendet, also z.B. als &#039;&#039;SEQ13OPMSM&#039;&#039;. In untenstehenden Beispielen werden die beiden Teile der Nachricht allerdings durch einen Zeilenumbruch getrennt, um die Nachricht lesbarer zu machen.&lt;br /&gt;
&lt;br /&gt;
Eine Nachricht, wie sie ein Sender erstellt, besteht aus:&lt;br /&gt;
 &amp;lt;Sequence&amp;gt;&lt;br /&gt;
 &amp;lt;Command&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;Sequence&amp;gt; besteht aus dem Header SEQ, der Datenteil aus einer Nummer zwischen 1 und 99.&lt;br /&gt;
 &amp;lt;Command&amp;gt; besteht aus dem 3 Zeichen langen Command-Code, und einem entsprechenden Datenteil.&lt;br /&gt;
&lt;br /&gt;
Eine Nachricht muss mit einer Antwort quittiert werden. Diese besteht aus:&lt;br /&gt;
 &amp;lt;Acknowledge&amp;gt;&lt;br /&gt;
 &amp;lt;Acknowledge Code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;Acknowledge&amp;gt; besteht aus dem Header ACK und der zu bestätigenden Sequence Number.&lt;br /&gt;
 &amp;lt;Acknowledge Code&amp;gt; besteht aus den Header ACC und dem Code.&lt;br /&gt;
&lt;br /&gt;
Beispiel sind be den jeweiligen [[MaDeCo#Use Cases|Use Cases]] zu finden.&lt;br /&gt;
&lt;br /&gt;
=== Commands ===&lt;br /&gt;
 EOC ... end of communication, signalisiert das Ende einer Kommunikation&lt;br /&gt;
 OPM ... Operation Mode (siehe Betriebsmodus)&lt;br /&gt;
 WAP ... Waypoint (siehe Wegpunkte)&lt;br /&gt;
 DIR ... Angabe der Richtung im GO Betriebsmodus (siehe Kürzester Weg)&lt;br /&gt;
&lt;br /&gt;
=== Acknowledge Codes ===&lt;br /&gt;
 00 .. OK, Command acknowledged&lt;br /&gt;
 01 .. unknown Command&lt;br /&gt;
 02 .. invalid data&lt;br /&gt;
 11 .. unbekannter Betriebsmodus (e.g. OPMXX)&lt;br /&gt;
 21 .. Command refused, Labyrinth erkunden (OPMSM) vor [[NIBObee#Kalibrierung]] (OPMGA)&lt;br /&gt;
&lt;br /&gt;
=== Betriebsmodus ===&lt;br /&gt;
 GA ... Kalibrieren (siehe [[NIBObee#Kalibrierung]])&lt;br /&gt;
 SM ... Labyrinth erkunden&lt;br /&gt;
 GO ... kürzesten Weg nehmen (siehe Kürzester Weg)&lt;br /&gt;
&lt;br /&gt;
=== Wegpunkte ===&lt;br /&gt;
Die Übertragung eines Wegpunkts erfolgt durch Angabe der Richtung (S,W,N,E), gefolgt von der Anzahl der Streckenteile.&lt;br /&gt;
 Beispiel: WAPS4   der Wegpunkt befindet sich 4 Streckenteile südlich des zuletzt übertragenen Wegpunkts&lt;br /&gt;
&lt;br /&gt;
== Ablauf ==&lt;br /&gt;
Im [[RoLoMa]] Projekt muss die Kommunikation aus Nachricht-Antwort Sequenzen bestehen. Wird eine gesendete Nachricht nicht bestätigt, erfolgt eine Neuübertragung nach dem RETRANSMISSION_TIMEOUT Interval.&lt;br /&gt;
Erfolgt auch nach RETRANSMISSION_COUNT Wiederholungen keine Antwort, wird die Übertragung abgebrochen und ein Fehler signalisiert.&lt;br /&gt;
&lt;br /&gt;
Kommunikationen überschneiden sich nicht, das bedeutet, es findet zu jedem Zeitpunkt nur eine Kommunikation zwischen den Beteiligten statt. Daher ist auch zu jedem Zeitpunkt genau ein Teilnehmer der Sender, und ein Teilnehmer der Empfänger.&lt;br /&gt;
&lt;br /&gt;
== Use Cases ==&lt;br /&gt;
Im folgenden werden Beispiele für die Kommunikation der unterschiedlichen Betriebsarten dargestellt. Daten vom Borad werden normal, die von der NIBObee &#039;&#039;&#039;fett&#039;&#039;&#039; dargestellt.&lt;br /&gt;
&lt;br /&gt;
=== Kalibrieren ===&lt;br /&gt;
Beim Kalibrieren wird das Kommando vom Board an die NIBObee geschickt und auch bei Erhalt sofort quittiert (sonst würde es zu einem Timeout kommen). Nachdem die Kalibrierung abgeschlossen ist wird die Verbindung getrennt.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Beispiel:&#039;&#039;&lt;br /&gt;
 SEQ1 &lt;br /&gt;
 OPMGA&lt;br /&gt;
 &lt;br /&gt;
 &#039;&#039;&#039;ACK1&#039;&#039;&#039; &lt;br /&gt;
 &#039;&#039;&#039;ACC00&#039;&#039;&#039;&lt;br /&gt;
 &lt;br /&gt;
 &#039;&#039;&#039;SEQ2&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;EOC&#039;&#039;&#039;&lt;br /&gt;
 &lt;br /&gt;
 ACK2 &lt;br /&gt;
 ACC00&lt;br /&gt;
&lt;br /&gt;
=== Labyrinth erkunden===&lt;br /&gt;
Das Kommando wird vom Board an die NIBObee geschickt und auch bei Erhalt sofort quittiert (es muss vorher allerdings eine Kalibrierung durchgeführt worden sein). Danach werden laufend die Punkte geschickt die abgefahren werden. Wenn das ganze Labyrinth erfasst wurde wir die Kommunikation wieder beendet.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Beispiel:&#039;&#039;&lt;br /&gt;
 SEQ1 &lt;br /&gt;
 OPMSM&lt;br /&gt;
 &lt;br /&gt;
 &#039;&#039;&#039;ACK1&#039;&#039;&#039; &lt;br /&gt;
 &#039;&#039;&#039;ACC00&#039;&#039;&#039;&lt;br /&gt;
 &lt;br /&gt;
 &#039;&#039;&#039;SEQ2&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;WAPN3&#039;&#039;&#039;&lt;br /&gt;
 &lt;br /&gt;
 ACK2 &lt;br /&gt;
 ACC00&lt;br /&gt;
 &lt;br /&gt;
 &#039;&#039;&#039;SEQ3&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;WAPE1&#039;&#039;&#039;&lt;br /&gt;
 &lt;br /&gt;
 ...&lt;br /&gt;
 &lt;br /&gt;
 &#039;&#039;&#039;SEQ32&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;EOC&#039;&#039;&#039;&lt;br /&gt;
 &lt;br /&gt;
 ACK32 &lt;br /&gt;
 ACC00&lt;br /&gt;
&lt;br /&gt;
=== Kürzester Weg === &lt;br /&gt;
Hier werden Richtungsanweisungen übertragen, die es der [[NIBObee]] ermöglichen, in einem Labyrinth den kürzesten Weg zu nehmen.&lt;br /&gt;
Beispiel (ohne ACKs), der kürzeste Weg wird als S(üd)-N(ord)-W(est)-S(üd) angegeben:&lt;br /&gt;
 SEQ1 &lt;br /&gt;
 OPMGO&lt;br /&gt;
 &lt;br /&gt;
 SEQ2 &lt;br /&gt;
 DIRS &lt;br /&gt;
 &lt;br /&gt;
 SEQ3 &lt;br /&gt;
 DIRN &lt;br /&gt;
 &lt;br /&gt;
 SEQ4 &lt;br /&gt;
 DIRW &lt;br /&gt;
 &lt;br /&gt;
 SEQ5 &lt;br /&gt;
 DIRS &lt;br /&gt;
 &lt;br /&gt;
 SEQ6 &lt;br /&gt;
 EOC&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:FH]]&lt;/div&gt;</summary>
		<author><name>Alois</name></author>
	</entry>
	<entry>
		<id>https://wiki.callooh.com/index.php?title=NIBObee&amp;diff=879</id>
		<title>NIBObee</title>
		<link rel="alternate" type="text/html" href="https://wiki.callooh.com/index.php?title=NIBObee&amp;diff=879"/>
		<updated>2011-05-16T14:00:11Z</updated>

		<summary type="html">&lt;p&gt;Alois: /* Technische Daten */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;NIBObee ist der Roboter der im Projekt [[RoLoMa]] verwendet wird.&lt;br /&gt;
== Technische Daten ==&lt;br /&gt;
Hier wird nur ein kleiner Ausschnitt der technischen Daten dargestellt. Es handelt sich nur um jenen Teil der für die Bewertung oder Implementierung der gestellten Aufgaben relevant ist:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Art&lt;br /&gt;
!Typ&lt;br /&gt;
!Bemerkung&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|Mikrocontroller&lt;br /&gt;
|ATMEL ATMega16, , 15 MHz&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|Integrierter UART wird verwendet um den Bluetooth Modul anzubinden.&lt;br /&gt;
&lt;br /&gt;
Sollte die Leistung nicht ausreichen kann entweder der Erweiterungssatz von Nicai-Systems verwendet werden oder nur der Controller wird gegen einen Pinkompatiblen Typ ausgetauscht (z.B. ATMega32, ATMega644, ATMega1284)&lt;br /&gt;
|-&lt;br /&gt;
|Flash:	16	kB&lt;br /&gt;
|-&lt;br /&gt;
|RAM:	1	kB&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|Maße&lt;br /&gt;
|Radumfang: 11,8 cm&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|Diese Maße sind wichtig um den NIBObee so exakt wie möglich am Mittelpunkt des Labyrinthfeldes positionieren zu können.&lt;br /&gt;
|-&lt;br /&gt;
|Abstand Liniensensor zu Radachse: 10,4 cm&lt;br /&gt;
|-&lt;br /&gt;
|Impulse pro Umdrehung: 20&lt;br /&gt;
|}&lt;br /&gt;
=== Ports ===&lt;br /&gt;
Über den UART wird der Bluetooth Modul [[BTM-222]] angebunden. Am NIObee ist diese Schnittstelle am Port X5 verfügbar.&lt;br /&gt;
&lt;br /&gt;
Zwei Analoge Eingänge werden für die Fototransistoren der zusätzlichen Linienerkennung verwendet. Diese sind am NIBObee am Port X1 verfügbar.&lt;br /&gt;
&lt;br /&gt;
Ein Ausgang dient zum ein- und ausschalten der zusätzlichen IR-LEDs. Dafür wird der PIN 1 des Port X4 verwendet.&lt;br /&gt;
&lt;br /&gt;
=== Resourcen ===&lt;br /&gt;
Folgende Resourcen werden für unsere Implementierung verwendet (&#039;&#039;kursiv&#039;&#039; markierte Resourcen werden bereits durch die Bibliothek belegt):&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Resource&lt;br /&gt;
!Verwendung&lt;br /&gt;
!Interrupts&lt;br /&gt;
!Dateien&lt;br /&gt;
|-&lt;br /&gt;
|Timer 1&lt;br /&gt;
|Motor PWM&lt;br /&gt;
|TIMER1_COMPA_vect, TIMER1_COMPB_vect&lt;br /&gt;
|motpwm.c&lt;br /&gt;
|-&lt;br /&gt;
|ADC&lt;br /&gt;
|Analog, Line&lt;br /&gt;
|ADC_vect&lt;br /&gt;
|analog.c, line.c&lt;br /&gt;
|-&lt;br /&gt;
|EEPROM&lt;br /&gt;
|Line (12 Byte)&lt;br /&gt;
|&lt;br /&gt;
|line.c&lt;br /&gt;
|-&lt;br /&gt;
|Ext. IRQ&lt;br /&gt;
|Odometrie&lt;br /&gt;
|INT0_vect, INT1_vect&lt;br /&gt;
|odometry.c&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Eine für den NIBObee allgemein gültige Auflistung findet man im [http://www.nibo-roboter.de/wiki/NIBObee/Lib/Resourcen NIBObee Wiki].&lt;br /&gt;
&lt;br /&gt;
=== Besondere Erkenntnisse ===&lt;br /&gt;
&lt;br /&gt;
==== ATMega16 ====&lt;br /&gt;
Die Speichergröße scheint durchaus ausreichend zu sein. Nach implementierung aller wichtigen Grundfunktionen ist erst weniger als die Hälfte des Programmspeichers belegt.&lt;br /&gt;
&lt;br /&gt;
Problematisch war anfangs nur der geringe RAM der auch alle konstanten Strings enthält. Dies ist zwar nicht notwendig, ist mit dieser Entwicklungsumgebung allerdings so gelöst. Besonders die umfangreichen Debug-Informationen die über Bluetooth an den PC gesendet werden führten dabei zu massiven Problemen. Durch kurze symbolische Debugausgaben, die dann am PC im eigens entwickelten Terminalprogramm auf sprechende symbolische Ausgabe konvertiert wird, konnte das Problem behoben werden.&lt;br /&gt;
&lt;br /&gt;
==== Liniensensoren ====&lt;br /&gt;
Es hat sich, nach einigen Fehlschlägen bei der Linienverfolung, herausgestellt dass es ungünstig ist den NIBObee in eine optisch ansprechende waagrechte Position zu bringen indem eine kleinere Halbkugel auf der Unterseite angebracht wird. Der Grund: Nur mit der original Halbkugel und dem damit nach vorne ansteigenden Bodenabstand sind die IR-LED&#039;s weit genug vom Boden entfernt um einen Lichtkegen zu erzeugen der auch vernünftig vom Phototransistor erfasst werden kann. Bei waagrechter Ausrichtung des NIBObee ist dieser Kegel, aufgrund des geringeren Abstands zum Boden, zu klein!&lt;br /&gt;
&lt;br /&gt;
=== Bibliotheksfunktionen ===&lt;br /&gt;
==== Liniensensoren ====&lt;br /&gt;
Die original NIBObee Biliothek wird nicht verwendet. Sie wurde durch eine eigene Implementierung im [[NIBObee#Line-Modul|Line-Modul]] ersetzt. Der Grund ist die Notwendigkeit die zusätzlichen Liniensensoren in der gleichen weise wie die drei Originalsensoren zu behandeln.&lt;br /&gt;
&lt;br /&gt;
==== Motorensteuerung ====&lt;br /&gt;
 motpwm.h&lt;br /&gt;
Die Motoren des NIBObee werden mit PWM ([http://de.wikipedia.org/wiki/Pulsweitenmodulation Pulsweitenmodulation]) angesteuert. Das garantiert natürlich ohne Regelung noch keinen Gleichlauf der beiden Motoren was sich je nach Zustand des Getriebes in einer weiteren oder engernen Kurve zeigt.&lt;br /&gt;
 motpid.h&lt;br /&gt;
Hier stehen Funktionen zur Verfügung die mit Hilfe der Odometrie die Motoren regeln. Diese Funktionen sind für unsere Zwecke allerdings nicht geeignet.&lt;br /&gt;
&lt;br /&gt;
== Aufgaben ==&lt;br /&gt;
Folgende Aufgaben sind im Rahmen des Projekts [[RoLoMa]] vom NIBObee Team zu lösen:&lt;br /&gt;
* Herstellung der Bluetooth Hardware-Erweiterung&lt;br /&gt;
* Softwaremodul zum Bedienen der Bluetooth-Schnittstelle via RS232&lt;br /&gt;
* Softwaremodul zum Erkennen der Linie im Labyrinth und im speziellen der unterschiedlichen Kreuzungstypen&lt;br /&gt;
* Messen des zurückgelegten Weges&lt;br /&gt;
* Steuerung, die den Abstand des Sensors zur Radachse berücksichtigt um den Roboter an der korrekten Stelle um die eigene Achse zu drehen&lt;br /&gt;
* Erstellen eines Abbilds des Labyrinths im Speicher und navigieren bis der Roboter wieder am Startpunkt gelandet ist (z.B. immer Links abbiegen)&lt;br /&gt;
* Implementieren des [[MaDeCo]] Protokolls&lt;br /&gt;
&lt;br /&gt;
Nach einigen ersten Tests ist folgende weitere Aufgabe hinzugekommen:&lt;br /&gt;
* Herstellung der Hardware-Erweiterung mit zusätzlichen Liniensensoren&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
&lt;br /&gt;
=== Bluetooth ===&lt;br /&gt;
Der Bluetooth Modul ist im Detail auf den Seiten des [[BTM-222]] beschrieben.&lt;br /&gt;
&lt;br /&gt;
=== Liniensensoren ===&lt;br /&gt;
Zum Erkennen der Kreuzungen bei gleichzeitigem folgen der Linie war es notwendig zusätzliche Liniensensoren zu verwenden. Diese wurden mit einer Zusätzplatine in einer Reihe mit den bereits vorhandenen Liniensensoren, allerdings so weit wie möglich linke und rechts außen, montiert. Das einlesen der Analogwerte erfolgt über die beiden Analogeingänge am Stecker X1. Die IR-LEDs sind, analog zu den bestehenden IR-LEDs der vorhandenen Liniensensoren, über den Ausgang 1 am Stecker X4 schaltbar. Dies ist notwendig da jeweils eine Messung mit eingschalteter LED und eine mit ausgeschalteter LED durchgeführt wird. Damit wird der Einfluß des Umgebungslichts korrigiert.&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
Die Aufgaben der Software sollen in möglichst unabhängigen Modulen realisiert werden um das Testen einfacher zu gestalten. Die einzelnen Module sind im Folgenden beschrieben.&lt;br /&gt;
&lt;br /&gt;
=== Architektur ===&lt;br /&gt;
Das Gesamtsystem besteht aus einem zentralen Taktgeber, einem Scheduler und mehreren State Maschinen. Die Kommunikation erfolgt ausschließlich über Events. Die Module können mittels Subscribe einen Event, den ein anderer Modul zur Verfügung steht, abonnieren.&lt;br /&gt;
&lt;br /&gt;
==== Systemtakt, Scheduler ====&lt;br /&gt;
Im Main Modul befindet sich der zentrale Taktgeber der aus dem Interrupt des Timer 2 einen gleichmäßigen Takt von 100Hz erzeugt. Dieser Takt kann von anderen Modulen verwendet werden um zyklische Aufgaben zu erfüllen (z.B. lesen der Liniensensoren). Im Main Modul befindet sich auch der Scheduler der ganz einfach in der Endlosschleife sequenziell jeden Modul aufruft um anstehende Events zu bearbeiten.&lt;br /&gt;
&lt;br /&gt;
==== State / Event Maschinen ====&lt;br /&gt;
Die State / Event Maschinen sind in allen Modulen gleich aufgebaut. Es gibt die folgenden Funktionen (wobei statt &amp;quot;&amp;lt;xx&amp;gt;&amp;quot; das Kürzel des Moduls steht, z.B &amp;quot;dr&amp;quot; für Drive):&lt;br /&gt;
; eine Funktion mit dem Namen &amp;lt;xx&amp;gt;_main (intern)&lt;br /&gt;
: Das ist die eigentliche State Maschine. Wird nicht direkt vom Scheduler aufgerufen sondern über die Funktion &amp;lt;xx&amp;gt;_eventHandler. Hier gibt es ein switch Statement über den aktuellen Zustand und für jeden Zustand ein switch Statement über den empfangenen Event.&lt;br /&gt;
; eine Funktion mit dem Namen &amp;lt;xx&amp;gt;_init (extern)&lt;br /&gt;
: Hier werden Variableninitialisierungen gemacht und die ersten subscribe Aufrufe um Events zu abonnieren. Diese Funktion wird beim Systemstart vom Main Modul aufgerufen.&lt;br /&gt;
; eine Funktion mit dem Namen &amp;lt;xx&amp;gt;_eventHandler (extern)&lt;br /&gt;
: Ist die Funktion die vom Scheduler aufgerufen wird damit die Statemaschine mit dem aktuellen Event, sofern vorhanden, durchlaufen wird.&lt;br /&gt;
; optional Funktionen mit den Namen &amp;lt;xx&amp;gt;_subscribe_&amp;lt;event&amp;gt; und &amp;lt;xx&amp;gt;_unsubscribe_&amp;lt;event&amp;gt; (extern)&lt;br /&gt;
: für jeden Event den dieser Modul verschicken kann ist sowohl eine Subscribe Funktion als auch ein Unsubscribe Funktion vorhanden. Mit diesen Funktionen kann der Event von einem anderen Modul abboniert werden.&lt;br /&gt;
; eine Funktion mit dem Namen &amp;lt;xx&amp;gt;_receiveEvent (intern)&lt;br /&gt;
: ReceiveEvent ist eigentlich eine interne Funktion (wird also nicht im Header File deklariert), der Pointer auf diese Funktion wird allerdings als Callback beim Subscribe übergeben damit der Event dem Modul zugestellt werden kann.&lt;br /&gt;
&lt;br /&gt;
=== Module ===&lt;br /&gt;
Im folgenden sind alle Module und deren Hauptfunktionen aufgelistet.&lt;br /&gt;
&lt;br /&gt;
==== Analog-Modul ====&lt;br /&gt;
Digitalisieren der Analogeingänge&lt;br /&gt;
 Dateien: analog.c&lt;br /&gt;
          analog.h&lt;br /&gt;
Dieser Modul ist abgeleitet von den gleichnamigen Dateien der original NIBObee Bibliothek. Dies war notwendig da wir zusätzliche Liniensensoren verwenden und deren Ansteuerung in gleicher Weise erfolgen sollte. Das bedeutet dass für die entsprechenden Analogeingänge Messungen mit ein- und ausgeschalteten IR-LEDs durchgeführt werden müssen. Außerdem wurde, entsprechend dem Datenblatt des ATMega16 die Behandlung der Messung der Batteriespannung verbessert. Da hier die Referenzspannung umgeschalten wird muss eine Messung verworfen werden bevor mit einem richtigen Ergebnis gerechnet werden kann. Das wurde in der Originalbibliothek nicht berücksichtigt.&lt;br /&gt;
Die einzelnen Werte werden weiterhin über einen A/D-Wandler ermittelt und zwischengespeichert. Es gibt nun 13 analoge Werte (statt bisher 11) die zyklisch digitalisiert werden. Dieser Vorgang wird mit einer Frequenz von ca 117 kHz durchgeführt, d.h. dass jeder dieser Werte ca. alle 111 µs (statt bisher 94 µs) aktualisiert wird.&lt;br /&gt;
&lt;br /&gt;
==== Line-Modul ====&lt;br /&gt;
Ermitteln der Werte der Liniensensoren&lt;br /&gt;
 Dateien: line.c&lt;br /&gt;
          line.h&lt;br /&gt;
Dieser Modul ersetzt die originalen Bibliotheksfunktionen der Liniensensoren. Dies war notwendig da wir zusätzliche Liniensensoren verwenden.&lt;br /&gt;
&lt;br /&gt;
Die Werte der Liniensensoren können nun mit der Funktion&lt;br /&gt;
&amp;lt;code&amp;gt;ln_get(index)&amp;lt;/code&amp;gt;&lt;br /&gt;
gelesen werden. Die Werte selbst werden über den [[NIBObee#Analog-Modul|Analog-Modul]] ermittelt.&lt;br /&gt;
&lt;br /&gt;
==== Bluetooth-Modul ====&lt;br /&gt;
Wickelt die Kommunikation über den Bluetooth Modul ab. Zur Kommunikation wird allerdings nur der USART als Terminal angesprochen, der Bluetooth Stack ist im [[BTM-222]] implementiert.&lt;br /&gt;
 Dateien: bluetooth.c&lt;br /&gt;
          bluetooth.h&lt;br /&gt;
&lt;br /&gt;
==== Common-Modul ====&lt;br /&gt;
Stellt gemeinsame Funktionen zurVerfügung&lt;br /&gt;
 Dateien: common.c&lt;br /&gt;
          common.h&lt;br /&gt;
&lt;br /&gt;
==== Distance-Modul ====&lt;br /&gt;
Behandelt die Odometrie Sensoren&lt;br /&gt;
 Dateien: distance.c&lt;br /&gt;
          distance.h&lt;br /&gt;
&lt;br /&gt;
==== Drive-Modul ====&lt;br /&gt;
Bewegt den NIBObee&lt;br /&gt;
 Dateien: drive.c&lt;br /&gt;
          drive.h&lt;br /&gt;
&lt;br /&gt;
==== Follow-Modul ====&lt;br /&gt;
Ist für die Linienverfolgung zuständig&lt;br /&gt;
 Dateien: follow.c&lt;br /&gt;
          follow.h&lt;br /&gt;
&lt;br /&gt;
==== MaDeCo-Modul ====&lt;br /&gt;
Behandelt das MaDeCo Protokoll&lt;br /&gt;
 Dateien: madeco.c&lt;br /&gt;
          madeco.h&lt;br /&gt;
&lt;br /&gt;
==== Main-Modul ====&lt;br /&gt;
Scheduler und zentraler Taktgeber&lt;br /&gt;
 Dateien: main.c&lt;br /&gt;
          main.h&lt;br /&gt;
&lt;br /&gt;
==== Sensor-Modul ====&lt;br /&gt;
Ist für die &amp;quot;Fühler&amp;quot; zuständig&lt;br /&gt;
 Dateien: follow.c&lt;br /&gt;
          follow.h&lt;br /&gt;
&lt;br /&gt;
=== Applikationen ===&lt;br /&gt;
==== Labyrinth erkunden ====&lt;br /&gt;
&lt;br /&gt;
==== Kürzesten Weg durch Labyrinth ====&lt;br /&gt;
&lt;br /&gt;
==== Kalibrierung ====&lt;br /&gt;
Zur Kalibrierung fährt der NIBObee ein Viereck entlang dass genau die Seitenlänge eines der Felder des Labyrinths hat. Dies ist notwendig um relativ einfach die Karte des Labyrinths erstellen zu können.&lt;br /&gt;
&lt;br /&gt;
=== Protokolle und deren Implementierung ===&lt;br /&gt;
==== [[MaDeCo]] ====&lt;br /&gt;
===== Interface Definition =====&lt;br /&gt;
* int set_opmode(OPMODE)&lt;br /&gt;
* int send_waypoint(WAYPOINT)&lt;br /&gt;
* int direct(DIRECTION[])&lt;br /&gt;
* int ack()&lt;br /&gt;
&lt;br /&gt;
==== Schnittstelle [[MaDeCo]] - RS232-Schnittstelle ====&lt;br /&gt;
* pairing&lt;br /&gt;
* Konfigurations-Commands&lt;br /&gt;
* ack&lt;br /&gt;
* read_command&lt;br /&gt;
* send_command&lt;br /&gt;
&lt;br /&gt;
=== Steuerungssoftware ===&lt;br /&gt;
==== Bluetooth Modul einschalten ====&lt;br /&gt;
Durch Bewegen der &amp;quot;Fühler&amp;quot; der NIBObee nach oben bis Einrasten wird das Bluetooth Modul eingeschalten.&lt;br /&gt;
Daraufhin muss auf eingehenden Bluetooth Traffic gelauscht werden.&lt;br /&gt;
&lt;br /&gt;
==== Blink Codes ====&lt;br /&gt;
Bestimmte Events oder Commands lösen bestimmte Blink- oder Leuchtmuster der Status LEDs aus.&lt;br /&gt;
&#039;&#039;&#039;TODO:&#039;&#039;&#039; Spezifikation der Blink Codes&lt;br /&gt;
&lt;br /&gt;
==== Gerade fahren ====&lt;br /&gt;
Das Problem beim geradeaus fahren ist dass der Roboter von der Spur abweichen kann und dann neu ausgerichtet werden muss. Üblicherweise erfolgt das mit Hilfe der Liniensensoren indem, sobald einer der seitlichen Sensoren die Linie erkennt, durch beschleunigen oder bremsen eines Rades in diese Richtung korrigierend gelenkt wird.&lt;br /&gt;
&lt;br /&gt;
In unserem Fall müssen wir diese Korrektur solange verzögern bis der seitliche Liniensensor eine mögliche Kreuzung passiert hat. Erst danach können wir feststellen ob wir nur die schwarze Linie einer Kreuzung überfahren sind oder ob tatsächlich eine Abweichung vorliegt. Die Anzahl der zu ignorierenden Odometrie-Impule kann folgendermaßen errechnet werden:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;Impulse pro Radumdrehung&amp;gt; / &amp;lt;Radumfang&amp;gt; * &amp;lt;Linienbreite&amp;gt; =&lt;br /&gt;
 20 / 11,8 * 1 = 1,69491525&lt;br /&gt;
&lt;br /&gt;
Wir werden also nur zwei Impulse abwarten bevor wir mit der Korrektur beginnen&lt;br /&gt;
&lt;br /&gt;
===== Funktionsaufteilung =====&lt;br /&gt;
Die Zuständigkeiten für diese Aufgabe sind wie folgt:&lt;br /&gt;
;drive Modul&lt;br /&gt;
:sorgt für die Steuerung der Motoren. Reduzieren der Geschwindigkeit eines Rades um eine ausgleichende Kurve zu fahren und stoppen wenn das Ende der geraden Linie erreicht wurde. Dazu aboniert der Modul die Events des line Modul die eine Abweichung von der Linie melden und vom distance Modul den Event zum fahren der Distanz zwischen Liniensensoren und Achse der Räder.&lt;br /&gt;
;line Modul&lt;br /&gt;
:prüft zyklisch die position der Linie unter dem NIBObee und meldet Abweichungen mittels Events. Dieses Melden wird allerdings verzögert bis zumindest die Breite der Linie überfahren wurde. Dazu aboniert der Modul den Event vom distance Modul den Event zum fahren der der Breite der Linie.&lt;br /&gt;
;distance Modul&lt;br /&gt;
:meldet auf Anforderung das zurücklegen einer Strecke in der Länge der Distanz zwischen Liniensensoren und Achse der Räder oder der Breite der Linie.&lt;br /&gt;
&lt;br /&gt;
==== Kreuzung fahren ====&lt;br /&gt;
An einer Kreuzung wird abgebogen indem der NIBObee zuerst unbeirrt geradeaus fährt bis die Achse genau auf dem Mittelpunkt der Kreuzung zu stehen kommt. Danach wird eine Drehung nach rechts oder links durchgeführt bis sich die Linie wieder genau unter dem mittleren Sensor befindet.&lt;br /&gt;
&lt;br /&gt;
Die Sensoren sind von der Achse 10,4 cm entfernt, eine Radumdrehung bewegt den NIBObee um 11,8 cm weiter und bei dieser Umdrehung werden vom Odometriesensor 20 Impulse abgegeben. Die Linienbreite wird 2 cm betragen. Daher errechnet sich die Strecke die nach Erkennen der Kreuzung gefahren werden muss folgendermassen:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;Impulse pro Radumdrehung&amp;gt; / &amp;lt;Radumfang&amp;gt; * (&amp;lt;Achsabstand&amp;gt; - &amp;lt;halbe Linienbreite&amp;gt;) =&lt;br /&gt;
 20 / 11,8 * (10,4 - 0,5) = 16,779661&lt;br /&gt;
&lt;br /&gt;
Nach passieren der Kreuzung muss der NIBObee also noch 17 Impulse über den Odometriesensor empfangen bevor er stoppt.&lt;br /&gt;
&lt;br /&gt;
== Risikoanalyse ==&lt;br /&gt;
Im Folgenden wird versucht für die möglichen Risikopunkte Alternativen aufzuzeigen.&lt;br /&gt;
&lt;br /&gt;
; ATmega16 ist nicht Leisungsfägig genug&lt;br /&gt;
: Es kann auf den [http://www.nicai-systems.com/de/zubehoer/nibobee-tuning-kit.html Tuning-Kit von Nicai-Systems] zurückgerifffen werden. Dies könnte eine nicht akzeptable Verzögerung verursachen (erkennen, bestellen, NIBObee umrüsten)&lt;br /&gt;
&lt;br /&gt;
: Ein beliebiger PIN-kompatiber Microcontroller ATmega... wird statt dem ATmega16 eingesetzt. Die funktioniert soange der Ersatz-µC mit der Frequenz vom 15 MHz betrieben werden kann. Wichtig ist auch dass es adaptierte Bibliotheken gibt die auf den Ersatz-µC abgestimmt sind (z.B. andere Register oder geänderte Adressen für Register, ...)&lt;br /&gt;
&lt;br /&gt;
; Signale am UART mit Bordspannung im Gegensatz zu RS232-Level (12V)&lt;br /&gt;
: Die Signale am UART werden mit Bordspannung erzeugt/erwartet. Für die Kommunikation mit dem BT-Modul ist daher keine Anpassung durchzuführen.&lt;br /&gt;
&lt;br /&gt;
: Soll zu Testzwecken ein PC über RS232 angeschalten werden ist unbedingt auf die Spannung achten. Möglicherweise verwendet ein USB-RS232 Adapter nicht die 12V sonder nur 5V.&lt;br /&gt;
&lt;br /&gt;
== Open Issues ==&lt;br /&gt;
* Es muss noch überprüft werden ob die NIBObee Hardware ausreichend leistungsfähig ist oder ein Upgrade gemacht werden muss.&lt;br /&gt;
* Wie kann das verlassen der Spur von dem Überfahren einer Kreuzung unterschieden werden? Wenn es hier zu Problemen kommt könnten zwei zusätzliche lichtempfindliche Sensoren rechts und links oder noch ein Element mit drei zusätzlichen Sensoren auf Höhe der Achsen angebracht werden -&amp;gt; Mehraufwand!&lt;br /&gt;
* Soll Aktivierung der BT-Schnittstelle manuell erfolgen?&lt;br /&gt;
* Soll der Betriebsmodus gewählt werden können?&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* [http://www.nicai-systems.de/nibobee.html NIBObee Homepage bei Nicai Systems]&lt;br /&gt;
* [http://download.nicai-systems.com/nibo/Tutorial_NIBObee_20091123.pdf NIBObee - Tutorial zur Programmierung]&lt;br /&gt;
* [http://www.nicai-systems.com/de/zubehoer/nibobee-tuning-kit.html NIBObee - Tuning-Kit von Nicai-Systems]&lt;br /&gt;
* [http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/Der_UART Tutorial zur USART Programmierung]&lt;br /&gt;
[[Kategorie:FH]]&lt;/div&gt;</summary>
		<author><name>Alois</name></author>
	</entry>
	<entry>
		<id>https://wiki.callooh.com/index.php?title=NIBObee&amp;diff=878</id>
		<title>NIBObee</title>
		<link rel="alternate" type="text/html" href="https://wiki.callooh.com/index.php?title=NIBObee&amp;diff=878"/>
		<updated>2011-05-16T13:52:07Z</updated>

		<summary type="html">&lt;p&gt;Alois: /* Aufgaben */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;NIBObee ist der Roboter der im Projekt [[RoLoMa]] verwendet wird.&lt;br /&gt;
== Technische Daten ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Art&lt;br /&gt;
!Typ&lt;br /&gt;
!Bemerkung&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|Mikrocontroller&lt;br /&gt;
|ATMEL ATMega16, , 15 MHz&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|Integrierter UART wird verwendet um den Bluetooth Modul anzubinden.&lt;br /&gt;
&lt;br /&gt;
Sollte die Leistung nicht ausreichen kann entweder der Erweiterungssatz von Nicai-Systems verwendet werden oder nur der Controller wird gegen einen Pinkompatiblen Typ ausgetauscht (z.B. ATMega32, ATMega644, ATMega1284)&lt;br /&gt;
|-&lt;br /&gt;
|Flash:	16	kB&lt;br /&gt;
|-&lt;br /&gt;
|...&lt;br /&gt;
|-&lt;br /&gt;
|...&lt;br /&gt;
|...&lt;br /&gt;
|...&lt;br /&gt;
|-&lt;br /&gt;
|...&lt;br /&gt;
|...&lt;br /&gt;
|...&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|Maße&lt;br /&gt;
|Radumfang: 11,8 cm&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|Diese Maße sind wichtig um den NIBObee so exakt wie möglich am Mittelpunkt des Labyrinthfeldes positionieren zu können.&lt;br /&gt;
|-&lt;br /&gt;
|Abstand Liniensensor zu Radachse: 10,4 cm&lt;br /&gt;
|-&lt;br /&gt;
|Impulse pro Umdrehung: 20&lt;br /&gt;
|}&lt;br /&gt;
=== Ports ===&lt;br /&gt;
Über den UART wird der Bluetooth Modul [[BTM-222]] angebunden. Am NIObee ist diese Schnittstelle am Port X5 verfügbar&lt;br /&gt;
&lt;br /&gt;
=== Resourcen ===&lt;br /&gt;
Folgende Resourcen werden für unsere Implementierung verwendet (&#039;&#039;kursiv&#039;&#039; markierte Resourcen werden bereits durch die Bibliothek belegt):&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Resource&lt;br /&gt;
!Verwendung&lt;br /&gt;
!Interrupts&lt;br /&gt;
!Dateien&lt;br /&gt;
|-&lt;br /&gt;
|Timer 1&lt;br /&gt;
|Motor PWM&lt;br /&gt;
|TIMER1_COMPA_vect, TIMER1_COMPB_vect&lt;br /&gt;
|motpwm.c&lt;br /&gt;
|-&lt;br /&gt;
|ADC&lt;br /&gt;
|Analog, Line&lt;br /&gt;
|ADC_vect&lt;br /&gt;
|analog.c, line.c&lt;br /&gt;
|-&lt;br /&gt;
|EEPROM&lt;br /&gt;
|Line (12 Byte)&lt;br /&gt;
|&lt;br /&gt;
|line.c&lt;br /&gt;
|-&lt;br /&gt;
|Ext. IRQ&lt;br /&gt;
|Odometrie&lt;br /&gt;
|INT0_vect, INT1_vect&lt;br /&gt;
|odometry.c&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Eine für den NIBObee allgemein gültige Auflistung findet man im [http://www.nibo-roboter.de/wiki/NIBObee/Lib/Resourcen NIBObee Wiki].&lt;br /&gt;
&lt;br /&gt;
=== Besondere Erkenntnisse ===&lt;br /&gt;
&lt;br /&gt;
==== ATMega16 ====&lt;br /&gt;
Die Speichergröße scheint durchaus ausreichend zu sein. Nach implementierung aller wichtigen Grundfunktionen ist erst weniger als die Hälfte des Programmspeichers belegt.&lt;br /&gt;
&lt;br /&gt;
Problematisch war anfangs nur der geringe RAM der auch alle konstanten Strings enthält. Dies ist zwar nicht notwendig, ist mit dieser Entwicklungsumgebung allerdings so gelöst. Besonders die umfangreichen Debug-Informationen die über Bluetooth an den PC gesendet werden führten dabei zu massiven Problemen. Durch kurze symbolische Debugausgaben, die dann am PC im eigens entwickelten Terminalprogramm auf sprechende symbolische Ausgabe konvertiert wird, konnte das Problem behoben werden.&lt;br /&gt;
&lt;br /&gt;
==== Liniensensoren ====&lt;br /&gt;
Es hat sich, nach einigen Fehlschlägen bei der Linienverfolung, herausgestellt dass es ungünstig ist den NIBObee in eine optisch ansprechende waagrechte Position zu bringen indem eine kleinere Halbkugel auf der Unterseite angebracht wird. Der Grund: Nur mit der original Halbkugel und dem damit nach vorne ansteigenden Bodenabstand sind die IR-LED&#039;s weit genug vom Boden entfernt um einen Lichtkegen zu erzeugen der auch vernünftig vom Phototransistor erfasst werden kann. Bei waagrechter Ausrichtung des NIBObee ist dieser Kegel, aufgrund des geringeren Abstands zum Boden, zu klein!&lt;br /&gt;
&lt;br /&gt;
=== Bibliotheksfunktionen ===&lt;br /&gt;
==== Liniensensoren ====&lt;br /&gt;
Die original NIBObee Biliothek wird nicht verwendet. Sie wurde durch eine eigene Implementierung im [[NIBObee#Line-Modul|Line-Modul]] ersetzt. Der Grund ist die Notwendigkeit die zusätzlichen Liniensensoren in der gleichen weise wie die drei Originalsensoren zu behandeln.&lt;br /&gt;
&lt;br /&gt;
==== Motorensteuerung ====&lt;br /&gt;
 motpwm.h&lt;br /&gt;
Die Motoren des NIBObee werden mit PWM ([http://de.wikipedia.org/wiki/Pulsweitenmodulation Pulsweitenmodulation]) angesteuert. Das garantiert natürlich ohne Regelung noch keinen Gleichlauf der beiden Motoren was sich je nach Zustand des Getriebes in einer weiteren oder engernen Kurve zeigt.&lt;br /&gt;
 motpid.h&lt;br /&gt;
Hier stehen Funktionen zur Verfügung die mit Hilfe der Odometrie die Motoren regeln. Diese Funktionen sind für unsere Zwecke allerdings nicht geeignet.&lt;br /&gt;
&lt;br /&gt;
== Aufgaben ==&lt;br /&gt;
Folgende Aufgaben sind im Rahmen des Projekts [[RoLoMa]] vom NIBObee Team zu lösen:&lt;br /&gt;
* Herstellung der Bluetooth Hardware-Erweiterung&lt;br /&gt;
* Softwaremodul zum Bedienen der Bluetooth-Schnittstelle via RS232&lt;br /&gt;
* Softwaremodul zum Erkennen der Linie im Labyrinth und im speziellen der unterschiedlichen Kreuzungstypen&lt;br /&gt;
* Messen des zurückgelegten Weges&lt;br /&gt;
* Steuerung, die den Abstand des Sensors zur Radachse berücksichtigt um den Roboter an der korrekten Stelle um die eigene Achse zu drehen&lt;br /&gt;
* Erstellen eines Abbilds des Labyrinths im Speicher und navigieren bis der Roboter wieder am Startpunkt gelandet ist (z.B. immer Links abbiegen)&lt;br /&gt;
* Implementieren des [[MaDeCo]] Protokolls&lt;br /&gt;
&lt;br /&gt;
Nach einigen ersten Tests ist folgende weitere Aufgabe hinzugekommen:&lt;br /&gt;
* Herstellung der Hardware-Erweiterung mit zusätzlichen Liniensensoren&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
&lt;br /&gt;
=== Bluetooth ===&lt;br /&gt;
Der Bluetooth Modul ist im Detail auf den Seiten des [[BTM-222]] beschrieben.&lt;br /&gt;
&lt;br /&gt;
=== Liniensensoren ===&lt;br /&gt;
Zum Erkennen der Kreuzungen bei gleichzeitigem folgen der Linie war es notwendig zusätzliche Liniensensoren zu verwenden. Diese wurden mit einer Zusätzplatine in einer Reihe mit den bereits vorhandenen Liniensensoren, allerdings so weit wie möglich linke und rechts außen, montiert. Das einlesen der Analogwerte erfolgt über die beiden Analogeingänge am Stecker X1. Die IR-LEDs sind, analog zu den bestehenden IR-LEDs der vorhandenen Liniensensoren, über den Ausgang 1 am Stecker X4 schaltbar. Dies ist notwendig da jeweils eine Messung mit eingschalteter LED und eine mit ausgeschalteter LED durchgeführt wird. Damit wird der Einfluß des Umgebungslichts korrigiert.&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
Die Aufgaben der Software sollen in möglichst unabhängigen Modulen realisiert werden um das Testen einfacher zu gestalten. Die einzelnen Module sind im Folgenden beschrieben.&lt;br /&gt;
&lt;br /&gt;
=== Architektur ===&lt;br /&gt;
Das Gesamtsystem besteht aus einem zentralen Taktgeber, einem Scheduler und mehreren State Maschinen. Die Kommunikation erfolgt ausschließlich über Events. Die Module können mittels Subscribe einen Event, den ein anderer Modul zur Verfügung steht, abonnieren.&lt;br /&gt;
&lt;br /&gt;
==== Systemtakt, Scheduler ====&lt;br /&gt;
Im Main Modul befindet sich der zentrale Taktgeber der aus dem Interrupt des Timer 2 einen gleichmäßigen Takt von 100Hz erzeugt. Dieser Takt kann von anderen Modulen verwendet werden um zyklische Aufgaben zu erfüllen (z.B. lesen der Liniensensoren). Im Main Modul befindet sich auch der Scheduler der ganz einfach in der Endlosschleife sequenziell jeden Modul aufruft um anstehende Events zu bearbeiten.&lt;br /&gt;
&lt;br /&gt;
==== State / Event Maschinen ====&lt;br /&gt;
Die State / Event Maschinen sind in allen Modulen gleich aufgebaut. Es gibt die folgenden Funktionen (wobei statt &amp;quot;&amp;lt;xx&amp;gt;&amp;quot; das Kürzel des Moduls steht, z.B &amp;quot;dr&amp;quot; für Drive):&lt;br /&gt;
; eine Funktion mit dem Namen &amp;lt;xx&amp;gt;_main (intern)&lt;br /&gt;
: Das ist die eigentliche State Maschine. Wird nicht direkt vom Scheduler aufgerufen sondern über die Funktion &amp;lt;xx&amp;gt;_eventHandler. Hier gibt es ein switch Statement über den aktuellen Zustand und für jeden Zustand ein switch Statement über den empfangenen Event.&lt;br /&gt;
; eine Funktion mit dem Namen &amp;lt;xx&amp;gt;_init (extern)&lt;br /&gt;
: Hier werden Variableninitialisierungen gemacht und die ersten subscribe Aufrufe um Events zu abonnieren. Diese Funktion wird beim Systemstart vom Main Modul aufgerufen.&lt;br /&gt;
; eine Funktion mit dem Namen &amp;lt;xx&amp;gt;_eventHandler (extern)&lt;br /&gt;
: Ist die Funktion die vom Scheduler aufgerufen wird damit die Statemaschine mit dem aktuellen Event, sofern vorhanden, durchlaufen wird.&lt;br /&gt;
; optional Funktionen mit den Namen &amp;lt;xx&amp;gt;_subscribe_&amp;lt;event&amp;gt; und &amp;lt;xx&amp;gt;_unsubscribe_&amp;lt;event&amp;gt; (extern)&lt;br /&gt;
: für jeden Event den dieser Modul verschicken kann ist sowohl eine Subscribe Funktion als auch ein Unsubscribe Funktion vorhanden. Mit diesen Funktionen kann der Event von einem anderen Modul abboniert werden.&lt;br /&gt;
; eine Funktion mit dem Namen &amp;lt;xx&amp;gt;_receiveEvent (intern)&lt;br /&gt;
: ReceiveEvent ist eigentlich eine interne Funktion (wird also nicht im Header File deklariert), der Pointer auf diese Funktion wird allerdings als Callback beim Subscribe übergeben damit der Event dem Modul zugestellt werden kann.&lt;br /&gt;
&lt;br /&gt;
=== Module ===&lt;br /&gt;
Im folgenden sind alle Module und deren Hauptfunktionen aufgelistet.&lt;br /&gt;
&lt;br /&gt;
==== Analog-Modul ====&lt;br /&gt;
Digitalisieren der Analogeingänge&lt;br /&gt;
 Dateien: analog.c&lt;br /&gt;
          analog.h&lt;br /&gt;
Dieser Modul ist abgeleitet von den gleichnamigen Dateien der original NIBObee Bibliothek. Dies war notwendig da wir zusätzliche Liniensensoren verwenden und deren Ansteuerung in gleicher Weise erfolgen sollte. Das bedeutet dass für die entsprechenden Analogeingänge Messungen mit ein- und ausgeschalteten IR-LEDs durchgeführt werden müssen. Außerdem wurde, entsprechend dem Datenblatt des ATMega16 die Behandlung der Messung der Batteriespannung verbessert. Da hier die Referenzspannung umgeschalten wird muss eine Messung verworfen werden bevor mit einem richtigen Ergebnis gerechnet werden kann. Das wurde in der Originalbibliothek nicht berücksichtigt.&lt;br /&gt;
Die einzelnen Werte werden weiterhin über einen A/D-Wandler ermittelt und zwischengespeichert. Es gibt nun 13 analoge Werte (statt bisher 11) die zyklisch digitalisiert werden. Dieser Vorgang wird mit einer Frequenz von ca 117 kHz durchgeführt, d.h. dass jeder dieser Werte ca. alle 111 µs (statt bisher 94 µs) aktualisiert wird.&lt;br /&gt;
&lt;br /&gt;
==== Line-Modul ====&lt;br /&gt;
Ermitteln der Werte der Liniensensoren&lt;br /&gt;
 Dateien: line.c&lt;br /&gt;
          line.h&lt;br /&gt;
Dieser Modul ersetzt die originalen Bibliotheksfunktionen der Liniensensoren. Dies war notwendig da wir zusätzliche Liniensensoren verwenden.&lt;br /&gt;
&lt;br /&gt;
Die Werte der Liniensensoren können nun mit der Funktion&lt;br /&gt;
&amp;lt;code&amp;gt;ln_get(index)&amp;lt;/code&amp;gt;&lt;br /&gt;
gelesen werden. Die Werte selbst werden über den [[NIBObee#Analog-Modul|Analog-Modul]] ermittelt.&lt;br /&gt;
&lt;br /&gt;
==== Bluetooth-Modul ====&lt;br /&gt;
Wickelt die Kommunikation über den Bluetooth Modul ab. Zur Kommunikation wird allerdings nur der USART als Terminal angesprochen, der Bluetooth Stack ist im [[BTM-222]] implementiert.&lt;br /&gt;
 Dateien: bluetooth.c&lt;br /&gt;
          bluetooth.h&lt;br /&gt;
&lt;br /&gt;
==== Common-Modul ====&lt;br /&gt;
Stellt gemeinsame Funktionen zurVerfügung&lt;br /&gt;
 Dateien: common.c&lt;br /&gt;
          common.h&lt;br /&gt;
&lt;br /&gt;
==== Distance-Modul ====&lt;br /&gt;
Behandelt die Odometrie Sensoren&lt;br /&gt;
 Dateien: distance.c&lt;br /&gt;
          distance.h&lt;br /&gt;
&lt;br /&gt;
==== Drive-Modul ====&lt;br /&gt;
Bewegt den NIBObee&lt;br /&gt;
 Dateien: drive.c&lt;br /&gt;
          drive.h&lt;br /&gt;
&lt;br /&gt;
==== Follow-Modul ====&lt;br /&gt;
Ist für die Linienverfolgung zuständig&lt;br /&gt;
 Dateien: follow.c&lt;br /&gt;
          follow.h&lt;br /&gt;
&lt;br /&gt;
==== MaDeCo-Modul ====&lt;br /&gt;
Behandelt das MaDeCo Protokoll&lt;br /&gt;
 Dateien: madeco.c&lt;br /&gt;
          madeco.h&lt;br /&gt;
&lt;br /&gt;
==== Main-Modul ====&lt;br /&gt;
Scheduler und zentraler Taktgeber&lt;br /&gt;
 Dateien: main.c&lt;br /&gt;
          main.h&lt;br /&gt;
&lt;br /&gt;
==== Sensor-Modul ====&lt;br /&gt;
Ist für die &amp;quot;Fühler&amp;quot; zuständig&lt;br /&gt;
 Dateien: follow.c&lt;br /&gt;
          follow.h&lt;br /&gt;
&lt;br /&gt;
=== Applikationen ===&lt;br /&gt;
==== Labyrinth erkunden ====&lt;br /&gt;
&lt;br /&gt;
==== Kürzesten Weg durch Labyrinth ====&lt;br /&gt;
&lt;br /&gt;
==== Kalibrierung ====&lt;br /&gt;
Zur Kalibrierung fährt der NIBObee ein Viereck entlang dass genau die Seitenlänge eines der Felder des Labyrinths hat. Dies ist notwendig um relativ einfach die Karte des Labyrinths erstellen zu können.&lt;br /&gt;
&lt;br /&gt;
=== Protokolle und deren Implementierung ===&lt;br /&gt;
==== [[MaDeCo]] ====&lt;br /&gt;
===== Interface Definition =====&lt;br /&gt;
* int set_opmode(OPMODE)&lt;br /&gt;
* int send_waypoint(WAYPOINT)&lt;br /&gt;
* int direct(DIRECTION[])&lt;br /&gt;
* int ack()&lt;br /&gt;
&lt;br /&gt;
==== Schnittstelle [[MaDeCo]] - RS232-Schnittstelle ====&lt;br /&gt;
* pairing&lt;br /&gt;
* Konfigurations-Commands&lt;br /&gt;
* ack&lt;br /&gt;
* read_command&lt;br /&gt;
* send_command&lt;br /&gt;
&lt;br /&gt;
=== Steuerungssoftware ===&lt;br /&gt;
==== Bluetooth Modul einschalten ====&lt;br /&gt;
Durch Bewegen der &amp;quot;Fühler&amp;quot; der NIBObee nach oben bis Einrasten wird das Bluetooth Modul eingeschalten.&lt;br /&gt;
Daraufhin muss auf eingehenden Bluetooth Traffic gelauscht werden.&lt;br /&gt;
&lt;br /&gt;
==== Blink Codes ====&lt;br /&gt;
Bestimmte Events oder Commands lösen bestimmte Blink- oder Leuchtmuster der Status LEDs aus.&lt;br /&gt;
&#039;&#039;&#039;TODO:&#039;&#039;&#039; Spezifikation der Blink Codes&lt;br /&gt;
&lt;br /&gt;
==== Gerade fahren ====&lt;br /&gt;
Das Problem beim geradeaus fahren ist dass der Roboter von der Spur abweichen kann und dann neu ausgerichtet werden muss. Üblicherweise erfolgt das mit Hilfe der Liniensensoren indem, sobald einer der seitlichen Sensoren die Linie erkennt, durch beschleunigen oder bremsen eines Rades in diese Richtung korrigierend gelenkt wird.&lt;br /&gt;
&lt;br /&gt;
In unserem Fall müssen wir diese Korrektur solange verzögern bis der seitliche Liniensensor eine mögliche Kreuzung passiert hat. Erst danach können wir feststellen ob wir nur die schwarze Linie einer Kreuzung überfahren sind oder ob tatsächlich eine Abweichung vorliegt. Die Anzahl der zu ignorierenden Odometrie-Impule kann folgendermaßen errechnet werden:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;Impulse pro Radumdrehung&amp;gt; / &amp;lt;Radumfang&amp;gt; * &amp;lt;Linienbreite&amp;gt; =&lt;br /&gt;
 20 / 11,8 * 1 = 1,69491525&lt;br /&gt;
&lt;br /&gt;
Wir werden also nur zwei Impulse abwarten bevor wir mit der Korrektur beginnen&lt;br /&gt;
&lt;br /&gt;
===== Funktionsaufteilung =====&lt;br /&gt;
Die Zuständigkeiten für diese Aufgabe sind wie folgt:&lt;br /&gt;
;drive Modul&lt;br /&gt;
:sorgt für die Steuerung der Motoren. Reduzieren der Geschwindigkeit eines Rades um eine ausgleichende Kurve zu fahren und stoppen wenn das Ende der geraden Linie erreicht wurde. Dazu aboniert der Modul die Events des line Modul die eine Abweichung von der Linie melden und vom distance Modul den Event zum fahren der Distanz zwischen Liniensensoren und Achse der Räder.&lt;br /&gt;
;line Modul&lt;br /&gt;
:prüft zyklisch die position der Linie unter dem NIBObee und meldet Abweichungen mittels Events. Dieses Melden wird allerdings verzögert bis zumindest die Breite der Linie überfahren wurde. Dazu aboniert der Modul den Event vom distance Modul den Event zum fahren der der Breite der Linie.&lt;br /&gt;
;distance Modul&lt;br /&gt;
:meldet auf Anforderung das zurücklegen einer Strecke in der Länge der Distanz zwischen Liniensensoren und Achse der Räder oder der Breite der Linie.&lt;br /&gt;
&lt;br /&gt;
==== Kreuzung fahren ====&lt;br /&gt;
An einer Kreuzung wird abgebogen indem der NIBObee zuerst unbeirrt geradeaus fährt bis die Achse genau auf dem Mittelpunkt der Kreuzung zu stehen kommt. Danach wird eine Drehung nach rechts oder links durchgeführt bis sich die Linie wieder genau unter dem mittleren Sensor befindet.&lt;br /&gt;
&lt;br /&gt;
Die Sensoren sind von der Achse 10,4 cm entfernt, eine Radumdrehung bewegt den NIBObee um 11,8 cm weiter und bei dieser Umdrehung werden vom Odometriesensor 20 Impulse abgegeben. Die Linienbreite wird 2 cm betragen. Daher errechnet sich die Strecke die nach Erkennen der Kreuzung gefahren werden muss folgendermassen:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;Impulse pro Radumdrehung&amp;gt; / &amp;lt;Radumfang&amp;gt; * (&amp;lt;Achsabstand&amp;gt; - &amp;lt;halbe Linienbreite&amp;gt;) =&lt;br /&gt;
 20 / 11,8 * (10,4 - 0,5) = 16,779661&lt;br /&gt;
&lt;br /&gt;
Nach passieren der Kreuzung muss der NIBObee also noch 17 Impulse über den Odometriesensor empfangen bevor er stoppt.&lt;br /&gt;
&lt;br /&gt;
== Risikoanalyse ==&lt;br /&gt;
Im Folgenden wird versucht für die möglichen Risikopunkte Alternativen aufzuzeigen.&lt;br /&gt;
&lt;br /&gt;
; ATmega16 ist nicht Leisungsfägig genug&lt;br /&gt;
: Es kann auf den [http://www.nicai-systems.com/de/zubehoer/nibobee-tuning-kit.html Tuning-Kit von Nicai-Systems] zurückgerifffen werden. Dies könnte eine nicht akzeptable Verzögerung verursachen (erkennen, bestellen, NIBObee umrüsten)&lt;br /&gt;
&lt;br /&gt;
: Ein beliebiger PIN-kompatiber Microcontroller ATmega... wird statt dem ATmega16 eingesetzt. Die funktioniert soange der Ersatz-µC mit der Frequenz vom 15 MHz betrieben werden kann. Wichtig ist auch dass es adaptierte Bibliotheken gibt die auf den Ersatz-µC abgestimmt sind (z.B. andere Register oder geänderte Adressen für Register, ...)&lt;br /&gt;
&lt;br /&gt;
; Signale am UART mit Bordspannung im Gegensatz zu RS232-Level (12V)&lt;br /&gt;
: Die Signale am UART werden mit Bordspannung erzeugt/erwartet. Für die Kommunikation mit dem BT-Modul ist daher keine Anpassung durchzuführen.&lt;br /&gt;
&lt;br /&gt;
: Soll zu Testzwecken ein PC über RS232 angeschalten werden ist unbedingt auf die Spannung achten. Möglicherweise verwendet ein USB-RS232 Adapter nicht die 12V sonder nur 5V.&lt;br /&gt;
&lt;br /&gt;
== Open Issues ==&lt;br /&gt;
* Es muss noch überprüft werden ob die NIBObee Hardware ausreichend leistungsfähig ist oder ein Upgrade gemacht werden muss.&lt;br /&gt;
* Wie kann das verlassen der Spur von dem Überfahren einer Kreuzung unterschieden werden? Wenn es hier zu Problemen kommt könnten zwei zusätzliche lichtempfindliche Sensoren rechts und links oder noch ein Element mit drei zusätzlichen Sensoren auf Höhe der Achsen angebracht werden -&amp;gt; Mehraufwand!&lt;br /&gt;
* Soll Aktivierung der BT-Schnittstelle manuell erfolgen?&lt;br /&gt;
* Soll der Betriebsmodus gewählt werden können?&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* [http://www.nicai-systems.de/nibobee.html NIBObee Homepage bei Nicai Systems]&lt;br /&gt;
* [http://download.nicai-systems.com/nibo/Tutorial_NIBObee_20091123.pdf NIBObee - Tutorial zur Programmierung]&lt;br /&gt;
* [http://www.nicai-systems.com/de/zubehoer/nibobee-tuning-kit.html NIBObee - Tuning-Kit von Nicai-Systems]&lt;br /&gt;
* [http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/Der_UART Tutorial zur USART Programmierung]&lt;br /&gt;
[[Kategorie:FH]]&lt;/div&gt;</summary>
		<author><name>Alois</name></author>
	</entry>
	<entry>
		<id>https://wiki.callooh.com/index.php?title=NIBObee&amp;diff=877</id>
		<title>NIBObee</title>
		<link rel="alternate" type="text/html" href="https://wiki.callooh.com/index.php?title=NIBObee&amp;diff=877"/>
		<updated>2011-05-16T13:44:27Z</updated>

		<summary type="html">&lt;p&gt;Alois: /* Besondere Erkenntnisse */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;NIBObee ist der Roboter der im Projekt [[RoLoMa]] verwendet wird.&lt;br /&gt;
== Technische Daten ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Art&lt;br /&gt;
!Typ&lt;br /&gt;
!Bemerkung&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|Mikrocontroller&lt;br /&gt;
|ATMEL ATMega16, , 15 MHz&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|Integrierter UART wird verwendet um den Bluetooth Modul anzubinden.&lt;br /&gt;
&lt;br /&gt;
Sollte die Leistung nicht ausreichen kann entweder der Erweiterungssatz von Nicai-Systems verwendet werden oder nur der Controller wird gegen einen Pinkompatiblen Typ ausgetauscht (z.B. ATMega32, ATMega644, ATMega1284)&lt;br /&gt;
|-&lt;br /&gt;
|Flash:	16	kB&lt;br /&gt;
|-&lt;br /&gt;
|...&lt;br /&gt;
|-&lt;br /&gt;
|...&lt;br /&gt;
|...&lt;br /&gt;
|...&lt;br /&gt;
|-&lt;br /&gt;
|...&lt;br /&gt;
|...&lt;br /&gt;
|...&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|Maße&lt;br /&gt;
|Radumfang: 11,8 cm&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|Diese Maße sind wichtig um den NIBObee so exakt wie möglich am Mittelpunkt des Labyrinthfeldes positionieren zu können.&lt;br /&gt;
|-&lt;br /&gt;
|Abstand Liniensensor zu Radachse: 10,4 cm&lt;br /&gt;
|-&lt;br /&gt;
|Impulse pro Umdrehung: 20&lt;br /&gt;
|}&lt;br /&gt;
=== Ports ===&lt;br /&gt;
Über den UART wird der Bluetooth Modul [[BTM-222]] angebunden. Am NIObee ist diese Schnittstelle am Port X5 verfügbar&lt;br /&gt;
&lt;br /&gt;
=== Resourcen ===&lt;br /&gt;
Folgende Resourcen werden für unsere Implementierung verwendet (&#039;&#039;kursiv&#039;&#039; markierte Resourcen werden bereits durch die Bibliothek belegt):&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Resource&lt;br /&gt;
!Verwendung&lt;br /&gt;
!Interrupts&lt;br /&gt;
!Dateien&lt;br /&gt;
|-&lt;br /&gt;
|Timer 1&lt;br /&gt;
|Motor PWM&lt;br /&gt;
|TIMER1_COMPA_vect, TIMER1_COMPB_vect&lt;br /&gt;
|motpwm.c&lt;br /&gt;
|-&lt;br /&gt;
|ADC&lt;br /&gt;
|Analog, Line&lt;br /&gt;
|ADC_vect&lt;br /&gt;
|analog.c, line.c&lt;br /&gt;
|-&lt;br /&gt;
|EEPROM&lt;br /&gt;
|Line (12 Byte)&lt;br /&gt;
|&lt;br /&gt;
|line.c&lt;br /&gt;
|-&lt;br /&gt;
|Ext. IRQ&lt;br /&gt;
|Odometrie&lt;br /&gt;
|INT0_vect, INT1_vect&lt;br /&gt;
|odometry.c&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Eine für den NIBObee allgemein gültige Auflistung findet man im [http://www.nibo-roboter.de/wiki/NIBObee/Lib/Resourcen NIBObee Wiki].&lt;br /&gt;
&lt;br /&gt;
=== Besondere Erkenntnisse ===&lt;br /&gt;
&lt;br /&gt;
==== ATMega16 ====&lt;br /&gt;
Die Speichergröße scheint durchaus ausreichend zu sein. Nach implementierung aller wichtigen Grundfunktionen ist erst weniger als die Hälfte des Programmspeichers belegt.&lt;br /&gt;
&lt;br /&gt;
Problematisch war anfangs nur der geringe RAM der auch alle konstanten Strings enthält. Dies ist zwar nicht notwendig, ist mit dieser Entwicklungsumgebung allerdings so gelöst. Besonders die umfangreichen Debug-Informationen die über Bluetooth an den PC gesendet werden führten dabei zu massiven Problemen. Durch kurze symbolische Debugausgaben, die dann am PC im eigens entwickelten Terminalprogramm auf sprechende symbolische Ausgabe konvertiert wird, konnte das Problem behoben werden.&lt;br /&gt;
&lt;br /&gt;
==== Liniensensoren ====&lt;br /&gt;
Es hat sich, nach einigen Fehlschlägen bei der Linienverfolung, herausgestellt dass es ungünstig ist den NIBObee in eine optisch ansprechende waagrechte Position zu bringen indem eine kleinere Halbkugel auf der Unterseite angebracht wird. Der Grund: Nur mit der original Halbkugel und dem damit nach vorne ansteigenden Bodenabstand sind die IR-LED&#039;s weit genug vom Boden entfernt um einen Lichtkegen zu erzeugen der auch vernünftig vom Phototransistor erfasst werden kann. Bei waagrechter Ausrichtung des NIBObee ist dieser Kegel, aufgrund des geringeren Abstands zum Boden, zu klein!&lt;br /&gt;
&lt;br /&gt;
=== Bibliotheksfunktionen ===&lt;br /&gt;
==== Liniensensoren ====&lt;br /&gt;
Die original NIBObee Biliothek wird nicht verwendet. Sie wurde durch eine eigene Implementierung im [[NIBObee#Line-Modul|Line-Modul]] ersetzt. Der Grund ist die Notwendigkeit die zusätzlichen Liniensensoren in der gleichen weise wie die drei Originalsensoren zu behandeln.&lt;br /&gt;
&lt;br /&gt;
==== Motorensteuerung ====&lt;br /&gt;
 motpwm.h&lt;br /&gt;
Die Motoren des NIBObee werden mit PWM ([http://de.wikipedia.org/wiki/Pulsweitenmodulation Pulsweitenmodulation]) angesteuert. Das garantiert natürlich ohne Regelung noch keinen Gleichlauf der beiden Motoren was sich je nach Zustand des Getriebes in einer weiteren oder engernen Kurve zeigt.&lt;br /&gt;
 motpid.h&lt;br /&gt;
Hier stehen Funktionen zur Verfügung die mit Hilfe der Odometrie die Motoren regeln. Diese Funktionen sind für unsere Zwecke allerdings nicht geeignet.&lt;br /&gt;
&lt;br /&gt;
== Aufgaben ==&lt;br /&gt;
Folgende Aufgaben sind im Rahmen des Projekts [[RoLoMa]] vom NIBObee Team zu lösen:&lt;br /&gt;
* Herstellung der Bluetooth Hardware-Erweiterung&lt;br /&gt;
* Softwaremodul zum Bedienen der Bluetooth-Schnittstelle via RS232&lt;br /&gt;
* Softwaremodul zum Erkennen der Linie im Labyrinth und im speziellen der unterschiedlichen Kreuzungstypen&lt;br /&gt;
* Messen des zurückgelegten Weges&lt;br /&gt;
* Steuerung, die den Abstand des Sensors zur Radachse berücksichtigt um den Roboter an der korrekten Stelle um die eigene Achse zu drehen&lt;br /&gt;
* Erstellen eines Abbilds des Labyrinths im Speicher und navigieren bis der Roboter wieder am Startpunkt gelandet ist (z.B. immer Links abbiegen)&lt;br /&gt;
* Implementieren des [[MaDeCo]] Protokolls&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
&lt;br /&gt;
=== Bluetooth ===&lt;br /&gt;
Der Bluetooth Modul ist im Detail auf den Seiten des [[BTM-222]] beschrieben.&lt;br /&gt;
&lt;br /&gt;
=== Liniensensoren ===&lt;br /&gt;
Zum Erkennen der Kreuzungen bei gleichzeitigem folgen der Linie war es notwendig zusätzliche Liniensensoren zu verwenden. Diese wurden mit einer Zusätzplatine in einer Reihe mit den bereits vorhandenen Liniensensoren, allerdings so weit wie möglich linke und rechts außen, montiert. Das einlesen der Analogwerte erfolgt über die beiden Analogeingänge am Stecker X1. Die IR-LEDs sind, analog zu den bestehenden IR-LEDs der vorhandenen Liniensensoren, über den Ausgang 1 am Stecker X4 schaltbar. Dies ist notwendig da jeweils eine Messung mit eingschalteter LED und eine mit ausgeschalteter LED durchgeführt wird. Damit wird der Einfluß des Umgebungslichts korrigiert.&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
Die Aufgaben der Software sollen in möglichst unabhängigen Modulen realisiert werden um das Testen einfacher zu gestalten. Die einzelnen Module sind im Folgenden beschrieben.&lt;br /&gt;
&lt;br /&gt;
=== Architektur ===&lt;br /&gt;
Das Gesamtsystem besteht aus einem zentralen Taktgeber, einem Scheduler und mehreren State Maschinen. Die Kommunikation erfolgt ausschließlich über Events. Die Module können mittels Subscribe einen Event, den ein anderer Modul zur Verfügung steht, abonnieren.&lt;br /&gt;
&lt;br /&gt;
==== Systemtakt, Scheduler ====&lt;br /&gt;
Im Main Modul befindet sich der zentrale Taktgeber der aus dem Interrupt des Timer 2 einen gleichmäßigen Takt von 100Hz erzeugt. Dieser Takt kann von anderen Modulen verwendet werden um zyklische Aufgaben zu erfüllen (z.B. lesen der Liniensensoren). Im Main Modul befindet sich auch der Scheduler der ganz einfach in der Endlosschleife sequenziell jeden Modul aufruft um anstehende Events zu bearbeiten.&lt;br /&gt;
&lt;br /&gt;
==== State / Event Maschinen ====&lt;br /&gt;
Die State / Event Maschinen sind in allen Modulen gleich aufgebaut. Es gibt die folgenden Funktionen (wobei statt &amp;quot;&amp;lt;xx&amp;gt;&amp;quot; das Kürzel des Moduls steht, z.B &amp;quot;dr&amp;quot; für Drive):&lt;br /&gt;
; eine Funktion mit dem Namen &amp;lt;xx&amp;gt;_main (intern)&lt;br /&gt;
: Das ist die eigentliche State Maschine. Wird nicht direkt vom Scheduler aufgerufen sondern über die Funktion &amp;lt;xx&amp;gt;_eventHandler. Hier gibt es ein switch Statement über den aktuellen Zustand und für jeden Zustand ein switch Statement über den empfangenen Event.&lt;br /&gt;
; eine Funktion mit dem Namen &amp;lt;xx&amp;gt;_init (extern)&lt;br /&gt;
: Hier werden Variableninitialisierungen gemacht und die ersten subscribe Aufrufe um Events zu abonnieren. Diese Funktion wird beim Systemstart vom Main Modul aufgerufen.&lt;br /&gt;
; eine Funktion mit dem Namen &amp;lt;xx&amp;gt;_eventHandler (extern)&lt;br /&gt;
: Ist die Funktion die vom Scheduler aufgerufen wird damit die Statemaschine mit dem aktuellen Event, sofern vorhanden, durchlaufen wird.&lt;br /&gt;
; optional Funktionen mit den Namen &amp;lt;xx&amp;gt;_subscribe_&amp;lt;event&amp;gt; und &amp;lt;xx&amp;gt;_unsubscribe_&amp;lt;event&amp;gt; (extern)&lt;br /&gt;
: für jeden Event den dieser Modul verschicken kann ist sowohl eine Subscribe Funktion als auch ein Unsubscribe Funktion vorhanden. Mit diesen Funktionen kann der Event von einem anderen Modul abboniert werden.&lt;br /&gt;
; eine Funktion mit dem Namen &amp;lt;xx&amp;gt;_receiveEvent (intern)&lt;br /&gt;
: ReceiveEvent ist eigentlich eine interne Funktion (wird also nicht im Header File deklariert), der Pointer auf diese Funktion wird allerdings als Callback beim Subscribe übergeben damit der Event dem Modul zugestellt werden kann.&lt;br /&gt;
&lt;br /&gt;
=== Module ===&lt;br /&gt;
Im folgenden sind alle Module und deren Hauptfunktionen aufgelistet.&lt;br /&gt;
&lt;br /&gt;
==== Analog-Modul ====&lt;br /&gt;
Digitalisieren der Analogeingänge&lt;br /&gt;
 Dateien: analog.c&lt;br /&gt;
          analog.h&lt;br /&gt;
Dieser Modul ist abgeleitet von den gleichnamigen Dateien der original NIBObee Bibliothek. Dies war notwendig da wir zusätzliche Liniensensoren verwenden und deren Ansteuerung in gleicher Weise erfolgen sollte. Das bedeutet dass für die entsprechenden Analogeingänge Messungen mit ein- und ausgeschalteten IR-LEDs durchgeführt werden müssen. Außerdem wurde, entsprechend dem Datenblatt des ATMega16 die Behandlung der Messung der Batteriespannung verbessert. Da hier die Referenzspannung umgeschalten wird muss eine Messung verworfen werden bevor mit einem richtigen Ergebnis gerechnet werden kann. Das wurde in der Originalbibliothek nicht berücksichtigt.&lt;br /&gt;
Die einzelnen Werte werden weiterhin über einen A/D-Wandler ermittelt und zwischengespeichert. Es gibt nun 13 analoge Werte (statt bisher 11) die zyklisch digitalisiert werden. Dieser Vorgang wird mit einer Frequenz von ca 117 kHz durchgeführt, d.h. dass jeder dieser Werte ca. alle 111 µs (statt bisher 94 µs) aktualisiert wird.&lt;br /&gt;
&lt;br /&gt;
==== Line-Modul ====&lt;br /&gt;
Ermitteln der Werte der Liniensensoren&lt;br /&gt;
 Dateien: line.c&lt;br /&gt;
          line.h&lt;br /&gt;
Dieser Modul ersetzt die originalen Bibliotheksfunktionen der Liniensensoren. Dies war notwendig da wir zusätzliche Liniensensoren verwenden.&lt;br /&gt;
&lt;br /&gt;
Die Werte der Liniensensoren können nun mit der Funktion&lt;br /&gt;
&amp;lt;code&amp;gt;ln_get(index)&amp;lt;/code&amp;gt;&lt;br /&gt;
gelesen werden. Die Werte selbst werden über den [[NIBObee#Analog-Modul|Analog-Modul]] ermittelt.&lt;br /&gt;
&lt;br /&gt;
==== Bluetooth-Modul ====&lt;br /&gt;
Wickelt die Kommunikation über den Bluetooth Modul ab. Zur Kommunikation wird allerdings nur der USART als Terminal angesprochen, der Bluetooth Stack ist im [[BTM-222]] implementiert.&lt;br /&gt;
 Dateien: bluetooth.c&lt;br /&gt;
          bluetooth.h&lt;br /&gt;
&lt;br /&gt;
==== Common-Modul ====&lt;br /&gt;
Stellt gemeinsame Funktionen zurVerfügung&lt;br /&gt;
 Dateien: common.c&lt;br /&gt;
          common.h&lt;br /&gt;
&lt;br /&gt;
==== Distance-Modul ====&lt;br /&gt;
Behandelt die Odometrie Sensoren&lt;br /&gt;
 Dateien: distance.c&lt;br /&gt;
          distance.h&lt;br /&gt;
&lt;br /&gt;
==== Drive-Modul ====&lt;br /&gt;
Bewegt den NIBObee&lt;br /&gt;
 Dateien: drive.c&lt;br /&gt;
          drive.h&lt;br /&gt;
&lt;br /&gt;
==== Follow-Modul ====&lt;br /&gt;
Ist für die Linienverfolgung zuständig&lt;br /&gt;
 Dateien: follow.c&lt;br /&gt;
          follow.h&lt;br /&gt;
&lt;br /&gt;
==== MaDeCo-Modul ====&lt;br /&gt;
Behandelt das MaDeCo Protokoll&lt;br /&gt;
 Dateien: madeco.c&lt;br /&gt;
          madeco.h&lt;br /&gt;
&lt;br /&gt;
==== Main-Modul ====&lt;br /&gt;
Scheduler und zentraler Taktgeber&lt;br /&gt;
 Dateien: main.c&lt;br /&gt;
          main.h&lt;br /&gt;
&lt;br /&gt;
==== Sensor-Modul ====&lt;br /&gt;
Ist für die &amp;quot;Fühler&amp;quot; zuständig&lt;br /&gt;
 Dateien: follow.c&lt;br /&gt;
          follow.h&lt;br /&gt;
&lt;br /&gt;
=== Applikationen ===&lt;br /&gt;
==== Labyrinth erkunden ====&lt;br /&gt;
&lt;br /&gt;
==== Kürzesten Weg durch Labyrinth ====&lt;br /&gt;
&lt;br /&gt;
==== Kalibrierung ====&lt;br /&gt;
Zur Kalibrierung fährt der NIBObee ein Viereck entlang dass genau die Seitenlänge eines der Felder des Labyrinths hat. Dies ist notwendig um relativ einfach die Karte des Labyrinths erstellen zu können.&lt;br /&gt;
&lt;br /&gt;
=== Protokolle und deren Implementierung ===&lt;br /&gt;
==== [[MaDeCo]] ====&lt;br /&gt;
===== Interface Definition =====&lt;br /&gt;
* int set_opmode(OPMODE)&lt;br /&gt;
* int send_waypoint(WAYPOINT)&lt;br /&gt;
* int direct(DIRECTION[])&lt;br /&gt;
* int ack()&lt;br /&gt;
&lt;br /&gt;
==== Schnittstelle [[MaDeCo]] - RS232-Schnittstelle ====&lt;br /&gt;
* pairing&lt;br /&gt;
* Konfigurations-Commands&lt;br /&gt;
* ack&lt;br /&gt;
* read_command&lt;br /&gt;
* send_command&lt;br /&gt;
&lt;br /&gt;
=== Steuerungssoftware ===&lt;br /&gt;
==== Bluetooth Modul einschalten ====&lt;br /&gt;
Durch Bewegen der &amp;quot;Fühler&amp;quot; der NIBObee nach oben bis Einrasten wird das Bluetooth Modul eingeschalten.&lt;br /&gt;
Daraufhin muss auf eingehenden Bluetooth Traffic gelauscht werden.&lt;br /&gt;
&lt;br /&gt;
==== Blink Codes ====&lt;br /&gt;
Bestimmte Events oder Commands lösen bestimmte Blink- oder Leuchtmuster der Status LEDs aus.&lt;br /&gt;
&#039;&#039;&#039;TODO:&#039;&#039;&#039; Spezifikation der Blink Codes&lt;br /&gt;
&lt;br /&gt;
==== Gerade fahren ====&lt;br /&gt;
Das Problem beim geradeaus fahren ist dass der Roboter von der Spur abweichen kann und dann neu ausgerichtet werden muss. Üblicherweise erfolgt das mit Hilfe der Liniensensoren indem, sobald einer der seitlichen Sensoren die Linie erkennt, durch beschleunigen oder bremsen eines Rades in diese Richtung korrigierend gelenkt wird.&lt;br /&gt;
&lt;br /&gt;
In unserem Fall müssen wir diese Korrektur solange verzögern bis der seitliche Liniensensor eine mögliche Kreuzung passiert hat. Erst danach können wir feststellen ob wir nur die schwarze Linie einer Kreuzung überfahren sind oder ob tatsächlich eine Abweichung vorliegt. Die Anzahl der zu ignorierenden Odometrie-Impule kann folgendermaßen errechnet werden:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;Impulse pro Radumdrehung&amp;gt; / &amp;lt;Radumfang&amp;gt; * &amp;lt;Linienbreite&amp;gt; =&lt;br /&gt;
 20 / 11,8 * 1 = 1,69491525&lt;br /&gt;
&lt;br /&gt;
Wir werden also nur zwei Impulse abwarten bevor wir mit der Korrektur beginnen&lt;br /&gt;
&lt;br /&gt;
===== Funktionsaufteilung =====&lt;br /&gt;
Die Zuständigkeiten für diese Aufgabe sind wie folgt:&lt;br /&gt;
;drive Modul&lt;br /&gt;
:sorgt für die Steuerung der Motoren. Reduzieren der Geschwindigkeit eines Rades um eine ausgleichende Kurve zu fahren und stoppen wenn das Ende der geraden Linie erreicht wurde. Dazu aboniert der Modul die Events des line Modul die eine Abweichung von der Linie melden und vom distance Modul den Event zum fahren der Distanz zwischen Liniensensoren und Achse der Räder.&lt;br /&gt;
;line Modul&lt;br /&gt;
:prüft zyklisch die position der Linie unter dem NIBObee und meldet Abweichungen mittels Events. Dieses Melden wird allerdings verzögert bis zumindest die Breite der Linie überfahren wurde. Dazu aboniert der Modul den Event vom distance Modul den Event zum fahren der der Breite der Linie.&lt;br /&gt;
;distance Modul&lt;br /&gt;
:meldet auf Anforderung das zurücklegen einer Strecke in der Länge der Distanz zwischen Liniensensoren und Achse der Räder oder der Breite der Linie.&lt;br /&gt;
&lt;br /&gt;
==== Kreuzung fahren ====&lt;br /&gt;
An einer Kreuzung wird abgebogen indem der NIBObee zuerst unbeirrt geradeaus fährt bis die Achse genau auf dem Mittelpunkt der Kreuzung zu stehen kommt. Danach wird eine Drehung nach rechts oder links durchgeführt bis sich die Linie wieder genau unter dem mittleren Sensor befindet.&lt;br /&gt;
&lt;br /&gt;
Die Sensoren sind von der Achse 10,4 cm entfernt, eine Radumdrehung bewegt den NIBObee um 11,8 cm weiter und bei dieser Umdrehung werden vom Odometriesensor 20 Impulse abgegeben. Die Linienbreite wird 2 cm betragen. Daher errechnet sich die Strecke die nach Erkennen der Kreuzung gefahren werden muss folgendermassen:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;Impulse pro Radumdrehung&amp;gt; / &amp;lt;Radumfang&amp;gt; * (&amp;lt;Achsabstand&amp;gt; - &amp;lt;halbe Linienbreite&amp;gt;) =&lt;br /&gt;
 20 / 11,8 * (10,4 - 0,5) = 16,779661&lt;br /&gt;
&lt;br /&gt;
Nach passieren der Kreuzung muss der NIBObee also noch 17 Impulse über den Odometriesensor empfangen bevor er stoppt.&lt;br /&gt;
&lt;br /&gt;
== Risikoanalyse ==&lt;br /&gt;
Im Folgenden wird versucht für die möglichen Risikopunkte Alternativen aufzuzeigen.&lt;br /&gt;
&lt;br /&gt;
; ATmega16 ist nicht Leisungsfägig genug&lt;br /&gt;
: Es kann auf den [http://www.nicai-systems.com/de/zubehoer/nibobee-tuning-kit.html Tuning-Kit von Nicai-Systems] zurückgerifffen werden. Dies könnte eine nicht akzeptable Verzögerung verursachen (erkennen, bestellen, NIBObee umrüsten)&lt;br /&gt;
&lt;br /&gt;
: Ein beliebiger PIN-kompatiber Microcontroller ATmega... wird statt dem ATmega16 eingesetzt. Die funktioniert soange der Ersatz-µC mit der Frequenz vom 15 MHz betrieben werden kann. Wichtig ist auch dass es adaptierte Bibliotheken gibt die auf den Ersatz-µC abgestimmt sind (z.B. andere Register oder geänderte Adressen für Register, ...)&lt;br /&gt;
&lt;br /&gt;
; Signale am UART mit Bordspannung im Gegensatz zu RS232-Level (12V)&lt;br /&gt;
: Die Signale am UART werden mit Bordspannung erzeugt/erwartet. Für die Kommunikation mit dem BT-Modul ist daher keine Anpassung durchzuführen.&lt;br /&gt;
&lt;br /&gt;
: Soll zu Testzwecken ein PC über RS232 angeschalten werden ist unbedingt auf die Spannung achten. Möglicherweise verwendet ein USB-RS232 Adapter nicht die 12V sonder nur 5V.&lt;br /&gt;
&lt;br /&gt;
== Open Issues ==&lt;br /&gt;
* Es muss noch überprüft werden ob die NIBObee Hardware ausreichend leistungsfähig ist oder ein Upgrade gemacht werden muss.&lt;br /&gt;
* Wie kann das verlassen der Spur von dem Überfahren einer Kreuzung unterschieden werden? Wenn es hier zu Problemen kommt könnten zwei zusätzliche lichtempfindliche Sensoren rechts und links oder noch ein Element mit drei zusätzlichen Sensoren auf Höhe der Achsen angebracht werden -&amp;gt; Mehraufwand!&lt;br /&gt;
* Soll Aktivierung der BT-Schnittstelle manuell erfolgen?&lt;br /&gt;
* Soll der Betriebsmodus gewählt werden können?&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* [http://www.nicai-systems.de/nibobee.html NIBObee Homepage bei Nicai Systems]&lt;br /&gt;
* [http://download.nicai-systems.com/nibo/Tutorial_NIBObee_20091123.pdf NIBObee - Tutorial zur Programmierung]&lt;br /&gt;
* [http://www.nicai-systems.com/de/zubehoer/nibobee-tuning-kit.html NIBObee - Tuning-Kit von Nicai-Systems]&lt;br /&gt;
* [http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/Der_UART Tutorial zur USART Programmierung]&lt;br /&gt;
[[Kategorie:FH]]&lt;/div&gt;</summary>
		<author><name>Alois</name></author>
	</entry>
	<entry>
		<id>https://wiki.callooh.com/index.php?title=NIBObee&amp;diff=876</id>
		<title>NIBObee</title>
		<link rel="alternate" type="text/html" href="https://wiki.callooh.com/index.php?title=NIBObee&amp;diff=876"/>
		<updated>2011-05-16T13:37:12Z</updated>

		<summary type="html">&lt;p&gt;Alois: /* Liniensensoren */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;NIBObee ist der Roboter der im Projekt [[RoLoMa]] verwendet wird.&lt;br /&gt;
== Technische Daten ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Art&lt;br /&gt;
!Typ&lt;br /&gt;
!Bemerkung&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|Mikrocontroller&lt;br /&gt;
|ATMEL ATMega16, , 15 MHz&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|Integrierter UART wird verwendet um den Bluetooth Modul anzubinden.&lt;br /&gt;
&lt;br /&gt;
Sollte die Leistung nicht ausreichen kann entweder der Erweiterungssatz von Nicai-Systems verwendet werden oder nur der Controller wird gegen einen Pinkompatiblen Typ ausgetauscht (z.B. ATMega32, ATMega644, ATMega1284)&lt;br /&gt;
|-&lt;br /&gt;
|Flash:	16	kB&lt;br /&gt;
|-&lt;br /&gt;
|...&lt;br /&gt;
|-&lt;br /&gt;
|...&lt;br /&gt;
|...&lt;br /&gt;
|...&lt;br /&gt;
|-&lt;br /&gt;
|...&lt;br /&gt;
|...&lt;br /&gt;
|...&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|Maße&lt;br /&gt;
|Radumfang: 11,8 cm&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|Diese Maße sind wichtig um den NIBObee so exakt wie möglich am Mittelpunkt des Labyrinthfeldes positionieren zu können.&lt;br /&gt;
|-&lt;br /&gt;
|Abstand Liniensensor zu Radachse: 10,4 cm&lt;br /&gt;
|-&lt;br /&gt;
|Impulse pro Umdrehung: 20&lt;br /&gt;
|}&lt;br /&gt;
=== Ports ===&lt;br /&gt;
Über den UART wird der Bluetooth Modul [[BTM-222]] angebunden. Am NIObee ist diese Schnittstelle am Port X5 verfügbar&lt;br /&gt;
&lt;br /&gt;
=== Resourcen ===&lt;br /&gt;
Folgende Resourcen werden für unsere Implementierung verwendet (&#039;&#039;kursiv&#039;&#039; markierte Resourcen werden bereits durch die Bibliothek belegt):&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Resource&lt;br /&gt;
!Verwendung&lt;br /&gt;
!Interrupts&lt;br /&gt;
!Dateien&lt;br /&gt;
|-&lt;br /&gt;
|Timer 1&lt;br /&gt;
|Motor PWM&lt;br /&gt;
|TIMER1_COMPA_vect, TIMER1_COMPB_vect&lt;br /&gt;
|motpwm.c&lt;br /&gt;
|-&lt;br /&gt;
|ADC&lt;br /&gt;
|Analog, Line&lt;br /&gt;
|ADC_vect&lt;br /&gt;
|analog.c, line.c&lt;br /&gt;
|-&lt;br /&gt;
|EEPROM&lt;br /&gt;
|Line (12 Byte)&lt;br /&gt;
|&lt;br /&gt;
|line.c&lt;br /&gt;
|-&lt;br /&gt;
|Ext. IRQ&lt;br /&gt;
|Odometrie&lt;br /&gt;
|INT0_vect, INT1_vect&lt;br /&gt;
|odometry.c&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Eine für den NIBObee allgemein gültige Auflistung findet man im [http://www.nibo-roboter.de/wiki/NIBObee/Lib/Resourcen NIBObee Wiki].&lt;br /&gt;
&lt;br /&gt;
=== Besondere Erkenntnisse ===&lt;br /&gt;
Es hat sich, nach einigen Fehlschlägen bei der Linienverfolung, herausgestellt dass es ungünstig ist den NIBObee in eine optisch ansprechende waagrechte Position zu bringen indem eine kleinere Halbkugel auf der Unterseite angebracht wird. Der Grund: Nur mit der original Halbkugel und dem damit nach vorne ansteigenden Bodenabstand sind die IR-LED&#039;s weit genug vom Boden entfernt um einen Lichtkegen zu erzeugen der auch vernünftig vom Phototransistor erfasst werden kann. Bei waagrechter Ausrichtung des NIBObee ist dieser Kegel, aufgrund des geringeren Abstands zum Boden, zu klein!&lt;br /&gt;
&lt;br /&gt;
=== Bibliotheksfunktionen ===&lt;br /&gt;
==== Liniensensoren ====&lt;br /&gt;
Die original NIBObee Biliothek wird nicht verwendet. Sie wurde durch eine eigene Implementierung im [[NIBObee#Line-Modul|Line-Modul]] ersetzt. Der Grund ist die Notwendigkeit die zusätzlichen Liniensensoren in der gleichen weise wie die drei Originalsensoren zu behandeln.&lt;br /&gt;
&lt;br /&gt;
==== Motorensteuerung ====&lt;br /&gt;
 motpwm.h&lt;br /&gt;
Die Motoren des NIBObee werden mit PWM ([http://de.wikipedia.org/wiki/Pulsweitenmodulation Pulsweitenmodulation]) angesteuert. Das garantiert natürlich ohne Regelung noch keinen Gleichlauf der beiden Motoren was sich je nach Zustand des Getriebes in einer weiteren oder engernen Kurve zeigt.&lt;br /&gt;
 motpid.h&lt;br /&gt;
Hier stehen Funktionen zur Verfügung die mit Hilfe der Odometrie die Motoren regeln. Diese Funktionen sind für unsere Zwecke allerdings nicht geeignet.&lt;br /&gt;
&lt;br /&gt;
== Aufgaben ==&lt;br /&gt;
Folgende Aufgaben sind im Rahmen des Projekts [[RoLoMa]] vom NIBObee Team zu lösen:&lt;br /&gt;
* Herstellung der Bluetooth Hardware-Erweiterung&lt;br /&gt;
* Softwaremodul zum Bedienen der Bluetooth-Schnittstelle via RS232&lt;br /&gt;
* Softwaremodul zum Erkennen der Linie im Labyrinth und im speziellen der unterschiedlichen Kreuzungstypen&lt;br /&gt;
* Messen des zurückgelegten Weges&lt;br /&gt;
* Steuerung, die den Abstand des Sensors zur Radachse berücksichtigt um den Roboter an der korrekten Stelle um die eigene Achse zu drehen&lt;br /&gt;
* Erstellen eines Abbilds des Labyrinths im Speicher und navigieren bis der Roboter wieder am Startpunkt gelandet ist (z.B. immer Links abbiegen)&lt;br /&gt;
* Implementieren des [[MaDeCo]] Protokolls&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
&lt;br /&gt;
=== Bluetooth ===&lt;br /&gt;
Der Bluetooth Modul ist im Detail auf den Seiten des [[BTM-222]] beschrieben.&lt;br /&gt;
&lt;br /&gt;
=== Liniensensoren ===&lt;br /&gt;
Zum Erkennen der Kreuzungen bei gleichzeitigem folgen der Linie war es notwendig zusätzliche Liniensensoren zu verwenden. Diese wurden mit einer Zusätzplatine in einer Reihe mit den bereits vorhandenen Liniensensoren, allerdings so weit wie möglich linke und rechts außen, montiert. Das einlesen der Analogwerte erfolgt über die beiden Analogeingänge am Stecker X1. Die IR-LEDs sind, analog zu den bestehenden IR-LEDs der vorhandenen Liniensensoren, über den Ausgang 1 am Stecker X4 schaltbar. Dies ist notwendig da jeweils eine Messung mit eingschalteter LED und eine mit ausgeschalteter LED durchgeführt wird. Damit wird der Einfluß des Umgebungslichts korrigiert.&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
Die Aufgaben der Software sollen in möglichst unabhängigen Modulen realisiert werden um das Testen einfacher zu gestalten. Die einzelnen Module sind im Folgenden beschrieben.&lt;br /&gt;
&lt;br /&gt;
=== Architektur ===&lt;br /&gt;
Das Gesamtsystem besteht aus einem zentralen Taktgeber, einem Scheduler und mehreren State Maschinen. Die Kommunikation erfolgt ausschließlich über Events. Die Module können mittels Subscribe einen Event, den ein anderer Modul zur Verfügung steht, abonnieren.&lt;br /&gt;
&lt;br /&gt;
==== Systemtakt, Scheduler ====&lt;br /&gt;
Im Main Modul befindet sich der zentrale Taktgeber der aus dem Interrupt des Timer 2 einen gleichmäßigen Takt von 100Hz erzeugt. Dieser Takt kann von anderen Modulen verwendet werden um zyklische Aufgaben zu erfüllen (z.B. lesen der Liniensensoren). Im Main Modul befindet sich auch der Scheduler der ganz einfach in der Endlosschleife sequenziell jeden Modul aufruft um anstehende Events zu bearbeiten.&lt;br /&gt;
&lt;br /&gt;
==== State / Event Maschinen ====&lt;br /&gt;
Die State / Event Maschinen sind in allen Modulen gleich aufgebaut. Es gibt die folgenden Funktionen (wobei statt &amp;quot;&amp;lt;xx&amp;gt;&amp;quot; das Kürzel des Moduls steht, z.B &amp;quot;dr&amp;quot; für Drive):&lt;br /&gt;
; eine Funktion mit dem Namen &amp;lt;xx&amp;gt;_main (intern)&lt;br /&gt;
: Das ist die eigentliche State Maschine. Wird nicht direkt vom Scheduler aufgerufen sondern über die Funktion &amp;lt;xx&amp;gt;_eventHandler. Hier gibt es ein switch Statement über den aktuellen Zustand und für jeden Zustand ein switch Statement über den empfangenen Event.&lt;br /&gt;
; eine Funktion mit dem Namen &amp;lt;xx&amp;gt;_init (extern)&lt;br /&gt;
: Hier werden Variableninitialisierungen gemacht und die ersten subscribe Aufrufe um Events zu abonnieren. Diese Funktion wird beim Systemstart vom Main Modul aufgerufen.&lt;br /&gt;
; eine Funktion mit dem Namen &amp;lt;xx&amp;gt;_eventHandler (extern)&lt;br /&gt;
: Ist die Funktion die vom Scheduler aufgerufen wird damit die Statemaschine mit dem aktuellen Event, sofern vorhanden, durchlaufen wird.&lt;br /&gt;
; optional Funktionen mit den Namen &amp;lt;xx&amp;gt;_subscribe_&amp;lt;event&amp;gt; und &amp;lt;xx&amp;gt;_unsubscribe_&amp;lt;event&amp;gt; (extern)&lt;br /&gt;
: für jeden Event den dieser Modul verschicken kann ist sowohl eine Subscribe Funktion als auch ein Unsubscribe Funktion vorhanden. Mit diesen Funktionen kann der Event von einem anderen Modul abboniert werden.&lt;br /&gt;
; eine Funktion mit dem Namen &amp;lt;xx&amp;gt;_receiveEvent (intern)&lt;br /&gt;
: ReceiveEvent ist eigentlich eine interne Funktion (wird also nicht im Header File deklariert), der Pointer auf diese Funktion wird allerdings als Callback beim Subscribe übergeben damit der Event dem Modul zugestellt werden kann.&lt;br /&gt;
&lt;br /&gt;
=== Module ===&lt;br /&gt;
Im folgenden sind alle Module und deren Hauptfunktionen aufgelistet.&lt;br /&gt;
&lt;br /&gt;
==== Analog-Modul ====&lt;br /&gt;
Digitalisieren der Analogeingänge&lt;br /&gt;
 Dateien: analog.c&lt;br /&gt;
          analog.h&lt;br /&gt;
Dieser Modul ist abgeleitet von den gleichnamigen Dateien der original NIBObee Bibliothek. Dies war notwendig da wir zusätzliche Liniensensoren verwenden und deren Ansteuerung in gleicher Weise erfolgen sollte. Das bedeutet dass für die entsprechenden Analogeingänge Messungen mit ein- und ausgeschalteten IR-LEDs durchgeführt werden müssen. Außerdem wurde, entsprechend dem Datenblatt des ATMega16 die Behandlung der Messung der Batteriespannung verbessert. Da hier die Referenzspannung umgeschalten wird muss eine Messung verworfen werden bevor mit einem richtigen Ergebnis gerechnet werden kann. Das wurde in der Originalbibliothek nicht berücksichtigt.&lt;br /&gt;
Die einzelnen Werte werden weiterhin über einen A/D-Wandler ermittelt und zwischengespeichert. Es gibt nun 13 analoge Werte (statt bisher 11) die zyklisch digitalisiert werden. Dieser Vorgang wird mit einer Frequenz von ca 117 kHz durchgeführt, d.h. dass jeder dieser Werte ca. alle 111 µs (statt bisher 94 µs) aktualisiert wird.&lt;br /&gt;
&lt;br /&gt;
==== Line-Modul ====&lt;br /&gt;
Ermitteln der Werte der Liniensensoren&lt;br /&gt;
 Dateien: line.c&lt;br /&gt;
          line.h&lt;br /&gt;
Dieser Modul ersetzt die originalen Bibliotheksfunktionen der Liniensensoren. Dies war notwendig da wir zusätzliche Liniensensoren verwenden.&lt;br /&gt;
&lt;br /&gt;
Die Werte der Liniensensoren können nun mit der Funktion&lt;br /&gt;
&amp;lt;code&amp;gt;ln_get(index)&amp;lt;/code&amp;gt;&lt;br /&gt;
gelesen werden. Die Werte selbst werden über den [[NIBObee#Analog-Modul|Analog-Modul]] ermittelt.&lt;br /&gt;
&lt;br /&gt;
==== Bluetooth-Modul ====&lt;br /&gt;
Wickelt die Kommunikation über den Bluetooth Modul ab. Zur Kommunikation wird allerdings nur der USART als Terminal angesprochen, der Bluetooth Stack ist im [[BTM-222]] implementiert.&lt;br /&gt;
 Dateien: bluetooth.c&lt;br /&gt;
          bluetooth.h&lt;br /&gt;
&lt;br /&gt;
==== Common-Modul ====&lt;br /&gt;
Stellt gemeinsame Funktionen zurVerfügung&lt;br /&gt;
 Dateien: common.c&lt;br /&gt;
          common.h&lt;br /&gt;
&lt;br /&gt;
==== Distance-Modul ====&lt;br /&gt;
Behandelt die Odometrie Sensoren&lt;br /&gt;
 Dateien: distance.c&lt;br /&gt;
          distance.h&lt;br /&gt;
&lt;br /&gt;
==== Drive-Modul ====&lt;br /&gt;
Bewegt den NIBObee&lt;br /&gt;
 Dateien: drive.c&lt;br /&gt;
          drive.h&lt;br /&gt;
&lt;br /&gt;
==== Follow-Modul ====&lt;br /&gt;
Ist für die Linienverfolgung zuständig&lt;br /&gt;
 Dateien: follow.c&lt;br /&gt;
          follow.h&lt;br /&gt;
&lt;br /&gt;
==== MaDeCo-Modul ====&lt;br /&gt;
Behandelt das MaDeCo Protokoll&lt;br /&gt;
 Dateien: madeco.c&lt;br /&gt;
          madeco.h&lt;br /&gt;
&lt;br /&gt;
==== Main-Modul ====&lt;br /&gt;
Scheduler und zentraler Taktgeber&lt;br /&gt;
 Dateien: main.c&lt;br /&gt;
          main.h&lt;br /&gt;
&lt;br /&gt;
==== Sensor-Modul ====&lt;br /&gt;
Ist für die &amp;quot;Fühler&amp;quot; zuständig&lt;br /&gt;
 Dateien: follow.c&lt;br /&gt;
          follow.h&lt;br /&gt;
&lt;br /&gt;
=== Applikationen ===&lt;br /&gt;
==== Labyrinth erkunden ====&lt;br /&gt;
&lt;br /&gt;
==== Kürzesten Weg durch Labyrinth ====&lt;br /&gt;
&lt;br /&gt;
==== Kalibrierung ====&lt;br /&gt;
Zur Kalibrierung fährt der NIBObee ein Viereck entlang dass genau die Seitenlänge eines der Felder des Labyrinths hat. Dies ist notwendig um relativ einfach die Karte des Labyrinths erstellen zu können.&lt;br /&gt;
&lt;br /&gt;
=== Protokolle und deren Implementierung ===&lt;br /&gt;
==== [[MaDeCo]] ====&lt;br /&gt;
===== Interface Definition =====&lt;br /&gt;
* int set_opmode(OPMODE)&lt;br /&gt;
* int send_waypoint(WAYPOINT)&lt;br /&gt;
* int direct(DIRECTION[])&lt;br /&gt;
* int ack()&lt;br /&gt;
&lt;br /&gt;
==== Schnittstelle [[MaDeCo]] - RS232-Schnittstelle ====&lt;br /&gt;
* pairing&lt;br /&gt;
* Konfigurations-Commands&lt;br /&gt;
* ack&lt;br /&gt;
* read_command&lt;br /&gt;
* send_command&lt;br /&gt;
&lt;br /&gt;
=== Steuerungssoftware ===&lt;br /&gt;
==== Bluetooth Modul einschalten ====&lt;br /&gt;
Durch Bewegen der &amp;quot;Fühler&amp;quot; der NIBObee nach oben bis Einrasten wird das Bluetooth Modul eingeschalten.&lt;br /&gt;
Daraufhin muss auf eingehenden Bluetooth Traffic gelauscht werden.&lt;br /&gt;
&lt;br /&gt;
==== Blink Codes ====&lt;br /&gt;
Bestimmte Events oder Commands lösen bestimmte Blink- oder Leuchtmuster der Status LEDs aus.&lt;br /&gt;
&#039;&#039;&#039;TODO:&#039;&#039;&#039; Spezifikation der Blink Codes&lt;br /&gt;
&lt;br /&gt;
==== Gerade fahren ====&lt;br /&gt;
Das Problem beim geradeaus fahren ist dass der Roboter von der Spur abweichen kann und dann neu ausgerichtet werden muss. Üblicherweise erfolgt das mit Hilfe der Liniensensoren indem, sobald einer der seitlichen Sensoren die Linie erkennt, durch beschleunigen oder bremsen eines Rades in diese Richtung korrigierend gelenkt wird.&lt;br /&gt;
&lt;br /&gt;
In unserem Fall müssen wir diese Korrektur solange verzögern bis der seitliche Liniensensor eine mögliche Kreuzung passiert hat. Erst danach können wir feststellen ob wir nur die schwarze Linie einer Kreuzung überfahren sind oder ob tatsächlich eine Abweichung vorliegt. Die Anzahl der zu ignorierenden Odometrie-Impule kann folgendermaßen errechnet werden:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;Impulse pro Radumdrehung&amp;gt; / &amp;lt;Radumfang&amp;gt; * &amp;lt;Linienbreite&amp;gt; =&lt;br /&gt;
 20 / 11,8 * 1 = 1,69491525&lt;br /&gt;
&lt;br /&gt;
Wir werden also nur zwei Impulse abwarten bevor wir mit der Korrektur beginnen&lt;br /&gt;
&lt;br /&gt;
===== Funktionsaufteilung =====&lt;br /&gt;
Die Zuständigkeiten für diese Aufgabe sind wie folgt:&lt;br /&gt;
;drive Modul&lt;br /&gt;
:sorgt für die Steuerung der Motoren. Reduzieren der Geschwindigkeit eines Rades um eine ausgleichende Kurve zu fahren und stoppen wenn das Ende der geraden Linie erreicht wurde. Dazu aboniert der Modul die Events des line Modul die eine Abweichung von der Linie melden und vom distance Modul den Event zum fahren der Distanz zwischen Liniensensoren und Achse der Räder.&lt;br /&gt;
;line Modul&lt;br /&gt;
:prüft zyklisch die position der Linie unter dem NIBObee und meldet Abweichungen mittels Events. Dieses Melden wird allerdings verzögert bis zumindest die Breite der Linie überfahren wurde. Dazu aboniert der Modul den Event vom distance Modul den Event zum fahren der der Breite der Linie.&lt;br /&gt;
;distance Modul&lt;br /&gt;
:meldet auf Anforderung das zurücklegen einer Strecke in der Länge der Distanz zwischen Liniensensoren und Achse der Räder oder der Breite der Linie.&lt;br /&gt;
&lt;br /&gt;
==== Kreuzung fahren ====&lt;br /&gt;
An einer Kreuzung wird abgebogen indem der NIBObee zuerst unbeirrt geradeaus fährt bis die Achse genau auf dem Mittelpunkt der Kreuzung zu stehen kommt. Danach wird eine Drehung nach rechts oder links durchgeführt bis sich die Linie wieder genau unter dem mittleren Sensor befindet.&lt;br /&gt;
&lt;br /&gt;
Die Sensoren sind von der Achse 10,4 cm entfernt, eine Radumdrehung bewegt den NIBObee um 11,8 cm weiter und bei dieser Umdrehung werden vom Odometriesensor 20 Impulse abgegeben. Die Linienbreite wird 2 cm betragen. Daher errechnet sich die Strecke die nach Erkennen der Kreuzung gefahren werden muss folgendermassen:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;Impulse pro Radumdrehung&amp;gt; / &amp;lt;Radumfang&amp;gt; * (&amp;lt;Achsabstand&amp;gt; - &amp;lt;halbe Linienbreite&amp;gt;) =&lt;br /&gt;
 20 / 11,8 * (10,4 - 0,5) = 16,779661&lt;br /&gt;
&lt;br /&gt;
Nach passieren der Kreuzung muss der NIBObee also noch 17 Impulse über den Odometriesensor empfangen bevor er stoppt.&lt;br /&gt;
&lt;br /&gt;
== Risikoanalyse ==&lt;br /&gt;
Im Folgenden wird versucht für die möglichen Risikopunkte Alternativen aufzuzeigen.&lt;br /&gt;
&lt;br /&gt;
; ATmega16 ist nicht Leisungsfägig genug&lt;br /&gt;
: Es kann auf den [http://www.nicai-systems.com/de/zubehoer/nibobee-tuning-kit.html Tuning-Kit von Nicai-Systems] zurückgerifffen werden. Dies könnte eine nicht akzeptable Verzögerung verursachen (erkennen, bestellen, NIBObee umrüsten)&lt;br /&gt;
&lt;br /&gt;
: Ein beliebiger PIN-kompatiber Microcontroller ATmega... wird statt dem ATmega16 eingesetzt. Die funktioniert soange der Ersatz-µC mit der Frequenz vom 15 MHz betrieben werden kann. Wichtig ist auch dass es adaptierte Bibliotheken gibt die auf den Ersatz-µC abgestimmt sind (z.B. andere Register oder geänderte Adressen für Register, ...)&lt;br /&gt;
&lt;br /&gt;
; Signale am UART mit Bordspannung im Gegensatz zu RS232-Level (12V)&lt;br /&gt;
: Die Signale am UART werden mit Bordspannung erzeugt/erwartet. Für die Kommunikation mit dem BT-Modul ist daher keine Anpassung durchzuführen.&lt;br /&gt;
&lt;br /&gt;
: Soll zu Testzwecken ein PC über RS232 angeschalten werden ist unbedingt auf die Spannung achten. Möglicherweise verwendet ein USB-RS232 Adapter nicht die 12V sonder nur 5V.&lt;br /&gt;
&lt;br /&gt;
== Open Issues ==&lt;br /&gt;
* Es muss noch überprüft werden ob die NIBObee Hardware ausreichend leistungsfähig ist oder ein Upgrade gemacht werden muss.&lt;br /&gt;
* Wie kann das verlassen der Spur von dem Überfahren einer Kreuzung unterschieden werden? Wenn es hier zu Problemen kommt könnten zwei zusätzliche lichtempfindliche Sensoren rechts und links oder noch ein Element mit drei zusätzlichen Sensoren auf Höhe der Achsen angebracht werden -&amp;gt; Mehraufwand!&lt;br /&gt;
* Soll Aktivierung der BT-Schnittstelle manuell erfolgen?&lt;br /&gt;
* Soll der Betriebsmodus gewählt werden können?&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* [http://www.nicai-systems.de/nibobee.html NIBObee Homepage bei Nicai Systems]&lt;br /&gt;
* [http://download.nicai-systems.com/nibo/Tutorial_NIBObee_20091123.pdf NIBObee - Tutorial zur Programmierung]&lt;br /&gt;
* [http://www.nicai-systems.com/de/zubehoer/nibobee-tuning-kit.html NIBObee - Tuning-Kit von Nicai-Systems]&lt;br /&gt;
* [http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/Der_UART Tutorial zur USART Programmierung]&lt;br /&gt;
[[Kategorie:FH]]&lt;/div&gt;</summary>
		<author><name>Alois</name></author>
	</entry>
	<entry>
		<id>https://wiki.callooh.com/index.php?title=NIBObee&amp;diff=875</id>
		<title>NIBObee</title>
		<link rel="alternate" type="text/html" href="https://wiki.callooh.com/index.php?title=NIBObee&amp;diff=875"/>
		<updated>2011-05-16T13:33:47Z</updated>

		<summary type="html">&lt;p&gt;Alois: /* Bluetooth-Modul */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;NIBObee ist der Roboter der im Projekt [[RoLoMa]] verwendet wird.&lt;br /&gt;
== Technische Daten ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Art&lt;br /&gt;
!Typ&lt;br /&gt;
!Bemerkung&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|Mikrocontroller&lt;br /&gt;
|ATMEL ATMega16, , 15 MHz&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|Integrierter UART wird verwendet um den Bluetooth Modul anzubinden.&lt;br /&gt;
&lt;br /&gt;
Sollte die Leistung nicht ausreichen kann entweder der Erweiterungssatz von Nicai-Systems verwendet werden oder nur der Controller wird gegen einen Pinkompatiblen Typ ausgetauscht (z.B. ATMega32, ATMega644, ATMega1284)&lt;br /&gt;
|-&lt;br /&gt;
|Flash:	16	kB&lt;br /&gt;
|-&lt;br /&gt;
|...&lt;br /&gt;
|-&lt;br /&gt;
|...&lt;br /&gt;
|...&lt;br /&gt;
|...&lt;br /&gt;
|-&lt;br /&gt;
|...&lt;br /&gt;
|...&lt;br /&gt;
|...&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|Maße&lt;br /&gt;
|Radumfang: 11,8 cm&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|Diese Maße sind wichtig um den NIBObee so exakt wie möglich am Mittelpunkt des Labyrinthfeldes positionieren zu können.&lt;br /&gt;
|-&lt;br /&gt;
|Abstand Liniensensor zu Radachse: 10,4 cm&lt;br /&gt;
|-&lt;br /&gt;
|Impulse pro Umdrehung: 20&lt;br /&gt;
|}&lt;br /&gt;
=== Ports ===&lt;br /&gt;
Über den UART wird der Bluetooth Modul [[BTM-222]] angebunden. Am NIObee ist diese Schnittstelle am Port X5 verfügbar&lt;br /&gt;
&lt;br /&gt;
=== Resourcen ===&lt;br /&gt;
Folgende Resourcen werden für unsere Implementierung verwendet (&#039;&#039;kursiv&#039;&#039; markierte Resourcen werden bereits durch die Bibliothek belegt):&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Resource&lt;br /&gt;
!Verwendung&lt;br /&gt;
!Interrupts&lt;br /&gt;
!Dateien&lt;br /&gt;
|-&lt;br /&gt;
|Timer 1&lt;br /&gt;
|Motor PWM&lt;br /&gt;
|TIMER1_COMPA_vect, TIMER1_COMPB_vect&lt;br /&gt;
|motpwm.c&lt;br /&gt;
|-&lt;br /&gt;
|ADC&lt;br /&gt;
|Analog, Line&lt;br /&gt;
|ADC_vect&lt;br /&gt;
|analog.c, line.c&lt;br /&gt;
|-&lt;br /&gt;
|EEPROM&lt;br /&gt;
|Line (12 Byte)&lt;br /&gt;
|&lt;br /&gt;
|line.c&lt;br /&gt;
|-&lt;br /&gt;
|Ext. IRQ&lt;br /&gt;
|Odometrie&lt;br /&gt;
|INT0_vect, INT1_vect&lt;br /&gt;
|odometry.c&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Eine für den NIBObee allgemein gültige Auflistung findet man im [http://www.nibo-roboter.de/wiki/NIBObee/Lib/Resourcen NIBObee Wiki].&lt;br /&gt;
&lt;br /&gt;
=== Besondere Erkenntnisse ===&lt;br /&gt;
Es hat sich, nach einigen Fehlschlägen bei der Linienverfolung, herausgestellt dass es ungünstig ist den NIBObee in eine optisch ansprechende waagrechte Position zu bringen indem eine kleinere Halbkugel auf der Unterseite angebracht wird. Der Grund: Nur mit der original Halbkugel und dem damit nach vorne ansteigenden Bodenabstand sind die IR-LED&#039;s weit genug vom Boden entfernt um einen Lichtkegen zu erzeugen der auch vernünftig vom Phototransistor erfasst werden kann. Bei waagrechter Ausrichtung des NIBObee ist dieser Kegel, aufgrund des geringeren Abstands zum Boden, zu klein!&lt;br /&gt;
&lt;br /&gt;
=== Bibliotheksfunktionen ===&lt;br /&gt;
==== Liniensensoren ====&lt;br /&gt;
Die original NIBObee Biliothek wird nicht verwendet. Wurde durch eine eigene Implementierung im [[NIBObee#Line-Modul|Line-Modul]] ersetzt.&lt;br /&gt;
&lt;br /&gt;
==== Motorensteuerung ====&lt;br /&gt;
 motpwm.h&lt;br /&gt;
Die Motoren des NIBObee werden mit PWM ([http://de.wikipedia.org/wiki/Pulsweitenmodulation Pulsweitenmodulation]) angesteuert. Das garantiert natürlich ohne Regelung noch keinen Gleichlauf der beiden Motoren was sich je nach Zustand des Getriebes in einer weiteren oder engernen Kurve zeigt.&lt;br /&gt;
 motpid.h&lt;br /&gt;
Hier stehen Funktionen zur Verfügung die mit Hilfe der Odometrie die Motoren regeln. Diese Funktionen sind für unsere Zwecke allerdings nicht geeignet.&lt;br /&gt;
&lt;br /&gt;
== Aufgaben ==&lt;br /&gt;
Folgende Aufgaben sind im Rahmen des Projekts [[RoLoMa]] vom NIBObee Team zu lösen:&lt;br /&gt;
* Herstellung der Bluetooth Hardware-Erweiterung&lt;br /&gt;
* Softwaremodul zum Bedienen der Bluetooth-Schnittstelle via RS232&lt;br /&gt;
* Softwaremodul zum Erkennen der Linie im Labyrinth und im speziellen der unterschiedlichen Kreuzungstypen&lt;br /&gt;
* Messen des zurückgelegten Weges&lt;br /&gt;
* Steuerung, die den Abstand des Sensors zur Radachse berücksichtigt um den Roboter an der korrekten Stelle um die eigene Achse zu drehen&lt;br /&gt;
* Erstellen eines Abbilds des Labyrinths im Speicher und navigieren bis der Roboter wieder am Startpunkt gelandet ist (z.B. immer Links abbiegen)&lt;br /&gt;
* Implementieren des [[MaDeCo]] Protokolls&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
&lt;br /&gt;
=== Bluetooth ===&lt;br /&gt;
Der Bluetooth Modul ist im Detail auf den Seiten des [[BTM-222]] beschrieben.&lt;br /&gt;
&lt;br /&gt;
=== Liniensensoren ===&lt;br /&gt;
Zum Erkennen der Kreuzungen bei gleichzeitigem folgen der Linie war es notwendig zusätzliche Liniensensoren zu verwenden. Diese wurden mit einer Zusätzplatine in einer Reihe mit den bereits vorhandenen Liniensensoren, allerdings so weit wie möglich linke und rechts außen, montiert. Das einlesen der Analogwerte erfolgt über die beiden Analogeingänge am Stecker X1. Die IR-LEDs sind, analog zu den bestehenden IR-LEDs der vorhandenen Liniensensoren, über den Ausgang 1 am Stecker X4 schaltbar. Dies ist notwendig da jeweils eine Messung mit eingschalteter LED und eine mit ausgeschalteter LED durchgeführt wird. Damit wird der Einfluß des Umgebungslichts korrigiert.&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
Die Aufgaben der Software sollen in möglichst unabhängigen Modulen realisiert werden um das Testen einfacher zu gestalten. Die einzelnen Module sind im Folgenden beschrieben.&lt;br /&gt;
&lt;br /&gt;
=== Architektur ===&lt;br /&gt;
Das Gesamtsystem besteht aus einem zentralen Taktgeber, einem Scheduler und mehreren State Maschinen. Die Kommunikation erfolgt ausschließlich über Events. Die Module können mittels Subscribe einen Event, den ein anderer Modul zur Verfügung steht, abonnieren.&lt;br /&gt;
&lt;br /&gt;
==== Systemtakt, Scheduler ====&lt;br /&gt;
Im Main Modul befindet sich der zentrale Taktgeber der aus dem Interrupt des Timer 2 einen gleichmäßigen Takt von 100Hz erzeugt. Dieser Takt kann von anderen Modulen verwendet werden um zyklische Aufgaben zu erfüllen (z.B. lesen der Liniensensoren). Im Main Modul befindet sich auch der Scheduler der ganz einfach in der Endlosschleife sequenziell jeden Modul aufruft um anstehende Events zu bearbeiten.&lt;br /&gt;
&lt;br /&gt;
==== State / Event Maschinen ====&lt;br /&gt;
Die State / Event Maschinen sind in allen Modulen gleich aufgebaut. Es gibt die folgenden Funktionen (wobei statt &amp;quot;&amp;lt;xx&amp;gt;&amp;quot; das Kürzel des Moduls steht, z.B &amp;quot;dr&amp;quot; für Drive):&lt;br /&gt;
; eine Funktion mit dem Namen &amp;lt;xx&amp;gt;_main (intern)&lt;br /&gt;
: Das ist die eigentliche State Maschine. Wird nicht direkt vom Scheduler aufgerufen sondern über die Funktion &amp;lt;xx&amp;gt;_eventHandler. Hier gibt es ein switch Statement über den aktuellen Zustand und für jeden Zustand ein switch Statement über den empfangenen Event.&lt;br /&gt;
; eine Funktion mit dem Namen &amp;lt;xx&amp;gt;_init (extern)&lt;br /&gt;
: Hier werden Variableninitialisierungen gemacht und die ersten subscribe Aufrufe um Events zu abonnieren. Diese Funktion wird beim Systemstart vom Main Modul aufgerufen.&lt;br /&gt;
; eine Funktion mit dem Namen &amp;lt;xx&amp;gt;_eventHandler (extern)&lt;br /&gt;
: Ist die Funktion die vom Scheduler aufgerufen wird damit die Statemaschine mit dem aktuellen Event, sofern vorhanden, durchlaufen wird.&lt;br /&gt;
; optional Funktionen mit den Namen &amp;lt;xx&amp;gt;_subscribe_&amp;lt;event&amp;gt; und &amp;lt;xx&amp;gt;_unsubscribe_&amp;lt;event&amp;gt; (extern)&lt;br /&gt;
: für jeden Event den dieser Modul verschicken kann ist sowohl eine Subscribe Funktion als auch ein Unsubscribe Funktion vorhanden. Mit diesen Funktionen kann der Event von einem anderen Modul abboniert werden.&lt;br /&gt;
; eine Funktion mit dem Namen &amp;lt;xx&amp;gt;_receiveEvent (intern)&lt;br /&gt;
: ReceiveEvent ist eigentlich eine interne Funktion (wird also nicht im Header File deklariert), der Pointer auf diese Funktion wird allerdings als Callback beim Subscribe übergeben damit der Event dem Modul zugestellt werden kann.&lt;br /&gt;
&lt;br /&gt;
=== Module ===&lt;br /&gt;
Im folgenden sind alle Module und deren Hauptfunktionen aufgelistet.&lt;br /&gt;
&lt;br /&gt;
==== Analog-Modul ====&lt;br /&gt;
Digitalisieren der Analogeingänge&lt;br /&gt;
 Dateien: analog.c&lt;br /&gt;
          analog.h&lt;br /&gt;
Dieser Modul ist abgeleitet von den gleichnamigen Dateien der original NIBObee Bibliothek. Dies war notwendig da wir zusätzliche Liniensensoren verwenden und deren Ansteuerung in gleicher Weise erfolgen sollte. Das bedeutet dass für die entsprechenden Analogeingänge Messungen mit ein- und ausgeschalteten IR-LEDs durchgeführt werden müssen. Außerdem wurde, entsprechend dem Datenblatt des ATMega16 die Behandlung der Messung der Batteriespannung verbessert. Da hier die Referenzspannung umgeschalten wird muss eine Messung verworfen werden bevor mit einem richtigen Ergebnis gerechnet werden kann. Das wurde in der Originalbibliothek nicht berücksichtigt.&lt;br /&gt;
Die einzelnen Werte werden weiterhin über einen A/D-Wandler ermittelt und zwischengespeichert. Es gibt nun 13 analoge Werte (statt bisher 11) die zyklisch digitalisiert werden. Dieser Vorgang wird mit einer Frequenz von ca 117 kHz durchgeführt, d.h. dass jeder dieser Werte ca. alle 111 µs (statt bisher 94 µs) aktualisiert wird.&lt;br /&gt;
&lt;br /&gt;
==== Line-Modul ====&lt;br /&gt;
Ermitteln der Werte der Liniensensoren&lt;br /&gt;
 Dateien: line.c&lt;br /&gt;
          line.h&lt;br /&gt;
Dieser Modul ersetzt die originalen Bibliotheksfunktionen der Liniensensoren. Dies war notwendig da wir zusätzliche Liniensensoren verwenden.&lt;br /&gt;
&lt;br /&gt;
Die Werte der Liniensensoren können nun mit der Funktion&lt;br /&gt;
&amp;lt;code&amp;gt;ln_get(index)&amp;lt;/code&amp;gt;&lt;br /&gt;
gelesen werden. Die Werte selbst werden über den [[NIBObee#Analog-Modul|Analog-Modul]] ermittelt.&lt;br /&gt;
&lt;br /&gt;
==== Bluetooth-Modul ====&lt;br /&gt;
Wickelt die Kommunikation über den Bluetooth Modul ab. Zur Kommunikation wird allerdings nur der USART als Terminal angesprochen, der Bluetooth Stack ist im [[BTM-222]] implementiert.&lt;br /&gt;
 Dateien: bluetooth.c&lt;br /&gt;
          bluetooth.h&lt;br /&gt;
&lt;br /&gt;
==== Common-Modul ====&lt;br /&gt;
Stellt gemeinsame Funktionen zurVerfügung&lt;br /&gt;
 Dateien: common.c&lt;br /&gt;
          common.h&lt;br /&gt;
&lt;br /&gt;
==== Distance-Modul ====&lt;br /&gt;
Behandelt die Odometrie Sensoren&lt;br /&gt;
 Dateien: distance.c&lt;br /&gt;
          distance.h&lt;br /&gt;
&lt;br /&gt;
==== Drive-Modul ====&lt;br /&gt;
Bewegt den NIBObee&lt;br /&gt;
 Dateien: drive.c&lt;br /&gt;
          drive.h&lt;br /&gt;
&lt;br /&gt;
==== Follow-Modul ====&lt;br /&gt;
Ist für die Linienverfolgung zuständig&lt;br /&gt;
 Dateien: follow.c&lt;br /&gt;
          follow.h&lt;br /&gt;
&lt;br /&gt;
==== MaDeCo-Modul ====&lt;br /&gt;
Behandelt das MaDeCo Protokoll&lt;br /&gt;
 Dateien: madeco.c&lt;br /&gt;
          madeco.h&lt;br /&gt;
&lt;br /&gt;
==== Main-Modul ====&lt;br /&gt;
Scheduler und zentraler Taktgeber&lt;br /&gt;
 Dateien: main.c&lt;br /&gt;
          main.h&lt;br /&gt;
&lt;br /&gt;
==== Sensor-Modul ====&lt;br /&gt;
Ist für die &amp;quot;Fühler&amp;quot; zuständig&lt;br /&gt;
 Dateien: follow.c&lt;br /&gt;
          follow.h&lt;br /&gt;
&lt;br /&gt;
=== Applikationen ===&lt;br /&gt;
==== Labyrinth erkunden ====&lt;br /&gt;
&lt;br /&gt;
==== Kürzesten Weg durch Labyrinth ====&lt;br /&gt;
&lt;br /&gt;
==== Kalibrierung ====&lt;br /&gt;
Zur Kalibrierung fährt der NIBObee ein Viereck entlang dass genau die Seitenlänge eines der Felder des Labyrinths hat. Dies ist notwendig um relativ einfach die Karte des Labyrinths erstellen zu können.&lt;br /&gt;
&lt;br /&gt;
=== Protokolle und deren Implementierung ===&lt;br /&gt;
==== [[MaDeCo]] ====&lt;br /&gt;
===== Interface Definition =====&lt;br /&gt;
* int set_opmode(OPMODE)&lt;br /&gt;
* int send_waypoint(WAYPOINT)&lt;br /&gt;
* int direct(DIRECTION[])&lt;br /&gt;
* int ack()&lt;br /&gt;
&lt;br /&gt;
==== Schnittstelle [[MaDeCo]] - RS232-Schnittstelle ====&lt;br /&gt;
* pairing&lt;br /&gt;
* Konfigurations-Commands&lt;br /&gt;
* ack&lt;br /&gt;
* read_command&lt;br /&gt;
* send_command&lt;br /&gt;
&lt;br /&gt;
=== Steuerungssoftware ===&lt;br /&gt;
==== Bluetooth Modul einschalten ====&lt;br /&gt;
Durch Bewegen der &amp;quot;Fühler&amp;quot; der NIBObee nach oben bis Einrasten wird das Bluetooth Modul eingeschalten.&lt;br /&gt;
Daraufhin muss auf eingehenden Bluetooth Traffic gelauscht werden.&lt;br /&gt;
&lt;br /&gt;
==== Blink Codes ====&lt;br /&gt;
Bestimmte Events oder Commands lösen bestimmte Blink- oder Leuchtmuster der Status LEDs aus.&lt;br /&gt;
&#039;&#039;&#039;TODO:&#039;&#039;&#039; Spezifikation der Blink Codes&lt;br /&gt;
&lt;br /&gt;
==== Gerade fahren ====&lt;br /&gt;
Das Problem beim geradeaus fahren ist dass der Roboter von der Spur abweichen kann und dann neu ausgerichtet werden muss. Üblicherweise erfolgt das mit Hilfe der Liniensensoren indem, sobald einer der seitlichen Sensoren die Linie erkennt, durch beschleunigen oder bremsen eines Rades in diese Richtung korrigierend gelenkt wird.&lt;br /&gt;
&lt;br /&gt;
In unserem Fall müssen wir diese Korrektur solange verzögern bis der seitliche Liniensensor eine mögliche Kreuzung passiert hat. Erst danach können wir feststellen ob wir nur die schwarze Linie einer Kreuzung überfahren sind oder ob tatsächlich eine Abweichung vorliegt. Die Anzahl der zu ignorierenden Odometrie-Impule kann folgendermaßen errechnet werden:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;Impulse pro Radumdrehung&amp;gt; / &amp;lt;Radumfang&amp;gt; * &amp;lt;Linienbreite&amp;gt; =&lt;br /&gt;
 20 / 11,8 * 1 = 1,69491525&lt;br /&gt;
&lt;br /&gt;
Wir werden also nur zwei Impulse abwarten bevor wir mit der Korrektur beginnen&lt;br /&gt;
&lt;br /&gt;
===== Funktionsaufteilung =====&lt;br /&gt;
Die Zuständigkeiten für diese Aufgabe sind wie folgt:&lt;br /&gt;
;drive Modul&lt;br /&gt;
:sorgt für die Steuerung der Motoren. Reduzieren der Geschwindigkeit eines Rades um eine ausgleichende Kurve zu fahren und stoppen wenn das Ende der geraden Linie erreicht wurde. Dazu aboniert der Modul die Events des line Modul die eine Abweichung von der Linie melden und vom distance Modul den Event zum fahren der Distanz zwischen Liniensensoren und Achse der Räder.&lt;br /&gt;
;line Modul&lt;br /&gt;
:prüft zyklisch die position der Linie unter dem NIBObee und meldet Abweichungen mittels Events. Dieses Melden wird allerdings verzögert bis zumindest die Breite der Linie überfahren wurde. Dazu aboniert der Modul den Event vom distance Modul den Event zum fahren der der Breite der Linie.&lt;br /&gt;
;distance Modul&lt;br /&gt;
:meldet auf Anforderung das zurücklegen einer Strecke in der Länge der Distanz zwischen Liniensensoren und Achse der Räder oder der Breite der Linie.&lt;br /&gt;
&lt;br /&gt;
==== Kreuzung fahren ====&lt;br /&gt;
An einer Kreuzung wird abgebogen indem der NIBObee zuerst unbeirrt geradeaus fährt bis die Achse genau auf dem Mittelpunkt der Kreuzung zu stehen kommt. Danach wird eine Drehung nach rechts oder links durchgeführt bis sich die Linie wieder genau unter dem mittleren Sensor befindet.&lt;br /&gt;
&lt;br /&gt;
Die Sensoren sind von der Achse 10,4 cm entfernt, eine Radumdrehung bewegt den NIBObee um 11,8 cm weiter und bei dieser Umdrehung werden vom Odometriesensor 20 Impulse abgegeben. Die Linienbreite wird 2 cm betragen. Daher errechnet sich die Strecke die nach Erkennen der Kreuzung gefahren werden muss folgendermassen:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;Impulse pro Radumdrehung&amp;gt; / &amp;lt;Radumfang&amp;gt; * (&amp;lt;Achsabstand&amp;gt; - &amp;lt;halbe Linienbreite&amp;gt;) =&lt;br /&gt;
 20 / 11,8 * (10,4 - 0,5) = 16,779661&lt;br /&gt;
&lt;br /&gt;
Nach passieren der Kreuzung muss der NIBObee also noch 17 Impulse über den Odometriesensor empfangen bevor er stoppt.&lt;br /&gt;
&lt;br /&gt;
== Risikoanalyse ==&lt;br /&gt;
Im Folgenden wird versucht für die möglichen Risikopunkte Alternativen aufzuzeigen.&lt;br /&gt;
&lt;br /&gt;
; ATmega16 ist nicht Leisungsfägig genug&lt;br /&gt;
: Es kann auf den [http://www.nicai-systems.com/de/zubehoer/nibobee-tuning-kit.html Tuning-Kit von Nicai-Systems] zurückgerifffen werden. Dies könnte eine nicht akzeptable Verzögerung verursachen (erkennen, bestellen, NIBObee umrüsten)&lt;br /&gt;
&lt;br /&gt;
: Ein beliebiger PIN-kompatiber Microcontroller ATmega... wird statt dem ATmega16 eingesetzt. Die funktioniert soange der Ersatz-µC mit der Frequenz vom 15 MHz betrieben werden kann. Wichtig ist auch dass es adaptierte Bibliotheken gibt die auf den Ersatz-µC abgestimmt sind (z.B. andere Register oder geänderte Adressen für Register, ...)&lt;br /&gt;
&lt;br /&gt;
; Signale am UART mit Bordspannung im Gegensatz zu RS232-Level (12V)&lt;br /&gt;
: Die Signale am UART werden mit Bordspannung erzeugt/erwartet. Für die Kommunikation mit dem BT-Modul ist daher keine Anpassung durchzuführen.&lt;br /&gt;
&lt;br /&gt;
: Soll zu Testzwecken ein PC über RS232 angeschalten werden ist unbedingt auf die Spannung achten. Möglicherweise verwendet ein USB-RS232 Adapter nicht die 12V sonder nur 5V.&lt;br /&gt;
&lt;br /&gt;
== Open Issues ==&lt;br /&gt;
* Es muss noch überprüft werden ob die NIBObee Hardware ausreichend leistungsfähig ist oder ein Upgrade gemacht werden muss.&lt;br /&gt;
* Wie kann das verlassen der Spur von dem Überfahren einer Kreuzung unterschieden werden? Wenn es hier zu Problemen kommt könnten zwei zusätzliche lichtempfindliche Sensoren rechts und links oder noch ein Element mit drei zusätzlichen Sensoren auf Höhe der Achsen angebracht werden -&amp;gt; Mehraufwand!&lt;br /&gt;
* Soll Aktivierung der BT-Schnittstelle manuell erfolgen?&lt;br /&gt;
* Soll der Betriebsmodus gewählt werden können?&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* [http://www.nicai-systems.de/nibobee.html NIBObee Homepage bei Nicai Systems]&lt;br /&gt;
* [http://download.nicai-systems.com/nibo/Tutorial_NIBObee_20091123.pdf NIBObee - Tutorial zur Programmierung]&lt;br /&gt;
* [http://www.nicai-systems.com/de/zubehoer/nibobee-tuning-kit.html NIBObee - Tuning-Kit von Nicai-Systems]&lt;br /&gt;
* [http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/Der_UART Tutorial zur USART Programmierung]&lt;br /&gt;
[[Kategorie:FH]]&lt;/div&gt;</summary>
		<author><name>Alois</name></author>
	</entry>
	<entry>
		<id>https://wiki.callooh.com/index.php?title=NIBObee&amp;diff=874</id>
		<title>NIBObee</title>
		<link rel="alternate" type="text/html" href="https://wiki.callooh.com/index.php?title=NIBObee&amp;diff=874"/>
		<updated>2011-05-16T13:32:52Z</updated>

		<summary type="html">&lt;p&gt;Alois: /* Communication-Modul */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;NIBObee ist der Roboter der im Projekt [[RoLoMa]] verwendet wird.&lt;br /&gt;
== Technische Daten ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Art&lt;br /&gt;
!Typ&lt;br /&gt;
!Bemerkung&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|Mikrocontroller&lt;br /&gt;
|ATMEL ATMega16, , 15 MHz&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|Integrierter UART wird verwendet um den Bluetooth Modul anzubinden.&lt;br /&gt;
&lt;br /&gt;
Sollte die Leistung nicht ausreichen kann entweder der Erweiterungssatz von Nicai-Systems verwendet werden oder nur der Controller wird gegen einen Pinkompatiblen Typ ausgetauscht (z.B. ATMega32, ATMega644, ATMega1284)&lt;br /&gt;
|-&lt;br /&gt;
|Flash:	16	kB&lt;br /&gt;
|-&lt;br /&gt;
|...&lt;br /&gt;
|-&lt;br /&gt;
|...&lt;br /&gt;
|...&lt;br /&gt;
|...&lt;br /&gt;
|-&lt;br /&gt;
|...&lt;br /&gt;
|...&lt;br /&gt;
|...&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|Maße&lt;br /&gt;
|Radumfang: 11,8 cm&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|Diese Maße sind wichtig um den NIBObee so exakt wie möglich am Mittelpunkt des Labyrinthfeldes positionieren zu können.&lt;br /&gt;
|-&lt;br /&gt;
|Abstand Liniensensor zu Radachse: 10,4 cm&lt;br /&gt;
|-&lt;br /&gt;
|Impulse pro Umdrehung: 20&lt;br /&gt;
|}&lt;br /&gt;
=== Ports ===&lt;br /&gt;
Über den UART wird der Bluetooth Modul [[BTM-222]] angebunden. Am NIObee ist diese Schnittstelle am Port X5 verfügbar&lt;br /&gt;
&lt;br /&gt;
=== Resourcen ===&lt;br /&gt;
Folgende Resourcen werden für unsere Implementierung verwendet (&#039;&#039;kursiv&#039;&#039; markierte Resourcen werden bereits durch die Bibliothek belegt):&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Resource&lt;br /&gt;
!Verwendung&lt;br /&gt;
!Interrupts&lt;br /&gt;
!Dateien&lt;br /&gt;
|-&lt;br /&gt;
|Timer 1&lt;br /&gt;
|Motor PWM&lt;br /&gt;
|TIMER1_COMPA_vect, TIMER1_COMPB_vect&lt;br /&gt;
|motpwm.c&lt;br /&gt;
|-&lt;br /&gt;
|ADC&lt;br /&gt;
|Analog, Line&lt;br /&gt;
|ADC_vect&lt;br /&gt;
|analog.c, line.c&lt;br /&gt;
|-&lt;br /&gt;
|EEPROM&lt;br /&gt;
|Line (12 Byte)&lt;br /&gt;
|&lt;br /&gt;
|line.c&lt;br /&gt;
|-&lt;br /&gt;
|Ext. IRQ&lt;br /&gt;
|Odometrie&lt;br /&gt;
|INT0_vect, INT1_vect&lt;br /&gt;
|odometry.c&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Eine für den NIBObee allgemein gültige Auflistung findet man im [http://www.nibo-roboter.de/wiki/NIBObee/Lib/Resourcen NIBObee Wiki].&lt;br /&gt;
&lt;br /&gt;
=== Besondere Erkenntnisse ===&lt;br /&gt;
Es hat sich, nach einigen Fehlschlägen bei der Linienverfolung, herausgestellt dass es ungünstig ist den NIBObee in eine optisch ansprechende waagrechte Position zu bringen indem eine kleinere Halbkugel auf der Unterseite angebracht wird. Der Grund: Nur mit der original Halbkugel und dem damit nach vorne ansteigenden Bodenabstand sind die IR-LED&#039;s weit genug vom Boden entfernt um einen Lichtkegen zu erzeugen der auch vernünftig vom Phototransistor erfasst werden kann. Bei waagrechter Ausrichtung des NIBObee ist dieser Kegel, aufgrund des geringeren Abstands zum Boden, zu klein!&lt;br /&gt;
&lt;br /&gt;
=== Bibliotheksfunktionen ===&lt;br /&gt;
==== Liniensensoren ====&lt;br /&gt;
Die original NIBObee Biliothek wird nicht verwendet. Wurde durch eine eigene Implementierung im [[NIBObee#Line-Modul|Line-Modul]] ersetzt.&lt;br /&gt;
&lt;br /&gt;
==== Motorensteuerung ====&lt;br /&gt;
 motpwm.h&lt;br /&gt;
Die Motoren des NIBObee werden mit PWM ([http://de.wikipedia.org/wiki/Pulsweitenmodulation Pulsweitenmodulation]) angesteuert. Das garantiert natürlich ohne Regelung noch keinen Gleichlauf der beiden Motoren was sich je nach Zustand des Getriebes in einer weiteren oder engernen Kurve zeigt.&lt;br /&gt;
 motpid.h&lt;br /&gt;
Hier stehen Funktionen zur Verfügung die mit Hilfe der Odometrie die Motoren regeln. Diese Funktionen sind für unsere Zwecke allerdings nicht geeignet.&lt;br /&gt;
&lt;br /&gt;
== Aufgaben ==&lt;br /&gt;
Folgende Aufgaben sind im Rahmen des Projekts [[RoLoMa]] vom NIBObee Team zu lösen:&lt;br /&gt;
* Herstellung der Bluetooth Hardware-Erweiterung&lt;br /&gt;
* Softwaremodul zum Bedienen der Bluetooth-Schnittstelle via RS232&lt;br /&gt;
* Softwaremodul zum Erkennen der Linie im Labyrinth und im speziellen der unterschiedlichen Kreuzungstypen&lt;br /&gt;
* Messen des zurückgelegten Weges&lt;br /&gt;
* Steuerung, die den Abstand des Sensors zur Radachse berücksichtigt um den Roboter an der korrekten Stelle um die eigene Achse zu drehen&lt;br /&gt;
* Erstellen eines Abbilds des Labyrinths im Speicher und navigieren bis der Roboter wieder am Startpunkt gelandet ist (z.B. immer Links abbiegen)&lt;br /&gt;
* Implementieren des [[MaDeCo]] Protokolls&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
&lt;br /&gt;
=== Bluetooth ===&lt;br /&gt;
Der Bluetooth Modul ist im Detail auf den Seiten des [[BTM-222]] beschrieben.&lt;br /&gt;
&lt;br /&gt;
=== Liniensensoren ===&lt;br /&gt;
Zum Erkennen der Kreuzungen bei gleichzeitigem folgen der Linie war es notwendig zusätzliche Liniensensoren zu verwenden. Diese wurden mit einer Zusätzplatine in einer Reihe mit den bereits vorhandenen Liniensensoren, allerdings so weit wie möglich linke und rechts außen, montiert. Das einlesen der Analogwerte erfolgt über die beiden Analogeingänge am Stecker X1. Die IR-LEDs sind, analog zu den bestehenden IR-LEDs der vorhandenen Liniensensoren, über den Ausgang 1 am Stecker X4 schaltbar. Dies ist notwendig da jeweils eine Messung mit eingschalteter LED und eine mit ausgeschalteter LED durchgeführt wird. Damit wird der Einfluß des Umgebungslichts korrigiert.&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
Die Aufgaben der Software sollen in möglichst unabhängigen Modulen realisiert werden um das Testen einfacher zu gestalten. Die einzelnen Module sind im Folgenden beschrieben.&lt;br /&gt;
&lt;br /&gt;
=== Architektur ===&lt;br /&gt;
Das Gesamtsystem besteht aus einem zentralen Taktgeber, einem Scheduler und mehreren State Maschinen. Die Kommunikation erfolgt ausschließlich über Events. Die Module können mittels Subscribe einen Event, den ein anderer Modul zur Verfügung steht, abonnieren.&lt;br /&gt;
&lt;br /&gt;
==== Systemtakt, Scheduler ====&lt;br /&gt;
Im Main Modul befindet sich der zentrale Taktgeber der aus dem Interrupt des Timer 2 einen gleichmäßigen Takt von 100Hz erzeugt. Dieser Takt kann von anderen Modulen verwendet werden um zyklische Aufgaben zu erfüllen (z.B. lesen der Liniensensoren). Im Main Modul befindet sich auch der Scheduler der ganz einfach in der Endlosschleife sequenziell jeden Modul aufruft um anstehende Events zu bearbeiten.&lt;br /&gt;
&lt;br /&gt;
==== State / Event Maschinen ====&lt;br /&gt;
Die State / Event Maschinen sind in allen Modulen gleich aufgebaut. Es gibt die folgenden Funktionen (wobei statt &amp;quot;&amp;lt;xx&amp;gt;&amp;quot; das Kürzel des Moduls steht, z.B &amp;quot;dr&amp;quot; für Drive):&lt;br /&gt;
; eine Funktion mit dem Namen &amp;lt;xx&amp;gt;_main (intern)&lt;br /&gt;
: Das ist die eigentliche State Maschine. Wird nicht direkt vom Scheduler aufgerufen sondern über die Funktion &amp;lt;xx&amp;gt;_eventHandler. Hier gibt es ein switch Statement über den aktuellen Zustand und für jeden Zustand ein switch Statement über den empfangenen Event.&lt;br /&gt;
; eine Funktion mit dem Namen &amp;lt;xx&amp;gt;_init (extern)&lt;br /&gt;
: Hier werden Variableninitialisierungen gemacht und die ersten subscribe Aufrufe um Events zu abonnieren. Diese Funktion wird beim Systemstart vom Main Modul aufgerufen.&lt;br /&gt;
; eine Funktion mit dem Namen &amp;lt;xx&amp;gt;_eventHandler (extern)&lt;br /&gt;
: Ist die Funktion die vom Scheduler aufgerufen wird damit die Statemaschine mit dem aktuellen Event, sofern vorhanden, durchlaufen wird.&lt;br /&gt;
; optional Funktionen mit den Namen &amp;lt;xx&amp;gt;_subscribe_&amp;lt;event&amp;gt; und &amp;lt;xx&amp;gt;_unsubscribe_&amp;lt;event&amp;gt; (extern)&lt;br /&gt;
: für jeden Event den dieser Modul verschicken kann ist sowohl eine Subscribe Funktion als auch ein Unsubscribe Funktion vorhanden. Mit diesen Funktionen kann der Event von einem anderen Modul abboniert werden.&lt;br /&gt;
; eine Funktion mit dem Namen &amp;lt;xx&amp;gt;_receiveEvent (intern)&lt;br /&gt;
: ReceiveEvent ist eigentlich eine interne Funktion (wird also nicht im Header File deklariert), der Pointer auf diese Funktion wird allerdings als Callback beim Subscribe übergeben damit der Event dem Modul zugestellt werden kann.&lt;br /&gt;
&lt;br /&gt;
=== Module ===&lt;br /&gt;
Im folgenden sind alle Module und deren Hauptfunktionen aufgelistet.&lt;br /&gt;
&lt;br /&gt;
==== Analog-Modul ====&lt;br /&gt;
Digitalisieren der Analogeingänge&lt;br /&gt;
 Dateien: analog.c&lt;br /&gt;
          analog.h&lt;br /&gt;
Dieser Modul ist abgeleitet von den gleichnamigen Dateien der original NIBObee Bibliothek. Dies war notwendig da wir zusätzliche Liniensensoren verwenden und deren Ansteuerung in gleicher Weise erfolgen sollte. Das bedeutet dass für die entsprechenden Analogeingänge Messungen mit ein- und ausgeschalteten IR-LEDs durchgeführt werden müssen. Außerdem wurde, entsprechend dem Datenblatt des ATMega16 die Behandlung der Messung der Batteriespannung verbessert. Da hier die Referenzspannung umgeschalten wird muss eine Messung verworfen werden bevor mit einem richtigen Ergebnis gerechnet werden kann. Das wurde in der Originalbibliothek nicht berücksichtigt.&lt;br /&gt;
Die einzelnen Werte werden weiterhin über einen A/D-Wandler ermittelt und zwischengespeichert. Es gibt nun 13 analoge Werte (statt bisher 11) die zyklisch digitalisiert werden. Dieser Vorgang wird mit einer Frequenz von ca 117 kHz durchgeführt, d.h. dass jeder dieser Werte ca. alle 111 µs (statt bisher 94 µs) aktualisiert wird.&lt;br /&gt;
&lt;br /&gt;
==== Line-Modul ====&lt;br /&gt;
Ermitteln der Werte der Liniensensoren&lt;br /&gt;
 Dateien: line.c&lt;br /&gt;
          line.h&lt;br /&gt;
Dieser Modul ersetzt die originalen Bibliotheksfunktionen der Liniensensoren. Dies war notwendig da wir zusätzliche Liniensensoren verwenden.&lt;br /&gt;
&lt;br /&gt;
Die Werte der Liniensensoren können nun mit der Funktion&lt;br /&gt;
&amp;lt;code&amp;gt;ln_get(index)&amp;lt;/code&amp;gt;&lt;br /&gt;
gelesen werden. Die Werte selbst werden über den [[NIBObee#Analog-Modul|Analog-Modul]] ermittelt.&lt;br /&gt;
&lt;br /&gt;
==== Bluetooth-Modul ====&lt;br /&gt;
Wickelt die Kommunikation über den Bluetooth Modul ab. Zur Kommunikation wird allerdings nur der USART als Terminal angesprochen, der Bluetooth Stack ist in BTM222 implementiert.&lt;br /&gt;
 Dateien: bluetooth.c&lt;br /&gt;
          bluetooth.h&lt;br /&gt;
&lt;br /&gt;
==== Common-Modul ====&lt;br /&gt;
Stellt gemeinsame Funktionen zurVerfügung&lt;br /&gt;
 Dateien: common.c&lt;br /&gt;
          common.h&lt;br /&gt;
&lt;br /&gt;
==== Distance-Modul ====&lt;br /&gt;
Behandelt die Odometrie Sensoren&lt;br /&gt;
 Dateien: distance.c&lt;br /&gt;
          distance.h&lt;br /&gt;
&lt;br /&gt;
==== Drive-Modul ====&lt;br /&gt;
Bewegt den NIBObee&lt;br /&gt;
 Dateien: drive.c&lt;br /&gt;
          drive.h&lt;br /&gt;
&lt;br /&gt;
==== Follow-Modul ====&lt;br /&gt;
Ist für die Linienverfolgung zuständig&lt;br /&gt;
 Dateien: follow.c&lt;br /&gt;
          follow.h&lt;br /&gt;
&lt;br /&gt;
==== MaDeCo-Modul ====&lt;br /&gt;
Behandelt das MaDeCo Protokoll&lt;br /&gt;
 Dateien: madeco.c&lt;br /&gt;
          madeco.h&lt;br /&gt;
&lt;br /&gt;
==== Main-Modul ====&lt;br /&gt;
Scheduler und zentraler Taktgeber&lt;br /&gt;
 Dateien: main.c&lt;br /&gt;
          main.h&lt;br /&gt;
&lt;br /&gt;
==== Sensor-Modul ====&lt;br /&gt;
Ist für die &amp;quot;Fühler&amp;quot; zuständig&lt;br /&gt;
 Dateien: follow.c&lt;br /&gt;
          follow.h&lt;br /&gt;
&lt;br /&gt;
=== Applikationen ===&lt;br /&gt;
==== Labyrinth erkunden ====&lt;br /&gt;
&lt;br /&gt;
==== Kürzesten Weg durch Labyrinth ====&lt;br /&gt;
&lt;br /&gt;
==== Kalibrierung ====&lt;br /&gt;
Zur Kalibrierung fährt der NIBObee ein Viereck entlang dass genau die Seitenlänge eines der Felder des Labyrinths hat. Dies ist notwendig um relativ einfach die Karte des Labyrinths erstellen zu können.&lt;br /&gt;
&lt;br /&gt;
=== Protokolle und deren Implementierung ===&lt;br /&gt;
==== [[MaDeCo]] ====&lt;br /&gt;
===== Interface Definition =====&lt;br /&gt;
* int set_opmode(OPMODE)&lt;br /&gt;
* int send_waypoint(WAYPOINT)&lt;br /&gt;
* int direct(DIRECTION[])&lt;br /&gt;
* int ack()&lt;br /&gt;
&lt;br /&gt;
==== Schnittstelle [[MaDeCo]] - RS232-Schnittstelle ====&lt;br /&gt;
* pairing&lt;br /&gt;
* Konfigurations-Commands&lt;br /&gt;
* ack&lt;br /&gt;
* read_command&lt;br /&gt;
* send_command&lt;br /&gt;
&lt;br /&gt;
=== Steuerungssoftware ===&lt;br /&gt;
==== Bluetooth Modul einschalten ====&lt;br /&gt;
Durch Bewegen der &amp;quot;Fühler&amp;quot; der NIBObee nach oben bis Einrasten wird das Bluetooth Modul eingeschalten.&lt;br /&gt;
Daraufhin muss auf eingehenden Bluetooth Traffic gelauscht werden.&lt;br /&gt;
&lt;br /&gt;
==== Blink Codes ====&lt;br /&gt;
Bestimmte Events oder Commands lösen bestimmte Blink- oder Leuchtmuster der Status LEDs aus.&lt;br /&gt;
&#039;&#039;&#039;TODO:&#039;&#039;&#039; Spezifikation der Blink Codes&lt;br /&gt;
&lt;br /&gt;
==== Gerade fahren ====&lt;br /&gt;
Das Problem beim geradeaus fahren ist dass der Roboter von der Spur abweichen kann und dann neu ausgerichtet werden muss. Üblicherweise erfolgt das mit Hilfe der Liniensensoren indem, sobald einer der seitlichen Sensoren die Linie erkennt, durch beschleunigen oder bremsen eines Rades in diese Richtung korrigierend gelenkt wird.&lt;br /&gt;
&lt;br /&gt;
In unserem Fall müssen wir diese Korrektur solange verzögern bis der seitliche Liniensensor eine mögliche Kreuzung passiert hat. Erst danach können wir feststellen ob wir nur die schwarze Linie einer Kreuzung überfahren sind oder ob tatsächlich eine Abweichung vorliegt. Die Anzahl der zu ignorierenden Odometrie-Impule kann folgendermaßen errechnet werden:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;Impulse pro Radumdrehung&amp;gt; / &amp;lt;Radumfang&amp;gt; * &amp;lt;Linienbreite&amp;gt; =&lt;br /&gt;
 20 / 11,8 * 1 = 1,69491525&lt;br /&gt;
&lt;br /&gt;
Wir werden also nur zwei Impulse abwarten bevor wir mit der Korrektur beginnen&lt;br /&gt;
&lt;br /&gt;
===== Funktionsaufteilung =====&lt;br /&gt;
Die Zuständigkeiten für diese Aufgabe sind wie folgt:&lt;br /&gt;
;drive Modul&lt;br /&gt;
:sorgt für die Steuerung der Motoren. Reduzieren der Geschwindigkeit eines Rades um eine ausgleichende Kurve zu fahren und stoppen wenn das Ende der geraden Linie erreicht wurde. Dazu aboniert der Modul die Events des line Modul die eine Abweichung von der Linie melden und vom distance Modul den Event zum fahren der Distanz zwischen Liniensensoren und Achse der Räder.&lt;br /&gt;
;line Modul&lt;br /&gt;
:prüft zyklisch die position der Linie unter dem NIBObee und meldet Abweichungen mittels Events. Dieses Melden wird allerdings verzögert bis zumindest die Breite der Linie überfahren wurde. Dazu aboniert der Modul den Event vom distance Modul den Event zum fahren der der Breite der Linie.&lt;br /&gt;
;distance Modul&lt;br /&gt;
:meldet auf Anforderung das zurücklegen einer Strecke in der Länge der Distanz zwischen Liniensensoren und Achse der Räder oder der Breite der Linie.&lt;br /&gt;
&lt;br /&gt;
==== Kreuzung fahren ====&lt;br /&gt;
An einer Kreuzung wird abgebogen indem der NIBObee zuerst unbeirrt geradeaus fährt bis die Achse genau auf dem Mittelpunkt der Kreuzung zu stehen kommt. Danach wird eine Drehung nach rechts oder links durchgeführt bis sich die Linie wieder genau unter dem mittleren Sensor befindet.&lt;br /&gt;
&lt;br /&gt;
Die Sensoren sind von der Achse 10,4 cm entfernt, eine Radumdrehung bewegt den NIBObee um 11,8 cm weiter und bei dieser Umdrehung werden vom Odometriesensor 20 Impulse abgegeben. Die Linienbreite wird 2 cm betragen. Daher errechnet sich die Strecke die nach Erkennen der Kreuzung gefahren werden muss folgendermassen:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;Impulse pro Radumdrehung&amp;gt; / &amp;lt;Radumfang&amp;gt; * (&amp;lt;Achsabstand&amp;gt; - &amp;lt;halbe Linienbreite&amp;gt;) =&lt;br /&gt;
 20 / 11,8 * (10,4 - 0,5) = 16,779661&lt;br /&gt;
&lt;br /&gt;
Nach passieren der Kreuzung muss der NIBObee also noch 17 Impulse über den Odometriesensor empfangen bevor er stoppt.&lt;br /&gt;
&lt;br /&gt;
== Risikoanalyse ==&lt;br /&gt;
Im Folgenden wird versucht für die möglichen Risikopunkte Alternativen aufzuzeigen.&lt;br /&gt;
&lt;br /&gt;
; ATmega16 ist nicht Leisungsfägig genug&lt;br /&gt;
: Es kann auf den [http://www.nicai-systems.com/de/zubehoer/nibobee-tuning-kit.html Tuning-Kit von Nicai-Systems] zurückgerifffen werden. Dies könnte eine nicht akzeptable Verzögerung verursachen (erkennen, bestellen, NIBObee umrüsten)&lt;br /&gt;
&lt;br /&gt;
: Ein beliebiger PIN-kompatiber Microcontroller ATmega... wird statt dem ATmega16 eingesetzt. Die funktioniert soange der Ersatz-µC mit der Frequenz vom 15 MHz betrieben werden kann. Wichtig ist auch dass es adaptierte Bibliotheken gibt die auf den Ersatz-µC abgestimmt sind (z.B. andere Register oder geänderte Adressen für Register, ...)&lt;br /&gt;
&lt;br /&gt;
; Signale am UART mit Bordspannung im Gegensatz zu RS232-Level (12V)&lt;br /&gt;
: Die Signale am UART werden mit Bordspannung erzeugt/erwartet. Für die Kommunikation mit dem BT-Modul ist daher keine Anpassung durchzuführen.&lt;br /&gt;
&lt;br /&gt;
: Soll zu Testzwecken ein PC über RS232 angeschalten werden ist unbedingt auf die Spannung achten. Möglicherweise verwendet ein USB-RS232 Adapter nicht die 12V sonder nur 5V.&lt;br /&gt;
&lt;br /&gt;
== Open Issues ==&lt;br /&gt;
* Es muss noch überprüft werden ob die NIBObee Hardware ausreichend leistungsfähig ist oder ein Upgrade gemacht werden muss.&lt;br /&gt;
* Wie kann das verlassen der Spur von dem Überfahren einer Kreuzung unterschieden werden? Wenn es hier zu Problemen kommt könnten zwei zusätzliche lichtempfindliche Sensoren rechts und links oder noch ein Element mit drei zusätzlichen Sensoren auf Höhe der Achsen angebracht werden -&amp;gt; Mehraufwand!&lt;br /&gt;
* Soll Aktivierung der BT-Schnittstelle manuell erfolgen?&lt;br /&gt;
* Soll der Betriebsmodus gewählt werden können?&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* [http://www.nicai-systems.de/nibobee.html NIBObee Homepage bei Nicai Systems]&lt;br /&gt;
* [http://download.nicai-systems.com/nibo/Tutorial_NIBObee_20091123.pdf NIBObee - Tutorial zur Programmierung]&lt;br /&gt;
* [http://www.nicai-systems.com/de/zubehoer/nibobee-tuning-kit.html NIBObee - Tuning-Kit von Nicai-Systems]&lt;br /&gt;
* [http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/Der_UART Tutorial zur USART Programmierung]&lt;br /&gt;
[[Kategorie:FH]]&lt;/div&gt;</summary>
		<author><name>Alois</name></author>
	</entry>
	<entry>
		<id>https://wiki.callooh.com/index.php?title=MaDeCo&amp;diff=873</id>
		<title>MaDeCo</title>
		<link rel="alternate" type="text/html" href="https://wiki.callooh.com/index.php?title=MaDeCo&amp;diff=873"/>
		<updated>2011-05-15T14:26:16Z</updated>

		<summary type="html">&lt;p&gt;Alois: /* Format */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= MaDeCo - Protokoll zur Kommunikation im [[RoLoMa]] Projekt =&lt;br /&gt;
&lt;br /&gt;
MaDeCo ist ein sehr einfaches textbasiertes Protokoll für die Kommunikation zwischen den Beteiligten im [[RoLoMa]] Projekt, den [[NIBObee]] Einheiten und der Basisstation, dem [[LPC2478]].&lt;br /&gt;
&lt;br /&gt;
== Rollen ==&lt;br /&gt;
Es gibt unter den Beteiligten zwei festgelegte Rollen, Sender und Empfänger. Der Sender überträgt Information, der Empfänger hingegen hat eine überwiegend passive Funktion, er quittiert Nachrichten und übermittelt einen Acknowledge Code.&lt;br /&gt;
Während der Kommunikation werden diese Rollen nicht gewechselt.&lt;br /&gt;
&lt;br /&gt;
== Format ==&lt;br /&gt;
Eine Nachricht besteht aus genau zwei Datensätzen, ein Datensatz besteht jeweils aus einem 3 Zeichen breiten Header Teil, und einem 2 Zeichen breiten Datenteil. Für kleinere Datenteile erfolgt ein Padding mit Leerzeichen.&lt;br /&gt;
&lt;br /&gt;
Beide Teile der Nachricht werden unmittelbar hintereinander gesendet, also z.B. als &#039;&#039;SEQ13OPMSM&#039;&#039;. In untenstehenden Beispielen werden die beiden Teile der Nachricht allerdings durch einen Zeilenumbruch getrennt, um die Nachricht lesbarer zu machen.&lt;br /&gt;
&lt;br /&gt;
Eine Nachricht, wie sie ein Sender erstellt, besteht aus:&lt;br /&gt;
 &amp;lt;Sequence&amp;gt;&lt;br /&gt;
 &amp;lt;Command&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;Sequence&amp;gt; besteht aus dem Header SEQ, der Datenteil aus einer Nummer zwischen 1 und 99.&lt;br /&gt;
 &amp;lt;Command&amp;gt; besteht aus dem 3 Zeichen langen Command-Code, und einem entsprechenden Datenteil.&lt;br /&gt;
&lt;br /&gt;
Eine Nachricht muss mit einer Antwort quittiert werden. Diese besteht aus:&lt;br /&gt;
 &amp;lt;Acknowledge&amp;gt;&lt;br /&gt;
 &amp;lt;Acknowledge Code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;Acknowledge&amp;gt; besteht aus dem Header ACK und der zu bestätigenden Sequence Number.&lt;br /&gt;
 &amp;lt;Acknowledge Code&amp;gt; besteht aus den Header ACC und dem Code.&lt;br /&gt;
&lt;br /&gt;
Beispiel sind be den jeweiligen [[MaDeCo#Use Cases|Use Cases]] zu finden.&lt;br /&gt;
&lt;br /&gt;
=== Commands ===&lt;br /&gt;
 EOC ... end of communication, signalisiert das Ende einer Kommunikation&lt;br /&gt;
 OPM ... Operation Mode (siehe Betriebsmodus)&lt;br /&gt;
 WAP ... Waypoint (siehe Wegpunkte)&lt;br /&gt;
 DIR ... Angabe der Richtung im GO Betriebsmodus (siehe Kürzester Weg)&lt;br /&gt;
&lt;br /&gt;
=== Acknowledge Codes ===&lt;br /&gt;
 00 .. OK, Command acknowledged&lt;br /&gt;
 01 .. unknown Command&lt;br /&gt;
 02 .. invalid data&lt;br /&gt;
 11 .. unbekannter Betriebsmodus (e.g. OPMXX)&lt;br /&gt;
 21 .. Command refused, Labyrinth erkunden (OPMSM) vor [[NIBObee#Kalibrierung]] (OPMGA)&lt;br /&gt;
&lt;br /&gt;
=== Betriebsmodus ===&lt;br /&gt;
 GA ... Kalibrieren (siehe [[NIBObee#Kalibrierung]])&lt;br /&gt;
 SM ... Labyrinth erkunden&lt;br /&gt;
 GO ... kürzesten Weg nehmen (siehe Kürzester Weg)&lt;br /&gt;
&lt;br /&gt;
=== Wegpunkte ===&lt;br /&gt;
Die Übertragung eines Wegpunkts erfolgt durch Angabe der Richtung (S,W,N,E), gefolgt von der Anzahl der Streckenteile.&lt;br /&gt;
 Beispiel: WAPS4   der Wegpunkt befindet sich 4 Streckenteile südlich des zuletzt übertragenen Wegpunkts&lt;br /&gt;
&lt;br /&gt;
== Ablauf ==&lt;br /&gt;
Im [[RoLoMa]] Projekt muss die Kommunikation aus Nachricht-Antwort Sequenzen bestehen. Wird eine gesendete Nachricht nicht bestätigt, erfolgt eine Neuübertragung nach dem RETRANSMISSION_TIMEOUT Interval.&lt;br /&gt;
Erfolgt auch nach RETRANSMISSION_COUNT Wiederholungen keine Antwort, wird die Übertragung abgebrochen und ein Fehler signalisiert.&lt;br /&gt;
&lt;br /&gt;
Kommunikationen überschneiden sich nicht, das bedeutet, es findet zu jedem Zeitpunkt nur eine Kommunikation zwischen den Beteiligten statt. Daher ist auch zu jedem Zeitpunkt genau ein Teilnehmer der Sender, und ein Teilnehmer der Empfänger.&lt;br /&gt;
&lt;br /&gt;
== Use Cases ==&lt;br /&gt;
Im folgenden werden Beispiele für die Kommunikation der unterschiedlichen Betriebsarten dargestellt. Daten vom Borad werden normal, die von der NIBObee &#039;&#039;&#039;fett&#039;&#039;&#039; dargestellt.&lt;br /&gt;
&lt;br /&gt;
=== Kalibrieren ===&lt;br /&gt;
Beim Kalibrieren wird das Kommando vom Board an die NIBObee geschickt und auch bei Erhalt sofort quittiert (sonst würde es zu einem Timeout kommen). Nachdem die Kalibrierung abgeschlossen ist wird die Verbindung getrennt.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Beispiel:&#039;&#039;&lt;br /&gt;
 SEQ1 &lt;br /&gt;
 OPMGA&lt;br /&gt;
 &lt;br /&gt;
 &#039;&#039;&#039;ACK1&#039;&#039;&#039; &lt;br /&gt;
 &#039;&#039;&#039;ACC00&#039;&#039;&#039;&lt;br /&gt;
 &lt;br /&gt;
 &#039;&#039;&#039;SEQ2&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;EOC&#039;&#039;&#039;&lt;br /&gt;
 &lt;br /&gt;
 ACK2 &lt;br /&gt;
 ACC00&lt;br /&gt;
&lt;br /&gt;
=== Labyrinth erkunden===&lt;br /&gt;
Das Kommando wird vom Board an die NIBObee geschickt und auch bei Erhalt sofort quittiert (es muss vorher allerdings eine Kalibrierung durchgeführt worden sein). Danach werden laufend die Punkte geschickt die abgefahren werden. Wenn das ganze Labyrinth erfasst wurde wir die Kommunikation wieder beendet.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Beispiel:&#039;&#039;&lt;br /&gt;
 SEQ1 &lt;br /&gt;
 OPMSM&lt;br /&gt;
 &lt;br /&gt;
 &#039;&#039;&#039;ACK1&#039;&#039;&#039; &lt;br /&gt;
 &#039;&#039;&#039;ACC00&#039;&#039;&#039;&lt;br /&gt;
 &lt;br /&gt;
 &#039;&#039;&#039;SEQ2&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;WAPN3&#039;&#039;&#039;&lt;br /&gt;
 &lt;br /&gt;
 ACK2 &lt;br /&gt;
 ACC00&lt;br /&gt;
 &lt;br /&gt;
 &#039;&#039;&#039;SEQ3&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;WAPO1&#039;&#039;&#039;&lt;br /&gt;
 &lt;br /&gt;
 ...&lt;br /&gt;
 &lt;br /&gt;
 &#039;&#039;&#039;SEQ32&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;EOC&#039;&#039;&#039;&lt;br /&gt;
 &lt;br /&gt;
 ACK32 &lt;br /&gt;
 ACC00&lt;br /&gt;
&lt;br /&gt;
=== Kürzester Weg === &lt;br /&gt;
Hier werden Richtungsanweisungen übertragen, die es der [[NIBObee]] ermöglichen, in einem Labyrinth den kürzesten Weg zu nehmen.&lt;br /&gt;
Beispiel (ohne ACKs), der kürzeste Weg wird als S(üd)-N(ord)-W(est)-S(üd) angegeben:&lt;br /&gt;
 SEQ1 &lt;br /&gt;
 OPMGO&lt;br /&gt;
 &lt;br /&gt;
 SEQ2 &lt;br /&gt;
 DIRS &lt;br /&gt;
 &lt;br /&gt;
 SEQ3 &lt;br /&gt;
 DIRN &lt;br /&gt;
 &lt;br /&gt;
 SEQ4 &lt;br /&gt;
 DIRW &lt;br /&gt;
 &lt;br /&gt;
 SEQ5 &lt;br /&gt;
 DIRS &lt;br /&gt;
 &lt;br /&gt;
 SEQ6 &lt;br /&gt;
 EOC&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:FH]]&lt;/div&gt;</summary>
		<author><name>Alois</name></author>
	</entry>
	<entry>
		<id>https://wiki.callooh.com/index.php?title=MaDeCo&amp;diff=872</id>
		<title>MaDeCo</title>
		<link rel="alternate" type="text/html" href="https://wiki.callooh.com/index.php?title=MaDeCo&amp;diff=872"/>
		<updated>2011-05-15T14:25:03Z</updated>

		<summary type="html">&lt;p&gt;Alois: /* Format */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= MaDeCo - Protokoll zur Kommunikation im [[RoLoMa]] Projekt =&lt;br /&gt;
&lt;br /&gt;
MaDeCo ist ein sehr einfaches textbasiertes Protokoll für die Kommunikation zwischen den Beteiligten im [[RoLoMa]] Projekt, den [[NIBObee]] Einheiten und der Basisstation, dem [[LPC2478]].&lt;br /&gt;
&lt;br /&gt;
== Rollen ==&lt;br /&gt;
Es gibt unter den Beteiligten zwei festgelegte Rollen, Sender und Empfänger. Der Sender überträgt Information, der Empfänger hingegen hat eine überwiegend passive Funktion, er quittiert Nachrichten und übermittelt einen Acknowledge Code.&lt;br /&gt;
Während der Kommunikation werden diese Rollen nicht gewechselt.&lt;br /&gt;
&lt;br /&gt;
== Format ==&lt;br /&gt;
Eine Nachricht besteht aus genau zwei Datensätzen, ein Datensatz besteht jeweils aus einem 3 Zeichen breiten Header Teil, und einem 2 Zeichen breiten Datenteil. Für kleinere Datenteile erfolgt ein Padding mit Leerzeichen.&lt;br /&gt;
&lt;br /&gt;
Beide Teile der Nachricht werden unmittelbar hintereinander gesendet, also z.B. als &#039;&#039;SEQ13OPMSM&#039;&#039;. In untenstehenden Beispielen werden die beiden Teile der Nachricht allerdings durch einen Zeilenumbruch getrennt, um die Nachricht lesbarer zu machen.&lt;br /&gt;
&lt;br /&gt;
Eine Nachricht, wie sie ein Sender erstellt, besteht aus:&lt;br /&gt;
 &amp;lt;Sequence&amp;gt;&lt;br /&gt;
 &amp;lt;Command&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;Sequence&amp;gt; besteht aus dem Header SEQ, der Datenteil aus einer Nummer zwischen 1 und 99.&lt;br /&gt;
 &amp;lt;Command&amp;gt; besteht aus dem 3 Zeichen langen Command-Code, und einem entsprechenden Datenteil.&lt;br /&gt;
&lt;br /&gt;
Eine Nachricht muss mit einer Antwort quittiert werden. Diese besteht aus:&lt;br /&gt;
 &amp;lt;Acknowledge&amp;gt;&lt;br /&gt;
 &amp;lt;Acknowledge Code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;Acknowledge&amp;gt; besteht aus dem Header ACK und der zu bestätigenden Sequence Number.&lt;br /&gt;
 &amp;lt;Acknowledge Code&amp;gt; besteht aus den Header ACC und dem Code.&lt;br /&gt;
&lt;br /&gt;
Beispiel sind be den jeweiligen Use Cases zu finden.&lt;br /&gt;
&lt;br /&gt;
=== Commands ===&lt;br /&gt;
 EOC ... end of communication, signalisiert das Ende einer Kommunikation&lt;br /&gt;
 OPM ... Operation Mode (siehe Betriebsmodus)&lt;br /&gt;
 WAP ... Waypoint (siehe Wegpunkte)&lt;br /&gt;
 DIR ... Angabe der Richtung im GO Betriebsmodus (siehe Kürzester Weg)&lt;br /&gt;
&lt;br /&gt;
=== Acknowledge Codes ===&lt;br /&gt;
 00 .. OK, Command acknowledged&lt;br /&gt;
 01 .. unknown Command&lt;br /&gt;
 02 .. invalid data&lt;br /&gt;
 11 .. unbekannter Betriebsmodus (e.g. OPMXX)&lt;br /&gt;
 21 .. Command refused, Labyrinth erkunden (OPMSM) vor [[NIBObee#Kalibrierung]] (OPMGA)&lt;br /&gt;
&lt;br /&gt;
=== Betriebsmodus ===&lt;br /&gt;
 GA ... Kalibrieren (siehe [[NIBObee#Kalibrierung]])&lt;br /&gt;
 SM ... Labyrinth erkunden&lt;br /&gt;
 GO ... kürzesten Weg nehmen (siehe Kürzester Weg)&lt;br /&gt;
&lt;br /&gt;
=== Wegpunkte ===&lt;br /&gt;
Die Übertragung eines Wegpunkts erfolgt durch Angabe der Richtung (S,W,N,E), gefolgt von der Anzahl der Streckenteile.&lt;br /&gt;
 Beispiel: WAPS4   der Wegpunkt befindet sich 4 Streckenteile südlich des zuletzt übertragenen Wegpunkts&lt;br /&gt;
&lt;br /&gt;
== Ablauf ==&lt;br /&gt;
Im [[RoLoMa]] Projekt muss die Kommunikation aus Nachricht-Antwort Sequenzen bestehen. Wird eine gesendete Nachricht nicht bestätigt, erfolgt eine Neuübertragung nach dem RETRANSMISSION_TIMEOUT Interval.&lt;br /&gt;
Erfolgt auch nach RETRANSMISSION_COUNT Wiederholungen keine Antwort, wird die Übertragung abgebrochen und ein Fehler signalisiert.&lt;br /&gt;
&lt;br /&gt;
Kommunikationen überschneiden sich nicht, das bedeutet, es findet zu jedem Zeitpunkt nur eine Kommunikation zwischen den Beteiligten statt. Daher ist auch zu jedem Zeitpunkt genau ein Teilnehmer der Sender, und ein Teilnehmer der Empfänger.&lt;br /&gt;
&lt;br /&gt;
== Use Cases ==&lt;br /&gt;
Im folgenden werden Beispiele für die Kommunikation der unterschiedlichen Betriebsarten dargestellt. Daten vom Borad werden normal, die von der NIBObee &#039;&#039;&#039;fett&#039;&#039;&#039; dargestellt.&lt;br /&gt;
&lt;br /&gt;
=== Kalibrieren ===&lt;br /&gt;
Beim Kalibrieren wird das Kommando vom Board an die NIBObee geschickt und auch bei Erhalt sofort quittiert (sonst würde es zu einem Timeout kommen). Nachdem die Kalibrierung abgeschlossen ist wird die Verbindung getrennt.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Beispiel:&#039;&#039;&lt;br /&gt;
 SEQ1 &lt;br /&gt;
 OPMGA&lt;br /&gt;
 &lt;br /&gt;
 &#039;&#039;&#039;ACK1&#039;&#039;&#039; &lt;br /&gt;
 &#039;&#039;&#039;ACC00&#039;&#039;&#039;&lt;br /&gt;
 &lt;br /&gt;
 &#039;&#039;&#039;SEQ2&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;EOC&#039;&#039;&#039;&lt;br /&gt;
 &lt;br /&gt;
 ACK2 &lt;br /&gt;
 ACC00&lt;br /&gt;
&lt;br /&gt;
=== Labyrinth erkunden===&lt;br /&gt;
Das Kommando wird vom Board an die NIBObee geschickt und auch bei Erhalt sofort quittiert (es muss vorher allerdings eine Kalibrierung durchgeführt worden sein). Danach werden laufend die Punkte geschickt die abgefahren werden. Wenn das ganze Labyrinth erfasst wurde wir die Kommunikation wieder beendet.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Beispiel:&#039;&#039;&lt;br /&gt;
 SEQ1 &lt;br /&gt;
 OPMSM&lt;br /&gt;
 &lt;br /&gt;
 &#039;&#039;&#039;ACK1&#039;&#039;&#039; &lt;br /&gt;
 &#039;&#039;&#039;ACC00&#039;&#039;&#039;&lt;br /&gt;
 &lt;br /&gt;
 &#039;&#039;&#039;SEQ2&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;WAPN3&#039;&#039;&#039;&lt;br /&gt;
 &lt;br /&gt;
 ACK2 &lt;br /&gt;
 ACC00&lt;br /&gt;
 &lt;br /&gt;
 &#039;&#039;&#039;SEQ3&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;WAPO1&#039;&#039;&#039;&lt;br /&gt;
 &lt;br /&gt;
 ...&lt;br /&gt;
 &lt;br /&gt;
 &#039;&#039;&#039;SEQ32&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;EOC&#039;&#039;&#039;&lt;br /&gt;
 &lt;br /&gt;
 ACK32 &lt;br /&gt;
 ACC00&lt;br /&gt;
&lt;br /&gt;
=== Kürzester Weg === &lt;br /&gt;
Hier werden Richtungsanweisungen übertragen, die es der [[NIBObee]] ermöglichen, in einem Labyrinth den kürzesten Weg zu nehmen.&lt;br /&gt;
Beispiel (ohne ACKs), der kürzeste Weg wird als S(üd)-N(ord)-W(est)-S(üd) angegeben:&lt;br /&gt;
 SEQ1 &lt;br /&gt;
 OPMGO&lt;br /&gt;
 &lt;br /&gt;
 SEQ2 &lt;br /&gt;
 DIRS &lt;br /&gt;
 &lt;br /&gt;
 SEQ3 &lt;br /&gt;
 DIRN &lt;br /&gt;
 &lt;br /&gt;
 SEQ4 &lt;br /&gt;
 DIRW &lt;br /&gt;
 &lt;br /&gt;
 SEQ5 &lt;br /&gt;
 DIRS &lt;br /&gt;
 &lt;br /&gt;
 SEQ6 &lt;br /&gt;
 EOC&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:FH]]&lt;/div&gt;</summary>
		<author><name>Alois</name></author>
	</entry>
	<entry>
		<id>https://wiki.callooh.com/index.php?title=Benutzer:Alois/monobook.css&amp;diff=871</id>
		<title>Benutzer:Alois/monobook.css</title>
		<link rel="alternate" type="text/html" href="https://wiki.callooh.com/index.php?title=Benutzer:Alois/monobook.css&amp;diff=871"/>
		<updated>2011-05-15T14:21:08Z</updated>

		<summary type="html">&lt;p&gt;Alois: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;@media screen {&lt;br /&gt;
  h3 {&lt;br /&gt;
    font-size: 132%;&lt;br /&gt;
    border-bottom: 1px dashed #aaa;&lt;br /&gt;
    font-weight: normal;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media print {&lt;br /&gt;
  /* automatic header numbering */&lt;br /&gt;
  body {&lt;br /&gt;
    counter-reset:h1;&lt;br /&gt;
    /* counter-increment:h1 -1; // to start with 0 */&lt;br /&gt;
  }&lt;br /&gt;
 &lt;br /&gt;
  h1:before {&lt;br /&gt;
    content:counter(h1) &amp;quot;. &amp;quot;;&lt;br /&gt;
    counter-increment:h1 ;&lt;br /&gt;
  }&lt;br /&gt;
  h1{&lt;br /&gt;
    counter-reset:h2;&lt;br /&gt;
  }&lt;br /&gt;
 &lt;br /&gt;
  h2:before {&lt;br /&gt;
    content:counter(h1) &amp;quot;.&amp;quot; counter(h2) &amp;quot;. &amp;quot;;&lt;br /&gt;
    counter-increment:h2 ;&lt;br /&gt;
  }&lt;br /&gt;
  h2{&lt;br /&gt;
    counter-reset:h3;&lt;br /&gt;
  }&lt;br /&gt;
 &lt;br /&gt;
  h3:before {&lt;br /&gt;
    content:counter(h1) &amp;quot;.&amp;quot; counter(h2) &amp;quot;.&amp;quot; counter(h3) &amp;quot;. &amp;quot;;&lt;br /&gt;
    counter-increment:h3 ;&lt;br /&gt;
  }&lt;br /&gt;
  h3{&lt;br /&gt;
    counter-reset:h4;&lt;br /&gt;
  }&lt;br /&gt;
 &lt;br /&gt;
  h4:before {&lt;br /&gt;
    content:counter(h1) &amp;quot;.&amp;quot; counter(h2) &amp;quot;.&amp;quot; counter(h3) &amp;quot;.&amp;quot; counter(h4) &amp;quot;. &amp;quot;;&lt;br /&gt;
    counter-increment:h4 ;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Alois</name></author>
	</entry>
	<entry>
		<id>https://wiki.callooh.com/index.php?title=MaDeCo&amp;diff=870</id>
		<title>MaDeCo</title>
		<link rel="alternate" type="text/html" href="https://wiki.callooh.com/index.php?title=MaDeCo&amp;diff=870"/>
		<updated>2011-05-14T15:52:59Z</updated>

		<summary type="html">&lt;p&gt;Alois: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= MaDeCo - Protokoll zur Kommunikation im [[RoLoMa]] Projekt =&lt;br /&gt;
&lt;br /&gt;
MaDeCo ist ein sehr einfaches textbasiertes Protokoll für die Kommunikation zwischen den Beteiligten im [[RoLoMa]] Projekt, den [[NIBObee]] Einheiten und der Basisstation, dem [[LPC2478]].&lt;br /&gt;
&lt;br /&gt;
== Rollen ==&lt;br /&gt;
Es gibt unter den Beteiligten zwei festgelegte Rollen, Sender und Empfänger. Der Sender überträgt Information, der Empfänger hingegen hat eine überwiegend passive Funktion, er quittiert Nachrichten und übermittelt einen Acknowledge Code.&lt;br /&gt;
Während der Kommunikation werden diese Rollen nicht gewechselt.&lt;br /&gt;
&lt;br /&gt;
== Format ==&lt;br /&gt;
Eine Nachricht besteht aus genau zwei Datensätzen, ein Datensatz besteht jeweils aus einem 3 Zeichen breiten Header Teil, und einem 2 Zeichen breiten Datenteil. Für kleinere Datenteile erfolgt ein Padding mit Leerzeichen.&lt;br /&gt;
&lt;br /&gt;
Beide Teile der Nachricht werden unmittelbar hintereinander gesendet, also z.B. als &#039;&#039;SEQ13OPMSM&#039;&#039;. In untenstehenden Beispielen werden die beiden Teile der Nachricht allerdings durch einen Zeilenumbruch getrennt, um die Nachricht lesbarer zu machen.&lt;br /&gt;
&lt;br /&gt;
Eine Nachricht, wie sie ein Sender erstellt, besteht aus:&lt;br /&gt;
 &amp;lt;Sequence&amp;gt;&lt;br /&gt;
 &amp;lt;Command&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;Sequence&amp;gt; besteht aus dem Header SEQ, der Datenteil aus einer Nummer zwischen 1 und 99.&lt;br /&gt;
 &amp;lt;Command&amp;gt; besteht aus dem 3 Zeichen langen Command-Code, und einem entsprechenden Datenteil.&lt;br /&gt;
&lt;br /&gt;
Eine Nachricht muss mit einer Antwort quittiert werden. Diese besteht aus:&lt;br /&gt;
 &amp;lt;Acknowledge&amp;gt;&lt;br /&gt;
 &amp;lt;Acknowledge Code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;Acknowledge&amp;gt; besteht aus dem Header ACK und der zu bestätigenden Sequence Number.&lt;br /&gt;
 &amp;lt;Acknowledge Code&amp;gt; besteht aus den Header ACC und dem Code.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Beispiel:&#039;&#039;&lt;br /&gt;
 SEQ1 &lt;br /&gt;
 OPMSM&lt;br /&gt;
 &lt;br /&gt;
 ACK1 &lt;br /&gt;
 ACC00&lt;br /&gt;
 &lt;br /&gt;
 SEQ2&lt;br /&gt;
 EOC&lt;br /&gt;
 &lt;br /&gt;
 ACK2 &lt;br /&gt;
 ACC00&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Commands ===&lt;br /&gt;
 EOC ... end of communication, signalisiert das Ende einer Kommunikation&lt;br /&gt;
 OPM ... Operation Mode (siehe Betriebsmodus)&lt;br /&gt;
 WAP ... Waypoint (siehe Wegpunkte)&lt;br /&gt;
 DIR ... Angabe der Richtung im GO Betriebsmodus (siehe Kürzester Weg)&lt;br /&gt;
&lt;br /&gt;
=== Acknowledge Codes ===&lt;br /&gt;
 00 .. OK, Command acknowledged&lt;br /&gt;
 01 .. unknown Command&lt;br /&gt;
 02 .. invalid data&lt;br /&gt;
 11 .. unbekannter Betriebsmodus (e.g. OPMXX)&lt;br /&gt;
 21 .. Command refused, Labyrinth erkunden (OPMSM) vor [[NIBObee#Kalibrierung]] (OPMGA)&lt;br /&gt;
&lt;br /&gt;
=== Betriebsmodus ===&lt;br /&gt;
 GA ... Kalibrieren (siehe [[NIBObee#Kalibrierung]])&lt;br /&gt;
 SM ... Labyrinth erkunden&lt;br /&gt;
 GO ... kürzesten Weg nehmen (siehe Kürzester Weg)&lt;br /&gt;
&lt;br /&gt;
=== Wegpunkte ===&lt;br /&gt;
Die Übertragung eines Wegpunkts erfolgt durch Angabe der Richtung (S,W,N,E), gefolgt von der Anzahl der Streckenteile.&lt;br /&gt;
 Beispiel: WAPS4   der Wegpunkt befindet sich 4 Streckenteile südlich des zuletzt übertragenen Wegpunkts&lt;br /&gt;
&lt;br /&gt;
== Ablauf ==&lt;br /&gt;
Im [[RoLoMa]] Projekt muss die Kommunikation aus Nachricht-Antwort Sequenzen bestehen. Wird eine gesendete Nachricht nicht bestätigt, erfolgt eine Neuübertragung nach dem RETRANSMISSION_TIMEOUT Interval.&lt;br /&gt;
Erfolgt auch nach RETRANSMISSION_COUNT Wiederholungen keine Antwort, wird die Übertragung abgebrochen und ein Fehler signalisiert.&lt;br /&gt;
&lt;br /&gt;
Kommunikationen überschneiden sich nicht, das bedeutet, es findet zu jedem Zeitpunkt nur eine Kommunikation zwischen den Beteiligten statt. Daher ist auch zu jedem Zeitpunkt genau ein Teilnehmer der Sender, und ein Teilnehmer der Empfänger.&lt;br /&gt;
&lt;br /&gt;
== Use Cases ==&lt;br /&gt;
Im folgenden werden Beispiele für die Kommunikation der unterschiedlichen Betriebsarten dargestellt. Daten vom Borad werden normal, die von der NIBObee &#039;&#039;&#039;fett&#039;&#039;&#039; dargestellt.&lt;br /&gt;
&lt;br /&gt;
=== Kalibrieren ===&lt;br /&gt;
Beim Kalibrieren wird das Kommando vom Board an die NIBObee geschickt und auch bei Erhalt sofort quittiert (sonst würde es zu einem Timeout kommen). Nachdem die Kalibrierung abgeschlossen ist wird die Verbindung getrennt.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Beispiel:&#039;&#039;&lt;br /&gt;
 SEQ1 &lt;br /&gt;
 OPMGA&lt;br /&gt;
 &lt;br /&gt;
 &#039;&#039;&#039;ACK1&#039;&#039;&#039; &lt;br /&gt;
 &#039;&#039;&#039;ACC00&#039;&#039;&#039;&lt;br /&gt;
 &lt;br /&gt;
 &#039;&#039;&#039;SEQ2&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;EOC&#039;&#039;&#039;&lt;br /&gt;
 &lt;br /&gt;
 ACK2 &lt;br /&gt;
 ACC00&lt;br /&gt;
&lt;br /&gt;
=== Labyrinth erkunden===&lt;br /&gt;
Das Kommando wird vom Board an die NIBObee geschickt und auch bei Erhalt sofort quittiert (es muss vorher allerdings eine Kalibrierung durchgeführt worden sein). Danach werden laufend die Punkte geschickt die abgefahren werden. Wenn das ganze Labyrinth erfasst wurde wir die Kommunikation wieder beendet.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Beispiel:&#039;&#039;&lt;br /&gt;
 SEQ1 &lt;br /&gt;
 OPMSM&lt;br /&gt;
 &lt;br /&gt;
 &#039;&#039;&#039;ACK1&#039;&#039;&#039; &lt;br /&gt;
 &#039;&#039;&#039;ACC00&#039;&#039;&#039;&lt;br /&gt;
 &lt;br /&gt;
 &#039;&#039;&#039;SEQ2&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;WAPN3&#039;&#039;&#039;&lt;br /&gt;
 &lt;br /&gt;
 ACK2 &lt;br /&gt;
 ACC00&lt;br /&gt;
 &lt;br /&gt;
 &#039;&#039;&#039;SEQ3&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;WAPO1&#039;&#039;&#039;&lt;br /&gt;
 &lt;br /&gt;
 ...&lt;br /&gt;
 &lt;br /&gt;
 &#039;&#039;&#039;SEQ32&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;EOC&#039;&#039;&#039;&lt;br /&gt;
 &lt;br /&gt;
 ACK32 &lt;br /&gt;
 ACC00&lt;br /&gt;
&lt;br /&gt;
=== Kürzester Weg === &lt;br /&gt;
Hier werden Richtungsanweisungen übertragen, die es der [[NIBObee]] ermöglichen, in einem Labyrinth den kürzesten Weg zu nehmen.&lt;br /&gt;
Beispiel (ohne ACKs), der kürzeste Weg wird als S(üd)-N(ord)-W(est)-S(üd) angegeben:&lt;br /&gt;
 SEQ1 &lt;br /&gt;
 OPMGO&lt;br /&gt;
 &lt;br /&gt;
 SEQ2 &lt;br /&gt;
 DIRS &lt;br /&gt;
 &lt;br /&gt;
 SEQ3 &lt;br /&gt;
 DIRN &lt;br /&gt;
 &lt;br /&gt;
 SEQ4 &lt;br /&gt;
 DIRW &lt;br /&gt;
 &lt;br /&gt;
 SEQ5 &lt;br /&gt;
 DIRS &lt;br /&gt;
 &lt;br /&gt;
 SEQ6 &lt;br /&gt;
 EOC&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:FH]]&lt;/div&gt;</summary>
		<author><name>Alois</name></author>
	</entry>
	<entry>
		<id>https://wiki.callooh.com/index.php?title=NIBObee&amp;diff=861</id>
		<title>NIBObee</title>
		<link rel="alternate" type="text/html" href="https://wiki.callooh.com/index.php?title=NIBObee&amp;diff=861"/>
		<updated>2011-05-02T09:48:02Z</updated>

		<summary type="html">&lt;p&gt;Alois: /* Communication-Modul */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;NIBObee ist der Roboter der im Projekt [[RoLoMa]] verwendet wird.&lt;br /&gt;
== Technische Daten ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Art&lt;br /&gt;
!Typ&lt;br /&gt;
!Bemerkung&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|Mikrocontroller&lt;br /&gt;
|ATMEL ATMega16, , 15 MHz&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|Integrierter UART wird verwendet um den Bluetooth Modul anzubinden.&lt;br /&gt;
&lt;br /&gt;
Sollte die Leistung nicht ausreichen kann entweder der Erweiterungssatz von Nicai-Systems verwendet werden oder nur der Controller wird gegen einen Pinkompatiblen Typ ausgetauscht (z.B. ATMega32, ATMega644, ATMega1284)&lt;br /&gt;
|-&lt;br /&gt;
|Flash:	16	kB&lt;br /&gt;
|-&lt;br /&gt;
|...&lt;br /&gt;
|-&lt;br /&gt;
|...&lt;br /&gt;
|...&lt;br /&gt;
|...&lt;br /&gt;
|-&lt;br /&gt;
|...&lt;br /&gt;
|...&lt;br /&gt;
|...&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|Maße&lt;br /&gt;
|Radumfang: 11,8 cm&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|Diese Maße sind wichtig um den NIBObee so exakt wie möglich am Mittelpunkt des Labyrinthfeldes positionieren zu können.&lt;br /&gt;
|-&lt;br /&gt;
|Abstand Liniensensor zu Radachse: 10,4 cm&lt;br /&gt;
|-&lt;br /&gt;
|Impulse pro Umdrehung: 20&lt;br /&gt;
|}&lt;br /&gt;
=== Ports ===&lt;br /&gt;
Über den UART wird der Bluetooth Modul [[BTM-222]] angebunden. Am NIObee ist diese Schnittstelle am Port X5 verfügbar&lt;br /&gt;
&lt;br /&gt;
=== Resourcen ===&lt;br /&gt;
Folgende Resourcen werden für unsere Implementierung verwendet (&#039;&#039;kursiv&#039;&#039; markierte Resourcen werden bereits durch die Bibliothek belegt):&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Resource&lt;br /&gt;
!Verwendung&lt;br /&gt;
!Interrupts&lt;br /&gt;
!Dateien&lt;br /&gt;
|-&lt;br /&gt;
|Timer 1&lt;br /&gt;
|Motor PWM&lt;br /&gt;
|TIMER1_COMPA_vect, TIMER1_COMPB_vect&lt;br /&gt;
|motpwm.c&lt;br /&gt;
|-&lt;br /&gt;
|ADC&lt;br /&gt;
|Analog, Line&lt;br /&gt;
|ADC_vect&lt;br /&gt;
|analog.c, line.c&lt;br /&gt;
|-&lt;br /&gt;
|EEPROM&lt;br /&gt;
|Line (12 Byte)&lt;br /&gt;
|&lt;br /&gt;
|line.c&lt;br /&gt;
|-&lt;br /&gt;
|Ext. IRQ&lt;br /&gt;
|Odometrie&lt;br /&gt;
|INT0_vect, INT1_vect&lt;br /&gt;
|odometry.c&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Eine für den NIBObee allgemein gültige Auflistung findet man im [http://www.nibo-roboter.de/wiki/NIBObee/Lib/Resourcen NIBObee Wiki].&lt;br /&gt;
&lt;br /&gt;
=== Besondere Erkenntnisse ===&lt;br /&gt;
Es hat sich, nach einigen Fehlschlägen bei der Linienverfolung, herausgestellt dass es ungünstig ist den NIBObee in eine optisch ansprechende waagrechte Position zu bringen indem eine kleinere Halbkugel auf der Unterseite angebracht wird. Der Grund: Nur mit der original Halbkugel und dem damit nach vorne ansteigenden Bodenabstand sind die IR-LED&#039;s weit genug vom Boden entfernt um einen Lichtkegen zu erzeugen der auch vernünftig vom Phototransistor erfasst werden kann. Bei waagrechter Ausrichtung des NIBObee ist dieser Kegel, aufgrund des geringeren Abstands zum Boden, zu klein!&lt;br /&gt;
&lt;br /&gt;
=== Bibliotheksfunktionen ===&lt;br /&gt;
==== Liniensensoren ====&lt;br /&gt;
Die original NIBObee Biliothek wird nicht verwendet. Wurde durch eine eigene Implementierung im [[NIBObee#Line-Modul|Line-Modul]] ersetzt.&lt;br /&gt;
&lt;br /&gt;
==== Motorensteuerung ====&lt;br /&gt;
 motpwm.h&lt;br /&gt;
Die Motoren des NIBObee werden mit PWM ([http://de.wikipedia.org/wiki/Pulsweitenmodulation Pulsweitenmodulation]) angesteuert. Das garantiert natürlich ohne Regelung noch keinen Gleichlauf der beiden Motoren was sich je nach Zustand des Getriebes in einer weiteren oder engernen Kurve zeigt.&lt;br /&gt;
 motpid.h&lt;br /&gt;
Hier stehen Funktionen zur Verfügung die mit Hilfe der Odometrie die Motoren regeln. Diese Funktionen sind für unsere Zwecke allerdings nicht geeignet.&lt;br /&gt;
&lt;br /&gt;
== Aufgaben ==&lt;br /&gt;
Folgende Aufgaben sind im Rahmen des Projekts [[RoLoMa]] vom NIBObee Team zu lösen:&lt;br /&gt;
* Herstellung der Bluetooth Hardware-Erweiterung&lt;br /&gt;
* Softwaremodul zum Bedienen der Bluetooth-Schnittstelle via RS232&lt;br /&gt;
* Softwaremodul zum Erkennen der Linie im Labyrinth und im speziellen der unterschiedlichen Kreuzungstypen&lt;br /&gt;
* Messen des zurückgelegten Weges&lt;br /&gt;
* Steuerung, die den Abstand des Sensors zur Radachse berücksichtigt um den Roboter an der korrekten Stelle um die eigene Achse zu drehen&lt;br /&gt;
* Erstellen eines Abbilds des Labyrinths im Speicher und navigieren bis der Roboter wieder am Startpunkt gelandet ist (z.B. immer Links abbiegen)&lt;br /&gt;
* Implementieren des [[MaDeCo]] Protokolls&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
&lt;br /&gt;
=== Bluetooth ===&lt;br /&gt;
Der Bluetooth Modul ist im Detail auf den Seiten des [[BTM-222]] beschrieben.&lt;br /&gt;
&lt;br /&gt;
=== Liniensensoren ===&lt;br /&gt;
Zum Erkennen der Kreuzungen bei gleichzeitigem folgen der Linie war es notwendig zusätzliche Liniensensoren zu verwenden. Diese wurden mit einer Zusätzplatine in einer Reihe mit den bereits vorhandenen Liniensensoren, allerdings so weit wie möglich linke und rechts außen, montiert. Das einlesen der Analogwerte erfolgt über die beiden Analogeingänge am Stecker X1. Die IR-LEDs sind, analog zu den bestehenden IR-LEDs der vorhandenen Liniensensoren, über den Ausgang 1 am Stecker X4 schaltbar. Dies ist notwendig da jeweils eine Messung mit eingschalteter LED und eine mit ausgeschalteter LED durchgeführt wird. Damit wird der Einfluß des Umgebungslichts korrigiert.&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
Die Aufgaben der Software sollen in möglichst unabhängigen Modulen realisiert werden um das Testen einfacher zu gestalten. Die einzelnen Module sind im Folgenden beschrieben.&lt;br /&gt;
&lt;br /&gt;
=== Architektur ===&lt;br /&gt;
Das Gesamtsystem besteht aus einem zentralen Taktgeber, einem Scheduler und mehreren State Maschinen. Die Kommunikation erfolgt ausschließlich über Events. Die Module können mittels Subscribe einen Event, den ein anderer Modul zur Verfügung steht, abonnieren.&lt;br /&gt;
&lt;br /&gt;
==== Systemtakt, Scheduler ====&lt;br /&gt;
Im Main Modul befindet sich der zentrale Taktgeber der aus dem Interrupt des Timer 2 einen gleichmäßigen Takt von 100Hz erzeugt. Dieser Takt kann von anderen Modulen verwendet werden um zyklische Aufgaben zu erfüllen (z.B. lesen der Liniensensoren). Im Main Modul befindet sich auch der Scheduler der ganz einfach in der Endlosschleife sequenziell jeden Modul aufruft um anstehende Events zu bearbeiten.&lt;br /&gt;
&lt;br /&gt;
==== State / Event Maschinen ====&lt;br /&gt;
Die State / Event Maschinen sind in allen Modulen gleich aufgebaut. Es gibt die folgenden Funktionen (wobei statt &amp;quot;&amp;lt;xx&amp;gt;&amp;quot; das Kürzel des Moduls steht, z.B &amp;quot;dr&amp;quot; für Drive):&lt;br /&gt;
; eine Funktion mit dem Namen &amp;lt;xx&amp;gt;_main (intern)&lt;br /&gt;
: Das ist die eigentliche State Maschine. Wird nicht direkt vom Scheduler aufgerufen sondern über die Funktion &amp;lt;xx&amp;gt;_eventHandler. Hier gibt es ein switch Statement über den aktuellen Zustand und für jeden Zustand ein switch Statement über den empfangenen Event.&lt;br /&gt;
; eine Funktion mit dem Namen &amp;lt;xx&amp;gt;_init (extern)&lt;br /&gt;
: Hier werden Variableninitialisierungen gemacht und die ersten subscribe Aufrufe um Events zu abonnieren. Diese Funktion wird beim Systemstart vom Main Modul aufgerufen.&lt;br /&gt;
; eine Funktion mit dem Namen &amp;lt;xx&amp;gt;_eventHandler (extern)&lt;br /&gt;
: Ist die Funktion die vom Scheduler aufgerufen wird damit die Statemaschine mit dem aktuellen Event, sofern vorhanden, durchlaufen wird.&lt;br /&gt;
; optional Funktionen mit den Namen &amp;lt;xx&amp;gt;_subscribe_&amp;lt;event&amp;gt; und &amp;lt;xx&amp;gt;_unsubscribe_&amp;lt;event&amp;gt; (extern)&lt;br /&gt;
: für jeden Event den dieser Modul verschicken kann ist sowohl eine Subscribe Funktion als auch ein Unsubscribe Funktion vorhanden. Mit diesen Funktionen kann der Event von einem anderen Modul abboniert werden.&lt;br /&gt;
; eine Funktion mit dem Namen &amp;lt;xx&amp;gt;_receiveEvent (intern)&lt;br /&gt;
: ReceiveEvent ist eigentlich eine interne Funktion (wird also nicht im Header File deklariert), der Pointer auf diese Funktion wird allerdings als Callback beim Subscribe übergeben damit der Event dem Modul zugestellt werden kann.&lt;br /&gt;
&lt;br /&gt;
=== Module ===&lt;br /&gt;
Im folgenden sind alle Module und deren Hauptfunktionen aufgelistet.&lt;br /&gt;
&lt;br /&gt;
==== Analog-Modul ====&lt;br /&gt;
Digitalisieren der Analogeingänge&lt;br /&gt;
 Dateien: analog.c&lt;br /&gt;
          analog.h&lt;br /&gt;
Dieser Modul ist abgeleitet von den gleichnamigen Dateien der original NIBObee Bibliothek. Dies war notwendig da wir zusätzliche Liniensensoren verwenden und deren Ansteuerung in gleicher Weise erfolgen sollte. Das bedeutet dass für die entsprechenden Analogeingänge Messungen mit ein- und ausgeschalteten IR-LEDs durchgeführt werden müssen. Außerdem wurde, entsprechend dem Datenblatt des ATMega16 die Behandlung der Messung der Batteriespannung verbessert. Da hier die Referenzspannung umgeschalten wird muss eine Messung verworfen werden bevor mit einem richtigen Ergebnis gerechnet werden kann. Das wurde in der Originalbibliothek nicht berücksichtigt.&lt;br /&gt;
Die einzelnen Werte werden weiterhin über einen A/D-Wandler ermittelt und zwischengespeichert. Es gibt nun 13 analoge Werte (statt bisher 11) die zyklisch digitalisiert werden. Dieser Vorgang wird mit einer Frequenz von ca 117 kHz durchgeführt, d.h. dass jeder dieser Werte ca. alle 111 µs (statt bisher 94 µs) aktualisiert wird.&lt;br /&gt;
&lt;br /&gt;
==== Line-Modul ====&lt;br /&gt;
Ermitteln der Werte der Liniensensoren&lt;br /&gt;
 Dateien: line.c&lt;br /&gt;
          line.h&lt;br /&gt;
Dieser Modul ersetzt die originalen Bibliotheksfunktionen der Liniensensoren. Dies war notwendig da wir zusätzliche Liniensensoren verwenden.&lt;br /&gt;
&lt;br /&gt;
Die Werte der Liniensensoren können nun mit der Funktion&lt;br /&gt;
&amp;lt;code&amp;gt;ln_get(index)&amp;lt;/code&amp;gt;&lt;br /&gt;
gelesen werden. Die Werte selbst werden über den [[NIBObee#Analog-Modul|Analog-Modul]] ermittelt.&lt;br /&gt;
&lt;br /&gt;
==== Communication-Modul ====&lt;br /&gt;
Wickelt die Kommunikation über den Bluetooth Modul ab&lt;br /&gt;
 Dateien: comm.c&lt;br /&gt;
          comm.h&lt;br /&gt;
&lt;br /&gt;
==== Common-Modul ====&lt;br /&gt;
Stellt gemeinsame Funktionen zurVerfügung&lt;br /&gt;
 Dateien: common.c&lt;br /&gt;
          common.h&lt;br /&gt;
&lt;br /&gt;
==== Distance-Modul ====&lt;br /&gt;
Behandelt die Odometrie Sensoren&lt;br /&gt;
 Dateien: distance.c&lt;br /&gt;
          distance.h&lt;br /&gt;
&lt;br /&gt;
==== Drive-Modul ====&lt;br /&gt;
Bewegt den NIBObee&lt;br /&gt;
 Dateien: drive.c&lt;br /&gt;
          drive.h&lt;br /&gt;
&lt;br /&gt;
==== Follow-Modul ====&lt;br /&gt;
Ist für die Linienverfolgung zuständig&lt;br /&gt;
 Dateien: follow.c&lt;br /&gt;
          follow.h&lt;br /&gt;
&lt;br /&gt;
==== MaDeCo-Modul ====&lt;br /&gt;
Behandelt das MaDeCo Protokoll&lt;br /&gt;
 Dateien: madeco.c&lt;br /&gt;
          madeco.h&lt;br /&gt;
&lt;br /&gt;
==== Main-Modul ====&lt;br /&gt;
Scheduler und zentraler Taktgeber&lt;br /&gt;
 Dateien: main.c&lt;br /&gt;
          main.h&lt;br /&gt;
&lt;br /&gt;
==== Sensor-Modul ====&lt;br /&gt;
Ist für die &amp;quot;Fühler&amp;quot; zuständig&lt;br /&gt;
 Dateien: follow.c&lt;br /&gt;
          follow.h&lt;br /&gt;
&lt;br /&gt;
=== Applikationen ===&lt;br /&gt;
==== Labyrinth erkunden ====&lt;br /&gt;
&lt;br /&gt;
==== Kürzesten Weg durch Labyrinth ====&lt;br /&gt;
&lt;br /&gt;
==== Kalibrierung ====&lt;br /&gt;
Zur Kalibrierung fährt der NIBObee ein Viereck entlang dass genau die Seitenlänge eines der Felder des Labyrinths hat. Dies ist notwendig um relativ einfach die Karte des Labyrinths erstellen zu können.&lt;br /&gt;
&lt;br /&gt;
=== Protokolle und deren Implementierung ===&lt;br /&gt;
==== [[MaDeCo]] ====&lt;br /&gt;
===== Interface Definition =====&lt;br /&gt;
* int set_opmode(OPMODE)&lt;br /&gt;
* int send_waypoint(WAYPOINT)&lt;br /&gt;
* int direct(DIRECTION[])&lt;br /&gt;
* int ack()&lt;br /&gt;
&lt;br /&gt;
==== Schnittstelle [[MaDeCo]] - RS232-Schnittstelle ====&lt;br /&gt;
* pairing&lt;br /&gt;
* Konfigurations-Commands&lt;br /&gt;
* ack&lt;br /&gt;
* read_command&lt;br /&gt;
* send_command&lt;br /&gt;
&lt;br /&gt;
=== Steuerungssoftware ===&lt;br /&gt;
==== Bluetooth Modul einschalten ====&lt;br /&gt;
Durch Bewegen der &amp;quot;Fühler&amp;quot; der NIBObee nach oben bis Einrasten wird das Bluetooth Modul eingeschalten.&lt;br /&gt;
Daraufhin muss auf eingehenden Bluetooth Traffic gelauscht werden.&lt;br /&gt;
&lt;br /&gt;
==== Blink Codes ====&lt;br /&gt;
Bestimmte Events oder Commands lösen bestimmte Blink- oder Leuchtmuster der Status LEDs aus.&lt;br /&gt;
&#039;&#039;&#039;TODO:&#039;&#039;&#039; Spezifikation der Blink Codes&lt;br /&gt;
&lt;br /&gt;
==== Gerade fahren ====&lt;br /&gt;
Das Problem beim geradeaus fahren ist dass der Roboter von der Spur abweichen kann und dann neu ausgerichtet werden muss. Üblicherweise erfolgt das mit Hilfe der Liniensensoren indem, sobald einer der seitlichen Sensoren die Linie erkennt, durch beschleunigen oder bremsen eines Rades in diese Richtung korrigierend gelenkt wird.&lt;br /&gt;
&lt;br /&gt;
In unserem Fall müssen wir diese Korrektur solange verzögern bis der seitliche Liniensensor eine mögliche Kreuzung passiert hat. Erst danach können wir feststellen ob wir nur die schwarze Linie einer Kreuzung überfahren sind oder ob tatsächlich eine Abweichung vorliegt. Die Anzahl der zu ignorierenden Odometrie-Impule kann folgendermaßen errechnet werden:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;Impulse pro Radumdrehung&amp;gt; / &amp;lt;Radumfang&amp;gt; * &amp;lt;Linienbreite&amp;gt; =&lt;br /&gt;
 20 / 11,8 * 1 = 1,69491525&lt;br /&gt;
&lt;br /&gt;
Wir werden also nur zwei Impulse abwarten bevor wir mit der Korrektur beginnen&lt;br /&gt;
&lt;br /&gt;
===== Funktionsaufteilung =====&lt;br /&gt;
Die Zuständigkeiten für diese Aufgabe sind wie folgt:&lt;br /&gt;
;drive Modul&lt;br /&gt;
:sorgt für die Steuerung der Motoren. Reduzieren der Geschwindigkeit eines Rades um eine ausgleichende Kurve zu fahren und stoppen wenn das Ende der geraden Linie erreicht wurde. Dazu aboniert der Modul die Events des line Modul die eine Abweichung von der Linie melden und vom distance Modul den Event zum fahren der Distanz zwischen Liniensensoren und Achse der Räder.&lt;br /&gt;
;line Modul&lt;br /&gt;
:prüft zyklisch die position der Linie unter dem NIBObee und meldet Abweichungen mittels Events. Dieses Melden wird allerdings verzögert bis zumindest die Breite der Linie überfahren wurde. Dazu aboniert der Modul den Event vom distance Modul den Event zum fahren der der Breite der Linie.&lt;br /&gt;
;distance Modul&lt;br /&gt;
:meldet auf Anforderung das zurücklegen einer Strecke in der Länge der Distanz zwischen Liniensensoren und Achse der Räder oder der Breite der Linie.&lt;br /&gt;
&lt;br /&gt;
==== Kreuzung fahren ====&lt;br /&gt;
An einer Kreuzung wird abgebogen indem der NIBObee zuerst unbeirrt geradeaus fährt bis die Achse genau auf dem Mittelpunkt der Kreuzung zu stehen kommt. Danach wird eine Drehung nach rechts oder links durchgeführt bis sich die Linie wieder genau unter dem mittleren Sensor befindet.&lt;br /&gt;
&lt;br /&gt;
Die Sensoren sind von der Achse 10,4 cm entfernt, eine Radumdrehung bewegt den NIBObee um 11,8 cm weiter und bei dieser Umdrehung werden vom Odometriesensor 20 Impulse abgegeben. Die Linienbreite wird 2 cm betragen. Daher errechnet sich die Strecke die nach Erkennen der Kreuzung gefahren werden muss folgendermassen:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;Impulse pro Radumdrehung&amp;gt; / &amp;lt;Radumfang&amp;gt; * (&amp;lt;Achsabstand&amp;gt; - &amp;lt;halbe Linienbreite&amp;gt;) =&lt;br /&gt;
 20 / 11,8 * (10,4 - 0,5) = 16,779661&lt;br /&gt;
&lt;br /&gt;
Nach passieren der Kreuzung muss der NIBObee also noch 17 Impulse über den Odometriesensor empfangen bevor er stoppt.&lt;br /&gt;
&lt;br /&gt;
== Risikoanalyse ==&lt;br /&gt;
Im Folgenden wird versucht für die möglichen Risikopunkte Alternativen aufzuzeigen.&lt;br /&gt;
&lt;br /&gt;
; ATmega16 ist nicht Leisungsfägig genug&lt;br /&gt;
: Es kann auf den [http://www.nicai-systems.com/de/zubehoer/nibobee-tuning-kit.html Tuning-Kit von Nicai-Systems] zurückgerifffen werden. Dies könnte eine nicht akzeptable Verzögerung verursachen (erkennen, bestellen, NIBObee umrüsten)&lt;br /&gt;
&lt;br /&gt;
: Ein beliebiger PIN-kompatiber Microcontroller ATmega... wird statt dem ATmega16 eingesetzt. Die funktioniert soange der Ersatz-µC mit der Frequenz vom 15 MHz betrieben werden kann. Wichtig ist auch dass es adaptierte Bibliotheken gibt die auf den Ersatz-µC abgestimmt sind (z.B. andere Register oder geänderte Adressen für Register, ...)&lt;br /&gt;
&lt;br /&gt;
; Signale am UART mit Bordspannung im Gegensatz zu RS232-Level (12V)&lt;br /&gt;
: Die Signale am UART werden mit Bordspannung erzeugt/erwartet. Für die Kommunikation mit dem BT-Modul ist daher keine Anpassung durchzuführen.&lt;br /&gt;
&lt;br /&gt;
: Soll zu Testzwecken ein PC über RS232 angeschalten werden ist unbedingt auf die Spannung achten. Möglicherweise verwendet ein USB-RS232 Adapter nicht die 12V sonder nur 5V.&lt;br /&gt;
&lt;br /&gt;
== Open Issues ==&lt;br /&gt;
* Es muss noch überprüft werden ob die NIBObee Hardware ausreichend leistungsfähig ist oder ein Upgrade gemacht werden muss.&lt;br /&gt;
* Wie kann das verlassen der Spur von dem Überfahren einer Kreuzung unterschieden werden? Wenn es hier zu Problemen kommt könnten zwei zusätzliche lichtempfindliche Sensoren rechts und links oder noch ein Element mit drei zusätzlichen Sensoren auf Höhe der Achsen angebracht werden -&amp;gt; Mehraufwand!&lt;br /&gt;
* Soll Aktivierung der BT-Schnittstelle manuell erfolgen?&lt;br /&gt;
* Soll der Betriebsmodus gewählt werden können?&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* [http://www.nicai-systems.de/nibobee.html NIBObee Homepage bei Nicai Systems]&lt;br /&gt;
* [http://download.nicai-systems.com/nibo/Tutorial_NIBObee_20091123.pdf NIBObee - Tutorial zur Programmierung]&lt;br /&gt;
* [http://www.nicai-systems.com/de/zubehoer/nibobee-tuning-kit.html NIBObee - Tuning-Kit von Nicai-Systems]&lt;br /&gt;
* [http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/Der_UART Tutorial zur USART Programmierung]&lt;br /&gt;
[[Kategorie:FH]]&lt;/div&gt;</summary>
		<author><name>Alois</name></author>
	</entry>
	<entry>
		<id>https://wiki.callooh.com/index.php?title=NIBObee&amp;diff=860</id>
		<title>NIBObee</title>
		<link rel="alternate" type="text/html" href="https://wiki.callooh.com/index.php?title=NIBObee&amp;diff=860"/>
		<updated>2011-05-02T09:46:51Z</updated>

		<summary type="html">&lt;p&gt;Alois: /* Motorensteuerung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;NIBObee ist der Roboter der im Projekt [[RoLoMa]] verwendet wird.&lt;br /&gt;
== Technische Daten ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Art&lt;br /&gt;
!Typ&lt;br /&gt;
!Bemerkung&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|Mikrocontroller&lt;br /&gt;
|ATMEL ATMega16, , 15 MHz&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|Integrierter UART wird verwendet um den Bluetooth Modul anzubinden.&lt;br /&gt;
&lt;br /&gt;
Sollte die Leistung nicht ausreichen kann entweder der Erweiterungssatz von Nicai-Systems verwendet werden oder nur der Controller wird gegen einen Pinkompatiblen Typ ausgetauscht (z.B. ATMega32, ATMega644, ATMega1284)&lt;br /&gt;
|-&lt;br /&gt;
|Flash:	16	kB&lt;br /&gt;
|-&lt;br /&gt;
|...&lt;br /&gt;
|-&lt;br /&gt;
|...&lt;br /&gt;
|...&lt;br /&gt;
|...&lt;br /&gt;
|-&lt;br /&gt;
|...&lt;br /&gt;
|...&lt;br /&gt;
|...&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|Maße&lt;br /&gt;
|Radumfang: 11,8 cm&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|Diese Maße sind wichtig um den NIBObee so exakt wie möglich am Mittelpunkt des Labyrinthfeldes positionieren zu können.&lt;br /&gt;
|-&lt;br /&gt;
|Abstand Liniensensor zu Radachse: 10,4 cm&lt;br /&gt;
|-&lt;br /&gt;
|Impulse pro Umdrehung: 20&lt;br /&gt;
|}&lt;br /&gt;
=== Ports ===&lt;br /&gt;
Über den UART wird der Bluetooth Modul [[BTM-222]] angebunden. Am NIObee ist diese Schnittstelle am Port X5 verfügbar&lt;br /&gt;
&lt;br /&gt;
=== Resourcen ===&lt;br /&gt;
Folgende Resourcen werden für unsere Implementierung verwendet (&#039;&#039;kursiv&#039;&#039; markierte Resourcen werden bereits durch die Bibliothek belegt):&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Resource&lt;br /&gt;
!Verwendung&lt;br /&gt;
!Interrupts&lt;br /&gt;
!Dateien&lt;br /&gt;
|-&lt;br /&gt;
|Timer 1&lt;br /&gt;
|Motor PWM&lt;br /&gt;
|TIMER1_COMPA_vect, TIMER1_COMPB_vect&lt;br /&gt;
|motpwm.c&lt;br /&gt;
|-&lt;br /&gt;
|ADC&lt;br /&gt;
|Analog, Line&lt;br /&gt;
|ADC_vect&lt;br /&gt;
|analog.c, line.c&lt;br /&gt;
|-&lt;br /&gt;
|EEPROM&lt;br /&gt;
|Line (12 Byte)&lt;br /&gt;
|&lt;br /&gt;
|line.c&lt;br /&gt;
|-&lt;br /&gt;
|Ext. IRQ&lt;br /&gt;
|Odometrie&lt;br /&gt;
|INT0_vect, INT1_vect&lt;br /&gt;
|odometry.c&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Eine für den NIBObee allgemein gültige Auflistung findet man im [http://www.nibo-roboter.de/wiki/NIBObee/Lib/Resourcen NIBObee Wiki].&lt;br /&gt;
&lt;br /&gt;
=== Besondere Erkenntnisse ===&lt;br /&gt;
Es hat sich, nach einigen Fehlschlägen bei der Linienverfolung, herausgestellt dass es ungünstig ist den NIBObee in eine optisch ansprechende waagrechte Position zu bringen indem eine kleinere Halbkugel auf der Unterseite angebracht wird. Der Grund: Nur mit der original Halbkugel und dem damit nach vorne ansteigenden Bodenabstand sind die IR-LED&#039;s weit genug vom Boden entfernt um einen Lichtkegen zu erzeugen der auch vernünftig vom Phototransistor erfasst werden kann. Bei waagrechter Ausrichtung des NIBObee ist dieser Kegel, aufgrund des geringeren Abstands zum Boden, zu klein!&lt;br /&gt;
&lt;br /&gt;
=== Bibliotheksfunktionen ===&lt;br /&gt;
==== Liniensensoren ====&lt;br /&gt;
Die original NIBObee Biliothek wird nicht verwendet. Wurde durch eine eigene Implementierung im [[NIBObee#Line-Modul|Line-Modul]] ersetzt.&lt;br /&gt;
&lt;br /&gt;
==== Motorensteuerung ====&lt;br /&gt;
 motpwm.h&lt;br /&gt;
Die Motoren des NIBObee werden mit PWM ([http://de.wikipedia.org/wiki/Pulsweitenmodulation Pulsweitenmodulation]) angesteuert. Das garantiert natürlich ohne Regelung noch keinen Gleichlauf der beiden Motoren was sich je nach Zustand des Getriebes in einer weiteren oder engernen Kurve zeigt.&lt;br /&gt;
 motpid.h&lt;br /&gt;
Hier stehen Funktionen zur Verfügung die mit Hilfe der Odometrie die Motoren regeln. Diese Funktionen sind für unsere Zwecke allerdings nicht geeignet.&lt;br /&gt;
&lt;br /&gt;
== Aufgaben ==&lt;br /&gt;
Folgende Aufgaben sind im Rahmen des Projekts [[RoLoMa]] vom NIBObee Team zu lösen:&lt;br /&gt;
* Herstellung der Bluetooth Hardware-Erweiterung&lt;br /&gt;
* Softwaremodul zum Bedienen der Bluetooth-Schnittstelle via RS232&lt;br /&gt;
* Softwaremodul zum Erkennen der Linie im Labyrinth und im speziellen der unterschiedlichen Kreuzungstypen&lt;br /&gt;
* Messen des zurückgelegten Weges&lt;br /&gt;
* Steuerung, die den Abstand des Sensors zur Radachse berücksichtigt um den Roboter an der korrekten Stelle um die eigene Achse zu drehen&lt;br /&gt;
* Erstellen eines Abbilds des Labyrinths im Speicher und navigieren bis der Roboter wieder am Startpunkt gelandet ist (z.B. immer Links abbiegen)&lt;br /&gt;
* Implementieren des [[MaDeCo]] Protokolls&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
&lt;br /&gt;
=== Bluetooth ===&lt;br /&gt;
Der Bluetooth Modul ist im Detail auf den Seiten des [[BTM-222]] beschrieben.&lt;br /&gt;
&lt;br /&gt;
=== Liniensensoren ===&lt;br /&gt;
Zum Erkennen der Kreuzungen bei gleichzeitigem folgen der Linie war es notwendig zusätzliche Liniensensoren zu verwenden. Diese wurden mit einer Zusätzplatine in einer Reihe mit den bereits vorhandenen Liniensensoren, allerdings so weit wie möglich linke und rechts außen, montiert. Das einlesen der Analogwerte erfolgt über die beiden Analogeingänge am Stecker X1. Die IR-LEDs sind, analog zu den bestehenden IR-LEDs der vorhandenen Liniensensoren, über den Ausgang 1 am Stecker X4 schaltbar. Dies ist notwendig da jeweils eine Messung mit eingschalteter LED und eine mit ausgeschalteter LED durchgeführt wird. Damit wird der Einfluß des Umgebungslichts korrigiert.&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
Die Aufgaben der Software sollen in möglichst unabhängigen Modulen realisiert werden um das Testen einfacher zu gestalten. Die einzelnen Module sind im Folgenden beschrieben.&lt;br /&gt;
&lt;br /&gt;
=== Architektur ===&lt;br /&gt;
Das Gesamtsystem besteht aus einem zentralen Taktgeber, einem Scheduler und mehreren State Maschinen. Die Kommunikation erfolgt ausschließlich über Events. Die Module können mittels Subscribe einen Event, den ein anderer Modul zur Verfügung steht, abonnieren.&lt;br /&gt;
&lt;br /&gt;
==== Systemtakt, Scheduler ====&lt;br /&gt;
Im Main Modul befindet sich der zentrale Taktgeber der aus dem Interrupt des Timer 2 einen gleichmäßigen Takt von 100Hz erzeugt. Dieser Takt kann von anderen Modulen verwendet werden um zyklische Aufgaben zu erfüllen (z.B. lesen der Liniensensoren). Im Main Modul befindet sich auch der Scheduler der ganz einfach in der Endlosschleife sequenziell jeden Modul aufruft um anstehende Events zu bearbeiten.&lt;br /&gt;
&lt;br /&gt;
==== State / Event Maschinen ====&lt;br /&gt;
Die State / Event Maschinen sind in allen Modulen gleich aufgebaut. Es gibt die folgenden Funktionen (wobei statt &amp;quot;&amp;lt;xx&amp;gt;&amp;quot; das Kürzel des Moduls steht, z.B &amp;quot;dr&amp;quot; für Drive):&lt;br /&gt;
; eine Funktion mit dem Namen &amp;lt;xx&amp;gt;_main (intern)&lt;br /&gt;
: Das ist die eigentliche State Maschine. Wird nicht direkt vom Scheduler aufgerufen sondern über die Funktion &amp;lt;xx&amp;gt;_eventHandler. Hier gibt es ein switch Statement über den aktuellen Zustand und für jeden Zustand ein switch Statement über den empfangenen Event.&lt;br /&gt;
; eine Funktion mit dem Namen &amp;lt;xx&amp;gt;_init (extern)&lt;br /&gt;
: Hier werden Variableninitialisierungen gemacht und die ersten subscribe Aufrufe um Events zu abonnieren. Diese Funktion wird beim Systemstart vom Main Modul aufgerufen.&lt;br /&gt;
; eine Funktion mit dem Namen &amp;lt;xx&amp;gt;_eventHandler (extern)&lt;br /&gt;
: Ist die Funktion die vom Scheduler aufgerufen wird damit die Statemaschine mit dem aktuellen Event, sofern vorhanden, durchlaufen wird.&lt;br /&gt;
; optional Funktionen mit den Namen &amp;lt;xx&amp;gt;_subscribe_&amp;lt;event&amp;gt; und &amp;lt;xx&amp;gt;_unsubscribe_&amp;lt;event&amp;gt; (extern)&lt;br /&gt;
: für jeden Event den dieser Modul verschicken kann ist sowohl eine Subscribe Funktion als auch ein Unsubscribe Funktion vorhanden. Mit diesen Funktionen kann der Event von einem anderen Modul abboniert werden.&lt;br /&gt;
; eine Funktion mit dem Namen &amp;lt;xx&amp;gt;_receiveEvent (intern)&lt;br /&gt;
: ReceiveEvent ist eigentlich eine interne Funktion (wird also nicht im Header File deklariert), der Pointer auf diese Funktion wird allerdings als Callback beim Subscribe übergeben damit der Event dem Modul zugestellt werden kann.&lt;br /&gt;
&lt;br /&gt;
=== Module ===&lt;br /&gt;
Im folgenden sind alle Module und deren Hauptfunktionen aufgelistet.&lt;br /&gt;
&lt;br /&gt;
==== Analog-Modul ====&lt;br /&gt;
Digitalisieren der Analogeingänge&lt;br /&gt;
 Dateien: analog.c&lt;br /&gt;
          analog.h&lt;br /&gt;
Dieser Modul ist abgeleitet von den gleichnamigen Dateien der original NIBObee Bibliothek. Dies war notwendig da wir zusätzliche Liniensensoren verwenden und deren Ansteuerung in gleicher Weise erfolgen sollte. Das bedeutet dass für die entsprechenden Analogeingänge Messungen mit ein- und ausgeschalteten IR-LEDs durchgeführt werden müssen. Außerdem wurde, entsprechend dem Datenblatt des ATMega16 die Behandlung der Messung der Batteriespannung verbessert. Da hier die Referenzspannung umgeschalten wird muss eine Messung verworfen werden bevor mit einem richtigen Ergebnis gerechnet werden kann. Das wurde in der Originalbibliothek nicht berücksichtigt.&lt;br /&gt;
Die einzelnen Werte werden weiterhin über einen A/D-Wandler ermittelt und zwischengespeichert. Es gibt nun 13 analoge Werte (statt bisher 11) die zyklisch digitalisiert werden. Dieser Vorgang wird mit einer Frequenz von ca 117 kHz durchgeführt, d.h. dass jeder dieser Werte ca. alle 111 µs (statt bisher 94 µs) aktualisiert wird.&lt;br /&gt;
&lt;br /&gt;
==== Line-Modul ====&lt;br /&gt;
Ermitteln der Werte der Liniensensoren&lt;br /&gt;
 Dateien: line.c&lt;br /&gt;
          line.h&lt;br /&gt;
Dieser Modul ersetzt die originalen Bibliotheksfunktionen der Liniensensoren. Dies war notwendig da wir zusätzliche Liniensensoren verwenden.&lt;br /&gt;
&lt;br /&gt;
Die Werte der Liniensensoren können nun mit der Funktion&lt;br /&gt;
&amp;lt;code&amp;gt;ln_get(index)&amp;lt;/code&amp;gt;&lt;br /&gt;
gelesen werden. Die Werte selbst werden über den [[NIBObee#Analog-Modul|Analog-Modul]] ermittelt.&lt;br /&gt;
&lt;br /&gt;
==== Communication-Modul ====&lt;br /&gt;
Wickelt die Kommunikation über den Bluetooth Modul ab&lt;br /&gt;
 Dateien: comm.c&lt;br /&gt;
          comm.h&lt;br /&gt;
&lt;br /&gt;
==== Communication-Modul ====&lt;br /&gt;
Wickelt die Kommunikation über den Bluetooth Modul ab&lt;br /&gt;
 Dateien: comm.c&lt;br /&gt;
          comm.h&lt;br /&gt;
&lt;br /&gt;
==== Common-Modul ====&lt;br /&gt;
Stellt gemeinsame Funktionen zurVerfügung&lt;br /&gt;
 Dateien: common.c&lt;br /&gt;
          common.h&lt;br /&gt;
&lt;br /&gt;
==== Distance-Modul ====&lt;br /&gt;
Behandelt die Odometrie Sensoren&lt;br /&gt;
 Dateien: distance.c&lt;br /&gt;
          distance.h&lt;br /&gt;
&lt;br /&gt;
==== Drive-Modul ====&lt;br /&gt;
Bewegt den NIBObee&lt;br /&gt;
 Dateien: drive.c&lt;br /&gt;
          drive.h&lt;br /&gt;
&lt;br /&gt;
==== Follow-Modul ====&lt;br /&gt;
Ist für die Linienverfolgung zuständig&lt;br /&gt;
 Dateien: follow.c&lt;br /&gt;
          follow.h&lt;br /&gt;
&lt;br /&gt;
==== MaDeCo-Modul ====&lt;br /&gt;
Behandelt das MaDeCo Protokoll&lt;br /&gt;
 Dateien: madeco.c&lt;br /&gt;
          madeco.h&lt;br /&gt;
&lt;br /&gt;
==== Main-Modul ====&lt;br /&gt;
Scheduler und zentraler Taktgeber&lt;br /&gt;
 Dateien: main.c&lt;br /&gt;
          main.h&lt;br /&gt;
&lt;br /&gt;
==== Sensor-Modul ====&lt;br /&gt;
Ist für die &amp;quot;Fühler&amp;quot; zuständig&lt;br /&gt;
 Dateien: follow.c&lt;br /&gt;
          follow.h&lt;br /&gt;
&lt;br /&gt;
=== Applikationen ===&lt;br /&gt;
==== Labyrinth erkunden ====&lt;br /&gt;
&lt;br /&gt;
==== Kürzesten Weg durch Labyrinth ====&lt;br /&gt;
&lt;br /&gt;
==== Kalibrierung ====&lt;br /&gt;
Zur Kalibrierung fährt der NIBObee ein Viereck entlang dass genau die Seitenlänge eines der Felder des Labyrinths hat. Dies ist notwendig um relativ einfach die Karte des Labyrinths erstellen zu können.&lt;br /&gt;
&lt;br /&gt;
=== Protokolle und deren Implementierung ===&lt;br /&gt;
==== [[MaDeCo]] ====&lt;br /&gt;
===== Interface Definition =====&lt;br /&gt;
* int set_opmode(OPMODE)&lt;br /&gt;
* int send_waypoint(WAYPOINT)&lt;br /&gt;
* int direct(DIRECTION[])&lt;br /&gt;
* int ack()&lt;br /&gt;
&lt;br /&gt;
==== Schnittstelle [[MaDeCo]] - RS232-Schnittstelle ====&lt;br /&gt;
* pairing&lt;br /&gt;
* Konfigurations-Commands&lt;br /&gt;
* ack&lt;br /&gt;
* read_command&lt;br /&gt;
* send_command&lt;br /&gt;
&lt;br /&gt;
=== Steuerungssoftware ===&lt;br /&gt;
==== Bluetooth Modul einschalten ====&lt;br /&gt;
Durch Bewegen der &amp;quot;Fühler&amp;quot; der NIBObee nach oben bis Einrasten wird das Bluetooth Modul eingeschalten.&lt;br /&gt;
Daraufhin muss auf eingehenden Bluetooth Traffic gelauscht werden.&lt;br /&gt;
&lt;br /&gt;
==== Blink Codes ====&lt;br /&gt;
Bestimmte Events oder Commands lösen bestimmte Blink- oder Leuchtmuster der Status LEDs aus.&lt;br /&gt;
&#039;&#039;&#039;TODO:&#039;&#039;&#039; Spezifikation der Blink Codes&lt;br /&gt;
&lt;br /&gt;
==== Gerade fahren ====&lt;br /&gt;
Das Problem beim geradeaus fahren ist dass der Roboter von der Spur abweichen kann und dann neu ausgerichtet werden muss. Üblicherweise erfolgt das mit Hilfe der Liniensensoren indem, sobald einer der seitlichen Sensoren die Linie erkennt, durch beschleunigen oder bremsen eines Rades in diese Richtung korrigierend gelenkt wird.&lt;br /&gt;
&lt;br /&gt;
In unserem Fall müssen wir diese Korrektur solange verzögern bis der seitliche Liniensensor eine mögliche Kreuzung passiert hat. Erst danach können wir feststellen ob wir nur die schwarze Linie einer Kreuzung überfahren sind oder ob tatsächlich eine Abweichung vorliegt. Die Anzahl der zu ignorierenden Odometrie-Impule kann folgendermaßen errechnet werden:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;Impulse pro Radumdrehung&amp;gt; / &amp;lt;Radumfang&amp;gt; * &amp;lt;Linienbreite&amp;gt; =&lt;br /&gt;
 20 / 11,8 * 1 = 1,69491525&lt;br /&gt;
&lt;br /&gt;
Wir werden also nur zwei Impulse abwarten bevor wir mit der Korrektur beginnen&lt;br /&gt;
&lt;br /&gt;
===== Funktionsaufteilung =====&lt;br /&gt;
Die Zuständigkeiten für diese Aufgabe sind wie folgt:&lt;br /&gt;
;drive Modul&lt;br /&gt;
:sorgt für die Steuerung der Motoren. Reduzieren der Geschwindigkeit eines Rades um eine ausgleichende Kurve zu fahren und stoppen wenn das Ende der geraden Linie erreicht wurde. Dazu aboniert der Modul die Events des line Modul die eine Abweichung von der Linie melden und vom distance Modul den Event zum fahren der Distanz zwischen Liniensensoren und Achse der Räder.&lt;br /&gt;
;line Modul&lt;br /&gt;
:prüft zyklisch die position der Linie unter dem NIBObee und meldet Abweichungen mittels Events. Dieses Melden wird allerdings verzögert bis zumindest die Breite der Linie überfahren wurde. Dazu aboniert der Modul den Event vom distance Modul den Event zum fahren der der Breite der Linie.&lt;br /&gt;
;distance Modul&lt;br /&gt;
:meldet auf Anforderung das zurücklegen einer Strecke in der Länge der Distanz zwischen Liniensensoren und Achse der Räder oder der Breite der Linie.&lt;br /&gt;
&lt;br /&gt;
==== Kreuzung fahren ====&lt;br /&gt;
An einer Kreuzung wird abgebogen indem der NIBObee zuerst unbeirrt geradeaus fährt bis die Achse genau auf dem Mittelpunkt der Kreuzung zu stehen kommt. Danach wird eine Drehung nach rechts oder links durchgeführt bis sich die Linie wieder genau unter dem mittleren Sensor befindet.&lt;br /&gt;
&lt;br /&gt;
Die Sensoren sind von der Achse 10,4 cm entfernt, eine Radumdrehung bewegt den NIBObee um 11,8 cm weiter und bei dieser Umdrehung werden vom Odometriesensor 20 Impulse abgegeben. Die Linienbreite wird 2 cm betragen. Daher errechnet sich die Strecke die nach Erkennen der Kreuzung gefahren werden muss folgendermassen:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;Impulse pro Radumdrehung&amp;gt; / &amp;lt;Radumfang&amp;gt; * (&amp;lt;Achsabstand&amp;gt; - &amp;lt;halbe Linienbreite&amp;gt;) =&lt;br /&gt;
 20 / 11,8 * (10,4 - 0,5) = 16,779661&lt;br /&gt;
&lt;br /&gt;
Nach passieren der Kreuzung muss der NIBObee also noch 17 Impulse über den Odometriesensor empfangen bevor er stoppt.&lt;br /&gt;
&lt;br /&gt;
== Risikoanalyse ==&lt;br /&gt;
Im Folgenden wird versucht für die möglichen Risikopunkte Alternativen aufzuzeigen.&lt;br /&gt;
&lt;br /&gt;
; ATmega16 ist nicht Leisungsfägig genug&lt;br /&gt;
: Es kann auf den [http://www.nicai-systems.com/de/zubehoer/nibobee-tuning-kit.html Tuning-Kit von Nicai-Systems] zurückgerifffen werden. Dies könnte eine nicht akzeptable Verzögerung verursachen (erkennen, bestellen, NIBObee umrüsten)&lt;br /&gt;
&lt;br /&gt;
: Ein beliebiger PIN-kompatiber Microcontroller ATmega... wird statt dem ATmega16 eingesetzt. Die funktioniert soange der Ersatz-µC mit der Frequenz vom 15 MHz betrieben werden kann. Wichtig ist auch dass es adaptierte Bibliotheken gibt die auf den Ersatz-µC abgestimmt sind (z.B. andere Register oder geänderte Adressen für Register, ...)&lt;br /&gt;
&lt;br /&gt;
; Signale am UART mit Bordspannung im Gegensatz zu RS232-Level (12V)&lt;br /&gt;
: Die Signale am UART werden mit Bordspannung erzeugt/erwartet. Für die Kommunikation mit dem BT-Modul ist daher keine Anpassung durchzuführen.&lt;br /&gt;
&lt;br /&gt;
: Soll zu Testzwecken ein PC über RS232 angeschalten werden ist unbedingt auf die Spannung achten. Möglicherweise verwendet ein USB-RS232 Adapter nicht die 12V sonder nur 5V.&lt;br /&gt;
&lt;br /&gt;
== Open Issues ==&lt;br /&gt;
* Es muss noch überprüft werden ob die NIBObee Hardware ausreichend leistungsfähig ist oder ein Upgrade gemacht werden muss.&lt;br /&gt;
* Wie kann das verlassen der Spur von dem Überfahren einer Kreuzung unterschieden werden? Wenn es hier zu Problemen kommt könnten zwei zusätzliche lichtempfindliche Sensoren rechts und links oder noch ein Element mit drei zusätzlichen Sensoren auf Höhe der Achsen angebracht werden -&amp;gt; Mehraufwand!&lt;br /&gt;
* Soll Aktivierung der BT-Schnittstelle manuell erfolgen?&lt;br /&gt;
* Soll der Betriebsmodus gewählt werden können?&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* [http://www.nicai-systems.de/nibobee.html NIBObee Homepage bei Nicai Systems]&lt;br /&gt;
* [http://download.nicai-systems.com/nibo/Tutorial_NIBObee_20091123.pdf NIBObee - Tutorial zur Programmierung]&lt;br /&gt;
* [http://www.nicai-systems.com/de/zubehoer/nibobee-tuning-kit.html NIBObee - Tuning-Kit von Nicai-Systems]&lt;br /&gt;
* [http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/Der_UART Tutorial zur USART Programmierung]&lt;br /&gt;
[[Kategorie:FH]]&lt;/div&gt;</summary>
		<author><name>Alois</name></author>
	</entry>
	<entry>
		<id>https://wiki.callooh.com/index.php?title=NIBObee&amp;diff=859</id>
		<title>NIBObee</title>
		<link rel="alternate" type="text/html" href="https://wiki.callooh.com/index.php?title=NIBObee&amp;diff=859"/>
		<updated>2011-05-02T09:45:45Z</updated>

		<summary type="html">&lt;p&gt;Alois: /* Module */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;NIBObee ist der Roboter der im Projekt [[RoLoMa]] verwendet wird.&lt;br /&gt;
== Technische Daten ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Art&lt;br /&gt;
!Typ&lt;br /&gt;
!Bemerkung&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|Mikrocontroller&lt;br /&gt;
|ATMEL ATMega16, , 15 MHz&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|Integrierter UART wird verwendet um den Bluetooth Modul anzubinden.&lt;br /&gt;
&lt;br /&gt;
Sollte die Leistung nicht ausreichen kann entweder der Erweiterungssatz von Nicai-Systems verwendet werden oder nur der Controller wird gegen einen Pinkompatiblen Typ ausgetauscht (z.B. ATMega32, ATMega644, ATMega1284)&lt;br /&gt;
|-&lt;br /&gt;
|Flash:	16	kB&lt;br /&gt;
|-&lt;br /&gt;
|...&lt;br /&gt;
|-&lt;br /&gt;
|...&lt;br /&gt;
|...&lt;br /&gt;
|...&lt;br /&gt;
|-&lt;br /&gt;
|...&lt;br /&gt;
|...&lt;br /&gt;
|...&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|Maße&lt;br /&gt;
|Radumfang: 11,8 cm&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|Diese Maße sind wichtig um den NIBObee so exakt wie möglich am Mittelpunkt des Labyrinthfeldes positionieren zu können.&lt;br /&gt;
|-&lt;br /&gt;
|Abstand Liniensensor zu Radachse: 10,4 cm&lt;br /&gt;
|-&lt;br /&gt;
|Impulse pro Umdrehung: 20&lt;br /&gt;
|}&lt;br /&gt;
=== Ports ===&lt;br /&gt;
Über den UART wird der Bluetooth Modul [[BTM-222]] angebunden. Am NIObee ist diese Schnittstelle am Port X5 verfügbar&lt;br /&gt;
&lt;br /&gt;
=== Resourcen ===&lt;br /&gt;
Folgende Resourcen werden für unsere Implementierung verwendet (&#039;&#039;kursiv&#039;&#039; markierte Resourcen werden bereits durch die Bibliothek belegt):&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Resource&lt;br /&gt;
!Verwendung&lt;br /&gt;
!Interrupts&lt;br /&gt;
!Dateien&lt;br /&gt;
|-&lt;br /&gt;
|Timer 1&lt;br /&gt;
|Motor PWM&lt;br /&gt;
|TIMER1_COMPA_vect, TIMER1_COMPB_vect&lt;br /&gt;
|motpwm.c&lt;br /&gt;
|-&lt;br /&gt;
|ADC&lt;br /&gt;
|Analog, Line&lt;br /&gt;
|ADC_vect&lt;br /&gt;
|analog.c, line.c&lt;br /&gt;
|-&lt;br /&gt;
|EEPROM&lt;br /&gt;
|Line (12 Byte)&lt;br /&gt;
|&lt;br /&gt;
|line.c&lt;br /&gt;
|-&lt;br /&gt;
|Ext. IRQ&lt;br /&gt;
|Odometrie&lt;br /&gt;
|INT0_vect, INT1_vect&lt;br /&gt;
|odometry.c&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Eine für den NIBObee allgemein gültige Auflistung findet man im [http://www.nibo-roboter.de/wiki/NIBObee/Lib/Resourcen NIBObee Wiki].&lt;br /&gt;
&lt;br /&gt;
=== Besondere Erkenntnisse ===&lt;br /&gt;
Es hat sich, nach einigen Fehlschlägen bei der Linienverfolung, herausgestellt dass es ungünstig ist den NIBObee in eine optisch ansprechende waagrechte Position zu bringen indem eine kleinere Halbkugel auf der Unterseite angebracht wird. Der Grund: Nur mit der original Halbkugel und dem damit nach vorne ansteigenden Bodenabstand sind die IR-LED&#039;s weit genug vom Boden entfernt um einen Lichtkegen zu erzeugen der auch vernünftig vom Phototransistor erfasst werden kann. Bei waagrechter Ausrichtung des NIBObee ist dieser Kegel, aufgrund des geringeren Abstands zum Boden, zu klein!&lt;br /&gt;
&lt;br /&gt;
=== Bibliotheksfunktionen ===&lt;br /&gt;
==== Liniensensoren ====&lt;br /&gt;
Die original NIBObee Biliothek wird nicht verwendet. Wurde durch eine eigene Implementierung im [[NIBObee#Line-Modul|Line-Modul]] ersetzt.&lt;br /&gt;
&lt;br /&gt;
==== Motorensteuerung ====&lt;br /&gt;
 motpwm.h&lt;br /&gt;
Die Motoren des NIBObee werden mit PWM ([http://de.wikipedia.org/wiki/Pulsweitenmodulation Pulsweitenmodulation]) angesteuert. Das garantiert natürlich ohne Regelung noch keinen gleichlauf der beiden Motoren was sich je nach Zustand des Getriebes in einer weiteren oder engernen Kurve zeigt.&lt;br /&gt;
 motpid.h&lt;br /&gt;
Hier stehen Funktionen zur Verfügung die mit Hilfe der Odometrie die Motoren regeln. Diese Funktionen sind für unsere Zwecke allerdings nicht geeignet.&lt;br /&gt;
&lt;br /&gt;
== Aufgaben ==&lt;br /&gt;
Folgende Aufgaben sind im Rahmen des Projekts [[RoLoMa]] vom NIBObee Team zu lösen:&lt;br /&gt;
* Herstellung der Bluetooth Hardware-Erweiterung&lt;br /&gt;
* Softwaremodul zum Bedienen der Bluetooth-Schnittstelle via RS232&lt;br /&gt;
* Softwaremodul zum Erkennen der Linie im Labyrinth und im speziellen der unterschiedlichen Kreuzungstypen&lt;br /&gt;
* Messen des zurückgelegten Weges&lt;br /&gt;
* Steuerung, die den Abstand des Sensors zur Radachse berücksichtigt um den Roboter an der korrekten Stelle um die eigene Achse zu drehen&lt;br /&gt;
* Erstellen eines Abbilds des Labyrinths im Speicher und navigieren bis der Roboter wieder am Startpunkt gelandet ist (z.B. immer Links abbiegen)&lt;br /&gt;
* Implementieren des [[MaDeCo]] Protokolls&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
&lt;br /&gt;
=== Bluetooth ===&lt;br /&gt;
Der Bluetooth Modul ist im Detail auf den Seiten des [[BTM-222]] beschrieben.&lt;br /&gt;
&lt;br /&gt;
=== Liniensensoren ===&lt;br /&gt;
Zum Erkennen der Kreuzungen bei gleichzeitigem folgen der Linie war es notwendig zusätzliche Liniensensoren zu verwenden. Diese wurden mit einer Zusätzplatine in einer Reihe mit den bereits vorhandenen Liniensensoren, allerdings so weit wie möglich linke und rechts außen, montiert. Das einlesen der Analogwerte erfolgt über die beiden Analogeingänge am Stecker X1. Die IR-LEDs sind, analog zu den bestehenden IR-LEDs der vorhandenen Liniensensoren, über den Ausgang 1 am Stecker X4 schaltbar. Dies ist notwendig da jeweils eine Messung mit eingschalteter LED und eine mit ausgeschalteter LED durchgeführt wird. Damit wird der Einfluß des Umgebungslichts korrigiert.&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
Die Aufgaben der Software sollen in möglichst unabhängigen Modulen realisiert werden um das Testen einfacher zu gestalten. Die einzelnen Module sind im Folgenden beschrieben.&lt;br /&gt;
&lt;br /&gt;
=== Architektur ===&lt;br /&gt;
Das Gesamtsystem besteht aus einem zentralen Taktgeber, einem Scheduler und mehreren State Maschinen. Die Kommunikation erfolgt ausschließlich über Events. Die Module können mittels Subscribe einen Event, den ein anderer Modul zur Verfügung steht, abonnieren.&lt;br /&gt;
&lt;br /&gt;
==== Systemtakt, Scheduler ====&lt;br /&gt;
Im Main Modul befindet sich der zentrale Taktgeber der aus dem Interrupt des Timer 2 einen gleichmäßigen Takt von 100Hz erzeugt. Dieser Takt kann von anderen Modulen verwendet werden um zyklische Aufgaben zu erfüllen (z.B. lesen der Liniensensoren). Im Main Modul befindet sich auch der Scheduler der ganz einfach in der Endlosschleife sequenziell jeden Modul aufruft um anstehende Events zu bearbeiten.&lt;br /&gt;
&lt;br /&gt;
==== State / Event Maschinen ====&lt;br /&gt;
Die State / Event Maschinen sind in allen Modulen gleich aufgebaut. Es gibt die folgenden Funktionen (wobei statt &amp;quot;&amp;lt;xx&amp;gt;&amp;quot; das Kürzel des Moduls steht, z.B &amp;quot;dr&amp;quot; für Drive):&lt;br /&gt;
; eine Funktion mit dem Namen &amp;lt;xx&amp;gt;_main (intern)&lt;br /&gt;
: Das ist die eigentliche State Maschine. Wird nicht direkt vom Scheduler aufgerufen sondern über die Funktion &amp;lt;xx&amp;gt;_eventHandler. Hier gibt es ein switch Statement über den aktuellen Zustand und für jeden Zustand ein switch Statement über den empfangenen Event.&lt;br /&gt;
; eine Funktion mit dem Namen &amp;lt;xx&amp;gt;_init (extern)&lt;br /&gt;
: Hier werden Variableninitialisierungen gemacht und die ersten subscribe Aufrufe um Events zu abonnieren. Diese Funktion wird beim Systemstart vom Main Modul aufgerufen.&lt;br /&gt;
; eine Funktion mit dem Namen &amp;lt;xx&amp;gt;_eventHandler (extern)&lt;br /&gt;
: Ist die Funktion die vom Scheduler aufgerufen wird damit die Statemaschine mit dem aktuellen Event, sofern vorhanden, durchlaufen wird.&lt;br /&gt;
; optional Funktionen mit den Namen &amp;lt;xx&amp;gt;_subscribe_&amp;lt;event&amp;gt; und &amp;lt;xx&amp;gt;_unsubscribe_&amp;lt;event&amp;gt; (extern)&lt;br /&gt;
: für jeden Event den dieser Modul verschicken kann ist sowohl eine Subscribe Funktion als auch ein Unsubscribe Funktion vorhanden. Mit diesen Funktionen kann der Event von einem anderen Modul abboniert werden.&lt;br /&gt;
; eine Funktion mit dem Namen &amp;lt;xx&amp;gt;_receiveEvent (intern)&lt;br /&gt;
: ReceiveEvent ist eigentlich eine interne Funktion (wird also nicht im Header File deklariert), der Pointer auf diese Funktion wird allerdings als Callback beim Subscribe übergeben damit der Event dem Modul zugestellt werden kann.&lt;br /&gt;
&lt;br /&gt;
=== Module ===&lt;br /&gt;
Im folgenden sind alle Module und deren Hauptfunktionen aufgelistet.&lt;br /&gt;
&lt;br /&gt;
==== Analog-Modul ====&lt;br /&gt;
Digitalisieren der Analogeingänge&lt;br /&gt;
 Dateien: analog.c&lt;br /&gt;
          analog.h&lt;br /&gt;
Dieser Modul ist abgeleitet von den gleichnamigen Dateien der original NIBObee Bibliothek. Dies war notwendig da wir zusätzliche Liniensensoren verwenden und deren Ansteuerung in gleicher Weise erfolgen sollte. Das bedeutet dass für die entsprechenden Analogeingänge Messungen mit ein- und ausgeschalteten IR-LEDs durchgeführt werden müssen. Außerdem wurde, entsprechend dem Datenblatt des ATMega16 die Behandlung der Messung der Batteriespannung verbessert. Da hier die Referenzspannung umgeschalten wird muss eine Messung verworfen werden bevor mit einem richtigen Ergebnis gerechnet werden kann. Das wurde in der Originalbibliothek nicht berücksichtigt.&lt;br /&gt;
Die einzelnen Werte werden weiterhin über einen A/D-Wandler ermittelt und zwischengespeichert. Es gibt nun 13 analoge Werte (statt bisher 11) die zyklisch digitalisiert werden. Dieser Vorgang wird mit einer Frequenz von ca 117 kHz durchgeführt, d.h. dass jeder dieser Werte ca. alle 111 µs (statt bisher 94 µs) aktualisiert wird.&lt;br /&gt;
&lt;br /&gt;
==== Line-Modul ====&lt;br /&gt;
Ermitteln der Werte der Liniensensoren&lt;br /&gt;
 Dateien: line.c&lt;br /&gt;
          line.h&lt;br /&gt;
Dieser Modul ersetzt die originalen Bibliotheksfunktionen der Liniensensoren. Dies war notwendig da wir zusätzliche Liniensensoren verwenden.&lt;br /&gt;
&lt;br /&gt;
Die Werte der Liniensensoren können nun mit der Funktion&lt;br /&gt;
&amp;lt;code&amp;gt;ln_get(index)&amp;lt;/code&amp;gt;&lt;br /&gt;
gelesen werden. Die Werte selbst werden über den [[NIBObee#Analog-Modul|Analog-Modul]] ermittelt.&lt;br /&gt;
&lt;br /&gt;
==== Communication-Modul ====&lt;br /&gt;
Wickelt die Kommunikation über den Bluetooth Modul ab&lt;br /&gt;
 Dateien: comm.c&lt;br /&gt;
          comm.h&lt;br /&gt;
&lt;br /&gt;
==== Communication-Modul ====&lt;br /&gt;
Wickelt die Kommunikation über den Bluetooth Modul ab&lt;br /&gt;
 Dateien: comm.c&lt;br /&gt;
          comm.h&lt;br /&gt;
&lt;br /&gt;
==== Common-Modul ====&lt;br /&gt;
Stellt gemeinsame Funktionen zurVerfügung&lt;br /&gt;
 Dateien: common.c&lt;br /&gt;
          common.h&lt;br /&gt;
&lt;br /&gt;
==== Distance-Modul ====&lt;br /&gt;
Behandelt die Odometrie Sensoren&lt;br /&gt;
 Dateien: distance.c&lt;br /&gt;
          distance.h&lt;br /&gt;
&lt;br /&gt;
==== Drive-Modul ====&lt;br /&gt;
Bewegt den NIBObee&lt;br /&gt;
 Dateien: drive.c&lt;br /&gt;
          drive.h&lt;br /&gt;
&lt;br /&gt;
==== Follow-Modul ====&lt;br /&gt;
Ist für die Linienverfolgung zuständig&lt;br /&gt;
 Dateien: follow.c&lt;br /&gt;
          follow.h&lt;br /&gt;
&lt;br /&gt;
==== MaDeCo-Modul ====&lt;br /&gt;
Behandelt das MaDeCo Protokoll&lt;br /&gt;
 Dateien: madeco.c&lt;br /&gt;
          madeco.h&lt;br /&gt;
&lt;br /&gt;
==== Main-Modul ====&lt;br /&gt;
Scheduler und zentraler Taktgeber&lt;br /&gt;
 Dateien: main.c&lt;br /&gt;
          main.h&lt;br /&gt;
&lt;br /&gt;
==== Sensor-Modul ====&lt;br /&gt;
Ist für die &amp;quot;Fühler&amp;quot; zuständig&lt;br /&gt;
 Dateien: follow.c&lt;br /&gt;
          follow.h&lt;br /&gt;
&lt;br /&gt;
=== Applikationen ===&lt;br /&gt;
==== Labyrinth erkunden ====&lt;br /&gt;
&lt;br /&gt;
==== Kürzesten Weg durch Labyrinth ====&lt;br /&gt;
&lt;br /&gt;
==== Kalibrierung ====&lt;br /&gt;
Zur Kalibrierung fährt der NIBObee ein Viereck entlang dass genau die Seitenlänge eines der Felder des Labyrinths hat. Dies ist notwendig um relativ einfach die Karte des Labyrinths erstellen zu können.&lt;br /&gt;
&lt;br /&gt;
=== Protokolle und deren Implementierung ===&lt;br /&gt;
==== [[MaDeCo]] ====&lt;br /&gt;
===== Interface Definition =====&lt;br /&gt;
* int set_opmode(OPMODE)&lt;br /&gt;
* int send_waypoint(WAYPOINT)&lt;br /&gt;
* int direct(DIRECTION[])&lt;br /&gt;
* int ack()&lt;br /&gt;
&lt;br /&gt;
==== Schnittstelle [[MaDeCo]] - RS232-Schnittstelle ====&lt;br /&gt;
* pairing&lt;br /&gt;
* Konfigurations-Commands&lt;br /&gt;
* ack&lt;br /&gt;
* read_command&lt;br /&gt;
* send_command&lt;br /&gt;
&lt;br /&gt;
=== Steuerungssoftware ===&lt;br /&gt;
==== Bluetooth Modul einschalten ====&lt;br /&gt;
Durch Bewegen der &amp;quot;Fühler&amp;quot; der NIBObee nach oben bis Einrasten wird das Bluetooth Modul eingeschalten.&lt;br /&gt;
Daraufhin muss auf eingehenden Bluetooth Traffic gelauscht werden.&lt;br /&gt;
&lt;br /&gt;
==== Blink Codes ====&lt;br /&gt;
Bestimmte Events oder Commands lösen bestimmte Blink- oder Leuchtmuster der Status LEDs aus.&lt;br /&gt;
&#039;&#039;&#039;TODO:&#039;&#039;&#039; Spezifikation der Blink Codes&lt;br /&gt;
&lt;br /&gt;
==== Gerade fahren ====&lt;br /&gt;
Das Problem beim geradeaus fahren ist dass der Roboter von der Spur abweichen kann und dann neu ausgerichtet werden muss. Üblicherweise erfolgt das mit Hilfe der Liniensensoren indem, sobald einer der seitlichen Sensoren die Linie erkennt, durch beschleunigen oder bremsen eines Rades in diese Richtung korrigierend gelenkt wird.&lt;br /&gt;
&lt;br /&gt;
In unserem Fall müssen wir diese Korrektur solange verzögern bis der seitliche Liniensensor eine mögliche Kreuzung passiert hat. Erst danach können wir feststellen ob wir nur die schwarze Linie einer Kreuzung überfahren sind oder ob tatsächlich eine Abweichung vorliegt. Die Anzahl der zu ignorierenden Odometrie-Impule kann folgendermaßen errechnet werden:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;Impulse pro Radumdrehung&amp;gt; / &amp;lt;Radumfang&amp;gt; * &amp;lt;Linienbreite&amp;gt; =&lt;br /&gt;
 20 / 11,8 * 1 = 1,69491525&lt;br /&gt;
&lt;br /&gt;
Wir werden also nur zwei Impulse abwarten bevor wir mit der Korrektur beginnen&lt;br /&gt;
&lt;br /&gt;
===== Funktionsaufteilung =====&lt;br /&gt;
Die Zuständigkeiten für diese Aufgabe sind wie folgt:&lt;br /&gt;
;drive Modul&lt;br /&gt;
:sorgt für die Steuerung der Motoren. Reduzieren der Geschwindigkeit eines Rades um eine ausgleichende Kurve zu fahren und stoppen wenn das Ende der geraden Linie erreicht wurde. Dazu aboniert der Modul die Events des line Modul die eine Abweichung von der Linie melden und vom distance Modul den Event zum fahren der Distanz zwischen Liniensensoren und Achse der Räder.&lt;br /&gt;
;line Modul&lt;br /&gt;
:prüft zyklisch die position der Linie unter dem NIBObee und meldet Abweichungen mittels Events. Dieses Melden wird allerdings verzögert bis zumindest die Breite der Linie überfahren wurde. Dazu aboniert der Modul den Event vom distance Modul den Event zum fahren der der Breite der Linie.&lt;br /&gt;
;distance Modul&lt;br /&gt;
:meldet auf Anforderung das zurücklegen einer Strecke in der Länge der Distanz zwischen Liniensensoren und Achse der Räder oder der Breite der Linie.&lt;br /&gt;
&lt;br /&gt;
==== Kreuzung fahren ====&lt;br /&gt;
An einer Kreuzung wird abgebogen indem der NIBObee zuerst unbeirrt geradeaus fährt bis die Achse genau auf dem Mittelpunkt der Kreuzung zu stehen kommt. Danach wird eine Drehung nach rechts oder links durchgeführt bis sich die Linie wieder genau unter dem mittleren Sensor befindet.&lt;br /&gt;
&lt;br /&gt;
Die Sensoren sind von der Achse 10,4 cm entfernt, eine Radumdrehung bewegt den NIBObee um 11,8 cm weiter und bei dieser Umdrehung werden vom Odometriesensor 20 Impulse abgegeben. Die Linienbreite wird 2 cm betragen. Daher errechnet sich die Strecke die nach Erkennen der Kreuzung gefahren werden muss folgendermassen:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;Impulse pro Radumdrehung&amp;gt; / &amp;lt;Radumfang&amp;gt; * (&amp;lt;Achsabstand&amp;gt; - &amp;lt;halbe Linienbreite&amp;gt;) =&lt;br /&gt;
 20 / 11,8 * (10,4 - 0,5) = 16,779661&lt;br /&gt;
&lt;br /&gt;
Nach passieren der Kreuzung muss der NIBObee also noch 17 Impulse über den Odometriesensor empfangen bevor er stoppt.&lt;br /&gt;
&lt;br /&gt;
== Risikoanalyse ==&lt;br /&gt;
Im Folgenden wird versucht für die möglichen Risikopunkte Alternativen aufzuzeigen.&lt;br /&gt;
&lt;br /&gt;
; ATmega16 ist nicht Leisungsfägig genug&lt;br /&gt;
: Es kann auf den [http://www.nicai-systems.com/de/zubehoer/nibobee-tuning-kit.html Tuning-Kit von Nicai-Systems] zurückgerifffen werden. Dies könnte eine nicht akzeptable Verzögerung verursachen (erkennen, bestellen, NIBObee umrüsten)&lt;br /&gt;
&lt;br /&gt;
: Ein beliebiger PIN-kompatiber Microcontroller ATmega... wird statt dem ATmega16 eingesetzt. Die funktioniert soange der Ersatz-µC mit der Frequenz vom 15 MHz betrieben werden kann. Wichtig ist auch dass es adaptierte Bibliotheken gibt die auf den Ersatz-µC abgestimmt sind (z.B. andere Register oder geänderte Adressen für Register, ...)&lt;br /&gt;
&lt;br /&gt;
; Signale am UART mit Bordspannung im Gegensatz zu RS232-Level (12V)&lt;br /&gt;
: Die Signale am UART werden mit Bordspannung erzeugt/erwartet. Für die Kommunikation mit dem BT-Modul ist daher keine Anpassung durchzuführen.&lt;br /&gt;
&lt;br /&gt;
: Soll zu Testzwecken ein PC über RS232 angeschalten werden ist unbedingt auf die Spannung achten. Möglicherweise verwendet ein USB-RS232 Adapter nicht die 12V sonder nur 5V.&lt;br /&gt;
&lt;br /&gt;
== Open Issues ==&lt;br /&gt;
* Es muss noch überprüft werden ob die NIBObee Hardware ausreichend leistungsfähig ist oder ein Upgrade gemacht werden muss.&lt;br /&gt;
* Wie kann das verlassen der Spur von dem Überfahren einer Kreuzung unterschieden werden? Wenn es hier zu Problemen kommt könnten zwei zusätzliche lichtempfindliche Sensoren rechts und links oder noch ein Element mit drei zusätzlichen Sensoren auf Höhe der Achsen angebracht werden -&amp;gt; Mehraufwand!&lt;br /&gt;
* Soll Aktivierung der BT-Schnittstelle manuell erfolgen?&lt;br /&gt;
* Soll der Betriebsmodus gewählt werden können?&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* [http://www.nicai-systems.de/nibobee.html NIBObee Homepage bei Nicai Systems]&lt;br /&gt;
* [http://download.nicai-systems.com/nibo/Tutorial_NIBObee_20091123.pdf NIBObee - Tutorial zur Programmierung]&lt;br /&gt;
* [http://www.nicai-systems.com/de/zubehoer/nibobee-tuning-kit.html NIBObee - Tuning-Kit von Nicai-Systems]&lt;br /&gt;
* [http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/Der_UART Tutorial zur USART Programmierung]&lt;br /&gt;
[[Kategorie:FH]]&lt;/div&gt;</summary>
		<author><name>Alois</name></author>
	</entry>
	<entry>
		<id>https://wiki.callooh.com/index.php?title=NIBObee&amp;diff=858</id>
		<title>NIBObee</title>
		<link rel="alternate" type="text/html" href="https://wiki.callooh.com/index.php?title=NIBObee&amp;diff=858"/>
		<updated>2011-05-02T09:38:29Z</updated>

		<summary type="html">&lt;p&gt;Alois: /* Analog-Modul */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;NIBObee ist der Roboter der im Projekt [[RoLoMa]] verwendet wird.&lt;br /&gt;
== Technische Daten ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Art&lt;br /&gt;
!Typ&lt;br /&gt;
!Bemerkung&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|Mikrocontroller&lt;br /&gt;
|ATMEL ATMega16, , 15 MHz&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|Integrierter UART wird verwendet um den Bluetooth Modul anzubinden.&lt;br /&gt;
&lt;br /&gt;
Sollte die Leistung nicht ausreichen kann entweder der Erweiterungssatz von Nicai-Systems verwendet werden oder nur der Controller wird gegen einen Pinkompatiblen Typ ausgetauscht (z.B. ATMega32, ATMega644, ATMega1284)&lt;br /&gt;
|-&lt;br /&gt;
|Flash:	16	kB&lt;br /&gt;
|-&lt;br /&gt;
|...&lt;br /&gt;
|-&lt;br /&gt;
|...&lt;br /&gt;
|...&lt;br /&gt;
|...&lt;br /&gt;
|-&lt;br /&gt;
|...&lt;br /&gt;
|...&lt;br /&gt;
|...&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|Maße&lt;br /&gt;
|Radumfang: 11,8 cm&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|Diese Maße sind wichtig um den NIBObee so exakt wie möglich am Mittelpunkt des Labyrinthfeldes positionieren zu können.&lt;br /&gt;
|-&lt;br /&gt;
|Abstand Liniensensor zu Radachse: 10,4 cm&lt;br /&gt;
|-&lt;br /&gt;
|Impulse pro Umdrehung: 20&lt;br /&gt;
|}&lt;br /&gt;
=== Ports ===&lt;br /&gt;
Über den UART wird der Bluetooth Modul [[BTM-222]] angebunden. Am NIObee ist diese Schnittstelle am Port X5 verfügbar&lt;br /&gt;
&lt;br /&gt;
=== Resourcen ===&lt;br /&gt;
Folgende Resourcen werden für unsere Implementierung verwendet (&#039;&#039;kursiv&#039;&#039; markierte Resourcen werden bereits durch die Bibliothek belegt):&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Resource&lt;br /&gt;
!Verwendung&lt;br /&gt;
!Interrupts&lt;br /&gt;
!Dateien&lt;br /&gt;
|-&lt;br /&gt;
|Timer 1&lt;br /&gt;
|Motor PWM&lt;br /&gt;
|TIMER1_COMPA_vect, TIMER1_COMPB_vect&lt;br /&gt;
|motpwm.c&lt;br /&gt;
|-&lt;br /&gt;
|ADC&lt;br /&gt;
|Analog, Line&lt;br /&gt;
|ADC_vect&lt;br /&gt;
|analog.c, line.c&lt;br /&gt;
|-&lt;br /&gt;
|EEPROM&lt;br /&gt;
|Line (12 Byte)&lt;br /&gt;
|&lt;br /&gt;
|line.c&lt;br /&gt;
|-&lt;br /&gt;
|Ext. IRQ&lt;br /&gt;
|Odometrie&lt;br /&gt;
|INT0_vect, INT1_vect&lt;br /&gt;
|odometry.c&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Eine für den NIBObee allgemein gültige Auflistung findet man im [http://www.nibo-roboter.de/wiki/NIBObee/Lib/Resourcen NIBObee Wiki].&lt;br /&gt;
&lt;br /&gt;
=== Besondere Erkenntnisse ===&lt;br /&gt;
Es hat sich, nach einigen Fehlschlägen bei der Linienverfolung, herausgestellt dass es ungünstig ist den NIBObee in eine optisch ansprechende waagrechte Position zu bringen indem eine kleinere Halbkugel auf der Unterseite angebracht wird. Der Grund: Nur mit der original Halbkugel und dem damit nach vorne ansteigenden Bodenabstand sind die IR-LED&#039;s weit genug vom Boden entfernt um einen Lichtkegen zu erzeugen der auch vernünftig vom Phototransistor erfasst werden kann. Bei waagrechter Ausrichtung des NIBObee ist dieser Kegel, aufgrund des geringeren Abstands zum Boden, zu klein!&lt;br /&gt;
&lt;br /&gt;
=== Bibliotheksfunktionen ===&lt;br /&gt;
==== Liniensensoren ====&lt;br /&gt;
Die original NIBObee Biliothek wird nicht verwendet. Wurde durch eine eigene Implementierung im [[NIBObee#Line-Modul|Line-Modul]] ersetzt.&lt;br /&gt;
&lt;br /&gt;
==== Motorensteuerung ====&lt;br /&gt;
 motpwm.h&lt;br /&gt;
Die Motoren des NIBObee werden mit PWM ([http://de.wikipedia.org/wiki/Pulsweitenmodulation Pulsweitenmodulation]) angesteuert. Das garantiert natürlich ohne Regelung noch keinen gleichlauf der beiden Motoren was sich je nach Zustand des Getriebes in einer weiteren oder engernen Kurve zeigt.&lt;br /&gt;
 motpid.h&lt;br /&gt;
Hier stehen Funktionen zur Verfügung die mit Hilfe der Odometrie die Motoren regeln. Diese Funktionen sind für unsere Zwecke allerdings nicht geeignet.&lt;br /&gt;
&lt;br /&gt;
== Aufgaben ==&lt;br /&gt;
Folgende Aufgaben sind im Rahmen des Projekts [[RoLoMa]] vom NIBObee Team zu lösen:&lt;br /&gt;
* Herstellung der Bluetooth Hardware-Erweiterung&lt;br /&gt;
* Softwaremodul zum Bedienen der Bluetooth-Schnittstelle via RS232&lt;br /&gt;
* Softwaremodul zum Erkennen der Linie im Labyrinth und im speziellen der unterschiedlichen Kreuzungstypen&lt;br /&gt;
* Messen des zurückgelegten Weges&lt;br /&gt;
* Steuerung, die den Abstand des Sensors zur Radachse berücksichtigt um den Roboter an der korrekten Stelle um die eigene Achse zu drehen&lt;br /&gt;
* Erstellen eines Abbilds des Labyrinths im Speicher und navigieren bis der Roboter wieder am Startpunkt gelandet ist (z.B. immer Links abbiegen)&lt;br /&gt;
* Implementieren des [[MaDeCo]] Protokolls&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
&lt;br /&gt;
=== Bluetooth ===&lt;br /&gt;
Der Bluetooth Modul ist im Detail auf den Seiten des [[BTM-222]] beschrieben.&lt;br /&gt;
&lt;br /&gt;
=== Liniensensoren ===&lt;br /&gt;
Zum Erkennen der Kreuzungen bei gleichzeitigem folgen der Linie war es notwendig zusätzliche Liniensensoren zu verwenden. Diese wurden mit einer Zusätzplatine in einer Reihe mit den bereits vorhandenen Liniensensoren, allerdings so weit wie möglich linke und rechts außen, montiert. Das einlesen der Analogwerte erfolgt über die beiden Analogeingänge am Stecker X1. Die IR-LEDs sind, analog zu den bestehenden IR-LEDs der vorhandenen Liniensensoren, über den Ausgang 1 am Stecker X4 schaltbar. Dies ist notwendig da jeweils eine Messung mit eingschalteter LED und eine mit ausgeschalteter LED durchgeführt wird. Damit wird der Einfluß des Umgebungslichts korrigiert.&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
Die Aufgaben der Software sollen in möglichst unabhängigen Modulen realisiert werden um das Testen einfacher zu gestalten. Die einzelnen Module sind im Folgenden beschrieben.&lt;br /&gt;
&lt;br /&gt;
=== Architektur ===&lt;br /&gt;
Das Gesamtsystem besteht aus einem zentralen Taktgeber, einem Scheduler und mehreren State Maschinen. Die Kommunikation erfolgt ausschließlich über Events. Die Module können mittels Subscribe einen Event, den ein anderer Modul zur Verfügung steht, abonnieren.&lt;br /&gt;
&lt;br /&gt;
==== Systemtakt, Scheduler ====&lt;br /&gt;
Im Main Modul befindet sich der zentrale Taktgeber der aus dem Interrupt des Timer 2 einen gleichmäßigen Takt von 100Hz erzeugt. Dieser Takt kann von anderen Modulen verwendet werden um zyklische Aufgaben zu erfüllen (z.B. lesen der Liniensensoren). Im Main Modul befindet sich auch der Scheduler der ganz einfach in der Endlosschleife sequenziell jeden Modul aufruft um anstehende Events zu bearbeiten.&lt;br /&gt;
&lt;br /&gt;
==== State / Event Maschinen ====&lt;br /&gt;
Die State / Event Maschinen sind in allen Modulen gleich aufgebaut. Es gibt die folgenden Funktionen (wobei statt &amp;quot;&amp;lt;xx&amp;gt;&amp;quot; das Kürzel des Moduls steht, z.B &amp;quot;dr&amp;quot; für Drive):&lt;br /&gt;
; eine Funktion mit dem Namen &amp;lt;xx&amp;gt;_main (intern)&lt;br /&gt;
: Das ist die eigentliche State Maschine. Wird nicht direkt vom Scheduler aufgerufen sondern über die Funktion &amp;lt;xx&amp;gt;_eventHandler. Hier gibt es ein switch Statement über den aktuellen Zustand und für jeden Zustand ein switch Statement über den empfangenen Event.&lt;br /&gt;
; eine Funktion mit dem Namen &amp;lt;xx&amp;gt;_init (extern)&lt;br /&gt;
: Hier werden Variableninitialisierungen gemacht und die ersten subscribe Aufrufe um Events zu abonnieren. Diese Funktion wird beim Systemstart vom Main Modul aufgerufen.&lt;br /&gt;
; eine Funktion mit dem Namen &amp;lt;xx&amp;gt;_eventHandler (extern)&lt;br /&gt;
: Ist die Funktion die vom Scheduler aufgerufen wird damit die Statemaschine mit dem aktuellen Event, sofern vorhanden, durchlaufen wird.&lt;br /&gt;
; optional Funktionen mit den Namen &amp;lt;xx&amp;gt;_subscribe_&amp;lt;event&amp;gt; und &amp;lt;xx&amp;gt;_unsubscribe_&amp;lt;event&amp;gt; (extern)&lt;br /&gt;
: für jeden Event den dieser Modul verschicken kann ist sowohl eine Subscribe Funktion als auch ein Unsubscribe Funktion vorhanden. Mit diesen Funktionen kann der Event von einem anderen Modul abboniert werden.&lt;br /&gt;
; eine Funktion mit dem Namen &amp;lt;xx&amp;gt;_receiveEvent (intern)&lt;br /&gt;
: ReceiveEvent ist eigentlich eine interne Funktion (wird also nicht im Header File deklariert), der Pointer auf diese Funktion wird allerdings als Callback beim Subscribe übergeben damit der Event dem Modul zugestellt werden kann.&lt;br /&gt;
&lt;br /&gt;
=== Module ===&lt;br /&gt;
Im folgenden sind alle Module und deren Hauptfunktionen aufgelistet.&lt;br /&gt;
&lt;br /&gt;
==== Analog-Modul ====&lt;br /&gt;
Digitalisieren der Analogeingänge&lt;br /&gt;
 Dateien: analog.c&lt;br /&gt;
          analog.h&lt;br /&gt;
Dieser Modul ist abgeleitet von den gleichnamigen Dateien der original NIBObee Bibliothek. Dies war notwendig da wir zusätzliche Liniensensoren verwenden und deren Ansteuerung in gleicher Weise erfolgen sollte. Das bedeutet dass für die entsprechenden Analogeingänge Messungen mit ein- und ausgeschalteten IR-LEDs durchgeführt werden müssen. Außerdem wurde, entsprechend dem Datenblatt des ATMega16 die Behandlung der Messung der Batteriespannung verbessert. Da hier die Referenzspannung umgeschalten wird muss eine Messung verworfen werden bevor mit einem richtigen Ergebnis gerechnet werden kann. Das wurde in der Originalbibliothek nicht berücksichtigt.&lt;br /&gt;
Die einzelnen Werte werden weiterhin über einen A/D-Wandler ermittelt und zwischengespeichert. Es gibt nun 13 analoge Werte (statt bisher 11) die zyklisch digitalisiert werden. Dieser Vorgang wird mit einer Frequenz von ca 117 kHz durchgeführt, d.h. dass jeder dieser Werte ca. alle 111 µs (statt bisher 94 µs) aktualisiert wird.&lt;br /&gt;
&lt;br /&gt;
==== Line-Modul ====&lt;br /&gt;
Ermitteln der Werte der Liniensensoren&lt;br /&gt;
 Dateien: line.c&lt;br /&gt;
          line.h&lt;br /&gt;
Dieser Modul ersetzt die originalen Bibliotheksfunktionen der Liniensensoren. Dies war notwendig da wir zusätzliche Liniensensoren verwenden.&lt;br /&gt;
&lt;br /&gt;
Die Werte der Liniensensoren können nun mit der Funktion&lt;br /&gt;
&amp;lt;code&amp;gt;ln_get(index)&amp;lt;/code&amp;gt;&lt;br /&gt;
gelesen werden. Die Werte selbst werden über den [[NIBObee#Analog-Modul|Analog-Modul]] ermittelt.&lt;br /&gt;
&lt;br /&gt;
=== Applikationen ===&lt;br /&gt;
==== Labyrinth erkunden ====&lt;br /&gt;
&lt;br /&gt;
==== Kürzesten Weg durch Labyrinth ====&lt;br /&gt;
&lt;br /&gt;
==== Kalibrierung ====&lt;br /&gt;
Zur Kalibrierung fährt der NIBObee ein Viereck entlang dass genau die Seitenlänge eines der Felder des Labyrinths hat. Dies ist notwendig um relativ einfach die Karte des Labyrinths erstellen zu können.&lt;br /&gt;
&lt;br /&gt;
=== Protokolle und deren Implementierung ===&lt;br /&gt;
==== [[MaDeCo]] ====&lt;br /&gt;
===== Interface Definition =====&lt;br /&gt;
* int set_opmode(OPMODE)&lt;br /&gt;
* int send_waypoint(WAYPOINT)&lt;br /&gt;
* int direct(DIRECTION[])&lt;br /&gt;
* int ack()&lt;br /&gt;
&lt;br /&gt;
==== Schnittstelle [[MaDeCo]] - RS232-Schnittstelle ====&lt;br /&gt;
* pairing&lt;br /&gt;
* Konfigurations-Commands&lt;br /&gt;
* ack&lt;br /&gt;
* read_command&lt;br /&gt;
* send_command&lt;br /&gt;
&lt;br /&gt;
=== Steuerungssoftware ===&lt;br /&gt;
==== Bluetooth Modul einschalten ====&lt;br /&gt;
Durch Bewegen der &amp;quot;Fühler&amp;quot; der NIBObee nach oben bis Einrasten wird das Bluetooth Modul eingeschalten.&lt;br /&gt;
Daraufhin muss auf eingehenden Bluetooth Traffic gelauscht werden.&lt;br /&gt;
&lt;br /&gt;
==== Blink Codes ====&lt;br /&gt;
Bestimmte Events oder Commands lösen bestimmte Blink- oder Leuchtmuster der Status LEDs aus.&lt;br /&gt;
&#039;&#039;&#039;TODO:&#039;&#039;&#039; Spezifikation der Blink Codes&lt;br /&gt;
&lt;br /&gt;
==== Gerade fahren ====&lt;br /&gt;
Das Problem beim geradeaus fahren ist dass der Roboter von der Spur abweichen kann und dann neu ausgerichtet werden muss. Üblicherweise erfolgt das mit Hilfe der Liniensensoren indem, sobald einer der seitlichen Sensoren die Linie erkennt, durch beschleunigen oder bremsen eines Rades in diese Richtung korrigierend gelenkt wird.&lt;br /&gt;
&lt;br /&gt;
In unserem Fall müssen wir diese Korrektur solange verzögern bis der seitliche Liniensensor eine mögliche Kreuzung passiert hat. Erst danach können wir feststellen ob wir nur die schwarze Linie einer Kreuzung überfahren sind oder ob tatsächlich eine Abweichung vorliegt. Die Anzahl der zu ignorierenden Odometrie-Impule kann folgendermaßen errechnet werden:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;Impulse pro Radumdrehung&amp;gt; / &amp;lt;Radumfang&amp;gt; * &amp;lt;Linienbreite&amp;gt; =&lt;br /&gt;
 20 / 11,8 * 1 = 1,69491525&lt;br /&gt;
&lt;br /&gt;
Wir werden also nur zwei Impulse abwarten bevor wir mit der Korrektur beginnen&lt;br /&gt;
&lt;br /&gt;
===== Funktionsaufteilung =====&lt;br /&gt;
Die Zuständigkeiten für diese Aufgabe sind wie folgt:&lt;br /&gt;
;drive Modul&lt;br /&gt;
:sorgt für die Steuerung der Motoren. Reduzieren der Geschwindigkeit eines Rades um eine ausgleichende Kurve zu fahren und stoppen wenn das Ende der geraden Linie erreicht wurde. Dazu aboniert der Modul die Events des line Modul die eine Abweichung von der Linie melden und vom distance Modul den Event zum fahren der Distanz zwischen Liniensensoren und Achse der Räder.&lt;br /&gt;
;line Modul&lt;br /&gt;
:prüft zyklisch die position der Linie unter dem NIBObee und meldet Abweichungen mittels Events. Dieses Melden wird allerdings verzögert bis zumindest die Breite der Linie überfahren wurde. Dazu aboniert der Modul den Event vom distance Modul den Event zum fahren der der Breite der Linie.&lt;br /&gt;
;distance Modul&lt;br /&gt;
:meldet auf Anforderung das zurücklegen einer Strecke in der Länge der Distanz zwischen Liniensensoren und Achse der Räder oder der Breite der Linie.&lt;br /&gt;
&lt;br /&gt;
==== Kreuzung fahren ====&lt;br /&gt;
An einer Kreuzung wird abgebogen indem der NIBObee zuerst unbeirrt geradeaus fährt bis die Achse genau auf dem Mittelpunkt der Kreuzung zu stehen kommt. Danach wird eine Drehung nach rechts oder links durchgeführt bis sich die Linie wieder genau unter dem mittleren Sensor befindet.&lt;br /&gt;
&lt;br /&gt;
Die Sensoren sind von der Achse 10,4 cm entfernt, eine Radumdrehung bewegt den NIBObee um 11,8 cm weiter und bei dieser Umdrehung werden vom Odometriesensor 20 Impulse abgegeben. Die Linienbreite wird 2 cm betragen. Daher errechnet sich die Strecke die nach Erkennen der Kreuzung gefahren werden muss folgendermassen:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;Impulse pro Radumdrehung&amp;gt; / &amp;lt;Radumfang&amp;gt; * (&amp;lt;Achsabstand&amp;gt; - &amp;lt;halbe Linienbreite&amp;gt;) =&lt;br /&gt;
 20 / 11,8 * (10,4 - 0,5) = 16,779661&lt;br /&gt;
&lt;br /&gt;
Nach passieren der Kreuzung muss der NIBObee also noch 17 Impulse über den Odometriesensor empfangen bevor er stoppt.&lt;br /&gt;
&lt;br /&gt;
== Risikoanalyse ==&lt;br /&gt;
Im Folgenden wird versucht für die möglichen Risikopunkte Alternativen aufzuzeigen.&lt;br /&gt;
&lt;br /&gt;
; ATmega16 ist nicht Leisungsfägig genug&lt;br /&gt;
: Es kann auf den [http://www.nicai-systems.com/de/zubehoer/nibobee-tuning-kit.html Tuning-Kit von Nicai-Systems] zurückgerifffen werden. Dies könnte eine nicht akzeptable Verzögerung verursachen (erkennen, bestellen, NIBObee umrüsten)&lt;br /&gt;
&lt;br /&gt;
: Ein beliebiger PIN-kompatiber Microcontroller ATmega... wird statt dem ATmega16 eingesetzt. Die funktioniert soange der Ersatz-µC mit der Frequenz vom 15 MHz betrieben werden kann. Wichtig ist auch dass es adaptierte Bibliotheken gibt die auf den Ersatz-µC abgestimmt sind (z.B. andere Register oder geänderte Adressen für Register, ...)&lt;br /&gt;
&lt;br /&gt;
; Signale am UART mit Bordspannung im Gegensatz zu RS232-Level (12V)&lt;br /&gt;
: Die Signale am UART werden mit Bordspannung erzeugt/erwartet. Für die Kommunikation mit dem BT-Modul ist daher keine Anpassung durchzuführen.&lt;br /&gt;
&lt;br /&gt;
: Soll zu Testzwecken ein PC über RS232 angeschalten werden ist unbedingt auf die Spannung achten. Möglicherweise verwendet ein USB-RS232 Adapter nicht die 12V sonder nur 5V.&lt;br /&gt;
&lt;br /&gt;
== Open Issues ==&lt;br /&gt;
* Es muss noch überprüft werden ob die NIBObee Hardware ausreichend leistungsfähig ist oder ein Upgrade gemacht werden muss.&lt;br /&gt;
* Wie kann das verlassen der Spur von dem Überfahren einer Kreuzung unterschieden werden? Wenn es hier zu Problemen kommt könnten zwei zusätzliche lichtempfindliche Sensoren rechts und links oder noch ein Element mit drei zusätzlichen Sensoren auf Höhe der Achsen angebracht werden -&amp;gt; Mehraufwand!&lt;br /&gt;
* Soll Aktivierung der BT-Schnittstelle manuell erfolgen?&lt;br /&gt;
* Soll der Betriebsmodus gewählt werden können?&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* [http://www.nicai-systems.de/nibobee.html NIBObee Homepage bei Nicai Systems]&lt;br /&gt;
* [http://download.nicai-systems.com/nibo/Tutorial_NIBObee_20091123.pdf NIBObee - Tutorial zur Programmierung]&lt;br /&gt;
* [http://www.nicai-systems.com/de/zubehoer/nibobee-tuning-kit.html NIBObee - Tuning-Kit von Nicai-Systems]&lt;br /&gt;
* [http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/Der_UART Tutorial zur USART Programmierung]&lt;br /&gt;
[[Kategorie:FH]]&lt;/div&gt;</summary>
		<author><name>Alois</name></author>
	</entry>
	<entry>
		<id>https://wiki.callooh.com/index.php?title=NIBObee&amp;diff=857</id>
		<title>NIBObee</title>
		<link rel="alternate" type="text/html" href="https://wiki.callooh.com/index.php?title=NIBObee&amp;diff=857"/>
		<updated>2011-05-02T09:32:35Z</updated>

		<summary type="html">&lt;p&gt;Alois: /* Line-Modul */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;NIBObee ist der Roboter der im Projekt [[RoLoMa]] verwendet wird.&lt;br /&gt;
== Technische Daten ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Art&lt;br /&gt;
!Typ&lt;br /&gt;
!Bemerkung&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|Mikrocontroller&lt;br /&gt;
|ATMEL ATMega16, , 15 MHz&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|Integrierter UART wird verwendet um den Bluetooth Modul anzubinden.&lt;br /&gt;
&lt;br /&gt;
Sollte die Leistung nicht ausreichen kann entweder der Erweiterungssatz von Nicai-Systems verwendet werden oder nur der Controller wird gegen einen Pinkompatiblen Typ ausgetauscht (z.B. ATMega32, ATMega644, ATMega1284)&lt;br /&gt;
|-&lt;br /&gt;
|Flash:	16	kB&lt;br /&gt;
|-&lt;br /&gt;
|...&lt;br /&gt;
|-&lt;br /&gt;
|...&lt;br /&gt;
|...&lt;br /&gt;
|...&lt;br /&gt;
|-&lt;br /&gt;
|...&lt;br /&gt;
|...&lt;br /&gt;
|...&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|Maße&lt;br /&gt;
|Radumfang: 11,8 cm&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|Diese Maße sind wichtig um den NIBObee so exakt wie möglich am Mittelpunkt des Labyrinthfeldes positionieren zu können.&lt;br /&gt;
|-&lt;br /&gt;
|Abstand Liniensensor zu Radachse: 10,4 cm&lt;br /&gt;
|-&lt;br /&gt;
|Impulse pro Umdrehung: 20&lt;br /&gt;
|}&lt;br /&gt;
=== Ports ===&lt;br /&gt;
Über den UART wird der Bluetooth Modul [[BTM-222]] angebunden. Am NIObee ist diese Schnittstelle am Port X5 verfügbar&lt;br /&gt;
&lt;br /&gt;
=== Resourcen ===&lt;br /&gt;
Folgende Resourcen werden für unsere Implementierung verwendet (&#039;&#039;kursiv&#039;&#039; markierte Resourcen werden bereits durch die Bibliothek belegt):&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Resource&lt;br /&gt;
!Verwendung&lt;br /&gt;
!Interrupts&lt;br /&gt;
!Dateien&lt;br /&gt;
|-&lt;br /&gt;
|Timer 1&lt;br /&gt;
|Motor PWM&lt;br /&gt;
|TIMER1_COMPA_vect, TIMER1_COMPB_vect&lt;br /&gt;
|motpwm.c&lt;br /&gt;
|-&lt;br /&gt;
|ADC&lt;br /&gt;
|Analog, Line&lt;br /&gt;
|ADC_vect&lt;br /&gt;
|analog.c, line.c&lt;br /&gt;
|-&lt;br /&gt;
|EEPROM&lt;br /&gt;
|Line (12 Byte)&lt;br /&gt;
|&lt;br /&gt;
|line.c&lt;br /&gt;
|-&lt;br /&gt;
|Ext. IRQ&lt;br /&gt;
|Odometrie&lt;br /&gt;
|INT0_vect, INT1_vect&lt;br /&gt;
|odometry.c&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Eine für den NIBObee allgemein gültige Auflistung findet man im [http://www.nibo-roboter.de/wiki/NIBObee/Lib/Resourcen NIBObee Wiki].&lt;br /&gt;
&lt;br /&gt;
=== Besondere Erkenntnisse ===&lt;br /&gt;
Es hat sich, nach einigen Fehlschlägen bei der Linienverfolung, herausgestellt dass es ungünstig ist den NIBObee in eine optisch ansprechende waagrechte Position zu bringen indem eine kleinere Halbkugel auf der Unterseite angebracht wird. Der Grund: Nur mit der original Halbkugel und dem damit nach vorne ansteigenden Bodenabstand sind die IR-LED&#039;s weit genug vom Boden entfernt um einen Lichtkegen zu erzeugen der auch vernünftig vom Phototransistor erfasst werden kann. Bei waagrechter Ausrichtung des NIBObee ist dieser Kegel, aufgrund des geringeren Abstands zum Boden, zu klein!&lt;br /&gt;
&lt;br /&gt;
=== Bibliotheksfunktionen ===&lt;br /&gt;
==== Liniensensoren ====&lt;br /&gt;
Die original NIBObee Biliothek wird nicht verwendet. Wurde durch eine eigene Implementierung im [[NIBObee#Line-Modul|Line-Modul]] ersetzt.&lt;br /&gt;
&lt;br /&gt;
==== Motorensteuerung ====&lt;br /&gt;
 motpwm.h&lt;br /&gt;
Die Motoren des NIBObee werden mit PWM ([http://de.wikipedia.org/wiki/Pulsweitenmodulation Pulsweitenmodulation]) angesteuert. Das garantiert natürlich ohne Regelung noch keinen gleichlauf der beiden Motoren was sich je nach Zustand des Getriebes in einer weiteren oder engernen Kurve zeigt.&lt;br /&gt;
 motpid.h&lt;br /&gt;
Hier stehen Funktionen zur Verfügung die mit Hilfe der Odometrie die Motoren regeln. Diese Funktionen sind für unsere Zwecke allerdings nicht geeignet.&lt;br /&gt;
&lt;br /&gt;
== Aufgaben ==&lt;br /&gt;
Folgende Aufgaben sind im Rahmen des Projekts [[RoLoMa]] vom NIBObee Team zu lösen:&lt;br /&gt;
* Herstellung der Bluetooth Hardware-Erweiterung&lt;br /&gt;
* Softwaremodul zum Bedienen der Bluetooth-Schnittstelle via RS232&lt;br /&gt;
* Softwaremodul zum Erkennen der Linie im Labyrinth und im speziellen der unterschiedlichen Kreuzungstypen&lt;br /&gt;
* Messen des zurückgelegten Weges&lt;br /&gt;
* Steuerung, die den Abstand des Sensors zur Radachse berücksichtigt um den Roboter an der korrekten Stelle um die eigene Achse zu drehen&lt;br /&gt;
* Erstellen eines Abbilds des Labyrinths im Speicher und navigieren bis der Roboter wieder am Startpunkt gelandet ist (z.B. immer Links abbiegen)&lt;br /&gt;
* Implementieren des [[MaDeCo]] Protokolls&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
&lt;br /&gt;
=== Bluetooth ===&lt;br /&gt;
Der Bluetooth Modul ist im Detail auf den Seiten des [[BTM-222]] beschrieben.&lt;br /&gt;
&lt;br /&gt;
=== Liniensensoren ===&lt;br /&gt;
Zum Erkennen der Kreuzungen bei gleichzeitigem folgen der Linie war es notwendig zusätzliche Liniensensoren zu verwenden. Diese wurden mit einer Zusätzplatine in einer Reihe mit den bereits vorhandenen Liniensensoren, allerdings so weit wie möglich linke und rechts außen, montiert. Das einlesen der Analogwerte erfolgt über die beiden Analogeingänge am Stecker X1. Die IR-LEDs sind, analog zu den bestehenden IR-LEDs der vorhandenen Liniensensoren, über den Ausgang 1 am Stecker X4 schaltbar. Dies ist notwendig da jeweils eine Messung mit eingschalteter LED und eine mit ausgeschalteter LED durchgeführt wird. Damit wird der Einfluß des Umgebungslichts korrigiert.&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
Die Aufgaben der Software sollen in möglichst unabhängigen Modulen realisiert werden um das Testen einfacher zu gestalten. Die einzelnen Module sind im Folgenden beschrieben.&lt;br /&gt;
&lt;br /&gt;
=== Architektur ===&lt;br /&gt;
Das Gesamtsystem besteht aus einem zentralen Taktgeber, einem Scheduler und mehreren State Maschinen. Die Kommunikation erfolgt ausschließlich über Events. Die Module können mittels Subscribe einen Event, den ein anderer Modul zur Verfügung steht, abonnieren.&lt;br /&gt;
&lt;br /&gt;
==== Systemtakt, Scheduler ====&lt;br /&gt;
Im Main Modul befindet sich der zentrale Taktgeber der aus dem Interrupt des Timer 2 einen gleichmäßigen Takt von 100Hz erzeugt. Dieser Takt kann von anderen Modulen verwendet werden um zyklische Aufgaben zu erfüllen (z.B. lesen der Liniensensoren). Im Main Modul befindet sich auch der Scheduler der ganz einfach in der Endlosschleife sequenziell jeden Modul aufruft um anstehende Events zu bearbeiten.&lt;br /&gt;
&lt;br /&gt;
==== State / Event Maschinen ====&lt;br /&gt;
Die State / Event Maschinen sind in allen Modulen gleich aufgebaut. Es gibt die folgenden Funktionen (wobei statt &amp;quot;&amp;lt;xx&amp;gt;&amp;quot; das Kürzel des Moduls steht, z.B &amp;quot;dr&amp;quot; für Drive):&lt;br /&gt;
; eine Funktion mit dem Namen &amp;lt;xx&amp;gt;_main (intern)&lt;br /&gt;
: Das ist die eigentliche State Maschine. Wird nicht direkt vom Scheduler aufgerufen sondern über die Funktion &amp;lt;xx&amp;gt;_eventHandler. Hier gibt es ein switch Statement über den aktuellen Zustand und für jeden Zustand ein switch Statement über den empfangenen Event.&lt;br /&gt;
; eine Funktion mit dem Namen &amp;lt;xx&amp;gt;_init (extern)&lt;br /&gt;
: Hier werden Variableninitialisierungen gemacht und die ersten subscribe Aufrufe um Events zu abonnieren. Diese Funktion wird beim Systemstart vom Main Modul aufgerufen.&lt;br /&gt;
; eine Funktion mit dem Namen &amp;lt;xx&amp;gt;_eventHandler (extern)&lt;br /&gt;
: Ist die Funktion die vom Scheduler aufgerufen wird damit die Statemaschine mit dem aktuellen Event, sofern vorhanden, durchlaufen wird.&lt;br /&gt;
; optional Funktionen mit den Namen &amp;lt;xx&amp;gt;_subscribe_&amp;lt;event&amp;gt; und &amp;lt;xx&amp;gt;_unsubscribe_&amp;lt;event&amp;gt; (extern)&lt;br /&gt;
: für jeden Event den dieser Modul verschicken kann ist sowohl eine Subscribe Funktion als auch ein Unsubscribe Funktion vorhanden. Mit diesen Funktionen kann der Event von einem anderen Modul abboniert werden.&lt;br /&gt;
; eine Funktion mit dem Namen &amp;lt;xx&amp;gt;_receiveEvent (intern)&lt;br /&gt;
: ReceiveEvent ist eigentlich eine interne Funktion (wird also nicht im Header File deklariert), der Pointer auf diese Funktion wird allerdings als Callback beim Subscribe übergeben damit der Event dem Modul zugestellt werden kann.&lt;br /&gt;
&lt;br /&gt;
=== Module ===&lt;br /&gt;
Im folgenden sind alle Module und deren Hauptfunktionen aufgelistet.&lt;br /&gt;
&lt;br /&gt;
==== Analog-Modul ====&lt;br /&gt;
Digitalisieren der Analogeingänge&lt;br /&gt;
 Dateien: analog.c&lt;br /&gt;
          analog.h&lt;br /&gt;
Dieser Modul ist abgeleitet von den gleichnamigen Dateien der original NIBObee Bibliothek. Dies war notwendig da wir zusätzliche Liniensensoren verwenden und deren Ansteuerung in gleicher Weise erfolgen sollte. Das bedeutet dass für die entsprechenden Analogeingänge Messungen mit ein- und ausgeschalteten IR-LEDs durchgeführt werden müssen. Außerdem wurde, entsprechend dem Datenblatt des ATMega16 die Behandlung der Messung der Batteriespannung verbessert. Da hier die referenzspannung umgeschalten wird muss eine Messung verworfen werden bevor mit einem richtigen Ergebnis gerechnet werden kann. Das wurde in der Originalbibliothek nicht berücksichtigt.&lt;br /&gt;
&lt;br /&gt;
==== Line-Modul ====&lt;br /&gt;
Ermitteln der Werte der Liniensensoren&lt;br /&gt;
 Dateien: line.c&lt;br /&gt;
          line.h&lt;br /&gt;
Dieser Modul ersetzt die originalen Bibliotheksfunktionen der Liniensensoren. Dies war notwendig da wir zusätzliche Liniensensoren verwenden.&lt;br /&gt;
&lt;br /&gt;
Die Werte der Liniensensoren können nun mit der Funktion&lt;br /&gt;
&amp;lt;code&amp;gt;ln_get(index)&amp;lt;/code&amp;gt;&lt;br /&gt;
gelesen werden. Die Werte selbst werden über den [[NIBObee#Analog-Modul|Analog-Modul]] ermittelt.&lt;br /&gt;
&lt;br /&gt;
=== Applikationen ===&lt;br /&gt;
==== Labyrinth erkunden ====&lt;br /&gt;
&lt;br /&gt;
==== Kürzesten Weg durch Labyrinth ====&lt;br /&gt;
&lt;br /&gt;
==== Kalibrierung ====&lt;br /&gt;
Zur Kalibrierung fährt der NIBObee ein Viereck entlang dass genau die Seitenlänge eines der Felder des Labyrinths hat. Dies ist notwendig um relativ einfach die Karte des Labyrinths erstellen zu können.&lt;br /&gt;
&lt;br /&gt;
=== Protokolle und deren Implementierung ===&lt;br /&gt;
==== [[MaDeCo]] ====&lt;br /&gt;
===== Interface Definition =====&lt;br /&gt;
* int set_opmode(OPMODE)&lt;br /&gt;
* int send_waypoint(WAYPOINT)&lt;br /&gt;
* int direct(DIRECTION[])&lt;br /&gt;
* int ack()&lt;br /&gt;
&lt;br /&gt;
==== Schnittstelle [[MaDeCo]] - RS232-Schnittstelle ====&lt;br /&gt;
* pairing&lt;br /&gt;
* Konfigurations-Commands&lt;br /&gt;
* ack&lt;br /&gt;
* read_command&lt;br /&gt;
* send_command&lt;br /&gt;
&lt;br /&gt;
=== Steuerungssoftware ===&lt;br /&gt;
==== Bluetooth Modul einschalten ====&lt;br /&gt;
Durch Bewegen der &amp;quot;Fühler&amp;quot; der NIBObee nach oben bis Einrasten wird das Bluetooth Modul eingeschalten.&lt;br /&gt;
Daraufhin muss auf eingehenden Bluetooth Traffic gelauscht werden.&lt;br /&gt;
&lt;br /&gt;
==== Blink Codes ====&lt;br /&gt;
Bestimmte Events oder Commands lösen bestimmte Blink- oder Leuchtmuster der Status LEDs aus.&lt;br /&gt;
&#039;&#039;&#039;TODO:&#039;&#039;&#039; Spezifikation der Blink Codes&lt;br /&gt;
&lt;br /&gt;
==== Gerade fahren ====&lt;br /&gt;
Das Problem beim geradeaus fahren ist dass der Roboter von der Spur abweichen kann und dann neu ausgerichtet werden muss. Üblicherweise erfolgt das mit Hilfe der Liniensensoren indem, sobald einer der seitlichen Sensoren die Linie erkennt, durch beschleunigen oder bremsen eines Rades in diese Richtung korrigierend gelenkt wird.&lt;br /&gt;
&lt;br /&gt;
In unserem Fall müssen wir diese Korrektur solange verzögern bis der seitliche Liniensensor eine mögliche Kreuzung passiert hat. Erst danach können wir feststellen ob wir nur die schwarze Linie einer Kreuzung überfahren sind oder ob tatsächlich eine Abweichung vorliegt. Die Anzahl der zu ignorierenden Odometrie-Impule kann folgendermaßen errechnet werden:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;Impulse pro Radumdrehung&amp;gt; / &amp;lt;Radumfang&amp;gt; * &amp;lt;Linienbreite&amp;gt; =&lt;br /&gt;
 20 / 11,8 * 1 = 1,69491525&lt;br /&gt;
&lt;br /&gt;
Wir werden also nur zwei Impulse abwarten bevor wir mit der Korrektur beginnen&lt;br /&gt;
&lt;br /&gt;
===== Funktionsaufteilung =====&lt;br /&gt;
Die Zuständigkeiten für diese Aufgabe sind wie folgt:&lt;br /&gt;
;drive Modul&lt;br /&gt;
:sorgt für die Steuerung der Motoren. Reduzieren der Geschwindigkeit eines Rades um eine ausgleichende Kurve zu fahren und stoppen wenn das Ende der geraden Linie erreicht wurde. Dazu aboniert der Modul die Events des line Modul die eine Abweichung von der Linie melden und vom distance Modul den Event zum fahren der Distanz zwischen Liniensensoren und Achse der Räder.&lt;br /&gt;
;line Modul&lt;br /&gt;
:prüft zyklisch die position der Linie unter dem NIBObee und meldet Abweichungen mittels Events. Dieses Melden wird allerdings verzögert bis zumindest die Breite der Linie überfahren wurde. Dazu aboniert der Modul den Event vom distance Modul den Event zum fahren der der Breite der Linie.&lt;br /&gt;
;distance Modul&lt;br /&gt;
:meldet auf Anforderung das zurücklegen einer Strecke in der Länge der Distanz zwischen Liniensensoren und Achse der Räder oder der Breite der Linie.&lt;br /&gt;
&lt;br /&gt;
==== Kreuzung fahren ====&lt;br /&gt;
An einer Kreuzung wird abgebogen indem der NIBObee zuerst unbeirrt geradeaus fährt bis die Achse genau auf dem Mittelpunkt der Kreuzung zu stehen kommt. Danach wird eine Drehung nach rechts oder links durchgeführt bis sich die Linie wieder genau unter dem mittleren Sensor befindet.&lt;br /&gt;
&lt;br /&gt;
Die Sensoren sind von der Achse 10,4 cm entfernt, eine Radumdrehung bewegt den NIBObee um 11,8 cm weiter und bei dieser Umdrehung werden vom Odometriesensor 20 Impulse abgegeben. Die Linienbreite wird 2 cm betragen. Daher errechnet sich die Strecke die nach Erkennen der Kreuzung gefahren werden muss folgendermassen:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;Impulse pro Radumdrehung&amp;gt; / &amp;lt;Radumfang&amp;gt; * (&amp;lt;Achsabstand&amp;gt; - &amp;lt;halbe Linienbreite&amp;gt;) =&lt;br /&gt;
 20 / 11,8 * (10,4 - 0,5) = 16,779661&lt;br /&gt;
&lt;br /&gt;
Nach passieren der Kreuzung muss der NIBObee also noch 17 Impulse über den Odometriesensor empfangen bevor er stoppt.&lt;br /&gt;
&lt;br /&gt;
== Risikoanalyse ==&lt;br /&gt;
Im Folgenden wird versucht für die möglichen Risikopunkte Alternativen aufzuzeigen.&lt;br /&gt;
&lt;br /&gt;
; ATmega16 ist nicht Leisungsfägig genug&lt;br /&gt;
: Es kann auf den [http://www.nicai-systems.com/de/zubehoer/nibobee-tuning-kit.html Tuning-Kit von Nicai-Systems] zurückgerifffen werden. Dies könnte eine nicht akzeptable Verzögerung verursachen (erkennen, bestellen, NIBObee umrüsten)&lt;br /&gt;
&lt;br /&gt;
: Ein beliebiger PIN-kompatiber Microcontroller ATmega... wird statt dem ATmega16 eingesetzt. Die funktioniert soange der Ersatz-µC mit der Frequenz vom 15 MHz betrieben werden kann. Wichtig ist auch dass es adaptierte Bibliotheken gibt die auf den Ersatz-µC abgestimmt sind (z.B. andere Register oder geänderte Adressen für Register, ...)&lt;br /&gt;
&lt;br /&gt;
; Signale am UART mit Bordspannung im Gegensatz zu RS232-Level (12V)&lt;br /&gt;
: Die Signale am UART werden mit Bordspannung erzeugt/erwartet. Für die Kommunikation mit dem BT-Modul ist daher keine Anpassung durchzuführen.&lt;br /&gt;
&lt;br /&gt;
: Soll zu Testzwecken ein PC über RS232 angeschalten werden ist unbedingt auf die Spannung achten. Möglicherweise verwendet ein USB-RS232 Adapter nicht die 12V sonder nur 5V.&lt;br /&gt;
&lt;br /&gt;
== Open Issues ==&lt;br /&gt;
* Es muss noch überprüft werden ob die NIBObee Hardware ausreichend leistungsfähig ist oder ein Upgrade gemacht werden muss.&lt;br /&gt;
* Wie kann das verlassen der Spur von dem Überfahren einer Kreuzung unterschieden werden? Wenn es hier zu Problemen kommt könnten zwei zusätzliche lichtempfindliche Sensoren rechts und links oder noch ein Element mit drei zusätzlichen Sensoren auf Höhe der Achsen angebracht werden -&amp;gt; Mehraufwand!&lt;br /&gt;
* Soll Aktivierung der BT-Schnittstelle manuell erfolgen?&lt;br /&gt;
* Soll der Betriebsmodus gewählt werden können?&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* [http://www.nicai-systems.de/nibobee.html NIBObee Homepage bei Nicai Systems]&lt;br /&gt;
* [http://download.nicai-systems.com/nibo/Tutorial_NIBObee_20091123.pdf NIBObee - Tutorial zur Programmierung]&lt;br /&gt;
* [http://www.nicai-systems.com/de/zubehoer/nibobee-tuning-kit.html NIBObee - Tuning-Kit von Nicai-Systems]&lt;br /&gt;
* [http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/Der_UART Tutorial zur USART Programmierung]&lt;br /&gt;
[[Kategorie:FH]]&lt;/div&gt;</summary>
		<author><name>Alois</name></author>
	</entry>
	<entry>
		<id>https://wiki.callooh.com/index.php?title=NIBObee&amp;diff=856</id>
		<title>NIBObee</title>
		<link rel="alternate" type="text/html" href="https://wiki.callooh.com/index.php?title=NIBObee&amp;diff=856"/>
		<updated>2011-05-02T09:30:03Z</updated>

		<summary type="html">&lt;p&gt;Alois: /* Liniensensoren */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;NIBObee ist der Roboter der im Projekt [[RoLoMa]] verwendet wird.&lt;br /&gt;
== Technische Daten ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Art&lt;br /&gt;
!Typ&lt;br /&gt;
!Bemerkung&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|Mikrocontroller&lt;br /&gt;
|ATMEL ATMega16, , 15 MHz&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|Integrierter UART wird verwendet um den Bluetooth Modul anzubinden.&lt;br /&gt;
&lt;br /&gt;
Sollte die Leistung nicht ausreichen kann entweder der Erweiterungssatz von Nicai-Systems verwendet werden oder nur der Controller wird gegen einen Pinkompatiblen Typ ausgetauscht (z.B. ATMega32, ATMega644, ATMega1284)&lt;br /&gt;
|-&lt;br /&gt;
|Flash:	16	kB&lt;br /&gt;
|-&lt;br /&gt;
|...&lt;br /&gt;
|-&lt;br /&gt;
|...&lt;br /&gt;
|...&lt;br /&gt;
|...&lt;br /&gt;
|-&lt;br /&gt;
|...&lt;br /&gt;
|...&lt;br /&gt;
|...&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|Maße&lt;br /&gt;
|Radumfang: 11,8 cm&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|Diese Maße sind wichtig um den NIBObee so exakt wie möglich am Mittelpunkt des Labyrinthfeldes positionieren zu können.&lt;br /&gt;
|-&lt;br /&gt;
|Abstand Liniensensor zu Radachse: 10,4 cm&lt;br /&gt;
|-&lt;br /&gt;
|Impulse pro Umdrehung: 20&lt;br /&gt;
|}&lt;br /&gt;
=== Ports ===&lt;br /&gt;
Über den UART wird der Bluetooth Modul [[BTM-222]] angebunden. Am NIObee ist diese Schnittstelle am Port X5 verfügbar&lt;br /&gt;
&lt;br /&gt;
=== Resourcen ===&lt;br /&gt;
Folgende Resourcen werden für unsere Implementierung verwendet (&#039;&#039;kursiv&#039;&#039; markierte Resourcen werden bereits durch die Bibliothek belegt):&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Resource&lt;br /&gt;
!Verwendung&lt;br /&gt;
!Interrupts&lt;br /&gt;
!Dateien&lt;br /&gt;
|-&lt;br /&gt;
|Timer 1&lt;br /&gt;
|Motor PWM&lt;br /&gt;
|TIMER1_COMPA_vect, TIMER1_COMPB_vect&lt;br /&gt;
|motpwm.c&lt;br /&gt;
|-&lt;br /&gt;
|ADC&lt;br /&gt;
|Analog, Line&lt;br /&gt;
|ADC_vect&lt;br /&gt;
|analog.c, line.c&lt;br /&gt;
|-&lt;br /&gt;
|EEPROM&lt;br /&gt;
|Line (12 Byte)&lt;br /&gt;
|&lt;br /&gt;
|line.c&lt;br /&gt;
|-&lt;br /&gt;
|Ext. IRQ&lt;br /&gt;
|Odometrie&lt;br /&gt;
|INT0_vect, INT1_vect&lt;br /&gt;
|odometry.c&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Eine für den NIBObee allgemein gültige Auflistung findet man im [http://www.nibo-roboter.de/wiki/NIBObee/Lib/Resourcen NIBObee Wiki].&lt;br /&gt;
&lt;br /&gt;
=== Besondere Erkenntnisse ===&lt;br /&gt;
Es hat sich, nach einigen Fehlschlägen bei der Linienverfolung, herausgestellt dass es ungünstig ist den NIBObee in eine optisch ansprechende waagrechte Position zu bringen indem eine kleinere Halbkugel auf der Unterseite angebracht wird. Der Grund: Nur mit der original Halbkugel und dem damit nach vorne ansteigenden Bodenabstand sind die IR-LED&#039;s weit genug vom Boden entfernt um einen Lichtkegen zu erzeugen der auch vernünftig vom Phototransistor erfasst werden kann. Bei waagrechter Ausrichtung des NIBObee ist dieser Kegel, aufgrund des geringeren Abstands zum Boden, zu klein!&lt;br /&gt;
&lt;br /&gt;
=== Bibliotheksfunktionen ===&lt;br /&gt;
==== Liniensensoren ====&lt;br /&gt;
Die original NIBObee Biliothek wird nicht verwendet. Wurde durch eine eigene Implementierung im [[NIBObee#Line-Modul|Line-Modul]] ersetzt.&lt;br /&gt;
&lt;br /&gt;
==== Motorensteuerung ====&lt;br /&gt;
 motpwm.h&lt;br /&gt;
Die Motoren des NIBObee werden mit PWM ([http://de.wikipedia.org/wiki/Pulsweitenmodulation Pulsweitenmodulation]) angesteuert. Das garantiert natürlich ohne Regelung noch keinen gleichlauf der beiden Motoren was sich je nach Zustand des Getriebes in einer weiteren oder engernen Kurve zeigt.&lt;br /&gt;
 motpid.h&lt;br /&gt;
Hier stehen Funktionen zur Verfügung die mit Hilfe der Odometrie die Motoren regeln. Diese Funktionen sind für unsere Zwecke allerdings nicht geeignet.&lt;br /&gt;
&lt;br /&gt;
== Aufgaben ==&lt;br /&gt;
Folgende Aufgaben sind im Rahmen des Projekts [[RoLoMa]] vom NIBObee Team zu lösen:&lt;br /&gt;
* Herstellung der Bluetooth Hardware-Erweiterung&lt;br /&gt;
* Softwaremodul zum Bedienen der Bluetooth-Schnittstelle via RS232&lt;br /&gt;
* Softwaremodul zum Erkennen der Linie im Labyrinth und im speziellen der unterschiedlichen Kreuzungstypen&lt;br /&gt;
* Messen des zurückgelegten Weges&lt;br /&gt;
* Steuerung, die den Abstand des Sensors zur Radachse berücksichtigt um den Roboter an der korrekten Stelle um die eigene Achse zu drehen&lt;br /&gt;
* Erstellen eines Abbilds des Labyrinths im Speicher und navigieren bis der Roboter wieder am Startpunkt gelandet ist (z.B. immer Links abbiegen)&lt;br /&gt;
* Implementieren des [[MaDeCo]] Protokolls&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
&lt;br /&gt;
=== Bluetooth ===&lt;br /&gt;
Der Bluetooth Modul ist im Detail auf den Seiten des [[BTM-222]] beschrieben.&lt;br /&gt;
&lt;br /&gt;
=== Liniensensoren ===&lt;br /&gt;
Zum Erkennen der Kreuzungen bei gleichzeitigem folgen der Linie war es notwendig zusätzliche Liniensensoren zu verwenden. Diese wurden mit einer Zusätzplatine in einer Reihe mit den bereits vorhandenen Liniensensoren, allerdings so weit wie möglich linke und rechts außen, montiert. Das einlesen der Analogwerte erfolgt über die beiden Analogeingänge am Stecker X1. Die IR-LEDs sind, analog zu den bestehenden IR-LEDs der vorhandenen Liniensensoren, über den Ausgang 1 am Stecker X4 schaltbar. Dies ist notwendig da jeweils eine Messung mit eingschalteter LED und eine mit ausgeschalteter LED durchgeführt wird. Damit wird der Einfluß des Umgebungslichts korrigiert.&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
Die Aufgaben der Software sollen in möglichst unabhängigen Modulen realisiert werden um das Testen einfacher zu gestalten. Die einzelnen Module sind im Folgenden beschrieben.&lt;br /&gt;
&lt;br /&gt;
=== Architektur ===&lt;br /&gt;
Das Gesamtsystem besteht aus einem zentralen Taktgeber, einem Scheduler und mehreren State Maschinen. Die Kommunikation erfolgt ausschließlich über Events. Die Module können mittels Subscribe einen Event, den ein anderer Modul zur Verfügung steht, abonnieren.&lt;br /&gt;
&lt;br /&gt;
==== Systemtakt, Scheduler ====&lt;br /&gt;
Im Main Modul befindet sich der zentrale Taktgeber der aus dem Interrupt des Timer 2 einen gleichmäßigen Takt von 100Hz erzeugt. Dieser Takt kann von anderen Modulen verwendet werden um zyklische Aufgaben zu erfüllen (z.B. lesen der Liniensensoren). Im Main Modul befindet sich auch der Scheduler der ganz einfach in der Endlosschleife sequenziell jeden Modul aufruft um anstehende Events zu bearbeiten.&lt;br /&gt;
&lt;br /&gt;
==== State / Event Maschinen ====&lt;br /&gt;
Die State / Event Maschinen sind in allen Modulen gleich aufgebaut. Es gibt die folgenden Funktionen (wobei statt &amp;quot;&amp;lt;xx&amp;gt;&amp;quot; das Kürzel des Moduls steht, z.B &amp;quot;dr&amp;quot; für Drive):&lt;br /&gt;
; eine Funktion mit dem Namen &amp;lt;xx&amp;gt;_main (intern)&lt;br /&gt;
: Das ist die eigentliche State Maschine. Wird nicht direkt vom Scheduler aufgerufen sondern über die Funktion &amp;lt;xx&amp;gt;_eventHandler. Hier gibt es ein switch Statement über den aktuellen Zustand und für jeden Zustand ein switch Statement über den empfangenen Event.&lt;br /&gt;
; eine Funktion mit dem Namen &amp;lt;xx&amp;gt;_init (extern)&lt;br /&gt;
: Hier werden Variableninitialisierungen gemacht und die ersten subscribe Aufrufe um Events zu abonnieren. Diese Funktion wird beim Systemstart vom Main Modul aufgerufen.&lt;br /&gt;
; eine Funktion mit dem Namen &amp;lt;xx&amp;gt;_eventHandler (extern)&lt;br /&gt;
: Ist die Funktion die vom Scheduler aufgerufen wird damit die Statemaschine mit dem aktuellen Event, sofern vorhanden, durchlaufen wird.&lt;br /&gt;
; optional Funktionen mit den Namen &amp;lt;xx&amp;gt;_subscribe_&amp;lt;event&amp;gt; und &amp;lt;xx&amp;gt;_unsubscribe_&amp;lt;event&amp;gt; (extern)&lt;br /&gt;
: für jeden Event den dieser Modul verschicken kann ist sowohl eine Subscribe Funktion als auch ein Unsubscribe Funktion vorhanden. Mit diesen Funktionen kann der Event von einem anderen Modul abboniert werden.&lt;br /&gt;
; eine Funktion mit dem Namen &amp;lt;xx&amp;gt;_receiveEvent (intern)&lt;br /&gt;
: ReceiveEvent ist eigentlich eine interne Funktion (wird also nicht im Header File deklariert), der Pointer auf diese Funktion wird allerdings als Callback beim Subscribe übergeben damit der Event dem Modul zugestellt werden kann.&lt;br /&gt;
&lt;br /&gt;
=== Module ===&lt;br /&gt;
Im folgenden sind alle Module und deren Hauptfunktionen aufgelistet.&lt;br /&gt;
&lt;br /&gt;
==== Analog-Modul ====&lt;br /&gt;
Digitalisieren der Analogeingänge&lt;br /&gt;
 Dateien: analog.c&lt;br /&gt;
          analog.h&lt;br /&gt;
Dieser Modul ist abgeleitet von den gleichnamigen Dateien der original NIBObee Bibliothek. Dies war notwendig da wir zusätzliche Liniensensoren verwenden und deren Ansteuerung in gleicher Weise erfolgen sollte. Das bedeutet dass für die entsprechenden Analogeingänge Messungen mit ein- und ausgeschalteten IR-LEDs durchgeführt werden müssen. Außerdem wurde, entsprechend dem Datenblatt des ATMega16 die Behandlung der Messung der Batteriespannung verbessert. Da hier die referenzspannung umgeschalten wird muss eine Messung verworfen werden bevor mit einem richtigen Ergebnis gerechnet werden kann. Das wurde in der Originalbibliothek nicht berücksichtigt.&lt;br /&gt;
&lt;br /&gt;
==== Line-Modul ====&lt;br /&gt;
Ermitteln der Werte der Liniensensoren&lt;br /&gt;
 Dateien: line.c&lt;br /&gt;
          line.h&lt;br /&gt;
Dieser Modul ersetzt die originalen Bibliotheksfunktionen der Liniensensoren. Dies war notwendig da wir zusätzliche Liniensensoren verwenden.&lt;br /&gt;
&lt;br /&gt;
=== Applikationen ===&lt;br /&gt;
==== Labyrinth erkunden ====&lt;br /&gt;
&lt;br /&gt;
==== Kürzesten Weg durch Labyrinth ====&lt;br /&gt;
&lt;br /&gt;
==== Kalibrierung ====&lt;br /&gt;
Zur Kalibrierung fährt der NIBObee ein Viereck entlang dass genau die Seitenlänge eines der Felder des Labyrinths hat. Dies ist notwendig um relativ einfach die Karte des Labyrinths erstellen zu können.&lt;br /&gt;
&lt;br /&gt;
=== Protokolle und deren Implementierung ===&lt;br /&gt;
==== [[MaDeCo]] ====&lt;br /&gt;
===== Interface Definition =====&lt;br /&gt;
* int set_opmode(OPMODE)&lt;br /&gt;
* int send_waypoint(WAYPOINT)&lt;br /&gt;
* int direct(DIRECTION[])&lt;br /&gt;
* int ack()&lt;br /&gt;
&lt;br /&gt;
==== Schnittstelle [[MaDeCo]] - RS232-Schnittstelle ====&lt;br /&gt;
* pairing&lt;br /&gt;
* Konfigurations-Commands&lt;br /&gt;
* ack&lt;br /&gt;
* read_command&lt;br /&gt;
* send_command&lt;br /&gt;
&lt;br /&gt;
=== Steuerungssoftware ===&lt;br /&gt;
==== Bluetooth Modul einschalten ====&lt;br /&gt;
Durch Bewegen der &amp;quot;Fühler&amp;quot; der NIBObee nach oben bis Einrasten wird das Bluetooth Modul eingeschalten.&lt;br /&gt;
Daraufhin muss auf eingehenden Bluetooth Traffic gelauscht werden.&lt;br /&gt;
&lt;br /&gt;
==== Blink Codes ====&lt;br /&gt;
Bestimmte Events oder Commands lösen bestimmte Blink- oder Leuchtmuster der Status LEDs aus.&lt;br /&gt;
&#039;&#039;&#039;TODO:&#039;&#039;&#039; Spezifikation der Blink Codes&lt;br /&gt;
&lt;br /&gt;
==== Gerade fahren ====&lt;br /&gt;
Das Problem beim geradeaus fahren ist dass der Roboter von der Spur abweichen kann und dann neu ausgerichtet werden muss. Üblicherweise erfolgt das mit Hilfe der Liniensensoren indem, sobald einer der seitlichen Sensoren die Linie erkennt, durch beschleunigen oder bremsen eines Rades in diese Richtung korrigierend gelenkt wird.&lt;br /&gt;
&lt;br /&gt;
In unserem Fall müssen wir diese Korrektur solange verzögern bis der seitliche Liniensensor eine mögliche Kreuzung passiert hat. Erst danach können wir feststellen ob wir nur die schwarze Linie einer Kreuzung überfahren sind oder ob tatsächlich eine Abweichung vorliegt. Die Anzahl der zu ignorierenden Odometrie-Impule kann folgendermaßen errechnet werden:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;Impulse pro Radumdrehung&amp;gt; / &amp;lt;Radumfang&amp;gt; * &amp;lt;Linienbreite&amp;gt; =&lt;br /&gt;
 20 / 11,8 * 1 = 1,69491525&lt;br /&gt;
&lt;br /&gt;
Wir werden also nur zwei Impulse abwarten bevor wir mit der Korrektur beginnen&lt;br /&gt;
&lt;br /&gt;
===== Funktionsaufteilung =====&lt;br /&gt;
Die Zuständigkeiten für diese Aufgabe sind wie folgt:&lt;br /&gt;
;drive Modul&lt;br /&gt;
:sorgt für die Steuerung der Motoren. Reduzieren der Geschwindigkeit eines Rades um eine ausgleichende Kurve zu fahren und stoppen wenn das Ende der geraden Linie erreicht wurde. Dazu aboniert der Modul die Events des line Modul die eine Abweichung von der Linie melden und vom distance Modul den Event zum fahren der Distanz zwischen Liniensensoren und Achse der Räder.&lt;br /&gt;
;line Modul&lt;br /&gt;
:prüft zyklisch die position der Linie unter dem NIBObee und meldet Abweichungen mittels Events. Dieses Melden wird allerdings verzögert bis zumindest die Breite der Linie überfahren wurde. Dazu aboniert der Modul den Event vom distance Modul den Event zum fahren der der Breite der Linie.&lt;br /&gt;
;distance Modul&lt;br /&gt;
:meldet auf Anforderung das zurücklegen einer Strecke in der Länge der Distanz zwischen Liniensensoren und Achse der Räder oder der Breite der Linie.&lt;br /&gt;
&lt;br /&gt;
==== Kreuzung fahren ====&lt;br /&gt;
An einer Kreuzung wird abgebogen indem der NIBObee zuerst unbeirrt geradeaus fährt bis die Achse genau auf dem Mittelpunkt der Kreuzung zu stehen kommt. Danach wird eine Drehung nach rechts oder links durchgeführt bis sich die Linie wieder genau unter dem mittleren Sensor befindet.&lt;br /&gt;
&lt;br /&gt;
Die Sensoren sind von der Achse 10,4 cm entfernt, eine Radumdrehung bewegt den NIBObee um 11,8 cm weiter und bei dieser Umdrehung werden vom Odometriesensor 20 Impulse abgegeben. Die Linienbreite wird 2 cm betragen. Daher errechnet sich die Strecke die nach Erkennen der Kreuzung gefahren werden muss folgendermassen:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;Impulse pro Radumdrehung&amp;gt; / &amp;lt;Radumfang&amp;gt; * (&amp;lt;Achsabstand&amp;gt; - &amp;lt;halbe Linienbreite&amp;gt;) =&lt;br /&gt;
 20 / 11,8 * (10,4 - 0,5) = 16,779661&lt;br /&gt;
&lt;br /&gt;
Nach passieren der Kreuzung muss der NIBObee also noch 17 Impulse über den Odometriesensor empfangen bevor er stoppt.&lt;br /&gt;
&lt;br /&gt;
== Risikoanalyse ==&lt;br /&gt;
Im Folgenden wird versucht für die möglichen Risikopunkte Alternativen aufzuzeigen.&lt;br /&gt;
&lt;br /&gt;
; ATmega16 ist nicht Leisungsfägig genug&lt;br /&gt;
: Es kann auf den [http://www.nicai-systems.com/de/zubehoer/nibobee-tuning-kit.html Tuning-Kit von Nicai-Systems] zurückgerifffen werden. Dies könnte eine nicht akzeptable Verzögerung verursachen (erkennen, bestellen, NIBObee umrüsten)&lt;br /&gt;
&lt;br /&gt;
: Ein beliebiger PIN-kompatiber Microcontroller ATmega... wird statt dem ATmega16 eingesetzt. Die funktioniert soange der Ersatz-µC mit der Frequenz vom 15 MHz betrieben werden kann. Wichtig ist auch dass es adaptierte Bibliotheken gibt die auf den Ersatz-µC abgestimmt sind (z.B. andere Register oder geänderte Adressen für Register, ...)&lt;br /&gt;
&lt;br /&gt;
; Signale am UART mit Bordspannung im Gegensatz zu RS232-Level (12V)&lt;br /&gt;
: Die Signale am UART werden mit Bordspannung erzeugt/erwartet. Für die Kommunikation mit dem BT-Modul ist daher keine Anpassung durchzuführen.&lt;br /&gt;
&lt;br /&gt;
: Soll zu Testzwecken ein PC über RS232 angeschalten werden ist unbedingt auf die Spannung achten. Möglicherweise verwendet ein USB-RS232 Adapter nicht die 12V sonder nur 5V.&lt;br /&gt;
&lt;br /&gt;
== Open Issues ==&lt;br /&gt;
* Es muss noch überprüft werden ob die NIBObee Hardware ausreichend leistungsfähig ist oder ein Upgrade gemacht werden muss.&lt;br /&gt;
* Wie kann das verlassen der Spur von dem Überfahren einer Kreuzung unterschieden werden? Wenn es hier zu Problemen kommt könnten zwei zusätzliche lichtempfindliche Sensoren rechts und links oder noch ein Element mit drei zusätzlichen Sensoren auf Höhe der Achsen angebracht werden -&amp;gt; Mehraufwand!&lt;br /&gt;
* Soll Aktivierung der BT-Schnittstelle manuell erfolgen?&lt;br /&gt;
* Soll der Betriebsmodus gewählt werden können?&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* [http://www.nicai-systems.de/nibobee.html NIBObee Homepage bei Nicai Systems]&lt;br /&gt;
* [http://download.nicai-systems.com/nibo/Tutorial_NIBObee_20091123.pdf NIBObee - Tutorial zur Programmierung]&lt;br /&gt;
* [http://www.nicai-systems.com/de/zubehoer/nibobee-tuning-kit.html NIBObee - Tuning-Kit von Nicai-Systems]&lt;br /&gt;
* [http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/Der_UART Tutorial zur USART Programmierung]&lt;br /&gt;
[[Kategorie:FH]]&lt;/div&gt;</summary>
		<author><name>Alois</name></author>
	</entry>
	<entry>
		<id>https://wiki.callooh.com/index.php?title=NIBObee&amp;diff=855</id>
		<title>NIBObee</title>
		<link rel="alternate" type="text/html" href="https://wiki.callooh.com/index.php?title=NIBObee&amp;diff=855"/>
		<updated>2011-05-02T09:28:57Z</updated>

		<summary type="html">&lt;p&gt;Alois: /* Analogeingänge digitalisieren */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;NIBObee ist der Roboter der im Projekt [[RoLoMa]] verwendet wird.&lt;br /&gt;
== Technische Daten ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Art&lt;br /&gt;
!Typ&lt;br /&gt;
!Bemerkung&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|Mikrocontroller&lt;br /&gt;
|ATMEL ATMega16, , 15 MHz&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|Integrierter UART wird verwendet um den Bluetooth Modul anzubinden.&lt;br /&gt;
&lt;br /&gt;
Sollte die Leistung nicht ausreichen kann entweder der Erweiterungssatz von Nicai-Systems verwendet werden oder nur der Controller wird gegen einen Pinkompatiblen Typ ausgetauscht (z.B. ATMega32, ATMega644, ATMega1284)&lt;br /&gt;
|-&lt;br /&gt;
|Flash:	16	kB&lt;br /&gt;
|-&lt;br /&gt;
|...&lt;br /&gt;
|-&lt;br /&gt;
|...&lt;br /&gt;
|...&lt;br /&gt;
|...&lt;br /&gt;
|-&lt;br /&gt;
|...&lt;br /&gt;
|...&lt;br /&gt;
|...&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|Maße&lt;br /&gt;
|Radumfang: 11,8 cm&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|Diese Maße sind wichtig um den NIBObee so exakt wie möglich am Mittelpunkt des Labyrinthfeldes positionieren zu können.&lt;br /&gt;
|-&lt;br /&gt;
|Abstand Liniensensor zu Radachse: 10,4 cm&lt;br /&gt;
|-&lt;br /&gt;
|Impulse pro Umdrehung: 20&lt;br /&gt;
|}&lt;br /&gt;
=== Ports ===&lt;br /&gt;
Über den UART wird der Bluetooth Modul [[BTM-222]] angebunden. Am NIObee ist diese Schnittstelle am Port X5 verfügbar&lt;br /&gt;
&lt;br /&gt;
=== Resourcen ===&lt;br /&gt;
Folgende Resourcen werden für unsere Implementierung verwendet (&#039;&#039;kursiv&#039;&#039; markierte Resourcen werden bereits durch die Bibliothek belegt):&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Resource&lt;br /&gt;
!Verwendung&lt;br /&gt;
!Interrupts&lt;br /&gt;
!Dateien&lt;br /&gt;
|-&lt;br /&gt;
|Timer 1&lt;br /&gt;
|Motor PWM&lt;br /&gt;
|TIMER1_COMPA_vect, TIMER1_COMPB_vect&lt;br /&gt;
|motpwm.c&lt;br /&gt;
|-&lt;br /&gt;
|ADC&lt;br /&gt;
|Analog, Line&lt;br /&gt;
|ADC_vect&lt;br /&gt;
|analog.c, line.c&lt;br /&gt;
|-&lt;br /&gt;
|EEPROM&lt;br /&gt;
|Line (12 Byte)&lt;br /&gt;
|&lt;br /&gt;
|line.c&lt;br /&gt;
|-&lt;br /&gt;
|Ext. IRQ&lt;br /&gt;
|Odometrie&lt;br /&gt;
|INT0_vect, INT1_vect&lt;br /&gt;
|odometry.c&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Eine für den NIBObee allgemein gültige Auflistung findet man im [http://www.nibo-roboter.de/wiki/NIBObee/Lib/Resourcen NIBObee Wiki].&lt;br /&gt;
&lt;br /&gt;
=== Besondere Erkenntnisse ===&lt;br /&gt;
Es hat sich, nach einigen Fehlschlägen bei der Linienverfolung, herausgestellt dass es ungünstig ist den NIBObee in eine optisch ansprechende waagrechte Position zu bringen indem eine kleinere Halbkugel auf der Unterseite angebracht wird. Der Grund: Nur mit der original Halbkugel und dem damit nach vorne ansteigenden Bodenabstand sind die IR-LED&#039;s weit genug vom Boden entfernt um einen Lichtkegen zu erzeugen der auch vernünftig vom Phototransistor erfasst werden kann. Bei waagrechter Ausrichtung des NIBObee ist dieser Kegel, aufgrund des geringeren Abstands zum Boden, zu klein!&lt;br /&gt;
&lt;br /&gt;
=== Bibliotheksfunktionen ===&lt;br /&gt;
==== Liniensensoren ====&lt;br /&gt;
 line.h&lt;br /&gt;
Die Werte der Liniensensoren können mit der Funktion&lt;br /&gt;
&amp;lt;code&amp;gt;line_get(index)&amp;lt;/code&amp;gt;&lt;br /&gt;
gelesen werden. Die Werte selbst werden über einen A/D-Wandler ermittelt und zwischengespeichert. Es gibt 11 analoge Werte die zyklisch digitalisiert werden. Dieser Vorgang wird mit einer Frequenz von 120 kHz durchgeführt, d.h. dass jeder dieser Werte ca. alle 94 µs aktualisiert wird.&lt;br /&gt;
&lt;br /&gt;
==== Motorensteuerung ====&lt;br /&gt;
 motpwm.h&lt;br /&gt;
Die Motoren des NIBObee werden mit PWM ([http://de.wikipedia.org/wiki/Pulsweitenmodulation Pulsweitenmodulation]) angesteuert. Das garantiert natürlich ohne Regelung noch keinen gleichlauf der beiden Motoren was sich je nach Zustand des Getriebes in einer weiteren oder engernen Kurve zeigt.&lt;br /&gt;
 motpid.h&lt;br /&gt;
Hier stehen Funktionen zur Verfügung die mit Hilfe der Odometrie die Motoren regeln. Diese Funktionen sind für unsere Zwecke allerdings nicht geeignet.&lt;br /&gt;
&lt;br /&gt;
== Aufgaben ==&lt;br /&gt;
Folgende Aufgaben sind im Rahmen des Projekts [[RoLoMa]] vom NIBObee Team zu lösen:&lt;br /&gt;
* Herstellung der Bluetooth Hardware-Erweiterung&lt;br /&gt;
* Softwaremodul zum Bedienen der Bluetooth-Schnittstelle via RS232&lt;br /&gt;
* Softwaremodul zum Erkennen der Linie im Labyrinth und im speziellen der unterschiedlichen Kreuzungstypen&lt;br /&gt;
* Messen des zurückgelegten Weges&lt;br /&gt;
* Steuerung, die den Abstand des Sensors zur Radachse berücksichtigt um den Roboter an der korrekten Stelle um die eigene Achse zu drehen&lt;br /&gt;
* Erstellen eines Abbilds des Labyrinths im Speicher und navigieren bis der Roboter wieder am Startpunkt gelandet ist (z.B. immer Links abbiegen)&lt;br /&gt;
* Implementieren des [[MaDeCo]] Protokolls&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
&lt;br /&gt;
=== Bluetooth ===&lt;br /&gt;
Der Bluetooth Modul ist im Detail auf den Seiten des [[BTM-222]] beschrieben.&lt;br /&gt;
&lt;br /&gt;
=== Liniensensoren ===&lt;br /&gt;
Zum Erkennen der Kreuzungen bei gleichzeitigem folgen der Linie war es notwendig zusätzliche Liniensensoren zu verwenden. Diese wurden mit einer Zusätzplatine in einer Reihe mit den bereits vorhandenen Liniensensoren, allerdings so weit wie möglich linke und rechts außen, montiert. Das einlesen der Analogwerte erfolgt über die beiden Analogeingänge am Stecker X1. Die IR-LEDs sind, analog zu den bestehenden IR-LEDs der vorhandenen Liniensensoren, über den Ausgang 1 am Stecker X4 schaltbar. Dies ist notwendig da jeweils eine Messung mit eingschalteter LED und eine mit ausgeschalteter LED durchgeführt wird. Damit wird der Einfluß des Umgebungslichts korrigiert.&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
Die Aufgaben der Software sollen in möglichst unabhängigen Modulen realisiert werden um das Testen einfacher zu gestalten. Die einzelnen Module sind im Folgenden beschrieben.&lt;br /&gt;
&lt;br /&gt;
=== Architektur ===&lt;br /&gt;
Das Gesamtsystem besteht aus einem zentralen Taktgeber, einem Scheduler und mehreren State Maschinen. Die Kommunikation erfolgt ausschließlich über Events. Die Module können mittels Subscribe einen Event, den ein anderer Modul zur Verfügung steht, abonnieren.&lt;br /&gt;
&lt;br /&gt;
==== Systemtakt, Scheduler ====&lt;br /&gt;
Im Main Modul befindet sich der zentrale Taktgeber der aus dem Interrupt des Timer 2 einen gleichmäßigen Takt von 100Hz erzeugt. Dieser Takt kann von anderen Modulen verwendet werden um zyklische Aufgaben zu erfüllen (z.B. lesen der Liniensensoren). Im Main Modul befindet sich auch der Scheduler der ganz einfach in der Endlosschleife sequenziell jeden Modul aufruft um anstehende Events zu bearbeiten.&lt;br /&gt;
&lt;br /&gt;
==== State / Event Maschinen ====&lt;br /&gt;
Die State / Event Maschinen sind in allen Modulen gleich aufgebaut. Es gibt die folgenden Funktionen (wobei statt &amp;quot;&amp;lt;xx&amp;gt;&amp;quot; das Kürzel des Moduls steht, z.B &amp;quot;dr&amp;quot; für Drive):&lt;br /&gt;
; eine Funktion mit dem Namen &amp;lt;xx&amp;gt;_main (intern)&lt;br /&gt;
: Das ist die eigentliche State Maschine. Wird nicht direkt vom Scheduler aufgerufen sondern über die Funktion &amp;lt;xx&amp;gt;_eventHandler. Hier gibt es ein switch Statement über den aktuellen Zustand und für jeden Zustand ein switch Statement über den empfangenen Event.&lt;br /&gt;
; eine Funktion mit dem Namen &amp;lt;xx&amp;gt;_init (extern)&lt;br /&gt;
: Hier werden Variableninitialisierungen gemacht und die ersten subscribe Aufrufe um Events zu abonnieren. Diese Funktion wird beim Systemstart vom Main Modul aufgerufen.&lt;br /&gt;
; eine Funktion mit dem Namen &amp;lt;xx&amp;gt;_eventHandler (extern)&lt;br /&gt;
: Ist die Funktion die vom Scheduler aufgerufen wird damit die Statemaschine mit dem aktuellen Event, sofern vorhanden, durchlaufen wird.&lt;br /&gt;
; optional Funktionen mit den Namen &amp;lt;xx&amp;gt;_subscribe_&amp;lt;event&amp;gt; und &amp;lt;xx&amp;gt;_unsubscribe_&amp;lt;event&amp;gt; (extern)&lt;br /&gt;
: für jeden Event den dieser Modul verschicken kann ist sowohl eine Subscribe Funktion als auch ein Unsubscribe Funktion vorhanden. Mit diesen Funktionen kann der Event von einem anderen Modul abboniert werden.&lt;br /&gt;
; eine Funktion mit dem Namen &amp;lt;xx&amp;gt;_receiveEvent (intern)&lt;br /&gt;
: ReceiveEvent ist eigentlich eine interne Funktion (wird also nicht im Header File deklariert), der Pointer auf diese Funktion wird allerdings als Callback beim Subscribe übergeben damit der Event dem Modul zugestellt werden kann.&lt;br /&gt;
&lt;br /&gt;
=== Module ===&lt;br /&gt;
Im folgenden sind alle Module und deren Hauptfunktionen aufgelistet.&lt;br /&gt;
&lt;br /&gt;
==== Analog-Modul ====&lt;br /&gt;
Digitalisieren der Analogeingänge&lt;br /&gt;
 Dateien: analog.c&lt;br /&gt;
          analog.h&lt;br /&gt;
Dieser Modul ist abgeleitet von den gleichnamigen Dateien der original NIBObee Bibliothek. Dies war notwendig da wir zusätzliche Liniensensoren verwenden und deren Ansteuerung in gleicher Weise erfolgen sollte. Das bedeutet dass für die entsprechenden Analogeingänge Messungen mit ein- und ausgeschalteten IR-LEDs durchgeführt werden müssen. Außerdem wurde, entsprechend dem Datenblatt des ATMega16 die Behandlung der Messung der Batteriespannung verbessert. Da hier die referenzspannung umgeschalten wird muss eine Messung verworfen werden bevor mit einem richtigen Ergebnis gerechnet werden kann. Das wurde in der Originalbibliothek nicht berücksichtigt.&lt;br /&gt;
&lt;br /&gt;
==== Line-Modul ====&lt;br /&gt;
Ermitteln der Werte der Liniensensoren&lt;br /&gt;
 Dateien: line.c&lt;br /&gt;
          line.h&lt;br /&gt;
Dieser Modul ersetzt die originalen Bibliotheksfunktionen der Liniensensoren. Dies war notwendig da wir zusätzliche Liniensensoren verwenden.&lt;br /&gt;
&lt;br /&gt;
=== Applikationen ===&lt;br /&gt;
==== Labyrinth erkunden ====&lt;br /&gt;
&lt;br /&gt;
==== Kürzesten Weg durch Labyrinth ====&lt;br /&gt;
&lt;br /&gt;
==== Kalibrierung ====&lt;br /&gt;
Zur Kalibrierung fährt der NIBObee ein Viereck entlang dass genau die Seitenlänge eines der Felder des Labyrinths hat. Dies ist notwendig um relativ einfach die Karte des Labyrinths erstellen zu können.&lt;br /&gt;
&lt;br /&gt;
=== Protokolle und deren Implementierung ===&lt;br /&gt;
==== [[MaDeCo]] ====&lt;br /&gt;
===== Interface Definition =====&lt;br /&gt;
* int set_opmode(OPMODE)&lt;br /&gt;
* int send_waypoint(WAYPOINT)&lt;br /&gt;
* int direct(DIRECTION[])&lt;br /&gt;
* int ack()&lt;br /&gt;
&lt;br /&gt;
==== Schnittstelle [[MaDeCo]] - RS232-Schnittstelle ====&lt;br /&gt;
* pairing&lt;br /&gt;
* Konfigurations-Commands&lt;br /&gt;
* ack&lt;br /&gt;
* read_command&lt;br /&gt;
* send_command&lt;br /&gt;
&lt;br /&gt;
=== Steuerungssoftware ===&lt;br /&gt;
==== Bluetooth Modul einschalten ====&lt;br /&gt;
Durch Bewegen der &amp;quot;Fühler&amp;quot; der NIBObee nach oben bis Einrasten wird das Bluetooth Modul eingeschalten.&lt;br /&gt;
Daraufhin muss auf eingehenden Bluetooth Traffic gelauscht werden.&lt;br /&gt;
&lt;br /&gt;
==== Blink Codes ====&lt;br /&gt;
Bestimmte Events oder Commands lösen bestimmte Blink- oder Leuchtmuster der Status LEDs aus.&lt;br /&gt;
&#039;&#039;&#039;TODO:&#039;&#039;&#039; Spezifikation der Blink Codes&lt;br /&gt;
&lt;br /&gt;
==== Gerade fahren ====&lt;br /&gt;
Das Problem beim geradeaus fahren ist dass der Roboter von der Spur abweichen kann und dann neu ausgerichtet werden muss. Üblicherweise erfolgt das mit Hilfe der Liniensensoren indem, sobald einer der seitlichen Sensoren die Linie erkennt, durch beschleunigen oder bremsen eines Rades in diese Richtung korrigierend gelenkt wird.&lt;br /&gt;
&lt;br /&gt;
In unserem Fall müssen wir diese Korrektur solange verzögern bis der seitliche Liniensensor eine mögliche Kreuzung passiert hat. Erst danach können wir feststellen ob wir nur die schwarze Linie einer Kreuzung überfahren sind oder ob tatsächlich eine Abweichung vorliegt. Die Anzahl der zu ignorierenden Odometrie-Impule kann folgendermaßen errechnet werden:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;Impulse pro Radumdrehung&amp;gt; / &amp;lt;Radumfang&amp;gt; * &amp;lt;Linienbreite&amp;gt; =&lt;br /&gt;
 20 / 11,8 * 1 = 1,69491525&lt;br /&gt;
&lt;br /&gt;
Wir werden also nur zwei Impulse abwarten bevor wir mit der Korrektur beginnen&lt;br /&gt;
&lt;br /&gt;
===== Funktionsaufteilung =====&lt;br /&gt;
Die Zuständigkeiten für diese Aufgabe sind wie folgt:&lt;br /&gt;
;drive Modul&lt;br /&gt;
:sorgt für die Steuerung der Motoren. Reduzieren der Geschwindigkeit eines Rades um eine ausgleichende Kurve zu fahren und stoppen wenn das Ende der geraden Linie erreicht wurde. Dazu aboniert der Modul die Events des line Modul die eine Abweichung von der Linie melden und vom distance Modul den Event zum fahren der Distanz zwischen Liniensensoren und Achse der Räder.&lt;br /&gt;
;line Modul&lt;br /&gt;
:prüft zyklisch die position der Linie unter dem NIBObee und meldet Abweichungen mittels Events. Dieses Melden wird allerdings verzögert bis zumindest die Breite der Linie überfahren wurde. Dazu aboniert der Modul den Event vom distance Modul den Event zum fahren der der Breite der Linie.&lt;br /&gt;
;distance Modul&lt;br /&gt;
:meldet auf Anforderung das zurücklegen einer Strecke in der Länge der Distanz zwischen Liniensensoren und Achse der Räder oder der Breite der Linie.&lt;br /&gt;
&lt;br /&gt;
==== Kreuzung fahren ====&lt;br /&gt;
An einer Kreuzung wird abgebogen indem der NIBObee zuerst unbeirrt geradeaus fährt bis die Achse genau auf dem Mittelpunkt der Kreuzung zu stehen kommt. Danach wird eine Drehung nach rechts oder links durchgeführt bis sich die Linie wieder genau unter dem mittleren Sensor befindet.&lt;br /&gt;
&lt;br /&gt;
Die Sensoren sind von der Achse 10,4 cm entfernt, eine Radumdrehung bewegt den NIBObee um 11,8 cm weiter und bei dieser Umdrehung werden vom Odometriesensor 20 Impulse abgegeben. Die Linienbreite wird 2 cm betragen. Daher errechnet sich die Strecke die nach Erkennen der Kreuzung gefahren werden muss folgendermassen:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;Impulse pro Radumdrehung&amp;gt; / &amp;lt;Radumfang&amp;gt; * (&amp;lt;Achsabstand&amp;gt; - &amp;lt;halbe Linienbreite&amp;gt;) =&lt;br /&gt;
 20 / 11,8 * (10,4 - 0,5) = 16,779661&lt;br /&gt;
&lt;br /&gt;
Nach passieren der Kreuzung muss der NIBObee also noch 17 Impulse über den Odometriesensor empfangen bevor er stoppt.&lt;br /&gt;
&lt;br /&gt;
== Risikoanalyse ==&lt;br /&gt;
Im Folgenden wird versucht für die möglichen Risikopunkte Alternativen aufzuzeigen.&lt;br /&gt;
&lt;br /&gt;
; ATmega16 ist nicht Leisungsfägig genug&lt;br /&gt;
: Es kann auf den [http://www.nicai-systems.com/de/zubehoer/nibobee-tuning-kit.html Tuning-Kit von Nicai-Systems] zurückgerifffen werden. Dies könnte eine nicht akzeptable Verzögerung verursachen (erkennen, bestellen, NIBObee umrüsten)&lt;br /&gt;
&lt;br /&gt;
: Ein beliebiger PIN-kompatiber Microcontroller ATmega... wird statt dem ATmega16 eingesetzt. Die funktioniert soange der Ersatz-µC mit der Frequenz vom 15 MHz betrieben werden kann. Wichtig ist auch dass es adaptierte Bibliotheken gibt die auf den Ersatz-µC abgestimmt sind (z.B. andere Register oder geänderte Adressen für Register, ...)&lt;br /&gt;
&lt;br /&gt;
; Signale am UART mit Bordspannung im Gegensatz zu RS232-Level (12V)&lt;br /&gt;
: Die Signale am UART werden mit Bordspannung erzeugt/erwartet. Für die Kommunikation mit dem BT-Modul ist daher keine Anpassung durchzuführen.&lt;br /&gt;
&lt;br /&gt;
: Soll zu Testzwecken ein PC über RS232 angeschalten werden ist unbedingt auf die Spannung achten. Möglicherweise verwendet ein USB-RS232 Adapter nicht die 12V sonder nur 5V.&lt;br /&gt;
&lt;br /&gt;
== Open Issues ==&lt;br /&gt;
* Es muss noch überprüft werden ob die NIBObee Hardware ausreichend leistungsfähig ist oder ein Upgrade gemacht werden muss.&lt;br /&gt;
* Wie kann das verlassen der Spur von dem Überfahren einer Kreuzung unterschieden werden? Wenn es hier zu Problemen kommt könnten zwei zusätzliche lichtempfindliche Sensoren rechts und links oder noch ein Element mit drei zusätzlichen Sensoren auf Höhe der Achsen angebracht werden -&amp;gt; Mehraufwand!&lt;br /&gt;
* Soll Aktivierung der BT-Schnittstelle manuell erfolgen?&lt;br /&gt;
* Soll der Betriebsmodus gewählt werden können?&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* [http://www.nicai-systems.de/nibobee.html NIBObee Homepage bei Nicai Systems]&lt;br /&gt;
* [http://download.nicai-systems.com/nibo/Tutorial_NIBObee_20091123.pdf NIBObee - Tutorial zur Programmierung]&lt;br /&gt;
* [http://www.nicai-systems.com/de/zubehoer/nibobee-tuning-kit.html NIBObee - Tuning-Kit von Nicai-Systems]&lt;br /&gt;
* [http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/Der_UART Tutorial zur USART Programmierung]&lt;br /&gt;
[[Kategorie:FH]]&lt;/div&gt;</summary>
		<author><name>Alois</name></author>
	</entry>
	<entry>
		<id>https://wiki.callooh.com/index.php?title=NIBObee&amp;diff=854</id>
		<title>NIBObee</title>
		<link rel="alternate" type="text/html" href="https://wiki.callooh.com/index.php?title=NIBObee&amp;diff=854"/>
		<updated>2011-05-02T09:21:46Z</updated>

		<summary type="html">&lt;p&gt;Alois: /* Analog */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;NIBObee ist der Roboter der im Projekt [[RoLoMa]] verwendet wird.&lt;br /&gt;
== Technische Daten ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Art&lt;br /&gt;
!Typ&lt;br /&gt;
!Bemerkung&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|Mikrocontroller&lt;br /&gt;
|ATMEL ATMega16, , 15 MHz&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|Integrierter UART wird verwendet um den Bluetooth Modul anzubinden.&lt;br /&gt;
&lt;br /&gt;
Sollte die Leistung nicht ausreichen kann entweder der Erweiterungssatz von Nicai-Systems verwendet werden oder nur der Controller wird gegen einen Pinkompatiblen Typ ausgetauscht (z.B. ATMega32, ATMega644, ATMega1284)&lt;br /&gt;
|-&lt;br /&gt;
|Flash:	16	kB&lt;br /&gt;
|-&lt;br /&gt;
|...&lt;br /&gt;
|-&lt;br /&gt;
|...&lt;br /&gt;
|...&lt;br /&gt;
|...&lt;br /&gt;
|-&lt;br /&gt;
|...&lt;br /&gt;
|...&lt;br /&gt;
|...&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|Maße&lt;br /&gt;
|Radumfang: 11,8 cm&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|Diese Maße sind wichtig um den NIBObee so exakt wie möglich am Mittelpunkt des Labyrinthfeldes positionieren zu können.&lt;br /&gt;
|-&lt;br /&gt;
|Abstand Liniensensor zu Radachse: 10,4 cm&lt;br /&gt;
|-&lt;br /&gt;
|Impulse pro Umdrehung: 20&lt;br /&gt;
|}&lt;br /&gt;
=== Ports ===&lt;br /&gt;
Über den UART wird der Bluetooth Modul [[BTM-222]] angebunden. Am NIObee ist diese Schnittstelle am Port X5 verfügbar&lt;br /&gt;
&lt;br /&gt;
=== Resourcen ===&lt;br /&gt;
Folgende Resourcen werden für unsere Implementierung verwendet (&#039;&#039;kursiv&#039;&#039; markierte Resourcen werden bereits durch die Bibliothek belegt):&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Resource&lt;br /&gt;
!Verwendung&lt;br /&gt;
!Interrupts&lt;br /&gt;
!Dateien&lt;br /&gt;
|-&lt;br /&gt;
|Timer 1&lt;br /&gt;
|Motor PWM&lt;br /&gt;
|TIMER1_COMPA_vect, TIMER1_COMPB_vect&lt;br /&gt;
|motpwm.c&lt;br /&gt;
|-&lt;br /&gt;
|ADC&lt;br /&gt;
|Analog, Line&lt;br /&gt;
|ADC_vect&lt;br /&gt;
|analog.c, line.c&lt;br /&gt;
|-&lt;br /&gt;
|EEPROM&lt;br /&gt;
|Line (12 Byte)&lt;br /&gt;
|&lt;br /&gt;
|line.c&lt;br /&gt;
|-&lt;br /&gt;
|Ext. IRQ&lt;br /&gt;
|Odometrie&lt;br /&gt;
|INT0_vect, INT1_vect&lt;br /&gt;
|odometry.c&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Eine für den NIBObee allgemein gültige Auflistung findet man im [http://www.nibo-roboter.de/wiki/NIBObee/Lib/Resourcen NIBObee Wiki].&lt;br /&gt;
&lt;br /&gt;
=== Besondere Erkenntnisse ===&lt;br /&gt;
Es hat sich, nach einigen Fehlschlägen bei der Linienverfolung, herausgestellt dass es ungünstig ist den NIBObee in eine optisch ansprechende waagrechte Position zu bringen indem eine kleinere Halbkugel auf der Unterseite angebracht wird. Der Grund: Nur mit der original Halbkugel und dem damit nach vorne ansteigenden Bodenabstand sind die IR-LED&#039;s weit genug vom Boden entfernt um einen Lichtkegen zu erzeugen der auch vernünftig vom Phototransistor erfasst werden kann. Bei waagrechter Ausrichtung des NIBObee ist dieser Kegel, aufgrund des geringeren Abstands zum Boden, zu klein!&lt;br /&gt;
&lt;br /&gt;
=== Bibliotheksfunktionen ===&lt;br /&gt;
==== Liniensensoren ====&lt;br /&gt;
 line.h&lt;br /&gt;
Die Werte der Liniensensoren können mit der Funktion&lt;br /&gt;
&amp;lt;code&amp;gt;line_get(index)&amp;lt;/code&amp;gt;&lt;br /&gt;
gelesen werden. Die Werte selbst werden über einen A/D-Wandler ermittelt und zwischengespeichert. Es gibt 11 analoge Werte die zyklisch digitalisiert werden. Dieser Vorgang wird mit einer Frequenz von 120 kHz durchgeführt, d.h. dass jeder dieser Werte ca. alle 94 µs aktualisiert wird.&lt;br /&gt;
&lt;br /&gt;
==== Motorensteuerung ====&lt;br /&gt;
 motpwm.h&lt;br /&gt;
Die Motoren des NIBObee werden mit PWM ([http://de.wikipedia.org/wiki/Pulsweitenmodulation Pulsweitenmodulation]) angesteuert. Das garantiert natürlich ohne Regelung noch keinen gleichlauf der beiden Motoren was sich je nach Zustand des Getriebes in einer weiteren oder engernen Kurve zeigt.&lt;br /&gt;
 motpid.h&lt;br /&gt;
Hier stehen Funktionen zur Verfügung die mit Hilfe der Odometrie die Motoren regeln. Diese Funktionen sind für unsere Zwecke allerdings nicht geeignet.&lt;br /&gt;
&lt;br /&gt;
== Aufgaben ==&lt;br /&gt;
Folgende Aufgaben sind im Rahmen des Projekts [[RoLoMa]] vom NIBObee Team zu lösen:&lt;br /&gt;
* Herstellung der Bluetooth Hardware-Erweiterung&lt;br /&gt;
* Softwaremodul zum Bedienen der Bluetooth-Schnittstelle via RS232&lt;br /&gt;
* Softwaremodul zum Erkennen der Linie im Labyrinth und im speziellen der unterschiedlichen Kreuzungstypen&lt;br /&gt;
* Messen des zurückgelegten Weges&lt;br /&gt;
* Steuerung, die den Abstand des Sensors zur Radachse berücksichtigt um den Roboter an der korrekten Stelle um die eigene Achse zu drehen&lt;br /&gt;
* Erstellen eines Abbilds des Labyrinths im Speicher und navigieren bis der Roboter wieder am Startpunkt gelandet ist (z.B. immer Links abbiegen)&lt;br /&gt;
* Implementieren des [[MaDeCo]] Protokolls&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
&lt;br /&gt;
=== Bluetooth ===&lt;br /&gt;
Der Bluetooth Modul ist im Detail auf den Seiten des [[BTM-222]] beschrieben.&lt;br /&gt;
&lt;br /&gt;
=== Liniensensoren ===&lt;br /&gt;
Zum Erkennen der Kreuzungen bei gleichzeitigem folgen der Linie war es notwendig zusätzliche Liniensensoren zu verwenden. Diese wurden mit einer Zusätzplatine in einer Reihe mit den bereits vorhandenen Liniensensoren, allerdings so weit wie möglich linke und rechts außen, montiert. Das einlesen der Analogwerte erfolgt über die beiden Analogeingänge am Stecker X1. Die IR-LEDs sind, analog zu den bestehenden IR-LEDs der vorhandenen Liniensensoren, über den Ausgang 1 am Stecker X4 schaltbar. Dies ist notwendig da jeweils eine Messung mit eingschalteter LED und eine mit ausgeschalteter LED durchgeführt wird. Damit wird der Einfluß des Umgebungslichts korrigiert.&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
Die Aufgaben der Software sollen in möglichst unabhängigen Modulen realisiert werden um das Testen einfacher zu gestalten. Die einzelnen Module sind im Folgenden beschrieben.&lt;br /&gt;
&lt;br /&gt;
=== Architektur ===&lt;br /&gt;
Das Gesamtsystem besteht aus einem zentralen Taktgeber, einem Scheduler und mehreren State Maschinen. Die Kommunikation erfolgt ausschließlich über Events. Die Module können mittels Subscribe einen Event, den ein anderer Modul zur Verfügung steht, abonnieren.&lt;br /&gt;
&lt;br /&gt;
==== Systemtakt, Scheduler ====&lt;br /&gt;
Im Main Modul befindet sich der zentrale Taktgeber der aus dem Interrupt des Timer 2 einen gleichmäßigen Takt von 100Hz erzeugt. Dieser Takt kann von anderen Modulen verwendet werden um zyklische Aufgaben zu erfüllen (z.B. lesen der Liniensensoren). Im Main Modul befindet sich auch der Scheduler der ganz einfach in der Endlosschleife sequenziell jeden Modul aufruft um anstehende Events zu bearbeiten.&lt;br /&gt;
&lt;br /&gt;
==== State / Event Maschinen ====&lt;br /&gt;
Die State / Event Maschinen sind in allen Modulen gleich aufgebaut. Es gibt die folgenden Funktionen (wobei statt &amp;quot;&amp;lt;xx&amp;gt;&amp;quot; das Kürzel des Moduls steht, z.B &amp;quot;dr&amp;quot; für Drive):&lt;br /&gt;
; eine Funktion mit dem Namen &amp;lt;xx&amp;gt;_main (intern)&lt;br /&gt;
: Das ist die eigentliche State Maschine. Wird nicht direkt vom Scheduler aufgerufen sondern über die Funktion &amp;lt;xx&amp;gt;_eventHandler. Hier gibt es ein switch Statement über den aktuellen Zustand und für jeden Zustand ein switch Statement über den empfangenen Event.&lt;br /&gt;
; eine Funktion mit dem Namen &amp;lt;xx&amp;gt;_init (extern)&lt;br /&gt;
: Hier werden Variableninitialisierungen gemacht und die ersten subscribe Aufrufe um Events zu abonnieren. Diese Funktion wird beim Systemstart vom Main Modul aufgerufen.&lt;br /&gt;
; eine Funktion mit dem Namen &amp;lt;xx&amp;gt;_eventHandler (extern)&lt;br /&gt;
: Ist die Funktion die vom Scheduler aufgerufen wird damit die Statemaschine mit dem aktuellen Event, sofern vorhanden, durchlaufen wird.&lt;br /&gt;
; optional Funktionen mit den Namen &amp;lt;xx&amp;gt;_subscribe_&amp;lt;event&amp;gt; und &amp;lt;xx&amp;gt;_unsubscribe_&amp;lt;event&amp;gt; (extern)&lt;br /&gt;
: für jeden Event den dieser Modul verschicken kann ist sowohl eine Subscribe Funktion als auch ein Unsubscribe Funktion vorhanden. Mit diesen Funktionen kann der Event von einem anderen Modul abboniert werden.&lt;br /&gt;
; eine Funktion mit dem Namen &amp;lt;xx&amp;gt;_receiveEvent (intern)&lt;br /&gt;
: ReceiveEvent ist eigentlich eine interne Funktion (wird also nicht im Header File deklariert), der Pointer auf diese Funktion wird allerdings als Callback beim Subscribe übergeben damit der Event dem Modul zugestellt werden kann.&lt;br /&gt;
&lt;br /&gt;
=== Module ===&lt;br /&gt;
Im folgenden sind alle Module und deren Hauptfunktionen aufgelistet.&lt;br /&gt;
&lt;br /&gt;
==== Analogeingänge digitalisieren ====&lt;br /&gt;
 Dateien: analog.c&lt;br /&gt;
          analog.h&lt;br /&gt;
Dieser Modul ist abgeleitet von den gleichnamigen Dateien der original NIBObee Bibliothek. Dies war notwendig da wir zusätzliche Liniensensoren verwenden und deren Ansteuerung in gleicher Weise erfolgen sollte. Das bedeutet dass für die entsprechenden Analogeingänge Messungen mit ein- und ausgeschalteten IR-LEDs durchgeführt werden müssen. Außerdem wurde, entsprechend dem Datenblatt des ATMega16 die Behandlung der Messung der Batteriespannung verbessert. Da hier die referenzspannung umgeschalten wird muss eine Messung verworfen werden bevor mit einem richtigen Ergebnis gerechnet werden kann. Das wurde in der Originalbibliothek nicht berücksichtigt.&lt;br /&gt;
&lt;br /&gt;
=== Applikationen ===&lt;br /&gt;
==== Labyrinth erkunden ====&lt;br /&gt;
&lt;br /&gt;
==== Kürzesten Weg durch Labyrinth ====&lt;br /&gt;
&lt;br /&gt;
==== Kalibrierung ====&lt;br /&gt;
Zur Kalibrierung fährt der NIBObee ein Viereck entlang dass genau die Seitenlänge eines der Felder des Labyrinths hat. Dies ist notwendig um relativ einfach die Karte des Labyrinths erstellen zu können.&lt;br /&gt;
&lt;br /&gt;
=== Protokolle und deren Implementierung ===&lt;br /&gt;
==== [[MaDeCo]] ====&lt;br /&gt;
===== Interface Definition =====&lt;br /&gt;
* int set_opmode(OPMODE)&lt;br /&gt;
* int send_waypoint(WAYPOINT)&lt;br /&gt;
* int direct(DIRECTION[])&lt;br /&gt;
* int ack()&lt;br /&gt;
&lt;br /&gt;
==== Schnittstelle [[MaDeCo]] - RS232-Schnittstelle ====&lt;br /&gt;
* pairing&lt;br /&gt;
* Konfigurations-Commands&lt;br /&gt;
* ack&lt;br /&gt;
* read_command&lt;br /&gt;
* send_command&lt;br /&gt;
&lt;br /&gt;
=== Steuerungssoftware ===&lt;br /&gt;
==== Bluetooth Modul einschalten ====&lt;br /&gt;
Durch Bewegen der &amp;quot;Fühler&amp;quot; der NIBObee nach oben bis Einrasten wird das Bluetooth Modul eingeschalten.&lt;br /&gt;
Daraufhin muss auf eingehenden Bluetooth Traffic gelauscht werden.&lt;br /&gt;
&lt;br /&gt;
==== Blink Codes ====&lt;br /&gt;
Bestimmte Events oder Commands lösen bestimmte Blink- oder Leuchtmuster der Status LEDs aus.&lt;br /&gt;
&#039;&#039;&#039;TODO:&#039;&#039;&#039; Spezifikation der Blink Codes&lt;br /&gt;
&lt;br /&gt;
==== Gerade fahren ====&lt;br /&gt;
Das Problem beim geradeaus fahren ist dass der Roboter von der Spur abweichen kann und dann neu ausgerichtet werden muss. Üblicherweise erfolgt das mit Hilfe der Liniensensoren indem, sobald einer der seitlichen Sensoren die Linie erkennt, durch beschleunigen oder bremsen eines Rades in diese Richtung korrigierend gelenkt wird.&lt;br /&gt;
&lt;br /&gt;
In unserem Fall müssen wir diese Korrektur solange verzögern bis der seitliche Liniensensor eine mögliche Kreuzung passiert hat. Erst danach können wir feststellen ob wir nur die schwarze Linie einer Kreuzung überfahren sind oder ob tatsächlich eine Abweichung vorliegt. Die Anzahl der zu ignorierenden Odometrie-Impule kann folgendermaßen errechnet werden:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;Impulse pro Radumdrehung&amp;gt; / &amp;lt;Radumfang&amp;gt; * &amp;lt;Linienbreite&amp;gt; =&lt;br /&gt;
 20 / 11,8 * 1 = 1,69491525&lt;br /&gt;
&lt;br /&gt;
Wir werden also nur zwei Impulse abwarten bevor wir mit der Korrektur beginnen&lt;br /&gt;
&lt;br /&gt;
===== Funktionsaufteilung =====&lt;br /&gt;
Die Zuständigkeiten für diese Aufgabe sind wie folgt:&lt;br /&gt;
;drive Modul&lt;br /&gt;
:sorgt für die Steuerung der Motoren. Reduzieren der Geschwindigkeit eines Rades um eine ausgleichende Kurve zu fahren und stoppen wenn das Ende der geraden Linie erreicht wurde. Dazu aboniert der Modul die Events des line Modul die eine Abweichung von der Linie melden und vom distance Modul den Event zum fahren der Distanz zwischen Liniensensoren und Achse der Räder.&lt;br /&gt;
;line Modul&lt;br /&gt;
:prüft zyklisch die position der Linie unter dem NIBObee und meldet Abweichungen mittels Events. Dieses Melden wird allerdings verzögert bis zumindest die Breite der Linie überfahren wurde. Dazu aboniert der Modul den Event vom distance Modul den Event zum fahren der der Breite der Linie.&lt;br /&gt;
;distance Modul&lt;br /&gt;
:meldet auf Anforderung das zurücklegen einer Strecke in der Länge der Distanz zwischen Liniensensoren und Achse der Räder oder der Breite der Linie.&lt;br /&gt;
&lt;br /&gt;
==== Kreuzung fahren ====&lt;br /&gt;
An einer Kreuzung wird abgebogen indem der NIBObee zuerst unbeirrt geradeaus fährt bis die Achse genau auf dem Mittelpunkt der Kreuzung zu stehen kommt. Danach wird eine Drehung nach rechts oder links durchgeführt bis sich die Linie wieder genau unter dem mittleren Sensor befindet.&lt;br /&gt;
&lt;br /&gt;
Die Sensoren sind von der Achse 10,4 cm entfernt, eine Radumdrehung bewegt den NIBObee um 11,8 cm weiter und bei dieser Umdrehung werden vom Odometriesensor 20 Impulse abgegeben. Die Linienbreite wird 2 cm betragen. Daher errechnet sich die Strecke die nach Erkennen der Kreuzung gefahren werden muss folgendermassen:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;Impulse pro Radumdrehung&amp;gt; / &amp;lt;Radumfang&amp;gt; * (&amp;lt;Achsabstand&amp;gt; - &amp;lt;halbe Linienbreite&amp;gt;) =&lt;br /&gt;
 20 / 11,8 * (10,4 - 0,5) = 16,779661&lt;br /&gt;
&lt;br /&gt;
Nach passieren der Kreuzung muss der NIBObee also noch 17 Impulse über den Odometriesensor empfangen bevor er stoppt.&lt;br /&gt;
&lt;br /&gt;
== Risikoanalyse ==&lt;br /&gt;
Im Folgenden wird versucht für die möglichen Risikopunkte Alternativen aufzuzeigen.&lt;br /&gt;
&lt;br /&gt;
; ATmega16 ist nicht Leisungsfägig genug&lt;br /&gt;
: Es kann auf den [http://www.nicai-systems.com/de/zubehoer/nibobee-tuning-kit.html Tuning-Kit von Nicai-Systems] zurückgerifffen werden. Dies könnte eine nicht akzeptable Verzögerung verursachen (erkennen, bestellen, NIBObee umrüsten)&lt;br /&gt;
&lt;br /&gt;
: Ein beliebiger PIN-kompatiber Microcontroller ATmega... wird statt dem ATmega16 eingesetzt. Die funktioniert soange der Ersatz-µC mit der Frequenz vom 15 MHz betrieben werden kann. Wichtig ist auch dass es adaptierte Bibliotheken gibt die auf den Ersatz-µC abgestimmt sind (z.B. andere Register oder geänderte Adressen für Register, ...)&lt;br /&gt;
&lt;br /&gt;
; Signale am UART mit Bordspannung im Gegensatz zu RS232-Level (12V)&lt;br /&gt;
: Die Signale am UART werden mit Bordspannung erzeugt/erwartet. Für die Kommunikation mit dem BT-Modul ist daher keine Anpassung durchzuführen.&lt;br /&gt;
&lt;br /&gt;
: Soll zu Testzwecken ein PC über RS232 angeschalten werden ist unbedingt auf die Spannung achten. Möglicherweise verwendet ein USB-RS232 Adapter nicht die 12V sonder nur 5V.&lt;br /&gt;
&lt;br /&gt;
== Open Issues ==&lt;br /&gt;
* Es muss noch überprüft werden ob die NIBObee Hardware ausreichend leistungsfähig ist oder ein Upgrade gemacht werden muss.&lt;br /&gt;
* Wie kann das verlassen der Spur von dem Überfahren einer Kreuzung unterschieden werden? Wenn es hier zu Problemen kommt könnten zwei zusätzliche lichtempfindliche Sensoren rechts und links oder noch ein Element mit drei zusätzlichen Sensoren auf Höhe der Achsen angebracht werden -&amp;gt; Mehraufwand!&lt;br /&gt;
* Soll Aktivierung der BT-Schnittstelle manuell erfolgen?&lt;br /&gt;
* Soll der Betriebsmodus gewählt werden können?&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* [http://www.nicai-systems.de/nibobee.html NIBObee Homepage bei Nicai Systems]&lt;br /&gt;
* [http://download.nicai-systems.com/nibo/Tutorial_NIBObee_20091123.pdf NIBObee - Tutorial zur Programmierung]&lt;br /&gt;
* [http://www.nicai-systems.com/de/zubehoer/nibobee-tuning-kit.html NIBObee - Tuning-Kit von Nicai-Systems]&lt;br /&gt;
* [http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/Der_UART Tutorial zur USART Programmierung]&lt;br /&gt;
[[Kategorie:FH]]&lt;/div&gt;</summary>
		<author><name>Alois</name></author>
	</entry>
	<entry>
		<id>https://wiki.callooh.com/index.php?title=NIBObee&amp;diff=853</id>
		<title>NIBObee</title>
		<link rel="alternate" type="text/html" href="https://wiki.callooh.com/index.php?title=NIBObee&amp;diff=853"/>
		<updated>2011-05-02T09:19:06Z</updated>

		<summary type="html">&lt;p&gt;Alois: /* Applikationen */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;NIBObee ist der Roboter der im Projekt [[RoLoMa]] verwendet wird.&lt;br /&gt;
== Technische Daten ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Art&lt;br /&gt;
!Typ&lt;br /&gt;
!Bemerkung&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|Mikrocontroller&lt;br /&gt;
|ATMEL ATMega16, , 15 MHz&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|Integrierter UART wird verwendet um den Bluetooth Modul anzubinden.&lt;br /&gt;
&lt;br /&gt;
Sollte die Leistung nicht ausreichen kann entweder der Erweiterungssatz von Nicai-Systems verwendet werden oder nur der Controller wird gegen einen Pinkompatiblen Typ ausgetauscht (z.B. ATMega32, ATMega644, ATMega1284)&lt;br /&gt;
|-&lt;br /&gt;
|Flash:	16	kB&lt;br /&gt;
|-&lt;br /&gt;
|...&lt;br /&gt;
|-&lt;br /&gt;
|...&lt;br /&gt;
|...&lt;br /&gt;
|...&lt;br /&gt;
|-&lt;br /&gt;
|...&lt;br /&gt;
|...&lt;br /&gt;
|...&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|Maße&lt;br /&gt;
|Radumfang: 11,8 cm&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|Diese Maße sind wichtig um den NIBObee so exakt wie möglich am Mittelpunkt des Labyrinthfeldes positionieren zu können.&lt;br /&gt;
|-&lt;br /&gt;
|Abstand Liniensensor zu Radachse: 10,4 cm&lt;br /&gt;
|-&lt;br /&gt;
|Impulse pro Umdrehung: 20&lt;br /&gt;
|}&lt;br /&gt;
=== Ports ===&lt;br /&gt;
Über den UART wird der Bluetooth Modul [[BTM-222]] angebunden. Am NIObee ist diese Schnittstelle am Port X5 verfügbar&lt;br /&gt;
&lt;br /&gt;
=== Resourcen ===&lt;br /&gt;
Folgende Resourcen werden für unsere Implementierung verwendet (&#039;&#039;kursiv&#039;&#039; markierte Resourcen werden bereits durch die Bibliothek belegt):&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Resource&lt;br /&gt;
!Verwendung&lt;br /&gt;
!Interrupts&lt;br /&gt;
!Dateien&lt;br /&gt;
|-&lt;br /&gt;
|Timer 1&lt;br /&gt;
|Motor PWM&lt;br /&gt;
|TIMER1_COMPA_vect, TIMER1_COMPB_vect&lt;br /&gt;
|motpwm.c&lt;br /&gt;
|-&lt;br /&gt;
|ADC&lt;br /&gt;
|Analog, Line&lt;br /&gt;
|ADC_vect&lt;br /&gt;
|analog.c, line.c&lt;br /&gt;
|-&lt;br /&gt;
|EEPROM&lt;br /&gt;
|Line (12 Byte)&lt;br /&gt;
|&lt;br /&gt;
|line.c&lt;br /&gt;
|-&lt;br /&gt;
|Ext. IRQ&lt;br /&gt;
|Odometrie&lt;br /&gt;
|INT0_vect, INT1_vect&lt;br /&gt;
|odometry.c&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Eine für den NIBObee allgemein gültige Auflistung findet man im [http://www.nibo-roboter.de/wiki/NIBObee/Lib/Resourcen NIBObee Wiki].&lt;br /&gt;
&lt;br /&gt;
=== Besondere Erkenntnisse ===&lt;br /&gt;
Es hat sich, nach einigen Fehlschlägen bei der Linienverfolung, herausgestellt dass es ungünstig ist den NIBObee in eine optisch ansprechende waagrechte Position zu bringen indem eine kleinere Halbkugel auf der Unterseite angebracht wird. Der Grund: Nur mit der original Halbkugel und dem damit nach vorne ansteigenden Bodenabstand sind die IR-LED&#039;s weit genug vom Boden entfernt um einen Lichtkegen zu erzeugen der auch vernünftig vom Phototransistor erfasst werden kann. Bei waagrechter Ausrichtung des NIBObee ist dieser Kegel, aufgrund des geringeren Abstands zum Boden, zu klein!&lt;br /&gt;
&lt;br /&gt;
=== Bibliotheksfunktionen ===&lt;br /&gt;
==== Liniensensoren ====&lt;br /&gt;
 line.h&lt;br /&gt;
Die Werte der Liniensensoren können mit der Funktion&lt;br /&gt;
&amp;lt;code&amp;gt;line_get(index)&amp;lt;/code&amp;gt;&lt;br /&gt;
gelesen werden. Die Werte selbst werden über einen A/D-Wandler ermittelt und zwischengespeichert. Es gibt 11 analoge Werte die zyklisch digitalisiert werden. Dieser Vorgang wird mit einer Frequenz von 120 kHz durchgeführt, d.h. dass jeder dieser Werte ca. alle 94 µs aktualisiert wird.&lt;br /&gt;
&lt;br /&gt;
==== Motorensteuerung ====&lt;br /&gt;
 motpwm.h&lt;br /&gt;
Die Motoren des NIBObee werden mit PWM ([http://de.wikipedia.org/wiki/Pulsweitenmodulation Pulsweitenmodulation]) angesteuert. Das garantiert natürlich ohne Regelung noch keinen gleichlauf der beiden Motoren was sich je nach Zustand des Getriebes in einer weiteren oder engernen Kurve zeigt.&lt;br /&gt;
 motpid.h&lt;br /&gt;
Hier stehen Funktionen zur Verfügung die mit Hilfe der Odometrie die Motoren regeln. Diese Funktionen sind für unsere Zwecke allerdings nicht geeignet.&lt;br /&gt;
&lt;br /&gt;
== Aufgaben ==&lt;br /&gt;
Folgende Aufgaben sind im Rahmen des Projekts [[RoLoMa]] vom NIBObee Team zu lösen:&lt;br /&gt;
* Herstellung der Bluetooth Hardware-Erweiterung&lt;br /&gt;
* Softwaremodul zum Bedienen der Bluetooth-Schnittstelle via RS232&lt;br /&gt;
* Softwaremodul zum Erkennen der Linie im Labyrinth und im speziellen der unterschiedlichen Kreuzungstypen&lt;br /&gt;
* Messen des zurückgelegten Weges&lt;br /&gt;
* Steuerung, die den Abstand des Sensors zur Radachse berücksichtigt um den Roboter an der korrekten Stelle um die eigene Achse zu drehen&lt;br /&gt;
* Erstellen eines Abbilds des Labyrinths im Speicher und navigieren bis der Roboter wieder am Startpunkt gelandet ist (z.B. immer Links abbiegen)&lt;br /&gt;
* Implementieren des [[MaDeCo]] Protokolls&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
&lt;br /&gt;
=== Bluetooth ===&lt;br /&gt;
Der Bluetooth Modul ist im Detail auf den Seiten des [[BTM-222]] beschrieben.&lt;br /&gt;
&lt;br /&gt;
=== Liniensensoren ===&lt;br /&gt;
Zum Erkennen der Kreuzungen bei gleichzeitigem folgen der Linie war es notwendig zusätzliche Liniensensoren zu verwenden. Diese wurden mit einer Zusätzplatine in einer Reihe mit den bereits vorhandenen Liniensensoren, allerdings so weit wie möglich linke und rechts außen, montiert. Das einlesen der Analogwerte erfolgt über die beiden Analogeingänge am Stecker X1. Die IR-LEDs sind, analog zu den bestehenden IR-LEDs der vorhandenen Liniensensoren, über den Ausgang 1 am Stecker X4 schaltbar. Dies ist notwendig da jeweils eine Messung mit eingschalteter LED und eine mit ausgeschalteter LED durchgeführt wird. Damit wird der Einfluß des Umgebungslichts korrigiert.&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
Die Aufgaben der Software sollen in möglichst unabhängigen Modulen realisiert werden um das Testen einfacher zu gestalten. Die einzelnen Module sind im Folgenden beschrieben.&lt;br /&gt;
&lt;br /&gt;
=== Architektur ===&lt;br /&gt;
Das Gesamtsystem besteht aus einem zentralen Taktgeber, einem Scheduler und mehreren State Maschinen. Die Kommunikation erfolgt ausschließlich über Events. Die Module können mittels Subscribe einen Event, den ein anderer Modul zur Verfügung steht, abonnieren.&lt;br /&gt;
&lt;br /&gt;
==== Systemtakt, Scheduler ====&lt;br /&gt;
Im Main Modul befindet sich der zentrale Taktgeber der aus dem Interrupt des Timer 2 einen gleichmäßigen Takt von 100Hz erzeugt. Dieser Takt kann von anderen Modulen verwendet werden um zyklische Aufgaben zu erfüllen (z.B. lesen der Liniensensoren). Im Main Modul befindet sich auch der Scheduler der ganz einfach in der Endlosschleife sequenziell jeden Modul aufruft um anstehende Events zu bearbeiten.&lt;br /&gt;
&lt;br /&gt;
==== State / Event Maschinen ====&lt;br /&gt;
Die State / Event Maschinen sind in allen Modulen gleich aufgebaut. Es gibt die folgenden Funktionen (wobei statt &amp;quot;&amp;lt;xx&amp;gt;&amp;quot; das Kürzel des Moduls steht, z.B &amp;quot;dr&amp;quot; für Drive):&lt;br /&gt;
; eine Funktion mit dem Namen &amp;lt;xx&amp;gt;_main (intern)&lt;br /&gt;
: Das ist die eigentliche State Maschine. Wird nicht direkt vom Scheduler aufgerufen sondern über die Funktion &amp;lt;xx&amp;gt;_eventHandler. Hier gibt es ein switch Statement über den aktuellen Zustand und für jeden Zustand ein switch Statement über den empfangenen Event.&lt;br /&gt;
; eine Funktion mit dem Namen &amp;lt;xx&amp;gt;_init (extern)&lt;br /&gt;
: Hier werden Variableninitialisierungen gemacht und die ersten subscribe Aufrufe um Events zu abonnieren. Diese Funktion wird beim Systemstart vom Main Modul aufgerufen.&lt;br /&gt;
; eine Funktion mit dem Namen &amp;lt;xx&amp;gt;_eventHandler (extern)&lt;br /&gt;
: Ist die Funktion die vom Scheduler aufgerufen wird damit die Statemaschine mit dem aktuellen Event, sofern vorhanden, durchlaufen wird.&lt;br /&gt;
; optional Funktionen mit den Namen &amp;lt;xx&amp;gt;_subscribe_&amp;lt;event&amp;gt; und &amp;lt;xx&amp;gt;_unsubscribe_&amp;lt;event&amp;gt; (extern)&lt;br /&gt;
: für jeden Event den dieser Modul verschicken kann ist sowohl eine Subscribe Funktion als auch ein Unsubscribe Funktion vorhanden. Mit diesen Funktionen kann der Event von einem anderen Modul abboniert werden.&lt;br /&gt;
; eine Funktion mit dem Namen &amp;lt;xx&amp;gt;_receiveEvent (intern)&lt;br /&gt;
: ReceiveEvent ist eigentlich eine interne Funktion (wird also nicht im Header File deklariert), der Pointer auf diese Funktion wird allerdings als Callback beim Subscribe übergeben damit der Event dem Modul zugestellt werden kann.&lt;br /&gt;
&lt;br /&gt;
=== Module ===&lt;br /&gt;
Im folgenden sind alle Module und deren Hauptfunktionen aufgelistet.&lt;br /&gt;
&lt;br /&gt;
==== Analog ====&lt;br /&gt;
 analog.c&lt;br /&gt;
 analog.h&lt;br /&gt;
Dieser Modul ist abgeleitet von den gleichnamigen Dateien der original NIBObee Bibliothek. Dies war notwendig da wir zusätzliche Liniensensoren verwenden und deren Ansteuerung in gleicher Weise erfolgen sollte. Das bedeutet dass für die entsprechenden Analogeingänge Messungen mit ein- und ausgeschalteten IR-LEDs durchgeführt werden müssen. Außerdem wurde, entsprechend dem Datenblatt des ATMega16 die Behandlung der Messung der Batteriespannung verbessert. Da hier die referenzspannung umgeschalten wird muss eine Messung verworfen werden bevor mit einem richtigen Ergebnis gerechnet werden kann. Das wurde in der Originalbibliothek nicht berücksichtigt.&lt;br /&gt;
&lt;br /&gt;
=== Applikationen ===&lt;br /&gt;
==== Labyrinth erkunden ====&lt;br /&gt;
&lt;br /&gt;
==== Kürzesten Weg durch Labyrinth ====&lt;br /&gt;
&lt;br /&gt;
==== Kalibrierung ====&lt;br /&gt;
Zur Kalibrierung fährt der NIBObee ein Viereck entlang dass genau die Seitenlänge eines der Felder des Labyrinths hat. Dies ist notwendig um relativ einfach die Karte des Labyrinths erstellen zu können.&lt;br /&gt;
&lt;br /&gt;
=== Protokolle und deren Implementierung ===&lt;br /&gt;
==== [[MaDeCo]] ====&lt;br /&gt;
===== Interface Definition =====&lt;br /&gt;
* int set_opmode(OPMODE)&lt;br /&gt;
* int send_waypoint(WAYPOINT)&lt;br /&gt;
* int direct(DIRECTION[])&lt;br /&gt;
* int ack()&lt;br /&gt;
&lt;br /&gt;
==== Schnittstelle [[MaDeCo]] - RS232-Schnittstelle ====&lt;br /&gt;
* pairing&lt;br /&gt;
* Konfigurations-Commands&lt;br /&gt;
* ack&lt;br /&gt;
* read_command&lt;br /&gt;
* send_command&lt;br /&gt;
&lt;br /&gt;
=== Steuerungssoftware ===&lt;br /&gt;
==== Bluetooth Modul einschalten ====&lt;br /&gt;
Durch Bewegen der &amp;quot;Fühler&amp;quot; der NIBObee nach oben bis Einrasten wird das Bluetooth Modul eingeschalten.&lt;br /&gt;
Daraufhin muss auf eingehenden Bluetooth Traffic gelauscht werden.&lt;br /&gt;
&lt;br /&gt;
==== Blink Codes ====&lt;br /&gt;
Bestimmte Events oder Commands lösen bestimmte Blink- oder Leuchtmuster der Status LEDs aus.&lt;br /&gt;
&#039;&#039;&#039;TODO:&#039;&#039;&#039; Spezifikation der Blink Codes&lt;br /&gt;
&lt;br /&gt;
==== Gerade fahren ====&lt;br /&gt;
Das Problem beim geradeaus fahren ist dass der Roboter von der Spur abweichen kann und dann neu ausgerichtet werden muss. Üblicherweise erfolgt das mit Hilfe der Liniensensoren indem, sobald einer der seitlichen Sensoren die Linie erkennt, durch beschleunigen oder bremsen eines Rades in diese Richtung korrigierend gelenkt wird.&lt;br /&gt;
&lt;br /&gt;
In unserem Fall müssen wir diese Korrektur solange verzögern bis der seitliche Liniensensor eine mögliche Kreuzung passiert hat. Erst danach können wir feststellen ob wir nur die schwarze Linie einer Kreuzung überfahren sind oder ob tatsächlich eine Abweichung vorliegt. Die Anzahl der zu ignorierenden Odometrie-Impule kann folgendermaßen errechnet werden:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;Impulse pro Radumdrehung&amp;gt; / &amp;lt;Radumfang&amp;gt; * &amp;lt;Linienbreite&amp;gt; =&lt;br /&gt;
 20 / 11,8 * 1 = 1,69491525&lt;br /&gt;
&lt;br /&gt;
Wir werden also nur zwei Impulse abwarten bevor wir mit der Korrektur beginnen&lt;br /&gt;
&lt;br /&gt;
===== Funktionsaufteilung =====&lt;br /&gt;
Die Zuständigkeiten für diese Aufgabe sind wie folgt:&lt;br /&gt;
;drive Modul&lt;br /&gt;
:sorgt für die Steuerung der Motoren. Reduzieren der Geschwindigkeit eines Rades um eine ausgleichende Kurve zu fahren und stoppen wenn das Ende der geraden Linie erreicht wurde. Dazu aboniert der Modul die Events des line Modul die eine Abweichung von der Linie melden und vom distance Modul den Event zum fahren der Distanz zwischen Liniensensoren und Achse der Räder.&lt;br /&gt;
;line Modul&lt;br /&gt;
:prüft zyklisch die position der Linie unter dem NIBObee und meldet Abweichungen mittels Events. Dieses Melden wird allerdings verzögert bis zumindest die Breite der Linie überfahren wurde. Dazu aboniert der Modul den Event vom distance Modul den Event zum fahren der der Breite der Linie.&lt;br /&gt;
;distance Modul&lt;br /&gt;
:meldet auf Anforderung das zurücklegen einer Strecke in der Länge der Distanz zwischen Liniensensoren und Achse der Räder oder der Breite der Linie.&lt;br /&gt;
&lt;br /&gt;
==== Kreuzung fahren ====&lt;br /&gt;
An einer Kreuzung wird abgebogen indem der NIBObee zuerst unbeirrt geradeaus fährt bis die Achse genau auf dem Mittelpunkt der Kreuzung zu stehen kommt. Danach wird eine Drehung nach rechts oder links durchgeführt bis sich die Linie wieder genau unter dem mittleren Sensor befindet.&lt;br /&gt;
&lt;br /&gt;
Die Sensoren sind von der Achse 10,4 cm entfernt, eine Radumdrehung bewegt den NIBObee um 11,8 cm weiter und bei dieser Umdrehung werden vom Odometriesensor 20 Impulse abgegeben. Die Linienbreite wird 2 cm betragen. Daher errechnet sich die Strecke die nach Erkennen der Kreuzung gefahren werden muss folgendermassen:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;Impulse pro Radumdrehung&amp;gt; / &amp;lt;Radumfang&amp;gt; * (&amp;lt;Achsabstand&amp;gt; - &amp;lt;halbe Linienbreite&amp;gt;) =&lt;br /&gt;
 20 / 11,8 * (10,4 - 0,5) = 16,779661&lt;br /&gt;
&lt;br /&gt;
Nach passieren der Kreuzung muss der NIBObee also noch 17 Impulse über den Odometriesensor empfangen bevor er stoppt.&lt;br /&gt;
&lt;br /&gt;
== Risikoanalyse ==&lt;br /&gt;
Im Folgenden wird versucht für die möglichen Risikopunkte Alternativen aufzuzeigen.&lt;br /&gt;
&lt;br /&gt;
; ATmega16 ist nicht Leisungsfägig genug&lt;br /&gt;
: Es kann auf den [http://www.nicai-systems.com/de/zubehoer/nibobee-tuning-kit.html Tuning-Kit von Nicai-Systems] zurückgerifffen werden. Dies könnte eine nicht akzeptable Verzögerung verursachen (erkennen, bestellen, NIBObee umrüsten)&lt;br /&gt;
&lt;br /&gt;
: Ein beliebiger PIN-kompatiber Microcontroller ATmega... wird statt dem ATmega16 eingesetzt. Die funktioniert soange der Ersatz-µC mit der Frequenz vom 15 MHz betrieben werden kann. Wichtig ist auch dass es adaptierte Bibliotheken gibt die auf den Ersatz-µC abgestimmt sind (z.B. andere Register oder geänderte Adressen für Register, ...)&lt;br /&gt;
&lt;br /&gt;
; Signale am UART mit Bordspannung im Gegensatz zu RS232-Level (12V)&lt;br /&gt;
: Die Signale am UART werden mit Bordspannung erzeugt/erwartet. Für die Kommunikation mit dem BT-Modul ist daher keine Anpassung durchzuführen.&lt;br /&gt;
&lt;br /&gt;
: Soll zu Testzwecken ein PC über RS232 angeschalten werden ist unbedingt auf die Spannung achten. Möglicherweise verwendet ein USB-RS232 Adapter nicht die 12V sonder nur 5V.&lt;br /&gt;
&lt;br /&gt;
== Open Issues ==&lt;br /&gt;
* Es muss noch überprüft werden ob die NIBObee Hardware ausreichend leistungsfähig ist oder ein Upgrade gemacht werden muss.&lt;br /&gt;
* Wie kann das verlassen der Spur von dem Überfahren einer Kreuzung unterschieden werden? Wenn es hier zu Problemen kommt könnten zwei zusätzliche lichtempfindliche Sensoren rechts und links oder noch ein Element mit drei zusätzlichen Sensoren auf Höhe der Achsen angebracht werden -&amp;gt; Mehraufwand!&lt;br /&gt;
* Soll Aktivierung der BT-Schnittstelle manuell erfolgen?&lt;br /&gt;
* Soll der Betriebsmodus gewählt werden können?&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* [http://www.nicai-systems.de/nibobee.html NIBObee Homepage bei Nicai Systems]&lt;br /&gt;
* [http://download.nicai-systems.com/nibo/Tutorial_NIBObee_20091123.pdf NIBObee - Tutorial zur Programmierung]&lt;br /&gt;
* [http://www.nicai-systems.com/de/zubehoer/nibobee-tuning-kit.html NIBObee - Tuning-Kit von Nicai-Systems]&lt;br /&gt;
* [http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/Der_UART Tutorial zur USART Programmierung]&lt;br /&gt;
[[Kategorie:FH]]&lt;/div&gt;</summary>
		<author><name>Alois</name></author>
	</entry>
	<entry>
		<id>https://wiki.callooh.com/index.php?title=NIBObee&amp;diff=852</id>
		<title>NIBObee</title>
		<link rel="alternate" type="text/html" href="https://wiki.callooh.com/index.php?title=NIBObee&amp;diff=852"/>
		<updated>2011-05-02T08:58:40Z</updated>

		<summary type="html">&lt;p&gt;Alois: /* Aufgaben */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;NIBObee ist der Roboter der im Projekt [[RoLoMa]] verwendet wird.&lt;br /&gt;
== Technische Daten ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Art&lt;br /&gt;
!Typ&lt;br /&gt;
!Bemerkung&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|Mikrocontroller&lt;br /&gt;
|ATMEL ATMega16, , 15 MHz&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|Integrierter UART wird verwendet um den Bluetooth Modul anzubinden.&lt;br /&gt;
&lt;br /&gt;
Sollte die Leistung nicht ausreichen kann entweder der Erweiterungssatz von Nicai-Systems verwendet werden oder nur der Controller wird gegen einen Pinkompatiblen Typ ausgetauscht (z.B. ATMega32, ATMega644, ATMega1284)&lt;br /&gt;
|-&lt;br /&gt;
|Flash:	16	kB&lt;br /&gt;
|-&lt;br /&gt;
|...&lt;br /&gt;
|-&lt;br /&gt;
|...&lt;br /&gt;
|...&lt;br /&gt;
|...&lt;br /&gt;
|-&lt;br /&gt;
|...&lt;br /&gt;
|...&lt;br /&gt;
|...&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|Maße&lt;br /&gt;
|Radumfang: 11,8 cm&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|Diese Maße sind wichtig um den NIBObee so exakt wie möglich am Mittelpunkt des Labyrinthfeldes positionieren zu können.&lt;br /&gt;
|-&lt;br /&gt;
|Abstand Liniensensor zu Radachse: 10,4 cm&lt;br /&gt;
|-&lt;br /&gt;
|Impulse pro Umdrehung: 20&lt;br /&gt;
|}&lt;br /&gt;
=== Ports ===&lt;br /&gt;
Über den UART wird der Bluetooth Modul [[BTM-222]] angebunden. Am NIObee ist diese Schnittstelle am Port X5 verfügbar&lt;br /&gt;
&lt;br /&gt;
=== Resourcen ===&lt;br /&gt;
Folgende Resourcen werden für unsere Implementierung verwendet (&#039;&#039;kursiv&#039;&#039; markierte Resourcen werden bereits durch die Bibliothek belegt):&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Resource&lt;br /&gt;
!Verwendung&lt;br /&gt;
!Interrupts&lt;br /&gt;
!Dateien&lt;br /&gt;
|-&lt;br /&gt;
|Timer 1&lt;br /&gt;
|Motor PWM&lt;br /&gt;
|TIMER1_COMPA_vect, TIMER1_COMPB_vect&lt;br /&gt;
|motpwm.c&lt;br /&gt;
|-&lt;br /&gt;
|ADC&lt;br /&gt;
|Analog, Line&lt;br /&gt;
|ADC_vect&lt;br /&gt;
|analog.c, line.c&lt;br /&gt;
|-&lt;br /&gt;
|EEPROM&lt;br /&gt;
|Line (12 Byte)&lt;br /&gt;
|&lt;br /&gt;
|line.c&lt;br /&gt;
|-&lt;br /&gt;
|Ext. IRQ&lt;br /&gt;
|Odometrie&lt;br /&gt;
|INT0_vect, INT1_vect&lt;br /&gt;
|odometry.c&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Eine für den NIBObee allgemein gültige Auflistung findet man im [http://www.nibo-roboter.de/wiki/NIBObee/Lib/Resourcen NIBObee Wiki].&lt;br /&gt;
&lt;br /&gt;
=== Besondere Erkenntnisse ===&lt;br /&gt;
Es hat sich, nach einigen Fehlschlägen bei der Linienverfolung, herausgestellt dass es ungünstig ist den NIBObee in eine optisch ansprechende waagrechte Position zu bringen indem eine kleinere Halbkugel auf der Unterseite angebracht wird. Der Grund: Nur mit der original Halbkugel und dem damit nach vorne ansteigenden Bodenabstand sind die IR-LED&#039;s weit genug vom Boden entfernt um einen Lichtkegen zu erzeugen der auch vernünftig vom Phototransistor erfasst werden kann. Bei waagrechter Ausrichtung des NIBObee ist dieser Kegel, aufgrund des geringeren Abstands zum Boden, zu klein!&lt;br /&gt;
&lt;br /&gt;
=== Bibliotheksfunktionen ===&lt;br /&gt;
==== Liniensensoren ====&lt;br /&gt;
 line.h&lt;br /&gt;
Die Werte der Liniensensoren können mit der Funktion&lt;br /&gt;
&amp;lt;code&amp;gt;line_get(index)&amp;lt;/code&amp;gt;&lt;br /&gt;
gelesen werden. Die Werte selbst werden über einen A/D-Wandler ermittelt und zwischengespeichert. Es gibt 11 analoge Werte die zyklisch digitalisiert werden. Dieser Vorgang wird mit einer Frequenz von 120 kHz durchgeführt, d.h. dass jeder dieser Werte ca. alle 94 µs aktualisiert wird.&lt;br /&gt;
&lt;br /&gt;
==== Motorensteuerung ====&lt;br /&gt;
 motpwm.h&lt;br /&gt;
Die Motoren des NIBObee werden mit PWM ([http://de.wikipedia.org/wiki/Pulsweitenmodulation Pulsweitenmodulation]) angesteuert. Das garantiert natürlich ohne Regelung noch keinen gleichlauf der beiden Motoren was sich je nach Zustand des Getriebes in einer weiteren oder engernen Kurve zeigt.&lt;br /&gt;
 motpid.h&lt;br /&gt;
Hier stehen Funktionen zur Verfügung die mit Hilfe der Odometrie die Motoren regeln. Diese Funktionen sind für unsere Zwecke allerdings nicht geeignet.&lt;br /&gt;
&lt;br /&gt;
== Aufgaben ==&lt;br /&gt;
Folgende Aufgaben sind im Rahmen des Projekts [[RoLoMa]] vom NIBObee Team zu lösen:&lt;br /&gt;
* Herstellung der Bluetooth Hardware-Erweiterung&lt;br /&gt;
* Softwaremodul zum Bedienen der Bluetooth-Schnittstelle via RS232&lt;br /&gt;
* Softwaremodul zum Erkennen der Linie im Labyrinth und im speziellen der unterschiedlichen Kreuzungstypen&lt;br /&gt;
* Messen des zurückgelegten Weges&lt;br /&gt;
* Steuerung, die den Abstand des Sensors zur Radachse berücksichtigt um den Roboter an der korrekten Stelle um die eigene Achse zu drehen&lt;br /&gt;
* Erstellen eines Abbilds des Labyrinths im Speicher und navigieren bis der Roboter wieder am Startpunkt gelandet ist (z.B. immer Links abbiegen)&lt;br /&gt;
* Implementieren des [[MaDeCo]] Protokolls&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
&lt;br /&gt;
=== Bluetooth ===&lt;br /&gt;
Der Bluetooth Modul ist im Detail auf den Seiten des [[BTM-222]] beschrieben.&lt;br /&gt;
&lt;br /&gt;
=== Liniensensoren ===&lt;br /&gt;
Zum Erkennen der Kreuzungen bei gleichzeitigem folgen der Linie war es notwendig zusätzliche Liniensensoren zu verwenden. Diese wurden mit einer Zusätzplatine in einer Reihe mit den bereits vorhandenen Liniensensoren, allerdings so weit wie möglich linke und rechts außen, montiert. Das einlesen der Analogwerte erfolgt über die beiden Analogeingänge am Stecker X1. Die IR-LEDs sind, analog zu den bestehenden IR-LEDs der vorhandenen Liniensensoren, über den Ausgang 1 am Stecker X4 schaltbar. Dies ist notwendig da jeweils eine Messung mit eingschalteter LED und eine mit ausgeschalteter LED durchgeführt wird. Damit wird der Einfluß des Umgebungslichts korrigiert.&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
Die Aufgaben der Software sollen in möglichst unabhängigen Modulen realisiert werden um das Testen einfacher zu gestalten. Die einzelnen Module sind im Folgenden beschrieben.&lt;br /&gt;
&lt;br /&gt;
=== Architektur ===&lt;br /&gt;
Das Gesamtsystem besteht aus einem zentralen Taktgeber, einem Scheduler und mehreren State Maschinen. Die Kommunikation erfolgt ausschließlich über Events. Die Module können mittels Subscribe einen Event, den ein anderer Modul zur Verfügung steht, abonnieren.&lt;br /&gt;
&lt;br /&gt;
==== Systemtakt, Scheduler ====&lt;br /&gt;
Im Main Modul befindet sich der zentrale Taktgeber der aus dem Interrupt des Timer 2 einen gleichmäßigen Takt von 100Hz erzeugt. Dieser Takt kann von anderen Modulen verwendet werden um zyklische Aufgaben zu erfüllen (z.B. lesen der Liniensensoren). Im Main Modul befindet sich auch der Scheduler der ganz einfach in der Endlosschleife sequenziell jeden Modul aufruft um anstehende Events zu bearbeiten.&lt;br /&gt;
&lt;br /&gt;
==== State / Event Maschinen ====&lt;br /&gt;
Die State / Event Maschinen sind in allen Modulen gleich aufgebaut. Es gibt die folgenden Funktionen (wobei statt &amp;quot;&amp;lt;xx&amp;gt;&amp;quot; das Kürzel des Moduls steht, z.B &amp;quot;dr&amp;quot; für Drive):&lt;br /&gt;
; eine Funktion mit dem Namen &amp;lt;xx&amp;gt;_main (intern)&lt;br /&gt;
: Das ist die eigentliche State Maschine. Wird nicht direkt vom Scheduler aufgerufen sondern über die Funktion &amp;lt;xx&amp;gt;_eventHandler. Hier gibt es ein switch Statement über den aktuellen Zustand und für jeden Zustand ein switch Statement über den empfangenen Event.&lt;br /&gt;
; eine Funktion mit dem Namen &amp;lt;xx&amp;gt;_init (extern)&lt;br /&gt;
: Hier werden Variableninitialisierungen gemacht und die ersten subscribe Aufrufe um Events zu abonnieren. Diese Funktion wird beim Systemstart vom Main Modul aufgerufen.&lt;br /&gt;
; eine Funktion mit dem Namen &amp;lt;xx&amp;gt;_eventHandler (extern)&lt;br /&gt;
: Ist die Funktion die vom Scheduler aufgerufen wird damit die Statemaschine mit dem aktuellen Event, sofern vorhanden, durchlaufen wird.&lt;br /&gt;
; optional Funktionen mit den Namen &amp;lt;xx&amp;gt;_subscribe_&amp;lt;event&amp;gt; und &amp;lt;xx&amp;gt;_unsubscribe_&amp;lt;event&amp;gt; (extern)&lt;br /&gt;
: für jeden Event den dieser Modul verschicken kann ist sowohl eine Subscribe Funktion als auch ein Unsubscribe Funktion vorhanden. Mit diesen Funktionen kann der Event von einem anderen Modul abboniert werden.&lt;br /&gt;
; eine Funktion mit dem Namen &amp;lt;xx&amp;gt;_receiveEvent (intern)&lt;br /&gt;
: ReceiveEvent ist eigentlich eine interne Funktion (wird also nicht im Header File deklariert), der Pointer auf diese Funktion wird allerdings als Callback beim Subscribe übergeben damit der Event dem Modul zugestellt werden kann.&lt;br /&gt;
&lt;br /&gt;
=== Applikationen ===&lt;br /&gt;
==== Labyrinth erkunden ====&lt;br /&gt;
&lt;br /&gt;
==== Kürzesten Weg durch Labyrinth ====&lt;br /&gt;
&lt;br /&gt;
==== Kalibrierung ====&lt;br /&gt;
Zur Kalibrierung fährt der NIBObee ein Viereck entlang dass genau die Seitenlänge eines der Felder des Labyrinths hat. Dies ist notwendig um relativ einfach die Karte des Labyrinths erstellen zu können.&lt;br /&gt;
&lt;br /&gt;
=== Protokolle und deren Implementierung ===&lt;br /&gt;
==== [[MaDeCo]] ====&lt;br /&gt;
===== Interface Definition =====&lt;br /&gt;
* int set_opmode(OPMODE)&lt;br /&gt;
* int send_waypoint(WAYPOINT)&lt;br /&gt;
* int direct(DIRECTION[])&lt;br /&gt;
* int ack()&lt;br /&gt;
&lt;br /&gt;
==== Schnittstelle [[MaDeCo]] - RS232-Schnittstelle ====&lt;br /&gt;
* pairing&lt;br /&gt;
* Konfigurations-Commands&lt;br /&gt;
* ack&lt;br /&gt;
* read_command&lt;br /&gt;
* send_command&lt;br /&gt;
&lt;br /&gt;
=== Steuerungssoftware ===&lt;br /&gt;
==== Bluetooth Modul einschalten ====&lt;br /&gt;
Durch Bewegen der &amp;quot;Fühler&amp;quot; der NIBObee nach oben bis Einrasten wird das Bluetooth Modul eingeschalten.&lt;br /&gt;
Daraufhin muss auf eingehenden Bluetooth Traffic gelauscht werden.&lt;br /&gt;
&lt;br /&gt;
==== Blink Codes ====&lt;br /&gt;
Bestimmte Events oder Commands lösen bestimmte Blink- oder Leuchtmuster der Status LEDs aus.&lt;br /&gt;
&#039;&#039;&#039;TODO:&#039;&#039;&#039; Spezifikation der Blink Codes&lt;br /&gt;
&lt;br /&gt;
==== Gerade fahren ====&lt;br /&gt;
Das Problem beim geradeaus fahren ist dass der Roboter von der Spur abweichen kann und dann neu ausgerichtet werden muss. Üblicherweise erfolgt das mit Hilfe der Liniensensoren indem, sobald einer der seitlichen Sensoren die Linie erkennt, durch beschleunigen oder bremsen eines Rades in diese Richtung korrigierend gelenkt wird.&lt;br /&gt;
&lt;br /&gt;
In unserem Fall müssen wir diese Korrektur solange verzögern bis der seitliche Liniensensor eine mögliche Kreuzung passiert hat. Erst danach können wir feststellen ob wir nur die schwarze Linie einer Kreuzung überfahren sind oder ob tatsächlich eine Abweichung vorliegt. Die Anzahl der zu ignorierenden Odometrie-Impule kann folgendermaßen errechnet werden:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;Impulse pro Radumdrehung&amp;gt; / &amp;lt;Radumfang&amp;gt; * &amp;lt;Linienbreite&amp;gt; =&lt;br /&gt;
 20 / 11,8 * 1 = 1,69491525&lt;br /&gt;
&lt;br /&gt;
Wir werden also nur zwei Impulse abwarten bevor wir mit der Korrektur beginnen&lt;br /&gt;
&lt;br /&gt;
===== Funktionsaufteilung =====&lt;br /&gt;
Die Zuständigkeiten für diese Aufgabe sind wie folgt:&lt;br /&gt;
;drive Modul&lt;br /&gt;
:sorgt für die Steuerung der Motoren. Reduzieren der Geschwindigkeit eines Rades um eine ausgleichende Kurve zu fahren und stoppen wenn das Ende der geraden Linie erreicht wurde. Dazu aboniert der Modul die Events des line Modul die eine Abweichung von der Linie melden und vom distance Modul den Event zum fahren der Distanz zwischen Liniensensoren und Achse der Räder.&lt;br /&gt;
;line Modul&lt;br /&gt;
:prüft zyklisch die position der Linie unter dem NIBObee und meldet Abweichungen mittels Events. Dieses Melden wird allerdings verzögert bis zumindest die Breite der Linie überfahren wurde. Dazu aboniert der Modul den Event vom distance Modul den Event zum fahren der der Breite der Linie.&lt;br /&gt;
;distance Modul&lt;br /&gt;
:meldet auf Anforderung das zurücklegen einer Strecke in der Länge der Distanz zwischen Liniensensoren und Achse der Räder oder der Breite der Linie.&lt;br /&gt;
&lt;br /&gt;
==== Kreuzung fahren ====&lt;br /&gt;
An einer Kreuzung wird abgebogen indem der NIBObee zuerst unbeirrt geradeaus fährt bis die Achse genau auf dem Mittelpunkt der Kreuzung zu stehen kommt. Danach wird eine Drehung nach rechts oder links durchgeführt bis sich die Linie wieder genau unter dem mittleren Sensor befindet.&lt;br /&gt;
&lt;br /&gt;
Die Sensoren sind von der Achse 10,4 cm entfernt, eine Radumdrehung bewegt den NIBObee um 11,8 cm weiter und bei dieser Umdrehung werden vom Odometriesensor 20 Impulse abgegeben. Die Linienbreite wird 2 cm betragen. Daher errechnet sich die Strecke die nach Erkennen der Kreuzung gefahren werden muss folgendermassen:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;Impulse pro Radumdrehung&amp;gt; / &amp;lt;Radumfang&amp;gt; * (&amp;lt;Achsabstand&amp;gt; - &amp;lt;halbe Linienbreite&amp;gt;) =&lt;br /&gt;
 20 / 11,8 * (10,4 - 0,5) = 16,779661&lt;br /&gt;
&lt;br /&gt;
Nach passieren der Kreuzung muss der NIBObee also noch 17 Impulse über den Odometriesensor empfangen bevor er stoppt.&lt;br /&gt;
&lt;br /&gt;
== Risikoanalyse ==&lt;br /&gt;
Im Folgenden wird versucht für die möglichen Risikopunkte Alternativen aufzuzeigen.&lt;br /&gt;
&lt;br /&gt;
; ATmega16 ist nicht Leisungsfägig genug&lt;br /&gt;
: Es kann auf den [http://www.nicai-systems.com/de/zubehoer/nibobee-tuning-kit.html Tuning-Kit von Nicai-Systems] zurückgerifffen werden. Dies könnte eine nicht akzeptable Verzögerung verursachen (erkennen, bestellen, NIBObee umrüsten)&lt;br /&gt;
&lt;br /&gt;
: Ein beliebiger PIN-kompatiber Microcontroller ATmega... wird statt dem ATmega16 eingesetzt. Die funktioniert soange der Ersatz-µC mit der Frequenz vom 15 MHz betrieben werden kann. Wichtig ist auch dass es adaptierte Bibliotheken gibt die auf den Ersatz-µC abgestimmt sind (z.B. andere Register oder geänderte Adressen für Register, ...)&lt;br /&gt;
&lt;br /&gt;
; Signale am UART mit Bordspannung im Gegensatz zu RS232-Level (12V)&lt;br /&gt;
: Die Signale am UART werden mit Bordspannung erzeugt/erwartet. Für die Kommunikation mit dem BT-Modul ist daher keine Anpassung durchzuführen.&lt;br /&gt;
&lt;br /&gt;
: Soll zu Testzwecken ein PC über RS232 angeschalten werden ist unbedingt auf die Spannung achten. Möglicherweise verwendet ein USB-RS232 Adapter nicht die 12V sonder nur 5V.&lt;br /&gt;
&lt;br /&gt;
== Open Issues ==&lt;br /&gt;
* Es muss noch überprüft werden ob die NIBObee Hardware ausreichend leistungsfähig ist oder ein Upgrade gemacht werden muss.&lt;br /&gt;
* Wie kann das verlassen der Spur von dem Überfahren einer Kreuzung unterschieden werden? Wenn es hier zu Problemen kommt könnten zwei zusätzliche lichtempfindliche Sensoren rechts und links oder noch ein Element mit drei zusätzlichen Sensoren auf Höhe der Achsen angebracht werden -&amp;gt; Mehraufwand!&lt;br /&gt;
* Soll Aktivierung der BT-Schnittstelle manuell erfolgen?&lt;br /&gt;
* Soll der Betriebsmodus gewählt werden können?&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* [http://www.nicai-systems.de/nibobee.html NIBObee Homepage bei Nicai Systems]&lt;br /&gt;
* [http://download.nicai-systems.com/nibo/Tutorial_NIBObee_20091123.pdf NIBObee - Tutorial zur Programmierung]&lt;br /&gt;
* [http://www.nicai-systems.com/de/zubehoer/nibobee-tuning-kit.html NIBObee - Tuning-Kit von Nicai-Systems]&lt;br /&gt;
* [http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/Der_UART Tutorial zur USART Programmierung]&lt;br /&gt;
[[Kategorie:FH]]&lt;/div&gt;</summary>
		<author><name>Alois</name></author>
	</entry>
	<entry>
		<id>https://wiki.callooh.com/index.php?title=NIBObee&amp;diff=851</id>
		<title>NIBObee</title>
		<link rel="alternate" type="text/html" href="https://wiki.callooh.com/index.php?title=NIBObee&amp;diff=851"/>
		<updated>2011-05-02T08:50:35Z</updated>

		<summary type="html">&lt;p&gt;Alois: /* Resourcen */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;NIBObee ist der Roboter der im Projekt [[RoLoMa]] verwendet wird.&lt;br /&gt;
== Technische Daten ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Art&lt;br /&gt;
!Typ&lt;br /&gt;
!Bemerkung&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|Mikrocontroller&lt;br /&gt;
|ATMEL ATMega16, , 15 MHz&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|Integrierter UART wird verwendet um den Bluetooth Modul anzubinden.&lt;br /&gt;
&lt;br /&gt;
Sollte die Leistung nicht ausreichen kann entweder der Erweiterungssatz von Nicai-Systems verwendet werden oder nur der Controller wird gegen einen Pinkompatiblen Typ ausgetauscht (z.B. ATMega32, ATMega644, ATMega1284)&lt;br /&gt;
|-&lt;br /&gt;
|Flash:	16	kB&lt;br /&gt;
|-&lt;br /&gt;
|...&lt;br /&gt;
|-&lt;br /&gt;
|...&lt;br /&gt;
|...&lt;br /&gt;
|...&lt;br /&gt;
|-&lt;br /&gt;
|...&lt;br /&gt;
|...&lt;br /&gt;
|...&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|Maße&lt;br /&gt;
|Radumfang: 11,8 cm&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|Diese Maße sind wichtig um den NIBObee so exakt wie möglich am Mittelpunkt des Labyrinthfeldes positionieren zu können.&lt;br /&gt;
|-&lt;br /&gt;
|Abstand Liniensensor zu Radachse: 10,4 cm&lt;br /&gt;
|-&lt;br /&gt;
|Impulse pro Umdrehung: 20&lt;br /&gt;
|}&lt;br /&gt;
=== Ports ===&lt;br /&gt;
Über den UART wird der Bluetooth Modul [[BTM-222]] angebunden. Am NIObee ist diese Schnittstelle am Port X5 verfügbar&lt;br /&gt;
&lt;br /&gt;
=== Resourcen ===&lt;br /&gt;
Folgende Resourcen werden für unsere Implementierung verwendet (&#039;&#039;kursiv&#039;&#039; markierte Resourcen werden bereits durch die Bibliothek belegt):&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Resource&lt;br /&gt;
!Verwendung&lt;br /&gt;
!Interrupts&lt;br /&gt;
!Dateien&lt;br /&gt;
|-&lt;br /&gt;
|Timer 1&lt;br /&gt;
|Motor PWM&lt;br /&gt;
|TIMER1_COMPA_vect, TIMER1_COMPB_vect&lt;br /&gt;
|motpwm.c&lt;br /&gt;
|-&lt;br /&gt;
|ADC&lt;br /&gt;
|Analog, Line&lt;br /&gt;
|ADC_vect&lt;br /&gt;
|analog.c, line.c&lt;br /&gt;
|-&lt;br /&gt;
|EEPROM&lt;br /&gt;
|Line (12 Byte)&lt;br /&gt;
|&lt;br /&gt;
|line.c&lt;br /&gt;
|-&lt;br /&gt;
|Ext. IRQ&lt;br /&gt;
|Odometrie&lt;br /&gt;
|INT0_vect, INT1_vect&lt;br /&gt;
|odometry.c&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Eine für den NIBObee allgemein gültige Auflistung findet man im [http://www.nibo-roboter.de/wiki/NIBObee/Lib/Resourcen NIBObee Wiki].&lt;br /&gt;
&lt;br /&gt;
=== Besondere Erkenntnisse ===&lt;br /&gt;
Es hat sich, nach einigen Fehlschlägen bei der Linienverfolung, herausgestellt dass es ungünstig ist den NIBObee in eine optisch ansprechende waagrechte Position zu bringen indem eine kleinere Halbkugel auf der Unterseite angebracht wird. Der Grund: Nur mit der original Halbkugel und dem damit nach vorne ansteigenden Bodenabstand sind die IR-LED&#039;s weit genug vom Boden entfernt um einen Lichtkegen zu erzeugen der auch vernünftig vom Phototransistor erfasst werden kann. Bei waagrechter Ausrichtung des NIBObee ist dieser Kegel, aufgrund des geringeren Abstands zum Boden, zu klein!&lt;br /&gt;
&lt;br /&gt;
=== Bibliotheksfunktionen ===&lt;br /&gt;
==== Liniensensoren ====&lt;br /&gt;
 line.h&lt;br /&gt;
Die Werte der Liniensensoren können mit der Funktion&lt;br /&gt;
&amp;lt;code&amp;gt;line_get(index)&amp;lt;/code&amp;gt;&lt;br /&gt;
gelesen werden. Die Werte selbst werden über einen A/D-Wandler ermittelt und zwischengespeichert. Es gibt 11 analoge Werte die zyklisch digitalisiert werden. Dieser Vorgang wird mit einer Frequenz von 120 kHz durchgeführt, d.h. dass jeder dieser Werte ca. alle 94 µs aktualisiert wird.&lt;br /&gt;
&lt;br /&gt;
==== Motorensteuerung ====&lt;br /&gt;
 motpwm.h&lt;br /&gt;
Die Motoren des NIBObee werden mit PWM ([http://de.wikipedia.org/wiki/Pulsweitenmodulation Pulsweitenmodulation]) angesteuert. Das garantiert natürlich ohne Regelung noch keinen gleichlauf der beiden Motoren was sich je nach Zustand des Getriebes in einer weiteren oder engernen Kurve zeigt.&lt;br /&gt;
 motpid.h&lt;br /&gt;
Hier stehen Funktionen zur Verfügung die mit Hilfe der Odometrie die Motoren regeln. Diese Funktionen sind für unsere Zwecke allerdings nicht geeignet.&lt;br /&gt;
&lt;br /&gt;
== Aufgaben ==&lt;br /&gt;
Folgende Aufgaben sind im Rahmen des Projekts [[RoLoMa]] vom NIBObee Team zu lösen:&lt;br /&gt;
* Herstellung der Bluetooth Hardware-Erweiterung&lt;br /&gt;
* Softwaremodul zum Bedienen der Bluetooth-Schnittstelle via RS232&lt;br /&gt;
* Softwaremodul zum Erkennen der Linie im Labyrinth und im speziellen der unterschiedlichen Kreuzungstypen&lt;br /&gt;
* Messen des zurückgelegten Weges&lt;br /&gt;
* Steuerung, die den Abstand des Sensors zur Radachse berücksichtigt um den Roboter an der korrekten Stelle um die eigene Achse zu drehen&lt;br /&gt;
* Erstellen eines Abbilds des Labyrinths im Speicher und navigieren bis der Roboter wieder am Startpunkt gelandet ist (z.B. immer Links abbiegen)&lt;br /&gt;
* Implementieren des [[MaDeCo]] Protokolls&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
Die Aufgaben der Software sollen in möglichst unabhängigen Modulen realisiert werden um das Testen einfacher zu gestalten. Die einzelnen Module sind im Folgenden beschrieben.&lt;br /&gt;
&lt;br /&gt;
=== Architektur ===&lt;br /&gt;
Das Gesamtsystem besteht aus einem zentralen Taktgeber, einem Scheduler und mehreren State Maschinen. Die Kommunikation erfolgt ausschließlich über Events. Die Module können mittels Subscribe einen Event, den ein anderer Modul zur Verfügung steht, abonnieren.&lt;br /&gt;
&lt;br /&gt;
==== Systemtakt, Scheduler ====&lt;br /&gt;
Im Main Modul befindet sich der zentrale Taktgeber der aus dem Interrupt des Timer 2 einen gleichmäßigen Takt von 100Hz erzeugt. Dieser Takt kann von anderen Modulen verwendet werden um zyklische Aufgaben zu erfüllen (z.B. lesen der Liniensensoren). Im Main Modul befindet sich auch der Scheduler der ganz einfach in der Endlosschleife sequenziell jeden Modul aufruft um anstehende Events zu bearbeiten.&lt;br /&gt;
&lt;br /&gt;
==== State / Event Maschinen ====&lt;br /&gt;
Die State / Event Maschinen sind in allen Modulen gleich aufgebaut. Es gibt die folgenden Funktionen (wobei statt &amp;quot;&amp;lt;xx&amp;gt;&amp;quot; das Kürzel des Moduls steht, z.B &amp;quot;dr&amp;quot; für Drive):&lt;br /&gt;
; eine Funktion mit dem Namen &amp;lt;xx&amp;gt;_main (intern)&lt;br /&gt;
: Das ist die eigentliche State Maschine. Wird nicht direkt vom Scheduler aufgerufen sondern über die Funktion &amp;lt;xx&amp;gt;_eventHandler. Hier gibt es ein switch Statement über den aktuellen Zustand und für jeden Zustand ein switch Statement über den empfangenen Event.&lt;br /&gt;
; eine Funktion mit dem Namen &amp;lt;xx&amp;gt;_init (extern)&lt;br /&gt;
: Hier werden Variableninitialisierungen gemacht und die ersten subscribe Aufrufe um Events zu abonnieren. Diese Funktion wird beim Systemstart vom Main Modul aufgerufen.&lt;br /&gt;
; eine Funktion mit dem Namen &amp;lt;xx&amp;gt;_eventHandler (extern)&lt;br /&gt;
: Ist die Funktion die vom Scheduler aufgerufen wird damit die Statemaschine mit dem aktuellen Event, sofern vorhanden, durchlaufen wird.&lt;br /&gt;
; optional Funktionen mit den Namen &amp;lt;xx&amp;gt;_subscribe_&amp;lt;event&amp;gt; und &amp;lt;xx&amp;gt;_unsubscribe_&amp;lt;event&amp;gt; (extern)&lt;br /&gt;
: für jeden Event den dieser Modul verschicken kann ist sowohl eine Subscribe Funktion als auch ein Unsubscribe Funktion vorhanden. Mit diesen Funktionen kann der Event von einem anderen Modul abboniert werden.&lt;br /&gt;
; eine Funktion mit dem Namen &amp;lt;xx&amp;gt;_receiveEvent (intern)&lt;br /&gt;
: ReceiveEvent ist eigentlich eine interne Funktion (wird also nicht im Header File deklariert), der Pointer auf diese Funktion wird allerdings als Callback beim Subscribe übergeben damit der Event dem Modul zugestellt werden kann.&lt;br /&gt;
&lt;br /&gt;
=== Applikationen ===&lt;br /&gt;
==== Labyrinth erkunden ====&lt;br /&gt;
&lt;br /&gt;
==== Kürzesten Weg durch Labyrinth ====&lt;br /&gt;
&lt;br /&gt;
==== Kalibrierung ====&lt;br /&gt;
Zur Kalibrierung fährt der NIBObee ein Viereck entlang dass genau die Seitenlänge eines der Felder des Labyrinths hat. Dies ist notwendig um relativ einfach die Karte des Labyrinths erstellen zu können.&lt;br /&gt;
&lt;br /&gt;
=== Protokolle und deren Implementierung ===&lt;br /&gt;
==== [[MaDeCo]] ====&lt;br /&gt;
===== Interface Definition =====&lt;br /&gt;
* int set_opmode(OPMODE)&lt;br /&gt;
* int send_waypoint(WAYPOINT)&lt;br /&gt;
* int direct(DIRECTION[])&lt;br /&gt;
* int ack()&lt;br /&gt;
&lt;br /&gt;
==== Schnittstelle [[MaDeCo]] - RS232-Schnittstelle ====&lt;br /&gt;
* pairing&lt;br /&gt;
* Konfigurations-Commands&lt;br /&gt;
* ack&lt;br /&gt;
* read_command&lt;br /&gt;
* send_command&lt;br /&gt;
&lt;br /&gt;
=== Steuerungssoftware ===&lt;br /&gt;
==== Bluetooth Modul einschalten ====&lt;br /&gt;
Durch Bewegen der &amp;quot;Fühler&amp;quot; der NIBObee nach oben bis Einrasten wird das Bluetooth Modul eingeschalten.&lt;br /&gt;
Daraufhin muss auf eingehenden Bluetooth Traffic gelauscht werden.&lt;br /&gt;
&lt;br /&gt;
==== Blink Codes ====&lt;br /&gt;
Bestimmte Events oder Commands lösen bestimmte Blink- oder Leuchtmuster der Status LEDs aus.&lt;br /&gt;
&#039;&#039;&#039;TODO:&#039;&#039;&#039; Spezifikation der Blink Codes&lt;br /&gt;
&lt;br /&gt;
==== Gerade fahren ====&lt;br /&gt;
Das Problem beim geradeaus fahren ist dass der Roboter von der Spur abweichen kann und dann neu ausgerichtet werden muss. Üblicherweise erfolgt das mit Hilfe der Liniensensoren indem, sobald einer der seitlichen Sensoren die Linie erkennt, durch beschleunigen oder bremsen eines Rades in diese Richtung korrigierend gelenkt wird.&lt;br /&gt;
&lt;br /&gt;
In unserem Fall müssen wir diese Korrektur solange verzögern bis der seitliche Liniensensor eine mögliche Kreuzung passiert hat. Erst danach können wir feststellen ob wir nur die schwarze Linie einer Kreuzung überfahren sind oder ob tatsächlich eine Abweichung vorliegt. Die Anzahl der zu ignorierenden Odometrie-Impule kann folgendermaßen errechnet werden:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;Impulse pro Radumdrehung&amp;gt; / &amp;lt;Radumfang&amp;gt; * &amp;lt;Linienbreite&amp;gt; =&lt;br /&gt;
 20 / 11,8 * 1 = 1,69491525&lt;br /&gt;
&lt;br /&gt;
Wir werden also nur zwei Impulse abwarten bevor wir mit der Korrektur beginnen&lt;br /&gt;
&lt;br /&gt;
===== Funktionsaufteilung =====&lt;br /&gt;
Die Zuständigkeiten für diese Aufgabe sind wie folgt:&lt;br /&gt;
;drive Modul&lt;br /&gt;
:sorgt für die Steuerung der Motoren. Reduzieren der Geschwindigkeit eines Rades um eine ausgleichende Kurve zu fahren und stoppen wenn das Ende der geraden Linie erreicht wurde. Dazu aboniert der Modul die Events des line Modul die eine Abweichung von der Linie melden und vom distance Modul den Event zum fahren der Distanz zwischen Liniensensoren und Achse der Räder.&lt;br /&gt;
;line Modul&lt;br /&gt;
:prüft zyklisch die position der Linie unter dem NIBObee und meldet Abweichungen mittels Events. Dieses Melden wird allerdings verzögert bis zumindest die Breite der Linie überfahren wurde. Dazu aboniert der Modul den Event vom distance Modul den Event zum fahren der der Breite der Linie.&lt;br /&gt;
;distance Modul&lt;br /&gt;
:meldet auf Anforderung das zurücklegen einer Strecke in der Länge der Distanz zwischen Liniensensoren und Achse der Räder oder der Breite der Linie.&lt;br /&gt;
&lt;br /&gt;
==== Kreuzung fahren ====&lt;br /&gt;
An einer Kreuzung wird abgebogen indem der NIBObee zuerst unbeirrt geradeaus fährt bis die Achse genau auf dem Mittelpunkt der Kreuzung zu stehen kommt. Danach wird eine Drehung nach rechts oder links durchgeführt bis sich die Linie wieder genau unter dem mittleren Sensor befindet.&lt;br /&gt;
&lt;br /&gt;
Die Sensoren sind von der Achse 10,4 cm entfernt, eine Radumdrehung bewegt den NIBObee um 11,8 cm weiter und bei dieser Umdrehung werden vom Odometriesensor 20 Impulse abgegeben. Die Linienbreite wird 2 cm betragen. Daher errechnet sich die Strecke die nach Erkennen der Kreuzung gefahren werden muss folgendermassen:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;Impulse pro Radumdrehung&amp;gt; / &amp;lt;Radumfang&amp;gt; * (&amp;lt;Achsabstand&amp;gt; - &amp;lt;halbe Linienbreite&amp;gt;) =&lt;br /&gt;
 20 / 11,8 * (10,4 - 0,5) = 16,779661&lt;br /&gt;
&lt;br /&gt;
Nach passieren der Kreuzung muss der NIBObee also noch 17 Impulse über den Odometriesensor empfangen bevor er stoppt.&lt;br /&gt;
&lt;br /&gt;
== Risikoanalyse ==&lt;br /&gt;
Im Folgenden wird versucht für die möglichen Risikopunkte Alternativen aufzuzeigen.&lt;br /&gt;
&lt;br /&gt;
; ATmega16 ist nicht Leisungsfägig genug&lt;br /&gt;
: Es kann auf den [http://www.nicai-systems.com/de/zubehoer/nibobee-tuning-kit.html Tuning-Kit von Nicai-Systems] zurückgerifffen werden. Dies könnte eine nicht akzeptable Verzögerung verursachen (erkennen, bestellen, NIBObee umrüsten)&lt;br /&gt;
&lt;br /&gt;
: Ein beliebiger PIN-kompatiber Microcontroller ATmega... wird statt dem ATmega16 eingesetzt. Die funktioniert soange der Ersatz-µC mit der Frequenz vom 15 MHz betrieben werden kann. Wichtig ist auch dass es adaptierte Bibliotheken gibt die auf den Ersatz-µC abgestimmt sind (z.B. andere Register oder geänderte Adressen für Register, ...)&lt;br /&gt;
&lt;br /&gt;
; Signale am UART mit Bordspannung im Gegensatz zu RS232-Level (12V)&lt;br /&gt;
: Die Signale am UART werden mit Bordspannung erzeugt/erwartet. Für die Kommunikation mit dem BT-Modul ist daher keine Anpassung durchzuführen.&lt;br /&gt;
&lt;br /&gt;
: Soll zu Testzwecken ein PC über RS232 angeschalten werden ist unbedingt auf die Spannung achten. Möglicherweise verwendet ein USB-RS232 Adapter nicht die 12V sonder nur 5V.&lt;br /&gt;
&lt;br /&gt;
== Open Issues ==&lt;br /&gt;
* Es muss noch überprüft werden ob die NIBObee Hardware ausreichend leistungsfähig ist oder ein Upgrade gemacht werden muss.&lt;br /&gt;
* Wie kann das verlassen der Spur von dem Überfahren einer Kreuzung unterschieden werden? Wenn es hier zu Problemen kommt könnten zwei zusätzliche lichtempfindliche Sensoren rechts und links oder noch ein Element mit drei zusätzlichen Sensoren auf Höhe der Achsen angebracht werden -&amp;gt; Mehraufwand!&lt;br /&gt;
* Soll Aktivierung der BT-Schnittstelle manuell erfolgen?&lt;br /&gt;
* Soll der Betriebsmodus gewählt werden können?&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* [http://www.nicai-systems.de/nibobee.html NIBObee Homepage bei Nicai Systems]&lt;br /&gt;
* [http://download.nicai-systems.com/nibo/Tutorial_NIBObee_20091123.pdf NIBObee - Tutorial zur Programmierung]&lt;br /&gt;
* [http://www.nicai-systems.com/de/zubehoer/nibobee-tuning-kit.html NIBObee - Tuning-Kit von Nicai-Systems]&lt;br /&gt;
* [http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/Der_UART Tutorial zur USART Programmierung]&lt;br /&gt;
[[Kategorie:FH]]&lt;/div&gt;</summary>
		<author><name>Alois</name></author>
	</entry>
	<entry>
		<id>https://wiki.callooh.com/index.php?title=RoLoMa&amp;diff=850</id>
		<title>RoLoMa</title>
		<link rel="alternate" type="text/html" href="https://wiki.callooh.com/index.php?title=RoLoMa&amp;diff=850"/>
		<updated>2011-05-02T06:36:13Z</updated>

		<summary type="html">&lt;p&gt;Alois: /* Projektfortschritt */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;RoLoMa ist der, vielleicht wenig einfallsreiche, Name des ESE-Projekts im 4. Semester. Es ist die Abkürzung für &amp;quot;Robots Lost in Maze&amp;quot;.&lt;br /&gt;
== Projektbeschreibung ==&lt;br /&gt;
=== Aufgabe ===&lt;br /&gt;
Bei diesem Projekt soll ein autonomer Roboter ein Labyrinth analysieren, alle vorhandenen Abzweigungen protokollieren und diese Daten an eine zentrale Einheit senden. Die zentrale Einheit soll einen zweiten autonomen Roboter mit diesen Daten auf dem berechneten kürzesten Weg durch das Labyrinth lotsen können. Dazu muss eine Kommunikation zwischen dem Roboter und der zentralen Einheit hergestellt werden.&lt;br /&gt;
Die oben erwähnte zentrale Einheit wird im weiteren Dokument als „Board“ bezeichnet und der autonome Roboter, aufgrund des gewählten Produkts „[[NIBObee]]“.&lt;br /&gt;
=== Details ===&lt;br /&gt;
[[File:ExampleMaze.png|thumb|120px|Beispiellabyrinth]]&lt;br /&gt;
Das Labyrinth wird eine Matrix mit vordefinierter Größe sein (z.B. 8x8) bei dem die möglichen Wege als schwarze Linie dargestellt sind. Auf dieser Linie wird sich der [[NIBObee]] bewegen. Die Aufgabe des ersten [[NIBObee]] besteht nun darin das gesamt Labyrinth abzufahren und eine Karte zu erstellen.&lt;br /&gt;
&lt;br /&gt;
Diese gesammelte Information wird dann an das Board übertragen. Dort wird das Labyrinth auf einer grafischen Ausgabe dargestellt und der Benutzer kann einen beliebigen Zielpunkt für den zweiten [[NIBObee]] festlegen. Der optimale Weg wird berechnet und der zweite [[NIBObee]] über diesen Weg an das definierte Ziel geleitet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- IMPORTANT: The following line shall be at the end of the &amp;quot;Details&amp;quot; Section to ensure that following section will start in a new line after the image! --&amp;gt;&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Aufgabenteilung ===&lt;br /&gt;
An dem Projekt sind zwei Gruppen beteiligt, eine die sich um die Roboter kümmert (Gruppe NIBObee), eine zweite die die Implementierung der zentralen Einheit (Gruppe Board) vornimmt. Gemeinsam muss die Übertragungstechnik (Hardware und Protokoll) erarbeitet werden. Die Implementierung kann dann getrennt erfolgen und am Ende des Projekts ist eine gemeinsame Testphase notwendig.&lt;br /&gt;
&lt;br /&gt;
Da noch einige Festlegungen bezüglich der verwendeten Hardware und der Übertragungstechnik ausständig sind können sich im Zuge des weiteren Projektfortschritts durchaus noch Änderungen ergeben. Für alle kritischen Elemente wird so früh wie möglich auch eine alternative Lösung als Fallback vorgesehen. Das ist notwendig für den Fall, dass sich für ein Problem keine, zumindest im Rahmen dieses Semesters, realisierbare Implementierung ergibt.&lt;br /&gt;
&lt;br /&gt;
==== Team Board ====&lt;br /&gt;
Teammitglieder dieser Gruppe sind:&lt;br /&gt;
* Michaela Escuyer&lt;br /&gt;
* Thomas Neuber&lt;br /&gt;
* Robert Pavljuk&lt;br /&gt;
==== Team NIBObee ====&lt;br /&gt;
Teammitglieder dieser Gruppe sind:&lt;br /&gt;
* Robert Peterfi&lt;br /&gt;
* Alois Pochmann&lt;br /&gt;
* Reinhard Weismann&lt;br /&gt;
&lt;br /&gt;
== Realisierung ==&lt;br /&gt;
&lt;br /&gt;
=== Plattformen / Hardware ===&lt;br /&gt;
Die Plattformen der Roboter und der Kontrolleinheit sind im Folgenden aufgelistet und stehen (wenn auch teilweise nur als Bausatz) fertig zur Verfügung. Die Hardware der Kommunikationseinrichtung wird im Zuge dieses Projekts erstellt.&lt;br /&gt;
&lt;br /&gt;
==== Roboter ====&lt;br /&gt;
Der eingesetzte Roboter ist eine [[NIBObee]] von [http://www.nicai-systems.com/de/nibobee.html Nicai-Systems]. Dieser Roboter verfügt über einen Liniensensor der es prinzipiell ermöglicht einer kontrastreichen Linie, vorzugsweise schwarze Linie auf weißem Boden, zu folgen.&lt;br /&gt;
&lt;br /&gt;
Weitere Dateils können der [[NIBObee]]-Seite entnommen werden.&lt;br /&gt;
&lt;br /&gt;
==== Kontrolleinheit ====&lt;br /&gt;
Die Zentrale Kontrolleinheit wird auf dem vom 3. Semester bekannten [[LPC2478]] realisiert.&lt;br /&gt;
&lt;br /&gt;
==== Kommunikation ====&lt;br /&gt;
Die Kommunikation der [[NIBObee]]-Roboter mit der zentralen Steuerung erfolgt über Bluetooth. Dazu wird über den auf beiden Plattformen bestehenden UART Anschluss ein Modul mit RS232-BT Umsetzung verwendet. &lt;br /&gt;
Die im Folgenden aufgelisteten Module kommen für die Umsetzung in Frage:&lt;br /&gt;
* BTM-112&lt;br /&gt;
* [[BTM-222]]&lt;br /&gt;
Die Entscheidung ist zugunsten des [[BTM-222]] gefallen. Details dazu können der [[BTM-222]]-Seite entnommen werden.&lt;br /&gt;
&lt;br /&gt;
=== Software ===&lt;br /&gt;
Details zur Software sind auf den Seiten von [[NIBObee#Software|NIBObee]] und [[LPC2478#Software|LPC2478]] zu finden.&lt;br /&gt;
&lt;br /&gt;
=== Protokolle ===&lt;br /&gt;
==== Bluetooth ====&lt;br /&gt;
Der gesamte Bluetooth Stack ist im [[BTM-222]] realsiert und muss daher im Projekt nicht betrachtet werden.&lt;br /&gt;
==== [[MaDeCo]] ====&lt;br /&gt;
Das projektspezifische Protokol zur Übertragung der Labyrinthdaten nach / bei der Erkundung und dann zu Steuerung durch das Labyrinth (&#039;&#039;&#039;Ma&#039;&#039;&#039;ze &#039;&#039;&#039;De&#039;&#039;&#039;tection and &#039;&#039;&#039;Co&#039;&#039;&#039;ntrol) ist zu definieren.&lt;br /&gt;
&lt;br /&gt;
=== Testumgebung ===&lt;br /&gt;
==== Labyrinth ====&lt;br /&gt;
Wie schon in der Angabe zu sehen ist gelten für das Labyrinth einige Annahmen die als Voraussetzungen für die Implementierung festgelegt werden:&lt;br /&gt;
* Es gibt nur gerade Linien&lt;br /&gt;
* Alle Kreuzungen sind rechtwinkelig&lt;br /&gt;
* Alle Abstände sind genau ein Vielfaches der kürzesten Verbindung der Mittelpunkte zweier Felder&lt;br /&gt;
* Alle (nicht sichtbaren) Felder sind gleich groß&lt;br /&gt;
* Das gesamte Labyrinth entspricht einer Baumstruktur, d.h. es gibt niemals zwei paralelle Wege von einem Punkt zu einem Anderen, also keine geschlossenen Schleifen.&lt;br /&gt;
* Da die Steuerung ausschließlich über die Liniensensoren implementiert wird ist die Strecke kollisionsfrei zu halten, d.h. der [[NIBObee]] wird nicht auf Kontakt mit den Fühlern durch Ausweichmanöver reagieren. &lt;br /&gt;
&lt;br /&gt;
==== Simulationen ====&lt;br /&gt;
Damit ein unabhängiges Testen der einzelnen Teile des Projekts möglich ist werden in einigen Bereichen Simulationen eingesetzt:&lt;br /&gt;
* Bluetooth-Verbindung kann mit einem PC und Terminalprogramm getestet werden&lt;br /&gt;
* [[MaDeCo]]-Protokoll wird textbasiert entworfen um mit einfachen Textfiles auf beiden Seiten testen zu können&lt;br /&gt;
&lt;br /&gt;
== Projektfortschritt ==&lt;br /&gt;
Der Projektfortschritt wird im gleichen Intervall verfolgt in dem die Lehrveranstaltung abgehalten wird&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Woche&lt;br /&gt;
!Block&lt;br /&gt;
!Tätigkeiten / Erkenntnisse&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|14.02.2011 - 20.02.2011&lt;br /&gt;
|Gemeinsam&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
* Projektdefinition: Festlegen des Projektinhalts und grobe Abstimmung der einzelnen beteiligten Komponenten.&lt;br /&gt;
* Erstellung eines Dokuments zur Projektbeschreibung&lt;br /&gt;
* Erstellen eines Projektplans &lt;br /&gt;
&amp;lt;!-- Ende Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|colspan=&amp;quot;3&amp;quot;|&#039;&#039;&#039;Projekt akzeptiert -&amp;gt; Projektstart&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|21.02.2011 - 27.02.2011&lt;br /&gt;
|Gemeinsam&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
* Bestellungen besprochen.&lt;br /&gt;
* Wiki eingerichtet.&lt;br /&gt;
* Bestelliste für Bluetooth Module erstellt&lt;br /&gt;
** Auflistung siehe [[BTM-222#Hardware|BTM-222 Stückliste]]&lt;br /&gt;
* Gesamte Hardware bestellt:&lt;br /&gt;
** 2 NIBObee - Programmierbarer Roboter-Bausatz&lt;br /&gt;
** 5 x [[BTM-222#Hardware|BTM-222 Stückliste]] (3 x für das Nibobee und 2 x für das board) erstellt.&lt;br /&gt;
&amp;lt;!-- Ende Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Board&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Board --&amp;gt;&lt;br /&gt;
* Display Erfahrungsberichte recherchiert.&lt;br /&gt;
* Grafik Konzept (Blöcke) besprochen&lt;br /&gt;
* Beispiel Implementierungen für Touchscreen und Grafik von [[LPC2478|LPC 2478]] gesucht &lt;br /&gt;
&amp;lt;!-- Ende Inhalt Board --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|NIBObee&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt NIBObee --&amp;gt;&lt;br /&gt;
* Bestellungen besprochen.&lt;br /&gt;
* nach Bauanleitungen und Datenblätter recherchiert.&lt;br /&gt;
* Printlayout des BT-Modul für NIBObee erstellt&lt;br /&gt;
* Recherche der BTM-222 Konfigurationsmöglichkeiten.&lt;br /&gt;
* Sammeln offener Punkte, auflisten von Risiken und möglicher Massnahmen&lt;br /&gt;
&amp;lt;!-- Ende Inhalt NIBObee --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|28.02.2011 - 06.03.2011&lt;br /&gt;
|Gemeinsam&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
* Definition des proprietären Kommunikationsprotokolls [[MaDeCo| MaDeCo (&#039;&#039;&#039;Ma&#039;&#039;&#039;ze &#039;&#039;&#039;De&#039;&#039;&#039;tection and &#039;&#039;&#039;Co&#039;&#039;&#039;ntrol)]]&lt;br /&gt;
&amp;lt;!-- Ende Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Board&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Board --&amp;gt;&lt;br /&gt;
* Weitere Analyse für Touchscreen und Grafikausgabe&lt;br /&gt;
* Demo Implementierung von Hr. Kramer angefordert und eingelesen&lt;br /&gt;
* Sourcen Demo Projekt in Eclipse Ganymed geladen und Debug Optionen ergänzt&lt;br /&gt;
* Debuggingversuche, Ursachensuche für fehlende Anzeige &lt;br /&gt;
&amp;lt;!-- Ende Inhalt Board --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|NIBObee&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt NIBObee --&amp;gt;&lt;br /&gt;
* Bestellung eingetroffen. Zusammenbau der Roboter durchgeführt&lt;br /&gt;
* Detailabsprache der benötigten Roboterfunktionen&lt;br /&gt;
* Analyse der Probleme beim Befahren des Labyrinths und Abbildung auf notwendige Funktionen.&lt;br /&gt;
&amp;lt;!-- Ende Inhalt NIBObee --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|7.3.2011-13.3.2011&lt;br /&gt;
|Gemeinsam&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
* Recherche Ergebnisse besprochen&lt;br /&gt;
* Bauteile für Bluetooth Modul sind teilweise nicht optimal (vor allem wegen der Größe). Es werden noch Alternativen gesucht und das Layout und der Bestückungspan wurden geändert.&lt;br /&gt;
&amp;lt;!-- Ende Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Board&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Board --&amp;gt;&lt;br /&gt;
* Mehrstündiger Versuch, das Display mit Demo Applikationen zu testen&lt;br /&gt;
* daraus resultierende Tests haben ergeben dass das Display defekt war. Das Board wurde gegen ein neues getauscht&lt;br /&gt;
* neuerliche Inbetriebnahme mit Demo Applikationen&lt;br /&gt;
&amp;lt;!-- Ende Inhalt Board --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|NIBObee&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt NIBObee --&amp;gt;&lt;br /&gt;
* Installation der Entwicklungsumbegung&lt;br /&gt;
* Testen der Beispielprogramme&lt;br /&gt;
* Kalibrierung der Liniensensoren&lt;br /&gt;
* Erstellen eines Testprogramms für die Liniensensoren um die optimale Linienbreite für das Labyrinth ermitteln zu können (2 cm scheint zu breit, Kontrastwert nicht über 128).&lt;br /&gt;
&amp;lt;!-- Ende Inhalt NIBObee --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|14.3.2011-20.3.2011&lt;br /&gt;
|Gemeinsam&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
* Besprechung der jeweiligen Ergebnisse&lt;br /&gt;
* neue Bestückungsliste besprechen und fehlende Teile organisieren&lt;br /&gt;
&amp;lt;!-- Ende Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Board&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Board --&amp;gt;&lt;br /&gt;
* weitere Recherche nach lauffähigen Demoapplikationen&lt;br /&gt;
* Für speziell dieses Board frustrierend wenige bis keine Ergebnisse&lt;br /&gt;
&amp;lt;!-- Ende Inhalt Board --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|NIBObee&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt NIBObee --&amp;gt;&lt;br /&gt;
* Versuche mit zwei unterschiedlichen Ansätzen des Geradeauslaufs des NIBObee:&lt;br /&gt;
** Korrektur mittles Regelkreis unter Berücksichtigung der Odometriesensoren&lt;br /&gt;
** Korrektur nur mttels der Werte von den Liniensensoren&lt;br /&gt;
* Obwohl der Regelkreis eine gradeausfahrt auch ohne Linie schafft ist der Start problematisch und daher für unsere Zwecke ungeeignet&lt;br /&gt;
&amp;lt;!-- Ende Inhalt NIBObee --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|21.3.2011-27.3.2011&lt;br /&gt;
|Gemeinsam&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
* gegenseitiges Update&lt;br /&gt;
* fast alle Bauteile eingetroffen bzw. vorhanden, Ausnahme: Printplatte&lt;br /&gt;
** voraussichtlicher Liefertermin der Printplatte kommende Woche&lt;br /&gt;
&amp;lt;!-- Ende Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Board&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Board --&amp;gt;&lt;br /&gt;
* vergebliche Versuche, den UART in Betrieb zu nehmen&lt;br /&gt;
* gemeinsam mit Hrn. Wenzl nochmals versucht, auch ergebnislos&lt;br /&gt;
* Entschluss, das Vorgehen zu ändern&lt;br /&gt;
* neues Projekt auf Basis Interrupt Template vom 3. Semester&lt;br /&gt;
* Anpassung auf unsere Umgebung&lt;br /&gt;
&amp;lt;!-- Ende Inhalt Board --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|NIBObee&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt NIBObee --&amp;gt;&lt;br /&gt;
* Implementierung gestartet mit folgenden Funktionen:&lt;br /&gt;
* Systemtimer mit 100Hz Taktfrequenz&lt;br /&gt;
* Statemachine für folgende Module:&lt;br /&gt;
** Drive, zuständig für das fahren entlang der Linie des Labyrinths&lt;br /&gt;
** Sensor, zuständig für die Fühler. Entprellen und melden von Änderungen.&lt;br /&gt;
** Line, zuständig für das erkennen der Linie und melden von Abweichungen&lt;br /&gt;
* Scheduler, der alle Module die einen Event bearbeiten müssen aufruft.&lt;br /&gt;
&amp;lt;!-- Ende Inhalt NIBObee --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|28.3.2011-3.4.2011&lt;br /&gt;
|Gemeinsam&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
*Leiterplatten eingetroffen, Beginn des Aufbaus der Bluetooth Module&lt;br /&gt;
&amp;lt;!-- Ende Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Board&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Board --&amp;gt;&lt;br /&gt;
&amp;lt;!-- Ende Inhalt Board --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|NIBObee&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt NIBObee --&amp;gt;&lt;br /&gt;
*Implementieren der Linienverfolgung mit den Statemachines&lt;br /&gt;
*Neuer Modul für Distanzmessung. Wurde von der Implementierung der Odometrie-Bibliothek abgeleitet.&lt;br /&gt;
*Erfolgreiches Ausrichten des NIBObee im Zentrum eines Felds des Labyrinths&lt;br /&gt;
*Probleme beim Unterscheiden von Spurabweichung und Kreuzung. Kann mit den vorhandenen Sensoren nicht gelöst werden. Es wird eine Erweiterung des NIBObee geplant.&lt;br /&gt;
&amp;lt;!-- Ende Inhalt NIBObee --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|4.4.2011-10.4.2011&lt;br /&gt;
|Gemeinsam&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
&amp;lt;!-- Ende Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Board&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Board --&amp;gt;&lt;br /&gt;
&amp;lt;!-- Ende Inhalt Board --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|NIBObee&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt NIBObee --&amp;gt;&lt;br /&gt;
*Fertigstellen des ersten Bluetooth Moduls&lt;br /&gt;
*Verbindung von NIBObee mit PC hergestellt&lt;br /&gt;
*Neue Funktionen zur Kommunikation. Senden und Empfangen mittels Interrupts implementiert&lt;br /&gt;
*Start Implementierung der State Maschine für das MaDeCo Protokoll&lt;br /&gt;
*Debug Möglichkeit mittels BT-Verbindung zum PC implementiert&lt;br /&gt;
*PC Testapplikation für die Bluetooth Verbindung mit spezieller Unterstützung des MaDeCo Protokolls implementiert.&lt;br /&gt;
*Erzeugen von DoxyGen Dokumentation&lt;br /&gt;
&amp;lt;!-- Ende Inhalt NIBObee --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|11.4.2011-1.5.2011&lt;br /&gt;
|Gemeinsam&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
&amp;lt;!-- Ende Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Board&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Board --&amp;gt;&lt;br /&gt;
&amp;lt;!-- Ende Inhalt Board --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|NIBObee&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt NIBObee --&amp;gt;&lt;br /&gt;
*Überarbeiten des Event-Machanismus&lt;br /&gt;
*Optimieren der Debug-Protokollierung über Bluetooth. Strings belegten zu viel Speicher. Das führte zu undefinierbarem Verhalten wegen Überschreiben von Stack und Daten.&lt;br /&gt;
*Erweitern der PC Applikation zum bedienen der NIBObee BT-Schnittstelle. Die optimierte Debug-Ausgabe kann auf Basis von speziellen Kommentaren der NIBObee-Source (debug.h) symbolisch aufbereitet werden.&lt;br /&gt;
*Erweiterung mit zusätliche Liniensensoren angefertigt&lt;br /&gt;
*Wegen zusätzlicher Liniensensoren neue Applikation zum Kalibrieren der Liniensensoren (jetzt 5 Sück) erstellt.&lt;br /&gt;
*Wegen zusätzlicher Liniensensoren ersetzen des original Moduls zum Einlesen der Analogwerte.&lt;br /&gt;
*Wegen zusätzlicher Liniensensoren ersetzen des original Moduls zum ermitteln der Werte der Liniensensoren.&lt;br /&gt;
*Kreuzungserkennung und Linienverfolgung funktionieren nun parallel, NIBObee fährt kleines Testlabyrinth gezielt ab.&lt;br /&gt;
&amp;lt;!-- Ende Inhalt NIBObee --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|rowspan=&amp;quot;3&amp;quot;|2.5.2011-8.5.2011&lt;br /&gt;
|Gemeinsam&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
&amp;lt;!-- Ende Inhalt Gemeinsam --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Board&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt Board --&amp;gt;&lt;br /&gt;
&amp;lt;!-- Ende Inhalt Board --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|NIBObee&lt;br /&gt;
|&amp;lt;!-- Beginn Inhalt NIBObee --&amp;gt;&lt;br /&gt;
&amp;lt;!-- Ende Inhalt NIBObee --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:FH]]&lt;/div&gt;</summary>
		<author><name>Alois</name></author>
	</entry>
</feed>