<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
		<id>https://rn-wissen.de/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Dirk+NO2</id>
		<title>RN-Wissen.de - Benutzerbeiträge [de]</title>
		<link rel="self" type="application/atom+xml" href="https://rn-wissen.de/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Dirk+NO2"/>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Spezial:Beitr%C3%A4ge/Dirk_NO2"/>
		<updated>2026-04-11T12:25:41Z</updated>
		<subtitle>Benutzerbeiträge</subtitle>
		<generator>MediaWiki 1.25.1</generator>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=RP6_Sensor_Board_und_Xtra_Module&amp;diff=28595</id>
		<title>RP6 Sensor Board und Xtra Module</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=RP6_Sensor_Board_und_Xtra_Module&amp;diff=28595"/>
				<updated>2022-04-23T16:31:30Z</updated>
		
		<summary type="html">&lt;p&gt;Dirk NO2: /* Autoren */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Bild:RP6_Sensor_Board.jpg|Das RP6 Sensor Board|right|500px]]&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_Xtra_module.JPG|RP6 Xtra module|right|500px]]&lt;br /&gt;
==Was bisher geschah==&lt;br /&gt;
'''Siehe auch &amp;quot;Was bisher geschah&amp;quot; im [http://www.rn-wissen.de/index.php/RP6v2#Was_bisher_geschah RP6v2] und im [http://www.rn-wissen.de/index.php/RP6#Was_bisher_geschah RP6] Artikel!'''&lt;br /&gt;
&lt;br /&gt;
Mit, 27. Nov 2013 - Ankündigung einer Sensorerweiterungsplatine, die an die RP6v2-M256-WIFI angeschlossen werden kann&amp;lt;br/&amp;gt;&lt;br /&gt;
Sam, 22. Feb 2014 - Auslieferungsbeginn des RP6 Sensor Boards, des I2C GPS Empfängers, des 3D Accelerometer Moduls und des Gyro Moduls&amp;lt;br/&amp;gt;&lt;br /&gt;
Mon, 17. Mär 2014 - Das RP6 Sensor Board ist &amp;quot;nicht lieferbar&amp;quot;, neuer Liefertermin angekündigt für den 12.06.2014 (!?)&amp;lt;br/&amp;gt;&lt;br /&gt;
Die, 25. Mär 2014 - Das RP6 Sensor Board ist wieder &amp;quot;sofort lieferbar&amp;quot;&amp;lt;br/&amp;gt;&lt;br /&gt;
August 2014 - Ein neues Xtra Modul wird von JM3 Engineering angekündigt: Das &amp;quot;Wetterstations Sensor Modul&amp;quot;&amp;lt;br/&amp;gt;&lt;br /&gt;
November 2014 - Das &amp;quot;Wetterstations Sensor Modul&amp;quot; ist bei [http://www.jm3-engineering.com/sensors.htm JM3 Engineering] als &amp;quot;BHT Modul&amp;quot; abgebildet und ein Manual verfügbar&amp;lt;br/&amp;gt;&lt;br /&gt;
Don, 22. Jan 2015 - Auslieferungsbeginn des BHT Moduls&amp;lt;br/&amp;gt;&lt;br /&gt;
Son, 18. Dez 2016 - Laut JM3 Engineering wird das 3D Accelerometer DIL Modul nicht mehr produziert, ist aber weiterhin erhältlich&amp;lt;br/&amp;gt;&lt;br /&gt;
Oktober 2017 - Das RP6 Sensor Board und der I2C GPS Empfänger sind bei CONRAD ausverkauft&amp;lt;br/&amp;gt;&lt;br /&gt;
April 2019 - Das Gyro Modul und das BHT Modul sind bei CONRAD ausverkauft&amp;lt;br/&amp;gt;&lt;br /&gt;
Mai 2020 - Die Experimentierplatine, das Backlight-Display, der Graustufen-Boden-Sensor, der Drehgeber-Satz RP6-ENCv3 und das 3D Accelerometer Modul sind bei CONRAD ausverkauft&amp;lt;br/&amp;gt;&lt;br /&gt;
Ende 2021 - Die RP6 CONTROL M32 Platine, die Ersatzräder, die Ersatzraupen und das RP6 USB-Interface RP6V2-TRANS sind bei CONRAD ausverkauft&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Allgemein==&lt;br /&gt;
Dieser Artikel beschreibt die Grundlagen und Programmierung des RP6 Sensor Boards und der RP6 Xtra Module. Dieses Erweiterungs-Modul und die Xtra Module sind Teile des RP6-Systems, das in den RN-Wissen-Artikeln [[RP6]], [[RP6v2]] und [[RP6_-_Programmierung|RP6 - Programmierung]] ausführlich beschrieben wird. Ausgegliedert aus den &amp;quot;Haupt-Artikeln&amp;quot; habe ich diese Module, da sie m.E. zu einer neuen &amp;quot;Ära&amp;quot; des RP6-Systems gehören:&lt;br /&gt;
&lt;br /&gt;
Sie wurden nicht mehr von '''[http://www.roboternetz.de/community/members/120-SlyD SlyD] (Dominik S. Herwald)''' in Zusammenarbeit mit '''[http://www.arexx.com/ AREXX]''' entwickelt, sondern ab 2013 von '''[http://jm3-engineering.com/ JM3 Engineering] (Dipl.-Ing. Jürgen Maisel)'''. Ab Februar 2014 waren dann das '''RP6 Sensor Board RP6-JM03-61''' ([http://www.conrad.de/ce/de/product/1082384/Arexx-RP6-Sensor-Board-RP6-JM03-61 1082384]) und die drei RP6 Xtra Module '''I2C GPS Empfänger JM3-GPS''' ([http://www.conrad.de/ce/de/product/1082385/Arexx-IC-GPS-Empfaenger-JM3-GPS 1082385]), '''Gyro Modul JM3-GYRO''' ([http://www.conrad.de/ce/de/product/1082386/Arexx-Gyro-Modul-JM3-GYRO 1082386]) und '''3D Accelerometer Modul JM3-3DA''' ([http://www.conrad.de/ce/de/product/1082387/Arexx-3D-Accelerometer-Modul-JM3-3DA 1082387]) bei CONRAD lieferbar. Einen ersten Eindruck vom Sensor Board kann man im RoboterNetz und AREXX Support Forum bekommen,- siehe unter [[RP6_Sensor_Board_und_Xtra_Module#Weblinks|Weblinks]]!&lt;br /&gt;
&lt;br /&gt;
===RP6 Sensor Board===&lt;br /&gt;
Das [[RP6_Sensor_Board_und_Xtra_Module#RP6_Sensor_Board_2|RP6 Sensor Board]] gehört zu den &amp;quot;Erweiterungs-Modulen&amp;quot; des RP6-Systems. '''Andere &amp;quot;Erweiterungs-Module&amp;quot; werden im [[RP6v2#Erweiterungs-Module|RP6v2]] und im [[RP6#Erweiterungs-Module|RP6]] Artikel beschrieben!'''&lt;br /&gt;
&lt;br /&gt;
Das ''RP6 Sensor Board'' ist das erste &amp;quot;Erweiterungs-Modul&amp;quot;, das nicht über einen eigenen Microprozessor verfügt,- es ist also ein ''passives Modul'', das von einem Microprozessor-System (z.B. RP6v2, M32, M128, M256 Wifi) angesteuert werden muss. Es ist ebenfalls das erste Modul, das nicht mehr über die trapezförmige Einbuchtung an der Vorderkante verfügt, sondern komplett rechteckig ist. Damit passt es (montiert auf den Standard-Abstandbolzen) nur auf den vorderen Platinenstapel 1 des RP6.&lt;br /&gt;
&lt;br /&gt;
===RP6 Xtra Module===&lt;br /&gt;
Die [[RP6_Sensor_Board_und_Xtra_Module#RP6_Xtra_Module_2|RP6 Xtra Module]] gehören zu den &amp;quot;Zubehör- und Ersatzteilen&amp;quot; des RP6-Systems. '''Über die weiteren &amp;quot;Zubehör- und Ersatzteile&amp;quot; zum RP6 informiert der entsprechende Abschnitt im [[RP6v2#Zubeh.C3.B6r_und_Ersatzteile|RP6v2]] und im [[RP6#Zubehör und Ersatzteile|RP6]] Artikel!'''&lt;br /&gt;
&lt;br /&gt;
Die ''RP6 Xtra Module'' unterscheiden sich von den weiteren &amp;quot;Zubehör- und Ersatzteilen&amp;quot; dadurch, dass sie selbstständige Sensor-Platinen sind, die ideal zum RP6-System passen, aber auch mit anderen Microcontroller-Plattformen nutzbar sind.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==RP6 Sensor Board==&lt;br /&gt;
Das RP6 Sensor Board RP6-JM03-61 ([http://www.conrad.de/ce/de/product/1082384/Arexx-RP6-Sensor-Board-RP6-JM03-61 1082384]) wurde am 27.11.2013 von [http://www.roboternetz.de/community/members/120-SlyD SlyD] angekündigt (siehe Weblink!).&lt;br /&gt;
&lt;br /&gt;
Aktuell (Oktober 2017) ist das RP6 Sensor Board bei CONRAD ausverkauft.&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_Sensor_Board.jpg|Das RP6 Sensor Board]]&lt;br /&gt;
&lt;br /&gt;
===Beschreibung===&lt;br /&gt;
(Laut Online-Katalog der Firma CONRAD!)&lt;br /&gt;
&lt;br /&gt;
''&amp;quot;Das RP6 Sensor Board erweitert die Möglichkeiten aller RP6 Roboter um wesentliche Sensorsignale für Robotik-Anwendungen wie zum Beispiel Dreharten (Yaw-Gyro), Kipp- und Neigewinkel, Kompassrichtung oder aber auch Zeit und Datum.&lt;br /&gt;
Sie können einfach mit zusätzlichen Sharp Sensoren Abstände genau messen, z.B. für autonome Fahrrouten oder falls der Sensor nach unten gerichtet ist, kann er Treppenstufen oder ähnliches entdecken. Außerdem gibt es die Möglichkeit z.B. die Sharp Sensoren ein- bzw. auszuschalten um Strom zu sparen. Zusätzlich können bis zu 8 Servos angesteuert werden um z.B. einen Roboterarm zu bewegen, der auch mechanisch einfach zu montieren ist. Um die Möglichkeiten des RP6 Sensor Boards komplett ausnutzen zu können, wird ein RP6V2 und RP6Wifi Control Board empfohlen. Die ermöglicht den Roboter über Wifi fernzusteuern oder Sensordaten auf dem Kommandozentrum (PC) z.B Kompassdaten, Temperatur oder Kipp- und Neigewinkel anzeigen zu lassen.&amp;quot;''&lt;br /&gt;
&lt;br /&gt;
'''Ausstattung'''&lt;br /&gt;
* Magnetometer- und Accelerometer für Kompassfunktion&lt;br /&gt;
* Gyro Sensor (Yaw)&lt;br /&gt;
* Sharp-Sensor Schnittstelle&lt;br /&gt;
* LED Scheinwerfer&lt;br /&gt;
* LED Treiber mit Smart Funktionen&lt;br /&gt;
* I²C Bus mit max. 400 kHz Übertragungsrate; Hot Swap I²C-Bus Buffer&lt;br /&gt;
* Taster mit LED&lt;br /&gt;
* Echtzeit-Uhr RTC&lt;br /&gt;
* Backupbatterie (Aufladung während des Betriebs)&lt;br /&gt;
* Expansion Port z.B. für GPS-I²C Bus Modul&lt;br /&gt;
* 8 Servo-Ausgänge mit eigenem Schaltregler&lt;br /&gt;
* 8 PWM Ausgänge&lt;br /&gt;
* 5 LED Ausgänge und 2 Digital-I/O Ausgänge.&lt;br /&gt;
&lt;br /&gt;
'''Lieferumfang'''&lt;br /&gt;
* RP6 Sensor Board&lt;br /&gt;
* Montage-Kit&lt;br /&gt;
* Kabel&lt;br /&gt;
* Anleitung und CD mit Dokumentation.&lt;br /&gt;
&lt;br /&gt;
====Blockschaltbild====&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_Sensor_Board_BSP.png|RP6 Sensor Board Blockschaltbild]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Technische Daten===&lt;br /&gt;
{|  {{Blauetabelle}} &lt;br /&gt;
|'''Mikrocontroller:'''&lt;br /&gt;
|kein&lt;br /&gt;
|-&lt;br /&gt;
|'''Speicher:'''&lt;br /&gt;
|kein&amp;lt;br/&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|'''Programmierung:'''&lt;br /&gt;
|C++ (GCC, u.a.) über externes µC-System&lt;br /&gt;
|-&lt;br /&gt;
|'''Vorhandene Sensoren:'''&lt;br /&gt;
|Temperatur, 3D Magnetfeld (Kompass), 3D Beschleunigung, Yaw-Gyro&amp;lt;br/&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|'''Vorhandene Aktoren:'''&lt;br /&gt;
|LED Controller (2 LEDs on board, 5 freie LED Ports), Status LED,&amp;lt;br/&amp;gt;Button, Servo (PWM) Controller für 8 Servos und 8 PWM-Kanäle,&amp;lt;br/&amp;gt;Real Time Clock (RTC), 2 freie I/O Ports&lt;br /&gt;
|-&lt;br /&gt;
|'''Abmessungen:'''&lt;br /&gt;
|(L &amp;amp;times; B &amp;amp;times; H) 112 &amp;amp;times; 90 &amp;amp;times; 19 mm&amp;lt;br/&amp;gt;(B + 5 mm durch Scheinwerfer vorn)&lt;br /&gt;
|-&lt;br /&gt;
|'''Ausführung:'''&lt;br /&gt;
|Fertig aufgebautes Erweiterungsmodul&lt;br /&gt;
|-&lt;br /&gt;
|'''Stromversorgung:'''&lt;br /&gt;
|6 AA NiMH Akkus (über die RP6v2 Base)&amp;lt;br/&amp;gt;und optionaler Zusatzakku 7,2..10 V für Servo Power&lt;br /&gt;
|-&lt;br /&gt;
|'''Hersteller:'''&lt;br /&gt;
|Arexx Niederlande&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Umbau-Optionen===&lt;br /&gt;
Hier soll beschrieben werden, welche Umbau-Optionen es für das RP6 Sensor Board gibt. Im Text gibt es Verweise auf den Schaltplan des RP6 Sensor Boards (RP6_Sensor_Board_Rev2_Schema.pdf) in der Form: (SP2: Bauteil). Dies bedeutet, dass man das Bauteil auf Blatt 2 des Schaltplans finden kann. Beispielhaft sind im folgenden Text Bestell-Nummern der Firma [http://www.conrad.de/ce/ CONRAD] genannt. Natürlich kann man die Teile auch bei anderen Versendern beziehen.&lt;br /&gt;
&lt;br /&gt;
====USRBUS- und XBUS-Wannenstecker====&lt;br /&gt;
Der zweite Wannenstecker für den XBUS (SP3: K14) und USRBUS (SP3: K16) kann nachbestückt werden.&lt;br /&gt;
Man braucht dazu: &lt;br /&gt;
* 2 Wannenstecker 2x7-polig gerade RM 2,54mm (CONRAD [http://www.conrad.de/ce/de/product/741687/Stiftleiste-Print-Montage-gerade-Rastermass-254-mm-Pole-2-x-7-10120556-BKL-Electronic-Inhalt-1-St 741687])&lt;br /&gt;
Die Wannenstecker lötet man auf die eingezeichneten Positionen.&lt;br /&gt;
&lt;br /&gt;
'''USRBUS-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''USRBUS''' || '''Sensor Board-Funktion''' || '''Verwendung''' || '''I/O'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Y1 || &amp;quot;ADC0&amp;quot; || SHARP vorn || I&lt;br /&gt;
|-&lt;br /&gt;
| 2 || Y2 || &amp;quot;ADC1&amp;quot; || Yaw-Gyro || I&lt;br /&gt;
|-&lt;br /&gt;
| 3 || Y3 || PWR || Power für&amp;lt;br/&amp;gt;SHARPs, CAM_IF,&amp;lt;br/&amp;gt;I2C-MODULE || O&lt;br /&gt;
|-&lt;br /&gt;
| 4 || Y4 || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 5 || Y5 || &amp;quot;ADC4&amp;quot; || SHARP hinten ||I&lt;br /&gt;
|-&lt;br /&gt;
| 6..14 || Y6..Y14 || || keine ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
'''XBUS-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''XBUS''' || '''M256-Port''' ||'''M256-Funktion''' || '''Sensor Board-Funktion''' || '''Jumper''' || '''Verwendung''' || '''I/O'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || GND || || GND || GND || || ||&lt;br /&gt;
|-&lt;br /&gt;
| 2 || GND || || GND || GND || || ||&lt;br /&gt;
|-&lt;br /&gt;
| 3 || VDD || || VDD|| VDD_1 || || VDD +5V ||&lt;br /&gt;
|-&lt;br /&gt;
| 4 || +UB || || +UB || VSS_1 || || CAM_IF Power ||&lt;br /&gt;
|-&lt;br /&gt;
| 5 || VDD || || VDD || VDD_1 || || VDD +5V ||&lt;br /&gt;
|-&lt;br /&gt;
| 6 || +UB || || +UB || VSS_1 || || CAM_IF Power ||&lt;br /&gt;
|-&lt;br /&gt;
| 7 || INTU || PJ4 || PCINT13 || INTU || || keine || I&lt;br /&gt;
|-&lt;br /&gt;
| 8 || INT1 || PJ3 || PCINT12 || INT1 || 3 || LSM303DLHC: INT1 || I&lt;br /&gt;
|-&lt;br /&gt;
| 9 || INT3 || PJ5 || PCINT14 || INT3 || 2&amp;lt;br/&amp;gt;5 || DS1339: SQW/INT_N&amp;lt;br/&amp;gt;LSM303DLHC: INT2 || I&amp;lt;br/&amp;gt;I&lt;br /&gt;
|-&lt;br /&gt;
| 10 || SCL || PD0 || SCL || SCL_M || || I2C-Bus || O&lt;br /&gt;
|-&lt;br /&gt;
| 11 || INT2 || PJ6 || PCINT15 || INT2 || 4 || MAX7311: INT_N || I&lt;br /&gt;
|-&lt;br /&gt;
| 12 || SDA || PD1 || SDA || SDA_M || || I2C-Bus || I/O&lt;br /&gt;
|-&lt;br /&gt;
| 13 || MRESET || || MRESET || MRESET || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 14 || GND || || GND || GND || || ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====I/O-Patchfield_1====&lt;br /&gt;
Dieses 2x 5-polige &amp;quot;Patchfield_1&amp;quot; (SP3: K8), beschriftet mit &amp;quot;I/O&amp;quot; liegt neben dem Wannenstecker I/O und weist dieselbe Belegung auf. Möchte man auf dem Sensor Board Verbindungen über den Wannenstecker I/O zu einer angeschlossenen Microprozessor-Platine herstellen, dann kann man auf das &amp;quot;Patchfield_1&amp;quot; eine Stiftleiste löten.&lt;br /&gt;
Man braucht dazu: &lt;br /&gt;
* 2-reihige Stiftleiste RM 2,54mm (z.B. 2x40-polig [http://www.conrad.de/ce/de/product/741306/Doppelreihige-Stiftleiste-RM-254-gerade-Pole-2-x-40-10120173-BKL-Electronic-Inhalt-1-St 741306]) &lt;br /&gt;
Man trennt von der 2-reihigen Stiftleiste 2x5 Kontakte ab und lötet sie auf die Lötpunkte &amp;quot;I/O&amp;quot;. Zuvor muss man u.U. Lötzinnreste aus den Lötpunkten mit Entlötlitze bzw. Entlötsaugpumpe entfernen.&lt;br /&gt;
&lt;br /&gt;
'''Stecker I/O an M256 IO_PWM/T0/T1:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''M256-Port''' ||'''M256-Funktion''' || '''Sensor Board-Funktion''' || '''Verwendung''' || '''I/O'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || PD4 || ICP1 || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 2 || || GND || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 3 || PD6 || T1 || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 4 || PB7 || OC0A || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 5 || PG5 || OC0B || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 6 || PD7 || T0 || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 7 || PB5 || OC1A || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 8 || PK5 || ADC13 || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 9 || PB6 || OC1B || &amp;quot;PD5&amp;quot; || I2C Bus Buffer Enable || O&lt;br /&gt;
|-&lt;br /&gt;
| 10 || || VDD || || keine ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====ADC-Patchfield_2====&lt;br /&gt;
Dieses 2x 5-polige &amp;quot;Patchfield_2&amp;quot; (SP3: K9), beschriftet mit &amp;quot;ADC&amp;quot; liegt neben dem Wannenstecker ADC und weist dieselbe Belegung auf. Möchte man auf dem Sensor Board Verbindungen über den Wannenstecker ADC zu einer angeschlossenen Microprozessor-Platine herstellen, dann kann man auf das &amp;quot;Patchfield_2&amp;quot; eine Stiftleiste löten.&lt;br /&gt;
Man braucht dazu: &lt;br /&gt;
* 2-reihige Stiftleiste RM 2,54mm (z.B. 2x40-polig [http://www.conrad.de/ce/de/product/741306/Doppelreihige-Stiftleiste-RM-254-gerade-Pole-2-x-40-10120173-BKL-Electronic-Inhalt-1-St 741306]) &lt;br /&gt;
Man trennt von der 2-reihigen Stiftleiste 2x5 Kontakte ab und lötet sie auf die Lötpunkte &amp;quot;ADC&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
'''Stecker ADC an M256 ADC_IO2/CMP:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''M256-Port''' ||'''M256-Funktion''' || '''Sensor Board-Funktion''' || '''Jumper''' || '''Verwendung''' || '''I/O'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || PK0 || ADC8 || || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 2 || || GND || || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 3 || PK1 || ADC9 || &amp;quot;ADC4&amp;quot; || 6 || SHARP hinten || I&lt;br /&gt;
|-&lt;br /&gt;
| 4 || PE3 || OC3A/AIN1 || || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 5 || PK2 || ADC10 || || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 6 || || GND || || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 7 || PK3 || ADC11 || || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 8 || PE2 || XCK0/AIN0 || || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 9 || PK4 || ADC12 || || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 10 || || VDD || || || keine ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Anschluss-Optionen===&lt;br /&gt;
Hier soll beschrieben werden, welche Anschluss-Optionen es für das RP6 Sensor Board gibt. In erster Linie geht es dabei um die Belegung der vorhandenen Stecker bzw. Stiftleisten.&lt;br /&gt;
&lt;br /&gt;
Allgemein kann man Anschlüsse an Stiftleisten mit entsprechenden Steckbuchsen erreichen. Solche Steckbuchsen sind z.B. bei ELV erhältlich:&lt;br /&gt;
* Steckbuchse, 2-polig, RM 2,54mm ([http://www.elv.de/steckbuchse-2-polig.html ELV 68-016635])&lt;br /&gt;
* Steckbuchse, 3-polig, RM 2,54mm ([http://www.elv.de/steckbuchse-3-polig.html ELV 68-022503])&lt;br /&gt;
* Steckbuchse, 5-polig, RM 2,54mm ([http://www.elv.de/steckbuchse-5-polig.html ELV 68-023073])&lt;br /&gt;
Die Crimpkontakte dieser Steckbuchse werden an Litzen angequetscht (oder angelötet) und zum entsprechenden Sensor bzw. Aktor geführt. &lt;br /&gt;
&lt;br /&gt;
====I2C-MODULE====&lt;br /&gt;
Der I2C-MODULE Anschluss (SP1: M1) auf dem Sensor Board besteht aus einer 9-poligen Präzisions-Buchsenleiste RM 2,54mm (z.B. [http://www.conrad.de/ce/de/product/741360/Praezisions-Buchsenleiste-RM-254-gerade-Pole-1-x-20-10120832-BKL-Electronic-Inhalt-1-St 741360]). Wenn man eigene I2C-Module hier anschliessen will, braucht man zur Kontaktierung:&lt;br /&gt;
* Präzisions-Stiftleiste, 9-polig, RM 2,54mm (z.B. [http://www.conrad.de/ce/de/product/741307/Praezisions-Stiftleiste-RM-254-gerade-Pole-1-x-20-10120536-BKL-Electronic-Inhalt-1-St 741307])&lt;br /&gt;
&lt;br /&gt;
'''I2C-MODULE-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''Sensor Board&amp;lt;br/&amp;gt;-Funktion (M1)''' || '''Verwendung''' || '''I/O''' |||| [[RP6_Sensor_Board_und_Xtra_Module#I2C_GPS_Empf.C3.A4nger_JM3-GPS|'''I2C GPS Empfänger]]&amp;lt;br/&amp;gt;-Funktion (K1)''' ||&lt;br /&gt;
[[RP6_Sensor_Board_und_Xtra_Module#BHT_Modul_JM3-BHT31|'''BHT Modul]]&amp;lt;br/&amp;gt;-Funktion (K1)'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || VCC || +5V || |||| VCC_1 || VDD&lt;br /&gt;
|-&lt;br /&gt;
| 2 || SCLOUT || Buffered I2C-Bus || O |||| SCL/SCK || SCL&lt;br /&gt;
|-&lt;br /&gt;
| 3 || SDAOUT || Buffered I2C-Bus || I/O |||| SDA/MOSI || SDA&lt;br /&gt;
|-&lt;br /&gt;
| 4 || NC || keine || |||| ||&lt;br /&gt;
|-&lt;br /&gt;
| 5 || I/O1 || Status LED || O |||| ||&lt;br /&gt;
|-&lt;br /&gt;
| 6 || I/O2 || Taster || I |||| ||&lt;br /&gt;
|-&lt;br /&gt;
| 7 || NC || keine || |||| ||&lt;br /&gt;
|-&lt;br /&gt;
| 8 || GND || GND (geschaltet!) || |||| GND || GND&lt;br /&gt;
|-&lt;br /&gt;
| 9 || GND || GND (geschaltet!) || |||| GND || GND&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====CAM_IF====&lt;br /&gt;
Der CAM_IF Anschluss (SP1: K28) ist eine 2x 3-polige Stiftleiste mit der folgenden Belegung:&lt;br /&gt;
&lt;br /&gt;
'''CAM_IF-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''Sensor Board&amp;lt;br/&amp;gt;-Funktion (K28)''' || '''Verwendung''' || '''I/O'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || GND || GND (geschaltet!) ||&lt;br /&gt;
|-&lt;br /&gt;
| 2 || VSS_1 || +7,2..10V (RP6: +UB) ||&lt;br /&gt;
|-&lt;br /&gt;
| 3 || SCLOUT || Buffered I2C-Bus || O&lt;br /&gt;
|-&lt;br /&gt;
| 4 || SDAOUT || Buffered I2C-Bus || I/O&lt;br /&gt;
|-&lt;br /&gt;
| 5 || SCL_M || I2C-Bus || O&lt;br /&gt;
|-&lt;br /&gt;
| 6 || SDA_M || I2C-Bus || I/O&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====IO_EXT====&lt;br /&gt;
Der IO_EXT Anschluss (SP1: K19) ist eine 2x 2-polige Stiftleiste mit der folgenden Belegung:&lt;br /&gt;
&lt;br /&gt;
'''IO_EXT-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''Sensor Board&amp;lt;br/&amp;gt;-Funktion (K19)''' || '''Verwendung''' || '''I/O'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || MAX7311: I/O1.2 || freier I/O Port || I/O&lt;br /&gt;
|-&lt;br /&gt;
| 2 || GND || ||&lt;br /&gt;
|-&lt;br /&gt;
| 3 || MAX7311: I/O1.1 || freier I/O Port || I/O&lt;br /&gt;
|-&lt;br /&gt;
| 4 || GND || ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====PWM_OUT====&lt;br /&gt;
Der PWM_OUT Anschluss (SP5: K12) ist eine 2x 4-polige Stiftleiste mit der folgenden Belegung:&lt;br /&gt;
&lt;br /&gt;
'''PWM_OUT-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''Sensor Board&amp;lt;br/&amp;gt;-Funktion (K12)''' || '''Verwendung''' || '''I/O'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || PCA9685: PWM0 || freier PWM Port || O&lt;br /&gt;
|-&lt;br /&gt;
| 2 || PCA9685: PWM1 || freier PWM Port || O&lt;br /&gt;
|-&lt;br /&gt;
| 3 || PCA9685: PWM2 || freier PWM Port || O&lt;br /&gt;
|-&lt;br /&gt;
| 4 || PCA9685: PWM3 || freier PWM Port || O&lt;br /&gt;
|-&lt;br /&gt;
| 5 || PCA9685: PWM4 || freier PWM Port || O&lt;br /&gt;
|-&lt;br /&gt;
| 6 || PCA9685: PWM5 || freier PWM Port || O&lt;br /&gt;
|-&lt;br /&gt;
| 7 || PCA9685: PWM6 || freier PWM Port || O&lt;br /&gt;
|-&lt;br /&gt;
| 8 || PCA9685: PWM7 || freier PWM Port || O&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====TP1====&lt;br /&gt;
Am Testpunkt TP1 (SP4: TP1) kann man das Signal SQW/INT_N der RTC (DS1339) prüfen/messen.&lt;br /&gt;
&lt;br /&gt;
====LEDs====&lt;br /&gt;
=====Rücklichter=====&lt;br /&gt;
Der Rücklichter Anschluss (SP1: K10) ist eine 2-polige Stiftleiste mit der folgenden Belegung:&lt;br /&gt;
&lt;br /&gt;
'''Rücklichter-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''Sensor Board&amp;lt;br/&amp;gt;-Funktion (K10)''' || '''Verwendung''' || '''I/O'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || TCA6507: P3 || Rücklicht rechts || O&lt;br /&gt;
|-&lt;br /&gt;
| 2 || TCA6507: P4 || Rücklicht links || O&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=====Display-Hintergrundbeleuchtung=====&lt;br /&gt;
Der Display-Hintergrundbeleuchtung Anschluss (SP1: K7) ist eine 2-polige Stiftleiste mit der folgenden Belegung:&lt;br /&gt;
&lt;br /&gt;
'''Display-Hintergrundbeleuchtung-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''Sensor Board&amp;lt;br/&amp;gt;-Funktion (K7)''' || '''Verwendung''' || '''I/O'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || TCA6507: P0 || Display-Hintergrundbeleuchtung || O&lt;br /&gt;
|-&lt;br /&gt;
| 2 || VDD_1 || +5V ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=====Freie Ausgänge=====&lt;br /&gt;
Der freie Ausgang 1 Anschluss (SP1: K4) ist eine 2-polige Stiftleiste mit der folgenden Belegung:&lt;br /&gt;
&lt;br /&gt;
'''Freier Ausgang 1-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''Sensor Board&amp;lt;br/&amp;gt;-Funktion (K4)''' || '''Verwendung''' || '''I/O'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || TCA6507: P1 || freier LED Port || O&lt;br /&gt;
|-&lt;br /&gt;
| 2 || VDD_1 || +5V ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Der freie Ausgang 2 Anschluss (SP1: K2) ist eine 2-polige Stiftleiste mit der folgenden Belegung:&lt;br /&gt;
&lt;br /&gt;
'''Freier Ausgang 2-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''Sensor Board&amp;lt;br/&amp;gt;-Funktion (K2)''' || '''Verwendung''' || '''I/O'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || TCA6507: P2 || freier LED Port || O&lt;br /&gt;
|-&lt;br /&gt;
| 2 || VDD_1 || +5V ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====SHARP Sensoren====&lt;br /&gt;
Das RP6 Sensor Board verfügt über zwei Stecker SHARP_F (SP1: K5) und SHARP_R (SP1: K3) zum Anschluß von analogen SHARP Infrarot-Distanz-Sensoren. Folgende SHARP Sensoren sind anschließbar:&lt;br /&gt;
* 1. SHARP Distanz-Sensor GP2Y0A41SK0F ([http://www.conrad.de/ce/de/product/504596/Distanz-Sensor-GP2Y0A41SK0F-Sharp-GP2Y0A41SK0F-Messbereiche-Erfassungsbereich-4-30-cm-5-VDC 504596]), Messbereich 4..30cm&lt;br /&gt;
* 2. SHARP Distanz-Sensor GP2Y0A21YK0F ([http://www.conrad.de/ce/de/product/504591/Distanz-Sensor-GP2Y0A21YK0F-Sharp-GP2Y0A21YK0F-Messbereiche-Erfassungsbereich-10-80-cm-5-VDC 504591]), Messbereich 10..80cm&lt;br /&gt;
* 3. SHARP Distanz-Sensor GP2Y0A02YK ([http://www.conrad.de/ce/de/product/185364/Distanz-Sensor-GP-2-Y0A-02-YK-Sharp-GP-2-Y0A-02-YK-Messbereiche-Erfassungsbereich-20-150-cm-5-VDC 185364]), Messbereich 20..150cm&lt;br /&gt;
* 4. SHARP Distanz-Sensor GP2Y0A710K0F ([http://www.conrad.de/ce/de/product/504597/Distanz-Sensor-GP2Y0A710K0F-Sharp-GP2Y0A710K0F-Messbereiche-Erfassungsbereich-100-550-cm-5-VDC 504597]), Messbereich 100..550cm&lt;br /&gt;
''Die Auswahl der geeigneten SHARP Sensoren hängt von der gewünschten Funktion ab: Zur Erkundung großer Räume eignet sich insbesondere der Typ 4 mit einer hohen Reichweite von 5,5m. Er ist aber ungeeignet, die Distanz von Objekten zu erkennen, die sich näher als 1m vor dem Sensor befinden. Ein guter Kompromiss zwischen Nahbereichsmessung und &amp;quot;Fernsicht&amp;quot; sind die Typen 2 (10..80cm) und 3 (20..150cm). Will man den Distanz-Sensor vor allem zur Vermeidung eins Sturzes von einer Treppe (Tiefenerkennung) oder nur zur Erkennung von Hindernissen direkt vor dem Roboter (Kollisionserkennung) benutzen, dann eignet sich insbesondere für den vorderen Sensor (SHARP_F) der Typ 1, da er im Nahbereich von 4 bis 30cm messen kann.''&lt;br /&gt;
&lt;br /&gt;
Für die Verbindung zwischen den beiden 3-poligen JST XH Steckern (K3, 5) auf dem Sensor Board und den SHARP-Sensoren braucht man auf der Sensor Board Seite folgende Stecker-/buchsenteile:&lt;br /&gt;
* 2x JST XH Gehäuse, 3-polig, RM 2,5mm ([http://www.conrad.de/ce/de/product/740583/Gehaeuse-RM-25-mm-Serie-XH-Rastermass-25-mm-Pole-3-Nennstrom-3-A-XHP-3-JST-Inhalt-1-St 740583])&lt;br /&gt;
* 6x JST XH Crimpkontakt f. RM 2,5mm ([http://www.conrad.de/ce/de/product/741112/Crimpkontakt-fuer-RM-25-mm-Serie-XH-Rastermass-25-mm-BXH-001T-P06-JST-Inhalt-1-St 741112])&lt;br /&gt;
Die Crimpkontakte dieser Steckbuchse werden an die meist 3-adrige Litze des Sensors angequetscht (oder angelötet). Zur Belegung des Sensor Anschlusses siehe das jeweilige Datenblatt!&lt;br /&gt;
&lt;br /&gt;
=====Vorn=====&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_Sensor_Board_SHARP_F.JPG|RP6 Sensor Board SHARP Sensor vorn|thumb]]&lt;br /&gt;
&lt;br /&gt;
Der vordere SHARP Sensor kann auch mechanisch am Sensor Board befestigt werden. Dazu gibt es an der Vorderkante der Platine zwei Befestigungslöcher.&lt;br /&gt;
&lt;br /&gt;
Das Bild rechts zeigt den SHARP Distanzsensor GP2Y0A02YK montiert vorn auf dem Sensor Board mit zwei M3 Gelenkbolzen ([http://www.conrad.de/ce/de/product/521043/Gelenkbolzen-1-x-Aussengewinde1-x-Innengewinde-Messing-vernickelt-Schluesselweite-55-mm/ 521043]) und passenden Schrauben/Muttern.&lt;br /&gt;
&lt;br /&gt;
'''Vorn-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''RP6v2-Port''' ||'''RP6v2-Funktion''' || '''Sensor Board&amp;lt;br/&amp;gt;-Funktion (K5)''' || '''Verwendung''' || '''I/O''' |||| '''SHARP Sensor&amp;lt;br/&amp;gt;-Funktion''' &lt;br /&gt;
|-&lt;br /&gt;
| 1 || PA0 || ADC0 || &amp;quot;ADC0&amp;quot; || SHARP vorn || I |||| Vo&lt;br /&gt;
|-&lt;br /&gt;
| 2 || || || VDD_1 || +5V || |||| Vcc&lt;br /&gt;
|-&lt;br /&gt;
| 3 || || || GND || GND (geschaltet!) || |||| GND&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=====Hinten=====&lt;br /&gt;
Der hintere SHARP Sensor kann z.B. an der Rückseite des RP6v2 Fahrgestells befestigt werden.&lt;br /&gt;
&lt;br /&gt;
'''Hinten-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''M256-Port''' ||'''M256-Funktion''' || '''Sensor Board&amp;lt;br/&amp;gt;-Funktion (K3)''' || '''Verwendung''' || '''I/O''' |||| '''SHARP Sensor&amp;lt;br/&amp;gt;-Funktion''' &lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| 1 || PK1 || ADC9 || &amp;quot;ADC4&amp;quot; || SHARP hinten || I |||| Vo&lt;br /&gt;
|-&lt;br /&gt;
| 2 || || || VDD_1 || +5V || |||| Vcc&lt;br /&gt;
|-&lt;br /&gt;
| 3 || || || GND || GND (geschaltet!) || |||| GND&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Servos====&lt;br /&gt;
=====Power=====&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_Sensor_Board_Servo-PWR.jpg|RP6 Sensor Board Servo-PWR Stecker|thumb]]&lt;br /&gt;
&lt;br /&gt;
An den SERVO_PWR Stecker (SP5: K1) muss ein Akku zur Stromversorgung der mit dem Sensor Board verbundenen Servos angeschlossen werden. Der Stecker hat folgende Belegung:&lt;br /&gt;
 &lt;br /&gt;
'''SERVO_PWR-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''Sensor Board&amp;lt;br/&amp;gt;-Funktion (K1)''' || '''Verwendung'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || GND_POWER || Servo Power GND&lt;br /&gt;
|-&lt;br /&gt;
| 2 || VSS_POWER || Servo Power Eingang +7,2..10V&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Der Akku zur Versorgung der Servos muss eine Nennspannung von 7,2..10V aufweisen. Der Schaltregler auf dem Sensor Board kann bei einer 5,0V Servo-Spannung Ströme bis 3,0A (Spitzen bis 5,0A) liefern. '''Die Polung des Akkus darf am Stecker SERVO_PWR nicht vertauscht werden.''' Siehe den oberen Teil der nebenstehenden Abbildung! Ratsam ist es, eine Sicherung 3,15A in die Plusleitung zwischen Akku und SERVO_PWR Stecker zu legen.&lt;br /&gt;
&lt;br /&gt;
Für die Verbindung zwischen dem 2-poligen JST XH Stecker (SERVO_PWR, K1) auf dem Sensor Board und dem Akku braucht man auf der Sensor Board Seite folgende Stecker-/buchsenteile:&lt;br /&gt;
* JST XH Gehäuse, 2-polig, RM 2,5mm ([http://www.conrad.de/ce/de/product/740549/Gehaeuse-RM-25-mm-Serie-XH-Rastermass-25-mm-Pole-2-Nennstrom-3-A-XHP-2-JST-Inhalt-1-St 740549])&lt;br /&gt;
* 2x JST XH Crimpkontakt f. RM 2,5mm ([http://www.conrad.de/ce/de/product/741112/Crimpkontakt-fuer-RM-25-mm-Serie-XH-Rastermass-25-mm-BXH-001T-P06-JST-Inhalt-1-St 741112])&lt;br /&gt;
Die Crimpkontakte dieser Steckbuchse werden an die 2-adrige Litze zum Akku angequetscht (oder angelötet).&lt;br /&gt;
&lt;br /&gt;
Wenn man keinen separaten Akku zur Versorgung der Servos nehmen will, kann man auch +UB der RP6v2 Base dafür nutzen. An +UB liegt die Akkuspannung der Base (Nennspannung 7,2V) über eine Sicherung F1 3,15A (RP6v2) bzw. 2,5A (RP6) auf dem Mainboard an. +UB kann man z.B. am [[RP6#EXT_Anschlu.C3.9F|EXT Anschluß der Base]] entnehmen. Die nebenstehende Abbildung zeigt im unteren Teil, an welchen Pins man dort +UB kontaktieren kann!&lt;br /&gt;
&lt;br /&gt;
Dabei ist zu beachten, dass die Sicherung F1 auf dem RP6(v2) Mainboard den nutzbaren Strom für die Servos deutlich begrenzt: Durch diese Sicherung fließt ja nicht nur der Servo-Strom, sondern auch der Strom für den RP6 und alle darauf montierten Zusatzplatinen. Wenn der RP6 also herumfährt und z.B. noch die IRCOMM-Sendedioden nutzt, bleibt kaum noch Stromreserve für die Servos auf dem Sensor Board übrig.&lt;br /&gt;
'''Das bedeutet: Man sollte unbedingt einen separaten Akku für die Servos auf dem Sensor Board benutzen!'''&lt;br /&gt;
&lt;br /&gt;
======SERVO_PWR-EXT Verbindung======&lt;br /&gt;
Für die Verbindung zwischen dem 2-poligen JST XH Stecker (SERVO_PWR, K1) auf dem Sensor Board und dem 8-poligen JST XH Stecker (EXT) auf dem RP6v2 Mainboard braucht man folgende Stecker-/buchsenteile:&lt;br /&gt;
* JST XH Gehäuse, 2-polig, RM 2,5mm ([http://www.conrad.de/ce/de/product/740549/Gehaeuse-RM-25-mm-Serie-XH-Rastermass-25-mm-Pole-2-Nennstrom-3-A-XHP-2-JST-Inhalt-1-St 740549])&lt;br /&gt;
* JST XH Gehäuse, 8-polig, RM 2,5mm ([http://www.conrad.de/ce/de/product/740928/Gehaeuse-RM-25-mm-Serie-XH-Rastermass-25-mm-Pole-8-Nennstrom-3-A-XHP-8-JST-Inhalt-1-St 740928])&lt;br /&gt;
* 10x JST XH Crimpkontakt f. RM 2,5mm ([http://www.conrad.de/ce/de/product/741112/Crimpkontakt-fuer-RM-25-mm-Serie-XH-Rastermass-25-mm-BXH-001T-P06-JST-Inhalt-1-St 741112])&lt;br /&gt;
Mit einer 2-adrigen Litze, die beidseits mit den Crimpkontakten verquetscht (oder verlötet) wird, verbindet man dann den SERVO_PWR Stecker mit dem EXT Stecker, wie in der Abbildung oben gezeigt. ''Achtung: Plus (+) und Minus (-) nicht vertauschen!''&lt;br /&gt;
 Ein passendes Kabel soll zukünftig (*) mitgeliefert werden.&lt;br /&gt;
&lt;br /&gt;
Auf dem RP6 Mainboard ist der 8-polige EXT Stecker noch nicht bestückt. Wenn man ihn nachrüsten will, muss man noch bestellen:&lt;br /&gt;
* JST XH Stiftleiste gerade, 8-polig, RM 2,5mm ([http://www.conrad.de/ce/de/product/740105/Stiftleiste-gerade-RM-25-mm-Serie-XH-Rastermass-25-mm-Pole-8-Nennstrom-3-A-B8B-XH-A-LFSN-JST-Inhalt-1-St 740105])&lt;br /&gt;
Die Stiftleiste wird auf das RP6 Mainboard gelötet, dabei weisen die beiden Einkerbungen an einer Längsseite der Stiftleiste nach hinten zum Rand des Mainboards.&lt;br /&gt;
 Auch diese Stiftleiste soll zukünftig (*) zum Lieferumfang gehören.&lt;br /&gt;
'''Zu *)''' Meinem RP6 Sensor Board (bestellt am 1.3.2014) lag das konfektionierte Kabel und die Stiftleiste noch nicht bei!&lt;br /&gt;
&lt;br /&gt;
=====Stecker=====&lt;br /&gt;
An die acht 3-poligen Stiftleisten SERVO_1 bis SERVO_8 (SP5: K6, 11, 29..34) können Servos angeschlossen werden. Direkt aufstecken kann man Servo-Steckbuchsen mit der Belegung von CONRAD, Graupner/JR und Robbe/Futaba (Versorgungsspannung Plus am mittleren Pin). Auf der Sensor Board Platine kann man den Pin 3 (Servo Power GND) der 3-poligen Stiftleisten daran erkennen, dass er näher zum rechten Platinenrand (Seite mit dem XBUS Stecker) angeordnet ist als der zugehörige Pin 1 (Servo Signal).&lt;br /&gt;
&lt;br /&gt;
Wenn Servos mit nicht passender Steckbuchse angeschlossen werden sollen, dann braucht man auf der Sensor Board Seite folgende Stecker-/buchsenteile für jedes Servo:&lt;br /&gt;
* Steckbuchse, 3-polig, RM 2,54mm ([http://www.elv.de/steckbuchse-3-polig.html ELV 68-022503])&lt;br /&gt;
Die Crimpkontakte dieser Steckbuchse werden an die 3-adrige Litze des Servos angequetscht (oder angelötet). &lt;br /&gt;
&lt;br /&gt;
'''SERVO_1..8-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''Sensor Board&amp;lt;br/&amp;gt;-Funktion (K6,11,29..34)''' || '''Verwendung''' || '''I/O''' |||| '''Servo-&amp;lt;br/&amp;gt;Kabelfarben'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || PCA9685: PWM15..8 || Servo Signal || O |||| Weiß, Orange&lt;br /&gt;
|-&lt;br /&gt;
| 2 || Servo_PWR || Servo Power +5V (geschaltet!) || |||| Rot&lt;br /&gt;
|-&lt;br /&gt;
| 3 || GND_POWER || Servo Power GND || |||| Schwarz, Braun&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Roboterarm RA2-HOBBY====&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_Sensor_Board_RA2-MINI.JPG|RP6 Sensor Board mit Roboterarm RA2-MINI|thumb]]&lt;br /&gt;
&lt;br /&gt;
In der Anleitung zum RP6 Sensor Board ist der Arexx Roboterarm RA2-HOBBY bzw. RA2-MINI [http://www.conrad.de/ce/de/product/191534/Arexx-Mini-Roboterarm-RA2-MINI (191534)] abgebildet. Er ist dort ohne Grundgestell und Controller-Platine auf dem Sensor Board befestigt.&lt;br /&gt;
Das Sensor Board eignet sich sehr gut zur Ansteuerung der 6 Servos des Roboterarms.&lt;br /&gt;
&lt;br /&gt;
Zur Montage des RA2-MINI auf dem Sensor Board geht man so vor:&lt;br /&gt;
* Lösen der 4 Rundkopfschrauben M3x6, die die Servobodenplatte mit den Abstandbolzen M3x30 auf der Controller-Platine verbinden (siehe Anleitung zum RA2-MINI, Seite 19!)&lt;br /&gt;
* Lösen der Servobodenplatte vom Bodenservo (siehe Anleitung zum RA2-MINI, Seite 8!)&lt;br /&gt;
* Bohren der Befestigungslöcher in die Servobodenplatte:&lt;br /&gt;
** Rechts-Links Lochabstand 4,75cm, Vorn-Hinten Lochabstand 4,1cm&lt;br /&gt;
** Ungefähre Lage der Löcher siehe Abbildung in der Anleitung zum Sensor Board, Seite 4!&lt;br /&gt;
** Markierung der Bohrlöcher auf der Rückseite der Servobodenplatte:&lt;br /&gt;
*** 1. Mit einer Hilfslinie die Hinterkante des Servoausschnitts (das ist die kürzere Kante, die näher am Rand der Bodenplatte liegt!) nach beiden Seiten verlängern&lt;br /&gt;
*** 2. Eine 2. Hilfslinie parallel zur ersten im Abstand von 1,4cm zur Mitte der Servobodenplatte hin einzeichnen&lt;br /&gt;
*** 3. Auf dieser Linie jetzt die beiden hinteren Bohrlöcher symmetrisch im Abstand von 4,75cm markieren&lt;br /&gt;
*** 4. Für die vorderen Bohrlöcher eine 3. Hilfslinie im Abstand von 4,1cm parallel zur 2. Linie einzeichnen&lt;br /&gt;
*** 5. Auf dieser Linie die beiden vorderen Bohrlöcher symmetrisch im Abstand von 4,75cm markieren&lt;br /&gt;
*** 6. Kontrolle: Die 4 markierten Bohrlochpositionen bilden ein Rechteck mit 4,1cm seitlicher und 4,75cm vorderer/hinterer Kantenlänge&lt;br /&gt;
** Bohren der 4 Löcher (D = 3,2mm) in die Servobodenplatte&lt;br /&gt;
* Befestigen des Bodenservos auf der Servobodenplatte (siehe Anleitung zum RA2-MINI, Seite 8!)&lt;br /&gt;
* Anbringen des Roboterarms auf dem Sensor Board mit 4 Abstandbolzen M3 (L = 30..50mm) und passenden Schrauben/Muttern&lt;br /&gt;
&lt;br /&gt;
Die Servo-Steckbuchsen werden dann ''in der selben Reihenfolge (S1..S6) wie vorher auf der Controller-Platine des Roboterarms'' auf die Stiftleisten SERVO_1 bis SERVO_6 des Sensor Boards gesteckt.&lt;br /&gt;
'''Man sollte unbedingt einen separaten Akku für die Servos auf dem Sensor Board benutzen!'''&lt;br /&gt;
&lt;br /&gt;
====Grafik-Display====&lt;br /&gt;
Ob es mal ein Grafik-Display für das RP6 Sensor Board geben wird, ist ''pure Spekulation''. Allerdings gibt es zwei Hinweise darauf, dass eine solche Hardware-Ergänzung kommen könnte:&lt;br /&gt;
* 1. Der vorbereitete Anschluss für eine [[RP6_Sensor_Board_und_Xtra_Module#Display-Hintergrundbeleuchtung|Display-Hintergrundbeleuchtung]]&lt;br /&gt;
* 2. Die 4 Befestigungslöcher in der Mitte des Sensor Boards&lt;br /&gt;
Wir werden sehen ...&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==RP6 Xtra Module==&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_Xtra_module.JPG|RP6 Xtra module|right|500px]]&lt;br /&gt;
&lt;br /&gt;
Von den '''AREXX RP6 Xtra Modulen''' sind bei [http://www.conrad.de/ce/ CONRAD] für den RP6v2 erhältlich:&lt;br /&gt;
* Arexx [[RP6_Sensor_Board_und_Xtra_Module#I2C_GPS_Empf.C3.A4nger_JM3-GPS|I2C GPS Empfänger JM3-GPS]] ([http://www.conrad.de/ce/de/product/1082385/Arexx-IC-GPS-Empfaenger-JM3-GPS 1082385] AUSVERKAUFT!)&lt;br /&gt;
* Arexx [[RP6_Sensor_Board_und_Xtra_Module#Gyro_Modul_JM3-GYRO|Gyro Modul JM3-GYRO]] ([http://www.conrad.de/ce/de/product/1082386/Arexx-Gyro-Modul-JM3-GYRO 1082386] AUSVERKAUFT!)&lt;br /&gt;
* Arexx [[RP6_Sensor_Board_und_Xtra_Module#3D_Accelerometer_Modul_JM3-3DA|3D Accelerometer Modul JM3-3DA]] ([http://www.conrad.de/ce/de/product/1082387/Arexx-3D-Accelerometer-Modul-JM3-3DA 1082387] AUSVERKAUFT!)&lt;br /&gt;
* Arexx [[RP6_Sensor_Board_und_Xtra_Module#BHT_Modul_JM3-BHT31|BHT Modul JM3-BHT31]] ([http://www.conrad.de/ce/de/product/1302995/Arexx-Asuro-xTend-BHT-JM3-BHT31 1302995] AUSVERKAUFT!)&lt;br /&gt;
&lt;br /&gt;
===I2C GPS Empfänger JM3-GPS===&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_I2C_GPS_Empfänger.JPG|RP6 I2C GPS Empfänger|thumb]]&lt;br /&gt;
&lt;br /&gt;
(Laut Online-Katalog der Firma CONRAD!)&lt;br /&gt;
&lt;br /&gt;
''&amp;quot;Universelles GPS-I²C-Bus Modul für RP6 Roboter. Der GPS Empfänger stellt die NMEA-0183 Datensätze GGA, RMC, GSA und VTG in den veschiedenen Registern zur Verfügung. Damit ist eine einfache Weiterverarbeitung möglich.&amp;quot;''&lt;br /&gt;
&lt;br /&gt;
Aktuell (Oktober 2017) ist der I2C GPS Empfänger bei CONRAD ausverkauft.&lt;br /&gt;
&lt;br /&gt;
====Beschreibung====&lt;br /&gt;
Der I2C GPS Empfänger ist eine kleine (38 x 23 mm) Zusatzplatine (RP6 Xtra Modul), die direkt auf das [[RP6_Sensor_Board_und_Xtra_Module#RP6_Sensor_Board_2|RP6 Sensor Board]] aufgesteckt werden kann. Sie kann aber auch überall eingesetzt werden, wo eine stabilisierte 5V Versorgungsspannung und ein 5V-I2C-Bus bis 400 kHz zur Verfügung steht.&lt;br /&gt;
&lt;br /&gt;
Die Platine ist bestückt mit dem &amp;quot;Fastrax GPS antenna module&amp;quot; [https://www.u-blox.com/de/positioning-antennas/gnss-antenna-modules/uc530.html UC530]. Als Backup-Batterie dient eine wieder aufladbare Lithium-Batterie ([http://www.farnell.com/datasheets/321180.pdf MS621FE]). Zur Kommunikation zwischen dem UC530 und dem I2C-Bus ist ein [http://www.atmel.com/Images/Atmel-8303-8-bit-AVR-Microcontroller-tinyAVR-ATtiny1634_Datasheet.pdf ATtiny1634] an Bord, der auch die Auswertung des [http://de.wikipedia.org/wiki/NMEA_0183 NMEA Protokolls] übernimmt. Die 3,3 V Versorgungsspannung wird auf der Platine durch einen Spannungsregler ([http://www.mouser.com/ds/2/405/lm3480-316799.pdf LM3480IM3-3.3]) erzeugt. Über den I2C-Bus können folgende Daten der NMEA-0183 Datensätze GGA, RMC, GSA und VTG auf einfache Weise gelesen werden:&lt;br /&gt;
&lt;br /&gt;
* Geograf. Breite&lt;br /&gt;
* Geograf. Länge&lt;br /&gt;
* GPS Status&lt;br /&gt;
* HDOP&lt;br /&gt;
* Satellitenzahl&lt;br /&gt;
* Kurs&lt;br /&gt;
* Geschwindigkeit&lt;br /&gt;
* Höhe&lt;br /&gt;
* UTC-Zeit&lt;br /&gt;
* Datum&lt;br /&gt;
* PDOP&lt;br /&gt;
* VDOP&lt;br /&gt;
* Satellit 1..12&lt;br /&gt;
&lt;br /&gt;
Der ATtiny1634 ist natürlich vorprogrammiert, kann aber über eine vorbereitete 6-polige ISP-Schnittstelle auf der Platine auch umprogrammiert werden.&lt;br /&gt;
&lt;br /&gt;
'''Lieferumfang'''&lt;br /&gt;
* I2C GPS Empfänger&lt;br /&gt;
* CD mit Anleitung und Software-Beispielen.&lt;br /&gt;
&lt;br /&gt;
====Technische Daten====&lt;br /&gt;
* Versorgungsspannung: 5,0 V +/- 5%&lt;br /&gt;
* Stromverbrauch: &amp;lt;= 20 mA (typ.)&lt;br /&gt;
* I2C-Bus Geschwindigkeit: &amp;lt;= 400 kHz&lt;br /&gt;
* GPS Antenne: eingebaut&lt;br /&gt;
* Backup Batterie: Lithium, im Betrieb wieder aufladbar&lt;br /&gt;
* Temperatur Bereich: -10 bis 65 °C&lt;br /&gt;
* Form Faktor: 38 x 23 mm&lt;br /&gt;
* Gewicht: ca. 6 g&lt;br /&gt;
* Empfänger Spezifikationen (UC530):&lt;br /&gt;
** Empfänger: GPS L1 C/A-Code, SPS&lt;br /&gt;
** Kanäle: 66/22 (Suche/Track)&lt;br /&gt;
** Tracking Empfindlichkeit: -165 dBm typ.&lt;br /&gt;
** Navigations Empfindlichkeit: -148 dbm typ (Kaltstart)&lt;br /&gt;
** Update Rate: 1 Sek.&lt;br /&gt;
** Positions Genauigkeit:&lt;br /&gt;
*** 3,0m (67%) typ. horizontal&lt;br /&gt;
*** 5,0m (67%) typ. vertikal&lt;br /&gt;
*** 0,02 m/s (50%) typ. Geschwindigkeit&lt;br /&gt;
** Zeit bis zum ersten Fix: typ. 31 Sek.&lt;br /&gt;
** Protokoll: NMEA-0183 Rev. 3.01&lt;br /&gt;
&lt;br /&gt;
====Anschluss-Schema====&lt;br /&gt;
Belegung des 9-poligen Anschluss-Steckers (K1) siehe in [[RP6_Sensor_Board_und_Xtra_Module#I2C-MODULE|dieser]] Tabelle!&lt;br /&gt;
&lt;br /&gt;
====Umbau-Optionen====&lt;br /&gt;
Wenn man den ATtiny1634 selbst programmieren will, muss man Stiftleisten auf die Platine löten.&lt;br /&gt;
&lt;br /&gt;
Man braucht dazu: &lt;br /&gt;
* 2-reihige Stiftleiste RM 2,54mm (z.B. 2x40-polig 741306) &lt;br /&gt;
&lt;br /&gt;
Man trennt von der 2-reihigen Stiftleiste 2x3 Kontakte ab und lötet sie auf die Punkte &amp;quot;ISP6&amp;quot;.&lt;br /&gt;
Mit einem ISP-Programmer kann dann eine neue Firmware geflasht werden. Die aktuelle Firmware des ATtiny1634 (Version 1.2) wird als .HEX mitgeliefert, leider ohne Source-Code.&lt;br /&gt;
&lt;br /&gt;
Vorsicht: Dabei kann der Prozessor im schlimmsten Fall nicht mehr ansprechbar sein oder der GPS Empfänger UC530 beschädigt werden. Man sollte diesen Umbau und die ISP-Programmierung nur machen, wenn man genau weiß, was man macht! &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Gyro Modul JM3-GYRO===&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_Gyro_Modul.JPG|RP6 Gyro Modul|right|200px]]&lt;br /&gt;
&lt;br /&gt;
(Laut Online-Katalog der Firma CONRAD!)&lt;br /&gt;
&lt;br /&gt;
''&amp;quot;Das universelle Gyro-Sensor Modul für RP6, RP6 V2, RP6 ATMEGA32 und das RP6 V2 Control M256 Wifi-Kit ist ideal zur Erkennung der Blockierung des Roboters in seiner Drehbewegung, sowie der Stabilisierung der Geradeausfahrt.&amp;quot;''&lt;br /&gt;
&lt;br /&gt;
Aktuell (April 2019) ist das Gyro Modul bei CONRAD ausverkauft. &lt;br /&gt;
&lt;br /&gt;
====Beschreibung====&lt;br /&gt;
Das Gyro Modul ist eine kleine (19 x 17 mm) Zusatzplatine (RP6 Xtra Modul), die im RP6-System genutzt werden kann. Es gibt zwar keinen direkt passenden &amp;quot;Steckplatz&amp;quot; auf einer der Microcontroller-Plattformen (RP6v2, M32, M128, M256 Wifi), jedoch ist der Anschluß einfach:&lt;br /&gt;
Benötigt werden +5V und GND, sowie ein freier ADC-Kanal, der bis 5V messen kann. Damit kann das Gyro Modul sehr universell eingesetzt werden. Es misst die Drehrate um die Z-Achse (Hochachse oder Yaw).&lt;br /&gt;
&lt;br /&gt;
Die Platine ist bestückt mit dem analogen Gyro-Sensor [http://www.st.com/web/en/resource/technical/document/datasheet/CD00254111.pdf LY330ALH], dessen Ausgangsspannung durch zwei OP-Amps ([http://www.ti.com.cn/cn/lit/ds/symlink/lm321.pdf LM321], [http://www.produktinfo.conrad.com/datenblaetter/00000-24999/001072615-da-01-en-IC_AMP_PREC_LMP7731MF_NOPB_SOT_23_5_TID.pdf LMP7731MF]) in Ruhe bei 2,5 V liegt. Höhere Ausgangsspannungen (bis 5 V) bedeuten eine Drehgeschwindigkeit nach LINKS, niedrigere (bis 0 V) eine Drehgeschwindigkeit nach RECHTS. Die 3,3 V Versorgungsspannung des LY330ALH wird auf der Platine durch einen Spannungsregler ([http://www.mouser.com/ds/2/405/lm3480-316799.pdf LM3480IM3-3.3]) erzeugt.&lt;br /&gt;
&lt;br /&gt;
'''Lieferumfang'''&lt;br /&gt;
* Gyro Modul&lt;br /&gt;
* CD mit Anleitung und Software-Beispielen.&lt;br /&gt;
&lt;br /&gt;
====Technische Daten====&lt;br /&gt;
&lt;br /&gt;
* VDD: 5,0 V +/- 5%&lt;br /&gt;
* Vout(0): 2,5 V +/- 2% (ohne Bewegung)&lt;br /&gt;
* Vout: Vout(0) + 10mV / dps +/- 2%&lt;br /&gt;
* Messbereich: ca. 200 dps max.&lt;br /&gt;
&lt;br /&gt;
====Anschluss-Schema====&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_Gyro_Modul_SP.JPG|RP6 Gyro Modul - Anschluss-Schema]]&lt;br /&gt;
&lt;br /&gt;
====Umbau-Optionen====&lt;br /&gt;
Am Gyro Modul gibt es nichts umzubauen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===3D Accelerometer Modul JM3-3DA===&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_3D_Accelerometer_Modul.JPG|RP6 3D Accelerometer Modul|right|105px]]&lt;br /&gt;
&lt;br /&gt;
(Laut Online-Katalog der Firma CONRAD!)&lt;br /&gt;
&lt;br /&gt;
''&amp;quot;Universeller 3-Achsen Beschleunigungssensor für RP6, RP6 V2, RP6 ATMEGA32 und das RP6 V2 Control M256 WIFI-Kit. Ideal zur Winkelmessung (Neigung-, Kipp-Winkel) und vieles mehr.&amp;quot;''&lt;br /&gt;
&lt;br /&gt;
Seit Mai 2020 ist das 3D Accelerometer Modul bei CONRAD ausverkauft.&lt;br /&gt;
&lt;br /&gt;
====Beschreibung====&lt;br /&gt;
&lt;br /&gt;
Das 3D Accelerometer Modul ist eine kleine (15 x 10 mm) Zusatzplatine (RP6 Xtra Modul), die direkt auf den EEPROM-Sockel (IC5) der Zusatzplatine [[RP6#RP6_CONTROL_M32_Platine|RP6 CONTROL M32]] gesteckt und über den SPI-Bus angesteuert werden kann. Das Accelerometer Modul kann aber auch mit allen Microcontroller-Plattformen betrieben werden, die eine stabilisierte 5V-Versorgungsspannung und einen SPI- oder I2C-Bus bieten.&lt;br /&gt;
&lt;br /&gt;
Die Platine ist bestückt mit dem 3D Beschleunigungs-Sensor [http://www.farnell.com/datasheets/1691680.pdf LIS302DLH]. Die 3,3 V Versorgungsspannung des LIS302DLH wird auf der Platine durch einen Spannungsregler ([http://www.mouser.com/ds/2/405/lm3480-316799.pdf LM3480IM3-3.3]) erzeugt.&lt;br /&gt;
&lt;br /&gt;
'''Lieferumfang'''&lt;br /&gt;
* 3D Accelerometer Modul&lt;br /&gt;
* CD mit Anleitung und Software-Beispielen.&lt;br /&gt;
&lt;br /&gt;
====Technische Daten====&lt;br /&gt;
&lt;br /&gt;
* VDD: 5,0 V +/- 5%&lt;br /&gt;
* Messbereiche: +-2 g, +-4 g, +-8 g&lt;br /&gt;
* Datenausgabe: 16 Bit&lt;br /&gt;
* Schnittstellen: I2C, SPI&lt;br /&gt;
&lt;br /&gt;
====Anschluss-Schema====&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_3D_Accelerometer_Modul_SP.JPG|RP6 3D Accelerometer Modul - Anschluss-Schema|350px]]&lt;br /&gt;
&lt;br /&gt;
====Umbau-Optionen====&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_3D_Accelerometer_Modul_M32.JPG|RP6 3D Accelerometer Modul auf der M32|right|500px]]&lt;br /&gt;
&lt;br /&gt;
'''Will man das Modul auf der M32 einsetzen, muss man auf dem 3D Accelerometer Modul die Widerstände R2 und R3 (falls vorhanden!) auslöten (siehe Anleitung zum Modul, Seiten 4/5!)''' und einen IC-Sockel an Position IC5 und einen Kondensator an Position C19 auf der M32 einlöten, siehe [[RP6#Zweites_SPI-EEPROM|hier]]!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die Abbildung rechts zeigt das 3D Accelerometer Modul auf der M32.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===BHT Modul JM3-BHT31===&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_BHT_Modul.PNG|RP6 BHT Modul|right|203px]]&lt;br /&gt;
&lt;br /&gt;
Dieses [http://jm3-engineering.com/sensors.htm BHT Modul] zur Messung von Luftdruck, Luftfeuchte und Temperatur war für das Ende des 3. Quartals 2014 angekündigt und ist nun ab dem 22.01.2015 lieferbar.&lt;br /&gt;
&lt;br /&gt;
(Laut Online-Katalog der Firma CONRAD!)&lt;br /&gt;
&lt;br /&gt;
''&amp;quot;Ein Luftdruck-, rel. Luftfeuchtigkeits- und Temperatursensor Modul für vielfältige Anwendungen. Es kann direkt in den Asuro Expansion-Port auf dem Asuro xTend Bord eingesteckt werden. Das Asuro Modul kann mit den anderen erhältlichen Modulen (Kompass/Gyro und RTC kombiniert werden (Stack-up)). Außerdem kann es auch auf dem RP6 Sensor Bord in dem I2C Modulsteckplatz verwendet werden. Das Sensor Modul verwendet den hochauflösenden Drucksensor-Chip MS5607-02BA und den Luftfeuchtigkeitssensor HTU21D von MEAS Switzerland mit I2C Bus Interface. Der barometrische Drucksensor ist für Höhenmesser und Variometer optimiert und hat eine Auflösung von 20cm. Der relative Luftfeuchtigkeits- und Temperatursensor bietet zuverlässige und genaue Daten, welche sich auch besonders für Wetterstations-Informationen eignen.&amp;quot;''&lt;br /&gt;
&lt;br /&gt;
Aktuell (April 2019) ist das BHT Modul bei CONRAD ausverkauft. &lt;br /&gt;
&lt;br /&gt;
====Beschreibung====&lt;br /&gt;
Das BHT Modul ist eine kleine (24 x 14 mm) Zusatzplatine (ASURO xTend bzw. RP6 Xtra Modul), die direkt auf das [[RP6_Sensor_Board_und_Xtra_Module#RP6_Sensor_Board_2|RP6 Sensor Board]] aufgesteckt werden kann. Sie kann auch auf dem [http://www.conrad.de/ce/de/product/1302085/Arexx-Asuro-xTend-Board-JM3-AXT3 Arexx Asuro xTend Board] und überall eingesetzt werden, wo eine stabilisierte 5V Versorgungsspannung und ein I2C-Bus bis 400 kHz zur Verfügung steht.&lt;br /&gt;
&lt;br /&gt;
Die Platine ist bestückt mit dem barometrischen Drucksensor [http://www.parallax.com/sites/default/files/downloads/29124-MS5607-02BA03-Datasheet.pdf MS5607-02BA] und dem relativen Luftfeuchtigkeits- und Temperatursensor [http://www.meas-spec.com/downloads/HTU21D.pdf HTU21D]. Die 3,0 V Versorgungsspannung der Sensoren wird auf der Platine durch einen Spannungsregler ([http://www.farnell.com/datasheets/78902.pdf LP2980AIM5-3.0]) erzeugt. &lt;br /&gt;
&lt;br /&gt;
'''Lieferumfang'''&lt;br /&gt;
* BHT Modul&lt;br /&gt;
* CD mit Dokumentation&lt;br /&gt;
&lt;br /&gt;
====Technische Daten====&lt;br /&gt;
&lt;br /&gt;
* Nennspannung: 3,3 V (?)&lt;br /&gt;
* Nennstrom: 0,2 mA (typ.) &amp;lt; 1,5mA peaktyp.&lt;br /&gt;
* I2C Bus Geschwindigkeit: 400kHz max.&lt;br /&gt;
* Sensor Modul mit MS5607-02BA und HTU21D&lt;br /&gt;
* Hohe Auflösung des Sensorelements - Höhe: 20cm /- rel. Luftfeuchtigkeit: 0,04%&lt;br /&gt;
* Schneller AD-Wandler&lt;br /&gt;
* Digitaler Drucksensor (24 bit ΔΣ ADC)&lt;br /&gt;
* Luftdruckbereich: 10 bis 1200 mbar&lt;br /&gt;
* Exzellente Langzeitstabilität&lt;br /&gt;
* Unmittelbare Desaturierung&lt;br /&gt;
* Kalibrierung in der Fabrik&lt;br /&gt;
&lt;br /&gt;
====Anschluss-Schema====&lt;br /&gt;
Belegung des 9-poligen Anschluss-Steckers (K1) siehe in [[RP6_Sensor_Board_und_Xtra_Module#I2C-MODULE|dieser]] Tabelle!&lt;br /&gt;
&lt;br /&gt;
====Umbau-Optionen====&lt;br /&gt;
&lt;br /&gt;
===Xtra Module auf einer Experimentierplatine===&lt;br /&gt;
&lt;br /&gt;
Die drei bis jetzt (09/2014) erhältlichen [[RP6_Sensor_Board_und_Xtra_Module#RP6_Xtra_Module_2|Xtra Module]], die die Navigation eines Roboters ermöglichen, können problemlos im RP6-System genutzt werden,- zwei davon sogar in Form des direkten Aufsteckens auf eine der Zusatz-Platinen: Für den [[RP6_Sensor_Board_und_Xtra_Module#I2C_GPS_Empf.C3.A4nger_JM3-GPS|I2C GPS Empfänger]] gibt es einen Steckplatz auf dem [[RP6_Sensor_Board_und_Xtra_Module#RP6_Sensor_Board_2|RP6 Sensor Board]], das [[RP6_Sensor_Board_und_Xtra_Module#3D_Accelerometer_Modul_JM3-3DA|3D Accelerometer Modul]] kann auf der [[RP6#RP6_CONTROL_M32_Platine|RP6 CONTROL M32]] aufgesteckt werden.&lt;br /&gt;
&lt;br /&gt;
Natürlich können die Xtra Module auch allein (&amp;quot;stand-alone&amp;quot;) ohne RP6 Sensor Board oder RP6 CONTROL M32 betrieben werden. Dazu kann man sie z.B. auf einer [[RP6#Experimentierplatine|Experimentierplatine]] aufbauen. &lt;br /&gt;
&lt;br /&gt;
Das soll hier mit einer kurzen Aufbauanleitung demonstriert werden.&lt;br /&gt;
&lt;br /&gt;
====Schaltplan====&lt;br /&gt;
&lt;br /&gt;
Aber zunächst der Schaltplan:&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6v2_Xtra_Module_SP.jpg|RP6 Experimentierplatine für Xtra Module - Schaltplan]]&lt;br /&gt;
&lt;br /&gt;
Man erkennt die drei XTra Module, die (bis auf das Gyro Modul) an den I2C-Bus am XBUS Stecker des RP6 angeschlossen sind. Das [[RP6_Sensor_Board_und_Xtra_Module#Gyro_Modul_JM3-GYRO|Gyro Modul JM3-GYRO]] wird nicht über I2C angesteuert, sondern liefert an seinem Pin OUT ein analoges Ausgangssignal, das mit einem ADC Eingang (0..5V) gemessen werden kann.&lt;br /&gt;
&lt;br /&gt;
Der Jumper (Steckbrücke) JP1 dient zum Einstellen der I2C-Adresse des 3D Accelerometer Moduls (0x30, 0x32).&lt;br /&gt;
Mit JP2/3 wird die [[RP6_Sensor_Board_und_Xtra_Module#Optionale_Ansteuerung|Betriebsart des Gyro Moduls]] festgelegt.&lt;br /&gt;
Die Jumper JP4 bis JP9 dienen zur Verteilung von INT1, INT2 des 3D Accelerometer Moduls und des OUT Signals des Gyro Moduls auf die INT-Anschlüsse INT1..3, INTU des XBUS. Wenn man die Interrupts des 3D Accelerometer Moduls nicht nutzen will, kann man die Jumper JP4 bis JP8 auch weglassen. Mit JP9 wird das analoge Signal des Gyro Moduls an INT1 des XBUS gelegt. Dies ist nur dann sinnvoll, wenn man die Platine mit der RP6v2 Base betreibt, weil hier an INT1 ein ADC Eingang (ADC4) liegt. Bei allen anderen Plattformen des RP6-Systems (M32, CCPRO M128, M256 WiFi) muss JP9 offen bleiben.&lt;br /&gt;
&lt;br /&gt;
Mit dieser Schaltung kann man also den Beschleunigungssensor (3D Accelerometer) und den GPS Empfänger über I2C auslesen. Der Gyro wird entweder mit ADC4 der RP6v2 Base (JP9 geschlossen!) ausgewertet oder durch einen anderen ADC Eingang. Dazu kann man das Ausgangssignal des Gyros an Pin 3 der Stiftleiste ST1 abnehmen. Von dort kann es z.B. zu ADC0 oder ADC1 der RP6v2 Base oder der RP6 CONTROL M32 geführt werden oder zu einem beliebigen ADC Eingang der CCPRO M128 oder der M256 WiFi. Die Stiftleiste ST1 liegt direkt neben dem USRBUS, so dass die Verbindung auch über den USRBUS hergestellt werden kann. Dazu verbindet man Pin 3 von ST1 mit einem Pin (Y1..Y14) des USRBUS.&lt;br /&gt;
&lt;br /&gt;
====Bestückungsplan====&lt;br /&gt;
&lt;br /&gt;
So kann z.B. der Bestückungsplan mit Leiterbahnführung auf der Experimentierplatine (Exp) aussehen:&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6v2_Xtra_Module.jpg|RP6 Experimentierplatine für Xtra Module]]&lt;br /&gt;
&lt;br /&gt;
Was braucht man allgemein für den Aufbau einer Schaltung auf der Exp:&lt;br /&gt;
* Seitenschneider, Schere, Zange&lt;br /&gt;
* Lötkolben 25..30 Watt, Lötzinn&lt;br /&gt;
* Plastik 70 Schutzlack (CONRAD 813621)&lt;br /&gt;
* Isolierter Schaltdraht YV 0,20 mm² (CONRAD 606065)&lt;br /&gt;
* Versilberter CU-Draht 0,6 mm (CONRAD 605581)&lt;br /&gt;
&lt;br /&gt;
Mit dem versilberten CU-Draht stellt man auf der Unterseite (= Lötseite) der Exp Verbindungen zwischen den Bauteilen her; mit dem isolierten Schaltdraht werden Drahtbrücken auf der Oberseite (= Bestückungsseite) der Exp eingesetzt. Die Lage der Xtra Module und der Verbindungen kann man im Bestückungsplan (s.o.!) erkennen, Drahtbrücken sind rot hervorgehoben.&lt;br /&gt;
&lt;br /&gt;
Zusätzlich zu den RP6 Xtra Modulen braucht man folgende Bauteile (Bestell-Nummern von CONRAD):&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| Anzahl || Bestell-Nr. || Bauteil-Bezeichnung || Verwendung&lt;br /&gt;
|-&lt;br /&gt;
| 1 || [http://www.conrad.de/ce/de/product/191537/Arexx-RP6-Experimentierplatine?queryFromSuggest=true 191537] || RP6 Experimentierplatine || &lt;br /&gt;
|-&lt;br /&gt;
| 1 || [http://www.conrad.de/ce/de/product/189600/Praezisions-IC-Fassung-MPE-Garry-MP-083-STG-BU-Pole-8-Rastermass-762-mm-Material-Kontaktfeder-025-Gold-ueber-Nickel 189600] || Präzisions-IC-Fassung (8 Pole) || Stecksockel für Accelerometer Modul&lt;br /&gt;
|-&lt;br /&gt;
| 1 || [http://www.conrad.de/ce/de/product/741360/Praezisions-Buchsenleiste-RM-254-gerade-Pole-1-x-20-10120832-BKL-Electronic-Inhalt-1-St 741360] || Präzisions-Buchsenleiste RM 2,54mm (9 Pole) || Stecksockel für GPS Empfänger&lt;br /&gt;
|-&lt;br /&gt;
| 1 || [http://www.conrad.de/ce/de/product/741307/Praezisions-Stiftleiste-RM-254-gerade-Pole-1-x-20-10120536-BKL-Electronic-Inhalt-1-St 741307] || Präzisions-Stiftleiste RM 2,54mm (2 x 4 Pole) || Stecksockel für Gyro Modul&lt;br /&gt;
|-&lt;br /&gt;
| 1 || [http://www.conrad.de/ce/de/product/741119/Stiftleiste-RM-254-gerade-Pole-1-x-36-10120182-BKL-Electronic-Inhalt-1-St 741119] || 1-reihige Stiftleiste RM 2,54mm (ges. 36-polig) || JP1, ST1&lt;br /&gt;
|-&lt;br /&gt;
| 1 || [http://www.conrad.de/ce/de/product/741186/Doppelreihige-Stiftleiste-RM-254-gerade-Pole-2-x-8-10120514-BKL-Electronic-Inhalt-1-St 741186] || 2-reihige Stiftleiste RM 2,54mm (ges. 8-polig) || JP2..9&lt;br /&gt;
|-&lt;br /&gt;
| 1 || [http://www.conrad.de/ce/de/product/742902/Codier-Adressierbruecken-Set-Rastermass-25254-mm-10120906-BKL-Electronic-Inhalt-1-Set 742902] || Sechs Codierbrücken (aus Set) || Steckbrücken&lt;br /&gt;
|-&lt;br /&gt;
| 2 || [http://www.conrad.de/ce/de/product/453099/Keramik-Kondensator-01-F-50-V-20-B-x-H-508-mm-x-508-mm-1-St 453099] || Keramik Kondensator 100 nF || Blockkondensatoren C2, C3&lt;br /&gt;
|-&lt;br /&gt;
| 1 || [http://www.conrad.de/ce/de/product/421986/Elektrolyt-Kondensator-radial-bedrahtet-25-mm-10-F-50-V-20--x-H-5-mm-x-11-mm-Panasonic-EEUFC1H100LH-1-St 421986] || Elektrolyt Kondensator 10 uF/50 V || Spannungsstabilisierung C1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Viel Erfolg beim Aufbau!&lt;br /&gt;
&lt;br /&gt;
 Natürlich muss man nicht alle drei Sensoren aufbauen!&lt;br /&gt;
 Man kann einfach den/die Sensor/en weglassen, den/die man nicht nutzen will!&lt;br /&gt;
&lt;br /&gt;
Noch ein Wort zur Programmierung des 3D Accelerometer Moduls: Es wird auf dieser Exp über den I2C Bus angesteuert. Damit kann man die [[RP6_Sensor_Board_und_Xtra_Module#RP6_CONTROL_M32:_ACCSENS_Library|nachfolgende Library]] für dieses Modul hier NICHT benutzen!&lt;br /&gt;
&lt;br /&gt;
====Magnetfeldsensor====&lt;br /&gt;
&lt;br /&gt;
Wenn man die oben beschriebene Experimentierplatine aufgebaut hat, hat man für die Navigation eines mobilen Roboters (wie des RP6v2) schon drei benötigte Sensoren zur Verfügung: einen GPS Empfänger, einen 3D-Beschleunigungssensor und einen 1D-Gyrosensor.&lt;br /&gt;
&lt;br /&gt;
Was fehlt, ist z.B. ein '''Magnetfeldsensor (Kompass-Sensor)''', mit dem der Roboter die Himmelsrichtung feststellen kann. Einen Magnetfeldsensor gibt es (noch) nicht als Xtra Modul.&lt;br /&gt;
&lt;br /&gt;
Auf der beschriebenen Experimentierplatine ist durchaus noch Platz (z.B. in der rechten oberen Ecke) für einen Magnetfeldsensor. Geeignet ist z.B. das 2D-Kompassmodul HDMM01 ([http://www.pollin.de/shop/dt/NTM4OTgxOTk-/Bausaetze_Module/Module/Kompassmodul_HDMM01.html Pollin 94-810 164] NICHT MEHR LIEFERBAR!).&lt;br /&gt;
&lt;br /&gt;
Hier ist der um den Magnetfeldsensor erweiterte Schaltplan:&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6v2_Xtra_Module_HDMM01_SP.jpg|RP6 Experimentierplatine für Xtra Module und HDMM01 - Schaltplan]]&lt;br /&gt;
&lt;br /&gt;
Das kleine Kompassmodul dürfte doch noch einfach auf der Experimentierplatine unterzubringen sein, oder?&lt;br /&gt;
&lt;br /&gt;
Zur Programmierung des Magnetfeldsensors HDMM01 gibt es [[RP6v2_Orientierung#Kompassmodul_HDMM01_2|HIER]] Anregungen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Programmierung==&lt;br /&gt;
In diesem Abschnitt geht es um die Programmierung der Sensoren und Aktoren auf dem [[RP6_Sensor_Board_und_Xtra_Module#RP6_Sensor_Board_3|RP6 Sensor Board]] und auf den [[RP6_Sensor_Board_und_Xtra_Module#RP6_Xtra_Module_3|Xtra Modulen]]. Die hier veröffentlichte Software baut NICHT auf die mitgelieferten C++ Software-Beispiele auf der ''&amp;quot;RP6 Robot System Xtra Modules CD-ROM&amp;quot;'' auf, sondern basiert auf Eigenentwicklungen in GCC.&lt;br /&gt;
&lt;br /&gt;
===RP6 Sensor Board===&lt;br /&gt;
Das RP6 Sensor Board RP6-JM03-61 verfügt nicht über einen eigenen Microprozessor. Daher geht es hier eigentlich nicht um die Programmierung des Sensor Boards, sondern um die Programmierung der Microcontroller-Plattform, an die das Sensor Board angeschlossen ist. In der Regel wird das die RP6 M256 WiFi Zusatzplatine sein, aber auch die RP6v2 Base steuert (als I2C-Slave) in der vorgesehenen Konfiguration gewisse Funktionen des Sensor Boards an.&lt;br /&gt;
Prinzipiell kann das Sensor Board aber auch an der RP6 CONTROL M32 (''passende Library auf Anfrage beim Autor!'') oder der RP6 CCPRO M128 Zusatzplatine betrieben werden.&lt;br /&gt;
&lt;br /&gt;
====Dokumentation====&lt;br /&gt;
Die Dokumentation zum RP6 Sensor Board befindet sich auf der mitgelieferten ''&amp;quot;RP6 Robot System Xtra Modules CD-ROM&amp;quot;''.&lt;br /&gt;
&lt;br /&gt;
=====Manuals=====&lt;br /&gt;
Das Handbuch in der aktuellen Version kann [http://www.jm3-engineering.com/download/doc/ManualRP6SensorBoard_de.pdf hier] oder [http://www.produktinfo.conrad.com/datenblaetter/00000-24999/001082384-an-01-de-RP6_SENSOR_BOARD.pdf da] eingesehen werden.&lt;br /&gt;
 ACHTUNG: Das Manual enthielt in der Version 1.11 noch teils irreführende&lt;br /&gt;
          Beschreibungen, die in der aktuellen Version 1.20 vom 20.04.2014&lt;br /&gt;
          korrigiert wurden!&lt;br /&gt;
&lt;br /&gt;
====Robot-Tool====&lt;br /&gt;
[[Bild:JM3 Robot-Tool.PNG|JM3 Robot-Tool|thumb]]&lt;br /&gt;
&lt;br /&gt;
Von JM3 Engineering wurde auch ein eigenes Programm &amp;quot;'''JM3 Robot-Tool'''&amp;quot; veröffentlicht, das im RP6-System (RP6(v2) Base, CONTROL M32, M256 WiFi) anstelle des [[RP6v2#RobotLoader|RobotLoaders]] verwendet werden kann.&lt;br /&gt;
&lt;br /&gt;
Vom Robot-Tool gibt es auch eine Kommandozeilen-Version &amp;quot;'''Multiloader'''&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Befehlszeilen Optionen'''&lt;br /&gt;
 Multi Loader v1.0.1&lt;br /&gt;
 &lt;br /&gt;
 Usage:&lt;br /&gt;
 multiloader [filename] [port/hostname] [device] [-l]&lt;br /&gt;
  -l forces RP6 low speed mode.&lt;br /&gt;
 &lt;br /&gt;
 Valid devices:&lt;br /&gt;
  - Asuro&lt;br /&gt;
  - AsuroCtrl&lt;br /&gt;
  - RP6Base&lt;br /&gt;
  - RP6CtrlM32&lt;br /&gt;
  - RobotArm&lt;br /&gt;
  - RP6Wifi&lt;br /&gt;
 Attention: Device names are case-sensitive&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 Multi Loader v2.0.0&lt;br /&gt;
 &lt;br /&gt;
 Usage: multiloader [load/conf] [...]&lt;br /&gt;
 &lt;br /&gt;
         load    Load .hex file into robot.&lt;br /&gt;
                 arguments: [filename] [port/host] [device] [interface] [-l]&lt;br /&gt;
 &lt;br /&gt;
                 [interface] specifies programming interface type.&lt;br /&gt;
                 Valid interface types are UART and TCP.&lt;br /&gt;
                 -l forces RP6 low speed mode.&lt;br /&gt;
 &lt;br /&gt;
                 Valid devices:  [interfaces]&lt;br /&gt;
                 - Asuro     UART&lt;br /&gt;
                 - AsuroXT   UART&lt;br /&gt;
                 - Marvin    UART&lt;br /&gt;
                 - MarvinFW  UART&lt;br /&gt;
                 - RP6       UART&lt;br /&gt;
                 - RP6M32    UART&lt;br /&gt;
                 - RP6Wifi   TCP&lt;br /&gt;
                 - RobotArm  UART&lt;br /&gt;
 &lt;br /&gt;
                 Attention: Device names are case-sensitive&lt;br /&gt;
 &lt;br /&gt;
=====Versionen=====&lt;br /&gt;
Hier eine Tabelle der (mir) bekannten Robot-Tool Versionen:&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |rowspan=2|ZIP-Datum&lt;br /&gt;
 |colspan=2|Robot-Tool:&lt;br /&gt;
 |colspan=2|Multiloader:&lt;br /&gt;
 |rowspan=2|Bemerkungen&lt;br /&gt;
 |-&lt;br /&gt;
 |Windows&lt;br /&gt;
 |Linux&lt;br /&gt;
 |Windows&lt;br /&gt;
 |Linux&lt;br /&gt;
 |-&lt;br /&gt;
 |25.10.2014&lt;br /&gt;
 |1.0.1-1&lt;br /&gt;
 |1.0.1-1&lt;br /&gt;
 |1.0.1-1&lt;br /&gt;
 |1.0.1-1&lt;br /&gt;
 |Erste veröffentlichte Version!&lt;br /&gt;
 |-&lt;br /&gt;
 |30.01.2017&lt;br /&gt;
 |[http://www.jm3-engineering.com/download/robottool-v2.0-win32.7z 2.0]&lt;br /&gt;
 |[http://www.jm3-engineering.com/download/robottool-v2.0-linux.tar.xz 2.0]&lt;br /&gt;
 |2.0&lt;br /&gt;
 |2.0&lt;br /&gt;
 |auch für [http://www.jm3-engineering.com/download/robottool-v2.0-osx.tar.gz Mac OSX]!&lt;br /&gt;
 |-&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
'''Hinweise:'''&lt;br /&gt;
* 1. Falls die Links in der Tabelle auf die Seite &amp;quot;Neuigkeiten&amp;quot; von JM3-Engineering führen, kann man dort auf die Seite &amp;quot;Software Downloads&amp;quot; wechseln und die Dateien im Absatz &amp;quot;JM3 Robot-Tool V2.0&amp;quot; herunterladen.&lt;br /&gt;
* 2. Ab Version 2.0 ist der Multiloader in der ZIP des Robot-Tools enthalten.&lt;br /&gt;
&lt;br /&gt;
====AVR-GCC und Visual Studio====&lt;br /&gt;
Die Demo-Programme zum RP6 Sensor Board wurden mit [https://www.microsoft.com/de-de/download/details.aspx?id=5555&amp;amp;fa43d42b-25b5-4a42-fe9b-1634f450f5ee=True Microsoft Visual C++ 2010] und [http://www.jm3-engineering.com/download/avr-gcc-4.8.1-win32.7z AVR-GCC] erstellt.&lt;br /&gt;
&lt;br /&gt;
Eine Anleitung zur Installation unter Windows befindet sich [http://www.jm3-engineering.com/download/doc/avr-gcc-vs_de.pdf hier].&lt;br /&gt;
&lt;br /&gt;
====Demo-Programmme====&lt;br /&gt;
Demo-Programme und eine &amp;quot;Library&amp;quot; zum RP6 Sensor Board befinden sich auf der mitgelieferten ''&amp;quot;RP6 Robot System Xtra Modules CD-ROM&amp;quot;''. Sie können auch in der aktuellen Version im Download Bereich von [http://www.jm3-engineering.com/downloads.htm JM3 Engineering] herunter geladen werden:&lt;br /&gt;
* [http://www.jm3-engineering.com/download/RP6SensorBoardDemo_1.1-1.7z RP6 Sensor Board Demo Programm und Library]&lt;br /&gt;
* [http://www.jm3-engineering.com/download/RP6SensorBoardDemo_noVC_1.1-1.7z RP6 Sensor Board Demo Programm und Library (ohne Visual Studio Projekt Dateien)]&lt;br /&gt;
* [http://www.jm3-engineering.com/download/RP6-RC_1.0-1.7z Remote Control Software]&lt;br /&gt;
'''Hinweis:'''&lt;br /&gt;
Falls die o.g. Links auf die Seite &amp;quot;Neuigkeiten&amp;quot; von JM3-Engineering führen, kann man dort auf die Seite &amp;quot;Software Downloads&amp;quot; wechseln und die Dateien im Absatz &amp;quot;RP6 Sensor Board Library und Demo-Programm&amp;quot; herunterladen.&lt;br /&gt;
&lt;br /&gt;
====Library====&lt;br /&gt;
Eine &amp;quot;Library&amp;quot; zum RP6 Sensor Board, bestehend aus einigen Einzel-Dateien mit jeweils eigenen Versions-Nummern, befindet sich auf der mitgelieferten ''&amp;quot;RP6 Robot System Xtra Modules CD-ROM&amp;quot;''. Sie ist in der aktuellen Version auch in den Demo-Programmen enthalten ([[RP6_Sensor_Board_und_Xtra_Module#Demo-Programmme|s.o.!]]).&lt;br /&gt;
&lt;br /&gt;
=====Versionen=====&lt;br /&gt;
Hier eine Tabelle der (mir) bekannten Library Versionen für das RP6 Sensor Board:&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |ZIP-Datum *&lt;br /&gt;
 |Version&lt;br /&gt;
 |RP6SensorBoardDemo&lt;br /&gt;
 |RP6-RC&lt;br /&gt;
 |RP6M256_I2CMasterLib&lt;br /&gt;
 |RP6M256Lib&lt;br /&gt;
 |RP6I2CmasterTWI&lt;br /&gt;
 |-&lt;br /&gt;
 |09.12.2013&lt;br /&gt;
 |1.0&lt;br /&gt;
 |1.0&lt;br /&gt;
 |1.0&lt;br /&gt;
 |(1.0_24.02.12) ²&lt;br /&gt;
 |1.1_16.07.12 ²&lt;br /&gt;
 |1.1_04.09.12 ³&lt;br /&gt;
 |-&lt;br /&gt;
 |27.12.2014&lt;br /&gt;
 |1.1&lt;br /&gt;
 |1.1-1&lt;br /&gt;
 |1.0-1&lt;br /&gt;
 |Modified 02.11.14 ³&lt;br /&gt;
 |1.1.1_25.10.14 ³&lt;br /&gt;
 |1.1_04.09.12 ³&lt;br /&gt;
 |-&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
'''Zu *:''' Alternativ: Datum der Verzeichnisse (z.B. auf der ''&amp;quot;RP6 Robot System Xtra Modules CD-ROM&amp;quot;'')!&lt;br /&gt;
&lt;br /&gt;
'''Zu ²:''' Neueste Original Version der [http://rn-wissen.de/wiki/index.php/RP6v2#Versionen RP6 Library]!&lt;br /&gt;
&lt;br /&gt;
'''Zu ³:''' Modifiziert von [http://www.jm3-engineering.com/ JM3 Engineering]!&lt;br /&gt;
&lt;br /&gt;
=====Modifizierte RP6 Libraries=====&lt;br /&gt;
Von [http://www.jm3-engineering.com/ JM3 Engineering] wurden bis jetzt drei [http://rn-wissen.de/wiki/index.php/RP6v2#Versionen RP6 &amp;quot;Original&amp;quot;-Libraries] leicht modifiziert, um sie für die eigenen Programme für das RP6 Sensor Board optimal nutzen zu können.&lt;br /&gt;
In diesem Abschnitt soll kurz erwähnt werden, WAS verändert wurde.&lt;br /&gt;
 &lt;br /&gt;
======RP6M256_I2CMasterLib======&lt;br /&gt;
Die RP6M256_I2CMasterLib wurde von JM3 Engineering ab der Software Version 1.1 für das RP6 Sensor Board verändert, um sie in einer eigenen Bibliothek bestehend aus mehreren Modulen nutzen zu können. Folgendes wurde angepasst:&lt;br /&gt;
* Neue typedef unions:&lt;br /&gt;
** u_interrupt_status&lt;br /&gt;
** u_status&lt;br /&gt;
** u_drive_status&lt;br /&gt;
** u_statusLEDs&lt;br /&gt;
&lt;br /&gt;
Die modifizierte RP6M256_I2CMasterLib vom 2.11.2014 ist kompatibel zur Original-Version vom 24.02.2012.&lt;br /&gt;
&lt;br /&gt;
======RP6M256Lib======&lt;br /&gt;
Eine modifizierte Version 1.1.1 der RP6M256Lib mit Datum vom 25.10.2014 wurde von JM3 Engineering im November 2014 zusammen mit der Software Version 1.1 für das RP6 Sensor Board veröffentlicht. Sie ist kompatibel zur Version 1.1 der RP6M256Lib vom 16.07.2012 und enthält folgende Änderung:&lt;br /&gt;
* In der Datei RP6M256.h wird die Variable &amp;quot;timer&amp;quot; korrekt als &amp;quot;''extern'' volatile uint16_t timer&amp;quot; deklariert.&lt;br /&gt;
&lt;br /&gt;
======RP6I2CmasterTWI======&lt;br /&gt;
Eine erweiterte I2C Master-Library (Version 1.1) gibt es mit Datum vom 04.09.2012, veröffentlicht ab Februar 2014 von JM3 Engineering für das RP6 Sensor Board und die Xtra Module. Sie ist abwärts-kompatibel zur I2C Master-Library in der Version 1.0 vom 16.05.2007 und bietet lediglich folgende Erweiterung: &lt;br /&gt;
* Neue Funktion I2CTWI_readWordRegisters() zum Lesen von 16 Bit Registern&lt;br /&gt;
&lt;br /&gt;
====RP6 M256 WiFi: Sensor Board Library====&lt;br /&gt;
Die nachfolgende RP6M256_Sensor_BoardLib (Eigenentwicklung in GCC) dient zur Ansteuerung des Sensor Boards durch die RP6M256 WiFi.&lt;br /&gt;
&lt;br /&gt;
=====Configuration Header=====&lt;br /&gt;
Vor dem Kompilieren der Library muss eine Anpassung des Configuration Headers an die eigenen Hardware-Voraussetzungen erfolgen.&lt;br /&gt;
Dazu gibt es im Configuration Header eine Definition:&lt;br /&gt;
* USE_PD5 -&amp;gt; Die Sensor Board Funktion &amp;quot;PD5&amp;quot; steuert den TCA4311A Enable Pin (EN).&lt;br /&gt;
Im nachfolgenden Listing ist die Definition USE_PD5 NICHT aktiv (d.h. der TCA4311A Enable Pin (EN) wird vom MAX7311 I/O 1.0 Pin angesteuert!). Dies muss an die eigene Hardware angepaßt werden. Wenn &amp;quot;PD5&amp;quot; den TCA4311A Enable Pin (EN) steuern soll, muss die Zeile mit &amp;quot;USE_PD5&amp;quot; &amp;quot;aktiviert&amp;quot; werden. Dazu entfernt man &amp;quot;//&amp;quot; am Zeilenanfang:&lt;br /&gt;
 #define USE_PD5&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Bevor man Beschleunigungs-, Magnetfeldsensor und Gyroskop nutzen kann, muss man sie kalibrieren:&lt;br /&gt;
&lt;br /&gt;
* '''Accelerometer:'''&lt;br /&gt;
** Die X-Achse wird kalibriert, indem man den RP6 mit der rechten Seite nach unten hält und den Maximalwert in MAX_X_A einträgt. Dann neigt man ihn auf seine linke Seite und trägt den negativen Maximalwert in MIN_X_A ein.&lt;br /&gt;
** Die Y-Achse wird kalibriert, indem man den RP6 mit der Vorderseite nach oben hält und den Maximalwert in MAX_Y_A einträgt. Dann kippt man die Vorderseite nach unten und trägt den negativen Maximalwert in MIN_Y_A ein.&lt;br /&gt;
** Die Z-Achse wird kalibriert, indem man den RP6 normal waagerecht hält und den Maximalwert in MAX_Z_A einträgt. Dann dreht man den RP6 &amp;quot;auf den Kopf&amp;quot; und trägt den negativen Maximalwert in MIN_Z_A ein.&lt;br /&gt;
** Sollten die angezeigten Pitch- und Roll-Werte nach der Kalibrierung der Achsen und genau waagerecht stehendem Sensor bzw. RP6 vom Nullwert deutlich abweichen, kann man sie mithilfe der Definitionen OFFSET_PITCH_A und OFFSET_ROLL_A &amp;quot;nullen&amp;quot;. Die Einheit dieser Definitionen ist °.&lt;br /&gt;
 ''HINWEIS: Die internen Berechnungen werden durch diese Offset-Korrektur&lt;br /&gt;
 NICHT beeinflußt. Die Offset-Werte können also nicht dazu benutzt werden,&lt;br /&gt;
 eine Achsenabweichung zwischen Sensor und RP6 zu kompensieren!''&lt;br /&gt;
* '''Magnetometer:'''&lt;br /&gt;
** Zur Kalibrierung des Magnetfeldsensors stellt man den RP6 auf eine waagerechte Fläche. Es dürfen keine Elektrogeräte, Metallteile und stromführende Leitungen in der Nähe sein, die das Magnetfeld verändern können.&lt;br /&gt;
** Zunächst ist es möglich, die sogenannten &amp;quot;hard iron&amp;quot; Effekte auszugleichen. Dies sind feste Magnetfeldabweichungen, die durch das &amp;quot;Gerät&amp;quot; (in unserem Fall also durch den kompletten RP6) verursacht werden, in oder auf dem der Sensor angebracht ist. Mit den Definitionen OFFSET_X_M, OFFSET_Y_M und OFFSET_Z_M können diese Effekte ausgeglichen werden. Diese Kalibrierung wird hier aktuell (noch) nicht beschrieben, so dass man die Werte für diese Definitionen zunächst bei 0 belassen sollte.&lt;br /&gt;
** Die X-Achse und Y-Achse wird kalibriert, indem man den RP6 langsam mehrfach um die eigene (Z-)Achse dreht und die Maximalwerte in MAX_X_M und MAX_Y_M einträgt. Die negativen Maximalwerte trägt man in MIN_X_M und MIN_Y_M ein.&lt;br /&gt;
** Die Z-Achse wird kalibriert, indem man den RP6 auf die rechte oder linke Seite legt, ihn dann langsam mehrfach auf der Stelle (um seine Y-Achse) dreht und den Maximalwert in MAX_Z_M und den negativen Maximalwert in MIN_Z_M einträgt.&lt;br /&gt;
** Mit der Definition DECLINATION_M kann man zur Verbesserung der Genauigkeit der Richtungsangaben den magnetischen Deklinationswert [°] (d.h. die magnetische Missweisung) am aktuellen Standort festlegen. [http://www.ngdc.noaa.gov/geomag-web/#declination Hier] befindet sich ein &amp;quot;Deklinations-Rechner&amp;quot;, mit dem man den Deklinationswert für den eigenen Standort ermitteln kann. &lt;br /&gt;
** Wenn man den Temperaturwert des LSM303DLHC nutzen will, muss man die Definition GET_TEMP_M aktivieren (Standard!). Den Temperaturwert kann man noch eichen, indem man die Definition OFFSET_TEMP_M anpasst. Die Einheit von OFFSET_TEMP_M ist °C.&lt;br /&gt;
* '''Gyroskop:'''&lt;br /&gt;
** In Ruhelage des RP6 wird ein ADC-Wert von ca. 511 angezeigt, wenn die Definition ADCVAL_ZERORATE_LEVEL im Configuration Header (RP6M256_Sensor_Board.h) vor der ersten Kompilierung zunächst auf 0 gesetzt wurde. Die Kalibrierung des Gyroskops ist abgeschlossen, nachdem man den in Ruhelage angezeigten ADC-Wert als ADCVAL_ZERORATE_LEVEL eingetragen hat.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''HINWEISE ZUR KALIBRIERUNG:'''&lt;br /&gt;
* Das Demo-Programm ist nicht sehr gut geeignet, um die Kalibrierungen durchzuführen.&lt;br /&gt;
* Man sollte mit einem eigenen kurzen ''Kalibrierungs-Programm'' nur die Rohwerte der jeweiligen X-, Y- und Z-Achse z.B. zweimal pro Sekunde ausgeben.&lt;br /&gt;
* Die Rohwerte sind in Variablen x_axis..., y_axis..., z_axis... enthalten. Da die Rohwerte in den Funktionen normalizeLSM303DLHC_A() bzw. normalizeLSM303DLHC_M() ggf. verändert werden, müssen die Rohwerte VOR Durchlaufen dieser Funktionen ausgegeben werden.&lt;br /&gt;
* '''Ohne eine sorgfältige Kalibrierung wird die Kompass-Funktion (insbesondere die neigungskompensierte Ausgabe der Himmelsrichtung) nicht funktionieren!'''&lt;br /&gt;
* Nach dem Eintragen der Kalibrierungs-Werte in den Configuration Header (RP6M256_Sensor_Board.h) muss die ''Demo'' neu kompiliert werden. Vorher sollten die Compiler-Hilfsdateien der Sensor Board-Library (Dateiendungen .st und .o) im Programmverzeichnis gelöscht werden.&lt;br /&gt;
* Getestet wird das Ergebnis der Kalibrierung, indem die Ausgabewerte (Temperatur, Pitch, Roll, Heading, Neigungs-kompensiertes Heading) der ''Demo'' überprüft werden. Dazu kann man Vergleichswerte (Thermometer, Winkelmesser für Pitch, Roll und externer Kompass für Heading) heranziehen.&lt;br /&gt;
* Wenn die Ausgabewerte nicht den Erwartungen entsprechen, muss die Kalibrierung wiederholt werden.&lt;br /&gt;
* Eine Kalibrierung der Sensoren ist nur zuverlässig, solange die Position des jeweiligen Sensors und seine komplette Hardware-Umgebung (also der RP6 mit allen seinen Teilen!) nicht verändert wird. Gibt es trotzdem Veränderungen, z.B. durch weitere Aufbauten auf dem RP6, müssen diese Sensoren neu kalibriert werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Datei: RP6M256_Sensor_Board.h&lt;br /&gt;
&amp;lt;pre&amp;gt;/* ****************************************************************************&lt;br /&gt;
 *                           _______________________&lt;br /&gt;
 *                           \| RP6  ROBOT SYSTEM |/&lt;br /&gt;
 *                            \_-_-_-_-_-_-_-_-_-_/           &amp;gt;&amp;gt;&amp;gt; RP6 M256 WIFI&lt;br /&gt;
 * ----------------------------------------------------------------------------&lt;br /&gt;
 * ----------------------------- [c]2014 - Dirk -------------------------------&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * File: RP6M256_Sensor_Board.h&lt;br /&gt;
 * Version: 1.1&lt;br /&gt;
 * Target: RP6 M256 WIFI - ATMEGA2560 @16.00MHz&lt;br /&gt;
 * Author(s): Dirk&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Description:&lt;br /&gt;
 * Configuration header file for new RP6 Sensor Board library.&lt;br /&gt;
 * The RP6 Sensor Board (CONRAD 1082384) is connected to the RP6M256 with the&lt;br /&gt;
 * two plugs:&lt;br /&gt;
 *   Sensor Board &amp;lt;---&amp;gt; RP6M256&lt;br /&gt;
 *   --------------------------------&lt;br /&gt;
 *   I/O (K17)    &amp;lt;---&amp;gt; IO_PWM/T0/T1&lt;br /&gt;
 *   ADC (K18)    &amp;lt;---&amp;gt; ADC_IO2/CMP&lt;br /&gt;
 * The RP6 Sensor Board function &amp;quot;PD5&amp;quot; (IC6: EN) is now connected to RP6M256&lt;br /&gt;
 * OC1B (PB6) and the RP6 Sensor Board function &amp;quot;ADC4&amp;quot; (SHARP_R) to RP6M256&lt;br /&gt;
 * ADC9 (PK1).&lt;br /&gt;
 * On the RP6 Sensor Board the functions &amp;quot;ADC0&amp;quot;, &amp;quot;ADC1&amp;quot;, &amp;quot;PWR&amp;quot; and &amp;quot;ADC4&amp;quot; are&lt;br /&gt;
 * connected to the USRBUS. The USRBUS may be wired on the RP6 mainboard like&lt;br /&gt;
 * this:&lt;br /&gt;
 *   Function : Sensor Board - USRBUS: * &amp;lt;---&amp;gt; RP6 Mainboard&lt;br /&gt;
 *   --------------------------------------------------------&lt;br /&gt;
 *   SHARP_F  : &amp;quot;ADC0&amp;quot;       - Pin 1     &amp;lt;---&amp;gt; ADC0: Pin 3&lt;br /&gt;
 *   GYRO     : &amp;quot;ADC1&amp;quot;       - Pin 2     &amp;lt;---&amp;gt; ADC1: Pin 3&lt;br /&gt;
 *   PWRON ²  : &amp;quot;PWR&amp;quot;        - Pin 3     &amp;lt;---&amp;gt; PWR&lt;br /&gt;
 *   SHARP_R  : &amp;quot;ADC4&amp;quot;       - Pin 5     &amp;lt;---&amp;gt; Not connected!&lt;br /&gt;
 * At *) It is also possible not to use the USRBUS, but to connect the RP6&lt;br /&gt;
 *       Sensor Board directly to the RP6 mainboard with 3 single cables.&lt;br /&gt;
 * At ²) See RP6 manual &amp;quot;4.6.8. Stromsparfunktionen&amp;quot;! &lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
#ifndef RP6M256_SENSOR_BOARD_H&lt;br /&gt;
#define RP6M256_SENSOR_BOARD_H&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// RP6 Sensor Board hardwired components:&lt;br /&gt;
// - I2C I/O Port Expander (MAX7311)&lt;br /&gt;
// - I2C Real Time Clock (RTC DS1339)&lt;br /&gt;
// - I2C Temperature Sensor (LM75B)&lt;br /&gt;
// - I2C Servo Controller (PCA9685)&lt;br /&gt;
// - I2C LED Driver (TCA6507)&lt;br /&gt;
// - I2C 3D Magnetometer &amp;amp; Accelerometer (LSM303DLHC)&lt;br /&gt;
// - Analog Yaw-Rate Gyroscope (LY330ALH)&lt;br /&gt;
// - Hot Swappable 2-Wire Bus Buffer (TCA4311A)&lt;br /&gt;
// - Button&lt;br /&gt;
// - Status LED&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C I/O Port Expander (MAX7311):&lt;br /&gt;
#define I2C_SENSOR_PORTEXP_ADR			0x40	// Default&lt;br /&gt;
&lt;br /&gt;
// Interrupt I/O portpin definitions (RP6M256):&lt;br /&gt;
#define IO_SENSOR_INT1_IN				INT1_PI12 // PCINT12 PJ3  XBUS Pin 8&lt;br /&gt;
#define IO_SENSOR_INT1_DDR				DDRJ&lt;br /&gt;
#define IO_SENSOR_INT1_PIN				PINJ&lt;br /&gt;
#define IO_SENSOR_INT1_PORT				PORTJ&lt;br /&gt;
#define IO_SENSOR_INT2_IN				INT2_PI15 // PCINT15 PJ6  XBUS Pin 11&lt;br /&gt;
#define IO_SENSOR_INT2_DDR				DDRJ&lt;br /&gt;
#define IO_SENSOR_INT2_PIN				PINJ&lt;br /&gt;
#define IO_SENSOR_INT2_PORT				PORTJ&lt;br /&gt;
#define IO_SENSOR_INT3_IN				INT3_PI14 // PCINT14 PJ5  XBUS Pin 9&lt;br /&gt;
#define IO_SENSOR_INT3_DDR				DDRJ&lt;br /&gt;
#define IO_SENSOR_INT3_PIN				PINJ&lt;br /&gt;
#define IO_SENSOR_INT3_PORT				PORTJ&lt;br /&gt;
#define IO_SENSOR_INTU_IN				INTU_PI13 // PCINT13 PJ4  XBUS Pin 7&lt;br /&gt;
#define IO_SENSOR_INTU_DDR				DDRJ&lt;br /&gt;
#define IO_SENSOR_INTU_PIN				PINJ&lt;br /&gt;
#define IO_SENSOR_INTU_PORT				PORTJ&lt;br /&gt;
&lt;br /&gt;
// I/O PORT pin numbers:&lt;br /&gt;
#define PIN7							7&lt;br /&gt;
#define PIN6							6&lt;br /&gt;
#define PIN5							5&lt;br /&gt;
#define PIN4							4&lt;br /&gt;
#define PIN3							3&lt;br /&gt;
#define PIN2							2&lt;br /&gt;
#define PIN1							1&lt;br /&gt;
#define PIN0							0&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Real Time Clock (RTC DS1339):&lt;br /&gt;
#define I2C_SENSOR_RTC_ADR				0xd0	// Default&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Temperature Sensor (LM75B):&lt;br /&gt;
#define I2C_SENSOR_TEMP_ADR				0x90	// Default&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Servo Controller (PCA9685):&lt;br /&gt;
#define I2C_SENSOR_SERVO_ADR			0x88	// Default&lt;br /&gt;
&lt;br /&gt;
// Servo and PWM channels:&lt;br /&gt;
#define CH_SERVO_1						16		// At K6: 1  &amp;quot;SERVO_1&amp;quot;&lt;br /&gt;
#define CH_SERVO_2						15		// At K11: 1 &amp;quot;SERVO_2&amp;quot;&lt;br /&gt;
#define CH_SERVO_3						13		// At K29: 1 &amp;quot;SERVO_3&amp;quot;&lt;br /&gt;
#define CH_SERVO_4						14		// At K30: 1 &amp;quot;SERVO_4&amp;quot;&lt;br /&gt;
#define CH_SERVO_5						11		// At K31: 1 &amp;quot;SERVO_5&amp;quot;&lt;br /&gt;
#define CH_SERVO_6						12		// At K32: 1 &amp;quot;SERVO_6&amp;quot;&lt;br /&gt;
#define CH_SERVO_7						9		// At K33: 1 &amp;quot;SERVO_7&amp;quot;&lt;br /&gt;
#define CH_SERVO_8						10		// At K34: 1 &amp;quot;SERVO_8&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#define CH_PWM_OUT_1					1		// At K12: 1 &amp;quot;PWM_OUT&amp;quot;&lt;br /&gt;
#define CH_PWM_OUT_2					2		// At K12: 2&lt;br /&gt;
#define CH_PWM_OUT_3					3		// At K12: 3&lt;br /&gt;
#define CH_PWM_OUT_4					4		// At K12: 4&lt;br /&gt;
#define CH_PWM_OUT_5					5		// At K12: 5&lt;br /&gt;
#define CH_PWM_OUT_6					6		// At K12: 6&lt;br /&gt;
#define CH_PWM_OUT_7					7		// At K12: 7&lt;br /&gt;
#define CH_PWM_OUT_8					8		// At K12: 8&lt;br /&gt;
&lt;br /&gt;
// Servo left touch (LT), right touch (RT), middle position (MP) constants:&lt;br /&gt;
// (Hints: - Servo impulse length [ms] = Servo position value / 204.8&lt;br /&gt;
//           (Formula only valid for a PWM of 50 Hz!)&lt;br /&gt;
//         - Min. servo impulse (0,7 ms) = Servo position 143&lt;br /&gt;
//         - Mid. servo impulse (1,5 ms) = Servo position 307&lt;br /&gt;
//         - Max. servo impulse (2,3 ms) = Servo position 471&lt;br /&gt;
//         - !!! You should NOT use servo position values &amp;lt; 143 or &amp;gt; 471 !!!)&lt;br /&gt;
#define SERVO1_LT						205		// Servo impulse ~1ms&lt;br /&gt;
#define SERVO1_RT						410		// Servo impulse ~2ms&lt;br /&gt;
#define SERVO1_MP						((SERVO1_RT - SERVO1_LT) / 2 + SERVO1_LT)&lt;br /&gt;
#define SERVO2_LT						205&lt;br /&gt;
#define SERVO2_RT						410&lt;br /&gt;
#define SERVO2_MP						((SERVO2_RT - SERVO2_LT) / 2 + SERVO2_LT)&lt;br /&gt;
#define SERVO3_LT						205&lt;br /&gt;
#define SERVO3_RT						410&lt;br /&gt;
#define SERVO3_MP						((SERVO3_RT - SERVO3_LT) / 2 + SERVO3_LT)&lt;br /&gt;
#define SERVO4_LT						205&lt;br /&gt;
#define SERVO4_RT						410&lt;br /&gt;
#define SERVO4_MP						((SERVO4_RT - SERVO4_LT) / 2 + SERVO4_LT)&lt;br /&gt;
#define SERVO5_LT						205&lt;br /&gt;
#define SERVO5_RT						410&lt;br /&gt;
#define SERVO5_MP						((SERVO5_RT - SERVO5_LT) / 2 + SERVO5_LT)&lt;br /&gt;
#define SERVO6_LT						205&lt;br /&gt;
#define SERVO6_RT						410&lt;br /&gt;
#define SERVO6_MP						((SERVO6_RT - SERVO6_LT) / 2 + SERVO6_LT)&lt;br /&gt;
#define SERVO7_LT						205&lt;br /&gt;
#define SERVO7_RT						410&lt;br /&gt;
#define SERVO7_MP						((SERVO7_RT - SERVO7_LT) / 2 + SERVO7_LT)&lt;br /&gt;
#define SERVO8_LT						205&lt;br /&gt;
#define SERVO8_RT						410&lt;br /&gt;
#define SERVO8_MP						((SERVO8_RT - SERVO8_LT) / 2 + SERVO8_LT)&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C LED Driver (TCA6507):&lt;br /&gt;
#define I2C_SENSOR_LEDDRIVER_ADR		0x8a	// Default&lt;br /&gt;
&lt;br /&gt;
// LED numbers:&lt;br /&gt;
#define SB_LED0							0		// At K7&lt;br /&gt;
#define DISPLAY_BACKLIGHT				0		// Display background light&lt;br /&gt;
#define SB_LED1							1		// At K4&lt;br /&gt;
#define SB_LED2							2		// At K2&lt;br /&gt;
#define SB_LED3							3		// At K10: 1&lt;br /&gt;
#define BACKLIGHT_R						3		// Right backlight&lt;br /&gt;
#define SB_LED4							4		// At K10: 2&lt;br /&gt;
#define BACKLIGHT_L						4		// Left backlight&lt;br /&gt;
#define SB_LED5							5		// White LED (D3)&lt;br /&gt;
#define HEADLIGHT_R						5		// Right headlight&lt;br /&gt;
#define SB_LED6							6		// White LED (D1)&lt;br /&gt;
#define HEADLIGHT_L						6		// Left headlight&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C 3D Magnetometer &amp;amp; Accelerometer (LSM303DLHC):&lt;br /&gt;
&lt;br /&gt;
// LSM303DLHC accelerometer:&lt;br /&gt;
#define I2C_SENSOR_LSM303DLHC_A_ADR 	0x32	// Default&lt;br /&gt;
&lt;br /&gt;
// LSM303DLHC accelerometer calibration data:&lt;br /&gt;
#define MAX_X_A						1037		// Max. X-axis value&lt;br /&gt;
#define MIN_X_A						-1030		// Min. X-axis value&lt;br /&gt;
#define MAX_Y_A						1030		// Max. Y-axis value&lt;br /&gt;
#define MIN_Y_A						-1019		// Min. Y-axis value&lt;br /&gt;
#define MAX_Z_A						1062		// Max. Z-axis value&lt;br /&gt;
#define MIN_Z_A						-1056		// Min. Z-axis value&lt;br /&gt;
#define OFFSET_PITCH_A				0.0			// Offset Pitch [°]&lt;br /&gt;
#define OFFSET_ROLL_A				0.0			// Offset Roll [°]&lt;br /&gt;
&lt;br /&gt;
// LSM303DLHC magnetometer:&lt;br /&gt;
#define I2C_SENSOR_LSM303DLHC_M_ADR		0x3c	// Default&lt;br /&gt;
&lt;br /&gt;
// LSM303DLHC magnetometer calibration data:&lt;br /&gt;
#define MAX_X_M						-111.0		// Max. X-axis value&lt;br /&gt;
#define MIN_X_M						-634.0		// Min. X-axis value&lt;br /&gt;
#define OFFSET_X_M					0			// Hard iron X-axis offset&lt;br /&gt;
#define MAX_Y_M						297.0		// Max. Y-axis value&lt;br /&gt;
#define MIN_Y_M						-215.0		// Min. Y-axis value&lt;br /&gt;
#define OFFSET_Y_M					0			// Hard iron Y-axis offset&lt;br /&gt;
#define MAX_Z_M						183.0		// Max. Z-axis value&lt;br /&gt;
#define MIN_Z_M						-214.0		// Min. Z-axis value&lt;br /&gt;
#define OFFSET_Z_M					0			// Hard iron Z-axis offset&lt;br /&gt;
#define DECLINATION_M				0.0			// E at local position [°]&lt;br /&gt;
&lt;br /&gt;
// LSM303DLHC temperature sensor definitions:&lt;br /&gt;
#define GET_TEMP_M								// Enable temperature sensor&lt;br /&gt;
#define OFFSET_TEMP_M				0.0			// Temperature offset [°C]&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Analog Yaw-Rate Gyroscope (LY330ALH):&lt;br /&gt;
&lt;br /&gt;
// LY330ALH gyroscope:&lt;br /&gt;
#define ADC_SENSOR_LY330ALH				ADC_1	// At USRBUS: 2 (RP6BASE)&lt;br /&gt;
&lt;br /&gt;
// LY330ALH gyroscope calibration data:&lt;br /&gt;
// (Higher values [505..1023] mean an angular velocity while rotating LEFT&lt;br /&gt;
//  and lower values [503..0] while rotating RIGHT!)&lt;br /&gt;
#define ADCVAL_MINRATE					0		// Min. rate value&lt;br /&gt;
#define ADCVAL_ZERORATE_LEVEL			504		// Zero rate level&lt;br /&gt;
#define ADCVAL_MAXRATE					1023	// Max. rate value&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Hot Swappable 2-Wire Bus Buffer (TCA4311A):&lt;br /&gt;
&lt;br /&gt;
// Define USE_PD5, if you want to control the TCA4311A enable pin (EN) with&lt;br /&gt;
// the RP6 Sensor Board function &amp;quot;PD5&amp;quot;. If USE_PD5 is NOT defined (default),&lt;br /&gt;
// the TCA4311A EN pin is controlled by the MAX7311 I/O 1.0 pin.&lt;br /&gt;
// ---------------&lt;br /&gt;
//#define USE_PD5&lt;br /&gt;
// ---------------&lt;br /&gt;
&lt;br /&gt;
#define IO_SENSOR_TCA4311A_EN_IN		OC1B_PI6 // At I/O: 9 (RP6M256)&lt;br /&gt;
#define IO_SENSOR_TCA4311A_EN_DDR		DDRB&lt;br /&gt;
#define IO_SENSOR_TCA4311A_EN_PIN		PINB&lt;br /&gt;
#define IO_SENSOR_TCA4311A_EN_PORT		PORTB&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Button:&lt;br /&gt;
&lt;br /&gt;
// (Button is connected to I/O 1.7 of the MAX7311!)&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Status LED:&lt;br /&gt;
&lt;br /&gt;
// (Status LED is connected to I/O 1.6 of the MAX7311!)&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Other ADC channel definitions:&lt;br /&gt;
&lt;br /&gt;
// (Depending on connections on the RP6 Sensor Board!)&lt;br /&gt;
#define ADC_SENSOR_SHARP_F				ADC_0	// At USRBUS: 1 (RP6BASE)&lt;br /&gt;
#define ADC_SENSOR_SHARP_R				ADC_9	// At ADC: 3    (RP6M256)&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
/******************************************************************************&lt;br /&gt;
 * Additional info&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Changelog:&lt;br /&gt;
 * &lt;br /&gt;
 *  ---&amp;gt; changes are documented in the file &amp;quot;RP6M256_Sensor_BoardLib.c&amp;quot;&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=====Library Header=====&lt;br /&gt;
Datei: RP6M256_Sensor_BoardLib.h&lt;br /&gt;
&amp;lt;pre&amp;gt;/* ****************************************************************************&lt;br /&gt;
 *                           _______________________&lt;br /&gt;
 *                           \| RP6  ROBOT SYSTEM |/&lt;br /&gt;
 *                            \_-_-_-_-_-_-_-_-_-_/           &amp;gt;&amp;gt;&amp;gt; RP6 M256 WIFI&lt;br /&gt;
 * ----------------------------------------------------------------------------&lt;br /&gt;
 * ----------------------------- [c]2014 - Dirk -------------------------------&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * File: RP6M256_Sensor_BoardLib.h&lt;br /&gt;
 * Version: 1.1&lt;br /&gt;
 * Target: RP6 M256 WIFI - ATMEGA2560 @16.00MHz&lt;br /&gt;
 * Author(s): Dirk&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Description:&lt;br /&gt;
 * Header file for new RP6 Sensor Board library.&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
#ifndef RP6M256_SENSOR_BOARDLIB_H&lt;br /&gt;
#define RP6M256_SENSOR_BOARDLIB_H&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// RP6 Sensor Board hardwired components:&lt;br /&gt;
// - I2C I/O Port Expander (MAX7311)&lt;br /&gt;
// - I2C Real Time Clock (RTC DS1339)&lt;br /&gt;
// - I2C Temperature Sensor (LM75B)&lt;br /&gt;
// - I2C Servo Controller (PCA9685)&lt;br /&gt;
// - I2C LED Driver (TCA6507)&lt;br /&gt;
// - I2C 3D Magnetometer &amp;amp; Accelerometer (LSM303DLHC)&lt;br /&gt;
// - Analog Yaw-Rate Gyroscope (LY330ALH)&lt;br /&gt;
// - Hot Swappable 2-Wire Bus Buffer (TCA4311A)&lt;br /&gt;
// - Button&lt;br /&gt;
// - Status LED&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Includes:&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6M256Lib.h&amp;quot;&lt;br /&gt;
#include &amp;quot;RP6I2CmasterTWI.h&amp;quot;&lt;br /&gt;
#include &amp;quot;RP6M256_Sensor_Board.h&amp;quot;&lt;br /&gt;
#include &amp;lt;math.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// RP6M256_I2CMasterLib definitions:&lt;br /&gt;
&lt;br /&gt;
#ifndef I2C_RP6_BASE_ADR&lt;br /&gt;
	#define I2C_RP6_BASE_ADR			10&lt;br /&gt;
#endif&lt;br /&gt;
#ifndef I2C_REG_ADC_ADC0_L&lt;br /&gt;
	#define I2C_REG_ADC_ADC0_L			23&lt;br /&gt;
#endif&lt;br /&gt;
#ifndef I2C_REG_ADC_ADC1_L&lt;br /&gt;
	#define I2C_REG_ADC_ADC1_L			25&lt;br /&gt;
#endif&lt;br /&gt;
#ifndef CMD_POWER_OFF&lt;br /&gt;
	#define CMD_POWER_OFF				0&lt;br /&gt;
#endif&lt;br /&gt;
#ifndef CMD_POWER_ON&lt;br /&gt;
	#define CMD_POWER_ON				1&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C I/O Port Expander (MAX7311):&lt;br /&gt;
&lt;br /&gt;
// Registers:&lt;br /&gt;
#define MAX7311_INPUT_PORT1				0&lt;br /&gt;
#define MAX7311_INPUT_PORT2				1&lt;br /&gt;
#define MAX7311_OUTPUT_PORT1			2&lt;br /&gt;
#define MAX7311_OUTPUT_PORT2			3&lt;br /&gt;
#define MAX7311_PORT1_POL_INV			4&lt;br /&gt;
#define MAX7311_PORT2_POL_INV			5&lt;br /&gt;
#define MAX7311_PORT1_CONFIG			6&lt;br /&gt;
#define MAX7311_PORT2_CONFIG			7&lt;br /&gt;
#define MAX7311_TIMEOUT					8&lt;br /&gt;
&lt;br /&gt;
// Port 1 configuration register bitmasks:&lt;br /&gt;
#define ST_GYRO							(1 &amp;lt;&amp;lt; PIN7)	// I/O 0.7 (Output)&lt;br /&gt;
#define PD_GYRO							(1 &amp;lt;&amp;lt; PIN6)	// I/O 0.6 (Output)&lt;br /&gt;
#define PWR_CAM_IF						(1 &amp;lt;&amp;lt; PIN5)	// I/O 0.5 (Output)&lt;br /&gt;
#define EN_LEDDRIV						(1 &amp;lt;&amp;lt; PIN4)	// I/O 0.4 (Output)&lt;br /&gt;
#define RDY_BUSBUFF						(1 &amp;lt;&amp;lt; PIN3)	// I/O 0.3 (Input)&lt;br /&gt;
#define PWR_SHARP_R						(1 &amp;lt;&amp;lt; PIN2)	// I/O 0.2 (Output)&lt;br /&gt;
#define PWR_SHARP_F						(1 &amp;lt;&amp;lt; PIN1)	// I/O 0.1 (Output)&lt;br /&gt;
#define PWR_I2C							(1 &amp;lt;&amp;lt; PIN0)	// I/O 0.0 (Output)&lt;br /&gt;
&lt;br /&gt;
// Port 2 configuration register bitmasks:&lt;br /&gt;
#define IO2_I2C							(1 &amp;lt;&amp;lt; PIN7)	// I/O 1.7 (Input)&lt;br /&gt;
#define IO1_I2C							(1 &amp;lt;&amp;lt; PIN6)	// I/O 1.6 (Output)&lt;br /&gt;
#define DRDY_MAGACC						(1 &amp;lt;&amp;lt; PIN5)	// I/O 1.5 (Input)&lt;br /&gt;
#define PWR_SERVO						(1 &amp;lt;&amp;lt; PIN4)	// I/O 1.4 (Output)&lt;br /&gt;
#define OEN_SERVO						(1 &amp;lt;&amp;lt; PIN3)	// I/O 1.3 (Output)&lt;br /&gt;
#define IO_K19_1						(1 &amp;lt;&amp;lt; PIN2)	// I/O 1.2 (Input)&lt;br /&gt;
#define IO_K19_3						(1 &amp;lt;&amp;lt; PIN1)	// I/O 1.1 (Input)&lt;br /&gt;
#define EN_BUSBUFF						(1 &amp;lt;&amp;lt; PIN0)	// I/O 1.0 (Output)&lt;br /&gt;
&lt;br /&gt;
// Port 1 &amp;amp; 2 register 16-bit bitmasks:&lt;br /&gt;
// (CONFIG: 1 = Input, 0 = Output)&lt;br /&gt;
#define MAX7311_CONFIG_DEFAULT			0b1010011000001000&lt;br /&gt;
#define MAX7311_CONFIG_USE_PD5			0b1010011100001000&lt;br /&gt;
// (OUTPUT: 1 = High/True, 0 = Low/False)&lt;br /&gt;
#define MAX7311_OUTPUT_DEFAULT			0b0100000100010000&lt;br /&gt;
#define MAX7311_OUTPUT_FULLPOWER		0b0001000100110111&lt;br /&gt;
#define MAX7311_OUTPUT_SHUTDOWN			0b0100100011000000&lt;br /&gt;
&lt;br /&gt;
// Safe configuration:&lt;br /&gt;
// (Ensures if activated, that I/Os 0.3, 1.5 and 1.7 cannot be configured&lt;br /&gt;
//  as output with the function MAX7311_write_cfg(). This may protect the&lt;br /&gt;
//  RP6 Sensor Board from hardware damage.)&lt;br /&gt;
// -------------------&lt;br /&gt;
#define SAFE_CONFIG&lt;br /&gt;
// -------------------&lt;br /&gt;
&lt;br /&gt;
typedef union {&lt;br /&gt;
 	uint8_t byte;&lt;br /&gt;
	struct {&lt;br /&gt;
		unsigned int1   :1;				// INT1  XBUS Pin 8&lt;br /&gt;
		unsigned int2   :1;				// INT2  XBUS Pin 11&lt;br /&gt;
		unsigned int3   :1;				// INT3  XBUS Pin 9&lt;br /&gt;
		unsigned intu   :1;				// INTU  XBUS Pin 7&lt;br /&gt;
		unsigned unused :4;&lt;br /&gt;
	};&lt;br /&gt;
	struct {&lt;br /&gt;
		unsigned magacc1     :1;		// INT1: LSM303DLHC INT1&lt;br /&gt;
		unsigned portexp     :1;		// INT2: MAX7311 INT_N&lt;br /&gt;
		unsigned magacc2_rtc :1;		// INT3: LSM303DLHC INT2&lt;br /&gt;
		unsigned noname      :5;		//       OR DS1339 SQW/INT_N&lt;br /&gt;
	};&lt;br /&gt;
} interrupt_RP6SBstatus_t;&lt;br /&gt;
extern interrupt_RP6SBstatus_t interrupt_RP6SBstatus;&lt;br /&gt;
&lt;br /&gt;
typedef union {&lt;br /&gt;
	uint16_t word;&lt;br /&gt;
	struct {&lt;br /&gt;
		unsigned pwr_i2c     :1;		// I/O 0.0 (Output)&lt;br /&gt;
		unsigned pwr_sharp_f :1;		// I/O 0.1 (Output)&lt;br /&gt;
		unsigned pwr_sharp_r :1;		// I/O 0.2 (Output)&lt;br /&gt;
		unsigned rdy_busbuff :1;		// I/O 0.3 (Input)&lt;br /&gt;
		unsigned en_leddriv  :1;		// I/O 0.4 (Output)&lt;br /&gt;
		unsigned pwr_cam_if  :1;		// I/O 0.5 (Output)&lt;br /&gt;
		unsigned pd_gyro     :1;		// I/O 0.6 (Output)&lt;br /&gt;
		unsigned st_gyro     :1;		// I/O 0.7 (Output)&lt;br /&gt;
		unsigned en_busbuff  :1;		// I/O 1.0 (Output)&lt;br /&gt;
		unsigned io_k19_3    :1;		// I/O 1.1 (Input)&lt;br /&gt;
		unsigned io_k19_1    :1;		// I/O 1.2 (Input)&lt;br /&gt;
		unsigned oen_servo   :1;		// I/O 1.3 (Output)&lt;br /&gt;
		unsigned pwr_servo   :1;		// I/O 1.4 (Output)&lt;br /&gt;
		unsigned drdy_magacc :1;		// I/O 1.5 (Input)&lt;br /&gt;
		unsigned io1_i2c     :1;		// I/O 1.6 (Output)&lt;br /&gt;
		unsigned io2_i2c     :1;		// I/O 1.7 (Input)&lt;br /&gt;
	};&lt;br /&gt;
} max7311IOs_t;&lt;br /&gt;
extern max7311IOs_t inport;&lt;br /&gt;
extern max7311IOs_t outport;&lt;br /&gt;
extern uint8_t readyBusbuff;&lt;br /&gt;
extern uint8_t pressedButton;&lt;br /&gt;
&lt;br /&gt;
void MAX7311_write_cfg(uint16_t);&lt;br /&gt;
void task_checkINTs(void);&lt;br /&gt;
void task_RP6SensorBoard(void);&lt;br /&gt;
void MAX7311_update(void);&lt;br /&gt;
void MAX7311_write(uint16_t);&lt;br /&gt;
void MAX7311_init(void);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Real Time Clock (RTC DS1339):&lt;br /&gt;
&lt;br /&gt;
// Registers:&lt;br /&gt;
#define DS1339_SECONDS					0&lt;br /&gt;
#define DS1339_MINUTES					1&lt;br /&gt;
#define DS1339_HOURS					2&lt;br /&gt;
#define DS1339_DAY						3&lt;br /&gt;
#define DS1339_DATE						4&lt;br /&gt;
#define DS1339_MONTH_CENTURY			5&lt;br /&gt;
#define DS1339_YEAR						6&lt;br /&gt;
#define DS1339_ALARM1_SECONDS			7&lt;br /&gt;
#define DS1339_ALARM1_MINUTES			8&lt;br /&gt;
#define DS1339_ALARM1_HOURS				9&lt;br /&gt;
#define DS1339_ALARM1_DAY_DATE			10&lt;br /&gt;
#define DS1339_ALARM2_MINUTES			11&lt;br /&gt;
#define DS1339_ALARM2_HOURS				12&lt;br /&gt;
#define DS1339_ALARM2_DAY_DATE			13&lt;br /&gt;
#define DS1339_CONTROL					14&lt;br /&gt;
#define DS1339_STATUS					15&lt;br /&gt;
#define DS1339_TRICKLE_CHARGER			16&lt;br /&gt;
&lt;br /&gt;
// Control register bitmasks:&lt;br /&gt;
#define DS1339_CONTROL_DEFAULT			0		// Power on default&lt;br /&gt;
#define DS1339_CONTROL_A1IE				1&lt;br /&gt;
#define DS1339_CONTROL_A2IE				2&lt;br /&gt;
#define DS1339_CONTROL_INTCN			4&lt;br /&gt;
#define DS1339_CONTROL_RS1				8&lt;br /&gt;
#define DS1339_CONTROL_RS2				16&lt;br /&gt;
#define DS1339_CONTROL_BBSQI			32&lt;br /&gt;
#define DS1339_CONTROL_EOSC				128&lt;br /&gt;
&lt;br /&gt;
// Trickle Charger register bitmasks:&lt;br /&gt;
#define DS1339_TRICKLE_CHARGER_DEFAULT	0b10101010 // One diode, 2k resistor&lt;br /&gt;
#define DS1339_TRICKLE_CHARGER_ROUT0	1&lt;br /&gt;
#define DS1339_TRICKLE_CHARGER_ROUT1	2&lt;br /&gt;
#define DS1339_TRICKLE_CHARGER_DS0		4&lt;br /&gt;
#define DS1339_TRICKLE_CHARGER_DS1		8&lt;br /&gt;
#define DS1339_TRICKLE_CHARGER_TCS0		16&lt;br /&gt;
#define DS1339_TRICKLE_CHARGER_TCS1		32&lt;br /&gt;
#define DS1339_TRICKLE_CHARGER_TCS2		64&lt;br /&gt;
#define DS1339_TRICKLE_CHARGER_TCS3		128&lt;br /&gt;
&lt;br /&gt;
enum RTCWEEKDAYS {&lt;br /&gt;
	R_MO = 1, R_TU, R_WE, R_TH, R_FR, R_SA, R_SU&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
typedef struct {&lt;br /&gt;
	uint16_t         year;				// Year&lt;br /&gt;
	uint8_t          month;				// Month   [1..12]&lt;br /&gt;
	enum RTCWEEKDAYS weekday;			// Weekday [1..7 = R_MO..R_SU]&lt;br /&gt;
	uint8_t          day;				// Day     [1..31]&lt;br /&gt;
} rtcdate_t;&lt;br /&gt;
rtcdate_t rtc_date;&lt;br /&gt;
&lt;br /&gt;
typedef struct {&lt;br /&gt;
	uint8_t dst;						// Daylight-saving-time (time zone)&lt;br /&gt;
	uint8_t hour;						// Hour    [0..23]&lt;br /&gt;
	uint8_t minute;						// Minute  [0..59]&lt;br /&gt;
	uint8_t second;						// Second  [0..59]&lt;br /&gt;
} rtctime_t;&lt;br /&gt;
rtctime_t rtc_time;&lt;br /&gt;
&lt;br /&gt;
uint8_t BCD2DEC(uint8_t);&lt;br /&gt;
uint8_t DEC2BCD(uint8_t);&lt;br /&gt;
void DS1339_write_cfg(uint8_t);&lt;br /&gt;
void DS1339_init(void);&lt;br /&gt;
#define CALC_DST						// Time zone will be calculated&lt;br /&gt;
void DS1339_read(void);&lt;br /&gt;
void DS1339_write(void);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Temperature Sensor (LM75B):&lt;br /&gt;
&lt;br /&gt;
// Registers:&lt;br /&gt;
#define LM75B_TEMP						0&lt;br /&gt;
#define LM75B_CONF						1&lt;br /&gt;
#define LM75B_THYST						2&lt;br /&gt;
#define LM75B_TOS						3&lt;br /&gt;
&lt;br /&gt;
// Conf register bitmasks:&lt;br /&gt;
#define LM75B_CONF_DEFAULT				0		// Power on default&lt;br /&gt;
#define LM75B_CONF_SHUTDOWN				1&lt;br /&gt;
#define LM75B_CONF_OS_COMP_INT			2&lt;br /&gt;
#define LM75B_CONF_OS_POL				4&lt;br /&gt;
#define LM75B_CONF_OS_F_QUE0			8&lt;br /&gt;
#define LM75B_CONF_OS_F_QUE1			16&lt;br /&gt;
&lt;br /&gt;
extern double temperature;&lt;br /&gt;
&lt;br /&gt;
void LM75B_write_cfg(uint8_t);&lt;br /&gt;
#define LM75B_shutdown() {LM75B_write_cfg(LM75B_CONF_SHUTDOWN);}&lt;br /&gt;
#define LM75B_init() {LM75B_write_cfg(LM75B_CONF_DEFAULT);}&lt;br /&gt;
extern uint8_t temperature_low;&lt;br /&gt;
extern uint8_t temperature_high;&lt;br /&gt;
#define getTemperatureHigh() (temperature_high)&lt;br /&gt;
#define getTemperatureLow() (temperature_low)&lt;br /&gt;
void LM75B_read(void);&lt;br /&gt;
double LM75B_calculate(void);&lt;br /&gt;
double LM75B_measure(void);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Servo Controller (PCA9685):&lt;br /&gt;
&lt;br /&gt;
// Registers:&lt;br /&gt;
#define PCA9685_MODE1					0&lt;br /&gt;
#define PCA9685_MODE2					1&lt;br /&gt;
#define PCA9685_SUBADR1					2&lt;br /&gt;
#define PCA9685_SUBADR2					3&lt;br /&gt;
#define PCA9685_SUBADR3					4&lt;br /&gt;
#define PCA9685_ALLCALLADR				5&lt;br /&gt;
#define PCA9685_LED0_ON_L				6&lt;br /&gt;
#define PCA9685_LED0_ON_H				7&lt;br /&gt;
#define PCA9685_LED0_OFF_L				8&lt;br /&gt;
#define PCA9685_LED0_OFF_H				9&lt;br /&gt;
#define PCA9685_LED1_ON_L				10&lt;br /&gt;
#define PCA9685_LED1_ON_H				11&lt;br /&gt;
#define PCA9685_LED1_OFF_L				12&lt;br /&gt;
#define PCA9685_LED1_OFF_H				13&lt;br /&gt;
#define PCA9685_LED2_ON_L				14&lt;br /&gt;
#define PCA9685_LED2_ON_H				15&lt;br /&gt;
#define PCA9685_LED2_OFF_L				16&lt;br /&gt;
#define PCA9685_LED2_OFF_H				17&lt;br /&gt;
#define PCA9685_LED3_ON_L				18&lt;br /&gt;
#define PCA9685_LED3_ON_H				19&lt;br /&gt;
#define PCA9685_LED3_OFF_L				20&lt;br /&gt;
#define PCA9685_LED3_OFF_H				21&lt;br /&gt;
#define PCA9685_LED4_ON_L				22&lt;br /&gt;
#define PCA9685_LED4_ON_H				23&lt;br /&gt;
#define PCA9685_LED4_OFF_L				24&lt;br /&gt;
#define PCA9685_LED4_OFF_H				25&lt;br /&gt;
#define PCA9685_LED5_ON_L				26&lt;br /&gt;
#define PCA9685_LED5_ON_H				27&lt;br /&gt;
#define PCA9685_LED5_OFF_L				28&lt;br /&gt;
#define PCA9685_LED5_OFF_H				29&lt;br /&gt;
#define PCA9685_LED6_ON_L				30&lt;br /&gt;
#define PCA9685_LED6_ON_H				31&lt;br /&gt;
#define PCA9685_LED6_OFF_L				32&lt;br /&gt;
#define PCA9685_LED6_OFF_H				33&lt;br /&gt;
#define PCA9685_LED7_ON_L				34&lt;br /&gt;
#define PCA9685_LED7_ON_H				35&lt;br /&gt;
#define PCA9685_LED7_OFF_L				36&lt;br /&gt;
#define PCA9685_LED7_OFF_H				37&lt;br /&gt;
#define PCA9685_LED8_ON_L				38&lt;br /&gt;
#define PCA9685_LED8_ON_H				39&lt;br /&gt;
#define PCA9685_LED8_OFF_L				40&lt;br /&gt;
#define PCA9685_LED8_OFF_H				41&lt;br /&gt;
#define PCA9685_LED9_ON_L				42&lt;br /&gt;
#define PCA9685_LED9_ON_H				43&lt;br /&gt;
#define PCA9685_LED9_OFF_L				44&lt;br /&gt;
#define PCA9685_LED9_OFF_H				45&lt;br /&gt;
#define PCA9685_LED10_ON_L				46&lt;br /&gt;
#define PCA9685_LED10_ON_H				47&lt;br /&gt;
#define PCA9685_LED10_OFF_L				48&lt;br /&gt;
#define PCA9685_LED10_OFF_H				49&lt;br /&gt;
#define PCA9685_LED11_ON_L				50&lt;br /&gt;
#define PCA9685_LED11_ON_H				51&lt;br /&gt;
#define PCA9685_LED11_OFF_L				52&lt;br /&gt;
#define PCA9685_LED11_OFF_H				53&lt;br /&gt;
#define PCA9685_LED12_ON_L				54&lt;br /&gt;
#define PCA9685_LED12_ON_H				55&lt;br /&gt;
#define PCA9685_LED12_OFF_L				56&lt;br /&gt;
#define PCA9685_LED12_OFF_H				57&lt;br /&gt;
#define PCA9685_LED13_ON_L				58&lt;br /&gt;
#define PCA9685_LED13_ON_H				59&lt;br /&gt;
#define PCA9685_LED13_OFF_L				60&lt;br /&gt;
#define PCA9685_LED13_OFF_H				61&lt;br /&gt;
#define PCA9685_LED14_ON_L				62&lt;br /&gt;
#define PCA9685_LED14_ON_H				63&lt;br /&gt;
#define PCA9685_LED14_OFF_L				64&lt;br /&gt;
#define PCA9685_LED14_OFF_H				65&lt;br /&gt;
#define PCA9685_LED15_ON_L				66&lt;br /&gt;
#define PCA9685_LED15_ON_H				67&lt;br /&gt;
#define PCA9685_LED15_OFF_L				68&lt;br /&gt;
#define PCA9685_LED15_OFF_H				69&lt;br /&gt;
#define PCA9685_ALL_LED_ON_L			250&lt;br /&gt;
#define PCA9685_ALL_LED_ON_H			251&lt;br /&gt;
#define PCA9685_ALL_LED_OFF_L			252&lt;br /&gt;
#define PCA9685_ALL_LED_OFF_H			253&lt;br /&gt;
#define PCA9685_PRE_SCALE				254&lt;br /&gt;
#define PCA9685_TESTMODE				255&lt;br /&gt;
&lt;br /&gt;
// Mode1 register bitmasks:&lt;br /&gt;
#define PCA9685_MODE1_ALLCALL			1&lt;br /&gt;
#define PCA9685_MODE1_SUB3				2&lt;br /&gt;
#define PCA9685_MODE1_SUB2				4&lt;br /&gt;
#define PCA9685_MODE1_SUB1				8&lt;br /&gt;
#define PCA9685_MODE1_SLEEP				16&lt;br /&gt;
#define PCA9685_MODE1_AI				32&lt;br /&gt;
#define PCA9685_MODE1_EXTCLK			64&lt;br /&gt;
#define PCA9685_MODE1_RESTART			128&lt;br /&gt;
&lt;br /&gt;
// Mode2 register bitmasks:&lt;br /&gt;
#define PCA9685_MODE2_OUTNE01_DEFAULT	0&lt;br /&gt;
#define PCA9685_MODE2_OUTDRV			4&lt;br /&gt;
#define PCA9685_MODE2_OCH				8&lt;br /&gt;
#define PCA9685_MODE2_INVRT				16&lt;br /&gt;
&lt;br /&gt;
#define F_PCA9685						25000000.0	// Int. Clock: 25 MHz&lt;br /&gt;
&lt;br /&gt;
void PCA9685_init(uint16_t);&lt;br /&gt;
#define initServo(__FREQ__) {PCA9685_init(__FREQ__);}&lt;br /&gt;
uint8_t servo(uint8_t);&lt;br /&gt;
void PCA9685_set(uint8_t, uint16_t);&lt;br /&gt;
#define setServo(__SERVO__,__POS__) {PCA9685_set(servo(__SERVO__),__POS__);}&lt;br /&gt;
void PCA9685_shutdown(void);&lt;br /&gt;
void PCA9685_restart(void);&lt;br /&gt;
void setServoPower(uint8_t);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C LED Driver (TCA6507):&lt;br /&gt;
&lt;br /&gt;
// Registers:&lt;br /&gt;
#define TCA6507_SELECT0				0&lt;br /&gt;
#define TCA6507_SELECT1				1&lt;br /&gt;
#define TCA6507_SELECT2				2&lt;br /&gt;
#define TCA6507_FADEON_TIME			3&lt;br /&gt;
#define TCA6507_FULLYON_TIME		4&lt;br /&gt;
#define TCA6507_FADEOFF_TIME		5&lt;br /&gt;
#define TCA6507_1ST_FULLYOFF_TIME	6&lt;br /&gt;
#define TCA6507_2ND_FULLYOFF_TIME	7&lt;br /&gt;
#define TCA6507_MAXIMUM_INTENSITY	8&lt;br /&gt;
#define TCA6507_MASTER_INTENSITY	9&lt;br /&gt;
#define TCA6507_INITIALIZATION		10&lt;br /&gt;
&lt;br /&gt;
// Output states:&lt;br /&gt;
#define STATE_OFF					0&lt;br /&gt;
#define STATE_PWM0					2&lt;br /&gt;
#define STATE_PWM1					3&lt;br /&gt;
#define STATE_ON					4&lt;br /&gt;
#define STATE_MINT					5&lt;br /&gt;
#define STATE_BLINK0				6&lt;br /&gt;
#define STATE_BLINK1				7&lt;br /&gt;
&lt;br /&gt;
extern uint8_t select[3];&lt;br /&gt;
&lt;br /&gt;
void TCA6507_write_cfg(uint8_t, uint8_t);&lt;br /&gt;
void TCA6507_update(void);&lt;br /&gt;
void TCA6507_set(uint8_t, uint8_t);&lt;br /&gt;
#define setLED(__LED__,__STATE__) {TCA6507_set(__LED__,__STATE__);}&lt;br /&gt;
void TCA6507_shutdown(void);&lt;br /&gt;
void TCA6507_restart(void);&lt;br /&gt;
void TCA6507_init(void);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C 3D Magnetometer &amp;amp; Accelerometer (LSM303DLHC):&lt;br /&gt;
&lt;br /&gt;
// LSM303DLHC accelerometer internal registers:&lt;br /&gt;
#define CTRL_REG1_A					0x20&lt;br /&gt;
#define CTRL_REG2_A					0x21&lt;br /&gt;
#define CTRL_REG3_A					0x22&lt;br /&gt;
#define CTRL_REG4_A					0x23&lt;br /&gt;
#define CTRL_REG5_A					0x24&lt;br /&gt;
#define CTRL_REG6_A					0x25&lt;br /&gt;
#define REFERENCE_A					0x26&lt;br /&gt;
#define STATUS_REG_A				0x27&lt;br /&gt;
#define OUT_X_L_A					0x28&lt;br /&gt;
#define OUT_X_H_A					0x29&lt;br /&gt;
#define OUT_Y_L_A					0x2a&lt;br /&gt;
#define OUT_Y_H_A					0x2b&lt;br /&gt;
#define OUT_Z_L_A					0x2c&lt;br /&gt;
#define OUT_Z_H_A					0x2d&lt;br /&gt;
#define FIFO_CTRL_REG_A				0x2e&lt;br /&gt;
#define FIFO_SRC_REG_A				0x2f&lt;br /&gt;
#define INT1_CFG_A					0x30&lt;br /&gt;
#define INT1_SOURCE_A				0x31&lt;br /&gt;
#define INT1_THS_A					0x32&lt;br /&gt;
#define INT1_DURATION_A				0x33&lt;br /&gt;
#define INT2_CFG_A					0x34&lt;br /&gt;
#define INT2_SOURCE_A				0x35&lt;br /&gt;
#define INT2_THS_A					0x36&lt;br /&gt;
#define INT2_DURATION_A				0x37&lt;br /&gt;
#define CLICK_CFG_A					0x38&lt;br /&gt;
#define CLICK_SRC_A					0x39&lt;br /&gt;
#define CLICK_THS_A					0x3a&lt;br /&gt;
#define TIME_LIMIT_A				0x3b&lt;br /&gt;
#define TIME_LATENCY_A				0x3c&lt;br /&gt;
#define TIME_WINDOW_A				0x3d&lt;br /&gt;
&lt;br /&gt;
// LSM303DLHC accelerometer register settings:&lt;br /&gt;
#define CTRL_REG1_A_10HZ			0b00100111	// 10Hz &amp;amp; all axes enable&lt;br /&gt;
#define CTRL_REG1_A_50HZ			0b01000111	// 50Hz &amp;amp; all axes enable&lt;br /&gt;
#define CTRL_REG4_A_DEFAULT			0b00000000	// Default (Normal mode)&lt;br /&gt;
#define CTRL_REG4_A_HR				0b00001000	// HR output mode&lt;br /&gt;
&lt;br /&gt;
// LSM303DLHC magnetometer internal registers:&lt;br /&gt;
#define CRA_REG_M					0x00&lt;br /&gt;
#define CRB_REG_M					0x01&lt;br /&gt;
#define MR_REG_M					0x02&lt;br /&gt;
#define OUT_X_H_M					0x03&lt;br /&gt;
#define OUT_X_L_M					0x04&lt;br /&gt;
#define OUT_Z_H_M					0x05&lt;br /&gt;
#define OUT_Z_L_M					0x06&lt;br /&gt;
#define OUT_Y_H_M					0x07&lt;br /&gt;
#define OUT_Y_L_M					0x08&lt;br /&gt;
#define SR_REG_MG					0x09&lt;br /&gt;
#define IRA_REG_M					0x0a&lt;br /&gt;
#define IRB_REG_M					0x0b&lt;br /&gt;
#define IRC_REG_M					0x0c&lt;br /&gt;
#define TEMP_OUT_H_M				0x31&lt;br /&gt;
#define TEMP_OUT_L_M				0x32&lt;br /&gt;
&lt;br /&gt;
// LSM303DLHC magnetometer register settings:&lt;br /&gt;
#define CRA_REG_M_15HZ				0b00010000	// Default (Data rate 15Hz)&lt;br /&gt;
#define CRA_REG_M_15HZ_T_EN			0b10010000	// 15Hz &amp;amp; temperature enable&lt;br /&gt;
#define CRB_REG_M_13GAUSS			0b00100000	// Gain +-1.3Gauss&lt;br /&gt;
#define MR_REG_M_CCM				0b00000000	// Continuous-conversion mode&lt;br /&gt;
#define MR_REG_M_SCM				0b00000001	// Single-conversion mode&lt;br /&gt;
#define MR_REG_M_SLEEP				0b00000011	// Default (Sleep-mode)&lt;br /&gt;
&lt;br /&gt;
extern int16_t x_axisa, y_axisa, z_axisa;&lt;br /&gt;
extern double pitch, roll;&lt;br /&gt;
extern double xa, ya, za;&lt;br /&gt;
extern double the, phi;&lt;br /&gt;
&lt;br /&gt;
extern int16_t x_axism, y_axism, z_axism;&lt;br /&gt;
extern int16_t headingm;&lt;br /&gt;
extern double xm, ym, zm;&lt;br /&gt;
#ifdef GET_TEMP_M&lt;br /&gt;
extern int16_t temperaturem;&lt;br /&gt;
extern double temperature_mag;&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
extern int16_t headingtc;&lt;br /&gt;
&lt;br /&gt;
void LSM303DLHC_A_init(void);&lt;br /&gt;
void readLSM303DLHC_A(void);&lt;br /&gt;
void normalizeLSM303DLHC_A(void);&lt;br /&gt;
void positionLSM303DLHC_A(void);&lt;br /&gt;
&lt;br /&gt;
void LSM303DLHC_M_init(void);&lt;br /&gt;
void readLSM303DLHC_M(void);&lt;br /&gt;
void normalizeLSM303DLHC_M(void);&lt;br /&gt;
int16_t headingLSM303DLHC_M(void);&lt;br /&gt;
&lt;br /&gt;
int16_t headingLSM303DLHC_TC(void);&lt;br /&gt;
&lt;br /&gt;
void LSM303DLHC_init(void);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Analog Yaw-Rate Gyroscope (LY330ALH):&lt;br /&gt;
&lt;br /&gt;
#define LY330ALH_MODE_NORMAL		0			// Power on default&lt;br /&gt;
#define LY330ALH_MODE_SLEEP			1&lt;br /&gt;
#define LY330ALH_MODE_SELFTEST		2&lt;br /&gt;
#define LY330ALH_MODE_POWERDOWN		3			// Shutdown mode&lt;br /&gt;
&lt;br /&gt;
extern int16_t z_axisg;&lt;br /&gt;
&lt;br /&gt;
void LY330ALH_set_mode(uint8_t);&lt;br /&gt;
uint16_t getRP6Base_ADC1(void);&lt;br /&gt;
int16_t LY330ALH_measure(void);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Hot Swappable 2-Wire Bus Buffer (TCA4311A):&lt;br /&gt;
&lt;br /&gt;
//extern uint8_t readyBusbuff;			// See &amp;quot;I2C I/O Port Expander&amp;quot; section&lt;br /&gt;
extern uint8_t errorBusbuff;&lt;br /&gt;
&lt;br /&gt;
#define getReadyBusbuff() (readyBusbuff)&lt;br /&gt;
uint8_t readReadyBusbuff(void);&lt;br /&gt;
void TCA4311A_shutdown(void);&lt;br /&gt;
void TCA4311A_reconnect(void);&lt;br /&gt;
void setRP6Base_PWR(uint8_t);&lt;br /&gt;
void setI2CModulePower(uint8_t);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Button:&lt;br /&gt;
&lt;br /&gt;
//extern uint8_t pressedButton;			// See &amp;quot;I2C I/O Port Expander&amp;quot; section&lt;br /&gt;
&lt;br /&gt;
#define getPressedButton() (pressedButton)&lt;br /&gt;
uint8_t readButton(void);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Status LED:&lt;br /&gt;
&lt;br /&gt;
void setStatusLED(uint8_t);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// RP6 Sensor Board initialisation and shutdown:&lt;br /&gt;
&lt;br /&gt;
void sensor_board_init(void);&lt;br /&gt;
void sensor_board_shutdown(void);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
/******************************************************************************&lt;br /&gt;
 * Additional info&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Changelog:&lt;br /&gt;
 * &lt;br /&gt;
 *  ---&amp;gt; changes are documented in the file &amp;quot;RP6M256_Sensor_BoardLib.c&amp;quot;&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=====Library Source=====&lt;br /&gt;
Datei: RP6M256_Sensor_BoardLib.c&lt;br /&gt;
&amp;lt;pre&amp;gt;/* ****************************************************************************&lt;br /&gt;
 *                           _______________________&lt;br /&gt;
 *                           \| RP6  ROBOT SYSTEM |/&lt;br /&gt;
 *                            \_-_-_-_-_-_-_-_-_-_/           &amp;gt;&amp;gt;&amp;gt; RP6 M256 WIFI&lt;br /&gt;
 * ----------------------------------------------------------------------------&lt;br /&gt;
 * ----------------------------- [c]2014 - Dirk -------------------------------&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * File: RP6M256_Sensor_BoardLib.c&lt;br /&gt;
 * Version: 1.1&lt;br /&gt;
 * Target: RP6 M256 WIFI - ATMEGA2560 @16.00MHz&lt;br /&gt;
 *         and a RP6 Sensor Board (CONRAD 1082384)&lt;br /&gt;
 * Author(s): Dirk&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Description:&lt;br /&gt;
 * This is our new Library that contains basic routines and functions for&lt;br /&gt;
 * accessing the hardwired components of the RP6 Sensor Board (CONRAD 1082384).&lt;br /&gt;
 * This library assumes the RP6 Sensor Board Revision 2.0 (04.07.13).&lt;br /&gt;
 *&lt;br /&gt;
 * There are more sensors and actors, that may be connected to the RP6 Sensor&lt;br /&gt;
 * Board: Many I2C components including a GPS module (CONRAD 1082385), servo&lt;br /&gt;
 *        motors, SHARP IR distance sensors, LEDs, a camera ...&lt;br /&gt;
 * This library doesn't contain functions for these sensors/actors, because&lt;br /&gt;
 * they are not HARDWIRED to the RP6 Sensor Board and may be connected&lt;br /&gt;
 * OPTIONALLY.&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// RP6 Sensor Board hardwired components:&lt;br /&gt;
// - I2C I/O Port Expander (MAX7311)&lt;br /&gt;
// - I2C Real Time Clock (RTC DS1339)&lt;br /&gt;
// - I2C Temperature Sensor (LM75B)&lt;br /&gt;
// - I2C Servo Controller (PCA9685)&lt;br /&gt;
// - I2C LED Driver (TCA6507)&lt;br /&gt;
// - I2C 3D Magnetometer &amp;amp; Accelerometer (LSM303DLHC)&lt;br /&gt;
// - Analog Yaw-Rate Gyroscope (LY330ALH)&lt;br /&gt;
// - Hot Swappable 2-Wire Bus Buffer (TCA4311A)&lt;br /&gt;
// - Button&lt;br /&gt;
// - Status LED&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Includes:&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6M256_Sensor_BoardLib.h&amp;quot; 		&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Variables:&lt;br /&gt;
&lt;br /&gt;
uint8_t registerBuf[13]; &lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C I/O Port Expander (MAX7311):&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Sends the configuration word to a MAX7311.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: config -&amp;gt; Config word for control&lt;br /&gt;
 *                  registers&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void MAX7311_write_cfg(uint16_t config)&lt;br /&gt;
{&lt;br /&gt;
#ifdef SAFE_CONFIG&lt;br /&gt;
	config |= 0b1010000000001000;&lt;br /&gt;
#endif&lt;br /&gt;
	I2CTWI_transmit3Bytes(I2C_SENSOR_PORTEXP_ADR, MAX7311_PORT1_CONFIG, config, (config&amp;gt;&amp;gt;8));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
interrupt_RP6SBstatus_t interrupt_RP6SBstatus;&lt;br /&gt;
&lt;br /&gt;
/** &lt;br /&gt;
 * This function checks all interrupt pins on&lt;br /&gt;
 * the XBUS (INT1..3, INTU).&lt;br /&gt;
 * This function must be called VERY frequently&lt;br /&gt;
 * out of the main loop.&lt;br /&gt;
 * Bigger delays result in slower reaction to&lt;br /&gt;
 * interrupt requests of the RP6 Sensor Board.&lt;br /&gt;
 * Interrupt function table:&lt;br /&gt;
 *   Int. : Function 1      IRQ  Function 2       IRQ&lt;br /&gt;
 *   -------------------------------------------------&lt;br /&gt;
 *   INT1 : LSM303DLHC INT1  H&lt;br /&gt;
 *   INT2 : MAX7311   INT_N  L&lt;br /&gt;
 *   INT3 : LSM303DLHC INT2  H   DS1339 SQW/INT_N  L&lt;br /&gt;
 *   INTU : not used&lt;br /&gt;
 * You can see in the &amp;quot;IRQ&amp;quot; column, which level&lt;br /&gt;
 * (H/L) means an ACTIVE INTERRUPT signal.&lt;br /&gt;
 * The interrupt pin levels (H=true/L=false) are&lt;br /&gt;
 * read into the global interrupt_RP6SBstatus&lt;br /&gt;
 * variable.&lt;br /&gt;
 *&lt;br /&gt;
 * Hints: - This function checks the interrupt&lt;br /&gt;
 *          signals by polling. This is NOT the&lt;br /&gt;
 *          best way to do this job. You will&lt;br /&gt;
 *          have to write your own task, if you&lt;br /&gt;
 *          want to use the Pin Change Interrupt&lt;br /&gt;
 *          function of the ATmega2560&lt;br /&gt;
 *          microcontroller.&lt;br /&gt;
 *        - You cannot use both interrupt sources&lt;br /&gt;
 *          for INT3! So you should not use INT2&lt;br /&gt;
 *          of the LSM303DLHC together with the&lt;br /&gt;
 *          alarm function of the DS1339 (RTC)!&lt;br /&gt;
 *        - Every interrupt signal of the Sensor&lt;br /&gt;
 *          Board may be cut off from the XBUS&lt;br /&gt;
 *          by opening a jumper (Jx):&lt;br /&gt;
 *          INT1 -&amp;gt; J3 (LSM303DLHC INT1)&lt;br /&gt;
 *          INT2 -&amp;gt; J4 (MAX7311 INT_N)&lt;br /&gt;
 *          INT3 -&amp;gt; J2 (DS1339 SQW/INT_N)&lt;br /&gt;
 *          INT3 -&amp;gt; J5 (LSM303DLHC INT2)&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *&lt;br /&gt;
 *   if (!interrupt_RP6SBstatus.portexp)&lt;br /&gt;
 *        writeString_P(&amp;quot;==&amp;gt; MAX7311 INT_N!!!&amp;quot;);&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void task_checkINTs(void)&lt;br /&gt;
{&lt;br /&gt;
	if(IO_SENSOR_INT1_PIN &amp;amp; IO_SENSOR_INT1_IN)	// XBUS INT1 -&amp;gt; PJ3 (PCINT12)&lt;br /&gt;
		interrupt_RP6SBstatus.int1 = true;&lt;br /&gt;
	else&lt;br /&gt;
		interrupt_RP6SBstatus.int1 = false;&lt;br /&gt;
	if(IO_SENSOR_INT2_PIN &amp;amp; IO_SENSOR_INT2_IN)	// XBUS INT2 -&amp;gt; PJ6 (PCINT15)&lt;br /&gt;
		interrupt_RP6SBstatus.int2 = true;&lt;br /&gt;
	else&lt;br /&gt;
		interrupt_RP6SBstatus.int2 = false;&lt;br /&gt;
	if(IO_SENSOR_INT3_PIN &amp;amp; IO_SENSOR_INT3_IN)	// XBUS INT3 -&amp;gt; PJ5 (PCINT14)&lt;br /&gt;
		interrupt_RP6SBstatus.int3 = true;&lt;br /&gt;
	else&lt;br /&gt;
		interrupt_RP6SBstatus.int3 = false;&lt;br /&gt;
//	if(IO_SENSOR_INTU_PIN &amp;amp; IO_SENSOR_INTU_IN)	// XBUS INTU -&amp;gt; PJ4 (PCINT13)&lt;br /&gt;
//		interrupt_RP6SBstatus.intu = true;&lt;br /&gt;
//	else&lt;br /&gt;
//		interrupt_RP6SBstatus.intu = false;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
max7311IOs_t inport;&lt;br /&gt;
uint8_t readyBusbuff;&lt;br /&gt;
uint8_t pressedButton;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function checks all I/O ports (I/O 0.0..1.7)&lt;br /&gt;
 * of the MAX7311 sequentially!&lt;br /&gt;
 * You must call this function frequently out of&lt;br /&gt;
 * the main loop.&lt;br /&gt;
 * The I/O port values (true/false) are read into&lt;br /&gt;
 * the global inport variable.&lt;br /&gt;
 * The global variables readyBusbuff (2-Wire Bus&lt;br /&gt;
 * Buffer: Enable) and pressedButton (Button S1:&lt;br /&gt;
 * Pressed) contain actual values (true/false)&lt;br /&gt;
 * after execution of this task.&lt;br /&gt;
 *&lt;br /&gt;
 * Examples:&lt;br /&gt;
 *&lt;br /&gt;
 *   if (inport.rdy_busbuff)&lt;br /&gt;
 *        writeString_P(&amp;quot;I/O 0.3: High&amp;quot;);&lt;br /&gt;
 *   else writeString_P(&amp;quot;I/O 0.3: Low&amp;quot;);&lt;br /&gt;
 *   if (!inport.drdy_magacc)&lt;br /&gt;
 *        writeString_P(&amp;quot;I/O 1.5: Low&amp;quot;);&lt;br /&gt;
 *   if (pressedButton)&lt;br /&gt;
 *        writeString_P(&amp;quot;Button pressed!&amp;quot;);&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void task_RP6SensorBoard(void)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmitByte(I2C_SENSOR_PORTEXP_ADR, MAX7311_INPUT_PORT1);&lt;br /&gt;
	I2CTWI_readBytes(I2C_SENSOR_PORTEXP_ADR, registerBuf, 2);&lt;br /&gt;
	inport.word = (registerBuf[1] &amp;lt;&amp;lt; 8) + registerBuf[0];&lt;br /&gt;
	readyBusbuff = inport.rdy_busbuff;&lt;br /&gt;
	pressedButton = inport.io2_i2c;&lt;br /&gt;
	pressedButton = !pressedButton;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
max7311IOs_t outport;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Updates the I/O ports with current value from&lt;br /&gt;
 * the global outport variable!&lt;br /&gt;
 * If one or more port pins were configured as&lt;br /&gt;
 * output before, they will be set (high) or&lt;br /&gt;
 * cleared (low).&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *&lt;br /&gt;
 *   outport.word = 0b0000000000001001;&lt;br /&gt;
 *   MAX7311_update();&lt;br /&gt;
 *   // This clears all I/O ports and sets&lt;br /&gt;
 *   // the ports I/O 0.0 and I/O 0.3!&lt;br /&gt;
 *&lt;br /&gt;
 *   // Other possibility:&lt;br /&gt;
 *   outport.pwr_sharp_f = true;&lt;br /&gt;
 *   MAX7311_update();&lt;br /&gt;
 *   // This sets I/O 0.1 and does not&lt;br /&gt;
 *   // affect any other I/O port!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void MAX7311_update(void)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmit3Bytes(I2C_SENSOR_PORTEXP_ADR, MAX7311_OUTPUT_PORT1, outport.word, (outport.word&amp;gt;&amp;gt;8));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Writes the 16-bit data to a MAX7311.&lt;br /&gt;
 * The data are output with those I/O ports that&lt;br /&gt;
 * were configured as output before.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: data -&amp;gt; Data word&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void MAX7311_write(uint16_t data)&lt;br /&gt;
{&lt;br /&gt;
	outport.word = data;&lt;br /&gt;
	MAX7311_update();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Initializes the I/O Port Expander after power&lt;br /&gt;
 * on.&lt;br /&gt;
 *&lt;br /&gt;
 * Hint: If USE_PD5 is defined in the&lt;br /&gt;
 *       configuration header file, this&lt;br /&gt;
 *       function uses the RP6M256 portpin,&lt;br /&gt;
 *       that is connected to plug I/O: Pin 9&lt;br /&gt;
 *       instead of MAX7311 I/O 1.0!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void MAX7311_init(void)&lt;br /&gt;
{&lt;br /&gt;
#ifdef USE_PD5&lt;br /&gt;
	MAX7311_write_cfg(MAX7311_CONFIG_USE_PD5);&lt;br /&gt;
	IO_SENSOR_TCA4311A_EN_DDR |= IO_SENSOR_TCA4311A_EN_IN;		// Output&lt;br /&gt;
	IO_SENSOR_TCA4311A_EN_PORT |= IO_SENSOR_TCA4311A_EN_IN;		// High&lt;br /&gt;
#else&lt;br /&gt;
	MAX7311_write_cfg(MAX7311_CONFIG_DEFAULT);&lt;br /&gt;
#endif&lt;br /&gt;
	MAX7311_write(MAX7311_OUTPUT_DEFAULT);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Real Time Clock (RTC DS1339):&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function converts a BCD to a DEC value.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
uint8_t BCD2DEC(uint8_t bcd)&lt;br /&gt;
{&lt;br /&gt;
	return ((bcd &amp;gt;&amp;gt; 4) * 10 + (bcd &amp;amp; 0x0f));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function converts a DEC to a BCD value.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
uint8_t DEC2BCD(uint8_t dec)&lt;br /&gt;
{uint8_t units = dec % 10;&lt;br /&gt;
	if (dec /= 10) {&lt;br /&gt;
		return (units + (DEC2BCD(dec) &amp;lt;&amp;lt; 4));&lt;br /&gt;
	}&lt;br /&gt;
	else {&lt;br /&gt;
		return units;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Sends the configuration byte to a DS1339.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: Config byte for control register&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void DS1339_write_cfg(uint8_t config)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_RTC_ADR, DS1339_CONTROL, config);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Initializes the DS1339 Trickle Charger&lt;br /&gt;
 * function to the default for the RP6 Sensor&lt;br /&gt;
 * Board: One diode and 2kOhm resistor.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void DS1339_init(void)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_RTC_ADR, DS1339_TRICKLE_CHARGER, DS1339_TRICKLE_CHARGER_DEFAULT);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Reads all data registers of the Real Time Clock (RTC).&lt;br /&gt;
 * They are stored in the time &amp;amp; date variables defined in&lt;br /&gt;
 * the library header.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void DS1339_read(void)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmitByte(I2C_SENSOR_RTC_ADR, DS1339_SECONDS);&lt;br /&gt;
	I2CTWI_readBytes(I2C_SENSOR_RTC_ADR, registerBuf, 7);&lt;br /&gt;
	rtc_time.second = BCD2DEC(registerBuf[0]);&lt;br /&gt;
	rtc_time.minute = BCD2DEC(registerBuf[1]);&lt;br /&gt;
	rtc_time.hour = BCD2DEC(registerBuf[2] &amp;amp; 0x3f);&lt;br /&gt;
	rtc_date.weekday = (registerBuf[3] &amp;amp; 0x07);&lt;br /&gt;
	rtc_date.day = BCD2DEC(registerBuf[4]);&lt;br /&gt;
	rtc_date.month = BCD2DEC(registerBuf[5] &amp;amp; 0x7f);&lt;br /&gt;
	if(registerBuf[5] &amp;amp; 0x80) rtc_date.year = 100;&lt;br /&gt;
	else rtc_date.year = 0;&lt;br /&gt;
	rtc_date.year += BCD2DEC(registerBuf[6]);&lt;br /&gt;
	rtc_date.year += 2000;&lt;br /&gt;
	rtc_time.dst = 0;&lt;br /&gt;
#ifdef CALC_DST&lt;br /&gt;
	// Calculate MESZ (DST):&lt;br /&gt;
	uint8_t wday = rtc_date.weekday;			// Weekday [1..7 = R_MO..R_SU]&lt;br /&gt;
	if(wday == 7) wday = 0;&lt;br /&gt;
	if(rtc_date.month &amp;lt; 3 || rtc_date.month &amp;gt; 10) {&lt;br /&gt;
		return;&lt;br /&gt;
	}&lt;br /&gt;
	if((rtc_date.day - wday &amp;gt;= 25)&lt;br /&gt;
	 &amp;amp;&amp;amp; (wday || rtc_time.hour &amp;gt;= 2)) {&lt;br /&gt;
		if(rtc_date.month == 10)&lt;br /&gt;
			return;&lt;br /&gt;
	}&lt;br /&gt;
	else {&lt;br /&gt;
		if(rtc_date.month == 3) {&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	rtc_time.dst = 1;&lt;br /&gt;
#endif&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Writes the time &amp;amp; date infos in the variables defined in&lt;br /&gt;
 * the library header to the Real Time Clock (RTC).&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void DS1339_write(void)&lt;br /&gt;
{&lt;br /&gt;
	registerBuf[0] = DS1339_SECONDS;&lt;br /&gt;
	registerBuf[1] = DEC2BCD(rtc_time.second);&lt;br /&gt;
	registerBuf[2] = DEC2BCD(rtc_time.minute);&lt;br /&gt;
	registerBuf[3] = DEC2BCD(rtc_time.hour);&lt;br /&gt;
	registerBuf[4] = rtc_date.weekday;&lt;br /&gt;
	registerBuf[5] = DEC2BCD(rtc_date.day);&lt;br /&gt;
	registerBuf[6] = DEC2BCD(rtc_date.month);&lt;br /&gt;
	registerBuf[7] = DEC2BCD(rtc_date.year - 2000);&lt;br /&gt;
	I2CTWI_transmitBytes(I2C_SENSOR_RTC_ADR, &amp;amp;registerBuf[0], 8);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Temperature Sensor (LM75B):&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Sends the configuration byte to a LM75B.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: Config byte for Conf register&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void LM75B_write_cfg(uint8_t config)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_TEMP_ADR, LM75B_CONF, config);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
uint8_t temperature_low;&lt;br /&gt;
uint8_t temperature_high;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Reads the two data registers of the temperature&lt;br /&gt;
 * sensor's Temp register.&lt;br /&gt;
 * They are stored in the variables temperature_low&lt;br /&gt;
 * and _high.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void LM75B_read(void)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmitByte(I2C_SENSOR_TEMP_ADR, LM75B_TEMP);&lt;br /&gt;
	I2CTWI_readBytes(I2C_SENSOR_TEMP_ADR, registerBuf, 2);&lt;br /&gt;
	temperature_high = registerBuf[0];&lt;br /&gt;
	temperature_low = registerBuf[1];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
double temperature;						// Temperature [°C]&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Calculates and returns the temperature value&lt;br /&gt;
 * by using the data read from the LM75B with&lt;br /&gt;
 * the function LM75B_read(). The sensor is&lt;br /&gt;
 * designed for 11 bit measurement and 0.125°C&lt;br /&gt;
 * resolution.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
double LM75B_calculate(void)&lt;br /&gt;
{&lt;br /&gt;
	int16_t tempraw = 0;&lt;br /&gt;
	double temp;&lt;br /&gt;
&lt;br /&gt;
	tempraw = (getTemperatureHigh() &amp;lt;&amp;lt; 8) | getTemperatureLow();&lt;br /&gt;
	tempraw &amp;gt;&amp;gt;= 5;&lt;br /&gt;
	if (tempraw &amp;amp; 1024)							// Calculate temperature&lt;br /&gt;
		tempraw = (tempraw &amp;amp; 1023) - 1024;&lt;br /&gt;
	else&lt;br /&gt;
		tempraw = tempraw &amp;amp; 1023;&lt;br /&gt;
	temp = tempraw * 0.125;&lt;br /&gt;
	return temp;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Performs a 11 bit measurement and returns the&lt;br /&gt;
 * temperature [°C]. The sensor has a measuring&lt;br /&gt;
 * cycle of 100ms. So it makes no sense calling&lt;br /&gt;
 * this function at a frequency above 10Hz.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
double LM75B_measure(void)&lt;br /&gt;
{&lt;br /&gt;
//	LM75B_init();&lt;br /&gt;
	LM75B_read();								// Read data&lt;br /&gt;
	return (LM75B_calculate());					// Calculate value&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Servo Controller (PCA9685):&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Call this once before using the servo function.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: PWM frequency [40..1000 Hz]&lt;br /&gt;
 *&lt;br /&gt;
 * Hints: - Default servo frequency is 50 Hz!&lt;br /&gt;
 *        - The servo power is NOT switched on by&lt;br /&gt;
 *          this function!&lt;br /&gt;
 *&lt;br /&gt;
 * There is also a macro initServo(freq), which&lt;br /&gt;
 * does exactly the same as this function.&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *   initServo(50);&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void PCA9685_init(uint16_t freq)&lt;br /&gt;
{&lt;br /&gt;
	outport.oen_servo = false;					// I/O 1.3: Low&lt;br /&gt;
	MAX7311_update();&lt;br /&gt;
	if ((freq &amp;lt; 40) || (freq &amp;gt; 1000)) freq = 50;&lt;br /&gt;
	I2CTWI_transmitByte(I2C_SENSOR_SERVO_ADR, PCA9685_MODE2);&lt;br /&gt;
	uint8_t last_mode = I2CTWI_readByte(I2C_SENSOR_SERVO_ADR);&lt;br /&gt;
	last_mode &amp;amp;= ~PCA9685_MODE2_INVRT;			// Clear INVRT bit&lt;br /&gt;
	last_mode |= PCA9685_MODE2_OUTDRV;			// Set OUTDRV bit&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_SERVO_ADR, PCA9685_MODE2, last_mode);&lt;br /&gt;
	I2CTWI_transmitByte(I2C_SENSOR_SERVO_ADR, PCA9685_MODE1);&lt;br /&gt;
	last_mode = I2CTWI_readByte(I2C_SENSOR_SERVO_ADR);&lt;br /&gt;
	last_mode |= PCA9685_MODE1_AI;				// Set AI bit&lt;br /&gt;
	uint8_t mode1 = last_mode;&lt;br /&gt;
	mode1 |= PCA9685_MODE1_SLEEP;				// Set SLEEP bit&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_SERVO_ADR, PCA9685_MODE1, mode1);&lt;br /&gt;
	uint8_t prescale = (uint8_t) (F_PCA9685 / 4096 / freq - 0.5);&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_SERVO_ADR, PCA9685_PRE_SCALE, prescale);&lt;br /&gt;
	last_mode &amp;amp;= ~PCA9685_MODE1_SLEEP;			// Clear SLEEP bit&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_SERVO_ADR, PCA9685_MODE1, last_mode);&lt;br /&gt;
	mSleep(1);&lt;br /&gt;
	last_mode |= PCA9685_MODE1_RESTART;			// Clear RESTART bit&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_SERVO_ADR, PCA9685_MODE1, last_mode);&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_SERVO_ADR, PCA9685_LED8_ON_H, 0x10);&lt;br /&gt;
	return;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/** &lt;br /&gt;
 * Returns the channel belonging to a servo number.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: number -&amp;gt; Servo number [1..8]&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
uint8_t servo(uint8_t number)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t channel;&lt;br /&gt;
&lt;br /&gt;
	switch (number) {&lt;br /&gt;
		case 1 :&lt;br /&gt;
			channel = CH_SERVO_1; break;&lt;br /&gt;
		case 2 :&lt;br /&gt;
			channel = CH_SERVO_2; break;&lt;br /&gt;
		case 3 :&lt;br /&gt;
			channel = CH_SERVO_3; break;&lt;br /&gt;
		case 4 :&lt;br /&gt;
			channel = CH_SERVO_4; break;&lt;br /&gt;
		case 5 :&lt;br /&gt;
			channel = CH_SERVO_5; break;&lt;br /&gt;
		case 6 :&lt;br /&gt;
			channel = CH_SERVO_6; break;&lt;br /&gt;
		case 7 :&lt;br /&gt;
			channel = CH_SERVO_7; break;&lt;br /&gt;
		case 8 :&lt;br /&gt;
			channel = CH_SERVO_8; break;&lt;br /&gt;
		default : channel = CH_SERVO_1;&lt;br /&gt;
	}&lt;br /&gt;
	return channel;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This is the servo position set function.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: channel -&amp;gt; Channel number [1..16]&lt;br /&gt;
 *        pos     -&amp;gt; Servo position [SERVOx_LT..SERVOx_RT]&lt;br /&gt;
 *&lt;br /&gt;
 * Hints: - A servo position of 205 means 1 ms servo impulse,&lt;br /&gt;
 *          a position of 410 means a 2 ms servo impulse!&lt;br /&gt;
 *          You may calculate the servo impulse length by:&lt;br /&gt;
 *          ==&amp;gt; Impulse [ms] = servo position / 204.8 &amp;lt;==&lt;br /&gt;
 *          (Formula only valid for a PWM of 50 Hz!)&lt;br /&gt;
 *&lt;br /&gt;
 * There is also a macro setServo(servo, pos), which&lt;br /&gt;
 * does nearly the same as this function, but the first&lt;br /&gt;
 * parameter is the servo and NOT the channel number.&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *   setServo(2,300);&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void PCA9685_set(uint8_t channel, uint16_t pos)&lt;br /&gt;
{&lt;br /&gt;
	if ((channel == 0) || (channel &amp;gt; 16))&lt;br /&gt;
		return;&lt;br /&gt;
	uint8_t reg = channel * 4 + 4;				// Register LEDx_OFF_L&lt;br /&gt;
	I2CTWI_transmit3Bytes(I2C_SENSOR_SERVO_ADR, reg, (pos &amp;amp; 0x00ff), (pos &amp;gt;&amp;gt; 8));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * If the servos are not moving for a while, the&lt;br /&gt;
 * servo function can be stopped with this&lt;br /&gt;
 * function (PCA9685 set to sleep mode).&lt;br /&gt;
 *&lt;br /&gt;
 * Hint: The servo power is NOT switched off by&lt;br /&gt;
 *       this function!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void PCA9685_shutdown(void)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_SERVO_ADR, PCA9685_ALL_LED_OFF_H, 0x10);&lt;br /&gt;
	I2CTWI_transmitByte(I2C_SENSOR_SERVO_ADR, PCA9685_MODE1);&lt;br /&gt;
	uint8_t mode1 = I2CTWI_readByte(I2C_SENSOR_SERVO_ADR);&lt;br /&gt;
	mode1 |= PCA9685_MODE1_SLEEP;				// Set SLEEP bit&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_SERVO_ADR, PCA9685_MODE1, mode1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * If the servo function was stopped with the&lt;br /&gt;
 * function PCA9685_shutdown() before, it can be&lt;br /&gt;
 * (re)started again with this function.&lt;br /&gt;
 *&lt;br /&gt;
 * Hint: The servo power is NOT switched on by&lt;br /&gt;
 *       this function!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void PCA9685_restart(void)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmitByte(I2C_SENSOR_SERVO_ADR, PCA9685_MODE1);&lt;br /&gt;
	uint8_t mode1 = I2CTWI_readByte(I2C_SENSOR_SERVO_ADR);&lt;br /&gt;
	if (mode1 &amp;amp; PCA9685_MODE1_RESTART) {		// RESTART bit set?&lt;br /&gt;
		mode1 &amp;amp;= ~PCA9685_MODE1_SLEEP;			// Clear SLEEP bit&lt;br /&gt;
		I2CTWI_transmit2Bytes(I2C_SENSOR_SERVO_ADR, PCA9685_MODE1, mode1);&lt;br /&gt;
		mSleep(1);&lt;br /&gt;
		mode1 |= PCA9685_MODE1_RESTART;			// Clear RESTART bit&lt;br /&gt;
		I2CTWI_transmit2Bytes(I2C_SENSOR_SERVO_ADR, PCA9685_MODE1, mode1);&lt;br /&gt;
		I2CTWI_transmit2Bytes(I2C_SENSOR_SERVO_ADR, PCA9685_ALL_LED_OFF_H, 0);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/** &lt;br /&gt;
 * With this function you can switch the servo&lt;br /&gt;
 * power on or off.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: pwr -&amp;gt; 0 (false) = servo power off&lt;br /&gt;
 *               &amp;gt;0 (true) = servo power on&lt;br /&gt;
 *&lt;br /&gt;
 * Hints: - If connected servos are not used, you&lt;br /&gt;
 *          should always switch the servo power off&lt;br /&gt;
 *          (default) to save energy!&lt;br /&gt;
 *        - The PCA9685 is NOT restarted or put into&lt;br /&gt;
 *          shutdown mode by this function!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void setServoPower(uint8_t pwr)&lt;br /&gt;
{&lt;br /&gt;
	if(pwr &amp;gt; 0)&lt;br /&gt;
		outport.pwr_servo = true;				// I/O 1.4: High&lt;br /&gt;
	else&lt;br /&gt;
		outport.pwr_servo = false;				// I/O 1.4: Low&lt;br /&gt;
	MAX7311_update();&lt;br /&gt;
}	&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C LED Driver (TCA6507):&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Sends the configuration byte to TCA6507's&lt;br /&gt;
 * internal registers.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: reg    -&amp;gt; Register address [0..10]&lt;br /&gt;
 *        config -&amp;gt; Config byte for internal&lt;br /&gt;
 *                  registers&lt;br /&gt;
 *&lt;br /&gt;
 * Hints: - With this function you can write to&lt;br /&gt;
 *          all internal registers of the LED&lt;br /&gt;
 *          driver, see &amp;quot;Registers:&amp;quot; in the&lt;br /&gt;
 *          library header file!&lt;br /&gt;
 *        - Mainly you will use this function&lt;br /&gt;
 *          for setting time (regs 3..7) and&lt;br /&gt;
 *          intensity (regs 8, 9) values.&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *   TCA6507_write_cfg(TCA6507_MAXIMUM_INTENSITY,0x77);&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void TCA6507_write_cfg(uint8_t reg, uint8_t config)&lt;br /&gt;
{&lt;br /&gt;
	if(reg &amp;gt; 10) reg = 0;&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_LEDDRIVER_ADR, reg, config);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
uint8_t select[3];&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Updates the LED driver select registers (0..2)&lt;br /&gt;
 * with the global select array!&lt;br /&gt;
 *&lt;br /&gt;
 * Hint: - Also have a look at Table 4 in the&lt;br /&gt;
 *         TCA6507 datasheet!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void TCA6507_update(void)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmit4Bytes(I2C_SENSOR_LEDDRIVER_ADR, (TCA6507_SELECT0 | 0x10), select[0], select[1], select[2]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This is the LED state set function.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: led   -&amp;gt; LED number [0..6]&lt;br /&gt;
 *        state -&amp;gt; LED state  [0..7]&lt;br /&gt;
 *&lt;br /&gt;
 * Hints: - Possible driver states [0..7] see&lt;br /&gt;
 *          &amp;quot;Output states:&amp;quot; in the library&lt;br /&gt;
 *          header file!&lt;br /&gt;
 *        - Also have a look at Table 4 in the&lt;br /&gt;
 *          TCA6507 datasheet!&lt;br /&gt;
 *&lt;br /&gt;
 * There is also a macro setLED(led, state), which&lt;br /&gt;
 * does exactly the same as this function.&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *   setLED(1,4);&lt;br /&gt;
 *   // Switches LED1 ON&lt;br /&gt;
 *   // ... OR ...&lt;br /&gt;
 *   setLED(SB_LED1,STATE_ON);&lt;br /&gt;
 *   // does the same.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void TCA6507_set(uint8_t led, uint8_t state)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t i, mask;&lt;br /&gt;
&lt;br /&gt;
	if(led &amp;gt; 6) led = 0;&lt;br /&gt;
	led = 1 &amp;lt;&amp;lt; led;&lt;br /&gt;
	mask = 1;&lt;br /&gt;
	for(i = 0; i &amp;lt; 3; i++) {&lt;br /&gt;
		select[i] &amp;amp;= ~led;&lt;br /&gt;
		if(state &amp;amp; mask)&lt;br /&gt;
			select[i] |= led;&lt;br /&gt;
		mask &amp;lt;&amp;lt;= 1;&lt;br /&gt;
	}&lt;br /&gt;
	TCA6507_update();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * If the LEDs are not needed for a while, the&lt;br /&gt;
 * LED driver can be stopped with this function&lt;br /&gt;
 * (TCA6507 set to shutdown mode).&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void TCA6507_shutdown(void)&lt;br /&gt;
{&lt;br /&gt;
	outport.en_leddriv = false;					// I/O 0.4: Low&lt;br /&gt;
	MAX7311_update();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * If the LED driver was stopped with the&lt;br /&gt;
 * function TCA6507_shutdown() before, it can be&lt;br /&gt;
 * (re)started again with this function.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void TCA6507_restart(void)&lt;br /&gt;
{&lt;br /&gt;
	outport.en_leddriv = true;					// I/O 0.4: High&lt;br /&gt;
	MAX7311_update();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Initializes the LED driver after power on by&lt;br /&gt;
 * switching all LEDs off.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void TCA6507_init(void)&lt;br /&gt;
{&lt;br /&gt;
	select[0] = 0;&lt;br /&gt;
	select[1] = 0;&lt;br /&gt;
	select[2] = 0;&lt;br /&gt;
	TCA6507_update();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C 3D Magnetometer &amp;amp; Accelerometer (LSM303DLHC):&lt;br /&gt;
&lt;br /&gt;
// --------------------------------------------&lt;br /&gt;
// LSM303DLHC accelerometer functions:&lt;br /&gt;
int16_t x_axisa, y_axisa, z_axisa;&lt;br /&gt;
double pitch, roll;&lt;br /&gt;
double xa, ya, za;&lt;br /&gt;
double the, phi;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Call this once before using the 3D-Accelerometer.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void LSM303DLHC_A_init(void)&lt;br /&gt;
{&lt;br /&gt;
	// Set normal power mode, 10 Hz data rate, all axes enabled:&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_LSM303DLHC_A_ADR, CTRL_REG1_A, CTRL_REG1_A_10HZ);&lt;br /&gt;
	mSleep(10);&lt;br /&gt;
	// Set HD mode:&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_LSM303DLHC_A_ADR, CTRL_REG4_A, CTRL_REG4_A_HR);&lt;br /&gt;
	mSleep(10);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function reads the X-axis, Y-axis and Z-axis values&lt;br /&gt;
 * from the LSM303DLHC accelerometer and stores them in the&lt;br /&gt;
 * global variables x_axisa, y_axisa and z_axisa.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void readLSM303DLHC_A(void)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t readBuf[6];&lt;br /&gt;
&lt;br /&gt;
	I2CTWI_transmitByte(I2C_SENSOR_LSM303DLHC_A_ADR, (OUT_X_L_A | 0x80));&lt;br /&gt;
	I2CTWI_readBytes(I2C_SENSOR_LSM303DLHC_A_ADR, readBuf, 6); // Read  X-/Y-/Z-axis&lt;br /&gt;
	// xb = y:&lt;br /&gt;
	x_axisa = ((readBuf[OUT_Y_H_A - OUT_X_L_A] &amp;lt;&amp;lt; 8) + readBuf[OUT_Y_L_A - OUT_X_L_A]) / 16;&lt;br /&gt;
	// yb = x:&lt;br /&gt;
	y_axisa = ((readBuf[OUT_X_H_A - OUT_X_L_A] &amp;lt;&amp;lt; 8) + readBuf[OUT_X_L_A - OUT_X_L_A]) / 16;&lt;br /&gt;
	// zb = z:&lt;br /&gt;
	z_axisa = ((readBuf[OUT_Z_H_A - OUT_X_L_A] &amp;lt;&amp;lt; 8) + readBuf[OUT_Z_L_A - OUT_X_L_A]) / 16;&lt;br /&gt;
	mSleep(10);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function limits and normalizes the x-axisa,&lt;br /&gt;
 * y-axisa and z-axisa values read from the LSM303DLHC&lt;br /&gt;
 * accelerometer with the function readLSM303DLHC_A() and&lt;br /&gt;
 * stores them in the global double variables xa, ya and&lt;br /&gt;
 * za.&lt;br /&gt;
 * It also calculates the position in space in form of the&lt;br /&gt;
 * tilt angles (the = pitch, phi = roll) and stores them&lt;br /&gt;
 * in the global double variables the and phi.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void normalizeLSM303DLHC_A(void)&lt;br /&gt;
{&lt;br /&gt;
	// Limit raw values:&lt;br /&gt;
	if (x_axisa &amp;lt; MIN_X_A) x_axisa = MIN_X_A;&lt;br /&gt;
	if (x_axisa &amp;gt; MAX_X_A) x_axisa = MAX_X_A;&lt;br /&gt;
	if (y_axisa &amp;lt; MIN_Y_A) y_axisa = MIN_Y_A;&lt;br /&gt;
	if (y_axisa &amp;gt; MAX_Y_A) y_axisa = MAX_Y_A;&lt;br /&gt;
	if (z_axisa &amp;lt; MIN_Z_A) z_axisa = MIN_Z_A;&lt;br /&gt;
	if (z_axisa &amp;gt; MAX_Z_A) z_axisa = MAX_Z_A;&lt;br /&gt;
	xa = (double) x_axisa / 1000.0;&lt;br /&gt;
	ya = (double) y_axisa / 1000.0;&lt;br /&gt;
	za = (double) z_axisa / 1000.0;&lt;br /&gt;
	// Calculate Pitch and Roll:&lt;br /&gt;
	phi = asin(xa);								// Calculate the and phi&lt;br /&gt;
	the = asin(ya / cos(the));					//  from the raw values&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function calculates the position in space by&lt;br /&gt;
 * using the the and phi values (see function&lt;br /&gt;
 * normalizeLSM303DLHC_A()!). It stores the position&lt;br /&gt;
 * in the global double variables pitch and roll. &lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void positionLSM303DLHC_A(void)&lt;br /&gt;
{&lt;br /&gt;
	pitch = the * 180 / M_PI + OFFSET_PITCH_A;&lt;br /&gt;
	roll = phi * 180 / M_PI + OFFSET_ROLL_A;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// LSM303DLHC magnetometer functions:&lt;br /&gt;
int16_t x_axism, y_axism, z_axism;&lt;br /&gt;
int16_t headingm;&lt;br /&gt;
double xm, ym, zm;&lt;br /&gt;
#ifdef GET_TEMP_M&lt;br /&gt;
int16_t temperaturem;&lt;br /&gt;
double temperature_mag;&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
int16_t headingtc;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Call this once before using the 3D-Compass.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void LSM303DLHC_M_init(void)&lt;br /&gt;
{&lt;br /&gt;
#ifdef GET_TEMP_M&lt;br /&gt;
	// Set Data output rate to 15Hz, enable temperature sensor:&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_LSM303DLHC_M_ADR, CRA_REG_M, CRA_REG_M_15HZ_T_EN);&lt;br /&gt;
#else&lt;br /&gt;
	// Set Data output rate to 15Hz:&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_LSM303DLHC_M_ADR, CRA_REG_M, CRA_REG_M_15HZ);&lt;br /&gt;
#endif&lt;br /&gt;
	mSleep(10);&lt;br /&gt;
	// Set Gain to +-1.3Gauss:&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_LSM303DLHC_M_ADR, CRB_REG_M, CRB_REG_M_13GAUSS);&lt;br /&gt;
	mSleep(10);&lt;br /&gt;
	// Set Continuous-conversion mode:&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_LSM303DLHC_M_ADR, MR_REG_M, MR_REG_M_CCM);&lt;br /&gt;
	mSleep(10);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function reads the X-axis, Y-axis, Z-axis and&lt;br /&gt;
 * temperature values from the LSM303DLHC magnetometer&lt;br /&gt;
 * and stores them in the global variables x_axism,&lt;br /&gt;
 * y_axism, z_axism and temperaturem.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void readLSM303DLHC_M(void)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t readBuf[6];&lt;br /&gt;
&lt;br /&gt;
	I2CTWI_transmitByte(I2C_SENSOR_LSM303DLHC_M_ADR, OUT_X_H_M);&lt;br /&gt;
	I2CTWI_readBytes(I2C_SENSOR_LSM303DLHC_M_ADR, readBuf, 6); // Read  X-/Y-/Z-axis&lt;br /&gt;
	// xb = x:&lt;br /&gt;
	x_axism = (readBuf[OUT_X_H_M - OUT_X_H_M] &amp;lt;&amp;lt; 8) + readBuf[OUT_X_L_M - OUT_X_H_M];&lt;br /&gt;
	// yb = y:&lt;br /&gt;
	y_axism = (readBuf[OUT_Y_H_M - OUT_X_H_M] &amp;lt;&amp;lt; 8) + readBuf[OUT_Y_L_M - OUT_X_H_M];&lt;br /&gt;
	// zb = z:&lt;br /&gt;
	z_axism = (readBuf[OUT_Z_H_M - OUT_X_H_M] &amp;lt;&amp;lt; 8) + readBuf[OUT_Z_L_M - OUT_X_H_M];&lt;br /&gt;
	mSleep(10);&lt;br /&gt;
#ifdef GET_TEMP_M&lt;br /&gt;
	// Read temperature raw value:&lt;br /&gt;
	I2CTWI_transmitByte(I2C_SENSOR_LSM303DLHC_M_ADR, TEMP_OUT_H_M);&lt;br /&gt;
	readBuf[0] = I2CTWI_readByte(I2C_SENSOR_LSM303DLHC_M_ADR);&lt;br /&gt;
	I2CTWI_transmitByte(I2C_SENSOR_LSM303DLHC_M_ADR, TEMP_OUT_L_M);&lt;br /&gt;
	readBuf[1] = I2CTWI_readByte(I2C_SENSOR_LSM303DLHC_M_ADR);&lt;br /&gt;
	temperaturem = (readBuf[0] &amp;lt;&amp;lt; 8) | readBuf[1];&lt;br /&gt;
	temperaturem &amp;gt;&amp;gt;= 4;&lt;br /&gt;
	if (temperaturem &amp;amp; 2048)					// Calculate temperature&lt;br /&gt;
		temperaturem = (temperaturem &amp;amp; 2047) - 2048;&lt;br /&gt;
	else&lt;br /&gt;
		temperaturem = temperaturem &amp;amp; 2047;&lt;br /&gt;
	mSleep(10);&lt;br /&gt;
#endif&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function compensates hard iron effects and&lt;br /&gt;
 * scales the x-axism, y-axism and z-axism values read&lt;br /&gt;
 * from the LSM303DLHC magnetometer with the function&lt;br /&gt;
 * readLSM303DLHC_M() and stores them in the global&lt;br /&gt;
 * double variables xm, ym and zm.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void normalizeLSM303DLHC_M(void)&lt;br /&gt;
{&lt;br /&gt;
	// Add hard iron offsets:&lt;br /&gt;
	x_axism += OFFSET_X_M;&lt;br /&gt;
	y_axism += OFFSET_Y_M;&lt;br /&gt;
	z_axism += OFFSET_Z_M;&lt;br /&gt;
	// Scale raw values:&lt;br /&gt;
	xm = (x_axism - MIN_X_M) / (MAX_X_M - MIN_X_M) * 2 - 1;&lt;br /&gt;
	ym = (y_axism - MIN_Y_M) / (MAX_Y_M - MIN_Y_M) * 2 - 1;&lt;br /&gt;
	zm = (z_axism - MIN_Z_M) / (MAX_Z_M - MIN_Z_M) * 2 - 1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function calculates the heading by using the&lt;br /&gt;
 * normalized sensor values xm and ym (see function&lt;br /&gt;
 * normalizeLSM303DLHC_M()!). The heading is a value&lt;br /&gt;
 * from 0° to 359°. If the robot's front (and the&lt;br /&gt;
 * RP6 Sensor Board's front edge with the two&lt;br /&gt;
 * headlights) points to ...&lt;br /&gt;
 *   north -&amp;gt; heading is 0°,&lt;br /&gt;
 *   east  -&amp;gt; heading is 90°,&lt;br /&gt;
 *   south -&amp;gt; heading is 180°,&lt;br /&gt;
 *   west  -&amp;gt; heading is 270°.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
int16_t headingLSM303DLHC_M(void)&lt;br /&gt;
{&lt;br /&gt;
	double hdg = atan2(ym, xm) * 180 / M_PI + DECLINATION_M;&lt;br /&gt;
	if(hdg &amp;lt; 0.0) hdg += 360.0;&lt;br /&gt;
	return ((int16_t) hdg);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// --------------------------------------------&lt;br /&gt;
/**&lt;br /&gt;
 * This function calculates the TILT COMPENSATED&lt;br /&gt;
 * heading by using accelerometer (the, phi) AND&lt;br /&gt;
 * magnetometer (xm, ym, zm) data. The heading is a&lt;br /&gt;
 * value from 0° to 359°. If the robot's front (and&lt;br /&gt;
 * the RP6 Sensor Board's front edge with the two&lt;br /&gt;
 * headlights) points to ...&lt;br /&gt;
 *   north -&amp;gt; heading is 0°,&lt;br /&gt;
 *   east  -&amp;gt; heading is 90°,&lt;br /&gt;
 *   south -&amp;gt; heading is 180°,&lt;br /&gt;
 *   west  -&amp;gt; heading is 270°.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
int16_t headingLSM303DLHC_TC(void)&lt;br /&gt;
{&lt;br /&gt;
	double hdgtc, xh, yh;&lt;br /&gt;
&lt;br /&gt;
	xh = xm * cos(the) + zm * sin(the);&lt;br /&gt;
	yh = xm * sin(phi) * sin(the) + ym * cos(phi) - zm * sin(phi) * cos(the);&lt;br /&gt;
//	zh = -xm * cos(phi) * sin(the) + ym * sin(phi) + zm * cos(phi) * cos(the);&lt;br /&gt;
	hdgtc = atan2(yh, xh) * 180 / M_PI + DECLINATION_M;&lt;br /&gt;
	if(hdgtc &amp;lt; 0.0) hdgtc += 360.0;&lt;br /&gt;
	return ((int16_t) hdgtc);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// --------------------------------------------&lt;br /&gt;
/**&lt;br /&gt;
 * Call this once before using the LSM303DLHC.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void LSM303DLHC_init(void)&lt;br /&gt;
{&lt;br /&gt;
	LSM303DLHC_A_init();						// Accelerometer init&lt;br /&gt;
	LSM303DLHC_M_init();						// Magnetometer init&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Analog Yaw-Rate Gyroscope (LY330ALH):&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Sets the LY330ALH mode of operation.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: mode -&amp;gt; Mode [0..3]&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void LY330ALH_set_mode(uint8_t mode)&lt;br /&gt;
{&lt;br /&gt;
	outport.pd_gyro = false;					// I/O 0.6: Low&lt;br /&gt;
	outport.st_gyro = false;					// I/O 0.7: Low&lt;br /&gt;
	if(mode &amp;amp; 1) outport.pd_gyro = true;&lt;br /&gt;
	if(mode &amp;amp; 2) outport.st_gyro = true;&lt;br /&gt;
	MAX7311_update();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Reads the ADC1 value from the RP6Base.&lt;br /&gt;
 *&lt;br /&gt;
 * Hints: - The RP6Base input ADC1 has to be&lt;br /&gt;
 *          connected to the USRBUS: Pin 2 on&lt;br /&gt;
 *          the RP6 mainboard!&lt;br /&gt;
 *        - The RP6Base_I2CSlave program has to&lt;br /&gt;
 *          be loaded into the RP6Base&lt;br /&gt;
 *          microcontroller!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
uint16_t getRP6Base_ADC1(void)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_readRegisters(I2C_RP6_BASE_ADR, I2C_REG_ADC_ADC1_L, registerBuf, 2);&lt;br /&gt;
	return (registerBuf[0] + (registerBuf[1] &amp;lt;&amp;lt; 8));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int16_t z_axisg;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Performs a LY330ALH gyroscope measurement and&lt;br /&gt;
 * returns the angular rate (velocity).&lt;br /&gt;
 * Positive values mean an angular rate while&lt;br /&gt;
 * rotating LEFT and negative values while&lt;br /&gt;
 * rotating RIGHT!&lt;br /&gt;
 * The global integer variable z_axisg also&lt;br /&gt;
 * contains the measurement result.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
int16_t LY330ALH_measure(void)&lt;br /&gt;
{&lt;br /&gt;
	z_axisg = getRP6Base_ADC1();				// Read raw data&lt;br /&gt;
	z_axisg -= ADCVAL_ZERORATE_LEVEL;			// Calculate value&lt;br /&gt;
	return (z_axisg);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Hot Swappable 2-Wire Bus Buffer (TCA4311A):&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Reads the TCA4311A Ready output. &lt;br /&gt;
 * The function returns the state (true/false).&lt;br /&gt;
 * The global variable readyBusbuff is also&lt;br /&gt;
 * filled with the Ready output state.&lt;br /&gt;
 *&lt;br /&gt;
 * Hint: You don't have to use this function,&lt;br /&gt;
 *       if the task task_RP6SensorBoard() is&lt;br /&gt;
 *       called frequently out of the main&lt;br /&gt;
 *       loop, because readyBusbuff will be&lt;br /&gt;
 *       updated by this task!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
uint8_t readReadyBusbuff(void)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmitByte(I2C_SENSOR_PORTEXP_ADR, MAX7311_INPUT_PORT1);&lt;br /&gt;
	readyBusbuff = I2CTWI_readByte(I2C_SENSOR_PORTEXP_ADR);&lt;br /&gt;
	readyBusbuff &amp;amp;= RDY_BUSBUFF;&lt;br /&gt;
	return readyBusbuff;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
uint8_t errorBusbuff;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * If the I2C bus for the I2C-MODULE (SCLOUT,&lt;br /&gt;
 * SDAOUT) is not used or shall be isolated from&lt;br /&gt;
 * the RP6 I2C bus, this can be done with this&lt;br /&gt;
 * function.&lt;br /&gt;
 *&lt;br /&gt;
 * Hints: - The I2C-MODULE power is NOT switched&lt;br /&gt;
 *          off by this function!&lt;br /&gt;
 *        - If USE_PD5 is defined in the&lt;br /&gt;
 *          configuration header file, this&lt;br /&gt;
 *          function uses the RP6M256 portpin,&lt;br /&gt;
 *          that is connected to plug I/O: Pin 9&lt;br /&gt;
 *          instead of MAX7311 I/O 1.0!&lt;br /&gt;
 *        - If the global variable errorBusbuff&lt;br /&gt;
 *          returns true, the bus buffer could&lt;br /&gt;
 *          not be switched to shutdown mode!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void TCA4311A_shutdown(void)&lt;br /&gt;
{&lt;br /&gt;
	// Wait until the I2C bus is idle:&lt;br /&gt;
	while(I2CTWI_isBusy() || TWI_operation != I2CTWI_NO_OPERATION) task_I2CTWI();&lt;br /&gt;
#ifdef USE_PD5&lt;br /&gt;
	IO_SENSOR_TCA4311A_EN_PORT &amp;amp;= ~IO_SENSOR_TCA4311A_EN_IN; // Low&lt;br /&gt;
#else&lt;br /&gt;
	outport.en_busbuff = false;					// I/O 1.0: Low&lt;br /&gt;
	MAX7311_update();&lt;br /&gt;
#endif&lt;br /&gt;
	errorBusbuff = readReadyBusbuff();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * If the I2C bus for the I2C-MODULE (SCLOUT,&lt;br /&gt;
 * SDAOUT) was isolated from the RP6 I2C bus with&lt;br /&gt;
 * the function TCA4311A_shutdown() before, it&lt;br /&gt;
 * can be connected again with this function.&lt;br /&gt;
 *&lt;br /&gt;
 * Hints: - The I2C-MODULE power is NOT switched&lt;br /&gt;
 *          on by this function!&lt;br /&gt;
 *        - If USE_PD5 is defined in the&lt;br /&gt;
 *          configuration header file, this&lt;br /&gt;
 *          function uses the RP6M256 portpin,&lt;br /&gt;
 *          that is connected to plug I/O: Pin 9&lt;br /&gt;
 *          instead of MAX7311 I/O 1.0!&lt;br /&gt;
 *        - If the global variable errorBusbuff&lt;br /&gt;
 *          returns true, the bus buffer could&lt;br /&gt;
 *          not be switched to normal operation!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void TCA4311A_reconnect(void)&lt;br /&gt;
{&lt;br /&gt;
	// Wait until the I2C bus is idle:&lt;br /&gt;
	while(I2CTWI_isBusy() || TWI_operation != I2CTWI_NO_OPERATION) task_I2CTWI();&lt;br /&gt;
#ifdef USE_PD5&lt;br /&gt;
	IO_SENSOR_TCA4311A_EN_PORT |= IO_SENSOR_TCA4311A_EN_IN; // High&lt;br /&gt;
#else&lt;br /&gt;
	outport.en_busbuff = true;					// I/O 1.0: High&lt;br /&gt;
	MAX7311_update();&lt;br /&gt;
#endif&lt;br /&gt;
	errorBusbuff = !readReadyBusbuff();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Sets/clears the RP6Base signal PWR.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: pwr -&amp;gt; 0 (false) = PWR off&lt;br /&gt;
 *               &amp;gt;0 (true) = PWR on&lt;br /&gt;
 *&lt;br /&gt;
 * Hints: - The RP6Base signal PWR has to be&lt;br /&gt;
 *          connected to the USRBUS: Pin 3 on&lt;br /&gt;
 *          the RP6 mainboard!&lt;br /&gt;
 *        - The RP6Base_I2CSlave program has to&lt;br /&gt;
 *          be loaded into the RP6Base&lt;br /&gt;
 *          microcontroller!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void setRP6Base_PWR(uint8_t pwr)&lt;br /&gt;
{&lt;br /&gt;
	if(pwr &amp;gt; 0)&lt;br /&gt;
		I2CTWI_transmit2Bytes(I2C_RP6_BASE_ADR, 0, CMD_POWER_ON);&lt;br /&gt;
	else&lt;br /&gt;
		I2CTWI_transmit2Bytes(I2C_RP6_BASE_ADR, 0, CMD_POWER_OFF);&lt;br /&gt;
	while(I2CTWI_isBusy() || TWI_operation != I2CTWI_NO_OPERATION) task_I2CTWI();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/** &lt;br /&gt;
 * With this function you can switch the I2C-&lt;br /&gt;
 * MODULE (plug M1) power on or off.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: pwr -&amp;gt; 0 (false) = I2C-MODULE power off&lt;br /&gt;
 *               &amp;gt;0 (true) = I2C-MODULE power on&lt;br /&gt;
 *&lt;br /&gt;
 * Hints: - If the I2C-MODULE plug is not used,&lt;br /&gt;
 *          you should always switch the&lt;br /&gt;
 *          I2C-MODULE power off (default)!&lt;br /&gt;
 *        - The TCA4311A is NOT switched to&lt;br /&gt;
 *          normal operation (default) or&lt;br /&gt;
 *          shutdown mode by this function!&lt;br /&gt;
 *        - The RP6Base signal PWR has to be&lt;br /&gt;
 *          connected to the USRBUS: Pin 3 on&lt;br /&gt;
 *          the RP6 mainboard!&lt;br /&gt;
 *        - The RP6Base_I2CSlave program has to&lt;br /&gt;
 *          be loaded into the RP6Base&lt;br /&gt;
 *          microcontroller!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void setI2CModulePower(uint8_t pwr)&lt;br /&gt;
{&lt;br /&gt;
	if(pwr &amp;gt; 0) {&lt;br /&gt;
		setRP6Base_PWR(1);						// RP6Base PWR on&lt;br /&gt;
		outport.pwr_i2c = true;					// I/O 0.0: High&lt;br /&gt;
	}&lt;br /&gt;
	else&lt;br /&gt;
		outport.pwr_i2c = false;				// I/O 0.0: Low&lt;br /&gt;
	MAX7311_update();&lt;br /&gt;
}	&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Button:&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Reads the MAX7311 I/O port 1.7. &lt;br /&gt;
 * The function returns true, if  button S1 is&lt;br /&gt;
 * pressed (I/O 1.7: Low!) and false, if it is&lt;br /&gt;
 * not pressed (I/O 1.7: High!).&lt;br /&gt;
 * The global variable pressedButton is also&lt;br /&gt;
 * filled with the I/O 1.7 output state.&lt;br /&gt;
 *&lt;br /&gt;
 * Hint: You don't have to use this function,&lt;br /&gt;
 *       if the task task_RP6SensorBoard() is&lt;br /&gt;
 *       called frequently out of the main&lt;br /&gt;
 *       loop, because pressedButton will be&lt;br /&gt;
 *       updated by this task!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
uint8_t readButton(void)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmitByte(I2C_SENSOR_PORTEXP_ADR, MAX7311_INPUT_PORT2);&lt;br /&gt;
	pressedButton = I2CTWI_readByte(I2C_SENSOR_PORTEXP_ADR);&lt;br /&gt;
	pressedButton &amp;amp;= IO2_I2C;&lt;br /&gt;
	pressedButton = !pressedButton;&lt;br /&gt;
	return pressedButton;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Status LED:&lt;br /&gt;
&lt;br /&gt;
/** &lt;br /&gt;
 * Sets the status LED (D2) of the RP6 Sensor&lt;br /&gt;
 * Board.&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *   setStatusLED(1);&lt;br /&gt;
 *   // This switches the status LED on!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void setStatusLED(uint8_t on)&lt;br /&gt;
{&lt;br /&gt;
	if(on &amp;gt; 0)&lt;br /&gt;
		outport.io1_i2c = false;				// I/O 1.6: Low&lt;br /&gt;
	else&lt;br /&gt;
		outport.io1_i2c = true;					// I/O 1.6: High&lt;br /&gt;
	MAX7311_update();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// RP6 Sensor Board initialisation and shutdown:&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * You MUST call this function at the beginning of a&lt;br /&gt;
 * main program, that uses the RP6 Sensor Board. &lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void sensor_board_init(void)&lt;br /&gt;
{&lt;br /&gt;
	// I/O Port Expander:&lt;br /&gt;
	MAX7311_init();&lt;br /&gt;
	// RTC:&lt;br /&gt;
	DS1339_init();&lt;br /&gt;
	// Temperature Sensor:&lt;br /&gt;
	LM75B_init();&lt;br /&gt;
	// Servo Controller:&lt;br /&gt;
	PCA9685_init(50);							// Init PWM 50 Hz&lt;br /&gt;
	// LED Driver:&lt;br /&gt;
	TCA6507_init();&lt;br /&gt;
	// 3D Magnetometer &amp;amp; Accelerometer:&lt;br /&gt;
	LSM303DLHC_init();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * If you don't use any function of the RP6&lt;br /&gt;
 * Sensor Board, you can put the board into&lt;br /&gt;
 * &amp;quot;SHUTDOWN MODE&amp;quot;. In this mode the electric&lt;br /&gt;
 * power consumption is very low to save energy.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void sensor_board_shutdown(void)&lt;br /&gt;
{&lt;br /&gt;
	// Servo Controller:&lt;br /&gt;
	PCA9685_shutdown();							// Shutdown PCA9685&lt;br /&gt;
	// Temperature Sensor:&lt;br /&gt;
	LM75B_shutdown();							// Shutdown LM75B&lt;br /&gt;
	// I/O Port Expander:&lt;br /&gt;
	MAX7311_write(MAX7311_OUTPUT_SHUTDOWN);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&lt;br /&gt;
/******************************************************************************&lt;br /&gt;
 * Additional info&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Changelog:&lt;br /&gt;
 * - v. 1.1 RP6M256_I2CMasterLib compatibility 16.09.2014 by Dirk&lt;br /&gt;
 * - v. 1.0 TCA4311A reconnect problem fixed 10.04.2014 by Dirk&lt;br /&gt;
 * - v. 0.9 Interrupt status functions added 09.04.2014 by Dirk&lt;br /&gt;
 * - v. 0.8 (initial release) 17.03.2014 by Dirk&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Erklärung&lt;br /&gt;
&lt;br /&gt;
=====Demo=====&lt;br /&gt;
makefile:&lt;br /&gt;
&amp;lt;pre&amp;gt;...&lt;br /&gt;
TARGET = RP6M256_Sensor_Board_01&lt;br /&gt;
...&lt;br /&gt;
SRC += $(RP6_LIB_PATH)/RP6common/RP6I2CmasterTWI.c&lt;br /&gt;
&lt;br /&gt;
SRC += $(RP6_LIB_PATH)/RP6control_M256_WIFI/RP6M256_Sensor_BoardLib.c&lt;br /&gt;
...&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Datei: RP6M256_Sensor_Board_01.c&lt;br /&gt;
&amp;lt;pre&amp;gt;/* &lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * RP6 ROBOT SYSTEM - RP6 CONTROL M256 Examples&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Example: RP6M256 Sensor Board&lt;br /&gt;
 * Author(s): Dirk&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Description:&lt;br /&gt;
 * In this example we show a first test for the RP6 Sensor Board.&lt;br /&gt;
 * &lt;br /&gt;
 * ############################################################################&lt;br /&gt;
 * The Robot does NOT move in this example! You can simply put it on a table&lt;br /&gt;
 * next to your PC and you should connect it to the PC via the USB Interface!&lt;br /&gt;
 * You should also connect to it via WIFI.&lt;br /&gt;
 * ############################################################################&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Includes:&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6M256Lib.h&amp;quot; 				// The RP6 M256 Library. &lt;br /&gt;
										// Always needs to be included!&lt;br /&gt;
#include &amp;quot;RP6I2CmasterTWI.h&amp;quot;			// Include the I2C-Bus Master Library&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Include our new &amp;quot;RP6M256 Sensor Board library&amp;quot;:&lt;br /&gt;
// (This is the library for accessing the RP6 Sensor Board!)&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6M256_Sensor_BoardLib.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Variables:&lt;br /&gt;
&lt;br /&gt;
char dir[3];&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Returns a 2 character string for the eighth&lt;br /&gt;
 * parts of the direction calculated from the&lt;br /&gt;
 * heading value.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: heading -&amp;gt; Heading value [0..359]&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void calculateDir(char *dir, uint16_t heading)&lt;br /&gt;
{&lt;br /&gt;
	dir[1] = ' ';&lt;br /&gt;
	dir[2] = '\0';&lt;br /&gt;
	if ((heading &amp;lt;= 22) || (heading &amp;gt;=338)) dir[0] = 'N';&lt;br /&gt;
	if ((heading &amp;gt;= 23) &amp;amp;&amp;amp; (heading &amp;lt;= 67)) {dir[0] = 'N'; dir[1] = 'E';} &lt;br /&gt;
	if ((heading &amp;gt;= 68) &amp;amp;&amp;amp; (heading &amp;lt;= 112)) dir[0] = 'E';&lt;br /&gt;
	if ((heading &amp;gt;= 113) &amp;amp;&amp;amp; (heading &amp;lt;= 157)) {dir[0] = 'S'; dir[1] = 'E';}&lt;br /&gt;
	if ((heading &amp;gt;= 158) &amp;amp;&amp;amp; (heading &amp;lt;= 202)) dir[0] = 'S';&lt;br /&gt;
	if ((heading &amp;gt;= 203) &amp;amp;&amp;amp; (heading &amp;lt;= 247)) {dir[0] = 'S'; dir[1] = 'W';}&lt;br /&gt;
	if ((heading &amp;gt;= 248) &amp;amp;&amp;amp; (heading &amp;lt;= 292)) dir[0] = 'W';&lt;br /&gt;
	if ((heading &amp;gt;= 293) &amp;amp;&amp;amp; (heading &amp;lt;= 337)) {dir[0] = 'N'; dir[1] = 'W';}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Write a floating point number to the WIFI.&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *&lt;br /&gt;
 *			// Write a floating point number to the WIFI (no exponent):&lt;br /&gt;
 *			writeDouble_WIFI(1234567.890, 11, 3);&lt;br /&gt;
 *&lt;br /&gt;
 * The value of prec (precision) defines the number of decimal places.&lt;br /&gt;
 * For 32 bit floating point variables (float, double ...) 6 is&lt;br /&gt;
 * the max. value for prec (7 relevant digits).&lt;br /&gt;
 * The value of width defines the overall number of characters in the&lt;br /&gt;
 * floating point number including the decimal point. The number of&lt;br /&gt;
 * pre-decimal positions is: (width - prec - 1).&lt;br /&gt;
 */&lt;br /&gt;
void writeDouble_WIFI(double number, uint8_t width, uint8_t prec)&lt;br /&gt;
{char buffer[width + 1];&lt;br /&gt;
	dtostrf(number, width, prec, &amp;amp;buffer[0]);&lt;br /&gt;
	writeString_WIFI(&amp;amp;buffer[0]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Write a floating point number to the LCD.&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *&lt;br /&gt;
 *			// Write a floating point number to the LCD (no exponent):&lt;br /&gt;
 *			writeDoubleLCD(1234567.890, 11, 3);&lt;br /&gt;
 *&lt;br /&gt;
 * The value of prec (precision) defines the number of decimal places.&lt;br /&gt;
 * For 32 bit floating point variables (float, double ...) 6 is&lt;br /&gt;
 * the max. value for prec (7 relevant digits).&lt;br /&gt;
 * The value of width defines the overall number of characters in the&lt;br /&gt;
 * floating point number including the decimal point. The number of&lt;br /&gt;
 * pre-decimal positions is: (width - prec - 1).&lt;br /&gt;
 */&lt;br /&gt;
void writeDoubleLCD(double number, uint8_t width, uint8_t prec)&lt;br /&gt;
{char buffer[width + 1];&lt;br /&gt;
	dtostrf(number, width, prec, &amp;amp;buffer[0]);&lt;br /&gt;
	writeStringLCD(&amp;amp;buffer[0]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Error handler&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function gets called automatically if there was an I2C Error like&lt;br /&gt;
 * the slave sent a &amp;quot;not acknowledge&amp;quot; (NACK, error codes e.g. 0x20 or 0x30).&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void I2C_transmissionError(uint8_t errorState)&lt;br /&gt;
{&lt;br /&gt;
	writeString_P_WIFI(&amp;quot;\nI2C ERROR - TWI STATE: 0x&amp;quot;);&lt;br /&gt;
	writeInteger_WIFI(errorState, HEX);&lt;br /&gt;
	writeChar_WIFI('\n');&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Main function - The program starts here:&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
	initRP6M256();    // Always call this first! The Processor will not work&lt;br /&gt;
					  // correctly otherwise. &lt;br /&gt;
&lt;br /&gt;
	initLCD(); // Initialize the LC-Display (LCD)&lt;br /&gt;
			   // Always call this before using the LCD!&lt;br /&gt;
&lt;br /&gt;
	setLEDs(0b1111);&lt;br /&gt;
	mSleep(500);&lt;br /&gt;
	setLEDs(0b0000);&lt;br /&gt;
&lt;br /&gt;
	writeString_P_WIFI(&amp;quot;\n\nRP6 Sensor Board Selftest 1!\n&amp;quot;); &lt;br /&gt;
&lt;br /&gt;
	// IMPORTANT:&lt;br /&gt;
	I2CTWI_initMaster(100); // Initialize the TWI Module for Master operation&lt;br /&gt;
							// with 100kHz SCL Frequency&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	// Register the event handler:&lt;br /&gt;
	I2CTWI_setTransmissionErrorHandler(I2C_transmissionError);&lt;br /&gt;
&lt;br /&gt;
	setLEDs(0b1111);&lt;br /&gt;
&lt;br /&gt;
	// Write a text message to the LCD:&lt;br /&gt;
	showScreenLCD(&amp;quot;################&amp;quot;, &amp;quot;################&amp;quot;);&lt;br /&gt;
	mSleep(1500);&lt;br /&gt;
	showScreenLCD(&amp;quot;RP6v2-M256-WIFI &amp;quot;, &amp;quot;Example Program&amp;quot;);&lt;br /&gt;
	mSleep(2500); &lt;br /&gt;
	showScreenLCD(&amp;quot;RP6 Sensor Board&amp;quot;, &amp;quot;   Selftest 1&amp;quot;);&lt;br /&gt;
	mSleep(2500);&lt;br /&gt;
	clearLCD();&lt;br /&gt;
&lt;br /&gt;
	setLEDs(0b0000);&lt;br /&gt;
&lt;br /&gt;
	// ---------------------------------------&lt;br /&gt;
&lt;br /&gt;
	uint8_t onoff = 0;&lt;br /&gt;
	uint16_t servopos = SERVO1_LT;&lt;br /&gt;
	int16_t rate;&lt;br /&gt;
&lt;br /&gt;
	startStopwatch1();&lt;br /&gt;
	startStopwatch2();&lt;br /&gt;
&lt;br /&gt;
	// IMPORTANT:&lt;br /&gt;
	sensor_board_init();						// RP6 Sensor Board init!!!&lt;br /&gt;
	setServoPower(1);							// Servo power ON!&lt;br /&gt;
/*&lt;br /&gt;
	// ----------------------------------------------&lt;br /&gt;
	// Set RTC once (battery empty or not existing:&lt;br /&gt;
	rtc_time.second = 0;&lt;br /&gt;
	rtc_time.minute = 15;&lt;br /&gt;
	rtc_time.hour = 20;				// 20:15&lt;br /&gt;
	rtc_date.weekday = R_SU;&lt;br /&gt;
	rtc_date.day = 20;&lt;br /&gt;
	rtc_date.month = 4;&lt;br /&gt;
	rtc_date.year = 2014;			// Su, 20.4.2014&lt;br /&gt;
	DS1339_write();&lt;br /&gt;
	// Remove this, if RTC is set and running!!!&lt;br /&gt;
	// ----------------------------------------------&lt;br /&gt;
*/&lt;br /&gt;
	while(true) &lt;br /&gt;
	{&lt;br /&gt;
		if(getStopwatch1() &amp;gt; 1000) // 1s&lt;br /&gt;
		{&lt;br /&gt;
			if (onoff) onoff = 0;&lt;br /&gt;
			else onoff = 1;&lt;br /&gt;
&lt;br /&gt;
			// Interrupt status:&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nInterrupt Status:      &amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(interrupt_RP6SBstatus.byte, BIN, 8);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			// Inport status:&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;Inport Status: &amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(inport.word, BIN, 16);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			// Temperature sensor test:&lt;br /&gt;
			temperature = LM75B_measure();		// Measure&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;Temperature: &amp;quot;);&lt;br /&gt;
			writeDouble_WIFI(temperature, 7, 3);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;°\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			// LED driver test:&lt;br /&gt;
			if (onoff) {&lt;br /&gt;
				setLED(HEADLIGHT_R, STATE_ON);&lt;br /&gt;
				setLED(HEADLIGHT_L, STATE_OFF);&lt;br /&gt;
			}&lt;br /&gt;
			else {&lt;br /&gt;
				setLED(HEADLIGHT_L, STATE_ON);&lt;br /&gt;
				setLED(HEADLIGHT_R, STATE_OFF);&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			// Servo controller test (SERVO_1):&lt;br /&gt;
			setServo(1, servopos);&lt;br /&gt;
			servopos += 10;&lt;br /&gt;
			if (servopos &amp;gt; SERVO1_RT) servopos = SERVO1_LT;&lt;br /&gt;
&lt;br /&gt;
			// RTC test:&lt;br /&gt;
			DS1339_read();&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;RTC: &amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(rtc_time.hour, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;:&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(rtc_time.minute, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;:&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(rtc_time.second, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;  &amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(rtc_date.day, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;.&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(rtc_date.month, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;.&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(rtc_date.year, DEC, 4);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			// 3D Magnetometer &amp;amp; Accelerometer test:&lt;br /&gt;
			//  LSM303DLHC accelerometer:&lt;br /&gt;
			task_I2CTWI();&lt;br /&gt;
			readLSM303DLHC_A();					// Get sensor values&lt;br /&gt;
			task_I2CTWI();&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\n3D-Acceleration SENSOR -&amp;gt;\n&amp;quot;);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;X-axis: &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(x_axisa, DEC);&lt;br /&gt;
			writeChar_WIFI('\n');&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;Y-axis: &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(y_axisa, DEC);&lt;br /&gt;
			writeChar_WIFI('\n');&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;Z-axis: &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(z_axisa, DEC);&lt;br /&gt;
			writeChar_WIFI('\n');&lt;br /&gt;
			normalizeLSM303DLHC_A();			// Normalize data&lt;br /&gt;
			positionLSM303DLHC_A();				// Calculate position&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;POSITION: \n&amp;quot;);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;  Pitch [°]: &amp;quot;);&lt;br /&gt;
			writeDouble_WIFI(pitch, 6, 1);&lt;br /&gt;
			writeChar_WIFI('\n');&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;  Roll [°]:  &amp;quot;);&lt;br /&gt;
			writeDouble_WIFI(roll, 6, 1);&lt;br /&gt;
			writeChar_WIFI('\n');&lt;br /&gt;
&lt;br /&gt;
			//  LSM303DLHC magnetometer:&lt;br /&gt;
			task_I2CTWI();&lt;br /&gt;
			readLSM303DLHC_M();					// Get sensor values&lt;br /&gt;
			task_I2CTWI();&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\n3D-Compass SENSOR -&amp;gt;\n&amp;quot;);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;X-axis: &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(x_axism, DEC);&lt;br /&gt;
			writeChar_WIFI('\n');&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;Y-axis: &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(y_axism, DEC);&lt;br /&gt;
			writeChar_WIFI('\n');&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;Z-axis: &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(z_axism, DEC);&lt;br /&gt;
			writeChar_WIFI('\n');&lt;br /&gt;
			normalizeLSM303DLHC_M();			// Normalize data&lt;br /&gt;
			headingm = headingLSM303DLHC_M();	// Calculate heading&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;                 Heading [°]: &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(headingm, DEC);&lt;br /&gt;
			calculateDir(dir, headingm);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;  Direction: &amp;quot;);&lt;br /&gt;
			writeString_WIFI(dir);&lt;br /&gt;
			writeChar_WIFI('\n');&lt;br /&gt;
			headingtc = headingLSM303DLHC_TC();	// Calculate TILT COMPENSATED&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;TILT COMPENSATED heading [°]: &amp;quot;); // heading&lt;br /&gt;
			writeInteger_WIFI(headingtc, DEC);&lt;br /&gt;
			calculateDir(dir, headingtc);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;  Direction: &amp;quot;);&lt;br /&gt;
			writeString_WIFI(dir);&lt;br /&gt;
			writeChar_WIFI('\n');&lt;br /&gt;
#ifdef GET_TEMP_M&lt;br /&gt;
			temperature_mag = (double) temperaturem / 8.0 + OFFSET_TEMP_M;&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;Temperature [°]: &amp;quot;);&lt;br /&gt;
			writeDouble_WIFI(temperature_mag, 7, 2);&lt;br /&gt;
			writeChar_WIFI('\n');&lt;br /&gt;
#endif&lt;br /&gt;
			// Yaw-Rate Gyroscope test:&lt;br /&gt;
			rate = LY330ALH_measure();&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\n1D-Gyro SENSOR -&amp;gt;\n&amp;quot;);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;Z-axis: &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(rate, DEC);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			// RP6 Sensor Board shutdown (button &amp;amp; status LED test):&lt;br /&gt;
			if (pressedButton) {&lt;br /&gt;
				setStatusLED(1);&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;\nPress button again for RP6 Sensor Board SHUTDOWN!\n&amp;quot;);&lt;br /&gt;
				mSleep(2000);&lt;br /&gt;
				do {&lt;br /&gt;
					if(getStopwatch2() &amp;gt; 200) { // 0.2s&lt;br /&gt;
						if (onoff) onoff = 0;&lt;br /&gt;
						else onoff = 1;&lt;br /&gt;
						if (onoff) setStatusLED(1);&lt;br /&gt;
						else setStatusLED(0);&lt;br /&gt;
						setStopwatch2(0);&lt;br /&gt;
					}&lt;br /&gt;
					mSleep(1);&lt;br /&gt;
					task_I2CTWI();&lt;br /&gt;
				} while (!readButton());&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;\n\n\n\n\nPlease wait for RP6 Sensor Board SHUTDOWN...\n&amp;quot;);&lt;br /&gt;
				sensor_board_shutdown();&lt;br /&gt;
				mSleep(3000);&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;\n\n\nThe RP6 Sensor Board now is in SHUTDOWN MODE!!!\n&amp;quot;);&lt;br /&gt;
				mSleep(1000);&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;\nRESET the M256 microcontroller now...\n\n&amp;quot;);&lt;br /&gt;
				while(true) {};&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			setStopwatch1(0);&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		task_checkINTs();						// Read interrupt signals&lt;br /&gt;
		task_RP6SensorBoard();					// RP6 Sensor Board task&lt;br /&gt;
&lt;br /&gt;
		task_I2CTWI();&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Erklärung&lt;br /&gt;
&lt;br /&gt;
====Projekte====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===RP6 Xtra Module===&lt;br /&gt;
Die Dokumentation zu den RP6 Xtra Modulen befindet sich auf der mitgelieferten ''&amp;quot;RP6 Robot System Xtra Modules CD-ROM&amp;quot;''. Auf der CD-ROM sind auch Software-Beispiele zu finden.&lt;br /&gt;
&lt;br /&gt;
Die hier veröffentlichte Software zu den Xtra Modulen ist eine Eigenentwicklung in GCC:&lt;br /&gt;
* Arexx [[RP6_Sensor_Board_und_Xtra_Module#I2C_GPS_Empf.C3.A4nger_JM3-GPS_2|I2C GPS Empfänger JM3-GPS]]&lt;br /&gt;
* Arexx [[RP6_Sensor_Board_und_Xtra_Module#Gyro_Modul_JM3-GYRO_2|Gyro Modul JM3-GYRO]]&lt;br /&gt;
* Arexx [[RP6_Sensor_Board_und_Xtra_Module#3D_Accelerometer_Modul_JM3-3DA_2|3D Accelerometer Modul JM3-3DA]]&lt;br /&gt;
* Arexx [[RP6_Sensor_Board_und_Xtra_Module#BHT_Modul_JM3-BHT31_2|BHT Modul JM3-BHT31]]&lt;br /&gt;
&lt;br /&gt;
====I2C GPS Empfänger JM3-GPS====&lt;br /&gt;
=====Dokumentation=====&lt;br /&gt;
Die Dokumentation zum I2C GPS Empfänger befindet sich auf der mitgelieferten ''&amp;quot;RP6 Robot System Xtra Modules CD-ROM&amp;quot;''.&lt;br /&gt;
&lt;br /&gt;
======Manuals======&lt;br /&gt;
Das Handbuch in der aktuellen Version kann [http://www.jm3-engineering.com/download/doc/ManualGPSModule_de.pdf hier] eingesehen werden.&lt;br /&gt;
&lt;br /&gt;
=====Demo-Programme=====&lt;br /&gt;
Ein Demo-Programm zum I2C GPS Empfänger befindet sich integriert in die RP6 Sensor Board Demo auf der mitgelieferten ''&amp;quot;RP6 Robot System Xtra Modules CD-ROM&amp;quot;''. Diese Demo kann auch in der aktuellen Version im Download Bereich von [http://www.jm3-engineering.com/downloads.htm JM3 Engineering] herunter geladen werden.&lt;br /&gt;
&lt;br /&gt;
=====RP6M256 WiFi: I2C_GPS Library=====&lt;br /&gt;
Die nachfolgende RP6M256_I2C_GPSLib (Eigenentwicklung in GCC) dient zur Ansteuerung des I2C GPS Empfängers durch die RP6M256 WiFi.&lt;br /&gt;
 &lt;br /&gt;
======Libary Header======&lt;br /&gt;
Datei: RP6M256_I2C_GPSLib.h&lt;br /&gt;
&amp;lt;pre&amp;gt;/* ****************************************************************************&lt;br /&gt;
 *                           _______________________&lt;br /&gt;
 *                           \| RP6  ROBOT SYSTEM |/&lt;br /&gt;
 *                            \_-_-_-_-_-_-_-_-_-_/           &amp;gt;&amp;gt;&amp;gt; RP6 M256 WIFI&lt;br /&gt;
 * ----------------------------------------------------------------------------&lt;br /&gt;
 * ----------------------------- [c]2014 - Dirk -------------------------------&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * File: RP6M256_I2C_GPSLib.h&lt;br /&gt;
 * Version: 1.0&lt;br /&gt;
 * Target: RP6 M256 WIFI - ATMEGA2560 @16.00MHz&lt;br /&gt;
 * Author(s): Dirk&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Description:&lt;br /&gt;
 * Header file for new RP6 I2C GPS Receiver library.&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
#ifndef RP6M256_I2C_GPSLIB_H&lt;br /&gt;
#define RP6M256_I2C_GPSLIB_H&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// RP6 Sensor Board:&lt;br /&gt;
&lt;br /&gt;
// If you want to use the RP6 I2C GPS Receiver on the RP6 Sensor Board, you&lt;br /&gt;
// have to define SENSOR_BOARD (default)!&lt;br /&gt;
// If SENSOR_BOARD is NOT defined, this library assumes that the RP6 I2C GPS&lt;br /&gt;
// Receiver is used stand-alone.&lt;br /&gt;
// ------------------&lt;br /&gt;
#define SENSOR_BOARD&lt;br /&gt;
// ------------------&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Includes:&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6M256Lib.h&amp;quot;&lt;br /&gt;
#include &amp;quot;RP6I2CmasterTWI.h&amp;quot;&lt;br /&gt;
#ifdef SENSOR_BOARD&lt;br /&gt;
	#include &amp;quot;RP6M256_Sensor_BoardLib.h&amp;quot;&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// RP6 I2C GPS Receiver:&lt;br /&gt;
#define I2C_GPS_RECEIVER_ADR			0xc8	// Default&lt;br /&gt;
//#define I2C_GPS_RECEIVER_ADR			0xca&lt;br /&gt;
//#define I2C_GPS_RECEIVER_ADR			0xcc&lt;br /&gt;
//#define I2C_GPS_RECEIVER_ADR			0xce&lt;br /&gt;
//#define I2C_GPS_RECEIVER_ADR			0xd0	// DO NOT USE on Sensor Board!&lt;br /&gt;
//#define I2C_GPS_RECEIVER_ADR			0xd2&lt;br /&gt;
//#define I2C_GPS_RECEIVER_ADR			0xd4&lt;br /&gt;
//#define I2C_GPS_RECEIVER_ADR			0xd6&lt;br /&gt;
//#define I2C_GPS_RECEIVER_ADR			0xd8&lt;br /&gt;
//#define I2C_GPS_RECEIVER_ADR			0xda&lt;br /&gt;
//#define I2C_GPS_RECEIVER_ADR			0xdc&lt;br /&gt;
//#define I2C_GPS_RECEIVER_ADR			0xde&lt;br /&gt;
&lt;br /&gt;
// Read registers:&lt;br /&gt;
#define WHO_AM_I						0x20	// I2C address [0xc8..0xde]&lt;br /&gt;
#define LAT_DEG							0x21	// Degrees&lt;br /&gt;
#define LAT_MIN							0x22	// Minutes&lt;br /&gt;
#define LAT_MIN_D_L						0x23	// Minutes decimal part low&lt;br /&gt;
#define LAT_MIN_D_H						0x24	// Minutes decimal part high&lt;br /&gt;
#define LON_DEG							0x25	// Degrees&lt;br /&gt;
#define LON_MIN							0x26	// Minutes&lt;br /&gt;
#define LON_MIN_D_L						0x27	// Minutes decimal part low&lt;br /&gt;
#define LON_MIN_D_H						0x28	// Minutes decimal part high&lt;br /&gt;
#define STATUS							0x29	// Status flags&lt;br /&gt;
#define FIX_IND							0x2a	// FIX_IND&lt;br /&gt;
#define HDOP							0x2b	// HDOP&lt;br /&gt;
#define HDOP_D							0x2c	// HDOP_D&lt;br /&gt;
#define SAT_N							0x2d	// Number of satellites&lt;br /&gt;
#define COURSE_T_L						0x2e	// True heading low byte&lt;br /&gt;
#define COURSE_T_H						0x2f	// True heading high byte&lt;br /&gt;
#define COURSE_T_D						0x30	// Decimal part of course&lt;br /&gt;
#define SPEED_L							0x31	// Speed low byte&lt;br /&gt;
#define SPEED_H							0x32	// Speed high byte&lt;br /&gt;
#define SPEED_D							0x33	// Speed decimal part&lt;br /&gt;
#define ALT_L							0x34	// Altitude low byte&lt;br /&gt;
#define ALT_H							0x35	// Altitude high byte&lt;br /&gt;
#define ALT_DIF_L						0x36	// Differ. WGS-84 MSL low byte&lt;br /&gt;
#define ALT_DIF_H						0x37	// Differ. WGS-84 MSL high byte&lt;br /&gt;
#define UTC_H							0x38	// UTC hour&lt;br /&gt;
#define UTC_MIN							0x39	// UTC minute&lt;br /&gt;
#define UTC_S							0x3a	// UTC second&lt;br /&gt;
#define DAY								0x3b	// Day&lt;br /&gt;
#define YEAR_L							0x3c	// Year low byte&lt;br /&gt;
#define YEAR_H							0x3d	// Year high byte&lt;br /&gt;
#define MONTH							0x3e	// Month&lt;br /&gt;
#define PDOP							0x3f	// PDOP&lt;br /&gt;
#define PDOP_D							0x40	// PDOP_D&lt;br /&gt;
#define VDOP							0x41	// VDOP&lt;br /&gt;
#define VDOP_D							0x42	// VDOP_D&lt;br /&gt;
#define SAT_1							0x43	// SAT # 1&lt;br /&gt;
#define SAT_2							0x44	// SAT # 2&lt;br /&gt;
#define SAT_3							0x45	// SAT # 3&lt;br /&gt;
#define SAT_4							0x46	// SAT # 4&lt;br /&gt;
#define SAT_5							0x47	// SAT # 5&lt;br /&gt;
#define SAT_6							0x48	// SAT # 6&lt;br /&gt;
#define SAT_7							0x49	// SAT # 7&lt;br /&gt;
#define SAT_8							0x4a	// SAT # 8&lt;br /&gt;
#define SAT_9							0x4b	// SAT # 9&lt;br /&gt;
#define SAT_A							0x4c	// SAT # 10&lt;br /&gt;
#define SAT_B							0x4d	// SAT # 11&lt;br /&gt;
#define SAT_C							0x4e	// SAT # 12&lt;br /&gt;
#define SW_VERSION						0x4f	// SW_Version&lt;br /&gt;
#define HEARTBEAT						0x50	// Heartbeat&lt;br /&gt;
&lt;br /&gt;
// Status and Fix_Ind register bitmasks:&lt;br /&gt;
#define STATUS_NS						0b00000001&lt;br /&gt;
#define STATUS_EW						0b00000010&lt;br /&gt;
#define STATUS_SPU						0b00000100&lt;br /&gt;
#define STATUS_AUTON					0b00001000&lt;br /&gt;
#define FIX_IND_UI_FIX					0b10000000&lt;br /&gt;
&lt;br /&gt;
// Write registers:&lt;br /&gt;
#define INIT_CFG						0x90	// INIT CFG&lt;br /&gt;
#define SET_FIX_TIME					0x91	// Pos_Fix_Time&lt;br /&gt;
#define STBY							0x92	// STBY&lt;br /&gt;
#define FAC_RES							0x93	// Factory Reset&lt;br /&gt;
#define EN_JAM							0x94	// Jamming Remover&lt;br /&gt;
#define TEST_MODE						0x96	// Test Mode&lt;br /&gt;
&lt;br /&gt;
// Write register values (commands):&lt;br /&gt;
#define INIT_CFG_HOT_START				1		// Hot Start&lt;br /&gt;
#define INIT_CFG_WARM_START				2		// Warm Start init data loaded&lt;br /&gt;
#define INIT_CFG_WARM_START_EPH_CLR		3		// Warm Start Ephemeris cleared&lt;br /&gt;
#define INIT_CFG_COLD_START				4		// Cold Start&lt;br /&gt;
#define SET_FIX_TIME_1S					1		// Pos Fix Time 1 second&lt;br /&gt;
#define SET_FIX_TIME_2S					2		// Pos Fix Time 2 seconds&lt;br /&gt;
#define STBY_ENTER						1		// Standby (cleared after write)&lt;br /&gt;
#define FAC_RES_ENTER					1		// Factory Reset&lt;br /&gt;
#define EN_JAM_DISABLE					0		// Jamming Remover disable&lt;br /&gt;
#define EN_JAM_ENABLE					1		// Jamming Remover enable&lt;br /&gt;
#define TEST_MODE_INACTIVE				0		// Test Mode inactive&lt;br /&gt;
#define TEST_MODE_ACTIVE				0x15	// Test Mode active&lt;br /&gt;
&lt;br /&gt;
// Data structure (starts at LAT_DEG):&lt;br /&gt;
#define DATA_STRUCT						LAT_DEG	// Start&lt;br /&gt;
// All data from LAT_DEG to HEARTBEAT (48 bytes):&lt;br /&gt;
#define DATA_LENGTH						(HEARTBEAT - LAT_DEG + 1)&lt;br /&gt;
// Basic data from LAT_DEG to SAT_N (13 bytes):&lt;br /&gt;
#define DATA_BASIC						(SAT_N - LAT_DEG + 1)&lt;br /&gt;
&lt;br /&gt;
typedef union {&lt;br /&gt;
 	uint8_t byte;&lt;br /&gt;
	struct {&lt;br /&gt;
		unsigned ns    :1;				// 1: North 0: South&lt;br /&gt;
		unsigned ew    :1;				// 1: East 0: West&lt;br /&gt;
		unsigned spu   :1;				// 1: km/h 0: kn&lt;br /&gt;
		unsigned auton :1;				// 1: Data not valid 0: Autonomous&lt;br /&gt;
		unsigned fix0  :1;&lt;br /&gt;
		unsigned fix1  :1;&lt;br /&gt;
		unsigned stat0 :1;				// Invalid&lt;br /&gt;
		unsigned stat1 :1;				// GPS Com Error&lt;br /&gt;
	};&lt;br /&gt;
	struct {&lt;br /&gt;
		unsigned ns    :1;				// 1: North 0: South&lt;br /&gt;
		unsigned ew    :1;				// 1: East 0: West&lt;br /&gt;
		unsigned spu   :1;				// 1: km/h 0: kn&lt;br /&gt;
		unsigned auton :1;				// 1: Data not valid 0: Autonomous&lt;br /&gt;
		unsigned fix   :2;&lt;br /&gt;
		unsigned stat  :2;				// 00 -&amp;gt; Valid&lt;br /&gt;
										// 01 -&amp;gt; Invalid&lt;br /&gt;
										// 10 -&amp;gt; GPS Com Error&lt;br /&gt;
										// 11 -&amp;gt; n. def.&lt;br /&gt;
	};&lt;br /&gt;
} status_t;&lt;br /&gt;
&lt;br /&gt;
typedef union {&lt;br /&gt;
 	uint8_t byte;&lt;br /&gt;
	struct {							// Fix indicator:&lt;br /&gt;
		unsigned fix_0  :1;				//  1: GPS fix          2: DGPS fix&lt;br /&gt;
		unsigned fix_1  :1;				//  3: PPS fix          4: RTK&lt;br /&gt;
		unsigned fix_2  :1;				//  5: Float RTK        6: Dead reck.&lt;br /&gt;
		unsigned fix_3  :1;				//  7: Manual inp. mode 8: Simul. mode&lt;br /&gt;
		unsigned unused :3;&lt;br /&gt;
		unsigned ui_fix :1;				// HW signal from UC530&lt;br /&gt;
	};&lt;br /&gt;
	struct {&lt;br /&gt;
		unsigned fix    :4;				// See above &amp;quot;Fix indicator&amp;quot;!&lt;br /&gt;
		unsigned unused :3;&lt;br /&gt;
		unsigned ui_fix :1;				// HW signal from UC530&lt;br /&gt;
	};&lt;br /&gt;
} fix_ind_t;&lt;br /&gt;
&lt;br /&gt;
typedef union {&lt;br /&gt;
	struct {&lt;br /&gt;
		uint8_t   latDeg;&lt;br /&gt;
		uint8_t   latMin;&lt;br /&gt;
		uint16_t  latMinDec;&lt;br /&gt;
		uint8_t   lonDeg;&lt;br /&gt;
		uint8_t   lonMin;&lt;br /&gt;
		uint16_t  lonMinDec;&lt;br /&gt;
		status_t  status;&lt;br /&gt;
		fix_ind_t fixInd;&lt;br /&gt;
		uint8_t   hdop;&lt;br /&gt;
		uint8_t   hdopDec;&lt;br /&gt;
		uint8_t   satCount;&lt;br /&gt;
		uint16_t  course;&lt;br /&gt;
		uint8_t   courseDec;&lt;br /&gt;
		uint16_t  speed;&lt;br /&gt;
		uint8_t   speedDec;&lt;br /&gt;
		uint16_t  altitude;&lt;br /&gt;
		uint16_t  altDif;&lt;br /&gt;
		uint8_t   utcHour;&lt;br /&gt;
		uint8_t   utcMinute;&lt;br /&gt;
		uint8_t   utcSec;&lt;br /&gt;
		uint8_t   day;&lt;br /&gt;
		uint16_t  year;&lt;br /&gt;
		uint8_t   month;&lt;br /&gt;
		uint8_t   pdop;&lt;br /&gt;
		uint8_t   pdopDec;&lt;br /&gt;
		uint8_t   vdop;&lt;br /&gt;
		uint8_t   vdopDec;&lt;br /&gt;
		uint8_t   sat[12];&lt;br /&gt;
		uint8_t   swVersion;&lt;br /&gt;
		uint8_t   heartbeat;&lt;br /&gt;
	};&lt;br /&gt;
} gpsdata_t;&lt;br /&gt;
extern gpsdata_t gpsdata;&lt;br /&gt;
&lt;br /&gt;
void I2C_GPS_reset(void);&lt;br /&gt;
void I2C_GPS_write_cmd(uint8_t, uint8_t);&lt;br /&gt;
uint8_t I2C_GPS_read_reg(uint8_t);&lt;br /&gt;
void I2C_GPS_read(uint8_t);&lt;br /&gt;
void I2C_GPS_init(void);&lt;br /&gt;
void I2C_GPS_new_addr(uint8_t);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
/******************************************************************************&lt;br /&gt;
 * Additional info&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Changelog:&lt;br /&gt;
 * &lt;br /&gt;
 *  ---&amp;gt; changes are documented in the file &amp;quot;RP6M256_I2C_GPSLib.c&amp;quot;&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
======Libary Source======&lt;br /&gt;
Datei: RP6M256_I2C_GPSLib.c&lt;br /&gt;
&amp;lt;pre&amp;gt;/* ****************************************************************************&lt;br /&gt;
 *                           _______________________&lt;br /&gt;
 *                           \| RP6  ROBOT SYSTEM |/&lt;br /&gt;
 *                            \_-_-_-_-_-_-_-_-_-_/           &amp;gt;&amp;gt;&amp;gt; RP6 M256 WIFI&lt;br /&gt;
 * ----------------------------------------------------------------------------&lt;br /&gt;
 * ----------------------------- [c]2014 - Dirk -------------------------------&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * File: RP6M256_I2C_GPSLib.c&lt;br /&gt;
 * Version: 1.0&lt;br /&gt;
 * Target: RP6 M256 WIFI - ATMEGA2560 @16.00MHz&lt;br /&gt;
 *         and a RP6 I2C GPS Receiver (CONRAD 1082385)&lt;br /&gt;
 *         optionally on a RP6 Sensor Board (CONRAD 1082384)&lt;br /&gt;
 * Author(s): Dirk&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Description:&lt;br /&gt;
 * &lt;br /&gt;
 * This is our new Library that contains basic routines and functions for&lt;br /&gt;
 * accessing the RP6 I2C GPS Receiver JM3-GPS (CONRAD 1082385).&lt;br /&gt;
 * The library assumes the I2C GPS Receiver software (firmware) v1.2.&lt;br /&gt;
 * If the I2C GPS Receiver is located on the RP6 Sensor Board (CONRAD 1082384)&lt;br /&gt;
 * and connected to the I2C-MODULE plug M1, the RP6M256_Sensor_BoardLib has to&lt;br /&gt;
 * be included!&lt;br /&gt;
 * &lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Includes:&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6M256_I2C_GPSLib.h&amp;quot; 		&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Variables:&lt;br /&gt;
&lt;br /&gt;
uint8_t gpsdataBuf[DATA_LENGTH + 1]; &lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Software reset for the I2C GPS Receiver.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void I2C_GPS_reset(void)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_GPS_RECEIVER_ADR, 0, 0x06);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Writes a command cmd to a register reg of the&lt;br /&gt;
 * I2C GPS Receiver.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: reg -&amp;gt; Write register [0x90..0x96]&lt;br /&gt;
 *        cmd -&amp;gt; Command&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void I2C_GPS_write_cmd(uint8_t reg, uint8_t cmd)&lt;br /&gt;
{&lt;br /&gt;
	if((reg &amp;lt; INIT_CFG) || (reg &amp;gt; TEST_MODE)) return;&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_GPS_RECEIVER_ADR, reg, cmd);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Reads a single register reg from the I2C GPS&lt;br /&gt;
 * Receiver.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: reg -&amp;gt; Read register [0x20..0x50]&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
uint8_t I2C_GPS_read_reg(uint8_t reg)&lt;br /&gt;
{&lt;br /&gt;
	if((reg &amp;lt; WHO_AM_I) || (reg &amp;gt; HEARTBEAT)) reg = WHO_AM_I;&lt;br /&gt;
	I2CTWI_transmitByte(I2C_GPS_RECEIVER_ADR, reg);&lt;br /&gt;
	return (I2CTWI_readByte(I2C_GPS_RECEIVER_ADR));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
gpsdata_t gpsdata;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Reads the GPS data from the I2C GPS Receiver.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: length -&amp;gt; Number of data bytes [1..48]&lt;br /&gt;
 *&lt;br /&gt;
 * Hint: If length = DATA_BASIC, only basic GPS&lt;br /&gt;
 *       data are read. If length = DATA_LENGTH,&lt;br /&gt;
 *       ALL GPS data are read.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void I2C_GPS_read(uint8_t length)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t i;&lt;br /&gt;
&lt;br /&gt;
	if(length &amp;gt; DATA_LENGTH) length = DATA_LENGTH;&lt;br /&gt;
	I2CTWI_readRegisters(I2C_GPS_RECEIVER_ADR, DATA_STRUCT, gpsdataBuf, length);&lt;br /&gt;
	for(i = length; i &amp;lt; DATA_LENGTH; i++) {&lt;br /&gt;
		gpsdataBuf[i] = 0;&lt;br /&gt;
	}&lt;br /&gt;
	gpsdata.latDeg = gpsdataBuf[0];&lt;br /&gt;
	gpsdata.latMin = gpsdataBuf[1];&lt;br /&gt;
	gpsdata.latMinDec = gpsdataBuf[2] + (gpsdataBuf[3] &amp;lt;&amp;lt; 8);&lt;br /&gt;
	gpsdata.lonDeg = gpsdataBuf[4];&lt;br /&gt;
	gpsdata.lonMin = gpsdataBuf[5];&lt;br /&gt;
	gpsdata.lonMinDec = gpsdataBuf[6] + (gpsdataBuf[7] &amp;lt;&amp;lt; 8);&lt;br /&gt;
	gpsdata.status.byte = gpsdataBuf[8];&lt;br /&gt;
	gpsdata.fixInd.byte = gpsdataBuf[9];&lt;br /&gt;
	gpsdata.hdop = gpsdataBuf[10];&lt;br /&gt;
	gpsdata.hdopDec = gpsdataBuf[11];&lt;br /&gt;
	gpsdata.satCount = gpsdataBuf[12];&lt;br /&gt;
	if(length == DATA_BASIC) return;&lt;br /&gt;
	gpsdata.course = gpsdataBuf[13] + (gpsdataBuf[14] &amp;lt;&amp;lt; 8);&lt;br /&gt;
	gpsdata.courseDec = gpsdataBuf[15];&lt;br /&gt;
	gpsdata.speed = gpsdataBuf[16] + (gpsdataBuf[17] &amp;lt;&amp;lt; 8);&lt;br /&gt;
	gpsdata.speedDec = gpsdataBuf[18];&lt;br /&gt;
	gpsdata.altitude = gpsdataBuf[19] + (gpsdataBuf[20] &amp;lt;&amp;lt; 8);&lt;br /&gt;
	gpsdata.altDif = gpsdataBuf[21] + (gpsdataBuf[22] &amp;lt;&amp;lt; 8);&lt;br /&gt;
	gpsdata.utcHour = gpsdataBuf[23];&lt;br /&gt;
	gpsdata.utcMinute = gpsdataBuf[24];&lt;br /&gt;
	gpsdata.utcSec = gpsdataBuf[25];&lt;br /&gt;
	gpsdata.day = gpsdataBuf[26];&lt;br /&gt;
	gpsdata.year = gpsdataBuf[27] + (gpsdataBuf[28] * 100);&lt;br /&gt;
	gpsdata.month = gpsdataBuf[29];&lt;br /&gt;
	gpsdata.pdop = gpsdataBuf[30];&lt;br /&gt;
	gpsdata.pdopDec = gpsdataBuf[31];&lt;br /&gt;
	gpsdata.vdop = gpsdataBuf[32];&lt;br /&gt;
	gpsdata.vdopDec = gpsdataBuf[33];&lt;br /&gt;
	for(i = 34; i &amp;lt; 46; i++) {&lt;br /&gt;
		gpsdata.sat[i - 34] = gpsdataBuf[i];&lt;br /&gt;
	}&lt;br /&gt;
	gpsdata.swVersion = gpsdataBuf[46];&lt;br /&gt;
	gpsdata.heartbeat = gpsdataBuf[47];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * You MUST call this function at the beginning of a&lt;br /&gt;
 * main program, that uses the RP6 I2C GPS Receiver. &lt;br /&gt;
 * If SENSOR_BOARD is defined, the I2C-MODULE power&lt;br /&gt;
 * will be switched on with the function&lt;br /&gt;
 * setI2CModulePower() defined in the&lt;br /&gt;
 * RP6M256_Sensor_BoardLib, which will be included&lt;br /&gt;
 * then.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void I2C_GPS_init(void)&lt;br /&gt;
{&lt;br /&gt;
#ifdef SENSOR_BOARD&lt;br /&gt;
	// I2C-MODULE (plug M1) power on: &lt;br /&gt;
	setI2CModulePower(1);&lt;br /&gt;
#endif&lt;br /&gt;
	// Other init procedures here!&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Writes a new I2C address to the I2C GPS Receiver.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: addr -&amp;gt; New I2C address [0xc8..0xde]&lt;br /&gt;
 *&lt;br /&gt;
 * Hints: - Default I2C address is 0xc8.&lt;br /&gt;
 *        - You may choose a new I2C address in&lt;br /&gt;
 *          the range 0xc8..0xde.&lt;br /&gt;
 *        - After writing a new address you have&lt;br /&gt;
 *          to switch the I2C GPS Receiver off&lt;br /&gt;
 *          and on again.&lt;br /&gt;
 *        - Definition I2C_GPS_RECEIVER_ADR must&lt;br /&gt;
 *          be adapted to the new I2C address!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void I2C_GPS_new_addr(uint8_t addr)&lt;br /&gt;
{&lt;br /&gt;
	if((addr &amp;lt; 0xc8) || (addr &amp;gt; 0xde)) return;&lt;br /&gt;
	addr &amp;amp;= 0xfe;								// Clear R/W bit&lt;br /&gt;
	I2CTWI_transmit3Bytes(I2C_GPS_RECEIVER_ADR, 0, 0x04, addr);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&lt;br /&gt;
/******************************************************************************&lt;br /&gt;
 * Additional info&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Changelog:&lt;br /&gt;
 * - v. 1.0 (initial release) 21.04.2014 by Dirk&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Erklärung&lt;br /&gt;
&lt;br /&gt;
======Demo======&lt;br /&gt;
makefile:&lt;br /&gt;
&amp;lt;pre&amp;gt;...&lt;br /&gt;
TARGET = RP6M256_Sensor_Board_02&lt;br /&gt;
...&lt;br /&gt;
SRC += $(RP6_LIB_PATH)/RP6common/RP6I2CmasterTWI.c&lt;br /&gt;
&lt;br /&gt;
SRC += $(RP6_LIB_PATH)/RP6control_M256_WIFI/RP6M256_Sensor_BoardLib.c&lt;br /&gt;
SRC += $(RP6_LIB_PATH)/RP6control_M256_WIFI/RP6M256_I2C_GPSLib.c&lt;br /&gt;
...&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Datei: RP6M256_Sensor_Board_02.c&lt;br /&gt;
&amp;lt;pre&amp;gt;/* &lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * RP6 ROBOT SYSTEM - RP6 CONTROL M256 Examples&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Example: RP6M256 Sensor Board&lt;br /&gt;
 * Author(s): Dirk&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Description:&lt;br /&gt;
 * In this example we show a second test for the RP6 Sensor Board.&lt;br /&gt;
 * &lt;br /&gt;
 * ############################################################################&lt;br /&gt;
 * The Robot does NOT move in this example! You can simply put it on a table&lt;br /&gt;
 * next to your PC and you should connect it to the PC via the USB Interface!&lt;br /&gt;
 * You should also connect to it via WIFI.&lt;br /&gt;
 * ############################################################################&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Includes:&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6M256Lib.h&amp;quot; 				// The RP6 M256 Library. &lt;br /&gt;
										// Always needs to be included!&lt;br /&gt;
#include &amp;quot;RP6I2CmasterTWI.h&amp;quot;			// Include the I2C-Bus Master Library&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Include our new &amp;quot;RP6M256 I2C GPS Receiver library&amp;quot;:&lt;br /&gt;
// (This is the library for accessing the RP6 I2C GPS Receiver!)&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6M256_I2C_GPSLib.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Write a floating point number to the WIFI.&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *&lt;br /&gt;
 *			// Write a floating point number to the WIFI (no exponent):&lt;br /&gt;
 *			writeDouble_WIFI(1234567.890, 11, 3);&lt;br /&gt;
 *&lt;br /&gt;
 * The value of prec (precision) defines the number of decimal places.&lt;br /&gt;
 * For 32 bit floating point variables (float, double ...) 6 is&lt;br /&gt;
 * the max. value for prec (7 relevant digits).&lt;br /&gt;
 * The value of width defines the overall number of characters in the&lt;br /&gt;
 * floating point number including the decimal point. The number of&lt;br /&gt;
 * pre-decimal positions is: (width - prec - 1).&lt;br /&gt;
 */&lt;br /&gt;
void writeDouble_WIFI(double number, uint8_t width, uint8_t prec)&lt;br /&gt;
{char buffer[width + 1];&lt;br /&gt;
	dtostrf(number, width, prec, &amp;amp;buffer[0]);&lt;br /&gt;
	writeString_WIFI(&amp;amp;buffer[0]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Write a floating point number to the LCD.&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *&lt;br /&gt;
 *			// Write a floating point number to the LCD (no exponent):&lt;br /&gt;
 *			writeDoubleLCD(1234567.890, 11, 3);&lt;br /&gt;
 *&lt;br /&gt;
 * The value of prec (precision) defines the number of decimal places.&lt;br /&gt;
 * For 32 bit floating point variables (float, double ...) 6 is&lt;br /&gt;
 * the max. value for prec (7 relevant digits).&lt;br /&gt;
 * The value of width defines the overall number of characters in the&lt;br /&gt;
 * floating point number including the decimal point. The number of&lt;br /&gt;
 * pre-decimal positions is: (width - prec - 1).&lt;br /&gt;
 */&lt;br /&gt;
void writeDoubleLCD(double number, uint8_t width, uint8_t prec)&lt;br /&gt;
{char buffer[width + 1];&lt;br /&gt;
	dtostrf(number, width, prec, &amp;amp;buffer[0]);&lt;br /&gt;
	writeStringLCD(&amp;amp;buffer[0]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Error handler&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function gets called automatically if there was an I2C Error like&lt;br /&gt;
 * the slave sent a &amp;quot;not acknowledge&amp;quot; (NACK, error codes e.g. 0x20 or 0x30).&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void I2C_transmissionError(uint8_t errorState)&lt;br /&gt;
{&lt;br /&gt;
	writeString_P_WIFI(&amp;quot;\nI2C ERROR - TWI STATE: 0x&amp;quot;);&lt;br /&gt;
	writeInteger_WIFI(errorState, HEX);&lt;br /&gt;
	writeChar_WIFI('\n');&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Main function - The program starts here:&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
	initRP6M256();    // Always call this first! The Processor will not work&lt;br /&gt;
					  // correctly otherwise. &lt;br /&gt;
&lt;br /&gt;
	initLCD(); // Initialize the LC-Display (LCD)&lt;br /&gt;
			   // Always call this before using the LCD!&lt;br /&gt;
&lt;br /&gt;
	setLEDs(0b1111);&lt;br /&gt;
	mSleep(500);&lt;br /&gt;
	setLEDs(0b0000);&lt;br /&gt;
&lt;br /&gt;
	writeString_P_WIFI(&amp;quot;\n\nRP6 Sensor Board Selftest 2!\n&amp;quot;); &lt;br /&gt;
&lt;br /&gt;
	// IMPORTANT:&lt;br /&gt;
	I2CTWI_initMaster(100); // Initialize the TWI Module for Master operation&lt;br /&gt;
							// with 100kHz SCL Frequency&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	// Register the event handler:&lt;br /&gt;
	I2CTWI_setTransmissionErrorHandler(I2C_transmissionError);&lt;br /&gt;
&lt;br /&gt;
	setLEDs(0b1111);&lt;br /&gt;
&lt;br /&gt;
	// Write a text message to the LCD:&lt;br /&gt;
	showScreenLCD(&amp;quot;################&amp;quot;, &amp;quot;################&amp;quot;);&lt;br /&gt;
	mSleep(1500);&lt;br /&gt;
	showScreenLCD(&amp;quot;RP6v2-M256-WIFI &amp;quot;, &amp;quot;Example Program&amp;quot;);&lt;br /&gt;
	mSleep(2500); &lt;br /&gt;
	showScreenLCD(&amp;quot;RP6 Sensor Board&amp;quot;, &amp;quot;   Selftest 2&amp;quot;);&lt;br /&gt;
	mSleep(2500);&lt;br /&gt;
	clearLCD();&lt;br /&gt;
&lt;br /&gt;
	setLEDs(0b0000);&lt;br /&gt;
&lt;br /&gt;
	// ---------------------------------------&lt;br /&gt;
&lt;br /&gt;
	uint8_t onoff = 0;&lt;br /&gt;
	uint8_t i;&lt;br /&gt;
&lt;br /&gt;
	startStopwatch1();&lt;br /&gt;
	startStopwatch2();&lt;br /&gt;
&lt;br /&gt;
	// IMPORTANT:&lt;br /&gt;
	sensor_board_init();						// RP6 Sensor Board init!!!&lt;br /&gt;
	I2C_GPS_init();								// RP6 I2C GPS Receiver init&lt;br /&gt;
&lt;br /&gt;
	while(true) &lt;br /&gt;
	{&lt;br /&gt;
		if(getStopwatch1() &amp;gt; 1000) // 1s&lt;br /&gt;
		{&lt;br /&gt;
			if (onoff) onoff = 0;&lt;br /&gt;
			else onoff = 1;&lt;br /&gt;
&lt;br /&gt;
			// Show GPS data:&lt;br /&gt;
			I2C_GPS_read(DATA_LENGTH);			// Read data&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nLAT_DEG:     &amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.latDeg, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;° &amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.latMin, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;.&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.latMinDec, DEC, 4);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;' &amp;quot;);&lt;br /&gt;
			if(gpsdata.status.ns)&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;N&amp;quot;);&lt;br /&gt;
			else&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;S&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nLON_DEG:    &amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.lonDeg, DEC, 3);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;° &amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.lonMin, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;.&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.lonMinDec, DEC, 4);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;' &amp;quot;);&lt;br /&gt;
			if(gpsdata.status.ew)&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;E&amp;quot;);&lt;br /&gt;
			else&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;W&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nSTATUS:     &amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.status.byte, BIN, 8);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nFIX_IND:    &amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.fixInd.byte, BIN, 8);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nHDOP:       &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(gpsdata.hdop, DEC);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;.&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.hdopDec, DEC, 2);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nSAT_N:      &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(gpsdata.satCount, DEC);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nCOURSE_T:   &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(gpsdata.course, DEC);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;.&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.courseDec, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;°&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nSPEED:      &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(gpsdata.speed, DEC);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;.&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.speedDec, DEC, 2);&lt;br /&gt;
			if(gpsdata.status.spu)&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;km/h&amp;quot;);&lt;br /&gt;
			else&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;kn&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nALT:        &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(gpsdata.altitude, DEC);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;m\nALT_DIF:    &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(gpsdata.altDif, DEC);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;m\nUTC:        &amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.utcHour, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;:&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.utcMinute, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;:&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.utcSec, DEC, 2);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nDATE:       &amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.day, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;.&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.month, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;.&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.year, DEC, 4);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nPDOP:       &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(gpsdata.pdop, DEC);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;.&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.pdopDec, DEC, 2);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nVDOP:       &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(gpsdata.vdop, DEC);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;.&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.vdopDec, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			for(i = 0; i &amp;lt; gpsdata.satCount; i++) {&lt;br /&gt;
				if(i == 8) writeString_P_WIFI(&amp;quot;\n&amp;quot;);&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;  SAT_&amp;quot;);&lt;br /&gt;
				writeIntegerLength_WIFI(i + 1, HEX, 1);&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;: &amp;quot;);&lt;br /&gt;
				writeInteger_WIFI(gpsdata.sat[i], DEC);&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nSW_VERSION: &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(gpsdata.swVersion, DEC);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nHEARTBEAT:  &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(gpsdata.heartbeat, DEC);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			// RP6 Sensor Board shutdown (button &amp;amp; status LED test):&lt;br /&gt;
			if (pressedButton) {&lt;br /&gt;
				setStatusLED(1);&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;\nPress button again for RP6 Sensor Board SHUTDOWN!\n&amp;quot;);&lt;br /&gt;
				mSleep(2000);&lt;br /&gt;
				do {&lt;br /&gt;
					if(getStopwatch2() &amp;gt; 200) { // 0.2s&lt;br /&gt;
						if (onoff) onoff = 0;&lt;br /&gt;
						else onoff = 1;&lt;br /&gt;
						if (onoff) setStatusLED(1);&lt;br /&gt;
						else setStatusLED(0);&lt;br /&gt;
						setStopwatch2(0);&lt;br /&gt;
					}&lt;br /&gt;
					mSleep(1);&lt;br /&gt;
					task_I2CTWI();&lt;br /&gt;
				} while (!readButton());&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;\n\n\n\n\nPlease wait for RP6 Sensor Board SHUTDOWN...\n&amp;quot;);&lt;br /&gt;
				sensor_board_shutdown();&lt;br /&gt;
				mSleep(3000);&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;\n\n\nThe RP6 Sensor Board now is in SHUTDOWN MODE!!!\n&amp;quot;);&lt;br /&gt;
				mSleep(1000);&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;\nRESET the M256 microcontroller now...\n\n&amp;quot;);&lt;br /&gt;
				while(true) {};&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			setStopwatch1(0);&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		task_RP6SensorBoard();					// RP6 Sensor Board task&lt;br /&gt;
&lt;br /&gt;
		task_I2CTWI();&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Erklärung&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Gyro Modul JM3-GYRO====&lt;br /&gt;
=====Dokumentation=====&lt;br /&gt;
Die Dokumentation zum Gyro Modul befindet sich auf der mitgelieferten ''&amp;quot;RP6 Robot System Xtra Modules CD-ROM&amp;quot;''.&lt;br /&gt;
&lt;br /&gt;
======Manuals======&lt;br /&gt;
Das Handbuch in der aktuellen Version kann [http://www.jm3-engineering.com/download/doc/ManualGyroModule_de.pdf hier] eingesehen werden.&lt;br /&gt;
&lt;br /&gt;
=====Demo-Programme=====&lt;br /&gt;
Ein Demo-Programm zum Gyro Modul befindet sich integriert in die RP6 Sensor Board Demo auf der mitgelieferten ''&amp;quot;RP6 Robot System Xtra Modules CD-ROM&amp;quot;''. Diese Demo kann auch in der aktuellen Version im Download Bereich von [http://www.jm3-engineering.com/downloads.htm JM3 Engineering] herunter geladen werden.&lt;br /&gt;
&lt;br /&gt;
=====Analoge Auswertung=====&lt;br /&gt;
Am Pin ''OUT'' des Gyro Moduls (siehe [http://www.rn-wissen.de/index.php/RP6_Sensor_Board_und_Xtra_Module#Anschluss-Schema_2 Anschluss-Schema]!) liegt die Ausgangsspannung des Sensors (0..5V) an. Sie kann mit einem ADC-Eingang eines Microcontrollers gemessen werden.&lt;br /&gt;
Syntax mit den Libraries der RP6Base, M32 oder M256 WiFi (ADC Kanal 0):&lt;br /&gt;
 uint16_t result = readADC(0);&lt;br /&gt;
In der C-Control-Pro Umgebung der M128 sieht das z.B. in CompactC so aus (ADC Kanal 0):&lt;br /&gt;
 word result;&lt;br /&gt;
 ADC_Set(ADC_VREF_VCC, 0);&lt;br /&gt;
 ...&lt;br /&gt;
 result = ADC_Read();&lt;br /&gt;
Das Ergebnis ''result'' kann noch zur Weiterverarbeitung angepasst werden:&lt;br /&gt;
 #define ADCVAL_ZERORATE_LEVEL			511		// Zero rate Level&lt;br /&gt;
 ...&lt;br /&gt;
 int16_t z_axisg = result - ADCVAL_ZERORATE_LEVEL;&lt;br /&gt;
Dadurch zeigt ''z_axisg'' Null an, wenn keine Rotation anliegt und wird positiv, wenn nach LINKS gedreht wird und negativ bei RECHTS-Drehung. Die Definition ADCVAL_ZERORATE_LEVEL muss natürlich an den eigenen Sensor-Nullwert angepasst werden.&lt;br /&gt;
&lt;br /&gt;
Aus dem Absolutwert von ''z_axisg'' kann man die Drehrate (Drehgeschwindigkeit) auch bestimmen:&lt;br /&gt;
&lt;br /&gt;
In den [[RP6_Sensor_Board_und_Xtra_Module#Technische_Daten_3|Technischen Daten]] ist die Empfindlichkeit des Sensors mit '''10mV/dps''' (0,01V pro Grad und Sekunde) angegeben. Damit errechnet sich die Drehrate als:&lt;br /&gt;
 Drehrate [dps] = abs(z_axisg) * (5 / 1024 / 0.01) = abs(z_axisg) * 0.48828125&lt;br /&gt;
&lt;br /&gt;
=====Optionale Ansteuerung=====&lt;br /&gt;
Im [[RP6_Sensor_Board_und_Xtra_Module#Anschluss-Schema_2|Anschluss-Schema]] ist erkennbar, dass es noch 2 Steuerleitungen ''SLEEP/PD'' und ''ST'' gibt. Mit diesen Anschlüssen kann die Betriebsart des Gyro Moduls festgelegt werden, siehe nachfolgende Tabelle:&lt;br /&gt;
{|  {{Blauetabelle}} &lt;br /&gt;
|Betriebsart&lt;br /&gt;
|ST&lt;br /&gt;
|SLEEP/PD&lt;br /&gt;
|Stromverbrauch&lt;br /&gt;
|-&lt;br /&gt;
|Normal&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|4,2mA&lt;br /&gt;
|-&lt;br /&gt;
|Sleep&lt;br /&gt;
|0&lt;br /&gt;
|1&lt;br /&gt;
|2,2mA&lt;br /&gt;
|-&lt;br /&gt;
|Self-test&lt;br /&gt;
|1&lt;br /&gt;
|0&lt;br /&gt;
|4,2mA&lt;br /&gt;
|-&lt;br /&gt;
|Power-down&lt;br /&gt;
|1&lt;br /&gt;
|1&lt;br /&gt;
|'''5µA'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
Will man zwischen den Betriebsarten per Software umschalten, muss man die beiden Steuerleitungen mit I/O Portpins des Microcontrollers verbinden, die als Ausgänge konfiguriert sind. Braucht man diese Funktion nicht, reicht es, ''ST'' und ''SLEEP/PD'' mit GND zu verbinden (Betriebsart &amp;quot;Normal&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====3D Accelerometer Modul JM3-3DA====&lt;br /&gt;
Das 3D Accelerometer Modul kann über den I2C- oder den SPI-Bus angesteuert werden. Wird das Modul auf der RP6 CONTROL M32 Platine betrieben (es sitzt also auf dem Sockel IC5 für das 2. SPI-EEPROM), dann erfolgt die Ansteuerung über den SPI-Bus. Die SPI-Grundfunktionen befinden sich in der RP6ControlLib, die daher eingebunden werden muss.&lt;br /&gt;
&lt;br /&gt;
=====Dokumentation=====&lt;br /&gt;
Die Dokumentation zum 3D Accelerometer Modul befindet sich auf der mitgelieferten ''&amp;quot;RP6 Robot System Xtra Modules CD-ROM&amp;quot;''.&lt;br /&gt;
&lt;br /&gt;
======Manuals======&lt;br /&gt;
Das Handbuch in der aktuellen Version kann [http://www.jm3-engineering.com/download/doc/Manual3DAccelerometer_de.pdf hier] eingesehen werden.&lt;br /&gt;
&lt;br /&gt;
=====Demo-Programme=====&lt;br /&gt;
Ein Demo-Programm zum 3D Accelerometer Modul befindet sich integriert in die RP6 Sensor Board Demo auf der mitgelieferten ''&amp;quot;RP6 Robot System Xtra Modules CD-ROM&amp;quot;''. Diese Demo kann auch in der aktuellen Version im Download Bereich von [http://www.jm3-engineering.com/downloads.htm JM3 Engineering] herunter geladen werden.&lt;br /&gt;
&lt;br /&gt;
=====RP6 CONTROL M32: ACCSENS Library=====&lt;br /&gt;
Die nachfolgende RP6ControlACCSENSLib (Eigenentwicklung in GCC) dient zur Ansteuerung des 3D Accelerometer Moduls durch die RP6 CONTROL M32.&lt;br /&gt;
&lt;br /&gt;
======Configuration Header======&lt;br /&gt;
Vor dem Kompilieren der Library muss eine Anpassung des Configuration Headers an die eigenen Hardware-Voraussetzungen erfolgen.&lt;br /&gt;
Dazu gibt es im Configuration Header eine Definition:&lt;br /&gt;
* EXP_STACK_1 -&amp;gt; Die RP6 CONTROL M32 sitzt auf dem vorderen Platinenstapel 1 des RP6&lt;br /&gt;
Im nachfolgenden Listing ist die Definition EXP_STACK_1 NICHT aktiv (d.h. die M32 sitzt auf dem hinteren Platinenstapel 2!). Dies muss an die eigene Hardware angepaßt werden. Wenn die RP6 CONTROL M32 auf dem vorderen Platinenstapel 1 des RP6 sitzt, muss die Zeile mit &amp;quot;EXP_STACK_1&amp;quot; &amp;quot;aktiviert&amp;quot; werden. Dazu entfernt man &amp;quot;//&amp;quot; am Zeilenanfang:&lt;br /&gt;
 #define EXP_STACK_1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Bevor man den Beschleunigungssensor nutzen kann, muss man ihn kalibrieren:&lt;br /&gt;
&lt;br /&gt;
'''Accelerometer:'''&lt;br /&gt;
* Die X-Achse wird kalibriert, indem man den RP6 mit der rechten Seite nach unten hält und den Maximalwert in MAX_X_A einträgt. Dann neigt man ihn auf seine linke Seite und trägt den negativen Maximalwert in MIN_X_A ein.&lt;br /&gt;
* Die Y-Achse wird kalibriert, indem man den RP6 mit der Vorderseite nach oben hält und den Maximalwert in MAX_Y_A einträgt. Dann kippt man die Vorderseite nach unten und trägt den negativen Maximalwert in MIN_Y_A ein.&lt;br /&gt;
* Die Z-Achse wird kalibriert, indem man den RP6 normal waagerecht hält und den Maximalwert in MAX_Z_A einträgt. Dann dreht man den RP6 &amp;quot;auf den Kopf&amp;quot; und trägt den negativen Maximalwert in MIN_Z_A ein.&lt;br /&gt;
* Sollten die angezeigten Pitch- und Roll-Werte nach der Kalibrierung der Achsen und genau waagerecht stehendem Sensor bzw. RP6 vom Nullwert deutlich abweichen, kann man sie mithilfe der Definitionen OFFSET_PITCH_A und OFFSET_ROLL_A &amp;quot;nullen&amp;quot;. Die Einheit dieser Definitionen ist °.&lt;br /&gt;
Nach dem Eintragen der Kalibrierungswerte muss das Programm neu kompiliert werden!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Datei: RP6ControlACCSENS.h&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;/* ****************************************************************************&lt;br /&gt;
 *                           _______________________&lt;br /&gt;
 *                           \| RP6  ROBOT SYSTEM |/&lt;br /&gt;
 *                            \_-_-_-_-_-_-_-_-_-_/             &amp;gt;&amp;gt;&amp;gt; RP6 CONTROL&lt;br /&gt;
 * ----------------------------------------------------------------------------&lt;br /&gt;
 * ----------------------------- [c]2014 - Dirk -------------------------------&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * File: RP6ControlACCSENS.h&lt;br /&gt;
 * Version: 1.0&lt;br /&gt;
 * Target: RP6 CONTROL - ATMEGA32 @16.00MHz&lt;br /&gt;
 * Author(s): Dirk&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Description:&lt;br /&gt;
 * Configuration header file for new ACCSENS library.&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * THE CHANGELOG CAN BE FOUND AT THE END OF THIS FILE!&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
#ifndef RP6CONTROLACCSENS_H&lt;br /&gt;
#define RP6CONTROLACCSENS_H&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Sensor position on the RP6 robot:&lt;br /&gt;
// (If EXP_STACK_1 is defined, the RP6 CONTROL M32 is located on the front&lt;br /&gt;
//  stack for addon boards on the RP6 robot. If EXP_STACK_1 is NOT defined&lt;br /&gt;
//  (default), the RP6 CONTROL M32 is mounted on the rear stack.)&lt;br /&gt;
// -------------------&lt;br /&gt;
//#define EXP_STACK_1&lt;br /&gt;
// -------------------&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// The following sensor is used:&lt;br /&gt;
// - 3D Accelerometer Modul (CONRAD 1082387-62) with LIS302DLH 3-axis&lt;br /&gt;
//   accelerometer&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// LIS302DLH accelerometer calibration data:&lt;br /&gt;
#define MAX_X_A						32767		// Max. X-axis value&lt;br /&gt;
#define MIN_X_A						-32768		// Min. X-axis value&lt;br /&gt;
#define MAX_Y_A						32767		// Max. Y-axis value&lt;br /&gt;
#define MIN_Y_A						-32768		// Min. Y-axis value&lt;br /&gt;
#define MAX_Z_A						32767		// Max. Z-axis value&lt;br /&gt;
#define MIN_Z_A						-32768		// Min. Z-axis value&lt;br /&gt;
#define OFFSET_PITCH_A				0.0			// Offset Pitch [°]&lt;br /&gt;
#define OFFSET_ROLL_A				0.0			// Offset Roll [°]&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
/******************************************************************************&lt;br /&gt;
 * Additional info&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Changelog:&lt;br /&gt;
 * &lt;br /&gt;
 *  ---&amp;gt; changes are documented in the file &amp;quot;RP6ControlACCSENSLib.c&amp;quot;&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
======Library Header======&lt;br /&gt;
Datei: RP6ControlACCSENSLib.h&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;/* ****************************************************************************&lt;br /&gt;
 *                           _______________________&lt;br /&gt;
 *                           \| RP6  ROBOT SYSTEM |/&lt;br /&gt;
 *                            \_-_-_-_-_-_-_-_-_-_/             &amp;gt;&amp;gt;&amp;gt; RP6 CONTROL&lt;br /&gt;
 * ----------------------------------------------------------------------------&lt;br /&gt;
 * ----------------------------- [c]2014 - Dirk -------------------------------&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * File: RP6ControlACCSENSLib.h&lt;br /&gt;
 * Version: 1.0&lt;br /&gt;
 * Target: RP6 CONTROL - ATMEGA32 @16.00MHz&lt;br /&gt;
 * Author(s): Dirk&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Description:&lt;br /&gt;
 * This is the RP6ControlACCSENSLib header file.&lt;br /&gt;
 * You have to include this file, if you want to use the library&lt;br /&gt;
 * RP6ControlACCSENSLib.c in your own projects.&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * THE CHANGELOG CAN BE FOUND AT THE END OF THIS FILE!&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
#ifndef RP6CONTROLACCSENSLIB_H&lt;br /&gt;
#define RP6CONTROLACCSENSLIB_H&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Includes:&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6ControlLib.h&amp;quot; 		// The RP6 Control Library (v. 1.1 or higher). &lt;br /&gt;
#include &amp;quot;RP6ControlACCSENS.h&amp;quot;&lt;br /&gt;
#include &amp;lt;math.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&lt;br /&gt;
#define ACC_CS							MEM_CS2&lt;br /&gt;
#define DEVICE_IDENTIFIER				0x32&lt;br /&gt;
&lt;br /&gt;
// Registers:&lt;br /&gt;
#define WHO_AM_I						0x0f&lt;br /&gt;
#define CTRL_REG1						0x20&lt;br /&gt;
#define CTRL_REG2						0x21&lt;br /&gt;
#define CTRL_REG3						0x22&lt;br /&gt;
#define CTRL_REG4						0x23&lt;br /&gt;
#define CTRL_REG5						0x24&lt;br /&gt;
#define HP_FILTER_RESET					0x25&lt;br /&gt;
#define REFERENCE						0x26&lt;br /&gt;
#define STATUS_REG						0x27&lt;br /&gt;
#define OUT_X_L							0x28&lt;br /&gt;
#define OUT_X_H							0x29&lt;br /&gt;
#define OUT_Y_L							0x2a&lt;br /&gt;
#define OUT_Y_H							0x2b&lt;br /&gt;
#define OUT_Z_L							0x2c&lt;br /&gt;
#define OUT_Z_H							0x2d&lt;br /&gt;
#define INT1_CFG						0x30&lt;br /&gt;
#define INT1_SOURCE						0x31&lt;br /&gt;
#define INT1_THS						0x32&lt;br /&gt;
#define INT1_DURATION					0x33&lt;br /&gt;
#define INT2_CFG						0x34&lt;br /&gt;
#define INT2_SOURCE						0x35&lt;br /&gt;
#define INT2_THS						0x36&lt;br /&gt;
#define INT2_DURATION					0x37&lt;br /&gt;
&lt;br /&gt;
// Control Register bitmasks:&lt;br /&gt;
#define CTRL_REG1_POWERDOWN				0b00000000&lt;br /&gt;
#define CTRL_REG1_3D_DEFAULT			0b00000111&lt;br /&gt;
#define CTRL_REG1_3D_LOPWR_10HZ			0b11000111&lt;br /&gt;
#define CTRL_REG2_DEFAULT				0b00000000&lt;br /&gt;
#define CTRL_REG3_DEFAULT				0b00000000&lt;br /&gt;
#define CTRL_REG4_DEFAULT				0b00000000&lt;br /&gt;
#define CTRL_REG4_BDU_2G				0b10000000&lt;br /&gt;
#define CTRL_REG4_BDU_2G_STSIGN			0b10001000&lt;br /&gt;
#define CTRL_REG4_BDU_BLE_2G			0b11000000&lt;br /&gt;
#define CTRL_REG4_BDU_BLE_2G_STSIGN		0b11001000&lt;br /&gt;
#define CTRL_REG5_DEFAULT				0b00000000&lt;br /&gt;
&lt;br /&gt;
// Read/write address bitmasks:&lt;br /&gt;
#define READ_MASK						0b10000000&lt;br /&gt;
#define READ_AUTOINC_MASK				0b11000000&lt;br /&gt;
#define WRITE_MASK						0b01111111&lt;br /&gt;
&lt;br /&gt;
extern int16_t x_axisa, y_axisa, z_axisa;&lt;br /&gt;
extern double pitch, roll;&lt;br /&gt;
extern double xa, ya, za;&lt;br /&gt;
extern double the, phi;&lt;br /&gt;
&lt;br /&gt;
uint8_t SPI_ACCSENS_readByte(uint8_t regAddr);&lt;br /&gt;
void SPI_ACCSENS_readBytes(uint8_t startAddr, uint8_t *buffer, uint8_t length);&lt;br /&gt;
void SPI_ACCSENS_writeByte(uint8_t regAddr, uint8_t data);&lt;br /&gt;
uint8_t SPI_ACCSENS_getStatus(void);&lt;br /&gt;
&lt;br /&gt;
void SPI_ACCSENS_init(void);&lt;br /&gt;
void SPI_ACCSENS_shutdown(void);&lt;br /&gt;
void SPI_ACCSENS_read(void);&lt;br /&gt;
void SPI_ACCSENS_normalize(void);&lt;br /&gt;
void SPI_ACCSENS_position(void);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
/******************************************************************************&lt;br /&gt;
 * Additional info&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Changelog:&lt;br /&gt;
 * &lt;br /&gt;
 *  ---&amp;gt; changes are documented in the file &amp;quot;RP6ControlACCSENSLib.c&amp;quot;&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
======Library Source======&lt;br /&gt;
Datei: RP6ControlACCSENSLib.c&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;/* ****************************************************************************&lt;br /&gt;
 *                           _______________________&lt;br /&gt;
 *                           \| RP6  ROBOT SYSTEM |/&lt;br /&gt;
 *                            \_-_-_-_-_-_-_-_-_-_/             &amp;gt;&amp;gt;&amp;gt; RP6 CONTROL&lt;br /&gt;
 * ----------------------------------------------------------------------------&lt;br /&gt;
 * ----------------------------- [c]2014 - Dirk -------------------------------&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * File: RP6ControlACCSENSLib.c&lt;br /&gt;
 * Version: 1.0&lt;br /&gt;
 * Target: RP6 CONTROL - ATMEGA32 @16.00MHz&lt;br /&gt;
 *         with optional LC-Display 16x2 chars (CONRAD 190911-62)&lt;br /&gt;
 *         and a 3D Accelerometer Modul (CONRAD 1082387-62) (IC5)&lt;br /&gt;
 * Author(s): Dirk&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Description:&lt;br /&gt;
 * This is my RP6 Control ACCSENS Library. This library may be used to access&lt;br /&gt;
 * the basic functions of the 3D Accelerometer Modul. This RP6 Xtra module may&lt;br /&gt;
 * be placed on the IC5 socket on the RP6 CONTROL M32 instead of a second&lt;br /&gt;
 * EEPROM.&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * THE CHANGELOG CAN BE FOUND AT THE END OF THIS FILE!&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
 &lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Includes:&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6ControlACCSENSLib.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// SPI functions:&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Reads a single register from the 3D Accelerometer&lt;br /&gt;
 * Modul (ACCSENS).&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
uint8_t SPI_ACCSENS_readByte(uint8_t regAddr)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t data;&lt;br /&gt;
	regAddr |= READ_MASK;						// Read byte&lt;br /&gt;
	PORTB &amp;amp;= ~ACC_CS;&lt;br /&gt;
	writeSPI(regAddr);&lt;br /&gt;
	data = readSPI();&lt;br /&gt;
	PORTB |= ACC_CS;&lt;br /&gt;
	return data;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Reads &amp;quot;length&amp;quot; bytes into the buffer &amp;quot;buffer&amp;quot;&lt;br /&gt;
 * from startAddr on. &lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void SPI_ACCSENS_readBytes(uint8_t startAddr, uint8_t *buffer, uint8_t length)&lt;br /&gt;
{&lt;br /&gt;
	startAddr |= READ_AUTOINC_MASK;				// Read byte, auto increment&lt;br /&gt;
	PORTB &amp;amp;= ~ACC_CS;&lt;br /&gt;
	writeSPI(startAddr);&lt;br /&gt;
	readBufferSPI(&amp;amp;buffer[0], length);&lt;br /&gt;
	PORTB |= ACC_CS;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Write a single data byte to the specified sensor&lt;br /&gt;
 * address.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void SPI_ACCSENS_writeByte(uint8_t regAddr, uint8_t data)&lt;br /&gt;
{&lt;br /&gt;
	PORTB &amp;amp;= ~ACC_CS;&lt;br /&gt;
	writeSPI(regAddr);&lt;br /&gt;
	writeSPI(data);&lt;br /&gt;
	PORTB |= ACC_CS;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Returns sensor status register - for checking if&lt;br /&gt;
 * sensor is busy. &lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
uint8_t SPI_ACCSENS_getStatus(void)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t status;&lt;br /&gt;
	PORTB &amp;amp;= ~ACC_CS;&lt;br /&gt;
	writeSPI(STATUS_REG);&lt;br /&gt;
	status = readSPI();&lt;br /&gt;
	PORTB |= ACC_CS;&lt;br /&gt;
	return status;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// 3D accelerometer functions:&lt;br /&gt;
&lt;br /&gt;
int16_t x_axisa, y_axisa, z_axisa;&lt;br /&gt;
double pitch, roll;&lt;br /&gt;
double xa, ya, za;&lt;br /&gt;
double the, phi;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Initializes the sensor. You must call this&lt;br /&gt;
 * function at the beginning of a program, that&lt;br /&gt;
 * uses the 3D Accelerometer Modul.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void SPI_ACCSENS_init(void)&lt;br /&gt;
{&lt;br /&gt;
	// All axes enable, low power, 10Hz output data rate:&lt;br /&gt;
	SPI_ACCSENS_writeByte(CTRL_REG1, CTRL_REG1_3D_LOPWR_10HZ);&lt;br /&gt;
	// No update while reading, +- 2g, self-test minus:&lt;br /&gt;
	SPI_ACCSENS_writeByte(CTRL_REG4, CTRL_REG4_BDU_2G_STSIGN);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Sets the LIS302DLH power-down mode. If you&lt;br /&gt;
 * do not need the sensor, you can save energy&lt;br /&gt;
 * by using the sensor power-down mode.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void SPI_ACCSENS_shutdown(void)&lt;br /&gt;
{&lt;br /&gt;
	// LIS302DLH in power-down mode:&lt;br /&gt;
	SPI_ACCSENS_writeByte(CTRL_REG1, CTRL_REG1_POWERDOWN);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function reads the X-axis, Y-axis and Z-axis&lt;br /&gt;
 * values from the LIS302DLH accelerometer and stores&lt;br /&gt;
 * them in the global variables x_axisa, y_axisa and&lt;br /&gt;
 * z_axisa.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void SPI_ACCSENS_read(void)&lt;br /&gt;
{&lt;br /&gt;
#ifndef EXP_STACK_1&lt;br /&gt;
	// Default sensor position (M32 located on the RP6 rear stack):&lt;br /&gt;
	// xb = -y:&lt;br /&gt;
	x_axisa = SPI_ACCSENS_readByte(OUT_Y_L) | (SPI_ACCSENS_readByte(OUT_Y_H) &amp;lt;&amp;lt; 8);&lt;br /&gt;
	x_axisa *= -1;&lt;br /&gt;
	// yb = -x:&lt;br /&gt;
	y_axisa = SPI_ACCSENS_readByte(OUT_X_L) | (SPI_ACCSENS_readByte(OUT_X_H) &amp;lt;&amp;lt; 8);&lt;br /&gt;
	y_axisa *= -1;&lt;br /&gt;
	// zb = z:&lt;br /&gt;
	z_axisa = SPI_ACCSENS_readByte(OUT_Z_L) | (SPI_ACCSENS_readByte(OUT_Z_H) &amp;lt;&amp;lt; 8);&lt;br /&gt;
#else&lt;br /&gt;
	// Other sensor position (M32 located on the RP6 front stack):&lt;br /&gt;
	// xb = y:&lt;br /&gt;
	x_axisa = SPI_ACCSENS_readByte(OUT_Y_L) | (SPI_ACCSENS_readByte(OUT_Y_H) &amp;lt;&amp;lt; 8);&lt;br /&gt;
	// yb = x:&lt;br /&gt;
	y_axisa = SPI_ACCSENS_readByte(OUT_X_L) | (SPI_ACCSENS_readByte(OUT_X_H) &amp;lt;&amp;lt; 8);&lt;br /&gt;
	// zb = z:&lt;br /&gt;
	z_axisa = SPI_ACCSENS_readByte(OUT_Z_L) | (SPI_ACCSENS_readByte(OUT_Z_H) &amp;lt;&amp;lt; 8);&lt;br /&gt;
#endif&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function limits and normalizes the x-axisa,&lt;br /&gt;
 * y-axisa and z-axisa values read from the LIS302DLH&lt;br /&gt;
 * accelerometer with the function SPI_ACCSENS_read() and&lt;br /&gt;
 * stores them in the global double variables xa, ya and&lt;br /&gt;
 * za.&lt;br /&gt;
 * It also calculates the position in space in form of the&lt;br /&gt;
 * tilt angles (the = pitch, phi = roll) and stores them&lt;br /&gt;
 * in the global double variables the and phi.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void SPI_ACCSENS_normalize(void)&lt;br /&gt;
{&lt;br /&gt;
	// Limit raw values:&lt;br /&gt;
	if (x_axisa &amp;lt; MIN_X_A) x_axisa = MIN_X_A;&lt;br /&gt;
	if (x_axisa &amp;gt; MAX_X_A) x_axisa = MAX_X_A;&lt;br /&gt;
	if (y_axisa &amp;lt; MIN_Y_A) y_axisa = MIN_Y_A;&lt;br /&gt;
	if (y_axisa &amp;gt; MAX_Y_A) y_axisa = MAX_Y_A;&lt;br /&gt;
	if (z_axisa &amp;lt; MIN_Z_A) z_axisa = MIN_Z_A;&lt;br /&gt;
	if (z_axisa &amp;gt; MAX_Z_A) z_axisa = MAX_Z_A;&lt;br /&gt;
	xa = (double) x_axisa / 10000.0;&lt;br /&gt;
	ya = (double) y_axisa / 10000.0;&lt;br /&gt;
	za = (double) z_axisa / 10000.0;&lt;br /&gt;
	// Calculate Pitch and Roll:&lt;br /&gt;
	phi = asin(xa);								// Calculate the and phi&lt;br /&gt;
	the = asin(ya / cos(the));					//  from the raw values&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function calculates the position in space by&lt;br /&gt;
 * using the the and phi values (see function&lt;br /&gt;
 * SPI_ACCSENS_normalize()!). It stores the position&lt;br /&gt;
 * in the global double variables pitch and roll. &lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void SPI_ACCSENS_position(void)&lt;br /&gt;
{&lt;br /&gt;
	pitch = the * 180 / M_PI + OFFSET_PITCH_A;&lt;br /&gt;
	roll = phi * 180 / M_PI + OFFSET_ROLL_A;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/******************************************************************************&lt;br /&gt;
 * Additional info&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Changelog:&lt;br /&gt;
 * - v. 1.0 (initial release) 04.04.2014 by Dirk&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Erklärung&lt;br /&gt;
&lt;br /&gt;
======Demo======&lt;br /&gt;
makefile:&lt;br /&gt;
&amp;lt;pre&amp;gt;...&lt;br /&gt;
TARGET = RP6Control_01_ACCSENS&lt;br /&gt;
...&lt;br /&gt;
SRC += $(RP6_LIB_PATH)/RP6control/RP6ControlLib.c&lt;br /&gt;
SRC += $(RP6_LIB_PATH)/RP6common/RP6uart.c&lt;br /&gt;
SRC += $(RP6_LIB_PATH)/RP6control/RP6ControlACCSENSLib.c&lt;br /&gt;
...&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Datei: RP6Control_01_ACCSENS.c&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;// Uncommented Version of RP6Control_01_ACCSENS.c&lt;br /&gt;
// written by Dirk&lt;br /&gt;
// ------------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6ControlACCSENSLib.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void writeDouble(double number, uint8_t width, uint8_t prec)&lt;br /&gt;
{char buffer[width + 1];&lt;br /&gt;
	dtostrf(number, width, prec, &amp;amp;buffer[0]);&lt;br /&gt;
	writeString(&amp;amp;buffer[0]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void writeDoubleLCD(double number, uint8_t width, uint8_t prec)&lt;br /&gt;
{char buffer[width + 1];&lt;br /&gt;
	dtostrf(number, width, prec, &amp;amp;buffer[0]);&lt;br /&gt;
	writeStringLCD(&amp;amp;buffer[0]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
	initRP6Control();&lt;br /&gt;
&lt;br /&gt;
	writeString_P(&amp;quot;\n\nRP6Control SPI ACCSENS Test Program!\n&amp;quot;); &lt;br /&gt;
	setLEDs(0b1111);&lt;br /&gt;
	mSleep(50);&lt;br /&gt;
	initLCD(); &lt;br /&gt;
	showScreenLCD(&amp;quot;################&amp;quot;, &amp;quot;################&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
	showScreenLCD(&amp;quot;  SPI ACCSENS&amp;quot;, &amp;quot;  Test Program&amp;quot;);&lt;br /&gt;
	mSleep(1000);&lt;br /&gt;
	setLEDs(0b0000);&lt;br /&gt;
&lt;br /&gt;
	SPI_ACCSENS_init();&lt;br /&gt;
&lt;br /&gt;
	uint8_t whoami = SPI_ACCSENS_readByte(WHO_AM_I);&lt;br /&gt;
	writeString_P(&amp;quot;\nWHO AM I: &amp;quot;);&lt;br /&gt;
	writeInteger(whoami, HEX);&lt;br /&gt;
	writeChar('\n');&lt;br /&gt;
	mSleep(2000);&lt;br /&gt;
	&lt;br /&gt;
	startStopwatch1();&lt;br /&gt;
&lt;br /&gt;
	while(true) &lt;br /&gt;
	{&lt;br /&gt;
		if(getStopwatch1() &amp;gt; 1000)&lt;br /&gt;
		{&lt;br /&gt;
			SPI_ACCSENS_read();&lt;br /&gt;
			writeString_P(&amp;quot;\n3D Accelerometer SENSOR -&amp;gt;\n&amp;quot;);&lt;br /&gt;
			writeString_P(&amp;quot;X-axis: &amp;quot;);&lt;br /&gt;
			writeInteger(x_axisa, DEC);&lt;br /&gt;
			writeChar('\n');&lt;br /&gt;
			writeString_P(&amp;quot;Y-axis: &amp;quot;);&lt;br /&gt;
			writeInteger(y_axisa, DEC);&lt;br /&gt;
			writeChar('\n');&lt;br /&gt;
			writeString_P(&amp;quot;Z-axis: &amp;quot;);&lt;br /&gt;
			writeInteger(z_axisa, DEC);&lt;br /&gt;
			writeChar('\n');&lt;br /&gt;
			SPI_ACCSENS_normalize();&lt;br /&gt;
			SPI_ACCSENS_position();&lt;br /&gt;
			writeString_P(&amp;quot;POSITION: \n&amp;quot;);&lt;br /&gt;
			writeString_P(&amp;quot;  Pitch [°]: &amp;quot;);&lt;br /&gt;
			writeDouble(pitch, 6, 1);&lt;br /&gt;
			writeChar('\n');&lt;br /&gt;
			writeString_P(&amp;quot;  Roll [°]:  &amp;quot;);&lt;br /&gt;
			writeDouble(roll, 6, 1);&lt;br /&gt;
			writeChar('\n');&lt;br /&gt;
			setCursorPosLCD(0, 0);&lt;br /&gt;
			writeStringLCD_P(&amp;quot;P&amp;quot;);&lt;br /&gt;
			writeDoubleLCD(pitch, 6, 1);&lt;br /&gt;
			writeStringLCD_P(&amp;quot; &amp;quot;);&lt;br /&gt;
			setCursorPosLCD(0, 8);&lt;br /&gt;
			writeStringLCD_P(&amp;quot;R&amp;quot;);&lt;br /&gt;
			writeDoubleLCD(roll, 6, 1);&lt;br /&gt;
			writeStringLCD_P(&amp;quot; &amp;quot;);&lt;br /&gt;
			setCursorPosLCD(1, 0);&lt;br /&gt;
			writeStringLCD_P(&amp;quot;X&amp;quot;);&lt;br /&gt;
			writeIntegerLCD(x_axisa, DEC);&lt;br /&gt;
			writeStringLCD_P(&amp;quot;   &amp;quot;);&lt;br /&gt;
			setCursorPosLCD(1, 5);&lt;br /&gt;
			writeStringLCD_P(&amp;quot;Y&amp;quot;);&lt;br /&gt;
			writeIntegerLCD(y_axisa, DEC);&lt;br /&gt;
			writeStringLCD_P(&amp;quot;   &amp;quot;);&lt;br /&gt;
			setCursorPosLCD(1, 10);&lt;br /&gt;
			writeStringLCD_P(&amp;quot;Z&amp;quot;);&lt;br /&gt;
			writeIntegerLCD(z_axisa, DEC);&lt;br /&gt;
			writeStringLCD_P(&amp;quot;    &amp;quot;);&lt;br /&gt;
			mSleep(2000);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Erklärung&lt;br /&gt;
&lt;br /&gt;
====BHT Modul JM3-BHT31====&lt;br /&gt;
Dieses Modul zur Messung von Luftdruck, Luftfeuchte und Temperatur ist seit dem 22.01.2015 lieferbar.&lt;br /&gt;
&lt;br /&gt;
=====Dokumentation=====&lt;br /&gt;
Die Dokumentation zum BHT Modul befindet sich auf der mitgelieferten ''&amp;quot;ASURO xTend-On CD-ROM&amp;quot;''.&lt;br /&gt;
&lt;br /&gt;
======Manuals======&lt;br /&gt;
Das Handbuch in der aktuellen Version kann [http://www.jm3-engineering.com/download/doc/ManualAsuroBHT_de.pdf hier] eingesehen werden.&lt;br /&gt;
&lt;br /&gt;
=====Demo-Programme=====&lt;br /&gt;
Ein Demo-Programm zum BHT Modul befindet sich integriert in die RP6 Sensor Board Demo auf der ''&amp;quot;RP6 Robot System Xtra Modules CD-ROM&amp;quot;''. Diese Demo kann auch in der aktuellen Version im Download Bereich von [http://www.jm3-engineering.com/downloads.htm JM3 Engineering] herunter geladen werden.&lt;br /&gt;
&lt;br /&gt;
=====RP6M256 WiFi: I2C_BHT Library=====&lt;br /&gt;
Die nachfolgende RP6M256_I2C_BHTLib (Eigenentwicklung in GCC) dient zur Ansteuerung des I2C BHT Moduls durch die RP6M256 WiFi.&lt;br /&gt;
&lt;br /&gt;
======Library Header======&lt;br /&gt;
Datei: RP6M256_I2C_BHTLib.h&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;/* ****************************************************************************&lt;br /&gt;
 *                           _______________________&lt;br /&gt;
 *                           \| RP6  ROBOT SYSTEM |/&lt;br /&gt;
 *                            \_-_-_-_-_-_-_-_-_-_/           &amp;gt;&amp;gt;&amp;gt; RP6 M256 WIFI&lt;br /&gt;
 * ----------------------------------------------------------------------------&lt;br /&gt;
 * ----------------------------- [c]2015 - Dirk -------------------------------&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * File: RP6M256_I2C_BHTLib.h&lt;br /&gt;
 * Version: 0.9&lt;br /&gt;
 * Target: RP6 M256 WIFI - ATMEGA2560 @16.00MHz&lt;br /&gt;
 * Author(s): Dirk&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Description:&lt;br /&gt;
 * Header file for new RP6 BHT Module library.&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
#ifndef RP6M256_I2C_BHTLIB_H&lt;br /&gt;
#define RP6M256_I2C_BHTLIB_H&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// RP6 BHT Module components:&lt;br /&gt;
// - I2C Barometric Pressure Sensor (MS5607-02BA)&lt;br /&gt;
// - I2C Relative Humidity Sensor (HTU21D)&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// RP6 Sensor Board:&lt;br /&gt;
&lt;br /&gt;
// If you want to use the RP6 BHT Module on the RP6 Sensor Board, you&lt;br /&gt;
// have to define SENSOR_BOARD (default)!&lt;br /&gt;
// If SENSOR_BOARD is NOT defined, this library assumes that the RP6 BHT&lt;br /&gt;
// Module is used stand-alone.&lt;br /&gt;
// ------------------&lt;br /&gt;
#define SENSOR_BOARD&lt;br /&gt;
// ------------------&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Includes:&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6M256Lib.h&amp;quot;&lt;br /&gt;
#include &amp;quot;RP6I2CmasterTWI.h&amp;quot;&lt;br /&gt;
#ifdef SENSOR_BOARD&lt;br /&gt;
	#include &amp;quot;RP6M256_Sensor_BoardLib.h&amp;quot;&lt;br /&gt;
#endif&lt;br /&gt;
#include &amp;lt;math.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Barometric Pressure Sensor (MS5607-02BA):&lt;br /&gt;
#define I2C_BHT_B_ADR					0xee	// Default&lt;br /&gt;
&lt;br /&gt;
// Weather station's data:&lt;br /&gt;
#define ALTITUDE			156			// Weather station's altitude [m]&lt;br /&gt;
//#define ALTITUDE			110			// 2nd altitude: Location 2 [m]&lt;br /&gt;
&lt;br /&gt;
// Temperature default data:&lt;br /&gt;
#define TEMP_ZERO			273.15		// 273.15 K = 0 °C&lt;br /&gt;
#define TA_DEFAULT			15.0		// Outside temp. default [°C]&lt;br /&gt;
#define TI_DEFAULT			21.0		// Inside temp. default [°C]&lt;br /&gt;
&lt;br /&gt;
// Commands:&lt;br /&gt;
#define MS5607_CMD_RESET				0x1e	// ADC reset command&lt;br /&gt;
#define MS5607_CMD_ADC_READ				0x00	// ADC read command&lt;br /&gt;
#define MS5607_CMD_ADC_CONV				0x40	// ADC conversion command&lt;br /&gt;
#define MS5607_CMD_ADC_D1				0x00	// ADC D1 conversion&lt;br /&gt;
#define MS5607_CMD_ADC_D2				0x10	// ADC D2 conversion&lt;br /&gt;
#define MS5607_CMD_ADC_256				0x00	// ADC OSR=256&lt;br /&gt;
#define MS5607_CMD_ADC_512				0x02	// ADC OSR=512&lt;br /&gt;
#define MS5607_CMD_ADC_1024				0x04	// ADC OSR=1024&lt;br /&gt;
#define MS5607_CMD_ADC_2048				0x06	// ADC OSR=2048&lt;br /&gt;
#define MS5607_CMD_ADC_4096				0x08	// ADC OSR=4096&lt;br /&gt;
#define MS5607_CMD_PROM_RD				0xa0	// Prom read command&lt;br /&gt;
&lt;br /&gt;
extern uint32_t D1;		// ADC value of the pressure conversion&lt;br /&gt;
extern uint32_t D2;		// ADC value of the temperature conversion&lt;br /&gt;
extern uint16_t C[8];	// calibration coefficients&lt;br /&gt;
extern double P;		// compensated pressure value&lt;br /&gt;
extern double P0;		// compensated pressure value at sea level (0 m)&lt;br /&gt;
extern double T;		// compensated temperature value&lt;br /&gt;
extern double dT;		// difference between actual and measured temperature&lt;br /&gt;
extern double OFF;		// offset at actual temperature&lt;br /&gt;
extern double SENS;		// sensitivity at actual temperature&lt;br /&gt;
extern uint8_t n_crc;	// crc value of the prom&lt;br /&gt;
&lt;br /&gt;
void I2C_BHT_B_reset(void);&lt;br /&gt;
uint32_t I2C_BHT_B_cmd_adc(uint8_t cmd);&lt;br /&gt;
uint16_t I2C_BHT_B_cmd_prom(uint8_t coef_num);&lt;br /&gt;
uint8_t I2C_BHT_B_crc4(uint16_t n_prom[]);&lt;br /&gt;
void I2C_BHT_B_read(void);&lt;br /&gt;
void I2C_BHT_B_init(void);&lt;br /&gt;
double reduceAirPressure(double pa, double ta);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Relative Humidity Sensor (HTU21D):&lt;br /&gt;
#define I2C_BHT_HT_ADR					0x80	// Default&lt;br /&gt;
&lt;br /&gt;
// Commands:&lt;br /&gt;
#define HTU21D_TRIG_T_MEASUREMENT_HM    0xe3	// Trig. temp meas. hold master&lt;br /&gt;
#define HTU21D_TRIG_RH_MEASUREMENT_HM   0xe5	// Trig. humidity meas. hold master&lt;br /&gt;
#define HTU21D_TRIG_T_MEASUREMENT_POLL  0xf3	// Trig. temp meas. no hold master&lt;br /&gt;
#define HTU21D_TRIG_RH_MEASUREMENT_POLL 0xf5	// Trig. humidity meas. no hold master&lt;br /&gt;
#define HTU21D_USER_REG_W               0xe6	// Writing user register&lt;br /&gt;
#define HTU21D_USER_REG_R               0xe7	// Reading user register&lt;br /&gt;
#define HTU21D_SOFT_RESET               0xfe	// Soft reset&lt;br /&gt;
&lt;br /&gt;
// Resolutions:&lt;br /&gt;
#define HTU21D_RES_12_14BIT             0x00	// RH=12bit, T=14bit&lt;br /&gt;
#define HTU21D_RES_8_12BIT              0x01	// RH= 8bit, T=12bit&lt;br /&gt;
#define HTU21D_RES_10_13BIT             0x80	// RH=10bit, T=13bit&lt;br /&gt;
#define HTU21D_RES_11_11BIT             0x81	// RH=11bit, T=11bit&lt;br /&gt;
&lt;br /&gt;
// User register bitmasks:&lt;br /&gt;
#define HTU21D_RES_MASK                 0x81	// Mask for res. bits (7, 0)&lt;br /&gt;
#define HTU21D_EOB_ON                   0x40	// End of battery&lt;br /&gt;
#define HTU21D_EOB_MASK                 0x40	// Mask for EOB bit(6)&lt;br /&gt;
#define HTU21D_HEATER_ON                0x04	// Heater on&lt;br /&gt;
#define HTU21D_HEATER_OFF               0x00	// Heater off&lt;br /&gt;
#define HTU21D_HEATER_MASK              0x04	// Mask for Heater bit (2)&lt;br /&gt;
&lt;br /&gt;
extern uint16_t rawHumidity;	// raw humidity value&lt;br /&gt;
extern uint16_t rawTemperature;	// raw temperature value&lt;br /&gt;
extern double H;				// relative humidity value [%]&lt;br /&gt;
extern double HT;				// temperature value [°C]&lt;br /&gt;
extern uint8_t resolution;		// sensor resolution [0..3]&lt;br /&gt;
extern uint8_t ht_crc;			// message crc value&lt;br /&gt;
&lt;br /&gt;
void I2C_BHT_HT_reset(void);&lt;br /&gt;
uint8_t I2C_BHT_HT_crc8(uint16_t message, uint8_t checksum);&lt;br /&gt;
double I2C_BHT_HT_readHumidity(void);&lt;br /&gt;
double I2C_BHT_HT_readTemperature(void);&lt;br /&gt;
void I2C_BHT_HT_setResolution(uint8_t resBits);&lt;br /&gt;
void I2C_BHT_HT_init(void);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// RP6 BHT Module initialisation:&lt;br /&gt;
&lt;br /&gt;
void I2C_BHT_init(void);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
/******************************************************************************&lt;br /&gt;
 * Additional info&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Changelog:&lt;br /&gt;
 * &lt;br /&gt;
 *  ---&amp;gt; changes are documented in the file &amp;quot;RP6M256_I2C_BHTLib.c&amp;quot;&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
======Library Source======&lt;br /&gt;
Datei: RP6M256_I2C_BHTLib.c&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;/* ****************************************************************************&lt;br /&gt;
 *                           _______________________&lt;br /&gt;
 *                           \| RP6  ROBOT SYSTEM |/&lt;br /&gt;
 *                            \_-_-_-_-_-_-_-_-_-_/           &amp;gt;&amp;gt;&amp;gt; RP6 M256 WIFI&lt;br /&gt;
 * ----------------------------------------------------------------------------&lt;br /&gt;
 * ----------------------------- [c]2015 - Dirk -------------------------------&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * File: RP6M256_I2C_BHTLib.c&lt;br /&gt;
 * Version: 0.9&lt;br /&gt;
 * Target: RP6 M256 WIFI - ATMEGA2560 @16.00MHz&lt;br /&gt;
 *         and a RP6 BHT Module (CONRAD 1302995)&lt;br /&gt;
 *         optionally on a RP6 Sensor Board (CONRAD 1082384)&lt;br /&gt;
 * Author(s): Dirk&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Description:&lt;br /&gt;
 * &lt;br /&gt;
 * This is our new Library that contains basic routines and functions for&lt;br /&gt;
 * accessing the RP6 BHT Module JM3-BHT31 (CONRAD 1302995).&lt;br /&gt;
 * If the RP6 BHT Module is located on the RP6 Sensor Board (CONRAD 1082384)&lt;br /&gt;
 * and connected to the I2C-MODULE plug M1, the RP6M256_Sensor_BoardLib has to&lt;br /&gt;
 * be included!&lt;br /&gt;
 * &lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// RP6 BHT Module components:&lt;br /&gt;
// - I2C Barometric Pressure Sensor (MS5607-02BA)&lt;br /&gt;
// - I2C Relative Humidity Sensor (HTU21D)&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Includes:&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6M256_I2C_BHTLib.h&amp;quot; 		&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Variables:&lt;br /&gt;
&lt;br /&gt;
uint8_t bhtdataBuf[4]; &lt;br /&gt;
uint8_t i;&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Barometric Pressure Sensor (MS5607-02BA):&lt;br /&gt;
// (Following the C-code example published 2011 by MEAS in AN520!)&lt;br /&gt;
&lt;br /&gt;
uint32_t D1;			// ADC value of the pressure conversion&lt;br /&gt;
uint32_t D2;			// ADC value of the temperature conversion&lt;br /&gt;
uint16_t C[8];			// calibration coefficients&lt;br /&gt;
double P;				// compensated pressure value&lt;br /&gt;
double P0;				// compensated pressure value at sea level (0 m)&lt;br /&gt;
double T;				// compensated temperature value&lt;br /&gt;
double dT;				// difference between actual and measured temperature&lt;br /&gt;
double OFF;				// offset at actual temperature&lt;br /&gt;
double SENS;			// sensitivity at actual temperature&lt;br /&gt;
uint8_t n_crc;			// crc value of the prom&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Reset sequence for the Pressure Sensor.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void I2C_BHT_B_reset(void)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmitByte(I2C_BHT_B_ADR, MS5607_CMD_RESET);&lt;br /&gt;
	mSleep(3);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Reads and returns pressure or temperature ADC&lt;br /&gt;
 * values measured with the chosen resolution.&lt;br /&gt;
 * This function is BLOCKING during the conversion&lt;br /&gt;
 * time (up to 10 ms).&lt;br /&gt;
 *&lt;br /&gt;
 * Input: cmd -&amp;gt; MS5607_CMD_ADC_D1   = Read pressure ADC value&lt;br /&gt;
 *               MS5607_CMD_ADC_D2   = Read temperature ADC value&lt;br /&gt;
 *               ... plus ...&lt;br /&gt;
 *               MS5607_CMD_ADC_256  = Resolution 0.130 hPa / 0.012 °C&lt;br /&gt;
 *               MS5607_CMD_ADC_512  = Resolution 0.084 hPa / 0.008 °C&lt;br /&gt;
 *               MS5607_CMD_ADC_1024 = Resolution 0.054 hPa / 0.005 °C&lt;br /&gt;
 *               MS5607_CMD_ADC_2048 = Resolution 0.036 hPa / 0.003 °C&lt;br /&gt;
 *               MS5607_CMD_ADC_4096 = Resolution 0.024 hPa / 0.002 °C&lt;br /&gt;
 *&lt;br /&gt;
 * Examples:&lt;br /&gt;
 *   D1 = I2C_BHT_B_cmd_adc(MS5607_CMD_ADC_D1 + MS5607_CMD_ADC_4096);&lt;br /&gt;
 *   // This returns the pressure ADC value (D1) with a 0.024 hPa&lt;br /&gt;
 *   // resolution!&lt;br /&gt;
 *   D2 = I2C_BHT_B_cmd_adc(MS5607_CMD_ADC_D2 + MS5607_CMD_ADC_4096);&lt;br /&gt;
 *   // This returns the temperature ADC value (D2) with a 0.002 °C&lt;br /&gt;
 *   // resolution!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
uint32_t I2C_BHT_B_cmd_adc(uint8_t cmd)&lt;br /&gt;
{&lt;br /&gt;
	uint32_t temp = 0;&lt;br /&gt;
&lt;br /&gt;
	I2CTWI_transmitByte(I2C_BHT_B_ADR, (MS5607_CMD_ADC_CONV + cmd));&lt;br /&gt;
	switch (cmd &amp;amp; 0x0f) {&lt;br /&gt;
		case MS5607_CMD_ADC_256  : mSleep(1); break;&lt;br /&gt;
		case MS5607_CMD_ADC_512  : mSleep(2); break;&lt;br /&gt;
		case MS5607_CMD_ADC_1024 : mSleep(3); break;&lt;br /&gt;
		case MS5607_CMD_ADC_2048 : mSleep(5); break;&lt;br /&gt;
		case MS5607_CMD_ADC_4096 : mSleep(10);&lt;br /&gt;
	}&lt;br /&gt;
	I2CTWI_transmitByte(I2C_BHT_B_ADR, MS5607_CMD_ADC_READ);&lt;br /&gt;
	I2CTWI_readBytes(I2C_BHT_B_ADR, bhtdataBuf, 3);&lt;br /&gt;
	temp = bhtdataBuf[0];						// MSB&lt;br /&gt;
	temp &amp;lt;&amp;lt;= 8;&lt;br /&gt;
	temp |= bhtdataBuf[1];&lt;br /&gt;
	temp &amp;lt;&amp;lt;= 8;&lt;br /&gt;
	temp |= bhtdataBuf[2];						// LSB&lt;br /&gt;
	return temp;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Reads and returns the calibration coefficient&lt;br /&gt;
 * (16 bit) with the number coef_num from the&lt;br /&gt;
 * Pressure Sensor's PROM.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: coef_num -&amp;gt; Calibration coefficient&lt;br /&gt;
 *                    number [0..7]&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
uint16_t I2C_BHT_B_cmd_prom(uint8_t coef_num)&lt;br /&gt;
{&lt;br /&gt;
	uint16_t rC = 0;&lt;br /&gt;
&lt;br /&gt;
	I2CTWI_transmitByte(I2C_BHT_B_ADR, (MS5607_CMD_PROM_RD + coef_num * 2));&lt;br /&gt;
	I2CTWI_readBytes(I2C_BHT_B_ADR, bhtdataBuf, 2);&lt;br /&gt;
	rC = bhtdataBuf[0];							// MSB&lt;br /&gt;
	rC &amp;lt;&amp;lt;= 8;&lt;br /&gt;
	rC |= bhtdataBuf[1];						// LSB&lt;br /&gt;
	return rC;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Calculates and returns the Pressure Sensor's&lt;br /&gt;
 * PROM CRC-4 value (8 bit).&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
uint8_t I2C_BHT_B_crc4(uint16_t n_prom[])&lt;br /&gt;
{&lt;br /&gt;
	uint16_t n_rem;&lt;br /&gt;
	uint16_t crc_read;&lt;br /&gt;
	uint8_t n_bit;&lt;br /&gt;
&lt;br /&gt;
	n_rem = 0x00;&lt;br /&gt;
	crc_read = n_prom[7];&lt;br /&gt;
	n_prom[7] = (0xff00 &amp;amp; (n_prom[7]));&lt;br /&gt;
	for (i = 0; i &amp;lt; 16; i++)&lt;br /&gt;
	{&lt;br /&gt;
		if (i % 2 == 1) n_rem ^= (uint8_t) ((n_prom[i &amp;gt;&amp;gt; 1]) &amp;amp; 0x00ff);&lt;br /&gt;
		else n_rem ^= (uint8_t) (n_prom[i &amp;gt;&amp;gt; 1] &amp;gt;&amp;gt; 8);&lt;br /&gt;
		for (n_bit = 8; n_bit &amp;gt; 0; n_bit--)&lt;br /&gt;
		{&lt;br /&gt;
			if (n_rem &amp;amp; 0x8000) n_rem = (n_rem &amp;lt;&amp;lt; 1) ^ 0x3000;&lt;br /&gt;
			else n_rem = n_rem &amp;lt;&amp;lt; 1;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	n_rem = (0x000f &amp;amp; (n_rem &amp;gt;&amp;gt; 12));&lt;br /&gt;
	n_prom[7] = crc_read;&lt;br /&gt;
	return (n_rem ^ 0x0);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Reads and calculates the pressure and&lt;br /&gt;
 * temperature values with the MS5607 1st order&lt;br /&gt;
 * algorithm.&lt;br /&gt;
 * The 2 values are stored in the global floating&lt;br /&gt;
 * point variables P and T:&lt;br /&gt;
 *   P -&amp;gt; Pressure value [hPa]&lt;br /&gt;
 *   T -&amp;gt; Temperature value [°C]&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void I2C_BHT_B_read(void)&lt;br /&gt;
{&lt;br /&gt;
	D2 = I2C_BHT_B_cmd_adc(MS5607_CMD_ADC_D2 + MS5607_CMD_ADC_4096); // Read D2&lt;br /&gt;
	D1 = I2C_BHT_B_cmd_adc(MS5607_CMD_ADC_D1 + MS5607_CMD_ADC_4096); // Read D1&lt;br /&gt;
&lt;br /&gt;
	// Calculate 1st order pressure and temperature (MS5607 1st order algorithm)&lt;br /&gt;
	dT = D2 - C[5] * pow(2, 8);&lt;br /&gt;
	OFF = C[2] * pow(2, 17) + dT * C[4] / pow(2, 6);&lt;br /&gt;
	SENS = C[1] * pow(2, 16) + dT * C[3] / pow(2, 7);&lt;br /&gt;
&lt;br /&gt;
	T = (2000 + (dT * C[6]) / pow(2, 23)) / 100;&lt;br /&gt;
	P = (((D1 * SENS) / pow(2, 21) - OFF) / pow(2, 15)) / 100;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * You MUST call this function at the beginning of a&lt;br /&gt;
 * main program, that uses the Pressure Sensor. &lt;br /&gt;
 * If SENSOR_BOARD is defined, the I2C-MODULE power&lt;br /&gt;
 * will be switched on with the function&lt;br /&gt;
 * setI2CModulePower() defined in the&lt;br /&gt;
 * RP6M256_Sensor_BoardLib, which will be included&lt;br /&gt;
 * then.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void I2C_BHT_B_init(void)&lt;br /&gt;
{&lt;br /&gt;
#ifdef SENSOR_BOARD&lt;br /&gt;
	// I2C-MODULE (plug M1) power on: &lt;br /&gt;
	setI2CModulePower(1);&lt;br /&gt;
#endif&lt;br /&gt;
	D1 = 0;										// Clear pressure ADC value&lt;br /&gt;
	D2 = 0;										// Clear temperature ADC value&lt;br /&gt;
	I2C_BHT_B_reset();							// Reset the Pressure Sensor&lt;br /&gt;
	for (i = 0; i &amp;lt; 8; i++) {C[i] = I2C_BHT_B_cmd_prom(i);} // Read PROM&lt;br /&gt;
	n_crc = I2C_BHT_B_crc4(C);					// Calculate PROM CRC&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Calculates and returns the relative air pressure&lt;br /&gt;
 * [hPa] at sea level (0 m).&lt;br /&gt;
 *&lt;br /&gt;
 * Input:  pa        -&amp;gt; Absolute air pressure [hPa] at ALTITUDE&lt;br /&gt;
 *         ta        -&amp;gt; OUTSIDE temperature [°C] at ALTITUDE&lt;br /&gt;
 *         ALTITUDE  -&amp;gt; Weather station's altitude [m]&lt;br /&gt;
 *         TEMP_ZERO -&amp;gt; 273.15 K&lt;br /&gt;
 * Output: p0        -&amp;gt; Relative air pressure [hPa] at sea level (0 m)&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
double reduceAirPressure(double pa, double ta)&lt;br /&gt;
{double p0;&lt;br /&gt;
	p0 = pa * (pow ((TEMP_ZERO + ta) / (TEMP_ZERO + ta + 0.0065 * ALTITUDE), -5.255));&lt;br /&gt;
	return p0;									// P0 [hPa]&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Relative Humidity Sensor (HTU21D):&lt;br /&gt;
// (Following a library published 2011 by MEAS France!)&lt;br /&gt;
&lt;br /&gt;
uint16_t rawHumidity;		// raw humidity value&lt;br /&gt;
uint16_t rawTemperature;	// raw temperature value&lt;br /&gt;
double H;					// relative humidity value [%]&lt;br /&gt;
double HT;					// temperature value [°C]&lt;br /&gt;
uint8_t resolution;			// sensor resolution [0..3]&lt;br /&gt;
uint8_t ht_crc;				// message crc value&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Soft reset for the Humidity Sensor.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void I2C_BHT_HT_reset(void)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmitByte(I2C_BHT_HT_ADR, HTU21D_SOFT_RESET);&lt;br /&gt;
	mSleep(15);&lt;br /&gt;
	resolution = 0;								// Default: RH 12, T 14 bit&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Reads the Humidity Sensor's user register.&lt;br /&gt;
 *&lt;br /&gt;
 * Hint: The user register bits are described on&lt;br /&gt;
 *       page 13 of the HTU21D datasheet!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
uint8_t read_user_register(void)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t userRegister;&lt;br /&gt;
  &lt;br /&gt;
	I2CTWI_transmitByte(I2C_BHT_HT_ADR, HTU21D_USER_REG_R);&lt;br /&gt;
	userRegister = I2CTWI_readByte(I2C_BHT_HT_ADR);&lt;br /&gt;
	return userRegister;  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Sets the Humidity Sensor's resolution to one&lt;br /&gt;
 * of four steps. The step number [0..3] is stored&lt;br /&gt;
 * in the global variable resolution:&lt;br /&gt;
 *   Step  RH   T&lt;br /&gt;
 *    0:   12  14 bit&lt;br /&gt;
 *    1:    8  12 bit&lt;br /&gt;
 *    2:   10  13 bit&lt;br /&gt;
 *    3:   11  11 bit&lt;br /&gt;
 *                                      RH   T&lt;br /&gt;
 * Input:  resBits -&amp;gt; 0b00000000   (0): 12  14 bit&lt;br /&gt;
 *                 -&amp;gt; 0b00000001   (1):  8  12 bit&lt;br /&gt;
 *                 -&amp;gt; 0b10000000 (128): 10  13 bit&lt;br /&gt;
 *                 -&amp;gt; 0b10000001 (129): 11  11 bit&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void I2C_BHT_HT_setResolution(uint8_t resBits)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t userRegister;&lt;br /&gt;
&lt;br /&gt;
	userRegister = read_user_register();&lt;br /&gt;
	userRegister &amp;amp;= 0b01111110;&lt;br /&gt;
	resBits &amp;amp;= 0b10000001;&lt;br /&gt;
	resolution = (resBits &amp;gt;&amp;gt; 6) | (resBits &amp;amp; 1); // Step 0..3&lt;br /&gt;
	userRegister |= resBits;&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_BHT_HT_ADR, HTU21D_USER_REG_W, userRegister);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#define SHIFTED_DIVISOR                 0x988000&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Calculates the Humidity Sensor's message CRC-8&lt;br /&gt;
 * value (8 bit) and returns 0 (false), if the&lt;br /&gt;
 * message transmission is good.&lt;br /&gt;
 *&lt;br /&gt;
 * Input:  message         -&amp;gt; Message from&lt;br /&gt;
 *                            Humidity Sensor&lt;br /&gt;
 *         checksum        -&amp;gt; Checksum from&lt;br /&gt;
 *                            Humidity Sensor&lt;br /&gt;
 *         SHIFTED_DIVISOR -&amp;gt; 0x0131 polynomial&lt;br /&gt;
 *                            shifted to farthest&lt;br /&gt;
 *                            left of three bytes&lt;br /&gt;
 * Output: remainder       -&amp;gt; 0  = Transmission good&lt;br /&gt;
 *                         -&amp;gt; &amp;gt;0 = Transm. corrupted&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
uint8_t I2C_BHT_HT_crc8(uint16_t message, uint8_t checksum)&lt;br /&gt;
{&lt;br /&gt;
	uint32_t remainder, divisor;&lt;br /&gt;
&lt;br /&gt;
	remainder = (uint32_t) message &amp;lt;&amp;lt; 8;&lt;br /&gt;
	remainder |= checksum;&lt;br /&gt;
	divisor = (uint32_t) SHIFTED_DIVISOR;&lt;br /&gt;
	for (i = 0; i &amp;lt; 16; i++)&lt;br /&gt;
	{&lt;br /&gt;
		if (remainder &amp;amp; (uint32_t) 1 &amp;lt;&amp;lt; (23 - i))&lt;br /&gt;
			remainder ^= divisor;&lt;br /&gt;
		divisor &amp;gt;&amp;gt;= 1;&lt;br /&gt;
	}&lt;br /&gt;
	return (uint8_t) remainder;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Calculates and returns the humidity value.&lt;br /&gt;
 * This function is BLOCKING during the conversion&lt;br /&gt;
 * time (up to 17 ms depending on resolution).&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
double I2C_BHT_HT_readHumidity(void)&lt;br /&gt;
{&lt;br /&gt;
	uint32_t temp = 0;&lt;br /&gt;
&lt;br /&gt;
	I2CTWI_transmitByte(I2C_BHT_HT_ADR, HTU21D_TRIG_RH_MEASUREMENT_POLL);&lt;br /&gt;
	switch (resolution) {&lt;br /&gt;
		case 1 : mSleep(4); break;				// RH 8 bit&lt;br /&gt;
		case 2 : mSleep(6); break;				// RH 10 bit&lt;br /&gt;
		case 3 : mSleep(9); break;				// RH 11 bit&lt;br /&gt;
		case 0 : mSleep(17);					// RH 12 bit&lt;br /&gt;
	}&lt;br /&gt;
	I2CTWI_readBytes(I2C_BHT_HT_ADR, bhtdataBuf, 3);&lt;br /&gt;
	temp = bhtdataBuf[0];						// MSB&lt;br /&gt;
	temp &amp;lt;&amp;lt;= 8;&lt;br /&gt;
	temp |= bhtdataBuf[1];						// LSB&lt;br /&gt;
	temp &amp;lt;&amp;lt;= 8;&lt;br /&gt;
	temp |= bhtdataBuf[2];						// Checksum&lt;br /&gt;
	rawHumidity = temp &amp;gt;&amp;gt; 8;&lt;br /&gt;
	ht_crc = (uint8_t) temp;&lt;br /&gt;
	rawHumidity &amp;amp;= 0xfffc;&lt;br /&gt;
	double tempRH = rawHumidity / (double) 65536;&lt;br /&gt;
	double rh = -6 + (125 * tempRH);&lt;br /&gt;
	return rh;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Calculates and returns the temperature value.&lt;br /&gt;
 * This function is BLOCKING during the conversion&lt;br /&gt;
 * time (up to 51 ms depending on resolution).&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
double I2C_BHT_HT_readTemperature(void)&lt;br /&gt;
{&lt;br /&gt;
	uint32_t temp = 0;&lt;br /&gt;
&lt;br /&gt;
	I2CTWI_transmitByte(I2C_BHT_HT_ADR, HTU21D_TRIG_T_MEASUREMENT_POLL);&lt;br /&gt;
	switch (resolution) {&lt;br /&gt;
		case 3 : mSleep(8); break;				// T 11 bit&lt;br /&gt;
		case 1 : mSleep(14); break;				// T 12 bit&lt;br /&gt;
		case 2 : mSleep(26); break;				// T 13 bit&lt;br /&gt;
		case 0 : mSleep(51);					// T 14 bit&lt;br /&gt;
	}&lt;br /&gt;
	I2CTWI_readBytes(I2C_BHT_HT_ADR, bhtdataBuf, 3);&lt;br /&gt;
	temp = bhtdataBuf[0];						// MSB&lt;br /&gt;
	temp &amp;lt;&amp;lt;= 8;&lt;br /&gt;
	temp |= bhtdataBuf[1];						// LSB&lt;br /&gt;
	temp &amp;lt;&amp;lt;= 8;&lt;br /&gt;
	temp |= bhtdataBuf[2];						// Checksum&lt;br /&gt;
	rawTemperature = temp &amp;gt;&amp;gt; 8;&lt;br /&gt;
	ht_crc = (uint8_t) temp;&lt;br /&gt;
	rawTemperature &amp;amp;= 0xfffc;&lt;br /&gt;
	double tempTemperature = rawTemperature / (double) 65536;&lt;br /&gt;
	double realTemperature = -46.85 + (175.72 * tempTemperature);&lt;br /&gt;
	return realTemperature;  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * You MUST call this function at the beginning of a&lt;br /&gt;
 * main program, that uses the Humidity Sensor. &lt;br /&gt;
 * If SENSOR_BOARD is defined, the I2C-MODULE power&lt;br /&gt;
 * will be switched on with the function&lt;br /&gt;
 * setI2CModulePower() defined in the&lt;br /&gt;
 * RP6M256_Sensor_BoardLib, which will be included&lt;br /&gt;
 * then.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void I2C_BHT_HT_init(void)&lt;br /&gt;
{&lt;br /&gt;
#ifdef SENSOR_BOARD&lt;br /&gt;
	// I2C-MODULE (plug M1) power on: &lt;br /&gt;
	setI2CModulePower(1);&lt;br /&gt;
#endif&lt;br /&gt;
	I2C_BHT_HT_reset();							// Reset the Humidity Sensor&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// RP6 BHT Module initialisation:&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * You MUST call this function at the beginning of a&lt;br /&gt;
 * main program, that uses the RP6 BHT Module. &lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void I2C_BHT_init(void)&lt;br /&gt;
{&lt;br /&gt;
	// I2C Barometric Pressure Sensor:&lt;br /&gt;
	I2C_BHT_B_init();&lt;br /&gt;
	// I2C Relative Humidity Sensor:&lt;br /&gt;
	I2C_BHT_HT_init();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&lt;br /&gt;
/******************************************************************************&lt;br /&gt;
 * Additional info&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Changelog:&lt;br /&gt;
 * - v. 0.9 (initial release) 20.03.2015 by Dirk&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
======Demo======&lt;br /&gt;
makefile:&lt;br /&gt;
&amp;lt;pre&amp;gt;...&lt;br /&gt;
TARGET = RP6M256_Sensor_Board_03&lt;br /&gt;
...&lt;br /&gt;
SRC += $(RP6_LIB_PATH)/RP6common/RP6I2CmasterTWI.c&lt;br /&gt;
&lt;br /&gt;
SRC += $(RP6_LIB_PATH)/RP6control_M256_WIFI/RP6M256_Sensor_BoardLib.c&lt;br /&gt;
SRC += $(RP6_LIB_PATH)/RP6control_M256_WIFI/RP6M256_I2C_BHTLib.c&lt;br /&gt;
...&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Datei: RP6M256_Sensor_Board_03.c&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;/* &lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * RP6 ROBOT SYSTEM - RP6 CONTROL M256 Examples&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Example: RP6M256 Sensor Board&lt;br /&gt;
 * Author(s): Dirk&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Description:&lt;br /&gt;
 * In this example we show a third test for the RP6 Sensor Board.&lt;br /&gt;
 * &lt;br /&gt;
 * ############################################################################&lt;br /&gt;
 * The Robot does NOT move in this example! You can simply put it on a table&lt;br /&gt;
 * next to your PC and you should connect it to the PC via the USB Interface!&lt;br /&gt;
 * You should also connect to it via WIFI.&lt;br /&gt;
 * ############################################################################&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Includes:&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6M256Lib.h&amp;quot; 				// The RP6 M256 Library. &lt;br /&gt;
										// Always needs to be included!&lt;br /&gt;
#include &amp;quot;RP6I2CmasterTWI.h&amp;quot;			// Include the I2C-Bus Master Library&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Include our new &amp;quot;RP6M256 I2C BHT Module library&amp;quot;:&lt;br /&gt;
// (This is the library for accessing the RP6 BHT Module!)&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6M256_I2C_BHTLib.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Write a floating point number to the WIFI.&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *&lt;br /&gt;
 *			// Write a floating point number to the WIFI (no exponent):&lt;br /&gt;
 *			writeDouble_WIFI(1234567.890, 11, 3);&lt;br /&gt;
 *&lt;br /&gt;
 * The value of prec (precision) defines the number of decimal places.&lt;br /&gt;
 * For 32 bit floating point variables (float, double ...) 6 is&lt;br /&gt;
 * the max. value for prec (7 relevant digits).&lt;br /&gt;
 * The value of width defines the overall number of characters in the&lt;br /&gt;
 * floating point number including the decimal point. The number of&lt;br /&gt;
 * pre-decimal positions is: (width - prec - 1).&lt;br /&gt;
 */&lt;br /&gt;
void writeDouble_WIFI(double number, uint8_t width, uint8_t prec)&lt;br /&gt;
{char buffer[width + 1];&lt;br /&gt;
	dtostrf(number, width, prec, &amp;amp;buffer[0]);&lt;br /&gt;
	writeString_WIFI(&amp;amp;buffer[0]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Write a floating point number to the LCD.&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *&lt;br /&gt;
 *			// Write a floating point number to the LCD (no exponent):&lt;br /&gt;
 *			writeDoubleLCD(1234567.890, 11, 3);&lt;br /&gt;
 *&lt;br /&gt;
 * The value of prec (precision) defines the number of decimal places.&lt;br /&gt;
 * For 32 bit floating point variables (float, double ...) 6 is&lt;br /&gt;
 * the max. value for prec (7 relevant digits).&lt;br /&gt;
 * The value of width defines the overall number of characters in the&lt;br /&gt;
 * floating point number including the decimal point. The number of&lt;br /&gt;
 * pre-decimal positions is: (width - prec - 1).&lt;br /&gt;
 */&lt;br /&gt;
void writeDoubleLCD(double number, uint8_t width, uint8_t prec)&lt;br /&gt;
{char buffer[width + 1];&lt;br /&gt;
	dtostrf(number, width, prec, &amp;amp;buffer[0]);&lt;br /&gt;
	writeStringLCD(&amp;amp;buffer[0]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Error handler&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function gets called automatically if there was an I2C Error like&lt;br /&gt;
 * the slave sent a &amp;quot;not acknowledge&amp;quot; (NACK, error codes e.g. 0x20 or 0x30).&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void I2C_transmissionError(uint8_t errorState)&lt;br /&gt;
{&lt;br /&gt;
	writeString_P_WIFI(&amp;quot;\nI2C ERROR - TWI STATE: 0x&amp;quot;);&lt;br /&gt;
	writeInteger_WIFI(errorState, HEX);&lt;br /&gt;
	writeChar_WIFI('\n');&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Main function - The program starts here:&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
	initRP6M256();    // Always call this first! The Processor will not work&lt;br /&gt;
					  // correctly otherwise. &lt;br /&gt;
&lt;br /&gt;
	initLCD(); // Initialize the LC-Display (LCD)&lt;br /&gt;
			   // Always call this before using the LCD!&lt;br /&gt;
&lt;br /&gt;
	setLEDs(0b1111);&lt;br /&gt;
	mSleep(500);&lt;br /&gt;
	setLEDs(0b0000);&lt;br /&gt;
&lt;br /&gt;
	writeString_P_WIFI(&amp;quot;\n\nRP6 Sensor Board Selftest 3!\n&amp;quot;); &lt;br /&gt;
&lt;br /&gt;
	// IMPORTANT:&lt;br /&gt;
	I2CTWI_initMaster(100); // Initialize the TWI Module for Master operation&lt;br /&gt;
							// with 100kHz SCL Frequency&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	// Register the event handler:&lt;br /&gt;
	I2CTWI_setTransmissionErrorHandler(I2C_transmissionError);&lt;br /&gt;
&lt;br /&gt;
	setLEDs(0b1111);&lt;br /&gt;
&lt;br /&gt;
	// Write a text message to the LCD:&lt;br /&gt;
	showScreenLCD(&amp;quot;################&amp;quot;, &amp;quot;################&amp;quot;);&lt;br /&gt;
	mSleep(1500);&lt;br /&gt;
	showScreenLCD(&amp;quot;RP6v2-M256-WIFI &amp;quot;, &amp;quot;Example Program&amp;quot;);&lt;br /&gt;
	mSleep(2500); &lt;br /&gt;
	showScreenLCD(&amp;quot;RP6 Sensor Board&amp;quot;, &amp;quot;   Selftest 3&amp;quot;);&lt;br /&gt;
	mSleep(2500);&lt;br /&gt;
	clearLCD();&lt;br /&gt;
&lt;br /&gt;
	setLEDs(0b0000);&lt;br /&gt;
&lt;br /&gt;
	// ---------------------------------------&lt;br /&gt;
&lt;br /&gt;
	uint8_t onoff = 0;&lt;br /&gt;
&lt;br /&gt;
	startStopwatch1();&lt;br /&gt;
	startStopwatch2();&lt;br /&gt;
&lt;br /&gt;
	// IMPORTANT:&lt;br /&gt;
	sensor_board_init();						// RP6 Sensor Board init!!!&lt;br /&gt;
	mSleep(200);&lt;br /&gt;
	I2C_BHT_init();								// RP6 BHT Module init&lt;br /&gt;
&lt;br /&gt;
	while(true) &lt;br /&gt;
	{&lt;br /&gt;
		if(getStopwatch1() &amp;gt; 1000) // 1s&lt;br /&gt;
		{&lt;br /&gt;
//			if (onoff) onoff = 0;&lt;br /&gt;
//			else onoff = 1;&lt;br /&gt;
&lt;br /&gt;
			// Show Pressure Sensor data:&lt;br /&gt;
			I2C_BHT_B_read();					// Read data&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nLuftdruck:   &amp;quot;);&lt;br /&gt;
			writeDouble_WIFI(P, 7, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot; hPa am Messort (ALTITUDE m)\n&amp;quot;);&lt;br /&gt;
			// Calculate pressure at sea level at TA_DEFAULT (15 °C):&lt;br /&gt;
			P0 = reduceAirPressure(P, TA_DEFAULT);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;Luftdruck:   &amp;quot;);&lt;br /&gt;
			writeDouble_WIFI(P0, 7, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot; hPa in Meereshöhe (0 m, 15 C)\n&amp;quot;);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;Temperatur:  &amp;quot;);&lt;br /&gt;
			writeDouble_WIFI(T, 7, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot; C\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			// Show Humidity Sensor data:&lt;br /&gt;
			H = I2C_BHT_HT_readHumidity();		// Read data&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nLuftfeuchte: &amp;quot;);&lt;br /&gt;
			writeDouble_WIFI(H, 7, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot; % RH\n&amp;quot;);&lt;br /&gt;
			HT = I2C_BHT_HT_readTemperature();	// Read data&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;Temperatur:  &amp;quot;);&lt;br /&gt;
			writeDouble_WIFI(HT, 7, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot; C\n\n\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			// RP6 Sensor Board shutdown (button &amp;amp; status LED test):&lt;br /&gt;
			if (pressedButton) {&lt;br /&gt;
				setStatusLED(1);&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;\nPress button again for RP6 Sensor Board SHUTDOWN!\n&amp;quot;);&lt;br /&gt;
				mSleep(2000);&lt;br /&gt;
				do {&lt;br /&gt;
					if(getStopwatch2() &amp;gt; 200) { // 0.2s&lt;br /&gt;
						if (onoff) onoff = 0;&lt;br /&gt;
						else onoff = 1;&lt;br /&gt;
						if (onoff) setStatusLED(1);&lt;br /&gt;
						else setStatusLED(0);&lt;br /&gt;
						setStopwatch2(0);&lt;br /&gt;
					}&lt;br /&gt;
					mSleep(1);&lt;br /&gt;
					task_I2CTWI();&lt;br /&gt;
				} while (!readButton());&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;\n\n\n\n\nPlease wait for RP6 Sensor Board SHUTDOWN...\n&amp;quot;);&lt;br /&gt;
				sensor_board_shutdown();&lt;br /&gt;
				mSleep(3000);&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;\n\n\nThe RP6 Sensor Board now is in SHUTDOWN MODE!!!\n&amp;quot;);&lt;br /&gt;
				mSleep(1000);&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;\nRESET the M256 microcontroller now...\n\n&amp;quot;);&lt;br /&gt;
				while(true) {};&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			setStopwatch1(0);&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		task_RP6SensorBoard();					// RP6 Sensor Board task&lt;br /&gt;
&lt;br /&gt;
		task_I2CTWI();&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Erklärung&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Erfahrungsberichte==&lt;br /&gt;
&lt;br /&gt;
...in Arbeit...(kann aber gerne ergänzt werden)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Siehe auch==&lt;br /&gt;
* [[RP6v2]]&lt;br /&gt;
* [[RP6]]&lt;br /&gt;
* [[RP6 - Programmierung]]&lt;br /&gt;
* [[RP6 Kamera - Mitmach-Projekt]]&lt;br /&gt;
* [[RP6v2 I2C-Portexpander]]&lt;br /&gt;
* [[RP6v2 USB-RS232-Adapter]]&lt;br /&gt;
* [[RP6v2 Orientierung]]&lt;br /&gt;
* [[RP6 Multi IO Projekt]]&lt;br /&gt;
* [[RP6 Multi IO Projekt - Software]]&lt;br /&gt;
* [[RP6 ArduIO]]&lt;br /&gt;
* [[RP6 ArduIO - Software]]&lt;br /&gt;
* [[Induktive_Ladestation_f%C3%BCr_den_RP6|Induktive Ladestation für den RP6]]&lt;br /&gt;
* [[IR-bake_f%C3%BCr_den_RP6|IR-bake für den RP6]]&lt;br /&gt;
* [[CCRP5]]&lt;br /&gt;
* [[Wild Thumper]]&lt;br /&gt;
* [[Wild Thumper - Programmierung]]&lt;br /&gt;
* [[Yeti]]&lt;br /&gt;
* [[Asuro]]&lt;br /&gt;
* [[C't-Bot]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Weblinks==&lt;br /&gt;
'''Siehe auch die Weblinks im [http://www.rn-wissen.de/index.php/RP6v2#Weblinks RP6v2] und im [http://www.rn-wissen.de/index.php/RP6#Weblinks RP6] Artikel!'''&lt;br /&gt;
&lt;br /&gt;
* [http://www.conrad.de/ce/de/product/1082384/Arexx-RP6-Sensor-Board-RP6-JM03-61 RP6 Sensor Board bei CONRAD]&lt;br /&gt;
* JM3 Engineering:&lt;br /&gt;
** [http://www.jm3-engineering.com/rp6.htm RP6 Roboter Erweiterung]&lt;br /&gt;
** [http://www.jm3-engineering.com/sensors.htm Sensor Module]&lt;br /&gt;
** [http://www.jm3-engineering.com/downloads.htm Software Downloads]&lt;br /&gt;
* Ankündigung einer Sensorerweiterungsplatine für die RP6v2 M256 WiFi im [http://www.roboternetz.de/community/threads/63595-Neue-Hardware-f%C3%BCr-RP6%28v2%29?p=590129&amp;amp;viewfull=1#post590129 Roboternetz RP6 Forum]&lt;br /&gt;
* Erfahrungsbericht zum Sensor Board im [http://www.arexx.com/forum/viewtopic.php?f=19&amp;amp;t=2498 AREXX Support Forum] und im [http://www.roboternetz.de/community/threads/64414-RP6-Sensor-Board-Erster-Eindruck Roboternetz RP6 Forum]&lt;br /&gt;
* Erfahrungsbericht zum I2C GPS Empfänger im [http://www.arexx.com/forum/viewtopic.php?f=19&amp;amp;t=2509 AREXX Support Forum]&lt;br /&gt;
* Erfahrungsbericht zum I2C BHT Modul im [http://www.arexx.com/forum/viewtopic.php?f=19&amp;amp;t=2646 AREXX Support Forum]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Kategorie:Robotikeinstieg]]	 &lt;br /&gt;
[[Kategorie:Praxis]]&lt;br /&gt;
&lt;br /&gt;
==Autoren==&lt;br /&gt;
--[http://www.roboternetz.de/community/members/1972-Dirk Dirk] 18:31, 23. Apr 2022 (CET)&lt;/div&gt;</summary>
		<author><name>Dirk NO2</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=RP6_Sensor_Board_und_Xtra_Module&amp;diff=28594</id>
		<title>RP6 Sensor Board und Xtra Module</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=RP6_Sensor_Board_und_Xtra_Module&amp;diff=28594"/>
				<updated>2022-04-23T16:31:01Z</updated>
		
		<summary type="html">&lt;p&gt;Dirk NO2: /* Autoren */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Bild:RP6_Sensor_Board.jpg|Das RP6 Sensor Board|right|500px]]&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_Xtra_module.JPG|RP6 Xtra module|right|500px]]&lt;br /&gt;
==Was bisher geschah==&lt;br /&gt;
'''Siehe auch &amp;quot;Was bisher geschah&amp;quot; im [http://www.rn-wissen.de/index.php/RP6v2#Was_bisher_geschah RP6v2] und im [http://www.rn-wissen.de/index.php/RP6#Was_bisher_geschah RP6] Artikel!'''&lt;br /&gt;
&lt;br /&gt;
Mit, 27. Nov 2013 - Ankündigung einer Sensorerweiterungsplatine, die an die RP6v2-M256-WIFI angeschlossen werden kann&amp;lt;br/&amp;gt;&lt;br /&gt;
Sam, 22. Feb 2014 - Auslieferungsbeginn des RP6 Sensor Boards, des I2C GPS Empfängers, des 3D Accelerometer Moduls und des Gyro Moduls&amp;lt;br/&amp;gt;&lt;br /&gt;
Mon, 17. Mär 2014 - Das RP6 Sensor Board ist &amp;quot;nicht lieferbar&amp;quot;, neuer Liefertermin angekündigt für den 12.06.2014 (!?)&amp;lt;br/&amp;gt;&lt;br /&gt;
Die, 25. Mär 2014 - Das RP6 Sensor Board ist wieder &amp;quot;sofort lieferbar&amp;quot;&amp;lt;br/&amp;gt;&lt;br /&gt;
August 2014 - Ein neues Xtra Modul wird von JM3 Engineering angekündigt: Das &amp;quot;Wetterstations Sensor Modul&amp;quot;&amp;lt;br/&amp;gt;&lt;br /&gt;
November 2014 - Das &amp;quot;Wetterstations Sensor Modul&amp;quot; ist bei [http://www.jm3-engineering.com/sensors.htm JM3 Engineering] als &amp;quot;BHT Modul&amp;quot; abgebildet und ein Manual verfügbar&amp;lt;br/&amp;gt;&lt;br /&gt;
Don, 22. Jan 2015 - Auslieferungsbeginn des BHT Moduls&amp;lt;br/&amp;gt;&lt;br /&gt;
Son, 18. Dez 2016 - Laut JM3 Engineering wird das 3D Accelerometer DIL Modul nicht mehr produziert, ist aber weiterhin erhältlich&amp;lt;br/&amp;gt;&lt;br /&gt;
Oktober 2017 - Das RP6 Sensor Board und der I2C GPS Empfänger sind bei CONRAD ausverkauft&amp;lt;br/&amp;gt;&lt;br /&gt;
April 2019 - Das Gyro Modul und das BHT Modul sind bei CONRAD ausverkauft&amp;lt;br/&amp;gt;&lt;br /&gt;
Mai 2020 - Die Experimentierplatine, das Backlight-Display, der Graustufen-Boden-Sensor, der Drehgeber-Satz RP6-ENCv3 und das 3D Accelerometer Modul sind bei CONRAD ausverkauft&amp;lt;br/&amp;gt;&lt;br /&gt;
Ende 2021 - Die RP6 CONTROL M32 Platine, die Ersatzräder, die Ersatzraupen und das RP6 USB-Interface RP6V2-TRANS sind bei CONRAD ausverkauft&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Allgemein==&lt;br /&gt;
Dieser Artikel beschreibt die Grundlagen und Programmierung des RP6 Sensor Boards und der RP6 Xtra Module. Dieses Erweiterungs-Modul und die Xtra Module sind Teile des RP6-Systems, das in den RN-Wissen-Artikeln [[RP6]], [[RP6v2]] und [[RP6_-_Programmierung|RP6 - Programmierung]] ausführlich beschrieben wird. Ausgegliedert aus den &amp;quot;Haupt-Artikeln&amp;quot; habe ich diese Module, da sie m.E. zu einer neuen &amp;quot;Ära&amp;quot; des RP6-Systems gehören:&lt;br /&gt;
&lt;br /&gt;
Sie wurden nicht mehr von '''[http://www.roboternetz.de/community/members/120-SlyD SlyD] (Dominik S. Herwald)''' in Zusammenarbeit mit '''[http://www.arexx.com/ AREXX]''' entwickelt, sondern ab 2013 von '''[http://jm3-engineering.com/ JM3 Engineering] (Dipl.-Ing. Jürgen Maisel)'''. Ab Februar 2014 waren dann das '''RP6 Sensor Board RP6-JM03-61''' ([http://www.conrad.de/ce/de/product/1082384/Arexx-RP6-Sensor-Board-RP6-JM03-61 1082384]) und die drei RP6 Xtra Module '''I2C GPS Empfänger JM3-GPS''' ([http://www.conrad.de/ce/de/product/1082385/Arexx-IC-GPS-Empfaenger-JM3-GPS 1082385]), '''Gyro Modul JM3-GYRO''' ([http://www.conrad.de/ce/de/product/1082386/Arexx-Gyro-Modul-JM3-GYRO 1082386]) und '''3D Accelerometer Modul JM3-3DA''' ([http://www.conrad.de/ce/de/product/1082387/Arexx-3D-Accelerometer-Modul-JM3-3DA 1082387]) bei CONRAD lieferbar. Einen ersten Eindruck vom Sensor Board kann man im RoboterNetz und AREXX Support Forum bekommen,- siehe unter [[RP6_Sensor_Board_und_Xtra_Module#Weblinks|Weblinks]]!&lt;br /&gt;
&lt;br /&gt;
===RP6 Sensor Board===&lt;br /&gt;
Das [[RP6_Sensor_Board_und_Xtra_Module#RP6_Sensor_Board_2|RP6 Sensor Board]] gehört zu den &amp;quot;Erweiterungs-Modulen&amp;quot; des RP6-Systems. '''Andere &amp;quot;Erweiterungs-Module&amp;quot; werden im [[RP6v2#Erweiterungs-Module|RP6v2]] und im [[RP6#Erweiterungs-Module|RP6]] Artikel beschrieben!'''&lt;br /&gt;
&lt;br /&gt;
Das ''RP6 Sensor Board'' ist das erste &amp;quot;Erweiterungs-Modul&amp;quot;, das nicht über einen eigenen Microprozessor verfügt,- es ist also ein ''passives Modul'', das von einem Microprozessor-System (z.B. RP6v2, M32, M128, M256 Wifi) angesteuert werden muss. Es ist ebenfalls das erste Modul, das nicht mehr über die trapezförmige Einbuchtung an der Vorderkante verfügt, sondern komplett rechteckig ist. Damit passt es (montiert auf den Standard-Abstandbolzen) nur auf den vorderen Platinenstapel 1 des RP6.&lt;br /&gt;
&lt;br /&gt;
===RP6 Xtra Module===&lt;br /&gt;
Die [[RP6_Sensor_Board_und_Xtra_Module#RP6_Xtra_Module_2|RP6 Xtra Module]] gehören zu den &amp;quot;Zubehör- und Ersatzteilen&amp;quot; des RP6-Systems. '''Über die weiteren &amp;quot;Zubehör- und Ersatzteile&amp;quot; zum RP6 informiert der entsprechende Abschnitt im [[RP6v2#Zubeh.C3.B6r_und_Ersatzteile|RP6v2]] und im [[RP6#Zubehör und Ersatzteile|RP6]] Artikel!'''&lt;br /&gt;
&lt;br /&gt;
Die ''RP6 Xtra Module'' unterscheiden sich von den weiteren &amp;quot;Zubehör- und Ersatzteilen&amp;quot; dadurch, dass sie selbstständige Sensor-Platinen sind, die ideal zum RP6-System passen, aber auch mit anderen Microcontroller-Plattformen nutzbar sind.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==RP6 Sensor Board==&lt;br /&gt;
Das RP6 Sensor Board RP6-JM03-61 ([http://www.conrad.de/ce/de/product/1082384/Arexx-RP6-Sensor-Board-RP6-JM03-61 1082384]) wurde am 27.11.2013 von [http://www.roboternetz.de/community/members/120-SlyD SlyD] angekündigt (siehe Weblink!).&lt;br /&gt;
&lt;br /&gt;
Aktuell (Oktober 2017) ist das RP6 Sensor Board bei CONRAD ausverkauft.&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_Sensor_Board.jpg|Das RP6 Sensor Board]]&lt;br /&gt;
&lt;br /&gt;
===Beschreibung===&lt;br /&gt;
(Laut Online-Katalog der Firma CONRAD!)&lt;br /&gt;
&lt;br /&gt;
''&amp;quot;Das RP6 Sensor Board erweitert die Möglichkeiten aller RP6 Roboter um wesentliche Sensorsignale für Robotik-Anwendungen wie zum Beispiel Dreharten (Yaw-Gyro), Kipp- und Neigewinkel, Kompassrichtung oder aber auch Zeit und Datum.&lt;br /&gt;
Sie können einfach mit zusätzlichen Sharp Sensoren Abstände genau messen, z.B. für autonome Fahrrouten oder falls der Sensor nach unten gerichtet ist, kann er Treppenstufen oder ähnliches entdecken. Außerdem gibt es die Möglichkeit z.B. die Sharp Sensoren ein- bzw. auszuschalten um Strom zu sparen. Zusätzlich können bis zu 8 Servos angesteuert werden um z.B. einen Roboterarm zu bewegen, der auch mechanisch einfach zu montieren ist. Um die Möglichkeiten des RP6 Sensor Boards komplett ausnutzen zu können, wird ein RP6V2 und RP6Wifi Control Board empfohlen. Die ermöglicht den Roboter über Wifi fernzusteuern oder Sensordaten auf dem Kommandozentrum (PC) z.B Kompassdaten, Temperatur oder Kipp- und Neigewinkel anzeigen zu lassen.&amp;quot;''&lt;br /&gt;
&lt;br /&gt;
'''Ausstattung'''&lt;br /&gt;
* Magnetometer- und Accelerometer für Kompassfunktion&lt;br /&gt;
* Gyro Sensor (Yaw)&lt;br /&gt;
* Sharp-Sensor Schnittstelle&lt;br /&gt;
* LED Scheinwerfer&lt;br /&gt;
* LED Treiber mit Smart Funktionen&lt;br /&gt;
* I²C Bus mit max. 400 kHz Übertragungsrate; Hot Swap I²C-Bus Buffer&lt;br /&gt;
* Taster mit LED&lt;br /&gt;
* Echtzeit-Uhr RTC&lt;br /&gt;
* Backupbatterie (Aufladung während des Betriebs)&lt;br /&gt;
* Expansion Port z.B. für GPS-I²C Bus Modul&lt;br /&gt;
* 8 Servo-Ausgänge mit eigenem Schaltregler&lt;br /&gt;
* 8 PWM Ausgänge&lt;br /&gt;
* 5 LED Ausgänge und 2 Digital-I/O Ausgänge.&lt;br /&gt;
&lt;br /&gt;
'''Lieferumfang'''&lt;br /&gt;
* RP6 Sensor Board&lt;br /&gt;
* Montage-Kit&lt;br /&gt;
* Kabel&lt;br /&gt;
* Anleitung und CD mit Dokumentation.&lt;br /&gt;
&lt;br /&gt;
====Blockschaltbild====&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_Sensor_Board_BSP.png|RP6 Sensor Board Blockschaltbild]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Technische Daten===&lt;br /&gt;
{|  {{Blauetabelle}} &lt;br /&gt;
|'''Mikrocontroller:'''&lt;br /&gt;
|kein&lt;br /&gt;
|-&lt;br /&gt;
|'''Speicher:'''&lt;br /&gt;
|kein&amp;lt;br/&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|'''Programmierung:'''&lt;br /&gt;
|C++ (GCC, u.a.) über externes µC-System&lt;br /&gt;
|-&lt;br /&gt;
|'''Vorhandene Sensoren:'''&lt;br /&gt;
|Temperatur, 3D Magnetfeld (Kompass), 3D Beschleunigung, Yaw-Gyro&amp;lt;br/&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|'''Vorhandene Aktoren:'''&lt;br /&gt;
|LED Controller (2 LEDs on board, 5 freie LED Ports), Status LED,&amp;lt;br/&amp;gt;Button, Servo (PWM) Controller für 8 Servos und 8 PWM-Kanäle,&amp;lt;br/&amp;gt;Real Time Clock (RTC), 2 freie I/O Ports&lt;br /&gt;
|-&lt;br /&gt;
|'''Abmessungen:'''&lt;br /&gt;
|(L &amp;amp;times; B &amp;amp;times; H) 112 &amp;amp;times; 90 &amp;amp;times; 19 mm&amp;lt;br/&amp;gt;(B + 5 mm durch Scheinwerfer vorn)&lt;br /&gt;
|-&lt;br /&gt;
|'''Ausführung:'''&lt;br /&gt;
|Fertig aufgebautes Erweiterungsmodul&lt;br /&gt;
|-&lt;br /&gt;
|'''Stromversorgung:'''&lt;br /&gt;
|6 AA NiMH Akkus (über die RP6v2 Base)&amp;lt;br/&amp;gt;und optionaler Zusatzakku 7,2..10 V für Servo Power&lt;br /&gt;
|-&lt;br /&gt;
|'''Hersteller:'''&lt;br /&gt;
|Arexx Niederlande&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Umbau-Optionen===&lt;br /&gt;
Hier soll beschrieben werden, welche Umbau-Optionen es für das RP6 Sensor Board gibt. Im Text gibt es Verweise auf den Schaltplan des RP6 Sensor Boards (RP6_Sensor_Board_Rev2_Schema.pdf) in der Form: (SP2: Bauteil). Dies bedeutet, dass man das Bauteil auf Blatt 2 des Schaltplans finden kann. Beispielhaft sind im folgenden Text Bestell-Nummern der Firma [http://www.conrad.de/ce/ CONRAD] genannt. Natürlich kann man die Teile auch bei anderen Versendern beziehen.&lt;br /&gt;
&lt;br /&gt;
====USRBUS- und XBUS-Wannenstecker====&lt;br /&gt;
Der zweite Wannenstecker für den XBUS (SP3: K14) und USRBUS (SP3: K16) kann nachbestückt werden.&lt;br /&gt;
Man braucht dazu: &lt;br /&gt;
* 2 Wannenstecker 2x7-polig gerade RM 2,54mm (CONRAD [http://www.conrad.de/ce/de/product/741687/Stiftleiste-Print-Montage-gerade-Rastermass-254-mm-Pole-2-x-7-10120556-BKL-Electronic-Inhalt-1-St 741687])&lt;br /&gt;
Die Wannenstecker lötet man auf die eingezeichneten Positionen.&lt;br /&gt;
&lt;br /&gt;
'''USRBUS-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''USRBUS''' || '''Sensor Board-Funktion''' || '''Verwendung''' || '''I/O'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Y1 || &amp;quot;ADC0&amp;quot; || SHARP vorn || I&lt;br /&gt;
|-&lt;br /&gt;
| 2 || Y2 || &amp;quot;ADC1&amp;quot; || Yaw-Gyro || I&lt;br /&gt;
|-&lt;br /&gt;
| 3 || Y3 || PWR || Power für&amp;lt;br/&amp;gt;SHARPs, CAM_IF,&amp;lt;br/&amp;gt;I2C-MODULE || O&lt;br /&gt;
|-&lt;br /&gt;
| 4 || Y4 || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 5 || Y5 || &amp;quot;ADC4&amp;quot; || SHARP hinten ||I&lt;br /&gt;
|-&lt;br /&gt;
| 6..14 || Y6..Y14 || || keine ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
'''XBUS-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''XBUS''' || '''M256-Port''' ||'''M256-Funktion''' || '''Sensor Board-Funktion''' || '''Jumper''' || '''Verwendung''' || '''I/O'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || GND || || GND || GND || || ||&lt;br /&gt;
|-&lt;br /&gt;
| 2 || GND || || GND || GND || || ||&lt;br /&gt;
|-&lt;br /&gt;
| 3 || VDD || || VDD|| VDD_1 || || VDD +5V ||&lt;br /&gt;
|-&lt;br /&gt;
| 4 || +UB || || +UB || VSS_1 || || CAM_IF Power ||&lt;br /&gt;
|-&lt;br /&gt;
| 5 || VDD || || VDD || VDD_1 || || VDD +5V ||&lt;br /&gt;
|-&lt;br /&gt;
| 6 || +UB || || +UB || VSS_1 || || CAM_IF Power ||&lt;br /&gt;
|-&lt;br /&gt;
| 7 || INTU || PJ4 || PCINT13 || INTU || || keine || I&lt;br /&gt;
|-&lt;br /&gt;
| 8 || INT1 || PJ3 || PCINT12 || INT1 || 3 || LSM303DLHC: INT1 || I&lt;br /&gt;
|-&lt;br /&gt;
| 9 || INT3 || PJ5 || PCINT14 || INT3 || 2&amp;lt;br/&amp;gt;5 || DS1339: SQW/INT_N&amp;lt;br/&amp;gt;LSM303DLHC: INT2 || I&amp;lt;br/&amp;gt;I&lt;br /&gt;
|-&lt;br /&gt;
| 10 || SCL || PD0 || SCL || SCL_M || || I2C-Bus || O&lt;br /&gt;
|-&lt;br /&gt;
| 11 || INT2 || PJ6 || PCINT15 || INT2 || 4 || MAX7311: INT_N || I&lt;br /&gt;
|-&lt;br /&gt;
| 12 || SDA || PD1 || SDA || SDA_M || || I2C-Bus || I/O&lt;br /&gt;
|-&lt;br /&gt;
| 13 || MRESET || || MRESET || MRESET || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 14 || GND || || GND || GND || || ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====I/O-Patchfield_1====&lt;br /&gt;
Dieses 2x 5-polige &amp;quot;Patchfield_1&amp;quot; (SP3: K8), beschriftet mit &amp;quot;I/O&amp;quot; liegt neben dem Wannenstecker I/O und weist dieselbe Belegung auf. Möchte man auf dem Sensor Board Verbindungen über den Wannenstecker I/O zu einer angeschlossenen Microprozessor-Platine herstellen, dann kann man auf das &amp;quot;Patchfield_1&amp;quot; eine Stiftleiste löten.&lt;br /&gt;
Man braucht dazu: &lt;br /&gt;
* 2-reihige Stiftleiste RM 2,54mm (z.B. 2x40-polig [http://www.conrad.de/ce/de/product/741306/Doppelreihige-Stiftleiste-RM-254-gerade-Pole-2-x-40-10120173-BKL-Electronic-Inhalt-1-St 741306]) &lt;br /&gt;
Man trennt von der 2-reihigen Stiftleiste 2x5 Kontakte ab und lötet sie auf die Lötpunkte &amp;quot;I/O&amp;quot;. Zuvor muss man u.U. Lötzinnreste aus den Lötpunkten mit Entlötlitze bzw. Entlötsaugpumpe entfernen.&lt;br /&gt;
&lt;br /&gt;
'''Stecker I/O an M256 IO_PWM/T0/T1:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''M256-Port''' ||'''M256-Funktion''' || '''Sensor Board-Funktion''' || '''Verwendung''' || '''I/O'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || PD4 || ICP1 || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 2 || || GND || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 3 || PD6 || T1 || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 4 || PB7 || OC0A || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 5 || PG5 || OC0B || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 6 || PD7 || T0 || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 7 || PB5 || OC1A || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 8 || PK5 || ADC13 || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 9 || PB6 || OC1B || &amp;quot;PD5&amp;quot; || I2C Bus Buffer Enable || O&lt;br /&gt;
|-&lt;br /&gt;
| 10 || || VDD || || keine ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====ADC-Patchfield_2====&lt;br /&gt;
Dieses 2x 5-polige &amp;quot;Patchfield_2&amp;quot; (SP3: K9), beschriftet mit &amp;quot;ADC&amp;quot; liegt neben dem Wannenstecker ADC und weist dieselbe Belegung auf. Möchte man auf dem Sensor Board Verbindungen über den Wannenstecker ADC zu einer angeschlossenen Microprozessor-Platine herstellen, dann kann man auf das &amp;quot;Patchfield_2&amp;quot; eine Stiftleiste löten.&lt;br /&gt;
Man braucht dazu: &lt;br /&gt;
* 2-reihige Stiftleiste RM 2,54mm (z.B. 2x40-polig [http://www.conrad.de/ce/de/product/741306/Doppelreihige-Stiftleiste-RM-254-gerade-Pole-2-x-40-10120173-BKL-Electronic-Inhalt-1-St 741306]) &lt;br /&gt;
Man trennt von der 2-reihigen Stiftleiste 2x5 Kontakte ab und lötet sie auf die Lötpunkte &amp;quot;ADC&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
'''Stecker ADC an M256 ADC_IO2/CMP:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''M256-Port''' ||'''M256-Funktion''' || '''Sensor Board-Funktion''' || '''Jumper''' || '''Verwendung''' || '''I/O'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || PK0 || ADC8 || || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 2 || || GND || || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 3 || PK1 || ADC9 || &amp;quot;ADC4&amp;quot; || 6 || SHARP hinten || I&lt;br /&gt;
|-&lt;br /&gt;
| 4 || PE3 || OC3A/AIN1 || || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 5 || PK2 || ADC10 || || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 6 || || GND || || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 7 || PK3 || ADC11 || || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 8 || PE2 || XCK0/AIN0 || || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 9 || PK4 || ADC12 || || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 10 || || VDD || || || keine ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Anschluss-Optionen===&lt;br /&gt;
Hier soll beschrieben werden, welche Anschluss-Optionen es für das RP6 Sensor Board gibt. In erster Linie geht es dabei um die Belegung der vorhandenen Stecker bzw. Stiftleisten.&lt;br /&gt;
&lt;br /&gt;
Allgemein kann man Anschlüsse an Stiftleisten mit entsprechenden Steckbuchsen erreichen. Solche Steckbuchsen sind z.B. bei ELV erhältlich:&lt;br /&gt;
* Steckbuchse, 2-polig, RM 2,54mm ([http://www.elv.de/steckbuchse-2-polig.html ELV 68-016635])&lt;br /&gt;
* Steckbuchse, 3-polig, RM 2,54mm ([http://www.elv.de/steckbuchse-3-polig.html ELV 68-022503])&lt;br /&gt;
* Steckbuchse, 5-polig, RM 2,54mm ([http://www.elv.de/steckbuchse-5-polig.html ELV 68-023073])&lt;br /&gt;
Die Crimpkontakte dieser Steckbuchse werden an Litzen angequetscht (oder angelötet) und zum entsprechenden Sensor bzw. Aktor geführt. &lt;br /&gt;
&lt;br /&gt;
====I2C-MODULE====&lt;br /&gt;
Der I2C-MODULE Anschluss (SP1: M1) auf dem Sensor Board besteht aus einer 9-poligen Präzisions-Buchsenleiste RM 2,54mm (z.B. [http://www.conrad.de/ce/de/product/741360/Praezisions-Buchsenleiste-RM-254-gerade-Pole-1-x-20-10120832-BKL-Electronic-Inhalt-1-St 741360]). Wenn man eigene I2C-Module hier anschliessen will, braucht man zur Kontaktierung:&lt;br /&gt;
* Präzisions-Stiftleiste, 9-polig, RM 2,54mm (z.B. [http://www.conrad.de/ce/de/product/741307/Praezisions-Stiftleiste-RM-254-gerade-Pole-1-x-20-10120536-BKL-Electronic-Inhalt-1-St 741307])&lt;br /&gt;
&lt;br /&gt;
'''I2C-MODULE-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''Sensor Board&amp;lt;br/&amp;gt;-Funktion (M1)''' || '''Verwendung''' || '''I/O''' |||| [[RP6_Sensor_Board_und_Xtra_Module#I2C_GPS_Empf.C3.A4nger_JM3-GPS|'''I2C GPS Empfänger]]&amp;lt;br/&amp;gt;-Funktion (K1)''' ||&lt;br /&gt;
[[RP6_Sensor_Board_und_Xtra_Module#BHT_Modul_JM3-BHT31|'''BHT Modul]]&amp;lt;br/&amp;gt;-Funktion (K1)'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || VCC || +5V || |||| VCC_1 || VDD&lt;br /&gt;
|-&lt;br /&gt;
| 2 || SCLOUT || Buffered I2C-Bus || O |||| SCL/SCK || SCL&lt;br /&gt;
|-&lt;br /&gt;
| 3 || SDAOUT || Buffered I2C-Bus || I/O |||| SDA/MOSI || SDA&lt;br /&gt;
|-&lt;br /&gt;
| 4 || NC || keine || |||| ||&lt;br /&gt;
|-&lt;br /&gt;
| 5 || I/O1 || Status LED || O |||| ||&lt;br /&gt;
|-&lt;br /&gt;
| 6 || I/O2 || Taster || I |||| ||&lt;br /&gt;
|-&lt;br /&gt;
| 7 || NC || keine || |||| ||&lt;br /&gt;
|-&lt;br /&gt;
| 8 || GND || GND (geschaltet!) || |||| GND || GND&lt;br /&gt;
|-&lt;br /&gt;
| 9 || GND || GND (geschaltet!) || |||| GND || GND&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====CAM_IF====&lt;br /&gt;
Der CAM_IF Anschluss (SP1: K28) ist eine 2x 3-polige Stiftleiste mit der folgenden Belegung:&lt;br /&gt;
&lt;br /&gt;
'''CAM_IF-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''Sensor Board&amp;lt;br/&amp;gt;-Funktion (K28)''' || '''Verwendung''' || '''I/O'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || GND || GND (geschaltet!) ||&lt;br /&gt;
|-&lt;br /&gt;
| 2 || VSS_1 || +7,2..10V (RP6: +UB) ||&lt;br /&gt;
|-&lt;br /&gt;
| 3 || SCLOUT || Buffered I2C-Bus || O&lt;br /&gt;
|-&lt;br /&gt;
| 4 || SDAOUT || Buffered I2C-Bus || I/O&lt;br /&gt;
|-&lt;br /&gt;
| 5 || SCL_M || I2C-Bus || O&lt;br /&gt;
|-&lt;br /&gt;
| 6 || SDA_M || I2C-Bus || I/O&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====IO_EXT====&lt;br /&gt;
Der IO_EXT Anschluss (SP1: K19) ist eine 2x 2-polige Stiftleiste mit der folgenden Belegung:&lt;br /&gt;
&lt;br /&gt;
'''IO_EXT-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''Sensor Board&amp;lt;br/&amp;gt;-Funktion (K19)''' || '''Verwendung''' || '''I/O'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || MAX7311: I/O1.2 || freier I/O Port || I/O&lt;br /&gt;
|-&lt;br /&gt;
| 2 || GND || ||&lt;br /&gt;
|-&lt;br /&gt;
| 3 || MAX7311: I/O1.1 || freier I/O Port || I/O&lt;br /&gt;
|-&lt;br /&gt;
| 4 || GND || ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====PWM_OUT====&lt;br /&gt;
Der PWM_OUT Anschluss (SP5: K12) ist eine 2x 4-polige Stiftleiste mit der folgenden Belegung:&lt;br /&gt;
&lt;br /&gt;
'''PWM_OUT-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''Sensor Board&amp;lt;br/&amp;gt;-Funktion (K12)''' || '''Verwendung''' || '''I/O'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || PCA9685: PWM0 || freier PWM Port || O&lt;br /&gt;
|-&lt;br /&gt;
| 2 || PCA9685: PWM1 || freier PWM Port || O&lt;br /&gt;
|-&lt;br /&gt;
| 3 || PCA9685: PWM2 || freier PWM Port || O&lt;br /&gt;
|-&lt;br /&gt;
| 4 || PCA9685: PWM3 || freier PWM Port || O&lt;br /&gt;
|-&lt;br /&gt;
| 5 || PCA9685: PWM4 || freier PWM Port || O&lt;br /&gt;
|-&lt;br /&gt;
| 6 || PCA9685: PWM5 || freier PWM Port || O&lt;br /&gt;
|-&lt;br /&gt;
| 7 || PCA9685: PWM6 || freier PWM Port || O&lt;br /&gt;
|-&lt;br /&gt;
| 8 || PCA9685: PWM7 || freier PWM Port || O&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====TP1====&lt;br /&gt;
Am Testpunkt TP1 (SP4: TP1) kann man das Signal SQW/INT_N der RTC (DS1339) prüfen/messen.&lt;br /&gt;
&lt;br /&gt;
====LEDs====&lt;br /&gt;
=====Rücklichter=====&lt;br /&gt;
Der Rücklichter Anschluss (SP1: K10) ist eine 2-polige Stiftleiste mit der folgenden Belegung:&lt;br /&gt;
&lt;br /&gt;
'''Rücklichter-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''Sensor Board&amp;lt;br/&amp;gt;-Funktion (K10)''' || '''Verwendung''' || '''I/O'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || TCA6507: P3 || Rücklicht rechts || O&lt;br /&gt;
|-&lt;br /&gt;
| 2 || TCA6507: P4 || Rücklicht links || O&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=====Display-Hintergrundbeleuchtung=====&lt;br /&gt;
Der Display-Hintergrundbeleuchtung Anschluss (SP1: K7) ist eine 2-polige Stiftleiste mit der folgenden Belegung:&lt;br /&gt;
&lt;br /&gt;
'''Display-Hintergrundbeleuchtung-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''Sensor Board&amp;lt;br/&amp;gt;-Funktion (K7)''' || '''Verwendung''' || '''I/O'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || TCA6507: P0 || Display-Hintergrundbeleuchtung || O&lt;br /&gt;
|-&lt;br /&gt;
| 2 || VDD_1 || +5V ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=====Freie Ausgänge=====&lt;br /&gt;
Der freie Ausgang 1 Anschluss (SP1: K4) ist eine 2-polige Stiftleiste mit der folgenden Belegung:&lt;br /&gt;
&lt;br /&gt;
'''Freier Ausgang 1-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''Sensor Board&amp;lt;br/&amp;gt;-Funktion (K4)''' || '''Verwendung''' || '''I/O'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || TCA6507: P1 || freier LED Port || O&lt;br /&gt;
|-&lt;br /&gt;
| 2 || VDD_1 || +5V ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Der freie Ausgang 2 Anschluss (SP1: K2) ist eine 2-polige Stiftleiste mit der folgenden Belegung:&lt;br /&gt;
&lt;br /&gt;
'''Freier Ausgang 2-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''Sensor Board&amp;lt;br/&amp;gt;-Funktion (K2)''' || '''Verwendung''' || '''I/O'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || TCA6507: P2 || freier LED Port || O&lt;br /&gt;
|-&lt;br /&gt;
| 2 || VDD_1 || +5V ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====SHARP Sensoren====&lt;br /&gt;
Das RP6 Sensor Board verfügt über zwei Stecker SHARP_F (SP1: K5) und SHARP_R (SP1: K3) zum Anschluß von analogen SHARP Infrarot-Distanz-Sensoren. Folgende SHARP Sensoren sind anschließbar:&lt;br /&gt;
* 1. SHARP Distanz-Sensor GP2Y0A41SK0F ([http://www.conrad.de/ce/de/product/504596/Distanz-Sensor-GP2Y0A41SK0F-Sharp-GP2Y0A41SK0F-Messbereiche-Erfassungsbereich-4-30-cm-5-VDC 504596]), Messbereich 4..30cm&lt;br /&gt;
* 2. SHARP Distanz-Sensor GP2Y0A21YK0F ([http://www.conrad.de/ce/de/product/504591/Distanz-Sensor-GP2Y0A21YK0F-Sharp-GP2Y0A21YK0F-Messbereiche-Erfassungsbereich-10-80-cm-5-VDC 504591]), Messbereich 10..80cm&lt;br /&gt;
* 3. SHARP Distanz-Sensor GP2Y0A02YK ([http://www.conrad.de/ce/de/product/185364/Distanz-Sensor-GP-2-Y0A-02-YK-Sharp-GP-2-Y0A-02-YK-Messbereiche-Erfassungsbereich-20-150-cm-5-VDC 185364]), Messbereich 20..150cm&lt;br /&gt;
* 4. SHARP Distanz-Sensor GP2Y0A710K0F ([http://www.conrad.de/ce/de/product/504597/Distanz-Sensor-GP2Y0A710K0F-Sharp-GP2Y0A710K0F-Messbereiche-Erfassungsbereich-100-550-cm-5-VDC 504597]), Messbereich 100..550cm&lt;br /&gt;
''Die Auswahl der geeigneten SHARP Sensoren hängt von der gewünschten Funktion ab: Zur Erkundung großer Räume eignet sich insbesondere der Typ 4 mit einer hohen Reichweite von 5,5m. Er ist aber ungeeignet, die Distanz von Objekten zu erkennen, die sich näher als 1m vor dem Sensor befinden. Ein guter Kompromiss zwischen Nahbereichsmessung und &amp;quot;Fernsicht&amp;quot; sind die Typen 2 (10..80cm) und 3 (20..150cm). Will man den Distanz-Sensor vor allem zur Vermeidung eins Sturzes von einer Treppe (Tiefenerkennung) oder nur zur Erkennung von Hindernissen direkt vor dem Roboter (Kollisionserkennung) benutzen, dann eignet sich insbesondere für den vorderen Sensor (SHARP_F) der Typ 1, da er im Nahbereich von 4 bis 30cm messen kann.''&lt;br /&gt;
&lt;br /&gt;
Für die Verbindung zwischen den beiden 3-poligen JST XH Steckern (K3, 5) auf dem Sensor Board und den SHARP-Sensoren braucht man auf der Sensor Board Seite folgende Stecker-/buchsenteile:&lt;br /&gt;
* 2x JST XH Gehäuse, 3-polig, RM 2,5mm ([http://www.conrad.de/ce/de/product/740583/Gehaeuse-RM-25-mm-Serie-XH-Rastermass-25-mm-Pole-3-Nennstrom-3-A-XHP-3-JST-Inhalt-1-St 740583])&lt;br /&gt;
* 6x JST XH Crimpkontakt f. RM 2,5mm ([http://www.conrad.de/ce/de/product/741112/Crimpkontakt-fuer-RM-25-mm-Serie-XH-Rastermass-25-mm-BXH-001T-P06-JST-Inhalt-1-St 741112])&lt;br /&gt;
Die Crimpkontakte dieser Steckbuchse werden an die meist 3-adrige Litze des Sensors angequetscht (oder angelötet). Zur Belegung des Sensor Anschlusses siehe das jeweilige Datenblatt!&lt;br /&gt;
&lt;br /&gt;
=====Vorn=====&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_Sensor_Board_SHARP_F.JPG|RP6 Sensor Board SHARP Sensor vorn|thumb]]&lt;br /&gt;
&lt;br /&gt;
Der vordere SHARP Sensor kann auch mechanisch am Sensor Board befestigt werden. Dazu gibt es an der Vorderkante der Platine zwei Befestigungslöcher.&lt;br /&gt;
&lt;br /&gt;
Das Bild rechts zeigt den SHARP Distanzsensor GP2Y0A02YK montiert vorn auf dem Sensor Board mit zwei M3 Gelenkbolzen ([http://www.conrad.de/ce/de/product/521043/Gelenkbolzen-1-x-Aussengewinde1-x-Innengewinde-Messing-vernickelt-Schluesselweite-55-mm/ 521043]) und passenden Schrauben/Muttern.&lt;br /&gt;
&lt;br /&gt;
'''Vorn-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''RP6v2-Port''' ||'''RP6v2-Funktion''' || '''Sensor Board&amp;lt;br/&amp;gt;-Funktion (K5)''' || '''Verwendung''' || '''I/O''' |||| '''SHARP Sensor&amp;lt;br/&amp;gt;-Funktion''' &lt;br /&gt;
|-&lt;br /&gt;
| 1 || PA0 || ADC0 || &amp;quot;ADC0&amp;quot; || SHARP vorn || I |||| Vo&lt;br /&gt;
|-&lt;br /&gt;
| 2 || || || VDD_1 || +5V || |||| Vcc&lt;br /&gt;
|-&lt;br /&gt;
| 3 || || || GND || GND (geschaltet!) || |||| GND&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=====Hinten=====&lt;br /&gt;
Der hintere SHARP Sensor kann z.B. an der Rückseite des RP6v2 Fahrgestells befestigt werden.&lt;br /&gt;
&lt;br /&gt;
'''Hinten-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''M256-Port''' ||'''M256-Funktion''' || '''Sensor Board&amp;lt;br/&amp;gt;-Funktion (K3)''' || '''Verwendung''' || '''I/O''' |||| '''SHARP Sensor&amp;lt;br/&amp;gt;-Funktion''' &lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| 1 || PK1 || ADC9 || &amp;quot;ADC4&amp;quot; || SHARP hinten || I |||| Vo&lt;br /&gt;
|-&lt;br /&gt;
| 2 || || || VDD_1 || +5V || |||| Vcc&lt;br /&gt;
|-&lt;br /&gt;
| 3 || || || GND || GND (geschaltet!) || |||| GND&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Servos====&lt;br /&gt;
=====Power=====&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_Sensor_Board_Servo-PWR.jpg|RP6 Sensor Board Servo-PWR Stecker|thumb]]&lt;br /&gt;
&lt;br /&gt;
An den SERVO_PWR Stecker (SP5: K1) muss ein Akku zur Stromversorgung der mit dem Sensor Board verbundenen Servos angeschlossen werden. Der Stecker hat folgende Belegung:&lt;br /&gt;
 &lt;br /&gt;
'''SERVO_PWR-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''Sensor Board&amp;lt;br/&amp;gt;-Funktion (K1)''' || '''Verwendung'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || GND_POWER || Servo Power GND&lt;br /&gt;
|-&lt;br /&gt;
| 2 || VSS_POWER || Servo Power Eingang +7,2..10V&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Der Akku zur Versorgung der Servos muss eine Nennspannung von 7,2..10V aufweisen. Der Schaltregler auf dem Sensor Board kann bei einer 5,0V Servo-Spannung Ströme bis 3,0A (Spitzen bis 5,0A) liefern. '''Die Polung des Akkus darf am Stecker SERVO_PWR nicht vertauscht werden.''' Siehe den oberen Teil der nebenstehenden Abbildung! Ratsam ist es, eine Sicherung 3,15A in die Plusleitung zwischen Akku und SERVO_PWR Stecker zu legen.&lt;br /&gt;
&lt;br /&gt;
Für die Verbindung zwischen dem 2-poligen JST XH Stecker (SERVO_PWR, K1) auf dem Sensor Board und dem Akku braucht man auf der Sensor Board Seite folgende Stecker-/buchsenteile:&lt;br /&gt;
* JST XH Gehäuse, 2-polig, RM 2,5mm ([http://www.conrad.de/ce/de/product/740549/Gehaeuse-RM-25-mm-Serie-XH-Rastermass-25-mm-Pole-2-Nennstrom-3-A-XHP-2-JST-Inhalt-1-St 740549])&lt;br /&gt;
* 2x JST XH Crimpkontakt f. RM 2,5mm ([http://www.conrad.de/ce/de/product/741112/Crimpkontakt-fuer-RM-25-mm-Serie-XH-Rastermass-25-mm-BXH-001T-P06-JST-Inhalt-1-St 741112])&lt;br /&gt;
Die Crimpkontakte dieser Steckbuchse werden an die 2-adrige Litze zum Akku angequetscht (oder angelötet).&lt;br /&gt;
&lt;br /&gt;
Wenn man keinen separaten Akku zur Versorgung der Servos nehmen will, kann man auch +UB der RP6v2 Base dafür nutzen. An +UB liegt die Akkuspannung der Base (Nennspannung 7,2V) über eine Sicherung F1 3,15A (RP6v2) bzw. 2,5A (RP6) auf dem Mainboard an. +UB kann man z.B. am [[RP6#EXT_Anschlu.C3.9F|EXT Anschluß der Base]] entnehmen. Die nebenstehende Abbildung zeigt im unteren Teil, an welchen Pins man dort +UB kontaktieren kann!&lt;br /&gt;
&lt;br /&gt;
Dabei ist zu beachten, dass die Sicherung F1 auf dem RP6(v2) Mainboard den nutzbaren Strom für die Servos deutlich begrenzt: Durch diese Sicherung fließt ja nicht nur der Servo-Strom, sondern auch der Strom für den RP6 und alle darauf montierten Zusatzplatinen. Wenn der RP6 also herumfährt und z.B. noch die IRCOMM-Sendedioden nutzt, bleibt kaum noch Stromreserve für die Servos auf dem Sensor Board übrig.&lt;br /&gt;
'''Das bedeutet: Man sollte unbedingt einen separaten Akku für die Servos auf dem Sensor Board benutzen!'''&lt;br /&gt;
&lt;br /&gt;
======SERVO_PWR-EXT Verbindung======&lt;br /&gt;
Für die Verbindung zwischen dem 2-poligen JST XH Stecker (SERVO_PWR, K1) auf dem Sensor Board und dem 8-poligen JST XH Stecker (EXT) auf dem RP6v2 Mainboard braucht man folgende Stecker-/buchsenteile:&lt;br /&gt;
* JST XH Gehäuse, 2-polig, RM 2,5mm ([http://www.conrad.de/ce/de/product/740549/Gehaeuse-RM-25-mm-Serie-XH-Rastermass-25-mm-Pole-2-Nennstrom-3-A-XHP-2-JST-Inhalt-1-St 740549])&lt;br /&gt;
* JST XH Gehäuse, 8-polig, RM 2,5mm ([http://www.conrad.de/ce/de/product/740928/Gehaeuse-RM-25-mm-Serie-XH-Rastermass-25-mm-Pole-8-Nennstrom-3-A-XHP-8-JST-Inhalt-1-St 740928])&lt;br /&gt;
* 10x JST XH Crimpkontakt f. RM 2,5mm ([http://www.conrad.de/ce/de/product/741112/Crimpkontakt-fuer-RM-25-mm-Serie-XH-Rastermass-25-mm-BXH-001T-P06-JST-Inhalt-1-St 741112])&lt;br /&gt;
Mit einer 2-adrigen Litze, die beidseits mit den Crimpkontakten verquetscht (oder verlötet) wird, verbindet man dann den SERVO_PWR Stecker mit dem EXT Stecker, wie in der Abbildung oben gezeigt. ''Achtung: Plus (+) und Minus (-) nicht vertauschen!''&lt;br /&gt;
 Ein passendes Kabel soll zukünftig (*) mitgeliefert werden.&lt;br /&gt;
&lt;br /&gt;
Auf dem RP6 Mainboard ist der 8-polige EXT Stecker noch nicht bestückt. Wenn man ihn nachrüsten will, muss man noch bestellen:&lt;br /&gt;
* JST XH Stiftleiste gerade, 8-polig, RM 2,5mm ([http://www.conrad.de/ce/de/product/740105/Stiftleiste-gerade-RM-25-mm-Serie-XH-Rastermass-25-mm-Pole-8-Nennstrom-3-A-B8B-XH-A-LFSN-JST-Inhalt-1-St 740105])&lt;br /&gt;
Die Stiftleiste wird auf das RP6 Mainboard gelötet, dabei weisen die beiden Einkerbungen an einer Längsseite der Stiftleiste nach hinten zum Rand des Mainboards.&lt;br /&gt;
 Auch diese Stiftleiste soll zukünftig (*) zum Lieferumfang gehören.&lt;br /&gt;
'''Zu *)''' Meinem RP6 Sensor Board (bestellt am 1.3.2014) lag das konfektionierte Kabel und die Stiftleiste noch nicht bei!&lt;br /&gt;
&lt;br /&gt;
=====Stecker=====&lt;br /&gt;
An die acht 3-poligen Stiftleisten SERVO_1 bis SERVO_8 (SP5: K6, 11, 29..34) können Servos angeschlossen werden. Direkt aufstecken kann man Servo-Steckbuchsen mit der Belegung von CONRAD, Graupner/JR und Robbe/Futaba (Versorgungsspannung Plus am mittleren Pin). Auf der Sensor Board Platine kann man den Pin 3 (Servo Power GND) der 3-poligen Stiftleisten daran erkennen, dass er näher zum rechten Platinenrand (Seite mit dem XBUS Stecker) angeordnet ist als der zugehörige Pin 1 (Servo Signal).&lt;br /&gt;
&lt;br /&gt;
Wenn Servos mit nicht passender Steckbuchse angeschlossen werden sollen, dann braucht man auf der Sensor Board Seite folgende Stecker-/buchsenteile für jedes Servo:&lt;br /&gt;
* Steckbuchse, 3-polig, RM 2,54mm ([http://www.elv.de/steckbuchse-3-polig.html ELV 68-022503])&lt;br /&gt;
Die Crimpkontakte dieser Steckbuchse werden an die 3-adrige Litze des Servos angequetscht (oder angelötet). &lt;br /&gt;
&lt;br /&gt;
'''SERVO_1..8-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''Sensor Board&amp;lt;br/&amp;gt;-Funktion (K6,11,29..34)''' || '''Verwendung''' || '''I/O''' |||| '''Servo-&amp;lt;br/&amp;gt;Kabelfarben'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || PCA9685: PWM15..8 || Servo Signal || O |||| Weiß, Orange&lt;br /&gt;
|-&lt;br /&gt;
| 2 || Servo_PWR || Servo Power +5V (geschaltet!) || |||| Rot&lt;br /&gt;
|-&lt;br /&gt;
| 3 || GND_POWER || Servo Power GND || |||| Schwarz, Braun&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Roboterarm RA2-HOBBY====&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_Sensor_Board_RA2-MINI.JPG|RP6 Sensor Board mit Roboterarm RA2-MINI|thumb]]&lt;br /&gt;
&lt;br /&gt;
In der Anleitung zum RP6 Sensor Board ist der Arexx Roboterarm RA2-HOBBY bzw. RA2-MINI [http://www.conrad.de/ce/de/product/191534/Arexx-Mini-Roboterarm-RA2-MINI (191534)] abgebildet. Er ist dort ohne Grundgestell und Controller-Platine auf dem Sensor Board befestigt.&lt;br /&gt;
Das Sensor Board eignet sich sehr gut zur Ansteuerung der 6 Servos des Roboterarms.&lt;br /&gt;
&lt;br /&gt;
Zur Montage des RA2-MINI auf dem Sensor Board geht man so vor:&lt;br /&gt;
* Lösen der 4 Rundkopfschrauben M3x6, die die Servobodenplatte mit den Abstandbolzen M3x30 auf der Controller-Platine verbinden (siehe Anleitung zum RA2-MINI, Seite 19!)&lt;br /&gt;
* Lösen der Servobodenplatte vom Bodenservo (siehe Anleitung zum RA2-MINI, Seite 8!)&lt;br /&gt;
* Bohren der Befestigungslöcher in die Servobodenplatte:&lt;br /&gt;
** Rechts-Links Lochabstand 4,75cm, Vorn-Hinten Lochabstand 4,1cm&lt;br /&gt;
** Ungefähre Lage der Löcher siehe Abbildung in der Anleitung zum Sensor Board, Seite 4!&lt;br /&gt;
** Markierung der Bohrlöcher auf der Rückseite der Servobodenplatte:&lt;br /&gt;
*** 1. Mit einer Hilfslinie die Hinterkante des Servoausschnitts (das ist die kürzere Kante, die näher am Rand der Bodenplatte liegt!) nach beiden Seiten verlängern&lt;br /&gt;
*** 2. Eine 2. Hilfslinie parallel zur ersten im Abstand von 1,4cm zur Mitte der Servobodenplatte hin einzeichnen&lt;br /&gt;
*** 3. Auf dieser Linie jetzt die beiden hinteren Bohrlöcher symmetrisch im Abstand von 4,75cm markieren&lt;br /&gt;
*** 4. Für die vorderen Bohrlöcher eine 3. Hilfslinie im Abstand von 4,1cm parallel zur 2. Linie einzeichnen&lt;br /&gt;
*** 5. Auf dieser Linie die beiden vorderen Bohrlöcher symmetrisch im Abstand von 4,75cm markieren&lt;br /&gt;
*** 6. Kontrolle: Die 4 markierten Bohrlochpositionen bilden ein Rechteck mit 4,1cm seitlicher und 4,75cm vorderer/hinterer Kantenlänge&lt;br /&gt;
** Bohren der 4 Löcher (D = 3,2mm) in die Servobodenplatte&lt;br /&gt;
* Befestigen des Bodenservos auf der Servobodenplatte (siehe Anleitung zum RA2-MINI, Seite 8!)&lt;br /&gt;
* Anbringen des Roboterarms auf dem Sensor Board mit 4 Abstandbolzen M3 (L = 30..50mm) und passenden Schrauben/Muttern&lt;br /&gt;
&lt;br /&gt;
Die Servo-Steckbuchsen werden dann ''in der selben Reihenfolge (S1..S6) wie vorher auf der Controller-Platine des Roboterarms'' auf die Stiftleisten SERVO_1 bis SERVO_6 des Sensor Boards gesteckt.&lt;br /&gt;
'''Man sollte unbedingt einen separaten Akku für die Servos auf dem Sensor Board benutzen!'''&lt;br /&gt;
&lt;br /&gt;
====Grafik-Display====&lt;br /&gt;
Ob es mal ein Grafik-Display für das RP6 Sensor Board geben wird, ist ''pure Spekulation''. Allerdings gibt es zwei Hinweise darauf, dass eine solche Hardware-Ergänzung kommen könnte:&lt;br /&gt;
* 1. Der vorbereitete Anschluss für eine [[RP6_Sensor_Board_und_Xtra_Module#Display-Hintergrundbeleuchtung|Display-Hintergrundbeleuchtung]]&lt;br /&gt;
* 2. Die 4 Befestigungslöcher in der Mitte des Sensor Boards&lt;br /&gt;
Wir werden sehen ...&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==RP6 Xtra Module==&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_Xtra_module.JPG|RP6 Xtra module|right|500px]]&lt;br /&gt;
&lt;br /&gt;
Von den '''AREXX RP6 Xtra Modulen''' sind bei [http://www.conrad.de/ce/ CONRAD] für den RP6v2 erhältlich:&lt;br /&gt;
* Arexx [[RP6_Sensor_Board_und_Xtra_Module#I2C_GPS_Empf.C3.A4nger_JM3-GPS|I2C GPS Empfänger JM3-GPS]] ([http://www.conrad.de/ce/de/product/1082385/Arexx-IC-GPS-Empfaenger-JM3-GPS 1082385] AUSVERKAUFT!)&lt;br /&gt;
* Arexx [[RP6_Sensor_Board_und_Xtra_Module#Gyro_Modul_JM3-GYRO|Gyro Modul JM3-GYRO]] ([http://www.conrad.de/ce/de/product/1082386/Arexx-Gyro-Modul-JM3-GYRO 1082386] AUSVERKAUFT!)&lt;br /&gt;
* Arexx [[RP6_Sensor_Board_und_Xtra_Module#3D_Accelerometer_Modul_JM3-3DA|3D Accelerometer Modul JM3-3DA]] ([http://www.conrad.de/ce/de/product/1082387/Arexx-3D-Accelerometer-Modul-JM3-3DA 1082387] AUSVERKAUFT!)&lt;br /&gt;
* Arexx [[RP6_Sensor_Board_und_Xtra_Module#BHT_Modul_JM3-BHT31|BHT Modul JM3-BHT31]] ([http://www.conrad.de/ce/de/product/1302995/Arexx-Asuro-xTend-BHT-JM3-BHT31 1302995] AUSVERKAUFT!)&lt;br /&gt;
&lt;br /&gt;
===I2C GPS Empfänger JM3-GPS===&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_I2C_GPS_Empfänger.JPG|RP6 I2C GPS Empfänger|thumb]]&lt;br /&gt;
&lt;br /&gt;
(Laut Online-Katalog der Firma CONRAD!)&lt;br /&gt;
&lt;br /&gt;
''&amp;quot;Universelles GPS-I²C-Bus Modul für RP6 Roboter. Der GPS Empfänger stellt die NMEA-0183 Datensätze GGA, RMC, GSA und VTG in den veschiedenen Registern zur Verfügung. Damit ist eine einfache Weiterverarbeitung möglich.&amp;quot;''&lt;br /&gt;
&lt;br /&gt;
Aktuell (Oktober 2017) ist der I2C GPS Empfänger bei CONRAD ausverkauft.&lt;br /&gt;
&lt;br /&gt;
====Beschreibung====&lt;br /&gt;
Der I2C GPS Empfänger ist eine kleine (38 x 23 mm) Zusatzplatine (RP6 Xtra Modul), die direkt auf das [[RP6_Sensor_Board_und_Xtra_Module#RP6_Sensor_Board_2|RP6 Sensor Board]] aufgesteckt werden kann. Sie kann aber auch überall eingesetzt werden, wo eine stabilisierte 5V Versorgungsspannung und ein 5V-I2C-Bus bis 400 kHz zur Verfügung steht.&lt;br /&gt;
&lt;br /&gt;
Die Platine ist bestückt mit dem &amp;quot;Fastrax GPS antenna module&amp;quot; [https://www.u-blox.com/de/positioning-antennas/gnss-antenna-modules/uc530.html UC530]. Als Backup-Batterie dient eine wieder aufladbare Lithium-Batterie ([http://www.farnell.com/datasheets/321180.pdf MS621FE]). Zur Kommunikation zwischen dem UC530 und dem I2C-Bus ist ein [http://www.atmel.com/Images/Atmel-8303-8-bit-AVR-Microcontroller-tinyAVR-ATtiny1634_Datasheet.pdf ATtiny1634] an Bord, der auch die Auswertung des [http://de.wikipedia.org/wiki/NMEA_0183 NMEA Protokolls] übernimmt. Die 3,3 V Versorgungsspannung wird auf der Platine durch einen Spannungsregler ([http://www.mouser.com/ds/2/405/lm3480-316799.pdf LM3480IM3-3.3]) erzeugt. Über den I2C-Bus können folgende Daten der NMEA-0183 Datensätze GGA, RMC, GSA und VTG auf einfache Weise gelesen werden:&lt;br /&gt;
&lt;br /&gt;
* Geograf. Breite&lt;br /&gt;
* Geograf. Länge&lt;br /&gt;
* GPS Status&lt;br /&gt;
* HDOP&lt;br /&gt;
* Satellitenzahl&lt;br /&gt;
* Kurs&lt;br /&gt;
* Geschwindigkeit&lt;br /&gt;
* Höhe&lt;br /&gt;
* UTC-Zeit&lt;br /&gt;
* Datum&lt;br /&gt;
* PDOP&lt;br /&gt;
* VDOP&lt;br /&gt;
* Satellit 1..12&lt;br /&gt;
&lt;br /&gt;
Der ATtiny1634 ist natürlich vorprogrammiert, kann aber über eine vorbereitete 6-polige ISP-Schnittstelle auf der Platine auch umprogrammiert werden.&lt;br /&gt;
&lt;br /&gt;
'''Lieferumfang'''&lt;br /&gt;
* I2C GPS Empfänger&lt;br /&gt;
* CD mit Anleitung und Software-Beispielen.&lt;br /&gt;
&lt;br /&gt;
====Technische Daten====&lt;br /&gt;
* Versorgungsspannung: 5,0 V +/- 5%&lt;br /&gt;
* Stromverbrauch: &amp;lt;= 20 mA (typ.)&lt;br /&gt;
* I2C-Bus Geschwindigkeit: &amp;lt;= 400 kHz&lt;br /&gt;
* GPS Antenne: eingebaut&lt;br /&gt;
* Backup Batterie: Lithium, im Betrieb wieder aufladbar&lt;br /&gt;
* Temperatur Bereich: -10 bis 65 °C&lt;br /&gt;
* Form Faktor: 38 x 23 mm&lt;br /&gt;
* Gewicht: ca. 6 g&lt;br /&gt;
* Empfänger Spezifikationen (UC530):&lt;br /&gt;
** Empfänger: GPS L1 C/A-Code, SPS&lt;br /&gt;
** Kanäle: 66/22 (Suche/Track)&lt;br /&gt;
** Tracking Empfindlichkeit: -165 dBm typ.&lt;br /&gt;
** Navigations Empfindlichkeit: -148 dbm typ (Kaltstart)&lt;br /&gt;
** Update Rate: 1 Sek.&lt;br /&gt;
** Positions Genauigkeit:&lt;br /&gt;
*** 3,0m (67%) typ. horizontal&lt;br /&gt;
*** 5,0m (67%) typ. vertikal&lt;br /&gt;
*** 0,02 m/s (50%) typ. Geschwindigkeit&lt;br /&gt;
** Zeit bis zum ersten Fix: typ. 31 Sek.&lt;br /&gt;
** Protokoll: NMEA-0183 Rev. 3.01&lt;br /&gt;
&lt;br /&gt;
====Anschluss-Schema====&lt;br /&gt;
Belegung des 9-poligen Anschluss-Steckers (K1) siehe in [[RP6_Sensor_Board_und_Xtra_Module#I2C-MODULE|dieser]] Tabelle!&lt;br /&gt;
&lt;br /&gt;
====Umbau-Optionen====&lt;br /&gt;
Wenn man den ATtiny1634 selbst programmieren will, muss man Stiftleisten auf die Platine löten.&lt;br /&gt;
&lt;br /&gt;
Man braucht dazu: &lt;br /&gt;
* 2-reihige Stiftleiste RM 2,54mm (z.B. 2x40-polig 741306) &lt;br /&gt;
&lt;br /&gt;
Man trennt von der 2-reihigen Stiftleiste 2x3 Kontakte ab und lötet sie auf die Punkte &amp;quot;ISP6&amp;quot;.&lt;br /&gt;
Mit einem ISP-Programmer kann dann eine neue Firmware geflasht werden. Die aktuelle Firmware des ATtiny1634 (Version 1.2) wird als .HEX mitgeliefert, leider ohne Source-Code.&lt;br /&gt;
&lt;br /&gt;
Vorsicht: Dabei kann der Prozessor im schlimmsten Fall nicht mehr ansprechbar sein oder der GPS Empfänger UC530 beschädigt werden. Man sollte diesen Umbau und die ISP-Programmierung nur machen, wenn man genau weiß, was man macht! &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Gyro Modul JM3-GYRO===&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_Gyro_Modul.JPG|RP6 Gyro Modul|right|200px]]&lt;br /&gt;
&lt;br /&gt;
(Laut Online-Katalog der Firma CONRAD!)&lt;br /&gt;
&lt;br /&gt;
''&amp;quot;Das universelle Gyro-Sensor Modul für RP6, RP6 V2, RP6 ATMEGA32 und das RP6 V2 Control M256 Wifi-Kit ist ideal zur Erkennung der Blockierung des Roboters in seiner Drehbewegung, sowie der Stabilisierung der Geradeausfahrt.&amp;quot;''&lt;br /&gt;
&lt;br /&gt;
Aktuell (April 2019) ist das Gyro Modul bei CONRAD ausverkauft. &lt;br /&gt;
&lt;br /&gt;
====Beschreibung====&lt;br /&gt;
Das Gyro Modul ist eine kleine (19 x 17 mm) Zusatzplatine (RP6 Xtra Modul), die im RP6-System genutzt werden kann. Es gibt zwar keinen direkt passenden &amp;quot;Steckplatz&amp;quot; auf einer der Microcontroller-Plattformen (RP6v2, M32, M128, M256 Wifi), jedoch ist der Anschluß einfach:&lt;br /&gt;
Benötigt werden +5V und GND, sowie ein freier ADC-Kanal, der bis 5V messen kann. Damit kann das Gyro Modul sehr universell eingesetzt werden. Es misst die Drehrate um die Z-Achse (Hochachse oder Yaw).&lt;br /&gt;
&lt;br /&gt;
Die Platine ist bestückt mit dem analogen Gyro-Sensor [http://www.st.com/web/en/resource/technical/document/datasheet/CD00254111.pdf LY330ALH], dessen Ausgangsspannung durch zwei OP-Amps ([http://www.ti.com.cn/cn/lit/ds/symlink/lm321.pdf LM321], [http://www.produktinfo.conrad.com/datenblaetter/00000-24999/001072615-da-01-en-IC_AMP_PREC_LMP7731MF_NOPB_SOT_23_5_TID.pdf LMP7731MF]) in Ruhe bei 2,5 V liegt. Höhere Ausgangsspannungen (bis 5 V) bedeuten eine Drehgeschwindigkeit nach LINKS, niedrigere (bis 0 V) eine Drehgeschwindigkeit nach RECHTS. Die 3,3 V Versorgungsspannung des LY330ALH wird auf der Platine durch einen Spannungsregler ([http://www.mouser.com/ds/2/405/lm3480-316799.pdf LM3480IM3-3.3]) erzeugt.&lt;br /&gt;
&lt;br /&gt;
'''Lieferumfang'''&lt;br /&gt;
* Gyro Modul&lt;br /&gt;
* CD mit Anleitung und Software-Beispielen.&lt;br /&gt;
&lt;br /&gt;
====Technische Daten====&lt;br /&gt;
&lt;br /&gt;
* VDD: 5,0 V +/- 5%&lt;br /&gt;
* Vout(0): 2,5 V +/- 2% (ohne Bewegung)&lt;br /&gt;
* Vout: Vout(0) + 10mV / dps +/- 2%&lt;br /&gt;
* Messbereich: ca. 200 dps max.&lt;br /&gt;
&lt;br /&gt;
====Anschluss-Schema====&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_Gyro_Modul_SP.JPG|RP6 Gyro Modul - Anschluss-Schema]]&lt;br /&gt;
&lt;br /&gt;
====Umbau-Optionen====&lt;br /&gt;
Am Gyro Modul gibt es nichts umzubauen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===3D Accelerometer Modul JM3-3DA===&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_3D_Accelerometer_Modul.JPG|RP6 3D Accelerometer Modul|right|105px]]&lt;br /&gt;
&lt;br /&gt;
(Laut Online-Katalog der Firma CONRAD!)&lt;br /&gt;
&lt;br /&gt;
''&amp;quot;Universeller 3-Achsen Beschleunigungssensor für RP6, RP6 V2, RP6 ATMEGA32 und das RP6 V2 Control M256 WIFI-Kit. Ideal zur Winkelmessung (Neigung-, Kipp-Winkel) und vieles mehr.&amp;quot;''&lt;br /&gt;
&lt;br /&gt;
Seit Mai 2020 ist das 3D Accelerometer Modul bei CONRAD ausverkauft.&lt;br /&gt;
&lt;br /&gt;
====Beschreibung====&lt;br /&gt;
&lt;br /&gt;
Das 3D Accelerometer Modul ist eine kleine (15 x 10 mm) Zusatzplatine (RP6 Xtra Modul), die direkt auf den EEPROM-Sockel (IC5) der Zusatzplatine [[RP6#RP6_CONTROL_M32_Platine|RP6 CONTROL M32]] gesteckt und über den SPI-Bus angesteuert werden kann. Das Accelerometer Modul kann aber auch mit allen Microcontroller-Plattformen betrieben werden, die eine stabilisierte 5V-Versorgungsspannung und einen SPI- oder I2C-Bus bieten.&lt;br /&gt;
&lt;br /&gt;
Die Platine ist bestückt mit dem 3D Beschleunigungs-Sensor [http://www.farnell.com/datasheets/1691680.pdf LIS302DLH]. Die 3,3 V Versorgungsspannung des LIS302DLH wird auf der Platine durch einen Spannungsregler ([http://www.mouser.com/ds/2/405/lm3480-316799.pdf LM3480IM3-3.3]) erzeugt.&lt;br /&gt;
&lt;br /&gt;
'''Lieferumfang'''&lt;br /&gt;
* 3D Accelerometer Modul&lt;br /&gt;
* CD mit Anleitung und Software-Beispielen.&lt;br /&gt;
&lt;br /&gt;
====Technische Daten====&lt;br /&gt;
&lt;br /&gt;
* VDD: 5,0 V +/- 5%&lt;br /&gt;
* Messbereiche: +-2 g, +-4 g, +-8 g&lt;br /&gt;
* Datenausgabe: 16 Bit&lt;br /&gt;
* Schnittstellen: I2C, SPI&lt;br /&gt;
&lt;br /&gt;
====Anschluss-Schema====&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_3D_Accelerometer_Modul_SP.JPG|RP6 3D Accelerometer Modul - Anschluss-Schema|350px]]&lt;br /&gt;
&lt;br /&gt;
====Umbau-Optionen====&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_3D_Accelerometer_Modul_M32.JPG|RP6 3D Accelerometer Modul auf der M32|right|500px]]&lt;br /&gt;
&lt;br /&gt;
'''Will man das Modul auf der M32 einsetzen, muss man auf dem 3D Accelerometer Modul die Widerstände R2 und R3 (falls vorhanden!) auslöten (siehe Anleitung zum Modul, Seiten 4/5!)''' und einen IC-Sockel an Position IC5 und einen Kondensator an Position C19 auf der M32 einlöten, siehe [[RP6#Zweites_SPI-EEPROM|hier]]!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die Abbildung rechts zeigt das 3D Accelerometer Modul auf der M32.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===BHT Modul JM3-BHT31===&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_BHT_Modul.PNG|RP6 BHT Modul|right|203px]]&lt;br /&gt;
&lt;br /&gt;
Dieses [http://jm3-engineering.com/sensors.htm BHT Modul] zur Messung von Luftdruck, Luftfeuchte und Temperatur war für das Ende des 3. Quartals 2014 angekündigt und ist nun ab dem 22.01.2015 lieferbar.&lt;br /&gt;
&lt;br /&gt;
(Laut Online-Katalog der Firma CONRAD!)&lt;br /&gt;
&lt;br /&gt;
''&amp;quot;Ein Luftdruck-, rel. Luftfeuchtigkeits- und Temperatursensor Modul für vielfältige Anwendungen. Es kann direkt in den Asuro Expansion-Port auf dem Asuro xTend Bord eingesteckt werden. Das Asuro Modul kann mit den anderen erhältlichen Modulen (Kompass/Gyro und RTC kombiniert werden (Stack-up)). Außerdem kann es auch auf dem RP6 Sensor Bord in dem I2C Modulsteckplatz verwendet werden. Das Sensor Modul verwendet den hochauflösenden Drucksensor-Chip MS5607-02BA und den Luftfeuchtigkeitssensor HTU21D von MEAS Switzerland mit I2C Bus Interface. Der barometrische Drucksensor ist für Höhenmesser und Variometer optimiert und hat eine Auflösung von 20cm. Der relative Luftfeuchtigkeits- und Temperatursensor bietet zuverlässige und genaue Daten, welche sich auch besonders für Wetterstations-Informationen eignen.&amp;quot;''&lt;br /&gt;
&lt;br /&gt;
Aktuell (April 2019) ist das BHT Modul bei CONRAD ausverkauft. &lt;br /&gt;
&lt;br /&gt;
====Beschreibung====&lt;br /&gt;
Das BHT Modul ist eine kleine (24 x 14 mm) Zusatzplatine (ASURO xTend bzw. RP6 Xtra Modul), die direkt auf das [[RP6_Sensor_Board_und_Xtra_Module#RP6_Sensor_Board_2|RP6 Sensor Board]] aufgesteckt werden kann. Sie kann auch auf dem [http://www.conrad.de/ce/de/product/1302085/Arexx-Asuro-xTend-Board-JM3-AXT3 Arexx Asuro xTend Board] und überall eingesetzt werden, wo eine stabilisierte 5V Versorgungsspannung und ein I2C-Bus bis 400 kHz zur Verfügung steht.&lt;br /&gt;
&lt;br /&gt;
Die Platine ist bestückt mit dem barometrischen Drucksensor [http://www.parallax.com/sites/default/files/downloads/29124-MS5607-02BA03-Datasheet.pdf MS5607-02BA] und dem relativen Luftfeuchtigkeits- und Temperatursensor [http://www.meas-spec.com/downloads/HTU21D.pdf HTU21D]. Die 3,0 V Versorgungsspannung der Sensoren wird auf der Platine durch einen Spannungsregler ([http://www.farnell.com/datasheets/78902.pdf LP2980AIM5-3.0]) erzeugt. &lt;br /&gt;
&lt;br /&gt;
'''Lieferumfang'''&lt;br /&gt;
* BHT Modul&lt;br /&gt;
* CD mit Dokumentation&lt;br /&gt;
&lt;br /&gt;
====Technische Daten====&lt;br /&gt;
&lt;br /&gt;
* Nennspannung: 3,3 V (?)&lt;br /&gt;
* Nennstrom: 0,2 mA (typ.) &amp;lt; 1,5mA peaktyp.&lt;br /&gt;
* I2C Bus Geschwindigkeit: 400kHz max.&lt;br /&gt;
* Sensor Modul mit MS5607-02BA und HTU21D&lt;br /&gt;
* Hohe Auflösung des Sensorelements - Höhe: 20cm /- rel. Luftfeuchtigkeit: 0,04%&lt;br /&gt;
* Schneller AD-Wandler&lt;br /&gt;
* Digitaler Drucksensor (24 bit ΔΣ ADC)&lt;br /&gt;
* Luftdruckbereich: 10 bis 1200 mbar&lt;br /&gt;
* Exzellente Langzeitstabilität&lt;br /&gt;
* Unmittelbare Desaturierung&lt;br /&gt;
* Kalibrierung in der Fabrik&lt;br /&gt;
&lt;br /&gt;
====Anschluss-Schema====&lt;br /&gt;
Belegung des 9-poligen Anschluss-Steckers (K1) siehe in [[RP6_Sensor_Board_und_Xtra_Module#I2C-MODULE|dieser]] Tabelle!&lt;br /&gt;
&lt;br /&gt;
====Umbau-Optionen====&lt;br /&gt;
&lt;br /&gt;
===Xtra Module auf einer Experimentierplatine===&lt;br /&gt;
&lt;br /&gt;
Die drei bis jetzt (09/2014) erhältlichen [[RP6_Sensor_Board_und_Xtra_Module#RP6_Xtra_Module_2|Xtra Module]], die die Navigation eines Roboters ermöglichen, können problemlos im RP6-System genutzt werden,- zwei davon sogar in Form des direkten Aufsteckens auf eine der Zusatz-Platinen: Für den [[RP6_Sensor_Board_und_Xtra_Module#I2C_GPS_Empf.C3.A4nger_JM3-GPS|I2C GPS Empfänger]] gibt es einen Steckplatz auf dem [[RP6_Sensor_Board_und_Xtra_Module#RP6_Sensor_Board_2|RP6 Sensor Board]], das [[RP6_Sensor_Board_und_Xtra_Module#3D_Accelerometer_Modul_JM3-3DA|3D Accelerometer Modul]] kann auf der [[RP6#RP6_CONTROL_M32_Platine|RP6 CONTROL M32]] aufgesteckt werden.&lt;br /&gt;
&lt;br /&gt;
Natürlich können die Xtra Module auch allein (&amp;quot;stand-alone&amp;quot;) ohne RP6 Sensor Board oder RP6 CONTROL M32 betrieben werden. Dazu kann man sie z.B. auf einer [[RP6#Experimentierplatine|Experimentierplatine]] aufbauen. &lt;br /&gt;
&lt;br /&gt;
Das soll hier mit einer kurzen Aufbauanleitung demonstriert werden.&lt;br /&gt;
&lt;br /&gt;
====Schaltplan====&lt;br /&gt;
&lt;br /&gt;
Aber zunächst der Schaltplan:&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6v2_Xtra_Module_SP.jpg|RP6 Experimentierplatine für Xtra Module - Schaltplan]]&lt;br /&gt;
&lt;br /&gt;
Man erkennt die drei XTra Module, die (bis auf das Gyro Modul) an den I2C-Bus am XBUS Stecker des RP6 angeschlossen sind. Das [[RP6_Sensor_Board_und_Xtra_Module#Gyro_Modul_JM3-GYRO|Gyro Modul JM3-GYRO]] wird nicht über I2C angesteuert, sondern liefert an seinem Pin OUT ein analoges Ausgangssignal, das mit einem ADC Eingang (0..5V) gemessen werden kann.&lt;br /&gt;
&lt;br /&gt;
Der Jumper (Steckbrücke) JP1 dient zum Einstellen der I2C-Adresse des 3D Accelerometer Moduls (0x30, 0x32).&lt;br /&gt;
Mit JP2/3 wird die [[RP6_Sensor_Board_und_Xtra_Module#Optionale_Ansteuerung|Betriebsart des Gyro Moduls]] festgelegt.&lt;br /&gt;
Die Jumper JP4 bis JP9 dienen zur Verteilung von INT1, INT2 des 3D Accelerometer Moduls und des OUT Signals des Gyro Moduls auf die INT-Anschlüsse INT1..3, INTU des XBUS. Wenn man die Interrupts des 3D Accelerometer Moduls nicht nutzen will, kann man die Jumper JP4 bis JP8 auch weglassen. Mit JP9 wird das analoge Signal des Gyro Moduls an INT1 des XBUS gelegt. Dies ist nur dann sinnvoll, wenn man die Platine mit der RP6v2 Base betreibt, weil hier an INT1 ein ADC Eingang (ADC4) liegt. Bei allen anderen Plattformen des RP6-Systems (M32, CCPRO M128, M256 WiFi) muss JP9 offen bleiben.&lt;br /&gt;
&lt;br /&gt;
Mit dieser Schaltung kann man also den Beschleunigungssensor (3D Accelerometer) und den GPS Empfänger über I2C auslesen. Der Gyro wird entweder mit ADC4 der RP6v2 Base (JP9 geschlossen!) ausgewertet oder durch einen anderen ADC Eingang. Dazu kann man das Ausgangssignal des Gyros an Pin 3 der Stiftleiste ST1 abnehmen. Von dort kann es z.B. zu ADC0 oder ADC1 der RP6v2 Base oder der RP6 CONTROL M32 geführt werden oder zu einem beliebigen ADC Eingang der CCPRO M128 oder der M256 WiFi. Die Stiftleiste ST1 liegt direkt neben dem USRBUS, so dass die Verbindung auch über den USRBUS hergestellt werden kann. Dazu verbindet man Pin 3 von ST1 mit einem Pin (Y1..Y14) des USRBUS.&lt;br /&gt;
&lt;br /&gt;
====Bestückungsplan====&lt;br /&gt;
&lt;br /&gt;
So kann z.B. der Bestückungsplan mit Leiterbahnführung auf der Experimentierplatine (Exp) aussehen:&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6v2_Xtra_Module.jpg|RP6 Experimentierplatine für Xtra Module]]&lt;br /&gt;
&lt;br /&gt;
Was braucht man allgemein für den Aufbau einer Schaltung auf der Exp:&lt;br /&gt;
* Seitenschneider, Schere, Zange&lt;br /&gt;
* Lötkolben 25..30 Watt, Lötzinn&lt;br /&gt;
* Plastik 70 Schutzlack (CONRAD 813621)&lt;br /&gt;
* Isolierter Schaltdraht YV 0,20 mm² (CONRAD 606065)&lt;br /&gt;
* Versilberter CU-Draht 0,6 mm (CONRAD 605581)&lt;br /&gt;
&lt;br /&gt;
Mit dem versilberten CU-Draht stellt man auf der Unterseite (= Lötseite) der Exp Verbindungen zwischen den Bauteilen her; mit dem isolierten Schaltdraht werden Drahtbrücken auf der Oberseite (= Bestückungsseite) der Exp eingesetzt. Die Lage der Xtra Module und der Verbindungen kann man im Bestückungsplan (s.o.!) erkennen, Drahtbrücken sind rot hervorgehoben.&lt;br /&gt;
&lt;br /&gt;
Zusätzlich zu den RP6 Xtra Modulen braucht man folgende Bauteile (Bestell-Nummern von CONRAD):&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| Anzahl || Bestell-Nr. || Bauteil-Bezeichnung || Verwendung&lt;br /&gt;
|-&lt;br /&gt;
| 1 || [http://www.conrad.de/ce/de/product/191537/Arexx-RP6-Experimentierplatine?queryFromSuggest=true 191537] || RP6 Experimentierplatine || &lt;br /&gt;
|-&lt;br /&gt;
| 1 || [http://www.conrad.de/ce/de/product/189600/Praezisions-IC-Fassung-MPE-Garry-MP-083-STG-BU-Pole-8-Rastermass-762-mm-Material-Kontaktfeder-025-Gold-ueber-Nickel 189600] || Präzisions-IC-Fassung (8 Pole) || Stecksockel für Accelerometer Modul&lt;br /&gt;
|-&lt;br /&gt;
| 1 || [http://www.conrad.de/ce/de/product/741360/Praezisions-Buchsenleiste-RM-254-gerade-Pole-1-x-20-10120832-BKL-Electronic-Inhalt-1-St 741360] || Präzisions-Buchsenleiste RM 2,54mm (9 Pole) || Stecksockel für GPS Empfänger&lt;br /&gt;
|-&lt;br /&gt;
| 1 || [http://www.conrad.de/ce/de/product/741307/Praezisions-Stiftleiste-RM-254-gerade-Pole-1-x-20-10120536-BKL-Electronic-Inhalt-1-St 741307] || Präzisions-Stiftleiste RM 2,54mm (2 x 4 Pole) || Stecksockel für Gyro Modul&lt;br /&gt;
|-&lt;br /&gt;
| 1 || [http://www.conrad.de/ce/de/product/741119/Stiftleiste-RM-254-gerade-Pole-1-x-36-10120182-BKL-Electronic-Inhalt-1-St 741119] || 1-reihige Stiftleiste RM 2,54mm (ges. 36-polig) || JP1, ST1&lt;br /&gt;
|-&lt;br /&gt;
| 1 || [http://www.conrad.de/ce/de/product/741186/Doppelreihige-Stiftleiste-RM-254-gerade-Pole-2-x-8-10120514-BKL-Electronic-Inhalt-1-St 741186] || 2-reihige Stiftleiste RM 2,54mm (ges. 8-polig) || JP2..9&lt;br /&gt;
|-&lt;br /&gt;
| 1 || [http://www.conrad.de/ce/de/product/742902/Codier-Adressierbruecken-Set-Rastermass-25254-mm-10120906-BKL-Electronic-Inhalt-1-Set 742902] || Sechs Codierbrücken (aus Set) || Steckbrücken&lt;br /&gt;
|-&lt;br /&gt;
| 2 || [http://www.conrad.de/ce/de/product/453099/Keramik-Kondensator-01-F-50-V-20-B-x-H-508-mm-x-508-mm-1-St 453099] || Keramik Kondensator 100 nF || Blockkondensatoren C2, C3&lt;br /&gt;
|-&lt;br /&gt;
| 1 || [http://www.conrad.de/ce/de/product/421986/Elektrolyt-Kondensator-radial-bedrahtet-25-mm-10-F-50-V-20--x-H-5-mm-x-11-mm-Panasonic-EEUFC1H100LH-1-St 421986] || Elektrolyt Kondensator 10 uF/50 V || Spannungsstabilisierung C1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Viel Erfolg beim Aufbau!&lt;br /&gt;
&lt;br /&gt;
 Natürlich muss man nicht alle drei Sensoren aufbauen!&lt;br /&gt;
 Man kann einfach den/die Sensor/en weglassen, den/die man nicht nutzen will!&lt;br /&gt;
&lt;br /&gt;
Noch ein Wort zur Programmierung des 3D Accelerometer Moduls: Es wird auf dieser Exp über den I2C Bus angesteuert. Damit kann man die [[RP6_Sensor_Board_und_Xtra_Module#RP6_CONTROL_M32:_ACCSENS_Library|nachfolgende Library]] für dieses Modul hier NICHT benutzen!&lt;br /&gt;
&lt;br /&gt;
====Magnetfeldsensor====&lt;br /&gt;
&lt;br /&gt;
Wenn man die oben beschriebene Experimentierplatine aufgebaut hat, hat man für die Navigation eines mobilen Roboters (wie des RP6v2) schon drei benötigte Sensoren zur Verfügung: einen GPS Empfänger, einen 3D-Beschleunigungssensor und einen 1D-Gyrosensor.&lt;br /&gt;
&lt;br /&gt;
Was fehlt, ist z.B. ein '''Magnetfeldsensor (Kompass-Sensor)''', mit dem der Roboter die Himmelsrichtung feststellen kann. Einen Magnetfeldsensor gibt es (noch) nicht als Xtra Modul.&lt;br /&gt;
&lt;br /&gt;
Auf der beschriebenen Experimentierplatine ist durchaus noch Platz (z.B. in der rechten oberen Ecke) für einen Magnetfeldsensor. Geeignet ist z.B. das 2D-Kompassmodul HDMM01 ([http://www.pollin.de/shop/dt/NTM4OTgxOTk-/Bausaetze_Module/Module/Kompassmodul_HDMM01.html Pollin 94-810 164] NICHT MEHR LIEFERBAR!).&lt;br /&gt;
&lt;br /&gt;
Hier ist der um den Magnetfeldsensor erweiterte Schaltplan:&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6v2_Xtra_Module_HDMM01_SP.jpg|RP6 Experimentierplatine für Xtra Module und HDMM01 - Schaltplan]]&lt;br /&gt;
&lt;br /&gt;
Das kleine Kompassmodul dürfte doch noch einfach auf der Experimentierplatine unterzubringen sein, oder?&lt;br /&gt;
&lt;br /&gt;
Zur Programmierung des Magnetfeldsensors HDMM01 gibt es [[RP6v2_Orientierung#Kompassmodul_HDMM01_2|HIER]] Anregungen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Programmierung==&lt;br /&gt;
In diesem Abschnitt geht es um die Programmierung der Sensoren und Aktoren auf dem [[RP6_Sensor_Board_und_Xtra_Module#RP6_Sensor_Board_3|RP6 Sensor Board]] und auf den [[RP6_Sensor_Board_und_Xtra_Module#RP6_Xtra_Module_3|Xtra Modulen]]. Die hier veröffentlichte Software baut NICHT auf die mitgelieferten C++ Software-Beispiele auf der ''&amp;quot;RP6 Robot System Xtra Modules CD-ROM&amp;quot;'' auf, sondern basiert auf Eigenentwicklungen in GCC.&lt;br /&gt;
&lt;br /&gt;
===RP6 Sensor Board===&lt;br /&gt;
Das RP6 Sensor Board RP6-JM03-61 verfügt nicht über einen eigenen Microprozessor. Daher geht es hier eigentlich nicht um die Programmierung des Sensor Boards, sondern um die Programmierung der Microcontroller-Plattform, an die das Sensor Board angeschlossen ist. In der Regel wird das die RP6 M256 WiFi Zusatzplatine sein, aber auch die RP6v2 Base steuert (als I2C-Slave) in der vorgesehenen Konfiguration gewisse Funktionen des Sensor Boards an.&lt;br /&gt;
Prinzipiell kann das Sensor Board aber auch an der RP6 CONTROL M32 (''passende Library auf Anfrage beim Autor!'') oder der RP6 CCPRO M128 Zusatzplatine betrieben werden.&lt;br /&gt;
&lt;br /&gt;
====Dokumentation====&lt;br /&gt;
Die Dokumentation zum RP6 Sensor Board befindet sich auf der mitgelieferten ''&amp;quot;RP6 Robot System Xtra Modules CD-ROM&amp;quot;''.&lt;br /&gt;
&lt;br /&gt;
=====Manuals=====&lt;br /&gt;
Das Handbuch in der aktuellen Version kann [http://www.jm3-engineering.com/download/doc/ManualRP6SensorBoard_de.pdf hier] oder [http://www.produktinfo.conrad.com/datenblaetter/00000-24999/001082384-an-01-de-RP6_SENSOR_BOARD.pdf da] eingesehen werden.&lt;br /&gt;
 ACHTUNG: Das Manual enthielt in der Version 1.11 noch teils irreführende&lt;br /&gt;
          Beschreibungen, die in der aktuellen Version 1.20 vom 20.04.2014&lt;br /&gt;
          korrigiert wurden!&lt;br /&gt;
&lt;br /&gt;
====Robot-Tool====&lt;br /&gt;
[[Bild:JM3 Robot-Tool.PNG|JM3 Robot-Tool|thumb]]&lt;br /&gt;
&lt;br /&gt;
Von JM3 Engineering wurde auch ein eigenes Programm &amp;quot;'''JM3 Robot-Tool'''&amp;quot; veröffentlicht, das im RP6-System (RP6(v2) Base, CONTROL M32, M256 WiFi) anstelle des [[RP6v2#RobotLoader|RobotLoaders]] verwendet werden kann.&lt;br /&gt;
&lt;br /&gt;
Vom Robot-Tool gibt es auch eine Kommandozeilen-Version &amp;quot;'''Multiloader'''&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Befehlszeilen Optionen'''&lt;br /&gt;
 Multi Loader v1.0.1&lt;br /&gt;
 &lt;br /&gt;
 Usage:&lt;br /&gt;
 multiloader [filename] [port/hostname] [device] [-l]&lt;br /&gt;
  -l forces RP6 low speed mode.&lt;br /&gt;
 &lt;br /&gt;
 Valid devices:&lt;br /&gt;
  - Asuro&lt;br /&gt;
  - AsuroCtrl&lt;br /&gt;
  - RP6Base&lt;br /&gt;
  - RP6CtrlM32&lt;br /&gt;
  - RobotArm&lt;br /&gt;
  - RP6Wifi&lt;br /&gt;
 Attention: Device names are case-sensitive&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 Multi Loader v2.0.0&lt;br /&gt;
 &lt;br /&gt;
 Usage: multiloader [load/conf] [...]&lt;br /&gt;
 &lt;br /&gt;
         load    Load .hex file into robot.&lt;br /&gt;
                 arguments: [filename] [port/host] [device] [interface] [-l]&lt;br /&gt;
 &lt;br /&gt;
                 [interface] specifies programming interface type.&lt;br /&gt;
                 Valid interface types are UART and TCP.&lt;br /&gt;
                 -l forces RP6 low speed mode.&lt;br /&gt;
 &lt;br /&gt;
                 Valid devices:  [interfaces]&lt;br /&gt;
                 - Asuro     UART&lt;br /&gt;
                 - AsuroXT   UART&lt;br /&gt;
                 - Marvin    UART&lt;br /&gt;
                 - MarvinFW  UART&lt;br /&gt;
                 - RP6       UART&lt;br /&gt;
                 - RP6M32    UART&lt;br /&gt;
                 - RP6Wifi   TCP&lt;br /&gt;
                 - RobotArm  UART&lt;br /&gt;
 &lt;br /&gt;
                 Attention: Device names are case-sensitive&lt;br /&gt;
 &lt;br /&gt;
=====Versionen=====&lt;br /&gt;
Hier eine Tabelle der (mir) bekannten Robot-Tool Versionen:&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |rowspan=2|ZIP-Datum&lt;br /&gt;
 |colspan=2|Robot-Tool:&lt;br /&gt;
 |colspan=2|Multiloader:&lt;br /&gt;
 |rowspan=2|Bemerkungen&lt;br /&gt;
 |-&lt;br /&gt;
 |Windows&lt;br /&gt;
 |Linux&lt;br /&gt;
 |Windows&lt;br /&gt;
 |Linux&lt;br /&gt;
 |-&lt;br /&gt;
 |25.10.2014&lt;br /&gt;
 |1.0.1-1&lt;br /&gt;
 |1.0.1-1&lt;br /&gt;
 |1.0.1-1&lt;br /&gt;
 |1.0.1-1&lt;br /&gt;
 |Erste veröffentlichte Version!&lt;br /&gt;
 |-&lt;br /&gt;
 |30.01.2017&lt;br /&gt;
 |[http://www.jm3-engineering.com/download/robottool-v2.0-win32.7z 2.0]&lt;br /&gt;
 |[http://www.jm3-engineering.com/download/robottool-v2.0-linux.tar.xz 2.0]&lt;br /&gt;
 |2.0&lt;br /&gt;
 |2.0&lt;br /&gt;
 |auch für [http://www.jm3-engineering.com/download/robottool-v2.0-osx.tar.gz Mac OSX]!&lt;br /&gt;
 |-&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
'''Hinweise:'''&lt;br /&gt;
* 1. Falls die Links in der Tabelle auf die Seite &amp;quot;Neuigkeiten&amp;quot; von JM3-Engineering führen, kann man dort auf die Seite &amp;quot;Software Downloads&amp;quot; wechseln und die Dateien im Absatz &amp;quot;JM3 Robot-Tool V2.0&amp;quot; herunterladen.&lt;br /&gt;
* 2. Ab Version 2.0 ist der Multiloader in der ZIP des Robot-Tools enthalten.&lt;br /&gt;
&lt;br /&gt;
====AVR-GCC und Visual Studio====&lt;br /&gt;
Die Demo-Programme zum RP6 Sensor Board wurden mit [https://www.microsoft.com/de-de/download/details.aspx?id=5555&amp;amp;fa43d42b-25b5-4a42-fe9b-1634f450f5ee=True Microsoft Visual C++ 2010] und [http://www.jm3-engineering.com/download/avr-gcc-4.8.1-win32.7z AVR-GCC] erstellt.&lt;br /&gt;
&lt;br /&gt;
Eine Anleitung zur Installation unter Windows befindet sich [http://www.jm3-engineering.com/download/doc/avr-gcc-vs_de.pdf hier].&lt;br /&gt;
&lt;br /&gt;
====Demo-Programmme====&lt;br /&gt;
Demo-Programme und eine &amp;quot;Library&amp;quot; zum RP6 Sensor Board befinden sich auf der mitgelieferten ''&amp;quot;RP6 Robot System Xtra Modules CD-ROM&amp;quot;''. Sie können auch in der aktuellen Version im Download Bereich von [http://www.jm3-engineering.com/downloads.htm JM3 Engineering] herunter geladen werden:&lt;br /&gt;
* [http://www.jm3-engineering.com/download/RP6SensorBoardDemo_1.1-1.7z RP6 Sensor Board Demo Programm und Library]&lt;br /&gt;
* [http://www.jm3-engineering.com/download/RP6SensorBoardDemo_noVC_1.1-1.7z RP6 Sensor Board Demo Programm und Library (ohne Visual Studio Projekt Dateien)]&lt;br /&gt;
* [http://www.jm3-engineering.com/download/RP6-RC_1.0-1.7z Remote Control Software]&lt;br /&gt;
'''Hinweis:'''&lt;br /&gt;
Falls die o.g. Links auf die Seite &amp;quot;Neuigkeiten&amp;quot; von JM3-Engineering führen, kann man dort auf die Seite &amp;quot;Software Downloads&amp;quot; wechseln und die Dateien im Absatz &amp;quot;RP6 Sensor Board Library und Demo-Programm&amp;quot; herunterladen.&lt;br /&gt;
&lt;br /&gt;
====Library====&lt;br /&gt;
Eine &amp;quot;Library&amp;quot; zum RP6 Sensor Board, bestehend aus einigen Einzel-Dateien mit jeweils eigenen Versions-Nummern, befindet sich auf der mitgelieferten ''&amp;quot;RP6 Robot System Xtra Modules CD-ROM&amp;quot;''. Sie ist in der aktuellen Version auch in den Demo-Programmen enthalten ([[RP6_Sensor_Board_und_Xtra_Module#Demo-Programmme|s.o.!]]).&lt;br /&gt;
&lt;br /&gt;
=====Versionen=====&lt;br /&gt;
Hier eine Tabelle der (mir) bekannten Library Versionen für das RP6 Sensor Board:&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |ZIP-Datum *&lt;br /&gt;
 |Version&lt;br /&gt;
 |RP6SensorBoardDemo&lt;br /&gt;
 |RP6-RC&lt;br /&gt;
 |RP6M256_I2CMasterLib&lt;br /&gt;
 |RP6M256Lib&lt;br /&gt;
 |RP6I2CmasterTWI&lt;br /&gt;
 |-&lt;br /&gt;
 |09.12.2013&lt;br /&gt;
 |1.0&lt;br /&gt;
 |1.0&lt;br /&gt;
 |1.0&lt;br /&gt;
 |(1.0_24.02.12) ²&lt;br /&gt;
 |1.1_16.07.12 ²&lt;br /&gt;
 |1.1_04.09.12 ³&lt;br /&gt;
 |-&lt;br /&gt;
 |27.12.2014&lt;br /&gt;
 |1.1&lt;br /&gt;
 |1.1-1&lt;br /&gt;
 |1.0-1&lt;br /&gt;
 |Modified 02.11.14 ³&lt;br /&gt;
 |1.1.1_25.10.14 ³&lt;br /&gt;
 |1.1_04.09.12 ³&lt;br /&gt;
 |-&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
'''Zu *:''' Alternativ: Datum der Verzeichnisse (z.B. auf der ''&amp;quot;RP6 Robot System Xtra Modules CD-ROM&amp;quot;'')!&lt;br /&gt;
&lt;br /&gt;
'''Zu ²:''' Neueste Original Version der [http://rn-wissen.de/wiki/index.php/RP6v2#Versionen RP6 Library]!&lt;br /&gt;
&lt;br /&gt;
'''Zu ³:''' Modifiziert von [http://www.jm3-engineering.com/ JM3 Engineering]!&lt;br /&gt;
&lt;br /&gt;
=====Modifizierte RP6 Libraries=====&lt;br /&gt;
Von [http://www.jm3-engineering.com/ JM3 Engineering] wurden bis jetzt drei [http://rn-wissen.de/wiki/index.php/RP6v2#Versionen RP6 &amp;quot;Original&amp;quot;-Libraries] leicht modifiziert, um sie für die eigenen Programme für das RP6 Sensor Board optimal nutzen zu können.&lt;br /&gt;
In diesem Abschnitt soll kurz erwähnt werden, WAS verändert wurde.&lt;br /&gt;
 &lt;br /&gt;
======RP6M256_I2CMasterLib======&lt;br /&gt;
Die RP6M256_I2CMasterLib wurde von JM3 Engineering ab der Software Version 1.1 für das RP6 Sensor Board verändert, um sie in einer eigenen Bibliothek bestehend aus mehreren Modulen nutzen zu können. Folgendes wurde angepasst:&lt;br /&gt;
* Neue typedef unions:&lt;br /&gt;
** u_interrupt_status&lt;br /&gt;
** u_status&lt;br /&gt;
** u_drive_status&lt;br /&gt;
** u_statusLEDs&lt;br /&gt;
&lt;br /&gt;
Die modifizierte RP6M256_I2CMasterLib vom 2.11.2014 ist kompatibel zur Original-Version vom 24.02.2012.&lt;br /&gt;
&lt;br /&gt;
======RP6M256Lib======&lt;br /&gt;
Eine modifizierte Version 1.1.1 der RP6M256Lib mit Datum vom 25.10.2014 wurde von JM3 Engineering im November 2014 zusammen mit der Software Version 1.1 für das RP6 Sensor Board veröffentlicht. Sie ist kompatibel zur Version 1.1 der RP6M256Lib vom 16.07.2012 und enthält folgende Änderung:&lt;br /&gt;
* In der Datei RP6M256.h wird die Variable &amp;quot;timer&amp;quot; korrekt als &amp;quot;''extern'' volatile uint16_t timer&amp;quot; deklariert.&lt;br /&gt;
&lt;br /&gt;
======RP6I2CmasterTWI======&lt;br /&gt;
Eine erweiterte I2C Master-Library (Version 1.1) gibt es mit Datum vom 04.09.2012, veröffentlicht ab Februar 2014 von JM3 Engineering für das RP6 Sensor Board und die Xtra Module. Sie ist abwärts-kompatibel zur I2C Master-Library in der Version 1.0 vom 16.05.2007 und bietet lediglich folgende Erweiterung: &lt;br /&gt;
* Neue Funktion I2CTWI_readWordRegisters() zum Lesen von 16 Bit Registern&lt;br /&gt;
&lt;br /&gt;
====RP6 M256 WiFi: Sensor Board Library====&lt;br /&gt;
Die nachfolgende RP6M256_Sensor_BoardLib (Eigenentwicklung in GCC) dient zur Ansteuerung des Sensor Boards durch die RP6M256 WiFi.&lt;br /&gt;
&lt;br /&gt;
=====Configuration Header=====&lt;br /&gt;
Vor dem Kompilieren der Library muss eine Anpassung des Configuration Headers an die eigenen Hardware-Voraussetzungen erfolgen.&lt;br /&gt;
Dazu gibt es im Configuration Header eine Definition:&lt;br /&gt;
* USE_PD5 -&amp;gt; Die Sensor Board Funktion &amp;quot;PD5&amp;quot; steuert den TCA4311A Enable Pin (EN).&lt;br /&gt;
Im nachfolgenden Listing ist die Definition USE_PD5 NICHT aktiv (d.h. der TCA4311A Enable Pin (EN) wird vom MAX7311 I/O 1.0 Pin angesteuert!). Dies muss an die eigene Hardware angepaßt werden. Wenn &amp;quot;PD5&amp;quot; den TCA4311A Enable Pin (EN) steuern soll, muss die Zeile mit &amp;quot;USE_PD5&amp;quot; &amp;quot;aktiviert&amp;quot; werden. Dazu entfernt man &amp;quot;//&amp;quot; am Zeilenanfang:&lt;br /&gt;
 #define USE_PD5&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Bevor man Beschleunigungs-, Magnetfeldsensor und Gyroskop nutzen kann, muss man sie kalibrieren:&lt;br /&gt;
&lt;br /&gt;
* '''Accelerometer:'''&lt;br /&gt;
** Die X-Achse wird kalibriert, indem man den RP6 mit der rechten Seite nach unten hält und den Maximalwert in MAX_X_A einträgt. Dann neigt man ihn auf seine linke Seite und trägt den negativen Maximalwert in MIN_X_A ein.&lt;br /&gt;
** Die Y-Achse wird kalibriert, indem man den RP6 mit der Vorderseite nach oben hält und den Maximalwert in MAX_Y_A einträgt. Dann kippt man die Vorderseite nach unten und trägt den negativen Maximalwert in MIN_Y_A ein.&lt;br /&gt;
** Die Z-Achse wird kalibriert, indem man den RP6 normal waagerecht hält und den Maximalwert in MAX_Z_A einträgt. Dann dreht man den RP6 &amp;quot;auf den Kopf&amp;quot; und trägt den negativen Maximalwert in MIN_Z_A ein.&lt;br /&gt;
** Sollten die angezeigten Pitch- und Roll-Werte nach der Kalibrierung der Achsen und genau waagerecht stehendem Sensor bzw. RP6 vom Nullwert deutlich abweichen, kann man sie mithilfe der Definitionen OFFSET_PITCH_A und OFFSET_ROLL_A &amp;quot;nullen&amp;quot;. Die Einheit dieser Definitionen ist °.&lt;br /&gt;
 ''HINWEIS: Die internen Berechnungen werden durch diese Offset-Korrektur&lt;br /&gt;
 NICHT beeinflußt. Die Offset-Werte können also nicht dazu benutzt werden,&lt;br /&gt;
 eine Achsenabweichung zwischen Sensor und RP6 zu kompensieren!''&lt;br /&gt;
* '''Magnetometer:'''&lt;br /&gt;
** Zur Kalibrierung des Magnetfeldsensors stellt man den RP6 auf eine waagerechte Fläche. Es dürfen keine Elektrogeräte, Metallteile und stromführende Leitungen in der Nähe sein, die das Magnetfeld verändern können.&lt;br /&gt;
** Zunächst ist es möglich, die sogenannten &amp;quot;hard iron&amp;quot; Effekte auszugleichen. Dies sind feste Magnetfeldabweichungen, die durch das &amp;quot;Gerät&amp;quot; (in unserem Fall also durch den kompletten RP6) verursacht werden, in oder auf dem der Sensor angebracht ist. Mit den Definitionen OFFSET_X_M, OFFSET_Y_M und OFFSET_Z_M können diese Effekte ausgeglichen werden. Diese Kalibrierung wird hier aktuell (noch) nicht beschrieben, so dass man die Werte für diese Definitionen zunächst bei 0 belassen sollte.&lt;br /&gt;
** Die X-Achse und Y-Achse wird kalibriert, indem man den RP6 langsam mehrfach um die eigene (Z-)Achse dreht und die Maximalwerte in MAX_X_M und MAX_Y_M einträgt. Die negativen Maximalwerte trägt man in MIN_X_M und MIN_Y_M ein.&lt;br /&gt;
** Die Z-Achse wird kalibriert, indem man den RP6 auf die rechte oder linke Seite legt, ihn dann langsam mehrfach auf der Stelle (um seine Y-Achse) dreht und den Maximalwert in MAX_Z_M und den negativen Maximalwert in MIN_Z_M einträgt.&lt;br /&gt;
** Mit der Definition DECLINATION_M kann man zur Verbesserung der Genauigkeit der Richtungsangaben den magnetischen Deklinationswert [°] (d.h. die magnetische Missweisung) am aktuellen Standort festlegen. [http://www.ngdc.noaa.gov/geomag-web/#declination Hier] befindet sich ein &amp;quot;Deklinations-Rechner&amp;quot;, mit dem man den Deklinationswert für den eigenen Standort ermitteln kann. &lt;br /&gt;
** Wenn man den Temperaturwert des LSM303DLHC nutzen will, muss man die Definition GET_TEMP_M aktivieren (Standard!). Den Temperaturwert kann man noch eichen, indem man die Definition OFFSET_TEMP_M anpasst. Die Einheit von OFFSET_TEMP_M ist °C.&lt;br /&gt;
* '''Gyroskop:'''&lt;br /&gt;
** In Ruhelage des RP6 wird ein ADC-Wert von ca. 511 angezeigt, wenn die Definition ADCVAL_ZERORATE_LEVEL im Configuration Header (RP6M256_Sensor_Board.h) vor der ersten Kompilierung zunächst auf 0 gesetzt wurde. Die Kalibrierung des Gyroskops ist abgeschlossen, nachdem man den in Ruhelage angezeigten ADC-Wert als ADCVAL_ZERORATE_LEVEL eingetragen hat.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''HINWEISE ZUR KALIBRIERUNG:'''&lt;br /&gt;
* Das Demo-Programm ist nicht sehr gut geeignet, um die Kalibrierungen durchzuführen.&lt;br /&gt;
* Man sollte mit einem eigenen kurzen ''Kalibrierungs-Programm'' nur die Rohwerte der jeweiligen X-, Y- und Z-Achse z.B. zweimal pro Sekunde ausgeben.&lt;br /&gt;
* Die Rohwerte sind in Variablen x_axis..., y_axis..., z_axis... enthalten. Da die Rohwerte in den Funktionen normalizeLSM303DLHC_A() bzw. normalizeLSM303DLHC_M() ggf. verändert werden, müssen die Rohwerte VOR Durchlaufen dieser Funktionen ausgegeben werden.&lt;br /&gt;
* '''Ohne eine sorgfältige Kalibrierung wird die Kompass-Funktion (insbesondere die neigungskompensierte Ausgabe der Himmelsrichtung) nicht funktionieren!'''&lt;br /&gt;
* Nach dem Eintragen der Kalibrierungs-Werte in den Configuration Header (RP6M256_Sensor_Board.h) muss die ''Demo'' neu kompiliert werden. Vorher sollten die Compiler-Hilfsdateien der Sensor Board-Library (Dateiendungen .st und .o) im Programmverzeichnis gelöscht werden.&lt;br /&gt;
* Getestet wird das Ergebnis der Kalibrierung, indem die Ausgabewerte (Temperatur, Pitch, Roll, Heading, Neigungs-kompensiertes Heading) der ''Demo'' überprüft werden. Dazu kann man Vergleichswerte (Thermometer, Winkelmesser für Pitch, Roll und externer Kompass für Heading) heranziehen.&lt;br /&gt;
* Wenn die Ausgabewerte nicht den Erwartungen entsprechen, muss die Kalibrierung wiederholt werden.&lt;br /&gt;
* Eine Kalibrierung der Sensoren ist nur zuverlässig, solange die Position des jeweiligen Sensors und seine komplette Hardware-Umgebung (also der RP6 mit allen seinen Teilen!) nicht verändert wird. Gibt es trotzdem Veränderungen, z.B. durch weitere Aufbauten auf dem RP6, müssen diese Sensoren neu kalibriert werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Datei: RP6M256_Sensor_Board.h&lt;br /&gt;
&amp;lt;pre&amp;gt;/* ****************************************************************************&lt;br /&gt;
 *                           _______________________&lt;br /&gt;
 *                           \| RP6  ROBOT SYSTEM |/&lt;br /&gt;
 *                            \_-_-_-_-_-_-_-_-_-_/           &amp;gt;&amp;gt;&amp;gt; RP6 M256 WIFI&lt;br /&gt;
 * ----------------------------------------------------------------------------&lt;br /&gt;
 * ----------------------------- [c]2014 - Dirk -------------------------------&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * File: RP6M256_Sensor_Board.h&lt;br /&gt;
 * Version: 1.1&lt;br /&gt;
 * Target: RP6 M256 WIFI - ATMEGA2560 @16.00MHz&lt;br /&gt;
 * Author(s): Dirk&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Description:&lt;br /&gt;
 * Configuration header file for new RP6 Sensor Board library.&lt;br /&gt;
 * The RP6 Sensor Board (CONRAD 1082384) is connected to the RP6M256 with the&lt;br /&gt;
 * two plugs:&lt;br /&gt;
 *   Sensor Board &amp;lt;---&amp;gt; RP6M256&lt;br /&gt;
 *   --------------------------------&lt;br /&gt;
 *   I/O (K17)    &amp;lt;---&amp;gt; IO_PWM/T0/T1&lt;br /&gt;
 *   ADC (K18)    &amp;lt;---&amp;gt; ADC_IO2/CMP&lt;br /&gt;
 * The RP6 Sensor Board function &amp;quot;PD5&amp;quot; (IC6: EN) is now connected to RP6M256&lt;br /&gt;
 * OC1B (PB6) and the RP6 Sensor Board function &amp;quot;ADC4&amp;quot; (SHARP_R) to RP6M256&lt;br /&gt;
 * ADC9 (PK1).&lt;br /&gt;
 * On the RP6 Sensor Board the functions &amp;quot;ADC0&amp;quot;, &amp;quot;ADC1&amp;quot;, &amp;quot;PWR&amp;quot; and &amp;quot;ADC4&amp;quot; are&lt;br /&gt;
 * connected to the USRBUS. The USRBUS may be wired on the RP6 mainboard like&lt;br /&gt;
 * this:&lt;br /&gt;
 *   Function : Sensor Board - USRBUS: * &amp;lt;---&amp;gt; RP6 Mainboard&lt;br /&gt;
 *   --------------------------------------------------------&lt;br /&gt;
 *   SHARP_F  : &amp;quot;ADC0&amp;quot;       - Pin 1     &amp;lt;---&amp;gt; ADC0: Pin 3&lt;br /&gt;
 *   GYRO     : &amp;quot;ADC1&amp;quot;       - Pin 2     &amp;lt;---&amp;gt; ADC1: Pin 3&lt;br /&gt;
 *   PWRON ²  : &amp;quot;PWR&amp;quot;        - Pin 3     &amp;lt;---&amp;gt; PWR&lt;br /&gt;
 *   SHARP_R  : &amp;quot;ADC4&amp;quot;       - Pin 5     &amp;lt;---&amp;gt; Not connected!&lt;br /&gt;
 * At *) It is also possible not to use the USRBUS, but to connect the RP6&lt;br /&gt;
 *       Sensor Board directly to the RP6 mainboard with 3 single cables.&lt;br /&gt;
 * At ²) See RP6 manual &amp;quot;4.6.8. Stromsparfunktionen&amp;quot;! &lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
#ifndef RP6M256_SENSOR_BOARD_H&lt;br /&gt;
#define RP6M256_SENSOR_BOARD_H&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// RP6 Sensor Board hardwired components:&lt;br /&gt;
// - I2C I/O Port Expander (MAX7311)&lt;br /&gt;
// - I2C Real Time Clock (RTC DS1339)&lt;br /&gt;
// - I2C Temperature Sensor (LM75B)&lt;br /&gt;
// - I2C Servo Controller (PCA9685)&lt;br /&gt;
// - I2C LED Driver (TCA6507)&lt;br /&gt;
// - I2C 3D Magnetometer &amp;amp; Accelerometer (LSM303DLHC)&lt;br /&gt;
// - Analog Yaw-Rate Gyroscope (LY330ALH)&lt;br /&gt;
// - Hot Swappable 2-Wire Bus Buffer (TCA4311A)&lt;br /&gt;
// - Button&lt;br /&gt;
// - Status LED&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C I/O Port Expander (MAX7311):&lt;br /&gt;
#define I2C_SENSOR_PORTEXP_ADR			0x40	// Default&lt;br /&gt;
&lt;br /&gt;
// Interrupt I/O portpin definitions (RP6M256):&lt;br /&gt;
#define IO_SENSOR_INT1_IN				INT1_PI12 // PCINT12 PJ3  XBUS Pin 8&lt;br /&gt;
#define IO_SENSOR_INT1_DDR				DDRJ&lt;br /&gt;
#define IO_SENSOR_INT1_PIN				PINJ&lt;br /&gt;
#define IO_SENSOR_INT1_PORT				PORTJ&lt;br /&gt;
#define IO_SENSOR_INT2_IN				INT2_PI15 // PCINT15 PJ6  XBUS Pin 11&lt;br /&gt;
#define IO_SENSOR_INT2_DDR				DDRJ&lt;br /&gt;
#define IO_SENSOR_INT2_PIN				PINJ&lt;br /&gt;
#define IO_SENSOR_INT2_PORT				PORTJ&lt;br /&gt;
#define IO_SENSOR_INT3_IN				INT3_PI14 // PCINT14 PJ5  XBUS Pin 9&lt;br /&gt;
#define IO_SENSOR_INT3_DDR				DDRJ&lt;br /&gt;
#define IO_SENSOR_INT3_PIN				PINJ&lt;br /&gt;
#define IO_SENSOR_INT3_PORT				PORTJ&lt;br /&gt;
#define IO_SENSOR_INTU_IN				INTU_PI13 // PCINT13 PJ4  XBUS Pin 7&lt;br /&gt;
#define IO_SENSOR_INTU_DDR				DDRJ&lt;br /&gt;
#define IO_SENSOR_INTU_PIN				PINJ&lt;br /&gt;
#define IO_SENSOR_INTU_PORT				PORTJ&lt;br /&gt;
&lt;br /&gt;
// I/O PORT pin numbers:&lt;br /&gt;
#define PIN7							7&lt;br /&gt;
#define PIN6							6&lt;br /&gt;
#define PIN5							5&lt;br /&gt;
#define PIN4							4&lt;br /&gt;
#define PIN3							3&lt;br /&gt;
#define PIN2							2&lt;br /&gt;
#define PIN1							1&lt;br /&gt;
#define PIN0							0&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Real Time Clock (RTC DS1339):&lt;br /&gt;
#define I2C_SENSOR_RTC_ADR				0xd0	// Default&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Temperature Sensor (LM75B):&lt;br /&gt;
#define I2C_SENSOR_TEMP_ADR				0x90	// Default&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Servo Controller (PCA9685):&lt;br /&gt;
#define I2C_SENSOR_SERVO_ADR			0x88	// Default&lt;br /&gt;
&lt;br /&gt;
// Servo and PWM channels:&lt;br /&gt;
#define CH_SERVO_1						16		// At K6: 1  &amp;quot;SERVO_1&amp;quot;&lt;br /&gt;
#define CH_SERVO_2						15		// At K11: 1 &amp;quot;SERVO_2&amp;quot;&lt;br /&gt;
#define CH_SERVO_3						13		// At K29: 1 &amp;quot;SERVO_3&amp;quot;&lt;br /&gt;
#define CH_SERVO_4						14		// At K30: 1 &amp;quot;SERVO_4&amp;quot;&lt;br /&gt;
#define CH_SERVO_5						11		// At K31: 1 &amp;quot;SERVO_5&amp;quot;&lt;br /&gt;
#define CH_SERVO_6						12		// At K32: 1 &amp;quot;SERVO_6&amp;quot;&lt;br /&gt;
#define CH_SERVO_7						9		// At K33: 1 &amp;quot;SERVO_7&amp;quot;&lt;br /&gt;
#define CH_SERVO_8						10		// At K34: 1 &amp;quot;SERVO_8&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#define CH_PWM_OUT_1					1		// At K12: 1 &amp;quot;PWM_OUT&amp;quot;&lt;br /&gt;
#define CH_PWM_OUT_2					2		// At K12: 2&lt;br /&gt;
#define CH_PWM_OUT_3					3		// At K12: 3&lt;br /&gt;
#define CH_PWM_OUT_4					4		// At K12: 4&lt;br /&gt;
#define CH_PWM_OUT_5					5		// At K12: 5&lt;br /&gt;
#define CH_PWM_OUT_6					6		// At K12: 6&lt;br /&gt;
#define CH_PWM_OUT_7					7		// At K12: 7&lt;br /&gt;
#define CH_PWM_OUT_8					8		// At K12: 8&lt;br /&gt;
&lt;br /&gt;
// Servo left touch (LT), right touch (RT), middle position (MP) constants:&lt;br /&gt;
// (Hints: - Servo impulse length [ms] = Servo position value / 204.8&lt;br /&gt;
//           (Formula only valid for a PWM of 50 Hz!)&lt;br /&gt;
//         - Min. servo impulse (0,7 ms) = Servo position 143&lt;br /&gt;
//         - Mid. servo impulse (1,5 ms) = Servo position 307&lt;br /&gt;
//         - Max. servo impulse (2,3 ms) = Servo position 471&lt;br /&gt;
//         - !!! You should NOT use servo position values &amp;lt; 143 or &amp;gt; 471 !!!)&lt;br /&gt;
#define SERVO1_LT						205		// Servo impulse ~1ms&lt;br /&gt;
#define SERVO1_RT						410		// Servo impulse ~2ms&lt;br /&gt;
#define SERVO1_MP						((SERVO1_RT - SERVO1_LT) / 2 + SERVO1_LT)&lt;br /&gt;
#define SERVO2_LT						205&lt;br /&gt;
#define SERVO2_RT						410&lt;br /&gt;
#define SERVO2_MP						((SERVO2_RT - SERVO2_LT) / 2 + SERVO2_LT)&lt;br /&gt;
#define SERVO3_LT						205&lt;br /&gt;
#define SERVO3_RT						410&lt;br /&gt;
#define SERVO3_MP						((SERVO3_RT - SERVO3_LT) / 2 + SERVO3_LT)&lt;br /&gt;
#define SERVO4_LT						205&lt;br /&gt;
#define SERVO4_RT						410&lt;br /&gt;
#define SERVO4_MP						((SERVO4_RT - SERVO4_LT) / 2 + SERVO4_LT)&lt;br /&gt;
#define SERVO5_LT						205&lt;br /&gt;
#define SERVO5_RT						410&lt;br /&gt;
#define SERVO5_MP						((SERVO5_RT - SERVO5_LT) / 2 + SERVO5_LT)&lt;br /&gt;
#define SERVO6_LT						205&lt;br /&gt;
#define SERVO6_RT						410&lt;br /&gt;
#define SERVO6_MP						((SERVO6_RT - SERVO6_LT) / 2 + SERVO6_LT)&lt;br /&gt;
#define SERVO7_LT						205&lt;br /&gt;
#define SERVO7_RT						410&lt;br /&gt;
#define SERVO7_MP						((SERVO7_RT - SERVO7_LT) / 2 + SERVO7_LT)&lt;br /&gt;
#define SERVO8_LT						205&lt;br /&gt;
#define SERVO8_RT						410&lt;br /&gt;
#define SERVO8_MP						((SERVO8_RT - SERVO8_LT) / 2 + SERVO8_LT)&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C LED Driver (TCA6507):&lt;br /&gt;
#define I2C_SENSOR_LEDDRIVER_ADR		0x8a	// Default&lt;br /&gt;
&lt;br /&gt;
// LED numbers:&lt;br /&gt;
#define SB_LED0							0		// At K7&lt;br /&gt;
#define DISPLAY_BACKLIGHT				0		// Display background light&lt;br /&gt;
#define SB_LED1							1		// At K4&lt;br /&gt;
#define SB_LED2							2		// At K2&lt;br /&gt;
#define SB_LED3							3		// At K10: 1&lt;br /&gt;
#define BACKLIGHT_R						3		// Right backlight&lt;br /&gt;
#define SB_LED4							4		// At K10: 2&lt;br /&gt;
#define BACKLIGHT_L						4		// Left backlight&lt;br /&gt;
#define SB_LED5							5		// White LED (D3)&lt;br /&gt;
#define HEADLIGHT_R						5		// Right headlight&lt;br /&gt;
#define SB_LED6							6		// White LED (D1)&lt;br /&gt;
#define HEADLIGHT_L						6		// Left headlight&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C 3D Magnetometer &amp;amp; Accelerometer (LSM303DLHC):&lt;br /&gt;
&lt;br /&gt;
// LSM303DLHC accelerometer:&lt;br /&gt;
#define I2C_SENSOR_LSM303DLHC_A_ADR 	0x32	// Default&lt;br /&gt;
&lt;br /&gt;
// LSM303DLHC accelerometer calibration data:&lt;br /&gt;
#define MAX_X_A						1037		// Max. X-axis value&lt;br /&gt;
#define MIN_X_A						-1030		// Min. X-axis value&lt;br /&gt;
#define MAX_Y_A						1030		// Max. Y-axis value&lt;br /&gt;
#define MIN_Y_A						-1019		// Min. Y-axis value&lt;br /&gt;
#define MAX_Z_A						1062		// Max. Z-axis value&lt;br /&gt;
#define MIN_Z_A						-1056		// Min. Z-axis value&lt;br /&gt;
#define OFFSET_PITCH_A				0.0			// Offset Pitch [°]&lt;br /&gt;
#define OFFSET_ROLL_A				0.0			// Offset Roll [°]&lt;br /&gt;
&lt;br /&gt;
// LSM303DLHC magnetometer:&lt;br /&gt;
#define I2C_SENSOR_LSM303DLHC_M_ADR		0x3c	// Default&lt;br /&gt;
&lt;br /&gt;
// LSM303DLHC magnetometer calibration data:&lt;br /&gt;
#define MAX_X_M						-111.0		// Max. X-axis value&lt;br /&gt;
#define MIN_X_M						-634.0		// Min. X-axis value&lt;br /&gt;
#define OFFSET_X_M					0			// Hard iron X-axis offset&lt;br /&gt;
#define MAX_Y_M						297.0		// Max. Y-axis value&lt;br /&gt;
#define MIN_Y_M						-215.0		// Min. Y-axis value&lt;br /&gt;
#define OFFSET_Y_M					0			// Hard iron Y-axis offset&lt;br /&gt;
#define MAX_Z_M						183.0		// Max. Z-axis value&lt;br /&gt;
#define MIN_Z_M						-214.0		// Min. Z-axis value&lt;br /&gt;
#define OFFSET_Z_M					0			// Hard iron Z-axis offset&lt;br /&gt;
#define DECLINATION_M				0.0			// E at local position [°]&lt;br /&gt;
&lt;br /&gt;
// LSM303DLHC temperature sensor definitions:&lt;br /&gt;
#define GET_TEMP_M								// Enable temperature sensor&lt;br /&gt;
#define OFFSET_TEMP_M				0.0			// Temperature offset [°C]&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Analog Yaw-Rate Gyroscope (LY330ALH):&lt;br /&gt;
&lt;br /&gt;
// LY330ALH gyroscope:&lt;br /&gt;
#define ADC_SENSOR_LY330ALH				ADC_1	// At USRBUS: 2 (RP6BASE)&lt;br /&gt;
&lt;br /&gt;
// LY330ALH gyroscope calibration data:&lt;br /&gt;
// (Higher values [505..1023] mean an angular velocity while rotating LEFT&lt;br /&gt;
//  and lower values [503..0] while rotating RIGHT!)&lt;br /&gt;
#define ADCVAL_MINRATE					0		// Min. rate value&lt;br /&gt;
#define ADCVAL_ZERORATE_LEVEL			504		// Zero rate level&lt;br /&gt;
#define ADCVAL_MAXRATE					1023	// Max. rate value&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Hot Swappable 2-Wire Bus Buffer (TCA4311A):&lt;br /&gt;
&lt;br /&gt;
// Define USE_PD5, if you want to control the TCA4311A enable pin (EN) with&lt;br /&gt;
// the RP6 Sensor Board function &amp;quot;PD5&amp;quot;. If USE_PD5 is NOT defined (default),&lt;br /&gt;
// the TCA4311A EN pin is controlled by the MAX7311 I/O 1.0 pin.&lt;br /&gt;
// ---------------&lt;br /&gt;
//#define USE_PD5&lt;br /&gt;
// ---------------&lt;br /&gt;
&lt;br /&gt;
#define IO_SENSOR_TCA4311A_EN_IN		OC1B_PI6 // At I/O: 9 (RP6M256)&lt;br /&gt;
#define IO_SENSOR_TCA4311A_EN_DDR		DDRB&lt;br /&gt;
#define IO_SENSOR_TCA4311A_EN_PIN		PINB&lt;br /&gt;
#define IO_SENSOR_TCA4311A_EN_PORT		PORTB&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Button:&lt;br /&gt;
&lt;br /&gt;
// (Button is connected to I/O 1.7 of the MAX7311!)&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Status LED:&lt;br /&gt;
&lt;br /&gt;
// (Status LED is connected to I/O 1.6 of the MAX7311!)&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Other ADC channel definitions:&lt;br /&gt;
&lt;br /&gt;
// (Depending on connections on the RP6 Sensor Board!)&lt;br /&gt;
#define ADC_SENSOR_SHARP_F				ADC_0	// At USRBUS: 1 (RP6BASE)&lt;br /&gt;
#define ADC_SENSOR_SHARP_R				ADC_9	// At ADC: 3    (RP6M256)&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
/******************************************************************************&lt;br /&gt;
 * Additional info&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Changelog:&lt;br /&gt;
 * &lt;br /&gt;
 *  ---&amp;gt; changes are documented in the file &amp;quot;RP6M256_Sensor_BoardLib.c&amp;quot;&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=====Library Header=====&lt;br /&gt;
Datei: RP6M256_Sensor_BoardLib.h&lt;br /&gt;
&amp;lt;pre&amp;gt;/* ****************************************************************************&lt;br /&gt;
 *                           _______________________&lt;br /&gt;
 *                           \| RP6  ROBOT SYSTEM |/&lt;br /&gt;
 *                            \_-_-_-_-_-_-_-_-_-_/           &amp;gt;&amp;gt;&amp;gt; RP6 M256 WIFI&lt;br /&gt;
 * ----------------------------------------------------------------------------&lt;br /&gt;
 * ----------------------------- [c]2014 - Dirk -------------------------------&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * File: RP6M256_Sensor_BoardLib.h&lt;br /&gt;
 * Version: 1.1&lt;br /&gt;
 * Target: RP6 M256 WIFI - ATMEGA2560 @16.00MHz&lt;br /&gt;
 * Author(s): Dirk&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Description:&lt;br /&gt;
 * Header file for new RP6 Sensor Board library.&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
#ifndef RP6M256_SENSOR_BOARDLIB_H&lt;br /&gt;
#define RP6M256_SENSOR_BOARDLIB_H&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// RP6 Sensor Board hardwired components:&lt;br /&gt;
// - I2C I/O Port Expander (MAX7311)&lt;br /&gt;
// - I2C Real Time Clock (RTC DS1339)&lt;br /&gt;
// - I2C Temperature Sensor (LM75B)&lt;br /&gt;
// - I2C Servo Controller (PCA9685)&lt;br /&gt;
// - I2C LED Driver (TCA6507)&lt;br /&gt;
// - I2C 3D Magnetometer &amp;amp; Accelerometer (LSM303DLHC)&lt;br /&gt;
// - Analog Yaw-Rate Gyroscope (LY330ALH)&lt;br /&gt;
// - Hot Swappable 2-Wire Bus Buffer (TCA4311A)&lt;br /&gt;
// - Button&lt;br /&gt;
// - Status LED&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Includes:&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6M256Lib.h&amp;quot;&lt;br /&gt;
#include &amp;quot;RP6I2CmasterTWI.h&amp;quot;&lt;br /&gt;
#include &amp;quot;RP6M256_Sensor_Board.h&amp;quot;&lt;br /&gt;
#include &amp;lt;math.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// RP6M256_I2CMasterLib definitions:&lt;br /&gt;
&lt;br /&gt;
#ifndef I2C_RP6_BASE_ADR&lt;br /&gt;
	#define I2C_RP6_BASE_ADR			10&lt;br /&gt;
#endif&lt;br /&gt;
#ifndef I2C_REG_ADC_ADC0_L&lt;br /&gt;
	#define I2C_REG_ADC_ADC0_L			23&lt;br /&gt;
#endif&lt;br /&gt;
#ifndef I2C_REG_ADC_ADC1_L&lt;br /&gt;
	#define I2C_REG_ADC_ADC1_L			25&lt;br /&gt;
#endif&lt;br /&gt;
#ifndef CMD_POWER_OFF&lt;br /&gt;
	#define CMD_POWER_OFF				0&lt;br /&gt;
#endif&lt;br /&gt;
#ifndef CMD_POWER_ON&lt;br /&gt;
	#define CMD_POWER_ON				1&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C I/O Port Expander (MAX7311):&lt;br /&gt;
&lt;br /&gt;
// Registers:&lt;br /&gt;
#define MAX7311_INPUT_PORT1				0&lt;br /&gt;
#define MAX7311_INPUT_PORT2				1&lt;br /&gt;
#define MAX7311_OUTPUT_PORT1			2&lt;br /&gt;
#define MAX7311_OUTPUT_PORT2			3&lt;br /&gt;
#define MAX7311_PORT1_POL_INV			4&lt;br /&gt;
#define MAX7311_PORT2_POL_INV			5&lt;br /&gt;
#define MAX7311_PORT1_CONFIG			6&lt;br /&gt;
#define MAX7311_PORT2_CONFIG			7&lt;br /&gt;
#define MAX7311_TIMEOUT					8&lt;br /&gt;
&lt;br /&gt;
// Port 1 configuration register bitmasks:&lt;br /&gt;
#define ST_GYRO							(1 &amp;lt;&amp;lt; PIN7)	// I/O 0.7 (Output)&lt;br /&gt;
#define PD_GYRO							(1 &amp;lt;&amp;lt; PIN6)	// I/O 0.6 (Output)&lt;br /&gt;
#define PWR_CAM_IF						(1 &amp;lt;&amp;lt; PIN5)	// I/O 0.5 (Output)&lt;br /&gt;
#define EN_LEDDRIV						(1 &amp;lt;&amp;lt; PIN4)	// I/O 0.4 (Output)&lt;br /&gt;
#define RDY_BUSBUFF						(1 &amp;lt;&amp;lt; PIN3)	// I/O 0.3 (Input)&lt;br /&gt;
#define PWR_SHARP_R						(1 &amp;lt;&amp;lt; PIN2)	// I/O 0.2 (Output)&lt;br /&gt;
#define PWR_SHARP_F						(1 &amp;lt;&amp;lt; PIN1)	// I/O 0.1 (Output)&lt;br /&gt;
#define PWR_I2C							(1 &amp;lt;&amp;lt; PIN0)	// I/O 0.0 (Output)&lt;br /&gt;
&lt;br /&gt;
// Port 2 configuration register bitmasks:&lt;br /&gt;
#define IO2_I2C							(1 &amp;lt;&amp;lt; PIN7)	// I/O 1.7 (Input)&lt;br /&gt;
#define IO1_I2C							(1 &amp;lt;&amp;lt; PIN6)	// I/O 1.6 (Output)&lt;br /&gt;
#define DRDY_MAGACC						(1 &amp;lt;&amp;lt; PIN5)	// I/O 1.5 (Input)&lt;br /&gt;
#define PWR_SERVO						(1 &amp;lt;&amp;lt; PIN4)	// I/O 1.4 (Output)&lt;br /&gt;
#define OEN_SERVO						(1 &amp;lt;&amp;lt; PIN3)	// I/O 1.3 (Output)&lt;br /&gt;
#define IO_K19_1						(1 &amp;lt;&amp;lt; PIN2)	// I/O 1.2 (Input)&lt;br /&gt;
#define IO_K19_3						(1 &amp;lt;&amp;lt; PIN1)	// I/O 1.1 (Input)&lt;br /&gt;
#define EN_BUSBUFF						(1 &amp;lt;&amp;lt; PIN0)	// I/O 1.0 (Output)&lt;br /&gt;
&lt;br /&gt;
// Port 1 &amp;amp; 2 register 16-bit bitmasks:&lt;br /&gt;
// (CONFIG: 1 = Input, 0 = Output)&lt;br /&gt;
#define MAX7311_CONFIG_DEFAULT			0b1010011000001000&lt;br /&gt;
#define MAX7311_CONFIG_USE_PD5			0b1010011100001000&lt;br /&gt;
// (OUTPUT: 1 = High/True, 0 = Low/False)&lt;br /&gt;
#define MAX7311_OUTPUT_DEFAULT			0b0100000100010000&lt;br /&gt;
#define MAX7311_OUTPUT_FULLPOWER		0b0001000100110111&lt;br /&gt;
#define MAX7311_OUTPUT_SHUTDOWN			0b0100100011000000&lt;br /&gt;
&lt;br /&gt;
// Safe configuration:&lt;br /&gt;
// (Ensures if activated, that I/Os 0.3, 1.5 and 1.7 cannot be configured&lt;br /&gt;
//  as output with the function MAX7311_write_cfg(). This may protect the&lt;br /&gt;
//  RP6 Sensor Board from hardware damage.)&lt;br /&gt;
// -------------------&lt;br /&gt;
#define SAFE_CONFIG&lt;br /&gt;
// -------------------&lt;br /&gt;
&lt;br /&gt;
typedef union {&lt;br /&gt;
 	uint8_t byte;&lt;br /&gt;
	struct {&lt;br /&gt;
		unsigned int1   :1;				// INT1  XBUS Pin 8&lt;br /&gt;
		unsigned int2   :1;				// INT2  XBUS Pin 11&lt;br /&gt;
		unsigned int3   :1;				// INT3  XBUS Pin 9&lt;br /&gt;
		unsigned intu   :1;				// INTU  XBUS Pin 7&lt;br /&gt;
		unsigned unused :4;&lt;br /&gt;
	};&lt;br /&gt;
	struct {&lt;br /&gt;
		unsigned magacc1     :1;		// INT1: LSM303DLHC INT1&lt;br /&gt;
		unsigned portexp     :1;		// INT2: MAX7311 INT_N&lt;br /&gt;
		unsigned magacc2_rtc :1;		// INT3: LSM303DLHC INT2&lt;br /&gt;
		unsigned noname      :5;		//       OR DS1339 SQW/INT_N&lt;br /&gt;
	};&lt;br /&gt;
} interrupt_RP6SBstatus_t;&lt;br /&gt;
extern interrupt_RP6SBstatus_t interrupt_RP6SBstatus;&lt;br /&gt;
&lt;br /&gt;
typedef union {&lt;br /&gt;
	uint16_t word;&lt;br /&gt;
	struct {&lt;br /&gt;
		unsigned pwr_i2c     :1;		// I/O 0.0 (Output)&lt;br /&gt;
		unsigned pwr_sharp_f :1;		// I/O 0.1 (Output)&lt;br /&gt;
		unsigned pwr_sharp_r :1;		// I/O 0.2 (Output)&lt;br /&gt;
		unsigned rdy_busbuff :1;		// I/O 0.3 (Input)&lt;br /&gt;
		unsigned en_leddriv  :1;		// I/O 0.4 (Output)&lt;br /&gt;
		unsigned pwr_cam_if  :1;		// I/O 0.5 (Output)&lt;br /&gt;
		unsigned pd_gyro     :1;		// I/O 0.6 (Output)&lt;br /&gt;
		unsigned st_gyro     :1;		// I/O 0.7 (Output)&lt;br /&gt;
		unsigned en_busbuff  :1;		// I/O 1.0 (Output)&lt;br /&gt;
		unsigned io_k19_3    :1;		// I/O 1.1 (Input)&lt;br /&gt;
		unsigned io_k19_1    :1;		// I/O 1.2 (Input)&lt;br /&gt;
		unsigned oen_servo   :1;		// I/O 1.3 (Output)&lt;br /&gt;
		unsigned pwr_servo   :1;		// I/O 1.4 (Output)&lt;br /&gt;
		unsigned drdy_magacc :1;		// I/O 1.5 (Input)&lt;br /&gt;
		unsigned io1_i2c     :1;		// I/O 1.6 (Output)&lt;br /&gt;
		unsigned io2_i2c     :1;		// I/O 1.7 (Input)&lt;br /&gt;
	};&lt;br /&gt;
} max7311IOs_t;&lt;br /&gt;
extern max7311IOs_t inport;&lt;br /&gt;
extern max7311IOs_t outport;&lt;br /&gt;
extern uint8_t readyBusbuff;&lt;br /&gt;
extern uint8_t pressedButton;&lt;br /&gt;
&lt;br /&gt;
void MAX7311_write_cfg(uint16_t);&lt;br /&gt;
void task_checkINTs(void);&lt;br /&gt;
void task_RP6SensorBoard(void);&lt;br /&gt;
void MAX7311_update(void);&lt;br /&gt;
void MAX7311_write(uint16_t);&lt;br /&gt;
void MAX7311_init(void);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Real Time Clock (RTC DS1339):&lt;br /&gt;
&lt;br /&gt;
// Registers:&lt;br /&gt;
#define DS1339_SECONDS					0&lt;br /&gt;
#define DS1339_MINUTES					1&lt;br /&gt;
#define DS1339_HOURS					2&lt;br /&gt;
#define DS1339_DAY						3&lt;br /&gt;
#define DS1339_DATE						4&lt;br /&gt;
#define DS1339_MONTH_CENTURY			5&lt;br /&gt;
#define DS1339_YEAR						6&lt;br /&gt;
#define DS1339_ALARM1_SECONDS			7&lt;br /&gt;
#define DS1339_ALARM1_MINUTES			8&lt;br /&gt;
#define DS1339_ALARM1_HOURS				9&lt;br /&gt;
#define DS1339_ALARM1_DAY_DATE			10&lt;br /&gt;
#define DS1339_ALARM2_MINUTES			11&lt;br /&gt;
#define DS1339_ALARM2_HOURS				12&lt;br /&gt;
#define DS1339_ALARM2_DAY_DATE			13&lt;br /&gt;
#define DS1339_CONTROL					14&lt;br /&gt;
#define DS1339_STATUS					15&lt;br /&gt;
#define DS1339_TRICKLE_CHARGER			16&lt;br /&gt;
&lt;br /&gt;
// Control register bitmasks:&lt;br /&gt;
#define DS1339_CONTROL_DEFAULT			0		// Power on default&lt;br /&gt;
#define DS1339_CONTROL_A1IE				1&lt;br /&gt;
#define DS1339_CONTROL_A2IE				2&lt;br /&gt;
#define DS1339_CONTROL_INTCN			4&lt;br /&gt;
#define DS1339_CONTROL_RS1				8&lt;br /&gt;
#define DS1339_CONTROL_RS2				16&lt;br /&gt;
#define DS1339_CONTROL_BBSQI			32&lt;br /&gt;
#define DS1339_CONTROL_EOSC				128&lt;br /&gt;
&lt;br /&gt;
// Trickle Charger register bitmasks:&lt;br /&gt;
#define DS1339_TRICKLE_CHARGER_DEFAULT	0b10101010 // One diode, 2k resistor&lt;br /&gt;
#define DS1339_TRICKLE_CHARGER_ROUT0	1&lt;br /&gt;
#define DS1339_TRICKLE_CHARGER_ROUT1	2&lt;br /&gt;
#define DS1339_TRICKLE_CHARGER_DS0		4&lt;br /&gt;
#define DS1339_TRICKLE_CHARGER_DS1		8&lt;br /&gt;
#define DS1339_TRICKLE_CHARGER_TCS0		16&lt;br /&gt;
#define DS1339_TRICKLE_CHARGER_TCS1		32&lt;br /&gt;
#define DS1339_TRICKLE_CHARGER_TCS2		64&lt;br /&gt;
#define DS1339_TRICKLE_CHARGER_TCS3		128&lt;br /&gt;
&lt;br /&gt;
enum RTCWEEKDAYS {&lt;br /&gt;
	R_MO = 1, R_TU, R_WE, R_TH, R_FR, R_SA, R_SU&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
typedef struct {&lt;br /&gt;
	uint16_t         year;				// Year&lt;br /&gt;
	uint8_t          month;				// Month   [1..12]&lt;br /&gt;
	enum RTCWEEKDAYS weekday;			// Weekday [1..7 = R_MO..R_SU]&lt;br /&gt;
	uint8_t          day;				// Day     [1..31]&lt;br /&gt;
} rtcdate_t;&lt;br /&gt;
rtcdate_t rtc_date;&lt;br /&gt;
&lt;br /&gt;
typedef struct {&lt;br /&gt;
	uint8_t dst;						// Daylight-saving-time (time zone)&lt;br /&gt;
	uint8_t hour;						// Hour    [0..23]&lt;br /&gt;
	uint8_t minute;						// Minute  [0..59]&lt;br /&gt;
	uint8_t second;						// Second  [0..59]&lt;br /&gt;
} rtctime_t;&lt;br /&gt;
rtctime_t rtc_time;&lt;br /&gt;
&lt;br /&gt;
uint8_t BCD2DEC(uint8_t);&lt;br /&gt;
uint8_t DEC2BCD(uint8_t);&lt;br /&gt;
void DS1339_write_cfg(uint8_t);&lt;br /&gt;
void DS1339_init(void);&lt;br /&gt;
#define CALC_DST						// Time zone will be calculated&lt;br /&gt;
void DS1339_read(void);&lt;br /&gt;
void DS1339_write(void);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Temperature Sensor (LM75B):&lt;br /&gt;
&lt;br /&gt;
// Registers:&lt;br /&gt;
#define LM75B_TEMP						0&lt;br /&gt;
#define LM75B_CONF						1&lt;br /&gt;
#define LM75B_THYST						2&lt;br /&gt;
#define LM75B_TOS						3&lt;br /&gt;
&lt;br /&gt;
// Conf register bitmasks:&lt;br /&gt;
#define LM75B_CONF_DEFAULT				0		// Power on default&lt;br /&gt;
#define LM75B_CONF_SHUTDOWN				1&lt;br /&gt;
#define LM75B_CONF_OS_COMP_INT			2&lt;br /&gt;
#define LM75B_CONF_OS_POL				4&lt;br /&gt;
#define LM75B_CONF_OS_F_QUE0			8&lt;br /&gt;
#define LM75B_CONF_OS_F_QUE1			16&lt;br /&gt;
&lt;br /&gt;
extern double temperature;&lt;br /&gt;
&lt;br /&gt;
void LM75B_write_cfg(uint8_t);&lt;br /&gt;
#define LM75B_shutdown() {LM75B_write_cfg(LM75B_CONF_SHUTDOWN);}&lt;br /&gt;
#define LM75B_init() {LM75B_write_cfg(LM75B_CONF_DEFAULT);}&lt;br /&gt;
extern uint8_t temperature_low;&lt;br /&gt;
extern uint8_t temperature_high;&lt;br /&gt;
#define getTemperatureHigh() (temperature_high)&lt;br /&gt;
#define getTemperatureLow() (temperature_low)&lt;br /&gt;
void LM75B_read(void);&lt;br /&gt;
double LM75B_calculate(void);&lt;br /&gt;
double LM75B_measure(void);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Servo Controller (PCA9685):&lt;br /&gt;
&lt;br /&gt;
// Registers:&lt;br /&gt;
#define PCA9685_MODE1					0&lt;br /&gt;
#define PCA9685_MODE2					1&lt;br /&gt;
#define PCA9685_SUBADR1					2&lt;br /&gt;
#define PCA9685_SUBADR2					3&lt;br /&gt;
#define PCA9685_SUBADR3					4&lt;br /&gt;
#define PCA9685_ALLCALLADR				5&lt;br /&gt;
#define PCA9685_LED0_ON_L				6&lt;br /&gt;
#define PCA9685_LED0_ON_H				7&lt;br /&gt;
#define PCA9685_LED0_OFF_L				8&lt;br /&gt;
#define PCA9685_LED0_OFF_H				9&lt;br /&gt;
#define PCA9685_LED1_ON_L				10&lt;br /&gt;
#define PCA9685_LED1_ON_H				11&lt;br /&gt;
#define PCA9685_LED1_OFF_L				12&lt;br /&gt;
#define PCA9685_LED1_OFF_H				13&lt;br /&gt;
#define PCA9685_LED2_ON_L				14&lt;br /&gt;
#define PCA9685_LED2_ON_H				15&lt;br /&gt;
#define PCA9685_LED2_OFF_L				16&lt;br /&gt;
#define PCA9685_LED2_OFF_H				17&lt;br /&gt;
#define PCA9685_LED3_ON_L				18&lt;br /&gt;
#define PCA9685_LED3_ON_H				19&lt;br /&gt;
#define PCA9685_LED3_OFF_L				20&lt;br /&gt;
#define PCA9685_LED3_OFF_H				21&lt;br /&gt;
#define PCA9685_LED4_ON_L				22&lt;br /&gt;
#define PCA9685_LED4_ON_H				23&lt;br /&gt;
#define PCA9685_LED4_OFF_L				24&lt;br /&gt;
#define PCA9685_LED4_OFF_H				25&lt;br /&gt;
#define PCA9685_LED5_ON_L				26&lt;br /&gt;
#define PCA9685_LED5_ON_H				27&lt;br /&gt;
#define PCA9685_LED5_OFF_L				28&lt;br /&gt;
#define PCA9685_LED5_OFF_H				29&lt;br /&gt;
#define PCA9685_LED6_ON_L				30&lt;br /&gt;
#define PCA9685_LED6_ON_H				31&lt;br /&gt;
#define PCA9685_LED6_OFF_L				32&lt;br /&gt;
#define PCA9685_LED6_OFF_H				33&lt;br /&gt;
#define PCA9685_LED7_ON_L				34&lt;br /&gt;
#define PCA9685_LED7_ON_H				35&lt;br /&gt;
#define PCA9685_LED7_OFF_L				36&lt;br /&gt;
#define PCA9685_LED7_OFF_H				37&lt;br /&gt;
#define PCA9685_LED8_ON_L				38&lt;br /&gt;
#define PCA9685_LED8_ON_H				39&lt;br /&gt;
#define PCA9685_LED8_OFF_L				40&lt;br /&gt;
#define PCA9685_LED8_OFF_H				41&lt;br /&gt;
#define PCA9685_LED9_ON_L				42&lt;br /&gt;
#define PCA9685_LED9_ON_H				43&lt;br /&gt;
#define PCA9685_LED9_OFF_L				44&lt;br /&gt;
#define PCA9685_LED9_OFF_H				45&lt;br /&gt;
#define PCA9685_LED10_ON_L				46&lt;br /&gt;
#define PCA9685_LED10_ON_H				47&lt;br /&gt;
#define PCA9685_LED10_OFF_L				48&lt;br /&gt;
#define PCA9685_LED10_OFF_H				49&lt;br /&gt;
#define PCA9685_LED11_ON_L				50&lt;br /&gt;
#define PCA9685_LED11_ON_H				51&lt;br /&gt;
#define PCA9685_LED11_OFF_L				52&lt;br /&gt;
#define PCA9685_LED11_OFF_H				53&lt;br /&gt;
#define PCA9685_LED12_ON_L				54&lt;br /&gt;
#define PCA9685_LED12_ON_H				55&lt;br /&gt;
#define PCA9685_LED12_OFF_L				56&lt;br /&gt;
#define PCA9685_LED12_OFF_H				57&lt;br /&gt;
#define PCA9685_LED13_ON_L				58&lt;br /&gt;
#define PCA9685_LED13_ON_H				59&lt;br /&gt;
#define PCA9685_LED13_OFF_L				60&lt;br /&gt;
#define PCA9685_LED13_OFF_H				61&lt;br /&gt;
#define PCA9685_LED14_ON_L				62&lt;br /&gt;
#define PCA9685_LED14_ON_H				63&lt;br /&gt;
#define PCA9685_LED14_OFF_L				64&lt;br /&gt;
#define PCA9685_LED14_OFF_H				65&lt;br /&gt;
#define PCA9685_LED15_ON_L				66&lt;br /&gt;
#define PCA9685_LED15_ON_H				67&lt;br /&gt;
#define PCA9685_LED15_OFF_L				68&lt;br /&gt;
#define PCA9685_LED15_OFF_H				69&lt;br /&gt;
#define PCA9685_ALL_LED_ON_L			250&lt;br /&gt;
#define PCA9685_ALL_LED_ON_H			251&lt;br /&gt;
#define PCA9685_ALL_LED_OFF_L			252&lt;br /&gt;
#define PCA9685_ALL_LED_OFF_H			253&lt;br /&gt;
#define PCA9685_PRE_SCALE				254&lt;br /&gt;
#define PCA9685_TESTMODE				255&lt;br /&gt;
&lt;br /&gt;
// Mode1 register bitmasks:&lt;br /&gt;
#define PCA9685_MODE1_ALLCALL			1&lt;br /&gt;
#define PCA9685_MODE1_SUB3				2&lt;br /&gt;
#define PCA9685_MODE1_SUB2				4&lt;br /&gt;
#define PCA9685_MODE1_SUB1				8&lt;br /&gt;
#define PCA9685_MODE1_SLEEP				16&lt;br /&gt;
#define PCA9685_MODE1_AI				32&lt;br /&gt;
#define PCA9685_MODE1_EXTCLK			64&lt;br /&gt;
#define PCA9685_MODE1_RESTART			128&lt;br /&gt;
&lt;br /&gt;
// Mode2 register bitmasks:&lt;br /&gt;
#define PCA9685_MODE2_OUTNE01_DEFAULT	0&lt;br /&gt;
#define PCA9685_MODE2_OUTDRV			4&lt;br /&gt;
#define PCA9685_MODE2_OCH				8&lt;br /&gt;
#define PCA9685_MODE2_INVRT				16&lt;br /&gt;
&lt;br /&gt;
#define F_PCA9685						25000000.0	// Int. Clock: 25 MHz&lt;br /&gt;
&lt;br /&gt;
void PCA9685_init(uint16_t);&lt;br /&gt;
#define initServo(__FREQ__) {PCA9685_init(__FREQ__);}&lt;br /&gt;
uint8_t servo(uint8_t);&lt;br /&gt;
void PCA9685_set(uint8_t, uint16_t);&lt;br /&gt;
#define setServo(__SERVO__,__POS__) {PCA9685_set(servo(__SERVO__),__POS__);}&lt;br /&gt;
void PCA9685_shutdown(void);&lt;br /&gt;
void PCA9685_restart(void);&lt;br /&gt;
void setServoPower(uint8_t);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C LED Driver (TCA6507):&lt;br /&gt;
&lt;br /&gt;
// Registers:&lt;br /&gt;
#define TCA6507_SELECT0				0&lt;br /&gt;
#define TCA6507_SELECT1				1&lt;br /&gt;
#define TCA6507_SELECT2				2&lt;br /&gt;
#define TCA6507_FADEON_TIME			3&lt;br /&gt;
#define TCA6507_FULLYON_TIME		4&lt;br /&gt;
#define TCA6507_FADEOFF_TIME		5&lt;br /&gt;
#define TCA6507_1ST_FULLYOFF_TIME	6&lt;br /&gt;
#define TCA6507_2ND_FULLYOFF_TIME	7&lt;br /&gt;
#define TCA6507_MAXIMUM_INTENSITY	8&lt;br /&gt;
#define TCA6507_MASTER_INTENSITY	9&lt;br /&gt;
#define TCA6507_INITIALIZATION		10&lt;br /&gt;
&lt;br /&gt;
// Output states:&lt;br /&gt;
#define STATE_OFF					0&lt;br /&gt;
#define STATE_PWM0					2&lt;br /&gt;
#define STATE_PWM1					3&lt;br /&gt;
#define STATE_ON					4&lt;br /&gt;
#define STATE_MINT					5&lt;br /&gt;
#define STATE_BLINK0				6&lt;br /&gt;
#define STATE_BLINK1				7&lt;br /&gt;
&lt;br /&gt;
extern uint8_t select[3];&lt;br /&gt;
&lt;br /&gt;
void TCA6507_write_cfg(uint8_t, uint8_t);&lt;br /&gt;
void TCA6507_update(void);&lt;br /&gt;
void TCA6507_set(uint8_t, uint8_t);&lt;br /&gt;
#define setLED(__LED__,__STATE__) {TCA6507_set(__LED__,__STATE__);}&lt;br /&gt;
void TCA6507_shutdown(void);&lt;br /&gt;
void TCA6507_restart(void);&lt;br /&gt;
void TCA6507_init(void);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C 3D Magnetometer &amp;amp; Accelerometer (LSM303DLHC):&lt;br /&gt;
&lt;br /&gt;
// LSM303DLHC accelerometer internal registers:&lt;br /&gt;
#define CTRL_REG1_A					0x20&lt;br /&gt;
#define CTRL_REG2_A					0x21&lt;br /&gt;
#define CTRL_REG3_A					0x22&lt;br /&gt;
#define CTRL_REG4_A					0x23&lt;br /&gt;
#define CTRL_REG5_A					0x24&lt;br /&gt;
#define CTRL_REG6_A					0x25&lt;br /&gt;
#define REFERENCE_A					0x26&lt;br /&gt;
#define STATUS_REG_A				0x27&lt;br /&gt;
#define OUT_X_L_A					0x28&lt;br /&gt;
#define OUT_X_H_A					0x29&lt;br /&gt;
#define OUT_Y_L_A					0x2a&lt;br /&gt;
#define OUT_Y_H_A					0x2b&lt;br /&gt;
#define OUT_Z_L_A					0x2c&lt;br /&gt;
#define OUT_Z_H_A					0x2d&lt;br /&gt;
#define FIFO_CTRL_REG_A				0x2e&lt;br /&gt;
#define FIFO_SRC_REG_A				0x2f&lt;br /&gt;
#define INT1_CFG_A					0x30&lt;br /&gt;
#define INT1_SOURCE_A				0x31&lt;br /&gt;
#define INT1_THS_A					0x32&lt;br /&gt;
#define INT1_DURATION_A				0x33&lt;br /&gt;
#define INT2_CFG_A					0x34&lt;br /&gt;
#define INT2_SOURCE_A				0x35&lt;br /&gt;
#define INT2_THS_A					0x36&lt;br /&gt;
#define INT2_DURATION_A				0x37&lt;br /&gt;
#define CLICK_CFG_A					0x38&lt;br /&gt;
#define CLICK_SRC_A					0x39&lt;br /&gt;
#define CLICK_THS_A					0x3a&lt;br /&gt;
#define TIME_LIMIT_A				0x3b&lt;br /&gt;
#define TIME_LATENCY_A				0x3c&lt;br /&gt;
#define TIME_WINDOW_A				0x3d&lt;br /&gt;
&lt;br /&gt;
// LSM303DLHC accelerometer register settings:&lt;br /&gt;
#define CTRL_REG1_A_10HZ			0b00100111	// 10Hz &amp;amp; all axes enable&lt;br /&gt;
#define CTRL_REG1_A_50HZ			0b01000111	// 50Hz &amp;amp; all axes enable&lt;br /&gt;
#define CTRL_REG4_A_DEFAULT			0b00000000	// Default (Normal mode)&lt;br /&gt;
#define CTRL_REG4_A_HR				0b00001000	// HR output mode&lt;br /&gt;
&lt;br /&gt;
// LSM303DLHC magnetometer internal registers:&lt;br /&gt;
#define CRA_REG_M					0x00&lt;br /&gt;
#define CRB_REG_M					0x01&lt;br /&gt;
#define MR_REG_M					0x02&lt;br /&gt;
#define OUT_X_H_M					0x03&lt;br /&gt;
#define OUT_X_L_M					0x04&lt;br /&gt;
#define OUT_Z_H_M					0x05&lt;br /&gt;
#define OUT_Z_L_M					0x06&lt;br /&gt;
#define OUT_Y_H_M					0x07&lt;br /&gt;
#define OUT_Y_L_M					0x08&lt;br /&gt;
#define SR_REG_MG					0x09&lt;br /&gt;
#define IRA_REG_M					0x0a&lt;br /&gt;
#define IRB_REG_M					0x0b&lt;br /&gt;
#define IRC_REG_M					0x0c&lt;br /&gt;
#define TEMP_OUT_H_M				0x31&lt;br /&gt;
#define TEMP_OUT_L_M				0x32&lt;br /&gt;
&lt;br /&gt;
// LSM303DLHC magnetometer register settings:&lt;br /&gt;
#define CRA_REG_M_15HZ				0b00010000	// Default (Data rate 15Hz)&lt;br /&gt;
#define CRA_REG_M_15HZ_T_EN			0b10010000	// 15Hz &amp;amp; temperature enable&lt;br /&gt;
#define CRB_REG_M_13GAUSS			0b00100000	// Gain +-1.3Gauss&lt;br /&gt;
#define MR_REG_M_CCM				0b00000000	// Continuous-conversion mode&lt;br /&gt;
#define MR_REG_M_SCM				0b00000001	// Single-conversion mode&lt;br /&gt;
#define MR_REG_M_SLEEP				0b00000011	// Default (Sleep-mode)&lt;br /&gt;
&lt;br /&gt;
extern int16_t x_axisa, y_axisa, z_axisa;&lt;br /&gt;
extern double pitch, roll;&lt;br /&gt;
extern double xa, ya, za;&lt;br /&gt;
extern double the, phi;&lt;br /&gt;
&lt;br /&gt;
extern int16_t x_axism, y_axism, z_axism;&lt;br /&gt;
extern int16_t headingm;&lt;br /&gt;
extern double xm, ym, zm;&lt;br /&gt;
#ifdef GET_TEMP_M&lt;br /&gt;
extern int16_t temperaturem;&lt;br /&gt;
extern double temperature_mag;&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
extern int16_t headingtc;&lt;br /&gt;
&lt;br /&gt;
void LSM303DLHC_A_init(void);&lt;br /&gt;
void readLSM303DLHC_A(void);&lt;br /&gt;
void normalizeLSM303DLHC_A(void);&lt;br /&gt;
void positionLSM303DLHC_A(void);&lt;br /&gt;
&lt;br /&gt;
void LSM303DLHC_M_init(void);&lt;br /&gt;
void readLSM303DLHC_M(void);&lt;br /&gt;
void normalizeLSM303DLHC_M(void);&lt;br /&gt;
int16_t headingLSM303DLHC_M(void);&lt;br /&gt;
&lt;br /&gt;
int16_t headingLSM303DLHC_TC(void);&lt;br /&gt;
&lt;br /&gt;
void LSM303DLHC_init(void);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Analog Yaw-Rate Gyroscope (LY330ALH):&lt;br /&gt;
&lt;br /&gt;
#define LY330ALH_MODE_NORMAL		0			// Power on default&lt;br /&gt;
#define LY330ALH_MODE_SLEEP			1&lt;br /&gt;
#define LY330ALH_MODE_SELFTEST		2&lt;br /&gt;
#define LY330ALH_MODE_POWERDOWN		3			// Shutdown mode&lt;br /&gt;
&lt;br /&gt;
extern int16_t z_axisg;&lt;br /&gt;
&lt;br /&gt;
void LY330ALH_set_mode(uint8_t);&lt;br /&gt;
uint16_t getRP6Base_ADC1(void);&lt;br /&gt;
int16_t LY330ALH_measure(void);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Hot Swappable 2-Wire Bus Buffer (TCA4311A):&lt;br /&gt;
&lt;br /&gt;
//extern uint8_t readyBusbuff;			// See &amp;quot;I2C I/O Port Expander&amp;quot; section&lt;br /&gt;
extern uint8_t errorBusbuff;&lt;br /&gt;
&lt;br /&gt;
#define getReadyBusbuff() (readyBusbuff)&lt;br /&gt;
uint8_t readReadyBusbuff(void);&lt;br /&gt;
void TCA4311A_shutdown(void);&lt;br /&gt;
void TCA4311A_reconnect(void);&lt;br /&gt;
void setRP6Base_PWR(uint8_t);&lt;br /&gt;
void setI2CModulePower(uint8_t);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Button:&lt;br /&gt;
&lt;br /&gt;
//extern uint8_t pressedButton;			// See &amp;quot;I2C I/O Port Expander&amp;quot; section&lt;br /&gt;
&lt;br /&gt;
#define getPressedButton() (pressedButton)&lt;br /&gt;
uint8_t readButton(void);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Status LED:&lt;br /&gt;
&lt;br /&gt;
void setStatusLED(uint8_t);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// RP6 Sensor Board initialisation and shutdown:&lt;br /&gt;
&lt;br /&gt;
void sensor_board_init(void);&lt;br /&gt;
void sensor_board_shutdown(void);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
/******************************************************************************&lt;br /&gt;
 * Additional info&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Changelog:&lt;br /&gt;
 * &lt;br /&gt;
 *  ---&amp;gt; changes are documented in the file &amp;quot;RP6M256_Sensor_BoardLib.c&amp;quot;&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=====Library Source=====&lt;br /&gt;
Datei: RP6M256_Sensor_BoardLib.c&lt;br /&gt;
&amp;lt;pre&amp;gt;/* ****************************************************************************&lt;br /&gt;
 *                           _______________________&lt;br /&gt;
 *                           \| RP6  ROBOT SYSTEM |/&lt;br /&gt;
 *                            \_-_-_-_-_-_-_-_-_-_/           &amp;gt;&amp;gt;&amp;gt; RP6 M256 WIFI&lt;br /&gt;
 * ----------------------------------------------------------------------------&lt;br /&gt;
 * ----------------------------- [c]2014 - Dirk -------------------------------&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * File: RP6M256_Sensor_BoardLib.c&lt;br /&gt;
 * Version: 1.1&lt;br /&gt;
 * Target: RP6 M256 WIFI - ATMEGA2560 @16.00MHz&lt;br /&gt;
 *         and a RP6 Sensor Board (CONRAD 1082384)&lt;br /&gt;
 * Author(s): Dirk&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Description:&lt;br /&gt;
 * This is our new Library that contains basic routines and functions for&lt;br /&gt;
 * accessing the hardwired components of the RP6 Sensor Board (CONRAD 1082384).&lt;br /&gt;
 * This library assumes the RP6 Sensor Board Revision 2.0 (04.07.13).&lt;br /&gt;
 *&lt;br /&gt;
 * There are more sensors and actors, that may be connected to the RP6 Sensor&lt;br /&gt;
 * Board: Many I2C components including a GPS module (CONRAD 1082385), servo&lt;br /&gt;
 *        motors, SHARP IR distance sensors, LEDs, a camera ...&lt;br /&gt;
 * This library doesn't contain functions for these sensors/actors, because&lt;br /&gt;
 * they are not HARDWIRED to the RP6 Sensor Board and may be connected&lt;br /&gt;
 * OPTIONALLY.&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// RP6 Sensor Board hardwired components:&lt;br /&gt;
// - I2C I/O Port Expander (MAX7311)&lt;br /&gt;
// - I2C Real Time Clock (RTC DS1339)&lt;br /&gt;
// - I2C Temperature Sensor (LM75B)&lt;br /&gt;
// - I2C Servo Controller (PCA9685)&lt;br /&gt;
// - I2C LED Driver (TCA6507)&lt;br /&gt;
// - I2C 3D Magnetometer &amp;amp; Accelerometer (LSM303DLHC)&lt;br /&gt;
// - Analog Yaw-Rate Gyroscope (LY330ALH)&lt;br /&gt;
// - Hot Swappable 2-Wire Bus Buffer (TCA4311A)&lt;br /&gt;
// - Button&lt;br /&gt;
// - Status LED&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Includes:&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6M256_Sensor_BoardLib.h&amp;quot; 		&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Variables:&lt;br /&gt;
&lt;br /&gt;
uint8_t registerBuf[13]; &lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C I/O Port Expander (MAX7311):&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Sends the configuration word to a MAX7311.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: config -&amp;gt; Config word for control&lt;br /&gt;
 *                  registers&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void MAX7311_write_cfg(uint16_t config)&lt;br /&gt;
{&lt;br /&gt;
#ifdef SAFE_CONFIG&lt;br /&gt;
	config |= 0b1010000000001000;&lt;br /&gt;
#endif&lt;br /&gt;
	I2CTWI_transmit3Bytes(I2C_SENSOR_PORTEXP_ADR, MAX7311_PORT1_CONFIG, config, (config&amp;gt;&amp;gt;8));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
interrupt_RP6SBstatus_t interrupt_RP6SBstatus;&lt;br /&gt;
&lt;br /&gt;
/** &lt;br /&gt;
 * This function checks all interrupt pins on&lt;br /&gt;
 * the XBUS (INT1..3, INTU).&lt;br /&gt;
 * This function must be called VERY frequently&lt;br /&gt;
 * out of the main loop.&lt;br /&gt;
 * Bigger delays result in slower reaction to&lt;br /&gt;
 * interrupt requests of the RP6 Sensor Board.&lt;br /&gt;
 * Interrupt function table:&lt;br /&gt;
 *   Int. : Function 1      IRQ  Function 2       IRQ&lt;br /&gt;
 *   -------------------------------------------------&lt;br /&gt;
 *   INT1 : LSM303DLHC INT1  H&lt;br /&gt;
 *   INT2 : MAX7311   INT_N  L&lt;br /&gt;
 *   INT3 : LSM303DLHC INT2  H   DS1339 SQW/INT_N  L&lt;br /&gt;
 *   INTU : not used&lt;br /&gt;
 * You can see in the &amp;quot;IRQ&amp;quot; column, which level&lt;br /&gt;
 * (H/L) means an ACTIVE INTERRUPT signal.&lt;br /&gt;
 * The interrupt pin levels (H=true/L=false) are&lt;br /&gt;
 * read into the global interrupt_RP6SBstatus&lt;br /&gt;
 * variable.&lt;br /&gt;
 *&lt;br /&gt;
 * Hints: - This function checks the interrupt&lt;br /&gt;
 *          signals by polling. This is NOT the&lt;br /&gt;
 *          best way to do this job. You will&lt;br /&gt;
 *          have to write your own task, if you&lt;br /&gt;
 *          want to use the Pin Change Interrupt&lt;br /&gt;
 *          function of the ATmega2560&lt;br /&gt;
 *          microcontroller.&lt;br /&gt;
 *        - You cannot use both interrupt sources&lt;br /&gt;
 *          for INT3! So you should not use INT2&lt;br /&gt;
 *          of the LSM303DLHC together with the&lt;br /&gt;
 *          alarm function of the DS1339 (RTC)!&lt;br /&gt;
 *        - Every interrupt signal of the Sensor&lt;br /&gt;
 *          Board may be cut off from the XBUS&lt;br /&gt;
 *          by opening a jumper (Jx):&lt;br /&gt;
 *          INT1 -&amp;gt; J3 (LSM303DLHC INT1)&lt;br /&gt;
 *          INT2 -&amp;gt; J4 (MAX7311 INT_N)&lt;br /&gt;
 *          INT3 -&amp;gt; J2 (DS1339 SQW/INT_N)&lt;br /&gt;
 *          INT3 -&amp;gt; J5 (LSM303DLHC INT2)&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *&lt;br /&gt;
 *   if (!interrupt_RP6SBstatus.portexp)&lt;br /&gt;
 *        writeString_P(&amp;quot;==&amp;gt; MAX7311 INT_N!!!&amp;quot;);&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void task_checkINTs(void)&lt;br /&gt;
{&lt;br /&gt;
	if(IO_SENSOR_INT1_PIN &amp;amp; IO_SENSOR_INT1_IN)	// XBUS INT1 -&amp;gt; PJ3 (PCINT12)&lt;br /&gt;
		interrupt_RP6SBstatus.int1 = true;&lt;br /&gt;
	else&lt;br /&gt;
		interrupt_RP6SBstatus.int1 = false;&lt;br /&gt;
	if(IO_SENSOR_INT2_PIN &amp;amp; IO_SENSOR_INT2_IN)	// XBUS INT2 -&amp;gt; PJ6 (PCINT15)&lt;br /&gt;
		interrupt_RP6SBstatus.int2 = true;&lt;br /&gt;
	else&lt;br /&gt;
		interrupt_RP6SBstatus.int2 = false;&lt;br /&gt;
	if(IO_SENSOR_INT3_PIN &amp;amp; IO_SENSOR_INT3_IN)	// XBUS INT3 -&amp;gt; PJ5 (PCINT14)&lt;br /&gt;
		interrupt_RP6SBstatus.int3 = true;&lt;br /&gt;
	else&lt;br /&gt;
		interrupt_RP6SBstatus.int3 = false;&lt;br /&gt;
//	if(IO_SENSOR_INTU_PIN &amp;amp; IO_SENSOR_INTU_IN)	// XBUS INTU -&amp;gt; PJ4 (PCINT13)&lt;br /&gt;
//		interrupt_RP6SBstatus.intu = true;&lt;br /&gt;
//	else&lt;br /&gt;
//		interrupt_RP6SBstatus.intu = false;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
max7311IOs_t inport;&lt;br /&gt;
uint8_t readyBusbuff;&lt;br /&gt;
uint8_t pressedButton;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function checks all I/O ports (I/O 0.0..1.7)&lt;br /&gt;
 * of the MAX7311 sequentially!&lt;br /&gt;
 * You must call this function frequently out of&lt;br /&gt;
 * the main loop.&lt;br /&gt;
 * The I/O port values (true/false) are read into&lt;br /&gt;
 * the global inport variable.&lt;br /&gt;
 * The global variables readyBusbuff (2-Wire Bus&lt;br /&gt;
 * Buffer: Enable) and pressedButton (Button S1:&lt;br /&gt;
 * Pressed) contain actual values (true/false)&lt;br /&gt;
 * after execution of this task.&lt;br /&gt;
 *&lt;br /&gt;
 * Examples:&lt;br /&gt;
 *&lt;br /&gt;
 *   if (inport.rdy_busbuff)&lt;br /&gt;
 *        writeString_P(&amp;quot;I/O 0.3: High&amp;quot;);&lt;br /&gt;
 *   else writeString_P(&amp;quot;I/O 0.3: Low&amp;quot;);&lt;br /&gt;
 *   if (!inport.drdy_magacc)&lt;br /&gt;
 *        writeString_P(&amp;quot;I/O 1.5: Low&amp;quot;);&lt;br /&gt;
 *   if (pressedButton)&lt;br /&gt;
 *        writeString_P(&amp;quot;Button pressed!&amp;quot;);&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void task_RP6SensorBoard(void)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmitByte(I2C_SENSOR_PORTEXP_ADR, MAX7311_INPUT_PORT1);&lt;br /&gt;
	I2CTWI_readBytes(I2C_SENSOR_PORTEXP_ADR, registerBuf, 2);&lt;br /&gt;
	inport.word = (registerBuf[1] &amp;lt;&amp;lt; 8) + registerBuf[0];&lt;br /&gt;
	readyBusbuff = inport.rdy_busbuff;&lt;br /&gt;
	pressedButton = inport.io2_i2c;&lt;br /&gt;
	pressedButton = !pressedButton;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
max7311IOs_t outport;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Updates the I/O ports with current value from&lt;br /&gt;
 * the global outport variable!&lt;br /&gt;
 * If one or more port pins were configured as&lt;br /&gt;
 * output before, they will be set (high) or&lt;br /&gt;
 * cleared (low).&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *&lt;br /&gt;
 *   outport.word = 0b0000000000001001;&lt;br /&gt;
 *   MAX7311_update();&lt;br /&gt;
 *   // This clears all I/O ports and sets&lt;br /&gt;
 *   // the ports I/O 0.0 and I/O 0.3!&lt;br /&gt;
 *&lt;br /&gt;
 *   // Other possibility:&lt;br /&gt;
 *   outport.pwr_sharp_f = true;&lt;br /&gt;
 *   MAX7311_update();&lt;br /&gt;
 *   // This sets I/O 0.1 and does not&lt;br /&gt;
 *   // affect any other I/O port!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void MAX7311_update(void)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmit3Bytes(I2C_SENSOR_PORTEXP_ADR, MAX7311_OUTPUT_PORT1, outport.word, (outport.word&amp;gt;&amp;gt;8));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Writes the 16-bit data to a MAX7311.&lt;br /&gt;
 * The data are output with those I/O ports that&lt;br /&gt;
 * were configured as output before.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: data -&amp;gt; Data word&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void MAX7311_write(uint16_t data)&lt;br /&gt;
{&lt;br /&gt;
	outport.word = data;&lt;br /&gt;
	MAX7311_update();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Initializes the I/O Port Expander after power&lt;br /&gt;
 * on.&lt;br /&gt;
 *&lt;br /&gt;
 * Hint: If USE_PD5 is defined in the&lt;br /&gt;
 *       configuration header file, this&lt;br /&gt;
 *       function uses the RP6M256 portpin,&lt;br /&gt;
 *       that is connected to plug I/O: Pin 9&lt;br /&gt;
 *       instead of MAX7311 I/O 1.0!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void MAX7311_init(void)&lt;br /&gt;
{&lt;br /&gt;
#ifdef USE_PD5&lt;br /&gt;
	MAX7311_write_cfg(MAX7311_CONFIG_USE_PD5);&lt;br /&gt;
	IO_SENSOR_TCA4311A_EN_DDR |= IO_SENSOR_TCA4311A_EN_IN;		// Output&lt;br /&gt;
	IO_SENSOR_TCA4311A_EN_PORT |= IO_SENSOR_TCA4311A_EN_IN;		// High&lt;br /&gt;
#else&lt;br /&gt;
	MAX7311_write_cfg(MAX7311_CONFIG_DEFAULT);&lt;br /&gt;
#endif&lt;br /&gt;
	MAX7311_write(MAX7311_OUTPUT_DEFAULT);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Real Time Clock (RTC DS1339):&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function converts a BCD to a DEC value.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
uint8_t BCD2DEC(uint8_t bcd)&lt;br /&gt;
{&lt;br /&gt;
	return ((bcd &amp;gt;&amp;gt; 4) * 10 + (bcd &amp;amp; 0x0f));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function converts a DEC to a BCD value.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
uint8_t DEC2BCD(uint8_t dec)&lt;br /&gt;
{uint8_t units = dec % 10;&lt;br /&gt;
	if (dec /= 10) {&lt;br /&gt;
		return (units + (DEC2BCD(dec) &amp;lt;&amp;lt; 4));&lt;br /&gt;
	}&lt;br /&gt;
	else {&lt;br /&gt;
		return units;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Sends the configuration byte to a DS1339.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: Config byte for control register&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void DS1339_write_cfg(uint8_t config)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_RTC_ADR, DS1339_CONTROL, config);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Initializes the DS1339 Trickle Charger&lt;br /&gt;
 * function to the default for the RP6 Sensor&lt;br /&gt;
 * Board: One diode and 2kOhm resistor.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void DS1339_init(void)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_RTC_ADR, DS1339_TRICKLE_CHARGER, DS1339_TRICKLE_CHARGER_DEFAULT);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Reads all data registers of the Real Time Clock (RTC).&lt;br /&gt;
 * They are stored in the time &amp;amp; date variables defined in&lt;br /&gt;
 * the library header.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void DS1339_read(void)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmitByte(I2C_SENSOR_RTC_ADR, DS1339_SECONDS);&lt;br /&gt;
	I2CTWI_readBytes(I2C_SENSOR_RTC_ADR, registerBuf, 7);&lt;br /&gt;
	rtc_time.second = BCD2DEC(registerBuf[0]);&lt;br /&gt;
	rtc_time.minute = BCD2DEC(registerBuf[1]);&lt;br /&gt;
	rtc_time.hour = BCD2DEC(registerBuf[2] &amp;amp; 0x3f);&lt;br /&gt;
	rtc_date.weekday = (registerBuf[3] &amp;amp; 0x07);&lt;br /&gt;
	rtc_date.day = BCD2DEC(registerBuf[4]);&lt;br /&gt;
	rtc_date.month = BCD2DEC(registerBuf[5] &amp;amp; 0x7f);&lt;br /&gt;
	if(registerBuf[5] &amp;amp; 0x80) rtc_date.year = 100;&lt;br /&gt;
	else rtc_date.year = 0;&lt;br /&gt;
	rtc_date.year += BCD2DEC(registerBuf[6]);&lt;br /&gt;
	rtc_date.year += 2000;&lt;br /&gt;
	rtc_time.dst = 0;&lt;br /&gt;
#ifdef CALC_DST&lt;br /&gt;
	// Calculate MESZ (DST):&lt;br /&gt;
	uint8_t wday = rtc_date.weekday;			// Weekday [1..7 = R_MO..R_SU]&lt;br /&gt;
	if(wday == 7) wday = 0;&lt;br /&gt;
	if(rtc_date.month &amp;lt; 3 || rtc_date.month &amp;gt; 10) {&lt;br /&gt;
		return;&lt;br /&gt;
	}&lt;br /&gt;
	if((rtc_date.day - wday &amp;gt;= 25)&lt;br /&gt;
	 &amp;amp;&amp;amp; (wday || rtc_time.hour &amp;gt;= 2)) {&lt;br /&gt;
		if(rtc_date.month == 10)&lt;br /&gt;
			return;&lt;br /&gt;
	}&lt;br /&gt;
	else {&lt;br /&gt;
		if(rtc_date.month == 3) {&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	rtc_time.dst = 1;&lt;br /&gt;
#endif&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Writes the time &amp;amp; date infos in the variables defined in&lt;br /&gt;
 * the library header to the Real Time Clock (RTC).&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void DS1339_write(void)&lt;br /&gt;
{&lt;br /&gt;
	registerBuf[0] = DS1339_SECONDS;&lt;br /&gt;
	registerBuf[1] = DEC2BCD(rtc_time.second);&lt;br /&gt;
	registerBuf[2] = DEC2BCD(rtc_time.minute);&lt;br /&gt;
	registerBuf[3] = DEC2BCD(rtc_time.hour);&lt;br /&gt;
	registerBuf[4] = rtc_date.weekday;&lt;br /&gt;
	registerBuf[5] = DEC2BCD(rtc_date.day);&lt;br /&gt;
	registerBuf[6] = DEC2BCD(rtc_date.month);&lt;br /&gt;
	registerBuf[7] = DEC2BCD(rtc_date.year - 2000);&lt;br /&gt;
	I2CTWI_transmitBytes(I2C_SENSOR_RTC_ADR, &amp;amp;registerBuf[0], 8);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Temperature Sensor (LM75B):&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Sends the configuration byte to a LM75B.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: Config byte for Conf register&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void LM75B_write_cfg(uint8_t config)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_TEMP_ADR, LM75B_CONF, config);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
uint8_t temperature_low;&lt;br /&gt;
uint8_t temperature_high;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Reads the two data registers of the temperature&lt;br /&gt;
 * sensor's Temp register.&lt;br /&gt;
 * They are stored in the variables temperature_low&lt;br /&gt;
 * and _high.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void LM75B_read(void)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmitByte(I2C_SENSOR_TEMP_ADR, LM75B_TEMP);&lt;br /&gt;
	I2CTWI_readBytes(I2C_SENSOR_TEMP_ADR, registerBuf, 2);&lt;br /&gt;
	temperature_high = registerBuf[0];&lt;br /&gt;
	temperature_low = registerBuf[1];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
double temperature;						// Temperature [°C]&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Calculates and returns the temperature value&lt;br /&gt;
 * by using the data read from the LM75B with&lt;br /&gt;
 * the function LM75B_read(). The sensor is&lt;br /&gt;
 * designed for 11 bit measurement and 0.125°C&lt;br /&gt;
 * resolution.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
double LM75B_calculate(void)&lt;br /&gt;
{&lt;br /&gt;
	int16_t tempraw = 0;&lt;br /&gt;
	double temp;&lt;br /&gt;
&lt;br /&gt;
	tempraw = (getTemperatureHigh() &amp;lt;&amp;lt; 8) | getTemperatureLow();&lt;br /&gt;
	tempraw &amp;gt;&amp;gt;= 5;&lt;br /&gt;
	if (tempraw &amp;amp; 1024)							// Calculate temperature&lt;br /&gt;
		tempraw = (tempraw &amp;amp; 1023) - 1024;&lt;br /&gt;
	else&lt;br /&gt;
		tempraw = tempraw &amp;amp; 1023;&lt;br /&gt;
	temp = tempraw * 0.125;&lt;br /&gt;
	return temp;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Performs a 11 bit measurement and returns the&lt;br /&gt;
 * temperature [°C]. The sensor has a measuring&lt;br /&gt;
 * cycle of 100ms. So it makes no sense calling&lt;br /&gt;
 * this function at a frequency above 10Hz.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
double LM75B_measure(void)&lt;br /&gt;
{&lt;br /&gt;
//	LM75B_init();&lt;br /&gt;
	LM75B_read();								// Read data&lt;br /&gt;
	return (LM75B_calculate());					// Calculate value&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Servo Controller (PCA9685):&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Call this once before using the servo function.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: PWM frequency [40..1000 Hz]&lt;br /&gt;
 *&lt;br /&gt;
 * Hints: - Default servo frequency is 50 Hz!&lt;br /&gt;
 *        - The servo power is NOT switched on by&lt;br /&gt;
 *          this function!&lt;br /&gt;
 *&lt;br /&gt;
 * There is also a macro initServo(freq), which&lt;br /&gt;
 * does exactly the same as this function.&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *   initServo(50);&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void PCA9685_init(uint16_t freq)&lt;br /&gt;
{&lt;br /&gt;
	outport.oen_servo = false;					// I/O 1.3: Low&lt;br /&gt;
	MAX7311_update();&lt;br /&gt;
	if ((freq &amp;lt; 40) || (freq &amp;gt; 1000)) freq = 50;&lt;br /&gt;
	I2CTWI_transmitByte(I2C_SENSOR_SERVO_ADR, PCA9685_MODE2);&lt;br /&gt;
	uint8_t last_mode = I2CTWI_readByte(I2C_SENSOR_SERVO_ADR);&lt;br /&gt;
	last_mode &amp;amp;= ~PCA9685_MODE2_INVRT;			// Clear INVRT bit&lt;br /&gt;
	last_mode |= PCA9685_MODE2_OUTDRV;			// Set OUTDRV bit&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_SERVO_ADR, PCA9685_MODE2, last_mode);&lt;br /&gt;
	I2CTWI_transmitByte(I2C_SENSOR_SERVO_ADR, PCA9685_MODE1);&lt;br /&gt;
	last_mode = I2CTWI_readByte(I2C_SENSOR_SERVO_ADR);&lt;br /&gt;
	last_mode |= PCA9685_MODE1_AI;				// Set AI bit&lt;br /&gt;
	uint8_t mode1 = last_mode;&lt;br /&gt;
	mode1 |= PCA9685_MODE1_SLEEP;				// Set SLEEP bit&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_SERVO_ADR, PCA9685_MODE1, mode1);&lt;br /&gt;
	uint8_t prescale = (uint8_t) (F_PCA9685 / 4096 / freq - 0.5);&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_SERVO_ADR, PCA9685_PRE_SCALE, prescale);&lt;br /&gt;
	last_mode &amp;amp;= ~PCA9685_MODE1_SLEEP;			// Clear SLEEP bit&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_SERVO_ADR, PCA9685_MODE1, last_mode);&lt;br /&gt;
	mSleep(1);&lt;br /&gt;
	last_mode |= PCA9685_MODE1_RESTART;			// Clear RESTART bit&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_SERVO_ADR, PCA9685_MODE1, last_mode);&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_SERVO_ADR, PCA9685_LED8_ON_H, 0x10);&lt;br /&gt;
	return;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/** &lt;br /&gt;
 * Returns the channel belonging to a servo number.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: number -&amp;gt; Servo number [1..8]&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
uint8_t servo(uint8_t number)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t channel;&lt;br /&gt;
&lt;br /&gt;
	switch (number) {&lt;br /&gt;
		case 1 :&lt;br /&gt;
			channel = CH_SERVO_1; break;&lt;br /&gt;
		case 2 :&lt;br /&gt;
			channel = CH_SERVO_2; break;&lt;br /&gt;
		case 3 :&lt;br /&gt;
			channel = CH_SERVO_3; break;&lt;br /&gt;
		case 4 :&lt;br /&gt;
			channel = CH_SERVO_4; break;&lt;br /&gt;
		case 5 :&lt;br /&gt;
			channel = CH_SERVO_5; break;&lt;br /&gt;
		case 6 :&lt;br /&gt;
			channel = CH_SERVO_6; break;&lt;br /&gt;
		case 7 :&lt;br /&gt;
			channel = CH_SERVO_7; break;&lt;br /&gt;
		case 8 :&lt;br /&gt;
			channel = CH_SERVO_8; break;&lt;br /&gt;
		default : channel = CH_SERVO_1;&lt;br /&gt;
	}&lt;br /&gt;
	return channel;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This is the servo position set function.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: channel -&amp;gt; Channel number [1..16]&lt;br /&gt;
 *        pos     -&amp;gt; Servo position [SERVOx_LT..SERVOx_RT]&lt;br /&gt;
 *&lt;br /&gt;
 * Hints: - A servo position of 205 means 1 ms servo impulse,&lt;br /&gt;
 *          a position of 410 means a 2 ms servo impulse!&lt;br /&gt;
 *          You may calculate the servo impulse length by:&lt;br /&gt;
 *          ==&amp;gt; Impulse [ms] = servo position / 204.8 &amp;lt;==&lt;br /&gt;
 *          (Formula only valid for a PWM of 50 Hz!)&lt;br /&gt;
 *&lt;br /&gt;
 * There is also a macro setServo(servo, pos), which&lt;br /&gt;
 * does nearly the same as this function, but the first&lt;br /&gt;
 * parameter is the servo and NOT the channel number.&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *   setServo(2,300);&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void PCA9685_set(uint8_t channel, uint16_t pos)&lt;br /&gt;
{&lt;br /&gt;
	if ((channel == 0) || (channel &amp;gt; 16))&lt;br /&gt;
		return;&lt;br /&gt;
	uint8_t reg = channel * 4 + 4;				// Register LEDx_OFF_L&lt;br /&gt;
	I2CTWI_transmit3Bytes(I2C_SENSOR_SERVO_ADR, reg, (pos &amp;amp; 0x00ff), (pos &amp;gt;&amp;gt; 8));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * If the servos are not moving for a while, the&lt;br /&gt;
 * servo function can be stopped with this&lt;br /&gt;
 * function (PCA9685 set to sleep mode).&lt;br /&gt;
 *&lt;br /&gt;
 * Hint: The servo power is NOT switched off by&lt;br /&gt;
 *       this function!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void PCA9685_shutdown(void)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_SERVO_ADR, PCA9685_ALL_LED_OFF_H, 0x10);&lt;br /&gt;
	I2CTWI_transmitByte(I2C_SENSOR_SERVO_ADR, PCA9685_MODE1);&lt;br /&gt;
	uint8_t mode1 = I2CTWI_readByte(I2C_SENSOR_SERVO_ADR);&lt;br /&gt;
	mode1 |= PCA9685_MODE1_SLEEP;				// Set SLEEP bit&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_SERVO_ADR, PCA9685_MODE1, mode1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * If the servo function was stopped with the&lt;br /&gt;
 * function PCA9685_shutdown() before, it can be&lt;br /&gt;
 * (re)started again with this function.&lt;br /&gt;
 *&lt;br /&gt;
 * Hint: The servo power is NOT switched on by&lt;br /&gt;
 *       this function!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void PCA9685_restart(void)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmitByte(I2C_SENSOR_SERVO_ADR, PCA9685_MODE1);&lt;br /&gt;
	uint8_t mode1 = I2CTWI_readByte(I2C_SENSOR_SERVO_ADR);&lt;br /&gt;
	if (mode1 &amp;amp; PCA9685_MODE1_RESTART) {		// RESTART bit set?&lt;br /&gt;
		mode1 &amp;amp;= ~PCA9685_MODE1_SLEEP;			// Clear SLEEP bit&lt;br /&gt;
		I2CTWI_transmit2Bytes(I2C_SENSOR_SERVO_ADR, PCA9685_MODE1, mode1);&lt;br /&gt;
		mSleep(1);&lt;br /&gt;
		mode1 |= PCA9685_MODE1_RESTART;			// Clear RESTART bit&lt;br /&gt;
		I2CTWI_transmit2Bytes(I2C_SENSOR_SERVO_ADR, PCA9685_MODE1, mode1);&lt;br /&gt;
		I2CTWI_transmit2Bytes(I2C_SENSOR_SERVO_ADR, PCA9685_ALL_LED_OFF_H, 0);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/** &lt;br /&gt;
 * With this function you can switch the servo&lt;br /&gt;
 * power on or off.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: pwr -&amp;gt; 0 (false) = servo power off&lt;br /&gt;
 *               &amp;gt;0 (true) = servo power on&lt;br /&gt;
 *&lt;br /&gt;
 * Hints: - If connected servos are not used, you&lt;br /&gt;
 *          should always switch the servo power off&lt;br /&gt;
 *          (default) to save energy!&lt;br /&gt;
 *        - The PCA9685 is NOT restarted or put into&lt;br /&gt;
 *          shutdown mode by this function!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void setServoPower(uint8_t pwr)&lt;br /&gt;
{&lt;br /&gt;
	if(pwr &amp;gt; 0)&lt;br /&gt;
		outport.pwr_servo = true;				// I/O 1.4: High&lt;br /&gt;
	else&lt;br /&gt;
		outport.pwr_servo = false;				// I/O 1.4: Low&lt;br /&gt;
	MAX7311_update();&lt;br /&gt;
}	&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C LED Driver (TCA6507):&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Sends the configuration byte to TCA6507's&lt;br /&gt;
 * internal registers.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: reg    -&amp;gt; Register address [0..10]&lt;br /&gt;
 *        config -&amp;gt; Config byte for internal&lt;br /&gt;
 *                  registers&lt;br /&gt;
 *&lt;br /&gt;
 * Hints: - With this function you can write to&lt;br /&gt;
 *          all internal registers of the LED&lt;br /&gt;
 *          driver, see &amp;quot;Registers:&amp;quot; in the&lt;br /&gt;
 *          library header file!&lt;br /&gt;
 *        - Mainly you will use this function&lt;br /&gt;
 *          for setting time (regs 3..7) and&lt;br /&gt;
 *          intensity (regs 8, 9) values.&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *   TCA6507_write_cfg(TCA6507_MAXIMUM_INTENSITY,0x77);&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void TCA6507_write_cfg(uint8_t reg, uint8_t config)&lt;br /&gt;
{&lt;br /&gt;
	if(reg &amp;gt; 10) reg = 0;&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_LEDDRIVER_ADR, reg, config);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
uint8_t select[3];&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Updates the LED driver select registers (0..2)&lt;br /&gt;
 * with the global select array!&lt;br /&gt;
 *&lt;br /&gt;
 * Hint: - Also have a look at Table 4 in the&lt;br /&gt;
 *         TCA6507 datasheet!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void TCA6507_update(void)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmit4Bytes(I2C_SENSOR_LEDDRIVER_ADR, (TCA6507_SELECT0 | 0x10), select[0], select[1], select[2]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This is the LED state set function.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: led   -&amp;gt; LED number [0..6]&lt;br /&gt;
 *        state -&amp;gt; LED state  [0..7]&lt;br /&gt;
 *&lt;br /&gt;
 * Hints: - Possible driver states [0..7] see&lt;br /&gt;
 *          &amp;quot;Output states:&amp;quot; in the library&lt;br /&gt;
 *          header file!&lt;br /&gt;
 *        - Also have a look at Table 4 in the&lt;br /&gt;
 *          TCA6507 datasheet!&lt;br /&gt;
 *&lt;br /&gt;
 * There is also a macro setLED(led, state), which&lt;br /&gt;
 * does exactly the same as this function.&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *   setLED(1,4);&lt;br /&gt;
 *   // Switches LED1 ON&lt;br /&gt;
 *   // ... OR ...&lt;br /&gt;
 *   setLED(SB_LED1,STATE_ON);&lt;br /&gt;
 *   // does the same.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void TCA6507_set(uint8_t led, uint8_t state)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t i, mask;&lt;br /&gt;
&lt;br /&gt;
	if(led &amp;gt; 6) led = 0;&lt;br /&gt;
	led = 1 &amp;lt;&amp;lt; led;&lt;br /&gt;
	mask = 1;&lt;br /&gt;
	for(i = 0; i &amp;lt; 3; i++) {&lt;br /&gt;
		select[i] &amp;amp;= ~led;&lt;br /&gt;
		if(state &amp;amp; mask)&lt;br /&gt;
			select[i] |= led;&lt;br /&gt;
		mask &amp;lt;&amp;lt;= 1;&lt;br /&gt;
	}&lt;br /&gt;
	TCA6507_update();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * If the LEDs are not needed for a while, the&lt;br /&gt;
 * LED driver can be stopped with this function&lt;br /&gt;
 * (TCA6507 set to shutdown mode).&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void TCA6507_shutdown(void)&lt;br /&gt;
{&lt;br /&gt;
	outport.en_leddriv = false;					// I/O 0.4: Low&lt;br /&gt;
	MAX7311_update();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * If the LED driver was stopped with the&lt;br /&gt;
 * function TCA6507_shutdown() before, it can be&lt;br /&gt;
 * (re)started again with this function.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void TCA6507_restart(void)&lt;br /&gt;
{&lt;br /&gt;
	outport.en_leddriv = true;					// I/O 0.4: High&lt;br /&gt;
	MAX7311_update();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Initializes the LED driver after power on by&lt;br /&gt;
 * switching all LEDs off.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void TCA6507_init(void)&lt;br /&gt;
{&lt;br /&gt;
	select[0] = 0;&lt;br /&gt;
	select[1] = 0;&lt;br /&gt;
	select[2] = 0;&lt;br /&gt;
	TCA6507_update();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C 3D Magnetometer &amp;amp; Accelerometer (LSM303DLHC):&lt;br /&gt;
&lt;br /&gt;
// --------------------------------------------&lt;br /&gt;
// LSM303DLHC accelerometer functions:&lt;br /&gt;
int16_t x_axisa, y_axisa, z_axisa;&lt;br /&gt;
double pitch, roll;&lt;br /&gt;
double xa, ya, za;&lt;br /&gt;
double the, phi;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Call this once before using the 3D-Accelerometer.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void LSM303DLHC_A_init(void)&lt;br /&gt;
{&lt;br /&gt;
	// Set normal power mode, 10 Hz data rate, all axes enabled:&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_LSM303DLHC_A_ADR, CTRL_REG1_A, CTRL_REG1_A_10HZ);&lt;br /&gt;
	mSleep(10);&lt;br /&gt;
	// Set HD mode:&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_LSM303DLHC_A_ADR, CTRL_REG4_A, CTRL_REG4_A_HR);&lt;br /&gt;
	mSleep(10);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function reads the X-axis, Y-axis and Z-axis values&lt;br /&gt;
 * from the LSM303DLHC accelerometer and stores them in the&lt;br /&gt;
 * global variables x_axisa, y_axisa and z_axisa.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void readLSM303DLHC_A(void)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t readBuf[6];&lt;br /&gt;
&lt;br /&gt;
	I2CTWI_transmitByte(I2C_SENSOR_LSM303DLHC_A_ADR, (OUT_X_L_A | 0x80));&lt;br /&gt;
	I2CTWI_readBytes(I2C_SENSOR_LSM303DLHC_A_ADR, readBuf, 6); // Read  X-/Y-/Z-axis&lt;br /&gt;
	// xb = y:&lt;br /&gt;
	x_axisa = ((readBuf[OUT_Y_H_A - OUT_X_L_A] &amp;lt;&amp;lt; 8) + readBuf[OUT_Y_L_A - OUT_X_L_A]) / 16;&lt;br /&gt;
	// yb = x:&lt;br /&gt;
	y_axisa = ((readBuf[OUT_X_H_A - OUT_X_L_A] &amp;lt;&amp;lt; 8) + readBuf[OUT_X_L_A - OUT_X_L_A]) / 16;&lt;br /&gt;
	// zb = z:&lt;br /&gt;
	z_axisa = ((readBuf[OUT_Z_H_A - OUT_X_L_A] &amp;lt;&amp;lt; 8) + readBuf[OUT_Z_L_A - OUT_X_L_A]) / 16;&lt;br /&gt;
	mSleep(10);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function limits and normalizes the x-axisa,&lt;br /&gt;
 * y-axisa and z-axisa values read from the LSM303DLHC&lt;br /&gt;
 * accelerometer with the function readLSM303DLHC_A() and&lt;br /&gt;
 * stores them in the global double variables xa, ya and&lt;br /&gt;
 * za.&lt;br /&gt;
 * It also calculates the position in space in form of the&lt;br /&gt;
 * tilt angles (the = pitch, phi = roll) and stores them&lt;br /&gt;
 * in the global double variables the and phi.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void normalizeLSM303DLHC_A(void)&lt;br /&gt;
{&lt;br /&gt;
	// Limit raw values:&lt;br /&gt;
	if (x_axisa &amp;lt; MIN_X_A) x_axisa = MIN_X_A;&lt;br /&gt;
	if (x_axisa &amp;gt; MAX_X_A) x_axisa = MAX_X_A;&lt;br /&gt;
	if (y_axisa &amp;lt; MIN_Y_A) y_axisa = MIN_Y_A;&lt;br /&gt;
	if (y_axisa &amp;gt; MAX_Y_A) y_axisa = MAX_Y_A;&lt;br /&gt;
	if (z_axisa &amp;lt; MIN_Z_A) z_axisa = MIN_Z_A;&lt;br /&gt;
	if (z_axisa &amp;gt; MAX_Z_A) z_axisa = MAX_Z_A;&lt;br /&gt;
	xa = (double) x_axisa / 1000.0;&lt;br /&gt;
	ya = (double) y_axisa / 1000.0;&lt;br /&gt;
	za = (double) z_axisa / 1000.0;&lt;br /&gt;
	// Calculate Pitch and Roll:&lt;br /&gt;
	phi = asin(xa);								// Calculate the and phi&lt;br /&gt;
	the = asin(ya / cos(the));					//  from the raw values&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function calculates the position in space by&lt;br /&gt;
 * using the the and phi values (see function&lt;br /&gt;
 * normalizeLSM303DLHC_A()!). It stores the position&lt;br /&gt;
 * in the global double variables pitch and roll. &lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void positionLSM303DLHC_A(void)&lt;br /&gt;
{&lt;br /&gt;
	pitch = the * 180 / M_PI + OFFSET_PITCH_A;&lt;br /&gt;
	roll = phi * 180 / M_PI + OFFSET_ROLL_A;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// LSM303DLHC magnetometer functions:&lt;br /&gt;
int16_t x_axism, y_axism, z_axism;&lt;br /&gt;
int16_t headingm;&lt;br /&gt;
double xm, ym, zm;&lt;br /&gt;
#ifdef GET_TEMP_M&lt;br /&gt;
int16_t temperaturem;&lt;br /&gt;
double temperature_mag;&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
int16_t headingtc;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Call this once before using the 3D-Compass.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void LSM303DLHC_M_init(void)&lt;br /&gt;
{&lt;br /&gt;
#ifdef GET_TEMP_M&lt;br /&gt;
	// Set Data output rate to 15Hz, enable temperature sensor:&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_LSM303DLHC_M_ADR, CRA_REG_M, CRA_REG_M_15HZ_T_EN);&lt;br /&gt;
#else&lt;br /&gt;
	// Set Data output rate to 15Hz:&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_LSM303DLHC_M_ADR, CRA_REG_M, CRA_REG_M_15HZ);&lt;br /&gt;
#endif&lt;br /&gt;
	mSleep(10);&lt;br /&gt;
	// Set Gain to +-1.3Gauss:&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_LSM303DLHC_M_ADR, CRB_REG_M, CRB_REG_M_13GAUSS);&lt;br /&gt;
	mSleep(10);&lt;br /&gt;
	// Set Continuous-conversion mode:&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_LSM303DLHC_M_ADR, MR_REG_M, MR_REG_M_CCM);&lt;br /&gt;
	mSleep(10);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function reads the X-axis, Y-axis, Z-axis and&lt;br /&gt;
 * temperature values from the LSM303DLHC magnetometer&lt;br /&gt;
 * and stores them in the global variables x_axism,&lt;br /&gt;
 * y_axism, z_axism and temperaturem.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void readLSM303DLHC_M(void)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t readBuf[6];&lt;br /&gt;
&lt;br /&gt;
	I2CTWI_transmitByte(I2C_SENSOR_LSM303DLHC_M_ADR, OUT_X_H_M);&lt;br /&gt;
	I2CTWI_readBytes(I2C_SENSOR_LSM303DLHC_M_ADR, readBuf, 6); // Read  X-/Y-/Z-axis&lt;br /&gt;
	// xb = x:&lt;br /&gt;
	x_axism = (readBuf[OUT_X_H_M - OUT_X_H_M] &amp;lt;&amp;lt; 8) + readBuf[OUT_X_L_M - OUT_X_H_M];&lt;br /&gt;
	// yb = y:&lt;br /&gt;
	y_axism = (readBuf[OUT_Y_H_M - OUT_X_H_M] &amp;lt;&amp;lt; 8) + readBuf[OUT_Y_L_M - OUT_X_H_M];&lt;br /&gt;
	// zb = z:&lt;br /&gt;
	z_axism = (readBuf[OUT_Z_H_M - OUT_X_H_M] &amp;lt;&amp;lt; 8) + readBuf[OUT_Z_L_M - OUT_X_H_M];&lt;br /&gt;
	mSleep(10);&lt;br /&gt;
#ifdef GET_TEMP_M&lt;br /&gt;
	// Read temperature raw value:&lt;br /&gt;
	I2CTWI_transmitByte(I2C_SENSOR_LSM303DLHC_M_ADR, TEMP_OUT_H_M);&lt;br /&gt;
	readBuf[0] = I2CTWI_readByte(I2C_SENSOR_LSM303DLHC_M_ADR);&lt;br /&gt;
	I2CTWI_transmitByte(I2C_SENSOR_LSM303DLHC_M_ADR, TEMP_OUT_L_M);&lt;br /&gt;
	readBuf[1] = I2CTWI_readByte(I2C_SENSOR_LSM303DLHC_M_ADR);&lt;br /&gt;
	temperaturem = (readBuf[0] &amp;lt;&amp;lt; 8) | readBuf[1];&lt;br /&gt;
	temperaturem &amp;gt;&amp;gt;= 4;&lt;br /&gt;
	if (temperaturem &amp;amp; 2048)					// Calculate temperature&lt;br /&gt;
		temperaturem = (temperaturem &amp;amp; 2047) - 2048;&lt;br /&gt;
	else&lt;br /&gt;
		temperaturem = temperaturem &amp;amp; 2047;&lt;br /&gt;
	mSleep(10);&lt;br /&gt;
#endif&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function compensates hard iron effects and&lt;br /&gt;
 * scales the x-axism, y-axism and z-axism values read&lt;br /&gt;
 * from the LSM303DLHC magnetometer with the function&lt;br /&gt;
 * readLSM303DLHC_M() and stores them in the global&lt;br /&gt;
 * double variables xm, ym and zm.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void normalizeLSM303DLHC_M(void)&lt;br /&gt;
{&lt;br /&gt;
	// Add hard iron offsets:&lt;br /&gt;
	x_axism += OFFSET_X_M;&lt;br /&gt;
	y_axism += OFFSET_Y_M;&lt;br /&gt;
	z_axism += OFFSET_Z_M;&lt;br /&gt;
	// Scale raw values:&lt;br /&gt;
	xm = (x_axism - MIN_X_M) / (MAX_X_M - MIN_X_M) * 2 - 1;&lt;br /&gt;
	ym = (y_axism - MIN_Y_M) / (MAX_Y_M - MIN_Y_M) * 2 - 1;&lt;br /&gt;
	zm = (z_axism - MIN_Z_M) / (MAX_Z_M - MIN_Z_M) * 2 - 1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function calculates the heading by using the&lt;br /&gt;
 * normalized sensor values xm and ym (see function&lt;br /&gt;
 * normalizeLSM303DLHC_M()!). The heading is a value&lt;br /&gt;
 * from 0° to 359°. If the robot's front (and the&lt;br /&gt;
 * RP6 Sensor Board's front edge with the two&lt;br /&gt;
 * headlights) points to ...&lt;br /&gt;
 *   north -&amp;gt; heading is 0°,&lt;br /&gt;
 *   east  -&amp;gt; heading is 90°,&lt;br /&gt;
 *   south -&amp;gt; heading is 180°,&lt;br /&gt;
 *   west  -&amp;gt; heading is 270°.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
int16_t headingLSM303DLHC_M(void)&lt;br /&gt;
{&lt;br /&gt;
	double hdg = atan2(ym, xm) * 180 / M_PI + DECLINATION_M;&lt;br /&gt;
	if(hdg &amp;lt; 0.0) hdg += 360.0;&lt;br /&gt;
	return ((int16_t) hdg);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// --------------------------------------------&lt;br /&gt;
/**&lt;br /&gt;
 * This function calculates the TILT COMPENSATED&lt;br /&gt;
 * heading by using accelerometer (the, phi) AND&lt;br /&gt;
 * magnetometer (xm, ym, zm) data. The heading is a&lt;br /&gt;
 * value from 0° to 359°. If the robot's front (and&lt;br /&gt;
 * the RP6 Sensor Board's front edge with the two&lt;br /&gt;
 * headlights) points to ...&lt;br /&gt;
 *   north -&amp;gt; heading is 0°,&lt;br /&gt;
 *   east  -&amp;gt; heading is 90°,&lt;br /&gt;
 *   south -&amp;gt; heading is 180°,&lt;br /&gt;
 *   west  -&amp;gt; heading is 270°.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
int16_t headingLSM303DLHC_TC(void)&lt;br /&gt;
{&lt;br /&gt;
	double hdgtc, xh, yh;&lt;br /&gt;
&lt;br /&gt;
	xh = xm * cos(the) + zm * sin(the);&lt;br /&gt;
	yh = xm * sin(phi) * sin(the) + ym * cos(phi) - zm * sin(phi) * cos(the);&lt;br /&gt;
//	zh = -xm * cos(phi) * sin(the) + ym * sin(phi) + zm * cos(phi) * cos(the);&lt;br /&gt;
	hdgtc = atan2(yh, xh) * 180 / M_PI + DECLINATION_M;&lt;br /&gt;
	if(hdgtc &amp;lt; 0.0) hdgtc += 360.0;&lt;br /&gt;
	return ((int16_t) hdgtc);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// --------------------------------------------&lt;br /&gt;
/**&lt;br /&gt;
 * Call this once before using the LSM303DLHC.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void LSM303DLHC_init(void)&lt;br /&gt;
{&lt;br /&gt;
	LSM303DLHC_A_init();						// Accelerometer init&lt;br /&gt;
	LSM303DLHC_M_init();						// Magnetometer init&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Analog Yaw-Rate Gyroscope (LY330ALH):&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Sets the LY330ALH mode of operation.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: mode -&amp;gt; Mode [0..3]&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void LY330ALH_set_mode(uint8_t mode)&lt;br /&gt;
{&lt;br /&gt;
	outport.pd_gyro = false;					// I/O 0.6: Low&lt;br /&gt;
	outport.st_gyro = false;					// I/O 0.7: Low&lt;br /&gt;
	if(mode &amp;amp; 1) outport.pd_gyro = true;&lt;br /&gt;
	if(mode &amp;amp; 2) outport.st_gyro = true;&lt;br /&gt;
	MAX7311_update();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Reads the ADC1 value from the RP6Base.&lt;br /&gt;
 *&lt;br /&gt;
 * Hints: - The RP6Base input ADC1 has to be&lt;br /&gt;
 *          connected to the USRBUS: Pin 2 on&lt;br /&gt;
 *          the RP6 mainboard!&lt;br /&gt;
 *        - The RP6Base_I2CSlave program has to&lt;br /&gt;
 *          be loaded into the RP6Base&lt;br /&gt;
 *          microcontroller!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
uint16_t getRP6Base_ADC1(void)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_readRegisters(I2C_RP6_BASE_ADR, I2C_REG_ADC_ADC1_L, registerBuf, 2);&lt;br /&gt;
	return (registerBuf[0] + (registerBuf[1] &amp;lt;&amp;lt; 8));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int16_t z_axisg;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Performs a LY330ALH gyroscope measurement and&lt;br /&gt;
 * returns the angular rate (velocity).&lt;br /&gt;
 * Positive values mean an angular rate while&lt;br /&gt;
 * rotating LEFT and negative values while&lt;br /&gt;
 * rotating RIGHT!&lt;br /&gt;
 * The global integer variable z_axisg also&lt;br /&gt;
 * contains the measurement result.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
int16_t LY330ALH_measure(void)&lt;br /&gt;
{&lt;br /&gt;
	z_axisg = getRP6Base_ADC1();				// Read raw data&lt;br /&gt;
	z_axisg -= ADCVAL_ZERORATE_LEVEL;			// Calculate value&lt;br /&gt;
	return (z_axisg);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Hot Swappable 2-Wire Bus Buffer (TCA4311A):&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Reads the TCA4311A Ready output. &lt;br /&gt;
 * The function returns the state (true/false).&lt;br /&gt;
 * The global variable readyBusbuff is also&lt;br /&gt;
 * filled with the Ready output state.&lt;br /&gt;
 *&lt;br /&gt;
 * Hint: You don't have to use this function,&lt;br /&gt;
 *       if the task task_RP6SensorBoard() is&lt;br /&gt;
 *       called frequently out of the main&lt;br /&gt;
 *       loop, because readyBusbuff will be&lt;br /&gt;
 *       updated by this task!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
uint8_t readReadyBusbuff(void)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmitByte(I2C_SENSOR_PORTEXP_ADR, MAX7311_INPUT_PORT1);&lt;br /&gt;
	readyBusbuff = I2CTWI_readByte(I2C_SENSOR_PORTEXP_ADR);&lt;br /&gt;
	readyBusbuff &amp;amp;= RDY_BUSBUFF;&lt;br /&gt;
	return readyBusbuff;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
uint8_t errorBusbuff;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * If the I2C bus for the I2C-MODULE (SCLOUT,&lt;br /&gt;
 * SDAOUT) is not used or shall be isolated from&lt;br /&gt;
 * the RP6 I2C bus, this can be done with this&lt;br /&gt;
 * function.&lt;br /&gt;
 *&lt;br /&gt;
 * Hints: - The I2C-MODULE power is NOT switched&lt;br /&gt;
 *          off by this function!&lt;br /&gt;
 *        - If USE_PD5 is defined in the&lt;br /&gt;
 *          configuration header file, this&lt;br /&gt;
 *          function uses the RP6M256 portpin,&lt;br /&gt;
 *          that is connected to plug I/O: Pin 9&lt;br /&gt;
 *          instead of MAX7311 I/O 1.0!&lt;br /&gt;
 *        - If the global variable errorBusbuff&lt;br /&gt;
 *          returns true, the bus buffer could&lt;br /&gt;
 *          not be switched to shutdown mode!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void TCA4311A_shutdown(void)&lt;br /&gt;
{&lt;br /&gt;
	// Wait until the I2C bus is idle:&lt;br /&gt;
	while(I2CTWI_isBusy() || TWI_operation != I2CTWI_NO_OPERATION) task_I2CTWI();&lt;br /&gt;
#ifdef USE_PD5&lt;br /&gt;
	IO_SENSOR_TCA4311A_EN_PORT &amp;amp;= ~IO_SENSOR_TCA4311A_EN_IN; // Low&lt;br /&gt;
#else&lt;br /&gt;
	outport.en_busbuff = false;					// I/O 1.0: Low&lt;br /&gt;
	MAX7311_update();&lt;br /&gt;
#endif&lt;br /&gt;
	errorBusbuff = readReadyBusbuff();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * If the I2C bus for the I2C-MODULE (SCLOUT,&lt;br /&gt;
 * SDAOUT) was isolated from the RP6 I2C bus with&lt;br /&gt;
 * the function TCA4311A_shutdown() before, it&lt;br /&gt;
 * can be connected again with this function.&lt;br /&gt;
 *&lt;br /&gt;
 * Hints: - The I2C-MODULE power is NOT switched&lt;br /&gt;
 *          on by this function!&lt;br /&gt;
 *        - If USE_PD5 is defined in the&lt;br /&gt;
 *          configuration header file, this&lt;br /&gt;
 *          function uses the RP6M256 portpin,&lt;br /&gt;
 *          that is connected to plug I/O: Pin 9&lt;br /&gt;
 *          instead of MAX7311 I/O 1.0!&lt;br /&gt;
 *        - If the global variable errorBusbuff&lt;br /&gt;
 *          returns true, the bus buffer could&lt;br /&gt;
 *          not be switched to normal operation!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void TCA4311A_reconnect(void)&lt;br /&gt;
{&lt;br /&gt;
	// Wait until the I2C bus is idle:&lt;br /&gt;
	while(I2CTWI_isBusy() || TWI_operation != I2CTWI_NO_OPERATION) task_I2CTWI();&lt;br /&gt;
#ifdef USE_PD5&lt;br /&gt;
	IO_SENSOR_TCA4311A_EN_PORT |= IO_SENSOR_TCA4311A_EN_IN; // High&lt;br /&gt;
#else&lt;br /&gt;
	outport.en_busbuff = true;					// I/O 1.0: High&lt;br /&gt;
	MAX7311_update();&lt;br /&gt;
#endif&lt;br /&gt;
	errorBusbuff = !readReadyBusbuff();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Sets/clears the RP6Base signal PWR.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: pwr -&amp;gt; 0 (false) = PWR off&lt;br /&gt;
 *               &amp;gt;0 (true) = PWR on&lt;br /&gt;
 *&lt;br /&gt;
 * Hints: - The RP6Base signal PWR has to be&lt;br /&gt;
 *          connected to the USRBUS: Pin 3 on&lt;br /&gt;
 *          the RP6 mainboard!&lt;br /&gt;
 *        - The RP6Base_I2CSlave program has to&lt;br /&gt;
 *          be loaded into the RP6Base&lt;br /&gt;
 *          microcontroller!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void setRP6Base_PWR(uint8_t pwr)&lt;br /&gt;
{&lt;br /&gt;
	if(pwr &amp;gt; 0)&lt;br /&gt;
		I2CTWI_transmit2Bytes(I2C_RP6_BASE_ADR, 0, CMD_POWER_ON);&lt;br /&gt;
	else&lt;br /&gt;
		I2CTWI_transmit2Bytes(I2C_RP6_BASE_ADR, 0, CMD_POWER_OFF);&lt;br /&gt;
	while(I2CTWI_isBusy() || TWI_operation != I2CTWI_NO_OPERATION) task_I2CTWI();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/** &lt;br /&gt;
 * With this function you can switch the I2C-&lt;br /&gt;
 * MODULE (plug M1) power on or off.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: pwr -&amp;gt; 0 (false) = I2C-MODULE power off&lt;br /&gt;
 *               &amp;gt;0 (true) = I2C-MODULE power on&lt;br /&gt;
 *&lt;br /&gt;
 * Hints: - If the I2C-MODULE plug is not used,&lt;br /&gt;
 *          you should always switch the&lt;br /&gt;
 *          I2C-MODULE power off (default)!&lt;br /&gt;
 *        - The TCA4311A is NOT switched to&lt;br /&gt;
 *          normal operation (default) or&lt;br /&gt;
 *          shutdown mode by this function!&lt;br /&gt;
 *        - The RP6Base signal PWR has to be&lt;br /&gt;
 *          connected to the USRBUS: Pin 3 on&lt;br /&gt;
 *          the RP6 mainboard!&lt;br /&gt;
 *        - The RP6Base_I2CSlave program has to&lt;br /&gt;
 *          be loaded into the RP6Base&lt;br /&gt;
 *          microcontroller!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void setI2CModulePower(uint8_t pwr)&lt;br /&gt;
{&lt;br /&gt;
	if(pwr &amp;gt; 0) {&lt;br /&gt;
		setRP6Base_PWR(1);						// RP6Base PWR on&lt;br /&gt;
		outport.pwr_i2c = true;					// I/O 0.0: High&lt;br /&gt;
	}&lt;br /&gt;
	else&lt;br /&gt;
		outport.pwr_i2c = false;				// I/O 0.0: Low&lt;br /&gt;
	MAX7311_update();&lt;br /&gt;
}	&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Button:&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Reads the MAX7311 I/O port 1.7. &lt;br /&gt;
 * The function returns true, if  button S1 is&lt;br /&gt;
 * pressed (I/O 1.7: Low!) and false, if it is&lt;br /&gt;
 * not pressed (I/O 1.7: High!).&lt;br /&gt;
 * The global variable pressedButton is also&lt;br /&gt;
 * filled with the I/O 1.7 output state.&lt;br /&gt;
 *&lt;br /&gt;
 * Hint: You don't have to use this function,&lt;br /&gt;
 *       if the task task_RP6SensorBoard() is&lt;br /&gt;
 *       called frequently out of the main&lt;br /&gt;
 *       loop, because pressedButton will be&lt;br /&gt;
 *       updated by this task!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
uint8_t readButton(void)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmitByte(I2C_SENSOR_PORTEXP_ADR, MAX7311_INPUT_PORT2);&lt;br /&gt;
	pressedButton = I2CTWI_readByte(I2C_SENSOR_PORTEXP_ADR);&lt;br /&gt;
	pressedButton &amp;amp;= IO2_I2C;&lt;br /&gt;
	pressedButton = !pressedButton;&lt;br /&gt;
	return pressedButton;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Status LED:&lt;br /&gt;
&lt;br /&gt;
/** &lt;br /&gt;
 * Sets the status LED (D2) of the RP6 Sensor&lt;br /&gt;
 * Board.&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *   setStatusLED(1);&lt;br /&gt;
 *   // This switches the status LED on!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void setStatusLED(uint8_t on)&lt;br /&gt;
{&lt;br /&gt;
	if(on &amp;gt; 0)&lt;br /&gt;
		outport.io1_i2c = false;				// I/O 1.6: Low&lt;br /&gt;
	else&lt;br /&gt;
		outport.io1_i2c = true;					// I/O 1.6: High&lt;br /&gt;
	MAX7311_update();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// RP6 Sensor Board initialisation and shutdown:&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * You MUST call this function at the beginning of a&lt;br /&gt;
 * main program, that uses the RP6 Sensor Board. &lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void sensor_board_init(void)&lt;br /&gt;
{&lt;br /&gt;
	// I/O Port Expander:&lt;br /&gt;
	MAX7311_init();&lt;br /&gt;
	// RTC:&lt;br /&gt;
	DS1339_init();&lt;br /&gt;
	// Temperature Sensor:&lt;br /&gt;
	LM75B_init();&lt;br /&gt;
	// Servo Controller:&lt;br /&gt;
	PCA9685_init(50);							// Init PWM 50 Hz&lt;br /&gt;
	// LED Driver:&lt;br /&gt;
	TCA6507_init();&lt;br /&gt;
	// 3D Magnetometer &amp;amp; Accelerometer:&lt;br /&gt;
	LSM303DLHC_init();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * If you don't use any function of the RP6&lt;br /&gt;
 * Sensor Board, you can put the board into&lt;br /&gt;
 * &amp;quot;SHUTDOWN MODE&amp;quot;. In this mode the electric&lt;br /&gt;
 * power consumption is very low to save energy.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void sensor_board_shutdown(void)&lt;br /&gt;
{&lt;br /&gt;
	// Servo Controller:&lt;br /&gt;
	PCA9685_shutdown();							// Shutdown PCA9685&lt;br /&gt;
	// Temperature Sensor:&lt;br /&gt;
	LM75B_shutdown();							// Shutdown LM75B&lt;br /&gt;
	// I/O Port Expander:&lt;br /&gt;
	MAX7311_write(MAX7311_OUTPUT_SHUTDOWN);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&lt;br /&gt;
/******************************************************************************&lt;br /&gt;
 * Additional info&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Changelog:&lt;br /&gt;
 * - v. 1.1 RP6M256_I2CMasterLib compatibility 16.09.2014 by Dirk&lt;br /&gt;
 * - v. 1.0 TCA4311A reconnect problem fixed 10.04.2014 by Dirk&lt;br /&gt;
 * - v. 0.9 Interrupt status functions added 09.04.2014 by Dirk&lt;br /&gt;
 * - v. 0.8 (initial release) 17.03.2014 by Dirk&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Erklärung&lt;br /&gt;
&lt;br /&gt;
=====Demo=====&lt;br /&gt;
makefile:&lt;br /&gt;
&amp;lt;pre&amp;gt;...&lt;br /&gt;
TARGET = RP6M256_Sensor_Board_01&lt;br /&gt;
...&lt;br /&gt;
SRC += $(RP6_LIB_PATH)/RP6common/RP6I2CmasterTWI.c&lt;br /&gt;
&lt;br /&gt;
SRC += $(RP6_LIB_PATH)/RP6control_M256_WIFI/RP6M256_Sensor_BoardLib.c&lt;br /&gt;
...&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Datei: RP6M256_Sensor_Board_01.c&lt;br /&gt;
&amp;lt;pre&amp;gt;/* &lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * RP6 ROBOT SYSTEM - RP6 CONTROL M256 Examples&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Example: RP6M256 Sensor Board&lt;br /&gt;
 * Author(s): Dirk&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Description:&lt;br /&gt;
 * In this example we show a first test for the RP6 Sensor Board.&lt;br /&gt;
 * &lt;br /&gt;
 * ############################################################################&lt;br /&gt;
 * The Robot does NOT move in this example! You can simply put it on a table&lt;br /&gt;
 * next to your PC and you should connect it to the PC via the USB Interface!&lt;br /&gt;
 * You should also connect to it via WIFI.&lt;br /&gt;
 * ############################################################################&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Includes:&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6M256Lib.h&amp;quot; 				// The RP6 M256 Library. &lt;br /&gt;
										// Always needs to be included!&lt;br /&gt;
#include &amp;quot;RP6I2CmasterTWI.h&amp;quot;			// Include the I2C-Bus Master Library&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Include our new &amp;quot;RP6M256 Sensor Board library&amp;quot;:&lt;br /&gt;
// (This is the library for accessing the RP6 Sensor Board!)&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6M256_Sensor_BoardLib.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Variables:&lt;br /&gt;
&lt;br /&gt;
char dir[3];&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Returns a 2 character string for the eighth&lt;br /&gt;
 * parts of the direction calculated from the&lt;br /&gt;
 * heading value.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: heading -&amp;gt; Heading value [0..359]&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void calculateDir(char *dir, uint16_t heading)&lt;br /&gt;
{&lt;br /&gt;
	dir[1] = ' ';&lt;br /&gt;
	dir[2] = '\0';&lt;br /&gt;
	if ((heading &amp;lt;= 22) || (heading &amp;gt;=338)) dir[0] = 'N';&lt;br /&gt;
	if ((heading &amp;gt;= 23) &amp;amp;&amp;amp; (heading &amp;lt;= 67)) {dir[0] = 'N'; dir[1] = 'E';} &lt;br /&gt;
	if ((heading &amp;gt;= 68) &amp;amp;&amp;amp; (heading &amp;lt;= 112)) dir[0] = 'E';&lt;br /&gt;
	if ((heading &amp;gt;= 113) &amp;amp;&amp;amp; (heading &amp;lt;= 157)) {dir[0] = 'S'; dir[1] = 'E';}&lt;br /&gt;
	if ((heading &amp;gt;= 158) &amp;amp;&amp;amp; (heading &amp;lt;= 202)) dir[0] = 'S';&lt;br /&gt;
	if ((heading &amp;gt;= 203) &amp;amp;&amp;amp; (heading &amp;lt;= 247)) {dir[0] = 'S'; dir[1] = 'W';}&lt;br /&gt;
	if ((heading &amp;gt;= 248) &amp;amp;&amp;amp; (heading &amp;lt;= 292)) dir[0] = 'W';&lt;br /&gt;
	if ((heading &amp;gt;= 293) &amp;amp;&amp;amp; (heading &amp;lt;= 337)) {dir[0] = 'N'; dir[1] = 'W';}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Write a floating point number to the WIFI.&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *&lt;br /&gt;
 *			// Write a floating point number to the WIFI (no exponent):&lt;br /&gt;
 *			writeDouble_WIFI(1234567.890, 11, 3);&lt;br /&gt;
 *&lt;br /&gt;
 * The value of prec (precision) defines the number of decimal places.&lt;br /&gt;
 * For 32 bit floating point variables (float, double ...) 6 is&lt;br /&gt;
 * the max. value for prec (7 relevant digits).&lt;br /&gt;
 * The value of width defines the overall number of characters in the&lt;br /&gt;
 * floating point number including the decimal point. The number of&lt;br /&gt;
 * pre-decimal positions is: (width - prec - 1).&lt;br /&gt;
 */&lt;br /&gt;
void writeDouble_WIFI(double number, uint8_t width, uint8_t prec)&lt;br /&gt;
{char buffer[width + 1];&lt;br /&gt;
	dtostrf(number, width, prec, &amp;amp;buffer[0]);&lt;br /&gt;
	writeString_WIFI(&amp;amp;buffer[0]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Write a floating point number to the LCD.&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *&lt;br /&gt;
 *			// Write a floating point number to the LCD (no exponent):&lt;br /&gt;
 *			writeDoubleLCD(1234567.890, 11, 3);&lt;br /&gt;
 *&lt;br /&gt;
 * The value of prec (precision) defines the number of decimal places.&lt;br /&gt;
 * For 32 bit floating point variables (float, double ...) 6 is&lt;br /&gt;
 * the max. value for prec (7 relevant digits).&lt;br /&gt;
 * The value of width defines the overall number of characters in the&lt;br /&gt;
 * floating point number including the decimal point. The number of&lt;br /&gt;
 * pre-decimal positions is: (width - prec - 1).&lt;br /&gt;
 */&lt;br /&gt;
void writeDoubleLCD(double number, uint8_t width, uint8_t prec)&lt;br /&gt;
{char buffer[width + 1];&lt;br /&gt;
	dtostrf(number, width, prec, &amp;amp;buffer[0]);&lt;br /&gt;
	writeStringLCD(&amp;amp;buffer[0]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Error handler&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function gets called automatically if there was an I2C Error like&lt;br /&gt;
 * the slave sent a &amp;quot;not acknowledge&amp;quot; (NACK, error codes e.g. 0x20 or 0x30).&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void I2C_transmissionError(uint8_t errorState)&lt;br /&gt;
{&lt;br /&gt;
	writeString_P_WIFI(&amp;quot;\nI2C ERROR - TWI STATE: 0x&amp;quot;);&lt;br /&gt;
	writeInteger_WIFI(errorState, HEX);&lt;br /&gt;
	writeChar_WIFI('\n');&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Main function - The program starts here:&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
	initRP6M256();    // Always call this first! The Processor will not work&lt;br /&gt;
					  // correctly otherwise. &lt;br /&gt;
&lt;br /&gt;
	initLCD(); // Initialize the LC-Display (LCD)&lt;br /&gt;
			   // Always call this before using the LCD!&lt;br /&gt;
&lt;br /&gt;
	setLEDs(0b1111);&lt;br /&gt;
	mSleep(500);&lt;br /&gt;
	setLEDs(0b0000);&lt;br /&gt;
&lt;br /&gt;
	writeString_P_WIFI(&amp;quot;\n\nRP6 Sensor Board Selftest 1!\n&amp;quot;); &lt;br /&gt;
&lt;br /&gt;
	// IMPORTANT:&lt;br /&gt;
	I2CTWI_initMaster(100); // Initialize the TWI Module for Master operation&lt;br /&gt;
							// with 100kHz SCL Frequency&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	// Register the event handler:&lt;br /&gt;
	I2CTWI_setTransmissionErrorHandler(I2C_transmissionError);&lt;br /&gt;
&lt;br /&gt;
	setLEDs(0b1111);&lt;br /&gt;
&lt;br /&gt;
	// Write a text message to the LCD:&lt;br /&gt;
	showScreenLCD(&amp;quot;################&amp;quot;, &amp;quot;################&amp;quot;);&lt;br /&gt;
	mSleep(1500);&lt;br /&gt;
	showScreenLCD(&amp;quot;RP6v2-M256-WIFI &amp;quot;, &amp;quot;Example Program&amp;quot;);&lt;br /&gt;
	mSleep(2500); &lt;br /&gt;
	showScreenLCD(&amp;quot;RP6 Sensor Board&amp;quot;, &amp;quot;   Selftest 1&amp;quot;);&lt;br /&gt;
	mSleep(2500);&lt;br /&gt;
	clearLCD();&lt;br /&gt;
&lt;br /&gt;
	setLEDs(0b0000);&lt;br /&gt;
&lt;br /&gt;
	// ---------------------------------------&lt;br /&gt;
&lt;br /&gt;
	uint8_t onoff = 0;&lt;br /&gt;
	uint16_t servopos = SERVO1_LT;&lt;br /&gt;
	int16_t rate;&lt;br /&gt;
&lt;br /&gt;
	startStopwatch1();&lt;br /&gt;
	startStopwatch2();&lt;br /&gt;
&lt;br /&gt;
	// IMPORTANT:&lt;br /&gt;
	sensor_board_init();						// RP6 Sensor Board init!!!&lt;br /&gt;
	setServoPower(1);							// Servo power ON!&lt;br /&gt;
/*&lt;br /&gt;
	// ----------------------------------------------&lt;br /&gt;
	// Set RTC once (battery empty or not existing:&lt;br /&gt;
	rtc_time.second = 0;&lt;br /&gt;
	rtc_time.minute = 15;&lt;br /&gt;
	rtc_time.hour = 20;				// 20:15&lt;br /&gt;
	rtc_date.weekday = R_SU;&lt;br /&gt;
	rtc_date.day = 20;&lt;br /&gt;
	rtc_date.month = 4;&lt;br /&gt;
	rtc_date.year = 2014;			// Su, 20.4.2014&lt;br /&gt;
	DS1339_write();&lt;br /&gt;
	// Remove this, if RTC is set and running!!!&lt;br /&gt;
	// ----------------------------------------------&lt;br /&gt;
*/&lt;br /&gt;
	while(true) &lt;br /&gt;
	{&lt;br /&gt;
		if(getStopwatch1() &amp;gt; 1000) // 1s&lt;br /&gt;
		{&lt;br /&gt;
			if (onoff) onoff = 0;&lt;br /&gt;
			else onoff = 1;&lt;br /&gt;
&lt;br /&gt;
			// Interrupt status:&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nInterrupt Status:      &amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(interrupt_RP6SBstatus.byte, BIN, 8);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			// Inport status:&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;Inport Status: &amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(inport.word, BIN, 16);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			// Temperature sensor test:&lt;br /&gt;
			temperature = LM75B_measure();		// Measure&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;Temperature: &amp;quot;);&lt;br /&gt;
			writeDouble_WIFI(temperature, 7, 3);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;°\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			// LED driver test:&lt;br /&gt;
			if (onoff) {&lt;br /&gt;
				setLED(HEADLIGHT_R, STATE_ON);&lt;br /&gt;
				setLED(HEADLIGHT_L, STATE_OFF);&lt;br /&gt;
			}&lt;br /&gt;
			else {&lt;br /&gt;
				setLED(HEADLIGHT_L, STATE_ON);&lt;br /&gt;
				setLED(HEADLIGHT_R, STATE_OFF);&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			// Servo controller test (SERVO_1):&lt;br /&gt;
			setServo(1, servopos);&lt;br /&gt;
			servopos += 10;&lt;br /&gt;
			if (servopos &amp;gt; SERVO1_RT) servopos = SERVO1_LT;&lt;br /&gt;
&lt;br /&gt;
			// RTC test:&lt;br /&gt;
			DS1339_read();&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;RTC: &amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(rtc_time.hour, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;:&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(rtc_time.minute, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;:&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(rtc_time.second, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;  &amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(rtc_date.day, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;.&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(rtc_date.month, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;.&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(rtc_date.year, DEC, 4);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			// 3D Magnetometer &amp;amp; Accelerometer test:&lt;br /&gt;
			//  LSM303DLHC accelerometer:&lt;br /&gt;
			task_I2CTWI();&lt;br /&gt;
			readLSM303DLHC_A();					// Get sensor values&lt;br /&gt;
			task_I2CTWI();&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\n3D-Acceleration SENSOR -&amp;gt;\n&amp;quot;);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;X-axis: &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(x_axisa, DEC);&lt;br /&gt;
			writeChar_WIFI('\n');&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;Y-axis: &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(y_axisa, DEC);&lt;br /&gt;
			writeChar_WIFI('\n');&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;Z-axis: &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(z_axisa, DEC);&lt;br /&gt;
			writeChar_WIFI('\n');&lt;br /&gt;
			normalizeLSM303DLHC_A();			// Normalize data&lt;br /&gt;
			positionLSM303DLHC_A();				// Calculate position&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;POSITION: \n&amp;quot;);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;  Pitch [°]: &amp;quot;);&lt;br /&gt;
			writeDouble_WIFI(pitch, 6, 1);&lt;br /&gt;
			writeChar_WIFI('\n');&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;  Roll [°]:  &amp;quot;);&lt;br /&gt;
			writeDouble_WIFI(roll, 6, 1);&lt;br /&gt;
			writeChar_WIFI('\n');&lt;br /&gt;
&lt;br /&gt;
			//  LSM303DLHC magnetometer:&lt;br /&gt;
			task_I2CTWI();&lt;br /&gt;
			readLSM303DLHC_M();					// Get sensor values&lt;br /&gt;
			task_I2CTWI();&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\n3D-Compass SENSOR -&amp;gt;\n&amp;quot;);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;X-axis: &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(x_axism, DEC);&lt;br /&gt;
			writeChar_WIFI('\n');&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;Y-axis: &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(y_axism, DEC);&lt;br /&gt;
			writeChar_WIFI('\n');&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;Z-axis: &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(z_axism, DEC);&lt;br /&gt;
			writeChar_WIFI('\n');&lt;br /&gt;
			normalizeLSM303DLHC_M();			// Normalize data&lt;br /&gt;
			headingm = headingLSM303DLHC_M();	// Calculate heading&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;                 Heading [°]: &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(headingm, DEC);&lt;br /&gt;
			calculateDir(dir, headingm);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;  Direction: &amp;quot;);&lt;br /&gt;
			writeString_WIFI(dir);&lt;br /&gt;
			writeChar_WIFI('\n');&lt;br /&gt;
			headingtc = headingLSM303DLHC_TC();	// Calculate TILT COMPENSATED&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;TILT COMPENSATED heading [°]: &amp;quot;); // heading&lt;br /&gt;
			writeInteger_WIFI(headingtc, DEC);&lt;br /&gt;
			calculateDir(dir, headingtc);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;  Direction: &amp;quot;);&lt;br /&gt;
			writeString_WIFI(dir);&lt;br /&gt;
			writeChar_WIFI('\n');&lt;br /&gt;
#ifdef GET_TEMP_M&lt;br /&gt;
			temperature_mag = (double) temperaturem / 8.0 + OFFSET_TEMP_M;&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;Temperature [°]: &amp;quot;);&lt;br /&gt;
			writeDouble_WIFI(temperature_mag, 7, 2);&lt;br /&gt;
			writeChar_WIFI('\n');&lt;br /&gt;
#endif&lt;br /&gt;
			// Yaw-Rate Gyroscope test:&lt;br /&gt;
			rate = LY330ALH_measure();&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\n1D-Gyro SENSOR -&amp;gt;\n&amp;quot;);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;Z-axis: &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(rate, DEC);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			// RP6 Sensor Board shutdown (button &amp;amp; status LED test):&lt;br /&gt;
			if (pressedButton) {&lt;br /&gt;
				setStatusLED(1);&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;\nPress button again for RP6 Sensor Board SHUTDOWN!\n&amp;quot;);&lt;br /&gt;
				mSleep(2000);&lt;br /&gt;
				do {&lt;br /&gt;
					if(getStopwatch2() &amp;gt; 200) { // 0.2s&lt;br /&gt;
						if (onoff) onoff = 0;&lt;br /&gt;
						else onoff = 1;&lt;br /&gt;
						if (onoff) setStatusLED(1);&lt;br /&gt;
						else setStatusLED(0);&lt;br /&gt;
						setStopwatch2(0);&lt;br /&gt;
					}&lt;br /&gt;
					mSleep(1);&lt;br /&gt;
					task_I2CTWI();&lt;br /&gt;
				} while (!readButton());&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;\n\n\n\n\nPlease wait for RP6 Sensor Board SHUTDOWN...\n&amp;quot;);&lt;br /&gt;
				sensor_board_shutdown();&lt;br /&gt;
				mSleep(3000);&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;\n\n\nThe RP6 Sensor Board now is in SHUTDOWN MODE!!!\n&amp;quot;);&lt;br /&gt;
				mSleep(1000);&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;\nRESET the M256 microcontroller now...\n\n&amp;quot;);&lt;br /&gt;
				while(true) {};&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			setStopwatch1(0);&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		task_checkINTs();						// Read interrupt signals&lt;br /&gt;
		task_RP6SensorBoard();					// RP6 Sensor Board task&lt;br /&gt;
&lt;br /&gt;
		task_I2CTWI();&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Erklärung&lt;br /&gt;
&lt;br /&gt;
====Projekte====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===RP6 Xtra Module===&lt;br /&gt;
Die Dokumentation zu den RP6 Xtra Modulen befindet sich auf der mitgelieferten ''&amp;quot;RP6 Robot System Xtra Modules CD-ROM&amp;quot;''. Auf der CD-ROM sind auch Software-Beispiele zu finden.&lt;br /&gt;
&lt;br /&gt;
Die hier veröffentlichte Software zu den Xtra Modulen ist eine Eigenentwicklung in GCC:&lt;br /&gt;
* Arexx [[RP6_Sensor_Board_und_Xtra_Module#I2C_GPS_Empf.C3.A4nger_JM3-GPS_2|I2C GPS Empfänger JM3-GPS]]&lt;br /&gt;
* Arexx [[RP6_Sensor_Board_und_Xtra_Module#Gyro_Modul_JM3-GYRO_2|Gyro Modul JM3-GYRO]]&lt;br /&gt;
* Arexx [[RP6_Sensor_Board_und_Xtra_Module#3D_Accelerometer_Modul_JM3-3DA_2|3D Accelerometer Modul JM3-3DA]]&lt;br /&gt;
* Arexx [[RP6_Sensor_Board_und_Xtra_Module#BHT_Modul_JM3-BHT31_2|BHT Modul JM3-BHT31]]&lt;br /&gt;
&lt;br /&gt;
====I2C GPS Empfänger JM3-GPS====&lt;br /&gt;
=====Dokumentation=====&lt;br /&gt;
Die Dokumentation zum I2C GPS Empfänger befindet sich auf der mitgelieferten ''&amp;quot;RP6 Robot System Xtra Modules CD-ROM&amp;quot;''.&lt;br /&gt;
&lt;br /&gt;
======Manuals======&lt;br /&gt;
Das Handbuch in der aktuellen Version kann [http://www.jm3-engineering.com/download/doc/ManualGPSModule_de.pdf hier] eingesehen werden.&lt;br /&gt;
&lt;br /&gt;
=====Demo-Programme=====&lt;br /&gt;
Ein Demo-Programm zum I2C GPS Empfänger befindet sich integriert in die RP6 Sensor Board Demo auf der mitgelieferten ''&amp;quot;RP6 Robot System Xtra Modules CD-ROM&amp;quot;''. Diese Demo kann auch in der aktuellen Version im Download Bereich von [http://www.jm3-engineering.com/downloads.htm JM3 Engineering] herunter geladen werden.&lt;br /&gt;
&lt;br /&gt;
=====RP6M256 WiFi: I2C_GPS Library=====&lt;br /&gt;
Die nachfolgende RP6M256_I2C_GPSLib (Eigenentwicklung in GCC) dient zur Ansteuerung des I2C GPS Empfängers durch die RP6M256 WiFi.&lt;br /&gt;
 &lt;br /&gt;
======Libary Header======&lt;br /&gt;
Datei: RP6M256_I2C_GPSLib.h&lt;br /&gt;
&amp;lt;pre&amp;gt;/* ****************************************************************************&lt;br /&gt;
 *                           _______________________&lt;br /&gt;
 *                           \| RP6  ROBOT SYSTEM |/&lt;br /&gt;
 *                            \_-_-_-_-_-_-_-_-_-_/           &amp;gt;&amp;gt;&amp;gt; RP6 M256 WIFI&lt;br /&gt;
 * ----------------------------------------------------------------------------&lt;br /&gt;
 * ----------------------------- [c]2014 - Dirk -------------------------------&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * File: RP6M256_I2C_GPSLib.h&lt;br /&gt;
 * Version: 1.0&lt;br /&gt;
 * Target: RP6 M256 WIFI - ATMEGA2560 @16.00MHz&lt;br /&gt;
 * Author(s): Dirk&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Description:&lt;br /&gt;
 * Header file for new RP6 I2C GPS Receiver library.&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
#ifndef RP6M256_I2C_GPSLIB_H&lt;br /&gt;
#define RP6M256_I2C_GPSLIB_H&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// RP6 Sensor Board:&lt;br /&gt;
&lt;br /&gt;
// If you want to use the RP6 I2C GPS Receiver on the RP6 Sensor Board, you&lt;br /&gt;
// have to define SENSOR_BOARD (default)!&lt;br /&gt;
// If SENSOR_BOARD is NOT defined, this library assumes that the RP6 I2C GPS&lt;br /&gt;
// Receiver is used stand-alone.&lt;br /&gt;
// ------------------&lt;br /&gt;
#define SENSOR_BOARD&lt;br /&gt;
// ------------------&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Includes:&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6M256Lib.h&amp;quot;&lt;br /&gt;
#include &amp;quot;RP6I2CmasterTWI.h&amp;quot;&lt;br /&gt;
#ifdef SENSOR_BOARD&lt;br /&gt;
	#include &amp;quot;RP6M256_Sensor_BoardLib.h&amp;quot;&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// RP6 I2C GPS Receiver:&lt;br /&gt;
#define I2C_GPS_RECEIVER_ADR			0xc8	// Default&lt;br /&gt;
//#define I2C_GPS_RECEIVER_ADR			0xca&lt;br /&gt;
//#define I2C_GPS_RECEIVER_ADR			0xcc&lt;br /&gt;
//#define I2C_GPS_RECEIVER_ADR			0xce&lt;br /&gt;
//#define I2C_GPS_RECEIVER_ADR			0xd0	// DO NOT USE on Sensor Board!&lt;br /&gt;
//#define I2C_GPS_RECEIVER_ADR			0xd2&lt;br /&gt;
//#define I2C_GPS_RECEIVER_ADR			0xd4&lt;br /&gt;
//#define I2C_GPS_RECEIVER_ADR			0xd6&lt;br /&gt;
//#define I2C_GPS_RECEIVER_ADR			0xd8&lt;br /&gt;
//#define I2C_GPS_RECEIVER_ADR			0xda&lt;br /&gt;
//#define I2C_GPS_RECEIVER_ADR			0xdc&lt;br /&gt;
//#define I2C_GPS_RECEIVER_ADR			0xde&lt;br /&gt;
&lt;br /&gt;
// Read registers:&lt;br /&gt;
#define WHO_AM_I						0x20	// I2C address [0xc8..0xde]&lt;br /&gt;
#define LAT_DEG							0x21	// Degrees&lt;br /&gt;
#define LAT_MIN							0x22	// Minutes&lt;br /&gt;
#define LAT_MIN_D_L						0x23	// Minutes decimal part low&lt;br /&gt;
#define LAT_MIN_D_H						0x24	// Minutes decimal part high&lt;br /&gt;
#define LON_DEG							0x25	// Degrees&lt;br /&gt;
#define LON_MIN							0x26	// Minutes&lt;br /&gt;
#define LON_MIN_D_L						0x27	// Minutes decimal part low&lt;br /&gt;
#define LON_MIN_D_H						0x28	// Minutes decimal part high&lt;br /&gt;
#define STATUS							0x29	// Status flags&lt;br /&gt;
#define FIX_IND							0x2a	// FIX_IND&lt;br /&gt;
#define HDOP							0x2b	// HDOP&lt;br /&gt;
#define HDOP_D							0x2c	// HDOP_D&lt;br /&gt;
#define SAT_N							0x2d	// Number of satellites&lt;br /&gt;
#define COURSE_T_L						0x2e	// True heading low byte&lt;br /&gt;
#define COURSE_T_H						0x2f	// True heading high byte&lt;br /&gt;
#define COURSE_T_D						0x30	// Decimal part of course&lt;br /&gt;
#define SPEED_L							0x31	// Speed low byte&lt;br /&gt;
#define SPEED_H							0x32	// Speed high byte&lt;br /&gt;
#define SPEED_D							0x33	// Speed decimal part&lt;br /&gt;
#define ALT_L							0x34	// Altitude low byte&lt;br /&gt;
#define ALT_H							0x35	// Altitude high byte&lt;br /&gt;
#define ALT_DIF_L						0x36	// Differ. WGS-84 MSL low byte&lt;br /&gt;
#define ALT_DIF_H						0x37	// Differ. WGS-84 MSL high byte&lt;br /&gt;
#define UTC_H							0x38	// UTC hour&lt;br /&gt;
#define UTC_MIN							0x39	// UTC minute&lt;br /&gt;
#define UTC_S							0x3a	// UTC second&lt;br /&gt;
#define DAY								0x3b	// Day&lt;br /&gt;
#define YEAR_L							0x3c	// Year low byte&lt;br /&gt;
#define YEAR_H							0x3d	// Year high byte&lt;br /&gt;
#define MONTH							0x3e	// Month&lt;br /&gt;
#define PDOP							0x3f	// PDOP&lt;br /&gt;
#define PDOP_D							0x40	// PDOP_D&lt;br /&gt;
#define VDOP							0x41	// VDOP&lt;br /&gt;
#define VDOP_D							0x42	// VDOP_D&lt;br /&gt;
#define SAT_1							0x43	// SAT # 1&lt;br /&gt;
#define SAT_2							0x44	// SAT # 2&lt;br /&gt;
#define SAT_3							0x45	// SAT # 3&lt;br /&gt;
#define SAT_4							0x46	// SAT # 4&lt;br /&gt;
#define SAT_5							0x47	// SAT # 5&lt;br /&gt;
#define SAT_6							0x48	// SAT # 6&lt;br /&gt;
#define SAT_7							0x49	// SAT # 7&lt;br /&gt;
#define SAT_8							0x4a	// SAT # 8&lt;br /&gt;
#define SAT_9							0x4b	// SAT # 9&lt;br /&gt;
#define SAT_A							0x4c	// SAT # 10&lt;br /&gt;
#define SAT_B							0x4d	// SAT # 11&lt;br /&gt;
#define SAT_C							0x4e	// SAT # 12&lt;br /&gt;
#define SW_VERSION						0x4f	// SW_Version&lt;br /&gt;
#define HEARTBEAT						0x50	// Heartbeat&lt;br /&gt;
&lt;br /&gt;
// Status and Fix_Ind register bitmasks:&lt;br /&gt;
#define STATUS_NS						0b00000001&lt;br /&gt;
#define STATUS_EW						0b00000010&lt;br /&gt;
#define STATUS_SPU						0b00000100&lt;br /&gt;
#define STATUS_AUTON					0b00001000&lt;br /&gt;
#define FIX_IND_UI_FIX					0b10000000&lt;br /&gt;
&lt;br /&gt;
// Write registers:&lt;br /&gt;
#define INIT_CFG						0x90	// INIT CFG&lt;br /&gt;
#define SET_FIX_TIME					0x91	// Pos_Fix_Time&lt;br /&gt;
#define STBY							0x92	// STBY&lt;br /&gt;
#define FAC_RES							0x93	// Factory Reset&lt;br /&gt;
#define EN_JAM							0x94	// Jamming Remover&lt;br /&gt;
#define TEST_MODE						0x96	// Test Mode&lt;br /&gt;
&lt;br /&gt;
// Write register values (commands):&lt;br /&gt;
#define INIT_CFG_HOT_START				1		// Hot Start&lt;br /&gt;
#define INIT_CFG_WARM_START				2		// Warm Start init data loaded&lt;br /&gt;
#define INIT_CFG_WARM_START_EPH_CLR		3		// Warm Start Ephemeris cleared&lt;br /&gt;
#define INIT_CFG_COLD_START				4		// Cold Start&lt;br /&gt;
#define SET_FIX_TIME_1S					1		// Pos Fix Time 1 second&lt;br /&gt;
#define SET_FIX_TIME_2S					2		// Pos Fix Time 2 seconds&lt;br /&gt;
#define STBY_ENTER						1		// Standby (cleared after write)&lt;br /&gt;
#define FAC_RES_ENTER					1		// Factory Reset&lt;br /&gt;
#define EN_JAM_DISABLE					0		// Jamming Remover disable&lt;br /&gt;
#define EN_JAM_ENABLE					1		// Jamming Remover enable&lt;br /&gt;
#define TEST_MODE_INACTIVE				0		// Test Mode inactive&lt;br /&gt;
#define TEST_MODE_ACTIVE				0x15	// Test Mode active&lt;br /&gt;
&lt;br /&gt;
// Data structure (starts at LAT_DEG):&lt;br /&gt;
#define DATA_STRUCT						LAT_DEG	// Start&lt;br /&gt;
// All data from LAT_DEG to HEARTBEAT (48 bytes):&lt;br /&gt;
#define DATA_LENGTH						(HEARTBEAT - LAT_DEG + 1)&lt;br /&gt;
// Basic data from LAT_DEG to SAT_N (13 bytes):&lt;br /&gt;
#define DATA_BASIC						(SAT_N - LAT_DEG + 1)&lt;br /&gt;
&lt;br /&gt;
typedef union {&lt;br /&gt;
 	uint8_t byte;&lt;br /&gt;
	struct {&lt;br /&gt;
		unsigned ns    :1;				// 1: North 0: South&lt;br /&gt;
		unsigned ew    :1;				// 1: East 0: West&lt;br /&gt;
		unsigned spu   :1;				// 1: km/h 0: kn&lt;br /&gt;
		unsigned auton :1;				// 1: Data not valid 0: Autonomous&lt;br /&gt;
		unsigned fix0  :1;&lt;br /&gt;
		unsigned fix1  :1;&lt;br /&gt;
		unsigned stat0 :1;				// Invalid&lt;br /&gt;
		unsigned stat1 :1;				// GPS Com Error&lt;br /&gt;
	};&lt;br /&gt;
	struct {&lt;br /&gt;
		unsigned ns    :1;				// 1: North 0: South&lt;br /&gt;
		unsigned ew    :1;				// 1: East 0: West&lt;br /&gt;
		unsigned spu   :1;				// 1: km/h 0: kn&lt;br /&gt;
		unsigned auton :1;				// 1: Data not valid 0: Autonomous&lt;br /&gt;
		unsigned fix   :2;&lt;br /&gt;
		unsigned stat  :2;				// 00 -&amp;gt; Valid&lt;br /&gt;
										// 01 -&amp;gt; Invalid&lt;br /&gt;
										// 10 -&amp;gt; GPS Com Error&lt;br /&gt;
										// 11 -&amp;gt; n. def.&lt;br /&gt;
	};&lt;br /&gt;
} status_t;&lt;br /&gt;
&lt;br /&gt;
typedef union {&lt;br /&gt;
 	uint8_t byte;&lt;br /&gt;
	struct {							// Fix indicator:&lt;br /&gt;
		unsigned fix_0  :1;				//  1: GPS fix          2: DGPS fix&lt;br /&gt;
		unsigned fix_1  :1;				//  3: PPS fix          4: RTK&lt;br /&gt;
		unsigned fix_2  :1;				//  5: Float RTK        6: Dead reck.&lt;br /&gt;
		unsigned fix_3  :1;				//  7: Manual inp. mode 8: Simul. mode&lt;br /&gt;
		unsigned unused :3;&lt;br /&gt;
		unsigned ui_fix :1;				// HW signal from UC530&lt;br /&gt;
	};&lt;br /&gt;
	struct {&lt;br /&gt;
		unsigned fix    :4;				// See above &amp;quot;Fix indicator&amp;quot;!&lt;br /&gt;
		unsigned unused :3;&lt;br /&gt;
		unsigned ui_fix :1;				// HW signal from UC530&lt;br /&gt;
	};&lt;br /&gt;
} fix_ind_t;&lt;br /&gt;
&lt;br /&gt;
typedef union {&lt;br /&gt;
	struct {&lt;br /&gt;
		uint8_t   latDeg;&lt;br /&gt;
		uint8_t   latMin;&lt;br /&gt;
		uint16_t  latMinDec;&lt;br /&gt;
		uint8_t   lonDeg;&lt;br /&gt;
		uint8_t   lonMin;&lt;br /&gt;
		uint16_t  lonMinDec;&lt;br /&gt;
		status_t  status;&lt;br /&gt;
		fix_ind_t fixInd;&lt;br /&gt;
		uint8_t   hdop;&lt;br /&gt;
		uint8_t   hdopDec;&lt;br /&gt;
		uint8_t   satCount;&lt;br /&gt;
		uint16_t  course;&lt;br /&gt;
		uint8_t   courseDec;&lt;br /&gt;
		uint16_t  speed;&lt;br /&gt;
		uint8_t   speedDec;&lt;br /&gt;
		uint16_t  altitude;&lt;br /&gt;
		uint16_t  altDif;&lt;br /&gt;
		uint8_t   utcHour;&lt;br /&gt;
		uint8_t   utcMinute;&lt;br /&gt;
		uint8_t   utcSec;&lt;br /&gt;
		uint8_t   day;&lt;br /&gt;
		uint16_t  year;&lt;br /&gt;
		uint8_t   month;&lt;br /&gt;
		uint8_t   pdop;&lt;br /&gt;
		uint8_t   pdopDec;&lt;br /&gt;
		uint8_t   vdop;&lt;br /&gt;
		uint8_t   vdopDec;&lt;br /&gt;
		uint8_t   sat[12];&lt;br /&gt;
		uint8_t   swVersion;&lt;br /&gt;
		uint8_t   heartbeat;&lt;br /&gt;
	};&lt;br /&gt;
} gpsdata_t;&lt;br /&gt;
extern gpsdata_t gpsdata;&lt;br /&gt;
&lt;br /&gt;
void I2C_GPS_reset(void);&lt;br /&gt;
void I2C_GPS_write_cmd(uint8_t, uint8_t);&lt;br /&gt;
uint8_t I2C_GPS_read_reg(uint8_t);&lt;br /&gt;
void I2C_GPS_read(uint8_t);&lt;br /&gt;
void I2C_GPS_init(void);&lt;br /&gt;
void I2C_GPS_new_addr(uint8_t);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
/******************************************************************************&lt;br /&gt;
 * Additional info&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Changelog:&lt;br /&gt;
 * &lt;br /&gt;
 *  ---&amp;gt; changes are documented in the file &amp;quot;RP6M256_I2C_GPSLib.c&amp;quot;&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
======Libary Source======&lt;br /&gt;
Datei: RP6M256_I2C_GPSLib.c&lt;br /&gt;
&amp;lt;pre&amp;gt;/* ****************************************************************************&lt;br /&gt;
 *                           _______________________&lt;br /&gt;
 *                           \| RP6  ROBOT SYSTEM |/&lt;br /&gt;
 *                            \_-_-_-_-_-_-_-_-_-_/           &amp;gt;&amp;gt;&amp;gt; RP6 M256 WIFI&lt;br /&gt;
 * ----------------------------------------------------------------------------&lt;br /&gt;
 * ----------------------------- [c]2014 - Dirk -------------------------------&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * File: RP6M256_I2C_GPSLib.c&lt;br /&gt;
 * Version: 1.0&lt;br /&gt;
 * Target: RP6 M256 WIFI - ATMEGA2560 @16.00MHz&lt;br /&gt;
 *         and a RP6 I2C GPS Receiver (CONRAD 1082385)&lt;br /&gt;
 *         optionally on a RP6 Sensor Board (CONRAD 1082384)&lt;br /&gt;
 * Author(s): Dirk&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Description:&lt;br /&gt;
 * &lt;br /&gt;
 * This is our new Library that contains basic routines and functions for&lt;br /&gt;
 * accessing the RP6 I2C GPS Receiver JM3-GPS (CONRAD 1082385).&lt;br /&gt;
 * The library assumes the I2C GPS Receiver software (firmware) v1.2.&lt;br /&gt;
 * If the I2C GPS Receiver is located on the RP6 Sensor Board (CONRAD 1082384)&lt;br /&gt;
 * and connected to the I2C-MODULE plug M1, the RP6M256_Sensor_BoardLib has to&lt;br /&gt;
 * be included!&lt;br /&gt;
 * &lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Includes:&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6M256_I2C_GPSLib.h&amp;quot; 		&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Variables:&lt;br /&gt;
&lt;br /&gt;
uint8_t gpsdataBuf[DATA_LENGTH + 1]; &lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Software reset for the I2C GPS Receiver.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void I2C_GPS_reset(void)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_GPS_RECEIVER_ADR, 0, 0x06);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Writes a command cmd to a register reg of the&lt;br /&gt;
 * I2C GPS Receiver.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: reg -&amp;gt; Write register [0x90..0x96]&lt;br /&gt;
 *        cmd -&amp;gt; Command&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void I2C_GPS_write_cmd(uint8_t reg, uint8_t cmd)&lt;br /&gt;
{&lt;br /&gt;
	if((reg &amp;lt; INIT_CFG) || (reg &amp;gt; TEST_MODE)) return;&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_GPS_RECEIVER_ADR, reg, cmd);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Reads a single register reg from the I2C GPS&lt;br /&gt;
 * Receiver.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: reg -&amp;gt; Read register [0x20..0x50]&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
uint8_t I2C_GPS_read_reg(uint8_t reg)&lt;br /&gt;
{&lt;br /&gt;
	if((reg &amp;lt; WHO_AM_I) || (reg &amp;gt; HEARTBEAT)) reg = WHO_AM_I;&lt;br /&gt;
	I2CTWI_transmitByte(I2C_GPS_RECEIVER_ADR, reg);&lt;br /&gt;
	return (I2CTWI_readByte(I2C_GPS_RECEIVER_ADR));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
gpsdata_t gpsdata;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Reads the GPS data from the I2C GPS Receiver.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: length -&amp;gt; Number of data bytes [1..48]&lt;br /&gt;
 *&lt;br /&gt;
 * Hint: If length = DATA_BASIC, only basic GPS&lt;br /&gt;
 *       data are read. If length = DATA_LENGTH,&lt;br /&gt;
 *       ALL GPS data are read.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void I2C_GPS_read(uint8_t length)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t i;&lt;br /&gt;
&lt;br /&gt;
	if(length &amp;gt; DATA_LENGTH) length = DATA_LENGTH;&lt;br /&gt;
	I2CTWI_readRegisters(I2C_GPS_RECEIVER_ADR, DATA_STRUCT, gpsdataBuf, length);&lt;br /&gt;
	for(i = length; i &amp;lt; DATA_LENGTH; i++) {&lt;br /&gt;
		gpsdataBuf[i] = 0;&lt;br /&gt;
	}&lt;br /&gt;
	gpsdata.latDeg = gpsdataBuf[0];&lt;br /&gt;
	gpsdata.latMin = gpsdataBuf[1];&lt;br /&gt;
	gpsdata.latMinDec = gpsdataBuf[2] + (gpsdataBuf[3] &amp;lt;&amp;lt; 8);&lt;br /&gt;
	gpsdata.lonDeg = gpsdataBuf[4];&lt;br /&gt;
	gpsdata.lonMin = gpsdataBuf[5];&lt;br /&gt;
	gpsdata.lonMinDec = gpsdataBuf[6] + (gpsdataBuf[7] &amp;lt;&amp;lt; 8);&lt;br /&gt;
	gpsdata.status.byte = gpsdataBuf[8];&lt;br /&gt;
	gpsdata.fixInd.byte = gpsdataBuf[9];&lt;br /&gt;
	gpsdata.hdop = gpsdataBuf[10];&lt;br /&gt;
	gpsdata.hdopDec = gpsdataBuf[11];&lt;br /&gt;
	gpsdata.satCount = gpsdataBuf[12];&lt;br /&gt;
	if(length == DATA_BASIC) return;&lt;br /&gt;
	gpsdata.course = gpsdataBuf[13] + (gpsdataBuf[14] &amp;lt;&amp;lt; 8);&lt;br /&gt;
	gpsdata.courseDec = gpsdataBuf[15];&lt;br /&gt;
	gpsdata.speed = gpsdataBuf[16] + (gpsdataBuf[17] &amp;lt;&amp;lt; 8);&lt;br /&gt;
	gpsdata.speedDec = gpsdataBuf[18];&lt;br /&gt;
	gpsdata.altitude = gpsdataBuf[19] + (gpsdataBuf[20] &amp;lt;&amp;lt; 8);&lt;br /&gt;
	gpsdata.altDif = gpsdataBuf[21] + (gpsdataBuf[22] &amp;lt;&amp;lt; 8);&lt;br /&gt;
	gpsdata.utcHour = gpsdataBuf[23];&lt;br /&gt;
	gpsdata.utcMinute = gpsdataBuf[24];&lt;br /&gt;
	gpsdata.utcSec = gpsdataBuf[25];&lt;br /&gt;
	gpsdata.day = gpsdataBuf[26];&lt;br /&gt;
	gpsdata.year = gpsdataBuf[27] + (gpsdataBuf[28] * 100);&lt;br /&gt;
	gpsdata.month = gpsdataBuf[29];&lt;br /&gt;
	gpsdata.pdop = gpsdataBuf[30];&lt;br /&gt;
	gpsdata.pdopDec = gpsdataBuf[31];&lt;br /&gt;
	gpsdata.vdop = gpsdataBuf[32];&lt;br /&gt;
	gpsdata.vdopDec = gpsdataBuf[33];&lt;br /&gt;
	for(i = 34; i &amp;lt; 46; i++) {&lt;br /&gt;
		gpsdata.sat[i - 34] = gpsdataBuf[i];&lt;br /&gt;
	}&lt;br /&gt;
	gpsdata.swVersion = gpsdataBuf[46];&lt;br /&gt;
	gpsdata.heartbeat = gpsdataBuf[47];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * You MUST call this function at the beginning of a&lt;br /&gt;
 * main program, that uses the RP6 I2C GPS Receiver. &lt;br /&gt;
 * If SENSOR_BOARD is defined, the I2C-MODULE power&lt;br /&gt;
 * will be switched on with the function&lt;br /&gt;
 * setI2CModulePower() defined in the&lt;br /&gt;
 * RP6M256_Sensor_BoardLib, which will be included&lt;br /&gt;
 * then.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void I2C_GPS_init(void)&lt;br /&gt;
{&lt;br /&gt;
#ifdef SENSOR_BOARD&lt;br /&gt;
	// I2C-MODULE (plug M1) power on: &lt;br /&gt;
	setI2CModulePower(1);&lt;br /&gt;
#endif&lt;br /&gt;
	// Other init procedures here!&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Writes a new I2C address to the I2C GPS Receiver.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: addr -&amp;gt; New I2C address [0xc8..0xde]&lt;br /&gt;
 *&lt;br /&gt;
 * Hints: - Default I2C address is 0xc8.&lt;br /&gt;
 *        - You may choose a new I2C address in&lt;br /&gt;
 *          the range 0xc8..0xde.&lt;br /&gt;
 *        - After writing a new address you have&lt;br /&gt;
 *          to switch the I2C GPS Receiver off&lt;br /&gt;
 *          and on again.&lt;br /&gt;
 *        - Definition I2C_GPS_RECEIVER_ADR must&lt;br /&gt;
 *          be adapted to the new I2C address!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void I2C_GPS_new_addr(uint8_t addr)&lt;br /&gt;
{&lt;br /&gt;
	if((addr &amp;lt; 0xc8) || (addr &amp;gt; 0xde)) return;&lt;br /&gt;
	addr &amp;amp;= 0xfe;								// Clear R/W bit&lt;br /&gt;
	I2CTWI_transmit3Bytes(I2C_GPS_RECEIVER_ADR, 0, 0x04, addr);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&lt;br /&gt;
/******************************************************************************&lt;br /&gt;
 * Additional info&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Changelog:&lt;br /&gt;
 * - v. 1.0 (initial release) 21.04.2014 by Dirk&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Erklärung&lt;br /&gt;
&lt;br /&gt;
======Demo======&lt;br /&gt;
makefile:&lt;br /&gt;
&amp;lt;pre&amp;gt;...&lt;br /&gt;
TARGET = RP6M256_Sensor_Board_02&lt;br /&gt;
...&lt;br /&gt;
SRC += $(RP6_LIB_PATH)/RP6common/RP6I2CmasterTWI.c&lt;br /&gt;
&lt;br /&gt;
SRC += $(RP6_LIB_PATH)/RP6control_M256_WIFI/RP6M256_Sensor_BoardLib.c&lt;br /&gt;
SRC += $(RP6_LIB_PATH)/RP6control_M256_WIFI/RP6M256_I2C_GPSLib.c&lt;br /&gt;
...&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Datei: RP6M256_Sensor_Board_02.c&lt;br /&gt;
&amp;lt;pre&amp;gt;/* &lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * RP6 ROBOT SYSTEM - RP6 CONTROL M256 Examples&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Example: RP6M256 Sensor Board&lt;br /&gt;
 * Author(s): Dirk&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Description:&lt;br /&gt;
 * In this example we show a second test for the RP6 Sensor Board.&lt;br /&gt;
 * &lt;br /&gt;
 * ############################################################################&lt;br /&gt;
 * The Robot does NOT move in this example! You can simply put it on a table&lt;br /&gt;
 * next to your PC and you should connect it to the PC via the USB Interface!&lt;br /&gt;
 * You should also connect to it via WIFI.&lt;br /&gt;
 * ############################################################################&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Includes:&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6M256Lib.h&amp;quot; 				// The RP6 M256 Library. &lt;br /&gt;
										// Always needs to be included!&lt;br /&gt;
#include &amp;quot;RP6I2CmasterTWI.h&amp;quot;			// Include the I2C-Bus Master Library&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Include our new &amp;quot;RP6M256 I2C GPS Receiver library&amp;quot;:&lt;br /&gt;
// (This is the library for accessing the RP6 I2C GPS Receiver!)&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6M256_I2C_GPSLib.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Write a floating point number to the WIFI.&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *&lt;br /&gt;
 *			// Write a floating point number to the WIFI (no exponent):&lt;br /&gt;
 *			writeDouble_WIFI(1234567.890, 11, 3);&lt;br /&gt;
 *&lt;br /&gt;
 * The value of prec (precision) defines the number of decimal places.&lt;br /&gt;
 * For 32 bit floating point variables (float, double ...) 6 is&lt;br /&gt;
 * the max. value for prec (7 relevant digits).&lt;br /&gt;
 * The value of width defines the overall number of characters in the&lt;br /&gt;
 * floating point number including the decimal point. The number of&lt;br /&gt;
 * pre-decimal positions is: (width - prec - 1).&lt;br /&gt;
 */&lt;br /&gt;
void writeDouble_WIFI(double number, uint8_t width, uint8_t prec)&lt;br /&gt;
{char buffer[width + 1];&lt;br /&gt;
	dtostrf(number, width, prec, &amp;amp;buffer[0]);&lt;br /&gt;
	writeString_WIFI(&amp;amp;buffer[0]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Write a floating point number to the LCD.&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *&lt;br /&gt;
 *			// Write a floating point number to the LCD (no exponent):&lt;br /&gt;
 *			writeDoubleLCD(1234567.890, 11, 3);&lt;br /&gt;
 *&lt;br /&gt;
 * The value of prec (precision) defines the number of decimal places.&lt;br /&gt;
 * For 32 bit floating point variables (float, double ...) 6 is&lt;br /&gt;
 * the max. value for prec (7 relevant digits).&lt;br /&gt;
 * The value of width defines the overall number of characters in the&lt;br /&gt;
 * floating point number including the decimal point. The number of&lt;br /&gt;
 * pre-decimal positions is: (width - prec - 1).&lt;br /&gt;
 */&lt;br /&gt;
void writeDoubleLCD(double number, uint8_t width, uint8_t prec)&lt;br /&gt;
{char buffer[width + 1];&lt;br /&gt;
	dtostrf(number, width, prec, &amp;amp;buffer[0]);&lt;br /&gt;
	writeStringLCD(&amp;amp;buffer[0]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Error handler&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function gets called automatically if there was an I2C Error like&lt;br /&gt;
 * the slave sent a &amp;quot;not acknowledge&amp;quot; (NACK, error codes e.g. 0x20 or 0x30).&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void I2C_transmissionError(uint8_t errorState)&lt;br /&gt;
{&lt;br /&gt;
	writeString_P_WIFI(&amp;quot;\nI2C ERROR - TWI STATE: 0x&amp;quot;);&lt;br /&gt;
	writeInteger_WIFI(errorState, HEX);&lt;br /&gt;
	writeChar_WIFI('\n');&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Main function - The program starts here:&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
	initRP6M256();    // Always call this first! The Processor will not work&lt;br /&gt;
					  // correctly otherwise. &lt;br /&gt;
&lt;br /&gt;
	initLCD(); // Initialize the LC-Display (LCD)&lt;br /&gt;
			   // Always call this before using the LCD!&lt;br /&gt;
&lt;br /&gt;
	setLEDs(0b1111);&lt;br /&gt;
	mSleep(500);&lt;br /&gt;
	setLEDs(0b0000);&lt;br /&gt;
&lt;br /&gt;
	writeString_P_WIFI(&amp;quot;\n\nRP6 Sensor Board Selftest 2!\n&amp;quot;); &lt;br /&gt;
&lt;br /&gt;
	// IMPORTANT:&lt;br /&gt;
	I2CTWI_initMaster(100); // Initialize the TWI Module for Master operation&lt;br /&gt;
							// with 100kHz SCL Frequency&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	// Register the event handler:&lt;br /&gt;
	I2CTWI_setTransmissionErrorHandler(I2C_transmissionError);&lt;br /&gt;
&lt;br /&gt;
	setLEDs(0b1111);&lt;br /&gt;
&lt;br /&gt;
	// Write a text message to the LCD:&lt;br /&gt;
	showScreenLCD(&amp;quot;################&amp;quot;, &amp;quot;################&amp;quot;);&lt;br /&gt;
	mSleep(1500);&lt;br /&gt;
	showScreenLCD(&amp;quot;RP6v2-M256-WIFI &amp;quot;, &amp;quot;Example Program&amp;quot;);&lt;br /&gt;
	mSleep(2500); &lt;br /&gt;
	showScreenLCD(&amp;quot;RP6 Sensor Board&amp;quot;, &amp;quot;   Selftest 2&amp;quot;);&lt;br /&gt;
	mSleep(2500);&lt;br /&gt;
	clearLCD();&lt;br /&gt;
&lt;br /&gt;
	setLEDs(0b0000);&lt;br /&gt;
&lt;br /&gt;
	// ---------------------------------------&lt;br /&gt;
&lt;br /&gt;
	uint8_t onoff = 0;&lt;br /&gt;
	uint8_t i;&lt;br /&gt;
&lt;br /&gt;
	startStopwatch1();&lt;br /&gt;
	startStopwatch2();&lt;br /&gt;
&lt;br /&gt;
	// IMPORTANT:&lt;br /&gt;
	sensor_board_init();						// RP6 Sensor Board init!!!&lt;br /&gt;
	I2C_GPS_init();								// RP6 I2C GPS Receiver init&lt;br /&gt;
&lt;br /&gt;
	while(true) &lt;br /&gt;
	{&lt;br /&gt;
		if(getStopwatch1() &amp;gt; 1000) // 1s&lt;br /&gt;
		{&lt;br /&gt;
			if (onoff) onoff = 0;&lt;br /&gt;
			else onoff = 1;&lt;br /&gt;
&lt;br /&gt;
			// Show GPS data:&lt;br /&gt;
			I2C_GPS_read(DATA_LENGTH);			// Read data&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nLAT_DEG:     &amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.latDeg, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;° &amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.latMin, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;.&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.latMinDec, DEC, 4);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;' &amp;quot;);&lt;br /&gt;
			if(gpsdata.status.ns)&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;N&amp;quot;);&lt;br /&gt;
			else&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;S&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nLON_DEG:    &amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.lonDeg, DEC, 3);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;° &amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.lonMin, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;.&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.lonMinDec, DEC, 4);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;' &amp;quot;);&lt;br /&gt;
			if(gpsdata.status.ew)&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;E&amp;quot;);&lt;br /&gt;
			else&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;W&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nSTATUS:     &amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.status.byte, BIN, 8);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nFIX_IND:    &amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.fixInd.byte, BIN, 8);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nHDOP:       &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(gpsdata.hdop, DEC);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;.&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.hdopDec, DEC, 2);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nSAT_N:      &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(gpsdata.satCount, DEC);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nCOURSE_T:   &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(gpsdata.course, DEC);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;.&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.courseDec, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;°&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nSPEED:      &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(gpsdata.speed, DEC);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;.&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.speedDec, DEC, 2);&lt;br /&gt;
			if(gpsdata.status.spu)&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;km/h&amp;quot;);&lt;br /&gt;
			else&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;kn&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nALT:        &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(gpsdata.altitude, DEC);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;m\nALT_DIF:    &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(gpsdata.altDif, DEC);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;m\nUTC:        &amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.utcHour, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;:&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.utcMinute, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;:&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.utcSec, DEC, 2);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nDATE:       &amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.day, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;.&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.month, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;.&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.year, DEC, 4);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nPDOP:       &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(gpsdata.pdop, DEC);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;.&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.pdopDec, DEC, 2);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nVDOP:       &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(gpsdata.vdop, DEC);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;.&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.vdopDec, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			for(i = 0; i &amp;lt; gpsdata.satCount; i++) {&lt;br /&gt;
				if(i == 8) writeString_P_WIFI(&amp;quot;\n&amp;quot;);&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;  SAT_&amp;quot;);&lt;br /&gt;
				writeIntegerLength_WIFI(i + 1, HEX, 1);&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;: &amp;quot;);&lt;br /&gt;
				writeInteger_WIFI(gpsdata.sat[i], DEC);&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nSW_VERSION: &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(gpsdata.swVersion, DEC);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nHEARTBEAT:  &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(gpsdata.heartbeat, DEC);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			// RP6 Sensor Board shutdown (button &amp;amp; status LED test):&lt;br /&gt;
			if (pressedButton) {&lt;br /&gt;
				setStatusLED(1);&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;\nPress button again for RP6 Sensor Board SHUTDOWN!\n&amp;quot;);&lt;br /&gt;
				mSleep(2000);&lt;br /&gt;
				do {&lt;br /&gt;
					if(getStopwatch2() &amp;gt; 200) { // 0.2s&lt;br /&gt;
						if (onoff) onoff = 0;&lt;br /&gt;
						else onoff = 1;&lt;br /&gt;
						if (onoff) setStatusLED(1);&lt;br /&gt;
						else setStatusLED(0);&lt;br /&gt;
						setStopwatch2(0);&lt;br /&gt;
					}&lt;br /&gt;
					mSleep(1);&lt;br /&gt;
					task_I2CTWI();&lt;br /&gt;
				} while (!readButton());&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;\n\n\n\n\nPlease wait for RP6 Sensor Board SHUTDOWN...\n&amp;quot;);&lt;br /&gt;
				sensor_board_shutdown();&lt;br /&gt;
				mSleep(3000);&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;\n\n\nThe RP6 Sensor Board now is in SHUTDOWN MODE!!!\n&amp;quot;);&lt;br /&gt;
				mSleep(1000);&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;\nRESET the M256 microcontroller now...\n\n&amp;quot;);&lt;br /&gt;
				while(true) {};&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			setStopwatch1(0);&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		task_RP6SensorBoard();					// RP6 Sensor Board task&lt;br /&gt;
&lt;br /&gt;
		task_I2CTWI();&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Erklärung&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Gyro Modul JM3-GYRO====&lt;br /&gt;
=====Dokumentation=====&lt;br /&gt;
Die Dokumentation zum Gyro Modul befindet sich auf der mitgelieferten ''&amp;quot;RP6 Robot System Xtra Modules CD-ROM&amp;quot;''.&lt;br /&gt;
&lt;br /&gt;
======Manuals======&lt;br /&gt;
Das Handbuch in der aktuellen Version kann [http://www.jm3-engineering.com/download/doc/ManualGyroModule_de.pdf hier] eingesehen werden.&lt;br /&gt;
&lt;br /&gt;
=====Demo-Programme=====&lt;br /&gt;
Ein Demo-Programm zum Gyro Modul befindet sich integriert in die RP6 Sensor Board Demo auf der mitgelieferten ''&amp;quot;RP6 Robot System Xtra Modules CD-ROM&amp;quot;''. Diese Demo kann auch in der aktuellen Version im Download Bereich von [http://www.jm3-engineering.com/downloads.htm JM3 Engineering] herunter geladen werden.&lt;br /&gt;
&lt;br /&gt;
=====Analoge Auswertung=====&lt;br /&gt;
Am Pin ''OUT'' des Gyro Moduls (siehe [http://www.rn-wissen.de/index.php/RP6_Sensor_Board_und_Xtra_Module#Anschluss-Schema_2 Anschluss-Schema]!) liegt die Ausgangsspannung des Sensors (0..5V) an. Sie kann mit einem ADC-Eingang eines Microcontrollers gemessen werden.&lt;br /&gt;
Syntax mit den Libraries der RP6Base, M32 oder M256 WiFi (ADC Kanal 0):&lt;br /&gt;
 uint16_t result = readADC(0);&lt;br /&gt;
In der C-Control-Pro Umgebung der M128 sieht das z.B. in CompactC so aus (ADC Kanal 0):&lt;br /&gt;
 word result;&lt;br /&gt;
 ADC_Set(ADC_VREF_VCC, 0);&lt;br /&gt;
 ...&lt;br /&gt;
 result = ADC_Read();&lt;br /&gt;
Das Ergebnis ''result'' kann noch zur Weiterverarbeitung angepasst werden:&lt;br /&gt;
 #define ADCVAL_ZERORATE_LEVEL			511		// Zero rate Level&lt;br /&gt;
 ...&lt;br /&gt;
 int16_t z_axisg = result - ADCVAL_ZERORATE_LEVEL;&lt;br /&gt;
Dadurch zeigt ''z_axisg'' Null an, wenn keine Rotation anliegt und wird positiv, wenn nach LINKS gedreht wird und negativ bei RECHTS-Drehung. Die Definition ADCVAL_ZERORATE_LEVEL muss natürlich an den eigenen Sensor-Nullwert angepasst werden.&lt;br /&gt;
&lt;br /&gt;
Aus dem Absolutwert von ''z_axisg'' kann man die Drehrate (Drehgeschwindigkeit) auch bestimmen:&lt;br /&gt;
&lt;br /&gt;
In den [[RP6_Sensor_Board_und_Xtra_Module#Technische_Daten_3|Technischen Daten]] ist die Empfindlichkeit des Sensors mit '''10mV/dps''' (0,01V pro Grad und Sekunde) angegeben. Damit errechnet sich die Drehrate als:&lt;br /&gt;
 Drehrate [dps] = abs(z_axisg) * (5 / 1024 / 0.01) = abs(z_axisg) * 0.48828125&lt;br /&gt;
&lt;br /&gt;
=====Optionale Ansteuerung=====&lt;br /&gt;
Im [[RP6_Sensor_Board_und_Xtra_Module#Anschluss-Schema_2|Anschluss-Schema]] ist erkennbar, dass es noch 2 Steuerleitungen ''SLEEP/PD'' und ''ST'' gibt. Mit diesen Anschlüssen kann die Betriebsart des Gyro Moduls festgelegt werden, siehe nachfolgende Tabelle:&lt;br /&gt;
{|  {{Blauetabelle}} &lt;br /&gt;
|Betriebsart&lt;br /&gt;
|ST&lt;br /&gt;
|SLEEP/PD&lt;br /&gt;
|Stromverbrauch&lt;br /&gt;
|-&lt;br /&gt;
|Normal&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|4,2mA&lt;br /&gt;
|-&lt;br /&gt;
|Sleep&lt;br /&gt;
|0&lt;br /&gt;
|1&lt;br /&gt;
|2,2mA&lt;br /&gt;
|-&lt;br /&gt;
|Self-test&lt;br /&gt;
|1&lt;br /&gt;
|0&lt;br /&gt;
|4,2mA&lt;br /&gt;
|-&lt;br /&gt;
|Power-down&lt;br /&gt;
|1&lt;br /&gt;
|1&lt;br /&gt;
|'''5µA'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
Will man zwischen den Betriebsarten per Software umschalten, muss man die beiden Steuerleitungen mit I/O Portpins des Microcontrollers verbinden, die als Ausgänge konfiguriert sind. Braucht man diese Funktion nicht, reicht es, ''ST'' und ''SLEEP/PD'' mit GND zu verbinden (Betriebsart &amp;quot;Normal&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====3D Accelerometer Modul JM3-3DA====&lt;br /&gt;
Das 3D Accelerometer Modul kann über den I2C- oder den SPI-Bus angesteuert werden. Wird das Modul auf der RP6 CONTROL M32 Platine betrieben (es sitzt also auf dem Sockel IC5 für das 2. SPI-EEPROM), dann erfolgt die Ansteuerung über den SPI-Bus. Die SPI-Grundfunktionen befinden sich in der RP6ControlLib, die daher eingebunden werden muss.&lt;br /&gt;
&lt;br /&gt;
=====Dokumentation=====&lt;br /&gt;
Die Dokumentation zum 3D Accelerometer Modul befindet sich auf der mitgelieferten ''&amp;quot;RP6 Robot System Xtra Modules CD-ROM&amp;quot;''.&lt;br /&gt;
&lt;br /&gt;
======Manuals======&lt;br /&gt;
Das Handbuch in der aktuellen Version kann [http://www.jm3-engineering.com/download/doc/Manual3DAccelerometer_de.pdf hier] eingesehen werden.&lt;br /&gt;
&lt;br /&gt;
=====Demo-Programme=====&lt;br /&gt;
Ein Demo-Programm zum 3D Accelerometer Modul befindet sich integriert in die RP6 Sensor Board Demo auf der mitgelieferten ''&amp;quot;RP6 Robot System Xtra Modules CD-ROM&amp;quot;''. Diese Demo kann auch in der aktuellen Version im Download Bereich von [http://www.jm3-engineering.com/downloads.htm JM3 Engineering] herunter geladen werden.&lt;br /&gt;
&lt;br /&gt;
=====RP6 CONTROL M32: ACCSENS Library=====&lt;br /&gt;
Die nachfolgende RP6ControlACCSENSLib (Eigenentwicklung in GCC) dient zur Ansteuerung des 3D Accelerometer Moduls durch die RP6 CONTROL M32.&lt;br /&gt;
&lt;br /&gt;
======Configuration Header======&lt;br /&gt;
Vor dem Kompilieren der Library muss eine Anpassung des Configuration Headers an die eigenen Hardware-Voraussetzungen erfolgen.&lt;br /&gt;
Dazu gibt es im Configuration Header eine Definition:&lt;br /&gt;
* EXP_STACK_1 -&amp;gt; Die RP6 CONTROL M32 sitzt auf dem vorderen Platinenstapel 1 des RP6&lt;br /&gt;
Im nachfolgenden Listing ist die Definition EXP_STACK_1 NICHT aktiv (d.h. die M32 sitzt auf dem hinteren Platinenstapel 2!). Dies muss an die eigene Hardware angepaßt werden. Wenn die RP6 CONTROL M32 auf dem vorderen Platinenstapel 1 des RP6 sitzt, muss die Zeile mit &amp;quot;EXP_STACK_1&amp;quot; &amp;quot;aktiviert&amp;quot; werden. Dazu entfernt man &amp;quot;//&amp;quot; am Zeilenanfang:&lt;br /&gt;
 #define EXP_STACK_1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Bevor man den Beschleunigungssensor nutzen kann, muss man ihn kalibrieren:&lt;br /&gt;
&lt;br /&gt;
'''Accelerometer:'''&lt;br /&gt;
* Die X-Achse wird kalibriert, indem man den RP6 mit der rechten Seite nach unten hält und den Maximalwert in MAX_X_A einträgt. Dann neigt man ihn auf seine linke Seite und trägt den negativen Maximalwert in MIN_X_A ein.&lt;br /&gt;
* Die Y-Achse wird kalibriert, indem man den RP6 mit der Vorderseite nach oben hält und den Maximalwert in MAX_Y_A einträgt. Dann kippt man die Vorderseite nach unten und trägt den negativen Maximalwert in MIN_Y_A ein.&lt;br /&gt;
* Die Z-Achse wird kalibriert, indem man den RP6 normal waagerecht hält und den Maximalwert in MAX_Z_A einträgt. Dann dreht man den RP6 &amp;quot;auf den Kopf&amp;quot; und trägt den negativen Maximalwert in MIN_Z_A ein.&lt;br /&gt;
* Sollten die angezeigten Pitch- und Roll-Werte nach der Kalibrierung der Achsen und genau waagerecht stehendem Sensor bzw. RP6 vom Nullwert deutlich abweichen, kann man sie mithilfe der Definitionen OFFSET_PITCH_A und OFFSET_ROLL_A &amp;quot;nullen&amp;quot;. Die Einheit dieser Definitionen ist °.&lt;br /&gt;
Nach dem Eintragen der Kalibrierungswerte muss das Programm neu kompiliert werden!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Datei: RP6ControlACCSENS.h&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;/* ****************************************************************************&lt;br /&gt;
 *                           _______________________&lt;br /&gt;
 *                           \| RP6  ROBOT SYSTEM |/&lt;br /&gt;
 *                            \_-_-_-_-_-_-_-_-_-_/             &amp;gt;&amp;gt;&amp;gt; RP6 CONTROL&lt;br /&gt;
 * ----------------------------------------------------------------------------&lt;br /&gt;
 * ----------------------------- [c]2014 - Dirk -------------------------------&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * File: RP6ControlACCSENS.h&lt;br /&gt;
 * Version: 1.0&lt;br /&gt;
 * Target: RP6 CONTROL - ATMEGA32 @16.00MHz&lt;br /&gt;
 * Author(s): Dirk&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Description:&lt;br /&gt;
 * Configuration header file for new ACCSENS library.&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * THE CHANGELOG CAN BE FOUND AT THE END OF THIS FILE!&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
#ifndef RP6CONTROLACCSENS_H&lt;br /&gt;
#define RP6CONTROLACCSENS_H&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Sensor position on the RP6 robot:&lt;br /&gt;
// (If EXP_STACK_1 is defined, the RP6 CONTROL M32 is located on the front&lt;br /&gt;
//  stack for addon boards on the RP6 robot. If EXP_STACK_1 is NOT defined&lt;br /&gt;
//  (default), the RP6 CONTROL M32 is mounted on the rear stack.)&lt;br /&gt;
// -------------------&lt;br /&gt;
//#define EXP_STACK_1&lt;br /&gt;
// -------------------&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// The following sensor is used:&lt;br /&gt;
// - 3D Accelerometer Modul (CONRAD 1082387-62) with LIS302DLH 3-axis&lt;br /&gt;
//   accelerometer&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// LIS302DLH accelerometer calibration data:&lt;br /&gt;
#define MAX_X_A						32767		// Max. X-axis value&lt;br /&gt;
#define MIN_X_A						-32768		// Min. X-axis value&lt;br /&gt;
#define MAX_Y_A						32767		// Max. Y-axis value&lt;br /&gt;
#define MIN_Y_A						-32768		// Min. Y-axis value&lt;br /&gt;
#define MAX_Z_A						32767		// Max. Z-axis value&lt;br /&gt;
#define MIN_Z_A						-32768		// Min. Z-axis value&lt;br /&gt;
#define OFFSET_PITCH_A				0.0			// Offset Pitch [°]&lt;br /&gt;
#define OFFSET_ROLL_A				0.0			// Offset Roll [°]&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
/******************************************************************************&lt;br /&gt;
 * Additional info&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Changelog:&lt;br /&gt;
 * &lt;br /&gt;
 *  ---&amp;gt; changes are documented in the file &amp;quot;RP6ControlACCSENSLib.c&amp;quot;&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
======Library Header======&lt;br /&gt;
Datei: RP6ControlACCSENSLib.h&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;/* ****************************************************************************&lt;br /&gt;
 *                           _______________________&lt;br /&gt;
 *                           \| RP6  ROBOT SYSTEM |/&lt;br /&gt;
 *                            \_-_-_-_-_-_-_-_-_-_/             &amp;gt;&amp;gt;&amp;gt; RP6 CONTROL&lt;br /&gt;
 * ----------------------------------------------------------------------------&lt;br /&gt;
 * ----------------------------- [c]2014 - Dirk -------------------------------&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * File: RP6ControlACCSENSLib.h&lt;br /&gt;
 * Version: 1.0&lt;br /&gt;
 * Target: RP6 CONTROL - ATMEGA32 @16.00MHz&lt;br /&gt;
 * Author(s): Dirk&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Description:&lt;br /&gt;
 * This is the RP6ControlACCSENSLib header file.&lt;br /&gt;
 * You have to include this file, if you want to use the library&lt;br /&gt;
 * RP6ControlACCSENSLib.c in your own projects.&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * THE CHANGELOG CAN BE FOUND AT THE END OF THIS FILE!&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
#ifndef RP6CONTROLACCSENSLIB_H&lt;br /&gt;
#define RP6CONTROLACCSENSLIB_H&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Includes:&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6ControlLib.h&amp;quot; 		// The RP6 Control Library (v. 1.1 or higher). &lt;br /&gt;
#include &amp;quot;RP6ControlACCSENS.h&amp;quot;&lt;br /&gt;
#include &amp;lt;math.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&lt;br /&gt;
#define ACC_CS							MEM_CS2&lt;br /&gt;
#define DEVICE_IDENTIFIER				0x32&lt;br /&gt;
&lt;br /&gt;
// Registers:&lt;br /&gt;
#define WHO_AM_I						0x0f&lt;br /&gt;
#define CTRL_REG1						0x20&lt;br /&gt;
#define CTRL_REG2						0x21&lt;br /&gt;
#define CTRL_REG3						0x22&lt;br /&gt;
#define CTRL_REG4						0x23&lt;br /&gt;
#define CTRL_REG5						0x24&lt;br /&gt;
#define HP_FILTER_RESET					0x25&lt;br /&gt;
#define REFERENCE						0x26&lt;br /&gt;
#define STATUS_REG						0x27&lt;br /&gt;
#define OUT_X_L							0x28&lt;br /&gt;
#define OUT_X_H							0x29&lt;br /&gt;
#define OUT_Y_L							0x2a&lt;br /&gt;
#define OUT_Y_H							0x2b&lt;br /&gt;
#define OUT_Z_L							0x2c&lt;br /&gt;
#define OUT_Z_H							0x2d&lt;br /&gt;
#define INT1_CFG						0x30&lt;br /&gt;
#define INT1_SOURCE						0x31&lt;br /&gt;
#define INT1_THS						0x32&lt;br /&gt;
#define INT1_DURATION					0x33&lt;br /&gt;
#define INT2_CFG						0x34&lt;br /&gt;
#define INT2_SOURCE						0x35&lt;br /&gt;
#define INT2_THS						0x36&lt;br /&gt;
#define INT2_DURATION					0x37&lt;br /&gt;
&lt;br /&gt;
// Control Register bitmasks:&lt;br /&gt;
#define CTRL_REG1_POWERDOWN				0b00000000&lt;br /&gt;
#define CTRL_REG1_3D_DEFAULT			0b00000111&lt;br /&gt;
#define CTRL_REG1_3D_LOPWR_10HZ			0b11000111&lt;br /&gt;
#define CTRL_REG2_DEFAULT				0b00000000&lt;br /&gt;
#define CTRL_REG3_DEFAULT				0b00000000&lt;br /&gt;
#define CTRL_REG4_DEFAULT				0b00000000&lt;br /&gt;
#define CTRL_REG4_BDU_2G				0b10000000&lt;br /&gt;
#define CTRL_REG4_BDU_2G_STSIGN			0b10001000&lt;br /&gt;
#define CTRL_REG4_BDU_BLE_2G			0b11000000&lt;br /&gt;
#define CTRL_REG4_BDU_BLE_2G_STSIGN		0b11001000&lt;br /&gt;
#define CTRL_REG5_DEFAULT				0b00000000&lt;br /&gt;
&lt;br /&gt;
// Read/write address bitmasks:&lt;br /&gt;
#define READ_MASK						0b10000000&lt;br /&gt;
#define READ_AUTOINC_MASK				0b11000000&lt;br /&gt;
#define WRITE_MASK						0b01111111&lt;br /&gt;
&lt;br /&gt;
extern int16_t x_axisa, y_axisa, z_axisa;&lt;br /&gt;
extern double pitch, roll;&lt;br /&gt;
extern double xa, ya, za;&lt;br /&gt;
extern double the, phi;&lt;br /&gt;
&lt;br /&gt;
uint8_t SPI_ACCSENS_readByte(uint8_t regAddr);&lt;br /&gt;
void SPI_ACCSENS_readBytes(uint8_t startAddr, uint8_t *buffer, uint8_t length);&lt;br /&gt;
void SPI_ACCSENS_writeByte(uint8_t regAddr, uint8_t data);&lt;br /&gt;
uint8_t SPI_ACCSENS_getStatus(void);&lt;br /&gt;
&lt;br /&gt;
void SPI_ACCSENS_init(void);&lt;br /&gt;
void SPI_ACCSENS_shutdown(void);&lt;br /&gt;
void SPI_ACCSENS_read(void);&lt;br /&gt;
void SPI_ACCSENS_normalize(void);&lt;br /&gt;
void SPI_ACCSENS_position(void);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
/******************************************************************************&lt;br /&gt;
 * Additional info&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Changelog:&lt;br /&gt;
 * &lt;br /&gt;
 *  ---&amp;gt; changes are documented in the file &amp;quot;RP6ControlACCSENSLib.c&amp;quot;&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
======Library Source======&lt;br /&gt;
Datei: RP6ControlACCSENSLib.c&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;/* ****************************************************************************&lt;br /&gt;
 *                           _______________________&lt;br /&gt;
 *                           \| RP6  ROBOT SYSTEM |/&lt;br /&gt;
 *                            \_-_-_-_-_-_-_-_-_-_/             &amp;gt;&amp;gt;&amp;gt; RP6 CONTROL&lt;br /&gt;
 * ----------------------------------------------------------------------------&lt;br /&gt;
 * ----------------------------- [c]2014 - Dirk -------------------------------&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * File: RP6ControlACCSENSLib.c&lt;br /&gt;
 * Version: 1.0&lt;br /&gt;
 * Target: RP6 CONTROL - ATMEGA32 @16.00MHz&lt;br /&gt;
 *         with optional LC-Display 16x2 chars (CONRAD 190911-62)&lt;br /&gt;
 *         and a 3D Accelerometer Modul (CONRAD 1082387-62) (IC5)&lt;br /&gt;
 * Author(s): Dirk&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Description:&lt;br /&gt;
 * This is my RP6 Control ACCSENS Library. This library may be used to access&lt;br /&gt;
 * the basic functions of the 3D Accelerometer Modul. This RP6 Xtra module may&lt;br /&gt;
 * be placed on the IC5 socket on the RP6 CONTROL M32 instead of a second&lt;br /&gt;
 * EEPROM.&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * THE CHANGELOG CAN BE FOUND AT THE END OF THIS FILE!&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
 &lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Includes:&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6ControlACCSENSLib.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// SPI functions:&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Reads a single register from the 3D Accelerometer&lt;br /&gt;
 * Modul (ACCSENS).&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
uint8_t SPI_ACCSENS_readByte(uint8_t regAddr)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t data;&lt;br /&gt;
	regAddr |= READ_MASK;						// Read byte&lt;br /&gt;
	PORTB &amp;amp;= ~ACC_CS;&lt;br /&gt;
	writeSPI(regAddr);&lt;br /&gt;
	data = readSPI();&lt;br /&gt;
	PORTB |= ACC_CS;&lt;br /&gt;
	return data;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Reads &amp;quot;length&amp;quot; bytes into the buffer &amp;quot;buffer&amp;quot;&lt;br /&gt;
 * from startAddr on. &lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void SPI_ACCSENS_readBytes(uint8_t startAddr, uint8_t *buffer, uint8_t length)&lt;br /&gt;
{&lt;br /&gt;
	startAddr |= READ_AUTOINC_MASK;				// Read byte, auto increment&lt;br /&gt;
	PORTB &amp;amp;= ~ACC_CS;&lt;br /&gt;
	writeSPI(startAddr);&lt;br /&gt;
	readBufferSPI(&amp;amp;buffer[0], length);&lt;br /&gt;
	PORTB |= ACC_CS;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Write a single data byte to the specified sensor&lt;br /&gt;
 * address.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void SPI_ACCSENS_writeByte(uint8_t regAddr, uint8_t data)&lt;br /&gt;
{&lt;br /&gt;
	PORTB &amp;amp;= ~ACC_CS;&lt;br /&gt;
	writeSPI(regAddr);&lt;br /&gt;
	writeSPI(data);&lt;br /&gt;
	PORTB |= ACC_CS;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Returns sensor status register - for checking if&lt;br /&gt;
 * sensor is busy. &lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
uint8_t SPI_ACCSENS_getStatus(void)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t status;&lt;br /&gt;
	PORTB &amp;amp;= ~ACC_CS;&lt;br /&gt;
	writeSPI(STATUS_REG);&lt;br /&gt;
	status = readSPI();&lt;br /&gt;
	PORTB |= ACC_CS;&lt;br /&gt;
	return status;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// 3D accelerometer functions:&lt;br /&gt;
&lt;br /&gt;
int16_t x_axisa, y_axisa, z_axisa;&lt;br /&gt;
double pitch, roll;&lt;br /&gt;
double xa, ya, za;&lt;br /&gt;
double the, phi;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Initializes the sensor. You must call this&lt;br /&gt;
 * function at the beginning of a program, that&lt;br /&gt;
 * uses the 3D Accelerometer Modul.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void SPI_ACCSENS_init(void)&lt;br /&gt;
{&lt;br /&gt;
	// All axes enable, low power, 10Hz output data rate:&lt;br /&gt;
	SPI_ACCSENS_writeByte(CTRL_REG1, CTRL_REG1_3D_LOPWR_10HZ);&lt;br /&gt;
	// No update while reading, +- 2g, self-test minus:&lt;br /&gt;
	SPI_ACCSENS_writeByte(CTRL_REG4, CTRL_REG4_BDU_2G_STSIGN);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Sets the LIS302DLH power-down mode. If you&lt;br /&gt;
 * do not need the sensor, you can save energy&lt;br /&gt;
 * by using the sensor power-down mode.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void SPI_ACCSENS_shutdown(void)&lt;br /&gt;
{&lt;br /&gt;
	// LIS302DLH in power-down mode:&lt;br /&gt;
	SPI_ACCSENS_writeByte(CTRL_REG1, CTRL_REG1_POWERDOWN);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function reads the X-axis, Y-axis and Z-axis&lt;br /&gt;
 * values from the LIS302DLH accelerometer and stores&lt;br /&gt;
 * them in the global variables x_axisa, y_axisa and&lt;br /&gt;
 * z_axisa.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void SPI_ACCSENS_read(void)&lt;br /&gt;
{&lt;br /&gt;
#ifndef EXP_STACK_1&lt;br /&gt;
	// Default sensor position (M32 located on the RP6 rear stack):&lt;br /&gt;
	// xb = -y:&lt;br /&gt;
	x_axisa = SPI_ACCSENS_readByte(OUT_Y_L) | (SPI_ACCSENS_readByte(OUT_Y_H) &amp;lt;&amp;lt; 8);&lt;br /&gt;
	x_axisa *= -1;&lt;br /&gt;
	// yb = -x:&lt;br /&gt;
	y_axisa = SPI_ACCSENS_readByte(OUT_X_L) | (SPI_ACCSENS_readByte(OUT_X_H) &amp;lt;&amp;lt; 8);&lt;br /&gt;
	y_axisa *= -1;&lt;br /&gt;
	// zb = z:&lt;br /&gt;
	z_axisa = SPI_ACCSENS_readByte(OUT_Z_L) | (SPI_ACCSENS_readByte(OUT_Z_H) &amp;lt;&amp;lt; 8);&lt;br /&gt;
#else&lt;br /&gt;
	// Other sensor position (M32 located on the RP6 front stack):&lt;br /&gt;
	// xb = y:&lt;br /&gt;
	x_axisa = SPI_ACCSENS_readByte(OUT_Y_L) | (SPI_ACCSENS_readByte(OUT_Y_H) &amp;lt;&amp;lt; 8);&lt;br /&gt;
	// yb = x:&lt;br /&gt;
	y_axisa = SPI_ACCSENS_readByte(OUT_X_L) | (SPI_ACCSENS_readByte(OUT_X_H) &amp;lt;&amp;lt; 8);&lt;br /&gt;
	// zb = z:&lt;br /&gt;
	z_axisa = SPI_ACCSENS_readByte(OUT_Z_L) | (SPI_ACCSENS_readByte(OUT_Z_H) &amp;lt;&amp;lt; 8);&lt;br /&gt;
#endif&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function limits and normalizes the x-axisa,&lt;br /&gt;
 * y-axisa and z-axisa values read from the LIS302DLH&lt;br /&gt;
 * accelerometer with the function SPI_ACCSENS_read() and&lt;br /&gt;
 * stores them in the global double variables xa, ya and&lt;br /&gt;
 * za.&lt;br /&gt;
 * It also calculates the position in space in form of the&lt;br /&gt;
 * tilt angles (the = pitch, phi = roll) and stores them&lt;br /&gt;
 * in the global double variables the and phi.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void SPI_ACCSENS_normalize(void)&lt;br /&gt;
{&lt;br /&gt;
	// Limit raw values:&lt;br /&gt;
	if (x_axisa &amp;lt; MIN_X_A) x_axisa = MIN_X_A;&lt;br /&gt;
	if (x_axisa &amp;gt; MAX_X_A) x_axisa = MAX_X_A;&lt;br /&gt;
	if (y_axisa &amp;lt; MIN_Y_A) y_axisa = MIN_Y_A;&lt;br /&gt;
	if (y_axisa &amp;gt; MAX_Y_A) y_axisa = MAX_Y_A;&lt;br /&gt;
	if (z_axisa &amp;lt; MIN_Z_A) z_axisa = MIN_Z_A;&lt;br /&gt;
	if (z_axisa &amp;gt; MAX_Z_A) z_axisa = MAX_Z_A;&lt;br /&gt;
	xa = (double) x_axisa / 10000.0;&lt;br /&gt;
	ya = (double) y_axisa / 10000.0;&lt;br /&gt;
	za = (double) z_axisa / 10000.0;&lt;br /&gt;
	// Calculate Pitch and Roll:&lt;br /&gt;
	phi = asin(xa);								// Calculate the and phi&lt;br /&gt;
	the = asin(ya / cos(the));					//  from the raw values&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function calculates the position in space by&lt;br /&gt;
 * using the the and phi values (see function&lt;br /&gt;
 * SPI_ACCSENS_normalize()!). It stores the position&lt;br /&gt;
 * in the global double variables pitch and roll. &lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void SPI_ACCSENS_position(void)&lt;br /&gt;
{&lt;br /&gt;
	pitch = the * 180 / M_PI + OFFSET_PITCH_A;&lt;br /&gt;
	roll = phi * 180 / M_PI + OFFSET_ROLL_A;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/******************************************************************************&lt;br /&gt;
 * Additional info&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Changelog:&lt;br /&gt;
 * - v. 1.0 (initial release) 04.04.2014 by Dirk&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Erklärung&lt;br /&gt;
&lt;br /&gt;
======Demo======&lt;br /&gt;
makefile:&lt;br /&gt;
&amp;lt;pre&amp;gt;...&lt;br /&gt;
TARGET = RP6Control_01_ACCSENS&lt;br /&gt;
...&lt;br /&gt;
SRC += $(RP6_LIB_PATH)/RP6control/RP6ControlLib.c&lt;br /&gt;
SRC += $(RP6_LIB_PATH)/RP6common/RP6uart.c&lt;br /&gt;
SRC += $(RP6_LIB_PATH)/RP6control/RP6ControlACCSENSLib.c&lt;br /&gt;
...&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Datei: RP6Control_01_ACCSENS.c&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;// Uncommented Version of RP6Control_01_ACCSENS.c&lt;br /&gt;
// written by Dirk&lt;br /&gt;
// ------------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6ControlACCSENSLib.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void writeDouble(double number, uint8_t width, uint8_t prec)&lt;br /&gt;
{char buffer[width + 1];&lt;br /&gt;
	dtostrf(number, width, prec, &amp;amp;buffer[0]);&lt;br /&gt;
	writeString(&amp;amp;buffer[0]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void writeDoubleLCD(double number, uint8_t width, uint8_t prec)&lt;br /&gt;
{char buffer[width + 1];&lt;br /&gt;
	dtostrf(number, width, prec, &amp;amp;buffer[0]);&lt;br /&gt;
	writeStringLCD(&amp;amp;buffer[0]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
	initRP6Control();&lt;br /&gt;
&lt;br /&gt;
	writeString_P(&amp;quot;\n\nRP6Control SPI ACCSENS Test Program!\n&amp;quot;); &lt;br /&gt;
	setLEDs(0b1111);&lt;br /&gt;
	mSleep(50);&lt;br /&gt;
	initLCD(); &lt;br /&gt;
	showScreenLCD(&amp;quot;################&amp;quot;, &amp;quot;################&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
	showScreenLCD(&amp;quot;  SPI ACCSENS&amp;quot;, &amp;quot;  Test Program&amp;quot;);&lt;br /&gt;
	mSleep(1000);&lt;br /&gt;
	setLEDs(0b0000);&lt;br /&gt;
&lt;br /&gt;
	SPI_ACCSENS_init();&lt;br /&gt;
&lt;br /&gt;
	uint8_t whoami = SPI_ACCSENS_readByte(WHO_AM_I);&lt;br /&gt;
	writeString_P(&amp;quot;\nWHO AM I: &amp;quot;);&lt;br /&gt;
	writeInteger(whoami, HEX);&lt;br /&gt;
	writeChar('\n');&lt;br /&gt;
	mSleep(2000);&lt;br /&gt;
	&lt;br /&gt;
	startStopwatch1();&lt;br /&gt;
&lt;br /&gt;
	while(true) &lt;br /&gt;
	{&lt;br /&gt;
		if(getStopwatch1() &amp;gt; 1000)&lt;br /&gt;
		{&lt;br /&gt;
			SPI_ACCSENS_read();&lt;br /&gt;
			writeString_P(&amp;quot;\n3D Accelerometer SENSOR -&amp;gt;\n&amp;quot;);&lt;br /&gt;
			writeString_P(&amp;quot;X-axis: &amp;quot;);&lt;br /&gt;
			writeInteger(x_axisa, DEC);&lt;br /&gt;
			writeChar('\n');&lt;br /&gt;
			writeString_P(&amp;quot;Y-axis: &amp;quot;);&lt;br /&gt;
			writeInteger(y_axisa, DEC);&lt;br /&gt;
			writeChar('\n');&lt;br /&gt;
			writeString_P(&amp;quot;Z-axis: &amp;quot;);&lt;br /&gt;
			writeInteger(z_axisa, DEC);&lt;br /&gt;
			writeChar('\n');&lt;br /&gt;
			SPI_ACCSENS_normalize();&lt;br /&gt;
			SPI_ACCSENS_position();&lt;br /&gt;
			writeString_P(&amp;quot;POSITION: \n&amp;quot;);&lt;br /&gt;
			writeString_P(&amp;quot;  Pitch [°]: &amp;quot;);&lt;br /&gt;
			writeDouble(pitch, 6, 1);&lt;br /&gt;
			writeChar('\n');&lt;br /&gt;
			writeString_P(&amp;quot;  Roll [°]:  &amp;quot;);&lt;br /&gt;
			writeDouble(roll, 6, 1);&lt;br /&gt;
			writeChar('\n');&lt;br /&gt;
			setCursorPosLCD(0, 0);&lt;br /&gt;
			writeStringLCD_P(&amp;quot;P&amp;quot;);&lt;br /&gt;
			writeDoubleLCD(pitch, 6, 1);&lt;br /&gt;
			writeStringLCD_P(&amp;quot; &amp;quot;);&lt;br /&gt;
			setCursorPosLCD(0, 8);&lt;br /&gt;
			writeStringLCD_P(&amp;quot;R&amp;quot;);&lt;br /&gt;
			writeDoubleLCD(roll, 6, 1);&lt;br /&gt;
			writeStringLCD_P(&amp;quot; &amp;quot;);&lt;br /&gt;
			setCursorPosLCD(1, 0);&lt;br /&gt;
			writeStringLCD_P(&amp;quot;X&amp;quot;);&lt;br /&gt;
			writeIntegerLCD(x_axisa, DEC);&lt;br /&gt;
			writeStringLCD_P(&amp;quot;   &amp;quot;);&lt;br /&gt;
			setCursorPosLCD(1, 5);&lt;br /&gt;
			writeStringLCD_P(&amp;quot;Y&amp;quot;);&lt;br /&gt;
			writeIntegerLCD(y_axisa, DEC);&lt;br /&gt;
			writeStringLCD_P(&amp;quot;   &amp;quot;);&lt;br /&gt;
			setCursorPosLCD(1, 10);&lt;br /&gt;
			writeStringLCD_P(&amp;quot;Z&amp;quot;);&lt;br /&gt;
			writeIntegerLCD(z_axisa, DEC);&lt;br /&gt;
			writeStringLCD_P(&amp;quot;    &amp;quot;);&lt;br /&gt;
			mSleep(2000);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Erklärung&lt;br /&gt;
&lt;br /&gt;
====BHT Modul JM3-BHT31====&lt;br /&gt;
Dieses Modul zur Messung von Luftdruck, Luftfeuchte und Temperatur ist seit dem 22.01.2015 lieferbar.&lt;br /&gt;
&lt;br /&gt;
=====Dokumentation=====&lt;br /&gt;
Die Dokumentation zum BHT Modul befindet sich auf der mitgelieferten ''&amp;quot;ASURO xTend-On CD-ROM&amp;quot;''.&lt;br /&gt;
&lt;br /&gt;
======Manuals======&lt;br /&gt;
Das Handbuch in der aktuellen Version kann [http://www.jm3-engineering.com/download/doc/ManualAsuroBHT_de.pdf hier] eingesehen werden.&lt;br /&gt;
&lt;br /&gt;
=====Demo-Programme=====&lt;br /&gt;
Ein Demo-Programm zum BHT Modul befindet sich integriert in die RP6 Sensor Board Demo auf der ''&amp;quot;RP6 Robot System Xtra Modules CD-ROM&amp;quot;''. Diese Demo kann auch in der aktuellen Version im Download Bereich von [http://www.jm3-engineering.com/downloads.htm JM3 Engineering] herunter geladen werden.&lt;br /&gt;
&lt;br /&gt;
=====RP6M256 WiFi: I2C_BHT Library=====&lt;br /&gt;
Die nachfolgende RP6M256_I2C_BHTLib (Eigenentwicklung in GCC) dient zur Ansteuerung des I2C BHT Moduls durch die RP6M256 WiFi.&lt;br /&gt;
&lt;br /&gt;
======Library Header======&lt;br /&gt;
Datei: RP6M256_I2C_BHTLib.h&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;/* ****************************************************************************&lt;br /&gt;
 *                           _______________________&lt;br /&gt;
 *                           \| RP6  ROBOT SYSTEM |/&lt;br /&gt;
 *                            \_-_-_-_-_-_-_-_-_-_/           &amp;gt;&amp;gt;&amp;gt; RP6 M256 WIFI&lt;br /&gt;
 * ----------------------------------------------------------------------------&lt;br /&gt;
 * ----------------------------- [c]2015 - Dirk -------------------------------&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * File: RP6M256_I2C_BHTLib.h&lt;br /&gt;
 * Version: 0.9&lt;br /&gt;
 * Target: RP6 M256 WIFI - ATMEGA2560 @16.00MHz&lt;br /&gt;
 * Author(s): Dirk&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Description:&lt;br /&gt;
 * Header file for new RP6 BHT Module library.&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
#ifndef RP6M256_I2C_BHTLIB_H&lt;br /&gt;
#define RP6M256_I2C_BHTLIB_H&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// RP6 BHT Module components:&lt;br /&gt;
// - I2C Barometric Pressure Sensor (MS5607-02BA)&lt;br /&gt;
// - I2C Relative Humidity Sensor (HTU21D)&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// RP6 Sensor Board:&lt;br /&gt;
&lt;br /&gt;
// If you want to use the RP6 BHT Module on the RP6 Sensor Board, you&lt;br /&gt;
// have to define SENSOR_BOARD (default)!&lt;br /&gt;
// If SENSOR_BOARD is NOT defined, this library assumes that the RP6 BHT&lt;br /&gt;
// Module is used stand-alone.&lt;br /&gt;
// ------------------&lt;br /&gt;
#define SENSOR_BOARD&lt;br /&gt;
// ------------------&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Includes:&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6M256Lib.h&amp;quot;&lt;br /&gt;
#include &amp;quot;RP6I2CmasterTWI.h&amp;quot;&lt;br /&gt;
#ifdef SENSOR_BOARD&lt;br /&gt;
	#include &amp;quot;RP6M256_Sensor_BoardLib.h&amp;quot;&lt;br /&gt;
#endif&lt;br /&gt;
#include &amp;lt;math.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Barometric Pressure Sensor (MS5607-02BA):&lt;br /&gt;
#define I2C_BHT_B_ADR					0xee	// Default&lt;br /&gt;
&lt;br /&gt;
// Weather station's data:&lt;br /&gt;
#define ALTITUDE			156			// Weather station's altitude [m]&lt;br /&gt;
//#define ALTITUDE			110			// 2nd altitude: Location 2 [m]&lt;br /&gt;
&lt;br /&gt;
// Temperature default data:&lt;br /&gt;
#define TEMP_ZERO			273.15		// 273.15 K = 0 °C&lt;br /&gt;
#define TA_DEFAULT			15.0		// Outside temp. default [°C]&lt;br /&gt;
#define TI_DEFAULT			21.0		// Inside temp. default [°C]&lt;br /&gt;
&lt;br /&gt;
// Commands:&lt;br /&gt;
#define MS5607_CMD_RESET				0x1e	// ADC reset command&lt;br /&gt;
#define MS5607_CMD_ADC_READ				0x00	// ADC read command&lt;br /&gt;
#define MS5607_CMD_ADC_CONV				0x40	// ADC conversion command&lt;br /&gt;
#define MS5607_CMD_ADC_D1				0x00	// ADC D1 conversion&lt;br /&gt;
#define MS5607_CMD_ADC_D2				0x10	// ADC D2 conversion&lt;br /&gt;
#define MS5607_CMD_ADC_256				0x00	// ADC OSR=256&lt;br /&gt;
#define MS5607_CMD_ADC_512				0x02	// ADC OSR=512&lt;br /&gt;
#define MS5607_CMD_ADC_1024				0x04	// ADC OSR=1024&lt;br /&gt;
#define MS5607_CMD_ADC_2048				0x06	// ADC OSR=2048&lt;br /&gt;
#define MS5607_CMD_ADC_4096				0x08	// ADC OSR=4096&lt;br /&gt;
#define MS5607_CMD_PROM_RD				0xa0	// Prom read command&lt;br /&gt;
&lt;br /&gt;
extern uint32_t D1;		// ADC value of the pressure conversion&lt;br /&gt;
extern uint32_t D2;		// ADC value of the temperature conversion&lt;br /&gt;
extern uint16_t C[8];	// calibration coefficients&lt;br /&gt;
extern double P;		// compensated pressure value&lt;br /&gt;
extern double P0;		// compensated pressure value at sea level (0 m)&lt;br /&gt;
extern double T;		// compensated temperature value&lt;br /&gt;
extern double dT;		// difference between actual and measured temperature&lt;br /&gt;
extern double OFF;		// offset at actual temperature&lt;br /&gt;
extern double SENS;		// sensitivity at actual temperature&lt;br /&gt;
extern uint8_t n_crc;	// crc value of the prom&lt;br /&gt;
&lt;br /&gt;
void I2C_BHT_B_reset(void);&lt;br /&gt;
uint32_t I2C_BHT_B_cmd_adc(uint8_t cmd);&lt;br /&gt;
uint16_t I2C_BHT_B_cmd_prom(uint8_t coef_num);&lt;br /&gt;
uint8_t I2C_BHT_B_crc4(uint16_t n_prom[]);&lt;br /&gt;
void I2C_BHT_B_read(void);&lt;br /&gt;
void I2C_BHT_B_init(void);&lt;br /&gt;
double reduceAirPressure(double pa, double ta);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Relative Humidity Sensor (HTU21D):&lt;br /&gt;
#define I2C_BHT_HT_ADR					0x80	// Default&lt;br /&gt;
&lt;br /&gt;
// Commands:&lt;br /&gt;
#define HTU21D_TRIG_T_MEASUREMENT_HM    0xe3	// Trig. temp meas. hold master&lt;br /&gt;
#define HTU21D_TRIG_RH_MEASUREMENT_HM   0xe5	// Trig. humidity meas. hold master&lt;br /&gt;
#define HTU21D_TRIG_T_MEASUREMENT_POLL  0xf3	// Trig. temp meas. no hold master&lt;br /&gt;
#define HTU21D_TRIG_RH_MEASUREMENT_POLL 0xf5	// Trig. humidity meas. no hold master&lt;br /&gt;
#define HTU21D_USER_REG_W               0xe6	// Writing user register&lt;br /&gt;
#define HTU21D_USER_REG_R               0xe7	// Reading user register&lt;br /&gt;
#define HTU21D_SOFT_RESET               0xfe	// Soft reset&lt;br /&gt;
&lt;br /&gt;
// Resolutions:&lt;br /&gt;
#define HTU21D_RES_12_14BIT             0x00	// RH=12bit, T=14bit&lt;br /&gt;
#define HTU21D_RES_8_12BIT              0x01	// RH= 8bit, T=12bit&lt;br /&gt;
#define HTU21D_RES_10_13BIT             0x80	// RH=10bit, T=13bit&lt;br /&gt;
#define HTU21D_RES_11_11BIT             0x81	// RH=11bit, T=11bit&lt;br /&gt;
&lt;br /&gt;
// User register bitmasks:&lt;br /&gt;
#define HTU21D_RES_MASK                 0x81	// Mask for res. bits (7, 0)&lt;br /&gt;
#define HTU21D_EOB_ON                   0x40	// End of battery&lt;br /&gt;
#define HTU21D_EOB_MASK                 0x40	// Mask for EOB bit(6)&lt;br /&gt;
#define HTU21D_HEATER_ON                0x04	// Heater on&lt;br /&gt;
#define HTU21D_HEATER_OFF               0x00	// Heater off&lt;br /&gt;
#define HTU21D_HEATER_MASK              0x04	// Mask for Heater bit (2)&lt;br /&gt;
&lt;br /&gt;
extern uint16_t rawHumidity;	// raw humidity value&lt;br /&gt;
extern uint16_t rawTemperature;	// raw temperature value&lt;br /&gt;
extern double H;				// relative humidity value [%]&lt;br /&gt;
extern double HT;				// temperature value [°C]&lt;br /&gt;
extern uint8_t resolution;		// sensor resolution [0..3]&lt;br /&gt;
extern uint8_t ht_crc;			// message crc value&lt;br /&gt;
&lt;br /&gt;
void I2C_BHT_HT_reset(void);&lt;br /&gt;
uint8_t I2C_BHT_HT_crc8(uint16_t message, uint8_t checksum);&lt;br /&gt;
double I2C_BHT_HT_readHumidity(void);&lt;br /&gt;
double I2C_BHT_HT_readTemperature(void);&lt;br /&gt;
void I2C_BHT_HT_setResolution(uint8_t resBits);&lt;br /&gt;
void I2C_BHT_HT_init(void);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// RP6 BHT Module initialisation:&lt;br /&gt;
&lt;br /&gt;
void I2C_BHT_init(void);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
/******************************************************************************&lt;br /&gt;
 * Additional info&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Changelog:&lt;br /&gt;
 * &lt;br /&gt;
 *  ---&amp;gt; changes are documented in the file &amp;quot;RP6M256_I2C_BHTLib.c&amp;quot;&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
======Library Source======&lt;br /&gt;
Datei: RP6M256_I2C_BHTLib.c&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;/* ****************************************************************************&lt;br /&gt;
 *                           _______________________&lt;br /&gt;
 *                           \| RP6  ROBOT SYSTEM |/&lt;br /&gt;
 *                            \_-_-_-_-_-_-_-_-_-_/           &amp;gt;&amp;gt;&amp;gt; RP6 M256 WIFI&lt;br /&gt;
 * ----------------------------------------------------------------------------&lt;br /&gt;
 * ----------------------------- [c]2015 - Dirk -------------------------------&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * File: RP6M256_I2C_BHTLib.c&lt;br /&gt;
 * Version: 0.9&lt;br /&gt;
 * Target: RP6 M256 WIFI - ATMEGA2560 @16.00MHz&lt;br /&gt;
 *         and a RP6 BHT Module (CONRAD 1302995)&lt;br /&gt;
 *         optionally on a RP6 Sensor Board (CONRAD 1082384)&lt;br /&gt;
 * Author(s): Dirk&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Description:&lt;br /&gt;
 * &lt;br /&gt;
 * This is our new Library that contains basic routines and functions for&lt;br /&gt;
 * accessing the RP6 BHT Module JM3-BHT31 (CONRAD 1302995).&lt;br /&gt;
 * If the RP6 BHT Module is located on the RP6 Sensor Board (CONRAD 1082384)&lt;br /&gt;
 * and connected to the I2C-MODULE plug M1, the RP6M256_Sensor_BoardLib has to&lt;br /&gt;
 * be included!&lt;br /&gt;
 * &lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// RP6 BHT Module components:&lt;br /&gt;
// - I2C Barometric Pressure Sensor (MS5607-02BA)&lt;br /&gt;
// - I2C Relative Humidity Sensor (HTU21D)&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Includes:&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6M256_I2C_BHTLib.h&amp;quot; 		&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Variables:&lt;br /&gt;
&lt;br /&gt;
uint8_t bhtdataBuf[4]; &lt;br /&gt;
uint8_t i;&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Barometric Pressure Sensor (MS5607-02BA):&lt;br /&gt;
// (Following the C-code example published 2011 by MEAS in AN520!)&lt;br /&gt;
&lt;br /&gt;
uint32_t D1;			// ADC value of the pressure conversion&lt;br /&gt;
uint32_t D2;			// ADC value of the temperature conversion&lt;br /&gt;
uint16_t C[8];			// calibration coefficients&lt;br /&gt;
double P;				// compensated pressure value&lt;br /&gt;
double P0;				// compensated pressure value at sea level (0 m)&lt;br /&gt;
double T;				// compensated temperature value&lt;br /&gt;
double dT;				// difference between actual and measured temperature&lt;br /&gt;
double OFF;				// offset at actual temperature&lt;br /&gt;
double SENS;			// sensitivity at actual temperature&lt;br /&gt;
uint8_t n_crc;			// crc value of the prom&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Reset sequence for the Pressure Sensor.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void I2C_BHT_B_reset(void)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmitByte(I2C_BHT_B_ADR, MS5607_CMD_RESET);&lt;br /&gt;
	mSleep(3);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Reads and returns pressure or temperature ADC&lt;br /&gt;
 * values measured with the chosen resolution.&lt;br /&gt;
 * This function is BLOCKING during the conversion&lt;br /&gt;
 * time (up to 10 ms).&lt;br /&gt;
 *&lt;br /&gt;
 * Input: cmd -&amp;gt; MS5607_CMD_ADC_D1   = Read pressure ADC value&lt;br /&gt;
 *               MS5607_CMD_ADC_D2   = Read temperature ADC value&lt;br /&gt;
 *               ... plus ...&lt;br /&gt;
 *               MS5607_CMD_ADC_256  = Resolution 0.130 hPa / 0.012 °C&lt;br /&gt;
 *               MS5607_CMD_ADC_512  = Resolution 0.084 hPa / 0.008 °C&lt;br /&gt;
 *               MS5607_CMD_ADC_1024 = Resolution 0.054 hPa / 0.005 °C&lt;br /&gt;
 *               MS5607_CMD_ADC_2048 = Resolution 0.036 hPa / 0.003 °C&lt;br /&gt;
 *               MS5607_CMD_ADC_4096 = Resolution 0.024 hPa / 0.002 °C&lt;br /&gt;
 *&lt;br /&gt;
 * Examples:&lt;br /&gt;
 *   D1 = I2C_BHT_B_cmd_adc(MS5607_CMD_ADC_D1 + MS5607_CMD_ADC_4096);&lt;br /&gt;
 *   // This returns the pressure ADC value (D1) with a 0.024 hPa&lt;br /&gt;
 *   // resolution!&lt;br /&gt;
 *   D2 = I2C_BHT_B_cmd_adc(MS5607_CMD_ADC_D2 + MS5607_CMD_ADC_4096);&lt;br /&gt;
 *   // This returns the temperature ADC value (D2) with a 0.002 °C&lt;br /&gt;
 *   // resolution!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
uint32_t I2C_BHT_B_cmd_adc(uint8_t cmd)&lt;br /&gt;
{&lt;br /&gt;
	uint32_t temp = 0;&lt;br /&gt;
&lt;br /&gt;
	I2CTWI_transmitByte(I2C_BHT_B_ADR, (MS5607_CMD_ADC_CONV + cmd));&lt;br /&gt;
	switch (cmd &amp;amp; 0x0f) {&lt;br /&gt;
		case MS5607_CMD_ADC_256  : mSleep(1); break;&lt;br /&gt;
		case MS5607_CMD_ADC_512  : mSleep(2); break;&lt;br /&gt;
		case MS5607_CMD_ADC_1024 : mSleep(3); break;&lt;br /&gt;
		case MS5607_CMD_ADC_2048 : mSleep(5); break;&lt;br /&gt;
		case MS5607_CMD_ADC_4096 : mSleep(10);&lt;br /&gt;
	}&lt;br /&gt;
	I2CTWI_transmitByte(I2C_BHT_B_ADR, MS5607_CMD_ADC_READ);&lt;br /&gt;
	I2CTWI_readBytes(I2C_BHT_B_ADR, bhtdataBuf, 3);&lt;br /&gt;
	temp = bhtdataBuf[0];						// MSB&lt;br /&gt;
	temp &amp;lt;&amp;lt;= 8;&lt;br /&gt;
	temp |= bhtdataBuf[1];&lt;br /&gt;
	temp &amp;lt;&amp;lt;= 8;&lt;br /&gt;
	temp |= bhtdataBuf[2];						// LSB&lt;br /&gt;
	return temp;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Reads and returns the calibration coefficient&lt;br /&gt;
 * (16 bit) with the number coef_num from the&lt;br /&gt;
 * Pressure Sensor's PROM.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: coef_num -&amp;gt; Calibration coefficient&lt;br /&gt;
 *                    number [0..7]&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
uint16_t I2C_BHT_B_cmd_prom(uint8_t coef_num)&lt;br /&gt;
{&lt;br /&gt;
	uint16_t rC = 0;&lt;br /&gt;
&lt;br /&gt;
	I2CTWI_transmitByte(I2C_BHT_B_ADR, (MS5607_CMD_PROM_RD + coef_num * 2));&lt;br /&gt;
	I2CTWI_readBytes(I2C_BHT_B_ADR, bhtdataBuf, 2);&lt;br /&gt;
	rC = bhtdataBuf[0];							// MSB&lt;br /&gt;
	rC &amp;lt;&amp;lt;= 8;&lt;br /&gt;
	rC |= bhtdataBuf[1];						// LSB&lt;br /&gt;
	return rC;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Calculates and returns the Pressure Sensor's&lt;br /&gt;
 * PROM CRC-4 value (8 bit).&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
uint8_t I2C_BHT_B_crc4(uint16_t n_prom[])&lt;br /&gt;
{&lt;br /&gt;
	uint16_t n_rem;&lt;br /&gt;
	uint16_t crc_read;&lt;br /&gt;
	uint8_t n_bit;&lt;br /&gt;
&lt;br /&gt;
	n_rem = 0x00;&lt;br /&gt;
	crc_read = n_prom[7];&lt;br /&gt;
	n_prom[7] = (0xff00 &amp;amp; (n_prom[7]));&lt;br /&gt;
	for (i = 0; i &amp;lt; 16; i++)&lt;br /&gt;
	{&lt;br /&gt;
		if (i % 2 == 1) n_rem ^= (uint8_t) ((n_prom[i &amp;gt;&amp;gt; 1]) &amp;amp; 0x00ff);&lt;br /&gt;
		else n_rem ^= (uint8_t) (n_prom[i &amp;gt;&amp;gt; 1] &amp;gt;&amp;gt; 8);&lt;br /&gt;
		for (n_bit = 8; n_bit &amp;gt; 0; n_bit--)&lt;br /&gt;
		{&lt;br /&gt;
			if (n_rem &amp;amp; 0x8000) n_rem = (n_rem &amp;lt;&amp;lt; 1) ^ 0x3000;&lt;br /&gt;
			else n_rem = n_rem &amp;lt;&amp;lt; 1;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	n_rem = (0x000f &amp;amp; (n_rem &amp;gt;&amp;gt; 12));&lt;br /&gt;
	n_prom[7] = crc_read;&lt;br /&gt;
	return (n_rem ^ 0x0);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Reads and calculates the pressure and&lt;br /&gt;
 * temperature values with the MS5607 1st order&lt;br /&gt;
 * algorithm.&lt;br /&gt;
 * The 2 values are stored in the global floating&lt;br /&gt;
 * point variables P and T:&lt;br /&gt;
 *   P -&amp;gt; Pressure value [hPa]&lt;br /&gt;
 *   T -&amp;gt; Temperature value [°C]&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void I2C_BHT_B_read(void)&lt;br /&gt;
{&lt;br /&gt;
	D2 = I2C_BHT_B_cmd_adc(MS5607_CMD_ADC_D2 + MS5607_CMD_ADC_4096); // Read D2&lt;br /&gt;
	D1 = I2C_BHT_B_cmd_adc(MS5607_CMD_ADC_D1 + MS5607_CMD_ADC_4096); // Read D1&lt;br /&gt;
&lt;br /&gt;
	// Calculate 1st order pressure and temperature (MS5607 1st order algorithm)&lt;br /&gt;
	dT = D2 - C[5] * pow(2, 8);&lt;br /&gt;
	OFF = C[2] * pow(2, 17) + dT * C[4] / pow(2, 6);&lt;br /&gt;
	SENS = C[1] * pow(2, 16) + dT * C[3] / pow(2, 7);&lt;br /&gt;
&lt;br /&gt;
	T = (2000 + (dT * C[6]) / pow(2, 23)) / 100;&lt;br /&gt;
	P = (((D1 * SENS) / pow(2, 21) - OFF) / pow(2, 15)) / 100;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * You MUST call this function at the beginning of a&lt;br /&gt;
 * main program, that uses the Pressure Sensor. &lt;br /&gt;
 * If SENSOR_BOARD is defined, the I2C-MODULE power&lt;br /&gt;
 * will be switched on with the function&lt;br /&gt;
 * setI2CModulePower() defined in the&lt;br /&gt;
 * RP6M256_Sensor_BoardLib, which will be included&lt;br /&gt;
 * then.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void I2C_BHT_B_init(void)&lt;br /&gt;
{&lt;br /&gt;
#ifdef SENSOR_BOARD&lt;br /&gt;
	// I2C-MODULE (plug M1) power on: &lt;br /&gt;
	setI2CModulePower(1);&lt;br /&gt;
#endif&lt;br /&gt;
	D1 = 0;										// Clear pressure ADC value&lt;br /&gt;
	D2 = 0;										// Clear temperature ADC value&lt;br /&gt;
	I2C_BHT_B_reset();							// Reset the Pressure Sensor&lt;br /&gt;
	for (i = 0; i &amp;lt; 8; i++) {C[i] = I2C_BHT_B_cmd_prom(i);} // Read PROM&lt;br /&gt;
	n_crc = I2C_BHT_B_crc4(C);					// Calculate PROM CRC&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Calculates and returns the relative air pressure&lt;br /&gt;
 * [hPa] at sea level (0 m).&lt;br /&gt;
 *&lt;br /&gt;
 * Input:  pa        -&amp;gt; Absolute air pressure [hPa] at ALTITUDE&lt;br /&gt;
 *         ta        -&amp;gt; OUTSIDE temperature [°C] at ALTITUDE&lt;br /&gt;
 *         ALTITUDE  -&amp;gt; Weather station's altitude [m]&lt;br /&gt;
 *         TEMP_ZERO -&amp;gt; 273.15 K&lt;br /&gt;
 * Output: p0        -&amp;gt; Relative air pressure [hPa] at sea level (0 m)&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
double reduceAirPressure(double pa, double ta)&lt;br /&gt;
{double p0;&lt;br /&gt;
	p0 = pa * (pow ((TEMP_ZERO + ta) / (TEMP_ZERO + ta + 0.0065 * ALTITUDE), -5.255));&lt;br /&gt;
	return p0;									// P0 [hPa]&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Relative Humidity Sensor (HTU21D):&lt;br /&gt;
// (Following a library published 2011 by MEAS France!)&lt;br /&gt;
&lt;br /&gt;
uint16_t rawHumidity;		// raw humidity value&lt;br /&gt;
uint16_t rawTemperature;	// raw temperature value&lt;br /&gt;
double H;					// relative humidity value [%]&lt;br /&gt;
double HT;					// temperature value [°C]&lt;br /&gt;
uint8_t resolution;			// sensor resolution [0..3]&lt;br /&gt;
uint8_t ht_crc;				// message crc value&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Soft reset for the Humidity Sensor.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void I2C_BHT_HT_reset(void)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmitByte(I2C_BHT_HT_ADR, HTU21D_SOFT_RESET);&lt;br /&gt;
	mSleep(15);&lt;br /&gt;
	resolution = 0;								// Default: RH 12, T 14 bit&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Reads the Humidity Sensor's user register.&lt;br /&gt;
 *&lt;br /&gt;
 * Hint: The user register bits are described on&lt;br /&gt;
 *       page 13 of the HTU21D datasheet!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
uint8_t read_user_register(void)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t userRegister;&lt;br /&gt;
  &lt;br /&gt;
	I2CTWI_transmitByte(I2C_BHT_HT_ADR, HTU21D_USER_REG_R);&lt;br /&gt;
	userRegister = I2CTWI_readByte(I2C_BHT_HT_ADR);&lt;br /&gt;
	return userRegister;  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Sets the Humidity Sensor's resolution to one&lt;br /&gt;
 * of four steps. The step number [0..3] is stored&lt;br /&gt;
 * in the global variable resolution:&lt;br /&gt;
 *   Step  RH   T&lt;br /&gt;
 *    0:   12  14 bit&lt;br /&gt;
 *    1:    8  12 bit&lt;br /&gt;
 *    2:   10  13 bit&lt;br /&gt;
 *    3:   11  11 bit&lt;br /&gt;
 *                                      RH   T&lt;br /&gt;
 * Input:  resBits -&amp;gt; 0b00000000   (0): 12  14 bit&lt;br /&gt;
 *                 -&amp;gt; 0b00000001   (1):  8  12 bit&lt;br /&gt;
 *                 -&amp;gt; 0b10000000 (128): 10  13 bit&lt;br /&gt;
 *                 -&amp;gt; 0b10000001 (129): 11  11 bit&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void I2C_BHT_HT_setResolution(uint8_t resBits)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t userRegister;&lt;br /&gt;
&lt;br /&gt;
	userRegister = read_user_register();&lt;br /&gt;
	userRegister &amp;amp;= 0b01111110;&lt;br /&gt;
	resBits &amp;amp;= 0b10000001;&lt;br /&gt;
	resolution = (resBits &amp;gt;&amp;gt; 6) | (resBits &amp;amp; 1); // Step 0..3&lt;br /&gt;
	userRegister |= resBits;&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_BHT_HT_ADR, HTU21D_USER_REG_W, userRegister);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#define SHIFTED_DIVISOR                 0x988000&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Calculates the Humidity Sensor's message CRC-8&lt;br /&gt;
 * value (8 bit) and returns 0 (false), if the&lt;br /&gt;
 * message transmission is good.&lt;br /&gt;
 *&lt;br /&gt;
 * Input:  message         -&amp;gt; Message from&lt;br /&gt;
 *                            Humidity Sensor&lt;br /&gt;
 *         checksum        -&amp;gt; Checksum from&lt;br /&gt;
 *                            Humidity Sensor&lt;br /&gt;
 *         SHIFTED_DIVISOR -&amp;gt; 0x0131 polynomial&lt;br /&gt;
 *                            shifted to farthest&lt;br /&gt;
 *                            left of three bytes&lt;br /&gt;
 * Output: remainder       -&amp;gt; 0  = Transmission good&lt;br /&gt;
 *                         -&amp;gt; &amp;gt;0 = Transm. corrupted&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
uint8_t I2C_BHT_HT_crc8(uint16_t message, uint8_t checksum)&lt;br /&gt;
{&lt;br /&gt;
	uint32_t remainder, divisor;&lt;br /&gt;
&lt;br /&gt;
	remainder = (uint32_t) message &amp;lt;&amp;lt; 8;&lt;br /&gt;
	remainder |= checksum;&lt;br /&gt;
	divisor = (uint32_t) SHIFTED_DIVISOR;&lt;br /&gt;
	for (i = 0; i &amp;lt; 16; i++)&lt;br /&gt;
	{&lt;br /&gt;
		if (remainder &amp;amp; (uint32_t) 1 &amp;lt;&amp;lt; (23 - i))&lt;br /&gt;
			remainder ^= divisor;&lt;br /&gt;
		divisor &amp;gt;&amp;gt;= 1;&lt;br /&gt;
	}&lt;br /&gt;
	return (uint8_t) remainder;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Calculates and returns the humidity value.&lt;br /&gt;
 * This function is BLOCKING during the conversion&lt;br /&gt;
 * time (up to 17 ms depending on resolution).&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
double I2C_BHT_HT_readHumidity(void)&lt;br /&gt;
{&lt;br /&gt;
	uint32_t temp = 0;&lt;br /&gt;
&lt;br /&gt;
	I2CTWI_transmitByte(I2C_BHT_HT_ADR, HTU21D_TRIG_RH_MEASUREMENT_POLL);&lt;br /&gt;
	switch (resolution) {&lt;br /&gt;
		case 1 : mSleep(4); break;				// RH 8 bit&lt;br /&gt;
		case 2 : mSleep(6); break;				// RH 10 bit&lt;br /&gt;
		case 3 : mSleep(9); break;				// RH 11 bit&lt;br /&gt;
		case 0 : mSleep(17);					// RH 12 bit&lt;br /&gt;
	}&lt;br /&gt;
	I2CTWI_readBytes(I2C_BHT_HT_ADR, bhtdataBuf, 3);&lt;br /&gt;
	temp = bhtdataBuf[0];						// MSB&lt;br /&gt;
	temp &amp;lt;&amp;lt;= 8;&lt;br /&gt;
	temp |= bhtdataBuf[1];						// LSB&lt;br /&gt;
	temp &amp;lt;&amp;lt;= 8;&lt;br /&gt;
	temp |= bhtdataBuf[2];						// Checksum&lt;br /&gt;
	rawHumidity = temp &amp;gt;&amp;gt; 8;&lt;br /&gt;
	ht_crc = (uint8_t) temp;&lt;br /&gt;
	rawHumidity &amp;amp;= 0xfffc;&lt;br /&gt;
	double tempRH = rawHumidity / (double) 65536;&lt;br /&gt;
	double rh = -6 + (125 * tempRH);&lt;br /&gt;
	return rh;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Calculates and returns the temperature value.&lt;br /&gt;
 * This function is BLOCKING during the conversion&lt;br /&gt;
 * time (up to 51 ms depending on resolution).&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
double I2C_BHT_HT_readTemperature(void)&lt;br /&gt;
{&lt;br /&gt;
	uint32_t temp = 0;&lt;br /&gt;
&lt;br /&gt;
	I2CTWI_transmitByte(I2C_BHT_HT_ADR, HTU21D_TRIG_T_MEASUREMENT_POLL);&lt;br /&gt;
	switch (resolution) {&lt;br /&gt;
		case 3 : mSleep(8); break;				// T 11 bit&lt;br /&gt;
		case 1 : mSleep(14); break;				// T 12 bit&lt;br /&gt;
		case 2 : mSleep(26); break;				// T 13 bit&lt;br /&gt;
		case 0 : mSleep(51);					// T 14 bit&lt;br /&gt;
	}&lt;br /&gt;
	I2CTWI_readBytes(I2C_BHT_HT_ADR, bhtdataBuf, 3);&lt;br /&gt;
	temp = bhtdataBuf[0];						// MSB&lt;br /&gt;
	temp &amp;lt;&amp;lt;= 8;&lt;br /&gt;
	temp |= bhtdataBuf[1];						// LSB&lt;br /&gt;
	temp &amp;lt;&amp;lt;= 8;&lt;br /&gt;
	temp |= bhtdataBuf[2];						// Checksum&lt;br /&gt;
	rawTemperature = temp &amp;gt;&amp;gt; 8;&lt;br /&gt;
	ht_crc = (uint8_t) temp;&lt;br /&gt;
	rawTemperature &amp;amp;= 0xfffc;&lt;br /&gt;
	double tempTemperature = rawTemperature / (double) 65536;&lt;br /&gt;
	double realTemperature = -46.85 + (175.72 * tempTemperature);&lt;br /&gt;
	return realTemperature;  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * You MUST call this function at the beginning of a&lt;br /&gt;
 * main program, that uses the Humidity Sensor. &lt;br /&gt;
 * If SENSOR_BOARD is defined, the I2C-MODULE power&lt;br /&gt;
 * will be switched on with the function&lt;br /&gt;
 * setI2CModulePower() defined in the&lt;br /&gt;
 * RP6M256_Sensor_BoardLib, which will be included&lt;br /&gt;
 * then.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void I2C_BHT_HT_init(void)&lt;br /&gt;
{&lt;br /&gt;
#ifdef SENSOR_BOARD&lt;br /&gt;
	// I2C-MODULE (plug M1) power on: &lt;br /&gt;
	setI2CModulePower(1);&lt;br /&gt;
#endif&lt;br /&gt;
	I2C_BHT_HT_reset();							// Reset the Humidity Sensor&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// RP6 BHT Module initialisation:&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * You MUST call this function at the beginning of a&lt;br /&gt;
 * main program, that uses the RP6 BHT Module. &lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void I2C_BHT_init(void)&lt;br /&gt;
{&lt;br /&gt;
	// I2C Barometric Pressure Sensor:&lt;br /&gt;
	I2C_BHT_B_init();&lt;br /&gt;
	// I2C Relative Humidity Sensor:&lt;br /&gt;
	I2C_BHT_HT_init();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&lt;br /&gt;
/******************************************************************************&lt;br /&gt;
 * Additional info&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Changelog:&lt;br /&gt;
 * - v. 0.9 (initial release) 20.03.2015 by Dirk&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
======Demo======&lt;br /&gt;
makefile:&lt;br /&gt;
&amp;lt;pre&amp;gt;...&lt;br /&gt;
TARGET = RP6M256_Sensor_Board_03&lt;br /&gt;
...&lt;br /&gt;
SRC += $(RP6_LIB_PATH)/RP6common/RP6I2CmasterTWI.c&lt;br /&gt;
&lt;br /&gt;
SRC += $(RP6_LIB_PATH)/RP6control_M256_WIFI/RP6M256_Sensor_BoardLib.c&lt;br /&gt;
SRC += $(RP6_LIB_PATH)/RP6control_M256_WIFI/RP6M256_I2C_BHTLib.c&lt;br /&gt;
...&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Datei: RP6M256_Sensor_Board_03.c&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;/* &lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * RP6 ROBOT SYSTEM - RP6 CONTROL M256 Examples&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Example: RP6M256 Sensor Board&lt;br /&gt;
 * Author(s): Dirk&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Description:&lt;br /&gt;
 * In this example we show a third test for the RP6 Sensor Board.&lt;br /&gt;
 * &lt;br /&gt;
 * ############################################################################&lt;br /&gt;
 * The Robot does NOT move in this example! You can simply put it on a table&lt;br /&gt;
 * next to your PC and you should connect it to the PC via the USB Interface!&lt;br /&gt;
 * You should also connect to it via WIFI.&lt;br /&gt;
 * ############################################################################&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Includes:&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6M256Lib.h&amp;quot; 				// The RP6 M256 Library. &lt;br /&gt;
										// Always needs to be included!&lt;br /&gt;
#include &amp;quot;RP6I2CmasterTWI.h&amp;quot;			// Include the I2C-Bus Master Library&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Include our new &amp;quot;RP6M256 I2C BHT Module library&amp;quot;:&lt;br /&gt;
// (This is the library for accessing the RP6 BHT Module!)&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6M256_I2C_BHTLib.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Write a floating point number to the WIFI.&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *&lt;br /&gt;
 *			// Write a floating point number to the WIFI (no exponent):&lt;br /&gt;
 *			writeDouble_WIFI(1234567.890, 11, 3);&lt;br /&gt;
 *&lt;br /&gt;
 * The value of prec (precision) defines the number of decimal places.&lt;br /&gt;
 * For 32 bit floating point variables (float, double ...) 6 is&lt;br /&gt;
 * the max. value for prec (7 relevant digits).&lt;br /&gt;
 * The value of width defines the overall number of characters in the&lt;br /&gt;
 * floating point number including the decimal point. The number of&lt;br /&gt;
 * pre-decimal positions is: (width - prec - 1).&lt;br /&gt;
 */&lt;br /&gt;
void writeDouble_WIFI(double number, uint8_t width, uint8_t prec)&lt;br /&gt;
{char buffer[width + 1];&lt;br /&gt;
	dtostrf(number, width, prec, &amp;amp;buffer[0]);&lt;br /&gt;
	writeString_WIFI(&amp;amp;buffer[0]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Write a floating point number to the LCD.&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *&lt;br /&gt;
 *			// Write a floating point number to the LCD (no exponent):&lt;br /&gt;
 *			writeDoubleLCD(1234567.890, 11, 3);&lt;br /&gt;
 *&lt;br /&gt;
 * The value of prec (precision) defines the number of decimal places.&lt;br /&gt;
 * For 32 bit floating point variables (float, double ...) 6 is&lt;br /&gt;
 * the max. value for prec (7 relevant digits).&lt;br /&gt;
 * The value of width defines the overall number of characters in the&lt;br /&gt;
 * floating point number including the decimal point. The number of&lt;br /&gt;
 * pre-decimal positions is: (width - prec - 1).&lt;br /&gt;
 */&lt;br /&gt;
void writeDoubleLCD(double number, uint8_t width, uint8_t prec)&lt;br /&gt;
{char buffer[width + 1];&lt;br /&gt;
	dtostrf(number, width, prec, &amp;amp;buffer[0]);&lt;br /&gt;
	writeStringLCD(&amp;amp;buffer[0]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Error handler&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function gets called automatically if there was an I2C Error like&lt;br /&gt;
 * the slave sent a &amp;quot;not acknowledge&amp;quot; (NACK, error codes e.g. 0x20 or 0x30).&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void I2C_transmissionError(uint8_t errorState)&lt;br /&gt;
{&lt;br /&gt;
	writeString_P_WIFI(&amp;quot;\nI2C ERROR - TWI STATE: 0x&amp;quot;);&lt;br /&gt;
	writeInteger_WIFI(errorState, HEX);&lt;br /&gt;
	writeChar_WIFI('\n');&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Main function - The program starts here:&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
	initRP6M256();    // Always call this first! The Processor will not work&lt;br /&gt;
					  // correctly otherwise. &lt;br /&gt;
&lt;br /&gt;
	initLCD(); // Initialize the LC-Display (LCD)&lt;br /&gt;
			   // Always call this before using the LCD!&lt;br /&gt;
&lt;br /&gt;
	setLEDs(0b1111);&lt;br /&gt;
	mSleep(500);&lt;br /&gt;
	setLEDs(0b0000);&lt;br /&gt;
&lt;br /&gt;
	writeString_P_WIFI(&amp;quot;\n\nRP6 Sensor Board Selftest 3!\n&amp;quot;); &lt;br /&gt;
&lt;br /&gt;
	// IMPORTANT:&lt;br /&gt;
	I2CTWI_initMaster(100); // Initialize the TWI Module for Master operation&lt;br /&gt;
							// with 100kHz SCL Frequency&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	// Register the event handler:&lt;br /&gt;
	I2CTWI_setTransmissionErrorHandler(I2C_transmissionError);&lt;br /&gt;
&lt;br /&gt;
	setLEDs(0b1111);&lt;br /&gt;
&lt;br /&gt;
	// Write a text message to the LCD:&lt;br /&gt;
	showScreenLCD(&amp;quot;################&amp;quot;, &amp;quot;################&amp;quot;);&lt;br /&gt;
	mSleep(1500);&lt;br /&gt;
	showScreenLCD(&amp;quot;RP6v2-M256-WIFI &amp;quot;, &amp;quot;Example Program&amp;quot;);&lt;br /&gt;
	mSleep(2500); &lt;br /&gt;
	showScreenLCD(&amp;quot;RP6 Sensor Board&amp;quot;, &amp;quot;   Selftest 3&amp;quot;);&lt;br /&gt;
	mSleep(2500);&lt;br /&gt;
	clearLCD();&lt;br /&gt;
&lt;br /&gt;
	setLEDs(0b0000);&lt;br /&gt;
&lt;br /&gt;
	// ---------------------------------------&lt;br /&gt;
&lt;br /&gt;
	uint8_t onoff = 0;&lt;br /&gt;
&lt;br /&gt;
	startStopwatch1();&lt;br /&gt;
	startStopwatch2();&lt;br /&gt;
&lt;br /&gt;
	// IMPORTANT:&lt;br /&gt;
	sensor_board_init();						// RP6 Sensor Board init!!!&lt;br /&gt;
	mSleep(200);&lt;br /&gt;
	I2C_BHT_init();								// RP6 BHT Module init&lt;br /&gt;
&lt;br /&gt;
	while(true) &lt;br /&gt;
	{&lt;br /&gt;
		if(getStopwatch1() &amp;gt; 1000) // 1s&lt;br /&gt;
		{&lt;br /&gt;
//			if (onoff) onoff = 0;&lt;br /&gt;
//			else onoff = 1;&lt;br /&gt;
&lt;br /&gt;
			// Show Pressure Sensor data:&lt;br /&gt;
			I2C_BHT_B_read();					// Read data&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nLuftdruck:   &amp;quot;);&lt;br /&gt;
			writeDouble_WIFI(P, 7, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot; hPa am Messort (ALTITUDE m)\n&amp;quot;);&lt;br /&gt;
			// Calculate pressure at sea level at TA_DEFAULT (15 °C):&lt;br /&gt;
			P0 = reduceAirPressure(P, TA_DEFAULT);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;Luftdruck:   &amp;quot;);&lt;br /&gt;
			writeDouble_WIFI(P0, 7, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot; hPa in Meereshöhe (0 m, 15 C)\n&amp;quot;);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;Temperatur:  &amp;quot;);&lt;br /&gt;
			writeDouble_WIFI(T, 7, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot; C\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			// Show Humidity Sensor data:&lt;br /&gt;
			H = I2C_BHT_HT_readHumidity();		// Read data&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nLuftfeuchte: &amp;quot;);&lt;br /&gt;
			writeDouble_WIFI(H, 7, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot; % RH\n&amp;quot;);&lt;br /&gt;
			HT = I2C_BHT_HT_readTemperature();	// Read data&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;Temperatur:  &amp;quot;);&lt;br /&gt;
			writeDouble_WIFI(HT, 7, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot; C\n\n\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			// RP6 Sensor Board shutdown (button &amp;amp; status LED test):&lt;br /&gt;
			if (pressedButton) {&lt;br /&gt;
				setStatusLED(1);&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;\nPress button again for RP6 Sensor Board SHUTDOWN!\n&amp;quot;);&lt;br /&gt;
				mSleep(2000);&lt;br /&gt;
				do {&lt;br /&gt;
					if(getStopwatch2() &amp;gt; 200) { // 0.2s&lt;br /&gt;
						if (onoff) onoff = 0;&lt;br /&gt;
						else onoff = 1;&lt;br /&gt;
						if (onoff) setStatusLED(1);&lt;br /&gt;
						else setStatusLED(0);&lt;br /&gt;
						setStopwatch2(0);&lt;br /&gt;
					}&lt;br /&gt;
					mSleep(1);&lt;br /&gt;
					task_I2CTWI();&lt;br /&gt;
				} while (!readButton());&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;\n\n\n\n\nPlease wait for RP6 Sensor Board SHUTDOWN...\n&amp;quot;);&lt;br /&gt;
				sensor_board_shutdown();&lt;br /&gt;
				mSleep(3000);&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;\n\n\nThe RP6 Sensor Board now is in SHUTDOWN MODE!!!\n&amp;quot;);&lt;br /&gt;
				mSleep(1000);&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;\nRESET the M256 microcontroller now...\n\n&amp;quot;);&lt;br /&gt;
				while(true) {};&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			setStopwatch1(0);&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		task_RP6SensorBoard();					// RP6 Sensor Board task&lt;br /&gt;
&lt;br /&gt;
		task_I2CTWI();&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Erklärung&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Erfahrungsberichte==&lt;br /&gt;
&lt;br /&gt;
...in Arbeit...(kann aber gerne ergänzt werden)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Siehe auch==&lt;br /&gt;
* [[RP6v2]]&lt;br /&gt;
* [[RP6]]&lt;br /&gt;
* [[RP6 - Programmierung]]&lt;br /&gt;
* [[RP6 Kamera - Mitmach-Projekt]]&lt;br /&gt;
* [[RP6v2 I2C-Portexpander]]&lt;br /&gt;
* [[RP6v2 USB-RS232-Adapter]]&lt;br /&gt;
* [[RP6v2 Orientierung]]&lt;br /&gt;
* [[RP6 Multi IO Projekt]]&lt;br /&gt;
* [[RP6 Multi IO Projekt - Software]]&lt;br /&gt;
* [[RP6 ArduIO]]&lt;br /&gt;
* [[RP6 ArduIO - Software]]&lt;br /&gt;
* [[Induktive_Ladestation_f%C3%BCr_den_RP6|Induktive Ladestation für den RP6]]&lt;br /&gt;
* [[IR-bake_f%C3%BCr_den_RP6|IR-bake für den RP6]]&lt;br /&gt;
* [[CCRP5]]&lt;br /&gt;
* [[Wild Thumper]]&lt;br /&gt;
* [[Wild Thumper - Programmierung]]&lt;br /&gt;
* [[Yeti]]&lt;br /&gt;
* [[Asuro]]&lt;br /&gt;
* [[C't-Bot]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Weblinks==&lt;br /&gt;
'''Siehe auch die Weblinks im [http://www.rn-wissen.de/index.php/RP6v2#Weblinks RP6v2] und im [http://www.rn-wissen.de/index.php/RP6#Weblinks RP6] Artikel!'''&lt;br /&gt;
&lt;br /&gt;
* [http://www.conrad.de/ce/de/product/1082384/Arexx-RP6-Sensor-Board-RP6-JM03-61 RP6 Sensor Board bei CONRAD]&lt;br /&gt;
* JM3 Engineering:&lt;br /&gt;
** [http://www.jm3-engineering.com/rp6.htm RP6 Roboter Erweiterung]&lt;br /&gt;
** [http://www.jm3-engineering.com/sensors.htm Sensor Module]&lt;br /&gt;
** [http://www.jm3-engineering.com/downloads.htm Software Downloads]&lt;br /&gt;
* Ankündigung einer Sensorerweiterungsplatine für die RP6v2 M256 WiFi im [http://www.roboternetz.de/community/threads/63595-Neue-Hardware-f%C3%BCr-RP6%28v2%29?p=590129&amp;amp;viewfull=1#post590129 Roboternetz RP6 Forum]&lt;br /&gt;
* Erfahrungsbericht zum Sensor Board im [http://www.arexx.com/forum/viewtopic.php?f=19&amp;amp;t=2498 AREXX Support Forum] und im [http://www.roboternetz.de/community/threads/64414-RP6-Sensor-Board-Erster-Eindruck Roboternetz RP6 Forum]&lt;br /&gt;
* Erfahrungsbericht zum I2C GPS Empfänger im [http://www.arexx.com/forum/viewtopic.php?f=19&amp;amp;t=2509 AREXX Support Forum]&lt;br /&gt;
* Erfahrungsbericht zum I2C BHT Modul im [http://www.arexx.com/forum/viewtopic.php?f=19&amp;amp;t=2646 AREXX Support Forum]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Kategorie:Robotikeinstieg]]	 &lt;br /&gt;
[[Kategorie:Praxis]]&lt;br /&gt;
&lt;br /&gt;
==Autoren==&lt;br /&gt;
--[http://www.roboternetz.de/community/members/1972-Dirk Dirk] 18:30, 23. Apr 2022 (CET)&lt;/div&gt;</summary>
		<author><name>Dirk NO2</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=RP6_Sensor_Board_und_Xtra_Module&amp;diff=28593</id>
		<title>RP6 Sensor Board und Xtra Module</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=RP6_Sensor_Board_und_Xtra_Module&amp;diff=28593"/>
				<updated>2022-04-23T16:29:18Z</updated>
		
		<summary type="html">&lt;p&gt;Dirk NO2: /* RP6 Sensor Board */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Bild:RP6_Sensor_Board.jpg|Das RP6 Sensor Board|right|500px]]&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_Xtra_module.JPG|RP6 Xtra module|right|500px]]&lt;br /&gt;
==Was bisher geschah==&lt;br /&gt;
'''Siehe auch &amp;quot;Was bisher geschah&amp;quot; im [http://www.rn-wissen.de/index.php/RP6v2#Was_bisher_geschah RP6v2] und im [http://www.rn-wissen.de/index.php/RP6#Was_bisher_geschah RP6] Artikel!'''&lt;br /&gt;
&lt;br /&gt;
Mit, 27. Nov 2013 - Ankündigung einer Sensorerweiterungsplatine, die an die RP6v2-M256-WIFI angeschlossen werden kann&amp;lt;br/&amp;gt;&lt;br /&gt;
Sam, 22. Feb 2014 - Auslieferungsbeginn des RP6 Sensor Boards, des I2C GPS Empfängers, des 3D Accelerometer Moduls und des Gyro Moduls&amp;lt;br/&amp;gt;&lt;br /&gt;
Mon, 17. Mär 2014 - Das RP6 Sensor Board ist &amp;quot;nicht lieferbar&amp;quot;, neuer Liefertermin angekündigt für den 12.06.2014 (!?)&amp;lt;br/&amp;gt;&lt;br /&gt;
Die, 25. Mär 2014 - Das RP6 Sensor Board ist wieder &amp;quot;sofort lieferbar&amp;quot;&amp;lt;br/&amp;gt;&lt;br /&gt;
August 2014 - Ein neues Xtra Modul wird von JM3 Engineering angekündigt: Das &amp;quot;Wetterstations Sensor Modul&amp;quot;&amp;lt;br/&amp;gt;&lt;br /&gt;
November 2014 - Das &amp;quot;Wetterstations Sensor Modul&amp;quot; ist bei [http://www.jm3-engineering.com/sensors.htm JM3 Engineering] als &amp;quot;BHT Modul&amp;quot; abgebildet und ein Manual verfügbar&amp;lt;br/&amp;gt;&lt;br /&gt;
Don, 22. Jan 2015 - Auslieferungsbeginn des BHT Moduls&amp;lt;br/&amp;gt;&lt;br /&gt;
Son, 18. Dez 2016 - Laut JM3 Engineering wird das 3D Accelerometer DIL Modul nicht mehr produziert, ist aber weiterhin erhältlich&amp;lt;br/&amp;gt;&lt;br /&gt;
Oktober 2017 - Das RP6 Sensor Board und der I2C GPS Empfänger sind bei CONRAD ausverkauft&amp;lt;br/&amp;gt;&lt;br /&gt;
April 2019 - Das Gyro Modul und das BHT Modul sind bei CONRAD ausverkauft&amp;lt;br/&amp;gt;&lt;br /&gt;
Mai 2020 - Die Experimentierplatine, das Backlight-Display, der Graustufen-Boden-Sensor, der Drehgeber-Satz RP6-ENCv3 und das 3D Accelerometer Modul sind bei CONRAD ausverkauft&amp;lt;br/&amp;gt;&lt;br /&gt;
Ende 2021 - Die RP6 CONTROL M32 Platine, die Ersatzräder, die Ersatzraupen und das RP6 USB-Interface RP6V2-TRANS sind bei CONRAD ausverkauft&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Allgemein==&lt;br /&gt;
Dieser Artikel beschreibt die Grundlagen und Programmierung des RP6 Sensor Boards und der RP6 Xtra Module. Dieses Erweiterungs-Modul und die Xtra Module sind Teile des RP6-Systems, das in den RN-Wissen-Artikeln [[RP6]], [[RP6v2]] und [[RP6_-_Programmierung|RP6 - Programmierung]] ausführlich beschrieben wird. Ausgegliedert aus den &amp;quot;Haupt-Artikeln&amp;quot; habe ich diese Module, da sie m.E. zu einer neuen &amp;quot;Ära&amp;quot; des RP6-Systems gehören:&lt;br /&gt;
&lt;br /&gt;
Sie wurden nicht mehr von '''[http://www.roboternetz.de/community/members/120-SlyD SlyD] (Dominik S. Herwald)''' in Zusammenarbeit mit '''[http://www.arexx.com/ AREXX]''' entwickelt, sondern ab 2013 von '''[http://jm3-engineering.com/ JM3 Engineering] (Dipl.-Ing. Jürgen Maisel)'''. Ab Februar 2014 waren dann das '''RP6 Sensor Board RP6-JM03-61''' ([http://www.conrad.de/ce/de/product/1082384/Arexx-RP6-Sensor-Board-RP6-JM03-61 1082384]) und die drei RP6 Xtra Module '''I2C GPS Empfänger JM3-GPS''' ([http://www.conrad.de/ce/de/product/1082385/Arexx-IC-GPS-Empfaenger-JM3-GPS 1082385]), '''Gyro Modul JM3-GYRO''' ([http://www.conrad.de/ce/de/product/1082386/Arexx-Gyro-Modul-JM3-GYRO 1082386]) und '''3D Accelerometer Modul JM3-3DA''' ([http://www.conrad.de/ce/de/product/1082387/Arexx-3D-Accelerometer-Modul-JM3-3DA 1082387]) bei CONRAD lieferbar. Einen ersten Eindruck vom Sensor Board kann man im RoboterNetz und AREXX Support Forum bekommen,- siehe unter [[RP6_Sensor_Board_und_Xtra_Module#Weblinks|Weblinks]]!&lt;br /&gt;
&lt;br /&gt;
===RP6 Sensor Board===&lt;br /&gt;
Das [[RP6_Sensor_Board_und_Xtra_Module#RP6_Sensor_Board_2|RP6 Sensor Board]] gehört zu den &amp;quot;Erweiterungs-Modulen&amp;quot; des RP6-Systems. '''Andere &amp;quot;Erweiterungs-Module&amp;quot; werden im [[RP6v2#Erweiterungs-Module|RP6v2]] und im [[RP6#Erweiterungs-Module|RP6]] Artikel beschrieben!'''&lt;br /&gt;
&lt;br /&gt;
Das ''RP6 Sensor Board'' ist das erste &amp;quot;Erweiterungs-Modul&amp;quot;, das nicht über einen eigenen Microprozessor verfügt,- es ist also ein ''passives Modul'', das von einem Microprozessor-System (z.B. RP6v2, M32, M128, M256 Wifi) angesteuert werden muss. Es ist ebenfalls das erste Modul, das nicht mehr über die trapezförmige Einbuchtung an der Vorderkante verfügt, sondern komplett rechteckig ist. Damit passt es (montiert auf den Standard-Abstandbolzen) nur auf den vorderen Platinenstapel 1 des RP6.&lt;br /&gt;
&lt;br /&gt;
===RP6 Xtra Module===&lt;br /&gt;
Die [[RP6_Sensor_Board_und_Xtra_Module#RP6_Xtra_Module_2|RP6 Xtra Module]] gehören zu den &amp;quot;Zubehör- und Ersatzteilen&amp;quot; des RP6-Systems. '''Über die weiteren &amp;quot;Zubehör- und Ersatzteile&amp;quot; zum RP6 informiert der entsprechende Abschnitt im [[RP6v2#Zubeh.C3.B6r_und_Ersatzteile|RP6v2]] und im [[RP6#Zubehör und Ersatzteile|RP6]] Artikel!'''&lt;br /&gt;
&lt;br /&gt;
Die ''RP6 Xtra Module'' unterscheiden sich von den weiteren &amp;quot;Zubehör- und Ersatzteilen&amp;quot; dadurch, dass sie selbstständige Sensor-Platinen sind, die ideal zum RP6-System passen, aber auch mit anderen Microcontroller-Plattformen nutzbar sind.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==RP6 Sensor Board==&lt;br /&gt;
Das RP6 Sensor Board RP6-JM03-61 ([http://www.conrad.de/ce/de/product/1082384/Arexx-RP6-Sensor-Board-RP6-JM03-61 1082384]) wurde am 27.11.2013 von [http://www.roboternetz.de/community/members/120-SlyD SlyD] angekündigt (siehe Weblink!).&lt;br /&gt;
&lt;br /&gt;
Aktuell (Oktober 2017) ist das RP6 Sensor Board bei CONRAD ausverkauft.&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_Sensor_Board.jpg|Das RP6 Sensor Board]]&lt;br /&gt;
&lt;br /&gt;
===Beschreibung===&lt;br /&gt;
(Laut Online-Katalog der Firma CONRAD!)&lt;br /&gt;
&lt;br /&gt;
''&amp;quot;Das RP6 Sensor Board erweitert die Möglichkeiten aller RP6 Roboter um wesentliche Sensorsignale für Robotik-Anwendungen wie zum Beispiel Dreharten (Yaw-Gyro), Kipp- und Neigewinkel, Kompassrichtung oder aber auch Zeit und Datum.&lt;br /&gt;
Sie können einfach mit zusätzlichen Sharp Sensoren Abstände genau messen, z.B. für autonome Fahrrouten oder falls der Sensor nach unten gerichtet ist, kann er Treppenstufen oder ähnliches entdecken. Außerdem gibt es die Möglichkeit z.B. die Sharp Sensoren ein- bzw. auszuschalten um Strom zu sparen. Zusätzlich können bis zu 8 Servos angesteuert werden um z.B. einen Roboterarm zu bewegen, der auch mechanisch einfach zu montieren ist. Um die Möglichkeiten des RP6 Sensor Boards komplett ausnutzen zu können, wird ein RP6V2 und RP6Wifi Control Board empfohlen. Die ermöglicht den Roboter über Wifi fernzusteuern oder Sensordaten auf dem Kommandozentrum (PC) z.B Kompassdaten, Temperatur oder Kipp- und Neigewinkel anzeigen zu lassen.&amp;quot;''&lt;br /&gt;
&lt;br /&gt;
'''Ausstattung'''&lt;br /&gt;
* Magnetometer- und Accelerometer für Kompassfunktion&lt;br /&gt;
* Gyro Sensor (Yaw)&lt;br /&gt;
* Sharp-Sensor Schnittstelle&lt;br /&gt;
* LED Scheinwerfer&lt;br /&gt;
* LED Treiber mit Smart Funktionen&lt;br /&gt;
* I²C Bus mit max. 400 kHz Übertragungsrate; Hot Swap I²C-Bus Buffer&lt;br /&gt;
* Taster mit LED&lt;br /&gt;
* Echtzeit-Uhr RTC&lt;br /&gt;
* Backupbatterie (Aufladung während des Betriebs)&lt;br /&gt;
* Expansion Port z.B. für GPS-I²C Bus Modul&lt;br /&gt;
* 8 Servo-Ausgänge mit eigenem Schaltregler&lt;br /&gt;
* 8 PWM Ausgänge&lt;br /&gt;
* 5 LED Ausgänge und 2 Digital-I/O Ausgänge.&lt;br /&gt;
&lt;br /&gt;
'''Lieferumfang'''&lt;br /&gt;
* RP6 Sensor Board&lt;br /&gt;
* Montage-Kit&lt;br /&gt;
* Kabel&lt;br /&gt;
* Anleitung und CD mit Dokumentation.&lt;br /&gt;
&lt;br /&gt;
====Blockschaltbild====&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_Sensor_Board_BSP.png|RP6 Sensor Board Blockschaltbild]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Technische Daten===&lt;br /&gt;
{|  {{Blauetabelle}} &lt;br /&gt;
|'''Mikrocontroller:'''&lt;br /&gt;
|kein&lt;br /&gt;
|-&lt;br /&gt;
|'''Speicher:'''&lt;br /&gt;
|kein&amp;lt;br/&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|'''Programmierung:'''&lt;br /&gt;
|C++ (GCC, u.a.) über externes µC-System&lt;br /&gt;
|-&lt;br /&gt;
|'''Vorhandene Sensoren:'''&lt;br /&gt;
|Temperatur, 3D Magnetfeld (Kompass), 3D Beschleunigung, Yaw-Gyro&amp;lt;br/&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|'''Vorhandene Aktoren:'''&lt;br /&gt;
|LED Controller (2 LEDs on board, 5 freie LED Ports), Status LED,&amp;lt;br/&amp;gt;Button, Servo (PWM) Controller für 8 Servos und 8 PWM-Kanäle,&amp;lt;br/&amp;gt;Real Time Clock (RTC), 2 freie I/O Ports&lt;br /&gt;
|-&lt;br /&gt;
|'''Abmessungen:'''&lt;br /&gt;
|(L &amp;amp;times; B &amp;amp;times; H) 112 &amp;amp;times; 90 &amp;amp;times; 19 mm&amp;lt;br/&amp;gt;(B + 5 mm durch Scheinwerfer vorn)&lt;br /&gt;
|-&lt;br /&gt;
|'''Ausführung:'''&lt;br /&gt;
|Fertig aufgebautes Erweiterungsmodul&lt;br /&gt;
|-&lt;br /&gt;
|'''Stromversorgung:'''&lt;br /&gt;
|6 AA NiMH Akkus (über die RP6v2 Base)&amp;lt;br/&amp;gt;und optionaler Zusatzakku 7,2..10 V für Servo Power&lt;br /&gt;
|-&lt;br /&gt;
|'''Hersteller:'''&lt;br /&gt;
|Arexx Niederlande&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Umbau-Optionen===&lt;br /&gt;
Hier soll beschrieben werden, welche Umbau-Optionen es für das RP6 Sensor Board gibt. Im Text gibt es Verweise auf den Schaltplan des RP6 Sensor Boards (RP6_Sensor_Board_Rev2_Schema.pdf) in der Form: (SP2: Bauteil). Dies bedeutet, dass man das Bauteil auf Blatt 2 des Schaltplans finden kann. Beispielhaft sind im folgenden Text Bestell-Nummern der Firma [http://www.conrad.de/ce/ CONRAD] genannt. Natürlich kann man die Teile auch bei anderen Versendern beziehen.&lt;br /&gt;
&lt;br /&gt;
====USRBUS- und XBUS-Wannenstecker====&lt;br /&gt;
Der zweite Wannenstecker für den XBUS (SP3: K14) und USRBUS (SP3: K16) kann nachbestückt werden.&lt;br /&gt;
Man braucht dazu: &lt;br /&gt;
* 2 Wannenstecker 2x7-polig gerade RM 2,54mm (CONRAD [http://www.conrad.de/ce/de/product/741687/Stiftleiste-Print-Montage-gerade-Rastermass-254-mm-Pole-2-x-7-10120556-BKL-Electronic-Inhalt-1-St 741687])&lt;br /&gt;
Die Wannenstecker lötet man auf die eingezeichneten Positionen.&lt;br /&gt;
&lt;br /&gt;
'''USRBUS-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''USRBUS''' || '''Sensor Board-Funktion''' || '''Verwendung''' || '''I/O'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Y1 || &amp;quot;ADC0&amp;quot; || SHARP vorn || I&lt;br /&gt;
|-&lt;br /&gt;
| 2 || Y2 || &amp;quot;ADC1&amp;quot; || Yaw-Gyro || I&lt;br /&gt;
|-&lt;br /&gt;
| 3 || Y3 || PWR || Power für&amp;lt;br/&amp;gt;SHARPs, CAM_IF,&amp;lt;br/&amp;gt;I2C-MODULE || O&lt;br /&gt;
|-&lt;br /&gt;
| 4 || Y4 || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 5 || Y5 || &amp;quot;ADC4&amp;quot; || SHARP hinten ||I&lt;br /&gt;
|-&lt;br /&gt;
| 6..14 || Y6..Y14 || || keine ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
'''XBUS-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''XBUS''' || '''M256-Port''' ||'''M256-Funktion''' || '''Sensor Board-Funktion''' || '''Jumper''' || '''Verwendung''' || '''I/O'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || GND || || GND || GND || || ||&lt;br /&gt;
|-&lt;br /&gt;
| 2 || GND || || GND || GND || || ||&lt;br /&gt;
|-&lt;br /&gt;
| 3 || VDD || || VDD|| VDD_1 || || VDD +5V ||&lt;br /&gt;
|-&lt;br /&gt;
| 4 || +UB || || +UB || VSS_1 || || CAM_IF Power ||&lt;br /&gt;
|-&lt;br /&gt;
| 5 || VDD || || VDD || VDD_1 || || VDD +5V ||&lt;br /&gt;
|-&lt;br /&gt;
| 6 || +UB || || +UB || VSS_1 || || CAM_IF Power ||&lt;br /&gt;
|-&lt;br /&gt;
| 7 || INTU || PJ4 || PCINT13 || INTU || || keine || I&lt;br /&gt;
|-&lt;br /&gt;
| 8 || INT1 || PJ3 || PCINT12 || INT1 || 3 || LSM303DLHC: INT1 || I&lt;br /&gt;
|-&lt;br /&gt;
| 9 || INT3 || PJ5 || PCINT14 || INT3 || 2&amp;lt;br/&amp;gt;5 || DS1339: SQW/INT_N&amp;lt;br/&amp;gt;LSM303DLHC: INT2 || I&amp;lt;br/&amp;gt;I&lt;br /&gt;
|-&lt;br /&gt;
| 10 || SCL || PD0 || SCL || SCL_M || || I2C-Bus || O&lt;br /&gt;
|-&lt;br /&gt;
| 11 || INT2 || PJ6 || PCINT15 || INT2 || 4 || MAX7311: INT_N || I&lt;br /&gt;
|-&lt;br /&gt;
| 12 || SDA || PD1 || SDA || SDA_M || || I2C-Bus || I/O&lt;br /&gt;
|-&lt;br /&gt;
| 13 || MRESET || || MRESET || MRESET || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 14 || GND || || GND || GND || || ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====I/O-Patchfield_1====&lt;br /&gt;
Dieses 2x 5-polige &amp;quot;Patchfield_1&amp;quot; (SP3: K8), beschriftet mit &amp;quot;I/O&amp;quot; liegt neben dem Wannenstecker I/O und weist dieselbe Belegung auf. Möchte man auf dem Sensor Board Verbindungen über den Wannenstecker I/O zu einer angeschlossenen Microprozessor-Platine herstellen, dann kann man auf das &amp;quot;Patchfield_1&amp;quot; eine Stiftleiste löten.&lt;br /&gt;
Man braucht dazu: &lt;br /&gt;
* 2-reihige Stiftleiste RM 2,54mm (z.B. 2x40-polig [http://www.conrad.de/ce/de/product/741306/Doppelreihige-Stiftleiste-RM-254-gerade-Pole-2-x-40-10120173-BKL-Electronic-Inhalt-1-St 741306]) &lt;br /&gt;
Man trennt von der 2-reihigen Stiftleiste 2x5 Kontakte ab und lötet sie auf die Lötpunkte &amp;quot;I/O&amp;quot;. Zuvor muss man u.U. Lötzinnreste aus den Lötpunkten mit Entlötlitze bzw. Entlötsaugpumpe entfernen.&lt;br /&gt;
&lt;br /&gt;
'''Stecker I/O an M256 IO_PWM/T0/T1:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''M256-Port''' ||'''M256-Funktion''' || '''Sensor Board-Funktion''' || '''Verwendung''' || '''I/O'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || PD4 || ICP1 || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 2 || || GND || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 3 || PD6 || T1 || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 4 || PB7 || OC0A || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 5 || PG5 || OC0B || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 6 || PD7 || T0 || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 7 || PB5 || OC1A || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 8 || PK5 || ADC13 || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 9 || PB6 || OC1B || &amp;quot;PD5&amp;quot; || I2C Bus Buffer Enable || O&lt;br /&gt;
|-&lt;br /&gt;
| 10 || || VDD || || keine ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====ADC-Patchfield_2====&lt;br /&gt;
Dieses 2x 5-polige &amp;quot;Patchfield_2&amp;quot; (SP3: K9), beschriftet mit &amp;quot;ADC&amp;quot; liegt neben dem Wannenstecker ADC und weist dieselbe Belegung auf. Möchte man auf dem Sensor Board Verbindungen über den Wannenstecker ADC zu einer angeschlossenen Microprozessor-Platine herstellen, dann kann man auf das &amp;quot;Patchfield_2&amp;quot; eine Stiftleiste löten.&lt;br /&gt;
Man braucht dazu: &lt;br /&gt;
* 2-reihige Stiftleiste RM 2,54mm (z.B. 2x40-polig [http://www.conrad.de/ce/de/product/741306/Doppelreihige-Stiftleiste-RM-254-gerade-Pole-2-x-40-10120173-BKL-Electronic-Inhalt-1-St 741306]) &lt;br /&gt;
Man trennt von der 2-reihigen Stiftleiste 2x5 Kontakte ab und lötet sie auf die Lötpunkte &amp;quot;ADC&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
'''Stecker ADC an M256 ADC_IO2/CMP:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''M256-Port''' ||'''M256-Funktion''' || '''Sensor Board-Funktion''' || '''Jumper''' || '''Verwendung''' || '''I/O'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || PK0 || ADC8 || || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 2 || || GND || || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 3 || PK1 || ADC9 || &amp;quot;ADC4&amp;quot; || 6 || SHARP hinten || I&lt;br /&gt;
|-&lt;br /&gt;
| 4 || PE3 || OC3A/AIN1 || || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 5 || PK2 || ADC10 || || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 6 || || GND || || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 7 || PK3 || ADC11 || || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 8 || PE2 || XCK0/AIN0 || || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 9 || PK4 || ADC12 || || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 10 || || VDD || || || keine ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Anschluss-Optionen===&lt;br /&gt;
Hier soll beschrieben werden, welche Anschluss-Optionen es für das RP6 Sensor Board gibt. In erster Linie geht es dabei um die Belegung der vorhandenen Stecker bzw. Stiftleisten.&lt;br /&gt;
&lt;br /&gt;
Allgemein kann man Anschlüsse an Stiftleisten mit entsprechenden Steckbuchsen erreichen. Solche Steckbuchsen sind z.B. bei ELV erhältlich:&lt;br /&gt;
* Steckbuchse, 2-polig, RM 2,54mm ([http://www.elv.de/steckbuchse-2-polig.html ELV 68-016635])&lt;br /&gt;
* Steckbuchse, 3-polig, RM 2,54mm ([http://www.elv.de/steckbuchse-3-polig.html ELV 68-022503])&lt;br /&gt;
* Steckbuchse, 5-polig, RM 2,54mm ([http://www.elv.de/steckbuchse-5-polig.html ELV 68-023073])&lt;br /&gt;
Die Crimpkontakte dieser Steckbuchse werden an Litzen angequetscht (oder angelötet) und zum entsprechenden Sensor bzw. Aktor geführt. &lt;br /&gt;
&lt;br /&gt;
====I2C-MODULE====&lt;br /&gt;
Der I2C-MODULE Anschluss (SP1: M1) auf dem Sensor Board besteht aus einer 9-poligen Präzisions-Buchsenleiste RM 2,54mm (z.B. [http://www.conrad.de/ce/de/product/741360/Praezisions-Buchsenleiste-RM-254-gerade-Pole-1-x-20-10120832-BKL-Electronic-Inhalt-1-St 741360]). Wenn man eigene I2C-Module hier anschliessen will, braucht man zur Kontaktierung:&lt;br /&gt;
* Präzisions-Stiftleiste, 9-polig, RM 2,54mm (z.B. [http://www.conrad.de/ce/de/product/741307/Praezisions-Stiftleiste-RM-254-gerade-Pole-1-x-20-10120536-BKL-Electronic-Inhalt-1-St 741307])&lt;br /&gt;
&lt;br /&gt;
'''I2C-MODULE-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''Sensor Board&amp;lt;br/&amp;gt;-Funktion (M1)''' || '''Verwendung''' || '''I/O''' |||| [[RP6_Sensor_Board_und_Xtra_Module#I2C_GPS_Empf.C3.A4nger_JM3-GPS|'''I2C GPS Empfänger]]&amp;lt;br/&amp;gt;-Funktion (K1)''' ||&lt;br /&gt;
[[RP6_Sensor_Board_und_Xtra_Module#BHT_Modul_JM3-BHT31|'''BHT Modul]]&amp;lt;br/&amp;gt;-Funktion (K1)'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || VCC || +5V || |||| VCC_1 || VDD&lt;br /&gt;
|-&lt;br /&gt;
| 2 || SCLOUT || Buffered I2C-Bus || O |||| SCL/SCK || SCL&lt;br /&gt;
|-&lt;br /&gt;
| 3 || SDAOUT || Buffered I2C-Bus || I/O |||| SDA/MOSI || SDA&lt;br /&gt;
|-&lt;br /&gt;
| 4 || NC || keine || |||| ||&lt;br /&gt;
|-&lt;br /&gt;
| 5 || I/O1 || Status LED || O |||| ||&lt;br /&gt;
|-&lt;br /&gt;
| 6 || I/O2 || Taster || I |||| ||&lt;br /&gt;
|-&lt;br /&gt;
| 7 || NC || keine || |||| ||&lt;br /&gt;
|-&lt;br /&gt;
| 8 || GND || GND (geschaltet!) || |||| GND || GND&lt;br /&gt;
|-&lt;br /&gt;
| 9 || GND || GND (geschaltet!) || |||| GND || GND&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====CAM_IF====&lt;br /&gt;
Der CAM_IF Anschluss (SP1: K28) ist eine 2x 3-polige Stiftleiste mit der folgenden Belegung:&lt;br /&gt;
&lt;br /&gt;
'''CAM_IF-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''Sensor Board&amp;lt;br/&amp;gt;-Funktion (K28)''' || '''Verwendung''' || '''I/O'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || GND || GND (geschaltet!) ||&lt;br /&gt;
|-&lt;br /&gt;
| 2 || VSS_1 || +7,2..10V (RP6: +UB) ||&lt;br /&gt;
|-&lt;br /&gt;
| 3 || SCLOUT || Buffered I2C-Bus || O&lt;br /&gt;
|-&lt;br /&gt;
| 4 || SDAOUT || Buffered I2C-Bus || I/O&lt;br /&gt;
|-&lt;br /&gt;
| 5 || SCL_M || I2C-Bus || O&lt;br /&gt;
|-&lt;br /&gt;
| 6 || SDA_M || I2C-Bus || I/O&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====IO_EXT====&lt;br /&gt;
Der IO_EXT Anschluss (SP1: K19) ist eine 2x 2-polige Stiftleiste mit der folgenden Belegung:&lt;br /&gt;
&lt;br /&gt;
'''IO_EXT-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''Sensor Board&amp;lt;br/&amp;gt;-Funktion (K19)''' || '''Verwendung''' || '''I/O'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || MAX7311: I/O1.2 || freier I/O Port || I/O&lt;br /&gt;
|-&lt;br /&gt;
| 2 || GND || ||&lt;br /&gt;
|-&lt;br /&gt;
| 3 || MAX7311: I/O1.1 || freier I/O Port || I/O&lt;br /&gt;
|-&lt;br /&gt;
| 4 || GND || ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====PWM_OUT====&lt;br /&gt;
Der PWM_OUT Anschluss (SP5: K12) ist eine 2x 4-polige Stiftleiste mit der folgenden Belegung:&lt;br /&gt;
&lt;br /&gt;
'''PWM_OUT-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''Sensor Board&amp;lt;br/&amp;gt;-Funktion (K12)''' || '''Verwendung''' || '''I/O'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || PCA9685: PWM0 || freier PWM Port || O&lt;br /&gt;
|-&lt;br /&gt;
| 2 || PCA9685: PWM1 || freier PWM Port || O&lt;br /&gt;
|-&lt;br /&gt;
| 3 || PCA9685: PWM2 || freier PWM Port || O&lt;br /&gt;
|-&lt;br /&gt;
| 4 || PCA9685: PWM3 || freier PWM Port || O&lt;br /&gt;
|-&lt;br /&gt;
| 5 || PCA9685: PWM4 || freier PWM Port || O&lt;br /&gt;
|-&lt;br /&gt;
| 6 || PCA9685: PWM5 || freier PWM Port || O&lt;br /&gt;
|-&lt;br /&gt;
| 7 || PCA9685: PWM6 || freier PWM Port || O&lt;br /&gt;
|-&lt;br /&gt;
| 8 || PCA9685: PWM7 || freier PWM Port || O&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====TP1====&lt;br /&gt;
Am Testpunkt TP1 (SP4: TP1) kann man das Signal SQW/INT_N der RTC (DS1339) prüfen/messen.&lt;br /&gt;
&lt;br /&gt;
====LEDs====&lt;br /&gt;
=====Rücklichter=====&lt;br /&gt;
Der Rücklichter Anschluss (SP1: K10) ist eine 2-polige Stiftleiste mit der folgenden Belegung:&lt;br /&gt;
&lt;br /&gt;
'''Rücklichter-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''Sensor Board&amp;lt;br/&amp;gt;-Funktion (K10)''' || '''Verwendung''' || '''I/O'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || TCA6507: P3 || Rücklicht rechts || O&lt;br /&gt;
|-&lt;br /&gt;
| 2 || TCA6507: P4 || Rücklicht links || O&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=====Display-Hintergrundbeleuchtung=====&lt;br /&gt;
Der Display-Hintergrundbeleuchtung Anschluss (SP1: K7) ist eine 2-polige Stiftleiste mit der folgenden Belegung:&lt;br /&gt;
&lt;br /&gt;
'''Display-Hintergrundbeleuchtung-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''Sensor Board&amp;lt;br/&amp;gt;-Funktion (K7)''' || '''Verwendung''' || '''I/O'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || TCA6507: P0 || Display-Hintergrundbeleuchtung || O&lt;br /&gt;
|-&lt;br /&gt;
| 2 || VDD_1 || +5V ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=====Freie Ausgänge=====&lt;br /&gt;
Der freie Ausgang 1 Anschluss (SP1: K4) ist eine 2-polige Stiftleiste mit der folgenden Belegung:&lt;br /&gt;
&lt;br /&gt;
'''Freier Ausgang 1-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''Sensor Board&amp;lt;br/&amp;gt;-Funktion (K4)''' || '''Verwendung''' || '''I/O'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || TCA6507: P1 || freier LED Port || O&lt;br /&gt;
|-&lt;br /&gt;
| 2 || VDD_1 || +5V ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Der freie Ausgang 2 Anschluss (SP1: K2) ist eine 2-polige Stiftleiste mit der folgenden Belegung:&lt;br /&gt;
&lt;br /&gt;
'''Freier Ausgang 2-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''Sensor Board&amp;lt;br/&amp;gt;-Funktion (K2)''' || '''Verwendung''' || '''I/O'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || TCA6507: P2 || freier LED Port || O&lt;br /&gt;
|-&lt;br /&gt;
| 2 || VDD_1 || +5V ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====SHARP Sensoren====&lt;br /&gt;
Das RP6 Sensor Board verfügt über zwei Stecker SHARP_F (SP1: K5) und SHARP_R (SP1: K3) zum Anschluß von analogen SHARP Infrarot-Distanz-Sensoren. Folgende SHARP Sensoren sind anschließbar:&lt;br /&gt;
* 1. SHARP Distanz-Sensor GP2Y0A41SK0F ([http://www.conrad.de/ce/de/product/504596/Distanz-Sensor-GP2Y0A41SK0F-Sharp-GP2Y0A41SK0F-Messbereiche-Erfassungsbereich-4-30-cm-5-VDC 504596]), Messbereich 4..30cm&lt;br /&gt;
* 2. SHARP Distanz-Sensor GP2Y0A21YK0F ([http://www.conrad.de/ce/de/product/504591/Distanz-Sensor-GP2Y0A21YK0F-Sharp-GP2Y0A21YK0F-Messbereiche-Erfassungsbereich-10-80-cm-5-VDC 504591]), Messbereich 10..80cm&lt;br /&gt;
* 3. SHARP Distanz-Sensor GP2Y0A02YK ([http://www.conrad.de/ce/de/product/185364/Distanz-Sensor-GP-2-Y0A-02-YK-Sharp-GP-2-Y0A-02-YK-Messbereiche-Erfassungsbereich-20-150-cm-5-VDC 185364]), Messbereich 20..150cm&lt;br /&gt;
* 4. SHARP Distanz-Sensor GP2Y0A710K0F ([http://www.conrad.de/ce/de/product/504597/Distanz-Sensor-GP2Y0A710K0F-Sharp-GP2Y0A710K0F-Messbereiche-Erfassungsbereich-100-550-cm-5-VDC 504597]), Messbereich 100..550cm&lt;br /&gt;
''Die Auswahl der geeigneten SHARP Sensoren hängt von der gewünschten Funktion ab: Zur Erkundung großer Räume eignet sich insbesondere der Typ 4 mit einer hohen Reichweite von 5,5m. Er ist aber ungeeignet, die Distanz von Objekten zu erkennen, die sich näher als 1m vor dem Sensor befinden. Ein guter Kompromiss zwischen Nahbereichsmessung und &amp;quot;Fernsicht&amp;quot; sind die Typen 2 (10..80cm) und 3 (20..150cm). Will man den Distanz-Sensor vor allem zur Vermeidung eins Sturzes von einer Treppe (Tiefenerkennung) oder nur zur Erkennung von Hindernissen direkt vor dem Roboter (Kollisionserkennung) benutzen, dann eignet sich insbesondere für den vorderen Sensor (SHARP_F) der Typ 1, da er im Nahbereich von 4 bis 30cm messen kann.''&lt;br /&gt;
&lt;br /&gt;
Für die Verbindung zwischen den beiden 3-poligen JST XH Steckern (K3, 5) auf dem Sensor Board und den SHARP-Sensoren braucht man auf der Sensor Board Seite folgende Stecker-/buchsenteile:&lt;br /&gt;
* 2x JST XH Gehäuse, 3-polig, RM 2,5mm ([http://www.conrad.de/ce/de/product/740583/Gehaeuse-RM-25-mm-Serie-XH-Rastermass-25-mm-Pole-3-Nennstrom-3-A-XHP-3-JST-Inhalt-1-St 740583])&lt;br /&gt;
* 6x JST XH Crimpkontakt f. RM 2,5mm ([http://www.conrad.de/ce/de/product/741112/Crimpkontakt-fuer-RM-25-mm-Serie-XH-Rastermass-25-mm-BXH-001T-P06-JST-Inhalt-1-St 741112])&lt;br /&gt;
Die Crimpkontakte dieser Steckbuchse werden an die meist 3-adrige Litze des Sensors angequetscht (oder angelötet). Zur Belegung des Sensor Anschlusses siehe das jeweilige Datenblatt!&lt;br /&gt;
&lt;br /&gt;
=====Vorn=====&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_Sensor_Board_SHARP_F.JPG|RP6 Sensor Board SHARP Sensor vorn|thumb]]&lt;br /&gt;
&lt;br /&gt;
Der vordere SHARP Sensor kann auch mechanisch am Sensor Board befestigt werden. Dazu gibt es an der Vorderkante der Platine zwei Befestigungslöcher.&lt;br /&gt;
&lt;br /&gt;
Das Bild rechts zeigt den SHARP Distanzsensor GP2Y0A02YK montiert vorn auf dem Sensor Board mit zwei M3 Gelenkbolzen ([http://www.conrad.de/ce/de/product/521043/Gelenkbolzen-1-x-Aussengewinde1-x-Innengewinde-Messing-vernickelt-Schluesselweite-55-mm/ 521043]) und passenden Schrauben/Muttern.&lt;br /&gt;
&lt;br /&gt;
'''Vorn-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''RP6v2-Port''' ||'''RP6v2-Funktion''' || '''Sensor Board&amp;lt;br/&amp;gt;-Funktion (K5)''' || '''Verwendung''' || '''I/O''' |||| '''SHARP Sensor&amp;lt;br/&amp;gt;-Funktion''' &lt;br /&gt;
|-&lt;br /&gt;
| 1 || PA0 || ADC0 || &amp;quot;ADC0&amp;quot; || SHARP vorn || I |||| Vo&lt;br /&gt;
|-&lt;br /&gt;
| 2 || || || VDD_1 || +5V || |||| Vcc&lt;br /&gt;
|-&lt;br /&gt;
| 3 || || || GND || GND (geschaltet!) || |||| GND&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=====Hinten=====&lt;br /&gt;
Der hintere SHARP Sensor kann z.B. an der Rückseite des RP6v2 Fahrgestells befestigt werden.&lt;br /&gt;
&lt;br /&gt;
'''Hinten-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''M256-Port''' ||'''M256-Funktion''' || '''Sensor Board&amp;lt;br/&amp;gt;-Funktion (K3)''' || '''Verwendung''' || '''I/O''' |||| '''SHARP Sensor&amp;lt;br/&amp;gt;-Funktion''' &lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| 1 || PK1 || ADC9 || &amp;quot;ADC4&amp;quot; || SHARP hinten || I |||| Vo&lt;br /&gt;
|-&lt;br /&gt;
| 2 || || || VDD_1 || +5V || |||| Vcc&lt;br /&gt;
|-&lt;br /&gt;
| 3 || || || GND || GND (geschaltet!) || |||| GND&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Servos====&lt;br /&gt;
=====Power=====&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_Sensor_Board_Servo-PWR.jpg|RP6 Sensor Board Servo-PWR Stecker|thumb]]&lt;br /&gt;
&lt;br /&gt;
An den SERVO_PWR Stecker (SP5: K1) muss ein Akku zur Stromversorgung der mit dem Sensor Board verbundenen Servos angeschlossen werden. Der Stecker hat folgende Belegung:&lt;br /&gt;
 &lt;br /&gt;
'''SERVO_PWR-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''Sensor Board&amp;lt;br/&amp;gt;-Funktion (K1)''' || '''Verwendung'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || GND_POWER || Servo Power GND&lt;br /&gt;
|-&lt;br /&gt;
| 2 || VSS_POWER || Servo Power Eingang +7,2..10V&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Der Akku zur Versorgung der Servos muss eine Nennspannung von 7,2..10V aufweisen. Der Schaltregler auf dem Sensor Board kann bei einer 5,0V Servo-Spannung Ströme bis 3,0A (Spitzen bis 5,0A) liefern. '''Die Polung des Akkus darf am Stecker SERVO_PWR nicht vertauscht werden.''' Siehe den oberen Teil der nebenstehenden Abbildung! Ratsam ist es, eine Sicherung 3,15A in die Plusleitung zwischen Akku und SERVO_PWR Stecker zu legen.&lt;br /&gt;
&lt;br /&gt;
Für die Verbindung zwischen dem 2-poligen JST XH Stecker (SERVO_PWR, K1) auf dem Sensor Board und dem Akku braucht man auf der Sensor Board Seite folgende Stecker-/buchsenteile:&lt;br /&gt;
* JST XH Gehäuse, 2-polig, RM 2,5mm ([http://www.conrad.de/ce/de/product/740549/Gehaeuse-RM-25-mm-Serie-XH-Rastermass-25-mm-Pole-2-Nennstrom-3-A-XHP-2-JST-Inhalt-1-St 740549])&lt;br /&gt;
* 2x JST XH Crimpkontakt f. RM 2,5mm ([http://www.conrad.de/ce/de/product/741112/Crimpkontakt-fuer-RM-25-mm-Serie-XH-Rastermass-25-mm-BXH-001T-P06-JST-Inhalt-1-St 741112])&lt;br /&gt;
Die Crimpkontakte dieser Steckbuchse werden an die 2-adrige Litze zum Akku angequetscht (oder angelötet).&lt;br /&gt;
&lt;br /&gt;
Wenn man keinen separaten Akku zur Versorgung der Servos nehmen will, kann man auch +UB der RP6v2 Base dafür nutzen. An +UB liegt die Akkuspannung der Base (Nennspannung 7,2V) über eine Sicherung F1 3,15A (RP6v2) bzw. 2,5A (RP6) auf dem Mainboard an. +UB kann man z.B. am [[RP6#EXT_Anschlu.C3.9F|EXT Anschluß der Base]] entnehmen. Die nebenstehende Abbildung zeigt im unteren Teil, an welchen Pins man dort +UB kontaktieren kann!&lt;br /&gt;
&lt;br /&gt;
Dabei ist zu beachten, dass die Sicherung F1 auf dem RP6(v2) Mainboard den nutzbaren Strom für die Servos deutlich begrenzt: Durch diese Sicherung fließt ja nicht nur der Servo-Strom, sondern auch der Strom für den RP6 und alle darauf montierten Zusatzplatinen. Wenn der RP6 also herumfährt und z.B. noch die IRCOMM-Sendedioden nutzt, bleibt kaum noch Stromreserve für die Servos auf dem Sensor Board übrig.&lt;br /&gt;
'''Das bedeutet: Man sollte unbedingt einen separaten Akku für die Servos auf dem Sensor Board benutzen!'''&lt;br /&gt;
&lt;br /&gt;
======SERVO_PWR-EXT Verbindung======&lt;br /&gt;
Für die Verbindung zwischen dem 2-poligen JST XH Stecker (SERVO_PWR, K1) auf dem Sensor Board und dem 8-poligen JST XH Stecker (EXT) auf dem RP6v2 Mainboard braucht man folgende Stecker-/buchsenteile:&lt;br /&gt;
* JST XH Gehäuse, 2-polig, RM 2,5mm ([http://www.conrad.de/ce/de/product/740549/Gehaeuse-RM-25-mm-Serie-XH-Rastermass-25-mm-Pole-2-Nennstrom-3-A-XHP-2-JST-Inhalt-1-St 740549])&lt;br /&gt;
* JST XH Gehäuse, 8-polig, RM 2,5mm ([http://www.conrad.de/ce/de/product/740928/Gehaeuse-RM-25-mm-Serie-XH-Rastermass-25-mm-Pole-8-Nennstrom-3-A-XHP-8-JST-Inhalt-1-St 740928])&lt;br /&gt;
* 10x JST XH Crimpkontakt f. RM 2,5mm ([http://www.conrad.de/ce/de/product/741112/Crimpkontakt-fuer-RM-25-mm-Serie-XH-Rastermass-25-mm-BXH-001T-P06-JST-Inhalt-1-St 741112])&lt;br /&gt;
Mit einer 2-adrigen Litze, die beidseits mit den Crimpkontakten verquetscht (oder verlötet) wird, verbindet man dann den SERVO_PWR Stecker mit dem EXT Stecker, wie in der Abbildung oben gezeigt. ''Achtung: Plus (+) und Minus (-) nicht vertauschen!''&lt;br /&gt;
 Ein passendes Kabel soll zukünftig (*) mitgeliefert werden.&lt;br /&gt;
&lt;br /&gt;
Auf dem RP6 Mainboard ist der 8-polige EXT Stecker noch nicht bestückt. Wenn man ihn nachrüsten will, muss man noch bestellen:&lt;br /&gt;
* JST XH Stiftleiste gerade, 8-polig, RM 2,5mm ([http://www.conrad.de/ce/de/product/740105/Stiftleiste-gerade-RM-25-mm-Serie-XH-Rastermass-25-mm-Pole-8-Nennstrom-3-A-B8B-XH-A-LFSN-JST-Inhalt-1-St 740105])&lt;br /&gt;
Die Stiftleiste wird auf das RP6 Mainboard gelötet, dabei weisen die beiden Einkerbungen an einer Längsseite der Stiftleiste nach hinten zum Rand des Mainboards.&lt;br /&gt;
 Auch diese Stiftleiste soll zukünftig (*) zum Lieferumfang gehören.&lt;br /&gt;
'''Zu *)''' Meinem RP6 Sensor Board (bestellt am 1.3.2014) lag das konfektionierte Kabel und die Stiftleiste noch nicht bei!&lt;br /&gt;
&lt;br /&gt;
=====Stecker=====&lt;br /&gt;
An die acht 3-poligen Stiftleisten SERVO_1 bis SERVO_8 (SP5: K6, 11, 29..34) können Servos angeschlossen werden. Direkt aufstecken kann man Servo-Steckbuchsen mit der Belegung von CONRAD, Graupner/JR und Robbe/Futaba (Versorgungsspannung Plus am mittleren Pin). Auf der Sensor Board Platine kann man den Pin 3 (Servo Power GND) der 3-poligen Stiftleisten daran erkennen, dass er näher zum rechten Platinenrand (Seite mit dem XBUS Stecker) angeordnet ist als der zugehörige Pin 1 (Servo Signal).&lt;br /&gt;
&lt;br /&gt;
Wenn Servos mit nicht passender Steckbuchse angeschlossen werden sollen, dann braucht man auf der Sensor Board Seite folgende Stecker-/buchsenteile für jedes Servo:&lt;br /&gt;
* Steckbuchse, 3-polig, RM 2,54mm ([http://www.elv.de/steckbuchse-3-polig.html ELV 68-022503])&lt;br /&gt;
Die Crimpkontakte dieser Steckbuchse werden an die 3-adrige Litze des Servos angequetscht (oder angelötet). &lt;br /&gt;
&lt;br /&gt;
'''SERVO_1..8-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''Sensor Board&amp;lt;br/&amp;gt;-Funktion (K6,11,29..34)''' || '''Verwendung''' || '''I/O''' |||| '''Servo-&amp;lt;br/&amp;gt;Kabelfarben'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || PCA9685: PWM15..8 || Servo Signal || O |||| Weiß, Orange&lt;br /&gt;
|-&lt;br /&gt;
| 2 || Servo_PWR || Servo Power +5V (geschaltet!) || |||| Rot&lt;br /&gt;
|-&lt;br /&gt;
| 3 || GND_POWER || Servo Power GND || |||| Schwarz, Braun&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Roboterarm RA2-HOBBY====&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_Sensor_Board_RA2-MINI.JPG|RP6 Sensor Board mit Roboterarm RA2-MINI|thumb]]&lt;br /&gt;
&lt;br /&gt;
In der Anleitung zum RP6 Sensor Board ist der Arexx Roboterarm RA2-HOBBY bzw. RA2-MINI [http://www.conrad.de/ce/de/product/191534/Arexx-Mini-Roboterarm-RA2-MINI (191534)] abgebildet. Er ist dort ohne Grundgestell und Controller-Platine auf dem Sensor Board befestigt.&lt;br /&gt;
Das Sensor Board eignet sich sehr gut zur Ansteuerung der 6 Servos des Roboterarms.&lt;br /&gt;
&lt;br /&gt;
Zur Montage des RA2-MINI auf dem Sensor Board geht man so vor:&lt;br /&gt;
* Lösen der 4 Rundkopfschrauben M3x6, die die Servobodenplatte mit den Abstandbolzen M3x30 auf der Controller-Platine verbinden (siehe Anleitung zum RA2-MINI, Seite 19!)&lt;br /&gt;
* Lösen der Servobodenplatte vom Bodenservo (siehe Anleitung zum RA2-MINI, Seite 8!)&lt;br /&gt;
* Bohren der Befestigungslöcher in die Servobodenplatte:&lt;br /&gt;
** Rechts-Links Lochabstand 4,75cm, Vorn-Hinten Lochabstand 4,1cm&lt;br /&gt;
** Ungefähre Lage der Löcher siehe Abbildung in der Anleitung zum Sensor Board, Seite 4!&lt;br /&gt;
** Markierung der Bohrlöcher auf der Rückseite der Servobodenplatte:&lt;br /&gt;
*** 1. Mit einer Hilfslinie die Hinterkante des Servoausschnitts (das ist die kürzere Kante, die näher am Rand der Bodenplatte liegt!) nach beiden Seiten verlängern&lt;br /&gt;
*** 2. Eine 2. Hilfslinie parallel zur ersten im Abstand von 1,4cm zur Mitte der Servobodenplatte hin einzeichnen&lt;br /&gt;
*** 3. Auf dieser Linie jetzt die beiden hinteren Bohrlöcher symmetrisch im Abstand von 4,75cm markieren&lt;br /&gt;
*** 4. Für die vorderen Bohrlöcher eine 3. Hilfslinie im Abstand von 4,1cm parallel zur 2. Linie einzeichnen&lt;br /&gt;
*** 5. Auf dieser Linie die beiden vorderen Bohrlöcher symmetrisch im Abstand von 4,75cm markieren&lt;br /&gt;
*** 6. Kontrolle: Die 4 markierten Bohrlochpositionen bilden ein Rechteck mit 4,1cm seitlicher und 4,75cm vorderer/hinterer Kantenlänge&lt;br /&gt;
** Bohren der 4 Löcher (D = 3,2mm) in die Servobodenplatte&lt;br /&gt;
* Befestigen des Bodenservos auf der Servobodenplatte (siehe Anleitung zum RA2-MINI, Seite 8!)&lt;br /&gt;
* Anbringen des Roboterarms auf dem Sensor Board mit 4 Abstandbolzen M3 (L = 30..50mm) und passenden Schrauben/Muttern&lt;br /&gt;
&lt;br /&gt;
Die Servo-Steckbuchsen werden dann ''in der selben Reihenfolge (S1..S6) wie vorher auf der Controller-Platine des Roboterarms'' auf die Stiftleisten SERVO_1 bis SERVO_6 des Sensor Boards gesteckt.&lt;br /&gt;
'''Man sollte unbedingt einen separaten Akku für die Servos auf dem Sensor Board benutzen!'''&lt;br /&gt;
&lt;br /&gt;
====Grafik-Display====&lt;br /&gt;
Ob es mal ein Grafik-Display für das RP6 Sensor Board geben wird, ist ''pure Spekulation''. Allerdings gibt es zwei Hinweise darauf, dass eine solche Hardware-Ergänzung kommen könnte:&lt;br /&gt;
* 1. Der vorbereitete Anschluss für eine [[RP6_Sensor_Board_und_Xtra_Module#Display-Hintergrundbeleuchtung|Display-Hintergrundbeleuchtung]]&lt;br /&gt;
* 2. Die 4 Befestigungslöcher in der Mitte des Sensor Boards&lt;br /&gt;
Wir werden sehen ...&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==RP6 Xtra Module==&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_Xtra_module.JPG|RP6 Xtra module|right|500px]]&lt;br /&gt;
&lt;br /&gt;
Von den '''AREXX RP6 Xtra Modulen''' sind bei [http://www.conrad.de/ce/ CONRAD] für den RP6v2 erhältlich:&lt;br /&gt;
* Arexx [[RP6_Sensor_Board_und_Xtra_Module#I2C_GPS_Empf.C3.A4nger_JM3-GPS|I2C GPS Empfänger JM3-GPS]] ([http://www.conrad.de/ce/de/product/1082385/Arexx-IC-GPS-Empfaenger-JM3-GPS 1082385] AUSVERKAUFT!)&lt;br /&gt;
* Arexx [[RP6_Sensor_Board_und_Xtra_Module#Gyro_Modul_JM3-GYRO|Gyro Modul JM3-GYRO]] ([http://www.conrad.de/ce/de/product/1082386/Arexx-Gyro-Modul-JM3-GYRO 1082386] AUSVERKAUFT!)&lt;br /&gt;
* Arexx [[RP6_Sensor_Board_und_Xtra_Module#3D_Accelerometer_Modul_JM3-3DA|3D Accelerometer Modul JM3-3DA]] ([http://www.conrad.de/ce/de/product/1082387/Arexx-3D-Accelerometer-Modul-JM3-3DA 1082387] AUSVERKAUFT!)&lt;br /&gt;
* Arexx [[RP6_Sensor_Board_und_Xtra_Module#BHT_Modul_JM3-BHT31|BHT Modul JM3-BHT31]] ([http://www.conrad.de/ce/de/product/1302995/Arexx-Asuro-xTend-BHT-JM3-BHT31 1302995] AUSVERKAUFT!)&lt;br /&gt;
&lt;br /&gt;
===I2C GPS Empfänger JM3-GPS===&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_I2C_GPS_Empfänger.JPG|RP6 I2C GPS Empfänger|thumb]]&lt;br /&gt;
&lt;br /&gt;
(Laut Online-Katalog der Firma CONRAD!)&lt;br /&gt;
&lt;br /&gt;
''&amp;quot;Universelles GPS-I²C-Bus Modul für RP6 Roboter. Der GPS Empfänger stellt die NMEA-0183 Datensätze GGA, RMC, GSA und VTG in den veschiedenen Registern zur Verfügung. Damit ist eine einfache Weiterverarbeitung möglich.&amp;quot;''&lt;br /&gt;
&lt;br /&gt;
Aktuell (Oktober 2017) ist der I2C GPS Empfänger bei CONRAD ausverkauft.&lt;br /&gt;
&lt;br /&gt;
====Beschreibung====&lt;br /&gt;
Der I2C GPS Empfänger ist eine kleine (38 x 23 mm) Zusatzplatine (RP6 Xtra Modul), die direkt auf das [[RP6_Sensor_Board_und_Xtra_Module#RP6_Sensor_Board_2|RP6 Sensor Board]] aufgesteckt werden kann. Sie kann aber auch überall eingesetzt werden, wo eine stabilisierte 5V Versorgungsspannung und ein 5V-I2C-Bus bis 400 kHz zur Verfügung steht.&lt;br /&gt;
&lt;br /&gt;
Die Platine ist bestückt mit dem &amp;quot;Fastrax GPS antenna module&amp;quot; [https://www.u-blox.com/de/positioning-antennas/gnss-antenna-modules/uc530.html UC530]. Als Backup-Batterie dient eine wieder aufladbare Lithium-Batterie ([http://www.farnell.com/datasheets/321180.pdf MS621FE]). Zur Kommunikation zwischen dem UC530 und dem I2C-Bus ist ein [http://www.atmel.com/Images/Atmel-8303-8-bit-AVR-Microcontroller-tinyAVR-ATtiny1634_Datasheet.pdf ATtiny1634] an Bord, der auch die Auswertung des [http://de.wikipedia.org/wiki/NMEA_0183 NMEA Protokolls] übernimmt. Die 3,3 V Versorgungsspannung wird auf der Platine durch einen Spannungsregler ([http://www.mouser.com/ds/2/405/lm3480-316799.pdf LM3480IM3-3.3]) erzeugt. Über den I2C-Bus können folgende Daten der NMEA-0183 Datensätze GGA, RMC, GSA und VTG auf einfache Weise gelesen werden:&lt;br /&gt;
&lt;br /&gt;
* Geograf. Breite&lt;br /&gt;
* Geograf. Länge&lt;br /&gt;
* GPS Status&lt;br /&gt;
* HDOP&lt;br /&gt;
* Satellitenzahl&lt;br /&gt;
* Kurs&lt;br /&gt;
* Geschwindigkeit&lt;br /&gt;
* Höhe&lt;br /&gt;
* UTC-Zeit&lt;br /&gt;
* Datum&lt;br /&gt;
* PDOP&lt;br /&gt;
* VDOP&lt;br /&gt;
* Satellit 1..12&lt;br /&gt;
&lt;br /&gt;
Der ATtiny1634 ist natürlich vorprogrammiert, kann aber über eine vorbereitete 6-polige ISP-Schnittstelle auf der Platine auch umprogrammiert werden.&lt;br /&gt;
&lt;br /&gt;
'''Lieferumfang'''&lt;br /&gt;
* I2C GPS Empfänger&lt;br /&gt;
* CD mit Anleitung und Software-Beispielen.&lt;br /&gt;
&lt;br /&gt;
====Technische Daten====&lt;br /&gt;
* Versorgungsspannung: 5,0 V +/- 5%&lt;br /&gt;
* Stromverbrauch: &amp;lt;= 20 mA (typ.)&lt;br /&gt;
* I2C-Bus Geschwindigkeit: &amp;lt;= 400 kHz&lt;br /&gt;
* GPS Antenne: eingebaut&lt;br /&gt;
* Backup Batterie: Lithium, im Betrieb wieder aufladbar&lt;br /&gt;
* Temperatur Bereich: -10 bis 65 °C&lt;br /&gt;
* Form Faktor: 38 x 23 mm&lt;br /&gt;
* Gewicht: ca. 6 g&lt;br /&gt;
* Empfänger Spezifikationen (UC530):&lt;br /&gt;
** Empfänger: GPS L1 C/A-Code, SPS&lt;br /&gt;
** Kanäle: 66/22 (Suche/Track)&lt;br /&gt;
** Tracking Empfindlichkeit: -165 dBm typ.&lt;br /&gt;
** Navigations Empfindlichkeit: -148 dbm typ (Kaltstart)&lt;br /&gt;
** Update Rate: 1 Sek.&lt;br /&gt;
** Positions Genauigkeit:&lt;br /&gt;
*** 3,0m (67%) typ. horizontal&lt;br /&gt;
*** 5,0m (67%) typ. vertikal&lt;br /&gt;
*** 0,02 m/s (50%) typ. Geschwindigkeit&lt;br /&gt;
** Zeit bis zum ersten Fix: typ. 31 Sek.&lt;br /&gt;
** Protokoll: NMEA-0183 Rev. 3.01&lt;br /&gt;
&lt;br /&gt;
====Anschluss-Schema====&lt;br /&gt;
Belegung des 9-poligen Anschluss-Steckers (K1) siehe in [[RP6_Sensor_Board_und_Xtra_Module#I2C-MODULE|dieser]] Tabelle!&lt;br /&gt;
&lt;br /&gt;
====Umbau-Optionen====&lt;br /&gt;
Wenn man den ATtiny1634 selbst programmieren will, muss man Stiftleisten auf die Platine löten.&lt;br /&gt;
&lt;br /&gt;
Man braucht dazu: &lt;br /&gt;
* 2-reihige Stiftleiste RM 2,54mm (z.B. 2x40-polig 741306) &lt;br /&gt;
&lt;br /&gt;
Man trennt von der 2-reihigen Stiftleiste 2x3 Kontakte ab und lötet sie auf die Punkte &amp;quot;ISP6&amp;quot;.&lt;br /&gt;
Mit einem ISP-Programmer kann dann eine neue Firmware geflasht werden. Die aktuelle Firmware des ATtiny1634 (Version 1.2) wird als .HEX mitgeliefert, leider ohne Source-Code.&lt;br /&gt;
&lt;br /&gt;
Vorsicht: Dabei kann der Prozessor im schlimmsten Fall nicht mehr ansprechbar sein oder der GPS Empfänger UC530 beschädigt werden. Man sollte diesen Umbau und die ISP-Programmierung nur machen, wenn man genau weiß, was man macht! &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Gyro Modul JM3-GYRO===&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_Gyro_Modul.JPG|RP6 Gyro Modul|right|200px]]&lt;br /&gt;
&lt;br /&gt;
(Laut Online-Katalog der Firma CONRAD!)&lt;br /&gt;
&lt;br /&gt;
''&amp;quot;Das universelle Gyro-Sensor Modul für RP6, RP6 V2, RP6 ATMEGA32 und das RP6 V2 Control M256 Wifi-Kit ist ideal zur Erkennung der Blockierung des Roboters in seiner Drehbewegung, sowie der Stabilisierung der Geradeausfahrt.&amp;quot;''&lt;br /&gt;
&lt;br /&gt;
Aktuell (April 2019) ist das Gyro Modul bei CONRAD ausverkauft. &lt;br /&gt;
&lt;br /&gt;
====Beschreibung====&lt;br /&gt;
Das Gyro Modul ist eine kleine (19 x 17 mm) Zusatzplatine (RP6 Xtra Modul), die im RP6-System genutzt werden kann. Es gibt zwar keinen direkt passenden &amp;quot;Steckplatz&amp;quot; auf einer der Microcontroller-Plattformen (RP6v2, M32, M128, M256 Wifi), jedoch ist der Anschluß einfach:&lt;br /&gt;
Benötigt werden +5V und GND, sowie ein freier ADC-Kanal, der bis 5V messen kann. Damit kann das Gyro Modul sehr universell eingesetzt werden. Es misst die Drehrate um die Z-Achse (Hochachse oder Yaw).&lt;br /&gt;
&lt;br /&gt;
Die Platine ist bestückt mit dem analogen Gyro-Sensor [http://www.st.com/web/en/resource/technical/document/datasheet/CD00254111.pdf LY330ALH], dessen Ausgangsspannung durch zwei OP-Amps ([http://www.ti.com.cn/cn/lit/ds/symlink/lm321.pdf LM321], [http://www.produktinfo.conrad.com/datenblaetter/00000-24999/001072615-da-01-en-IC_AMP_PREC_LMP7731MF_NOPB_SOT_23_5_TID.pdf LMP7731MF]) in Ruhe bei 2,5 V liegt. Höhere Ausgangsspannungen (bis 5 V) bedeuten eine Drehgeschwindigkeit nach LINKS, niedrigere (bis 0 V) eine Drehgeschwindigkeit nach RECHTS. Die 3,3 V Versorgungsspannung des LY330ALH wird auf der Platine durch einen Spannungsregler ([http://www.mouser.com/ds/2/405/lm3480-316799.pdf LM3480IM3-3.3]) erzeugt.&lt;br /&gt;
&lt;br /&gt;
'''Lieferumfang'''&lt;br /&gt;
* Gyro Modul&lt;br /&gt;
* CD mit Anleitung und Software-Beispielen.&lt;br /&gt;
&lt;br /&gt;
====Technische Daten====&lt;br /&gt;
&lt;br /&gt;
* VDD: 5,0 V +/- 5%&lt;br /&gt;
* Vout(0): 2,5 V +/- 2% (ohne Bewegung)&lt;br /&gt;
* Vout: Vout(0) + 10mV / dps +/- 2%&lt;br /&gt;
* Messbereich: ca. 200 dps max.&lt;br /&gt;
&lt;br /&gt;
====Anschluss-Schema====&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_Gyro_Modul_SP.JPG|RP6 Gyro Modul - Anschluss-Schema]]&lt;br /&gt;
&lt;br /&gt;
====Umbau-Optionen====&lt;br /&gt;
Am Gyro Modul gibt es nichts umzubauen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===3D Accelerometer Modul JM3-3DA===&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_3D_Accelerometer_Modul.JPG|RP6 3D Accelerometer Modul|right|105px]]&lt;br /&gt;
&lt;br /&gt;
(Laut Online-Katalog der Firma CONRAD!)&lt;br /&gt;
&lt;br /&gt;
''&amp;quot;Universeller 3-Achsen Beschleunigungssensor für RP6, RP6 V2, RP6 ATMEGA32 und das RP6 V2 Control M256 WIFI-Kit. Ideal zur Winkelmessung (Neigung-, Kipp-Winkel) und vieles mehr.&amp;quot;''&lt;br /&gt;
&lt;br /&gt;
Seit Mai 2020 ist das 3D Accelerometer Modul bei CONRAD ausverkauft.&lt;br /&gt;
&lt;br /&gt;
====Beschreibung====&lt;br /&gt;
&lt;br /&gt;
Das 3D Accelerometer Modul ist eine kleine (15 x 10 mm) Zusatzplatine (RP6 Xtra Modul), die direkt auf den EEPROM-Sockel (IC5) der Zusatzplatine [[RP6#RP6_CONTROL_M32_Platine|RP6 CONTROL M32]] gesteckt und über den SPI-Bus angesteuert werden kann. Das Accelerometer Modul kann aber auch mit allen Microcontroller-Plattformen betrieben werden, die eine stabilisierte 5V-Versorgungsspannung und einen SPI- oder I2C-Bus bieten.&lt;br /&gt;
&lt;br /&gt;
Die Platine ist bestückt mit dem 3D Beschleunigungs-Sensor [http://www.farnell.com/datasheets/1691680.pdf LIS302DLH]. Die 3,3 V Versorgungsspannung des LIS302DLH wird auf der Platine durch einen Spannungsregler ([http://www.mouser.com/ds/2/405/lm3480-316799.pdf LM3480IM3-3.3]) erzeugt.&lt;br /&gt;
&lt;br /&gt;
'''Lieferumfang'''&lt;br /&gt;
* 3D Accelerometer Modul&lt;br /&gt;
* CD mit Anleitung und Software-Beispielen.&lt;br /&gt;
&lt;br /&gt;
====Technische Daten====&lt;br /&gt;
&lt;br /&gt;
* VDD: 5,0 V +/- 5%&lt;br /&gt;
* Messbereiche: +-2 g, +-4 g, +-8 g&lt;br /&gt;
* Datenausgabe: 16 Bit&lt;br /&gt;
* Schnittstellen: I2C, SPI&lt;br /&gt;
&lt;br /&gt;
====Anschluss-Schema====&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_3D_Accelerometer_Modul_SP.JPG|RP6 3D Accelerometer Modul - Anschluss-Schema|350px]]&lt;br /&gt;
&lt;br /&gt;
====Umbau-Optionen====&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_3D_Accelerometer_Modul_M32.JPG|RP6 3D Accelerometer Modul auf der M32|right|500px]]&lt;br /&gt;
&lt;br /&gt;
'''Will man das Modul auf der M32 einsetzen, muss man auf dem 3D Accelerometer Modul die Widerstände R2 und R3 (falls vorhanden!) auslöten (siehe Anleitung zum Modul, Seiten 4/5!)''' und einen IC-Sockel an Position IC5 und einen Kondensator an Position C19 auf der M32 einlöten, siehe [[RP6#Zweites_SPI-EEPROM|hier]]!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die Abbildung rechts zeigt das 3D Accelerometer Modul auf der M32.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===BHT Modul JM3-BHT31===&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_BHT_Modul.PNG|RP6 BHT Modul|right|203px]]&lt;br /&gt;
&lt;br /&gt;
Dieses [http://jm3-engineering.com/sensors.htm BHT Modul] zur Messung von Luftdruck, Luftfeuchte und Temperatur war für das Ende des 3. Quartals 2014 angekündigt und ist nun ab dem 22.01.2015 lieferbar.&lt;br /&gt;
&lt;br /&gt;
(Laut Online-Katalog der Firma CONRAD!)&lt;br /&gt;
&lt;br /&gt;
''&amp;quot;Ein Luftdruck-, rel. Luftfeuchtigkeits- und Temperatursensor Modul für vielfältige Anwendungen. Es kann direkt in den Asuro Expansion-Port auf dem Asuro xTend Bord eingesteckt werden. Das Asuro Modul kann mit den anderen erhältlichen Modulen (Kompass/Gyro und RTC kombiniert werden (Stack-up)). Außerdem kann es auch auf dem RP6 Sensor Bord in dem I2C Modulsteckplatz verwendet werden. Das Sensor Modul verwendet den hochauflösenden Drucksensor-Chip MS5607-02BA und den Luftfeuchtigkeitssensor HTU21D von MEAS Switzerland mit I2C Bus Interface. Der barometrische Drucksensor ist für Höhenmesser und Variometer optimiert und hat eine Auflösung von 20cm. Der relative Luftfeuchtigkeits- und Temperatursensor bietet zuverlässige und genaue Daten, welche sich auch besonders für Wetterstations-Informationen eignen.&amp;quot;''&lt;br /&gt;
&lt;br /&gt;
Aktuell (April 2019) ist das BHT Modul bei CONRAD ausverkauft. &lt;br /&gt;
&lt;br /&gt;
====Beschreibung====&lt;br /&gt;
Das BHT Modul ist eine kleine (24 x 14 mm) Zusatzplatine (ASURO xTend bzw. RP6 Xtra Modul), die direkt auf das [[RP6_Sensor_Board_und_Xtra_Module#RP6_Sensor_Board_2|RP6 Sensor Board]] aufgesteckt werden kann. Sie kann auch auf dem [http://www.conrad.de/ce/de/product/1302085/Arexx-Asuro-xTend-Board-JM3-AXT3 Arexx Asuro xTend Board] und überall eingesetzt werden, wo eine stabilisierte 5V Versorgungsspannung und ein I2C-Bus bis 400 kHz zur Verfügung steht.&lt;br /&gt;
&lt;br /&gt;
Die Platine ist bestückt mit dem barometrischen Drucksensor [http://www.parallax.com/sites/default/files/downloads/29124-MS5607-02BA03-Datasheet.pdf MS5607-02BA] und dem relativen Luftfeuchtigkeits- und Temperatursensor [http://www.meas-spec.com/downloads/HTU21D.pdf HTU21D]. Die 3,0 V Versorgungsspannung der Sensoren wird auf der Platine durch einen Spannungsregler ([http://www.farnell.com/datasheets/78902.pdf LP2980AIM5-3.0]) erzeugt. &lt;br /&gt;
&lt;br /&gt;
'''Lieferumfang'''&lt;br /&gt;
* BHT Modul&lt;br /&gt;
* CD mit Dokumentation&lt;br /&gt;
&lt;br /&gt;
====Technische Daten====&lt;br /&gt;
&lt;br /&gt;
* Nennspannung: 3,3 V (?)&lt;br /&gt;
* Nennstrom: 0,2 mA (typ.) &amp;lt; 1,5mA peaktyp.&lt;br /&gt;
* I2C Bus Geschwindigkeit: 400kHz max.&lt;br /&gt;
* Sensor Modul mit MS5607-02BA und HTU21D&lt;br /&gt;
* Hohe Auflösung des Sensorelements - Höhe: 20cm /- rel. Luftfeuchtigkeit: 0,04%&lt;br /&gt;
* Schneller AD-Wandler&lt;br /&gt;
* Digitaler Drucksensor (24 bit ΔΣ ADC)&lt;br /&gt;
* Luftdruckbereich: 10 bis 1200 mbar&lt;br /&gt;
* Exzellente Langzeitstabilität&lt;br /&gt;
* Unmittelbare Desaturierung&lt;br /&gt;
* Kalibrierung in der Fabrik&lt;br /&gt;
&lt;br /&gt;
====Anschluss-Schema====&lt;br /&gt;
Belegung des 9-poligen Anschluss-Steckers (K1) siehe in [[RP6_Sensor_Board_und_Xtra_Module#I2C-MODULE|dieser]] Tabelle!&lt;br /&gt;
&lt;br /&gt;
====Umbau-Optionen====&lt;br /&gt;
&lt;br /&gt;
===Xtra Module auf einer Experimentierplatine===&lt;br /&gt;
&lt;br /&gt;
Die drei bis jetzt (09/2014) erhältlichen [[RP6_Sensor_Board_und_Xtra_Module#RP6_Xtra_Module_2|Xtra Module]], die die Navigation eines Roboters ermöglichen, können problemlos im RP6-System genutzt werden,- zwei davon sogar in Form des direkten Aufsteckens auf eine der Zusatz-Platinen: Für den [[RP6_Sensor_Board_und_Xtra_Module#I2C_GPS_Empf.C3.A4nger_JM3-GPS|I2C GPS Empfänger]] gibt es einen Steckplatz auf dem [[RP6_Sensor_Board_und_Xtra_Module#RP6_Sensor_Board_2|RP6 Sensor Board]], das [[RP6_Sensor_Board_und_Xtra_Module#3D_Accelerometer_Modul_JM3-3DA|3D Accelerometer Modul]] kann auf der [[RP6#RP6_CONTROL_M32_Platine|RP6 CONTROL M32]] aufgesteckt werden.&lt;br /&gt;
&lt;br /&gt;
Natürlich können die Xtra Module auch allein (&amp;quot;stand-alone&amp;quot;) ohne RP6 Sensor Board oder RP6 CONTROL M32 betrieben werden. Dazu kann man sie z.B. auf einer [[RP6#Experimentierplatine|Experimentierplatine]] aufbauen. &lt;br /&gt;
&lt;br /&gt;
Das soll hier mit einer kurzen Aufbauanleitung demonstriert werden.&lt;br /&gt;
&lt;br /&gt;
====Schaltplan====&lt;br /&gt;
&lt;br /&gt;
Aber zunächst der Schaltplan:&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6v2_Xtra_Module_SP.jpg|RP6 Experimentierplatine für Xtra Module - Schaltplan]]&lt;br /&gt;
&lt;br /&gt;
Man erkennt die drei XTra Module, die (bis auf das Gyro Modul) an den I2C-Bus am XBUS Stecker des RP6 angeschlossen sind. Das [[RP6_Sensor_Board_und_Xtra_Module#Gyro_Modul_JM3-GYRO|Gyro Modul JM3-GYRO]] wird nicht über I2C angesteuert, sondern liefert an seinem Pin OUT ein analoges Ausgangssignal, das mit einem ADC Eingang (0..5V) gemessen werden kann.&lt;br /&gt;
&lt;br /&gt;
Der Jumper (Steckbrücke) JP1 dient zum Einstellen der I2C-Adresse des 3D Accelerometer Moduls (0x30, 0x32).&lt;br /&gt;
Mit JP2/3 wird die [[RP6_Sensor_Board_und_Xtra_Module#Optionale_Ansteuerung|Betriebsart des Gyro Moduls]] festgelegt.&lt;br /&gt;
Die Jumper JP4 bis JP9 dienen zur Verteilung von INT1, INT2 des 3D Accelerometer Moduls und des OUT Signals des Gyro Moduls auf die INT-Anschlüsse INT1..3, INTU des XBUS. Wenn man die Interrupts des 3D Accelerometer Moduls nicht nutzen will, kann man die Jumper JP4 bis JP8 auch weglassen. Mit JP9 wird das analoge Signal des Gyro Moduls an INT1 des XBUS gelegt. Dies ist nur dann sinnvoll, wenn man die Platine mit der RP6v2 Base betreibt, weil hier an INT1 ein ADC Eingang (ADC4) liegt. Bei allen anderen Plattformen des RP6-Systems (M32, CCPRO M128, M256 WiFi) muss JP9 offen bleiben.&lt;br /&gt;
&lt;br /&gt;
Mit dieser Schaltung kann man also den Beschleunigungssensor (3D Accelerometer) und den GPS Empfänger über I2C auslesen. Der Gyro wird entweder mit ADC4 der RP6v2 Base (JP9 geschlossen!) ausgewertet oder durch einen anderen ADC Eingang. Dazu kann man das Ausgangssignal des Gyros an Pin 3 der Stiftleiste ST1 abnehmen. Von dort kann es z.B. zu ADC0 oder ADC1 der RP6v2 Base oder der RP6 CONTROL M32 geführt werden oder zu einem beliebigen ADC Eingang der CCPRO M128 oder der M256 WiFi. Die Stiftleiste ST1 liegt direkt neben dem USRBUS, so dass die Verbindung auch über den USRBUS hergestellt werden kann. Dazu verbindet man Pin 3 von ST1 mit einem Pin (Y1..Y14) des USRBUS.&lt;br /&gt;
&lt;br /&gt;
====Bestückungsplan====&lt;br /&gt;
&lt;br /&gt;
So kann z.B. der Bestückungsplan mit Leiterbahnführung auf der Experimentierplatine (Exp) aussehen:&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6v2_Xtra_Module.jpg|RP6 Experimentierplatine für Xtra Module]]&lt;br /&gt;
&lt;br /&gt;
Was braucht man allgemein für den Aufbau einer Schaltung auf der Exp:&lt;br /&gt;
* Seitenschneider, Schere, Zange&lt;br /&gt;
* Lötkolben 25..30 Watt, Lötzinn&lt;br /&gt;
* Plastik 70 Schutzlack (CONRAD 813621)&lt;br /&gt;
* Isolierter Schaltdraht YV 0,20 mm² (CONRAD 606065)&lt;br /&gt;
* Versilberter CU-Draht 0,6 mm (CONRAD 605581)&lt;br /&gt;
&lt;br /&gt;
Mit dem versilberten CU-Draht stellt man auf der Unterseite (= Lötseite) der Exp Verbindungen zwischen den Bauteilen her; mit dem isolierten Schaltdraht werden Drahtbrücken auf der Oberseite (= Bestückungsseite) der Exp eingesetzt. Die Lage der Xtra Module und der Verbindungen kann man im Bestückungsplan (s.o.!) erkennen, Drahtbrücken sind rot hervorgehoben.&lt;br /&gt;
&lt;br /&gt;
Zusätzlich zu den RP6 Xtra Modulen braucht man folgende Bauteile (Bestell-Nummern von CONRAD):&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| Anzahl || Bestell-Nr. || Bauteil-Bezeichnung || Verwendung&lt;br /&gt;
|-&lt;br /&gt;
| 1 || [http://www.conrad.de/ce/de/product/191537/Arexx-RP6-Experimentierplatine?queryFromSuggest=true 191537] || RP6 Experimentierplatine || &lt;br /&gt;
|-&lt;br /&gt;
| 1 || [http://www.conrad.de/ce/de/product/189600/Praezisions-IC-Fassung-MPE-Garry-MP-083-STG-BU-Pole-8-Rastermass-762-mm-Material-Kontaktfeder-025-Gold-ueber-Nickel 189600] || Präzisions-IC-Fassung (8 Pole) || Stecksockel für Accelerometer Modul&lt;br /&gt;
|-&lt;br /&gt;
| 1 || [http://www.conrad.de/ce/de/product/741360/Praezisions-Buchsenleiste-RM-254-gerade-Pole-1-x-20-10120832-BKL-Electronic-Inhalt-1-St 741360] || Präzisions-Buchsenleiste RM 2,54mm (9 Pole) || Stecksockel für GPS Empfänger&lt;br /&gt;
|-&lt;br /&gt;
| 1 || [http://www.conrad.de/ce/de/product/741307/Praezisions-Stiftleiste-RM-254-gerade-Pole-1-x-20-10120536-BKL-Electronic-Inhalt-1-St 741307] || Präzisions-Stiftleiste RM 2,54mm (2 x 4 Pole) || Stecksockel für Gyro Modul&lt;br /&gt;
|-&lt;br /&gt;
| 1 || [http://www.conrad.de/ce/de/product/741119/Stiftleiste-RM-254-gerade-Pole-1-x-36-10120182-BKL-Electronic-Inhalt-1-St 741119] || 1-reihige Stiftleiste RM 2,54mm (ges. 36-polig) || JP1, ST1&lt;br /&gt;
|-&lt;br /&gt;
| 1 || [http://www.conrad.de/ce/de/product/741186/Doppelreihige-Stiftleiste-RM-254-gerade-Pole-2-x-8-10120514-BKL-Electronic-Inhalt-1-St 741186] || 2-reihige Stiftleiste RM 2,54mm (ges. 8-polig) || JP2..9&lt;br /&gt;
|-&lt;br /&gt;
| 1 || [http://www.conrad.de/ce/de/product/742902/Codier-Adressierbruecken-Set-Rastermass-25254-mm-10120906-BKL-Electronic-Inhalt-1-Set 742902] || Sechs Codierbrücken (aus Set) || Steckbrücken&lt;br /&gt;
|-&lt;br /&gt;
| 2 || [http://www.conrad.de/ce/de/product/453099/Keramik-Kondensator-01-F-50-V-20-B-x-H-508-mm-x-508-mm-1-St 453099] || Keramik Kondensator 100 nF || Blockkondensatoren C2, C3&lt;br /&gt;
|-&lt;br /&gt;
| 1 || [http://www.conrad.de/ce/de/product/421986/Elektrolyt-Kondensator-radial-bedrahtet-25-mm-10-F-50-V-20--x-H-5-mm-x-11-mm-Panasonic-EEUFC1H100LH-1-St 421986] || Elektrolyt Kondensator 10 uF/50 V || Spannungsstabilisierung C1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Viel Erfolg beim Aufbau!&lt;br /&gt;
&lt;br /&gt;
 Natürlich muss man nicht alle drei Sensoren aufbauen!&lt;br /&gt;
 Man kann einfach den/die Sensor/en weglassen, den/die man nicht nutzen will!&lt;br /&gt;
&lt;br /&gt;
Noch ein Wort zur Programmierung des 3D Accelerometer Moduls: Es wird auf dieser Exp über den I2C Bus angesteuert. Damit kann man die [[RP6_Sensor_Board_und_Xtra_Module#RP6_CONTROL_M32:_ACCSENS_Library|nachfolgende Library]] für dieses Modul hier NICHT benutzen!&lt;br /&gt;
&lt;br /&gt;
====Magnetfeldsensor====&lt;br /&gt;
&lt;br /&gt;
Wenn man die oben beschriebene Experimentierplatine aufgebaut hat, hat man für die Navigation eines mobilen Roboters (wie des RP6v2) schon drei benötigte Sensoren zur Verfügung: einen GPS Empfänger, einen 3D-Beschleunigungssensor und einen 1D-Gyrosensor.&lt;br /&gt;
&lt;br /&gt;
Was fehlt, ist z.B. ein '''Magnetfeldsensor (Kompass-Sensor)''', mit dem der Roboter die Himmelsrichtung feststellen kann. Einen Magnetfeldsensor gibt es (noch) nicht als Xtra Modul.&lt;br /&gt;
&lt;br /&gt;
Auf der beschriebenen Experimentierplatine ist durchaus noch Platz (z.B. in der rechten oberen Ecke) für einen Magnetfeldsensor. Geeignet ist z.B. das 2D-Kompassmodul HDMM01 ([http://www.pollin.de/shop/dt/NTM4OTgxOTk-/Bausaetze_Module/Module/Kompassmodul_HDMM01.html Pollin 94-810 164] NICHT MEHR LIEFERBAR!).&lt;br /&gt;
&lt;br /&gt;
Hier ist der um den Magnetfeldsensor erweiterte Schaltplan:&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6v2_Xtra_Module_HDMM01_SP.jpg|RP6 Experimentierplatine für Xtra Module und HDMM01 - Schaltplan]]&lt;br /&gt;
&lt;br /&gt;
Das kleine Kompassmodul dürfte doch noch einfach auf der Experimentierplatine unterzubringen sein, oder?&lt;br /&gt;
&lt;br /&gt;
Zur Programmierung des Magnetfeldsensors HDMM01 gibt es [[RP6v2_Orientierung#Kompassmodul_HDMM01_2|HIER]] Anregungen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Programmierung==&lt;br /&gt;
In diesem Abschnitt geht es um die Programmierung der Sensoren und Aktoren auf dem [[RP6_Sensor_Board_und_Xtra_Module#RP6_Sensor_Board_3|RP6 Sensor Board]] und auf den [[RP6_Sensor_Board_und_Xtra_Module#RP6_Xtra_Module_3|Xtra Modulen]]. Die hier veröffentlichte Software baut NICHT auf die mitgelieferten C++ Software-Beispiele auf der ''&amp;quot;RP6 Robot System Xtra Modules CD-ROM&amp;quot;'' auf, sondern basiert auf Eigenentwicklungen in GCC.&lt;br /&gt;
&lt;br /&gt;
===RP6 Sensor Board===&lt;br /&gt;
Das RP6 Sensor Board RP6-JM03-61 verfügt nicht über einen eigenen Microprozessor. Daher geht es hier eigentlich nicht um die Programmierung des Sensor Boards, sondern um die Programmierung der Microcontroller-Plattform, an die das Sensor Board angeschlossen ist. In der Regel wird das die RP6 M256 WiFi Zusatzplatine sein, aber auch die RP6v2 Base steuert (als I2C-Slave) in der vorgesehenen Konfiguration gewisse Funktionen des Sensor Boards an.&lt;br /&gt;
Prinzipiell kann das Sensor Board aber auch an der RP6 CONTROL M32 (''passende Library auf Anfrage beim Autor!'') oder der RP6 CCPRO M128 Zusatzplatine betrieben werden.&lt;br /&gt;
&lt;br /&gt;
====Dokumentation====&lt;br /&gt;
Die Dokumentation zum RP6 Sensor Board befindet sich auf der mitgelieferten ''&amp;quot;RP6 Robot System Xtra Modules CD-ROM&amp;quot;''.&lt;br /&gt;
&lt;br /&gt;
=====Manuals=====&lt;br /&gt;
Das Handbuch in der aktuellen Version kann [http://www.jm3-engineering.com/download/doc/ManualRP6SensorBoard_de.pdf hier] oder [http://www.produktinfo.conrad.com/datenblaetter/00000-24999/001082384-an-01-de-RP6_SENSOR_BOARD.pdf da] eingesehen werden.&lt;br /&gt;
 ACHTUNG: Das Manual enthielt in der Version 1.11 noch teils irreführende&lt;br /&gt;
          Beschreibungen, die in der aktuellen Version 1.20 vom 20.04.2014&lt;br /&gt;
          korrigiert wurden!&lt;br /&gt;
&lt;br /&gt;
====Robot-Tool====&lt;br /&gt;
[[Bild:JM3 Robot-Tool.PNG|JM3 Robot-Tool|thumb]]&lt;br /&gt;
&lt;br /&gt;
Von JM3 Engineering wurde auch ein eigenes Programm &amp;quot;'''JM3 Robot-Tool'''&amp;quot; veröffentlicht, das im RP6-System (RP6(v2) Base, CONTROL M32, M256 WiFi) anstelle des [[RP6v2#RobotLoader|RobotLoaders]] verwendet werden kann.&lt;br /&gt;
&lt;br /&gt;
Vom Robot-Tool gibt es auch eine Kommandozeilen-Version &amp;quot;'''Multiloader'''&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Befehlszeilen Optionen'''&lt;br /&gt;
 Multi Loader v1.0.1&lt;br /&gt;
 &lt;br /&gt;
 Usage:&lt;br /&gt;
 multiloader [filename] [port/hostname] [device] [-l]&lt;br /&gt;
  -l forces RP6 low speed mode.&lt;br /&gt;
 &lt;br /&gt;
 Valid devices:&lt;br /&gt;
  - Asuro&lt;br /&gt;
  - AsuroCtrl&lt;br /&gt;
  - RP6Base&lt;br /&gt;
  - RP6CtrlM32&lt;br /&gt;
  - RobotArm&lt;br /&gt;
  - RP6Wifi&lt;br /&gt;
 Attention: Device names are case-sensitive&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 Multi Loader v2.0.0&lt;br /&gt;
 &lt;br /&gt;
 Usage: multiloader [load/conf] [...]&lt;br /&gt;
 &lt;br /&gt;
         load    Load .hex file into robot.&lt;br /&gt;
                 arguments: [filename] [port/host] [device] [interface] [-l]&lt;br /&gt;
 &lt;br /&gt;
                 [interface] specifies programming interface type.&lt;br /&gt;
                 Valid interface types are UART and TCP.&lt;br /&gt;
                 -l forces RP6 low speed mode.&lt;br /&gt;
 &lt;br /&gt;
                 Valid devices:  [interfaces]&lt;br /&gt;
                 - Asuro     UART&lt;br /&gt;
                 - AsuroXT   UART&lt;br /&gt;
                 - Marvin    UART&lt;br /&gt;
                 - MarvinFW  UART&lt;br /&gt;
                 - RP6       UART&lt;br /&gt;
                 - RP6M32    UART&lt;br /&gt;
                 - RP6Wifi   TCP&lt;br /&gt;
                 - RobotArm  UART&lt;br /&gt;
 &lt;br /&gt;
                 Attention: Device names are case-sensitive&lt;br /&gt;
 &lt;br /&gt;
=====Versionen=====&lt;br /&gt;
Hier eine Tabelle der (mir) bekannten Robot-Tool Versionen:&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |rowspan=2|ZIP-Datum&lt;br /&gt;
 |colspan=2|Robot-Tool:&lt;br /&gt;
 |colspan=2|Multiloader:&lt;br /&gt;
 |rowspan=2|Bemerkungen&lt;br /&gt;
 |-&lt;br /&gt;
 |Windows&lt;br /&gt;
 |Linux&lt;br /&gt;
 |Windows&lt;br /&gt;
 |Linux&lt;br /&gt;
 |-&lt;br /&gt;
 |25.10.2014&lt;br /&gt;
 |1.0.1-1&lt;br /&gt;
 |1.0.1-1&lt;br /&gt;
 |1.0.1-1&lt;br /&gt;
 |1.0.1-1&lt;br /&gt;
 |Erste veröffentlichte Version!&lt;br /&gt;
 |-&lt;br /&gt;
 |30.01.2017&lt;br /&gt;
 |[http://www.jm3-engineering.com/download/robottool-v2.0-win32.7z 2.0]&lt;br /&gt;
 |[http://www.jm3-engineering.com/download/robottool-v2.0-linux.tar.xz 2.0]&lt;br /&gt;
 |2.0&lt;br /&gt;
 |2.0&lt;br /&gt;
 |auch für [http://www.jm3-engineering.com/download/robottool-v2.0-osx.tar.gz Mac OSX]!&lt;br /&gt;
 |-&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
'''Hinweise:'''&lt;br /&gt;
* 1. Falls die Links in der Tabelle auf die Seite &amp;quot;Neuigkeiten&amp;quot; von JM3-Engineering führen, kann man dort auf die Seite &amp;quot;Software Downloads&amp;quot; wechseln und die Dateien im Absatz &amp;quot;JM3 Robot-Tool V2.0&amp;quot; herunterladen.&lt;br /&gt;
* 2. Ab Version 2.0 ist der Multiloader in der ZIP des Robot-Tools enthalten.&lt;br /&gt;
&lt;br /&gt;
====AVR-GCC und Visual Studio====&lt;br /&gt;
Die Demo-Programme zum RP6 Sensor Board wurden mit [https://www.microsoft.com/de-de/download/details.aspx?id=5555&amp;amp;fa43d42b-25b5-4a42-fe9b-1634f450f5ee=True Microsoft Visual C++ 2010] und [http://www.jm3-engineering.com/download/avr-gcc-4.8.1-win32.7z AVR-GCC] erstellt.&lt;br /&gt;
&lt;br /&gt;
Eine Anleitung zur Installation unter Windows befindet sich [http://www.jm3-engineering.com/download/doc/avr-gcc-vs_de.pdf hier].&lt;br /&gt;
&lt;br /&gt;
====Demo-Programmme====&lt;br /&gt;
Demo-Programme und eine &amp;quot;Library&amp;quot; zum RP6 Sensor Board befinden sich auf der mitgelieferten ''&amp;quot;RP6 Robot System Xtra Modules CD-ROM&amp;quot;''. Sie können auch in der aktuellen Version im Download Bereich von [http://www.jm3-engineering.com/downloads.htm JM3 Engineering] herunter geladen werden:&lt;br /&gt;
* [http://www.jm3-engineering.com/download/RP6SensorBoardDemo_1.1-1.7z RP6 Sensor Board Demo Programm und Library]&lt;br /&gt;
* [http://www.jm3-engineering.com/download/RP6SensorBoardDemo_noVC_1.1-1.7z RP6 Sensor Board Demo Programm und Library (ohne Visual Studio Projekt Dateien)]&lt;br /&gt;
* [http://www.jm3-engineering.com/download/RP6-RC_1.0-1.7z Remote Control Software]&lt;br /&gt;
'''Hinweis:'''&lt;br /&gt;
Falls die o.g. Links auf die Seite &amp;quot;Neuigkeiten&amp;quot; von JM3-Engineering führen, kann man dort auf die Seite &amp;quot;Software Downloads&amp;quot; wechseln und die Dateien im Absatz &amp;quot;RP6 Sensor Board Library und Demo-Programm&amp;quot; herunterladen.&lt;br /&gt;
&lt;br /&gt;
====Library====&lt;br /&gt;
Eine &amp;quot;Library&amp;quot; zum RP6 Sensor Board, bestehend aus einigen Einzel-Dateien mit jeweils eigenen Versions-Nummern, befindet sich auf der mitgelieferten ''&amp;quot;RP6 Robot System Xtra Modules CD-ROM&amp;quot;''. Sie ist in der aktuellen Version auch in den Demo-Programmen enthalten ([[RP6_Sensor_Board_und_Xtra_Module#Demo-Programmme|s.o.!]]).&lt;br /&gt;
&lt;br /&gt;
=====Versionen=====&lt;br /&gt;
Hier eine Tabelle der (mir) bekannten Library Versionen für das RP6 Sensor Board:&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |ZIP-Datum *&lt;br /&gt;
 |Version&lt;br /&gt;
 |RP6SensorBoardDemo&lt;br /&gt;
 |RP6-RC&lt;br /&gt;
 |RP6M256_I2CMasterLib&lt;br /&gt;
 |RP6M256Lib&lt;br /&gt;
 |RP6I2CmasterTWI&lt;br /&gt;
 |-&lt;br /&gt;
 |09.12.2013&lt;br /&gt;
 |1.0&lt;br /&gt;
 |1.0&lt;br /&gt;
 |1.0&lt;br /&gt;
 |(1.0_24.02.12) ²&lt;br /&gt;
 |1.1_16.07.12 ²&lt;br /&gt;
 |1.1_04.09.12 ³&lt;br /&gt;
 |-&lt;br /&gt;
 |27.12.2014&lt;br /&gt;
 |1.1&lt;br /&gt;
 |1.1-1&lt;br /&gt;
 |1.0-1&lt;br /&gt;
 |Modified 02.11.14 ³&lt;br /&gt;
 |1.1.1_25.10.14 ³&lt;br /&gt;
 |1.1_04.09.12 ³&lt;br /&gt;
 |-&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
'''Zu *:''' Alternativ: Datum der Verzeichnisse (z.B. auf der ''&amp;quot;RP6 Robot System Xtra Modules CD-ROM&amp;quot;'')!&lt;br /&gt;
&lt;br /&gt;
'''Zu ²:''' Neueste Original Version der [http://rn-wissen.de/wiki/index.php/RP6v2#Versionen RP6 Library]!&lt;br /&gt;
&lt;br /&gt;
'''Zu ³:''' Modifiziert von [http://www.jm3-engineering.com/ JM3 Engineering]!&lt;br /&gt;
&lt;br /&gt;
=====Modifizierte RP6 Libraries=====&lt;br /&gt;
Von [http://www.jm3-engineering.com/ JM3 Engineering] wurden bis jetzt drei [http://rn-wissen.de/wiki/index.php/RP6v2#Versionen RP6 &amp;quot;Original&amp;quot;-Libraries] leicht modifiziert, um sie für die eigenen Programme für das RP6 Sensor Board optimal nutzen zu können.&lt;br /&gt;
In diesem Abschnitt soll kurz erwähnt werden, WAS verändert wurde.&lt;br /&gt;
 &lt;br /&gt;
======RP6M256_I2CMasterLib======&lt;br /&gt;
Die RP6M256_I2CMasterLib wurde von JM3 Engineering ab der Software Version 1.1 für das RP6 Sensor Board verändert, um sie in einer eigenen Bibliothek bestehend aus mehreren Modulen nutzen zu können. Folgendes wurde angepasst:&lt;br /&gt;
* Neue typedef unions:&lt;br /&gt;
** u_interrupt_status&lt;br /&gt;
** u_status&lt;br /&gt;
** u_drive_status&lt;br /&gt;
** u_statusLEDs&lt;br /&gt;
&lt;br /&gt;
Die modifizierte RP6M256_I2CMasterLib vom 2.11.2014 ist kompatibel zur Original-Version vom 24.02.2012.&lt;br /&gt;
&lt;br /&gt;
======RP6M256Lib======&lt;br /&gt;
Eine modifizierte Version 1.1.1 der RP6M256Lib mit Datum vom 25.10.2014 wurde von JM3 Engineering im November 2014 zusammen mit der Software Version 1.1 für das RP6 Sensor Board veröffentlicht. Sie ist kompatibel zur Version 1.1 der RP6M256Lib vom 16.07.2012 und enthält folgende Änderung:&lt;br /&gt;
* In der Datei RP6M256.h wird die Variable &amp;quot;timer&amp;quot; korrekt als &amp;quot;''extern'' volatile uint16_t timer&amp;quot; deklariert.&lt;br /&gt;
&lt;br /&gt;
======RP6I2CmasterTWI======&lt;br /&gt;
Eine erweiterte I2C Master-Library (Version 1.1) gibt es mit Datum vom 04.09.2012, veröffentlicht ab Februar 2014 von JM3 Engineering für das RP6 Sensor Board und die Xtra Module. Sie ist abwärts-kompatibel zur I2C Master-Library in der Version 1.0 vom 16.05.2007 und bietet lediglich folgende Erweiterung: &lt;br /&gt;
* Neue Funktion I2CTWI_readWordRegisters() zum Lesen von 16 Bit Registern&lt;br /&gt;
&lt;br /&gt;
====RP6 M256 WiFi: Sensor Board Library====&lt;br /&gt;
Die nachfolgende RP6M256_Sensor_BoardLib (Eigenentwicklung in GCC) dient zur Ansteuerung des Sensor Boards durch die RP6M256 WiFi.&lt;br /&gt;
&lt;br /&gt;
=====Configuration Header=====&lt;br /&gt;
Vor dem Kompilieren der Library muss eine Anpassung des Configuration Headers an die eigenen Hardware-Voraussetzungen erfolgen.&lt;br /&gt;
Dazu gibt es im Configuration Header eine Definition:&lt;br /&gt;
* USE_PD5 -&amp;gt; Die Sensor Board Funktion &amp;quot;PD5&amp;quot; steuert den TCA4311A Enable Pin (EN).&lt;br /&gt;
Im nachfolgenden Listing ist die Definition USE_PD5 NICHT aktiv (d.h. der TCA4311A Enable Pin (EN) wird vom MAX7311 I/O 1.0 Pin angesteuert!). Dies muss an die eigene Hardware angepaßt werden. Wenn &amp;quot;PD5&amp;quot; den TCA4311A Enable Pin (EN) steuern soll, muss die Zeile mit &amp;quot;USE_PD5&amp;quot; &amp;quot;aktiviert&amp;quot; werden. Dazu entfernt man &amp;quot;//&amp;quot; am Zeilenanfang:&lt;br /&gt;
 #define USE_PD5&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Bevor man Beschleunigungs-, Magnetfeldsensor und Gyroskop nutzen kann, muss man sie kalibrieren:&lt;br /&gt;
&lt;br /&gt;
* '''Accelerometer:'''&lt;br /&gt;
** Die X-Achse wird kalibriert, indem man den RP6 mit der rechten Seite nach unten hält und den Maximalwert in MAX_X_A einträgt. Dann neigt man ihn auf seine linke Seite und trägt den negativen Maximalwert in MIN_X_A ein.&lt;br /&gt;
** Die Y-Achse wird kalibriert, indem man den RP6 mit der Vorderseite nach oben hält und den Maximalwert in MAX_Y_A einträgt. Dann kippt man die Vorderseite nach unten und trägt den negativen Maximalwert in MIN_Y_A ein.&lt;br /&gt;
** Die Z-Achse wird kalibriert, indem man den RP6 normal waagerecht hält und den Maximalwert in MAX_Z_A einträgt. Dann dreht man den RP6 &amp;quot;auf den Kopf&amp;quot; und trägt den negativen Maximalwert in MIN_Z_A ein.&lt;br /&gt;
** Sollten die angezeigten Pitch- und Roll-Werte nach der Kalibrierung der Achsen und genau waagerecht stehendem Sensor bzw. RP6 vom Nullwert deutlich abweichen, kann man sie mithilfe der Definitionen OFFSET_PITCH_A und OFFSET_ROLL_A &amp;quot;nullen&amp;quot;. Die Einheit dieser Definitionen ist °.&lt;br /&gt;
 ''HINWEIS: Die internen Berechnungen werden durch diese Offset-Korrektur&lt;br /&gt;
 NICHT beeinflußt. Die Offset-Werte können also nicht dazu benutzt werden,&lt;br /&gt;
 eine Achsenabweichung zwischen Sensor und RP6 zu kompensieren!''&lt;br /&gt;
* '''Magnetometer:'''&lt;br /&gt;
** Zur Kalibrierung des Magnetfeldsensors stellt man den RP6 auf eine waagerechte Fläche. Es dürfen keine Elektrogeräte, Metallteile und stromführende Leitungen in der Nähe sein, die das Magnetfeld verändern können.&lt;br /&gt;
** Zunächst ist es möglich, die sogenannten &amp;quot;hard iron&amp;quot; Effekte auszugleichen. Dies sind feste Magnetfeldabweichungen, die durch das &amp;quot;Gerät&amp;quot; (in unserem Fall also durch den kompletten RP6) verursacht werden, in oder auf dem der Sensor angebracht ist. Mit den Definitionen OFFSET_X_M, OFFSET_Y_M und OFFSET_Z_M können diese Effekte ausgeglichen werden. Diese Kalibrierung wird hier aktuell (noch) nicht beschrieben, so dass man die Werte für diese Definitionen zunächst bei 0 belassen sollte.&lt;br /&gt;
** Die X-Achse und Y-Achse wird kalibriert, indem man den RP6 langsam mehrfach um die eigene (Z-)Achse dreht und die Maximalwerte in MAX_X_M und MAX_Y_M einträgt. Die negativen Maximalwerte trägt man in MIN_X_M und MIN_Y_M ein.&lt;br /&gt;
** Die Z-Achse wird kalibriert, indem man den RP6 auf die rechte oder linke Seite legt, ihn dann langsam mehrfach auf der Stelle (um seine Y-Achse) dreht und den Maximalwert in MAX_Z_M und den negativen Maximalwert in MIN_Z_M einträgt.&lt;br /&gt;
** Mit der Definition DECLINATION_M kann man zur Verbesserung der Genauigkeit der Richtungsangaben den magnetischen Deklinationswert [°] (d.h. die magnetische Missweisung) am aktuellen Standort festlegen. [http://www.ngdc.noaa.gov/geomag-web/#declination Hier] befindet sich ein &amp;quot;Deklinations-Rechner&amp;quot;, mit dem man den Deklinationswert für den eigenen Standort ermitteln kann. &lt;br /&gt;
** Wenn man den Temperaturwert des LSM303DLHC nutzen will, muss man die Definition GET_TEMP_M aktivieren (Standard!). Den Temperaturwert kann man noch eichen, indem man die Definition OFFSET_TEMP_M anpasst. Die Einheit von OFFSET_TEMP_M ist °C.&lt;br /&gt;
* '''Gyroskop:'''&lt;br /&gt;
** In Ruhelage des RP6 wird ein ADC-Wert von ca. 511 angezeigt, wenn die Definition ADCVAL_ZERORATE_LEVEL im Configuration Header (RP6M256_Sensor_Board.h) vor der ersten Kompilierung zunächst auf 0 gesetzt wurde. Die Kalibrierung des Gyroskops ist abgeschlossen, nachdem man den in Ruhelage angezeigten ADC-Wert als ADCVAL_ZERORATE_LEVEL eingetragen hat.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''HINWEISE ZUR KALIBRIERUNG:'''&lt;br /&gt;
* Das Demo-Programm ist nicht sehr gut geeignet, um die Kalibrierungen durchzuführen.&lt;br /&gt;
* Man sollte mit einem eigenen kurzen ''Kalibrierungs-Programm'' nur die Rohwerte der jeweiligen X-, Y- und Z-Achse z.B. zweimal pro Sekunde ausgeben.&lt;br /&gt;
* Die Rohwerte sind in Variablen x_axis..., y_axis..., z_axis... enthalten. Da die Rohwerte in den Funktionen normalizeLSM303DLHC_A() bzw. normalizeLSM303DLHC_M() ggf. verändert werden, müssen die Rohwerte VOR Durchlaufen dieser Funktionen ausgegeben werden.&lt;br /&gt;
* '''Ohne eine sorgfältige Kalibrierung wird die Kompass-Funktion (insbesondere die neigungskompensierte Ausgabe der Himmelsrichtung) nicht funktionieren!'''&lt;br /&gt;
* Nach dem Eintragen der Kalibrierungs-Werte in den Configuration Header (RP6M256_Sensor_Board.h) muss die ''Demo'' neu kompiliert werden. Vorher sollten die Compiler-Hilfsdateien der Sensor Board-Library (Dateiendungen .st und .o) im Programmverzeichnis gelöscht werden.&lt;br /&gt;
* Getestet wird das Ergebnis der Kalibrierung, indem die Ausgabewerte (Temperatur, Pitch, Roll, Heading, Neigungs-kompensiertes Heading) der ''Demo'' überprüft werden. Dazu kann man Vergleichswerte (Thermometer, Winkelmesser für Pitch, Roll und externer Kompass für Heading) heranziehen.&lt;br /&gt;
* Wenn die Ausgabewerte nicht den Erwartungen entsprechen, muss die Kalibrierung wiederholt werden.&lt;br /&gt;
* Eine Kalibrierung der Sensoren ist nur zuverlässig, solange die Position des jeweiligen Sensors und seine komplette Hardware-Umgebung (also der RP6 mit allen seinen Teilen!) nicht verändert wird. Gibt es trotzdem Veränderungen, z.B. durch weitere Aufbauten auf dem RP6, müssen diese Sensoren neu kalibriert werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Datei: RP6M256_Sensor_Board.h&lt;br /&gt;
&amp;lt;pre&amp;gt;/* ****************************************************************************&lt;br /&gt;
 *                           _______________________&lt;br /&gt;
 *                           \| RP6  ROBOT SYSTEM |/&lt;br /&gt;
 *                            \_-_-_-_-_-_-_-_-_-_/           &amp;gt;&amp;gt;&amp;gt; RP6 M256 WIFI&lt;br /&gt;
 * ----------------------------------------------------------------------------&lt;br /&gt;
 * ----------------------------- [c]2014 - Dirk -------------------------------&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * File: RP6M256_Sensor_Board.h&lt;br /&gt;
 * Version: 1.1&lt;br /&gt;
 * Target: RP6 M256 WIFI - ATMEGA2560 @16.00MHz&lt;br /&gt;
 * Author(s): Dirk&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Description:&lt;br /&gt;
 * Configuration header file for new RP6 Sensor Board library.&lt;br /&gt;
 * The RP6 Sensor Board (CONRAD 1082384) is connected to the RP6M256 with the&lt;br /&gt;
 * two plugs:&lt;br /&gt;
 *   Sensor Board &amp;lt;---&amp;gt; RP6M256&lt;br /&gt;
 *   --------------------------------&lt;br /&gt;
 *   I/O (K17)    &amp;lt;---&amp;gt; IO_PWM/T0/T1&lt;br /&gt;
 *   ADC (K18)    &amp;lt;---&amp;gt; ADC_IO2/CMP&lt;br /&gt;
 * The RP6 Sensor Board function &amp;quot;PD5&amp;quot; (IC6: EN) is now connected to RP6M256&lt;br /&gt;
 * OC1B (PB6) and the RP6 Sensor Board function &amp;quot;ADC4&amp;quot; (SHARP_R) to RP6M256&lt;br /&gt;
 * ADC9 (PK1).&lt;br /&gt;
 * On the RP6 Sensor Board the functions &amp;quot;ADC0&amp;quot;, &amp;quot;ADC1&amp;quot;, &amp;quot;PWR&amp;quot; and &amp;quot;ADC4&amp;quot; are&lt;br /&gt;
 * connected to the USRBUS. The USRBUS may be wired on the RP6 mainboard like&lt;br /&gt;
 * this:&lt;br /&gt;
 *   Function : Sensor Board - USRBUS: * &amp;lt;---&amp;gt; RP6 Mainboard&lt;br /&gt;
 *   --------------------------------------------------------&lt;br /&gt;
 *   SHARP_F  : &amp;quot;ADC0&amp;quot;       - Pin 1     &amp;lt;---&amp;gt; ADC0: Pin 3&lt;br /&gt;
 *   GYRO     : &amp;quot;ADC1&amp;quot;       - Pin 2     &amp;lt;---&amp;gt; ADC1: Pin 3&lt;br /&gt;
 *   PWRON ²  : &amp;quot;PWR&amp;quot;        - Pin 3     &amp;lt;---&amp;gt; PWR&lt;br /&gt;
 *   SHARP_R  : &amp;quot;ADC4&amp;quot;       - Pin 5     &amp;lt;---&amp;gt; Not connected!&lt;br /&gt;
 * At *) It is also possible not to use the USRBUS, but to connect the RP6&lt;br /&gt;
 *       Sensor Board directly to the RP6 mainboard with 3 single cables.&lt;br /&gt;
 * At ²) See RP6 manual &amp;quot;4.6.8. Stromsparfunktionen&amp;quot;! &lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
#ifndef RP6M256_SENSOR_BOARD_H&lt;br /&gt;
#define RP6M256_SENSOR_BOARD_H&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// RP6 Sensor Board hardwired components:&lt;br /&gt;
// - I2C I/O Port Expander (MAX7311)&lt;br /&gt;
// - I2C Real Time Clock (RTC DS1339)&lt;br /&gt;
// - I2C Temperature Sensor (LM75B)&lt;br /&gt;
// - I2C Servo Controller (PCA9685)&lt;br /&gt;
// - I2C LED Driver (TCA6507)&lt;br /&gt;
// - I2C 3D Magnetometer &amp;amp; Accelerometer (LSM303DLHC)&lt;br /&gt;
// - Analog Yaw-Rate Gyroscope (LY330ALH)&lt;br /&gt;
// - Hot Swappable 2-Wire Bus Buffer (TCA4311A)&lt;br /&gt;
// - Button&lt;br /&gt;
// - Status LED&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C I/O Port Expander (MAX7311):&lt;br /&gt;
#define I2C_SENSOR_PORTEXP_ADR			0x40	// Default&lt;br /&gt;
&lt;br /&gt;
// Interrupt I/O portpin definitions (RP6M256):&lt;br /&gt;
#define IO_SENSOR_INT1_IN				INT1_PI12 // PCINT12 PJ3  XBUS Pin 8&lt;br /&gt;
#define IO_SENSOR_INT1_DDR				DDRJ&lt;br /&gt;
#define IO_SENSOR_INT1_PIN				PINJ&lt;br /&gt;
#define IO_SENSOR_INT1_PORT				PORTJ&lt;br /&gt;
#define IO_SENSOR_INT2_IN				INT2_PI15 // PCINT15 PJ6  XBUS Pin 11&lt;br /&gt;
#define IO_SENSOR_INT2_DDR				DDRJ&lt;br /&gt;
#define IO_SENSOR_INT2_PIN				PINJ&lt;br /&gt;
#define IO_SENSOR_INT2_PORT				PORTJ&lt;br /&gt;
#define IO_SENSOR_INT3_IN				INT3_PI14 // PCINT14 PJ5  XBUS Pin 9&lt;br /&gt;
#define IO_SENSOR_INT3_DDR				DDRJ&lt;br /&gt;
#define IO_SENSOR_INT3_PIN				PINJ&lt;br /&gt;
#define IO_SENSOR_INT3_PORT				PORTJ&lt;br /&gt;
#define IO_SENSOR_INTU_IN				INTU_PI13 // PCINT13 PJ4  XBUS Pin 7&lt;br /&gt;
#define IO_SENSOR_INTU_DDR				DDRJ&lt;br /&gt;
#define IO_SENSOR_INTU_PIN				PINJ&lt;br /&gt;
#define IO_SENSOR_INTU_PORT				PORTJ&lt;br /&gt;
&lt;br /&gt;
// I/O PORT pin numbers:&lt;br /&gt;
#define PIN7							7&lt;br /&gt;
#define PIN6							6&lt;br /&gt;
#define PIN5							5&lt;br /&gt;
#define PIN4							4&lt;br /&gt;
#define PIN3							3&lt;br /&gt;
#define PIN2							2&lt;br /&gt;
#define PIN1							1&lt;br /&gt;
#define PIN0							0&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Real Time Clock (RTC DS1339):&lt;br /&gt;
#define I2C_SENSOR_RTC_ADR				0xd0	// Default&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Temperature Sensor (LM75B):&lt;br /&gt;
#define I2C_SENSOR_TEMP_ADR				0x90	// Default&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Servo Controller (PCA9685):&lt;br /&gt;
#define I2C_SENSOR_SERVO_ADR			0x88	// Default&lt;br /&gt;
&lt;br /&gt;
// Servo and PWM channels:&lt;br /&gt;
#define CH_SERVO_1						16		// At K6: 1  &amp;quot;SERVO_1&amp;quot;&lt;br /&gt;
#define CH_SERVO_2						15		// At K11: 1 &amp;quot;SERVO_2&amp;quot;&lt;br /&gt;
#define CH_SERVO_3						13		// At K29: 1 &amp;quot;SERVO_3&amp;quot;&lt;br /&gt;
#define CH_SERVO_4						14		// At K30: 1 &amp;quot;SERVO_4&amp;quot;&lt;br /&gt;
#define CH_SERVO_5						11		// At K31: 1 &amp;quot;SERVO_5&amp;quot;&lt;br /&gt;
#define CH_SERVO_6						12		// At K32: 1 &amp;quot;SERVO_6&amp;quot;&lt;br /&gt;
#define CH_SERVO_7						9		// At K33: 1 &amp;quot;SERVO_7&amp;quot;&lt;br /&gt;
#define CH_SERVO_8						10		// At K34: 1 &amp;quot;SERVO_8&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#define CH_PWM_OUT_1					1		// At K12: 1 &amp;quot;PWM_OUT&amp;quot;&lt;br /&gt;
#define CH_PWM_OUT_2					2		// At K12: 2&lt;br /&gt;
#define CH_PWM_OUT_3					3		// At K12: 3&lt;br /&gt;
#define CH_PWM_OUT_4					4		// At K12: 4&lt;br /&gt;
#define CH_PWM_OUT_5					5		// At K12: 5&lt;br /&gt;
#define CH_PWM_OUT_6					6		// At K12: 6&lt;br /&gt;
#define CH_PWM_OUT_7					7		// At K12: 7&lt;br /&gt;
#define CH_PWM_OUT_8					8		// At K12: 8&lt;br /&gt;
&lt;br /&gt;
// Servo left touch (LT), right touch (RT), middle position (MP) constants:&lt;br /&gt;
// (Hints: - Servo impulse length [ms] = Servo position value / 204.8&lt;br /&gt;
//           (Formula only valid for a PWM of 50 Hz!)&lt;br /&gt;
//         - Min. servo impulse (0,7 ms) = Servo position 143&lt;br /&gt;
//         - Mid. servo impulse (1,5 ms) = Servo position 307&lt;br /&gt;
//         - Max. servo impulse (2,3 ms) = Servo position 471&lt;br /&gt;
//         - !!! You should NOT use servo position values &amp;lt; 143 or &amp;gt; 471 !!!)&lt;br /&gt;
#define SERVO1_LT						205		// Servo impulse ~1ms&lt;br /&gt;
#define SERVO1_RT						410		// Servo impulse ~2ms&lt;br /&gt;
#define SERVO1_MP						((SERVO1_RT - SERVO1_LT) / 2 + SERVO1_LT)&lt;br /&gt;
#define SERVO2_LT						205&lt;br /&gt;
#define SERVO2_RT						410&lt;br /&gt;
#define SERVO2_MP						((SERVO2_RT - SERVO2_LT) / 2 + SERVO2_LT)&lt;br /&gt;
#define SERVO3_LT						205&lt;br /&gt;
#define SERVO3_RT						410&lt;br /&gt;
#define SERVO3_MP						((SERVO3_RT - SERVO3_LT) / 2 + SERVO3_LT)&lt;br /&gt;
#define SERVO4_LT						205&lt;br /&gt;
#define SERVO4_RT						410&lt;br /&gt;
#define SERVO4_MP						((SERVO4_RT - SERVO4_LT) / 2 + SERVO4_LT)&lt;br /&gt;
#define SERVO5_LT						205&lt;br /&gt;
#define SERVO5_RT						410&lt;br /&gt;
#define SERVO5_MP						((SERVO5_RT - SERVO5_LT) / 2 + SERVO5_LT)&lt;br /&gt;
#define SERVO6_LT						205&lt;br /&gt;
#define SERVO6_RT						410&lt;br /&gt;
#define SERVO6_MP						((SERVO6_RT - SERVO6_LT) / 2 + SERVO6_LT)&lt;br /&gt;
#define SERVO7_LT						205&lt;br /&gt;
#define SERVO7_RT						410&lt;br /&gt;
#define SERVO7_MP						((SERVO7_RT - SERVO7_LT) / 2 + SERVO7_LT)&lt;br /&gt;
#define SERVO8_LT						205&lt;br /&gt;
#define SERVO8_RT						410&lt;br /&gt;
#define SERVO8_MP						((SERVO8_RT - SERVO8_LT) / 2 + SERVO8_LT)&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C LED Driver (TCA6507):&lt;br /&gt;
#define I2C_SENSOR_LEDDRIVER_ADR		0x8a	// Default&lt;br /&gt;
&lt;br /&gt;
// LED numbers:&lt;br /&gt;
#define SB_LED0							0		// At K7&lt;br /&gt;
#define DISPLAY_BACKLIGHT				0		// Display background light&lt;br /&gt;
#define SB_LED1							1		// At K4&lt;br /&gt;
#define SB_LED2							2		// At K2&lt;br /&gt;
#define SB_LED3							3		// At K10: 1&lt;br /&gt;
#define BACKLIGHT_R						3		// Right backlight&lt;br /&gt;
#define SB_LED4							4		// At K10: 2&lt;br /&gt;
#define BACKLIGHT_L						4		// Left backlight&lt;br /&gt;
#define SB_LED5							5		// White LED (D3)&lt;br /&gt;
#define HEADLIGHT_R						5		// Right headlight&lt;br /&gt;
#define SB_LED6							6		// White LED (D1)&lt;br /&gt;
#define HEADLIGHT_L						6		// Left headlight&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C 3D Magnetometer &amp;amp; Accelerometer (LSM303DLHC):&lt;br /&gt;
&lt;br /&gt;
// LSM303DLHC accelerometer:&lt;br /&gt;
#define I2C_SENSOR_LSM303DLHC_A_ADR 	0x32	// Default&lt;br /&gt;
&lt;br /&gt;
// LSM303DLHC accelerometer calibration data:&lt;br /&gt;
#define MAX_X_A						1037		// Max. X-axis value&lt;br /&gt;
#define MIN_X_A						-1030		// Min. X-axis value&lt;br /&gt;
#define MAX_Y_A						1030		// Max. Y-axis value&lt;br /&gt;
#define MIN_Y_A						-1019		// Min. Y-axis value&lt;br /&gt;
#define MAX_Z_A						1062		// Max. Z-axis value&lt;br /&gt;
#define MIN_Z_A						-1056		// Min. Z-axis value&lt;br /&gt;
#define OFFSET_PITCH_A				0.0			// Offset Pitch [°]&lt;br /&gt;
#define OFFSET_ROLL_A				0.0			// Offset Roll [°]&lt;br /&gt;
&lt;br /&gt;
// LSM303DLHC magnetometer:&lt;br /&gt;
#define I2C_SENSOR_LSM303DLHC_M_ADR		0x3c	// Default&lt;br /&gt;
&lt;br /&gt;
// LSM303DLHC magnetometer calibration data:&lt;br /&gt;
#define MAX_X_M						-111.0		// Max. X-axis value&lt;br /&gt;
#define MIN_X_M						-634.0		// Min. X-axis value&lt;br /&gt;
#define OFFSET_X_M					0			// Hard iron X-axis offset&lt;br /&gt;
#define MAX_Y_M						297.0		// Max. Y-axis value&lt;br /&gt;
#define MIN_Y_M						-215.0		// Min. Y-axis value&lt;br /&gt;
#define OFFSET_Y_M					0			// Hard iron Y-axis offset&lt;br /&gt;
#define MAX_Z_M						183.0		// Max. Z-axis value&lt;br /&gt;
#define MIN_Z_M						-214.0		// Min. Z-axis value&lt;br /&gt;
#define OFFSET_Z_M					0			// Hard iron Z-axis offset&lt;br /&gt;
#define DECLINATION_M				0.0			// E at local position [°]&lt;br /&gt;
&lt;br /&gt;
// LSM303DLHC temperature sensor definitions:&lt;br /&gt;
#define GET_TEMP_M								// Enable temperature sensor&lt;br /&gt;
#define OFFSET_TEMP_M				0.0			// Temperature offset [°C]&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Analog Yaw-Rate Gyroscope (LY330ALH):&lt;br /&gt;
&lt;br /&gt;
// LY330ALH gyroscope:&lt;br /&gt;
#define ADC_SENSOR_LY330ALH				ADC_1	// At USRBUS: 2 (RP6BASE)&lt;br /&gt;
&lt;br /&gt;
// LY330ALH gyroscope calibration data:&lt;br /&gt;
// (Higher values [505..1023] mean an angular velocity while rotating LEFT&lt;br /&gt;
//  and lower values [503..0] while rotating RIGHT!)&lt;br /&gt;
#define ADCVAL_MINRATE					0		// Min. rate value&lt;br /&gt;
#define ADCVAL_ZERORATE_LEVEL			504		// Zero rate level&lt;br /&gt;
#define ADCVAL_MAXRATE					1023	// Max. rate value&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Hot Swappable 2-Wire Bus Buffer (TCA4311A):&lt;br /&gt;
&lt;br /&gt;
// Define USE_PD5, if you want to control the TCA4311A enable pin (EN) with&lt;br /&gt;
// the RP6 Sensor Board function &amp;quot;PD5&amp;quot;. If USE_PD5 is NOT defined (default),&lt;br /&gt;
// the TCA4311A EN pin is controlled by the MAX7311 I/O 1.0 pin.&lt;br /&gt;
// ---------------&lt;br /&gt;
//#define USE_PD5&lt;br /&gt;
// ---------------&lt;br /&gt;
&lt;br /&gt;
#define IO_SENSOR_TCA4311A_EN_IN		OC1B_PI6 // At I/O: 9 (RP6M256)&lt;br /&gt;
#define IO_SENSOR_TCA4311A_EN_DDR		DDRB&lt;br /&gt;
#define IO_SENSOR_TCA4311A_EN_PIN		PINB&lt;br /&gt;
#define IO_SENSOR_TCA4311A_EN_PORT		PORTB&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Button:&lt;br /&gt;
&lt;br /&gt;
// (Button is connected to I/O 1.7 of the MAX7311!)&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Status LED:&lt;br /&gt;
&lt;br /&gt;
// (Status LED is connected to I/O 1.6 of the MAX7311!)&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Other ADC channel definitions:&lt;br /&gt;
&lt;br /&gt;
// (Depending on connections on the RP6 Sensor Board!)&lt;br /&gt;
#define ADC_SENSOR_SHARP_F				ADC_0	// At USRBUS: 1 (RP6BASE)&lt;br /&gt;
#define ADC_SENSOR_SHARP_R				ADC_9	// At ADC: 3    (RP6M256)&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
/******************************************************************************&lt;br /&gt;
 * Additional info&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Changelog:&lt;br /&gt;
 * &lt;br /&gt;
 *  ---&amp;gt; changes are documented in the file &amp;quot;RP6M256_Sensor_BoardLib.c&amp;quot;&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=====Library Header=====&lt;br /&gt;
Datei: RP6M256_Sensor_BoardLib.h&lt;br /&gt;
&amp;lt;pre&amp;gt;/* ****************************************************************************&lt;br /&gt;
 *                           _______________________&lt;br /&gt;
 *                           \| RP6  ROBOT SYSTEM |/&lt;br /&gt;
 *                            \_-_-_-_-_-_-_-_-_-_/           &amp;gt;&amp;gt;&amp;gt; RP6 M256 WIFI&lt;br /&gt;
 * ----------------------------------------------------------------------------&lt;br /&gt;
 * ----------------------------- [c]2014 - Dirk -------------------------------&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * File: RP6M256_Sensor_BoardLib.h&lt;br /&gt;
 * Version: 1.1&lt;br /&gt;
 * Target: RP6 M256 WIFI - ATMEGA2560 @16.00MHz&lt;br /&gt;
 * Author(s): Dirk&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Description:&lt;br /&gt;
 * Header file for new RP6 Sensor Board library.&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
#ifndef RP6M256_SENSOR_BOARDLIB_H&lt;br /&gt;
#define RP6M256_SENSOR_BOARDLIB_H&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// RP6 Sensor Board hardwired components:&lt;br /&gt;
// - I2C I/O Port Expander (MAX7311)&lt;br /&gt;
// - I2C Real Time Clock (RTC DS1339)&lt;br /&gt;
// - I2C Temperature Sensor (LM75B)&lt;br /&gt;
// - I2C Servo Controller (PCA9685)&lt;br /&gt;
// - I2C LED Driver (TCA6507)&lt;br /&gt;
// - I2C 3D Magnetometer &amp;amp; Accelerometer (LSM303DLHC)&lt;br /&gt;
// - Analog Yaw-Rate Gyroscope (LY330ALH)&lt;br /&gt;
// - Hot Swappable 2-Wire Bus Buffer (TCA4311A)&lt;br /&gt;
// - Button&lt;br /&gt;
// - Status LED&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Includes:&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6M256Lib.h&amp;quot;&lt;br /&gt;
#include &amp;quot;RP6I2CmasterTWI.h&amp;quot;&lt;br /&gt;
#include &amp;quot;RP6M256_Sensor_Board.h&amp;quot;&lt;br /&gt;
#include &amp;lt;math.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// RP6M256_I2CMasterLib definitions:&lt;br /&gt;
&lt;br /&gt;
#ifndef I2C_RP6_BASE_ADR&lt;br /&gt;
	#define I2C_RP6_BASE_ADR			10&lt;br /&gt;
#endif&lt;br /&gt;
#ifndef I2C_REG_ADC_ADC0_L&lt;br /&gt;
	#define I2C_REG_ADC_ADC0_L			23&lt;br /&gt;
#endif&lt;br /&gt;
#ifndef I2C_REG_ADC_ADC1_L&lt;br /&gt;
	#define I2C_REG_ADC_ADC1_L			25&lt;br /&gt;
#endif&lt;br /&gt;
#ifndef CMD_POWER_OFF&lt;br /&gt;
	#define CMD_POWER_OFF				0&lt;br /&gt;
#endif&lt;br /&gt;
#ifndef CMD_POWER_ON&lt;br /&gt;
	#define CMD_POWER_ON				1&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C I/O Port Expander (MAX7311):&lt;br /&gt;
&lt;br /&gt;
// Registers:&lt;br /&gt;
#define MAX7311_INPUT_PORT1				0&lt;br /&gt;
#define MAX7311_INPUT_PORT2				1&lt;br /&gt;
#define MAX7311_OUTPUT_PORT1			2&lt;br /&gt;
#define MAX7311_OUTPUT_PORT2			3&lt;br /&gt;
#define MAX7311_PORT1_POL_INV			4&lt;br /&gt;
#define MAX7311_PORT2_POL_INV			5&lt;br /&gt;
#define MAX7311_PORT1_CONFIG			6&lt;br /&gt;
#define MAX7311_PORT2_CONFIG			7&lt;br /&gt;
#define MAX7311_TIMEOUT					8&lt;br /&gt;
&lt;br /&gt;
// Port 1 configuration register bitmasks:&lt;br /&gt;
#define ST_GYRO							(1 &amp;lt;&amp;lt; PIN7)	// I/O 0.7 (Output)&lt;br /&gt;
#define PD_GYRO							(1 &amp;lt;&amp;lt; PIN6)	// I/O 0.6 (Output)&lt;br /&gt;
#define PWR_CAM_IF						(1 &amp;lt;&amp;lt; PIN5)	// I/O 0.5 (Output)&lt;br /&gt;
#define EN_LEDDRIV						(1 &amp;lt;&amp;lt; PIN4)	// I/O 0.4 (Output)&lt;br /&gt;
#define RDY_BUSBUFF						(1 &amp;lt;&amp;lt; PIN3)	// I/O 0.3 (Input)&lt;br /&gt;
#define PWR_SHARP_R						(1 &amp;lt;&amp;lt; PIN2)	// I/O 0.2 (Output)&lt;br /&gt;
#define PWR_SHARP_F						(1 &amp;lt;&amp;lt; PIN1)	// I/O 0.1 (Output)&lt;br /&gt;
#define PWR_I2C							(1 &amp;lt;&amp;lt; PIN0)	// I/O 0.0 (Output)&lt;br /&gt;
&lt;br /&gt;
// Port 2 configuration register bitmasks:&lt;br /&gt;
#define IO2_I2C							(1 &amp;lt;&amp;lt; PIN7)	// I/O 1.7 (Input)&lt;br /&gt;
#define IO1_I2C							(1 &amp;lt;&amp;lt; PIN6)	// I/O 1.6 (Output)&lt;br /&gt;
#define DRDY_MAGACC						(1 &amp;lt;&amp;lt; PIN5)	// I/O 1.5 (Input)&lt;br /&gt;
#define PWR_SERVO						(1 &amp;lt;&amp;lt; PIN4)	// I/O 1.4 (Output)&lt;br /&gt;
#define OEN_SERVO						(1 &amp;lt;&amp;lt; PIN3)	// I/O 1.3 (Output)&lt;br /&gt;
#define IO_K19_1						(1 &amp;lt;&amp;lt; PIN2)	// I/O 1.2 (Input)&lt;br /&gt;
#define IO_K19_3						(1 &amp;lt;&amp;lt; PIN1)	// I/O 1.1 (Input)&lt;br /&gt;
#define EN_BUSBUFF						(1 &amp;lt;&amp;lt; PIN0)	// I/O 1.0 (Output)&lt;br /&gt;
&lt;br /&gt;
// Port 1 &amp;amp; 2 register 16-bit bitmasks:&lt;br /&gt;
// (CONFIG: 1 = Input, 0 = Output)&lt;br /&gt;
#define MAX7311_CONFIG_DEFAULT			0b1010011000001000&lt;br /&gt;
#define MAX7311_CONFIG_USE_PD5			0b1010011100001000&lt;br /&gt;
// (OUTPUT: 1 = High/True, 0 = Low/False)&lt;br /&gt;
#define MAX7311_OUTPUT_DEFAULT			0b0100000100010000&lt;br /&gt;
#define MAX7311_OUTPUT_FULLPOWER		0b0001000100110111&lt;br /&gt;
#define MAX7311_OUTPUT_SHUTDOWN			0b0100100011000000&lt;br /&gt;
&lt;br /&gt;
// Safe configuration:&lt;br /&gt;
// (Ensures if activated, that I/Os 0.3, 1.5 and 1.7 cannot be configured&lt;br /&gt;
//  as output with the function MAX7311_write_cfg(). This may protect the&lt;br /&gt;
//  RP6 Sensor Board from hardware damage.)&lt;br /&gt;
// -------------------&lt;br /&gt;
#define SAFE_CONFIG&lt;br /&gt;
// -------------------&lt;br /&gt;
&lt;br /&gt;
typedef union {&lt;br /&gt;
 	uint8_t byte;&lt;br /&gt;
	struct {&lt;br /&gt;
		unsigned int1   :1;				// INT1  XBUS Pin 8&lt;br /&gt;
		unsigned int2   :1;				// INT2  XBUS Pin 11&lt;br /&gt;
		unsigned int3   :1;				// INT3  XBUS Pin 9&lt;br /&gt;
		unsigned intu   :1;				// INTU  XBUS Pin 7&lt;br /&gt;
		unsigned unused :4;&lt;br /&gt;
	};&lt;br /&gt;
	struct {&lt;br /&gt;
		unsigned magacc1     :1;		// INT1: LSM303DLHC INT1&lt;br /&gt;
		unsigned portexp     :1;		// INT2: MAX7311 INT_N&lt;br /&gt;
		unsigned magacc2_rtc :1;		// INT3: LSM303DLHC INT2&lt;br /&gt;
		unsigned noname      :5;		//       OR DS1339 SQW/INT_N&lt;br /&gt;
	};&lt;br /&gt;
} interrupt_RP6SBstatus_t;&lt;br /&gt;
extern interrupt_RP6SBstatus_t interrupt_RP6SBstatus;&lt;br /&gt;
&lt;br /&gt;
typedef union {&lt;br /&gt;
	uint16_t word;&lt;br /&gt;
	struct {&lt;br /&gt;
		unsigned pwr_i2c     :1;		// I/O 0.0 (Output)&lt;br /&gt;
		unsigned pwr_sharp_f :1;		// I/O 0.1 (Output)&lt;br /&gt;
		unsigned pwr_sharp_r :1;		// I/O 0.2 (Output)&lt;br /&gt;
		unsigned rdy_busbuff :1;		// I/O 0.3 (Input)&lt;br /&gt;
		unsigned en_leddriv  :1;		// I/O 0.4 (Output)&lt;br /&gt;
		unsigned pwr_cam_if  :1;		// I/O 0.5 (Output)&lt;br /&gt;
		unsigned pd_gyro     :1;		// I/O 0.6 (Output)&lt;br /&gt;
		unsigned st_gyro     :1;		// I/O 0.7 (Output)&lt;br /&gt;
		unsigned en_busbuff  :1;		// I/O 1.0 (Output)&lt;br /&gt;
		unsigned io_k19_3    :1;		// I/O 1.1 (Input)&lt;br /&gt;
		unsigned io_k19_1    :1;		// I/O 1.2 (Input)&lt;br /&gt;
		unsigned oen_servo   :1;		// I/O 1.3 (Output)&lt;br /&gt;
		unsigned pwr_servo   :1;		// I/O 1.4 (Output)&lt;br /&gt;
		unsigned drdy_magacc :1;		// I/O 1.5 (Input)&lt;br /&gt;
		unsigned io1_i2c     :1;		// I/O 1.6 (Output)&lt;br /&gt;
		unsigned io2_i2c     :1;		// I/O 1.7 (Input)&lt;br /&gt;
	};&lt;br /&gt;
} max7311IOs_t;&lt;br /&gt;
extern max7311IOs_t inport;&lt;br /&gt;
extern max7311IOs_t outport;&lt;br /&gt;
extern uint8_t readyBusbuff;&lt;br /&gt;
extern uint8_t pressedButton;&lt;br /&gt;
&lt;br /&gt;
void MAX7311_write_cfg(uint16_t);&lt;br /&gt;
void task_checkINTs(void);&lt;br /&gt;
void task_RP6SensorBoard(void);&lt;br /&gt;
void MAX7311_update(void);&lt;br /&gt;
void MAX7311_write(uint16_t);&lt;br /&gt;
void MAX7311_init(void);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Real Time Clock (RTC DS1339):&lt;br /&gt;
&lt;br /&gt;
// Registers:&lt;br /&gt;
#define DS1339_SECONDS					0&lt;br /&gt;
#define DS1339_MINUTES					1&lt;br /&gt;
#define DS1339_HOURS					2&lt;br /&gt;
#define DS1339_DAY						3&lt;br /&gt;
#define DS1339_DATE						4&lt;br /&gt;
#define DS1339_MONTH_CENTURY			5&lt;br /&gt;
#define DS1339_YEAR						6&lt;br /&gt;
#define DS1339_ALARM1_SECONDS			7&lt;br /&gt;
#define DS1339_ALARM1_MINUTES			8&lt;br /&gt;
#define DS1339_ALARM1_HOURS				9&lt;br /&gt;
#define DS1339_ALARM1_DAY_DATE			10&lt;br /&gt;
#define DS1339_ALARM2_MINUTES			11&lt;br /&gt;
#define DS1339_ALARM2_HOURS				12&lt;br /&gt;
#define DS1339_ALARM2_DAY_DATE			13&lt;br /&gt;
#define DS1339_CONTROL					14&lt;br /&gt;
#define DS1339_STATUS					15&lt;br /&gt;
#define DS1339_TRICKLE_CHARGER			16&lt;br /&gt;
&lt;br /&gt;
// Control register bitmasks:&lt;br /&gt;
#define DS1339_CONTROL_DEFAULT			0		// Power on default&lt;br /&gt;
#define DS1339_CONTROL_A1IE				1&lt;br /&gt;
#define DS1339_CONTROL_A2IE				2&lt;br /&gt;
#define DS1339_CONTROL_INTCN			4&lt;br /&gt;
#define DS1339_CONTROL_RS1				8&lt;br /&gt;
#define DS1339_CONTROL_RS2				16&lt;br /&gt;
#define DS1339_CONTROL_BBSQI			32&lt;br /&gt;
#define DS1339_CONTROL_EOSC				128&lt;br /&gt;
&lt;br /&gt;
// Trickle Charger register bitmasks:&lt;br /&gt;
#define DS1339_TRICKLE_CHARGER_DEFAULT	0b10101010 // One diode, 2k resistor&lt;br /&gt;
#define DS1339_TRICKLE_CHARGER_ROUT0	1&lt;br /&gt;
#define DS1339_TRICKLE_CHARGER_ROUT1	2&lt;br /&gt;
#define DS1339_TRICKLE_CHARGER_DS0		4&lt;br /&gt;
#define DS1339_TRICKLE_CHARGER_DS1		8&lt;br /&gt;
#define DS1339_TRICKLE_CHARGER_TCS0		16&lt;br /&gt;
#define DS1339_TRICKLE_CHARGER_TCS1		32&lt;br /&gt;
#define DS1339_TRICKLE_CHARGER_TCS2		64&lt;br /&gt;
#define DS1339_TRICKLE_CHARGER_TCS3		128&lt;br /&gt;
&lt;br /&gt;
enum RTCWEEKDAYS {&lt;br /&gt;
	R_MO = 1, R_TU, R_WE, R_TH, R_FR, R_SA, R_SU&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
typedef struct {&lt;br /&gt;
	uint16_t         year;				// Year&lt;br /&gt;
	uint8_t          month;				// Month   [1..12]&lt;br /&gt;
	enum RTCWEEKDAYS weekday;			// Weekday [1..7 = R_MO..R_SU]&lt;br /&gt;
	uint8_t          day;				// Day     [1..31]&lt;br /&gt;
} rtcdate_t;&lt;br /&gt;
rtcdate_t rtc_date;&lt;br /&gt;
&lt;br /&gt;
typedef struct {&lt;br /&gt;
	uint8_t dst;						// Daylight-saving-time (time zone)&lt;br /&gt;
	uint8_t hour;						// Hour    [0..23]&lt;br /&gt;
	uint8_t minute;						// Minute  [0..59]&lt;br /&gt;
	uint8_t second;						// Second  [0..59]&lt;br /&gt;
} rtctime_t;&lt;br /&gt;
rtctime_t rtc_time;&lt;br /&gt;
&lt;br /&gt;
uint8_t BCD2DEC(uint8_t);&lt;br /&gt;
uint8_t DEC2BCD(uint8_t);&lt;br /&gt;
void DS1339_write_cfg(uint8_t);&lt;br /&gt;
void DS1339_init(void);&lt;br /&gt;
#define CALC_DST						// Time zone will be calculated&lt;br /&gt;
void DS1339_read(void);&lt;br /&gt;
void DS1339_write(void);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Temperature Sensor (LM75B):&lt;br /&gt;
&lt;br /&gt;
// Registers:&lt;br /&gt;
#define LM75B_TEMP						0&lt;br /&gt;
#define LM75B_CONF						1&lt;br /&gt;
#define LM75B_THYST						2&lt;br /&gt;
#define LM75B_TOS						3&lt;br /&gt;
&lt;br /&gt;
// Conf register bitmasks:&lt;br /&gt;
#define LM75B_CONF_DEFAULT				0		// Power on default&lt;br /&gt;
#define LM75B_CONF_SHUTDOWN				1&lt;br /&gt;
#define LM75B_CONF_OS_COMP_INT			2&lt;br /&gt;
#define LM75B_CONF_OS_POL				4&lt;br /&gt;
#define LM75B_CONF_OS_F_QUE0			8&lt;br /&gt;
#define LM75B_CONF_OS_F_QUE1			16&lt;br /&gt;
&lt;br /&gt;
extern double temperature;&lt;br /&gt;
&lt;br /&gt;
void LM75B_write_cfg(uint8_t);&lt;br /&gt;
#define LM75B_shutdown() {LM75B_write_cfg(LM75B_CONF_SHUTDOWN);}&lt;br /&gt;
#define LM75B_init() {LM75B_write_cfg(LM75B_CONF_DEFAULT);}&lt;br /&gt;
extern uint8_t temperature_low;&lt;br /&gt;
extern uint8_t temperature_high;&lt;br /&gt;
#define getTemperatureHigh() (temperature_high)&lt;br /&gt;
#define getTemperatureLow() (temperature_low)&lt;br /&gt;
void LM75B_read(void);&lt;br /&gt;
double LM75B_calculate(void);&lt;br /&gt;
double LM75B_measure(void);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Servo Controller (PCA9685):&lt;br /&gt;
&lt;br /&gt;
// Registers:&lt;br /&gt;
#define PCA9685_MODE1					0&lt;br /&gt;
#define PCA9685_MODE2					1&lt;br /&gt;
#define PCA9685_SUBADR1					2&lt;br /&gt;
#define PCA9685_SUBADR2					3&lt;br /&gt;
#define PCA9685_SUBADR3					4&lt;br /&gt;
#define PCA9685_ALLCALLADR				5&lt;br /&gt;
#define PCA9685_LED0_ON_L				6&lt;br /&gt;
#define PCA9685_LED0_ON_H				7&lt;br /&gt;
#define PCA9685_LED0_OFF_L				8&lt;br /&gt;
#define PCA9685_LED0_OFF_H				9&lt;br /&gt;
#define PCA9685_LED1_ON_L				10&lt;br /&gt;
#define PCA9685_LED1_ON_H				11&lt;br /&gt;
#define PCA9685_LED1_OFF_L				12&lt;br /&gt;
#define PCA9685_LED1_OFF_H				13&lt;br /&gt;
#define PCA9685_LED2_ON_L				14&lt;br /&gt;
#define PCA9685_LED2_ON_H				15&lt;br /&gt;
#define PCA9685_LED2_OFF_L				16&lt;br /&gt;
#define PCA9685_LED2_OFF_H				17&lt;br /&gt;
#define PCA9685_LED3_ON_L				18&lt;br /&gt;
#define PCA9685_LED3_ON_H				19&lt;br /&gt;
#define PCA9685_LED3_OFF_L				20&lt;br /&gt;
#define PCA9685_LED3_OFF_H				21&lt;br /&gt;
#define PCA9685_LED4_ON_L				22&lt;br /&gt;
#define PCA9685_LED4_ON_H				23&lt;br /&gt;
#define PCA9685_LED4_OFF_L				24&lt;br /&gt;
#define PCA9685_LED4_OFF_H				25&lt;br /&gt;
#define PCA9685_LED5_ON_L				26&lt;br /&gt;
#define PCA9685_LED5_ON_H				27&lt;br /&gt;
#define PCA9685_LED5_OFF_L				28&lt;br /&gt;
#define PCA9685_LED5_OFF_H				29&lt;br /&gt;
#define PCA9685_LED6_ON_L				30&lt;br /&gt;
#define PCA9685_LED6_ON_H				31&lt;br /&gt;
#define PCA9685_LED6_OFF_L				32&lt;br /&gt;
#define PCA9685_LED6_OFF_H				33&lt;br /&gt;
#define PCA9685_LED7_ON_L				34&lt;br /&gt;
#define PCA9685_LED7_ON_H				35&lt;br /&gt;
#define PCA9685_LED7_OFF_L				36&lt;br /&gt;
#define PCA9685_LED7_OFF_H				37&lt;br /&gt;
#define PCA9685_LED8_ON_L				38&lt;br /&gt;
#define PCA9685_LED8_ON_H				39&lt;br /&gt;
#define PCA9685_LED8_OFF_L				40&lt;br /&gt;
#define PCA9685_LED8_OFF_H				41&lt;br /&gt;
#define PCA9685_LED9_ON_L				42&lt;br /&gt;
#define PCA9685_LED9_ON_H				43&lt;br /&gt;
#define PCA9685_LED9_OFF_L				44&lt;br /&gt;
#define PCA9685_LED9_OFF_H				45&lt;br /&gt;
#define PCA9685_LED10_ON_L				46&lt;br /&gt;
#define PCA9685_LED10_ON_H				47&lt;br /&gt;
#define PCA9685_LED10_OFF_L				48&lt;br /&gt;
#define PCA9685_LED10_OFF_H				49&lt;br /&gt;
#define PCA9685_LED11_ON_L				50&lt;br /&gt;
#define PCA9685_LED11_ON_H				51&lt;br /&gt;
#define PCA9685_LED11_OFF_L				52&lt;br /&gt;
#define PCA9685_LED11_OFF_H				53&lt;br /&gt;
#define PCA9685_LED12_ON_L				54&lt;br /&gt;
#define PCA9685_LED12_ON_H				55&lt;br /&gt;
#define PCA9685_LED12_OFF_L				56&lt;br /&gt;
#define PCA9685_LED12_OFF_H				57&lt;br /&gt;
#define PCA9685_LED13_ON_L				58&lt;br /&gt;
#define PCA9685_LED13_ON_H				59&lt;br /&gt;
#define PCA9685_LED13_OFF_L				60&lt;br /&gt;
#define PCA9685_LED13_OFF_H				61&lt;br /&gt;
#define PCA9685_LED14_ON_L				62&lt;br /&gt;
#define PCA9685_LED14_ON_H				63&lt;br /&gt;
#define PCA9685_LED14_OFF_L				64&lt;br /&gt;
#define PCA9685_LED14_OFF_H				65&lt;br /&gt;
#define PCA9685_LED15_ON_L				66&lt;br /&gt;
#define PCA9685_LED15_ON_H				67&lt;br /&gt;
#define PCA9685_LED15_OFF_L				68&lt;br /&gt;
#define PCA9685_LED15_OFF_H				69&lt;br /&gt;
#define PCA9685_ALL_LED_ON_L			250&lt;br /&gt;
#define PCA9685_ALL_LED_ON_H			251&lt;br /&gt;
#define PCA9685_ALL_LED_OFF_L			252&lt;br /&gt;
#define PCA9685_ALL_LED_OFF_H			253&lt;br /&gt;
#define PCA9685_PRE_SCALE				254&lt;br /&gt;
#define PCA9685_TESTMODE				255&lt;br /&gt;
&lt;br /&gt;
// Mode1 register bitmasks:&lt;br /&gt;
#define PCA9685_MODE1_ALLCALL			1&lt;br /&gt;
#define PCA9685_MODE1_SUB3				2&lt;br /&gt;
#define PCA9685_MODE1_SUB2				4&lt;br /&gt;
#define PCA9685_MODE1_SUB1				8&lt;br /&gt;
#define PCA9685_MODE1_SLEEP				16&lt;br /&gt;
#define PCA9685_MODE1_AI				32&lt;br /&gt;
#define PCA9685_MODE1_EXTCLK			64&lt;br /&gt;
#define PCA9685_MODE1_RESTART			128&lt;br /&gt;
&lt;br /&gt;
// Mode2 register bitmasks:&lt;br /&gt;
#define PCA9685_MODE2_OUTNE01_DEFAULT	0&lt;br /&gt;
#define PCA9685_MODE2_OUTDRV			4&lt;br /&gt;
#define PCA9685_MODE2_OCH				8&lt;br /&gt;
#define PCA9685_MODE2_INVRT				16&lt;br /&gt;
&lt;br /&gt;
#define F_PCA9685						25000000.0	// Int. Clock: 25 MHz&lt;br /&gt;
&lt;br /&gt;
void PCA9685_init(uint16_t);&lt;br /&gt;
#define initServo(__FREQ__) {PCA9685_init(__FREQ__);}&lt;br /&gt;
uint8_t servo(uint8_t);&lt;br /&gt;
void PCA9685_set(uint8_t, uint16_t);&lt;br /&gt;
#define setServo(__SERVO__,__POS__) {PCA9685_set(servo(__SERVO__),__POS__);}&lt;br /&gt;
void PCA9685_shutdown(void);&lt;br /&gt;
void PCA9685_restart(void);&lt;br /&gt;
void setServoPower(uint8_t);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C LED Driver (TCA6507):&lt;br /&gt;
&lt;br /&gt;
// Registers:&lt;br /&gt;
#define TCA6507_SELECT0				0&lt;br /&gt;
#define TCA6507_SELECT1				1&lt;br /&gt;
#define TCA6507_SELECT2				2&lt;br /&gt;
#define TCA6507_FADEON_TIME			3&lt;br /&gt;
#define TCA6507_FULLYON_TIME		4&lt;br /&gt;
#define TCA6507_FADEOFF_TIME		5&lt;br /&gt;
#define TCA6507_1ST_FULLYOFF_TIME	6&lt;br /&gt;
#define TCA6507_2ND_FULLYOFF_TIME	7&lt;br /&gt;
#define TCA6507_MAXIMUM_INTENSITY	8&lt;br /&gt;
#define TCA6507_MASTER_INTENSITY	9&lt;br /&gt;
#define TCA6507_INITIALIZATION		10&lt;br /&gt;
&lt;br /&gt;
// Output states:&lt;br /&gt;
#define STATE_OFF					0&lt;br /&gt;
#define STATE_PWM0					2&lt;br /&gt;
#define STATE_PWM1					3&lt;br /&gt;
#define STATE_ON					4&lt;br /&gt;
#define STATE_MINT					5&lt;br /&gt;
#define STATE_BLINK0				6&lt;br /&gt;
#define STATE_BLINK1				7&lt;br /&gt;
&lt;br /&gt;
extern uint8_t select[3];&lt;br /&gt;
&lt;br /&gt;
void TCA6507_write_cfg(uint8_t, uint8_t);&lt;br /&gt;
void TCA6507_update(void);&lt;br /&gt;
void TCA6507_set(uint8_t, uint8_t);&lt;br /&gt;
#define setLED(__LED__,__STATE__) {TCA6507_set(__LED__,__STATE__);}&lt;br /&gt;
void TCA6507_shutdown(void);&lt;br /&gt;
void TCA6507_restart(void);&lt;br /&gt;
void TCA6507_init(void);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C 3D Magnetometer &amp;amp; Accelerometer (LSM303DLHC):&lt;br /&gt;
&lt;br /&gt;
// LSM303DLHC accelerometer internal registers:&lt;br /&gt;
#define CTRL_REG1_A					0x20&lt;br /&gt;
#define CTRL_REG2_A					0x21&lt;br /&gt;
#define CTRL_REG3_A					0x22&lt;br /&gt;
#define CTRL_REG4_A					0x23&lt;br /&gt;
#define CTRL_REG5_A					0x24&lt;br /&gt;
#define CTRL_REG6_A					0x25&lt;br /&gt;
#define REFERENCE_A					0x26&lt;br /&gt;
#define STATUS_REG_A				0x27&lt;br /&gt;
#define OUT_X_L_A					0x28&lt;br /&gt;
#define OUT_X_H_A					0x29&lt;br /&gt;
#define OUT_Y_L_A					0x2a&lt;br /&gt;
#define OUT_Y_H_A					0x2b&lt;br /&gt;
#define OUT_Z_L_A					0x2c&lt;br /&gt;
#define OUT_Z_H_A					0x2d&lt;br /&gt;
#define FIFO_CTRL_REG_A				0x2e&lt;br /&gt;
#define FIFO_SRC_REG_A				0x2f&lt;br /&gt;
#define INT1_CFG_A					0x30&lt;br /&gt;
#define INT1_SOURCE_A				0x31&lt;br /&gt;
#define INT1_THS_A					0x32&lt;br /&gt;
#define INT1_DURATION_A				0x33&lt;br /&gt;
#define INT2_CFG_A					0x34&lt;br /&gt;
#define INT2_SOURCE_A				0x35&lt;br /&gt;
#define INT2_THS_A					0x36&lt;br /&gt;
#define INT2_DURATION_A				0x37&lt;br /&gt;
#define CLICK_CFG_A					0x38&lt;br /&gt;
#define CLICK_SRC_A					0x39&lt;br /&gt;
#define CLICK_THS_A					0x3a&lt;br /&gt;
#define TIME_LIMIT_A				0x3b&lt;br /&gt;
#define TIME_LATENCY_A				0x3c&lt;br /&gt;
#define TIME_WINDOW_A				0x3d&lt;br /&gt;
&lt;br /&gt;
// LSM303DLHC accelerometer register settings:&lt;br /&gt;
#define CTRL_REG1_A_10HZ			0b00100111	// 10Hz &amp;amp; all axes enable&lt;br /&gt;
#define CTRL_REG1_A_50HZ			0b01000111	// 50Hz &amp;amp; all axes enable&lt;br /&gt;
#define CTRL_REG4_A_DEFAULT			0b00000000	// Default (Normal mode)&lt;br /&gt;
#define CTRL_REG4_A_HR				0b00001000	// HR output mode&lt;br /&gt;
&lt;br /&gt;
// LSM303DLHC magnetometer internal registers:&lt;br /&gt;
#define CRA_REG_M					0x00&lt;br /&gt;
#define CRB_REG_M					0x01&lt;br /&gt;
#define MR_REG_M					0x02&lt;br /&gt;
#define OUT_X_H_M					0x03&lt;br /&gt;
#define OUT_X_L_M					0x04&lt;br /&gt;
#define OUT_Z_H_M					0x05&lt;br /&gt;
#define OUT_Z_L_M					0x06&lt;br /&gt;
#define OUT_Y_H_M					0x07&lt;br /&gt;
#define OUT_Y_L_M					0x08&lt;br /&gt;
#define SR_REG_MG					0x09&lt;br /&gt;
#define IRA_REG_M					0x0a&lt;br /&gt;
#define IRB_REG_M					0x0b&lt;br /&gt;
#define IRC_REG_M					0x0c&lt;br /&gt;
#define TEMP_OUT_H_M				0x31&lt;br /&gt;
#define TEMP_OUT_L_M				0x32&lt;br /&gt;
&lt;br /&gt;
// LSM303DLHC magnetometer register settings:&lt;br /&gt;
#define CRA_REG_M_15HZ				0b00010000	// Default (Data rate 15Hz)&lt;br /&gt;
#define CRA_REG_M_15HZ_T_EN			0b10010000	// 15Hz &amp;amp; temperature enable&lt;br /&gt;
#define CRB_REG_M_13GAUSS			0b00100000	// Gain +-1.3Gauss&lt;br /&gt;
#define MR_REG_M_CCM				0b00000000	// Continuous-conversion mode&lt;br /&gt;
#define MR_REG_M_SCM				0b00000001	// Single-conversion mode&lt;br /&gt;
#define MR_REG_M_SLEEP				0b00000011	// Default (Sleep-mode)&lt;br /&gt;
&lt;br /&gt;
extern int16_t x_axisa, y_axisa, z_axisa;&lt;br /&gt;
extern double pitch, roll;&lt;br /&gt;
extern double xa, ya, za;&lt;br /&gt;
extern double the, phi;&lt;br /&gt;
&lt;br /&gt;
extern int16_t x_axism, y_axism, z_axism;&lt;br /&gt;
extern int16_t headingm;&lt;br /&gt;
extern double xm, ym, zm;&lt;br /&gt;
#ifdef GET_TEMP_M&lt;br /&gt;
extern int16_t temperaturem;&lt;br /&gt;
extern double temperature_mag;&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
extern int16_t headingtc;&lt;br /&gt;
&lt;br /&gt;
void LSM303DLHC_A_init(void);&lt;br /&gt;
void readLSM303DLHC_A(void);&lt;br /&gt;
void normalizeLSM303DLHC_A(void);&lt;br /&gt;
void positionLSM303DLHC_A(void);&lt;br /&gt;
&lt;br /&gt;
void LSM303DLHC_M_init(void);&lt;br /&gt;
void readLSM303DLHC_M(void);&lt;br /&gt;
void normalizeLSM303DLHC_M(void);&lt;br /&gt;
int16_t headingLSM303DLHC_M(void);&lt;br /&gt;
&lt;br /&gt;
int16_t headingLSM303DLHC_TC(void);&lt;br /&gt;
&lt;br /&gt;
void LSM303DLHC_init(void);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Analog Yaw-Rate Gyroscope (LY330ALH):&lt;br /&gt;
&lt;br /&gt;
#define LY330ALH_MODE_NORMAL		0			// Power on default&lt;br /&gt;
#define LY330ALH_MODE_SLEEP			1&lt;br /&gt;
#define LY330ALH_MODE_SELFTEST		2&lt;br /&gt;
#define LY330ALH_MODE_POWERDOWN		3			// Shutdown mode&lt;br /&gt;
&lt;br /&gt;
extern int16_t z_axisg;&lt;br /&gt;
&lt;br /&gt;
void LY330ALH_set_mode(uint8_t);&lt;br /&gt;
uint16_t getRP6Base_ADC1(void);&lt;br /&gt;
int16_t LY330ALH_measure(void);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Hot Swappable 2-Wire Bus Buffer (TCA4311A):&lt;br /&gt;
&lt;br /&gt;
//extern uint8_t readyBusbuff;			// See &amp;quot;I2C I/O Port Expander&amp;quot; section&lt;br /&gt;
extern uint8_t errorBusbuff;&lt;br /&gt;
&lt;br /&gt;
#define getReadyBusbuff() (readyBusbuff)&lt;br /&gt;
uint8_t readReadyBusbuff(void);&lt;br /&gt;
void TCA4311A_shutdown(void);&lt;br /&gt;
void TCA4311A_reconnect(void);&lt;br /&gt;
void setRP6Base_PWR(uint8_t);&lt;br /&gt;
void setI2CModulePower(uint8_t);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Button:&lt;br /&gt;
&lt;br /&gt;
//extern uint8_t pressedButton;			// See &amp;quot;I2C I/O Port Expander&amp;quot; section&lt;br /&gt;
&lt;br /&gt;
#define getPressedButton() (pressedButton)&lt;br /&gt;
uint8_t readButton(void);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Status LED:&lt;br /&gt;
&lt;br /&gt;
void setStatusLED(uint8_t);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// RP6 Sensor Board initialisation and shutdown:&lt;br /&gt;
&lt;br /&gt;
void sensor_board_init(void);&lt;br /&gt;
void sensor_board_shutdown(void);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
/******************************************************************************&lt;br /&gt;
 * Additional info&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Changelog:&lt;br /&gt;
 * &lt;br /&gt;
 *  ---&amp;gt; changes are documented in the file &amp;quot;RP6M256_Sensor_BoardLib.c&amp;quot;&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=====Library Source=====&lt;br /&gt;
Datei: RP6M256_Sensor_BoardLib.c&lt;br /&gt;
&amp;lt;pre&amp;gt;/* ****************************************************************************&lt;br /&gt;
 *                           _______________________&lt;br /&gt;
 *                           \| RP6  ROBOT SYSTEM |/&lt;br /&gt;
 *                            \_-_-_-_-_-_-_-_-_-_/           &amp;gt;&amp;gt;&amp;gt; RP6 M256 WIFI&lt;br /&gt;
 * ----------------------------------------------------------------------------&lt;br /&gt;
 * ----------------------------- [c]2014 - Dirk -------------------------------&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * File: RP6M256_Sensor_BoardLib.c&lt;br /&gt;
 * Version: 1.1&lt;br /&gt;
 * Target: RP6 M256 WIFI - ATMEGA2560 @16.00MHz&lt;br /&gt;
 *         and a RP6 Sensor Board (CONRAD 1082384)&lt;br /&gt;
 * Author(s): Dirk&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Description:&lt;br /&gt;
 * This is our new Library that contains basic routines and functions for&lt;br /&gt;
 * accessing the hardwired components of the RP6 Sensor Board (CONRAD 1082384).&lt;br /&gt;
 * This library assumes the RP6 Sensor Board Revision 2.0 (04.07.13).&lt;br /&gt;
 *&lt;br /&gt;
 * There are more sensors and actors, that may be connected to the RP6 Sensor&lt;br /&gt;
 * Board: Many I2C components including a GPS module (CONRAD 1082385), servo&lt;br /&gt;
 *        motors, SHARP IR distance sensors, LEDs, a camera ...&lt;br /&gt;
 * This library doesn't contain functions for these sensors/actors, because&lt;br /&gt;
 * they are not HARDWIRED to the RP6 Sensor Board and may be connected&lt;br /&gt;
 * OPTIONALLY.&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// RP6 Sensor Board hardwired components:&lt;br /&gt;
// - I2C I/O Port Expander (MAX7311)&lt;br /&gt;
// - I2C Real Time Clock (RTC DS1339)&lt;br /&gt;
// - I2C Temperature Sensor (LM75B)&lt;br /&gt;
// - I2C Servo Controller (PCA9685)&lt;br /&gt;
// - I2C LED Driver (TCA6507)&lt;br /&gt;
// - I2C 3D Magnetometer &amp;amp; Accelerometer (LSM303DLHC)&lt;br /&gt;
// - Analog Yaw-Rate Gyroscope (LY330ALH)&lt;br /&gt;
// - Hot Swappable 2-Wire Bus Buffer (TCA4311A)&lt;br /&gt;
// - Button&lt;br /&gt;
// - Status LED&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Includes:&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6M256_Sensor_BoardLib.h&amp;quot; 		&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Variables:&lt;br /&gt;
&lt;br /&gt;
uint8_t registerBuf[13]; &lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C I/O Port Expander (MAX7311):&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Sends the configuration word to a MAX7311.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: config -&amp;gt; Config word for control&lt;br /&gt;
 *                  registers&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void MAX7311_write_cfg(uint16_t config)&lt;br /&gt;
{&lt;br /&gt;
#ifdef SAFE_CONFIG&lt;br /&gt;
	config |= 0b1010000000001000;&lt;br /&gt;
#endif&lt;br /&gt;
	I2CTWI_transmit3Bytes(I2C_SENSOR_PORTEXP_ADR, MAX7311_PORT1_CONFIG, config, (config&amp;gt;&amp;gt;8));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
interrupt_RP6SBstatus_t interrupt_RP6SBstatus;&lt;br /&gt;
&lt;br /&gt;
/** &lt;br /&gt;
 * This function checks all interrupt pins on&lt;br /&gt;
 * the XBUS (INT1..3, INTU).&lt;br /&gt;
 * This function must be called VERY frequently&lt;br /&gt;
 * out of the main loop.&lt;br /&gt;
 * Bigger delays result in slower reaction to&lt;br /&gt;
 * interrupt requests of the RP6 Sensor Board.&lt;br /&gt;
 * Interrupt function table:&lt;br /&gt;
 *   Int. : Function 1      IRQ  Function 2       IRQ&lt;br /&gt;
 *   -------------------------------------------------&lt;br /&gt;
 *   INT1 : LSM303DLHC INT1  H&lt;br /&gt;
 *   INT2 : MAX7311   INT_N  L&lt;br /&gt;
 *   INT3 : LSM303DLHC INT2  H   DS1339 SQW/INT_N  L&lt;br /&gt;
 *   INTU : not used&lt;br /&gt;
 * You can see in the &amp;quot;IRQ&amp;quot; column, which level&lt;br /&gt;
 * (H/L) means an ACTIVE INTERRUPT signal.&lt;br /&gt;
 * The interrupt pin levels (H=true/L=false) are&lt;br /&gt;
 * read into the global interrupt_RP6SBstatus&lt;br /&gt;
 * variable.&lt;br /&gt;
 *&lt;br /&gt;
 * Hints: - This function checks the interrupt&lt;br /&gt;
 *          signals by polling. This is NOT the&lt;br /&gt;
 *          best way to do this job. You will&lt;br /&gt;
 *          have to write your own task, if you&lt;br /&gt;
 *          want to use the Pin Change Interrupt&lt;br /&gt;
 *          function of the ATmega2560&lt;br /&gt;
 *          microcontroller.&lt;br /&gt;
 *        - You cannot use both interrupt sources&lt;br /&gt;
 *          for INT3! So you should not use INT2&lt;br /&gt;
 *          of the LSM303DLHC together with the&lt;br /&gt;
 *          alarm function of the DS1339 (RTC)!&lt;br /&gt;
 *        - Every interrupt signal of the Sensor&lt;br /&gt;
 *          Board may be cut off from the XBUS&lt;br /&gt;
 *          by opening a jumper (Jx):&lt;br /&gt;
 *          INT1 -&amp;gt; J3 (LSM303DLHC INT1)&lt;br /&gt;
 *          INT2 -&amp;gt; J4 (MAX7311 INT_N)&lt;br /&gt;
 *          INT3 -&amp;gt; J2 (DS1339 SQW/INT_N)&lt;br /&gt;
 *          INT3 -&amp;gt; J5 (LSM303DLHC INT2)&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *&lt;br /&gt;
 *   if (!interrupt_RP6SBstatus.portexp)&lt;br /&gt;
 *        writeString_P(&amp;quot;==&amp;gt; MAX7311 INT_N!!!&amp;quot;);&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void task_checkINTs(void)&lt;br /&gt;
{&lt;br /&gt;
	if(IO_SENSOR_INT1_PIN &amp;amp; IO_SENSOR_INT1_IN)	// XBUS INT1 -&amp;gt; PJ3 (PCINT12)&lt;br /&gt;
		interrupt_RP6SBstatus.int1 = true;&lt;br /&gt;
	else&lt;br /&gt;
		interrupt_RP6SBstatus.int1 = false;&lt;br /&gt;
	if(IO_SENSOR_INT2_PIN &amp;amp; IO_SENSOR_INT2_IN)	// XBUS INT2 -&amp;gt; PJ6 (PCINT15)&lt;br /&gt;
		interrupt_RP6SBstatus.int2 = true;&lt;br /&gt;
	else&lt;br /&gt;
		interrupt_RP6SBstatus.int2 = false;&lt;br /&gt;
	if(IO_SENSOR_INT3_PIN &amp;amp; IO_SENSOR_INT3_IN)	// XBUS INT3 -&amp;gt; PJ5 (PCINT14)&lt;br /&gt;
		interrupt_RP6SBstatus.int3 = true;&lt;br /&gt;
	else&lt;br /&gt;
		interrupt_RP6SBstatus.int3 = false;&lt;br /&gt;
//	if(IO_SENSOR_INTU_PIN &amp;amp; IO_SENSOR_INTU_IN)	// XBUS INTU -&amp;gt; PJ4 (PCINT13)&lt;br /&gt;
//		interrupt_RP6SBstatus.intu = true;&lt;br /&gt;
//	else&lt;br /&gt;
//		interrupt_RP6SBstatus.intu = false;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
max7311IOs_t inport;&lt;br /&gt;
uint8_t readyBusbuff;&lt;br /&gt;
uint8_t pressedButton;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function checks all I/O ports (I/O 0.0..1.7)&lt;br /&gt;
 * of the MAX7311 sequentially!&lt;br /&gt;
 * You must call this function frequently out of&lt;br /&gt;
 * the main loop.&lt;br /&gt;
 * The I/O port values (true/false) are read into&lt;br /&gt;
 * the global inport variable.&lt;br /&gt;
 * The global variables readyBusbuff (2-Wire Bus&lt;br /&gt;
 * Buffer: Enable) and pressedButton (Button S1:&lt;br /&gt;
 * Pressed) contain actual values (true/false)&lt;br /&gt;
 * after execution of this task.&lt;br /&gt;
 *&lt;br /&gt;
 * Examples:&lt;br /&gt;
 *&lt;br /&gt;
 *   if (inport.rdy_busbuff)&lt;br /&gt;
 *        writeString_P(&amp;quot;I/O 0.3: High&amp;quot;);&lt;br /&gt;
 *   else writeString_P(&amp;quot;I/O 0.3: Low&amp;quot;);&lt;br /&gt;
 *   if (!inport.drdy_magacc)&lt;br /&gt;
 *        writeString_P(&amp;quot;I/O 1.5: Low&amp;quot;);&lt;br /&gt;
 *   if (pressedButton)&lt;br /&gt;
 *        writeString_P(&amp;quot;Button pressed!&amp;quot;);&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void task_RP6SensorBoard(void)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmitByte(I2C_SENSOR_PORTEXP_ADR, MAX7311_INPUT_PORT1);&lt;br /&gt;
	I2CTWI_readBytes(I2C_SENSOR_PORTEXP_ADR, registerBuf, 2);&lt;br /&gt;
	inport.word = (registerBuf[1] &amp;lt;&amp;lt; 8) + registerBuf[0];&lt;br /&gt;
	readyBusbuff = inport.rdy_busbuff;&lt;br /&gt;
	pressedButton = inport.io2_i2c;&lt;br /&gt;
	pressedButton = !pressedButton;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
max7311IOs_t outport;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Updates the I/O ports with current value from&lt;br /&gt;
 * the global outport variable!&lt;br /&gt;
 * If one or more port pins were configured as&lt;br /&gt;
 * output before, they will be set (high) or&lt;br /&gt;
 * cleared (low).&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *&lt;br /&gt;
 *   outport.word = 0b0000000000001001;&lt;br /&gt;
 *   MAX7311_update();&lt;br /&gt;
 *   // This clears all I/O ports and sets&lt;br /&gt;
 *   // the ports I/O 0.0 and I/O 0.3!&lt;br /&gt;
 *&lt;br /&gt;
 *   // Other possibility:&lt;br /&gt;
 *   outport.pwr_sharp_f = true;&lt;br /&gt;
 *   MAX7311_update();&lt;br /&gt;
 *   // This sets I/O 0.1 and does not&lt;br /&gt;
 *   // affect any other I/O port!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void MAX7311_update(void)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmit3Bytes(I2C_SENSOR_PORTEXP_ADR, MAX7311_OUTPUT_PORT1, outport.word, (outport.word&amp;gt;&amp;gt;8));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Writes the 16-bit data to a MAX7311.&lt;br /&gt;
 * The data are output with those I/O ports that&lt;br /&gt;
 * were configured as output before.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: data -&amp;gt; Data word&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void MAX7311_write(uint16_t data)&lt;br /&gt;
{&lt;br /&gt;
	outport.word = data;&lt;br /&gt;
	MAX7311_update();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Initializes the I/O Port Expander after power&lt;br /&gt;
 * on.&lt;br /&gt;
 *&lt;br /&gt;
 * Hint: If USE_PD5 is defined in the&lt;br /&gt;
 *       configuration header file, this&lt;br /&gt;
 *       function uses the RP6M256 portpin,&lt;br /&gt;
 *       that is connected to plug I/O: Pin 9&lt;br /&gt;
 *       instead of MAX7311 I/O 1.0!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void MAX7311_init(void)&lt;br /&gt;
{&lt;br /&gt;
#ifdef USE_PD5&lt;br /&gt;
	MAX7311_write_cfg(MAX7311_CONFIG_USE_PD5);&lt;br /&gt;
	IO_SENSOR_TCA4311A_EN_DDR |= IO_SENSOR_TCA4311A_EN_IN;		// Output&lt;br /&gt;
	IO_SENSOR_TCA4311A_EN_PORT |= IO_SENSOR_TCA4311A_EN_IN;		// High&lt;br /&gt;
#else&lt;br /&gt;
	MAX7311_write_cfg(MAX7311_CONFIG_DEFAULT);&lt;br /&gt;
#endif&lt;br /&gt;
	MAX7311_write(MAX7311_OUTPUT_DEFAULT);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Real Time Clock (RTC DS1339):&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function converts a BCD to a DEC value.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
uint8_t BCD2DEC(uint8_t bcd)&lt;br /&gt;
{&lt;br /&gt;
	return ((bcd &amp;gt;&amp;gt; 4) * 10 + (bcd &amp;amp; 0x0f));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function converts a DEC to a BCD value.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
uint8_t DEC2BCD(uint8_t dec)&lt;br /&gt;
{uint8_t units = dec % 10;&lt;br /&gt;
	if (dec /= 10) {&lt;br /&gt;
		return (units + (DEC2BCD(dec) &amp;lt;&amp;lt; 4));&lt;br /&gt;
	}&lt;br /&gt;
	else {&lt;br /&gt;
		return units;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Sends the configuration byte to a DS1339.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: Config byte for control register&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void DS1339_write_cfg(uint8_t config)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_RTC_ADR, DS1339_CONTROL, config);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Initializes the DS1339 Trickle Charger&lt;br /&gt;
 * function to the default for the RP6 Sensor&lt;br /&gt;
 * Board: One diode and 2kOhm resistor.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void DS1339_init(void)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_RTC_ADR, DS1339_TRICKLE_CHARGER, DS1339_TRICKLE_CHARGER_DEFAULT);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Reads all data registers of the Real Time Clock (RTC).&lt;br /&gt;
 * They are stored in the time &amp;amp; date variables defined in&lt;br /&gt;
 * the library header.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void DS1339_read(void)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmitByte(I2C_SENSOR_RTC_ADR, DS1339_SECONDS);&lt;br /&gt;
	I2CTWI_readBytes(I2C_SENSOR_RTC_ADR, registerBuf, 7);&lt;br /&gt;
	rtc_time.second = BCD2DEC(registerBuf[0]);&lt;br /&gt;
	rtc_time.minute = BCD2DEC(registerBuf[1]);&lt;br /&gt;
	rtc_time.hour = BCD2DEC(registerBuf[2] &amp;amp; 0x3f);&lt;br /&gt;
	rtc_date.weekday = (registerBuf[3] &amp;amp; 0x07);&lt;br /&gt;
	rtc_date.day = BCD2DEC(registerBuf[4]);&lt;br /&gt;
	rtc_date.month = BCD2DEC(registerBuf[5] &amp;amp; 0x7f);&lt;br /&gt;
	if(registerBuf[5] &amp;amp; 0x80) rtc_date.year = 100;&lt;br /&gt;
	else rtc_date.year = 0;&lt;br /&gt;
	rtc_date.year += BCD2DEC(registerBuf[6]);&lt;br /&gt;
	rtc_date.year += 2000;&lt;br /&gt;
	rtc_time.dst = 0;&lt;br /&gt;
#ifdef CALC_DST&lt;br /&gt;
	// Calculate MESZ (DST):&lt;br /&gt;
	uint8_t wday = rtc_date.weekday;			// Weekday [1..7 = R_MO..R_SU]&lt;br /&gt;
	if(wday == 7) wday = 0;&lt;br /&gt;
	if(rtc_date.month &amp;lt; 3 || rtc_date.month &amp;gt; 10) {&lt;br /&gt;
		return;&lt;br /&gt;
	}&lt;br /&gt;
	if((rtc_date.day - wday &amp;gt;= 25)&lt;br /&gt;
	 &amp;amp;&amp;amp; (wday || rtc_time.hour &amp;gt;= 2)) {&lt;br /&gt;
		if(rtc_date.month == 10)&lt;br /&gt;
			return;&lt;br /&gt;
	}&lt;br /&gt;
	else {&lt;br /&gt;
		if(rtc_date.month == 3) {&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	rtc_time.dst = 1;&lt;br /&gt;
#endif&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Writes the time &amp;amp; date infos in the variables defined in&lt;br /&gt;
 * the library header to the Real Time Clock (RTC).&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void DS1339_write(void)&lt;br /&gt;
{&lt;br /&gt;
	registerBuf[0] = DS1339_SECONDS;&lt;br /&gt;
	registerBuf[1] = DEC2BCD(rtc_time.second);&lt;br /&gt;
	registerBuf[2] = DEC2BCD(rtc_time.minute);&lt;br /&gt;
	registerBuf[3] = DEC2BCD(rtc_time.hour);&lt;br /&gt;
	registerBuf[4] = rtc_date.weekday;&lt;br /&gt;
	registerBuf[5] = DEC2BCD(rtc_date.day);&lt;br /&gt;
	registerBuf[6] = DEC2BCD(rtc_date.month);&lt;br /&gt;
	registerBuf[7] = DEC2BCD(rtc_date.year - 2000);&lt;br /&gt;
	I2CTWI_transmitBytes(I2C_SENSOR_RTC_ADR, &amp;amp;registerBuf[0], 8);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Temperature Sensor (LM75B):&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Sends the configuration byte to a LM75B.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: Config byte for Conf register&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void LM75B_write_cfg(uint8_t config)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_TEMP_ADR, LM75B_CONF, config);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
uint8_t temperature_low;&lt;br /&gt;
uint8_t temperature_high;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Reads the two data registers of the temperature&lt;br /&gt;
 * sensor's Temp register.&lt;br /&gt;
 * They are stored in the variables temperature_low&lt;br /&gt;
 * and _high.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void LM75B_read(void)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmitByte(I2C_SENSOR_TEMP_ADR, LM75B_TEMP);&lt;br /&gt;
	I2CTWI_readBytes(I2C_SENSOR_TEMP_ADR, registerBuf, 2);&lt;br /&gt;
	temperature_high = registerBuf[0];&lt;br /&gt;
	temperature_low = registerBuf[1];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
double temperature;						// Temperature [°C]&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Calculates and returns the temperature value&lt;br /&gt;
 * by using the data read from the LM75B with&lt;br /&gt;
 * the function LM75B_read(). The sensor is&lt;br /&gt;
 * designed for 11 bit measurement and 0.125°C&lt;br /&gt;
 * resolution.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
double LM75B_calculate(void)&lt;br /&gt;
{&lt;br /&gt;
	int16_t tempraw = 0;&lt;br /&gt;
	double temp;&lt;br /&gt;
&lt;br /&gt;
	tempraw = (getTemperatureHigh() &amp;lt;&amp;lt; 8) | getTemperatureLow();&lt;br /&gt;
	tempraw &amp;gt;&amp;gt;= 5;&lt;br /&gt;
	if (tempraw &amp;amp; 1024)							// Calculate temperature&lt;br /&gt;
		tempraw = (tempraw &amp;amp; 1023) - 1024;&lt;br /&gt;
	else&lt;br /&gt;
		tempraw = tempraw &amp;amp; 1023;&lt;br /&gt;
	temp = tempraw * 0.125;&lt;br /&gt;
	return temp;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Performs a 11 bit measurement and returns the&lt;br /&gt;
 * temperature [°C]. The sensor has a measuring&lt;br /&gt;
 * cycle of 100ms. So it makes no sense calling&lt;br /&gt;
 * this function at a frequency above 10Hz.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
double LM75B_measure(void)&lt;br /&gt;
{&lt;br /&gt;
//	LM75B_init();&lt;br /&gt;
	LM75B_read();								// Read data&lt;br /&gt;
	return (LM75B_calculate());					// Calculate value&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Servo Controller (PCA9685):&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Call this once before using the servo function.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: PWM frequency [40..1000 Hz]&lt;br /&gt;
 *&lt;br /&gt;
 * Hints: - Default servo frequency is 50 Hz!&lt;br /&gt;
 *        - The servo power is NOT switched on by&lt;br /&gt;
 *          this function!&lt;br /&gt;
 *&lt;br /&gt;
 * There is also a macro initServo(freq), which&lt;br /&gt;
 * does exactly the same as this function.&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *   initServo(50);&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void PCA9685_init(uint16_t freq)&lt;br /&gt;
{&lt;br /&gt;
	outport.oen_servo = false;					// I/O 1.3: Low&lt;br /&gt;
	MAX7311_update();&lt;br /&gt;
	if ((freq &amp;lt; 40) || (freq &amp;gt; 1000)) freq = 50;&lt;br /&gt;
	I2CTWI_transmitByte(I2C_SENSOR_SERVO_ADR, PCA9685_MODE2);&lt;br /&gt;
	uint8_t last_mode = I2CTWI_readByte(I2C_SENSOR_SERVO_ADR);&lt;br /&gt;
	last_mode &amp;amp;= ~PCA9685_MODE2_INVRT;			// Clear INVRT bit&lt;br /&gt;
	last_mode |= PCA9685_MODE2_OUTDRV;			// Set OUTDRV bit&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_SERVO_ADR, PCA9685_MODE2, last_mode);&lt;br /&gt;
	I2CTWI_transmitByte(I2C_SENSOR_SERVO_ADR, PCA9685_MODE1);&lt;br /&gt;
	last_mode = I2CTWI_readByte(I2C_SENSOR_SERVO_ADR);&lt;br /&gt;
	last_mode |= PCA9685_MODE1_AI;				// Set AI bit&lt;br /&gt;
	uint8_t mode1 = last_mode;&lt;br /&gt;
	mode1 |= PCA9685_MODE1_SLEEP;				// Set SLEEP bit&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_SERVO_ADR, PCA9685_MODE1, mode1);&lt;br /&gt;
	uint8_t prescale = (uint8_t) (F_PCA9685 / 4096 / freq - 0.5);&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_SERVO_ADR, PCA9685_PRE_SCALE, prescale);&lt;br /&gt;
	last_mode &amp;amp;= ~PCA9685_MODE1_SLEEP;			// Clear SLEEP bit&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_SERVO_ADR, PCA9685_MODE1, last_mode);&lt;br /&gt;
	mSleep(1);&lt;br /&gt;
	last_mode |= PCA9685_MODE1_RESTART;			// Clear RESTART bit&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_SERVO_ADR, PCA9685_MODE1, last_mode);&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_SERVO_ADR, PCA9685_LED8_ON_H, 0x10);&lt;br /&gt;
	return;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/** &lt;br /&gt;
 * Returns the channel belonging to a servo number.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: number -&amp;gt; Servo number [1..8]&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
uint8_t servo(uint8_t number)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t channel;&lt;br /&gt;
&lt;br /&gt;
	switch (number) {&lt;br /&gt;
		case 1 :&lt;br /&gt;
			channel = CH_SERVO_1; break;&lt;br /&gt;
		case 2 :&lt;br /&gt;
			channel = CH_SERVO_2; break;&lt;br /&gt;
		case 3 :&lt;br /&gt;
			channel = CH_SERVO_3; break;&lt;br /&gt;
		case 4 :&lt;br /&gt;
			channel = CH_SERVO_4; break;&lt;br /&gt;
		case 5 :&lt;br /&gt;
			channel = CH_SERVO_5; break;&lt;br /&gt;
		case 6 :&lt;br /&gt;
			channel = CH_SERVO_6; break;&lt;br /&gt;
		case 7 :&lt;br /&gt;
			channel = CH_SERVO_7; break;&lt;br /&gt;
		case 8 :&lt;br /&gt;
			channel = CH_SERVO_8; break;&lt;br /&gt;
		default : channel = CH_SERVO_1;&lt;br /&gt;
	}&lt;br /&gt;
	return channel;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This is the servo position set function.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: channel -&amp;gt; Channel number [1..16]&lt;br /&gt;
 *        pos     -&amp;gt; Servo position [SERVOx_LT..SERVOx_RT]&lt;br /&gt;
 *&lt;br /&gt;
 * Hints: - A servo position of 205 means 1 ms servo impulse,&lt;br /&gt;
 *          a position of 410 means a 2 ms servo impulse!&lt;br /&gt;
 *          You may calculate the servo impulse length by:&lt;br /&gt;
 *          ==&amp;gt; Impulse [ms] = servo position / 204.8 &amp;lt;==&lt;br /&gt;
 *          (Formula only valid for a PWM of 50 Hz!)&lt;br /&gt;
 *&lt;br /&gt;
 * There is also a macro setServo(servo, pos), which&lt;br /&gt;
 * does nearly the same as this function, but the first&lt;br /&gt;
 * parameter is the servo and NOT the channel number.&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *   setServo(2,300);&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void PCA9685_set(uint8_t channel, uint16_t pos)&lt;br /&gt;
{&lt;br /&gt;
	if ((channel == 0) || (channel &amp;gt; 16))&lt;br /&gt;
		return;&lt;br /&gt;
	uint8_t reg = channel * 4 + 4;				// Register LEDx_OFF_L&lt;br /&gt;
	I2CTWI_transmit3Bytes(I2C_SENSOR_SERVO_ADR, reg, (pos &amp;amp; 0x00ff), (pos &amp;gt;&amp;gt; 8));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * If the servos are not moving for a while, the&lt;br /&gt;
 * servo function can be stopped with this&lt;br /&gt;
 * function (PCA9685 set to sleep mode).&lt;br /&gt;
 *&lt;br /&gt;
 * Hint: The servo power is NOT switched off by&lt;br /&gt;
 *       this function!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void PCA9685_shutdown(void)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_SERVO_ADR, PCA9685_ALL_LED_OFF_H, 0x10);&lt;br /&gt;
	I2CTWI_transmitByte(I2C_SENSOR_SERVO_ADR, PCA9685_MODE1);&lt;br /&gt;
	uint8_t mode1 = I2CTWI_readByte(I2C_SENSOR_SERVO_ADR);&lt;br /&gt;
	mode1 |= PCA9685_MODE1_SLEEP;				// Set SLEEP bit&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_SERVO_ADR, PCA9685_MODE1, mode1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * If the servo function was stopped with the&lt;br /&gt;
 * function PCA9685_shutdown() before, it can be&lt;br /&gt;
 * (re)started again with this function.&lt;br /&gt;
 *&lt;br /&gt;
 * Hint: The servo power is NOT switched on by&lt;br /&gt;
 *       this function!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void PCA9685_restart(void)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmitByte(I2C_SENSOR_SERVO_ADR, PCA9685_MODE1);&lt;br /&gt;
	uint8_t mode1 = I2CTWI_readByte(I2C_SENSOR_SERVO_ADR);&lt;br /&gt;
	if (mode1 &amp;amp; PCA9685_MODE1_RESTART) {		// RESTART bit set?&lt;br /&gt;
		mode1 &amp;amp;= ~PCA9685_MODE1_SLEEP;			// Clear SLEEP bit&lt;br /&gt;
		I2CTWI_transmit2Bytes(I2C_SENSOR_SERVO_ADR, PCA9685_MODE1, mode1);&lt;br /&gt;
		mSleep(1);&lt;br /&gt;
		mode1 |= PCA9685_MODE1_RESTART;			// Clear RESTART bit&lt;br /&gt;
		I2CTWI_transmit2Bytes(I2C_SENSOR_SERVO_ADR, PCA9685_MODE1, mode1);&lt;br /&gt;
		I2CTWI_transmit2Bytes(I2C_SENSOR_SERVO_ADR, PCA9685_ALL_LED_OFF_H, 0);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/** &lt;br /&gt;
 * With this function you can switch the servo&lt;br /&gt;
 * power on or off.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: pwr -&amp;gt; 0 (false) = servo power off&lt;br /&gt;
 *               &amp;gt;0 (true) = servo power on&lt;br /&gt;
 *&lt;br /&gt;
 * Hints: - If connected servos are not used, you&lt;br /&gt;
 *          should always switch the servo power off&lt;br /&gt;
 *          (default) to save energy!&lt;br /&gt;
 *        - The PCA9685 is NOT restarted or put into&lt;br /&gt;
 *          shutdown mode by this function!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void setServoPower(uint8_t pwr)&lt;br /&gt;
{&lt;br /&gt;
	if(pwr &amp;gt; 0)&lt;br /&gt;
		outport.pwr_servo = true;				// I/O 1.4: High&lt;br /&gt;
	else&lt;br /&gt;
		outport.pwr_servo = false;				// I/O 1.4: Low&lt;br /&gt;
	MAX7311_update();&lt;br /&gt;
}	&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C LED Driver (TCA6507):&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Sends the configuration byte to TCA6507's&lt;br /&gt;
 * internal registers.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: reg    -&amp;gt; Register address [0..10]&lt;br /&gt;
 *        config -&amp;gt; Config byte for internal&lt;br /&gt;
 *                  registers&lt;br /&gt;
 *&lt;br /&gt;
 * Hints: - With this function you can write to&lt;br /&gt;
 *          all internal registers of the LED&lt;br /&gt;
 *          driver, see &amp;quot;Registers:&amp;quot; in the&lt;br /&gt;
 *          library header file!&lt;br /&gt;
 *        - Mainly you will use this function&lt;br /&gt;
 *          for setting time (regs 3..7) and&lt;br /&gt;
 *          intensity (regs 8, 9) values.&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *   TCA6507_write_cfg(TCA6507_MAXIMUM_INTENSITY,0x77);&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void TCA6507_write_cfg(uint8_t reg, uint8_t config)&lt;br /&gt;
{&lt;br /&gt;
	if(reg &amp;gt; 10) reg = 0;&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_LEDDRIVER_ADR, reg, config);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
uint8_t select[3];&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Updates the LED driver select registers (0..2)&lt;br /&gt;
 * with the global select array!&lt;br /&gt;
 *&lt;br /&gt;
 * Hint: - Also have a look at Table 4 in the&lt;br /&gt;
 *         TCA6507 datasheet!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void TCA6507_update(void)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmit4Bytes(I2C_SENSOR_LEDDRIVER_ADR, (TCA6507_SELECT0 | 0x10), select[0], select[1], select[2]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This is the LED state set function.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: led   -&amp;gt; LED number [0..6]&lt;br /&gt;
 *        state -&amp;gt; LED state  [0..7]&lt;br /&gt;
 *&lt;br /&gt;
 * Hints: - Possible driver states [0..7] see&lt;br /&gt;
 *          &amp;quot;Output states:&amp;quot; in the library&lt;br /&gt;
 *          header file!&lt;br /&gt;
 *        - Also have a look at Table 4 in the&lt;br /&gt;
 *          TCA6507 datasheet!&lt;br /&gt;
 *&lt;br /&gt;
 * There is also a macro setLED(led, state), which&lt;br /&gt;
 * does exactly the same as this function.&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *   setLED(1,4);&lt;br /&gt;
 *   // Switches LED1 ON&lt;br /&gt;
 *   // ... OR ...&lt;br /&gt;
 *   setLED(SB_LED1,STATE_ON);&lt;br /&gt;
 *   // does the same.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void TCA6507_set(uint8_t led, uint8_t state)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t i, mask;&lt;br /&gt;
&lt;br /&gt;
	if(led &amp;gt; 6) led = 0;&lt;br /&gt;
	led = 1 &amp;lt;&amp;lt; led;&lt;br /&gt;
	mask = 1;&lt;br /&gt;
	for(i = 0; i &amp;lt; 3; i++) {&lt;br /&gt;
		select[i] &amp;amp;= ~led;&lt;br /&gt;
		if(state &amp;amp; mask)&lt;br /&gt;
			select[i] |= led;&lt;br /&gt;
		mask &amp;lt;&amp;lt;= 1;&lt;br /&gt;
	}&lt;br /&gt;
	TCA6507_update();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * If the LEDs are not needed for a while, the&lt;br /&gt;
 * LED driver can be stopped with this function&lt;br /&gt;
 * (TCA6507 set to shutdown mode).&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void TCA6507_shutdown(void)&lt;br /&gt;
{&lt;br /&gt;
	outport.en_leddriv = false;					// I/O 0.4: Low&lt;br /&gt;
	MAX7311_update();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * If the LED driver was stopped with the&lt;br /&gt;
 * function TCA6507_shutdown() before, it can be&lt;br /&gt;
 * (re)started again with this function.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void TCA6507_restart(void)&lt;br /&gt;
{&lt;br /&gt;
	outport.en_leddriv = true;					// I/O 0.4: High&lt;br /&gt;
	MAX7311_update();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Initializes the LED driver after power on by&lt;br /&gt;
 * switching all LEDs off.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void TCA6507_init(void)&lt;br /&gt;
{&lt;br /&gt;
	select[0] = 0;&lt;br /&gt;
	select[1] = 0;&lt;br /&gt;
	select[2] = 0;&lt;br /&gt;
	TCA6507_update();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C 3D Magnetometer &amp;amp; Accelerometer (LSM303DLHC):&lt;br /&gt;
&lt;br /&gt;
// --------------------------------------------&lt;br /&gt;
// LSM303DLHC accelerometer functions:&lt;br /&gt;
int16_t x_axisa, y_axisa, z_axisa;&lt;br /&gt;
double pitch, roll;&lt;br /&gt;
double xa, ya, za;&lt;br /&gt;
double the, phi;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Call this once before using the 3D-Accelerometer.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void LSM303DLHC_A_init(void)&lt;br /&gt;
{&lt;br /&gt;
	// Set normal power mode, 10 Hz data rate, all axes enabled:&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_LSM303DLHC_A_ADR, CTRL_REG1_A, CTRL_REG1_A_10HZ);&lt;br /&gt;
	mSleep(10);&lt;br /&gt;
	// Set HD mode:&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_LSM303DLHC_A_ADR, CTRL_REG4_A, CTRL_REG4_A_HR);&lt;br /&gt;
	mSleep(10);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function reads the X-axis, Y-axis and Z-axis values&lt;br /&gt;
 * from the LSM303DLHC accelerometer and stores them in the&lt;br /&gt;
 * global variables x_axisa, y_axisa and z_axisa.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void readLSM303DLHC_A(void)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t readBuf[6];&lt;br /&gt;
&lt;br /&gt;
	I2CTWI_transmitByte(I2C_SENSOR_LSM303DLHC_A_ADR, (OUT_X_L_A | 0x80));&lt;br /&gt;
	I2CTWI_readBytes(I2C_SENSOR_LSM303DLHC_A_ADR, readBuf, 6); // Read  X-/Y-/Z-axis&lt;br /&gt;
	// xb = y:&lt;br /&gt;
	x_axisa = ((readBuf[OUT_Y_H_A - OUT_X_L_A] &amp;lt;&amp;lt; 8) + readBuf[OUT_Y_L_A - OUT_X_L_A]) / 16;&lt;br /&gt;
	// yb = x:&lt;br /&gt;
	y_axisa = ((readBuf[OUT_X_H_A - OUT_X_L_A] &amp;lt;&amp;lt; 8) + readBuf[OUT_X_L_A - OUT_X_L_A]) / 16;&lt;br /&gt;
	// zb = z:&lt;br /&gt;
	z_axisa = ((readBuf[OUT_Z_H_A - OUT_X_L_A] &amp;lt;&amp;lt; 8) + readBuf[OUT_Z_L_A - OUT_X_L_A]) / 16;&lt;br /&gt;
	mSleep(10);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function limits and normalizes the x-axisa,&lt;br /&gt;
 * y-axisa and z-axisa values read from the LSM303DLHC&lt;br /&gt;
 * accelerometer with the function readLSM303DLHC_A() and&lt;br /&gt;
 * stores them in the global double variables xa, ya and&lt;br /&gt;
 * za.&lt;br /&gt;
 * It also calculates the position in space in form of the&lt;br /&gt;
 * tilt angles (the = pitch, phi = roll) and stores them&lt;br /&gt;
 * in the global double variables the and phi.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void normalizeLSM303DLHC_A(void)&lt;br /&gt;
{&lt;br /&gt;
	// Limit raw values:&lt;br /&gt;
	if (x_axisa &amp;lt; MIN_X_A) x_axisa = MIN_X_A;&lt;br /&gt;
	if (x_axisa &amp;gt; MAX_X_A) x_axisa = MAX_X_A;&lt;br /&gt;
	if (y_axisa &amp;lt; MIN_Y_A) y_axisa = MIN_Y_A;&lt;br /&gt;
	if (y_axisa &amp;gt; MAX_Y_A) y_axisa = MAX_Y_A;&lt;br /&gt;
	if (z_axisa &amp;lt; MIN_Z_A) z_axisa = MIN_Z_A;&lt;br /&gt;
	if (z_axisa &amp;gt; MAX_Z_A) z_axisa = MAX_Z_A;&lt;br /&gt;
	xa = (double) x_axisa / 1000.0;&lt;br /&gt;
	ya = (double) y_axisa / 1000.0;&lt;br /&gt;
	za = (double) z_axisa / 1000.0;&lt;br /&gt;
	// Calculate Pitch and Roll:&lt;br /&gt;
	phi = asin(xa);								// Calculate the and phi&lt;br /&gt;
	the = asin(ya / cos(the));					//  from the raw values&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function calculates the position in space by&lt;br /&gt;
 * using the the and phi values (see function&lt;br /&gt;
 * normalizeLSM303DLHC_A()!). It stores the position&lt;br /&gt;
 * in the global double variables pitch and roll. &lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void positionLSM303DLHC_A(void)&lt;br /&gt;
{&lt;br /&gt;
	pitch = the * 180 / M_PI + OFFSET_PITCH_A;&lt;br /&gt;
	roll = phi * 180 / M_PI + OFFSET_ROLL_A;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// LSM303DLHC magnetometer functions:&lt;br /&gt;
int16_t x_axism, y_axism, z_axism;&lt;br /&gt;
int16_t headingm;&lt;br /&gt;
double xm, ym, zm;&lt;br /&gt;
#ifdef GET_TEMP_M&lt;br /&gt;
int16_t temperaturem;&lt;br /&gt;
double temperature_mag;&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
int16_t headingtc;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Call this once before using the 3D-Compass.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void LSM303DLHC_M_init(void)&lt;br /&gt;
{&lt;br /&gt;
#ifdef GET_TEMP_M&lt;br /&gt;
	// Set Data output rate to 15Hz, enable temperature sensor:&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_LSM303DLHC_M_ADR, CRA_REG_M, CRA_REG_M_15HZ_T_EN);&lt;br /&gt;
#else&lt;br /&gt;
	// Set Data output rate to 15Hz:&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_LSM303DLHC_M_ADR, CRA_REG_M, CRA_REG_M_15HZ);&lt;br /&gt;
#endif&lt;br /&gt;
	mSleep(10);&lt;br /&gt;
	// Set Gain to +-1.3Gauss:&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_LSM303DLHC_M_ADR, CRB_REG_M, CRB_REG_M_13GAUSS);&lt;br /&gt;
	mSleep(10);&lt;br /&gt;
	// Set Continuous-conversion mode:&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_LSM303DLHC_M_ADR, MR_REG_M, MR_REG_M_CCM);&lt;br /&gt;
	mSleep(10);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function reads the X-axis, Y-axis, Z-axis and&lt;br /&gt;
 * temperature values from the LSM303DLHC magnetometer&lt;br /&gt;
 * and stores them in the global variables x_axism,&lt;br /&gt;
 * y_axism, z_axism and temperaturem.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void readLSM303DLHC_M(void)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t readBuf[6];&lt;br /&gt;
&lt;br /&gt;
	I2CTWI_transmitByte(I2C_SENSOR_LSM303DLHC_M_ADR, OUT_X_H_M);&lt;br /&gt;
	I2CTWI_readBytes(I2C_SENSOR_LSM303DLHC_M_ADR, readBuf, 6); // Read  X-/Y-/Z-axis&lt;br /&gt;
	// xb = x:&lt;br /&gt;
	x_axism = (readBuf[OUT_X_H_M - OUT_X_H_M] &amp;lt;&amp;lt; 8) + readBuf[OUT_X_L_M - OUT_X_H_M];&lt;br /&gt;
	// yb = y:&lt;br /&gt;
	y_axism = (readBuf[OUT_Y_H_M - OUT_X_H_M] &amp;lt;&amp;lt; 8) + readBuf[OUT_Y_L_M - OUT_X_H_M];&lt;br /&gt;
	// zb = z:&lt;br /&gt;
	z_axism = (readBuf[OUT_Z_H_M - OUT_X_H_M] &amp;lt;&amp;lt; 8) + readBuf[OUT_Z_L_M - OUT_X_H_M];&lt;br /&gt;
	mSleep(10);&lt;br /&gt;
#ifdef GET_TEMP_M&lt;br /&gt;
	// Read temperature raw value:&lt;br /&gt;
	I2CTWI_transmitByte(I2C_SENSOR_LSM303DLHC_M_ADR, TEMP_OUT_H_M);&lt;br /&gt;
	readBuf[0] = I2CTWI_readByte(I2C_SENSOR_LSM303DLHC_M_ADR);&lt;br /&gt;
	I2CTWI_transmitByte(I2C_SENSOR_LSM303DLHC_M_ADR, TEMP_OUT_L_M);&lt;br /&gt;
	readBuf[1] = I2CTWI_readByte(I2C_SENSOR_LSM303DLHC_M_ADR);&lt;br /&gt;
	temperaturem = (readBuf[0] &amp;lt;&amp;lt; 8) | readBuf[1];&lt;br /&gt;
	temperaturem &amp;gt;&amp;gt;= 4;&lt;br /&gt;
	if (temperaturem &amp;amp; 2048)					// Calculate temperature&lt;br /&gt;
		temperaturem = (temperaturem &amp;amp; 2047) - 2048;&lt;br /&gt;
	else&lt;br /&gt;
		temperaturem = temperaturem &amp;amp; 2047;&lt;br /&gt;
	mSleep(10);&lt;br /&gt;
#endif&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function compensates hard iron effects and&lt;br /&gt;
 * scales the x-axism, y-axism and z-axism values read&lt;br /&gt;
 * from the LSM303DLHC magnetometer with the function&lt;br /&gt;
 * readLSM303DLHC_M() and stores them in the global&lt;br /&gt;
 * double variables xm, ym and zm.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void normalizeLSM303DLHC_M(void)&lt;br /&gt;
{&lt;br /&gt;
	// Add hard iron offsets:&lt;br /&gt;
	x_axism += OFFSET_X_M;&lt;br /&gt;
	y_axism += OFFSET_Y_M;&lt;br /&gt;
	z_axism += OFFSET_Z_M;&lt;br /&gt;
	// Scale raw values:&lt;br /&gt;
	xm = (x_axism - MIN_X_M) / (MAX_X_M - MIN_X_M) * 2 - 1;&lt;br /&gt;
	ym = (y_axism - MIN_Y_M) / (MAX_Y_M - MIN_Y_M) * 2 - 1;&lt;br /&gt;
	zm = (z_axism - MIN_Z_M) / (MAX_Z_M - MIN_Z_M) * 2 - 1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function calculates the heading by using the&lt;br /&gt;
 * normalized sensor values xm and ym (see function&lt;br /&gt;
 * normalizeLSM303DLHC_M()!). The heading is a value&lt;br /&gt;
 * from 0° to 359°. If the robot's front (and the&lt;br /&gt;
 * RP6 Sensor Board's front edge with the two&lt;br /&gt;
 * headlights) points to ...&lt;br /&gt;
 *   north -&amp;gt; heading is 0°,&lt;br /&gt;
 *   east  -&amp;gt; heading is 90°,&lt;br /&gt;
 *   south -&amp;gt; heading is 180°,&lt;br /&gt;
 *   west  -&amp;gt; heading is 270°.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
int16_t headingLSM303DLHC_M(void)&lt;br /&gt;
{&lt;br /&gt;
	double hdg = atan2(ym, xm) * 180 / M_PI + DECLINATION_M;&lt;br /&gt;
	if(hdg &amp;lt; 0.0) hdg += 360.0;&lt;br /&gt;
	return ((int16_t) hdg);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// --------------------------------------------&lt;br /&gt;
/**&lt;br /&gt;
 * This function calculates the TILT COMPENSATED&lt;br /&gt;
 * heading by using accelerometer (the, phi) AND&lt;br /&gt;
 * magnetometer (xm, ym, zm) data. The heading is a&lt;br /&gt;
 * value from 0° to 359°. If the robot's front (and&lt;br /&gt;
 * the RP6 Sensor Board's front edge with the two&lt;br /&gt;
 * headlights) points to ...&lt;br /&gt;
 *   north -&amp;gt; heading is 0°,&lt;br /&gt;
 *   east  -&amp;gt; heading is 90°,&lt;br /&gt;
 *   south -&amp;gt; heading is 180°,&lt;br /&gt;
 *   west  -&amp;gt; heading is 270°.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
int16_t headingLSM303DLHC_TC(void)&lt;br /&gt;
{&lt;br /&gt;
	double hdgtc, xh, yh;&lt;br /&gt;
&lt;br /&gt;
	xh = xm * cos(the) + zm * sin(the);&lt;br /&gt;
	yh = xm * sin(phi) * sin(the) + ym * cos(phi) - zm * sin(phi) * cos(the);&lt;br /&gt;
//	zh = -xm * cos(phi) * sin(the) + ym * sin(phi) + zm * cos(phi) * cos(the);&lt;br /&gt;
	hdgtc = atan2(yh, xh) * 180 / M_PI + DECLINATION_M;&lt;br /&gt;
	if(hdgtc &amp;lt; 0.0) hdgtc += 360.0;&lt;br /&gt;
	return ((int16_t) hdgtc);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// --------------------------------------------&lt;br /&gt;
/**&lt;br /&gt;
 * Call this once before using the LSM303DLHC.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void LSM303DLHC_init(void)&lt;br /&gt;
{&lt;br /&gt;
	LSM303DLHC_A_init();						// Accelerometer init&lt;br /&gt;
	LSM303DLHC_M_init();						// Magnetometer init&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Analog Yaw-Rate Gyroscope (LY330ALH):&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Sets the LY330ALH mode of operation.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: mode -&amp;gt; Mode [0..3]&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void LY330ALH_set_mode(uint8_t mode)&lt;br /&gt;
{&lt;br /&gt;
	outport.pd_gyro = false;					// I/O 0.6: Low&lt;br /&gt;
	outport.st_gyro = false;					// I/O 0.7: Low&lt;br /&gt;
	if(mode &amp;amp; 1) outport.pd_gyro = true;&lt;br /&gt;
	if(mode &amp;amp; 2) outport.st_gyro = true;&lt;br /&gt;
	MAX7311_update();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Reads the ADC1 value from the RP6Base.&lt;br /&gt;
 *&lt;br /&gt;
 * Hints: - The RP6Base input ADC1 has to be&lt;br /&gt;
 *          connected to the USRBUS: Pin 2 on&lt;br /&gt;
 *          the RP6 mainboard!&lt;br /&gt;
 *        - The RP6Base_I2CSlave program has to&lt;br /&gt;
 *          be loaded into the RP6Base&lt;br /&gt;
 *          microcontroller!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
uint16_t getRP6Base_ADC1(void)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_readRegisters(I2C_RP6_BASE_ADR, I2C_REG_ADC_ADC1_L, registerBuf, 2);&lt;br /&gt;
	return (registerBuf[0] + (registerBuf[1] &amp;lt;&amp;lt; 8));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int16_t z_axisg;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Performs a LY330ALH gyroscope measurement and&lt;br /&gt;
 * returns the angular rate (velocity).&lt;br /&gt;
 * Positive values mean an angular rate while&lt;br /&gt;
 * rotating LEFT and negative values while&lt;br /&gt;
 * rotating RIGHT!&lt;br /&gt;
 * The global integer variable z_axisg also&lt;br /&gt;
 * contains the measurement result.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
int16_t LY330ALH_measure(void)&lt;br /&gt;
{&lt;br /&gt;
	z_axisg = getRP6Base_ADC1();				// Read raw data&lt;br /&gt;
	z_axisg -= ADCVAL_ZERORATE_LEVEL;			// Calculate value&lt;br /&gt;
	return (z_axisg);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Hot Swappable 2-Wire Bus Buffer (TCA4311A):&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Reads the TCA4311A Ready output. &lt;br /&gt;
 * The function returns the state (true/false).&lt;br /&gt;
 * The global variable readyBusbuff is also&lt;br /&gt;
 * filled with the Ready output state.&lt;br /&gt;
 *&lt;br /&gt;
 * Hint: You don't have to use this function,&lt;br /&gt;
 *       if the task task_RP6SensorBoard() is&lt;br /&gt;
 *       called frequently out of the main&lt;br /&gt;
 *       loop, because readyBusbuff will be&lt;br /&gt;
 *       updated by this task!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
uint8_t readReadyBusbuff(void)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmitByte(I2C_SENSOR_PORTEXP_ADR, MAX7311_INPUT_PORT1);&lt;br /&gt;
	readyBusbuff = I2CTWI_readByte(I2C_SENSOR_PORTEXP_ADR);&lt;br /&gt;
	readyBusbuff &amp;amp;= RDY_BUSBUFF;&lt;br /&gt;
	return readyBusbuff;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
uint8_t errorBusbuff;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * If the I2C bus for the I2C-MODULE (SCLOUT,&lt;br /&gt;
 * SDAOUT) is not used or shall be isolated from&lt;br /&gt;
 * the RP6 I2C bus, this can be done with this&lt;br /&gt;
 * function.&lt;br /&gt;
 *&lt;br /&gt;
 * Hints: - The I2C-MODULE power is NOT switched&lt;br /&gt;
 *          off by this function!&lt;br /&gt;
 *        - If USE_PD5 is defined in the&lt;br /&gt;
 *          configuration header file, this&lt;br /&gt;
 *          function uses the RP6M256 portpin,&lt;br /&gt;
 *          that is connected to plug I/O: Pin 9&lt;br /&gt;
 *          instead of MAX7311 I/O 1.0!&lt;br /&gt;
 *        - If the global variable errorBusbuff&lt;br /&gt;
 *          returns true, the bus buffer could&lt;br /&gt;
 *          not be switched to shutdown mode!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void TCA4311A_shutdown(void)&lt;br /&gt;
{&lt;br /&gt;
	// Wait until the I2C bus is idle:&lt;br /&gt;
	while(I2CTWI_isBusy() || TWI_operation != I2CTWI_NO_OPERATION) task_I2CTWI();&lt;br /&gt;
#ifdef USE_PD5&lt;br /&gt;
	IO_SENSOR_TCA4311A_EN_PORT &amp;amp;= ~IO_SENSOR_TCA4311A_EN_IN; // Low&lt;br /&gt;
#else&lt;br /&gt;
	outport.en_busbuff = false;					// I/O 1.0: Low&lt;br /&gt;
	MAX7311_update();&lt;br /&gt;
#endif&lt;br /&gt;
	errorBusbuff = readReadyBusbuff();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * If the I2C bus for the I2C-MODULE (SCLOUT,&lt;br /&gt;
 * SDAOUT) was isolated from the RP6 I2C bus with&lt;br /&gt;
 * the function TCA4311A_shutdown() before, it&lt;br /&gt;
 * can be connected again with this function.&lt;br /&gt;
 *&lt;br /&gt;
 * Hints: - The I2C-MODULE power is NOT switched&lt;br /&gt;
 *          on by this function!&lt;br /&gt;
 *        - If USE_PD5 is defined in the&lt;br /&gt;
 *          configuration header file, this&lt;br /&gt;
 *          function uses the RP6M256 portpin,&lt;br /&gt;
 *          that is connected to plug I/O: Pin 9&lt;br /&gt;
 *          instead of MAX7311 I/O 1.0!&lt;br /&gt;
 *        - If the global variable errorBusbuff&lt;br /&gt;
 *          returns true, the bus buffer could&lt;br /&gt;
 *          not be switched to normal operation!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void TCA4311A_reconnect(void)&lt;br /&gt;
{&lt;br /&gt;
	// Wait until the I2C bus is idle:&lt;br /&gt;
	while(I2CTWI_isBusy() || TWI_operation != I2CTWI_NO_OPERATION) task_I2CTWI();&lt;br /&gt;
#ifdef USE_PD5&lt;br /&gt;
	IO_SENSOR_TCA4311A_EN_PORT |= IO_SENSOR_TCA4311A_EN_IN; // High&lt;br /&gt;
#else&lt;br /&gt;
	outport.en_busbuff = true;					// I/O 1.0: High&lt;br /&gt;
	MAX7311_update();&lt;br /&gt;
#endif&lt;br /&gt;
	errorBusbuff = !readReadyBusbuff();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Sets/clears the RP6Base signal PWR.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: pwr -&amp;gt; 0 (false) = PWR off&lt;br /&gt;
 *               &amp;gt;0 (true) = PWR on&lt;br /&gt;
 *&lt;br /&gt;
 * Hints: - The RP6Base signal PWR has to be&lt;br /&gt;
 *          connected to the USRBUS: Pin 3 on&lt;br /&gt;
 *          the RP6 mainboard!&lt;br /&gt;
 *        - The RP6Base_I2CSlave program has to&lt;br /&gt;
 *          be loaded into the RP6Base&lt;br /&gt;
 *          microcontroller!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void setRP6Base_PWR(uint8_t pwr)&lt;br /&gt;
{&lt;br /&gt;
	if(pwr &amp;gt; 0)&lt;br /&gt;
		I2CTWI_transmit2Bytes(I2C_RP6_BASE_ADR, 0, CMD_POWER_ON);&lt;br /&gt;
	else&lt;br /&gt;
		I2CTWI_transmit2Bytes(I2C_RP6_BASE_ADR, 0, CMD_POWER_OFF);&lt;br /&gt;
	while(I2CTWI_isBusy() || TWI_operation != I2CTWI_NO_OPERATION) task_I2CTWI();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/** &lt;br /&gt;
 * With this function you can switch the I2C-&lt;br /&gt;
 * MODULE (plug M1) power on or off.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: pwr -&amp;gt; 0 (false) = I2C-MODULE power off&lt;br /&gt;
 *               &amp;gt;0 (true) = I2C-MODULE power on&lt;br /&gt;
 *&lt;br /&gt;
 * Hints: - If the I2C-MODULE plug is not used,&lt;br /&gt;
 *          you should always switch the&lt;br /&gt;
 *          I2C-MODULE power off (default)!&lt;br /&gt;
 *        - The TCA4311A is NOT switched to&lt;br /&gt;
 *          normal operation (default) or&lt;br /&gt;
 *          shutdown mode by this function!&lt;br /&gt;
 *        - The RP6Base signal PWR has to be&lt;br /&gt;
 *          connected to the USRBUS: Pin 3 on&lt;br /&gt;
 *          the RP6 mainboard!&lt;br /&gt;
 *        - The RP6Base_I2CSlave program has to&lt;br /&gt;
 *          be loaded into the RP6Base&lt;br /&gt;
 *          microcontroller!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void setI2CModulePower(uint8_t pwr)&lt;br /&gt;
{&lt;br /&gt;
	if(pwr &amp;gt; 0) {&lt;br /&gt;
		setRP6Base_PWR(1);						// RP6Base PWR on&lt;br /&gt;
		outport.pwr_i2c = true;					// I/O 0.0: High&lt;br /&gt;
	}&lt;br /&gt;
	else&lt;br /&gt;
		outport.pwr_i2c = false;				// I/O 0.0: Low&lt;br /&gt;
	MAX7311_update();&lt;br /&gt;
}	&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Button:&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Reads the MAX7311 I/O port 1.7. &lt;br /&gt;
 * The function returns true, if  button S1 is&lt;br /&gt;
 * pressed (I/O 1.7: Low!) and false, if it is&lt;br /&gt;
 * not pressed (I/O 1.7: High!).&lt;br /&gt;
 * The global variable pressedButton is also&lt;br /&gt;
 * filled with the I/O 1.7 output state.&lt;br /&gt;
 *&lt;br /&gt;
 * Hint: You don't have to use this function,&lt;br /&gt;
 *       if the task task_RP6SensorBoard() is&lt;br /&gt;
 *       called frequently out of the main&lt;br /&gt;
 *       loop, because pressedButton will be&lt;br /&gt;
 *       updated by this task!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
uint8_t readButton(void)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmitByte(I2C_SENSOR_PORTEXP_ADR, MAX7311_INPUT_PORT2);&lt;br /&gt;
	pressedButton = I2CTWI_readByte(I2C_SENSOR_PORTEXP_ADR);&lt;br /&gt;
	pressedButton &amp;amp;= IO2_I2C;&lt;br /&gt;
	pressedButton = !pressedButton;&lt;br /&gt;
	return pressedButton;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Status LED:&lt;br /&gt;
&lt;br /&gt;
/** &lt;br /&gt;
 * Sets the status LED (D2) of the RP6 Sensor&lt;br /&gt;
 * Board.&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *   setStatusLED(1);&lt;br /&gt;
 *   // This switches the status LED on!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void setStatusLED(uint8_t on)&lt;br /&gt;
{&lt;br /&gt;
	if(on &amp;gt; 0)&lt;br /&gt;
		outport.io1_i2c = false;				// I/O 1.6: Low&lt;br /&gt;
	else&lt;br /&gt;
		outport.io1_i2c = true;					// I/O 1.6: High&lt;br /&gt;
	MAX7311_update();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// RP6 Sensor Board initialisation and shutdown:&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * You MUST call this function at the beginning of a&lt;br /&gt;
 * main program, that uses the RP6 Sensor Board. &lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void sensor_board_init(void)&lt;br /&gt;
{&lt;br /&gt;
	// I/O Port Expander:&lt;br /&gt;
	MAX7311_init();&lt;br /&gt;
	// RTC:&lt;br /&gt;
	DS1339_init();&lt;br /&gt;
	// Temperature Sensor:&lt;br /&gt;
	LM75B_init();&lt;br /&gt;
	// Servo Controller:&lt;br /&gt;
	PCA9685_init(50);							// Init PWM 50 Hz&lt;br /&gt;
	// LED Driver:&lt;br /&gt;
	TCA6507_init();&lt;br /&gt;
	// 3D Magnetometer &amp;amp; Accelerometer:&lt;br /&gt;
	LSM303DLHC_init();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * If you don't use any function of the RP6&lt;br /&gt;
 * Sensor Board, you can put the board into&lt;br /&gt;
 * &amp;quot;SHUTDOWN MODE&amp;quot;. In this mode the electric&lt;br /&gt;
 * power consumption is very low to save energy.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void sensor_board_shutdown(void)&lt;br /&gt;
{&lt;br /&gt;
	// Servo Controller:&lt;br /&gt;
	PCA9685_shutdown();							// Shutdown PCA9685&lt;br /&gt;
	// Temperature Sensor:&lt;br /&gt;
	LM75B_shutdown();							// Shutdown LM75B&lt;br /&gt;
	// I/O Port Expander:&lt;br /&gt;
	MAX7311_write(MAX7311_OUTPUT_SHUTDOWN);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&lt;br /&gt;
/******************************************************************************&lt;br /&gt;
 * Additional info&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Changelog:&lt;br /&gt;
 * - v. 1.1 RP6M256_I2CMasterLib compatibility 16.09.2014 by Dirk&lt;br /&gt;
 * - v. 1.0 TCA4311A reconnect problem fixed 10.04.2014 by Dirk&lt;br /&gt;
 * - v. 0.9 Interrupt status functions added 09.04.2014 by Dirk&lt;br /&gt;
 * - v. 0.8 (initial release) 17.03.2014 by Dirk&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Erklärung&lt;br /&gt;
&lt;br /&gt;
=====Demo=====&lt;br /&gt;
makefile:&lt;br /&gt;
&amp;lt;pre&amp;gt;...&lt;br /&gt;
TARGET = RP6M256_Sensor_Board_01&lt;br /&gt;
...&lt;br /&gt;
SRC += $(RP6_LIB_PATH)/RP6common/RP6I2CmasterTWI.c&lt;br /&gt;
&lt;br /&gt;
SRC += $(RP6_LIB_PATH)/RP6control_M256_WIFI/RP6M256_Sensor_BoardLib.c&lt;br /&gt;
...&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Datei: RP6M256_Sensor_Board_01.c&lt;br /&gt;
&amp;lt;pre&amp;gt;/* &lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * RP6 ROBOT SYSTEM - RP6 CONTROL M256 Examples&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Example: RP6M256 Sensor Board&lt;br /&gt;
 * Author(s): Dirk&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Description:&lt;br /&gt;
 * In this example we show a first test for the RP6 Sensor Board.&lt;br /&gt;
 * &lt;br /&gt;
 * ############################################################################&lt;br /&gt;
 * The Robot does NOT move in this example! You can simply put it on a table&lt;br /&gt;
 * next to your PC and you should connect it to the PC via the USB Interface!&lt;br /&gt;
 * You should also connect to it via WIFI.&lt;br /&gt;
 * ############################################################################&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Includes:&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6M256Lib.h&amp;quot; 				// The RP6 M256 Library. &lt;br /&gt;
										// Always needs to be included!&lt;br /&gt;
#include &amp;quot;RP6I2CmasterTWI.h&amp;quot;			// Include the I2C-Bus Master Library&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Include our new &amp;quot;RP6M256 Sensor Board library&amp;quot;:&lt;br /&gt;
// (This is the library for accessing the RP6 Sensor Board!)&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6M256_Sensor_BoardLib.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Variables:&lt;br /&gt;
&lt;br /&gt;
char dir[3];&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Returns a 2 character string for the eighth&lt;br /&gt;
 * parts of the direction calculated from the&lt;br /&gt;
 * heading value.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: heading -&amp;gt; Heading value [0..359]&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void calculateDir(char *dir, uint16_t heading)&lt;br /&gt;
{&lt;br /&gt;
	dir[1] = ' ';&lt;br /&gt;
	dir[2] = '\0';&lt;br /&gt;
	if ((heading &amp;lt;= 22) || (heading &amp;gt;=338)) dir[0] = 'N';&lt;br /&gt;
	if ((heading &amp;gt;= 23) &amp;amp;&amp;amp; (heading &amp;lt;= 67)) {dir[0] = 'N'; dir[1] = 'E';} &lt;br /&gt;
	if ((heading &amp;gt;= 68) &amp;amp;&amp;amp; (heading &amp;lt;= 112)) dir[0] = 'E';&lt;br /&gt;
	if ((heading &amp;gt;= 113) &amp;amp;&amp;amp; (heading &amp;lt;= 157)) {dir[0] = 'S'; dir[1] = 'E';}&lt;br /&gt;
	if ((heading &amp;gt;= 158) &amp;amp;&amp;amp; (heading &amp;lt;= 202)) dir[0] = 'S';&lt;br /&gt;
	if ((heading &amp;gt;= 203) &amp;amp;&amp;amp; (heading &amp;lt;= 247)) {dir[0] = 'S'; dir[1] = 'W';}&lt;br /&gt;
	if ((heading &amp;gt;= 248) &amp;amp;&amp;amp; (heading &amp;lt;= 292)) dir[0] = 'W';&lt;br /&gt;
	if ((heading &amp;gt;= 293) &amp;amp;&amp;amp; (heading &amp;lt;= 337)) {dir[0] = 'N'; dir[1] = 'W';}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Write a floating point number to the WIFI.&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *&lt;br /&gt;
 *			// Write a floating point number to the WIFI (no exponent):&lt;br /&gt;
 *			writeDouble_WIFI(1234567.890, 11, 3);&lt;br /&gt;
 *&lt;br /&gt;
 * The value of prec (precision) defines the number of decimal places.&lt;br /&gt;
 * For 32 bit floating point variables (float, double ...) 6 is&lt;br /&gt;
 * the max. value for prec (7 relevant digits).&lt;br /&gt;
 * The value of width defines the overall number of characters in the&lt;br /&gt;
 * floating point number including the decimal point. The number of&lt;br /&gt;
 * pre-decimal positions is: (width - prec - 1).&lt;br /&gt;
 */&lt;br /&gt;
void writeDouble_WIFI(double number, uint8_t width, uint8_t prec)&lt;br /&gt;
{char buffer[width + 1];&lt;br /&gt;
	dtostrf(number, width, prec, &amp;amp;buffer[0]);&lt;br /&gt;
	writeString_WIFI(&amp;amp;buffer[0]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Write a floating point number to the LCD.&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *&lt;br /&gt;
 *			// Write a floating point number to the LCD (no exponent):&lt;br /&gt;
 *			writeDoubleLCD(1234567.890, 11, 3);&lt;br /&gt;
 *&lt;br /&gt;
 * The value of prec (precision) defines the number of decimal places.&lt;br /&gt;
 * For 32 bit floating point variables (float, double ...) 6 is&lt;br /&gt;
 * the max. value for prec (7 relevant digits).&lt;br /&gt;
 * The value of width defines the overall number of characters in the&lt;br /&gt;
 * floating point number including the decimal point. The number of&lt;br /&gt;
 * pre-decimal positions is: (width - prec - 1).&lt;br /&gt;
 */&lt;br /&gt;
void writeDoubleLCD(double number, uint8_t width, uint8_t prec)&lt;br /&gt;
{char buffer[width + 1];&lt;br /&gt;
	dtostrf(number, width, prec, &amp;amp;buffer[0]);&lt;br /&gt;
	writeStringLCD(&amp;amp;buffer[0]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Error handler&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function gets called automatically if there was an I2C Error like&lt;br /&gt;
 * the slave sent a &amp;quot;not acknowledge&amp;quot; (NACK, error codes e.g. 0x20 or 0x30).&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void I2C_transmissionError(uint8_t errorState)&lt;br /&gt;
{&lt;br /&gt;
	writeString_P_WIFI(&amp;quot;\nI2C ERROR - TWI STATE: 0x&amp;quot;);&lt;br /&gt;
	writeInteger_WIFI(errorState, HEX);&lt;br /&gt;
	writeChar_WIFI('\n');&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Main function - The program starts here:&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
	initRP6M256();    // Always call this first! The Processor will not work&lt;br /&gt;
					  // correctly otherwise. &lt;br /&gt;
&lt;br /&gt;
	initLCD(); // Initialize the LC-Display (LCD)&lt;br /&gt;
			   // Always call this before using the LCD!&lt;br /&gt;
&lt;br /&gt;
	setLEDs(0b1111);&lt;br /&gt;
	mSleep(500);&lt;br /&gt;
	setLEDs(0b0000);&lt;br /&gt;
&lt;br /&gt;
	writeString_P_WIFI(&amp;quot;\n\nRP6 Sensor Board Selftest 1!\n&amp;quot;); &lt;br /&gt;
&lt;br /&gt;
	// IMPORTANT:&lt;br /&gt;
	I2CTWI_initMaster(100); // Initialize the TWI Module for Master operation&lt;br /&gt;
							// with 100kHz SCL Frequency&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	// Register the event handler:&lt;br /&gt;
	I2CTWI_setTransmissionErrorHandler(I2C_transmissionError);&lt;br /&gt;
&lt;br /&gt;
	setLEDs(0b1111);&lt;br /&gt;
&lt;br /&gt;
	// Write a text message to the LCD:&lt;br /&gt;
	showScreenLCD(&amp;quot;################&amp;quot;, &amp;quot;################&amp;quot;);&lt;br /&gt;
	mSleep(1500);&lt;br /&gt;
	showScreenLCD(&amp;quot;RP6v2-M256-WIFI &amp;quot;, &amp;quot;Example Program&amp;quot;);&lt;br /&gt;
	mSleep(2500); &lt;br /&gt;
	showScreenLCD(&amp;quot;RP6 Sensor Board&amp;quot;, &amp;quot;   Selftest 1&amp;quot;);&lt;br /&gt;
	mSleep(2500);&lt;br /&gt;
	clearLCD();&lt;br /&gt;
&lt;br /&gt;
	setLEDs(0b0000);&lt;br /&gt;
&lt;br /&gt;
	// ---------------------------------------&lt;br /&gt;
&lt;br /&gt;
	uint8_t onoff = 0;&lt;br /&gt;
	uint16_t servopos = SERVO1_LT;&lt;br /&gt;
	int16_t rate;&lt;br /&gt;
&lt;br /&gt;
	startStopwatch1();&lt;br /&gt;
	startStopwatch2();&lt;br /&gt;
&lt;br /&gt;
	// IMPORTANT:&lt;br /&gt;
	sensor_board_init();						// RP6 Sensor Board init!!!&lt;br /&gt;
	setServoPower(1);							// Servo power ON!&lt;br /&gt;
/*&lt;br /&gt;
	// ----------------------------------------------&lt;br /&gt;
	// Set RTC once (battery empty or not existing:&lt;br /&gt;
	rtc_time.second = 0;&lt;br /&gt;
	rtc_time.minute = 15;&lt;br /&gt;
	rtc_time.hour = 20;				// 20:15&lt;br /&gt;
	rtc_date.weekday = R_SU;&lt;br /&gt;
	rtc_date.day = 20;&lt;br /&gt;
	rtc_date.month = 4;&lt;br /&gt;
	rtc_date.year = 2014;			// Su, 20.4.2014&lt;br /&gt;
	DS1339_write();&lt;br /&gt;
	// Remove this, if RTC is set and running!!!&lt;br /&gt;
	// ----------------------------------------------&lt;br /&gt;
*/&lt;br /&gt;
	while(true) &lt;br /&gt;
	{&lt;br /&gt;
		if(getStopwatch1() &amp;gt; 1000) // 1s&lt;br /&gt;
		{&lt;br /&gt;
			if (onoff) onoff = 0;&lt;br /&gt;
			else onoff = 1;&lt;br /&gt;
&lt;br /&gt;
			// Interrupt status:&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nInterrupt Status:      &amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(interrupt_RP6SBstatus.byte, BIN, 8);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			// Inport status:&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;Inport Status: &amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(inport.word, BIN, 16);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			// Temperature sensor test:&lt;br /&gt;
			temperature = LM75B_measure();		// Measure&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;Temperature: &amp;quot;);&lt;br /&gt;
			writeDouble_WIFI(temperature, 7, 3);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;°\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			// LED driver test:&lt;br /&gt;
			if (onoff) {&lt;br /&gt;
				setLED(HEADLIGHT_R, STATE_ON);&lt;br /&gt;
				setLED(HEADLIGHT_L, STATE_OFF);&lt;br /&gt;
			}&lt;br /&gt;
			else {&lt;br /&gt;
				setLED(HEADLIGHT_L, STATE_ON);&lt;br /&gt;
				setLED(HEADLIGHT_R, STATE_OFF);&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			// Servo controller test (SERVO_1):&lt;br /&gt;
			setServo(1, servopos);&lt;br /&gt;
			servopos += 10;&lt;br /&gt;
			if (servopos &amp;gt; SERVO1_RT) servopos = SERVO1_LT;&lt;br /&gt;
&lt;br /&gt;
			// RTC test:&lt;br /&gt;
			DS1339_read();&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;RTC: &amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(rtc_time.hour, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;:&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(rtc_time.minute, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;:&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(rtc_time.second, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;  &amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(rtc_date.day, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;.&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(rtc_date.month, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;.&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(rtc_date.year, DEC, 4);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			// 3D Magnetometer &amp;amp; Accelerometer test:&lt;br /&gt;
			//  LSM303DLHC accelerometer:&lt;br /&gt;
			task_I2CTWI();&lt;br /&gt;
			readLSM303DLHC_A();					// Get sensor values&lt;br /&gt;
			task_I2CTWI();&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\n3D-Acceleration SENSOR -&amp;gt;\n&amp;quot;);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;X-axis: &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(x_axisa, DEC);&lt;br /&gt;
			writeChar_WIFI('\n');&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;Y-axis: &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(y_axisa, DEC);&lt;br /&gt;
			writeChar_WIFI('\n');&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;Z-axis: &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(z_axisa, DEC);&lt;br /&gt;
			writeChar_WIFI('\n');&lt;br /&gt;
			normalizeLSM303DLHC_A();			// Normalize data&lt;br /&gt;
			positionLSM303DLHC_A();				// Calculate position&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;POSITION: \n&amp;quot;);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;  Pitch [°]: &amp;quot;);&lt;br /&gt;
			writeDouble_WIFI(pitch, 6, 1);&lt;br /&gt;
			writeChar_WIFI('\n');&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;  Roll [°]:  &amp;quot;);&lt;br /&gt;
			writeDouble_WIFI(roll, 6, 1);&lt;br /&gt;
			writeChar_WIFI('\n');&lt;br /&gt;
&lt;br /&gt;
			//  LSM303DLHC magnetometer:&lt;br /&gt;
			task_I2CTWI();&lt;br /&gt;
			readLSM303DLHC_M();					// Get sensor values&lt;br /&gt;
			task_I2CTWI();&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\n3D-Compass SENSOR -&amp;gt;\n&amp;quot;);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;X-axis: &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(x_axism, DEC);&lt;br /&gt;
			writeChar_WIFI('\n');&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;Y-axis: &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(y_axism, DEC);&lt;br /&gt;
			writeChar_WIFI('\n');&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;Z-axis: &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(z_axism, DEC);&lt;br /&gt;
			writeChar_WIFI('\n');&lt;br /&gt;
			normalizeLSM303DLHC_M();			// Normalize data&lt;br /&gt;
			headingm = headingLSM303DLHC_M();	// Calculate heading&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;                 Heading [°]: &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(headingm, DEC);&lt;br /&gt;
			calculateDir(dir, headingm);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;  Direction: &amp;quot;);&lt;br /&gt;
			writeString_WIFI(dir);&lt;br /&gt;
			writeChar_WIFI('\n');&lt;br /&gt;
			headingtc = headingLSM303DLHC_TC();	// Calculate TILT COMPENSATED&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;TILT COMPENSATED heading [°]: &amp;quot;); // heading&lt;br /&gt;
			writeInteger_WIFI(headingtc, DEC);&lt;br /&gt;
			calculateDir(dir, headingtc);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;  Direction: &amp;quot;);&lt;br /&gt;
			writeString_WIFI(dir);&lt;br /&gt;
			writeChar_WIFI('\n');&lt;br /&gt;
#ifdef GET_TEMP_M&lt;br /&gt;
			temperature_mag = (double) temperaturem / 8.0 + OFFSET_TEMP_M;&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;Temperature [°]: &amp;quot;);&lt;br /&gt;
			writeDouble_WIFI(temperature_mag, 7, 2);&lt;br /&gt;
			writeChar_WIFI('\n');&lt;br /&gt;
#endif&lt;br /&gt;
			// Yaw-Rate Gyroscope test:&lt;br /&gt;
			rate = LY330ALH_measure();&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\n1D-Gyro SENSOR -&amp;gt;\n&amp;quot;);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;Z-axis: &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(rate, DEC);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			// RP6 Sensor Board shutdown (button &amp;amp; status LED test):&lt;br /&gt;
			if (pressedButton) {&lt;br /&gt;
				setStatusLED(1);&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;\nPress button again for RP6 Sensor Board SHUTDOWN!\n&amp;quot;);&lt;br /&gt;
				mSleep(2000);&lt;br /&gt;
				do {&lt;br /&gt;
					if(getStopwatch2() &amp;gt; 200) { // 0.2s&lt;br /&gt;
						if (onoff) onoff = 0;&lt;br /&gt;
						else onoff = 1;&lt;br /&gt;
						if (onoff) setStatusLED(1);&lt;br /&gt;
						else setStatusLED(0);&lt;br /&gt;
						setStopwatch2(0);&lt;br /&gt;
					}&lt;br /&gt;
					mSleep(1);&lt;br /&gt;
					task_I2CTWI();&lt;br /&gt;
				} while (!readButton());&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;\n\n\n\n\nPlease wait for RP6 Sensor Board SHUTDOWN...\n&amp;quot;);&lt;br /&gt;
				sensor_board_shutdown();&lt;br /&gt;
				mSleep(3000);&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;\n\n\nThe RP6 Sensor Board now is in SHUTDOWN MODE!!!\n&amp;quot;);&lt;br /&gt;
				mSleep(1000);&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;\nRESET the M256 microcontroller now...\n\n&amp;quot;);&lt;br /&gt;
				while(true) {};&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			setStopwatch1(0);&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		task_checkINTs();						// Read interrupt signals&lt;br /&gt;
		task_RP6SensorBoard();					// RP6 Sensor Board task&lt;br /&gt;
&lt;br /&gt;
		task_I2CTWI();&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Erklärung&lt;br /&gt;
&lt;br /&gt;
====Projekte====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===RP6 Xtra Module===&lt;br /&gt;
Die Dokumentation zu den RP6 Xtra Modulen befindet sich auf der mitgelieferten ''&amp;quot;RP6 Robot System Xtra Modules CD-ROM&amp;quot;''. Auf der CD-ROM sind auch Software-Beispiele zu finden.&lt;br /&gt;
&lt;br /&gt;
Die hier veröffentlichte Software zu den Xtra Modulen ist eine Eigenentwicklung in GCC:&lt;br /&gt;
* Arexx [[RP6_Sensor_Board_und_Xtra_Module#I2C_GPS_Empf.C3.A4nger_JM3-GPS_2|I2C GPS Empfänger JM3-GPS]]&lt;br /&gt;
* Arexx [[RP6_Sensor_Board_und_Xtra_Module#Gyro_Modul_JM3-GYRO_2|Gyro Modul JM3-GYRO]]&lt;br /&gt;
* Arexx [[RP6_Sensor_Board_und_Xtra_Module#3D_Accelerometer_Modul_JM3-3DA_2|3D Accelerometer Modul JM3-3DA]]&lt;br /&gt;
* Arexx [[RP6_Sensor_Board_und_Xtra_Module#BHT_Modul_JM3-BHT31_2|BHT Modul JM3-BHT31]]&lt;br /&gt;
&lt;br /&gt;
====I2C GPS Empfänger JM3-GPS====&lt;br /&gt;
=====Dokumentation=====&lt;br /&gt;
Die Dokumentation zum I2C GPS Empfänger befindet sich auf der mitgelieferten ''&amp;quot;RP6 Robot System Xtra Modules CD-ROM&amp;quot;''.&lt;br /&gt;
&lt;br /&gt;
======Manuals======&lt;br /&gt;
Das Handbuch in der aktuellen Version kann [http://www.jm3-engineering.com/download/doc/ManualGPSModule_de.pdf hier] eingesehen werden.&lt;br /&gt;
&lt;br /&gt;
=====Demo-Programme=====&lt;br /&gt;
Ein Demo-Programm zum I2C GPS Empfänger befindet sich integriert in die RP6 Sensor Board Demo auf der mitgelieferten ''&amp;quot;RP6 Robot System Xtra Modules CD-ROM&amp;quot;''. Diese Demo kann auch in der aktuellen Version im Download Bereich von [http://www.jm3-engineering.com/downloads.htm JM3 Engineering] herunter geladen werden.&lt;br /&gt;
&lt;br /&gt;
=====RP6M256 WiFi: I2C_GPS Library=====&lt;br /&gt;
Die nachfolgende RP6M256_I2C_GPSLib (Eigenentwicklung in GCC) dient zur Ansteuerung des I2C GPS Empfängers durch die RP6M256 WiFi.&lt;br /&gt;
 &lt;br /&gt;
======Libary Header======&lt;br /&gt;
Datei: RP6M256_I2C_GPSLib.h&lt;br /&gt;
&amp;lt;pre&amp;gt;/* ****************************************************************************&lt;br /&gt;
 *                           _______________________&lt;br /&gt;
 *                           \| RP6  ROBOT SYSTEM |/&lt;br /&gt;
 *                            \_-_-_-_-_-_-_-_-_-_/           &amp;gt;&amp;gt;&amp;gt; RP6 M256 WIFI&lt;br /&gt;
 * ----------------------------------------------------------------------------&lt;br /&gt;
 * ----------------------------- [c]2014 - Dirk -------------------------------&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * File: RP6M256_I2C_GPSLib.h&lt;br /&gt;
 * Version: 1.0&lt;br /&gt;
 * Target: RP6 M256 WIFI - ATMEGA2560 @16.00MHz&lt;br /&gt;
 * Author(s): Dirk&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Description:&lt;br /&gt;
 * Header file for new RP6 I2C GPS Receiver library.&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
#ifndef RP6M256_I2C_GPSLIB_H&lt;br /&gt;
#define RP6M256_I2C_GPSLIB_H&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// RP6 Sensor Board:&lt;br /&gt;
&lt;br /&gt;
// If you want to use the RP6 I2C GPS Receiver on the RP6 Sensor Board, you&lt;br /&gt;
// have to define SENSOR_BOARD (default)!&lt;br /&gt;
// If SENSOR_BOARD is NOT defined, this library assumes that the RP6 I2C GPS&lt;br /&gt;
// Receiver is used stand-alone.&lt;br /&gt;
// ------------------&lt;br /&gt;
#define SENSOR_BOARD&lt;br /&gt;
// ------------------&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Includes:&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6M256Lib.h&amp;quot;&lt;br /&gt;
#include &amp;quot;RP6I2CmasterTWI.h&amp;quot;&lt;br /&gt;
#ifdef SENSOR_BOARD&lt;br /&gt;
	#include &amp;quot;RP6M256_Sensor_BoardLib.h&amp;quot;&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// RP6 I2C GPS Receiver:&lt;br /&gt;
#define I2C_GPS_RECEIVER_ADR			0xc8	// Default&lt;br /&gt;
//#define I2C_GPS_RECEIVER_ADR			0xca&lt;br /&gt;
//#define I2C_GPS_RECEIVER_ADR			0xcc&lt;br /&gt;
//#define I2C_GPS_RECEIVER_ADR			0xce&lt;br /&gt;
//#define I2C_GPS_RECEIVER_ADR			0xd0	// DO NOT USE on Sensor Board!&lt;br /&gt;
//#define I2C_GPS_RECEIVER_ADR			0xd2&lt;br /&gt;
//#define I2C_GPS_RECEIVER_ADR			0xd4&lt;br /&gt;
//#define I2C_GPS_RECEIVER_ADR			0xd6&lt;br /&gt;
//#define I2C_GPS_RECEIVER_ADR			0xd8&lt;br /&gt;
//#define I2C_GPS_RECEIVER_ADR			0xda&lt;br /&gt;
//#define I2C_GPS_RECEIVER_ADR			0xdc&lt;br /&gt;
//#define I2C_GPS_RECEIVER_ADR			0xde&lt;br /&gt;
&lt;br /&gt;
// Read registers:&lt;br /&gt;
#define WHO_AM_I						0x20	// I2C address [0xc8..0xde]&lt;br /&gt;
#define LAT_DEG							0x21	// Degrees&lt;br /&gt;
#define LAT_MIN							0x22	// Minutes&lt;br /&gt;
#define LAT_MIN_D_L						0x23	// Minutes decimal part low&lt;br /&gt;
#define LAT_MIN_D_H						0x24	// Minutes decimal part high&lt;br /&gt;
#define LON_DEG							0x25	// Degrees&lt;br /&gt;
#define LON_MIN							0x26	// Minutes&lt;br /&gt;
#define LON_MIN_D_L						0x27	// Minutes decimal part low&lt;br /&gt;
#define LON_MIN_D_H						0x28	// Minutes decimal part high&lt;br /&gt;
#define STATUS							0x29	// Status flags&lt;br /&gt;
#define FIX_IND							0x2a	// FIX_IND&lt;br /&gt;
#define HDOP							0x2b	// HDOP&lt;br /&gt;
#define HDOP_D							0x2c	// HDOP_D&lt;br /&gt;
#define SAT_N							0x2d	// Number of satellites&lt;br /&gt;
#define COURSE_T_L						0x2e	// True heading low byte&lt;br /&gt;
#define COURSE_T_H						0x2f	// True heading high byte&lt;br /&gt;
#define COURSE_T_D						0x30	// Decimal part of course&lt;br /&gt;
#define SPEED_L							0x31	// Speed low byte&lt;br /&gt;
#define SPEED_H							0x32	// Speed high byte&lt;br /&gt;
#define SPEED_D							0x33	// Speed decimal part&lt;br /&gt;
#define ALT_L							0x34	// Altitude low byte&lt;br /&gt;
#define ALT_H							0x35	// Altitude high byte&lt;br /&gt;
#define ALT_DIF_L						0x36	// Differ. WGS-84 MSL low byte&lt;br /&gt;
#define ALT_DIF_H						0x37	// Differ. WGS-84 MSL high byte&lt;br /&gt;
#define UTC_H							0x38	// UTC hour&lt;br /&gt;
#define UTC_MIN							0x39	// UTC minute&lt;br /&gt;
#define UTC_S							0x3a	// UTC second&lt;br /&gt;
#define DAY								0x3b	// Day&lt;br /&gt;
#define YEAR_L							0x3c	// Year low byte&lt;br /&gt;
#define YEAR_H							0x3d	// Year high byte&lt;br /&gt;
#define MONTH							0x3e	// Month&lt;br /&gt;
#define PDOP							0x3f	// PDOP&lt;br /&gt;
#define PDOP_D							0x40	// PDOP_D&lt;br /&gt;
#define VDOP							0x41	// VDOP&lt;br /&gt;
#define VDOP_D							0x42	// VDOP_D&lt;br /&gt;
#define SAT_1							0x43	// SAT # 1&lt;br /&gt;
#define SAT_2							0x44	// SAT # 2&lt;br /&gt;
#define SAT_3							0x45	// SAT # 3&lt;br /&gt;
#define SAT_4							0x46	// SAT # 4&lt;br /&gt;
#define SAT_5							0x47	// SAT # 5&lt;br /&gt;
#define SAT_6							0x48	// SAT # 6&lt;br /&gt;
#define SAT_7							0x49	// SAT # 7&lt;br /&gt;
#define SAT_8							0x4a	// SAT # 8&lt;br /&gt;
#define SAT_9							0x4b	// SAT # 9&lt;br /&gt;
#define SAT_A							0x4c	// SAT # 10&lt;br /&gt;
#define SAT_B							0x4d	// SAT # 11&lt;br /&gt;
#define SAT_C							0x4e	// SAT # 12&lt;br /&gt;
#define SW_VERSION						0x4f	// SW_Version&lt;br /&gt;
#define HEARTBEAT						0x50	// Heartbeat&lt;br /&gt;
&lt;br /&gt;
// Status and Fix_Ind register bitmasks:&lt;br /&gt;
#define STATUS_NS						0b00000001&lt;br /&gt;
#define STATUS_EW						0b00000010&lt;br /&gt;
#define STATUS_SPU						0b00000100&lt;br /&gt;
#define STATUS_AUTON					0b00001000&lt;br /&gt;
#define FIX_IND_UI_FIX					0b10000000&lt;br /&gt;
&lt;br /&gt;
// Write registers:&lt;br /&gt;
#define INIT_CFG						0x90	// INIT CFG&lt;br /&gt;
#define SET_FIX_TIME					0x91	// Pos_Fix_Time&lt;br /&gt;
#define STBY							0x92	// STBY&lt;br /&gt;
#define FAC_RES							0x93	// Factory Reset&lt;br /&gt;
#define EN_JAM							0x94	// Jamming Remover&lt;br /&gt;
#define TEST_MODE						0x96	// Test Mode&lt;br /&gt;
&lt;br /&gt;
// Write register values (commands):&lt;br /&gt;
#define INIT_CFG_HOT_START				1		// Hot Start&lt;br /&gt;
#define INIT_CFG_WARM_START				2		// Warm Start init data loaded&lt;br /&gt;
#define INIT_CFG_WARM_START_EPH_CLR		3		// Warm Start Ephemeris cleared&lt;br /&gt;
#define INIT_CFG_COLD_START				4		// Cold Start&lt;br /&gt;
#define SET_FIX_TIME_1S					1		// Pos Fix Time 1 second&lt;br /&gt;
#define SET_FIX_TIME_2S					2		// Pos Fix Time 2 seconds&lt;br /&gt;
#define STBY_ENTER						1		// Standby (cleared after write)&lt;br /&gt;
#define FAC_RES_ENTER					1		// Factory Reset&lt;br /&gt;
#define EN_JAM_DISABLE					0		// Jamming Remover disable&lt;br /&gt;
#define EN_JAM_ENABLE					1		// Jamming Remover enable&lt;br /&gt;
#define TEST_MODE_INACTIVE				0		// Test Mode inactive&lt;br /&gt;
#define TEST_MODE_ACTIVE				0x15	// Test Mode active&lt;br /&gt;
&lt;br /&gt;
// Data structure (starts at LAT_DEG):&lt;br /&gt;
#define DATA_STRUCT						LAT_DEG	// Start&lt;br /&gt;
// All data from LAT_DEG to HEARTBEAT (48 bytes):&lt;br /&gt;
#define DATA_LENGTH						(HEARTBEAT - LAT_DEG + 1)&lt;br /&gt;
// Basic data from LAT_DEG to SAT_N (13 bytes):&lt;br /&gt;
#define DATA_BASIC						(SAT_N - LAT_DEG + 1)&lt;br /&gt;
&lt;br /&gt;
typedef union {&lt;br /&gt;
 	uint8_t byte;&lt;br /&gt;
	struct {&lt;br /&gt;
		unsigned ns    :1;				// 1: North 0: South&lt;br /&gt;
		unsigned ew    :1;				// 1: East 0: West&lt;br /&gt;
		unsigned spu   :1;				// 1: km/h 0: kn&lt;br /&gt;
		unsigned auton :1;				// 1: Data not valid 0: Autonomous&lt;br /&gt;
		unsigned fix0  :1;&lt;br /&gt;
		unsigned fix1  :1;&lt;br /&gt;
		unsigned stat0 :1;				// Invalid&lt;br /&gt;
		unsigned stat1 :1;				// GPS Com Error&lt;br /&gt;
	};&lt;br /&gt;
	struct {&lt;br /&gt;
		unsigned ns    :1;				// 1: North 0: South&lt;br /&gt;
		unsigned ew    :1;				// 1: East 0: West&lt;br /&gt;
		unsigned spu   :1;				// 1: km/h 0: kn&lt;br /&gt;
		unsigned auton :1;				// 1: Data not valid 0: Autonomous&lt;br /&gt;
		unsigned fix   :2;&lt;br /&gt;
		unsigned stat  :2;				// 00 -&amp;gt; Valid&lt;br /&gt;
										// 01 -&amp;gt; Invalid&lt;br /&gt;
										// 10 -&amp;gt; GPS Com Error&lt;br /&gt;
										// 11 -&amp;gt; n. def.&lt;br /&gt;
	};&lt;br /&gt;
} status_t;&lt;br /&gt;
&lt;br /&gt;
typedef union {&lt;br /&gt;
 	uint8_t byte;&lt;br /&gt;
	struct {							// Fix indicator:&lt;br /&gt;
		unsigned fix_0  :1;				//  1: GPS fix          2: DGPS fix&lt;br /&gt;
		unsigned fix_1  :1;				//  3: PPS fix          4: RTK&lt;br /&gt;
		unsigned fix_2  :1;				//  5: Float RTK        6: Dead reck.&lt;br /&gt;
		unsigned fix_3  :1;				//  7: Manual inp. mode 8: Simul. mode&lt;br /&gt;
		unsigned unused :3;&lt;br /&gt;
		unsigned ui_fix :1;				// HW signal from UC530&lt;br /&gt;
	};&lt;br /&gt;
	struct {&lt;br /&gt;
		unsigned fix    :4;				// See above &amp;quot;Fix indicator&amp;quot;!&lt;br /&gt;
		unsigned unused :3;&lt;br /&gt;
		unsigned ui_fix :1;				// HW signal from UC530&lt;br /&gt;
	};&lt;br /&gt;
} fix_ind_t;&lt;br /&gt;
&lt;br /&gt;
typedef union {&lt;br /&gt;
	struct {&lt;br /&gt;
		uint8_t   latDeg;&lt;br /&gt;
		uint8_t   latMin;&lt;br /&gt;
		uint16_t  latMinDec;&lt;br /&gt;
		uint8_t   lonDeg;&lt;br /&gt;
		uint8_t   lonMin;&lt;br /&gt;
		uint16_t  lonMinDec;&lt;br /&gt;
		status_t  status;&lt;br /&gt;
		fix_ind_t fixInd;&lt;br /&gt;
		uint8_t   hdop;&lt;br /&gt;
		uint8_t   hdopDec;&lt;br /&gt;
		uint8_t   satCount;&lt;br /&gt;
		uint16_t  course;&lt;br /&gt;
		uint8_t   courseDec;&lt;br /&gt;
		uint16_t  speed;&lt;br /&gt;
		uint8_t   speedDec;&lt;br /&gt;
		uint16_t  altitude;&lt;br /&gt;
		uint16_t  altDif;&lt;br /&gt;
		uint8_t   utcHour;&lt;br /&gt;
		uint8_t   utcMinute;&lt;br /&gt;
		uint8_t   utcSec;&lt;br /&gt;
		uint8_t   day;&lt;br /&gt;
		uint16_t  year;&lt;br /&gt;
		uint8_t   month;&lt;br /&gt;
		uint8_t   pdop;&lt;br /&gt;
		uint8_t   pdopDec;&lt;br /&gt;
		uint8_t   vdop;&lt;br /&gt;
		uint8_t   vdopDec;&lt;br /&gt;
		uint8_t   sat[12];&lt;br /&gt;
		uint8_t   swVersion;&lt;br /&gt;
		uint8_t   heartbeat;&lt;br /&gt;
	};&lt;br /&gt;
} gpsdata_t;&lt;br /&gt;
extern gpsdata_t gpsdata;&lt;br /&gt;
&lt;br /&gt;
void I2C_GPS_reset(void);&lt;br /&gt;
void I2C_GPS_write_cmd(uint8_t, uint8_t);&lt;br /&gt;
uint8_t I2C_GPS_read_reg(uint8_t);&lt;br /&gt;
void I2C_GPS_read(uint8_t);&lt;br /&gt;
void I2C_GPS_init(void);&lt;br /&gt;
void I2C_GPS_new_addr(uint8_t);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
/******************************************************************************&lt;br /&gt;
 * Additional info&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Changelog:&lt;br /&gt;
 * &lt;br /&gt;
 *  ---&amp;gt; changes are documented in the file &amp;quot;RP6M256_I2C_GPSLib.c&amp;quot;&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
======Libary Source======&lt;br /&gt;
Datei: RP6M256_I2C_GPSLib.c&lt;br /&gt;
&amp;lt;pre&amp;gt;/* ****************************************************************************&lt;br /&gt;
 *                           _______________________&lt;br /&gt;
 *                           \| RP6  ROBOT SYSTEM |/&lt;br /&gt;
 *                            \_-_-_-_-_-_-_-_-_-_/           &amp;gt;&amp;gt;&amp;gt; RP6 M256 WIFI&lt;br /&gt;
 * ----------------------------------------------------------------------------&lt;br /&gt;
 * ----------------------------- [c]2014 - Dirk -------------------------------&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * File: RP6M256_I2C_GPSLib.c&lt;br /&gt;
 * Version: 1.0&lt;br /&gt;
 * Target: RP6 M256 WIFI - ATMEGA2560 @16.00MHz&lt;br /&gt;
 *         and a RP6 I2C GPS Receiver (CONRAD 1082385)&lt;br /&gt;
 *         optionally on a RP6 Sensor Board (CONRAD 1082384)&lt;br /&gt;
 * Author(s): Dirk&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Description:&lt;br /&gt;
 * &lt;br /&gt;
 * This is our new Library that contains basic routines and functions for&lt;br /&gt;
 * accessing the RP6 I2C GPS Receiver JM3-GPS (CONRAD 1082385).&lt;br /&gt;
 * The library assumes the I2C GPS Receiver software (firmware) v1.2.&lt;br /&gt;
 * If the I2C GPS Receiver is located on the RP6 Sensor Board (CONRAD 1082384)&lt;br /&gt;
 * and connected to the I2C-MODULE plug M1, the RP6M256_Sensor_BoardLib has to&lt;br /&gt;
 * be included!&lt;br /&gt;
 * &lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Includes:&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6M256_I2C_GPSLib.h&amp;quot; 		&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Variables:&lt;br /&gt;
&lt;br /&gt;
uint8_t gpsdataBuf[DATA_LENGTH + 1]; &lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Software reset for the I2C GPS Receiver.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void I2C_GPS_reset(void)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_GPS_RECEIVER_ADR, 0, 0x06);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Writes a command cmd to a register reg of the&lt;br /&gt;
 * I2C GPS Receiver.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: reg -&amp;gt; Write register [0x90..0x96]&lt;br /&gt;
 *        cmd -&amp;gt; Command&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void I2C_GPS_write_cmd(uint8_t reg, uint8_t cmd)&lt;br /&gt;
{&lt;br /&gt;
	if((reg &amp;lt; INIT_CFG) || (reg &amp;gt; TEST_MODE)) return;&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_GPS_RECEIVER_ADR, reg, cmd);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Reads a single register reg from the I2C GPS&lt;br /&gt;
 * Receiver.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: reg -&amp;gt; Read register [0x20..0x50]&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
uint8_t I2C_GPS_read_reg(uint8_t reg)&lt;br /&gt;
{&lt;br /&gt;
	if((reg &amp;lt; WHO_AM_I) || (reg &amp;gt; HEARTBEAT)) reg = WHO_AM_I;&lt;br /&gt;
	I2CTWI_transmitByte(I2C_GPS_RECEIVER_ADR, reg);&lt;br /&gt;
	return (I2CTWI_readByte(I2C_GPS_RECEIVER_ADR));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
gpsdata_t gpsdata;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Reads the GPS data from the I2C GPS Receiver.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: length -&amp;gt; Number of data bytes [1..48]&lt;br /&gt;
 *&lt;br /&gt;
 * Hint: If length = DATA_BASIC, only basic GPS&lt;br /&gt;
 *       data are read. If length = DATA_LENGTH,&lt;br /&gt;
 *       ALL GPS data are read.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void I2C_GPS_read(uint8_t length)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t i;&lt;br /&gt;
&lt;br /&gt;
	if(length &amp;gt; DATA_LENGTH) length = DATA_LENGTH;&lt;br /&gt;
	I2CTWI_readRegisters(I2C_GPS_RECEIVER_ADR, DATA_STRUCT, gpsdataBuf, length);&lt;br /&gt;
	for(i = length; i &amp;lt; DATA_LENGTH; i++) {&lt;br /&gt;
		gpsdataBuf[i] = 0;&lt;br /&gt;
	}&lt;br /&gt;
	gpsdata.latDeg = gpsdataBuf[0];&lt;br /&gt;
	gpsdata.latMin = gpsdataBuf[1];&lt;br /&gt;
	gpsdata.latMinDec = gpsdataBuf[2] + (gpsdataBuf[3] &amp;lt;&amp;lt; 8);&lt;br /&gt;
	gpsdata.lonDeg = gpsdataBuf[4];&lt;br /&gt;
	gpsdata.lonMin = gpsdataBuf[5];&lt;br /&gt;
	gpsdata.lonMinDec = gpsdataBuf[6] + (gpsdataBuf[7] &amp;lt;&amp;lt; 8);&lt;br /&gt;
	gpsdata.status.byte = gpsdataBuf[8];&lt;br /&gt;
	gpsdata.fixInd.byte = gpsdataBuf[9];&lt;br /&gt;
	gpsdata.hdop = gpsdataBuf[10];&lt;br /&gt;
	gpsdata.hdopDec = gpsdataBuf[11];&lt;br /&gt;
	gpsdata.satCount = gpsdataBuf[12];&lt;br /&gt;
	if(length == DATA_BASIC) return;&lt;br /&gt;
	gpsdata.course = gpsdataBuf[13] + (gpsdataBuf[14] &amp;lt;&amp;lt; 8);&lt;br /&gt;
	gpsdata.courseDec = gpsdataBuf[15];&lt;br /&gt;
	gpsdata.speed = gpsdataBuf[16] + (gpsdataBuf[17] &amp;lt;&amp;lt; 8);&lt;br /&gt;
	gpsdata.speedDec = gpsdataBuf[18];&lt;br /&gt;
	gpsdata.altitude = gpsdataBuf[19] + (gpsdataBuf[20] &amp;lt;&amp;lt; 8);&lt;br /&gt;
	gpsdata.altDif = gpsdataBuf[21] + (gpsdataBuf[22] &amp;lt;&amp;lt; 8);&lt;br /&gt;
	gpsdata.utcHour = gpsdataBuf[23];&lt;br /&gt;
	gpsdata.utcMinute = gpsdataBuf[24];&lt;br /&gt;
	gpsdata.utcSec = gpsdataBuf[25];&lt;br /&gt;
	gpsdata.day = gpsdataBuf[26];&lt;br /&gt;
	gpsdata.year = gpsdataBuf[27] + (gpsdataBuf[28] * 100);&lt;br /&gt;
	gpsdata.month = gpsdataBuf[29];&lt;br /&gt;
	gpsdata.pdop = gpsdataBuf[30];&lt;br /&gt;
	gpsdata.pdopDec = gpsdataBuf[31];&lt;br /&gt;
	gpsdata.vdop = gpsdataBuf[32];&lt;br /&gt;
	gpsdata.vdopDec = gpsdataBuf[33];&lt;br /&gt;
	for(i = 34; i &amp;lt; 46; i++) {&lt;br /&gt;
		gpsdata.sat[i - 34] = gpsdataBuf[i];&lt;br /&gt;
	}&lt;br /&gt;
	gpsdata.swVersion = gpsdataBuf[46];&lt;br /&gt;
	gpsdata.heartbeat = gpsdataBuf[47];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * You MUST call this function at the beginning of a&lt;br /&gt;
 * main program, that uses the RP6 I2C GPS Receiver. &lt;br /&gt;
 * If SENSOR_BOARD is defined, the I2C-MODULE power&lt;br /&gt;
 * will be switched on with the function&lt;br /&gt;
 * setI2CModulePower() defined in the&lt;br /&gt;
 * RP6M256_Sensor_BoardLib, which will be included&lt;br /&gt;
 * then.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void I2C_GPS_init(void)&lt;br /&gt;
{&lt;br /&gt;
#ifdef SENSOR_BOARD&lt;br /&gt;
	// I2C-MODULE (plug M1) power on: &lt;br /&gt;
	setI2CModulePower(1);&lt;br /&gt;
#endif&lt;br /&gt;
	// Other init procedures here!&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Writes a new I2C address to the I2C GPS Receiver.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: addr -&amp;gt; New I2C address [0xc8..0xde]&lt;br /&gt;
 *&lt;br /&gt;
 * Hints: - Default I2C address is 0xc8.&lt;br /&gt;
 *        - You may choose a new I2C address in&lt;br /&gt;
 *          the range 0xc8..0xde.&lt;br /&gt;
 *        - After writing a new address you have&lt;br /&gt;
 *          to switch the I2C GPS Receiver off&lt;br /&gt;
 *          and on again.&lt;br /&gt;
 *        - Definition I2C_GPS_RECEIVER_ADR must&lt;br /&gt;
 *          be adapted to the new I2C address!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void I2C_GPS_new_addr(uint8_t addr)&lt;br /&gt;
{&lt;br /&gt;
	if((addr &amp;lt; 0xc8) || (addr &amp;gt; 0xde)) return;&lt;br /&gt;
	addr &amp;amp;= 0xfe;								// Clear R/W bit&lt;br /&gt;
	I2CTWI_transmit3Bytes(I2C_GPS_RECEIVER_ADR, 0, 0x04, addr);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&lt;br /&gt;
/******************************************************************************&lt;br /&gt;
 * Additional info&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Changelog:&lt;br /&gt;
 * - v. 1.0 (initial release) 21.04.2014 by Dirk&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Erklärung&lt;br /&gt;
&lt;br /&gt;
======Demo======&lt;br /&gt;
makefile:&lt;br /&gt;
&amp;lt;pre&amp;gt;...&lt;br /&gt;
TARGET = RP6M256_Sensor_Board_02&lt;br /&gt;
...&lt;br /&gt;
SRC += $(RP6_LIB_PATH)/RP6common/RP6I2CmasterTWI.c&lt;br /&gt;
&lt;br /&gt;
SRC += $(RP6_LIB_PATH)/RP6control_M256_WIFI/RP6M256_Sensor_BoardLib.c&lt;br /&gt;
SRC += $(RP6_LIB_PATH)/RP6control_M256_WIFI/RP6M256_I2C_GPSLib.c&lt;br /&gt;
...&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Datei: RP6M256_Sensor_Board_02.c&lt;br /&gt;
&amp;lt;pre&amp;gt;/* &lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * RP6 ROBOT SYSTEM - RP6 CONTROL M256 Examples&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Example: RP6M256 Sensor Board&lt;br /&gt;
 * Author(s): Dirk&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Description:&lt;br /&gt;
 * In this example we show a second test for the RP6 Sensor Board.&lt;br /&gt;
 * &lt;br /&gt;
 * ############################################################################&lt;br /&gt;
 * The Robot does NOT move in this example! You can simply put it on a table&lt;br /&gt;
 * next to your PC and you should connect it to the PC via the USB Interface!&lt;br /&gt;
 * You should also connect to it via WIFI.&lt;br /&gt;
 * ############################################################################&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Includes:&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6M256Lib.h&amp;quot; 				// The RP6 M256 Library. &lt;br /&gt;
										// Always needs to be included!&lt;br /&gt;
#include &amp;quot;RP6I2CmasterTWI.h&amp;quot;			// Include the I2C-Bus Master Library&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Include our new &amp;quot;RP6M256 I2C GPS Receiver library&amp;quot;:&lt;br /&gt;
// (This is the library for accessing the RP6 I2C GPS Receiver!)&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6M256_I2C_GPSLib.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Write a floating point number to the WIFI.&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *&lt;br /&gt;
 *			// Write a floating point number to the WIFI (no exponent):&lt;br /&gt;
 *			writeDouble_WIFI(1234567.890, 11, 3);&lt;br /&gt;
 *&lt;br /&gt;
 * The value of prec (precision) defines the number of decimal places.&lt;br /&gt;
 * For 32 bit floating point variables (float, double ...) 6 is&lt;br /&gt;
 * the max. value for prec (7 relevant digits).&lt;br /&gt;
 * The value of width defines the overall number of characters in the&lt;br /&gt;
 * floating point number including the decimal point. The number of&lt;br /&gt;
 * pre-decimal positions is: (width - prec - 1).&lt;br /&gt;
 */&lt;br /&gt;
void writeDouble_WIFI(double number, uint8_t width, uint8_t prec)&lt;br /&gt;
{char buffer[width + 1];&lt;br /&gt;
	dtostrf(number, width, prec, &amp;amp;buffer[0]);&lt;br /&gt;
	writeString_WIFI(&amp;amp;buffer[0]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Write a floating point number to the LCD.&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *&lt;br /&gt;
 *			// Write a floating point number to the LCD (no exponent):&lt;br /&gt;
 *			writeDoubleLCD(1234567.890, 11, 3);&lt;br /&gt;
 *&lt;br /&gt;
 * The value of prec (precision) defines the number of decimal places.&lt;br /&gt;
 * For 32 bit floating point variables (float, double ...) 6 is&lt;br /&gt;
 * the max. value for prec (7 relevant digits).&lt;br /&gt;
 * The value of width defines the overall number of characters in the&lt;br /&gt;
 * floating point number including the decimal point. The number of&lt;br /&gt;
 * pre-decimal positions is: (width - prec - 1).&lt;br /&gt;
 */&lt;br /&gt;
void writeDoubleLCD(double number, uint8_t width, uint8_t prec)&lt;br /&gt;
{char buffer[width + 1];&lt;br /&gt;
	dtostrf(number, width, prec, &amp;amp;buffer[0]);&lt;br /&gt;
	writeStringLCD(&amp;amp;buffer[0]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Error handler&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function gets called automatically if there was an I2C Error like&lt;br /&gt;
 * the slave sent a &amp;quot;not acknowledge&amp;quot; (NACK, error codes e.g. 0x20 or 0x30).&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void I2C_transmissionError(uint8_t errorState)&lt;br /&gt;
{&lt;br /&gt;
	writeString_P_WIFI(&amp;quot;\nI2C ERROR - TWI STATE: 0x&amp;quot;);&lt;br /&gt;
	writeInteger_WIFI(errorState, HEX);&lt;br /&gt;
	writeChar_WIFI('\n');&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Main function - The program starts here:&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
	initRP6M256();    // Always call this first! The Processor will not work&lt;br /&gt;
					  // correctly otherwise. &lt;br /&gt;
&lt;br /&gt;
	initLCD(); // Initialize the LC-Display (LCD)&lt;br /&gt;
			   // Always call this before using the LCD!&lt;br /&gt;
&lt;br /&gt;
	setLEDs(0b1111);&lt;br /&gt;
	mSleep(500);&lt;br /&gt;
	setLEDs(0b0000);&lt;br /&gt;
&lt;br /&gt;
	writeString_P_WIFI(&amp;quot;\n\nRP6 Sensor Board Selftest 2!\n&amp;quot;); &lt;br /&gt;
&lt;br /&gt;
	// IMPORTANT:&lt;br /&gt;
	I2CTWI_initMaster(100); // Initialize the TWI Module for Master operation&lt;br /&gt;
							// with 100kHz SCL Frequency&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	// Register the event handler:&lt;br /&gt;
	I2CTWI_setTransmissionErrorHandler(I2C_transmissionError);&lt;br /&gt;
&lt;br /&gt;
	setLEDs(0b1111);&lt;br /&gt;
&lt;br /&gt;
	// Write a text message to the LCD:&lt;br /&gt;
	showScreenLCD(&amp;quot;################&amp;quot;, &amp;quot;################&amp;quot;);&lt;br /&gt;
	mSleep(1500);&lt;br /&gt;
	showScreenLCD(&amp;quot;RP6v2-M256-WIFI &amp;quot;, &amp;quot;Example Program&amp;quot;);&lt;br /&gt;
	mSleep(2500); &lt;br /&gt;
	showScreenLCD(&amp;quot;RP6 Sensor Board&amp;quot;, &amp;quot;   Selftest 2&amp;quot;);&lt;br /&gt;
	mSleep(2500);&lt;br /&gt;
	clearLCD();&lt;br /&gt;
&lt;br /&gt;
	setLEDs(0b0000);&lt;br /&gt;
&lt;br /&gt;
	// ---------------------------------------&lt;br /&gt;
&lt;br /&gt;
	uint8_t onoff = 0;&lt;br /&gt;
	uint8_t i;&lt;br /&gt;
&lt;br /&gt;
	startStopwatch1();&lt;br /&gt;
	startStopwatch2();&lt;br /&gt;
&lt;br /&gt;
	// IMPORTANT:&lt;br /&gt;
	sensor_board_init();						// RP6 Sensor Board init!!!&lt;br /&gt;
	I2C_GPS_init();								// RP6 I2C GPS Receiver init&lt;br /&gt;
&lt;br /&gt;
	while(true) &lt;br /&gt;
	{&lt;br /&gt;
		if(getStopwatch1() &amp;gt; 1000) // 1s&lt;br /&gt;
		{&lt;br /&gt;
			if (onoff) onoff = 0;&lt;br /&gt;
			else onoff = 1;&lt;br /&gt;
&lt;br /&gt;
			// Show GPS data:&lt;br /&gt;
			I2C_GPS_read(DATA_LENGTH);			// Read data&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nLAT_DEG:     &amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.latDeg, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;° &amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.latMin, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;.&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.latMinDec, DEC, 4);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;' &amp;quot;);&lt;br /&gt;
			if(gpsdata.status.ns)&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;N&amp;quot;);&lt;br /&gt;
			else&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;S&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nLON_DEG:    &amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.lonDeg, DEC, 3);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;° &amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.lonMin, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;.&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.lonMinDec, DEC, 4);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;' &amp;quot;);&lt;br /&gt;
			if(gpsdata.status.ew)&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;E&amp;quot;);&lt;br /&gt;
			else&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;W&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nSTATUS:     &amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.status.byte, BIN, 8);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nFIX_IND:    &amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.fixInd.byte, BIN, 8);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nHDOP:       &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(gpsdata.hdop, DEC);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;.&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.hdopDec, DEC, 2);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nSAT_N:      &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(gpsdata.satCount, DEC);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nCOURSE_T:   &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(gpsdata.course, DEC);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;.&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.courseDec, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;°&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nSPEED:      &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(gpsdata.speed, DEC);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;.&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.speedDec, DEC, 2);&lt;br /&gt;
			if(gpsdata.status.spu)&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;km/h&amp;quot;);&lt;br /&gt;
			else&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;kn&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nALT:        &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(gpsdata.altitude, DEC);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;m\nALT_DIF:    &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(gpsdata.altDif, DEC);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;m\nUTC:        &amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.utcHour, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;:&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.utcMinute, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;:&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.utcSec, DEC, 2);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nDATE:       &amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.day, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;.&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.month, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;.&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.year, DEC, 4);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nPDOP:       &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(gpsdata.pdop, DEC);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;.&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.pdopDec, DEC, 2);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nVDOP:       &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(gpsdata.vdop, DEC);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;.&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.vdopDec, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			for(i = 0; i &amp;lt; gpsdata.satCount; i++) {&lt;br /&gt;
				if(i == 8) writeString_P_WIFI(&amp;quot;\n&amp;quot;);&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;  SAT_&amp;quot;);&lt;br /&gt;
				writeIntegerLength_WIFI(i + 1, HEX, 1);&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;: &amp;quot;);&lt;br /&gt;
				writeInteger_WIFI(gpsdata.sat[i], DEC);&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nSW_VERSION: &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(gpsdata.swVersion, DEC);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nHEARTBEAT:  &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(gpsdata.heartbeat, DEC);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			// RP6 Sensor Board shutdown (button &amp;amp; status LED test):&lt;br /&gt;
			if (pressedButton) {&lt;br /&gt;
				setStatusLED(1);&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;\nPress button again for RP6 Sensor Board SHUTDOWN!\n&amp;quot;);&lt;br /&gt;
				mSleep(2000);&lt;br /&gt;
				do {&lt;br /&gt;
					if(getStopwatch2() &amp;gt; 200) { // 0.2s&lt;br /&gt;
						if (onoff) onoff = 0;&lt;br /&gt;
						else onoff = 1;&lt;br /&gt;
						if (onoff) setStatusLED(1);&lt;br /&gt;
						else setStatusLED(0);&lt;br /&gt;
						setStopwatch2(0);&lt;br /&gt;
					}&lt;br /&gt;
					mSleep(1);&lt;br /&gt;
					task_I2CTWI();&lt;br /&gt;
				} while (!readButton());&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;\n\n\n\n\nPlease wait for RP6 Sensor Board SHUTDOWN...\n&amp;quot;);&lt;br /&gt;
				sensor_board_shutdown();&lt;br /&gt;
				mSleep(3000);&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;\n\n\nThe RP6 Sensor Board now is in SHUTDOWN MODE!!!\n&amp;quot;);&lt;br /&gt;
				mSleep(1000);&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;\nRESET the M256 microcontroller now...\n\n&amp;quot;);&lt;br /&gt;
				while(true) {};&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			setStopwatch1(0);&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		task_RP6SensorBoard();					// RP6 Sensor Board task&lt;br /&gt;
&lt;br /&gt;
		task_I2CTWI();&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Erklärung&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Gyro Modul JM3-GYRO====&lt;br /&gt;
=====Dokumentation=====&lt;br /&gt;
Die Dokumentation zum Gyro Modul befindet sich auf der mitgelieferten ''&amp;quot;RP6 Robot System Xtra Modules CD-ROM&amp;quot;''.&lt;br /&gt;
&lt;br /&gt;
======Manuals======&lt;br /&gt;
Das Handbuch in der aktuellen Version kann [http://www.jm3-engineering.com/download/doc/ManualGyroModule_de.pdf hier] eingesehen werden.&lt;br /&gt;
&lt;br /&gt;
=====Demo-Programme=====&lt;br /&gt;
Ein Demo-Programm zum Gyro Modul befindet sich integriert in die RP6 Sensor Board Demo auf der mitgelieferten ''&amp;quot;RP6 Robot System Xtra Modules CD-ROM&amp;quot;''. Diese Demo kann auch in der aktuellen Version im Download Bereich von [http://www.jm3-engineering.com/downloads.htm JM3 Engineering] herunter geladen werden.&lt;br /&gt;
&lt;br /&gt;
=====Analoge Auswertung=====&lt;br /&gt;
Am Pin ''OUT'' des Gyro Moduls (siehe [http://www.rn-wissen.de/index.php/RP6_Sensor_Board_und_Xtra_Module#Anschluss-Schema_2 Anschluss-Schema]!) liegt die Ausgangsspannung des Sensors (0..5V) an. Sie kann mit einem ADC-Eingang eines Microcontrollers gemessen werden.&lt;br /&gt;
Syntax mit den Libraries der RP6Base, M32 oder M256 WiFi (ADC Kanal 0):&lt;br /&gt;
 uint16_t result = readADC(0);&lt;br /&gt;
In der C-Control-Pro Umgebung der M128 sieht das z.B. in CompactC so aus (ADC Kanal 0):&lt;br /&gt;
 word result;&lt;br /&gt;
 ADC_Set(ADC_VREF_VCC, 0);&lt;br /&gt;
 ...&lt;br /&gt;
 result = ADC_Read();&lt;br /&gt;
Das Ergebnis ''result'' kann noch zur Weiterverarbeitung angepasst werden:&lt;br /&gt;
 #define ADCVAL_ZERORATE_LEVEL			511		// Zero rate Level&lt;br /&gt;
 ...&lt;br /&gt;
 int16_t z_axisg = result - ADCVAL_ZERORATE_LEVEL;&lt;br /&gt;
Dadurch zeigt ''z_axisg'' Null an, wenn keine Rotation anliegt und wird positiv, wenn nach LINKS gedreht wird und negativ bei RECHTS-Drehung. Die Definition ADCVAL_ZERORATE_LEVEL muss natürlich an den eigenen Sensor-Nullwert angepasst werden.&lt;br /&gt;
&lt;br /&gt;
Aus dem Absolutwert von ''z_axisg'' kann man die Drehrate (Drehgeschwindigkeit) auch bestimmen:&lt;br /&gt;
&lt;br /&gt;
In den [[RP6_Sensor_Board_und_Xtra_Module#Technische_Daten_3|Technischen Daten]] ist die Empfindlichkeit des Sensors mit '''10mV/dps''' (0,01V pro Grad und Sekunde) angegeben. Damit errechnet sich die Drehrate als:&lt;br /&gt;
 Drehrate [dps] = abs(z_axisg) * (5 / 1024 / 0.01) = abs(z_axisg) * 0.48828125&lt;br /&gt;
&lt;br /&gt;
=====Optionale Ansteuerung=====&lt;br /&gt;
Im [[RP6_Sensor_Board_und_Xtra_Module#Anschluss-Schema_2|Anschluss-Schema]] ist erkennbar, dass es noch 2 Steuerleitungen ''SLEEP/PD'' und ''ST'' gibt. Mit diesen Anschlüssen kann die Betriebsart des Gyro Moduls festgelegt werden, siehe nachfolgende Tabelle:&lt;br /&gt;
{|  {{Blauetabelle}} &lt;br /&gt;
|Betriebsart&lt;br /&gt;
|ST&lt;br /&gt;
|SLEEP/PD&lt;br /&gt;
|Stromverbrauch&lt;br /&gt;
|-&lt;br /&gt;
|Normal&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|4,2mA&lt;br /&gt;
|-&lt;br /&gt;
|Sleep&lt;br /&gt;
|0&lt;br /&gt;
|1&lt;br /&gt;
|2,2mA&lt;br /&gt;
|-&lt;br /&gt;
|Self-test&lt;br /&gt;
|1&lt;br /&gt;
|0&lt;br /&gt;
|4,2mA&lt;br /&gt;
|-&lt;br /&gt;
|Power-down&lt;br /&gt;
|1&lt;br /&gt;
|1&lt;br /&gt;
|'''5µA'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
Will man zwischen den Betriebsarten per Software umschalten, muss man die beiden Steuerleitungen mit I/O Portpins des Microcontrollers verbinden, die als Ausgänge konfiguriert sind. Braucht man diese Funktion nicht, reicht es, ''ST'' und ''SLEEP/PD'' mit GND zu verbinden (Betriebsart &amp;quot;Normal&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====3D Accelerometer Modul JM3-3DA====&lt;br /&gt;
Das 3D Accelerometer Modul kann über den I2C- oder den SPI-Bus angesteuert werden. Wird das Modul auf der RP6 CONTROL M32 Platine betrieben (es sitzt also auf dem Sockel IC5 für das 2. SPI-EEPROM), dann erfolgt die Ansteuerung über den SPI-Bus. Die SPI-Grundfunktionen befinden sich in der RP6ControlLib, die daher eingebunden werden muss.&lt;br /&gt;
&lt;br /&gt;
=====Dokumentation=====&lt;br /&gt;
Die Dokumentation zum 3D Accelerometer Modul befindet sich auf der mitgelieferten ''&amp;quot;RP6 Robot System Xtra Modules CD-ROM&amp;quot;''.&lt;br /&gt;
&lt;br /&gt;
======Manuals======&lt;br /&gt;
Das Handbuch in der aktuellen Version kann [http://www.jm3-engineering.com/download/doc/Manual3DAccelerometer_de.pdf hier] eingesehen werden.&lt;br /&gt;
&lt;br /&gt;
=====Demo-Programme=====&lt;br /&gt;
Ein Demo-Programm zum 3D Accelerometer Modul befindet sich integriert in die RP6 Sensor Board Demo auf der mitgelieferten ''&amp;quot;RP6 Robot System Xtra Modules CD-ROM&amp;quot;''. Diese Demo kann auch in der aktuellen Version im Download Bereich von [http://www.jm3-engineering.com/downloads.htm JM3 Engineering] herunter geladen werden.&lt;br /&gt;
&lt;br /&gt;
=====RP6 CONTROL M32: ACCSENS Library=====&lt;br /&gt;
Die nachfolgende RP6ControlACCSENSLib (Eigenentwicklung in GCC) dient zur Ansteuerung des 3D Accelerometer Moduls durch die RP6 CONTROL M32.&lt;br /&gt;
&lt;br /&gt;
======Configuration Header======&lt;br /&gt;
Vor dem Kompilieren der Library muss eine Anpassung des Configuration Headers an die eigenen Hardware-Voraussetzungen erfolgen.&lt;br /&gt;
Dazu gibt es im Configuration Header eine Definition:&lt;br /&gt;
* EXP_STACK_1 -&amp;gt; Die RP6 CONTROL M32 sitzt auf dem vorderen Platinenstapel 1 des RP6&lt;br /&gt;
Im nachfolgenden Listing ist die Definition EXP_STACK_1 NICHT aktiv (d.h. die M32 sitzt auf dem hinteren Platinenstapel 2!). Dies muss an die eigene Hardware angepaßt werden. Wenn die RP6 CONTROL M32 auf dem vorderen Platinenstapel 1 des RP6 sitzt, muss die Zeile mit &amp;quot;EXP_STACK_1&amp;quot; &amp;quot;aktiviert&amp;quot; werden. Dazu entfernt man &amp;quot;//&amp;quot; am Zeilenanfang:&lt;br /&gt;
 #define EXP_STACK_1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Bevor man den Beschleunigungssensor nutzen kann, muss man ihn kalibrieren:&lt;br /&gt;
&lt;br /&gt;
'''Accelerometer:'''&lt;br /&gt;
* Die X-Achse wird kalibriert, indem man den RP6 mit der rechten Seite nach unten hält und den Maximalwert in MAX_X_A einträgt. Dann neigt man ihn auf seine linke Seite und trägt den negativen Maximalwert in MIN_X_A ein.&lt;br /&gt;
* Die Y-Achse wird kalibriert, indem man den RP6 mit der Vorderseite nach oben hält und den Maximalwert in MAX_Y_A einträgt. Dann kippt man die Vorderseite nach unten und trägt den negativen Maximalwert in MIN_Y_A ein.&lt;br /&gt;
* Die Z-Achse wird kalibriert, indem man den RP6 normal waagerecht hält und den Maximalwert in MAX_Z_A einträgt. Dann dreht man den RP6 &amp;quot;auf den Kopf&amp;quot; und trägt den negativen Maximalwert in MIN_Z_A ein.&lt;br /&gt;
* Sollten die angezeigten Pitch- und Roll-Werte nach der Kalibrierung der Achsen und genau waagerecht stehendem Sensor bzw. RP6 vom Nullwert deutlich abweichen, kann man sie mithilfe der Definitionen OFFSET_PITCH_A und OFFSET_ROLL_A &amp;quot;nullen&amp;quot;. Die Einheit dieser Definitionen ist °.&lt;br /&gt;
Nach dem Eintragen der Kalibrierungswerte muss das Programm neu kompiliert werden!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Datei: RP6ControlACCSENS.h&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;/* ****************************************************************************&lt;br /&gt;
 *                           _______________________&lt;br /&gt;
 *                           \| RP6  ROBOT SYSTEM |/&lt;br /&gt;
 *                            \_-_-_-_-_-_-_-_-_-_/             &amp;gt;&amp;gt;&amp;gt; RP6 CONTROL&lt;br /&gt;
 * ----------------------------------------------------------------------------&lt;br /&gt;
 * ----------------------------- [c]2014 - Dirk -------------------------------&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * File: RP6ControlACCSENS.h&lt;br /&gt;
 * Version: 1.0&lt;br /&gt;
 * Target: RP6 CONTROL - ATMEGA32 @16.00MHz&lt;br /&gt;
 * Author(s): Dirk&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Description:&lt;br /&gt;
 * Configuration header file for new ACCSENS library.&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * THE CHANGELOG CAN BE FOUND AT THE END OF THIS FILE!&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
#ifndef RP6CONTROLACCSENS_H&lt;br /&gt;
#define RP6CONTROLACCSENS_H&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Sensor position on the RP6 robot:&lt;br /&gt;
// (If EXP_STACK_1 is defined, the RP6 CONTROL M32 is located on the front&lt;br /&gt;
//  stack for addon boards on the RP6 robot. If EXP_STACK_1 is NOT defined&lt;br /&gt;
//  (default), the RP6 CONTROL M32 is mounted on the rear stack.)&lt;br /&gt;
// -------------------&lt;br /&gt;
//#define EXP_STACK_1&lt;br /&gt;
// -------------------&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// The following sensor is used:&lt;br /&gt;
// - 3D Accelerometer Modul (CONRAD 1082387-62) with LIS302DLH 3-axis&lt;br /&gt;
//   accelerometer&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// LIS302DLH accelerometer calibration data:&lt;br /&gt;
#define MAX_X_A						32767		// Max. X-axis value&lt;br /&gt;
#define MIN_X_A						-32768		// Min. X-axis value&lt;br /&gt;
#define MAX_Y_A						32767		// Max. Y-axis value&lt;br /&gt;
#define MIN_Y_A						-32768		// Min. Y-axis value&lt;br /&gt;
#define MAX_Z_A						32767		// Max. Z-axis value&lt;br /&gt;
#define MIN_Z_A						-32768		// Min. Z-axis value&lt;br /&gt;
#define OFFSET_PITCH_A				0.0			// Offset Pitch [°]&lt;br /&gt;
#define OFFSET_ROLL_A				0.0			// Offset Roll [°]&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
/******************************************************************************&lt;br /&gt;
 * Additional info&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Changelog:&lt;br /&gt;
 * &lt;br /&gt;
 *  ---&amp;gt; changes are documented in the file &amp;quot;RP6ControlACCSENSLib.c&amp;quot;&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
======Library Header======&lt;br /&gt;
Datei: RP6ControlACCSENSLib.h&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;/* ****************************************************************************&lt;br /&gt;
 *                           _______________________&lt;br /&gt;
 *                           \| RP6  ROBOT SYSTEM |/&lt;br /&gt;
 *                            \_-_-_-_-_-_-_-_-_-_/             &amp;gt;&amp;gt;&amp;gt; RP6 CONTROL&lt;br /&gt;
 * ----------------------------------------------------------------------------&lt;br /&gt;
 * ----------------------------- [c]2014 - Dirk -------------------------------&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * File: RP6ControlACCSENSLib.h&lt;br /&gt;
 * Version: 1.0&lt;br /&gt;
 * Target: RP6 CONTROL - ATMEGA32 @16.00MHz&lt;br /&gt;
 * Author(s): Dirk&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Description:&lt;br /&gt;
 * This is the RP6ControlACCSENSLib header file.&lt;br /&gt;
 * You have to include this file, if you want to use the library&lt;br /&gt;
 * RP6ControlACCSENSLib.c in your own projects.&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * THE CHANGELOG CAN BE FOUND AT THE END OF THIS FILE!&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
#ifndef RP6CONTROLACCSENSLIB_H&lt;br /&gt;
#define RP6CONTROLACCSENSLIB_H&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Includes:&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6ControlLib.h&amp;quot; 		// The RP6 Control Library (v. 1.1 or higher). &lt;br /&gt;
#include &amp;quot;RP6ControlACCSENS.h&amp;quot;&lt;br /&gt;
#include &amp;lt;math.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&lt;br /&gt;
#define ACC_CS							MEM_CS2&lt;br /&gt;
#define DEVICE_IDENTIFIER				0x32&lt;br /&gt;
&lt;br /&gt;
// Registers:&lt;br /&gt;
#define WHO_AM_I						0x0f&lt;br /&gt;
#define CTRL_REG1						0x20&lt;br /&gt;
#define CTRL_REG2						0x21&lt;br /&gt;
#define CTRL_REG3						0x22&lt;br /&gt;
#define CTRL_REG4						0x23&lt;br /&gt;
#define CTRL_REG5						0x24&lt;br /&gt;
#define HP_FILTER_RESET					0x25&lt;br /&gt;
#define REFERENCE						0x26&lt;br /&gt;
#define STATUS_REG						0x27&lt;br /&gt;
#define OUT_X_L							0x28&lt;br /&gt;
#define OUT_X_H							0x29&lt;br /&gt;
#define OUT_Y_L							0x2a&lt;br /&gt;
#define OUT_Y_H							0x2b&lt;br /&gt;
#define OUT_Z_L							0x2c&lt;br /&gt;
#define OUT_Z_H							0x2d&lt;br /&gt;
#define INT1_CFG						0x30&lt;br /&gt;
#define INT1_SOURCE						0x31&lt;br /&gt;
#define INT1_THS						0x32&lt;br /&gt;
#define INT1_DURATION					0x33&lt;br /&gt;
#define INT2_CFG						0x34&lt;br /&gt;
#define INT2_SOURCE						0x35&lt;br /&gt;
#define INT2_THS						0x36&lt;br /&gt;
#define INT2_DURATION					0x37&lt;br /&gt;
&lt;br /&gt;
// Control Register bitmasks:&lt;br /&gt;
#define CTRL_REG1_POWERDOWN				0b00000000&lt;br /&gt;
#define CTRL_REG1_3D_DEFAULT			0b00000111&lt;br /&gt;
#define CTRL_REG1_3D_LOPWR_10HZ			0b11000111&lt;br /&gt;
#define CTRL_REG2_DEFAULT				0b00000000&lt;br /&gt;
#define CTRL_REG3_DEFAULT				0b00000000&lt;br /&gt;
#define CTRL_REG4_DEFAULT				0b00000000&lt;br /&gt;
#define CTRL_REG4_BDU_2G				0b10000000&lt;br /&gt;
#define CTRL_REG4_BDU_2G_STSIGN			0b10001000&lt;br /&gt;
#define CTRL_REG4_BDU_BLE_2G			0b11000000&lt;br /&gt;
#define CTRL_REG4_BDU_BLE_2G_STSIGN		0b11001000&lt;br /&gt;
#define CTRL_REG5_DEFAULT				0b00000000&lt;br /&gt;
&lt;br /&gt;
// Read/write address bitmasks:&lt;br /&gt;
#define READ_MASK						0b10000000&lt;br /&gt;
#define READ_AUTOINC_MASK				0b11000000&lt;br /&gt;
#define WRITE_MASK						0b01111111&lt;br /&gt;
&lt;br /&gt;
extern int16_t x_axisa, y_axisa, z_axisa;&lt;br /&gt;
extern double pitch, roll;&lt;br /&gt;
extern double xa, ya, za;&lt;br /&gt;
extern double the, phi;&lt;br /&gt;
&lt;br /&gt;
uint8_t SPI_ACCSENS_readByte(uint8_t regAddr);&lt;br /&gt;
void SPI_ACCSENS_readBytes(uint8_t startAddr, uint8_t *buffer, uint8_t length);&lt;br /&gt;
void SPI_ACCSENS_writeByte(uint8_t regAddr, uint8_t data);&lt;br /&gt;
uint8_t SPI_ACCSENS_getStatus(void);&lt;br /&gt;
&lt;br /&gt;
void SPI_ACCSENS_init(void);&lt;br /&gt;
void SPI_ACCSENS_shutdown(void);&lt;br /&gt;
void SPI_ACCSENS_read(void);&lt;br /&gt;
void SPI_ACCSENS_normalize(void);&lt;br /&gt;
void SPI_ACCSENS_position(void);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
/******************************************************************************&lt;br /&gt;
 * Additional info&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Changelog:&lt;br /&gt;
 * &lt;br /&gt;
 *  ---&amp;gt; changes are documented in the file &amp;quot;RP6ControlACCSENSLib.c&amp;quot;&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
======Library Source======&lt;br /&gt;
Datei: RP6ControlACCSENSLib.c&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;/* ****************************************************************************&lt;br /&gt;
 *                           _______________________&lt;br /&gt;
 *                           \| RP6  ROBOT SYSTEM |/&lt;br /&gt;
 *                            \_-_-_-_-_-_-_-_-_-_/             &amp;gt;&amp;gt;&amp;gt; RP6 CONTROL&lt;br /&gt;
 * ----------------------------------------------------------------------------&lt;br /&gt;
 * ----------------------------- [c]2014 - Dirk -------------------------------&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * File: RP6ControlACCSENSLib.c&lt;br /&gt;
 * Version: 1.0&lt;br /&gt;
 * Target: RP6 CONTROL - ATMEGA32 @16.00MHz&lt;br /&gt;
 *         with optional LC-Display 16x2 chars (CONRAD 190911-62)&lt;br /&gt;
 *         and a 3D Accelerometer Modul (CONRAD 1082387-62) (IC5)&lt;br /&gt;
 * Author(s): Dirk&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Description:&lt;br /&gt;
 * This is my RP6 Control ACCSENS Library. This library may be used to access&lt;br /&gt;
 * the basic functions of the 3D Accelerometer Modul. This RP6 Xtra module may&lt;br /&gt;
 * be placed on the IC5 socket on the RP6 CONTROL M32 instead of a second&lt;br /&gt;
 * EEPROM.&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * THE CHANGELOG CAN BE FOUND AT THE END OF THIS FILE!&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
 &lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Includes:&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6ControlACCSENSLib.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// SPI functions:&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Reads a single register from the 3D Accelerometer&lt;br /&gt;
 * Modul (ACCSENS).&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
uint8_t SPI_ACCSENS_readByte(uint8_t regAddr)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t data;&lt;br /&gt;
	regAddr |= READ_MASK;						// Read byte&lt;br /&gt;
	PORTB &amp;amp;= ~ACC_CS;&lt;br /&gt;
	writeSPI(regAddr);&lt;br /&gt;
	data = readSPI();&lt;br /&gt;
	PORTB |= ACC_CS;&lt;br /&gt;
	return data;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Reads &amp;quot;length&amp;quot; bytes into the buffer &amp;quot;buffer&amp;quot;&lt;br /&gt;
 * from startAddr on. &lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void SPI_ACCSENS_readBytes(uint8_t startAddr, uint8_t *buffer, uint8_t length)&lt;br /&gt;
{&lt;br /&gt;
	startAddr |= READ_AUTOINC_MASK;				// Read byte, auto increment&lt;br /&gt;
	PORTB &amp;amp;= ~ACC_CS;&lt;br /&gt;
	writeSPI(startAddr);&lt;br /&gt;
	readBufferSPI(&amp;amp;buffer[0], length);&lt;br /&gt;
	PORTB |= ACC_CS;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Write a single data byte to the specified sensor&lt;br /&gt;
 * address.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void SPI_ACCSENS_writeByte(uint8_t regAddr, uint8_t data)&lt;br /&gt;
{&lt;br /&gt;
	PORTB &amp;amp;= ~ACC_CS;&lt;br /&gt;
	writeSPI(regAddr);&lt;br /&gt;
	writeSPI(data);&lt;br /&gt;
	PORTB |= ACC_CS;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Returns sensor status register - for checking if&lt;br /&gt;
 * sensor is busy. &lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
uint8_t SPI_ACCSENS_getStatus(void)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t status;&lt;br /&gt;
	PORTB &amp;amp;= ~ACC_CS;&lt;br /&gt;
	writeSPI(STATUS_REG);&lt;br /&gt;
	status = readSPI();&lt;br /&gt;
	PORTB |= ACC_CS;&lt;br /&gt;
	return status;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// 3D accelerometer functions:&lt;br /&gt;
&lt;br /&gt;
int16_t x_axisa, y_axisa, z_axisa;&lt;br /&gt;
double pitch, roll;&lt;br /&gt;
double xa, ya, za;&lt;br /&gt;
double the, phi;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Initializes the sensor. You must call this&lt;br /&gt;
 * function at the beginning of a program, that&lt;br /&gt;
 * uses the 3D Accelerometer Modul.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void SPI_ACCSENS_init(void)&lt;br /&gt;
{&lt;br /&gt;
	// All axes enable, low power, 10Hz output data rate:&lt;br /&gt;
	SPI_ACCSENS_writeByte(CTRL_REG1, CTRL_REG1_3D_LOPWR_10HZ);&lt;br /&gt;
	// No update while reading, +- 2g, self-test minus:&lt;br /&gt;
	SPI_ACCSENS_writeByte(CTRL_REG4, CTRL_REG4_BDU_2G_STSIGN);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Sets the LIS302DLH power-down mode. If you&lt;br /&gt;
 * do not need the sensor, you can save energy&lt;br /&gt;
 * by using the sensor power-down mode.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void SPI_ACCSENS_shutdown(void)&lt;br /&gt;
{&lt;br /&gt;
	// LIS302DLH in power-down mode:&lt;br /&gt;
	SPI_ACCSENS_writeByte(CTRL_REG1, CTRL_REG1_POWERDOWN);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function reads the X-axis, Y-axis and Z-axis&lt;br /&gt;
 * values from the LIS302DLH accelerometer and stores&lt;br /&gt;
 * them in the global variables x_axisa, y_axisa and&lt;br /&gt;
 * z_axisa.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void SPI_ACCSENS_read(void)&lt;br /&gt;
{&lt;br /&gt;
#ifndef EXP_STACK_1&lt;br /&gt;
	// Default sensor position (M32 located on the RP6 rear stack):&lt;br /&gt;
	// xb = -y:&lt;br /&gt;
	x_axisa = SPI_ACCSENS_readByte(OUT_Y_L) | (SPI_ACCSENS_readByte(OUT_Y_H) &amp;lt;&amp;lt; 8);&lt;br /&gt;
	x_axisa *= -1;&lt;br /&gt;
	// yb = -x:&lt;br /&gt;
	y_axisa = SPI_ACCSENS_readByte(OUT_X_L) | (SPI_ACCSENS_readByte(OUT_X_H) &amp;lt;&amp;lt; 8);&lt;br /&gt;
	y_axisa *= -1;&lt;br /&gt;
	// zb = z:&lt;br /&gt;
	z_axisa = SPI_ACCSENS_readByte(OUT_Z_L) | (SPI_ACCSENS_readByte(OUT_Z_H) &amp;lt;&amp;lt; 8);&lt;br /&gt;
#else&lt;br /&gt;
	// Other sensor position (M32 located on the RP6 front stack):&lt;br /&gt;
	// xb = y:&lt;br /&gt;
	x_axisa = SPI_ACCSENS_readByte(OUT_Y_L) | (SPI_ACCSENS_readByte(OUT_Y_H) &amp;lt;&amp;lt; 8);&lt;br /&gt;
	// yb = x:&lt;br /&gt;
	y_axisa = SPI_ACCSENS_readByte(OUT_X_L) | (SPI_ACCSENS_readByte(OUT_X_H) &amp;lt;&amp;lt; 8);&lt;br /&gt;
	// zb = z:&lt;br /&gt;
	z_axisa = SPI_ACCSENS_readByte(OUT_Z_L) | (SPI_ACCSENS_readByte(OUT_Z_H) &amp;lt;&amp;lt; 8);&lt;br /&gt;
#endif&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function limits and normalizes the x-axisa,&lt;br /&gt;
 * y-axisa and z-axisa values read from the LIS302DLH&lt;br /&gt;
 * accelerometer with the function SPI_ACCSENS_read() and&lt;br /&gt;
 * stores them in the global double variables xa, ya and&lt;br /&gt;
 * za.&lt;br /&gt;
 * It also calculates the position in space in form of the&lt;br /&gt;
 * tilt angles (the = pitch, phi = roll) and stores them&lt;br /&gt;
 * in the global double variables the and phi.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void SPI_ACCSENS_normalize(void)&lt;br /&gt;
{&lt;br /&gt;
	// Limit raw values:&lt;br /&gt;
	if (x_axisa &amp;lt; MIN_X_A) x_axisa = MIN_X_A;&lt;br /&gt;
	if (x_axisa &amp;gt; MAX_X_A) x_axisa = MAX_X_A;&lt;br /&gt;
	if (y_axisa &amp;lt; MIN_Y_A) y_axisa = MIN_Y_A;&lt;br /&gt;
	if (y_axisa &amp;gt; MAX_Y_A) y_axisa = MAX_Y_A;&lt;br /&gt;
	if (z_axisa &amp;lt; MIN_Z_A) z_axisa = MIN_Z_A;&lt;br /&gt;
	if (z_axisa &amp;gt; MAX_Z_A) z_axisa = MAX_Z_A;&lt;br /&gt;
	xa = (double) x_axisa / 10000.0;&lt;br /&gt;
	ya = (double) y_axisa / 10000.0;&lt;br /&gt;
	za = (double) z_axisa / 10000.0;&lt;br /&gt;
	// Calculate Pitch and Roll:&lt;br /&gt;
	phi = asin(xa);								// Calculate the and phi&lt;br /&gt;
	the = asin(ya / cos(the));					//  from the raw values&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function calculates the position in space by&lt;br /&gt;
 * using the the and phi values (see function&lt;br /&gt;
 * SPI_ACCSENS_normalize()!). It stores the position&lt;br /&gt;
 * in the global double variables pitch and roll. &lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void SPI_ACCSENS_position(void)&lt;br /&gt;
{&lt;br /&gt;
	pitch = the * 180 / M_PI + OFFSET_PITCH_A;&lt;br /&gt;
	roll = phi * 180 / M_PI + OFFSET_ROLL_A;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/******************************************************************************&lt;br /&gt;
 * Additional info&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Changelog:&lt;br /&gt;
 * - v. 1.0 (initial release) 04.04.2014 by Dirk&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Erklärung&lt;br /&gt;
&lt;br /&gt;
======Demo======&lt;br /&gt;
makefile:&lt;br /&gt;
&amp;lt;pre&amp;gt;...&lt;br /&gt;
TARGET = RP6Control_01_ACCSENS&lt;br /&gt;
...&lt;br /&gt;
SRC += $(RP6_LIB_PATH)/RP6control/RP6ControlLib.c&lt;br /&gt;
SRC += $(RP6_LIB_PATH)/RP6common/RP6uart.c&lt;br /&gt;
SRC += $(RP6_LIB_PATH)/RP6control/RP6ControlACCSENSLib.c&lt;br /&gt;
...&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Datei: RP6Control_01_ACCSENS.c&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;// Uncommented Version of RP6Control_01_ACCSENS.c&lt;br /&gt;
// written by Dirk&lt;br /&gt;
// ------------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6ControlACCSENSLib.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void writeDouble(double number, uint8_t width, uint8_t prec)&lt;br /&gt;
{char buffer[width + 1];&lt;br /&gt;
	dtostrf(number, width, prec, &amp;amp;buffer[0]);&lt;br /&gt;
	writeString(&amp;amp;buffer[0]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void writeDoubleLCD(double number, uint8_t width, uint8_t prec)&lt;br /&gt;
{char buffer[width + 1];&lt;br /&gt;
	dtostrf(number, width, prec, &amp;amp;buffer[0]);&lt;br /&gt;
	writeStringLCD(&amp;amp;buffer[0]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
	initRP6Control();&lt;br /&gt;
&lt;br /&gt;
	writeString_P(&amp;quot;\n\nRP6Control SPI ACCSENS Test Program!\n&amp;quot;); &lt;br /&gt;
	setLEDs(0b1111);&lt;br /&gt;
	mSleep(50);&lt;br /&gt;
	initLCD(); &lt;br /&gt;
	showScreenLCD(&amp;quot;################&amp;quot;, &amp;quot;################&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
	showScreenLCD(&amp;quot;  SPI ACCSENS&amp;quot;, &amp;quot;  Test Program&amp;quot;);&lt;br /&gt;
	mSleep(1000);&lt;br /&gt;
	setLEDs(0b0000);&lt;br /&gt;
&lt;br /&gt;
	SPI_ACCSENS_init();&lt;br /&gt;
&lt;br /&gt;
	uint8_t whoami = SPI_ACCSENS_readByte(WHO_AM_I);&lt;br /&gt;
	writeString_P(&amp;quot;\nWHO AM I: &amp;quot;);&lt;br /&gt;
	writeInteger(whoami, HEX);&lt;br /&gt;
	writeChar('\n');&lt;br /&gt;
	mSleep(2000);&lt;br /&gt;
	&lt;br /&gt;
	startStopwatch1();&lt;br /&gt;
&lt;br /&gt;
	while(true) &lt;br /&gt;
	{&lt;br /&gt;
		if(getStopwatch1() &amp;gt; 1000)&lt;br /&gt;
		{&lt;br /&gt;
			SPI_ACCSENS_read();&lt;br /&gt;
			writeString_P(&amp;quot;\n3D Accelerometer SENSOR -&amp;gt;\n&amp;quot;);&lt;br /&gt;
			writeString_P(&amp;quot;X-axis: &amp;quot;);&lt;br /&gt;
			writeInteger(x_axisa, DEC);&lt;br /&gt;
			writeChar('\n');&lt;br /&gt;
			writeString_P(&amp;quot;Y-axis: &amp;quot;);&lt;br /&gt;
			writeInteger(y_axisa, DEC);&lt;br /&gt;
			writeChar('\n');&lt;br /&gt;
			writeString_P(&amp;quot;Z-axis: &amp;quot;);&lt;br /&gt;
			writeInteger(z_axisa, DEC);&lt;br /&gt;
			writeChar('\n');&lt;br /&gt;
			SPI_ACCSENS_normalize();&lt;br /&gt;
			SPI_ACCSENS_position();&lt;br /&gt;
			writeString_P(&amp;quot;POSITION: \n&amp;quot;);&lt;br /&gt;
			writeString_P(&amp;quot;  Pitch [°]: &amp;quot;);&lt;br /&gt;
			writeDouble(pitch, 6, 1);&lt;br /&gt;
			writeChar('\n');&lt;br /&gt;
			writeString_P(&amp;quot;  Roll [°]:  &amp;quot;);&lt;br /&gt;
			writeDouble(roll, 6, 1);&lt;br /&gt;
			writeChar('\n');&lt;br /&gt;
			setCursorPosLCD(0, 0);&lt;br /&gt;
			writeStringLCD_P(&amp;quot;P&amp;quot;);&lt;br /&gt;
			writeDoubleLCD(pitch, 6, 1);&lt;br /&gt;
			writeStringLCD_P(&amp;quot; &amp;quot;);&lt;br /&gt;
			setCursorPosLCD(0, 8);&lt;br /&gt;
			writeStringLCD_P(&amp;quot;R&amp;quot;);&lt;br /&gt;
			writeDoubleLCD(roll, 6, 1);&lt;br /&gt;
			writeStringLCD_P(&amp;quot; &amp;quot;);&lt;br /&gt;
			setCursorPosLCD(1, 0);&lt;br /&gt;
			writeStringLCD_P(&amp;quot;X&amp;quot;);&lt;br /&gt;
			writeIntegerLCD(x_axisa, DEC);&lt;br /&gt;
			writeStringLCD_P(&amp;quot;   &amp;quot;);&lt;br /&gt;
			setCursorPosLCD(1, 5);&lt;br /&gt;
			writeStringLCD_P(&amp;quot;Y&amp;quot;);&lt;br /&gt;
			writeIntegerLCD(y_axisa, DEC);&lt;br /&gt;
			writeStringLCD_P(&amp;quot;   &amp;quot;);&lt;br /&gt;
			setCursorPosLCD(1, 10);&lt;br /&gt;
			writeStringLCD_P(&amp;quot;Z&amp;quot;);&lt;br /&gt;
			writeIntegerLCD(z_axisa, DEC);&lt;br /&gt;
			writeStringLCD_P(&amp;quot;    &amp;quot;);&lt;br /&gt;
			mSleep(2000);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Erklärung&lt;br /&gt;
&lt;br /&gt;
====BHT Modul JM3-BHT31====&lt;br /&gt;
Dieses Modul zur Messung von Luftdruck, Luftfeuchte und Temperatur ist seit dem 22.01.2015 lieferbar.&lt;br /&gt;
&lt;br /&gt;
=====Dokumentation=====&lt;br /&gt;
Die Dokumentation zum BHT Modul befindet sich auf der mitgelieferten ''&amp;quot;ASURO xTend-On CD-ROM&amp;quot;''.&lt;br /&gt;
&lt;br /&gt;
======Manuals======&lt;br /&gt;
Das Handbuch in der aktuellen Version kann [http://www.jm3-engineering.com/download/doc/ManualAsuroBHT_de.pdf hier] eingesehen werden.&lt;br /&gt;
&lt;br /&gt;
=====Demo-Programme=====&lt;br /&gt;
Ein Demo-Programm zum BHT Modul befindet sich integriert in die RP6 Sensor Board Demo auf der ''&amp;quot;RP6 Robot System Xtra Modules CD-ROM&amp;quot;''. Diese Demo kann auch in der aktuellen Version im Download Bereich von [http://www.jm3-engineering.com/downloads.htm JM3 Engineering] herunter geladen werden.&lt;br /&gt;
&lt;br /&gt;
=====RP6M256 WiFi: I2C_BHT Library=====&lt;br /&gt;
Die nachfolgende RP6M256_I2C_BHTLib (Eigenentwicklung in GCC) dient zur Ansteuerung des I2C BHT Moduls durch die RP6M256 WiFi.&lt;br /&gt;
&lt;br /&gt;
======Library Header======&lt;br /&gt;
Datei: RP6M256_I2C_BHTLib.h&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;/* ****************************************************************************&lt;br /&gt;
 *                           _______________________&lt;br /&gt;
 *                           \| RP6  ROBOT SYSTEM |/&lt;br /&gt;
 *                            \_-_-_-_-_-_-_-_-_-_/           &amp;gt;&amp;gt;&amp;gt; RP6 M256 WIFI&lt;br /&gt;
 * ----------------------------------------------------------------------------&lt;br /&gt;
 * ----------------------------- [c]2015 - Dirk -------------------------------&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * File: RP6M256_I2C_BHTLib.h&lt;br /&gt;
 * Version: 0.9&lt;br /&gt;
 * Target: RP6 M256 WIFI - ATMEGA2560 @16.00MHz&lt;br /&gt;
 * Author(s): Dirk&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Description:&lt;br /&gt;
 * Header file for new RP6 BHT Module library.&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
#ifndef RP6M256_I2C_BHTLIB_H&lt;br /&gt;
#define RP6M256_I2C_BHTLIB_H&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// RP6 BHT Module components:&lt;br /&gt;
// - I2C Barometric Pressure Sensor (MS5607-02BA)&lt;br /&gt;
// - I2C Relative Humidity Sensor (HTU21D)&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// RP6 Sensor Board:&lt;br /&gt;
&lt;br /&gt;
// If you want to use the RP6 BHT Module on the RP6 Sensor Board, you&lt;br /&gt;
// have to define SENSOR_BOARD (default)!&lt;br /&gt;
// If SENSOR_BOARD is NOT defined, this library assumes that the RP6 BHT&lt;br /&gt;
// Module is used stand-alone.&lt;br /&gt;
// ------------------&lt;br /&gt;
#define SENSOR_BOARD&lt;br /&gt;
// ------------------&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Includes:&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6M256Lib.h&amp;quot;&lt;br /&gt;
#include &amp;quot;RP6I2CmasterTWI.h&amp;quot;&lt;br /&gt;
#ifdef SENSOR_BOARD&lt;br /&gt;
	#include &amp;quot;RP6M256_Sensor_BoardLib.h&amp;quot;&lt;br /&gt;
#endif&lt;br /&gt;
#include &amp;lt;math.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Barometric Pressure Sensor (MS5607-02BA):&lt;br /&gt;
#define I2C_BHT_B_ADR					0xee	// Default&lt;br /&gt;
&lt;br /&gt;
// Weather station's data:&lt;br /&gt;
#define ALTITUDE			156			// Weather station's altitude [m]&lt;br /&gt;
//#define ALTITUDE			110			// 2nd altitude: Location 2 [m]&lt;br /&gt;
&lt;br /&gt;
// Temperature default data:&lt;br /&gt;
#define TEMP_ZERO			273.15		// 273.15 K = 0 °C&lt;br /&gt;
#define TA_DEFAULT			15.0		// Outside temp. default [°C]&lt;br /&gt;
#define TI_DEFAULT			21.0		// Inside temp. default [°C]&lt;br /&gt;
&lt;br /&gt;
// Commands:&lt;br /&gt;
#define MS5607_CMD_RESET				0x1e	// ADC reset command&lt;br /&gt;
#define MS5607_CMD_ADC_READ				0x00	// ADC read command&lt;br /&gt;
#define MS5607_CMD_ADC_CONV				0x40	// ADC conversion command&lt;br /&gt;
#define MS5607_CMD_ADC_D1				0x00	// ADC D1 conversion&lt;br /&gt;
#define MS5607_CMD_ADC_D2				0x10	// ADC D2 conversion&lt;br /&gt;
#define MS5607_CMD_ADC_256				0x00	// ADC OSR=256&lt;br /&gt;
#define MS5607_CMD_ADC_512				0x02	// ADC OSR=512&lt;br /&gt;
#define MS5607_CMD_ADC_1024				0x04	// ADC OSR=1024&lt;br /&gt;
#define MS5607_CMD_ADC_2048				0x06	// ADC OSR=2048&lt;br /&gt;
#define MS5607_CMD_ADC_4096				0x08	// ADC OSR=4096&lt;br /&gt;
#define MS5607_CMD_PROM_RD				0xa0	// Prom read command&lt;br /&gt;
&lt;br /&gt;
extern uint32_t D1;		// ADC value of the pressure conversion&lt;br /&gt;
extern uint32_t D2;		// ADC value of the temperature conversion&lt;br /&gt;
extern uint16_t C[8];	// calibration coefficients&lt;br /&gt;
extern double P;		// compensated pressure value&lt;br /&gt;
extern double P0;		// compensated pressure value at sea level (0 m)&lt;br /&gt;
extern double T;		// compensated temperature value&lt;br /&gt;
extern double dT;		// difference between actual and measured temperature&lt;br /&gt;
extern double OFF;		// offset at actual temperature&lt;br /&gt;
extern double SENS;		// sensitivity at actual temperature&lt;br /&gt;
extern uint8_t n_crc;	// crc value of the prom&lt;br /&gt;
&lt;br /&gt;
void I2C_BHT_B_reset(void);&lt;br /&gt;
uint32_t I2C_BHT_B_cmd_adc(uint8_t cmd);&lt;br /&gt;
uint16_t I2C_BHT_B_cmd_prom(uint8_t coef_num);&lt;br /&gt;
uint8_t I2C_BHT_B_crc4(uint16_t n_prom[]);&lt;br /&gt;
void I2C_BHT_B_read(void);&lt;br /&gt;
void I2C_BHT_B_init(void);&lt;br /&gt;
double reduceAirPressure(double pa, double ta);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Relative Humidity Sensor (HTU21D):&lt;br /&gt;
#define I2C_BHT_HT_ADR					0x80	// Default&lt;br /&gt;
&lt;br /&gt;
// Commands:&lt;br /&gt;
#define HTU21D_TRIG_T_MEASUREMENT_HM    0xe3	// Trig. temp meas. hold master&lt;br /&gt;
#define HTU21D_TRIG_RH_MEASUREMENT_HM   0xe5	// Trig. humidity meas. hold master&lt;br /&gt;
#define HTU21D_TRIG_T_MEASUREMENT_POLL  0xf3	// Trig. temp meas. no hold master&lt;br /&gt;
#define HTU21D_TRIG_RH_MEASUREMENT_POLL 0xf5	// Trig. humidity meas. no hold master&lt;br /&gt;
#define HTU21D_USER_REG_W               0xe6	// Writing user register&lt;br /&gt;
#define HTU21D_USER_REG_R               0xe7	// Reading user register&lt;br /&gt;
#define HTU21D_SOFT_RESET               0xfe	// Soft reset&lt;br /&gt;
&lt;br /&gt;
// Resolutions:&lt;br /&gt;
#define HTU21D_RES_12_14BIT             0x00	// RH=12bit, T=14bit&lt;br /&gt;
#define HTU21D_RES_8_12BIT              0x01	// RH= 8bit, T=12bit&lt;br /&gt;
#define HTU21D_RES_10_13BIT             0x80	// RH=10bit, T=13bit&lt;br /&gt;
#define HTU21D_RES_11_11BIT             0x81	// RH=11bit, T=11bit&lt;br /&gt;
&lt;br /&gt;
// User register bitmasks:&lt;br /&gt;
#define HTU21D_RES_MASK                 0x81	// Mask for res. bits (7, 0)&lt;br /&gt;
#define HTU21D_EOB_ON                   0x40	// End of battery&lt;br /&gt;
#define HTU21D_EOB_MASK                 0x40	// Mask for EOB bit(6)&lt;br /&gt;
#define HTU21D_HEATER_ON                0x04	// Heater on&lt;br /&gt;
#define HTU21D_HEATER_OFF               0x00	// Heater off&lt;br /&gt;
#define HTU21D_HEATER_MASK              0x04	// Mask for Heater bit (2)&lt;br /&gt;
&lt;br /&gt;
extern uint16_t rawHumidity;	// raw humidity value&lt;br /&gt;
extern uint16_t rawTemperature;	// raw temperature value&lt;br /&gt;
extern double H;				// relative humidity value [%]&lt;br /&gt;
extern double HT;				// temperature value [°C]&lt;br /&gt;
extern uint8_t resolution;		// sensor resolution [0..3]&lt;br /&gt;
extern uint8_t ht_crc;			// message crc value&lt;br /&gt;
&lt;br /&gt;
void I2C_BHT_HT_reset(void);&lt;br /&gt;
uint8_t I2C_BHT_HT_crc8(uint16_t message, uint8_t checksum);&lt;br /&gt;
double I2C_BHT_HT_readHumidity(void);&lt;br /&gt;
double I2C_BHT_HT_readTemperature(void);&lt;br /&gt;
void I2C_BHT_HT_setResolution(uint8_t resBits);&lt;br /&gt;
void I2C_BHT_HT_init(void);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// RP6 BHT Module initialisation:&lt;br /&gt;
&lt;br /&gt;
void I2C_BHT_init(void);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
/******************************************************************************&lt;br /&gt;
 * Additional info&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Changelog:&lt;br /&gt;
 * &lt;br /&gt;
 *  ---&amp;gt; changes are documented in the file &amp;quot;RP6M256_I2C_BHTLib.c&amp;quot;&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
======Library Source======&lt;br /&gt;
Datei: RP6M256_I2C_BHTLib.c&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;/* ****************************************************************************&lt;br /&gt;
 *                           _______________________&lt;br /&gt;
 *                           \| RP6  ROBOT SYSTEM |/&lt;br /&gt;
 *                            \_-_-_-_-_-_-_-_-_-_/           &amp;gt;&amp;gt;&amp;gt; RP6 M256 WIFI&lt;br /&gt;
 * ----------------------------------------------------------------------------&lt;br /&gt;
 * ----------------------------- [c]2015 - Dirk -------------------------------&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * File: RP6M256_I2C_BHTLib.c&lt;br /&gt;
 * Version: 0.9&lt;br /&gt;
 * Target: RP6 M256 WIFI - ATMEGA2560 @16.00MHz&lt;br /&gt;
 *         and a RP6 BHT Module (CONRAD 1302995)&lt;br /&gt;
 *         optionally on a RP6 Sensor Board (CONRAD 1082384)&lt;br /&gt;
 * Author(s): Dirk&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Description:&lt;br /&gt;
 * &lt;br /&gt;
 * This is our new Library that contains basic routines and functions for&lt;br /&gt;
 * accessing the RP6 BHT Module JM3-BHT31 (CONRAD 1302995).&lt;br /&gt;
 * If the RP6 BHT Module is located on the RP6 Sensor Board (CONRAD 1082384)&lt;br /&gt;
 * and connected to the I2C-MODULE plug M1, the RP6M256_Sensor_BoardLib has to&lt;br /&gt;
 * be included!&lt;br /&gt;
 * &lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// RP6 BHT Module components:&lt;br /&gt;
// - I2C Barometric Pressure Sensor (MS5607-02BA)&lt;br /&gt;
// - I2C Relative Humidity Sensor (HTU21D)&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Includes:&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6M256_I2C_BHTLib.h&amp;quot; 		&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Variables:&lt;br /&gt;
&lt;br /&gt;
uint8_t bhtdataBuf[4]; &lt;br /&gt;
uint8_t i;&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Barometric Pressure Sensor (MS5607-02BA):&lt;br /&gt;
// (Following the C-code example published 2011 by MEAS in AN520!)&lt;br /&gt;
&lt;br /&gt;
uint32_t D1;			// ADC value of the pressure conversion&lt;br /&gt;
uint32_t D2;			// ADC value of the temperature conversion&lt;br /&gt;
uint16_t C[8];			// calibration coefficients&lt;br /&gt;
double P;				// compensated pressure value&lt;br /&gt;
double P0;				// compensated pressure value at sea level (0 m)&lt;br /&gt;
double T;				// compensated temperature value&lt;br /&gt;
double dT;				// difference between actual and measured temperature&lt;br /&gt;
double OFF;				// offset at actual temperature&lt;br /&gt;
double SENS;			// sensitivity at actual temperature&lt;br /&gt;
uint8_t n_crc;			// crc value of the prom&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Reset sequence for the Pressure Sensor.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void I2C_BHT_B_reset(void)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmitByte(I2C_BHT_B_ADR, MS5607_CMD_RESET);&lt;br /&gt;
	mSleep(3);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Reads and returns pressure or temperature ADC&lt;br /&gt;
 * values measured with the chosen resolution.&lt;br /&gt;
 * This function is BLOCKING during the conversion&lt;br /&gt;
 * time (up to 10 ms).&lt;br /&gt;
 *&lt;br /&gt;
 * Input: cmd -&amp;gt; MS5607_CMD_ADC_D1   = Read pressure ADC value&lt;br /&gt;
 *               MS5607_CMD_ADC_D2   = Read temperature ADC value&lt;br /&gt;
 *               ... plus ...&lt;br /&gt;
 *               MS5607_CMD_ADC_256  = Resolution 0.130 hPa / 0.012 °C&lt;br /&gt;
 *               MS5607_CMD_ADC_512  = Resolution 0.084 hPa / 0.008 °C&lt;br /&gt;
 *               MS5607_CMD_ADC_1024 = Resolution 0.054 hPa / 0.005 °C&lt;br /&gt;
 *               MS5607_CMD_ADC_2048 = Resolution 0.036 hPa / 0.003 °C&lt;br /&gt;
 *               MS5607_CMD_ADC_4096 = Resolution 0.024 hPa / 0.002 °C&lt;br /&gt;
 *&lt;br /&gt;
 * Examples:&lt;br /&gt;
 *   D1 = I2C_BHT_B_cmd_adc(MS5607_CMD_ADC_D1 + MS5607_CMD_ADC_4096);&lt;br /&gt;
 *   // This returns the pressure ADC value (D1) with a 0.024 hPa&lt;br /&gt;
 *   // resolution!&lt;br /&gt;
 *   D2 = I2C_BHT_B_cmd_adc(MS5607_CMD_ADC_D2 + MS5607_CMD_ADC_4096);&lt;br /&gt;
 *   // This returns the temperature ADC value (D2) with a 0.002 °C&lt;br /&gt;
 *   // resolution!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
uint32_t I2C_BHT_B_cmd_adc(uint8_t cmd)&lt;br /&gt;
{&lt;br /&gt;
	uint32_t temp = 0;&lt;br /&gt;
&lt;br /&gt;
	I2CTWI_transmitByte(I2C_BHT_B_ADR, (MS5607_CMD_ADC_CONV + cmd));&lt;br /&gt;
	switch (cmd &amp;amp; 0x0f) {&lt;br /&gt;
		case MS5607_CMD_ADC_256  : mSleep(1); break;&lt;br /&gt;
		case MS5607_CMD_ADC_512  : mSleep(2); break;&lt;br /&gt;
		case MS5607_CMD_ADC_1024 : mSleep(3); break;&lt;br /&gt;
		case MS5607_CMD_ADC_2048 : mSleep(5); break;&lt;br /&gt;
		case MS5607_CMD_ADC_4096 : mSleep(10);&lt;br /&gt;
	}&lt;br /&gt;
	I2CTWI_transmitByte(I2C_BHT_B_ADR, MS5607_CMD_ADC_READ);&lt;br /&gt;
	I2CTWI_readBytes(I2C_BHT_B_ADR, bhtdataBuf, 3);&lt;br /&gt;
	temp = bhtdataBuf[0];						// MSB&lt;br /&gt;
	temp &amp;lt;&amp;lt;= 8;&lt;br /&gt;
	temp |= bhtdataBuf[1];&lt;br /&gt;
	temp &amp;lt;&amp;lt;= 8;&lt;br /&gt;
	temp |= bhtdataBuf[2];						// LSB&lt;br /&gt;
	return temp;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Reads and returns the calibration coefficient&lt;br /&gt;
 * (16 bit) with the number coef_num from the&lt;br /&gt;
 * Pressure Sensor's PROM.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: coef_num -&amp;gt; Calibration coefficient&lt;br /&gt;
 *                    number [0..7]&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
uint16_t I2C_BHT_B_cmd_prom(uint8_t coef_num)&lt;br /&gt;
{&lt;br /&gt;
	uint16_t rC = 0;&lt;br /&gt;
&lt;br /&gt;
	I2CTWI_transmitByte(I2C_BHT_B_ADR, (MS5607_CMD_PROM_RD + coef_num * 2));&lt;br /&gt;
	I2CTWI_readBytes(I2C_BHT_B_ADR, bhtdataBuf, 2);&lt;br /&gt;
	rC = bhtdataBuf[0];							// MSB&lt;br /&gt;
	rC &amp;lt;&amp;lt;= 8;&lt;br /&gt;
	rC |= bhtdataBuf[1];						// LSB&lt;br /&gt;
	return rC;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Calculates and returns the Pressure Sensor's&lt;br /&gt;
 * PROM CRC-4 value (8 bit).&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
uint8_t I2C_BHT_B_crc4(uint16_t n_prom[])&lt;br /&gt;
{&lt;br /&gt;
	uint16_t n_rem;&lt;br /&gt;
	uint16_t crc_read;&lt;br /&gt;
	uint8_t n_bit;&lt;br /&gt;
&lt;br /&gt;
	n_rem = 0x00;&lt;br /&gt;
	crc_read = n_prom[7];&lt;br /&gt;
	n_prom[7] = (0xff00 &amp;amp; (n_prom[7]));&lt;br /&gt;
	for (i = 0; i &amp;lt; 16; i++)&lt;br /&gt;
	{&lt;br /&gt;
		if (i % 2 == 1) n_rem ^= (uint8_t) ((n_prom[i &amp;gt;&amp;gt; 1]) &amp;amp; 0x00ff);&lt;br /&gt;
		else n_rem ^= (uint8_t) (n_prom[i &amp;gt;&amp;gt; 1] &amp;gt;&amp;gt; 8);&lt;br /&gt;
		for (n_bit = 8; n_bit &amp;gt; 0; n_bit--)&lt;br /&gt;
		{&lt;br /&gt;
			if (n_rem &amp;amp; 0x8000) n_rem = (n_rem &amp;lt;&amp;lt; 1) ^ 0x3000;&lt;br /&gt;
			else n_rem = n_rem &amp;lt;&amp;lt; 1;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	n_rem = (0x000f &amp;amp; (n_rem &amp;gt;&amp;gt; 12));&lt;br /&gt;
	n_prom[7] = crc_read;&lt;br /&gt;
	return (n_rem ^ 0x0);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Reads and calculates the pressure and&lt;br /&gt;
 * temperature values with the MS5607 1st order&lt;br /&gt;
 * algorithm.&lt;br /&gt;
 * The 2 values are stored in the global floating&lt;br /&gt;
 * point variables P and T:&lt;br /&gt;
 *   P -&amp;gt; Pressure value [hPa]&lt;br /&gt;
 *   T -&amp;gt; Temperature value [°C]&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void I2C_BHT_B_read(void)&lt;br /&gt;
{&lt;br /&gt;
	D2 = I2C_BHT_B_cmd_adc(MS5607_CMD_ADC_D2 + MS5607_CMD_ADC_4096); // Read D2&lt;br /&gt;
	D1 = I2C_BHT_B_cmd_adc(MS5607_CMD_ADC_D1 + MS5607_CMD_ADC_4096); // Read D1&lt;br /&gt;
&lt;br /&gt;
	// Calculate 1st order pressure and temperature (MS5607 1st order algorithm)&lt;br /&gt;
	dT = D2 - C[5] * pow(2, 8);&lt;br /&gt;
	OFF = C[2] * pow(2, 17) + dT * C[4] / pow(2, 6);&lt;br /&gt;
	SENS = C[1] * pow(2, 16) + dT * C[3] / pow(2, 7);&lt;br /&gt;
&lt;br /&gt;
	T = (2000 + (dT * C[6]) / pow(2, 23)) / 100;&lt;br /&gt;
	P = (((D1 * SENS) / pow(2, 21) - OFF) / pow(2, 15)) / 100;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * You MUST call this function at the beginning of a&lt;br /&gt;
 * main program, that uses the Pressure Sensor. &lt;br /&gt;
 * If SENSOR_BOARD is defined, the I2C-MODULE power&lt;br /&gt;
 * will be switched on with the function&lt;br /&gt;
 * setI2CModulePower() defined in the&lt;br /&gt;
 * RP6M256_Sensor_BoardLib, which will be included&lt;br /&gt;
 * then.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void I2C_BHT_B_init(void)&lt;br /&gt;
{&lt;br /&gt;
#ifdef SENSOR_BOARD&lt;br /&gt;
	// I2C-MODULE (plug M1) power on: &lt;br /&gt;
	setI2CModulePower(1);&lt;br /&gt;
#endif&lt;br /&gt;
	D1 = 0;										// Clear pressure ADC value&lt;br /&gt;
	D2 = 0;										// Clear temperature ADC value&lt;br /&gt;
	I2C_BHT_B_reset();							// Reset the Pressure Sensor&lt;br /&gt;
	for (i = 0; i &amp;lt; 8; i++) {C[i] = I2C_BHT_B_cmd_prom(i);} // Read PROM&lt;br /&gt;
	n_crc = I2C_BHT_B_crc4(C);					// Calculate PROM CRC&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Calculates and returns the relative air pressure&lt;br /&gt;
 * [hPa] at sea level (0 m).&lt;br /&gt;
 *&lt;br /&gt;
 * Input:  pa        -&amp;gt; Absolute air pressure [hPa] at ALTITUDE&lt;br /&gt;
 *         ta        -&amp;gt; OUTSIDE temperature [°C] at ALTITUDE&lt;br /&gt;
 *         ALTITUDE  -&amp;gt; Weather station's altitude [m]&lt;br /&gt;
 *         TEMP_ZERO -&amp;gt; 273.15 K&lt;br /&gt;
 * Output: p0        -&amp;gt; Relative air pressure [hPa] at sea level (0 m)&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
double reduceAirPressure(double pa, double ta)&lt;br /&gt;
{double p0;&lt;br /&gt;
	p0 = pa * (pow ((TEMP_ZERO + ta) / (TEMP_ZERO + ta + 0.0065 * ALTITUDE), -5.255));&lt;br /&gt;
	return p0;									// P0 [hPa]&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Relative Humidity Sensor (HTU21D):&lt;br /&gt;
// (Following a library published 2011 by MEAS France!)&lt;br /&gt;
&lt;br /&gt;
uint16_t rawHumidity;		// raw humidity value&lt;br /&gt;
uint16_t rawTemperature;	// raw temperature value&lt;br /&gt;
double H;					// relative humidity value [%]&lt;br /&gt;
double HT;					// temperature value [°C]&lt;br /&gt;
uint8_t resolution;			// sensor resolution [0..3]&lt;br /&gt;
uint8_t ht_crc;				// message crc value&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Soft reset for the Humidity Sensor.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void I2C_BHT_HT_reset(void)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmitByte(I2C_BHT_HT_ADR, HTU21D_SOFT_RESET);&lt;br /&gt;
	mSleep(15);&lt;br /&gt;
	resolution = 0;								// Default: RH 12, T 14 bit&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Reads the Humidity Sensor's user register.&lt;br /&gt;
 *&lt;br /&gt;
 * Hint: The user register bits are described on&lt;br /&gt;
 *       page 13 of the HTU21D datasheet!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
uint8_t read_user_register(void)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t userRegister;&lt;br /&gt;
  &lt;br /&gt;
	I2CTWI_transmitByte(I2C_BHT_HT_ADR, HTU21D_USER_REG_R);&lt;br /&gt;
	userRegister = I2CTWI_readByte(I2C_BHT_HT_ADR);&lt;br /&gt;
	return userRegister;  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Sets the Humidity Sensor's resolution to one&lt;br /&gt;
 * of four steps. The step number [0..3] is stored&lt;br /&gt;
 * in the global variable resolution:&lt;br /&gt;
 *   Step  RH   T&lt;br /&gt;
 *    0:   12  14 bit&lt;br /&gt;
 *    1:    8  12 bit&lt;br /&gt;
 *    2:   10  13 bit&lt;br /&gt;
 *    3:   11  11 bit&lt;br /&gt;
 *                                      RH   T&lt;br /&gt;
 * Input:  resBits -&amp;gt; 0b00000000   (0): 12  14 bit&lt;br /&gt;
 *                 -&amp;gt; 0b00000001   (1):  8  12 bit&lt;br /&gt;
 *                 -&amp;gt; 0b10000000 (128): 10  13 bit&lt;br /&gt;
 *                 -&amp;gt; 0b10000001 (129): 11  11 bit&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void I2C_BHT_HT_setResolution(uint8_t resBits)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t userRegister;&lt;br /&gt;
&lt;br /&gt;
	userRegister = read_user_register();&lt;br /&gt;
	userRegister &amp;amp;= 0b01111110;&lt;br /&gt;
	resBits &amp;amp;= 0b10000001;&lt;br /&gt;
	resolution = (resBits &amp;gt;&amp;gt; 6) | (resBits &amp;amp; 1); // Step 0..3&lt;br /&gt;
	userRegister |= resBits;&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_BHT_HT_ADR, HTU21D_USER_REG_W, userRegister);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#define SHIFTED_DIVISOR                 0x988000&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Calculates the Humidity Sensor's message CRC-8&lt;br /&gt;
 * value (8 bit) and returns 0 (false), if the&lt;br /&gt;
 * message transmission is good.&lt;br /&gt;
 *&lt;br /&gt;
 * Input:  message         -&amp;gt; Message from&lt;br /&gt;
 *                            Humidity Sensor&lt;br /&gt;
 *         checksum        -&amp;gt; Checksum from&lt;br /&gt;
 *                            Humidity Sensor&lt;br /&gt;
 *         SHIFTED_DIVISOR -&amp;gt; 0x0131 polynomial&lt;br /&gt;
 *                            shifted to farthest&lt;br /&gt;
 *                            left of three bytes&lt;br /&gt;
 * Output: remainder       -&amp;gt; 0  = Transmission good&lt;br /&gt;
 *                         -&amp;gt; &amp;gt;0 = Transm. corrupted&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
uint8_t I2C_BHT_HT_crc8(uint16_t message, uint8_t checksum)&lt;br /&gt;
{&lt;br /&gt;
	uint32_t remainder, divisor;&lt;br /&gt;
&lt;br /&gt;
	remainder = (uint32_t) message &amp;lt;&amp;lt; 8;&lt;br /&gt;
	remainder |= checksum;&lt;br /&gt;
	divisor = (uint32_t) SHIFTED_DIVISOR;&lt;br /&gt;
	for (i = 0; i &amp;lt; 16; i++)&lt;br /&gt;
	{&lt;br /&gt;
		if (remainder &amp;amp; (uint32_t) 1 &amp;lt;&amp;lt; (23 - i))&lt;br /&gt;
			remainder ^= divisor;&lt;br /&gt;
		divisor &amp;gt;&amp;gt;= 1;&lt;br /&gt;
	}&lt;br /&gt;
	return (uint8_t) remainder;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Calculates and returns the humidity value.&lt;br /&gt;
 * This function is BLOCKING during the conversion&lt;br /&gt;
 * time (up to 17 ms depending on resolution).&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
double I2C_BHT_HT_readHumidity(void)&lt;br /&gt;
{&lt;br /&gt;
	uint32_t temp = 0;&lt;br /&gt;
&lt;br /&gt;
	I2CTWI_transmitByte(I2C_BHT_HT_ADR, HTU21D_TRIG_RH_MEASUREMENT_POLL);&lt;br /&gt;
	switch (resolution) {&lt;br /&gt;
		case 1 : mSleep(4); break;				// RH 8 bit&lt;br /&gt;
		case 2 : mSleep(6); break;				// RH 10 bit&lt;br /&gt;
		case 3 : mSleep(9); break;				// RH 11 bit&lt;br /&gt;
		case 0 : mSleep(17);					// RH 12 bit&lt;br /&gt;
	}&lt;br /&gt;
	I2CTWI_readBytes(I2C_BHT_HT_ADR, bhtdataBuf, 3);&lt;br /&gt;
	temp = bhtdataBuf[0];						// MSB&lt;br /&gt;
	temp &amp;lt;&amp;lt;= 8;&lt;br /&gt;
	temp |= bhtdataBuf[1];						// LSB&lt;br /&gt;
	temp &amp;lt;&amp;lt;= 8;&lt;br /&gt;
	temp |= bhtdataBuf[2];						// Checksum&lt;br /&gt;
	rawHumidity = temp &amp;gt;&amp;gt; 8;&lt;br /&gt;
	ht_crc = (uint8_t) temp;&lt;br /&gt;
	rawHumidity &amp;amp;= 0xfffc;&lt;br /&gt;
	double tempRH = rawHumidity / (double) 65536;&lt;br /&gt;
	double rh = -6 + (125 * tempRH);&lt;br /&gt;
	return rh;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Calculates and returns the temperature value.&lt;br /&gt;
 * This function is BLOCKING during the conversion&lt;br /&gt;
 * time (up to 51 ms depending on resolution).&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
double I2C_BHT_HT_readTemperature(void)&lt;br /&gt;
{&lt;br /&gt;
	uint32_t temp = 0;&lt;br /&gt;
&lt;br /&gt;
	I2CTWI_transmitByte(I2C_BHT_HT_ADR, HTU21D_TRIG_T_MEASUREMENT_POLL);&lt;br /&gt;
	switch (resolution) {&lt;br /&gt;
		case 3 : mSleep(8); break;				// T 11 bit&lt;br /&gt;
		case 1 : mSleep(14); break;				// T 12 bit&lt;br /&gt;
		case 2 : mSleep(26); break;				// T 13 bit&lt;br /&gt;
		case 0 : mSleep(51);					// T 14 bit&lt;br /&gt;
	}&lt;br /&gt;
	I2CTWI_readBytes(I2C_BHT_HT_ADR, bhtdataBuf, 3);&lt;br /&gt;
	temp = bhtdataBuf[0];						// MSB&lt;br /&gt;
	temp &amp;lt;&amp;lt;= 8;&lt;br /&gt;
	temp |= bhtdataBuf[1];						// LSB&lt;br /&gt;
	temp &amp;lt;&amp;lt;= 8;&lt;br /&gt;
	temp |= bhtdataBuf[2];						// Checksum&lt;br /&gt;
	rawTemperature = temp &amp;gt;&amp;gt; 8;&lt;br /&gt;
	ht_crc = (uint8_t) temp;&lt;br /&gt;
	rawTemperature &amp;amp;= 0xfffc;&lt;br /&gt;
	double tempTemperature = rawTemperature / (double) 65536;&lt;br /&gt;
	double realTemperature = -46.85 + (175.72 * tempTemperature);&lt;br /&gt;
	return realTemperature;  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * You MUST call this function at the beginning of a&lt;br /&gt;
 * main program, that uses the Humidity Sensor. &lt;br /&gt;
 * If SENSOR_BOARD is defined, the I2C-MODULE power&lt;br /&gt;
 * will be switched on with the function&lt;br /&gt;
 * setI2CModulePower() defined in the&lt;br /&gt;
 * RP6M256_Sensor_BoardLib, which will be included&lt;br /&gt;
 * then.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void I2C_BHT_HT_init(void)&lt;br /&gt;
{&lt;br /&gt;
#ifdef SENSOR_BOARD&lt;br /&gt;
	// I2C-MODULE (plug M1) power on: &lt;br /&gt;
	setI2CModulePower(1);&lt;br /&gt;
#endif&lt;br /&gt;
	I2C_BHT_HT_reset();							// Reset the Humidity Sensor&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// RP6 BHT Module initialisation:&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * You MUST call this function at the beginning of a&lt;br /&gt;
 * main program, that uses the RP6 BHT Module. &lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void I2C_BHT_init(void)&lt;br /&gt;
{&lt;br /&gt;
	// I2C Barometric Pressure Sensor:&lt;br /&gt;
	I2C_BHT_B_init();&lt;br /&gt;
	// I2C Relative Humidity Sensor:&lt;br /&gt;
	I2C_BHT_HT_init();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&lt;br /&gt;
/******************************************************************************&lt;br /&gt;
 * Additional info&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Changelog:&lt;br /&gt;
 * - v. 0.9 (initial release) 20.03.2015 by Dirk&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
======Demo======&lt;br /&gt;
makefile:&lt;br /&gt;
&amp;lt;pre&amp;gt;...&lt;br /&gt;
TARGET = RP6M256_Sensor_Board_03&lt;br /&gt;
...&lt;br /&gt;
SRC += $(RP6_LIB_PATH)/RP6common/RP6I2CmasterTWI.c&lt;br /&gt;
&lt;br /&gt;
SRC += $(RP6_LIB_PATH)/RP6control_M256_WIFI/RP6M256_Sensor_BoardLib.c&lt;br /&gt;
SRC += $(RP6_LIB_PATH)/RP6control_M256_WIFI/RP6M256_I2C_BHTLib.c&lt;br /&gt;
...&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Datei: RP6M256_Sensor_Board_03.c&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;/* &lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * RP6 ROBOT SYSTEM - RP6 CONTROL M256 Examples&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Example: RP6M256 Sensor Board&lt;br /&gt;
 * Author(s): Dirk&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Description:&lt;br /&gt;
 * In this example we show a third test for the RP6 Sensor Board.&lt;br /&gt;
 * &lt;br /&gt;
 * ############################################################################&lt;br /&gt;
 * The Robot does NOT move in this example! You can simply put it on a table&lt;br /&gt;
 * next to your PC and you should connect it to the PC via the USB Interface!&lt;br /&gt;
 * You should also connect to it via WIFI.&lt;br /&gt;
 * ############################################################################&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Includes:&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6M256Lib.h&amp;quot; 				// The RP6 M256 Library. &lt;br /&gt;
										// Always needs to be included!&lt;br /&gt;
#include &amp;quot;RP6I2CmasterTWI.h&amp;quot;			// Include the I2C-Bus Master Library&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Include our new &amp;quot;RP6M256 I2C BHT Module library&amp;quot;:&lt;br /&gt;
// (This is the library for accessing the RP6 BHT Module!)&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6M256_I2C_BHTLib.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Write a floating point number to the WIFI.&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *&lt;br /&gt;
 *			// Write a floating point number to the WIFI (no exponent):&lt;br /&gt;
 *			writeDouble_WIFI(1234567.890, 11, 3);&lt;br /&gt;
 *&lt;br /&gt;
 * The value of prec (precision) defines the number of decimal places.&lt;br /&gt;
 * For 32 bit floating point variables (float, double ...) 6 is&lt;br /&gt;
 * the max. value for prec (7 relevant digits).&lt;br /&gt;
 * The value of width defines the overall number of characters in the&lt;br /&gt;
 * floating point number including the decimal point. The number of&lt;br /&gt;
 * pre-decimal positions is: (width - prec - 1).&lt;br /&gt;
 */&lt;br /&gt;
void writeDouble_WIFI(double number, uint8_t width, uint8_t prec)&lt;br /&gt;
{char buffer[width + 1];&lt;br /&gt;
	dtostrf(number, width, prec, &amp;amp;buffer[0]);&lt;br /&gt;
	writeString_WIFI(&amp;amp;buffer[0]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Write a floating point number to the LCD.&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *&lt;br /&gt;
 *			// Write a floating point number to the LCD (no exponent):&lt;br /&gt;
 *			writeDoubleLCD(1234567.890, 11, 3);&lt;br /&gt;
 *&lt;br /&gt;
 * The value of prec (precision) defines the number of decimal places.&lt;br /&gt;
 * For 32 bit floating point variables (float, double ...) 6 is&lt;br /&gt;
 * the max. value for prec (7 relevant digits).&lt;br /&gt;
 * The value of width defines the overall number of characters in the&lt;br /&gt;
 * floating point number including the decimal point. The number of&lt;br /&gt;
 * pre-decimal positions is: (width - prec - 1).&lt;br /&gt;
 */&lt;br /&gt;
void writeDoubleLCD(double number, uint8_t width, uint8_t prec)&lt;br /&gt;
{char buffer[width + 1];&lt;br /&gt;
	dtostrf(number, width, prec, &amp;amp;buffer[0]);&lt;br /&gt;
	writeStringLCD(&amp;amp;buffer[0]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Error handler&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function gets called automatically if there was an I2C Error like&lt;br /&gt;
 * the slave sent a &amp;quot;not acknowledge&amp;quot; (NACK, error codes e.g. 0x20 or 0x30).&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void I2C_transmissionError(uint8_t errorState)&lt;br /&gt;
{&lt;br /&gt;
	writeString_P_WIFI(&amp;quot;\nI2C ERROR - TWI STATE: 0x&amp;quot;);&lt;br /&gt;
	writeInteger_WIFI(errorState, HEX);&lt;br /&gt;
	writeChar_WIFI('\n');&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Main function - The program starts here:&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
	initRP6M256();    // Always call this first! The Processor will not work&lt;br /&gt;
					  // correctly otherwise. &lt;br /&gt;
&lt;br /&gt;
	initLCD(); // Initialize the LC-Display (LCD)&lt;br /&gt;
			   // Always call this before using the LCD!&lt;br /&gt;
&lt;br /&gt;
	setLEDs(0b1111);&lt;br /&gt;
	mSleep(500);&lt;br /&gt;
	setLEDs(0b0000);&lt;br /&gt;
&lt;br /&gt;
	writeString_P_WIFI(&amp;quot;\n\nRP6 Sensor Board Selftest 3!\n&amp;quot;); &lt;br /&gt;
&lt;br /&gt;
	// IMPORTANT:&lt;br /&gt;
	I2CTWI_initMaster(100); // Initialize the TWI Module for Master operation&lt;br /&gt;
							// with 100kHz SCL Frequency&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	// Register the event handler:&lt;br /&gt;
	I2CTWI_setTransmissionErrorHandler(I2C_transmissionError);&lt;br /&gt;
&lt;br /&gt;
	setLEDs(0b1111);&lt;br /&gt;
&lt;br /&gt;
	// Write a text message to the LCD:&lt;br /&gt;
	showScreenLCD(&amp;quot;################&amp;quot;, &amp;quot;################&amp;quot;);&lt;br /&gt;
	mSleep(1500);&lt;br /&gt;
	showScreenLCD(&amp;quot;RP6v2-M256-WIFI &amp;quot;, &amp;quot;Example Program&amp;quot;);&lt;br /&gt;
	mSleep(2500); &lt;br /&gt;
	showScreenLCD(&amp;quot;RP6 Sensor Board&amp;quot;, &amp;quot;   Selftest 3&amp;quot;);&lt;br /&gt;
	mSleep(2500);&lt;br /&gt;
	clearLCD();&lt;br /&gt;
&lt;br /&gt;
	setLEDs(0b0000);&lt;br /&gt;
&lt;br /&gt;
	// ---------------------------------------&lt;br /&gt;
&lt;br /&gt;
	uint8_t onoff = 0;&lt;br /&gt;
&lt;br /&gt;
	startStopwatch1();&lt;br /&gt;
	startStopwatch2();&lt;br /&gt;
&lt;br /&gt;
	// IMPORTANT:&lt;br /&gt;
	sensor_board_init();						// RP6 Sensor Board init!!!&lt;br /&gt;
	mSleep(200);&lt;br /&gt;
	I2C_BHT_init();								// RP6 BHT Module init&lt;br /&gt;
&lt;br /&gt;
	while(true) &lt;br /&gt;
	{&lt;br /&gt;
		if(getStopwatch1() &amp;gt; 1000) // 1s&lt;br /&gt;
		{&lt;br /&gt;
//			if (onoff) onoff = 0;&lt;br /&gt;
//			else onoff = 1;&lt;br /&gt;
&lt;br /&gt;
			// Show Pressure Sensor data:&lt;br /&gt;
			I2C_BHT_B_read();					// Read data&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nLuftdruck:   &amp;quot;);&lt;br /&gt;
			writeDouble_WIFI(P, 7, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot; hPa am Messort (ALTITUDE m)\n&amp;quot;);&lt;br /&gt;
			// Calculate pressure at sea level at TA_DEFAULT (15 °C):&lt;br /&gt;
			P0 = reduceAirPressure(P, TA_DEFAULT);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;Luftdruck:   &amp;quot;);&lt;br /&gt;
			writeDouble_WIFI(P0, 7, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot; hPa in Meereshöhe (0 m, 15 C)\n&amp;quot;);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;Temperatur:  &amp;quot;);&lt;br /&gt;
			writeDouble_WIFI(T, 7, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot; C\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			// Show Humidity Sensor data:&lt;br /&gt;
			H = I2C_BHT_HT_readHumidity();		// Read data&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nLuftfeuchte: &amp;quot;);&lt;br /&gt;
			writeDouble_WIFI(H, 7, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot; % RH\n&amp;quot;);&lt;br /&gt;
			HT = I2C_BHT_HT_readTemperature();	// Read data&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;Temperatur:  &amp;quot;);&lt;br /&gt;
			writeDouble_WIFI(HT, 7, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot; C\n\n\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			// RP6 Sensor Board shutdown (button &amp;amp; status LED test):&lt;br /&gt;
			if (pressedButton) {&lt;br /&gt;
				setStatusLED(1);&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;\nPress button again for RP6 Sensor Board SHUTDOWN!\n&amp;quot;);&lt;br /&gt;
				mSleep(2000);&lt;br /&gt;
				do {&lt;br /&gt;
					if(getStopwatch2() &amp;gt; 200) { // 0.2s&lt;br /&gt;
						if (onoff) onoff = 0;&lt;br /&gt;
						else onoff = 1;&lt;br /&gt;
						if (onoff) setStatusLED(1);&lt;br /&gt;
						else setStatusLED(0);&lt;br /&gt;
						setStopwatch2(0);&lt;br /&gt;
					}&lt;br /&gt;
					mSleep(1);&lt;br /&gt;
					task_I2CTWI();&lt;br /&gt;
				} while (!readButton());&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;\n\n\n\n\nPlease wait for RP6 Sensor Board SHUTDOWN...\n&amp;quot;);&lt;br /&gt;
				sensor_board_shutdown();&lt;br /&gt;
				mSleep(3000);&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;\n\n\nThe RP6 Sensor Board now is in SHUTDOWN MODE!!!\n&amp;quot;);&lt;br /&gt;
				mSleep(1000);&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;\nRESET the M256 microcontroller now...\n\n&amp;quot;);&lt;br /&gt;
				while(true) {};&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			setStopwatch1(0);&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		task_RP6SensorBoard();					// RP6 Sensor Board task&lt;br /&gt;
&lt;br /&gt;
		task_I2CTWI();&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Erklärung&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Erfahrungsberichte==&lt;br /&gt;
&lt;br /&gt;
...in Arbeit...(kann aber gerne ergänzt werden)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Siehe auch==&lt;br /&gt;
* [[RP6v2]]&lt;br /&gt;
* [[RP6]]&lt;br /&gt;
* [[RP6 - Programmierung]]&lt;br /&gt;
* [[RP6 Kamera - Mitmach-Projekt]]&lt;br /&gt;
* [[RP6v2 I2C-Portexpander]]&lt;br /&gt;
* [[RP6v2 USB-RS232-Adapter]]&lt;br /&gt;
* [[RP6v2 Orientierung]]&lt;br /&gt;
* [[RP6 Multi IO Projekt]]&lt;br /&gt;
* [[RP6 Multi IO Projekt - Software]]&lt;br /&gt;
* [[RP6 ArduIO]]&lt;br /&gt;
* [[RP6 ArduIO - Software]]&lt;br /&gt;
* [[Induktive_Ladestation_f%C3%BCr_den_RP6|Induktive Ladestation für den RP6]]&lt;br /&gt;
* [[IR-bake_f%C3%BCr_den_RP6|IR-bake für den RP6]]&lt;br /&gt;
* [[CCRP5]]&lt;br /&gt;
* [[Wild Thumper]]&lt;br /&gt;
* [[Wild Thumper - Programmierung]]&lt;br /&gt;
* [[Yeti]]&lt;br /&gt;
* [[Asuro]]&lt;br /&gt;
* [[C't-Bot]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Weblinks==&lt;br /&gt;
'''Siehe auch die Weblinks im [http://www.rn-wissen.de/index.php/RP6v2#Weblinks RP6v2] und im [http://www.rn-wissen.de/index.php/RP6#Weblinks RP6] Artikel!'''&lt;br /&gt;
&lt;br /&gt;
* [http://www.conrad.de/ce/de/product/1082384/Arexx-RP6-Sensor-Board-RP6-JM03-61 RP6 Sensor Board bei CONRAD]&lt;br /&gt;
* JM3 Engineering:&lt;br /&gt;
** [http://www.jm3-engineering.com/rp6.htm RP6 Roboter Erweiterung]&lt;br /&gt;
** [http://www.jm3-engineering.com/sensors.htm Sensor Module]&lt;br /&gt;
** [http://www.jm3-engineering.com/downloads.htm Software Downloads]&lt;br /&gt;
* Ankündigung einer Sensorerweiterungsplatine für die RP6v2 M256 WiFi im [http://www.roboternetz.de/community/threads/63595-Neue-Hardware-f%C3%BCr-RP6%28v2%29?p=590129&amp;amp;viewfull=1#post590129 Roboternetz RP6 Forum]&lt;br /&gt;
* Erfahrungsbericht zum Sensor Board im [http://www.arexx.com/forum/viewtopic.php?f=19&amp;amp;t=2498 AREXX Support Forum] und im [http://www.roboternetz.de/community/threads/64414-RP6-Sensor-Board-Erster-Eindruck Roboternetz RP6 Forum]&lt;br /&gt;
* Erfahrungsbericht zum I2C GPS Empfänger im [http://www.arexx.com/forum/viewtopic.php?f=19&amp;amp;t=2509 AREXX Support Forum]&lt;br /&gt;
* Erfahrungsbericht zum I2C BHT Modul im [http://www.arexx.com/forum/viewtopic.php?f=19&amp;amp;t=2646 AREXX Support Forum]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Kategorie:Robotikeinstieg]]	 &lt;br /&gt;
[[Kategorie:Praxis]]&lt;br /&gt;
&lt;br /&gt;
==Autoren==&lt;br /&gt;
--[http://www.roboternetz.de/community/members/1972-Dirk Dirk] 15:30, 31. Mär 2022 (CET)&lt;/div&gt;</summary>
		<author><name>Dirk NO2</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=RP6&amp;diff=28592</id>
		<title>RP6</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=RP6&amp;diff=28592"/>
				<updated>2022-03-31T13:51:18Z</updated>
		
		<summary type="html">&lt;p&gt;Dirk NO2: /* Autoren */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Bild:RP6_2.jpg|RP6 Base Roboter|right|500px]]&lt;br /&gt;
==Was bisher geschah==&lt;br /&gt;
Fre, 08. Jun 2007 - Ankündigung des RP6 und der RP6 CONTROL M32&amp;lt;br/&amp;gt;&lt;br /&gt;
Mon, 02. Jul 2007 23:00 - Benachrichtigung der Tester&amp;lt;br/&amp;gt;&lt;br /&gt;
Die, 03. Jul 2007 15:00 - Bereitstellung der Dokumentation&amp;lt;br/&amp;gt;&lt;br /&gt;
Don, 05. Jul 2007 14:30 - Bereitstellung der Schaltungsunterlagen&amp;lt;br/&amp;gt;&lt;br /&gt;
Son, 08. Jul 2007 16:00 - Nachricht über den Versand der RP6&amp;lt;br/&amp;gt;&lt;br /&gt;
Mon, 09. Jul 2007 00:15 - Bereitstellung der Library und der Beispielprogramme&amp;lt;br/&amp;gt;&lt;br /&gt;
Die, 10. Jul 2007 - Eintreffen der RP6 bei den Testern&amp;lt;br/&amp;gt;&lt;br /&gt;
Mon, 16. Jul 2007 - Auslieferungsbeginn des RP6&amp;lt;br/&amp;gt;&lt;br /&gt;
Fre, 24. Apr 2009 - Ankündigung der RP6 CCPRO M128 (Auslieferung schon ab Mitte April 2009)&amp;lt;br/&amp;gt;&lt;br /&gt;
Mon, 27. Feb 2012 - Ankündigung des RP6v2&amp;lt;br/&amp;gt;&lt;br /&gt;
Don, 08. Mär 2012 - Auslieferungsbeginn des RP6v2&amp;lt;br/&amp;gt;&lt;br /&gt;
Sam, 17. Mär 2012 - Ankündigung der RP6v2 M256 WiFi&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Siehe auch &amp;quot;Was bisher geschah&amp;quot; im [http://www.rn-wissen.de/index.php/RP6v2#Was_bisher_geschah RP6v2 Artikel]!'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Allgemein==  &lt;br /&gt;
[[Bild:DSC03448.JPG|thumb|RP6 mit Erweiterungsboard]] [[Bild:RP6_Lieferumfang.jpg|thumb|RP6 im Lieferumfang]]&lt;br /&gt;
Der von Arexx entwickelte RP6 ([http://www.conrad.de/ce/de/product/191524/C-Control-Robot-System-RP6-Robotersystem 191524]) ist ein autonomes Raupenfahrzeug, das nicht nur für Schüler und Studenten zum Einstieg in das Gebiet Robotik sondern auch für Fortgeschrittene Elektroniker und Bastler sehr gut geeignet ist, da das System für selbstentworfene Erweiterungen ausgelegt ist. Der RP6 wird von einem, unter Roboterentwicklern beliebten, AVR Microcontroller von Atmel gesteuert und hat Lichtsensoren in Form von zwei LDRs, 2 Bumper an der Stoßstange, 6 Status LEDs, Sensoren zur Überwachung der Akkuspannung, Drehgeber mit 625 CPR, ein Infrarot Sensor zur Hinderniserkennung und Kommunikation und Motorstromsensoren zur Verfügung. Zudem liegt dem Roboter eine umfangreiche Anleitung, inklusive einem kleinen C-Crashkurs, ein USB-Interface zum Anschluss an den PC und ein USB Kabel bei.&lt;br /&gt;
&lt;br /&gt;
In diesem Artikel geht es um die Grundlagen des RP6. Zur Programmierung des RP6 gibt es eine eigene Seite: [[RP6 - Programmierung]]&lt;br /&gt;
&lt;br /&gt;
==Technische Daten==&lt;br /&gt;
{|  {{Blauetabelle}} &lt;br /&gt;
|'''Mikrocontroller:'''&lt;br /&gt;
|AVR [[ATmega32]]&lt;br /&gt;
|-&lt;br /&gt;
|'''Speicher:'''&lt;br /&gt;
|32 kB [[Flash]]-Speicher, davon 1 kB bereits vom Bootloader belegt&amp;lt;br/&amp;gt;&lt;br /&gt;
2 kB RAM&amp;lt;br/&amp;gt; &lt;br /&gt;
1 kB [[EEPROM]]&lt;br /&gt;
|-&lt;br /&gt;
|'''Programmierung:'''&lt;br /&gt;
|Über AVR-[[Bootloader]], belegt ca. 1 kB des Flash-Speichers&lt;br /&gt;
|-&lt;br /&gt;
|'''Vorhandene Sensoren:'''&lt;br /&gt;
|2 [[Sensorarten#Helligkeit|Lichtsensoren (LDR)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
1 [[Sensorarten#Helligkeit|Infrarot (ACS - Anti Collision System)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
2 [[Sensorarten#Bumpers|Bumper]] &amp;lt;br/&amp;gt; &lt;br /&gt;
2 [[Sensorarten#Incremental-Geber|Drehgeber (Encoder)]]&lt;br /&gt;
|-&lt;br /&gt;
|'''Vorhandene Aktoren:'''&lt;br /&gt;
|2 Motoren&amp;lt;br/&amp;gt;&lt;br /&gt;
6 Status-LEDs&amp;lt;br/&amp;gt;&lt;br /&gt;
1 IR-Sender&amp;lt;br/&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|'''Abmessungen:'''&lt;br /&gt;
|(L &amp;amp;times; B &amp;amp;times; H) 172 &amp;amp;times; 128 &amp;amp;times; 50 mm&lt;br /&gt;
|-&lt;br /&gt;
|'''Ausführung:'''&lt;br /&gt;
|Fertig aufgebauter Roboter&lt;br /&gt;
|-&lt;br /&gt;
|'''Stromversorgung:'''&lt;br /&gt;
|6 AA NiMH Akkus&lt;br /&gt;
|-&lt;br /&gt;
|'''Hersteller:'''&lt;br /&gt;
|Arexx Niederlande&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Mechanik==&lt;br /&gt;
===Beschreibung===&lt;br /&gt;
&lt;br /&gt;
===Sensoren===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Encoder====&lt;br /&gt;
&lt;br /&gt;
Die Drehgeber sind an den Getrieben der Motoren zur Drehzahlmessung angebracht. Es handelt sich dabei um Reflexlichtschranken, die auf Codierscheiben mit je 18 weissen und 18 schwarzen Segmenten ausgerichtet sind, also insgesamt 36 Segmente. Diese Codierscheiben sind wiederum an je eines der Zahnräder der beiden Getriebe geklebt worden. Wenn es sich dreht, wandern die einzelnen Segmente an der Reflexlichtschranke vorbei. Die weissen Segmente reflektieren das Infrarotlicht, die schwarzen Segmente nur wenig. Jedes der zwei mittleren Stufenzahnräder des Getriebes hat 50 Zähne auf dem großen, und 12 auf dem kleineren Zahnrad. Die Codierscheiben befinden sich auf dem Zahnrad neben dem Motor, also rechnet man:&lt;br /&gt;
50/12 * 50/12 =17.13/36; 17.13/36 * 36=625&lt;br /&gt;
Daher haben die Encoderscheiben auch Ihre 36 Segmente, denn das gibt eine schöne runde Zahl ohne gebrochenen Anteil. Die Drehgeber erzeugen also 625 Flanken pro Radumdrehung wobei jede Flanke einem Segment entspricht. Bei einem Raddurchmesser von ca. 50mm inkl. Raupenkette, ergibt sich rein rechnerisch ein Radumfang von ca. 157mm was 0.2512mm pro Zählschritt der Drehgeber entspricht. Da sich die Raupenketten aber fast immer etwas in den Untergrund eindrücken (bzw. auch selbst eingedrückt werden) kann man aber von 0.25mm pro Zählschritt ausgehen – meist ist es sogar etwas weniger, z.B. nur 0.24 oder 0.23mm. Das muss man durch abfahren von Teststrecken ermitteln, wie es im Anhang grob beschrieben ist. Sehr genau ist das allerdings durch Radschlupf (bzw. hier müssten wir eigentlich von „Kettenschlupf“ sprechen) und ähnlichen Dingen nicht - vor allem beim Rotieren auf der Stelle. Beim normalen Geradeausfahren ist dieser Fehler klein, aber beim Rotieren kann er schnell sehr große Werte annehmen! Abweichungen muss man evtl. durch weitere Tests ermitteln und mit einkalkulieren. Das ist bei Raupenantrieben leider so – auch bei viel teureren und hochwertigeren Robotern. Dafür hat man aber den Vorteil, dass der Roboter mit Raupenantrieb recht geländegängig ist im Vergleich zu Robotern mit normalem Differentialantrieb mit zwei Antriebsrädern und Stützrad. Kleinere Hindernisse und Rampen kann er meist problemlos überwinden.&lt;br /&gt;
Dabei sind die Encoder sehr nützlich, denn man kann die Geschwindigkeit gut einregeln, egal wie der Untergrund und die Motorbelastung gerade aussieht. Bei gemessenen 50 Segmenten pro Sekunde liegt die Geschwindigkeit bei 1.25 cm/s, sofern wir von 0.25mm pro Zählschritt ausgehen. Etwa 50 Segmente pro Sekunde ist auch die geringste gerade noch regelbare Geschwindigkeit (das variiert aber etwas von Roboter zu Roboter). Bei 1200 Segmenten pro Sekunde wären es die maximal möglichen 30 cm/s (bei 0.25mm Auflösung, bei 0.23 sind es 27.6 cm/s). Standardmäßig begrenzt die Funktionsbibliothek das aber auf 1000 Flanken pro Sekunde. Die maximale Geschwindigkeit ist vom Ladezustand der Akkus abhängig – daher wären 30cm/s nicht besonders lange haltbar. Außerdem erhöht sich die Lebensdauer der Getriebe und Motoren je langsamer man fährt! Wenn der Roboter 4000 Segmente gezählt hat, ist er übrigens etwa einen Meter weit gefahren. Aber wie schon gesagt, gilt das natürlich nur für genau 0.25mm Auflösung. Ohne Kalibrierung hat man hier immer mehr oder weniger starke Abweichungen. Wem es nicht auf jeden mm ankommt, braucht nichts zu kalibrieren und kann einfach von 0.25mm oder besser 0.24mm ausgehen!&lt;br /&gt;
&lt;br /&gt;
====Stoßstangensensoren====&lt;br /&gt;
&lt;br /&gt;
Vorn am Roboter sind zwei Mikroschalter mit langem Schalthebel auf einer separaten&lt;br /&gt;
Platine untergebracht, die etwas vor der anderen Sensorplatine liegt. Dadurch werden&lt;br /&gt;
die IR LEDs auf der Sensorplatine geschützt und können nicht so leicht verbiegen&lt;br /&gt;
wenn der Roboter mal gegen ein Hindernis fährt. Die Stoßstange kann man auch abmontieren und z.B. gegen eine Schuss- oder Sammelvorrichtung für Bälle o.ä. ersetzen wenn man möchte.&lt;br /&gt;
&lt;br /&gt;
====Lichtsensoren====&lt;br /&gt;
&lt;br /&gt;
Vorne auf der kleinen Sensorplatine des Roboters sind zwei sog.&lt;br /&gt;
LDRs (=&amp;quot;Light Dependant Resistors&amp;quot; also lichtabhängige Widerstände)&lt;br /&gt;
platziert und nach links bzw. rechts ausgerichtet. Zwischen&lt;br /&gt;
den beiden Sensoren ist noch eine kleine schwarze&lt;br /&gt;
„Trennwand“ damit das Licht aus einer Richtung möglichst nur&lt;br /&gt;
einen der Sensoren erreicht. Sie bilden zusammen mit je einem&lt;br /&gt;
normalen Widerstand wie beim Batteriesensor einen Spannungsteiler – hier allerdings&lt;br /&gt;
um das Umgebungslicht zu messen.&lt;br /&gt;
&lt;br /&gt;
====Anti Collision System====&lt;br /&gt;
&lt;br /&gt;
Der aus Softwaresicht komplexeste Sensor des RP6 ist das ACS - das&lt;br /&gt;
„Anti Collision System“ (engl. für Anti Kollisions System)! Es besteht&lt;br /&gt;
aus einem IR Empfänger (s. Abb.) und zwei vorne auf der Sensorplatine&lt;br /&gt;
links und rechts angebrachten IR LEDs.&lt;br /&gt;
Da es je eine IR LED links und rechts gibt, kann das ACS grob unterscheiden ob sich&lt;br /&gt;
das Objekt links, rechts oder mittig vor dem Roboter befindet.&lt;br /&gt;
Man kann zusätzlich noch die Stromstärke mit der die beiden IR LEDs gepulst werden&lt;br /&gt;
in drei Stufen einstellen. Das ACS funktioniert aber auch in der höchsten Stufe nicht&lt;br /&gt;
mit allen Objekten immer zuverlässig, denn es kommt auf die Beschaffenheit der&lt;br /&gt;
Oberfläche des jeweiligen Objekts an! Ein schwarzes Objekt reflektiert das IR Licht natürlich&lt;br /&gt;
viel schlechter als ein weisses Objekt und ein kantiges und spiegelndes Objekt&lt;br /&gt;
könnte das IR Licht hauptsächlich in eine bestimme Richtung reflektieren. Die Reichweite&lt;br /&gt;
ist also immer vom jeweiligen Objekt abhängig! Das ist eine prinzipielle Schwäche&lt;br /&gt;
von so gut wie allen IR Sensoren (jedenfalls in dieser Preisklasse).&lt;br /&gt;
Trotzdem werden die meisten Hindernisse zuverlässig erkannt und können umfahren&lt;br /&gt;
werden. Falls das mal nicht klappt, gibt es noch die Stoßstange mit den Tastsensoren&lt;br /&gt;
und falls auch die nicht richtig getroffen werden, kann der Roboter noch mit den Motorstromsensoren&lt;br /&gt;
oder den Encodern erkennen, ob die Motoren blockieren (s.u.)!&lt;br /&gt;
Wem das nicht reicht, der könnte zusätzlich z.B. noch Ultraschallsensoren anbringen...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Erweiterungssystem===&lt;br /&gt;
Auf dem Mainboard sind 22 freie 3,2mm Löcher vorhanden (im Chassis weitere 16), auf denen die Erweiterungsmodule symmetrisch vorne und hinten gestapelt werden können. Weil der Stromverbrauch durch mehr Module steigt, ist es sinnvoll nur insgesamt 6-8 Module auf dem Roboter zu stapeln. Auf dem Mainboard selbst sind noch 6 kleine Erweiterungsflächen verfügbar (plus 2 sehr kleine auf der Bumperplatine).&lt;br /&gt;
&lt;br /&gt;
===Antrieb===&lt;br /&gt;
&lt;br /&gt;
Die 7,2 VDC Motoren sind im Chassis eingebaut und werden mithilfe der H-Brücken gesteuert. Die maximale Geschwindigkeit liegt bei 25cm/s, das kann je nach Akkuspannung aber variieren. Ohne Softwarebegrenzung sind sogar 30cm/s möglich, dadurch verringert sich aber die Lebensdauer der Motoren. Die maximale Steigung, die der RP6 bewältigen kann, ist 30%, ohne Bumperplatine 40%, das hängt aber auch vom Untergrund ab. Kleine Hindernisse wie Bücher und Stifte kann der RP6 problemlos überqueren. Die Achsen der Räder sind in selbstschmierenden Sinterlagern mit 4mm Durchmesser gelagert.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Elektromechanik==&lt;br /&gt;
===Beschreibung===&lt;br /&gt;
===Odometrie===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Elektronik==&lt;br /&gt;
[[Bild:RP6 Block.jpg|thumb|Blockdiagramm]]&lt;br /&gt;
===Beschreibung===&lt;br /&gt;
&lt;br /&gt;
===Sensoren (SENSORS)===&lt;br /&gt;
&lt;br /&gt;
Die meisten Sensoren über die der Roboter verfügt, haben wir ja schon in anderen Abschnitten kurz genannt, wollen diese nun aber etwas detaillierter betrachten.&lt;br /&gt;
In dem Blockdiagramm sind einige der Sensoren nicht in dem blauen Bereich &amp;quot;Sensors&amp;quot; zu sehen, weil sie besser in andere Bereiche passen. Trotzdem zählen natürlich auch die Drehgeber (= “Encoder“), Motorstromsensoren und der Batteriespannungssensor zu den Sensoren und werden darum in diesem Abschnitt beschrieben!&lt;br /&gt;
&lt;br /&gt;
====Batteriespannungs-Sensor (Voltage Sensor)====&lt;br /&gt;
&lt;br /&gt;
Dieser &amp;quot;Sensor&amp;quot; ist eigentlich nur ein einfacher Spannungsteiler aus zwei Widerständen. Wir gehen davon aus, dass die Batterien insgesamt maximal 10V liefern können. 6 NiMH Akkus werden immer unterhalb davon bleiben. Die Referenzspannung des ADC, also die Spannung mit der er die gemessene Spannung vergleicht, beträgt 5V. Da auch die Betriebsspannung 5V beträgt, darf diese nicht überschritten werden. Also müssen wir die zu messende Spannung um die Hälfte herabsetzen! Dies geschieht über einen Spannungsteiler aus zwei Widerständen, der die Spannung an den Messbereich des ADCs anpasst. Der ADC löst mit 10 Bit auf (Wertebereich 0 bis 1023), was eine Auflösung von 10V/1024=9.765625mV ergibt. Ein Messwert von 512 entspricht hier also 5V und 1023 wären ungefähr 10V! Diese Grenzwerte sollten aber normalerweise nie erreicht werden! Das ist nicht besonders genau, da die Widerstände keineswegs Präzisionswiderstände sind. Abweichungen von einigen Prozent nach oben und unten sind möglich. Auch die Referenzspannung von 5V ist nicht ganz genau und kann bei normaler Belastung etwas variieren. Das stört hier nicht, denn wir brauchen ohnehin nur einen ungefähren Wert um festzustellen ob die Batterien sich langsam dem Ende nähern. Wer die Spannung genau messen will, braucht ein Multimeter um den Messfehler zu ermitteln und diesen dann in Software auszugleichen. Wenn man mit Fehlern leben kann, kann man die Spannung dank des günstigen Umrechnungsverhältnisses sogar direkt aus den ADC Werten ungefähr abschätzen: 720 entsprechen dann grob 7.2V, 700 etwa 7V und 650 wären etwa 6.5V. Bei einem konstanten Wert unter 560 kann man davon ausgehen, dass die Akkus fast leer sind.&lt;br /&gt;
&lt;br /&gt;
====Motorstrom====&lt;br /&gt;
[[Bild:RP6_MSS.jpg|thumb]]&lt;br /&gt;
Es befinden sich zwei Leistungswiderstände in den beiden Motorstromkreisen. Aus dem Ohm'schen Gesetz U=RxI folgt, dass sich die Spannung die an einem bestimmten Widerstand abfällt, proportional zum Strom verhält, der diesen durchfließt!&lt;br /&gt;
Damit die Spannungsabfälle an den Widerständen nicht zu groß werden, müssen die Widerstände klein gewählt werden. In unserem Fall haben Sie einen Wert von 0.1 Ohm&lt;br /&gt;
Die abfallende Spannung ist also nur sehr klein (0.1V bei einem Strom von 1A) und muss verstärkt werden bevor sie mit dem ADC gemessen werden kann. Das erledigt jeweils ein sog. Operationsverstärker (OPV). In der Schaltung des RP6 wird je Motorkanal ein OPV verwendet. Der Messbereich geht etwa bis 1.8A. Bei 1.8A fallen etwa 0.18V am Widerstand ab und es ergibt sich am Ausgang des OPV eine Spannung von etwa 4V. Mehr kann der verwendete OPV bei 5V Betriebsspannung nicht ausgeben:&lt;br /&gt;
&lt;br /&gt;
I = U / ((1 + (100k / 4,7k)) * 0,1)&lt;br /&gt;
&lt;br /&gt;
Die Leistungswiderstände haben eine Toleranz von 10%, die Widerstände am OPV 5%, also ist das alles nur sehr ungenau (Ungenauigkeiten im Bereich von etwa 270mA sind möglich wenn man die Sensoren nicht kalibriert!). Wir brauchen allerdings auch nur den ungefähren Wert um festzustellen ob die Motoren stark oder wenig belastet werden. So kann der Roboter gut blockierte oder gar defekte Motoren bzw. Drehgeber erkennen! Die DC-Motoren benötigen mehr Strom je stärker sie belastet werden (Drehmoment) und somit steigt der Strom sehr stark an wenn die Motoren blockiert sind. Das wird von der Robotersoftware zur Notabschaltung verwendet: wenn die Motoren dauerhaft mit hohem Strom betrieben würden, könnten diese sehr heiß werden und dadurch Schaden nehmen! Und wenn die Encoder mal ausfallen sollten – aus welchem Grund auch immer – kann auch das damit erkannt werden. Man würde dann eine Drehzahl von 0 messen. Lässt man die Motoren aber auf voller Kraft laufen und der Strom bleibt trotzdem klein (also sind die Ketten nicht blockiert!), kann man genau daraus schließen, dass entweder die Encoder, oder die Motoren ausgefallen sind (oder Encoder und Motorstromsensoren nicht funktionieren... das passiert z.B. wenn man vergessen hat diese vorher per Software einzuschalten).&lt;br /&gt;
&lt;br /&gt;
====Encoder====&lt;br /&gt;
[[Bild:RP6_ENCODER.jpg|thumb]]&lt;br /&gt;
Ganz anders als die letztgenannten Sensoren funktionieren die Drehgeber, die an den Getrieben der Motoren zur Drehzahlmessung angebracht sind. Es handelt sich dabei um Reflexlichtschranken, die auf Codierscheiben mit je 18 weissen und 18 schwarzen Segmenten ausgerichtet sind, also insgesamt 36 Segmente (s. Abb). Diese Codierscheiben sind wiederum an je eines der Zahnräder der beiden Getriebe geklebt worden. Wenn es sich dreht, wandern die einzelnen Segmente an der Reflexlichtschranke vorbei. Die weissen Segmente reflektieren das Infrarotlicht, die schwarzen Segmente nur wenig. Die Drehgeber erzeugen so zwar auch wie die anderen Sensoren ein analoges Signal, aber es wird digital interpretiert. Zunächst wird das Signal verstärkt und anschließend über einen sog. Schmitt Trigger in ein Rechtecksignal umgewandelt. Die Flanken dieses Signals, also die Wechsel von 5 auf 0V und umgekehrt, lösen jeweils ein Interrupt Ereignis aus und diese werden dann von der Software gezählt. So kann die zurückgelegte Wegstrecke gemessen und zusammen mit einem Timer zur Zeitmessung die Drehzahl und damit auch die Geschwindigkeit ermittelt werden. Die Ermittlung der Drehzahl ist auch Hauptanwendung der Encoder – nur mit den Encodern kann man die Drehzahl auf den gewünschten Sollwert einregeln. Ohne Regelung wäre die Drehzahl nämlich von der Akkuspannung, Belastung der Motoren usw. abhängig. Die hohe Auflösung ermöglicht es dabei, auch niedrige Geschwindigkeiten noch relativ genau einzuregeln. Jedes der zwei mittleren Stufenzahnräder des Getriebes hat 50 Zähne auf dem großen, und 12 auf dem kleineren Zahnrad (s. Abb). Die Codierscheiben befinden sich auf dem Zahnrad neben dem Motor, also rechnet man:&lt;br /&gt;
&lt;br /&gt;
50/12 * 50/12 =17.13/36; 17.13/36 * 36=625&lt;br /&gt;
&lt;br /&gt;
Daher haben die Encoderscheiben auch Ihre 36 Segmente, denn das gibt eine schöne runde Zahl ohne gebrochenen Anteil. Die Drehgeber erzeugen also 625 Flanken pro Radumdrehung wobei jede Flanke einem Segment entspricht. Bei einem Raddurchmesser von ca. 50mm inkl. Raupenkette, ergibt sich rein rechnerisch ein Radumfang von ca. 157mm was 0.2512mm pro Zählschritt der Drehgeber entspricht. Da sich die Raupenketten aber fast immer etwas in den Untergrund eindrücken (bzw. auch selbst eingedrückt werden) kann man aber von 0.25mm pro Zählschritt ausgehen – meist ist es sogar etwas weniger, z.B. nur 0.24 oder 0.23mm. Das muss man durch abfahren von Teststrecken ermitteln, wie es im Anhang grob beschrieben ist. Sehr genau ist das allerdings durch Radschlupf (bzw. hier müssten wir eigentlich von „Kettenschlupf“ sprechen) und ähnlichen Dingen nicht - vor allem beim Rotieren auf der Stelle. Beim normalen Geradeausfahren ist dieser Fehler klein, aber beim Rotieren kann er schnell sehr große Werte annehmen! Abweichungen muss man evtl. durch weitere Tests ermitteln und mit einkalkulieren. Das ist bei Raupenantrieben leider so – auch bei viel teureren und hochwertigeren Robotern. Dafür hat man aber den Vorteil, dass der Roboter mit Raupenantrieb recht geländegängig ist im Vergleich zu Robotern mit normalem Differentialantrieb mit zwei Antriebsrädern und Stützrad. Kleinere Hindernisse und Rampen kann er meist problemlos überwinden.&lt;br /&gt;
Dabei sind die Encoder sehr nützlich, denn man kann die Geschwindigkeit gut einregeln, egal wie der Untergrund und die Motorbelastung gerade aussieht. Bei gemessenen 50 Segmenten pro Sekunde liegt die Geschwindigkeit bei 1.25 cm/s, sofern wir von 0.25mm pro Zählschritt ausgehen. Etwa 50 Segmente pro Sekunde ist auch die geringste gerade noch regelbare Geschwindigkeit (das variiert aber etwas von Roboter zu Roboter). Bei 1200 Segmenten pro Sekunde wären es die maximal möglichen 30 cm/s (bei 0.25mm Auflösung, bei 0.23 sind es 27.6 cm/s). Standardmäßig begrenzt die Funktionsbibliothek das aber auf 1000 Flanken pro Sekunde. Die maximale Geschwindigkeit ist vom Ladezustand der Akkus abhängig – daher wären 30cm/s nicht besonders lange haltbar. Außerdem erhöht sich die Lebensdauer der Getriebe und Motoren je langsamer man fährt!&lt;br /&gt;
&lt;br /&gt;
=====Encoder justieren=====&lt;br /&gt;
Damit der RP6 die Signale der Drehgeber richtig auswerten kann, muss man evtl. die Drehgeber einmalig justieren. Dies kann auch schon bei einem neu gekauften RP6 notwendig sein.&lt;br /&gt;
Eine genaue Anleitung dazu findet man [http://www.arexx.com/rp6/downloads/RP6_ENCODER_DE_20071219.zip hier]. Es gibt auch ein [http://www.arexx.com/rp6/downloads/rp6_encoder_video.zip Video], das die Drehgeber-Justierung zeigt.&lt;br /&gt;
&lt;br /&gt;
=====Encoder kalibrieren=====&lt;br /&gt;
Wenn der Roboter 4000 Segmente gezählt hat, ist er etwa einen Meter weit gefahren. Aber wie schon gesagt, gilt das natürlich nur für genau 0.25mm Auflösung. Ohne Kalibrierung hat man hier immer mehr oder weniger starke Abweichungen. Wem es nicht auf jeden mm ankommt, braucht nichts zu kalibrieren und kann einfach von 0.25mm oder besser 0.24mm ausgehen!&lt;br /&gt;
Optimal ist es, wenn man sich für Weg- und Winkelmessungen nicht auf die Encoder Daten stützen muss, sondern externe Systeme wie Infrarotbaken oder einen genauen elektronischen Kompass dazu zur Verfügung hat.&lt;br /&gt;
&lt;br /&gt;
Will man die Drehgeber des RP6 dennoch kalibrieren, kann man ihn z.B. mit diesem Testprogramm:&lt;br /&gt;
&amp;lt;pre&amp;gt;#include &amp;quot;RP6RobotBaseLib.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
	initRobotBase();&lt;br /&gt;
	powerON();&lt;br /&gt;
&lt;br /&gt;
	// Test: Go ahead 1m and stop!&lt;br /&gt;
	move (80, FWD, DIST_MM(1000), true);&lt;br /&gt;
	writeString_P(&amp;quot;LEFT RIGHT&amp;quot;);&lt;br /&gt;
 	writeString_P(&amp;quot;\n&amp;quot;);&lt;br /&gt;
 	writeInteger(mleft_dist, DEC);&lt;br /&gt;
	writeChar(' ');&lt;br /&gt;
 	writeInteger(mright_dist, DEC);&lt;br /&gt;
	writeString_P(&amp;quot;\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
	powerOFF();&lt;br /&gt;
&lt;br /&gt;
	return 0;&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
... 1m weit fahren lassen und dann messen, wie weit er tatsächlich gefahren ist. Das Programm gibt auf dem Terminal den Stand der Drehgeber aus. Teilt man dann die gemessene Fahrstrecke in mm durch den Wert der Drehgeber, erhält man die Auflösung. Diesen Wert kann man dann der Konstanten ENCODER_RESOLUTION in der RP6Config.h zuweisen. Nach &amp;quot;Make Clean&amp;quot;, einer Neukompilierung und erneuter Ausführung des Testprogramms müßte der RP6 jetzt genau 1m weit fahren. Das gilt zumindest für den Untergrund, auf dem die Kalibrierung durchgeführt wurde.&lt;br /&gt;
&lt;br /&gt;
====Stoßstangensensoren (Bumper)====&lt;br /&gt;
&lt;br /&gt;
Vorn am Roboter sind zwei Mikroschalter mit langem Schalthebel auf einer separaten&lt;br /&gt;
Platine untergebracht, die etwas vor der anderen Sensorplatine liegt. Dadurch werden&lt;br /&gt;
die IR LEDs auf der Sensorplatine geschützt und können nicht so leicht verbiegen&lt;br /&gt;
wenn der Roboter mal gegen ein Hindernis fährt. Mit den zwei Schaltern kann der Mikrocontroller&lt;br /&gt;
einen solchen Aufprall registrieren und dann beispielsweise zurücksetzen,&lt;br /&gt;
sich etwas drehen und weiterfahren. Die Schalter sind an zwei der Ports die schon mit&lt;br /&gt;
den LEDs verbunden sind angeschlossen und blockieren so keine anderen Ports des&lt;br /&gt;
Mikrocontrollers. Daher leuchten die LEDs auch immer wenn man einen der Schalter&lt;br /&gt;
drückt! Da dies normalerweise relativ selten passiert, stört das aber nicht weiter.&lt;br /&gt;
Die Stoßstange kann man auch abmontieren und z.B. gegen eine Schuss- oder Sammelvorrichtung&lt;br /&gt;
für Bälle o.ä. ersetzen wenn man möchte.&lt;br /&gt;
&lt;br /&gt;
====Lichtsensoren (LDRs)====&lt;br /&gt;
[[Bild:RP6_Licht.jpg|thumb]]&lt;br /&gt;
Vorne auf der kleinen Sensorplatine des Roboters sind zwei sog.&lt;br /&gt;
LDRs (=&amp;quot;Light Dependant Resistors&amp;quot; also lichtabhängige Widerstände)&lt;br /&gt;
platziert und nach links bzw. rechts ausgerichtet. Zwischen&lt;br /&gt;
den beiden Sensoren ist noch eine kleine schwarze&lt;br /&gt;
„Trennwand“ damit das Licht aus einer Richtung möglichst nur&lt;br /&gt;
einen der Sensoren erreicht. Sie bilden zusammen mit je einem&lt;br /&gt;
normalen Widerstand wie beim Batteriesensor einen Spannungsteiler – hier allerdings&lt;br /&gt;
um das Umgebungslicht zu messen. Die 5V Betriebsspannung wird auch geteilt, aber&lt;br /&gt;
hier ist einer der Widerstände variabel! Es wird also das Teilungsverhältnis je nach Intensität&lt;br /&gt;
des Lichteinfalls verändert und somit eine vom Lichteinfall abhängige Spannung&lt;br /&gt;
an einen der A/D Wandler Kanäle geleitet!&lt;br /&gt;
Über den Spannungsunterschied zwischen den beiden Sensoren kann man ermitteln in&lt;br /&gt;
welcher Richtung sich eine bzw. die hellste Lichtquelle vor dem Roboter befindet:&lt;br /&gt;
Links, Rechts oder in der Mitte. Mit einem entsprechenden Programm, kann man so z.B. eine starke Taschenlampe in&lt;br /&gt;
einem abgedunkelten Zimmer verfolgen, oder den Roboter die hellste Stelle in einem&lt;br /&gt;
Raum suchen lassen! Klappt z.B. sehr gut mit einem stärkeren Hand-Halogenscheinwerfer:&lt;br /&gt;
Wenn man damit auf den Boden leuchtet, kann der Roboter dem Lichtfleck auf&lt;br /&gt;
dem Boden folgen.&lt;br /&gt;
Das geht natürlich auch umgekehrt: Der Roboter könnte z.B. auch versuchen sich vor&lt;br /&gt;
hellem Licht zu verstecken...&lt;br /&gt;
Wenn man noch ein oder zwei LDRs hinten am Roboter anbringen würde, könnte man&lt;br /&gt;
das noch verfeinern und die Richtung in der sich Lichtquellen befinden besser bestimmen.&lt;br /&gt;
Der Roboter kann sonst nämlich oft nur schwer unterscheiden ob die Lichtquelle&lt;br /&gt;
vor oder hinter ihm liegt. Zwei der A/D Wandler Kanäle sind noch frei...&lt;br /&gt;
&lt;br /&gt;
====Anti Collision System (ACS)====&lt;br /&gt;
[[Bild:RP6 ACS.jpg|thumb|Das ACS]]&lt;br /&gt;
Der aus Softwaresicht komplexeste Sensor des RP6 ist das ACS - das „Anti Collision System“ (engl. für Anti Kollisions System)! Es besteht aus einem IR Empfänger (s. Abb.) und zwei vorne auf der Sensorplatine links und rechts angebrachten IR LEDs. Die IR LEDs werden direkt vom Mikrocontroller angesteuert. Die Ansteuerungsroutinen können beliebig verändert und verbessert werden! Beim Vorgängermodell war dafür noch ein eigener Controller nötig, dessen Programm aber nicht vom Anwender geändert werden konnte...&lt;br /&gt;
Mit den IR LEDs werden kurze, mit 36kHz modulierte Infrarot Impulse ausgesandt, auf die der darauf ausgelegte IR Empfänger reagiert. Werden die IR Impulse an einem Gegenstand vor dem Roboter reflektiert und vom IR Empfänger detektiert, kann der Mikrocontroller darauf reagieren und z.B. ein Ausweichmanöver einleiten. Damit das ACS nicht zu empfindlich bzw. auf eventuelle Störungen reagiert, wartet die Software bis eine bestimmte Anzahl von Impulsen in einer bestimmten Zeit empfangen worden ist. Es wird auch eine Synchronisation mit dem RC5 Empfang durchgeführt und auf die RC5 Signale von TV/Hifi Fernbedienungen wird so nicht reagiert. Bei anderen Codes kann das aber nicht garantiert werden und das ACS könnte dann Hindernisse erkennen, wo gar keine sind! Da es je eine IR LED links und rechts gibt, kann das ACS grob unterscheiden ob sich das Objekt links, rechts oder mittig vor dem Roboter befindet.&lt;br /&gt;
Man kann zusätzlich noch die Stromstärke mit der die beiden IR LEDs gepulst werden in drei Stufen einstellen. Das ACS funktioniert aber auch in der höchsten Stufe nicht mit allen Objekten immer zuverlässig, denn es kommt auf die Beschaffenheit der Oberfläche des jeweiligen Objekts an! Ein schwarzes Objekt reflektiert das IR Licht natürlich viel schlechter als ein weisses Objekt und ein kantiges und spiegelndes Objekt könnte das IR Licht hauptsächlich in eine bestimme Richtung reflektieren. Die Reichweite ist also immer vom jeweiligen Objekt abhängig! Das ist eine prinzipielle Schwäche von so gut wie allen IR Sensoren (jedenfalls in dieser Preisklasse).&lt;br /&gt;
Trotzdem werden die meisten Hindernisse zuverlässig erkannt und können umfahren werden. Falls das mal nicht klappt, gibt es noch die Stoßstange mit den Tastsensoren und falls auch die nicht richtig getroffen werden, kann der Roboter noch mit den Motorstromsensoren oder den Encodern erkennen, ob die Motoren blockieren (s.u.)!&lt;br /&gt;
Wem das nicht reicht, der könnte zusätzlich z.B. noch Ultraschallsensoren anbringen...&lt;br /&gt;
&lt;br /&gt;
====IR-Kommunikation (IRCOMM)====&lt;br /&gt;
Der RP6 kann über die IR-LEDs links und rechts über der Bumper-Platine Daten zu anderen IR-Empfängern senden.  Es ist z.B. möglich, dass mehrere Roboter ihre Sensorwerte untereinander vergleichen.&lt;br /&gt;
&lt;br /&gt;
====6 Status-LEDs====&lt;br /&gt;
Die Status-LEDs sind vorne links und rechts über den Lichtsensoren auf der Hauptplatine angebracht.&lt;br /&gt;
&lt;br /&gt;
Über die Status-LEDs können Sensorzustände, z.B. des ACS, der Bumper oder der Lichtsensoren, dargestellt werden.&lt;br /&gt;
&lt;br /&gt;
====IR-Sender====&lt;br /&gt;
Über den IR-Sender können Daten zu anderen Geräten übertragen werden.&lt;br /&gt;
&lt;br /&gt;
===Erweiterungssystem (EXPANSION SYSTEM)===&lt;br /&gt;
[[Bild:RP6_EXP.jpg|thumb]]&lt;br /&gt;
Eines der nützlichsten Features des RP6 ist das Erweiterungssystem.&lt;br /&gt;
Man kann den RP6 damit genau so weit ausbauen,&lt;br /&gt;
wie man es benötigt. Aus Kostengründen bietet das&lt;br /&gt;
Basissystem schließlich nur relativ wenig Sensoren. Es sind&lt;br /&gt;
zwar schon mehr als bei vielen anderen Robotern in dieser&lt;br /&gt;
Preisklasse, aber erst mit weiteren Sensoren macht ein Roboter&lt;br /&gt;
so richtig Spaß. Das ACS kann beispielsweise nur grob&lt;br /&gt;
erkennen ob sich ein Hindernis vor dem Roboter befindet.&lt;br /&gt;
Mit Ultraschallsensoren oder besseren zusätzlichen IR Sensoren,&lt;br /&gt;
könnte man aber die Distanz ermitteln und so beispielsweise&lt;br /&gt;
bessere Ausweichmanöver fahren!&lt;br /&gt;
&lt;br /&gt;
Neben Sensoren macht es auch sehr viel Sinn, zusätzliche Controller einzubauen um&lt;br /&gt;
die anfallenden Aufgaben aufteilen zu können. Beispielsweise die RP6 CONTROL M32&lt;br /&gt;
Platine mit einem weiteren MEGA32 Mikrocontroller oder die CCPRO M128.&lt;br /&gt;
&lt;br /&gt;
Das Erweiterungssystem muss natürlich in der Lage sein, viele Erweiterungsmodule&lt;br /&gt;
miteinander zu verbinden, dabei mit wenigen Signalleitungen&lt;br /&gt;
auskommen und eine ausreichend hohe Geschwindigkeit bieten.&lt;br /&gt;
&lt;br /&gt;
Siehe [[I2C]]&lt;br /&gt;
&lt;br /&gt;
===Steuerung (CONTROL SYSTEM)===&lt;br /&gt;
&lt;br /&gt;
====Hauptprozessor (ATMEGA32)====&lt;br /&gt;
[[Bild:RP6_MEGA32.jpg|thumb|Der MEGA32]]&lt;br /&gt;
Der Hauptprozessor ist der ATMEGA32 vom Atmel. Er hat 32KB Flash ROM und 2KB RAM. Der ATMEGA ist mit 8Mhz getaktet, kann also bis zu 8 Millionen Befehle pro Sekunde ausführen. Es sind 32 I/O-Pins  am Controller verfügbar. Die I/O-Pins gehören zu I/O-Ports mit jeweils 8 Pins. Davon gibt es 4: PORTA, PORTB, PORTC und PORTD. Der Controller kann die Ports entweder ein oder ausschalten (Output), oder erkennen, ob Spannung angelegt wurde oder nicht (Input). Es gibt mehrere Module, die verschiedene Aufgaben übernehmen:&lt;br /&gt;
* 3 Timer, einer davon erzeugt die PWM-Signale für die Motoren&lt;br /&gt;
* Die serielle Schnittstelle (UART)&lt;br /&gt;
* Das TWI (Two Wire Interface, also Zweidraht Schnittstelle)&lt;br /&gt;
* Ein ADC (Analog to Digital Converter) mit 8 Eingangskanälen, welche mit 10bit (0-1023) auflösen&lt;br /&gt;
* Drei externe Interrupt Eingänge&lt;br /&gt;
&lt;br /&gt;
Auserdem befindet sich im Microcontroller ein sog. Bootloader, welcher mit dem RP6 Loader kommuniziert und neue Programme in den Speicher lädt.&lt;br /&gt;
&lt;br /&gt;
===Antrieb (DRIVE SYSTEM)===&lt;br /&gt;
[[Bild:RP6_H-Brücke.jpg|thumb|Die H-Brücke]]&lt;br /&gt;
[[Bild:RP6_Tastverhältniss.jpg|thumb]]&lt;br /&gt;
Der Antrieb des RP6 besteht aus zwei Gleichstrom Motoren mit nachgeschaltetem Getriebe,&lt;br /&gt;
über das die beiden Raupenketten angetrieben werden.&lt;br /&gt;
Die Motoren genehmigen sich je nach Belastung&lt;br /&gt;
einen recht hohen Strom und können&lt;br /&gt;
natürlich nicht direkt vom Mikrocontroller&lt;br /&gt;
angesteuert werden. Dazu braucht man&lt;br /&gt;
Leistungstreiber in Form von je einer H-Brücke&lt;br /&gt;
pro Motor. Das grundlegende Prinzip&lt;br /&gt;
ist in der nebenstehenden Abbildung dargestellt.&lt;br /&gt;
Eine H-Brücke besteht aus vier&lt;br /&gt;
&amp;quot;Schaltern&amp;quot;, die in Form eines H's um einen&lt;br /&gt;
Motor angeordnet sind. Nehmen wir mal an,&lt;br /&gt;
zunächst seien alle Schalter aus. Schaltet&lt;br /&gt;
man dann S1 und S4 (Rot) an, liegt eine&lt;br /&gt;
Spannung am Motor an und er dreht sich&lt;br /&gt;
z.B. nach rechts. Schalten wir nun S1 und&lt;br /&gt;
S4 wieder aus und danach S2 und S3 (Grün)&lt;br /&gt;
an, wird die am Motor anliegende Spannung umgepolt und er dreht sich in die entgegen gesetzte&lt;br /&gt;
Richtung, also nach links! Man muss darauf achten, nicht gleichzeitig S1&lt;br /&gt;
und S2, oder S3 und S4 einzuschalten, sonst entstünde ein Kurzschluss und dadurch&lt;br /&gt;
könnten die &amp;quot;Schalter&amp;quot; zerstört werden!&lt;br /&gt;
Natürlich verwenden wir auf dem RP6 keine mechanischen Schalter, sondern sog.&lt;br /&gt;
MOSFETs. Diese schalten beim Anlegen einer genügend hohen Spannung am Eingang&lt;br /&gt;
durch. Die Schaltvorgänge können sehr schnell erfolgen, mehrere Kilohertz sind bei&lt;br /&gt;
unserer Anwendung möglich.&lt;br /&gt;
So kann man also schon mal die Drehrichtung einstellen. Und wie bekommt man den&lt;br /&gt;
Motor nun schneller bzw. langsamer? Ein Elektromotor dreht umso schneller, je höher&lt;br /&gt;
die angelegte Spannung ist. Die Drehzahl kann also über die Spannung eingestellt&lt;br /&gt;
werden - und genau dazu können wir die H-Brücke auch verwenden!&lt;br /&gt;
Die Abbildung verdeutlicht das Prinzip&lt;br /&gt;
nach dem wir vorgehen können.&lt;br /&gt;
Wir erzeugen&lt;br /&gt;
ein Rechtecksignal fester Frequenz,&lt;br /&gt;
bei dem wir das sog. Tastverhältnis&lt;br /&gt;
verändern. Mit &amp;quot;Tastverhältnis&amp;quot; ist das&lt;br /&gt;
Verhältnis von der eingeschalteten zur&lt;br /&gt;
ausgeschalteten Zeit des Signals gemeint.&lt;br /&gt;
Am Motor liegt dann effektiv eine niedrigere,&lt;br /&gt;
mittlere Gleichspannung an, die dem&lt;br /&gt;
Tastverhältnis entspricht. In der Grafik ist&lt;br /&gt;
dies durch eine rote Linie (Ug) und die roten&lt;br /&gt;
Flächen verdeutlicht. Wenn z.B. eine&lt;br /&gt;
Spannung von 7 Volt von den Akkus an&lt;br /&gt;
den Motortreibern anliegt, und diese mit&lt;br /&gt;
einem Tastverhältnis von 50% angesteuert werden, würde die mittlere Spannung in&lt;br /&gt;
etwa bei der Hälfte, also 3.5V liegen! Das stimmt real nicht ganz, aber so kann man&lt;br /&gt;
es sich schon gut und einfach vorstellen.&lt;br /&gt;
Das Antriebssystem ist dank der hohen Untersetzung (~ 1:72) relativ stark und so&lt;br /&gt;
kann der RP6 viel schwerere Lasten tragen als es z.B. der kleine Roboter ASURO&lt;br /&gt;
könnte. Allerdings steigt mit zunehmendem Gewicht natürlich auch der Energiebedarf&lt;br /&gt;
und die Akkus werden schneller leer sein ...&lt;br /&gt;
Im Vergleich mit einem ferngesteuerten Rennwagen o.ä. könnte man denken der RP6&lt;br /&gt;
sei langsam - stimmt auch - das ist jedoch absichtlich so! Der Roboter wird von einem&lt;br /&gt;
Mikrocontroller gesteuert und wenn der Programmierer einen Fehler bei der Programmierung&lt;br /&gt;
gemacht hat, wäre es ungünstig mit 10km/h vor die Wand zu prallen! Bei&lt;br /&gt;
dem eher gemächlichen Tempo des RP6 passiert aber nicht so schnell etwas und nebenbei&lt;br /&gt;
haben die Sensoren mehr Zeit die Umgebung auf Hindernisse zu untersuchen.&lt;br /&gt;
Und da wäre natürlich noch der Vorteil der höheren Belastbarkeit und der viel genaueren&lt;br /&gt;
Geschwindigkeitsregelung!&lt;br /&gt;
&lt;br /&gt;
===Stromversorgung (POWER SUPPLY)===&lt;br /&gt;
[[Bild:RP6_IC1.jpg|thumb]]&lt;br /&gt;
Natürlich benötigt ein Roboter Energie. Diese trägt der RP6 gespeichert in 6 Akkus mit&lt;br /&gt;
sich herum. Die Laufzeit ist durch die Kapazität der Akkus eingeschränkt, denn auch&lt;br /&gt;
wenn die Elektronik verhältnismäßig wenig Energie benötigt, schlucken die Motoren je&lt;br /&gt;
nach Belastung doch ziemlich viel.&lt;br /&gt;
&lt;br /&gt;
Damit die Akkus möglichst lange halten und der Roboter nicht ständig Pause machen&lt;br /&gt;
muss, sollte man ihm daher etwas größere Energiespeicher mit etwa 2500mAh gönnen.&lt;br /&gt;
Kleinere mit 2000mAh oder mehr funktionieren aber auch. Mit guten Akkus kann&lt;br /&gt;
man 3 bis 6 Stunden oder mehr Laufzeit erreichen, abhängig von der Betriebszeit der&lt;br /&gt;
Motoren, deren Belastung und Qualität der Akkus. Die 6 Akkus die notwendig sind,&lt;br /&gt;
haben insgesamt eine Nennspannung von 6x 1.2V = 7.2V. Im Blockdiagramm ist dies&lt;br /&gt;
mit &amp;quot;UB&amp;quot; (= &amp;quot;U-Battery&amp;quot;, U ist der Formelbuchstabe für Spannung) bezeichnet. „Nennspannung&amp;quot;,&lt;br /&gt;
weil sich die Spannung mit der Zeit stark verändert. Voll aufgeladen können&lt;br /&gt;
die Akkus im Leerlauf insgesamt bis zu 8.5V liefern! Diese Spannung sinkt während&lt;br /&gt;
der Entladung ab und schwankt auch je nach Belastung (Motoren an oder aus,&lt;br /&gt;
schnell langsam etc. - wie stark die Spannung schwankt, hängt auch von der Qualität&lt;br /&gt;
der verwendeten Akkus ab. Der Innenwiderstand ist hier die kritische Größe).&lt;br /&gt;
Das ist für Messungen von Sensorwerten und ähnlichem natürlich nicht ohne weiteres&lt;br /&gt;
brauchbar. Noch wichtiger ist jedoch, dass viele der verwendeten Komponenten wie&lt;br /&gt;
z.B. der Mikrocontroller nur auf 5V oder weniger Betriebsspannung ausgelegt sind und&lt;br /&gt;
bei so hohen Spannungen zerstört würden. Die Akku Spannung muss also auf einen&lt;br /&gt;
definierten Wert heruntergeregelt und stabilisiert werden!&lt;br /&gt;
Das übernimmt ein 5V Spannungsregler, der einen Strom von&lt;br /&gt;
maximal 1.5A liefern kann (s. Abb.). Bei 1.5A würde er jedoch&lt;br /&gt;
ziemlich viel Wärme abgeben. Es gibt daher eine große Kühlfläche&lt;br /&gt;
auf der Platine an die der Regler festgeschraubt ist. Über 1A&lt;br /&gt;
sollte der Regler trotz Kühlung besser nur kurzzeitig (also wenige&lt;br /&gt;
Sekunden) belastet werden, wenn man nicht noch einen zusätzlichen&lt;br /&gt;
großen Kühlköper draufschraubt.&lt;br /&gt;
&lt;br /&gt;
Es wird empfohlen, 800mA Dauerlast nicht zu überschreiten! Bei&lt;br /&gt;
so einer Belastung und zusammen mit den Motoren wären die&lt;br /&gt;
Akkus auch recht schnell leer. Im normalen Betrieb ohne ein Erweiterungsboard&lt;br /&gt;
nimmt der Roboter übrigens nicht mehr als 40mA auf (ausser wenn&lt;br /&gt;
das IRCOMM sendet), also überhaupt kein Problem für den Regler und man hat noch&lt;br /&gt;
genug Reserven für die Erweiterungsmodule, die meistens auch nicht mehr als 50mA&lt;br /&gt;
aufnehmen sofern keine Motoren, große LEDs o.ä. daran angeschlossen sind.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Umbau-Optionen==&lt;br /&gt;
Hier soll beschrieben werden, welche Umbau-Optionen es für die RP6 Base gibt. Im Text gibt es Verweise auf den Schaltplan des RP6 (RP6_MAINBOARD.PDF) in der Form: (SP2 B1: Bauteil). Dies bedeutet, dass man das Bauteil auf Blatt 2 des RP6-Schaltplans im Feld B1 finden kann. Beispielhaft sind im folgenden Text Bestell-Nummern der Firma [http://www.conrad.de/ce/ CONRAD] genannt. Natürlich kann man die Teile auch bei anderen Versendern beziehen.&lt;br /&gt;
&lt;br /&gt;
Bei den Materialangaben ist öfter die Rede von &amp;quot;Steckbuchsen mit Litze&amp;quot;. Diese Steckbuchsen mit angelöteter Litze können auf die ein- oder zweireihigen Stiftleisten aufgesteckt werden. Leider gibt es sie nicht (mehr) fertig konfektioniert bei CONRAD. Die einreihigen Steckbuchsen (RM 2,54mm) kann man aber z.B. bei [http://www.elv.de/output/controller.aspx ELV] bekommen: 2-polig (68-016635), 3-polig (68-022503) und 5-polig (68-023073). An sie muss man dann noch Litzen in der entsprechenden Länge selbst anlöten.&lt;br /&gt;
&lt;br /&gt;
===Elko für den IR-Empfänger===&lt;br /&gt;
[[Bild:RP6_C29_TSOP.JPG|thumb|RP6 C29 TSOP]]&lt;br /&gt;
Zur Spannungsstabilisierung kann ein Elko (C29; SP2 E1: C29*) am TSOP 34836 eingelötet werden.&lt;br /&gt;
&lt;br /&gt;
Normalerweise ist dieser Elko nicht erforderlich.&lt;br /&gt;
&lt;br /&gt;
Man braucht dazu:&lt;br /&gt;
* Einen Elektrolyt-Kondensator stehend 10 uF / 16V (C29); RM 2,5mm (445631)&lt;br /&gt;
&lt;br /&gt;
Der Elko kann auch eine geringere Kapazität als 10 uF haben (1 uF bis 4,7 uF reichen auch). Man lötet den Elko auf seinen Platz. Bitte auf die Polung achten: Der Minuspol zeigt nach vorn (in Fahrtrichtung des RP6).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Anschlüsse===&lt;br /&gt;
Hier wird aufgelistet, wo man auf dem RP6 Mainboard Anschlüsse nutzen kann, um sie z.B. zu weiteren Sensoren, zum USRBUS oder (weniger empfehlenswert!) direkt zu EPs oder Erweiterungsplatinen (M32, CCPRO M128) zu führen.&lt;br /&gt;
&lt;br /&gt;
====Analoge Sensoren an ADC0/1====&lt;br /&gt;
[[Bild:RP6_ADC01.JPG|thumb|RP6 ADC0/1]]&lt;br /&gt;
&lt;br /&gt;
Wenn man bis zu zwei analoge Sensoren (z.B. IR-Distanz-Mess-Sensoren Sharp GP2Y0A02YK 185364) direkt an den RP6 anschließen möchte, dann gibt es da zwei 3-polige Kontakte, beschriftet mit VDD/GND/ADCx (x = 0..1). Hier kann man 3-polige Stiftleisten auflöten, an die dann die Sensoren angeschlossen werden.&lt;br /&gt;
&lt;br /&gt;
Man braucht dazu:&lt;br /&gt;
* 1-reihige Stiftleiste RM 2,54mm (z.B. 36-polig 732478)&lt;br /&gt;
* Zwei Keramik-Vielschicht-Kondensatoren 100nF (C27, C28); RM 2,54mm (453099)&lt;br /&gt;
* ENTWEDER einen Elektrolyt-Kondensator stehend 220 uF / 16V (C26); RM 3,5mm (445903)&lt;br /&gt;
* ODER einen Elektrolyt-Kondensator stehend 470 uF / 16V (C26); RM 3,5mm (446211)&lt;br /&gt;
* Zwei 3-polige Steckbuchsen mit Litze zum Anschluß der Sensoren&lt;br /&gt;
&lt;br /&gt;
Man trennt nun von der 1-reihigen Stiftleiste zweimal 3 Kontakte ab und lötet sie auf die weiß umrahmten Kontakte (VDD/GND/ADCx; SP2 B1: ADC0, ADC1), anschließend C27, C28 (SP2 A1: C27*, C28*) auf ihre Plätze und zum Schluß den Elko 220 uF oder 470 uF (C26; SP2 A1: C26*). Der Elko ist nur bei Sensoren mit hohem Strombedarf notwendig, siehe dazu auch Anleitung des RP6, Seite 136! Beim Elko auf die Polung achten: Er muss so sitzen, dass er mit seinem Pluspol in Fahrtrichtung des RP6 (nach vorn) schaut.&lt;br /&gt;
&lt;br /&gt;
Die Sensoren lötet man an die Litzen der 3-poligen Steckbuchsen und steckt diese auf die neuen Kontakte.&lt;br /&gt;
&lt;br /&gt;
Da manche Sensoren einen höheren Stromverbrauch haben, kann man die Stromversorgung an den VDD-Pins der ADC0/1-Stecker abschaltbar machen oder eine separate +5V-Spannung einspeisen. Siehe dazu den Abschnitt &amp;quot;Trennstellen - Getrennte Stromversorgung für ADC0/1&amp;quot; weiter unten!&lt;br /&gt;
&lt;br /&gt;
====ISP (In System Programming)====&lt;br /&gt;
Der ATMEGA32 des RP6 wird standardmäßig über den PROG/UART Stecker programmiert. Dazu befindet sich im Prozessor ein Bootloader-Programm. Wenn man stattdessen oder zusätzlich die ISP-Programmierung mit einem dafür geeigneten ISP-Programmier-Adapter nutzen will, kann man den Adapter an einen (noch einzulötenden) Wannenstecker auf dem RP6 anschließen.&lt;br /&gt;
Vorher sind aber ein paar &amp;quot;Umbauarbeiten&amp;quot; erforderlich.&lt;br /&gt;
&lt;br /&gt;
Man braucht dazu:&lt;br /&gt;
* 1-reihige Stiftleiste RM 2,54mm (z.B. 36-polig 732478)&lt;br /&gt;
* Wannenstecker 2x5-polig gerade RM 2,54mm (z.B. [http://www.reichelt.de./ Reichelt] WSL 10G)&lt;br /&gt;
* Eine SMD-Diode LL 4148 (140902)&lt;br /&gt;
* Eine Codierbrücke (z.B. aus Set 742902)&lt;br /&gt;
&lt;br /&gt;
Zwischen dem XBUS-Stecker und C13 befinden sich 10 Lötpunkte für den ISP-Anschluß, auf die der Wannenstecker gelötet wird, und drei Lötpunkte (beschriftet mit ISP* - BOOTLOAD; SP2 A3: YR1..3), auf die eine 3-polige Stiftleiste gelötet werden muss.&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_ISP.JPG|RP6 ISP]]&lt;br /&gt;
&lt;br /&gt;
Vorher muss eine kurze Leiterbahn zwischen den Lötpunkten BOOTLOAD aufgetrennt werden. Die Leiterbahn befindet sich auf der Lötseite der Platine und muss mit einem scharfen Messer oder einem speziellen Leiterbahn-Unterbrecher zwischen den beiden Lötpunkten unterbrochen werden. Man sollte anschließend mit einem Widerstandsmeßgerät nachmessen: Es sollte keine Verbindung mehr zwischen den Lötpunkten bestehen.&lt;br /&gt;
Man trennt dann von der 1-reihigen Stiftleiste 3 Kontakte ab und lötet sie auf die beschriebenen drei Lötpunkte.&lt;br /&gt;
&lt;br /&gt;
Zum Schluss lötet man noch die Diode LL 4148 (SP2 B3: D11*) auf ihre Lötflächen zwischen R3 und C6. Die Kathode (Strich) der Diode kommt nach vorn (in Fahrtrichtung RP6, bzw. liegt rechts von R3). Wenn man jetzt eine Codierbrücke auf die mit &amp;quot;BOOTLOAD&amp;quot; beschrifteten Pins steckt, bleibt alles unverändert: Die Programmierung erfolgt weiter über den PROG/UART-Stecker mithilfe des Bootloaders im Prozessor.&lt;br /&gt;
Wird die Codierbrücke in Stellung &amp;quot;ISP*&amp;quot; umgesteckt, kann der Prozessor mit ISP programmiert werden.&lt;br /&gt;
&lt;br /&gt;
Vorsicht: Das Bootloader-Programm kann dabei zerstört werden! Es müssen zusätzlich Fusebits des ATMEGA32 verändert werden. Dabei kann der Prozessor im schlimmsten Fall nicht mehr ansprechbar sein. Man sollte diesen Umbau und die ISP-Programmierung nur machen, wenn man genau weiß, was man macht!&lt;br /&gt;
&lt;br /&gt;
Eine Kopie des Bootloaders und eine Kurzanleitung zum Einstellen der Fusebits gibt es hier:&lt;br /&gt;
[http://www.arexx.com/rp6/downloads/RP6BASE_BOOTLOADER.zip RP6_BOOTLOADER]&lt;br /&gt;
&lt;br /&gt;
====IO1..IO4====&lt;br /&gt;
[[Bild:RP6_IO1-4.JPG|thumb|RP6 IO1..IO4]]&lt;br /&gt;
Die Anschlüsse IO1 bis IO4 (SP2 E3: IO1..4) steuern bereits die Status-LEDs 1, 2, 4 und 5 an. Trotzdem kann man sie auch noch mit leichten Einschränkungen als I/O-Pins benutzen. Dazu lötet man zweimal 2 Pins einer 1-reihigen Stiftleiste RM 2,54mm (z.B. 36-polig 732478) auf die IO1/2 und IO3/4 Lötpunkte.&lt;br /&gt;
Hier eine Tabelle, die die Port-Pins zeigt, die IO1..IO4 zugeordnet sind:&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |IO&lt;br /&gt;
 |Status-LED&lt;br /&gt;
 |Port-Pin&lt;br /&gt;
 |-&lt;br /&gt;
 |1&lt;br /&gt;
 |SL1&lt;br /&gt;
 |PC4&lt;br /&gt;
 |-&lt;br /&gt;
 |2&lt;br /&gt;
 |SL2&lt;br /&gt;
 |PC5&lt;br /&gt;
 |-&lt;br /&gt;
 |3&lt;br /&gt;
 |SL4&lt;br /&gt;
 |PB7&lt;br /&gt;
 |-&lt;br /&gt;
 |4&lt;br /&gt;
 |SL5&lt;br /&gt;
 |PB1&lt;br /&gt;
 |-&lt;br /&gt;
|}&lt;br /&gt;
Wie können nun IO1..IO4 genutzt werden?&lt;br /&gt;
&lt;br /&gt;
Als ...&lt;br /&gt;
* Eingang, z.B. für zusätzliche Tastschalter/Bumper&lt;br /&gt;
* Ausgang, z.B. zur Ansteuerung von Treiberstufen, low-current LEDs, ...&lt;br /&gt;
&lt;br /&gt;
Wird ein Anschluß IOx als Eingang verwendet, muss ein Widerstand von 470 Ohm in Reihe mit dem Taster an VDD eingebaut werden, zusätzlich ein Pulldown-Widerstand 100 kOhm. Diese Beschaltung zeigen z.B. an SL6 die Widerstände R43 und R46 (SP2 E4: R43, R46).&lt;br /&gt;
&lt;br /&gt;
Als Ausgang geschaltet sollte an IOx kein hoher Strom entnommen werden: 10mA sind max. zu empfehlen!&lt;br /&gt;
&lt;br /&gt;
====USRBUS====&lt;br /&gt;
Die 14 Kontakte der beiden USRBUS-Stecker sind auf dem RP6 nirgendwo angeschlossen, sondern können über die Lötpunkte Y1..Y14 mit beliebigen Punkten auf dem Mainboard verbunden werden.&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_USRBUS.JPG|thumb|RP6 USRBUS]]&lt;br /&gt;
&lt;br /&gt;
Ich würde auf Y1..Y14 eine Stiftleiste löten, damit die USRBUS-Belegung geändert werden kann.&lt;br /&gt;
&lt;br /&gt;
Man braucht dazu:&lt;br /&gt;
* 2-reihige Stiftleiste RM 2,54mm (z.B. 2x36-polig 742007)&lt;br /&gt;
* Einige Steckbuchsen mit Litze&lt;br /&gt;
&lt;br /&gt;
Man trennt von der 2-reihigen Stiftleiste 2x7 Kontakte ab und lötet sie auf die Punkte Y1..Y14 (SP4 E34: Y1..14, Y1'..Y14') neben den beiden Wannensteckern USRBUS1 (vorn) und USRBUS2 (hinten). Wird der RP6 über Flachkabel mit einem USRBUS-Stecker auf einer RP6 Experimentierplatine (EP) und/oder mit einer Erweiterungsplatine (M32, CCPRO M128) verbunden, dann hat man mit allen mit dem USRBUS verbundenen Platinen eine direkte 14-polige Verbindung,- eben den &amp;quot;User Bus&amp;quot;. Den kann man dann nutzen, wie man will. Auf dem RP6 kann man mit Steckbuchsen die Pins Y1..Y14 mit anderen Pins verbinden.&lt;br /&gt;
&lt;br /&gt;
Beispiel: Verbindet man den Pin &amp;quot;ADC0&amp;quot; mit Y1 des USRBUS1, dann steht der Eingang ADC0 auf allen an den USRBUS1 angeschlossenen Platinen auf dem vorderen Platinenstapel an Y1 zur Verfügung. Man braucht also diesen Eingang nicht über ein eigenes Kabel auf eine EP zu führen, sondern kann dazu den USRBUS nehmen. Dadurch bleibt der Gesamtaufbau auf dem RP6 übersichtlich und komplett trennbar (man braucht nur die Stecker XBUS und USRBUS abzuziehen!).&lt;br /&gt;
&lt;br /&gt;
Wichtig:&lt;br /&gt;
* Man sollte gut dokumentieren, wie man den USRBUS am RP6 (vorn und hinten getrennt!), auf EPs und der M32/M128 benutzt! Sonst kann es bei einer anderen Anordnung von EPs zu USRBUS Konflikten/Kurzschlüssen kommen.&lt;br /&gt;
* Der USRBUS1- und der USRBUS2-Stecker sind auf dem RP6 NICHT miteinander verbunden.&lt;br /&gt;
&lt;br /&gt;
Einen Vorschlag für die Belegung des USRBUS1 (vorn) gibt es z.B. &lt;br /&gt;
[http://www.roboternetz.de/phpBB2/viewtopic.php?t=32549 hier] oder &lt;br /&gt;
[http://www.roboternetz.de/community/showthread.php/47102-Sensor-anschließen?p=453061&amp;amp;viewfull=1#post453061 da.]&lt;br /&gt;
&lt;br /&gt;
====Start/Stop Button====&lt;br /&gt;
[[Bild:RP6_ST.JPG|thumb|RP6 ST]]&lt;br /&gt;
Am mittleren Lochrasterfeld links finden sich zwei Lötpunkte ST1, ST2 (SP2 D2: ST1, ST2), an die weitere Start/Stop Taster (NO, normal offen) parallel zum Taster auf dem RP6 Mainboard angeschlossen werden können.&lt;br /&gt;
&lt;br /&gt;
Zum Anschluß kann man auch Stiftleisten auflöten. ST1, ST2 könnte man auch mit dem USRBUS1 verbinden, wenn man den RP6 z.B. von einer EP aus zurücksetzen möchte.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Serielle Schnittstelle====&lt;br /&gt;
[[Bild:RP6_RST.JPG|thumb|RP6 RST]]&lt;br /&gt;
Neben dem USRBUS1 Stecker befinden sich 5 Lötpunkte mit den Signalen RST, TX, RX, GND, VDD (SP4 AB5: YRX, YTX, YMRESET, YVDD). Hier kann z.B. eine 5-polige Stiftleiste aufgelötet werden, um einen Anschluß an die serielle Schnittstelle zu ermöglichen.&lt;br /&gt;
&lt;br /&gt;
Von diesen 5 Lötpunkten könnte z.B. auch [http://www.roboternetz.de/phpBB2/viewtopic.php?t=32549 so] eine Verbindung zum benachbarten USRBUS1 hergestellt werden, um die serielle Schnittstelle des RP6 auf EPs zu führen.&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;
&lt;br /&gt;
====I2C-Schnittstelle====&lt;br /&gt;
[[Bild:RP6_I2C.JPG|thumb|RP6 I2C]]&lt;br /&gt;
Neben dem XBUS2 Stecker finden sich 5 Lötpunkte mit den Signalen der I2C-Schnittstelle (SP4 D12: Stecker I2C). Dies sind: VDD (Pin 1), GND, SDA, SCL, INT1 (Pin 5). Hier kann z.B. eine 5-polige Stiftleiste aufgelötet werden, um einen Anschluß an die I2C-Schnittstelle zu ermöglichen.&lt;br /&gt;
&lt;br /&gt;
Von diesen 5 Lötpunkten könnte z.B. auch eine Verbindung zum USRBUS1 oder USRBUS2 hergestellt werden, um die I2C-Schnittstelle des RP6 auf EPs zu führen, allerdings hat man SCL, SDA, INT1 ja auch schon am XBUS zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Interrupt-Leitungen====&lt;br /&gt;
[[Bild:RP6_INTx.JPG|thumb|RP6 INTx]]&lt;br /&gt;
Die Interrupt-Leitungen INTU, INT1..3, MRESET (SP4 D34: MRESET, INT1..3, INTU) sind an 5 Lötpunkten neben dem XBUS1 Stecker zu kontaktieren. Hier kann natürlich auch eine 5-polige Stiftleiste aufgelötet werden. In der Regel wird man diese Anschlüsse nicht brauchen, weil sie schon auf dem XBUS zur Verfügung stehen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====VDD/GND/+UB Anschluß====&lt;br /&gt;
[[Bild:RP6_VDDGNDUB.JPG|thumb|RP6 VDD GND +UB]]&lt;br /&gt;
In der Nähe von C4 im hinteren Bereich des Mainboards finden sich Lötpunkte (SP4 E12: YVDDx, YGNDx; SP4 D2 YUBx), an denen man VDD, GND und +UB finden kann.&lt;br /&gt;
&lt;br /&gt;
Wenn man höhere Ströme an VDD (z.B. für Servos) oder +UB (z.B. für einen anderen IRCOMM-Sender oder einen DC-Motor) entnehmen möchte, empfehlen sich diese Lötpunkte, auf die man auch Stiftleisten löten kann.&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;
====EXT Anschluß====&lt;br /&gt;
[[Bild:RP6_EXT.jpg|thumb|RP6 EXT Anschluß]]&lt;br /&gt;
Am hinteren Rand der RP6 Hauptplatine gibt es eine Reihe von 8 Lötpunkten. Dies ist der EXT Anschluß (SP1 C23: Stecker EXT):&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |Pin&lt;br /&gt;
 |Name&lt;br /&gt;
 |Beschreibung&lt;br /&gt;
 |-&lt;br /&gt;
 |1&lt;br /&gt;
 |GND&lt;br /&gt;
 |RP6 und Akku Minuspol (GND)&lt;br /&gt;
 |-&lt;br /&gt;
 |2&lt;br /&gt;
 |CHRG&lt;br /&gt;
 |Anschluß (+) für ext. Ladegerät, identisch mit Pluspol der Ladebuchse (CHARGER, Pin 1). Ladung nur möglich, wenn S1 AUS ist!&lt;br /&gt;
 |-&lt;br /&gt;
 |3&lt;br /&gt;
 |CHRG&lt;br /&gt;
 |wie Pin 2!&lt;br /&gt;
 |-&lt;br /&gt;
 |4&lt;br /&gt;
 | +BAT&lt;br /&gt;
 |Akku Pluspol über Sicherung F1&lt;br /&gt;
 |-&lt;br /&gt;
 |5&lt;br /&gt;
 | +BAT&lt;br /&gt;
 |wie Pin 4!&lt;br /&gt;
 |-&lt;br /&gt;
 |6&lt;br /&gt;
 | +UB&lt;br /&gt;
 |RP6 +UB (+7,2V=, Bereich min. +5,5 bis max. +10V=)&lt;br /&gt;
 |-&lt;br /&gt;
 |7&lt;br /&gt;
 | +UB&lt;br /&gt;
 |wie Pin 6!&lt;br /&gt;
 |-&lt;br /&gt;
 |8&lt;br /&gt;
 |GND&lt;br /&gt;
 |wie Pin 1!&lt;br /&gt;
 |-&lt;br /&gt;
|}&lt;br /&gt;
Man kann hier eine JST XH Stiftleiste gerade, 8-polig, RM 2,5mm ([http://www.conrad.de/ce/de/product/740105/Stiftleiste-gerade-RM-25-mm-Serie-XH-Rastermass-25-mm-Pole-8-Nennstrom-3-A-B8B-XH-A-LFSN-JST-Inhalt-1-St 740105]) auflöten.&lt;br /&gt;
&lt;br /&gt;
Wozu kann man diesen Anschluß nutzen?&lt;br /&gt;
&lt;br /&gt;
Der wesentliche Sinn des EXT Anschlusses besteht darin, andere Arten der Stromversorgung und der Akkuladung zu ermöglichen. Normalerweise schaltet man den RP6 mit S1 an und aus. In Stellung AUS kann der Akku geladen werden, indem man ein Ladegerät an die CHARGER Buchse anschließt. Alternativ kann man das Ladegerät mit seinem Pluspol auch an CHRG (Pins 2, 3) anschließen. Siehe auch den Abschnitt &amp;quot;Trennstellen - EXT Anschluß: Andere Stromversorgung&amp;quot; weiter unten!&lt;br /&gt;
&lt;br /&gt;
An +BAT (Pins 4, 5) kann man direkt (ohne Unterbrechung durch S1) Strom aus dem Akku entnehmen. Die Grenze des Stroms bestimmt die Sicherung F1 (2,5A). Eine weitere Möglichkeit besteht darin, über diesen Anschluß den Akku auch mit einem geeigneten Ladegerät zu LADEN. Hierbei muss man aber darauf achten, dass S1 AUSgeschaltet ist, weil sonst der RP6 über +UB eine unzulässig hohe Spannung bekommen könnte. Wenn man den Akku mit 6 Mignonzellen im RP6 nicht nutzen will (der Akku-Halter bleibt leer!), sondern nur einen externen Akku, wäre der auch mit seinem Pluspol an +BAT über eine eigene Sicherung (2,5A träge) anzuschließen.&lt;br /&gt;
&lt;br /&gt;
+UB (+7,2V) ist die Versorgungsspannung des RP6 (kommt vom Akku-Pluspol über die Sicherung F1 und Schalter S1!). Mit +UB werden die H-Brücken (Motoransteuerung) direkt und die RP6 &amp;quot;Elektronik&amp;quot; über den 5V-Spannungswandler (IC1; SP1 D3: IC1) versorgt (= VDD). An +UB könnte man den RP6 direkt mit einer Spannung von +7,2V versorgen (Absicherung nicht vergessen!), dazu muss S1 AUSgeschaltet sein, damit es keine Konflikte mit dem eingebauten Akku gibt.&lt;br /&gt;
&lt;br /&gt;
Den EXT Anschluß kann man damit nutzen für:&lt;br /&gt;
* Externes Ladegerät&lt;br /&gt;
* Externen Akku&lt;br /&gt;
* Externe Stromversorgung ohne Akku&lt;br /&gt;
* Direkte Stromentnahme aus dem Akku&lt;br /&gt;
* Ergänzungsladung mit Solarzelle&lt;br /&gt;
* Autonome Akkuladung (Ladestation mit Kontakten, Induktionsladung ...)&lt;br /&gt;
* ...&lt;br /&gt;
&lt;br /&gt;
Man sollte gewisse Elektronik-Kenntnisse haben, wenn man die Spannungsversorgung des RP6 verändert. VOR irgendwelchen Veränderungen seht euch auch zuerst den Schaltplan des RP6 (SP1) genau an!&lt;br /&gt;
&lt;br /&gt;
===Mess-/Kontaktpunkte===&lt;br /&gt;
Hier geht es um Kontaktpunkte, an denen man z.B. den Logik-Pegel (High/Low) oder eine analoge Spannung messen kann. Natürlich kann man die Signale auch zur Weiterleitung auf eine EP kontaktieren, dies wird man aber normalerweise nicht brauchen.&lt;br /&gt;
&lt;br /&gt;
====UBAT====&lt;br /&gt;
[[Bild:RP6_UBAT.JPG|thumb|RP6 UBAT]]&lt;br /&gt;
In der Mitte des Mainboards befindet sich ein Kontaktpunkt UBAT (SP1 E1: YUBAT). Dies ist ADC7 des RP6 Microcontrollers.&lt;br /&gt;
&lt;br /&gt;
Man kann hier die analoge Spannung (gegen GND) messen, die vom +UB-Spannungssensor geliefert wird.&lt;br /&gt;
&lt;br /&gt;
Die Spannung ist:&lt;br /&gt;
 UBAT = +UB / 2&lt;br /&gt;
Da der Spannungsteiler (SP1 D12: R1, R2) des +UB-Spannungssensors nicht aus Präzisionswiderständen besteht, kann man für den eigenen RP6 einen Korrekturfaktor berechnen, wenn UBAT deutlich von +UB / 2 (+ UB z.B. gemessen am EXT Stecker, Pins 6 u. 7) abweicht. Damit kann man +UB sehr viel genauer bestimmen.&lt;br /&gt;
&lt;br /&gt;
====ACS====&lt;br /&gt;
[[Bild:RP6_ACS_TSOP.JPG|thumb|RP6 ACS TSOP]]&lt;br /&gt;
Hinter dem TSOP (IC3) befindet sich der Kontaktpunkt ACS (SP2 E1: ACS).&lt;br /&gt;
&lt;br /&gt;
Dies ist der Ausgang des TSOP bzw. Eingang PB2 des RP6 Microcontrollers. Man kann hier das Ausgangssignal des IR-Empfängers abnehmen, z.B. um es mit einem Oszilloskop sichtbar zu machen.&lt;br /&gt;
&lt;br /&gt;
Rechts neben dem TSOP kann man noch die 3 Kontaktpunkte ACS_R, ACS_P und ACS_L (SP2 E2: ACS_P, ACS_R, ACS_L) des ACS-IR-Senders finden.&lt;br /&gt;
&lt;br /&gt;
Folgende Tabelle zeigt die Verbindungen:&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |Kontakt&lt;br /&gt;
 |Microcontroller-Portpin&lt;br /&gt;
 |SP-Verbindung&lt;br /&gt;
 |ACS-IR-Sendediode&lt;br /&gt;
 |-&lt;br /&gt;
 |ACS_P&lt;br /&gt;
 |über R8: ACS_PWRH (PB3), über R9: ACS_PWR (PD6)&lt;br /&gt;
 |SP2: 3&lt;br /&gt;
 |Anoden D1, D2&lt;br /&gt;
 |-&lt;br /&gt;
 |ACS_R&lt;br /&gt;
 |ACS_R (PC7)&lt;br /&gt;
 |SP2: 2&lt;br /&gt;
 |Kathode D1&lt;br /&gt;
 |-&lt;br /&gt;
 |ACS_L&lt;br /&gt;
 |ACS_L/MISO (PB6)&lt;br /&gt;
 |SP1: 5&lt;br /&gt;
 |Kathode D2&lt;br /&gt;
 |-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====IRC====&lt;br /&gt;
[[Bild:RP6_IRC.JPG|thumb|RP6 IRC]] [[Bild:RP6_IRC3.JPG|thumb|RP6 IRC3]]&lt;br /&gt;
Im der Nähe von C13 befinden sich die Lötpunkte IRC, IRC+, IRC- und IRC3 (SP2 D2: YIRC; SP2 CD2: IRC+/-; SP2 C2: IRC3). Zusammen mit der Trennstelle IRC (siehe Abschnitt &amp;quot;Trennstellen - IRC&amp;quot; weiter unten!) kann man diese Kontaktstellen im Umfeld des IRCOMM-Sendedioden Treibers IRLML2502PBF (SP2 CD12: Q5) finden. Am Kontaktpunkt IRC findet sich der Eingang des Treibers bzw. Ausgang PD7 des RP6 Microcontrollers. IRC+, IRC- sind die Kontaktpunkte, an denen die IRCOMM-Sendedioden D3, D4 in Reihe auf der Sensorplatine angeschlossen sind (IRC+ = Anode). IRC3 ist verbunden mit dem Trennstellen-Lötpunkt IRC1 und liegt bei geschlossener Trennstelle IRC an +UB.&lt;br /&gt;
&lt;br /&gt;
Was läßt sich mit diesen Kontaktpunkten machen:&lt;br /&gt;
* Der IRCOMM-Sender ist der zweitgrößte Stromverbraucher des RP6 (nach dem Antrieb). An IRC3 kann daher eine eigene Stromversorgung für die IRCOMM-Sendedioden angeschlossen werden. Dazu muss die Trennstelle IRC zwischen ihren Lötpunkten IRC1, IRC2 aufgetrennt werden.&lt;br /&gt;
* An IRC+, IRC- könnten andere/weitere IRCOMM-Sendedioden angeschlossen werden (Anode an IRC+). Wenn der Vorwiderstand R6 (SP2 C2: R6) der Sendedioden dann nicht mehr paßt (bezügl. Leistung und/oder Widerstandswert), können neue leistungsfähigere IRCOMM-Sendedioden zwischen IRC3 und IRC- (Anode an IRC3) mit einem dafür geeigneten Vorwiderstand angebracht werden.&lt;br /&gt;
&lt;br /&gt;
====LS====&lt;br /&gt;
[[Bild:RP6_LS.JPG|thumb|RP6 LS]]&lt;br /&gt;
Die beiden Lötpunkte LS_L und LS_R (SP2 B12: LS_L, LS_R) neben R7 vorn auf dem Mainboard sind die Ausgänge der Helligkeitssensoren (links und rechts) bzw. die ADC-Eingänge ADC3 und ADC2 des RP6 Microcontrollers.&lt;br /&gt;
&lt;br /&gt;
Hier kann man die Spannungen messen, die den Helligkeitswerten entsprechen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====BP, S====&lt;br /&gt;
[[Bild:RP6_BP_S.JPG|thumb|RP6 BP S]]&lt;br /&gt;
Die Messpunkte BPL, BPR und der Kontaktpunkt S (SP2 E2: S; SP2 E3: BPR; SP2 E4: BPL) befinden sich am vorderen Platinenrand. BPL und BPR sind die Kontakte der Bumper. S ist eine nicht genutzte Verbindung zwischen dem Mainboard und der Sensorplatine, die über die Verbindung SP1, Pin 3, geführt wird (siehe folgende Tabelle!).&lt;br /&gt;
&lt;br /&gt;
Hier eine Tabelle mit der Belegung der 90°-Winkelverbindung SP1, SP2 zwischen dem RP6 Mainboard und der Sensorplatine: &lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |Pin&lt;br /&gt;
 |SP1&lt;br /&gt;
 |SP2&lt;br /&gt;
 |-&lt;br /&gt;
 |1&lt;br /&gt;
 |LS_L  --- Light Sensor Left&lt;br /&gt;
 |IRC-  --- IRCOMM-&lt;br /&gt;
 |-&lt;br /&gt;
 |2&lt;br /&gt;
 |BPL   --- Bumper Left&lt;br /&gt;
 |ACS_R --- ACS Right&lt;br /&gt;
 |-&lt;br /&gt;
 |3&lt;br /&gt;
 |S     --- Free for all&lt;br /&gt;
 |ACS_P --- ACS Power&lt;br /&gt;
 |-&lt;br /&gt;
 |4&lt;br /&gt;
 |GND&lt;br /&gt;
 |VDD&lt;br /&gt;
 |-&lt;br /&gt;
 |5&lt;br /&gt;
 |ACS_L --- ACS Left&lt;br /&gt;
 |BPR   --- Bumper Right&lt;br /&gt;
 |-&lt;br /&gt;
 |6&lt;br /&gt;
 |IRC+  --- IRCOMM+&lt;br /&gt;
 |LS_R  --- Light Sensor Right&lt;br /&gt;
 |-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====ENC====&lt;br /&gt;
[[Bild:RP6_ENC.JPG|thumb|RP6 ENC]]&lt;br /&gt;
Die beiden Messpunkte ENCL, ENCR (SP4 B12: ENCL, ENCR) sind die Ausgänge der Radencoder. ENCL ist verbunden mit PD2 (INT0), ENCR mit PD3 (INT1) des RP6 Microcontrollers.&lt;br /&gt;
&lt;br /&gt;
===Trennstellen===&lt;br /&gt;
An diesen Stellen können Leiterbahnen unterbrochen werden, um Funktionen zu deaktivieren oder anders zu nutzen.&lt;br /&gt;
&lt;br /&gt;
=====Getrennte Stromversorgung für ADC0/1=====&lt;br /&gt;
Wenn man für die analogen Sensoren an ADC0/1 (siehe Abschnitt &amp;quot;Anschlüsse - Analoge Sensoren an ADC0/1&amp;quot; weiter oben!) eine GETRENNTE Stromversorgung vorsehen will und/oder mit Codierbrücke (oder MOSFET) die Stromversorgung abschaltbar machen möchte, muss man erst Vorarbeit leisten.&lt;br /&gt;
[[Bild:RP6_SV.JPG|thumb|RP6 SV]]&lt;br /&gt;
&lt;br /&gt;
Man braucht dazu:&lt;br /&gt;
* 1-reihige Stiftleiste RM 2,54mm (z.B. 36-polig 732478)&lt;br /&gt;
* Evtl.: Eine Codierbrücke (z.B. aus Set 742902)&lt;br /&gt;
* Evtl.: Eine 1-polige Steckbuchse mit Litze zur ext. Stromversorgung&lt;br /&gt;
Es muss eine kurze Leiterbahn zwischen den Punkten &amp;quot;SV1&amp;quot; und &amp;quot;SV2&amp;quot; (SP2 A1: SV1, SV2; zwischen dem PROG/UART- und dem USRBUS1-Stecker) aufgetrennt werden. Die Leiterbahn befindet sich auf der Lötseite der Platine und muss mit einem scharfen Messer oder einem speziellen Leiterbahn-Unterbrecher zwischen den beiden Lötpunkten unterbrochen werden. Man sollte anschließend mit einem Widerstandsmeßgerät zwischen SV1 und SV2 nachmessen: Es sollte keine Verbindung mehr bestehen. Jetzt trennt man von der 1-reihigen Stiftleiste 2 Kontakte ab und lötet sie auf die Punkte SV1/SV2.&lt;br /&gt;
&lt;br /&gt;
Man kann hier zunächst eine Codierbrücke aufstecken. Damit versorgt der RP6 Akku die Sensoren mit 5V an den Pins VDD. Möchte man später eine getrennte 5V-Spannung anlegen, zieht man einfach die Codierbrücke ab und speist die externe 5V-Spannung (mit einer 1-poligen Steckbuchse) am Pin SV2 ein. Achtung: An Pin SV1 wird dann nichts angeschlossen!&lt;br /&gt;
&lt;br /&gt;
Anstelle der Codierbrücke kann man natürlich auch einen MOSFET anschließen, um die Sensoren per Software abschalten zu können.&lt;br /&gt;
&lt;br /&gt;
====ACS====&lt;br /&gt;
[[Bild:RP6_ACS_JP.JPG|thumb|RP6 ACS JP]]&lt;br /&gt;
Die Trennstelle ACS (SP2 E1: YIR1, YIR2; SP2 F1: YIR3) befindet sich neben C29*. Sie besteht aus 3 Lötpunkten, von denen die linken beiden (IRC1, IRC2) verbunden sind. Trennt man die Leiterbahn zwischen diesen Lötpunkten auf und verbindet stattdessen die rechten beiden Lötpunkte (IRC2, IRC3) mit etwas Lötzinn oder mit einem SMD Null Ohm Widerstand, dann ist der IR-Empfänger (TSOP, IC3) dauerhaft EINgeschaltet und kann nicht mehr über das Signal PWRON (PB4) geschaltet werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====IRC====&lt;br /&gt;
[[Bild:RP6_IRC_JP.JPG|thumb|RP6 IRC JP]]&lt;br /&gt;
Die Trennstelle IRC (SP2 C1: IRC1..2) ist eng verknüpft mit den Mess- und Kontaktpunkten des IRCOMM-Senders (siehe Abschnitt &amp;quot;Mess-/Kontaktpunkte - IRC&amp;quot; weiter oben!). Wenn man sie auftrennt, kann man den IRCOMM-Sender mit einer getrennten Stromversorgung anstelle von +UB des RP6 versehen. Dies ist sehr sinnvoll, wenn man diese Funktion häufig verwendet oder sogar noch leistungsfähigere IR-Sendedioden einbaut, denn der IRCOMM-Sender ist der zweitgrößte Stromfresser (nach dem Antrieb) auf dem RP6 (von Erweiterungsplatinen und EPs Marke Eigenbau einmal abgesehen!). Man kann hier natürlich auch eine 2-polige Stiftleiste einlöten, um die Verbindung zu +UB mit einer Codierbrücke trennbar zu machen. Eine getrennte Stromversorgung +7,2V (Bereich: +5,5 .. +10V) kann man an IRC1 einspeisen. IRC1 dieser Trennstelle ist mit dem Kontaktpunkt IRC3 (siehe Abschnitt &amp;quot;Mess-/Kontaktpunkte - IRC&amp;quot; weiter oben!) verbunden. &lt;br /&gt;
&lt;br /&gt;
====RP6 Antrieb====&lt;br /&gt;
Mit den folgenden Trennstellen kann man den RP6 Antrieb (H-Brücken und Motoren) fast komplett vom Rest des RP6 Mainboards abtrennen (es bleibt nur die 5V-Versorgung (VDD) von IC4, T1, T2 bestehen!). Damit ist es möglich, mit dem RP6 Mainboard einen ganz anderen Antrieb (also z.B. ein anderes Roboter-Chassis mit eigenen Motoren und H-Brücken) zu steuern. Umgekehrt könnte man den RP6 Antrieb auch deshalb abtrennen, um ihn durch ein anderes Prozessorsystem (z.B. auch eine M32!) anzusteuern. It's up to you!&lt;br /&gt;
&lt;br /&gt;
=====+UB Power=====&lt;br /&gt;
[[Bild:RP6_HB_Power.jpg|thumb|RP6 HB Power]]&lt;br /&gt;
Der RP6 Antrieb wird direkt aus dem Akku (über S1 und F1) mit 7,2V (+UB) versorgt. Diese Stromversorgung kann man komplett abtrennen. Die Trennstelle (SP3 E34: X) liegt unter der Sicherung F1 (siehe Abb. RP6 HB Power). Zwischen den beiden doppelten Lötflächen befinden sich auf der Lötseite (Unterseite) des Mainboards vier parallele Leiterbahnen, die aufgetrennt werden müssen. Der Pluspol einer externen Spannung zur Versorgung des RP6 Antriebs kann dann mit einer Kabelverbindung an den doppelten Lötflächen (mit einem &amp;quot;+&amp;quot; gekennzeichnet) direkt neben dem Leistungswiderstand (R27) angeschlossen werden. Eine Absicherung dieser Stromversorgung sollte man unbedingt vorsehen (2,5A träge)!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=====Stromsensoren=====&lt;br /&gt;
[[Bild:RP6_CS.JPG|thumb|RP6 CS]]&lt;br /&gt;
Um den Motorstrom der beiden Motoren des RP6 zu messen, wird ein Dual-Operationsverstärker (IC5 = 27M2C; SP3 B23/D23: IC5B/A) eingesetzt. Dieses IC wird über PWRON (PB4) mit Strom versorgt. Die Stromsensoren funktionieren also nicht, wenn PWRON Low-Pegel führt (Befehl powerOFF() der RP6 Library!). Auf dem RP6 Mainboard gibt es eine Trennstelle mit drei Lötflächen (SP3 E34: CS1, CS2, CS3). Sie befindet sich auf dem Mainboard neben C23. Möchte man IC5 nicht mehr über PWRON mit Strom versorgen, sondern über VDD (+5V), dann trennt man die Leiterbahn zwischen den linken beiden Lötpunkten (CS1, CS2) auf und verbindet die rechten beiden Lötpunkte (CS2, CS3) mit etwas Lötzinn oder einem SMD Null Ohm Widerstand. Danach sind die Stromsensoren immer eingeschaltet und können über PWRON nicht mehr geschaltet werden. Alternativ kann man an CS2 auch eine externe Versorgungsspannung (+5V) für IC5 einspeisen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=====DR/MR/ML/DL=====&lt;br /&gt;
[[Bild:RP6_DR_MR_ML_DL.JPG|thumb|RP6 DR MR ML DL]]&lt;br /&gt;
An diesen Trennstellen können die Eingänge der H-Brücke für die Geschwindigkeit (PWM) und Drehrichtung der Motoren von den Portpins des Microcontrollers abgetrennt werden.&lt;br /&gt;
Für den rechten Motor sind dies die Trennstellen MR1/2 und DR1/2 (SP3 A23: MR1/2, DR1/2), für den linken Motor ML1/2 und DL1/2 (SP3 F23: ML1/2, DL1/2).&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |Trennstelle&lt;br /&gt;
 |Portpin&lt;br /&gt;
 |Funktion H-Brücke&lt;br /&gt;
 |-&lt;br /&gt;
 |MR1/2&lt;br /&gt;
 |PD5 (OC1A)&lt;br /&gt;
 |PWM Motor rechts&lt;br /&gt;
 |-&lt;br /&gt;
 |DR1/2&lt;br /&gt;
 |PC3 (TMS)&lt;br /&gt;
 |Fahrtrichtung rechts&lt;br /&gt;
 |-&lt;br /&gt;
 |ML1/2&lt;br /&gt;
 |PD4 (OC1B)&lt;br /&gt;
 |PWM Motor links&lt;br /&gt;
 |-&lt;br /&gt;
 |DL1/2&lt;br /&gt;
 |PC2 (TCK)&lt;br /&gt;
 |Fahrtrichtung links&lt;br /&gt;
 |-&lt;br /&gt;
|}&lt;br /&gt;
Trennt man die Leiterbahn (auf der Lötseite des RP6 Mainboards) zwischen den Lötpunkten der Trennstellen auf, kann man die Eingänge der H-Brücke (Mx1, Dx1) z.B. mit einem anderen Microcontroller verbinden. Die Ausgänge (Portpins) des RP6 Microcontrollers (Mx2, Dx2) können dann anders genutzt werden. Natürlich kann man auf die Lötpunkte dieser Trennstellen auch Stiftleisten löten, um den Anschluß steckbar zu machen.&lt;br /&gt;
&lt;br /&gt;
=====MCR/MCL=====&lt;br /&gt;
[[Bild:RP6_MCR_MCL.JPG|thumb|RP6 MCR MCL]]&lt;br /&gt;
An diesen Trennstellen können die Motorstromsensoren von den ADC-Eingängen des Microcontrollers abgetrennt werden.&lt;br /&gt;
&lt;br /&gt;
Für den rechten Sensor ist dies die Trennstelle MCR1/2 (SP3 A1: MCR1, MCR2), für den linken Sensor MCL1/2 (SP3 E1: MCL1, MCL2).&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |Trennstelle&lt;br /&gt;
 |Portpin&lt;br /&gt;
 |Funktion H-Brücke&lt;br /&gt;
 |-&lt;br /&gt;
 |MCR1/2&lt;br /&gt;
 |PA5 (ADC5)&lt;br /&gt;
 |Motorstrom rechts&lt;br /&gt;
 |-&lt;br /&gt;
 |MCL1/2&lt;br /&gt;
 |PA6 (ADC6)&lt;br /&gt;
 |Motorstrom links&lt;br /&gt;
 |-&lt;br /&gt;
|}&lt;br /&gt;
Trennt man die Leiterbahn (auf der Lötseite des RP6 Mainboards) zwischen den Lötpunkten der Trennstellen auf, kann man die ADC-Eingänge (Portpins) des RP6 Microcontrollers (MCx1) anders nutzen und die Ausgänge der Motorstromsensoren (MCx2) z.B. mit ADC-Eingängen eines anderen Microcontrollers verbinden. Natürlich kann man auf die Lötpunkte dieser Trennstellen auch Stiftleisten löten, um den Anschluß steckbar zu machen.&lt;br /&gt;
&lt;br /&gt;
====PWRON-LED====&lt;br /&gt;
[[Bild:RP6_PWRON_L.JPG|thumb|RP6 PWRON L]]&lt;br /&gt;
Auf dem RP6 Mainboard gibt es eine gelbe LED, die anzeigt, ob PWRON High-Pegel hat. Mit einer Trennstelle neben dieser LED (SP2 D4: YL1, YL2) kann diese LED deaktiviert werden (z.B. um Strom zu sparen).&lt;br /&gt;
&lt;br /&gt;
Dazu trennt man die Leiterbahn zwischen den Lötpunkten auf. Soll die LED wieder aktiviert werden, verbindet man die Lötpunkte wieder mit etwas Lötzinn oder einem SMD Null Ohm Widerstand.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====+UB Sensor====&lt;br /&gt;
[[Bild:RP6_UB.JPG|thumb|RP6 UB]]&lt;br /&gt;
Die Versorgungsspannung +UB des RP6 wird mit dem +UB-Spannungssensor an PA7 (ADC7) gemessen. Will man diesen Spannungssensor mit seinem Eingangsspannungsteiler R1, R2 (SP1 D12: R1, R2) von +UB abtrennen (z.B. um ihn anders zu verwenden), gibt es eine Trennstelle UB1/2 (SP1 D2: UB1, UB2). Trennt man die Leiterbahn auf der Lötseite des RP6 Mainboards zwischen den Lötpunkten auf, kann +UB nicht mehr gemessen werden. Man kann dann den Lötpunkt UB2 mit einem anderen Messpunkt (z.B. mit +BAT) verbinden und dort die Spannung (0..10V) messen. Natürlich kann man auf die Lötpunkte dieser Trennstellen auch Stiftleisten löten, um den Anschluß steckbar zu machen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====EXT Anschluß: Andere Stromversorgung====&lt;br /&gt;
[[Bild:RP6_S1_CHRG.jpg|thumb|RP6 S1 CHRG]]&lt;br /&gt;
Wenn man für den RP6 eine andere Stromversorgung oder Ladeschaltung anschließen will, geht dies gut am EXT Anschluß (SP1 C23: Stecker EXT). Siehe auch den Abschnitt &amp;quot;Anschlüsse - EXT Anschluß&amp;quot; weiter oben! Dann muss der Schalter S1 dauerhaft AUSgeschaltet bleiben und die Verbindung zwischen S1 und CHRG des EXT Anschlusses (SP1 C3: X) unterbrochen werden. Diese Trennstelle befindet sich auf der Lötseite (Unterseite) des RP6 Mainboards etwas versteckt zwischen S1 (Pin 3) und der benachbarten Leiterbahn, die CHRG des EXT Anschlusses mit der Ladebuchse CHARGER (Pin 1 +) verbindet. Dort sind fünf kurze, parallele Leiterbahnen zu unterbrechen (siehe gelbe Markierung in der Abb. RP6 S1 CHRG!). Will man das nicht machen, darf man die Ladebuchse CHARGER auf jeden Fall nicht mehr nutzen!&lt;br /&gt;
&lt;br /&gt;
===Lochraster-Felder===&lt;br /&gt;
Auf diesen Feldern kann man eigene kleine Schaltungen aufbauen. An jedem der sechs Felder stehen VDD (+5V) und GND zur Verfügung (SP4 E12: YVDDx, YGNDx).&lt;br /&gt;
&lt;br /&gt;
Bitte beachten: Die Lochreihen oder -spalten, die mit einer eckigen Klammer &amp;quot;[&amp;quot; markiert sind, liegen auf der Lötseite (Unterseite) direkt auf dem Rahmen des Chassis! Hier können also keine Drähte von unten verlötet werden.&lt;br /&gt;
&lt;br /&gt;
====Vorn links====&lt;br /&gt;
Das kleine Lochrasterfeld vorn links kann z.B. für Beleuchtung (Blinker, Scheinwerfer links) oder auch für einen zusätzlichen Sensor genutzt werden.&lt;br /&gt;
Zur Verfügung steht eine 2-adrige Verbindung zum mittleren Lochrasterfeld links.&lt;br /&gt;
&lt;br /&gt;
In der Nähe dieses Lochrasterfeldes gibt es auch:&lt;br /&gt;
* IO3, IO4 (SP2 E3: IO3, IO4)&lt;br /&gt;
* ADC0 (SP2 B1: ADC0)&lt;br /&gt;
&lt;br /&gt;
====Mitte links====&lt;br /&gt;
[[Bild:RP6_Lochfeld_LM.JPG|thumb|RP6 Lochrasterfeld Mitte links]]&lt;br /&gt;
Das größere Lochrasterfeld Mitte links kann z.B. für eine kleinere Schaltung zur Ansteuerung der Beleuchtung/Sensoren auf den Lochrasterfeldern vorn und hinten links oder für andere Zwecke genutzt werden.&lt;br /&gt;
&lt;br /&gt;
Es stehen hier folgende Anschlüsse zur Verfügung:&lt;br /&gt;
* 2-adrige Verbindung zum Lochrasterfeld vorn links&lt;br /&gt;
* 2-adrige Verbindung zum Lochrasterfeld hinten links&lt;br /&gt;
* ST1/ST2 zum Anschluß weiterer Start/Stop Taster (SP2 D2: ST1/2)&lt;br /&gt;
* PWR (SP2 D2: YPWR1)&lt;br /&gt;
* I2C-Bus (SCL, SDA; SP4 C1: YSCL1, YSDA1)&lt;br /&gt;
* +UB (SP4 D2: YUB1)&lt;br /&gt;
In der Nähe dieses Lochrasterfeldes gibt es auch:&lt;br /&gt;
* Serielle Schnittstelle (RST, TX, RX; SP4 AB5: YRX, YTX, YMRESET, YVDD)&lt;br /&gt;
* USRBUS1 (vorn; SP4 E34: Y1'..Y14')&lt;br /&gt;
&lt;br /&gt;
=====Schaltungsvorschläge=====&lt;br /&gt;
Wie kann z.B. eine Schaltung für Beleuchtungseffekte oder Sensoren aussehen?&lt;br /&gt;
&lt;br /&gt;
Man könnte 8 zusätzliche Schaltkanäle mit dem I2C-Portexpander-IC PCF8574(A)P gewinnen. Dieses IC passt mit wenigen Zusatzteilen auf die mittlere Lochrasterfläche. Angesteuert wird es über den I2C-Bus. Mit den 8 Ausgängen lassen sich einige Beleuchtungseffekte erreichen, die dann über Software schaltbar sind.&lt;br /&gt;
&lt;br /&gt;
Alternativ kann man auch das IC PCF8591P z.B. für den Anschluß von analogen Sensoren verwenden. Auch dieser Baustein wird über I2C angesteuert. Beide ICs sind bei [http://www.reichelt.de./ Reichelt] erhältlich.&lt;br /&gt;
&lt;br /&gt;
Will man nicht den I2C-Bus benutzen, kann man als I/O-Ports IO1..IO4 oder als analoge Eingänge ADC0 und ADC1 verwenden. Auch SCL und SDA stehen als I/O-Ports zur Verfügung, wenn der I2C-Bus im ganzen System nicht verwendet werden soll.&lt;br /&gt;
&lt;br /&gt;
Wichtig für Zusatzschaltungen, die fest auf dem RP6 verlötet werden, sind zwei Aspekte:&lt;br /&gt;
* Wenn sie die Stromversorgung belasten, sollten sie (z.B. über einen Transistor oder MOSFET) abschaltbar sein. Dazu kann man auch das Signal PWR heranziehen, das auf beiden mittleren Lochrasterflächen zur Verfügung steht. Dann kann man mit dem Befehl &amp;quot;powerOFF()&amp;quot; der RP6 Library die Stromversorgung per Software abschalten.&lt;br /&gt;
* Wenn man auch anderweitig genutzte Portpins (SDA, SCL, IO1..IO4, ADC0/1) für die eigene Schaltung einsetzt, sollte man die Verbindung zu den Portpins mit einer abziehbaren Codierbrücke trennbar machen.&lt;br /&gt;
&lt;br /&gt;
====Hinten links====&lt;br /&gt;
Das kleine Lochrasterfeld hinten links kann z.B. für Beleuchtung (Blinker, Rücklicht links) oder auch für einen zusätzlichen Sensor genutzt werden.&lt;br /&gt;
Zur Verfügung steht eine 2-adrige Verbindung zum mittleren Lochrasterfeld links.&lt;br /&gt;
&lt;br /&gt;
In der Nähe dieses Lochrasterfeldes gibt es auch:&lt;br /&gt;
* EXT Anschluß (SP1 C23: Stecker EXT)&lt;br /&gt;
&lt;br /&gt;
====Vorn rechts====&lt;br /&gt;
Das kleine Lochrasterfeld vorn rechts kann z.B. für Beleuchtung (Blinker, Scheinwerfer rechts) oder auch für einen zusätzlichen Sensor genutzt werden.&lt;br /&gt;
Zur Verfügung steht eine 2-adrige Verbindung zum mittleren Lochrasterfeld rechts.&lt;br /&gt;
&lt;br /&gt;
In der Nähe dieses Lochrasterfeldes gibt es auch:&lt;br /&gt;
* IO1, IO2 (SP2 E3: IO1, IO2)&lt;br /&gt;
* ADC1 (SP2 B1: ADC1)&lt;br /&gt;
&lt;br /&gt;
====Mitte rechts====&lt;br /&gt;
Das größere Lochrasterfeld Mitte rechts kann z.B. für eine kleinere Schaltung zur Ansteuerung der Beleuchtung/Sensoren auf den Lochrasterfeldern vorn und hinten rechts oder für andere Zwecke genutzt werden.&lt;br /&gt;
&lt;br /&gt;
Es stehen hier folgende Anschlüsse zur Verfügung:&lt;br /&gt;
* 2-adrige Verbindung zum Lochrasterfeld vorn rechts&lt;br /&gt;
* 2-adrige Verbindung zum Lochrasterfeld hinten rechts&lt;br /&gt;
* PWR (SP2 D2: YPWR2)&lt;br /&gt;
* I2C-Bus (SCL, SDA; SP4 C1: YSCL2, YSDA2)&lt;br /&gt;
* +UB (SP4 D2: YUB2)&lt;br /&gt;
In der Nähe dieses Lochrasterfeldes gibt es auch:&lt;br /&gt;
* Interrupt-Anschluß (INTU, INT1..3, MRESET; SP4 D34: MRESET, INT1..3, INTU)&lt;br /&gt;
* USRBUS2 (hinten; SP4 E34: Y1..Y14)&lt;br /&gt;
&lt;br /&gt;
====Hinten rechts====&lt;br /&gt;
Das kleine Lochrasterfeld hinten rechts kann z.B. für Beleuchtung (Blinker, Rücklicht rechts) oder auch für einen zusätzlichen Sensor genutzt werden.&lt;br /&gt;
Zur Verfügung steht eine 2-adrige Verbindung zum mittleren Lochrasterfeld rechts.&lt;br /&gt;
&lt;br /&gt;
In der Nähe dieses Lochrasterfeldes gibt es auch:&lt;br /&gt;
* EXT Anschluß (SP1 C23: Stecker EXT)&lt;br /&gt;
* Akku-Anschluß (SP1 B3: BATTERY)&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Erweiterungen==&lt;br /&gt;
Auf / An den RP6 könnte man z.B. noch folgendes anbauen / erweitern:&lt;br /&gt;
&lt;br /&gt;
* Einen Greifarm&lt;br /&gt;
* Einen Ultraschallsensor&lt;br /&gt;
* Zwei Lichtsensoren hinten, um die hellste / dunkelste Stelle im Raum besser zu finden&lt;br /&gt;
* Einen digitalen Kompass&lt;br /&gt;
* uvm.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Erweiterungs-Module==&lt;br /&gt;
&lt;br /&gt;
Es sind von Arexx schon einige Erweiterungsmöglichkeiten auf dem Markt. Zum Ersten die Experimentierplatinen ([http://www.conrad.de/ce/de/product/191537/Arexx-RP6-Experimentierplatine 191537] AUSVERKAUFT!), die zum Erstellen von eigenen Schaltungen und Sensoren gedacht sind, und von denen eine schon im Lieferumfang des RP6 enthalten war, das Erweiterungsboard RP6 CONTROL M32 ([http://www.conrad.de/ce/de/product/191550/Arexx-RP6-ATMEGA32-Erweiterungssatz 191550] AUSVERKAUFT!) und die RP6 CCPRO M128 ([http://www.conrad.de/ce/de/product/191563/Arexx-RP6-CC-PRO-MEGA128-Erweiterungssatz 191563]).&lt;br /&gt;
&lt;br /&gt;
Die Boards kann man dann über den I2C Bus mit dem Mainboard kommunizieren lassen.  Es ist sehr sinnvoll, die Module symmetrisch hintereinander zu stapeln und nicht mehr als 6-8 Module zu verbauen, weil der Roboter sonst immer schwerer und langsamer wird. Basierend auf dem Master-Slave System könnte man so bis zu 127 Slaves anschließen. Zudem ist es ratsam, qualitativ hochwertige Akkus und ein Ladegerät mit passendem Stecker zu verwenden, da man ansonsten immer das Mainboard abschrauben müsste um an die Akkus heranzukommen. Für den Fall wurde extra eine Ladebuchse eingebaut.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Experimentierplatine ===&lt;br /&gt;
[[Bild:RP6_Exp.jpg|RP6 Experimentierplatine]]&lt;br /&gt;
&lt;br /&gt;
====Beschreibung====&lt;br /&gt;
Die Experimentier-Platine ist dazu gedacht, eigene Schaltungen auf dem RP6 zu realisieren, und ist seit Mai 2020 bei CONRAD ausverkauft. Sie wird über den I²C-Bus mit den anderen Erweiterungsmodulen verbunden. Ausserdem ist es sinnvoll, die (freien) I/O-Ports (ADC-Kanäle) der RP6 Base, des M32 Erweiterungsmoduls bzw. des CCPRO M128 Moduls über ein [http://www.reichelt.de/?;ACTION=3;LA=444;GROUP=C63;GROUPID=3328;ARTICLE=47637;START=0;SORT=artnr;OFFSET=16;SID=1580faBqwQAQ8AAGY-ZAM7cd511ee04a106a88a359faaac0071e2 10-Pol-Flachbandkabel] mit [http://www.reichelt.de/?ACTION=3;GROUP=C151;GROUPID=3231;ARTICLE=14571;SID=1580faBqwQAQ8AAGY-ZAM7cd511ee04a106a88a359faaac0071e2 Stecker] auf die Experimentierplatine zu führen, weil es übersichtlicher bleibt und keine Kabel lose herumhängen. Auf der Experimentierplatine kann man dann LEDs oder einen Temperatursensor an die I/O-Ports bzw. an die ADC-Kanäle anschießen.&lt;br /&gt;
&lt;br /&gt;
====Technische Daten====&lt;br /&gt;
{|  {{Blauetabelle}} &lt;br /&gt;
|'''Mikrocontroller:'''&lt;br /&gt;
|Keiner&lt;br /&gt;
|-&lt;br /&gt;
|'''Speicher:'''&lt;br /&gt;
|Keiner&amp;lt;br/&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|'''Programmierung:'''&lt;br /&gt;
|Kein Programmieradapter&lt;br /&gt;
|-&lt;br /&gt;
|'''Vorhandene Sensoren:'''&lt;br /&gt;
|Keine&amp;lt;br/&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|'''Vorhandene Aktoren:'''&lt;br /&gt;
|Keine&amp;lt;br/&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|'''Abmessungen:'''&lt;br /&gt;
|(L &amp;amp;times; B &amp;amp;times; H) 112 &amp;amp;times; 90 &amp;amp;times; 10 mm&lt;br /&gt;
|-&lt;br /&gt;
|'''Ausführung:'''&lt;br /&gt;
|Bausatz&lt;br /&gt;
|-&lt;br /&gt;
|'''Stromversorgung:'''&lt;br /&gt;
|6 AA NiMH Akkus (über die RP6 Base)&lt;br /&gt;
|-&lt;br /&gt;
|'''Hersteller:'''&lt;br /&gt;
|Arexx Niederlande&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Schaltungsideen ====&lt;br /&gt;
Auf der / den Experimentierplatinen könnte man z.B. folgendes realisieren:&lt;br /&gt;
&lt;br /&gt;
* eine Kameraschaltung (wie [http://www.rn-wissen.de/index.php/RP6_Kamera_-_Mitmach-Projekt hier] gezeigt)&lt;br /&gt;
* Scheinwerfer, Rücklichter, Blinker etc. (ABER immer mit Vorwiderstand!!!)&lt;br /&gt;
* ein LED-Lauflicht (über I/O-Expander, gibt´s beim [http://www.reichelt.de/?ACTION=3;ARTICLE=14527;PROVID=2402 Reichelt])&lt;br /&gt;
* mehr ADC-Kanäle (über ADC-Expander, einfach mal nach PCF8591 [http://www.google.de/search?q=PCF8591 googlen])&lt;br /&gt;
* eine Wetterstation mit Luftfeuchtemesser, Temperaturfühler und Lichtmesser ([http://www.roboternetz.de/phpBB2/viewtopic.php?t=52298 hier] gibt es eine Wetterstation uvm.)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== RP6 CONTROL M32 Platine ===&lt;br /&gt;
[[Bild:RP6Control_M32.jpg|RP6 CONTROL M32]]&lt;br /&gt;
&lt;br /&gt;
====Beschreibung====&lt;br /&gt;
Auf der M32 ([http://www.conrad.de/ce/de/product/191550/Arexx-RP6-ATMEGA32-Erweiterungssatz 191550]) lassen sich weitere LEDs, Sensoren oder ähnliches anschließen, außerdem steht ein weiterer ATMEGA32 zur Verfügung, welcher sich gut im Master Modus betreiben lässt. Es sind ein Mikrofonsensor, fünf Taster, vier Status-LEDs, ein Display-Port, ein Beeper, 6 freie ADC-Kanäle, 8 freie I/O-Ports, ein Programmieradapter, ein JTAG-Anschluss, eine ISP-Programmierschnittstelle sowie ein freier Steckplatz für ein EEPROM verfügbar.&lt;br /&gt;
&lt;br /&gt;
Seit Ende 2021 ist die M32 bei CONRAD ausverkauft!&lt;br /&gt;
&lt;br /&gt;
====Technische Daten====&lt;br /&gt;
{|  {{Blauetabelle}} &lt;br /&gt;
|'''Mikrocontroller:'''&lt;br /&gt;
|AVR [[ATmega32]]&lt;br /&gt;
|-&lt;br /&gt;
|'''Speicher:'''&lt;br /&gt;
|32 kB [[Flash]]-Speicher, davon 1 kB bereits vom Bootloader belegt&amp;lt;br/&amp;gt;&lt;br /&gt;
2 kB SRAM&amp;lt;br/&amp;gt; &lt;br /&gt;
1 kB [[EEPROM]]&lt;br /&gt;
|-&lt;br /&gt;
|'''Programmierung:'''&lt;br /&gt;
|Über AVR-[[Bootloader]], belegt ca. 1 kB des Flash-Speichers&lt;br /&gt;
|-&lt;br /&gt;
|'''Vorhandene Sensoren:'''&lt;br /&gt;
|1 Mikrofonsensor&amp;lt;br/&amp;gt;&lt;br /&gt;
5 Eingabetaster&amp;lt;br/&amp;gt;&lt;br /&gt;
14 I/O Ports, davon 6 ADC-Wandler&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|'''Vorhandene Aktoren:'''&lt;br /&gt;
|1 Beeper&amp;lt;br/&amp;gt;&lt;br /&gt;
4 Status-LEDs&amp;lt;br/&amp;gt;&lt;br /&gt;
1 LC-Display-Port&amp;lt;br/&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|'''Abmessungen:'''&lt;br /&gt;
|(L &amp;amp;times; B &amp;amp;times; H) 112 &amp;amp;times; 90 &amp;amp;times; 15 mm&lt;br /&gt;
|-&lt;br /&gt;
|'''Ausführung:'''&lt;br /&gt;
|Fertig aufgebautes Erweiterungsmodul&lt;br /&gt;
|-&lt;br /&gt;
|'''Stromversorgung:'''&lt;br /&gt;
|6 AA NiMH Akkus (über die RP6 Base)&lt;br /&gt;
|-&lt;br /&gt;
|'''Hersteller:'''&lt;br /&gt;
|Arexx Niederlande&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Umbau-Optionen ====&lt;br /&gt;
Dieser Absatz soll die Möglichkeiten der RP6 CONTROL M32 Platine (im Folgenden &amp;quot;M32&amp;quot; genannt) auflisten, die es gibt, um auf einfache Weise weitere Anschlüsse oder Verbindungen zu ermöglichen. Nicht beschrieben werden die Anschlußmöglichkeiten, die in Form der vorhandenen Wannenstecker sowieso gegeben sind (z.B. am LCD-, I/O- oder ADC-Stecker). Im Text gibt es Verweise auf den Schaltplan der M32 (RP6_CONTROL_M32.PDF) in der Form: (SP2 B1: Bauteil).  Dies bedeutet, dass man das Bauteil auf Blatt 2 des RP6-M32-Schaltplans im Feld B1 finden kann.&lt;br /&gt;
&lt;br /&gt;
Folgende Möglichkeiten zum Umbau/Ausbau sind vorgesehen:&lt;br /&gt;
* Zweites SPI-EEPROM (IC5)&lt;br /&gt;
* Zwei analoge Sensoren, evtl. mit getrennter Stromversorgung&lt;br /&gt;
* ISP (In System Programming)&lt;br /&gt;
* JTAG-Programmierung&lt;br /&gt;
* USRBUS&lt;br /&gt;
* IRQ-Zuweisung ändern&lt;br /&gt;
* ADC0 und ADC1 anders nutzen&lt;br /&gt;
* Schieberegister kaskadieren&lt;br /&gt;
Im folgenden Text soll beschrieben werden, wie man die weiteren Möglichkeiten nutzen kann. Es wird jeweils erwähnt, was man an Material braucht. Beispielhaft sind da Bestell-Nummern der Firma [http://www.conrad.de/ce/ CONRAD] genannt. Natürlich kann man die Teile auch bei anderen Versendern beziehen. Durch die Nennung der Bestell-Nummer ist das jeweilige Teil aber gut zu identifizieren. Man sollte Löten können und sich bewußt sein, dass ggf. ein Garantieanspruch nicht mehr besteht, wenn man an der Platine gelötet hat.&lt;br /&gt;
&lt;br /&gt;
Bei den Materialangaben ist öfter die Rede von &amp;quot;Steckbuchsen mit Litze&amp;quot;. Diese Steckbuchsen mit angelöteter Litze können auf die ein- oder zweireihigen Stiftleisten aufgesteckt werden. Leider gibt es sie nicht (mehr) fertig konfektioniert bei CONRAD. Die einreihigen Steckbuchsen (RM 2,54mm) kann man aber z.B. bei [http://www.elv.de/output/controller.aspx ELV] bekommen: 2-polig (68-016635), 3-polig (68-022503) und 5-polig (68-023073). An sie muss man dann noch Litzen in der entsprechenden Länge selbst anlöten.&lt;br /&gt;
&lt;br /&gt;
===== Zweites SPI-EEPROM =====&lt;br /&gt;
Es ist sehr einfach, ein zweites SPI-EEPROM (SP1 A1: IC5*) auf der M32 zu nutzen.&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_M32_IC5-Socket.JPG|thumb|Sockel des 2. SPI-EEPROMs]]&lt;br /&gt;
&lt;br /&gt;
Man braucht dazu:&lt;br /&gt;
* Einen IC-Sockel 8-pol DIP für IC5 ([http://www.conrad.de/ce/de/product/189600/IC-FASSUNG-PRAeZISION-8POLIG 189600])&lt;br /&gt;
* Einen Keramik-Vielschicht-Kondensator 100nF (C19); RM 2,54mm ([http://www.conrad.de/ce/de/product/453099/?insert=36&amp;amp;insertNoDeeplink&amp;amp;productname=KONDENSATOR-01-F-KDPU-254-MM 453099])&lt;br /&gt;
* Ein serielles SPI-EEPROM im PDIP8 Gehäuse (IC5)&lt;br /&gt;
Zuerst wird der IC-Sockel eingelötet (Kerbe beachten!), dann C19 (SP1 A1: C19*). Das war's.&lt;br /&gt;
&lt;br /&gt;
Leider gibt es das EEPROM nicht bei den gängigeren Versendern. Bekommen kann man es aber z.B. bei [http://de.farnell.com/jsp/home/homepage.jsp Farnell]. Dort hat das SPI-EEPROM mit 256 kbit die Bezeichnung 25LC256-I/P (1331398). Wenn man es noch größer mag: 25LC1024 (1331392) mit 1024 kbit. SPI-EEPROMs führt inzwischen auch [http://www.reichelt.de./ Reichelt].&lt;br /&gt;
&lt;br /&gt;
'''Programmierung:'''&lt;br /&gt;
&lt;br /&gt;
In die RP6ControlLib.h bitte einfügen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#define SPI_EEPROM2_PAGESIZE 64&lt;br /&gt;
&lt;br /&gt;
uint8_t SPI_EEPROM2_readByte(uint16_t memAddr);&lt;br /&gt;
void SPI_EEPROM2_writeByte(uint16_t memAddr, uint8_t data);&lt;br /&gt;
void SPI_EEPROM2_enableWrite(void);&lt;br /&gt;
void SPI_EEPROM2_disableWrite(void);&lt;br /&gt;
uint8_t SPI_EEPROM2_getStatus(void);&lt;br /&gt;
&lt;br /&gt;
void SPI_EEPROM2_writeBytes(uint16_t startAddr, uint8_t *buffer, uint8_t length);&lt;br /&gt;
void SPI_EEPROM2_readBytes(uint16_t startAddr, uint8_t *buffer, uint8_t length);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Die Konstante SPI_EEPROM2_PAGESIZE ist abhängig von der Art und Größe des EEPROMs. Für ein 256 kbit-EEPROM ist die Seitengröße (pagesize) in der Regel 64, für einen 512 kbit-Typ 128 und für einen 1024 kbit-Typ 256.&lt;br /&gt;
&lt;br /&gt;
In die RP6ControlLib.c bitte einfügen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Second external SPI EEPROM:&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Reads a single Byte from the 2nd external EEPROM.&lt;br /&gt;
 */&lt;br /&gt;
uint8_t SPI_EEPROM2_readByte(uint16_t memAddr)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t data;&lt;br /&gt;
	PORTB &amp;amp;= ~MEM_CS2;&lt;br /&gt;
	writeSPI(SPI_EEPROM_READ);&lt;br /&gt;
	writeWordSPI(memAddr);&lt;br /&gt;
	data = readSPI();&lt;br /&gt;
	PORTB |= MEM_CS2;&lt;br /&gt;
	return data;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Reads &amp;quot;length&amp;quot; Bytes into the Buffer &amp;quot;buffer&amp;quot; from startAdr on. &lt;br /&gt;
 * You can read the complete 2nd EEPROM into a buffer at once - if it is large enough. &lt;br /&gt;
 * (But you only have 2KB SRAM on a MEGA32 ;) )&lt;br /&gt;
 */&lt;br /&gt;
void SPI_EEPROM2_readBytes(uint16_t startAddr, uint8_t *buffer, uint8_t length)&lt;br /&gt;
{&lt;br /&gt;
	PORTB &amp;amp;= ~MEM_CS2;&lt;br /&gt;
	writeSPI(SPI_EEPROM_READ);&lt;br /&gt;
	writeWordSPI(startAddr);&lt;br /&gt;
	readBufferSPI(&amp;amp;buffer[0], length);&lt;br /&gt;
	PORTB |= MEM_CS2;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Enable Write Mode&lt;br /&gt;
 */&lt;br /&gt;
void SPI_EEPROM2_enableWrite(void)&lt;br /&gt;
{&lt;br /&gt;
	PORTB &amp;amp;= ~MEM_CS2;&lt;br /&gt;
	writeSPI(SPI_EEPROM_WREN);&lt;br /&gt;
	PORTB |= MEM_CS2;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Disable Write Mode&lt;br /&gt;
 */&lt;br /&gt;
void SPI_EEPROM2_disableWrite(void)&lt;br /&gt;
{&lt;br /&gt;
	PORTB &amp;amp;= ~MEM_CS2;&lt;br /&gt;
	writeSPI(SPI_EEPROM_WRDI);&lt;br /&gt;
	PORTB |= MEM_CS2;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Write a single data byte to the specified 2nd EEPROM address.&lt;br /&gt;
 */&lt;br /&gt;
void SPI_EEPROM2_writeByte(uint16_t memAddr, uint8_t data)&lt;br /&gt;
{&lt;br /&gt;
	while(SPI_EEPROM2_getStatus() &amp;amp; SPI_EEPROM_STAT_WIP);&lt;br /&gt;
	SPI_EEPROM2_enableWrite();&lt;br /&gt;
	PORTB &amp;amp;= ~MEM_CS2;&lt;br /&gt;
	writeSPI(SPI_EEPROM_WRITE);&lt;br /&gt;
	writeWordSPI(memAddr);&lt;br /&gt;
	writeSPI(data);&lt;br /&gt;
	PORTB |= MEM_CS2;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Write &amp;quot;length&amp;quot; Bytes from the Buffer to the 2nd EEPROM. &lt;br /&gt;
 * YOU CAN ONLY WRITE MAXIMAL [SPI_EEPROM2_PAGESIZE] BYTES AT ONCE!!!&lt;br /&gt;
 * This is the Pagesize!&lt;br /&gt;
 * You can NOT cross a page boundary!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void SPI_EEPROM2_writeBytes(uint16_t startAddr, uint8_t *buffer, uint8_t length)&lt;br /&gt;
{&lt;br /&gt;
	while(SPI_EEPROM2_getStatus() &amp;amp; SPI_EEPROM_STAT_WIP);&lt;br /&gt;
	SPI_EEPROM2_enableWrite();&lt;br /&gt;
	PORTB &amp;amp;= ~MEM_CS2;&lt;br /&gt;
	writeSPI(SPI_EEPROM_WRITE);&lt;br /&gt;
	writeWordSPI(startAddr);&lt;br /&gt;
	writeBufferSPI(&amp;amp;buffer[0], length);&lt;br /&gt;
	PORTB |= MEM_CS2;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Returns EEPROM Status register - for checking if 2nd EEPROM is buisy. &lt;br /&gt;
 * Writing takes about 5ms. &lt;br /&gt;
 */&lt;br /&gt;
uint8_t SPI_EEPROM2_getStatus(void)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t status;&lt;br /&gt;
	PORTB &amp;amp;= ~MEM_CS2;&lt;br /&gt;
	writeSPI(SPI_EEPROM_RDSR);&lt;br /&gt;
	status = readSPI();&lt;br /&gt;
	PORTB |= MEM_CS2;&lt;br /&gt;
	return status;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Hinweis zum 1024 kbit-EEPROM:&lt;br /&gt;
&lt;br /&gt;
Dieses EEPROM benötigt 24-Bit Adressen und muss daher etwas anders angesprochen werden als die &amp;quot;kleineren&amp;quot; Typen bis 512 kbit.&lt;br /&gt;
Die Funktion SPI_EEPROM2_readByte() sieht für ein 1024 kbit-EEPROM z.B. so aus:&lt;br /&gt;
&amp;lt;pre&amp;gt;uint8_t SPI_EEPROM2_readByte(uint32_t memAddr)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t data;&lt;br /&gt;
	PORTB &amp;amp;= ~MEM_CS2;&lt;br /&gt;
	writeSPI(SPI_EEPROM_READ);&lt;br /&gt;
	writeSPI((uint8_t)(memAddr &amp;gt;&amp;gt; 16));&lt;br /&gt;
	writeWordSPI((uint16_t)memAddr);&lt;br /&gt;
	data = readSPI();&lt;br /&gt;
	PORTB |= MEM_CS2;&lt;br /&gt;
	return data;&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
Alle weiteren Funktionen, die EEPROM-Adressen verwenden (SPI_EEPROM2_readBytes, SPI_EEPROM2_writeByte, SPI_EEPROM2_writeBytes), müssen genau so angepasst werden.&lt;br /&gt;
&lt;br /&gt;
===== Anschlüsse =====&lt;br /&gt;
Hier wird aufgelistet, wo man auf der M32 Platine Anschlüsse nutzen kann, um sie z.B. zu weiteren Sensoren, zum USRBUS oder (weniger empfehlenswert!) direkt zu EPs, zur RP6 Base oder zur CCPRO M128 zu führen. &lt;br /&gt;
&lt;br /&gt;
====== Analoge Sensoren an ADC2/3 ======&lt;br /&gt;
[[Bild:RP6_M32_ADC23.JPG|thumb|ADC2 ADC3]]&lt;br /&gt;
Wenn man bis zu zwei analoge Sensoren (z.B. IR-Distanz-Mess-Sensoren Sharp GP2Y0A02YK 185364) direkt an die M32 anschließen möchte, dann gibt es da zwei 3-polige Kontakte, beschriftet mit VDD/GND/ADCx (x = 2..3). Hier kann man 3-polige Stiftleisten auflöten, an die dann die Sensoren angeschlossen werden.&lt;br /&gt;
&lt;br /&gt;
Man braucht dazu:&lt;br /&gt;
* 1-reihige Stiftleiste RM 2,54mm (z.B. 36-polig 732478)&lt;br /&gt;
* Zwei Keramik-Vielschicht-Kondensatoren 100nF (C16, C17); RM 2,54mm (453099)&lt;br /&gt;
* Ein Elektrolyt-Kondensator stehend 470 uF / 16V (C18); RM 3,5mm (446211)&lt;br /&gt;
* Zwei 3-polige Steckbuchsen mit Litze zum Anschluß der Sensoren&lt;br /&gt;
Man trennt von der 1-reihigen Stiftleiste zweimal 3 Kontakte ab und lötet sie auf die weiß umrahmten Kontakte (VDD/GND/ADCx; SP2 C23: ADC2, YGND8, YVDD6, ADC3, YGND7, YVDD5), anschließend C16, C17 (SP2 C1: C16*, C17*) auf ihre Plätze und zum Schluß den Elko 470 uF (C18; SP2 B1: C18*). Beim Elko auf die Polung achten: Er muss genau so sitzen wie sein Nachbar C1 (Minuspol schaut zum Beeper SND).&lt;br /&gt;
&lt;br /&gt;
Die Sensoren lötet man an die Litzen der 3-poligen Steckbuchsen und steckt diese auf die neuen Kontakte.&lt;br /&gt;
&lt;br /&gt;
Da manche Sensoren einen höheren Stromverbrauch haben, kann man die Stromversorgung an den VDD-Pins der ADC2/3-Stecker abschaltbar machen oder eine separate +5V-Spannung einspeisen. Siehe dazu den Abschnitt &amp;quot;Trennstellen - Getrennte Stromversorgung für ADC2/3&amp;quot; weiter unten!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====== ISP (In System Programming) ======&lt;br /&gt;
Der ATMEGA32 der M32 wird standardmäßig über den PROG/UART Stecker programmiert. Dazu befindet sich im Prozessor ein Bootloader-Programm. Wenn man stattdessen oder zusätzlich die ISP-Programmierung mit einem dafür geeigneten ISP-Programmier-Adapter nutzen will, kann man den Adapter an den gewinkelten ISP-Stecker auf der M32 anschließen.&lt;br /&gt;
Vorher sind aber ein paar &amp;quot;Umbauarbeiten&amp;quot; erforderlich.&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_M32_ISP.JPG|thumb|ISP]]&lt;br /&gt;
&lt;br /&gt;
Man braucht dazu:&lt;br /&gt;
* 1-reihige Stiftleiste RM 2,54mm (z.B. 36-polig 732478)&lt;br /&gt;
* Einen SMD-Widerstand 10 kOhm (406376)&lt;br /&gt;
* Eine SMD-Diode LL 4148 (140902)&lt;br /&gt;
* Eine Codierbrücke (z.B. aus Set 742902)&lt;br /&gt;
&lt;br /&gt;
Der SMD-Widerstand wird auf seinen Platz (R1; SP1 A3: R1*) neben dem XBUS2-Stecker gelötet, danach die Diode LL 4148 (D2; SP1 B3: D2*). Die Kathode (Strich) der Diode zeigt in Richtung des Quarzes (X1). Zwischen R1 und C1 befinden sich drei Lötpunkte (beschriftet mit ISP/DEBUG - BOOTLOAD; SP1 A34: YRST1..3), auf die eine 3-polige Stiftleiste gelötet werden muss. Vorher muss eine kurze Leiterbahn zwischen den Lötpunkten BOOTLOAD aufgetrennt werden. Die Leiterbahn befindet sich auf der Lötseite der Platine und muss mit einem scharfen Messer oder einem speziellen Leiterbahn-Unterbrecher zwischen den beiden Lötpunkten unterbrochen werden. Man sollte anschließend mit einem Widerstandsmeßgerät nachmessen: Es sollte keine Verbindung mehr zwischen den Lötpunkten bestehen.&lt;br /&gt;
Man trennt dann von der 1-reihigen Stiftleiste 3 Kontakte ab und lötet sie auf die beschriebenen drei Lötpunkte.&lt;br /&gt;
&lt;br /&gt;
Wenn man jetzt eine Codierbrücke auf die mit &amp;quot;BOOTLOAD&amp;quot; beschrifteten Pins steckt, bleibt alles unverändert: Die Programmierung erfolgt weiter über den PROG/UART-Stecker mithilfe des Bootloaders im Prozessor. Wird die Codierbrücke in Stellung &amp;quot;ISP/DEBUG&amp;quot; umgesteckt, kann der Prozessor mit ISP programmiert werden.&lt;br /&gt;
&lt;br /&gt;
Vorsicht: Das Bootloader-Programm kann dabei zerstört werden! Es müssen zusätzlich Fusebits des ATMEGA32 verändert werden. &lt;br /&gt;
&lt;br /&gt;
Dabei kann der Prozessor im schlimmsten Fall nicht mehr ansprechbar sein. Man sollte diesen Umbau und die ISP-Programmierung nur machen, wenn man genau weiß, was man macht!&lt;br /&gt;
&lt;br /&gt;
Eine Kopie des Bootloaders und eine Kurzanleitung zum Einstellen der Fusebits gibt es hier: &lt;br /&gt;
[http://www.arexx.com/rp6/downloads/RP6_M32_BOOTLOADER.zip RP6_M32_BOOTLOADER]&lt;br /&gt;
&lt;br /&gt;
====== JTAG ======&lt;br /&gt;
[[Bild:RP6_M32_JTAG.JPG|thumb|JTAG]]&lt;br /&gt;
Die Programmierung und ein Debuggen sind auch mit der JTAG-Schnittstelle möglich. Das ist nur zu empfehlen, wenn man Erfahrungen mitbringt, oder der Prozessor der M32 durch eine ISP-Falschprogrammierung z.B. nicht mehr ansprechbar ist.&lt;br /&gt;
Um die JTAG-Schnittstelle nutzen zu können, muss der ISP-Umbau durchgeführt worden sein und die dort beschriebene Codierbrücke auf &amp;quot;ISP/DEBUG&amp;quot; gesteckt sein. Der JTAG-Programmer kann dann an die Lötpunkte &amp;quot;JTAG&amp;quot; zwischen ISP- und I/O-Stecker angeschlossen werden.&lt;br /&gt;
&lt;br /&gt;
Man braucht dazu:&lt;br /&gt;
* 2-reihige Stiftleiste RM 2,54mm (z.B. 2x36-polig 742007)&lt;br /&gt;
Man trennt von der 2-reihigen Stiftleiste 2x5 Kontakte ab und lötet sie auf die 10 JTAG-Lötpunkte (SP2 A12: YTDI, YTDO, YTMS, YTCK, YTRST, YVDD3/4, YGND3/4, YNC). Hier kann jetzt der JTAG-Programmer z.B. mit einem 10-poligen Flachkabel-Stecker angeschlossen werden. Um das JTAG-Interface des ATMEGA32 nutzen zu können, müssen Änderungen an den Fusebits vorgenommen werden.&lt;br /&gt;
&lt;br /&gt;
Vorsicht: Man sollte die JTAG-Programmierung und Fusebit-Manipulationen nur machen, wenn man genau weiß, was man macht!&lt;br /&gt;
&lt;br /&gt;
====== USRBUS ======&lt;br /&gt;
Die 14 Kontakte der beiden USRBUS-Stecker sind auf der M32 nirgendwo angeschlossen, sondern können über die Lötpunkte Y1..Y14 mit beliebigen Punkten auf der M32 verbunden werden.&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_M32_USRBUS.JPG|thumb|USRBUS]]&lt;br /&gt;
&lt;br /&gt;
Ich würde auf Y1..Y14 eine Stiftleiste löten, damit die USRBUS-Belegung geändert werden kann.&lt;br /&gt;
&lt;br /&gt;
Man braucht dazu:&lt;br /&gt;
* 2-reihige Stiftleiste RM 2,54mm (z.B. 2x36-polig 742007)&lt;br /&gt;
* Einige Steckbuchsen mit Litze&lt;br /&gt;
&lt;br /&gt;
Man trennt von der 2-reihigen Stiftleiste 2x7 Kontakte ab und lötet sie auf die Punkte Y1..Y14 (SP2 E3: Y1..Y14) neben dem Wannenstecker USRBUS2. Wird die M32 über Flachkabel mit einem USRBUS-Stecker auf einer RP6 Experimentierplatine (EP) und/oder mit dem RP6 selbst verbunden, dann hat man mit allen mit dem USRBUS verbundenen Platinen eine direkte 14-polige Verbindung,- eben den &amp;quot;User Bus&amp;quot;. Den kann man dann nutzen, wie man will. Auf der M32 kann man mit Steckbuchsen die Pins Y1..Y14 mit anderen Pins verbinden.&lt;br /&gt;
&lt;br /&gt;
Beispiel: Verbindet man den Pin &amp;quot;ADC2&amp;quot; mit Y1 des USRBUS, dann steht der Eingang ADC2 auf allen an den USRBUS angeschlossenen Platinen an Y1 zur Verfügung. Man braucht also diesen Eingang nicht über ein eigenes Kabel auf eine EP zu führen, sondern kann dazu den USRBUS nehmen. Dadurch bleibt der Gesamtaufbau auf dem RP6 übersichtlich und komplett trennbar (man braucht nur die Stecker XBUS und USRBUS abzuziehen!).&lt;br /&gt;
&lt;br /&gt;
Wichtig: Man sollte gut dokumentieren, wie man den USRBUS am RP6 (vorn und hinten getrennt!), auf EPs und der M32/M128 benutzt! Sonst kann es bei einer anderen Anordnung von EPs zu USRBUS Konflikten/Kurzschlüssen kommen.&lt;br /&gt;
&lt;br /&gt;
====== Schieberegister kaskadieren ======&lt;br /&gt;
[[Bild:RP6_M32_SPI.JPG|thumb|SPI]]&lt;br /&gt;
Auf der M32 wird ein 8-Bit Schieberegister-Baustein (IC3: 74HC4094D) dazu gebraucht, vier Status-LEDs (LED1..LED4) und ein LCD (am Stecker LCD) anzusteuern. Durch Schieberegister kann man Port-Pins gewinnen, wenn die Pins des Prozessors nicht ausreichen.&lt;br /&gt;
&lt;br /&gt;
Solche Schieberegister kann man &amp;quot;kaskadieren&amp;quot;, d.h. weitere identische Bausteine einbauen, die weitere Port-Pins zur Verfügung stellen. Wenn man zusätzliche 74HC4094 einsetzen will, wird man das am besten auf einer EP aufbauen. Die Anschlüsse für diese Schieberegister werden auf der M32 an einer 6-poligen Reihe von Lötpunkten (beschriftet mit MISO, STR, MOSI, SCK, QS, QS*; SP1 D3: YQS1/2, YMOSI, YSCK, YSTR, YMISO) links von IC3 zur Verfügung gestellt.&lt;br /&gt;
&lt;br /&gt;
Wenn man diese 6 Signalleitungen auf eine EP führen will, gibt es dafür zwei Möglichkeiten:&lt;br /&gt;
* a) Direkte 6-polige Kabelverbindung von den oben beschriebenen Lötpunkten zur EP&lt;br /&gt;
* b) Nutzung des USRBUS, um die 6 Signale zur EP zu führen&lt;br /&gt;
Wenn man im Abschnitt &amp;quot;[[RP6#USRBUS|USRBUS]]&amp;quot; den entsprechenden Umbau gemacht hat, würde ich b) empfehlen! Man könnte dafür eine 6-polige Stiftleiste auf die o.g. Lötpunkte auflöten und 1:1 z.B. mit den Pins Y4, Y6, Y8, Y10, Y12, Y14 des USRBUS verbinden. Dann kann man auf der EP weitere Schieberegister- und SPI-Bausteine (z.B. SPI-EEPROMs, [http://www.pollin.de/shop/dt/MDU5OTgxOTk-/Bausaetze_Module/Module/Funkmodul_RFM12_433_Sende_Empfangsmodul.html RFM12 Transceiver] o.ä.) aufbauen.&lt;br /&gt;
&lt;br /&gt;
Man braucht dazu:&lt;br /&gt;
* 1-reihige Stiftleiste RM 2,54mm (z.B. 36-polig 732478)&lt;br /&gt;
* Steckbuchsen mit Litze&lt;br /&gt;
Man trennt von der 1-reihigen Stiftleiste 6 Kontakte ab und lötet sie auf die beschriebenen sechs Lötpunkte auf der M32. Mit den Steckbuchsen mit Litze wird dann die Verbindung entweder direkt zur EP (Option a) oder über den USRBUS zur EP (Option b) hergestellt.&lt;br /&gt;
&lt;br /&gt;
====== VDD/GND/+UB Anschluß ======&lt;br /&gt;
[[Bild:RP6_M32_VDDGNDUB.JPG|thumb|RP6 M32 VDD GND +UB]]&lt;br /&gt;
VDD, GND und +UB (SP2 C3: YUB1, YGND1/2/5, YVDD1/2) kann man auf der M32 an diesen Lötpunkten abnehmen.&lt;br /&gt;
&lt;br /&gt;
Natürlich kann man hier auch Stiftleisten auflöten.&lt;br /&gt;
&lt;br /&gt;
Auf der anderen Platinenseite (zwischen dem USRBUS1 und ISP Stecker) befinden sich zusätzlich noch 2 weitere Lötpunkte, an denen man VDD und GND kontaktieren kann.&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;
&lt;br /&gt;
====== Serielle Schnittstelle ======&lt;br /&gt;
[[Bild:RP6_M32_RST.JPG|thumb|RP6 M32 RST]]&lt;br /&gt;
Neben dem PROG/UART Stecker befinden sich 5 Lötpunkte mit den Signalen RST, TX, RX, GND, VDD (SP2 BC3: YRX, YTX, YRST, YVDD, YGND). Hier kann z.B. eine 5-polige Stiftleiste aufgelötet werden, um einen Anschluß an die serielle Schnittstelle zu ermöglichen.&lt;br /&gt;
 &lt;br /&gt;
Von diesen 5 Lötpunkten könnte z.B. auch eine Verbindung zum USRBUS hergestellt werden, um die serielle Schnittstelle der M32 auf EPs zu führen.&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;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====== MEM_CS2 ======&lt;br /&gt;
[[Bild:RP6_M32_MEM_CS2.JPG|thumb|RP6 M32 MEM_CS2]]&lt;br /&gt;
MEM_CS2 (M32 Microcontroller Pin PB1) kann man am IC5-Sockel an Pin 1 (SP1 A1: IC5*, Pin 1) kontaktieren. Falls IC5 nicht eingesetzt werden soll, kann man hier durch Einstecken eines Kabels in Pin 1 des IC5-Sockels PB1 nutzen und z.B. zum USRBUS führen.&lt;br /&gt;
&lt;br /&gt;
===== Mess-/Kontaktpunkte =====&lt;br /&gt;
Hier geht es um Kontaktpunkte, an denen man z.B. den Logik-Pegel (High/Low) oder eine analoge Spannung messen kann. Natürlich kann man die Signale auch zur Weiterleitung auf eine EP kontaktieren, dies wird man aber normalerweise nicht brauchen.&lt;br /&gt;
&lt;br /&gt;
====== M-Signal ======&lt;br /&gt;
[[Bild:RP6_M32_M_SIGNAL.JPG|thumb|RP6 M32 M-Signal]]&lt;br /&gt;
An diesem Messpunkt (SP1 E3: YM_SIGNAL) neben D1 kann man die Ausgangsspannung des Mikrofon-Verstärkers IC4 (SP1 E3: IC4) messen oder z.B. mit einem Oszilloskop darstellen.&lt;br /&gt;
&lt;br /&gt;
===== Trennstellen =====&lt;br /&gt;
An diesen Stellen können Leiterbahnen unterbrochen werden, um Funktionen zu deaktivieren oder anders zu nutzen. &lt;br /&gt;
&lt;br /&gt;
====== Getrennte Stromversorgung für ADC2/3 ======&lt;br /&gt;
Wenn man für die analogen Sensoren an ADC2/3 (siehe Abschnitt &amp;quot;Anschlüsse - Analoge Sensoren an ADC2/3&amp;quot; weiter oben!) eine GETRENNTE Stromversorgung vorsehen will und/oder mit Codierbrücke (oder MOSFET) die Stromversorgung abschaltbar machen möchte, muss man erst Vorarbeit leisten.&lt;br /&gt;
[[Bild:RP6_M32_SV.jpg|thumb|RP6 M32 SV]]&lt;br /&gt;
&lt;br /&gt;
Man braucht dazu:&lt;br /&gt;
* 1-reihige Stiftleiste RM 2,54mm (z.B. 36-polig 732478)&lt;br /&gt;
* Evtl.: Eine Codierbrücke (z.B. aus Set 742902)&lt;br /&gt;
* Evtl.: Eine 1-polige Steckbuchse mit Litze zur ext. Stromversorgung&lt;br /&gt;
Es muss eine kurze Leiterbahn zwischen den Punkten &amp;quot;SV1&amp;quot; und &amp;quot;SV2&amp;quot; (SP2 B2: SV1, SV2) aufgetrennt werden. Die Leiterbahn befindet sich auf der Lötseite der Platine und muss mit einem scharfen Messer oder einem speziellen Leiterbahn-Unterbrecher zwischen den beiden Lötpunkten unterbrochen werden. Man sollte anschließend mit einem Widerstandsmeßgerät zwischen SV1 und SV2 nachmessen: Es sollte keine Verbindung mehr bestehen. Jetzt trennt man von der 1-reihigen Stiftleiste 2 Kontakte ab und lötet sie auf die Punkte SV1/SV2.&lt;br /&gt;
&lt;br /&gt;
Man kann hier zunächst eine Codierbrücke aufstecken. Damit versorgt der RP6 Akku die Sensoren mit 5V an den Pins VDD. Möchte man später eine getrennte 5V-Spannung anlegen, zieht man einfach die Codierbrücke ab und speist die externe 5V-Spannung (mit einer 1-poligen Steckbuchse) am Pin SV2 ein. Achtung: An Pin SV1 wird dann nichts angeschlossen!&lt;br /&gt;
&lt;br /&gt;
Anstelle der Codierbrücke kann man natürlich auch einen MOSFET anschließen, um die Sensoren per Software abschalten zu können.&lt;br /&gt;
&lt;br /&gt;
====== Interrupt-Zuordnung ändern ======&lt;br /&gt;
Am XBUS stehen vier Interrupt-Pins (genannt INT1..INT3, INTU) zur Verfügung. INT1 ist auf der RP6 Base mit PA4 verbunden, auf der M32 mit PD2 (Prozessor INT0), auf der M128 mit PE5 (Prozessor INT5) und auf der [[RP6v2#RP6v2_M256_WiFi_Platine|RP6 M256 WiFi]] mit PJ3 (Prozessor PCINT12). Diese Tabelle zeigt die Verbindung aller Interruptleitungen auf den Platinen (RP6 Base, M32, M128, M256 WiFi) über den XBUS:&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |XBUS Pin&lt;br /&gt;
 |XBUS INTx&lt;br /&gt;
 |RP6 Base Pin&lt;br /&gt;
 |RP6 Base INTx&lt;br /&gt;
 |RP6 M32 Pin&lt;br /&gt;
 |RP6 M32 INTx&lt;br /&gt;
 |RP6 M128 Pin&lt;br /&gt;
 |RP6 M128 INTx&lt;br /&gt;
 |RP6 M256 Pin&lt;br /&gt;
 |RP6 M256 INTx&lt;br /&gt;
 |-&lt;br /&gt;
 |8&lt;br /&gt;
 |INT1&lt;br /&gt;
 |PA4&lt;br /&gt;
 |kein&lt;br /&gt;
 |PD2&lt;br /&gt;
 |INT0&lt;br /&gt;
 |PE5&lt;br /&gt;
 |INT5&lt;br /&gt;
 |PJ3&lt;br /&gt;
 |PCINT12&lt;br /&gt;
 |-&lt;br /&gt;
 |11&lt;br /&gt;
 |INT2&lt;br /&gt;
 |n.c.&lt;br /&gt;
 |&lt;br /&gt;
 |PD3 *&lt;br /&gt;
 |INT1&lt;br /&gt;
 |n.c.&lt;br /&gt;
 |&lt;br /&gt;
 |PJ6&lt;br /&gt;
 |PCINT15&lt;br /&gt;
 |-&lt;br /&gt;
 |9&lt;br /&gt;
 |INT3&lt;br /&gt;
 |n.c.&lt;br /&gt;
 |&lt;br /&gt;
 |PB2 *&lt;br /&gt;
 |INT2&lt;br /&gt;
 |PE6&lt;br /&gt;
 |INT6&lt;br /&gt;
 |PJ5&lt;br /&gt;
 |PCINT14&lt;br /&gt;
 |-&lt;br /&gt;
 |7&lt;br /&gt;
 |INTU&lt;br /&gt;
 |n.c.&lt;br /&gt;
 |&lt;br /&gt;
 |n.c.    *&lt;br /&gt;
 |&lt;br /&gt;
 |n.c.&lt;br /&gt;
 |&lt;br /&gt;
 |PJ4&lt;br /&gt;
 |PCINT13&lt;br /&gt;
 |-&lt;br /&gt;
|}&lt;br /&gt;
'''Zu *:''' Standard-Belegung. Ggf. abhängig von der nachfolgend beschriebenen Interrupt-Zuordnung!&lt;br /&gt;
&lt;br /&gt;
Auf der M32 kann man die Interrupt-Zuordnung für INT2, INT3 und INTU durch drei Codierbrücken (beschriftet mit I2-INTU, INT3-I3, I2-INT2; SP2 A3: YINT2/3/U, YI2_1/2, YI3) ändern.&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_M32_INTx.JPG|thumb|INTx]]&lt;br /&gt;
&lt;br /&gt;
Man braucht dazu:&lt;br /&gt;
* 2-reihige Stiftleiste RM 2,54mm (z.B. 2x36-polig 742007)&lt;br /&gt;
* Drei Codierbrücken (z.B. aus Set 742902)&lt;br /&gt;
Vor dem Auflöten der Stiftleiste müssen zwei kurze Leiterbahnen zwischen zwei Lötpunkten aufgetrennt werden, und zwar zwischen den Lötpunkten INT3-I3 und I2-INT2. Die Leiterbahnen müssen mit einem scharfen Messer oder einem speziellen Leiterbahn-Unterbrecher zwischen den beiden Lötpunkten unterbrochen werden. Man sollte anschließend mit einem Widerstandsmeßgerät nachmessen: Es sollte keine Verbindung mehr zwischen INT3-I3 und I2-INT2 bestehen. Man trennt dann von der 2-reihigen Stiftleiste 2x3 Kontakte ab und lötet sie auf das weiß umrahmte Feld mit der o.g. Beschriftung.&lt;br /&gt;
&lt;br /&gt;
Hier kann man auf INT3-I3 und I2-INT2 je eine Codierbrücke aufstecken, wenn man die Standard-Belegung beibehalten will. Steckt man auf I2-INTU eine Codierbrücke, dann ist INTU des XBUS mit Pin PD3 (I2) der M32 verbunden.&lt;br /&gt;
&lt;br /&gt;
'''Hinweis:''' Man kann auf die 6-polige Stiftleiste auch Codierbrücken QUER zur eigentlichen (horizontalen) Richtung aufsetzen. Dadurch kann jede der 3 Interruptleitungen des XBUS (INT2, INT3, INTU) mit jedem der 2 Interrupt Pins der M32 (PD3, PB2) verbunden werden.&lt;br /&gt;
&lt;br /&gt;
Wenn man keine der Codierbrücken aufsteckt, sind die Pins PD3 (I2) und PB2 (I3) des M32-Prozessors nicht mehr mit dem XBUS verbunden und können anders verwendet werden. Auf der M32 kann man dann z.B. auch andere Verbindungen zum XBUS herstellen, indem man auf die Pins INT2, INT3 oder INTU Kabelverbindungen aufsteckt.&lt;br /&gt;
&lt;br /&gt;
====== ADC0 und ADC1 frei nutzen ======&lt;br /&gt;
Auf der M32 ist ADC0 fest mit dem Mikrofon (MIC) und ADC1 mit den Tastern T1..T5 (KEYPAD) verbunden. Wenn man diese ADC-Eingänge für andere Sensoren benötigt, kann man das Mikrofon und die Taster von den Eingängen abtrennen.&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_M32_MIC_KEY.JPG|thumb|MIC_KEYPAD]]&lt;br /&gt;
&lt;br /&gt;
Man braucht dazu:&lt;br /&gt;
* 1-reihige Stiftleiste RM 2,54mm (z.B. 36-polig 732478)&lt;br /&gt;
* Eine Codierbrücke (z.B. aus Set 742902)&lt;br /&gt;
&lt;br /&gt;
MIC/ADC0:&lt;br /&gt;
Es muss eine kurze Leiterbahn zwischen zwei Lötpunkten aufgetrennt werden, die sich zwischen R2 und C19 befinden (SP1 D4: YM1, YM2). Die Leiterbahn muss mit einem scharfen Messer oder einem speziellen Leiterbahn-Unterbrecher zwischen den beiden Lötpunkten unterbrochen werden. Man sollte anschließend mit einem Widerstandsmeßgerät nachmessen: Es sollte keine Verbindung mehr bestehen. Vorsicht: Nicht R2 beschädigen! Damit ist das Mikrofon auf der M32 ohne Funktion und ADC0 kann anders genutzt werden. ADC0 ist dann am oberen Lötpunkt zwischen R2 und C19 verfügbar, dort müßte eine Kabelverbindung angelötet werden.&lt;br /&gt;
Soll das Mikrofon später doch wieder an ADC0 angeschlossen werden, verbindet man die beiden Lötpunkte zwischen R2 und C19 einfach mit etwas Lötzinn oder mit einem SMD Null Ohm Widerstand.&lt;br /&gt;
&lt;br /&gt;
KEYPAD/ADC1:&lt;br /&gt;
Es muss eine kurze Leiterbahn zwischen zwei Lötpunkten aufgetrennt werden, die sich unterhalb von R15 befinden (SP1 D2: YKP1, YKP2). Die Leiterbahn befindet sich auf der Lötseite der Platine und muss mit einem scharfen Messer oder einem speziellen Leiterbahn-Unterbrecher zwischen den beiden Lötpunkten unterbrochen werden. Man sollte anschließend mit einem Widerstandsmeßgerät nachmessen: Es sollte keine Verbindung mehr bestehen. Jetzt trennt man von der 1-reihigen Stiftleiste 2 Kontakte ab und lötet sie auf die beiden Punkte unterhalb von R15. Hier kann man jetzt eine Codierbrücke aufstecken, wenn man die Taster weiter benutzen will. Wenn die Brücke abgezogen ist, sind die Taster ohne Funktion und ADC1 kann anders genutzt werden. ADC1 ist dann am linken Pin der 2-poligen Stiftleiste unterhalb von R15 verfügbar.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== RP6 CCPRO M128 Platine===&lt;br /&gt;
&lt;br /&gt;
[[Bild:CCPRO M128 k-1-.jpg|Das CCPRO M128]]&lt;br /&gt;
&lt;br /&gt;
====Beschreibung====&lt;br /&gt;
Die M128 (191563) ergänzt das RP6 Roboter System um einen leistungsfähigen ATMEGA128 Prozessor.&lt;br /&gt;
Es sind ein Temperatursensor; 19 I/O-Ports, davon 8 ADCs, 3 PWM (Servos) und 2 I/Os für einen UART; 1 Beeper; 5 Status-LEDs; 1 LC-Display-Port sowie ein freier Steckplatz für ein EEPROM verfügbar.&lt;br /&gt;
&lt;br /&gt;
====Technische Daten====&lt;br /&gt;
{|  {{Blauetabelle}} &lt;br /&gt;
|'''Mikrocontroller:'''&lt;br /&gt;
|Steckplatz für ein C-Control PRO MEGA128 Modul mit einem AVR ATmega128 ([https://www.conrad.de/de/p/c-control-prozessor-unit-mega-128-pro-198219.html 198219])&lt;br /&gt;
|-&lt;br /&gt;
|'''Speicher:'''&lt;br /&gt;
|128 kB [[Flash]]-Speicher, davon 4 kB bereits vom Bootloader belegt&amp;lt;br/&amp;gt;&lt;br /&gt;
4 kB SRAM intern&amp;lt;br/&amp;gt; &lt;br /&gt;
64 kB SRAM extern&amp;lt;br/&amp;gt;&lt;br /&gt;
4 kB [[EEPROM]]&lt;br /&gt;
|-&lt;br /&gt;
|'''Programmierung:'''&lt;br /&gt;
|Über CCPRO-IDE&lt;br /&gt;
|-&lt;br /&gt;
|'''Vorhandene Sensoren:'''&lt;br /&gt;
|1 12bit I²C Temperatursensor &amp;lt;br/&amp;gt;&lt;br /&gt;
19 I/O-Ports, davon 8 ADCs, 3 PWM (Servos) und 2 I/Os für eine weitere serielle Schnittstelle (UART)&lt;br /&gt;
|-&lt;br /&gt;
|'''Vorhandene Aktoren:'''&lt;br /&gt;
|1 Beeper&amp;lt;br/&amp;gt;&lt;br /&gt;
5 Status-LEDs&amp;lt;br/&amp;gt;&lt;br /&gt;
1 LC-Display-Port&amp;lt;br/&amp;gt;&lt;br /&gt;
1 Sockel für ein I²C-Bus EEPROM vom Typ 24(L)Cxxx&lt;br /&gt;
|-&lt;br /&gt;
|'''Abmessungen:'''&lt;br /&gt;
|(L &amp;amp;times; B &amp;amp;times; H) 112 &amp;amp;times; 90 &amp;amp;times; 21 mm&lt;br /&gt;
|-&lt;br /&gt;
|'''Ausführung:'''&lt;br /&gt;
|Fertig aufgebautes Erweiterungsmodul&lt;br /&gt;
|-&lt;br /&gt;
|'''Stromversorgung:'''&lt;br /&gt;
|6 AA NiMH Akkus (über die RP6 Base)&lt;br /&gt;
|-&lt;br /&gt;
|'''Hersteller:'''&lt;br /&gt;
|Arexx Niederlande&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Umbauoptionen====&lt;br /&gt;
Auf der CCPRO M128 ([http://www.conrad.de/ce/de/product/191563/Arexx-RP6-CC-PRO-MEGA128-Erweiterungssatz 191563]) kann leider nicht so viel umgebaut werden:&lt;br /&gt;
&lt;br /&gt;
* I2C-EEPROM&lt;br /&gt;
* Freie Nutzung von PORTA* und PORTC*&lt;br /&gt;
* USRBUS&lt;br /&gt;
* A16-/PD4-Nutzung&lt;br /&gt;
&lt;br /&gt;
Im Text gibt es Verweise auf den Schaltplan der CCPRO M128 (RP6_CCPRO_M128_Schematic.PDF) in der Form: (SP2 B1: Bauteil).  Dies bedeutet, dass man das Bauteil auf Blatt 2 des M128-Schaltplans im Feld B1 finden kann.&lt;br /&gt;
&lt;br /&gt;
Bei den Materialangaben ist öfter die Rede von &amp;quot;Steckbuchsen mit Litze&amp;quot;. Diese Steckbuchsen mit angelöteter Litze können auf die ein- oder zweireihigen Stiftleisten aufgesteckt werden. Leider gibt es sie nicht (mehr) fertig konfektioniert bei CONRAD. Die einreihigen Steckbuchsen (RM 2,54mm) kann man aber z.B. bei [http://www.elv.de/output/controller.aspx ELV] bekommen: 2-polig (68-016635), 3-polig (68-022503) und 5-polig (68-023073). An sie muss man dann noch Litzen in der entsprechenden Länge selbst anlöten.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=====I2C-EEPROM=====&lt;br /&gt;
Zum Einsetzen eines I2C-EEPROMS (IC6; SP2 C1: IC6) braucht man nichts umzubauen. Man kauft einfach ein passendes EEPROM des Typs 24(L)Cxxxx-P und setzt es auf seinen Sockel, Kerbe zum oberen Platinenrand.&lt;br /&gt;
&lt;br /&gt;
Mögliche Typen (erhältlich z.B. bei [http://www.digikey.de/ Digi-Key] oder bei [http://www.reichelt.de./ Reichelt]):&lt;br /&gt;
* AT24C128  (AT24C128-10PU-2.7-ND)&lt;br /&gt;
* AT24C256  (AT24C256-10PU-2.7-ND)&lt;br /&gt;
* AT24C512  (AT24C512-10PU-2.7-ND)&lt;br /&gt;
* AT24C1024 (AT24C1024-10PI-2.7-ND)&lt;br /&gt;
&lt;br /&gt;
=====Anschlüsse=====&lt;br /&gt;
Hier wird aufgelistet, wo man auf der M128 Platine Anschlüsse nutzen kann, um sie z.B. zu weiteren Sensoren, zum USRBUS oder (weniger empfehlenswert!) direkt zu EPs, zur RP6 Base oder zur M32 zu führen. &lt;br /&gt;
&lt;br /&gt;
======Freie Nutzung von PORTA* und PORTC*======&lt;br /&gt;
Um PORTA* und PORTC* frei nutzen zu können (für weitere I/O-Ports), muss man auf das externe SRAM verzichten, was nicht sehr ratsam ist. Mehr I/O-Ports kann man alternativ durch I/O Expander gewinnen. Falls man das SRAM trotzdem deaktivieren will, hier die Anleitung.&lt;br /&gt;
&lt;br /&gt;
Für den Umbau braucht man:&lt;br /&gt;
* Wannenstecker 2x5-polig gerade RM 2,54mm (z.B. [http://www.reichelt.de./ Reichelt] WSL 10G)&lt;br /&gt;
* 1-reihige Stiftleiste RM 2,54mm (z.B. 36-polig 732478)&lt;br /&gt;
* Eine Codierbrücke (z.B. aus Set 742902)&lt;br /&gt;
[[Bild:RP6_M128_PortA.JPG|thumb|PORTA*]]&lt;br /&gt;
&lt;br /&gt;
Für die Bestückung von PORTA* (SP2 AB2: Stecker PORTA*) lötet man den Wannenstecker hier (siehe Abb. PORTA*) auf.&lt;br /&gt;
[[Bild:RP6_M128_PortC.JPG|thumb|PORTC*]]&lt;br /&gt;
&lt;br /&gt;
Für die Bestückung von PORTC* (SP1 A2: PC0..7, YGND1) trennt man von der 1-reihigen Stiftleiste 9 Kontakte ab und lötet sie auf die PORTC*-Lötpunkte (siehe Abb. PORTC*).&lt;br /&gt;
&lt;br /&gt;
Dann muss noch der SRAM-Enable Jumper (SP1 EF1: Y27..29) bestückt werden:&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_M128_EN_SRAM.JPG|EN_SRAM]]&lt;br /&gt;
&lt;br /&gt;
Man trennt von der 1-reihigen Stiftleiste 3 Kontakte ab und lötet sie auf die abgebildeten Lötpunkte. Vorher muss eine Leiterbahn auf der Lötseite der Platine zwischen den ENABLE-Lötpunkten aufgetrennt werden.&lt;br /&gt;
Wenn das SRAM wie bisher genutzt werden soll, steckt man die Codierbrücke auf die Stellung &amp;quot;ENABLE&amp;quot;. Will man stattdessen Port A und Port C frei nutzen (und damit auf SRAM verzichten!), kommt die Codierbrücke auf &amp;quot;DISABLE&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
======USRBUS======&lt;br /&gt;
Auf die 14 Kontakte neben dem Wannenstecker USRBUS2 ist noch nichts gelötet.&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_M128_USRBUS.JPG|thumb|USRBUS]]&lt;br /&gt;
&lt;br /&gt;
Ich würde auf Y1..Y14 eine Stiftleiste löten, damit die USRBUS-Belegung geändert werden kann.&lt;br /&gt;
&lt;br /&gt;
Man braucht dazu:&lt;br /&gt;
* 2-reihige Stiftleiste RM 2,54mm (z.B. 2x36-polig 742007)&lt;br /&gt;
* Einige Steckbuchsen mit Litze&lt;br /&gt;
&lt;br /&gt;
Man trennt von der 2-reihigen Stiftleiste 2x7 Kontakte ab und lötet sie auf die Punkte Y1..Y14 (SP2 E234: Y1..Y14) neben dem Wannenstecker USRBUS2. Wird die M128 über Flachkabel mit einem USRBUS-Stecker auf einer RP6 Experimentierplatine (EP) und/oder mit dem RP6 selbst verbunden, dann hat man mit allen mit dem USRBUS verbundenen Platinen eine direkte 14-polige Verbindung,- eben den &amp;quot;User Bus&amp;quot;. Den kann man dann nutzen, wie man will. Auf der M128 kann man mit Steckbuchsen die Pins Y1..Y14 mit anderen Pins verbinden.&lt;br /&gt;
&lt;br /&gt;
Beispiel: Verbindet man den Pin &amp;quot;ADC4&amp;quot; mit Y1 des USRBUS, dann steht der Eingang ADC4 auf allen an den USRBUS angeschlossenen Platinen an Y1 zur Verfügung. Man braucht also diesen Eingang nicht über ein eigenes Kabel auf eine EP zu führen, sondern kann dazu den USRBUS nehmen. Dadurch bleibt der Gesamtaufbau auf dem RP6 übersichtlich und komplett trennbar (man braucht nur die Stecker XBUS und USRBUS abzuziehen!).&lt;br /&gt;
&lt;br /&gt;
Wichtig: Man sollte gut dokumentieren, wie man den USRBUS am RP6 (vorn und hinten getrennt!), auf EPs und der M128 benutzt! Sonst kann es bei einer anderen Anordnung von EPs zu USRBUS Konflikten/Kurzschlüssen kommen.&lt;br /&gt;
&lt;br /&gt;
======IC5 ALERT======&lt;br /&gt;
[[Bild:RP6_M128_IC5_ALERT.JPG|thumb|IC5 ALERT]]&lt;br /&gt;
Dieser Lötpunkt (SP2 C2: AL) neben IC5 ist der Anschluß ALERT (Pin 3) des I2C-Temperatursensors TCN75A (SP2 C2: IC5).&lt;br /&gt;
&lt;br /&gt;
Dies ist ein Open-Drain Ausgang, der ein Alarm-Signal ausgibt, wenn die Temperatur die eingestellten Grenzen über-/unterschreitet (siehe auch Datenblatt des Sensors (TCN75A.pdf), Abschnitt 5.3.4!). Wenn man ALERT auf einen Eingang des Microcontrollers führen will, muß man auch noch einen Pullup-Widerstand vorsehen oder den internen Pullup des uC-Eingangs aktivieren.&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;
======VDD/GND Anschluß======&lt;br /&gt;
[[Bild:RP6_M128_VDDGND.JPG|thumb|VDD GND]]&lt;br /&gt;
Auf der CCPRO M128 gibt es 2 Lötpunkte (SP1 E34: YVDD3, YGND4) zwischen R5 und C7 bzw. direkt neben der Codierbrücke (SP1 E3: YL9, YL10) zum Deaktivieren von LED5.&lt;br /&gt;
&lt;br /&gt;
Hier könnte man VDD und GND kontaktieren. VDD ist der Lötpunkt, der näher an R5 liegt.&lt;br /&gt;
&lt;br /&gt;
=====Trennstellen=====&lt;br /&gt;
An diesen Stellen können Leiterbahnen unterbrochen werden, um Funktionen zu deaktivieren oder anders zu nutzen. &lt;br /&gt;
&lt;br /&gt;
======A16-/PD4-Nutzung======&lt;br /&gt;
&lt;br /&gt;
[[Bild:v2RP6_M128_A16.JPG|thumb|A16/PD4]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Auf der CCPRO M128 gibt es ein 3-poliges Feld von Lötpunkten (SP2 AB1: PD4, A16, GND) unter dem CCPRO MEGA128 Modul (IC1). Standardmässig ist A16 des SRAM (IC3) hier auf GND gelegt. Damit kann man PD4 des Prozessors (ICP1) frei nutzen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Will man A16 des SRAM mit PD4 schaltbar machen, muss man eine Leiterbahn auf der Bestückungsseite zwischen den oberen zwei der drei Lötpunkte auftrennen und die anderen (unteren) beiden Lötpunkte mit etwas Lötzinn oder einem SMD Null Ohm Widerstand verbinden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der Sinn dieses Umbaus besteht darin, dass man danach anstelle von 64kB nun die vollen 128kB SRAM des IC3 adressieren kann. Man muss dann aber PD4 selbst schalten, da C-Control PRO ab Version 1.50 nur 64kB ext. SRAM ansteuern kann. Immerhin könnte man dann 2 Blöcke à je 64kB nutzen und mit PD4 zwischen beiden Blöcken umschalten.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ob CCPRO damit klar kommt: Wohl kaum! Ich würde daher diesen Umbau nicht durchführen.&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Zubehör und Ersatzteile ==&lt;br /&gt;
Von [http://www.conrad.de/ce/ CONRAD] gibt es z.B. &lt;br /&gt;
&lt;br /&gt;
* das LC- ([http://www.conrad.de/ce/de/product/190911/LC-DISPLAY-16-X-2-KONFEKTIONIERT 190911] AUSVERKAUFT!) oder Backlight-Display ([http://www.conrad.de/ce/de/product/191621/DISPLAY-RP5RP6-BLAU-MIT-BACKLIGHT 191621] AUSVERKAUFT!), welche an die M32, an die CCPRO M128 und an die M256 WiFi angeschlossen werden können,&lt;br /&gt;
* einen IR-Ball ([http://www.conrad.de/ce/de/product/191437/INFRAROT-BALL-FUeR-ROBOTER-FUssBALL 191437] AUSVERKAUFT!),&lt;br /&gt;
* einen Graustufen-Boden-Sensor ([http://www.conrad.de/ce/de/product/191599/GRAUSTUFEN-BODEN-SENSOR-FUeR-FUssBALLROBOT 191599] AUSVERKAUFT!),&lt;br /&gt;
* eine IR-Fernbedienung Promo 8 ([http://www.conrad.de/ce/de/product/340720/PROMO-8-UNIVERSALFERNBEDIENUNG 340720] AUSVERKAUFT!) oder Vivanco UR 89 ([http://www.conrad.de/ce/de/product/351013/VivancoUR-89-Fernbedienung-8-Geraete 351013] AUSVERKAUFT!),&lt;br /&gt;
* Ersatzräder ([http://www.conrad.de/ce/de/product/191307/ANTRIEBSRAD-RP5RP6 191307] AUSVERKAUFT!),&lt;br /&gt;
* Ersatzzahnräder ([http://www.conrad.de/ce/de/product/191346/SCHRAeG-ZAHNRAeDERSATZ-RP5RP6 191346]) und&lt;br /&gt;
* Ersatzraupen ([http://www.conrad.de/ce/de/product/191333/RAUPENSATZ-RP5RP6 191333] AUSVERKAUFT!).&lt;br /&gt;
&lt;br /&gt;
===Displays===&lt;br /&gt;
Die vorkonfektionierten Displays kann man zum Ausgeben von Texten, Sensordaten und kleinen Animationen benutzen. Sie können an die M32, an die CCPRO M128 und an die M256 WiFi angeschlossen werden.&lt;br /&gt;
&lt;br /&gt;
Diese 16x2 Zeichen Displays sind bisher lieferbar:&lt;br /&gt;
&lt;br /&gt;
* LC-Display ([http://www.conrad.de/ce/de/product/190911/LC-DISPLAY-16-X-2-KONFEKTIONIERT 190911])&lt;br /&gt;
* OLED-Display (197622)&lt;br /&gt;
* Backlight-Display AREXX RP-DSP88 ([http://www.conrad.de/ce/de/product/191621/DISPLAY-RP5RP6-BLAU-MIT-BACKLIGHT 191621])&lt;br /&gt;
&lt;br /&gt;
Das LCD ist seit September 2018 bei CONRAD ausverkauft; zeitweise (2007/08) gab es unter dieser Bestellnummer eine Version, die zu klein (66 x 37mm) war, um sie auf der M32, der CCPRO M128 oder der M256 WiFi zu montieren.&lt;br /&gt;
&lt;br /&gt;
Das OLED-Display ist aktuell (April 2012) nicht mehr lieferbar.&lt;br /&gt;
&lt;br /&gt;
Das zuletzt ausschließlich nur noch erhältliche blaufarbige Backlight-Display ist seit Mai 2020 bei CONRAD ausverkauft.&lt;br /&gt;
&lt;br /&gt;
Diese Displays können mit 4 M3-Abstandbolzen 25 mm ([http://www.conrad.de/ce/de/product/526665/Abstandsbolzen1-x-Aussengewinde1-x-InnengewindeMessing-vernickelt-Schluesselweite-55-mm Bestell-Nr. 526665]) und 4 Muttern M3 ([http://www.conrad.de/ce/de/product/815624/TOOLCRAFT-Sechskant-Muttern-DIN-934-934-Stahl-verzinkt-M3-100-St z.B. aus 815624]), sowie 4 Schrauben M3 ([http://www.conrad.de/ce/de/product/815322/TOOLCRAFT-Linsenkopfschrauben-mit-Kreuzschlitz-DIN-7985-7985-6-mm-Stahl-verzinkt-Guete-48-M3-100-St z.B. aus 815322]) auf der M32, der CCPRO M128 oder der M256 WiFi befestigt werden. Leider sind die Befestigungslöcher der Displays zu klein für ein M3-Gewinde, so dass man die Löcher sehr vorsichtig auf 3..3,2 mm erweitern muss.&lt;br /&gt;
&lt;br /&gt;
===IR-Ball===&lt;br /&gt;
Den IR-Ball (AREXX IRB-35, AUSVERKAUFT!) kann man benutzen, um mit dem RP6 Fußball oder Ähnliches zu spielen. Der Ball kann dann von den IR-Sensoren des RP6 erkannt und geortet werden.&lt;br /&gt;
&lt;br /&gt;
===Graustufen-Boden-Sensor===&lt;br /&gt;
Der Graustufen-Boden-Sensor (AREXX ARX-GS7) dient zur Orientierung eines Roboters auf einem Fußballfeld, das in bestimmten Grauabstufungen eingefärbt ist (CONRAD 191404  AUSVERKAUFT!). Dieser Fußballfeld-Aufkleber (AREXX ARX-FF008) ist auch bei [http://www.elv.de ELV] (Artikel-Nummer 68-101831) ausverkauft.&lt;br /&gt;
&lt;br /&gt;
===IR-Fernbedienung===&lt;br /&gt;
[[Bild:RP6_RC.jpg|thumb|2 RC5 Fernbedienungen]]&lt;br /&gt;
Mit einer Universal-IR-Fernbedienung, die den RC5-IR-Code senden kann, kann der RP6 wie ein ferngesteuertes &amp;quot;Auto&amp;quot; verwendet werden. Im Beispielprogramm &amp;quot;Example_08_TV_REMOTE&amp;quot; im Ordner der RP6-Base-Demos wird das noch genauer erläutert.&lt;br /&gt;
&lt;br /&gt;
===Ersatzräder===&lt;br /&gt;
Die Ersatzräder dienen als Ersatzteile für den RP6, RP6v2 und das RP5/RP6-Fahrgestell.&lt;br /&gt;
&lt;br /&gt;
===Ersatzzahnräder===&lt;br /&gt;
Die Ersatzzahnräder dienen als Ersatzteile für den RP6, RP6v2 und das RP5/RP6-Fahrgestell.&lt;br /&gt;
&lt;br /&gt;
===Ersatzraupen===&lt;br /&gt;
Die Ersatzraupen dienen als Ersatzteile für den RP6, RP6v2 und das RP5/RP6-Fahrgestell.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Programmierung==&lt;br /&gt;
Um diesen Grundlagenartikel zum RP6 nicht immer länger werden zu lassen, habe ich den Teil zur Programmierung des [[RP6_-_Programmierung#RP6_Base_und_CONTROL_M32|RP6]] und seiner Erweiterungsplatinen [[RP6_-_Programmierung#RP6_Base_und_CONTROL_M32|RP6 CONTROL M32]] und [[RP6_-_Programmierung#RP6_CCPRO_M128|RP6 CCPRO M128]] ausgelagert: [[RP6 - Programmierung]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==RP6v2==&lt;br /&gt;
Der neue [http://www.conrad.de/ce/de/product/191584/RP6-V2-ROBOTERSYSTEM RP6v2] ist weitgehend identisch mit dem RP6, so dass fast alle Angaben dieses Artikels auch für den RP6v2 zutreffen.&lt;br /&gt;
Für vom RP6 abweichende Details des RP6v2 und für dessen zukünftige Erweiterungsplatinen (z.B. das aktuell [http://www.arexx.com/forum/viewtopic.php?f=19&amp;amp;t=1797 hier] angekündigte Erweiterung-Modul [[RP6v2#RP6v2_M256_WiFi_Platine|RP6v2 M256 WiFi]]) gibt es einen eigenen Grundlagenartikel: [[RP6v2]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==RP6 Sensor Board und Xtra Module==&lt;br /&gt;
Einen eigenen Artikel gibt es auch für das [[RP6_Sensor_Board_und_Xtra_Module#RP6_Sensor_Board_2|RP6 Sensor Board]] und für die [[RP6_Sensor_Board_und_Xtra_Module#RP6_Xtra_Module_2|Xtra Module]]: [[RP6_Sensor_Board_und_Xtra_Module|RP6 Sensor Board und Xtra Module]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Erfahrungsberichte==&lt;br /&gt;
&lt;br /&gt;
...in Arbeit...(kann aber gerne ergänzt werden)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Siehe auch==&lt;br /&gt;
* [[RP6 - Programmierung]]&lt;br /&gt;
* [[RP6v2]]&lt;br /&gt;
* [[RP6_Sensor_Board_und_Xtra_Module]]&lt;br /&gt;
* [[RP6_Kamera_-_Mitmach-Projekt]]&lt;br /&gt;
* [[RP6v2_I2C-Portexpander]]&lt;br /&gt;
* [[RP6v2 USB-RS232-Adapter]]&lt;br /&gt;
* [[RP6v2 Orientierung]]&lt;br /&gt;
* [[RP6 Multi IO Projekt]]&lt;br /&gt;
* [[RP6 Multi IO Projekt - Software]]&lt;br /&gt;
* [[RP6 ArduIO]]&lt;br /&gt;
* [[RP6 ArduIO - Software]]&lt;br /&gt;
* [[Induktive_Ladestation_f%C3%BCr_den_RP6|Induktive Ladestation für den RP6]]&lt;br /&gt;
* [[IR-bake_f%C3%BCr_den_RP6|IR-bake für den RP6]]&lt;br /&gt;
* [[CCRP5]]&lt;br /&gt;
* [[Wild Thumper]]&lt;br /&gt;
* [[Wild Thumper - Programmierung]]&lt;br /&gt;
* [[Yeti]]&lt;br /&gt;
* [[Asuro]]&lt;br /&gt;
* [[C't-Bot]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Weblinks==&lt;br /&gt;
'''Siehe auch die Weblinks im [http://www.rn-wissen.de/index.php/RP6v2#Weblinks RP6v2 Artikel]!'''&lt;br /&gt;
&lt;br /&gt;
* [http://www.pcwelt.de/start/gaming_fun/gadgets/news/84558/ PC-Welt-Artikel]&lt;br /&gt;
&lt;br /&gt;
* Ankündigung des RP6 und der RP6 CONTROL M32 im [http://www.arexx.com/forum/viewtopic.php?t=370 AREXX Support Forum]&lt;br /&gt;
* Ankündigung der RP6 CCPRO M128 im [http://www.arexx.com/forum/viewtopic.php?f=19&amp;amp;t=834&amp;amp;start=0 AREXX Support Forum] und im [http://www.roboternetz.de/community/threads/42228-RP6-C-Control-PRO-MEGA128-Erweiterungsmodul-Website-online RoboterNETZ]&lt;br /&gt;
* Ankündigung des RP6v2 im [http://www.roboternetz.de/community/threads/56964-NEWS-RP6v2-die-neue-Version-2-des-RP6-Robot-Systems RoboterNETZ] und im [http://www.arexx.com/forum/viewtopic.php?f=19&amp;amp;t=1778 AREXX Support Forum]&lt;br /&gt;
* Ankündigung der RP6v2 M256 WiFi im [http://www.arexx.com/forum/viewtopic.php?f=19&amp;amp;t=1797 AREXX Support Forum]&lt;br /&gt;
* [http://www.arexx.com/rp6 AREXX RP6 Startseite]&lt;br /&gt;
* [http://www.arexx.com/forum/viewforum.php?f=19 AREXX Support Forum]&lt;br /&gt;
* [http://www.arexx.com/rp6/html/de/soft_doc_ccpro.htm AREXX CCPRO M128 Seite]&lt;br /&gt;
&lt;br /&gt;
* [http://www.conrad.de/ce/de/product/191524/RP6-ROBOTERSYSTEM RP6 bei CONRAD]&lt;br /&gt;
* [http://www.conrad.de/ce/de/product/191584/RP6-V2-ROBOTERSYSTEM RP6v2 bei CONRAD]&lt;br /&gt;
* [http://www.conrad.de/ce/de/product/191550/RP6-MEGA32-ERWEITERUNGSSATZ RP6 CONTROL M32 bei CONRAD]&lt;br /&gt;
* [http://www.conrad.de/ce/de/product/191563/RP6-CC-PRO-MEGA128-ERWEITERUNGSSATZ RP6 CCPRO M128 bei CONRAD]&lt;br /&gt;
* [http://www.c-control.de/c-control-pro/c-control-pro/startseite_c-control-pro.html C-Control PRO Startseite]&lt;br /&gt;
* [http://ccpro.cc2net.de/forum/ C-Control PRO Forum]&lt;br /&gt;
&lt;br /&gt;
* [http://www.roboternetz.de/phpBB2/viewforum.php?f=49 Roboternetz RP6 Forum]&lt;br /&gt;
* &amp;quot;Geburt&amp;quot; des Wiki im RN-Forum: [http://www.roboternetz.de/community/threads/32793-RP6-Wiki-Artikel RP6-Wiki-Artikel]&lt;br /&gt;
* Henkessoft: [http://www.henkessoft.de/Roboter/rp6.htm RP6]&lt;br /&gt;
* PIC-PROJEKTE Wiki: [http://pic-projekte.de/wiki/index.php?title=RP6  RP6]&lt;br /&gt;
* benhup.com: [http://www.benhup.com/?mf=eduntech&amp;amp;sf=rp6 Arexx RP6 Robot (with ATmega32 chip)]&lt;br /&gt;
* RP6 &amp;quot;Panzer&amp;quot;: [http://www.roboternetz.de/community/threads/57171-mein-(Heng-Long)-RP6 Heng-Long-RP6]&lt;br /&gt;
&lt;br /&gt;
* [http://www.youtube.com/results?search_query=rp6 RP6 Videos]&lt;br /&gt;
* [http://de-de.facebook.com/pages/Robby-RP6/155118711202285 facebook]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Robotikeinstieg]]	 &lt;br /&gt;
[[Kategorie:Praxis]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Autoren==&lt;br /&gt;
--[http://www.roboternetz.de/community/members/24729-sloti sloti] 22:23, 29. Dez 2007 (CET)&lt;br /&gt;
&lt;br /&gt;
--[http://www.roboternetz.de/community/members/44891-Tobias1 Tobias1] 18:30, 6. Apr 2010 (CET)&lt;br /&gt;
&lt;br /&gt;
--[http://www.roboternetz.de/community/members/1972-Dirk Dirk] 15:51, 31. Mär 2022 (CET)&lt;/div&gt;</summary>
		<author><name>Dirk NO2</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=RP6&amp;diff=28591</id>
		<title>RP6</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=RP6&amp;diff=28591"/>
				<updated>2022-03-31T13:49:42Z</updated>
		
		<summary type="html">&lt;p&gt;Dirk NO2: /* Technische Daten */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Bild:RP6_2.jpg|RP6 Base Roboter|right|500px]]&lt;br /&gt;
==Was bisher geschah==&lt;br /&gt;
Fre, 08. Jun 2007 - Ankündigung des RP6 und der RP6 CONTROL M32&amp;lt;br/&amp;gt;&lt;br /&gt;
Mon, 02. Jul 2007 23:00 - Benachrichtigung der Tester&amp;lt;br/&amp;gt;&lt;br /&gt;
Die, 03. Jul 2007 15:00 - Bereitstellung der Dokumentation&amp;lt;br/&amp;gt;&lt;br /&gt;
Don, 05. Jul 2007 14:30 - Bereitstellung der Schaltungsunterlagen&amp;lt;br/&amp;gt;&lt;br /&gt;
Son, 08. Jul 2007 16:00 - Nachricht über den Versand der RP6&amp;lt;br/&amp;gt;&lt;br /&gt;
Mon, 09. Jul 2007 00:15 - Bereitstellung der Library und der Beispielprogramme&amp;lt;br/&amp;gt;&lt;br /&gt;
Die, 10. Jul 2007 - Eintreffen der RP6 bei den Testern&amp;lt;br/&amp;gt;&lt;br /&gt;
Mon, 16. Jul 2007 - Auslieferungsbeginn des RP6&amp;lt;br/&amp;gt;&lt;br /&gt;
Fre, 24. Apr 2009 - Ankündigung der RP6 CCPRO M128 (Auslieferung schon ab Mitte April 2009)&amp;lt;br/&amp;gt;&lt;br /&gt;
Mon, 27. Feb 2012 - Ankündigung des RP6v2&amp;lt;br/&amp;gt;&lt;br /&gt;
Don, 08. Mär 2012 - Auslieferungsbeginn des RP6v2&amp;lt;br/&amp;gt;&lt;br /&gt;
Sam, 17. Mär 2012 - Ankündigung der RP6v2 M256 WiFi&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Siehe auch &amp;quot;Was bisher geschah&amp;quot; im [http://www.rn-wissen.de/index.php/RP6v2#Was_bisher_geschah RP6v2 Artikel]!'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Allgemein==  &lt;br /&gt;
[[Bild:DSC03448.JPG|thumb|RP6 mit Erweiterungsboard]] [[Bild:RP6_Lieferumfang.jpg|thumb|RP6 im Lieferumfang]]&lt;br /&gt;
Der von Arexx entwickelte RP6 ([http://www.conrad.de/ce/de/product/191524/C-Control-Robot-System-RP6-Robotersystem 191524]) ist ein autonomes Raupenfahrzeug, das nicht nur für Schüler und Studenten zum Einstieg in das Gebiet Robotik sondern auch für Fortgeschrittene Elektroniker und Bastler sehr gut geeignet ist, da das System für selbstentworfene Erweiterungen ausgelegt ist. Der RP6 wird von einem, unter Roboterentwicklern beliebten, AVR Microcontroller von Atmel gesteuert und hat Lichtsensoren in Form von zwei LDRs, 2 Bumper an der Stoßstange, 6 Status LEDs, Sensoren zur Überwachung der Akkuspannung, Drehgeber mit 625 CPR, ein Infrarot Sensor zur Hinderniserkennung und Kommunikation und Motorstromsensoren zur Verfügung. Zudem liegt dem Roboter eine umfangreiche Anleitung, inklusive einem kleinen C-Crashkurs, ein USB-Interface zum Anschluss an den PC und ein USB Kabel bei.&lt;br /&gt;
&lt;br /&gt;
In diesem Artikel geht es um die Grundlagen des RP6. Zur Programmierung des RP6 gibt es eine eigene Seite: [[RP6 - Programmierung]]&lt;br /&gt;
&lt;br /&gt;
==Technische Daten==&lt;br /&gt;
{|  {{Blauetabelle}} &lt;br /&gt;
|'''Mikrocontroller:'''&lt;br /&gt;
|AVR [[ATmega32]]&lt;br /&gt;
|-&lt;br /&gt;
|'''Speicher:'''&lt;br /&gt;
|32 kB [[Flash]]-Speicher, davon 1 kB bereits vom Bootloader belegt&amp;lt;br/&amp;gt;&lt;br /&gt;
2 kB RAM&amp;lt;br/&amp;gt; &lt;br /&gt;
1 kB [[EEPROM]]&lt;br /&gt;
|-&lt;br /&gt;
|'''Programmierung:'''&lt;br /&gt;
|Über AVR-[[Bootloader]], belegt ca. 1 kB des Flash-Speichers&lt;br /&gt;
|-&lt;br /&gt;
|'''Vorhandene Sensoren:'''&lt;br /&gt;
|2 [[Sensorarten#Helligkeit|Lichtsensoren (LDR)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
1 [[Sensorarten#Helligkeit|Infrarot (ACS - Anti Collision System)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
2 [[Sensorarten#Bumpers|Bumper]] &amp;lt;br/&amp;gt; &lt;br /&gt;
2 [[Sensorarten#Incremental-Geber|Drehgeber (Encoder)]]&lt;br /&gt;
|-&lt;br /&gt;
|'''Vorhandene Aktoren:'''&lt;br /&gt;
|2 Motoren&amp;lt;br/&amp;gt;&lt;br /&gt;
6 Status-LEDs&amp;lt;br/&amp;gt;&lt;br /&gt;
1 IR-Sender&amp;lt;br/&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|'''Abmessungen:'''&lt;br /&gt;
|(L &amp;amp;times; B &amp;amp;times; H) 172 &amp;amp;times; 128 &amp;amp;times; 50 mm&lt;br /&gt;
|-&lt;br /&gt;
|'''Ausführung:'''&lt;br /&gt;
|Fertig aufgebauter Roboter&lt;br /&gt;
|-&lt;br /&gt;
|'''Stromversorgung:'''&lt;br /&gt;
|6 AA NiMH Akkus&lt;br /&gt;
|-&lt;br /&gt;
|'''Hersteller:'''&lt;br /&gt;
|Arexx Niederlande&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Mechanik==&lt;br /&gt;
===Beschreibung===&lt;br /&gt;
&lt;br /&gt;
===Sensoren===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Encoder====&lt;br /&gt;
&lt;br /&gt;
Die Drehgeber sind an den Getrieben der Motoren zur Drehzahlmessung angebracht. Es handelt sich dabei um Reflexlichtschranken, die auf Codierscheiben mit je 18 weissen und 18 schwarzen Segmenten ausgerichtet sind, also insgesamt 36 Segmente. Diese Codierscheiben sind wiederum an je eines der Zahnräder der beiden Getriebe geklebt worden. Wenn es sich dreht, wandern die einzelnen Segmente an der Reflexlichtschranke vorbei. Die weissen Segmente reflektieren das Infrarotlicht, die schwarzen Segmente nur wenig. Jedes der zwei mittleren Stufenzahnräder des Getriebes hat 50 Zähne auf dem großen, und 12 auf dem kleineren Zahnrad. Die Codierscheiben befinden sich auf dem Zahnrad neben dem Motor, also rechnet man:&lt;br /&gt;
50/12 * 50/12 =17.13/36; 17.13/36 * 36=625&lt;br /&gt;
Daher haben die Encoderscheiben auch Ihre 36 Segmente, denn das gibt eine schöne runde Zahl ohne gebrochenen Anteil. Die Drehgeber erzeugen also 625 Flanken pro Radumdrehung wobei jede Flanke einem Segment entspricht. Bei einem Raddurchmesser von ca. 50mm inkl. Raupenkette, ergibt sich rein rechnerisch ein Radumfang von ca. 157mm was 0.2512mm pro Zählschritt der Drehgeber entspricht. Da sich die Raupenketten aber fast immer etwas in den Untergrund eindrücken (bzw. auch selbst eingedrückt werden) kann man aber von 0.25mm pro Zählschritt ausgehen – meist ist es sogar etwas weniger, z.B. nur 0.24 oder 0.23mm. Das muss man durch abfahren von Teststrecken ermitteln, wie es im Anhang grob beschrieben ist. Sehr genau ist das allerdings durch Radschlupf (bzw. hier müssten wir eigentlich von „Kettenschlupf“ sprechen) und ähnlichen Dingen nicht - vor allem beim Rotieren auf der Stelle. Beim normalen Geradeausfahren ist dieser Fehler klein, aber beim Rotieren kann er schnell sehr große Werte annehmen! Abweichungen muss man evtl. durch weitere Tests ermitteln und mit einkalkulieren. Das ist bei Raupenantrieben leider so – auch bei viel teureren und hochwertigeren Robotern. Dafür hat man aber den Vorteil, dass der Roboter mit Raupenantrieb recht geländegängig ist im Vergleich zu Robotern mit normalem Differentialantrieb mit zwei Antriebsrädern und Stützrad. Kleinere Hindernisse und Rampen kann er meist problemlos überwinden.&lt;br /&gt;
Dabei sind die Encoder sehr nützlich, denn man kann die Geschwindigkeit gut einregeln, egal wie der Untergrund und die Motorbelastung gerade aussieht. Bei gemessenen 50 Segmenten pro Sekunde liegt die Geschwindigkeit bei 1.25 cm/s, sofern wir von 0.25mm pro Zählschritt ausgehen. Etwa 50 Segmente pro Sekunde ist auch die geringste gerade noch regelbare Geschwindigkeit (das variiert aber etwas von Roboter zu Roboter). Bei 1200 Segmenten pro Sekunde wären es die maximal möglichen 30 cm/s (bei 0.25mm Auflösung, bei 0.23 sind es 27.6 cm/s). Standardmäßig begrenzt die Funktionsbibliothek das aber auf 1000 Flanken pro Sekunde. Die maximale Geschwindigkeit ist vom Ladezustand der Akkus abhängig – daher wären 30cm/s nicht besonders lange haltbar. Außerdem erhöht sich die Lebensdauer der Getriebe und Motoren je langsamer man fährt! Wenn der Roboter 4000 Segmente gezählt hat, ist er übrigens etwa einen Meter weit gefahren. Aber wie schon gesagt, gilt das natürlich nur für genau 0.25mm Auflösung. Ohne Kalibrierung hat man hier immer mehr oder weniger starke Abweichungen. Wem es nicht auf jeden mm ankommt, braucht nichts zu kalibrieren und kann einfach von 0.25mm oder besser 0.24mm ausgehen!&lt;br /&gt;
&lt;br /&gt;
====Stoßstangensensoren====&lt;br /&gt;
&lt;br /&gt;
Vorn am Roboter sind zwei Mikroschalter mit langem Schalthebel auf einer separaten&lt;br /&gt;
Platine untergebracht, die etwas vor der anderen Sensorplatine liegt. Dadurch werden&lt;br /&gt;
die IR LEDs auf der Sensorplatine geschützt und können nicht so leicht verbiegen&lt;br /&gt;
wenn der Roboter mal gegen ein Hindernis fährt. Die Stoßstange kann man auch abmontieren und z.B. gegen eine Schuss- oder Sammelvorrichtung für Bälle o.ä. ersetzen wenn man möchte.&lt;br /&gt;
&lt;br /&gt;
====Lichtsensoren====&lt;br /&gt;
&lt;br /&gt;
Vorne auf der kleinen Sensorplatine des Roboters sind zwei sog.&lt;br /&gt;
LDRs (=&amp;quot;Light Dependant Resistors&amp;quot; also lichtabhängige Widerstände)&lt;br /&gt;
platziert und nach links bzw. rechts ausgerichtet. Zwischen&lt;br /&gt;
den beiden Sensoren ist noch eine kleine schwarze&lt;br /&gt;
„Trennwand“ damit das Licht aus einer Richtung möglichst nur&lt;br /&gt;
einen der Sensoren erreicht. Sie bilden zusammen mit je einem&lt;br /&gt;
normalen Widerstand wie beim Batteriesensor einen Spannungsteiler – hier allerdings&lt;br /&gt;
um das Umgebungslicht zu messen.&lt;br /&gt;
&lt;br /&gt;
====Anti Collision System====&lt;br /&gt;
&lt;br /&gt;
Der aus Softwaresicht komplexeste Sensor des RP6 ist das ACS - das&lt;br /&gt;
„Anti Collision System“ (engl. für Anti Kollisions System)! Es besteht&lt;br /&gt;
aus einem IR Empfänger (s. Abb.) und zwei vorne auf der Sensorplatine&lt;br /&gt;
links und rechts angebrachten IR LEDs.&lt;br /&gt;
Da es je eine IR LED links und rechts gibt, kann das ACS grob unterscheiden ob sich&lt;br /&gt;
das Objekt links, rechts oder mittig vor dem Roboter befindet.&lt;br /&gt;
Man kann zusätzlich noch die Stromstärke mit der die beiden IR LEDs gepulst werden&lt;br /&gt;
in drei Stufen einstellen. Das ACS funktioniert aber auch in der höchsten Stufe nicht&lt;br /&gt;
mit allen Objekten immer zuverlässig, denn es kommt auf die Beschaffenheit der&lt;br /&gt;
Oberfläche des jeweiligen Objekts an! Ein schwarzes Objekt reflektiert das IR Licht natürlich&lt;br /&gt;
viel schlechter als ein weisses Objekt und ein kantiges und spiegelndes Objekt&lt;br /&gt;
könnte das IR Licht hauptsächlich in eine bestimme Richtung reflektieren. Die Reichweite&lt;br /&gt;
ist also immer vom jeweiligen Objekt abhängig! Das ist eine prinzipielle Schwäche&lt;br /&gt;
von so gut wie allen IR Sensoren (jedenfalls in dieser Preisklasse).&lt;br /&gt;
Trotzdem werden die meisten Hindernisse zuverlässig erkannt und können umfahren&lt;br /&gt;
werden. Falls das mal nicht klappt, gibt es noch die Stoßstange mit den Tastsensoren&lt;br /&gt;
und falls auch die nicht richtig getroffen werden, kann der Roboter noch mit den Motorstromsensoren&lt;br /&gt;
oder den Encodern erkennen, ob die Motoren blockieren (s.u.)!&lt;br /&gt;
Wem das nicht reicht, der könnte zusätzlich z.B. noch Ultraschallsensoren anbringen...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Erweiterungssystem===&lt;br /&gt;
Auf dem Mainboard sind 22 freie 3,2mm Löcher vorhanden (im Chassis weitere 16), auf denen die Erweiterungsmodule symmetrisch vorne und hinten gestapelt werden können. Weil der Stromverbrauch durch mehr Module steigt, ist es sinnvoll nur insgesamt 6-8 Module auf dem Roboter zu stapeln. Auf dem Mainboard selbst sind noch 6 kleine Erweiterungsflächen verfügbar (plus 2 sehr kleine auf der Bumperplatine).&lt;br /&gt;
&lt;br /&gt;
===Antrieb===&lt;br /&gt;
&lt;br /&gt;
Die 7,2 VDC Motoren sind im Chassis eingebaut und werden mithilfe der H-Brücken gesteuert. Die maximale Geschwindigkeit liegt bei 25cm/s, das kann je nach Akkuspannung aber variieren. Ohne Softwarebegrenzung sind sogar 30cm/s möglich, dadurch verringert sich aber die Lebensdauer der Motoren. Die maximale Steigung, die der RP6 bewältigen kann, ist 30%, ohne Bumperplatine 40%, das hängt aber auch vom Untergrund ab. Kleine Hindernisse wie Bücher und Stifte kann der RP6 problemlos überqueren. Die Achsen der Räder sind in selbstschmierenden Sinterlagern mit 4mm Durchmesser gelagert.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Elektromechanik==&lt;br /&gt;
===Beschreibung===&lt;br /&gt;
===Odometrie===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Elektronik==&lt;br /&gt;
[[Bild:RP6 Block.jpg|thumb|Blockdiagramm]]&lt;br /&gt;
===Beschreibung===&lt;br /&gt;
&lt;br /&gt;
===Sensoren (SENSORS)===&lt;br /&gt;
&lt;br /&gt;
Die meisten Sensoren über die der Roboter verfügt, haben wir ja schon in anderen Abschnitten kurz genannt, wollen diese nun aber etwas detaillierter betrachten.&lt;br /&gt;
In dem Blockdiagramm sind einige der Sensoren nicht in dem blauen Bereich &amp;quot;Sensors&amp;quot; zu sehen, weil sie besser in andere Bereiche passen. Trotzdem zählen natürlich auch die Drehgeber (= “Encoder“), Motorstromsensoren und der Batteriespannungssensor zu den Sensoren und werden darum in diesem Abschnitt beschrieben!&lt;br /&gt;
&lt;br /&gt;
====Batteriespannungs-Sensor (Voltage Sensor)====&lt;br /&gt;
&lt;br /&gt;
Dieser &amp;quot;Sensor&amp;quot; ist eigentlich nur ein einfacher Spannungsteiler aus zwei Widerständen. Wir gehen davon aus, dass die Batterien insgesamt maximal 10V liefern können. 6 NiMH Akkus werden immer unterhalb davon bleiben. Die Referenzspannung des ADC, also die Spannung mit der er die gemessene Spannung vergleicht, beträgt 5V. Da auch die Betriebsspannung 5V beträgt, darf diese nicht überschritten werden. Also müssen wir die zu messende Spannung um die Hälfte herabsetzen! Dies geschieht über einen Spannungsteiler aus zwei Widerständen, der die Spannung an den Messbereich des ADCs anpasst. Der ADC löst mit 10 Bit auf (Wertebereich 0 bis 1023), was eine Auflösung von 10V/1024=9.765625mV ergibt. Ein Messwert von 512 entspricht hier also 5V und 1023 wären ungefähr 10V! Diese Grenzwerte sollten aber normalerweise nie erreicht werden! Das ist nicht besonders genau, da die Widerstände keineswegs Präzisionswiderstände sind. Abweichungen von einigen Prozent nach oben und unten sind möglich. Auch die Referenzspannung von 5V ist nicht ganz genau und kann bei normaler Belastung etwas variieren. Das stört hier nicht, denn wir brauchen ohnehin nur einen ungefähren Wert um festzustellen ob die Batterien sich langsam dem Ende nähern. Wer die Spannung genau messen will, braucht ein Multimeter um den Messfehler zu ermitteln und diesen dann in Software auszugleichen. Wenn man mit Fehlern leben kann, kann man die Spannung dank des günstigen Umrechnungsverhältnisses sogar direkt aus den ADC Werten ungefähr abschätzen: 720 entsprechen dann grob 7.2V, 700 etwa 7V und 650 wären etwa 6.5V. Bei einem konstanten Wert unter 560 kann man davon ausgehen, dass die Akkus fast leer sind.&lt;br /&gt;
&lt;br /&gt;
====Motorstrom====&lt;br /&gt;
[[Bild:RP6_MSS.jpg|thumb]]&lt;br /&gt;
Es befinden sich zwei Leistungswiderstände in den beiden Motorstromkreisen. Aus dem Ohm'schen Gesetz U=RxI folgt, dass sich die Spannung die an einem bestimmten Widerstand abfällt, proportional zum Strom verhält, der diesen durchfließt!&lt;br /&gt;
Damit die Spannungsabfälle an den Widerständen nicht zu groß werden, müssen die Widerstände klein gewählt werden. In unserem Fall haben Sie einen Wert von 0.1 Ohm&lt;br /&gt;
Die abfallende Spannung ist also nur sehr klein (0.1V bei einem Strom von 1A) und muss verstärkt werden bevor sie mit dem ADC gemessen werden kann. Das erledigt jeweils ein sog. Operationsverstärker (OPV). In der Schaltung des RP6 wird je Motorkanal ein OPV verwendet. Der Messbereich geht etwa bis 1.8A. Bei 1.8A fallen etwa 0.18V am Widerstand ab und es ergibt sich am Ausgang des OPV eine Spannung von etwa 4V. Mehr kann der verwendete OPV bei 5V Betriebsspannung nicht ausgeben:&lt;br /&gt;
&lt;br /&gt;
I = U / ((1 + (100k / 4,7k)) * 0,1)&lt;br /&gt;
&lt;br /&gt;
Die Leistungswiderstände haben eine Toleranz von 10%, die Widerstände am OPV 5%, also ist das alles nur sehr ungenau (Ungenauigkeiten im Bereich von etwa 270mA sind möglich wenn man die Sensoren nicht kalibriert!). Wir brauchen allerdings auch nur den ungefähren Wert um festzustellen ob die Motoren stark oder wenig belastet werden. So kann der Roboter gut blockierte oder gar defekte Motoren bzw. Drehgeber erkennen! Die DC-Motoren benötigen mehr Strom je stärker sie belastet werden (Drehmoment) und somit steigt der Strom sehr stark an wenn die Motoren blockiert sind. Das wird von der Robotersoftware zur Notabschaltung verwendet: wenn die Motoren dauerhaft mit hohem Strom betrieben würden, könnten diese sehr heiß werden und dadurch Schaden nehmen! Und wenn die Encoder mal ausfallen sollten – aus welchem Grund auch immer – kann auch das damit erkannt werden. Man würde dann eine Drehzahl von 0 messen. Lässt man die Motoren aber auf voller Kraft laufen und der Strom bleibt trotzdem klein (also sind die Ketten nicht blockiert!), kann man genau daraus schließen, dass entweder die Encoder, oder die Motoren ausgefallen sind (oder Encoder und Motorstromsensoren nicht funktionieren... das passiert z.B. wenn man vergessen hat diese vorher per Software einzuschalten).&lt;br /&gt;
&lt;br /&gt;
====Encoder====&lt;br /&gt;
[[Bild:RP6_ENCODER.jpg|thumb]]&lt;br /&gt;
Ganz anders als die letztgenannten Sensoren funktionieren die Drehgeber, die an den Getrieben der Motoren zur Drehzahlmessung angebracht sind. Es handelt sich dabei um Reflexlichtschranken, die auf Codierscheiben mit je 18 weissen und 18 schwarzen Segmenten ausgerichtet sind, also insgesamt 36 Segmente (s. Abb). Diese Codierscheiben sind wiederum an je eines der Zahnräder der beiden Getriebe geklebt worden. Wenn es sich dreht, wandern die einzelnen Segmente an der Reflexlichtschranke vorbei. Die weissen Segmente reflektieren das Infrarotlicht, die schwarzen Segmente nur wenig. Die Drehgeber erzeugen so zwar auch wie die anderen Sensoren ein analoges Signal, aber es wird digital interpretiert. Zunächst wird das Signal verstärkt und anschließend über einen sog. Schmitt Trigger in ein Rechtecksignal umgewandelt. Die Flanken dieses Signals, also die Wechsel von 5 auf 0V und umgekehrt, lösen jeweils ein Interrupt Ereignis aus und diese werden dann von der Software gezählt. So kann die zurückgelegte Wegstrecke gemessen und zusammen mit einem Timer zur Zeitmessung die Drehzahl und damit auch die Geschwindigkeit ermittelt werden. Die Ermittlung der Drehzahl ist auch Hauptanwendung der Encoder – nur mit den Encodern kann man die Drehzahl auf den gewünschten Sollwert einregeln. Ohne Regelung wäre die Drehzahl nämlich von der Akkuspannung, Belastung der Motoren usw. abhängig. Die hohe Auflösung ermöglicht es dabei, auch niedrige Geschwindigkeiten noch relativ genau einzuregeln. Jedes der zwei mittleren Stufenzahnräder des Getriebes hat 50 Zähne auf dem großen, und 12 auf dem kleineren Zahnrad (s. Abb). Die Codierscheiben befinden sich auf dem Zahnrad neben dem Motor, also rechnet man:&lt;br /&gt;
&lt;br /&gt;
50/12 * 50/12 =17.13/36; 17.13/36 * 36=625&lt;br /&gt;
&lt;br /&gt;
Daher haben die Encoderscheiben auch Ihre 36 Segmente, denn das gibt eine schöne runde Zahl ohne gebrochenen Anteil. Die Drehgeber erzeugen also 625 Flanken pro Radumdrehung wobei jede Flanke einem Segment entspricht. Bei einem Raddurchmesser von ca. 50mm inkl. Raupenkette, ergibt sich rein rechnerisch ein Radumfang von ca. 157mm was 0.2512mm pro Zählschritt der Drehgeber entspricht. Da sich die Raupenketten aber fast immer etwas in den Untergrund eindrücken (bzw. auch selbst eingedrückt werden) kann man aber von 0.25mm pro Zählschritt ausgehen – meist ist es sogar etwas weniger, z.B. nur 0.24 oder 0.23mm. Das muss man durch abfahren von Teststrecken ermitteln, wie es im Anhang grob beschrieben ist. Sehr genau ist das allerdings durch Radschlupf (bzw. hier müssten wir eigentlich von „Kettenschlupf“ sprechen) und ähnlichen Dingen nicht - vor allem beim Rotieren auf der Stelle. Beim normalen Geradeausfahren ist dieser Fehler klein, aber beim Rotieren kann er schnell sehr große Werte annehmen! Abweichungen muss man evtl. durch weitere Tests ermitteln und mit einkalkulieren. Das ist bei Raupenantrieben leider so – auch bei viel teureren und hochwertigeren Robotern. Dafür hat man aber den Vorteil, dass der Roboter mit Raupenantrieb recht geländegängig ist im Vergleich zu Robotern mit normalem Differentialantrieb mit zwei Antriebsrädern und Stützrad. Kleinere Hindernisse und Rampen kann er meist problemlos überwinden.&lt;br /&gt;
Dabei sind die Encoder sehr nützlich, denn man kann die Geschwindigkeit gut einregeln, egal wie der Untergrund und die Motorbelastung gerade aussieht. Bei gemessenen 50 Segmenten pro Sekunde liegt die Geschwindigkeit bei 1.25 cm/s, sofern wir von 0.25mm pro Zählschritt ausgehen. Etwa 50 Segmente pro Sekunde ist auch die geringste gerade noch regelbare Geschwindigkeit (das variiert aber etwas von Roboter zu Roboter). Bei 1200 Segmenten pro Sekunde wären es die maximal möglichen 30 cm/s (bei 0.25mm Auflösung, bei 0.23 sind es 27.6 cm/s). Standardmäßig begrenzt die Funktionsbibliothek das aber auf 1000 Flanken pro Sekunde. Die maximale Geschwindigkeit ist vom Ladezustand der Akkus abhängig – daher wären 30cm/s nicht besonders lange haltbar. Außerdem erhöht sich die Lebensdauer der Getriebe und Motoren je langsamer man fährt!&lt;br /&gt;
&lt;br /&gt;
=====Encoder justieren=====&lt;br /&gt;
Damit der RP6 die Signale der Drehgeber richtig auswerten kann, muss man evtl. die Drehgeber einmalig justieren. Dies kann auch schon bei einem neu gekauften RP6 notwendig sein.&lt;br /&gt;
Eine genaue Anleitung dazu findet man [http://www.arexx.com/rp6/downloads/RP6_ENCODER_DE_20071219.zip hier]. Es gibt auch ein [http://www.arexx.com/rp6/downloads/rp6_encoder_video.zip Video], das die Drehgeber-Justierung zeigt.&lt;br /&gt;
&lt;br /&gt;
=====Encoder kalibrieren=====&lt;br /&gt;
Wenn der Roboter 4000 Segmente gezählt hat, ist er etwa einen Meter weit gefahren. Aber wie schon gesagt, gilt das natürlich nur für genau 0.25mm Auflösung. Ohne Kalibrierung hat man hier immer mehr oder weniger starke Abweichungen. Wem es nicht auf jeden mm ankommt, braucht nichts zu kalibrieren und kann einfach von 0.25mm oder besser 0.24mm ausgehen!&lt;br /&gt;
Optimal ist es, wenn man sich für Weg- und Winkelmessungen nicht auf die Encoder Daten stützen muss, sondern externe Systeme wie Infrarotbaken oder einen genauen elektronischen Kompass dazu zur Verfügung hat.&lt;br /&gt;
&lt;br /&gt;
Will man die Drehgeber des RP6 dennoch kalibrieren, kann man ihn z.B. mit diesem Testprogramm:&lt;br /&gt;
&amp;lt;pre&amp;gt;#include &amp;quot;RP6RobotBaseLib.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
	initRobotBase();&lt;br /&gt;
	powerON();&lt;br /&gt;
&lt;br /&gt;
	// Test: Go ahead 1m and stop!&lt;br /&gt;
	move (80, FWD, DIST_MM(1000), true);&lt;br /&gt;
	writeString_P(&amp;quot;LEFT RIGHT&amp;quot;);&lt;br /&gt;
 	writeString_P(&amp;quot;\n&amp;quot;);&lt;br /&gt;
 	writeInteger(mleft_dist, DEC);&lt;br /&gt;
	writeChar(' ');&lt;br /&gt;
 	writeInteger(mright_dist, DEC);&lt;br /&gt;
	writeString_P(&amp;quot;\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
	powerOFF();&lt;br /&gt;
&lt;br /&gt;
	return 0;&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
... 1m weit fahren lassen und dann messen, wie weit er tatsächlich gefahren ist. Das Programm gibt auf dem Terminal den Stand der Drehgeber aus. Teilt man dann die gemessene Fahrstrecke in mm durch den Wert der Drehgeber, erhält man die Auflösung. Diesen Wert kann man dann der Konstanten ENCODER_RESOLUTION in der RP6Config.h zuweisen. Nach &amp;quot;Make Clean&amp;quot;, einer Neukompilierung und erneuter Ausführung des Testprogramms müßte der RP6 jetzt genau 1m weit fahren. Das gilt zumindest für den Untergrund, auf dem die Kalibrierung durchgeführt wurde.&lt;br /&gt;
&lt;br /&gt;
====Stoßstangensensoren (Bumper)====&lt;br /&gt;
&lt;br /&gt;
Vorn am Roboter sind zwei Mikroschalter mit langem Schalthebel auf einer separaten&lt;br /&gt;
Platine untergebracht, die etwas vor der anderen Sensorplatine liegt. Dadurch werden&lt;br /&gt;
die IR LEDs auf der Sensorplatine geschützt und können nicht so leicht verbiegen&lt;br /&gt;
wenn der Roboter mal gegen ein Hindernis fährt. Mit den zwei Schaltern kann der Mikrocontroller&lt;br /&gt;
einen solchen Aufprall registrieren und dann beispielsweise zurücksetzen,&lt;br /&gt;
sich etwas drehen und weiterfahren. Die Schalter sind an zwei der Ports die schon mit&lt;br /&gt;
den LEDs verbunden sind angeschlossen und blockieren so keine anderen Ports des&lt;br /&gt;
Mikrocontrollers. Daher leuchten die LEDs auch immer wenn man einen der Schalter&lt;br /&gt;
drückt! Da dies normalerweise relativ selten passiert, stört das aber nicht weiter.&lt;br /&gt;
Die Stoßstange kann man auch abmontieren und z.B. gegen eine Schuss- oder Sammelvorrichtung&lt;br /&gt;
für Bälle o.ä. ersetzen wenn man möchte.&lt;br /&gt;
&lt;br /&gt;
====Lichtsensoren (LDRs)====&lt;br /&gt;
[[Bild:RP6_Licht.jpg|thumb]]&lt;br /&gt;
Vorne auf der kleinen Sensorplatine des Roboters sind zwei sog.&lt;br /&gt;
LDRs (=&amp;quot;Light Dependant Resistors&amp;quot; also lichtabhängige Widerstände)&lt;br /&gt;
platziert und nach links bzw. rechts ausgerichtet. Zwischen&lt;br /&gt;
den beiden Sensoren ist noch eine kleine schwarze&lt;br /&gt;
„Trennwand“ damit das Licht aus einer Richtung möglichst nur&lt;br /&gt;
einen der Sensoren erreicht. Sie bilden zusammen mit je einem&lt;br /&gt;
normalen Widerstand wie beim Batteriesensor einen Spannungsteiler – hier allerdings&lt;br /&gt;
um das Umgebungslicht zu messen. Die 5V Betriebsspannung wird auch geteilt, aber&lt;br /&gt;
hier ist einer der Widerstände variabel! Es wird also das Teilungsverhältnis je nach Intensität&lt;br /&gt;
des Lichteinfalls verändert und somit eine vom Lichteinfall abhängige Spannung&lt;br /&gt;
an einen der A/D Wandler Kanäle geleitet!&lt;br /&gt;
Über den Spannungsunterschied zwischen den beiden Sensoren kann man ermitteln in&lt;br /&gt;
welcher Richtung sich eine bzw. die hellste Lichtquelle vor dem Roboter befindet:&lt;br /&gt;
Links, Rechts oder in der Mitte. Mit einem entsprechenden Programm, kann man so z.B. eine starke Taschenlampe in&lt;br /&gt;
einem abgedunkelten Zimmer verfolgen, oder den Roboter die hellste Stelle in einem&lt;br /&gt;
Raum suchen lassen! Klappt z.B. sehr gut mit einem stärkeren Hand-Halogenscheinwerfer:&lt;br /&gt;
Wenn man damit auf den Boden leuchtet, kann der Roboter dem Lichtfleck auf&lt;br /&gt;
dem Boden folgen.&lt;br /&gt;
Das geht natürlich auch umgekehrt: Der Roboter könnte z.B. auch versuchen sich vor&lt;br /&gt;
hellem Licht zu verstecken...&lt;br /&gt;
Wenn man noch ein oder zwei LDRs hinten am Roboter anbringen würde, könnte man&lt;br /&gt;
das noch verfeinern und die Richtung in der sich Lichtquellen befinden besser bestimmen.&lt;br /&gt;
Der Roboter kann sonst nämlich oft nur schwer unterscheiden ob die Lichtquelle&lt;br /&gt;
vor oder hinter ihm liegt. Zwei der A/D Wandler Kanäle sind noch frei...&lt;br /&gt;
&lt;br /&gt;
====Anti Collision System (ACS)====&lt;br /&gt;
[[Bild:RP6 ACS.jpg|thumb|Das ACS]]&lt;br /&gt;
Der aus Softwaresicht komplexeste Sensor des RP6 ist das ACS - das „Anti Collision System“ (engl. für Anti Kollisions System)! Es besteht aus einem IR Empfänger (s. Abb.) und zwei vorne auf der Sensorplatine links und rechts angebrachten IR LEDs. Die IR LEDs werden direkt vom Mikrocontroller angesteuert. Die Ansteuerungsroutinen können beliebig verändert und verbessert werden! Beim Vorgängermodell war dafür noch ein eigener Controller nötig, dessen Programm aber nicht vom Anwender geändert werden konnte...&lt;br /&gt;
Mit den IR LEDs werden kurze, mit 36kHz modulierte Infrarot Impulse ausgesandt, auf die der darauf ausgelegte IR Empfänger reagiert. Werden die IR Impulse an einem Gegenstand vor dem Roboter reflektiert und vom IR Empfänger detektiert, kann der Mikrocontroller darauf reagieren und z.B. ein Ausweichmanöver einleiten. Damit das ACS nicht zu empfindlich bzw. auf eventuelle Störungen reagiert, wartet die Software bis eine bestimmte Anzahl von Impulsen in einer bestimmten Zeit empfangen worden ist. Es wird auch eine Synchronisation mit dem RC5 Empfang durchgeführt und auf die RC5 Signale von TV/Hifi Fernbedienungen wird so nicht reagiert. Bei anderen Codes kann das aber nicht garantiert werden und das ACS könnte dann Hindernisse erkennen, wo gar keine sind! Da es je eine IR LED links und rechts gibt, kann das ACS grob unterscheiden ob sich das Objekt links, rechts oder mittig vor dem Roboter befindet.&lt;br /&gt;
Man kann zusätzlich noch die Stromstärke mit der die beiden IR LEDs gepulst werden in drei Stufen einstellen. Das ACS funktioniert aber auch in der höchsten Stufe nicht mit allen Objekten immer zuverlässig, denn es kommt auf die Beschaffenheit der Oberfläche des jeweiligen Objekts an! Ein schwarzes Objekt reflektiert das IR Licht natürlich viel schlechter als ein weisses Objekt und ein kantiges und spiegelndes Objekt könnte das IR Licht hauptsächlich in eine bestimme Richtung reflektieren. Die Reichweite ist also immer vom jeweiligen Objekt abhängig! Das ist eine prinzipielle Schwäche von so gut wie allen IR Sensoren (jedenfalls in dieser Preisklasse).&lt;br /&gt;
Trotzdem werden die meisten Hindernisse zuverlässig erkannt und können umfahren werden. Falls das mal nicht klappt, gibt es noch die Stoßstange mit den Tastsensoren und falls auch die nicht richtig getroffen werden, kann der Roboter noch mit den Motorstromsensoren oder den Encodern erkennen, ob die Motoren blockieren (s.u.)!&lt;br /&gt;
Wem das nicht reicht, der könnte zusätzlich z.B. noch Ultraschallsensoren anbringen...&lt;br /&gt;
&lt;br /&gt;
====IR-Kommunikation (IRCOMM)====&lt;br /&gt;
Der RP6 kann über die IR-LEDs links und rechts über der Bumper-Platine Daten zu anderen IR-Empfängern senden.  Es ist z.B. möglich, dass mehrere Roboter ihre Sensorwerte untereinander vergleichen.&lt;br /&gt;
&lt;br /&gt;
====6 Status-LEDs====&lt;br /&gt;
Die Status-LEDs sind vorne links und rechts über den Lichtsensoren auf der Hauptplatine angebracht.&lt;br /&gt;
&lt;br /&gt;
Über die Status-LEDs können Sensorzustände, z.B. des ACS, der Bumper oder der Lichtsensoren, dargestellt werden.&lt;br /&gt;
&lt;br /&gt;
====IR-Sender====&lt;br /&gt;
Über den IR-Sender können Daten zu anderen Geräten übertragen werden.&lt;br /&gt;
&lt;br /&gt;
===Erweiterungssystem (EXPANSION SYSTEM)===&lt;br /&gt;
[[Bild:RP6_EXP.jpg|thumb]]&lt;br /&gt;
Eines der nützlichsten Features des RP6 ist das Erweiterungssystem.&lt;br /&gt;
Man kann den RP6 damit genau so weit ausbauen,&lt;br /&gt;
wie man es benötigt. Aus Kostengründen bietet das&lt;br /&gt;
Basissystem schließlich nur relativ wenig Sensoren. Es sind&lt;br /&gt;
zwar schon mehr als bei vielen anderen Robotern in dieser&lt;br /&gt;
Preisklasse, aber erst mit weiteren Sensoren macht ein Roboter&lt;br /&gt;
so richtig Spaß. Das ACS kann beispielsweise nur grob&lt;br /&gt;
erkennen ob sich ein Hindernis vor dem Roboter befindet.&lt;br /&gt;
Mit Ultraschallsensoren oder besseren zusätzlichen IR Sensoren,&lt;br /&gt;
könnte man aber die Distanz ermitteln und so beispielsweise&lt;br /&gt;
bessere Ausweichmanöver fahren!&lt;br /&gt;
&lt;br /&gt;
Neben Sensoren macht es auch sehr viel Sinn, zusätzliche Controller einzubauen um&lt;br /&gt;
die anfallenden Aufgaben aufteilen zu können. Beispielsweise die RP6 CONTROL M32&lt;br /&gt;
Platine mit einem weiteren MEGA32 Mikrocontroller oder die CCPRO M128.&lt;br /&gt;
&lt;br /&gt;
Das Erweiterungssystem muss natürlich in der Lage sein, viele Erweiterungsmodule&lt;br /&gt;
miteinander zu verbinden, dabei mit wenigen Signalleitungen&lt;br /&gt;
auskommen und eine ausreichend hohe Geschwindigkeit bieten.&lt;br /&gt;
&lt;br /&gt;
Siehe [[I2C]]&lt;br /&gt;
&lt;br /&gt;
===Steuerung (CONTROL SYSTEM)===&lt;br /&gt;
&lt;br /&gt;
====Hauptprozessor (ATMEGA32)====&lt;br /&gt;
[[Bild:RP6_MEGA32.jpg|thumb|Der MEGA32]]&lt;br /&gt;
Der Hauptprozessor ist der ATMEGA32 vom Atmel. Er hat 32KB Flash ROM und 2KB RAM. Der ATMEGA ist mit 8Mhz getaktet, kann also bis zu 8 Millionen Befehle pro Sekunde ausführen. Es sind 32 I/O-Pins  am Controller verfügbar. Die I/O-Pins gehören zu I/O-Ports mit jeweils 8 Pins. Davon gibt es 4: PORTA, PORTB, PORTC und PORTD. Der Controller kann die Ports entweder ein oder ausschalten (Output), oder erkennen, ob Spannung angelegt wurde oder nicht (Input). Es gibt mehrere Module, die verschiedene Aufgaben übernehmen:&lt;br /&gt;
* 3 Timer, einer davon erzeugt die PWM-Signale für die Motoren&lt;br /&gt;
* Die serielle Schnittstelle (UART)&lt;br /&gt;
* Das TWI (Two Wire Interface, also Zweidraht Schnittstelle)&lt;br /&gt;
* Ein ADC (Analog to Digital Converter) mit 8 Eingangskanälen, welche mit 10bit (0-1023) auflösen&lt;br /&gt;
* Drei externe Interrupt Eingänge&lt;br /&gt;
&lt;br /&gt;
Auserdem befindet sich im Microcontroller ein sog. Bootloader, welcher mit dem RP6 Loader kommuniziert und neue Programme in den Speicher lädt.&lt;br /&gt;
&lt;br /&gt;
===Antrieb (DRIVE SYSTEM)===&lt;br /&gt;
[[Bild:RP6_H-Brücke.jpg|thumb|Die H-Brücke]]&lt;br /&gt;
[[Bild:RP6_Tastverhältniss.jpg|thumb]]&lt;br /&gt;
Der Antrieb des RP6 besteht aus zwei Gleichstrom Motoren mit nachgeschaltetem Getriebe,&lt;br /&gt;
über das die beiden Raupenketten angetrieben werden.&lt;br /&gt;
Die Motoren genehmigen sich je nach Belastung&lt;br /&gt;
einen recht hohen Strom und können&lt;br /&gt;
natürlich nicht direkt vom Mikrocontroller&lt;br /&gt;
angesteuert werden. Dazu braucht man&lt;br /&gt;
Leistungstreiber in Form von je einer H-Brücke&lt;br /&gt;
pro Motor. Das grundlegende Prinzip&lt;br /&gt;
ist in der nebenstehenden Abbildung dargestellt.&lt;br /&gt;
Eine H-Brücke besteht aus vier&lt;br /&gt;
&amp;quot;Schaltern&amp;quot;, die in Form eines H's um einen&lt;br /&gt;
Motor angeordnet sind. Nehmen wir mal an,&lt;br /&gt;
zunächst seien alle Schalter aus. Schaltet&lt;br /&gt;
man dann S1 und S4 (Rot) an, liegt eine&lt;br /&gt;
Spannung am Motor an und er dreht sich&lt;br /&gt;
z.B. nach rechts. Schalten wir nun S1 und&lt;br /&gt;
S4 wieder aus und danach S2 und S3 (Grün)&lt;br /&gt;
an, wird die am Motor anliegende Spannung umgepolt und er dreht sich in die entgegen gesetzte&lt;br /&gt;
Richtung, also nach links! Man muss darauf achten, nicht gleichzeitig S1&lt;br /&gt;
und S2, oder S3 und S4 einzuschalten, sonst entstünde ein Kurzschluss und dadurch&lt;br /&gt;
könnten die &amp;quot;Schalter&amp;quot; zerstört werden!&lt;br /&gt;
Natürlich verwenden wir auf dem RP6 keine mechanischen Schalter, sondern sog.&lt;br /&gt;
MOSFETs. Diese schalten beim Anlegen einer genügend hohen Spannung am Eingang&lt;br /&gt;
durch. Die Schaltvorgänge können sehr schnell erfolgen, mehrere Kilohertz sind bei&lt;br /&gt;
unserer Anwendung möglich.&lt;br /&gt;
So kann man also schon mal die Drehrichtung einstellen. Und wie bekommt man den&lt;br /&gt;
Motor nun schneller bzw. langsamer? Ein Elektromotor dreht umso schneller, je höher&lt;br /&gt;
die angelegte Spannung ist. Die Drehzahl kann also über die Spannung eingestellt&lt;br /&gt;
werden - und genau dazu können wir die H-Brücke auch verwenden!&lt;br /&gt;
Die Abbildung verdeutlicht das Prinzip&lt;br /&gt;
nach dem wir vorgehen können.&lt;br /&gt;
Wir erzeugen&lt;br /&gt;
ein Rechtecksignal fester Frequenz,&lt;br /&gt;
bei dem wir das sog. Tastverhältnis&lt;br /&gt;
verändern. Mit &amp;quot;Tastverhältnis&amp;quot; ist das&lt;br /&gt;
Verhältnis von der eingeschalteten zur&lt;br /&gt;
ausgeschalteten Zeit des Signals gemeint.&lt;br /&gt;
Am Motor liegt dann effektiv eine niedrigere,&lt;br /&gt;
mittlere Gleichspannung an, die dem&lt;br /&gt;
Tastverhältnis entspricht. In der Grafik ist&lt;br /&gt;
dies durch eine rote Linie (Ug) und die roten&lt;br /&gt;
Flächen verdeutlicht. Wenn z.B. eine&lt;br /&gt;
Spannung von 7 Volt von den Akkus an&lt;br /&gt;
den Motortreibern anliegt, und diese mit&lt;br /&gt;
einem Tastverhältnis von 50% angesteuert werden, würde die mittlere Spannung in&lt;br /&gt;
etwa bei der Hälfte, also 3.5V liegen! Das stimmt real nicht ganz, aber so kann man&lt;br /&gt;
es sich schon gut und einfach vorstellen.&lt;br /&gt;
Das Antriebssystem ist dank der hohen Untersetzung (~ 1:72) relativ stark und so&lt;br /&gt;
kann der RP6 viel schwerere Lasten tragen als es z.B. der kleine Roboter ASURO&lt;br /&gt;
könnte. Allerdings steigt mit zunehmendem Gewicht natürlich auch der Energiebedarf&lt;br /&gt;
und die Akkus werden schneller leer sein ...&lt;br /&gt;
Im Vergleich mit einem ferngesteuerten Rennwagen o.ä. könnte man denken der RP6&lt;br /&gt;
sei langsam - stimmt auch - das ist jedoch absichtlich so! Der Roboter wird von einem&lt;br /&gt;
Mikrocontroller gesteuert und wenn der Programmierer einen Fehler bei der Programmierung&lt;br /&gt;
gemacht hat, wäre es ungünstig mit 10km/h vor die Wand zu prallen! Bei&lt;br /&gt;
dem eher gemächlichen Tempo des RP6 passiert aber nicht so schnell etwas und nebenbei&lt;br /&gt;
haben die Sensoren mehr Zeit die Umgebung auf Hindernisse zu untersuchen.&lt;br /&gt;
Und da wäre natürlich noch der Vorteil der höheren Belastbarkeit und der viel genaueren&lt;br /&gt;
Geschwindigkeitsregelung!&lt;br /&gt;
&lt;br /&gt;
===Stromversorgung (POWER SUPPLY)===&lt;br /&gt;
[[Bild:RP6_IC1.jpg|thumb]]&lt;br /&gt;
Natürlich benötigt ein Roboter Energie. Diese trägt der RP6 gespeichert in 6 Akkus mit&lt;br /&gt;
sich herum. Die Laufzeit ist durch die Kapazität der Akkus eingeschränkt, denn auch&lt;br /&gt;
wenn die Elektronik verhältnismäßig wenig Energie benötigt, schlucken die Motoren je&lt;br /&gt;
nach Belastung doch ziemlich viel.&lt;br /&gt;
&lt;br /&gt;
Damit die Akkus möglichst lange halten und der Roboter nicht ständig Pause machen&lt;br /&gt;
muss, sollte man ihm daher etwas größere Energiespeicher mit etwa 2500mAh gönnen.&lt;br /&gt;
Kleinere mit 2000mAh oder mehr funktionieren aber auch. Mit guten Akkus kann&lt;br /&gt;
man 3 bis 6 Stunden oder mehr Laufzeit erreichen, abhängig von der Betriebszeit der&lt;br /&gt;
Motoren, deren Belastung und Qualität der Akkus. Die 6 Akkus die notwendig sind,&lt;br /&gt;
haben insgesamt eine Nennspannung von 6x 1.2V = 7.2V. Im Blockdiagramm ist dies&lt;br /&gt;
mit &amp;quot;UB&amp;quot; (= &amp;quot;U-Battery&amp;quot;, U ist der Formelbuchstabe für Spannung) bezeichnet. „Nennspannung&amp;quot;,&lt;br /&gt;
weil sich die Spannung mit der Zeit stark verändert. Voll aufgeladen können&lt;br /&gt;
die Akkus im Leerlauf insgesamt bis zu 8.5V liefern! Diese Spannung sinkt während&lt;br /&gt;
der Entladung ab und schwankt auch je nach Belastung (Motoren an oder aus,&lt;br /&gt;
schnell langsam etc. - wie stark die Spannung schwankt, hängt auch von der Qualität&lt;br /&gt;
der verwendeten Akkus ab. Der Innenwiderstand ist hier die kritische Größe).&lt;br /&gt;
Das ist für Messungen von Sensorwerten und ähnlichem natürlich nicht ohne weiteres&lt;br /&gt;
brauchbar. Noch wichtiger ist jedoch, dass viele der verwendeten Komponenten wie&lt;br /&gt;
z.B. der Mikrocontroller nur auf 5V oder weniger Betriebsspannung ausgelegt sind und&lt;br /&gt;
bei so hohen Spannungen zerstört würden. Die Akku Spannung muss also auf einen&lt;br /&gt;
definierten Wert heruntergeregelt und stabilisiert werden!&lt;br /&gt;
Das übernimmt ein 5V Spannungsregler, der einen Strom von&lt;br /&gt;
maximal 1.5A liefern kann (s. Abb.). Bei 1.5A würde er jedoch&lt;br /&gt;
ziemlich viel Wärme abgeben. Es gibt daher eine große Kühlfläche&lt;br /&gt;
auf der Platine an die der Regler festgeschraubt ist. Über 1A&lt;br /&gt;
sollte der Regler trotz Kühlung besser nur kurzzeitig (also wenige&lt;br /&gt;
Sekunden) belastet werden, wenn man nicht noch einen zusätzlichen&lt;br /&gt;
großen Kühlköper draufschraubt.&lt;br /&gt;
&lt;br /&gt;
Es wird empfohlen, 800mA Dauerlast nicht zu überschreiten! Bei&lt;br /&gt;
so einer Belastung und zusammen mit den Motoren wären die&lt;br /&gt;
Akkus auch recht schnell leer. Im normalen Betrieb ohne ein Erweiterungsboard&lt;br /&gt;
nimmt der Roboter übrigens nicht mehr als 40mA auf (ausser wenn&lt;br /&gt;
das IRCOMM sendet), also überhaupt kein Problem für den Regler und man hat noch&lt;br /&gt;
genug Reserven für die Erweiterungsmodule, die meistens auch nicht mehr als 50mA&lt;br /&gt;
aufnehmen sofern keine Motoren, große LEDs o.ä. daran angeschlossen sind.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Umbau-Optionen==&lt;br /&gt;
Hier soll beschrieben werden, welche Umbau-Optionen es für die RP6 Base gibt. Im Text gibt es Verweise auf den Schaltplan des RP6 (RP6_MAINBOARD.PDF) in der Form: (SP2 B1: Bauteil). Dies bedeutet, dass man das Bauteil auf Blatt 2 des RP6-Schaltplans im Feld B1 finden kann. Beispielhaft sind im folgenden Text Bestell-Nummern der Firma [http://www.conrad.de/ce/ CONRAD] genannt. Natürlich kann man die Teile auch bei anderen Versendern beziehen.&lt;br /&gt;
&lt;br /&gt;
Bei den Materialangaben ist öfter die Rede von &amp;quot;Steckbuchsen mit Litze&amp;quot;. Diese Steckbuchsen mit angelöteter Litze können auf die ein- oder zweireihigen Stiftleisten aufgesteckt werden. Leider gibt es sie nicht (mehr) fertig konfektioniert bei CONRAD. Die einreihigen Steckbuchsen (RM 2,54mm) kann man aber z.B. bei [http://www.elv.de/output/controller.aspx ELV] bekommen: 2-polig (68-016635), 3-polig (68-022503) und 5-polig (68-023073). An sie muss man dann noch Litzen in der entsprechenden Länge selbst anlöten.&lt;br /&gt;
&lt;br /&gt;
===Elko für den IR-Empfänger===&lt;br /&gt;
[[Bild:RP6_C29_TSOP.JPG|thumb|RP6 C29 TSOP]]&lt;br /&gt;
Zur Spannungsstabilisierung kann ein Elko (C29; SP2 E1: C29*) am TSOP 34836 eingelötet werden.&lt;br /&gt;
&lt;br /&gt;
Normalerweise ist dieser Elko nicht erforderlich.&lt;br /&gt;
&lt;br /&gt;
Man braucht dazu:&lt;br /&gt;
* Einen Elektrolyt-Kondensator stehend 10 uF / 16V (C29); RM 2,5mm (445631)&lt;br /&gt;
&lt;br /&gt;
Der Elko kann auch eine geringere Kapazität als 10 uF haben (1 uF bis 4,7 uF reichen auch). Man lötet den Elko auf seinen Platz. Bitte auf die Polung achten: Der Minuspol zeigt nach vorn (in Fahrtrichtung des RP6).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Anschlüsse===&lt;br /&gt;
Hier wird aufgelistet, wo man auf dem RP6 Mainboard Anschlüsse nutzen kann, um sie z.B. zu weiteren Sensoren, zum USRBUS oder (weniger empfehlenswert!) direkt zu EPs oder Erweiterungsplatinen (M32, CCPRO M128) zu führen.&lt;br /&gt;
&lt;br /&gt;
====Analoge Sensoren an ADC0/1====&lt;br /&gt;
[[Bild:RP6_ADC01.JPG|thumb|RP6 ADC0/1]]&lt;br /&gt;
&lt;br /&gt;
Wenn man bis zu zwei analoge Sensoren (z.B. IR-Distanz-Mess-Sensoren Sharp GP2Y0A02YK 185364) direkt an den RP6 anschließen möchte, dann gibt es da zwei 3-polige Kontakte, beschriftet mit VDD/GND/ADCx (x = 0..1). Hier kann man 3-polige Stiftleisten auflöten, an die dann die Sensoren angeschlossen werden.&lt;br /&gt;
&lt;br /&gt;
Man braucht dazu:&lt;br /&gt;
* 1-reihige Stiftleiste RM 2,54mm (z.B. 36-polig 732478)&lt;br /&gt;
* Zwei Keramik-Vielschicht-Kondensatoren 100nF (C27, C28); RM 2,54mm (453099)&lt;br /&gt;
* ENTWEDER einen Elektrolyt-Kondensator stehend 220 uF / 16V (C26); RM 3,5mm (445903)&lt;br /&gt;
* ODER einen Elektrolyt-Kondensator stehend 470 uF / 16V (C26); RM 3,5mm (446211)&lt;br /&gt;
* Zwei 3-polige Steckbuchsen mit Litze zum Anschluß der Sensoren&lt;br /&gt;
&lt;br /&gt;
Man trennt nun von der 1-reihigen Stiftleiste zweimal 3 Kontakte ab und lötet sie auf die weiß umrahmten Kontakte (VDD/GND/ADCx; SP2 B1: ADC0, ADC1), anschließend C27, C28 (SP2 A1: C27*, C28*) auf ihre Plätze und zum Schluß den Elko 220 uF oder 470 uF (C26; SP2 A1: C26*). Der Elko ist nur bei Sensoren mit hohem Strombedarf notwendig, siehe dazu auch Anleitung des RP6, Seite 136! Beim Elko auf die Polung achten: Er muss so sitzen, dass er mit seinem Pluspol in Fahrtrichtung des RP6 (nach vorn) schaut.&lt;br /&gt;
&lt;br /&gt;
Die Sensoren lötet man an die Litzen der 3-poligen Steckbuchsen und steckt diese auf die neuen Kontakte.&lt;br /&gt;
&lt;br /&gt;
Da manche Sensoren einen höheren Stromverbrauch haben, kann man die Stromversorgung an den VDD-Pins der ADC0/1-Stecker abschaltbar machen oder eine separate +5V-Spannung einspeisen. Siehe dazu den Abschnitt &amp;quot;Trennstellen - Getrennte Stromversorgung für ADC0/1&amp;quot; weiter unten!&lt;br /&gt;
&lt;br /&gt;
====ISP (In System Programming)====&lt;br /&gt;
Der ATMEGA32 des RP6 wird standardmäßig über den PROG/UART Stecker programmiert. Dazu befindet sich im Prozessor ein Bootloader-Programm. Wenn man stattdessen oder zusätzlich die ISP-Programmierung mit einem dafür geeigneten ISP-Programmier-Adapter nutzen will, kann man den Adapter an einen (noch einzulötenden) Wannenstecker auf dem RP6 anschließen.&lt;br /&gt;
Vorher sind aber ein paar &amp;quot;Umbauarbeiten&amp;quot; erforderlich.&lt;br /&gt;
&lt;br /&gt;
Man braucht dazu:&lt;br /&gt;
* 1-reihige Stiftleiste RM 2,54mm (z.B. 36-polig 732478)&lt;br /&gt;
* Wannenstecker 2x5-polig gerade RM 2,54mm (z.B. [http://www.reichelt.de./ Reichelt] WSL 10G)&lt;br /&gt;
* Eine SMD-Diode LL 4148 (140902)&lt;br /&gt;
* Eine Codierbrücke (z.B. aus Set 742902)&lt;br /&gt;
&lt;br /&gt;
Zwischen dem XBUS-Stecker und C13 befinden sich 10 Lötpunkte für den ISP-Anschluß, auf die der Wannenstecker gelötet wird, und drei Lötpunkte (beschriftet mit ISP* - BOOTLOAD; SP2 A3: YR1..3), auf die eine 3-polige Stiftleiste gelötet werden muss.&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_ISP.JPG|RP6 ISP]]&lt;br /&gt;
&lt;br /&gt;
Vorher muss eine kurze Leiterbahn zwischen den Lötpunkten BOOTLOAD aufgetrennt werden. Die Leiterbahn befindet sich auf der Lötseite der Platine und muss mit einem scharfen Messer oder einem speziellen Leiterbahn-Unterbrecher zwischen den beiden Lötpunkten unterbrochen werden. Man sollte anschließend mit einem Widerstandsmeßgerät nachmessen: Es sollte keine Verbindung mehr zwischen den Lötpunkten bestehen.&lt;br /&gt;
Man trennt dann von der 1-reihigen Stiftleiste 3 Kontakte ab und lötet sie auf die beschriebenen drei Lötpunkte.&lt;br /&gt;
&lt;br /&gt;
Zum Schluss lötet man noch die Diode LL 4148 (SP2 B3: D11*) auf ihre Lötflächen zwischen R3 und C6. Die Kathode (Strich) der Diode kommt nach vorn (in Fahrtrichtung RP6, bzw. liegt rechts von R3). Wenn man jetzt eine Codierbrücke auf die mit &amp;quot;BOOTLOAD&amp;quot; beschrifteten Pins steckt, bleibt alles unverändert: Die Programmierung erfolgt weiter über den PROG/UART-Stecker mithilfe des Bootloaders im Prozessor.&lt;br /&gt;
Wird die Codierbrücke in Stellung &amp;quot;ISP*&amp;quot; umgesteckt, kann der Prozessor mit ISP programmiert werden.&lt;br /&gt;
&lt;br /&gt;
Vorsicht: Das Bootloader-Programm kann dabei zerstört werden! Es müssen zusätzlich Fusebits des ATMEGA32 verändert werden. Dabei kann der Prozessor im schlimmsten Fall nicht mehr ansprechbar sein. Man sollte diesen Umbau und die ISP-Programmierung nur machen, wenn man genau weiß, was man macht!&lt;br /&gt;
&lt;br /&gt;
Eine Kopie des Bootloaders und eine Kurzanleitung zum Einstellen der Fusebits gibt es hier:&lt;br /&gt;
[http://www.arexx.com/rp6/downloads/RP6BASE_BOOTLOADER.zip RP6_BOOTLOADER]&lt;br /&gt;
&lt;br /&gt;
====IO1..IO4====&lt;br /&gt;
[[Bild:RP6_IO1-4.JPG|thumb|RP6 IO1..IO4]]&lt;br /&gt;
Die Anschlüsse IO1 bis IO4 (SP2 E3: IO1..4) steuern bereits die Status-LEDs 1, 2, 4 und 5 an. Trotzdem kann man sie auch noch mit leichten Einschränkungen als I/O-Pins benutzen. Dazu lötet man zweimal 2 Pins einer 1-reihigen Stiftleiste RM 2,54mm (z.B. 36-polig 732478) auf die IO1/2 und IO3/4 Lötpunkte.&lt;br /&gt;
Hier eine Tabelle, die die Port-Pins zeigt, die IO1..IO4 zugeordnet sind:&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |IO&lt;br /&gt;
 |Status-LED&lt;br /&gt;
 |Port-Pin&lt;br /&gt;
 |-&lt;br /&gt;
 |1&lt;br /&gt;
 |SL1&lt;br /&gt;
 |PC4&lt;br /&gt;
 |-&lt;br /&gt;
 |2&lt;br /&gt;
 |SL2&lt;br /&gt;
 |PC5&lt;br /&gt;
 |-&lt;br /&gt;
 |3&lt;br /&gt;
 |SL4&lt;br /&gt;
 |PB7&lt;br /&gt;
 |-&lt;br /&gt;
 |4&lt;br /&gt;
 |SL5&lt;br /&gt;
 |PB1&lt;br /&gt;
 |-&lt;br /&gt;
|}&lt;br /&gt;
Wie können nun IO1..IO4 genutzt werden?&lt;br /&gt;
&lt;br /&gt;
Als ...&lt;br /&gt;
* Eingang, z.B. für zusätzliche Tastschalter/Bumper&lt;br /&gt;
* Ausgang, z.B. zur Ansteuerung von Treiberstufen, low-current LEDs, ...&lt;br /&gt;
&lt;br /&gt;
Wird ein Anschluß IOx als Eingang verwendet, muss ein Widerstand von 470 Ohm in Reihe mit dem Taster an VDD eingebaut werden, zusätzlich ein Pulldown-Widerstand 100 kOhm. Diese Beschaltung zeigen z.B. an SL6 die Widerstände R43 und R46 (SP2 E4: R43, R46).&lt;br /&gt;
&lt;br /&gt;
Als Ausgang geschaltet sollte an IOx kein hoher Strom entnommen werden: 10mA sind max. zu empfehlen!&lt;br /&gt;
&lt;br /&gt;
====USRBUS====&lt;br /&gt;
Die 14 Kontakte der beiden USRBUS-Stecker sind auf dem RP6 nirgendwo angeschlossen, sondern können über die Lötpunkte Y1..Y14 mit beliebigen Punkten auf dem Mainboard verbunden werden.&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_USRBUS.JPG|thumb|RP6 USRBUS]]&lt;br /&gt;
&lt;br /&gt;
Ich würde auf Y1..Y14 eine Stiftleiste löten, damit die USRBUS-Belegung geändert werden kann.&lt;br /&gt;
&lt;br /&gt;
Man braucht dazu:&lt;br /&gt;
* 2-reihige Stiftleiste RM 2,54mm (z.B. 2x36-polig 742007)&lt;br /&gt;
* Einige Steckbuchsen mit Litze&lt;br /&gt;
&lt;br /&gt;
Man trennt von der 2-reihigen Stiftleiste 2x7 Kontakte ab und lötet sie auf die Punkte Y1..Y14 (SP4 E34: Y1..14, Y1'..Y14') neben den beiden Wannensteckern USRBUS1 (vorn) und USRBUS2 (hinten). Wird der RP6 über Flachkabel mit einem USRBUS-Stecker auf einer RP6 Experimentierplatine (EP) und/oder mit einer Erweiterungsplatine (M32, CCPRO M128) verbunden, dann hat man mit allen mit dem USRBUS verbundenen Platinen eine direkte 14-polige Verbindung,- eben den &amp;quot;User Bus&amp;quot;. Den kann man dann nutzen, wie man will. Auf dem RP6 kann man mit Steckbuchsen die Pins Y1..Y14 mit anderen Pins verbinden.&lt;br /&gt;
&lt;br /&gt;
Beispiel: Verbindet man den Pin &amp;quot;ADC0&amp;quot; mit Y1 des USRBUS1, dann steht der Eingang ADC0 auf allen an den USRBUS1 angeschlossenen Platinen auf dem vorderen Platinenstapel an Y1 zur Verfügung. Man braucht also diesen Eingang nicht über ein eigenes Kabel auf eine EP zu führen, sondern kann dazu den USRBUS nehmen. Dadurch bleibt der Gesamtaufbau auf dem RP6 übersichtlich und komplett trennbar (man braucht nur die Stecker XBUS und USRBUS abzuziehen!).&lt;br /&gt;
&lt;br /&gt;
Wichtig:&lt;br /&gt;
* Man sollte gut dokumentieren, wie man den USRBUS am RP6 (vorn und hinten getrennt!), auf EPs und der M32/M128 benutzt! Sonst kann es bei einer anderen Anordnung von EPs zu USRBUS Konflikten/Kurzschlüssen kommen.&lt;br /&gt;
* Der USRBUS1- und der USRBUS2-Stecker sind auf dem RP6 NICHT miteinander verbunden.&lt;br /&gt;
&lt;br /&gt;
Einen Vorschlag für die Belegung des USRBUS1 (vorn) gibt es z.B. &lt;br /&gt;
[http://www.roboternetz.de/phpBB2/viewtopic.php?t=32549 hier] oder &lt;br /&gt;
[http://www.roboternetz.de/community/showthread.php/47102-Sensor-anschließen?p=453061&amp;amp;viewfull=1#post453061 da.]&lt;br /&gt;
&lt;br /&gt;
====Start/Stop Button====&lt;br /&gt;
[[Bild:RP6_ST.JPG|thumb|RP6 ST]]&lt;br /&gt;
Am mittleren Lochrasterfeld links finden sich zwei Lötpunkte ST1, ST2 (SP2 D2: ST1, ST2), an die weitere Start/Stop Taster (NO, normal offen) parallel zum Taster auf dem RP6 Mainboard angeschlossen werden können.&lt;br /&gt;
&lt;br /&gt;
Zum Anschluß kann man auch Stiftleisten auflöten. ST1, ST2 könnte man auch mit dem USRBUS1 verbinden, wenn man den RP6 z.B. von einer EP aus zurücksetzen möchte.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Serielle Schnittstelle====&lt;br /&gt;
[[Bild:RP6_RST.JPG|thumb|RP6 RST]]&lt;br /&gt;
Neben dem USRBUS1 Stecker befinden sich 5 Lötpunkte mit den Signalen RST, TX, RX, GND, VDD (SP4 AB5: YRX, YTX, YMRESET, YVDD). Hier kann z.B. eine 5-polige Stiftleiste aufgelötet werden, um einen Anschluß an die serielle Schnittstelle zu ermöglichen.&lt;br /&gt;
&lt;br /&gt;
Von diesen 5 Lötpunkten könnte z.B. auch [http://www.roboternetz.de/phpBB2/viewtopic.php?t=32549 so] eine Verbindung zum benachbarten USRBUS1 hergestellt werden, um die serielle Schnittstelle des RP6 auf EPs zu führen.&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;
&lt;br /&gt;
====I2C-Schnittstelle====&lt;br /&gt;
[[Bild:RP6_I2C.JPG|thumb|RP6 I2C]]&lt;br /&gt;
Neben dem XBUS2 Stecker finden sich 5 Lötpunkte mit den Signalen der I2C-Schnittstelle (SP4 D12: Stecker I2C). Dies sind: VDD (Pin 1), GND, SDA, SCL, INT1 (Pin 5). Hier kann z.B. eine 5-polige Stiftleiste aufgelötet werden, um einen Anschluß an die I2C-Schnittstelle zu ermöglichen.&lt;br /&gt;
&lt;br /&gt;
Von diesen 5 Lötpunkten könnte z.B. auch eine Verbindung zum USRBUS1 oder USRBUS2 hergestellt werden, um die I2C-Schnittstelle des RP6 auf EPs zu führen, allerdings hat man SCL, SDA, INT1 ja auch schon am XBUS zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Interrupt-Leitungen====&lt;br /&gt;
[[Bild:RP6_INTx.JPG|thumb|RP6 INTx]]&lt;br /&gt;
Die Interrupt-Leitungen INTU, INT1..3, MRESET (SP4 D34: MRESET, INT1..3, INTU) sind an 5 Lötpunkten neben dem XBUS1 Stecker zu kontaktieren. Hier kann natürlich auch eine 5-polige Stiftleiste aufgelötet werden. In der Regel wird man diese Anschlüsse nicht brauchen, weil sie schon auf dem XBUS zur Verfügung stehen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====VDD/GND/+UB Anschluß====&lt;br /&gt;
[[Bild:RP6_VDDGNDUB.JPG|thumb|RP6 VDD GND +UB]]&lt;br /&gt;
In der Nähe von C4 im hinteren Bereich des Mainboards finden sich Lötpunkte (SP4 E12: YVDDx, YGNDx; SP4 D2 YUBx), an denen man VDD, GND und +UB finden kann.&lt;br /&gt;
&lt;br /&gt;
Wenn man höhere Ströme an VDD (z.B. für Servos) oder +UB (z.B. für einen anderen IRCOMM-Sender oder einen DC-Motor) entnehmen möchte, empfehlen sich diese Lötpunkte, auf die man auch Stiftleisten löten kann.&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;
====EXT Anschluß====&lt;br /&gt;
[[Bild:RP6_EXT.jpg|thumb|RP6 EXT Anschluß]]&lt;br /&gt;
Am hinteren Rand der RP6 Hauptplatine gibt es eine Reihe von 8 Lötpunkten. Dies ist der EXT Anschluß (SP1 C23: Stecker EXT):&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |Pin&lt;br /&gt;
 |Name&lt;br /&gt;
 |Beschreibung&lt;br /&gt;
 |-&lt;br /&gt;
 |1&lt;br /&gt;
 |GND&lt;br /&gt;
 |RP6 und Akku Minuspol (GND)&lt;br /&gt;
 |-&lt;br /&gt;
 |2&lt;br /&gt;
 |CHRG&lt;br /&gt;
 |Anschluß (+) für ext. Ladegerät, identisch mit Pluspol der Ladebuchse (CHARGER, Pin 1). Ladung nur möglich, wenn S1 AUS ist!&lt;br /&gt;
 |-&lt;br /&gt;
 |3&lt;br /&gt;
 |CHRG&lt;br /&gt;
 |wie Pin 2!&lt;br /&gt;
 |-&lt;br /&gt;
 |4&lt;br /&gt;
 | +BAT&lt;br /&gt;
 |Akku Pluspol über Sicherung F1&lt;br /&gt;
 |-&lt;br /&gt;
 |5&lt;br /&gt;
 | +BAT&lt;br /&gt;
 |wie Pin 4!&lt;br /&gt;
 |-&lt;br /&gt;
 |6&lt;br /&gt;
 | +UB&lt;br /&gt;
 |RP6 +UB (+7,2V=, Bereich min. +5,5 bis max. +10V=)&lt;br /&gt;
 |-&lt;br /&gt;
 |7&lt;br /&gt;
 | +UB&lt;br /&gt;
 |wie Pin 6!&lt;br /&gt;
 |-&lt;br /&gt;
 |8&lt;br /&gt;
 |GND&lt;br /&gt;
 |wie Pin 1!&lt;br /&gt;
 |-&lt;br /&gt;
|}&lt;br /&gt;
Man kann hier eine JST XH Stiftleiste gerade, 8-polig, RM 2,5mm ([http://www.conrad.de/ce/de/product/740105/Stiftleiste-gerade-RM-25-mm-Serie-XH-Rastermass-25-mm-Pole-8-Nennstrom-3-A-B8B-XH-A-LFSN-JST-Inhalt-1-St 740105]) auflöten.&lt;br /&gt;
&lt;br /&gt;
Wozu kann man diesen Anschluß nutzen?&lt;br /&gt;
&lt;br /&gt;
Der wesentliche Sinn des EXT Anschlusses besteht darin, andere Arten der Stromversorgung und der Akkuladung zu ermöglichen. Normalerweise schaltet man den RP6 mit S1 an und aus. In Stellung AUS kann der Akku geladen werden, indem man ein Ladegerät an die CHARGER Buchse anschließt. Alternativ kann man das Ladegerät mit seinem Pluspol auch an CHRG (Pins 2, 3) anschließen. Siehe auch den Abschnitt &amp;quot;Trennstellen - EXT Anschluß: Andere Stromversorgung&amp;quot; weiter unten!&lt;br /&gt;
&lt;br /&gt;
An +BAT (Pins 4, 5) kann man direkt (ohne Unterbrechung durch S1) Strom aus dem Akku entnehmen. Die Grenze des Stroms bestimmt die Sicherung F1 (2,5A). Eine weitere Möglichkeit besteht darin, über diesen Anschluß den Akku auch mit einem geeigneten Ladegerät zu LADEN. Hierbei muss man aber darauf achten, dass S1 AUSgeschaltet ist, weil sonst der RP6 über +UB eine unzulässig hohe Spannung bekommen könnte. Wenn man den Akku mit 6 Mignonzellen im RP6 nicht nutzen will (der Akku-Halter bleibt leer!), sondern nur einen externen Akku, wäre der auch mit seinem Pluspol an +BAT über eine eigene Sicherung (2,5A träge) anzuschließen.&lt;br /&gt;
&lt;br /&gt;
+UB (+7,2V) ist die Versorgungsspannung des RP6 (kommt vom Akku-Pluspol über die Sicherung F1 und Schalter S1!). Mit +UB werden die H-Brücken (Motoransteuerung) direkt und die RP6 &amp;quot;Elektronik&amp;quot; über den 5V-Spannungswandler (IC1; SP1 D3: IC1) versorgt (= VDD). An +UB könnte man den RP6 direkt mit einer Spannung von +7,2V versorgen (Absicherung nicht vergessen!), dazu muss S1 AUSgeschaltet sein, damit es keine Konflikte mit dem eingebauten Akku gibt.&lt;br /&gt;
&lt;br /&gt;
Den EXT Anschluß kann man damit nutzen für:&lt;br /&gt;
* Externes Ladegerät&lt;br /&gt;
* Externen Akku&lt;br /&gt;
* Externe Stromversorgung ohne Akku&lt;br /&gt;
* Direkte Stromentnahme aus dem Akku&lt;br /&gt;
* Ergänzungsladung mit Solarzelle&lt;br /&gt;
* Autonome Akkuladung (Ladestation mit Kontakten, Induktionsladung ...)&lt;br /&gt;
* ...&lt;br /&gt;
&lt;br /&gt;
Man sollte gewisse Elektronik-Kenntnisse haben, wenn man die Spannungsversorgung des RP6 verändert. VOR irgendwelchen Veränderungen seht euch auch zuerst den Schaltplan des RP6 (SP1) genau an!&lt;br /&gt;
&lt;br /&gt;
===Mess-/Kontaktpunkte===&lt;br /&gt;
Hier geht es um Kontaktpunkte, an denen man z.B. den Logik-Pegel (High/Low) oder eine analoge Spannung messen kann. Natürlich kann man die Signale auch zur Weiterleitung auf eine EP kontaktieren, dies wird man aber normalerweise nicht brauchen.&lt;br /&gt;
&lt;br /&gt;
====UBAT====&lt;br /&gt;
[[Bild:RP6_UBAT.JPG|thumb|RP6 UBAT]]&lt;br /&gt;
In der Mitte des Mainboards befindet sich ein Kontaktpunkt UBAT (SP1 E1: YUBAT). Dies ist ADC7 des RP6 Microcontrollers.&lt;br /&gt;
&lt;br /&gt;
Man kann hier die analoge Spannung (gegen GND) messen, die vom +UB-Spannungssensor geliefert wird.&lt;br /&gt;
&lt;br /&gt;
Die Spannung ist:&lt;br /&gt;
 UBAT = +UB / 2&lt;br /&gt;
Da der Spannungsteiler (SP1 D12: R1, R2) des +UB-Spannungssensors nicht aus Präzisionswiderständen besteht, kann man für den eigenen RP6 einen Korrekturfaktor berechnen, wenn UBAT deutlich von +UB / 2 (+ UB z.B. gemessen am EXT Stecker, Pins 6 u. 7) abweicht. Damit kann man +UB sehr viel genauer bestimmen.&lt;br /&gt;
&lt;br /&gt;
====ACS====&lt;br /&gt;
[[Bild:RP6_ACS_TSOP.JPG|thumb|RP6 ACS TSOP]]&lt;br /&gt;
Hinter dem TSOP (IC3) befindet sich der Kontaktpunkt ACS (SP2 E1: ACS).&lt;br /&gt;
&lt;br /&gt;
Dies ist der Ausgang des TSOP bzw. Eingang PB2 des RP6 Microcontrollers. Man kann hier das Ausgangssignal des IR-Empfängers abnehmen, z.B. um es mit einem Oszilloskop sichtbar zu machen.&lt;br /&gt;
&lt;br /&gt;
Rechts neben dem TSOP kann man noch die 3 Kontaktpunkte ACS_R, ACS_P und ACS_L (SP2 E2: ACS_P, ACS_R, ACS_L) des ACS-IR-Senders finden.&lt;br /&gt;
&lt;br /&gt;
Folgende Tabelle zeigt die Verbindungen:&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |Kontakt&lt;br /&gt;
 |Microcontroller-Portpin&lt;br /&gt;
 |SP-Verbindung&lt;br /&gt;
 |ACS-IR-Sendediode&lt;br /&gt;
 |-&lt;br /&gt;
 |ACS_P&lt;br /&gt;
 |über R8: ACS_PWRH (PB3), über R9: ACS_PWR (PD6)&lt;br /&gt;
 |SP2: 3&lt;br /&gt;
 |Anoden D1, D2&lt;br /&gt;
 |-&lt;br /&gt;
 |ACS_R&lt;br /&gt;
 |ACS_R (PC7)&lt;br /&gt;
 |SP2: 2&lt;br /&gt;
 |Kathode D1&lt;br /&gt;
 |-&lt;br /&gt;
 |ACS_L&lt;br /&gt;
 |ACS_L/MISO (PB6)&lt;br /&gt;
 |SP1: 5&lt;br /&gt;
 |Kathode D2&lt;br /&gt;
 |-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====IRC====&lt;br /&gt;
[[Bild:RP6_IRC.JPG|thumb|RP6 IRC]] [[Bild:RP6_IRC3.JPG|thumb|RP6 IRC3]]&lt;br /&gt;
Im der Nähe von C13 befinden sich die Lötpunkte IRC, IRC+, IRC- und IRC3 (SP2 D2: YIRC; SP2 CD2: IRC+/-; SP2 C2: IRC3). Zusammen mit der Trennstelle IRC (siehe Abschnitt &amp;quot;Trennstellen - IRC&amp;quot; weiter unten!) kann man diese Kontaktstellen im Umfeld des IRCOMM-Sendedioden Treibers IRLML2502PBF (SP2 CD12: Q5) finden. Am Kontaktpunkt IRC findet sich der Eingang des Treibers bzw. Ausgang PD7 des RP6 Microcontrollers. IRC+, IRC- sind die Kontaktpunkte, an denen die IRCOMM-Sendedioden D3, D4 in Reihe auf der Sensorplatine angeschlossen sind (IRC+ = Anode). IRC3 ist verbunden mit dem Trennstellen-Lötpunkt IRC1 und liegt bei geschlossener Trennstelle IRC an +UB.&lt;br /&gt;
&lt;br /&gt;
Was läßt sich mit diesen Kontaktpunkten machen:&lt;br /&gt;
* Der IRCOMM-Sender ist der zweitgrößte Stromverbraucher des RP6 (nach dem Antrieb). An IRC3 kann daher eine eigene Stromversorgung für die IRCOMM-Sendedioden angeschlossen werden. Dazu muss die Trennstelle IRC zwischen ihren Lötpunkten IRC1, IRC2 aufgetrennt werden.&lt;br /&gt;
* An IRC+, IRC- könnten andere/weitere IRCOMM-Sendedioden angeschlossen werden (Anode an IRC+). Wenn der Vorwiderstand R6 (SP2 C2: R6) der Sendedioden dann nicht mehr paßt (bezügl. Leistung und/oder Widerstandswert), können neue leistungsfähigere IRCOMM-Sendedioden zwischen IRC3 und IRC- (Anode an IRC3) mit einem dafür geeigneten Vorwiderstand angebracht werden.&lt;br /&gt;
&lt;br /&gt;
====LS====&lt;br /&gt;
[[Bild:RP6_LS.JPG|thumb|RP6 LS]]&lt;br /&gt;
Die beiden Lötpunkte LS_L und LS_R (SP2 B12: LS_L, LS_R) neben R7 vorn auf dem Mainboard sind die Ausgänge der Helligkeitssensoren (links und rechts) bzw. die ADC-Eingänge ADC3 und ADC2 des RP6 Microcontrollers.&lt;br /&gt;
&lt;br /&gt;
Hier kann man die Spannungen messen, die den Helligkeitswerten entsprechen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====BP, S====&lt;br /&gt;
[[Bild:RP6_BP_S.JPG|thumb|RP6 BP S]]&lt;br /&gt;
Die Messpunkte BPL, BPR und der Kontaktpunkt S (SP2 E2: S; SP2 E3: BPR; SP2 E4: BPL) befinden sich am vorderen Platinenrand. BPL und BPR sind die Kontakte der Bumper. S ist eine nicht genutzte Verbindung zwischen dem Mainboard und der Sensorplatine, die über die Verbindung SP1, Pin 3, geführt wird (siehe folgende Tabelle!).&lt;br /&gt;
&lt;br /&gt;
Hier eine Tabelle mit der Belegung der 90°-Winkelverbindung SP1, SP2 zwischen dem RP6 Mainboard und der Sensorplatine: &lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |Pin&lt;br /&gt;
 |SP1&lt;br /&gt;
 |SP2&lt;br /&gt;
 |-&lt;br /&gt;
 |1&lt;br /&gt;
 |LS_L  --- Light Sensor Left&lt;br /&gt;
 |IRC-  --- IRCOMM-&lt;br /&gt;
 |-&lt;br /&gt;
 |2&lt;br /&gt;
 |BPL   --- Bumper Left&lt;br /&gt;
 |ACS_R --- ACS Right&lt;br /&gt;
 |-&lt;br /&gt;
 |3&lt;br /&gt;
 |S     --- Free for all&lt;br /&gt;
 |ACS_P --- ACS Power&lt;br /&gt;
 |-&lt;br /&gt;
 |4&lt;br /&gt;
 |GND&lt;br /&gt;
 |VDD&lt;br /&gt;
 |-&lt;br /&gt;
 |5&lt;br /&gt;
 |ACS_L --- ACS Left&lt;br /&gt;
 |BPR   --- Bumper Right&lt;br /&gt;
 |-&lt;br /&gt;
 |6&lt;br /&gt;
 |IRC+  --- IRCOMM+&lt;br /&gt;
 |LS_R  --- Light Sensor Right&lt;br /&gt;
 |-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====ENC====&lt;br /&gt;
[[Bild:RP6_ENC.JPG|thumb|RP6 ENC]]&lt;br /&gt;
Die beiden Messpunkte ENCL, ENCR (SP4 B12: ENCL, ENCR) sind die Ausgänge der Radencoder. ENCL ist verbunden mit PD2 (INT0), ENCR mit PD3 (INT1) des RP6 Microcontrollers.&lt;br /&gt;
&lt;br /&gt;
===Trennstellen===&lt;br /&gt;
An diesen Stellen können Leiterbahnen unterbrochen werden, um Funktionen zu deaktivieren oder anders zu nutzen.&lt;br /&gt;
&lt;br /&gt;
=====Getrennte Stromversorgung für ADC0/1=====&lt;br /&gt;
Wenn man für die analogen Sensoren an ADC0/1 (siehe Abschnitt &amp;quot;Anschlüsse - Analoge Sensoren an ADC0/1&amp;quot; weiter oben!) eine GETRENNTE Stromversorgung vorsehen will und/oder mit Codierbrücke (oder MOSFET) die Stromversorgung abschaltbar machen möchte, muss man erst Vorarbeit leisten.&lt;br /&gt;
[[Bild:RP6_SV.JPG|thumb|RP6 SV]]&lt;br /&gt;
&lt;br /&gt;
Man braucht dazu:&lt;br /&gt;
* 1-reihige Stiftleiste RM 2,54mm (z.B. 36-polig 732478)&lt;br /&gt;
* Evtl.: Eine Codierbrücke (z.B. aus Set 742902)&lt;br /&gt;
* Evtl.: Eine 1-polige Steckbuchse mit Litze zur ext. Stromversorgung&lt;br /&gt;
Es muss eine kurze Leiterbahn zwischen den Punkten &amp;quot;SV1&amp;quot; und &amp;quot;SV2&amp;quot; (SP2 A1: SV1, SV2; zwischen dem PROG/UART- und dem USRBUS1-Stecker) aufgetrennt werden. Die Leiterbahn befindet sich auf der Lötseite der Platine und muss mit einem scharfen Messer oder einem speziellen Leiterbahn-Unterbrecher zwischen den beiden Lötpunkten unterbrochen werden. Man sollte anschließend mit einem Widerstandsmeßgerät zwischen SV1 und SV2 nachmessen: Es sollte keine Verbindung mehr bestehen. Jetzt trennt man von der 1-reihigen Stiftleiste 2 Kontakte ab und lötet sie auf die Punkte SV1/SV2.&lt;br /&gt;
&lt;br /&gt;
Man kann hier zunächst eine Codierbrücke aufstecken. Damit versorgt der RP6 Akku die Sensoren mit 5V an den Pins VDD. Möchte man später eine getrennte 5V-Spannung anlegen, zieht man einfach die Codierbrücke ab und speist die externe 5V-Spannung (mit einer 1-poligen Steckbuchse) am Pin SV2 ein. Achtung: An Pin SV1 wird dann nichts angeschlossen!&lt;br /&gt;
&lt;br /&gt;
Anstelle der Codierbrücke kann man natürlich auch einen MOSFET anschließen, um die Sensoren per Software abschalten zu können.&lt;br /&gt;
&lt;br /&gt;
====ACS====&lt;br /&gt;
[[Bild:RP6_ACS_JP.JPG|thumb|RP6 ACS JP]]&lt;br /&gt;
Die Trennstelle ACS (SP2 E1: YIR1, YIR2; SP2 F1: YIR3) befindet sich neben C29*. Sie besteht aus 3 Lötpunkten, von denen die linken beiden (IRC1, IRC2) verbunden sind. Trennt man die Leiterbahn zwischen diesen Lötpunkten auf und verbindet stattdessen die rechten beiden Lötpunkte (IRC2, IRC3) mit etwas Lötzinn oder mit einem SMD Null Ohm Widerstand, dann ist der IR-Empfänger (TSOP, IC3) dauerhaft EINgeschaltet und kann nicht mehr über das Signal PWRON (PB4) geschaltet werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====IRC====&lt;br /&gt;
[[Bild:RP6_IRC_JP.JPG|thumb|RP6 IRC JP]]&lt;br /&gt;
Die Trennstelle IRC (SP2 C1: IRC1..2) ist eng verknüpft mit den Mess- und Kontaktpunkten des IRCOMM-Senders (siehe Abschnitt &amp;quot;Mess-/Kontaktpunkte - IRC&amp;quot; weiter oben!). Wenn man sie auftrennt, kann man den IRCOMM-Sender mit einer getrennten Stromversorgung anstelle von +UB des RP6 versehen. Dies ist sehr sinnvoll, wenn man diese Funktion häufig verwendet oder sogar noch leistungsfähigere IR-Sendedioden einbaut, denn der IRCOMM-Sender ist der zweitgrößte Stromfresser (nach dem Antrieb) auf dem RP6 (von Erweiterungsplatinen und EPs Marke Eigenbau einmal abgesehen!). Man kann hier natürlich auch eine 2-polige Stiftleiste einlöten, um die Verbindung zu +UB mit einer Codierbrücke trennbar zu machen. Eine getrennte Stromversorgung +7,2V (Bereich: +5,5 .. +10V) kann man an IRC1 einspeisen. IRC1 dieser Trennstelle ist mit dem Kontaktpunkt IRC3 (siehe Abschnitt &amp;quot;Mess-/Kontaktpunkte - IRC&amp;quot; weiter oben!) verbunden. &lt;br /&gt;
&lt;br /&gt;
====RP6 Antrieb====&lt;br /&gt;
Mit den folgenden Trennstellen kann man den RP6 Antrieb (H-Brücken und Motoren) fast komplett vom Rest des RP6 Mainboards abtrennen (es bleibt nur die 5V-Versorgung (VDD) von IC4, T1, T2 bestehen!). Damit ist es möglich, mit dem RP6 Mainboard einen ganz anderen Antrieb (also z.B. ein anderes Roboter-Chassis mit eigenen Motoren und H-Brücken) zu steuern. Umgekehrt könnte man den RP6 Antrieb auch deshalb abtrennen, um ihn durch ein anderes Prozessorsystem (z.B. auch eine M32!) anzusteuern. It's up to you!&lt;br /&gt;
&lt;br /&gt;
=====+UB Power=====&lt;br /&gt;
[[Bild:RP6_HB_Power.jpg|thumb|RP6 HB Power]]&lt;br /&gt;
Der RP6 Antrieb wird direkt aus dem Akku (über S1 und F1) mit 7,2V (+UB) versorgt. Diese Stromversorgung kann man komplett abtrennen. Die Trennstelle (SP3 E34: X) liegt unter der Sicherung F1 (siehe Abb. RP6 HB Power). Zwischen den beiden doppelten Lötflächen befinden sich auf der Lötseite (Unterseite) des Mainboards vier parallele Leiterbahnen, die aufgetrennt werden müssen. Der Pluspol einer externen Spannung zur Versorgung des RP6 Antriebs kann dann mit einer Kabelverbindung an den doppelten Lötflächen (mit einem &amp;quot;+&amp;quot; gekennzeichnet) direkt neben dem Leistungswiderstand (R27) angeschlossen werden. Eine Absicherung dieser Stromversorgung sollte man unbedingt vorsehen (2,5A träge)!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=====Stromsensoren=====&lt;br /&gt;
[[Bild:RP6_CS.JPG|thumb|RP6 CS]]&lt;br /&gt;
Um den Motorstrom der beiden Motoren des RP6 zu messen, wird ein Dual-Operationsverstärker (IC5 = 27M2C; SP3 B23/D23: IC5B/A) eingesetzt. Dieses IC wird über PWRON (PB4) mit Strom versorgt. Die Stromsensoren funktionieren also nicht, wenn PWRON Low-Pegel führt (Befehl powerOFF() der RP6 Library!). Auf dem RP6 Mainboard gibt es eine Trennstelle mit drei Lötflächen (SP3 E34: CS1, CS2, CS3). Sie befindet sich auf dem Mainboard neben C23. Möchte man IC5 nicht mehr über PWRON mit Strom versorgen, sondern über VDD (+5V), dann trennt man die Leiterbahn zwischen den linken beiden Lötpunkten (CS1, CS2) auf und verbindet die rechten beiden Lötpunkte (CS2, CS3) mit etwas Lötzinn oder einem SMD Null Ohm Widerstand. Danach sind die Stromsensoren immer eingeschaltet und können über PWRON nicht mehr geschaltet werden. Alternativ kann man an CS2 auch eine externe Versorgungsspannung (+5V) für IC5 einspeisen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=====DR/MR/ML/DL=====&lt;br /&gt;
[[Bild:RP6_DR_MR_ML_DL.JPG|thumb|RP6 DR MR ML DL]]&lt;br /&gt;
An diesen Trennstellen können die Eingänge der H-Brücke für die Geschwindigkeit (PWM) und Drehrichtung der Motoren von den Portpins des Microcontrollers abgetrennt werden.&lt;br /&gt;
Für den rechten Motor sind dies die Trennstellen MR1/2 und DR1/2 (SP3 A23: MR1/2, DR1/2), für den linken Motor ML1/2 und DL1/2 (SP3 F23: ML1/2, DL1/2).&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |Trennstelle&lt;br /&gt;
 |Portpin&lt;br /&gt;
 |Funktion H-Brücke&lt;br /&gt;
 |-&lt;br /&gt;
 |MR1/2&lt;br /&gt;
 |PD5 (OC1A)&lt;br /&gt;
 |PWM Motor rechts&lt;br /&gt;
 |-&lt;br /&gt;
 |DR1/2&lt;br /&gt;
 |PC3 (TMS)&lt;br /&gt;
 |Fahrtrichtung rechts&lt;br /&gt;
 |-&lt;br /&gt;
 |ML1/2&lt;br /&gt;
 |PD4 (OC1B)&lt;br /&gt;
 |PWM Motor links&lt;br /&gt;
 |-&lt;br /&gt;
 |DL1/2&lt;br /&gt;
 |PC2 (TCK)&lt;br /&gt;
 |Fahrtrichtung links&lt;br /&gt;
 |-&lt;br /&gt;
|}&lt;br /&gt;
Trennt man die Leiterbahn (auf der Lötseite des RP6 Mainboards) zwischen den Lötpunkten der Trennstellen auf, kann man die Eingänge der H-Brücke (Mx1, Dx1) z.B. mit einem anderen Microcontroller verbinden. Die Ausgänge (Portpins) des RP6 Microcontrollers (Mx2, Dx2) können dann anders genutzt werden. Natürlich kann man auf die Lötpunkte dieser Trennstellen auch Stiftleisten löten, um den Anschluß steckbar zu machen.&lt;br /&gt;
&lt;br /&gt;
=====MCR/MCL=====&lt;br /&gt;
[[Bild:RP6_MCR_MCL.JPG|thumb|RP6 MCR MCL]]&lt;br /&gt;
An diesen Trennstellen können die Motorstromsensoren von den ADC-Eingängen des Microcontrollers abgetrennt werden.&lt;br /&gt;
&lt;br /&gt;
Für den rechten Sensor ist dies die Trennstelle MCR1/2 (SP3 A1: MCR1, MCR2), für den linken Sensor MCL1/2 (SP3 E1: MCL1, MCL2).&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |Trennstelle&lt;br /&gt;
 |Portpin&lt;br /&gt;
 |Funktion H-Brücke&lt;br /&gt;
 |-&lt;br /&gt;
 |MCR1/2&lt;br /&gt;
 |PA5 (ADC5)&lt;br /&gt;
 |Motorstrom rechts&lt;br /&gt;
 |-&lt;br /&gt;
 |MCL1/2&lt;br /&gt;
 |PA6 (ADC6)&lt;br /&gt;
 |Motorstrom links&lt;br /&gt;
 |-&lt;br /&gt;
|}&lt;br /&gt;
Trennt man die Leiterbahn (auf der Lötseite des RP6 Mainboards) zwischen den Lötpunkten der Trennstellen auf, kann man die ADC-Eingänge (Portpins) des RP6 Microcontrollers (MCx1) anders nutzen und die Ausgänge der Motorstromsensoren (MCx2) z.B. mit ADC-Eingängen eines anderen Microcontrollers verbinden. Natürlich kann man auf die Lötpunkte dieser Trennstellen auch Stiftleisten löten, um den Anschluß steckbar zu machen.&lt;br /&gt;
&lt;br /&gt;
====PWRON-LED====&lt;br /&gt;
[[Bild:RP6_PWRON_L.JPG|thumb|RP6 PWRON L]]&lt;br /&gt;
Auf dem RP6 Mainboard gibt es eine gelbe LED, die anzeigt, ob PWRON High-Pegel hat. Mit einer Trennstelle neben dieser LED (SP2 D4: YL1, YL2) kann diese LED deaktiviert werden (z.B. um Strom zu sparen).&lt;br /&gt;
&lt;br /&gt;
Dazu trennt man die Leiterbahn zwischen den Lötpunkten auf. Soll die LED wieder aktiviert werden, verbindet man die Lötpunkte wieder mit etwas Lötzinn oder einem SMD Null Ohm Widerstand.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====+UB Sensor====&lt;br /&gt;
[[Bild:RP6_UB.JPG|thumb|RP6 UB]]&lt;br /&gt;
Die Versorgungsspannung +UB des RP6 wird mit dem +UB-Spannungssensor an PA7 (ADC7) gemessen. Will man diesen Spannungssensor mit seinem Eingangsspannungsteiler R1, R2 (SP1 D12: R1, R2) von +UB abtrennen (z.B. um ihn anders zu verwenden), gibt es eine Trennstelle UB1/2 (SP1 D2: UB1, UB2). Trennt man die Leiterbahn auf der Lötseite des RP6 Mainboards zwischen den Lötpunkten auf, kann +UB nicht mehr gemessen werden. Man kann dann den Lötpunkt UB2 mit einem anderen Messpunkt (z.B. mit +BAT) verbinden und dort die Spannung (0..10V) messen. Natürlich kann man auf die Lötpunkte dieser Trennstellen auch Stiftleisten löten, um den Anschluß steckbar zu machen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====EXT Anschluß: Andere Stromversorgung====&lt;br /&gt;
[[Bild:RP6_S1_CHRG.jpg|thumb|RP6 S1 CHRG]]&lt;br /&gt;
Wenn man für den RP6 eine andere Stromversorgung oder Ladeschaltung anschließen will, geht dies gut am EXT Anschluß (SP1 C23: Stecker EXT). Siehe auch den Abschnitt &amp;quot;Anschlüsse - EXT Anschluß&amp;quot; weiter oben! Dann muss der Schalter S1 dauerhaft AUSgeschaltet bleiben und die Verbindung zwischen S1 und CHRG des EXT Anschlusses (SP1 C3: X) unterbrochen werden. Diese Trennstelle befindet sich auf der Lötseite (Unterseite) des RP6 Mainboards etwas versteckt zwischen S1 (Pin 3) und der benachbarten Leiterbahn, die CHRG des EXT Anschlusses mit der Ladebuchse CHARGER (Pin 1 +) verbindet. Dort sind fünf kurze, parallele Leiterbahnen zu unterbrechen (siehe gelbe Markierung in der Abb. RP6 S1 CHRG!). Will man das nicht machen, darf man die Ladebuchse CHARGER auf jeden Fall nicht mehr nutzen!&lt;br /&gt;
&lt;br /&gt;
===Lochraster-Felder===&lt;br /&gt;
Auf diesen Feldern kann man eigene kleine Schaltungen aufbauen. An jedem der sechs Felder stehen VDD (+5V) und GND zur Verfügung (SP4 E12: YVDDx, YGNDx).&lt;br /&gt;
&lt;br /&gt;
Bitte beachten: Die Lochreihen oder -spalten, die mit einer eckigen Klammer &amp;quot;[&amp;quot; markiert sind, liegen auf der Lötseite (Unterseite) direkt auf dem Rahmen des Chassis! Hier können also keine Drähte von unten verlötet werden.&lt;br /&gt;
&lt;br /&gt;
====Vorn links====&lt;br /&gt;
Das kleine Lochrasterfeld vorn links kann z.B. für Beleuchtung (Blinker, Scheinwerfer links) oder auch für einen zusätzlichen Sensor genutzt werden.&lt;br /&gt;
Zur Verfügung steht eine 2-adrige Verbindung zum mittleren Lochrasterfeld links.&lt;br /&gt;
&lt;br /&gt;
In der Nähe dieses Lochrasterfeldes gibt es auch:&lt;br /&gt;
* IO3, IO4 (SP2 E3: IO3, IO4)&lt;br /&gt;
* ADC0 (SP2 B1: ADC0)&lt;br /&gt;
&lt;br /&gt;
====Mitte links====&lt;br /&gt;
[[Bild:RP6_Lochfeld_LM.JPG|thumb|RP6 Lochrasterfeld Mitte links]]&lt;br /&gt;
Das größere Lochrasterfeld Mitte links kann z.B. für eine kleinere Schaltung zur Ansteuerung der Beleuchtung/Sensoren auf den Lochrasterfeldern vorn und hinten links oder für andere Zwecke genutzt werden.&lt;br /&gt;
&lt;br /&gt;
Es stehen hier folgende Anschlüsse zur Verfügung:&lt;br /&gt;
* 2-adrige Verbindung zum Lochrasterfeld vorn links&lt;br /&gt;
* 2-adrige Verbindung zum Lochrasterfeld hinten links&lt;br /&gt;
* ST1/ST2 zum Anschluß weiterer Start/Stop Taster (SP2 D2: ST1/2)&lt;br /&gt;
* PWR (SP2 D2: YPWR1)&lt;br /&gt;
* I2C-Bus (SCL, SDA; SP4 C1: YSCL1, YSDA1)&lt;br /&gt;
* +UB (SP4 D2: YUB1)&lt;br /&gt;
In der Nähe dieses Lochrasterfeldes gibt es auch:&lt;br /&gt;
* Serielle Schnittstelle (RST, TX, RX; SP4 AB5: YRX, YTX, YMRESET, YVDD)&lt;br /&gt;
* USRBUS1 (vorn; SP4 E34: Y1'..Y14')&lt;br /&gt;
&lt;br /&gt;
=====Schaltungsvorschläge=====&lt;br /&gt;
Wie kann z.B. eine Schaltung für Beleuchtungseffekte oder Sensoren aussehen?&lt;br /&gt;
&lt;br /&gt;
Man könnte 8 zusätzliche Schaltkanäle mit dem I2C-Portexpander-IC PCF8574(A)P gewinnen. Dieses IC passt mit wenigen Zusatzteilen auf die mittlere Lochrasterfläche. Angesteuert wird es über den I2C-Bus. Mit den 8 Ausgängen lassen sich einige Beleuchtungseffekte erreichen, die dann über Software schaltbar sind.&lt;br /&gt;
&lt;br /&gt;
Alternativ kann man auch das IC PCF8591P z.B. für den Anschluß von analogen Sensoren verwenden. Auch dieser Baustein wird über I2C angesteuert. Beide ICs sind bei [http://www.reichelt.de./ Reichelt] erhältlich.&lt;br /&gt;
&lt;br /&gt;
Will man nicht den I2C-Bus benutzen, kann man als I/O-Ports IO1..IO4 oder als analoge Eingänge ADC0 und ADC1 verwenden. Auch SCL und SDA stehen als I/O-Ports zur Verfügung, wenn der I2C-Bus im ganzen System nicht verwendet werden soll.&lt;br /&gt;
&lt;br /&gt;
Wichtig für Zusatzschaltungen, die fest auf dem RP6 verlötet werden, sind zwei Aspekte:&lt;br /&gt;
* Wenn sie die Stromversorgung belasten, sollten sie (z.B. über einen Transistor oder MOSFET) abschaltbar sein. Dazu kann man auch das Signal PWR heranziehen, das auf beiden mittleren Lochrasterflächen zur Verfügung steht. Dann kann man mit dem Befehl &amp;quot;powerOFF()&amp;quot; der RP6 Library die Stromversorgung per Software abschalten.&lt;br /&gt;
* Wenn man auch anderweitig genutzte Portpins (SDA, SCL, IO1..IO4, ADC0/1) für die eigene Schaltung einsetzt, sollte man die Verbindung zu den Portpins mit einer abziehbaren Codierbrücke trennbar machen.&lt;br /&gt;
&lt;br /&gt;
====Hinten links====&lt;br /&gt;
Das kleine Lochrasterfeld hinten links kann z.B. für Beleuchtung (Blinker, Rücklicht links) oder auch für einen zusätzlichen Sensor genutzt werden.&lt;br /&gt;
Zur Verfügung steht eine 2-adrige Verbindung zum mittleren Lochrasterfeld links.&lt;br /&gt;
&lt;br /&gt;
In der Nähe dieses Lochrasterfeldes gibt es auch:&lt;br /&gt;
* EXT Anschluß (SP1 C23: Stecker EXT)&lt;br /&gt;
&lt;br /&gt;
====Vorn rechts====&lt;br /&gt;
Das kleine Lochrasterfeld vorn rechts kann z.B. für Beleuchtung (Blinker, Scheinwerfer rechts) oder auch für einen zusätzlichen Sensor genutzt werden.&lt;br /&gt;
Zur Verfügung steht eine 2-adrige Verbindung zum mittleren Lochrasterfeld rechts.&lt;br /&gt;
&lt;br /&gt;
In der Nähe dieses Lochrasterfeldes gibt es auch:&lt;br /&gt;
* IO1, IO2 (SP2 E3: IO1, IO2)&lt;br /&gt;
* ADC1 (SP2 B1: ADC1)&lt;br /&gt;
&lt;br /&gt;
====Mitte rechts====&lt;br /&gt;
Das größere Lochrasterfeld Mitte rechts kann z.B. für eine kleinere Schaltung zur Ansteuerung der Beleuchtung/Sensoren auf den Lochrasterfeldern vorn und hinten rechts oder für andere Zwecke genutzt werden.&lt;br /&gt;
&lt;br /&gt;
Es stehen hier folgende Anschlüsse zur Verfügung:&lt;br /&gt;
* 2-adrige Verbindung zum Lochrasterfeld vorn rechts&lt;br /&gt;
* 2-adrige Verbindung zum Lochrasterfeld hinten rechts&lt;br /&gt;
* PWR (SP2 D2: YPWR2)&lt;br /&gt;
* I2C-Bus (SCL, SDA; SP4 C1: YSCL2, YSDA2)&lt;br /&gt;
* +UB (SP4 D2: YUB2)&lt;br /&gt;
In der Nähe dieses Lochrasterfeldes gibt es auch:&lt;br /&gt;
* Interrupt-Anschluß (INTU, INT1..3, MRESET; SP4 D34: MRESET, INT1..3, INTU)&lt;br /&gt;
* USRBUS2 (hinten; SP4 E34: Y1..Y14)&lt;br /&gt;
&lt;br /&gt;
====Hinten rechts====&lt;br /&gt;
Das kleine Lochrasterfeld hinten rechts kann z.B. für Beleuchtung (Blinker, Rücklicht rechts) oder auch für einen zusätzlichen Sensor genutzt werden.&lt;br /&gt;
Zur Verfügung steht eine 2-adrige Verbindung zum mittleren Lochrasterfeld rechts.&lt;br /&gt;
&lt;br /&gt;
In der Nähe dieses Lochrasterfeldes gibt es auch:&lt;br /&gt;
* EXT Anschluß (SP1 C23: Stecker EXT)&lt;br /&gt;
* Akku-Anschluß (SP1 B3: BATTERY)&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Erweiterungen==&lt;br /&gt;
Auf / An den RP6 könnte man z.B. noch folgendes anbauen / erweitern:&lt;br /&gt;
&lt;br /&gt;
* Einen Greifarm&lt;br /&gt;
* Einen Ultraschallsensor&lt;br /&gt;
* Zwei Lichtsensoren hinten, um die hellste / dunkelste Stelle im Raum besser zu finden&lt;br /&gt;
* Einen digitalen Kompass&lt;br /&gt;
* uvm.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Erweiterungs-Module==&lt;br /&gt;
&lt;br /&gt;
Es sind von Arexx schon einige Erweiterungsmöglichkeiten auf dem Markt. Zum Ersten die Experimentierplatinen ([http://www.conrad.de/ce/de/product/191537/Arexx-RP6-Experimentierplatine 191537] AUSVERKAUFT!), die zum Erstellen von eigenen Schaltungen und Sensoren gedacht sind, und von denen eine schon im Lieferumfang des RP6 enthalten war, das Erweiterungsboard RP6 CONTROL M32 ([http://www.conrad.de/ce/de/product/191550/Arexx-RP6-ATMEGA32-Erweiterungssatz 191550] AUSVERKAUFT!) und die RP6 CCPRO M128 ([http://www.conrad.de/ce/de/product/191563/Arexx-RP6-CC-PRO-MEGA128-Erweiterungssatz 191563]).&lt;br /&gt;
&lt;br /&gt;
Die Boards kann man dann über den I2C Bus mit dem Mainboard kommunizieren lassen.  Es ist sehr sinnvoll, die Module symmetrisch hintereinander zu stapeln und nicht mehr als 6-8 Module zu verbauen, weil der Roboter sonst immer schwerer und langsamer wird. Basierend auf dem Master-Slave System könnte man so bis zu 127 Slaves anschließen. Zudem ist es ratsam, qualitativ hochwertige Akkus und ein Ladegerät mit passendem Stecker zu verwenden, da man ansonsten immer das Mainboard abschrauben müsste um an die Akkus heranzukommen. Für den Fall wurde extra eine Ladebuchse eingebaut.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Experimentierplatine ===&lt;br /&gt;
[[Bild:RP6_Exp.jpg|RP6 Experimentierplatine]]&lt;br /&gt;
&lt;br /&gt;
====Beschreibung====&lt;br /&gt;
Die Experimentier-Platine ist dazu gedacht, eigene Schaltungen auf dem RP6 zu realisieren, und ist seit Mai 2020 bei CONRAD ausverkauft. Sie wird über den I²C-Bus mit den anderen Erweiterungsmodulen verbunden. Ausserdem ist es sinnvoll, die (freien) I/O-Ports (ADC-Kanäle) der RP6 Base, des M32 Erweiterungsmoduls bzw. des CCPRO M128 Moduls über ein [http://www.reichelt.de/?;ACTION=3;LA=444;GROUP=C63;GROUPID=3328;ARTICLE=47637;START=0;SORT=artnr;OFFSET=16;SID=1580faBqwQAQ8AAGY-ZAM7cd511ee04a106a88a359faaac0071e2 10-Pol-Flachbandkabel] mit [http://www.reichelt.de/?ACTION=3;GROUP=C151;GROUPID=3231;ARTICLE=14571;SID=1580faBqwQAQ8AAGY-ZAM7cd511ee04a106a88a359faaac0071e2 Stecker] auf die Experimentierplatine zu führen, weil es übersichtlicher bleibt und keine Kabel lose herumhängen. Auf der Experimentierplatine kann man dann LEDs oder einen Temperatursensor an die I/O-Ports bzw. an die ADC-Kanäle anschießen.&lt;br /&gt;
&lt;br /&gt;
====Technische Daten====&lt;br /&gt;
{|  {{Blauetabelle}} &lt;br /&gt;
|'''Mikrocontroller:'''&lt;br /&gt;
|Keiner&lt;br /&gt;
|-&lt;br /&gt;
|'''Speicher:'''&lt;br /&gt;
|Keiner&amp;lt;br/&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|'''Programmierung:'''&lt;br /&gt;
|Kein Programmieradapter&lt;br /&gt;
|-&lt;br /&gt;
|'''Vorhandene Sensoren:'''&lt;br /&gt;
|Keine&amp;lt;br/&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|'''Vorhandene Aktoren:'''&lt;br /&gt;
|Keine&amp;lt;br/&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|'''Abmessungen:'''&lt;br /&gt;
|(L &amp;amp;times; B &amp;amp;times; H) 112 &amp;amp;times; 90 &amp;amp;times; 10 mm&lt;br /&gt;
|-&lt;br /&gt;
|'''Ausführung:'''&lt;br /&gt;
|Bausatz&lt;br /&gt;
|-&lt;br /&gt;
|'''Stromversorgung:'''&lt;br /&gt;
|6 AA NiMH Akkus (über die RP6 Base)&lt;br /&gt;
|-&lt;br /&gt;
|'''Hersteller:'''&lt;br /&gt;
|Arexx Niederlande&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Schaltungsideen ====&lt;br /&gt;
Auf der / den Experimentierplatinen könnte man z.B. folgendes realisieren:&lt;br /&gt;
&lt;br /&gt;
* eine Kameraschaltung (wie [http://www.rn-wissen.de/index.php/RP6_Kamera_-_Mitmach-Projekt hier] gezeigt)&lt;br /&gt;
* Scheinwerfer, Rücklichter, Blinker etc. (ABER immer mit Vorwiderstand!!!)&lt;br /&gt;
* ein LED-Lauflicht (über I/O-Expander, gibt´s beim [http://www.reichelt.de/?ACTION=3;ARTICLE=14527;PROVID=2402 Reichelt])&lt;br /&gt;
* mehr ADC-Kanäle (über ADC-Expander, einfach mal nach PCF8591 [http://www.google.de/search?q=PCF8591 googlen])&lt;br /&gt;
* eine Wetterstation mit Luftfeuchtemesser, Temperaturfühler und Lichtmesser ([http://www.roboternetz.de/phpBB2/viewtopic.php?t=52298 hier] gibt es eine Wetterstation uvm.)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== RP6 CONTROL M32 Platine ===&lt;br /&gt;
[[Bild:RP6Control_M32.jpg|RP6 CONTROL M32]]&lt;br /&gt;
&lt;br /&gt;
====Beschreibung====&lt;br /&gt;
Auf der M32 ([http://www.conrad.de/ce/de/product/191550/Arexx-RP6-ATMEGA32-Erweiterungssatz 191550]) lassen sich weitere LEDs, Sensoren oder ähnliches anschließen, außerdem steht ein weiterer ATMEGA32 zur Verfügung, welcher sich gut im Master Modus betreiben lässt. Es sind ein Mikrofonsensor, fünf Taster, vier Status-LEDs, ein Display-Port, ein Beeper, 6 freie ADC-Kanäle, 8 freie I/O-Ports, ein Programmieradapter, ein JTAG-Anschluss, eine ISP-Programmierschnittstelle sowie ein freier Steckplatz für ein EEPROM verfügbar.&lt;br /&gt;
&lt;br /&gt;
Seit Ende 2021 ist die M32 bei CONRAD ausverkauft!&lt;br /&gt;
&lt;br /&gt;
====Technische Daten====&lt;br /&gt;
{|  {{Blauetabelle}} &lt;br /&gt;
|'''Mikrocontroller:'''&lt;br /&gt;
|AVR [[ATmega32]]&lt;br /&gt;
|-&lt;br /&gt;
|'''Speicher:'''&lt;br /&gt;
|32 kB [[Flash]]-Speicher, davon 1 kB bereits vom Bootloader belegt&amp;lt;br/&amp;gt;&lt;br /&gt;
2 kB SRAM&amp;lt;br/&amp;gt; &lt;br /&gt;
1 kB [[EEPROM]]&lt;br /&gt;
|-&lt;br /&gt;
|'''Programmierung:'''&lt;br /&gt;
|Über AVR-[[Bootloader]], belegt ca. 1 kB des Flash-Speichers&lt;br /&gt;
|-&lt;br /&gt;
|'''Vorhandene Sensoren:'''&lt;br /&gt;
|1 Mikrofonsensor&amp;lt;br/&amp;gt;&lt;br /&gt;
5 Eingabetaster&amp;lt;br/&amp;gt;&lt;br /&gt;
14 I/O Ports, davon 6 ADC-Wandler&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|'''Vorhandene Aktoren:'''&lt;br /&gt;
|1 Beeper&amp;lt;br/&amp;gt;&lt;br /&gt;
4 Status-LEDs&amp;lt;br/&amp;gt;&lt;br /&gt;
1 LC-Display-Port&amp;lt;br/&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|'''Abmessungen:'''&lt;br /&gt;
|(L &amp;amp;times; B &amp;amp;times; H) 112 &amp;amp;times; 90 &amp;amp;times; 15 mm&lt;br /&gt;
|-&lt;br /&gt;
|'''Ausführung:'''&lt;br /&gt;
|Fertig aufgebautes Erweiterungsmodul&lt;br /&gt;
|-&lt;br /&gt;
|'''Stromversorgung:'''&lt;br /&gt;
|6 AA NiMH Akkus (über die RP6 Base)&lt;br /&gt;
|-&lt;br /&gt;
|'''Hersteller:'''&lt;br /&gt;
|Arexx Niederlande&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Umbau-Optionen ====&lt;br /&gt;
Dieser Absatz soll die Möglichkeiten der RP6 CONTROL M32 Platine (im Folgenden &amp;quot;M32&amp;quot; genannt) auflisten, die es gibt, um auf einfache Weise weitere Anschlüsse oder Verbindungen zu ermöglichen. Nicht beschrieben werden die Anschlußmöglichkeiten, die in Form der vorhandenen Wannenstecker sowieso gegeben sind (z.B. am LCD-, I/O- oder ADC-Stecker). Im Text gibt es Verweise auf den Schaltplan der M32 (RP6_CONTROL_M32.PDF) in der Form: (SP2 B1: Bauteil).  Dies bedeutet, dass man das Bauteil auf Blatt 2 des RP6-M32-Schaltplans im Feld B1 finden kann.&lt;br /&gt;
&lt;br /&gt;
Folgende Möglichkeiten zum Umbau/Ausbau sind vorgesehen:&lt;br /&gt;
* Zweites SPI-EEPROM (IC5)&lt;br /&gt;
* Zwei analoge Sensoren, evtl. mit getrennter Stromversorgung&lt;br /&gt;
* ISP (In System Programming)&lt;br /&gt;
* JTAG-Programmierung&lt;br /&gt;
* USRBUS&lt;br /&gt;
* IRQ-Zuweisung ändern&lt;br /&gt;
* ADC0 und ADC1 anders nutzen&lt;br /&gt;
* Schieberegister kaskadieren&lt;br /&gt;
Im folgenden Text soll beschrieben werden, wie man die weiteren Möglichkeiten nutzen kann. Es wird jeweils erwähnt, was man an Material braucht. Beispielhaft sind da Bestell-Nummern der Firma [http://www.conrad.de/ce/ CONRAD] genannt. Natürlich kann man die Teile auch bei anderen Versendern beziehen. Durch die Nennung der Bestell-Nummer ist das jeweilige Teil aber gut zu identifizieren. Man sollte Löten können und sich bewußt sein, dass ggf. ein Garantieanspruch nicht mehr besteht, wenn man an der Platine gelötet hat.&lt;br /&gt;
&lt;br /&gt;
Bei den Materialangaben ist öfter die Rede von &amp;quot;Steckbuchsen mit Litze&amp;quot;. Diese Steckbuchsen mit angelöteter Litze können auf die ein- oder zweireihigen Stiftleisten aufgesteckt werden. Leider gibt es sie nicht (mehr) fertig konfektioniert bei CONRAD. Die einreihigen Steckbuchsen (RM 2,54mm) kann man aber z.B. bei [http://www.elv.de/output/controller.aspx ELV] bekommen: 2-polig (68-016635), 3-polig (68-022503) und 5-polig (68-023073). An sie muss man dann noch Litzen in der entsprechenden Länge selbst anlöten.&lt;br /&gt;
&lt;br /&gt;
===== Zweites SPI-EEPROM =====&lt;br /&gt;
Es ist sehr einfach, ein zweites SPI-EEPROM (SP1 A1: IC5*) auf der M32 zu nutzen.&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_M32_IC5-Socket.JPG|thumb|Sockel des 2. SPI-EEPROMs]]&lt;br /&gt;
&lt;br /&gt;
Man braucht dazu:&lt;br /&gt;
* Einen IC-Sockel 8-pol DIP für IC5 ([http://www.conrad.de/ce/de/product/189600/IC-FASSUNG-PRAeZISION-8POLIG 189600])&lt;br /&gt;
* Einen Keramik-Vielschicht-Kondensator 100nF (C19); RM 2,54mm ([http://www.conrad.de/ce/de/product/453099/?insert=36&amp;amp;insertNoDeeplink&amp;amp;productname=KONDENSATOR-01-F-KDPU-254-MM 453099])&lt;br /&gt;
* Ein serielles SPI-EEPROM im PDIP8 Gehäuse (IC5)&lt;br /&gt;
Zuerst wird der IC-Sockel eingelötet (Kerbe beachten!), dann C19 (SP1 A1: C19*). Das war's.&lt;br /&gt;
&lt;br /&gt;
Leider gibt es das EEPROM nicht bei den gängigeren Versendern. Bekommen kann man es aber z.B. bei [http://de.farnell.com/jsp/home/homepage.jsp Farnell]. Dort hat das SPI-EEPROM mit 256 kbit die Bezeichnung 25LC256-I/P (1331398). Wenn man es noch größer mag: 25LC1024 (1331392) mit 1024 kbit. SPI-EEPROMs führt inzwischen auch [http://www.reichelt.de./ Reichelt].&lt;br /&gt;
&lt;br /&gt;
'''Programmierung:'''&lt;br /&gt;
&lt;br /&gt;
In die RP6ControlLib.h bitte einfügen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#define SPI_EEPROM2_PAGESIZE 64&lt;br /&gt;
&lt;br /&gt;
uint8_t SPI_EEPROM2_readByte(uint16_t memAddr);&lt;br /&gt;
void SPI_EEPROM2_writeByte(uint16_t memAddr, uint8_t data);&lt;br /&gt;
void SPI_EEPROM2_enableWrite(void);&lt;br /&gt;
void SPI_EEPROM2_disableWrite(void);&lt;br /&gt;
uint8_t SPI_EEPROM2_getStatus(void);&lt;br /&gt;
&lt;br /&gt;
void SPI_EEPROM2_writeBytes(uint16_t startAddr, uint8_t *buffer, uint8_t length);&lt;br /&gt;
void SPI_EEPROM2_readBytes(uint16_t startAddr, uint8_t *buffer, uint8_t length);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Die Konstante SPI_EEPROM2_PAGESIZE ist abhängig von der Art und Größe des EEPROMs. Für ein 256 kbit-EEPROM ist die Seitengröße (pagesize) in der Regel 64, für einen 512 kbit-Typ 128 und für einen 1024 kbit-Typ 256.&lt;br /&gt;
&lt;br /&gt;
In die RP6ControlLib.c bitte einfügen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Second external SPI EEPROM:&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Reads a single Byte from the 2nd external EEPROM.&lt;br /&gt;
 */&lt;br /&gt;
uint8_t SPI_EEPROM2_readByte(uint16_t memAddr)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t data;&lt;br /&gt;
	PORTB &amp;amp;= ~MEM_CS2;&lt;br /&gt;
	writeSPI(SPI_EEPROM_READ);&lt;br /&gt;
	writeWordSPI(memAddr);&lt;br /&gt;
	data = readSPI();&lt;br /&gt;
	PORTB |= MEM_CS2;&lt;br /&gt;
	return data;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Reads &amp;quot;length&amp;quot; Bytes into the Buffer &amp;quot;buffer&amp;quot; from startAdr on. &lt;br /&gt;
 * You can read the complete 2nd EEPROM into a buffer at once - if it is large enough. &lt;br /&gt;
 * (But you only have 2KB SRAM on a MEGA32 ;) )&lt;br /&gt;
 */&lt;br /&gt;
void SPI_EEPROM2_readBytes(uint16_t startAddr, uint8_t *buffer, uint8_t length)&lt;br /&gt;
{&lt;br /&gt;
	PORTB &amp;amp;= ~MEM_CS2;&lt;br /&gt;
	writeSPI(SPI_EEPROM_READ);&lt;br /&gt;
	writeWordSPI(startAddr);&lt;br /&gt;
	readBufferSPI(&amp;amp;buffer[0], length);&lt;br /&gt;
	PORTB |= MEM_CS2;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Enable Write Mode&lt;br /&gt;
 */&lt;br /&gt;
void SPI_EEPROM2_enableWrite(void)&lt;br /&gt;
{&lt;br /&gt;
	PORTB &amp;amp;= ~MEM_CS2;&lt;br /&gt;
	writeSPI(SPI_EEPROM_WREN);&lt;br /&gt;
	PORTB |= MEM_CS2;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Disable Write Mode&lt;br /&gt;
 */&lt;br /&gt;
void SPI_EEPROM2_disableWrite(void)&lt;br /&gt;
{&lt;br /&gt;
	PORTB &amp;amp;= ~MEM_CS2;&lt;br /&gt;
	writeSPI(SPI_EEPROM_WRDI);&lt;br /&gt;
	PORTB |= MEM_CS2;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Write a single data byte to the specified 2nd EEPROM address.&lt;br /&gt;
 */&lt;br /&gt;
void SPI_EEPROM2_writeByte(uint16_t memAddr, uint8_t data)&lt;br /&gt;
{&lt;br /&gt;
	while(SPI_EEPROM2_getStatus() &amp;amp; SPI_EEPROM_STAT_WIP);&lt;br /&gt;
	SPI_EEPROM2_enableWrite();&lt;br /&gt;
	PORTB &amp;amp;= ~MEM_CS2;&lt;br /&gt;
	writeSPI(SPI_EEPROM_WRITE);&lt;br /&gt;
	writeWordSPI(memAddr);&lt;br /&gt;
	writeSPI(data);&lt;br /&gt;
	PORTB |= MEM_CS2;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Write &amp;quot;length&amp;quot; Bytes from the Buffer to the 2nd EEPROM. &lt;br /&gt;
 * YOU CAN ONLY WRITE MAXIMAL [SPI_EEPROM2_PAGESIZE] BYTES AT ONCE!!!&lt;br /&gt;
 * This is the Pagesize!&lt;br /&gt;
 * You can NOT cross a page boundary!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void SPI_EEPROM2_writeBytes(uint16_t startAddr, uint8_t *buffer, uint8_t length)&lt;br /&gt;
{&lt;br /&gt;
	while(SPI_EEPROM2_getStatus() &amp;amp; SPI_EEPROM_STAT_WIP);&lt;br /&gt;
	SPI_EEPROM2_enableWrite();&lt;br /&gt;
	PORTB &amp;amp;= ~MEM_CS2;&lt;br /&gt;
	writeSPI(SPI_EEPROM_WRITE);&lt;br /&gt;
	writeWordSPI(startAddr);&lt;br /&gt;
	writeBufferSPI(&amp;amp;buffer[0], length);&lt;br /&gt;
	PORTB |= MEM_CS2;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Returns EEPROM Status register - for checking if 2nd EEPROM is buisy. &lt;br /&gt;
 * Writing takes about 5ms. &lt;br /&gt;
 */&lt;br /&gt;
uint8_t SPI_EEPROM2_getStatus(void)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t status;&lt;br /&gt;
	PORTB &amp;amp;= ~MEM_CS2;&lt;br /&gt;
	writeSPI(SPI_EEPROM_RDSR);&lt;br /&gt;
	status = readSPI();&lt;br /&gt;
	PORTB |= MEM_CS2;&lt;br /&gt;
	return status;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Hinweis zum 1024 kbit-EEPROM:&lt;br /&gt;
&lt;br /&gt;
Dieses EEPROM benötigt 24-Bit Adressen und muss daher etwas anders angesprochen werden als die &amp;quot;kleineren&amp;quot; Typen bis 512 kbit.&lt;br /&gt;
Die Funktion SPI_EEPROM2_readByte() sieht für ein 1024 kbit-EEPROM z.B. so aus:&lt;br /&gt;
&amp;lt;pre&amp;gt;uint8_t SPI_EEPROM2_readByte(uint32_t memAddr)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t data;&lt;br /&gt;
	PORTB &amp;amp;= ~MEM_CS2;&lt;br /&gt;
	writeSPI(SPI_EEPROM_READ);&lt;br /&gt;
	writeSPI((uint8_t)(memAddr &amp;gt;&amp;gt; 16));&lt;br /&gt;
	writeWordSPI((uint16_t)memAddr);&lt;br /&gt;
	data = readSPI();&lt;br /&gt;
	PORTB |= MEM_CS2;&lt;br /&gt;
	return data;&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
Alle weiteren Funktionen, die EEPROM-Adressen verwenden (SPI_EEPROM2_readBytes, SPI_EEPROM2_writeByte, SPI_EEPROM2_writeBytes), müssen genau so angepasst werden.&lt;br /&gt;
&lt;br /&gt;
===== Anschlüsse =====&lt;br /&gt;
Hier wird aufgelistet, wo man auf der M32 Platine Anschlüsse nutzen kann, um sie z.B. zu weiteren Sensoren, zum USRBUS oder (weniger empfehlenswert!) direkt zu EPs, zur RP6 Base oder zur CCPRO M128 zu führen. &lt;br /&gt;
&lt;br /&gt;
====== Analoge Sensoren an ADC2/3 ======&lt;br /&gt;
[[Bild:RP6_M32_ADC23.JPG|thumb|ADC2 ADC3]]&lt;br /&gt;
Wenn man bis zu zwei analoge Sensoren (z.B. IR-Distanz-Mess-Sensoren Sharp GP2Y0A02YK 185364) direkt an die M32 anschließen möchte, dann gibt es da zwei 3-polige Kontakte, beschriftet mit VDD/GND/ADCx (x = 2..3). Hier kann man 3-polige Stiftleisten auflöten, an die dann die Sensoren angeschlossen werden.&lt;br /&gt;
&lt;br /&gt;
Man braucht dazu:&lt;br /&gt;
* 1-reihige Stiftleiste RM 2,54mm (z.B. 36-polig 732478)&lt;br /&gt;
* Zwei Keramik-Vielschicht-Kondensatoren 100nF (C16, C17); RM 2,54mm (453099)&lt;br /&gt;
* Ein Elektrolyt-Kondensator stehend 470 uF / 16V (C18); RM 3,5mm (446211)&lt;br /&gt;
* Zwei 3-polige Steckbuchsen mit Litze zum Anschluß der Sensoren&lt;br /&gt;
Man trennt von der 1-reihigen Stiftleiste zweimal 3 Kontakte ab und lötet sie auf die weiß umrahmten Kontakte (VDD/GND/ADCx; SP2 C23: ADC2, YGND8, YVDD6, ADC3, YGND7, YVDD5), anschließend C16, C17 (SP2 C1: C16*, C17*) auf ihre Plätze und zum Schluß den Elko 470 uF (C18; SP2 B1: C18*). Beim Elko auf die Polung achten: Er muss genau so sitzen wie sein Nachbar C1 (Minuspol schaut zum Beeper SND).&lt;br /&gt;
&lt;br /&gt;
Die Sensoren lötet man an die Litzen der 3-poligen Steckbuchsen und steckt diese auf die neuen Kontakte.&lt;br /&gt;
&lt;br /&gt;
Da manche Sensoren einen höheren Stromverbrauch haben, kann man die Stromversorgung an den VDD-Pins der ADC2/3-Stecker abschaltbar machen oder eine separate +5V-Spannung einspeisen. Siehe dazu den Abschnitt &amp;quot;Trennstellen - Getrennte Stromversorgung für ADC2/3&amp;quot; weiter unten!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====== ISP (In System Programming) ======&lt;br /&gt;
Der ATMEGA32 der M32 wird standardmäßig über den PROG/UART Stecker programmiert. Dazu befindet sich im Prozessor ein Bootloader-Programm. Wenn man stattdessen oder zusätzlich die ISP-Programmierung mit einem dafür geeigneten ISP-Programmier-Adapter nutzen will, kann man den Adapter an den gewinkelten ISP-Stecker auf der M32 anschließen.&lt;br /&gt;
Vorher sind aber ein paar &amp;quot;Umbauarbeiten&amp;quot; erforderlich.&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_M32_ISP.JPG|thumb|ISP]]&lt;br /&gt;
&lt;br /&gt;
Man braucht dazu:&lt;br /&gt;
* 1-reihige Stiftleiste RM 2,54mm (z.B. 36-polig 732478)&lt;br /&gt;
* Einen SMD-Widerstand 10 kOhm (406376)&lt;br /&gt;
* Eine SMD-Diode LL 4148 (140902)&lt;br /&gt;
* Eine Codierbrücke (z.B. aus Set 742902)&lt;br /&gt;
&lt;br /&gt;
Der SMD-Widerstand wird auf seinen Platz (R1; SP1 A3: R1*) neben dem XBUS2-Stecker gelötet, danach die Diode LL 4148 (D2; SP1 B3: D2*). Die Kathode (Strich) der Diode zeigt in Richtung des Quarzes (X1). Zwischen R1 und C1 befinden sich drei Lötpunkte (beschriftet mit ISP/DEBUG - BOOTLOAD; SP1 A34: YRST1..3), auf die eine 3-polige Stiftleiste gelötet werden muss. Vorher muss eine kurze Leiterbahn zwischen den Lötpunkten BOOTLOAD aufgetrennt werden. Die Leiterbahn befindet sich auf der Lötseite der Platine und muss mit einem scharfen Messer oder einem speziellen Leiterbahn-Unterbrecher zwischen den beiden Lötpunkten unterbrochen werden. Man sollte anschließend mit einem Widerstandsmeßgerät nachmessen: Es sollte keine Verbindung mehr zwischen den Lötpunkten bestehen.&lt;br /&gt;
Man trennt dann von der 1-reihigen Stiftleiste 3 Kontakte ab und lötet sie auf die beschriebenen drei Lötpunkte.&lt;br /&gt;
&lt;br /&gt;
Wenn man jetzt eine Codierbrücke auf die mit &amp;quot;BOOTLOAD&amp;quot; beschrifteten Pins steckt, bleibt alles unverändert: Die Programmierung erfolgt weiter über den PROG/UART-Stecker mithilfe des Bootloaders im Prozessor. Wird die Codierbrücke in Stellung &amp;quot;ISP/DEBUG&amp;quot; umgesteckt, kann der Prozessor mit ISP programmiert werden.&lt;br /&gt;
&lt;br /&gt;
Vorsicht: Das Bootloader-Programm kann dabei zerstört werden! Es müssen zusätzlich Fusebits des ATMEGA32 verändert werden. &lt;br /&gt;
&lt;br /&gt;
Dabei kann der Prozessor im schlimmsten Fall nicht mehr ansprechbar sein. Man sollte diesen Umbau und die ISP-Programmierung nur machen, wenn man genau weiß, was man macht!&lt;br /&gt;
&lt;br /&gt;
Eine Kopie des Bootloaders und eine Kurzanleitung zum Einstellen der Fusebits gibt es hier: &lt;br /&gt;
[http://www.arexx.com/rp6/downloads/RP6_M32_BOOTLOADER.zip RP6_M32_BOOTLOADER]&lt;br /&gt;
&lt;br /&gt;
====== JTAG ======&lt;br /&gt;
[[Bild:RP6_M32_JTAG.JPG|thumb|JTAG]]&lt;br /&gt;
Die Programmierung und ein Debuggen sind auch mit der JTAG-Schnittstelle möglich. Das ist nur zu empfehlen, wenn man Erfahrungen mitbringt, oder der Prozessor der M32 durch eine ISP-Falschprogrammierung z.B. nicht mehr ansprechbar ist.&lt;br /&gt;
Um die JTAG-Schnittstelle nutzen zu können, muss der ISP-Umbau durchgeführt worden sein und die dort beschriebene Codierbrücke auf &amp;quot;ISP/DEBUG&amp;quot; gesteckt sein. Der JTAG-Programmer kann dann an die Lötpunkte &amp;quot;JTAG&amp;quot; zwischen ISP- und I/O-Stecker angeschlossen werden.&lt;br /&gt;
&lt;br /&gt;
Man braucht dazu:&lt;br /&gt;
* 2-reihige Stiftleiste RM 2,54mm (z.B. 2x36-polig 742007)&lt;br /&gt;
Man trennt von der 2-reihigen Stiftleiste 2x5 Kontakte ab und lötet sie auf die 10 JTAG-Lötpunkte (SP2 A12: YTDI, YTDO, YTMS, YTCK, YTRST, YVDD3/4, YGND3/4, YNC). Hier kann jetzt der JTAG-Programmer z.B. mit einem 10-poligen Flachkabel-Stecker angeschlossen werden. Um das JTAG-Interface des ATMEGA32 nutzen zu können, müssen Änderungen an den Fusebits vorgenommen werden.&lt;br /&gt;
&lt;br /&gt;
Vorsicht: Man sollte die JTAG-Programmierung und Fusebit-Manipulationen nur machen, wenn man genau weiß, was man macht!&lt;br /&gt;
&lt;br /&gt;
====== USRBUS ======&lt;br /&gt;
Die 14 Kontakte der beiden USRBUS-Stecker sind auf der M32 nirgendwo angeschlossen, sondern können über die Lötpunkte Y1..Y14 mit beliebigen Punkten auf der M32 verbunden werden.&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_M32_USRBUS.JPG|thumb|USRBUS]]&lt;br /&gt;
&lt;br /&gt;
Ich würde auf Y1..Y14 eine Stiftleiste löten, damit die USRBUS-Belegung geändert werden kann.&lt;br /&gt;
&lt;br /&gt;
Man braucht dazu:&lt;br /&gt;
* 2-reihige Stiftleiste RM 2,54mm (z.B. 2x36-polig 742007)&lt;br /&gt;
* Einige Steckbuchsen mit Litze&lt;br /&gt;
&lt;br /&gt;
Man trennt von der 2-reihigen Stiftleiste 2x7 Kontakte ab und lötet sie auf die Punkte Y1..Y14 (SP2 E3: Y1..Y14) neben dem Wannenstecker USRBUS2. Wird die M32 über Flachkabel mit einem USRBUS-Stecker auf einer RP6 Experimentierplatine (EP) und/oder mit dem RP6 selbst verbunden, dann hat man mit allen mit dem USRBUS verbundenen Platinen eine direkte 14-polige Verbindung,- eben den &amp;quot;User Bus&amp;quot;. Den kann man dann nutzen, wie man will. Auf der M32 kann man mit Steckbuchsen die Pins Y1..Y14 mit anderen Pins verbinden.&lt;br /&gt;
&lt;br /&gt;
Beispiel: Verbindet man den Pin &amp;quot;ADC2&amp;quot; mit Y1 des USRBUS, dann steht der Eingang ADC2 auf allen an den USRBUS angeschlossenen Platinen an Y1 zur Verfügung. Man braucht also diesen Eingang nicht über ein eigenes Kabel auf eine EP zu führen, sondern kann dazu den USRBUS nehmen. Dadurch bleibt der Gesamtaufbau auf dem RP6 übersichtlich und komplett trennbar (man braucht nur die Stecker XBUS und USRBUS abzuziehen!).&lt;br /&gt;
&lt;br /&gt;
Wichtig: Man sollte gut dokumentieren, wie man den USRBUS am RP6 (vorn und hinten getrennt!), auf EPs und der M32/M128 benutzt! Sonst kann es bei einer anderen Anordnung von EPs zu USRBUS Konflikten/Kurzschlüssen kommen.&lt;br /&gt;
&lt;br /&gt;
====== Schieberegister kaskadieren ======&lt;br /&gt;
[[Bild:RP6_M32_SPI.JPG|thumb|SPI]]&lt;br /&gt;
Auf der M32 wird ein 8-Bit Schieberegister-Baustein (IC3: 74HC4094D) dazu gebraucht, vier Status-LEDs (LED1..LED4) und ein LCD (am Stecker LCD) anzusteuern. Durch Schieberegister kann man Port-Pins gewinnen, wenn die Pins des Prozessors nicht ausreichen.&lt;br /&gt;
&lt;br /&gt;
Solche Schieberegister kann man &amp;quot;kaskadieren&amp;quot;, d.h. weitere identische Bausteine einbauen, die weitere Port-Pins zur Verfügung stellen. Wenn man zusätzliche 74HC4094 einsetzen will, wird man das am besten auf einer EP aufbauen. Die Anschlüsse für diese Schieberegister werden auf der M32 an einer 6-poligen Reihe von Lötpunkten (beschriftet mit MISO, STR, MOSI, SCK, QS, QS*; SP1 D3: YQS1/2, YMOSI, YSCK, YSTR, YMISO) links von IC3 zur Verfügung gestellt.&lt;br /&gt;
&lt;br /&gt;
Wenn man diese 6 Signalleitungen auf eine EP führen will, gibt es dafür zwei Möglichkeiten:&lt;br /&gt;
* a) Direkte 6-polige Kabelverbindung von den oben beschriebenen Lötpunkten zur EP&lt;br /&gt;
* b) Nutzung des USRBUS, um die 6 Signale zur EP zu führen&lt;br /&gt;
Wenn man im Abschnitt &amp;quot;[[RP6#USRBUS|USRBUS]]&amp;quot; den entsprechenden Umbau gemacht hat, würde ich b) empfehlen! Man könnte dafür eine 6-polige Stiftleiste auf die o.g. Lötpunkte auflöten und 1:1 z.B. mit den Pins Y4, Y6, Y8, Y10, Y12, Y14 des USRBUS verbinden. Dann kann man auf der EP weitere Schieberegister- und SPI-Bausteine (z.B. SPI-EEPROMs, [http://www.pollin.de/shop/dt/MDU5OTgxOTk-/Bausaetze_Module/Module/Funkmodul_RFM12_433_Sende_Empfangsmodul.html RFM12 Transceiver] o.ä.) aufbauen.&lt;br /&gt;
&lt;br /&gt;
Man braucht dazu:&lt;br /&gt;
* 1-reihige Stiftleiste RM 2,54mm (z.B. 36-polig 732478)&lt;br /&gt;
* Steckbuchsen mit Litze&lt;br /&gt;
Man trennt von der 1-reihigen Stiftleiste 6 Kontakte ab und lötet sie auf die beschriebenen sechs Lötpunkte auf der M32. Mit den Steckbuchsen mit Litze wird dann die Verbindung entweder direkt zur EP (Option a) oder über den USRBUS zur EP (Option b) hergestellt.&lt;br /&gt;
&lt;br /&gt;
====== VDD/GND/+UB Anschluß ======&lt;br /&gt;
[[Bild:RP6_M32_VDDGNDUB.JPG|thumb|RP6 M32 VDD GND +UB]]&lt;br /&gt;
VDD, GND und +UB (SP2 C3: YUB1, YGND1/2/5, YVDD1/2) kann man auf der M32 an diesen Lötpunkten abnehmen.&lt;br /&gt;
&lt;br /&gt;
Natürlich kann man hier auch Stiftleisten auflöten.&lt;br /&gt;
&lt;br /&gt;
Auf der anderen Platinenseite (zwischen dem USRBUS1 und ISP Stecker) befinden sich zusätzlich noch 2 weitere Lötpunkte, an denen man VDD und GND kontaktieren kann.&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;
&lt;br /&gt;
====== Serielle Schnittstelle ======&lt;br /&gt;
[[Bild:RP6_M32_RST.JPG|thumb|RP6 M32 RST]]&lt;br /&gt;
Neben dem PROG/UART Stecker befinden sich 5 Lötpunkte mit den Signalen RST, TX, RX, GND, VDD (SP2 BC3: YRX, YTX, YRST, YVDD, YGND). Hier kann z.B. eine 5-polige Stiftleiste aufgelötet werden, um einen Anschluß an die serielle Schnittstelle zu ermöglichen.&lt;br /&gt;
 &lt;br /&gt;
Von diesen 5 Lötpunkten könnte z.B. auch eine Verbindung zum USRBUS hergestellt werden, um die serielle Schnittstelle der M32 auf EPs zu führen.&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;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====== MEM_CS2 ======&lt;br /&gt;
[[Bild:RP6_M32_MEM_CS2.JPG|thumb|RP6 M32 MEM_CS2]]&lt;br /&gt;
MEM_CS2 (M32 Microcontroller Pin PB1) kann man am IC5-Sockel an Pin 1 (SP1 A1: IC5*, Pin 1) kontaktieren. Falls IC5 nicht eingesetzt werden soll, kann man hier durch Einstecken eines Kabels in Pin 1 des IC5-Sockels PB1 nutzen und z.B. zum USRBUS führen.&lt;br /&gt;
&lt;br /&gt;
===== Mess-/Kontaktpunkte =====&lt;br /&gt;
Hier geht es um Kontaktpunkte, an denen man z.B. den Logik-Pegel (High/Low) oder eine analoge Spannung messen kann. Natürlich kann man die Signale auch zur Weiterleitung auf eine EP kontaktieren, dies wird man aber normalerweise nicht brauchen.&lt;br /&gt;
&lt;br /&gt;
====== M-Signal ======&lt;br /&gt;
[[Bild:RP6_M32_M_SIGNAL.JPG|thumb|RP6 M32 M-Signal]]&lt;br /&gt;
An diesem Messpunkt (SP1 E3: YM_SIGNAL) neben D1 kann man die Ausgangsspannung des Mikrofon-Verstärkers IC4 (SP1 E3: IC4) messen oder z.B. mit einem Oszilloskop darstellen.&lt;br /&gt;
&lt;br /&gt;
===== Trennstellen =====&lt;br /&gt;
An diesen Stellen können Leiterbahnen unterbrochen werden, um Funktionen zu deaktivieren oder anders zu nutzen. &lt;br /&gt;
&lt;br /&gt;
====== Getrennte Stromversorgung für ADC2/3 ======&lt;br /&gt;
Wenn man für die analogen Sensoren an ADC2/3 (siehe Abschnitt &amp;quot;Anschlüsse - Analoge Sensoren an ADC2/3&amp;quot; weiter oben!) eine GETRENNTE Stromversorgung vorsehen will und/oder mit Codierbrücke (oder MOSFET) die Stromversorgung abschaltbar machen möchte, muss man erst Vorarbeit leisten.&lt;br /&gt;
[[Bild:RP6_M32_SV.jpg|thumb|RP6 M32 SV]]&lt;br /&gt;
&lt;br /&gt;
Man braucht dazu:&lt;br /&gt;
* 1-reihige Stiftleiste RM 2,54mm (z.B. 36-polig 732478)&lt;br /&gt;
* Evtl.: Eine Codierbrücke (z.B. aus Set 742902)&lt;br /&gt;
* Evtl.: Eine 1-polige Steckbuchse mit Litze zur ext. Stromversorgung&lt;br /&gt;
Es muss eine kurze Leiterbahn zwischen den Punkten &amp;quot;SV1&amp;quot; und &amp;quot;SV2&amp;quot; (SP2 B2: SV1, SV2) aufgetrennt werden. Die Leiterbahn befindet sich auf der Lötseite der Platine und muss mit einem scharfen Messer oder einem speziellen Leiterbahn-Unterbrecher zwischen den beiden Lötpunkten unterbrochen werden. Man sollte anschließend mit einem Widerstandsmeßgerät zwischen SV1 und SV2 nachmessen: Es sollte keine Verbindung mehr bestehen. Jetzt trennt man von der 1-reihigen Stiftleiste 2 Kontakte ab und lötet sie auf die Punkte SV1/SV2.&lt;br /&gt;
&lt;br /&gt;
Man kann hier zunächst eine Codierbrücke aufstecken. Damit versorgt der RP6 Akku die Sensoren mit 5V an den Pins VDD. Möchte man später eine getrennte 5V-Spannung anlegen, zieht man einfach die Codierbrücke ab und speist die externe 5V-Spannung (mit einer 1-poligen Steckbuchse) am Pin SV2 ein. Achtung: An Pin SV1 wird dann nichts angeschlossen!&lt;br /&gt;
&lt;br /&gt;
Anstelle der Codierbrücke kann man natürlich auch einen MOSFET anschließen, um die Sensoren per Software abschalten zu können.&lt;br /&gt;
&lt;br /&gt;
====== Interrupt-Zuordnung ändern ======&lt;br /&gt;
Am XBUS stehen vier Interrupt-Pins (genannt INT1..INT3, INTU) zur Verfügung. INT1 ist auf der RP6 Base mit PA4 verbunden, auf der M32 mit PD2 (Prozessor INT0), auf der M128 mit PE5 (Prozessor INT5) und auf der [[RP6v2#RP6v2_M256_WiFi_Platine|RP6 M256 WiFi]] mit PJ3 (Prozessor PCINT12). Diese Tabelle zeigt die Verbindung aller Interruptleitungen auf den Platinen (RP6 Base, M32, M128, M256 WiFi) über den XBUS:&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |XBUS Pin&lt;br /&gt;
 |XBUS INTx&lt;br /&gt;
 |RP6 Base Pin&lt;br /&gt;
 |RP6 Base INTx&lt;br /&gt;
 |RP6 M32 Pin&lt;br /&gt;
 |RP6 M32 INTx&lt;br /&gt;
 |RP6 M128 Pin&lt;br /&gt;
 |RP6 M128 INTx&lt;br /&gt;
 |RP6 M256 Pin&lt;br /&gt;
 |RP6 M256 INTx&lt;br /&gt;
 |-&lt;br /&gt;
 |8&lt;br /&gt;
 |INT1&lt;br /&gt;
 |PA4&lt;br /&gt;
 |kein&lt;br /&gt;
 |PD2&lt;br /&gt;
 |INT0&lt;br /&gt;
 |PE5&lt;br /&gt;
 |INT5&lt;br /&gt;
 |PJ3&lt;br /&gt;
 |PCINT12&lt;br /&gt;
 |-&lt;br /&gt;
 |11&lt;br /&gt;
 |INT2&lt;br /&gt;
 |n.c.&lt;br /&gt;
 |&lt;br /&gt;
 |PD3 *&lt;br /&gt;
 |INT1&lt;br /&gt;
 |n.c.&lt;br /&gt;
 |&lt;br /&gt;
 |PJ6&lt;br /&gt;
 |PCINT15&lt;br /&gt;
 |-&lt;br /&gt;
 |9&lt;br /&gt;
 |INT3&lt;br /&gt;
 |n.c.&lt;br /&gt;
 |&lt;br /&gt;
 |PB2 *&lt;br /&gt;
 |INT2&lt;br /&gt;
 |PE6&lt;br /&gt;
 |INT6&lt;br /&gt;
 |PJ5&lt;br /&gt;
 |PCINT14&lt;br /&gt;
 |-&lt;br /&gt;
 |7&lt;br /&gt;
 |INTU&lt;br /&gt;
 |n.c.&lt;br /&gt;
 |&lt;br /&gt;
 |n.c.    *&lt;br /&gt;
 |&lt;br /&gt;
 |n.c.&lt;br /&gt;
 |&lt;br /&gt;
 |PJ4&lt;br /&gt;
 |PCINT13&lt;br /&gt;
 |-&lt;br /&gt;
|}&lt;br /&gt;
'''Zu *:''' Standard-Belegung. Ggf. abhängig von der nachfolgend beschriebenen Interrupt-Zuordnung!&lt;br /&gt;
&lt;br /&gt;
Auf der M32 kann man die Interrupt-Zuordnung für INT2, INT3 und INTU durch drei Codierbrücken (beschriftet mit I2-INTU, INT3-I3, I2-INT2; SP2 A3: YINT2/3/U, YI2_1/2, YI3) ändern.&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_M32_INTx.JPG|thumb|INTx]]&lt;br /&gt;
&lt;br /&gt;
Man braucht dazu:&lt;br /&gt;
* 2-reihige Stiftleiste RM 2,54mm (z.B. 2x36-polig 742007)&lt;br /&gt;
* Drei Codierbrücken (z.B. aus Set 742902)&lt;br /&gt;
Vor dem Auflöten der Stiftleiste müssen zwei kurze Leiterbahnen zwischen zwei Lötpunkten aufgetrennt werden, und zwar zwischen den Lötpunkten INT3-I3 und I2-INT2. Die Leiterbahnen müssen mit einem scharfen Messer oder einem speziellen Leiterbahn-Unterbrecher zwischen den beiden Lötpunkten unterbrochen werden. Man sollte anschließend mit einem Widerstandsmeßgerät nachmessen: Es sollte keine Verbindung mehr zwischen INT3-I3 und I2-INT2 bestehen. Man trennt dann von der 2-reihigen Stiftleiste 2x3 Kontakte ab und lötet sie auf das weiß umrahmte Feld mit der o.g. Beschriftung.&lt;br /&gt;
&lt;br /&gt;
Hier kann man auf INT3-I3 und I2-INT2 je eine Codierbrücke aufstecken, wenn man die Standard-Belegung beibehalten will. Steckt man auf I2-INTU eine Codierbrücke, dann ist INTU des XBUS mit Pin PD3 (I2) der M32 verbunden.&lt;br /&gt;
&lt;br /&gt;
'''Hinweis:''' Man kann auf die 6-polige Stiftleiste auch Codierbrücken QUER zur eigentlichen (horizontalen) Richtung aufsetzen. Dadurch kann jede der 3 Interruptleitungen des XBUS (INT2, INT3, INTU) mit jedem der 2 Interrupt Pins der M32 (PD3, PB2) verbunden werden.&lt;br /&gt;
&lt;br /&gt;
Wenn man keine der Codierbrücken aufsteckt, sind die Pins PD3 (I2) und PB2 (I3) des M32-Prozessors nicht mehr mit dem XBUS verbunden und können anders verwendet werden. Auf der M32 kann man dann z.B. auch andere Verbindungen zum XBUS herstellen, indem man auf die Pins INT2, INT3 oder INTU Kabelverbindungen aufsteckt.&lt;br /&gt;
&lt;br /&gt;
====== ADC0 und ADC1 frei nutzen ======&lt;br /&gt;
Auf der M32 ist ADC0 fest mit dem Mikrofon (MIC) und ADC1 mit den Tastern T1..T5 (KEYPAD) verbunden. Wenn man diese ADC-Eingänge für andere Sensoren benötigt, kann man das Mikrofon und die Taster von den Eingängen abtrennen.&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_M32_MIC_KEY.JPG|thumb|MIC_KEYPAD]]&lt;br /&gt;
&lt;br /&gt;
Man braucht dazu:&lt;br /&gt;
* 1-reihige Stiftleiste RM 2,54mm (z.B. 36-polig 732478)&lt;br /&gt;
* Eine Codierbrücke (z.B. aus Set 742902)&lt;br /&gt;
&lt;br /&gt;
MIC/ADC0:&lt;br /&gt;
Es muss eine kurze Leiterbahn zwischen zwei Lötpunkten aufgetrennt werden, die sich zwischen R2 und C19 befinden (SP1 D4: YM1, YM2). Die Leiterbahn muss mit einem scharfen Messer oder einem speziellen Leiterbahn-Unterbrecher zwischen den beiden Lötpunkten unterbrochen werden. Man sollte anschließend mit einem Widerstandsmeßgerät nachmessen: Es sollte keine Verbindung mehr bestehen. Vorsicht: Nicht R2 beschädigen! Damit ist das Mikrofon auf der M32 ohne Funktion und ADC0 kann anders genutzt werden. ADC0 ist dann am oberen Lötpunkt zwischen R2 und C19 verfügbar, dort müßte eine Kabelverbindung angelötet werden.&lt;br /&gt;
Soll das Mikrofon später doch wieder an ADC0 angeschlossen werden, verbindet man die beiden Lötpunkte zwischen R2 und C19 einfach mit etwas Lötzinn oder mit einem SMD Null Ohm Widerstand.&lt;br /&gt;
&lt;br /&gt;
KEYPAD/ADC1:&lt;br /&gt;
Es muss eine kurze Leiterbahn zwischen zwei Lötpunkten aufgetrennt werden, die sich unterhalb von R15 befinden (SP1 D2: YKP1, YKP2). Die Leiterbahn befindet sich auf der Lötseite der Platine und muss mit einem scharfen Messer oder einem speziellen Leiterbahn-Unterbrecher zwischen den beiden Lötpunkten unterbrochen werden. Man sollte anschließend mit einem Widerstandsmeßgerät nachmessen: Es sollte keine Verbindung mehr bestehen. Jetzt trennt man von der 1-reihigen Stiftleiste 2 Kontakte ab und lötet sie auf die beiden Punkte unterhalb von R15. Hier kann man jetzt eine Codierbrücke aufstecken, wenn man die Taster weiter benutzen will. Wenn die Brücke abgezogen ist, sind die Taster ohne Funktion und ADC1 kann anders genutzt werden. ADC1 ist dann am linken Pin der 2-poligen Stiftleiste unterhalb von R15 verfügbar.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== RP6 CCPRO M128 Platine===&lt;br /&gt;
&lt;br /&gt;
[[Bild:CCPRO M128 k-1-.jpg|Das CCPRO M128]]&lt;br /&gt;
&lt;br /&gt;
====Beschreibung====&lt;br /&gt;
Die M128 (191563) ergänzt das RP6 Roboter System um einen leistungsfähigen ATMEGA128 Prozessor.&lt;br /&gt;
Es sind ein Temperatursensor; 19 I/O-Ports, davon 8 ADCs, 3 PWM (Servos) und 2 I/Os für einen UART; 1 Beeper; 5 Status-LEDs; 1 LC-Display-Port sowie ein freier Steckplatz für ein EEPROM verfügbar.&lt;br /&gt;
&lt;br /&gt;
====Technische Daten====&lt;br /&gt;
{|  {{Blauetabelle}} &lt;br /&gt;
|'''Mikrocontroller:'''&lt;br /&gt;
|Steckplatz für ein C-Control PRO MEGA128 Modul mit einem AVR ATmega128 ([https://www.conrad.de/de/p/c-control-prozessor-unit-mega-128-pro-198219.html 198219])&lt;br /&gt;
|-&lt;br /&gt;
|'''Speicher:'''&lt;br /&gt;
|128 kB [[Flash]]-Speicher, davon 4 kB bereits vom Bootloader belegt&amp;lt;br/&amp;gt;&lt;br /&gt;
4 kB SRAM intern&amp;lt;br/&amp;gt; &lt;br /&gt;
64 kB SRAM extern&amp;lt;br/&amp;gt;&lt;br /&gt;
4 kB [[EEPROM]]&lt;br /&gt;
|-&lt;br /&gt;
|'''Programmierung:'''&lt;br /&gt;
|Über CCPRO-IDE&lt;br /&gt;
|-&lt;br /&gt;
|'''Vorhandene Sensoren:'''&lt;br /&gt;
|1 12bit I²C Temperatursensor &amp;lt;br/&amp;gt;&lt;br /&gt;
19 I/O-Ports, davon 8 ADCs, 3 PWM (Servos) und 2 I/Os für eine weitere serielle Schnittstelle (UART)&lt;br /&gt;
|-&lt;br /&gt;
|'''Vorhandene Aktoren:'''&lt;br /&gt;
|1 Beeper&amp;lt;br/&amp;gt;&lt;br /&gt;
5 Status-LEDs&amp;lt;br/&amp;gt;&lt;br /&gt;
1 LC-Display-Port&amp;lt;br/&amp;gt;&lt;br /&gt;
1 Sockel für ein I²C-Bus EEPROM vom Typ 24(L)Cxxx&lt;br /&gt;
|-&lt;br /&gt;
|'''Abmessungen:'''&lt;br /&gt;
|(L &amp;amp;times; B &amp;amp;times; H) 112 &amp;amp;times; 90 &amp;amp;times; 21 mm&lt;br /&gt;
|-&lt;br /&gt;
|'''Ausführung:'''&lt;br /&gt;
|Fertig aufgebautes Erweiterungsmodul&lt;br /&gt;
|-&lt;br /&gt;
|'''Stromversorgung:'''&lt;br /&gt;
|6 AA NiMH Akkus (über die RP6 Base)&lt;br /&gt;
|-&lt;br /&gt;
|'''Hersteller:'''&lt;br /&gt;
|Arexx Niederlande&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Umbauoptionen====&lt;br /&gt;
Auf der CCPRO M128 ([http://www.conrad.de/ce/de/product/191563/Arexx-RP6-CC-PRO-MEGA128-Erweiterungssatz 191563]) kann leider nicht so viel umgebaut werden:&lt;br /&gt;
&lt;br /&gt;
* I2C-EEPROM&lt;br /&gt;
* Freie Nutzung von PORTA* und PORTC*&lt;br /&gt;
* USRBUS&lt;br /&gt;
* A16-/PD4-Nutzung&lt;br /&gt;
&lt;br /&gt;
Im Text gibt es Verweise auf den Schaltplan der CCPRO M128 (RP6_CCPRO_M128_Schematic.PDF) in der Form: (SP2 B1: Bauteil).  Dies bedeutet, dass man das Bauteil auf Blatt 2 des M128-Schaltplans im Feld B1 finden kann.&lt;br /&gt;
&lt;br /&gt;
Bei den Materialangaben ist öfter die Rede von &amp;quot;Steckbuchsen mit Litze&amp;quot;. Diese Steckbuchsen mit angelöteter Litze können auf die ein- oder zweireihigen Stiftleisten aufgesteckt werden. Leider gibt es sie nicht (mehr) fertig konfektioniert bei CONRAD. Die einreihigen Steckbuchsen (RM 2,54mm) kann man aber z.B. bei [http://www.elv.de/output/controller.aspx ELV] bekommen: 2-polig (68-016635), 3-polig (68-022503) und 5-polig (68-023073). An sie muss man dann noch Litzen in der entsprechenden Länge selbst anlöten.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=====I2C-EEPROM=====&lt;br /&gt;
Zum Einsetzen eines I2C-EEPROMS (IC6; SP2 C1: IC6) braucht man nichts umzubauen. Man kauft einfach ein passendes EEPROM des Typs 24(L)Cxxxx-P und setzt es auf seinen Sockel, Kerbe zum oberen Platinenrand.&lt;br /&gt;
&lt;br /&gt;
Mögliche Typen (erhältlich z.B. bei [http://www.digikey.de/ Digi-Key] oder bei [http://www.reichelt.de./ Reichelt]):&lt;br /&gt;
* AT24C128  (AT24C128-10PU-2.7-ND)&lt;br /&gt;
* AT24C256  (AT24C256-10PU-2.7-ND)&lt;br /&gt;
* AT24C512  (AT24C512-10PU-2.7-ND)&lt;br /&gt;
* AT24C1024 (AT24C1024-10PI-2.7-ND)&lt;br /&gt;
&lt;br /&gt;
=====Anschlüsse=====&lt;br /&gt;
Hier wird aufgelistet, wo man auf der M128 Platine Anschlüsse nutzen kann, um sie z.B. zu weiteren Sensoren, zum USRBUS oder (weniger empfehlenswert!) direkt zu EPs, zur RP6 Base oder zur M32 zu führen. &lt;br /&gt;
&lt;br /&gt;
======Freie Nutzung von PORTA* und PORTC*======&lt;br /&gt;
Um PORTA* und PORTC* frei nutzen zu können (für weitere I/O-Ports), muss man auf das externe SRAM verzichten, was nicht sehr ratsam ist. Mehr I/O-Ports kann man alternativ durch I/O Expander gewinnen. Falls man das SRAM trotzdem deaktivieren will, hier die Anleitung.&lt;br /&gt;
&lt;br /&gt;
Für den Umbau braucht man:&lt;br /&gt;
* Wannenstecker 2x5-polig gerade RM 2,54mm (z.B. [http://www.reichelt.de./ Reichelt] WSL 10G)&lt;br /&gt;
* 1-reihige Stiftleiste RM 2,54mm (z.B. 36-polig 732478)&lt;br /&gt;
* Eine Codierbrücke (z.B. aus Set 742902)&lt;br /&gt;
[[Bild:RP6_M128_PortA.JPG|thumb|PORTA*]]&lt;br /&gt;
&lt;br /&gt;
Für die Bestückung von PORTA* (SP2 AB2: Stecker PORTA*) lötet man den Wannenstecker hier (siehe Abb. PORTA*) auf.&lt;br /&gt;
[[Bild:RP6_M128_PortC.JPG|thumb|PORTC*]]&lt;br /&gt;
&lt;br /&gt;
Für die Bestückung von PORTC* (SP1 A2: PC0..7, YGND1) trennt man von der 1-reihigen Stiftleiste 9 Kontakte ab und lötet sie auf die PORTC*-Lötpunkte (siehe Abb. PORTC*).&lt;br /&gt;
&lt;br /&gt;
Dann muss noch der SRAM-Enable Jumper (SP1 EF1: Y27..29) bestückt werden:&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_M128_EN_SRAM.JPG|EN_SRAM]]&lt;br /&gt;
&lt;br /&gt;
Man trennt von der 1-reihigen Stiftleiste 3 Kontakte ab und lötet sie auf die abgebildeten Lötpunkte. Vorher muss eine Leiterbahn auf der Lötseite der Platine zwischen den ENABLE-Lötpunkten aufgetrennt werden.&lt;br /&gt;
Wenn das SRAM wie bisher genutzt werden soll, steckt man die Codierbrücke auf die Stellung &amp;quot;ENABLE&amp;quot;. Will man stattdessen Port A und Port C frei nutzen (und damit auf SRAM verzichten!), kommt die Codierbrücke auf &amp;quot;DISABLE&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
======USRBUS======&lt;br /&gt;
Auf die 14 Kontakte neben dem Wannenstecker USRBUS2 ist noch nichts gelötet.&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_M128_USRBUS.JPG|thumb|USRBUS]]&lt;br /&gt;
&lt;br /&gt;
Ich würde auf Y1..Y14 eine Stiftleiste löten, damit die USRBUS-Belegung geändert werden kann.&lt;br /&gt;
&lt;br /&gt;
Man braucht dazu:&lt;br /&gt;
* 2-reihige Stiftleiste RM 2,54mm (z.B. 2x36-polig 742007)&lt;br /&gt;
* Einige Steckbuchsen mit Litze&lt;br /&gt;
&lt;br /&gt;
Man trennt von der 2-reihigen Stiftleiste 2x7 Kontakte ab und lötet sie auf die Punkte Y1..Y14 (SP2 E234: Y1..Y14) neben dem Wannenstecker USRBUS2. Wird die M128 über Flachkabel mit einem USRBUS-Stecker auf einer RP6 Experimentierplatine (EP) und/oder mit dem RP6 selbst verbunden, dann hat man mit allen mit dem USRBUS verbundenen Platinen eine direkte 14-polige Verbindung,- eben den &amp;quot;User Bus&amp;quot;. Den kann man dann nutzen, wie man will. Auf der M128 kann man mit Steckbuchsen die Pins Y1..Y14 mit anderen Pins verbinden.&lt;br /&gt;
&lt;br /&gt;
Beispiel: Verbindet man den Pin &amp;quot;ADC4&amp;quot; mit Y1 des USRBUS, dann steht der Eingang ADC4 auf allen an den USRBUS angeschlossenen Platinen an Y1 zur Verfügung. Man braucht also diesen Eingang nicht über ein eigenes Kabel auf eine EP zu führen, sondern kann dazu den USRBUS nehmen. Dadurch bleibt der Gesamtaufbau auf dem RP6 übersichtlich und komplett trennbar (man braucht nur die Stecker XBUS und USRBUS abzuziehen!).&lt;br /&gt;
&lt;br /&gt;
Wichtig: Man sollte gut dokumentieren, wie man den USRBUS am RP6 (vorn und hinten getrennt!), auf EPs und der M128 benutzt! Sonst kann es bei einer anderen Anordnung von EPs zu USRBUS Konflikten/Kurzschlüssen kommen.&lt;br /&gt;
&lt;br /&gt;
======IC5 ALERT======&lt;br /&gt;
[[Bild:RP6_M128_IC5_ALERT.JPG|thumb|IC5 ALERT]]&lt;br /&gt;
Dieser Lötpunkt (SP2 C2: AL) neben IC5 ist der Anschluß ALERT (Pin 3) des I2C-Temperatursensors TCN75A (SP2 C2: IC5).&lt;br /&gt;
&lt;br /&gt;
Dies ist ein Open-Drain Ausgang, der ein Alarm-Signal ausgibt, wenn die Temperatur die eingestellten Grenzen über-/unterschreitet (siehe auch Datenblatt des Sensors (TCN75A.pdf), Abschnitt 5.3.4!). Wenn man ALERT auf einen Eingang des Microcontrollers führen will, muß man auch noch einen Pullup-Widerstand vorsehen oder den internen Pullup des uC-Eingangs aktivieren.&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;
======VDD/GND Anschluß======&lt;br /&gt;
[[Bild:RP6_M128_VDDGND.JPG|thumb|VDD GND]]&lt;br /&gt;
Auf der CCPRO M128 gibt es 2 Lötpunkte (SP1 E34: YVDD3, YGND4) zwischen R5 und C7 bzw. direkt neben der Codierbrücke (SP1 E3: YL9, YL10) zum Deaktivieren von LED5.&lt;br /&gt;
&lt;br /&gt;
Hier könnte man VDD und GND kontaktieren. VDD ist der Lötpunkt, der näher an R5 liegt.&lt;br /&gt;
&lt;br /&gt;
=====Trennstellen=====&lt;br /&gt;
An diesen Stellen können Leiterbahnen unterbrochen werden, um Funktionen zu deaktivieren oder anders zu nutzen. &lt;br /&gt;
&lt;br /&gt;
======A16-/PD4-Nutzung======&lt;br /&gt;
&lt;br /&gt;
[[Bild:v2RP6_M128_A16.JPG|thumb|A16/PD4]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Auf der CCPRO M128 gibt es ein 3-poliges Feld von Lötpunkten (SP2 AB1: PD4, A16, GND) unter dem CCPRO MEGA128 Modul (IC1). Standardmässig ist A16 des SRAM (IC3) hier auf GND gelegt. Damit kann man PD4 des Prozessors (ICP1) frei nutzen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Will man A16 des SRAM mit PD4 schaltbar machen, muss man eine Leiterbahn auf der Bestückungsseite zwischen den oberen zwei der drei Lötpunkte auftrennen und die anderen (unteren) beiden Lötpunkte mit etwas Lötzinn oder einem SMD Null Ohm Widerstand verbinden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der Sinn dieses Umbaus besteht darin, dass man danach anstelle von 64kB nun die vollen 128kB SRAM des IC3 adressieren kann. Man muss dann aber PD4 selbst schalten, da C-Control PRO ab Version 1.50 nur 64kB ext. SRAM ansteuern kann. Immerhin könnte man dann 2 Blöcke à je 64kB nutzen und mit PD4 zwischen beiden Blöcken umschalten.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ob CCPRO damit klar kommt: Wohl kaum! Ich würde daher diesen Umbau nicht durchführen.&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Zubehör und Ersatzteile ==&lt;br /&gt;
Von [http://www.conrad.de/ce/ CONRAD] gibt es z.B. &lt;br /&gt;
&lt;br /&gt;
* das LC- ([http://www.conrad.de/ce/de/product/190911/LC-DISPLAY-16-X-2-KONFEKTIONIERT 190911] AUSVERKAUFT!) oder Backlight-Display ([http://www.conrad.de/ce/de/product/191621/DISPLAY-RP5RP6-BLAU-MIT-BACKLIGHT 191621] AUSVERKAUFT!), welche an die M32, an die CCPRO M128 und an die M256 WiFi angeschlossen werden können,&lt;br /&gt;
* einen IR-Ball ([http://www.conrad.de/ce/de/product/191437/INFRAROT-BALL-FUeR-ROBOTER-FUssBALL 191437] AUSVERKAUFT!),&lt;br /&gt;
* einen Graustufen-Boden-Sensor ([http://www.conrad.de/ce/de/product/191599/GRAUSTUFEN-BODEN-SENSOR-FUeR-FUssBALLROBOT 191599] AUSVERKAUFT!),&lt;br /&gt;
* eine IR-Fernbedienung Promo 8 ([http://www.conrad.de/ce/de/product/340720/PROMO-8-UNIVERSALFERNBEDIENUNG 340720] AUSVERKAUFT!) oder Vivanco UR 89 ([http://www.conrad.de/ce/de/product/351013/VivancoUR-89-Fernbedienung-8-Geraete 351013] AUSVERKAUFT!),&lt;br /&gt;
* Ersatzräder ([http://www.conrad.de/ce/de/product/191307/ANTRIEBSRAD-RP5RP6 191307] AUSVERKAUFT!),&lt;br /&gt;
* Ersatzzahnräder ([http://www.conrad.de/ce/de/product/191346/SCHRAeG-ZAHNRAeDERSATZ-RP5RP6 191346]) und&lt;br /&gt;
* Ersatzraupen ([http://www.conrad.de/ce/de/product/191333/RAUPENSATZ-RP5RP6 191333] AUSVERKAUFT!).&lt;br /&gt;
&lt;br /&gt;
===Displays===&lt;br /&gt;
Die vorkonfektionierten Displays kann man zum Ausgeben von Texten, Sensordaten und kleinen Animationen benutzen. Sie können an die M32, an die CCPRO M128 und an die M256 WiFi angeschlossen werden.&lt;br /&gt;
&lt;br /&gt;
Diese 16x2 Zeichen Displays sind bisher lieferbar:&lt;br /&gt;
&lt;br /&gt;
* LC-Display ([http://www.conrad.de/ce/de/product/190911/LC-DISPLAY-16-X-2-KONFEKTIONIERT 190911])&lt;br /&gt;
* OLED-Display (197622)&lt;br /&gt;
* Backlight-Display AREXX RP-DSP88 ([http://www.conrad.de/ce/de/product/191621/DISPLAY-RP5RP6-BLAU-MIT-BACKLIGHT 191621])&lt;br /&gt;
&lt;br /&gt;
Das LCD ist seit September 2018 bei CONRAD ausverkauft; zeitweise (2007/08) gab es unter dieser Bestellnummer eine Version, die zu klein (66 x 37mm) war, um sie auf der M32, der CCPRO M128 oder der M256 WiFi zu montieren.&lt;br /&gt;
&lt;br /&gt;
Das OLED-Display ist aktuell (April 2012) nicht mehr lieferbar.&lt;br /&gt;
&lt;br /&gt;
Das zuletzt ausschließlich nur noch erhältliche blaufarbige Backlight-Display ist seit Mai 2020 bei CONRAD ausverkauft.&lt;br /&gt;
&lt;br /&gt;
Diese Displays können mit 4 M3-Abstandbolzen 25 mm ([http://www.conrad.de/ce/de/product/526665/Abstandsbolzen1-x-Aussengewinde1-x-InnengewindeMessing-vernickelt-Schluesselweite-55-mm Bestell-Nr. 526665]) und 4 Muttern M3 ([http://www.conrad.de/ce/de/product/815624/TOOLCRAFT-Sechskant-Muttern-DIN-934-934-Stahl-verzinkt-M3-100-St z.B. aus 815624]), sowie 4 Schrauben M3 ([http://www.conrad.de/ce/de/product/815322/TOOLCRAFT-Linsenkopfschrauben-mit-Kreuzschlitz-DIN-7985-7985-6-mm-Stahl-verzinkt-Guete-48-M3-100-St z.B. aus 815322]) auf der M32, der CCPRO M128 oder der M256 WiFi befestigt werden. Leider sind die Befestigungslöcher der Displays zu klein für ein M3-Gewinde, so dass man die Löcher sehr vorsichtig auf 3..3,2 mm erweitern muss.&lt;br /&gt;
&lt;br /&gt;
===IR-Ball===&lt;br /&gt;
Den IR-Ball (AREXX IRB-35, AUSVERKAUFT!) kann man benutzen, um mit dem RP6 Fußball oder Ähnliches zu spielen. Der Ball kann dann von den IR-Sensoren des RP6 erkannt und geortet werden.&lt;br /&gt;
&lt;br /&gt;
===Graustufen-Boden-Sensor===&lt;br /&gt;
Der Graustufen-Boden-Sensor (AREXX ARX-GS7) dient zur Orientierung eines Roboters auf einem Fußballfeld, das in bestimmten Grauabstufungen eingefärbt ist (CONRAD 191404  AUSVERKAUFT!). Dieser Fußballfeld-Aufkleber (AREXX ARX-FF008) ist auch bei [http://www.elv.de ELV] (Artikel-Nummer 68-101831) ausverkauft.&lt;br /&gt;
&lt;br /&gt;
===IR-Fernbedienung===&lt;br /&gt;
[[Bild:RP6_RC.jpg|thumb|2 RC5 Fernbedienungen]]&lt;br /&gt;
Mit einer Universal-IR-Fernbedienung, die den RC5-IR-Code senden kann, kann der RP6 wie ein ferngesteuertes &amp;quot;Auto&amp;quot; verwendet werden. Im Beispielprogramm &amp;quot;Example_08_TV_REMOTE&amp;quot; im Ordner der RP6-Base-Demos wird das noch genauer erläutert.&lt;br /&gt;
&lt;br /&gt;
===Ersatzräder===&lt;br /&gt;
Die Ersatzräder dienen als Ersatzteile für den RP6, RP6v2 und das RP5/RP6-Fahrgestell.&lt;br /&gt;
&lt;br /&gt;
===Ersatzzahnräder===&lt;br /&gt;
Die Ersatzzahnräder dienen als Ersatzteile für den RP6, RP6v2 und das RP5/RP6-Fahrgestell.&lt;br /&gt;
&lt;br /&gt;
===Ersatzraupen===&lt;br /&gt;
Die Ersatzraupen dienen als Ersatzteile für den RP6, RP6v2 und das RP5/RP6-Fahrgestell.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Programmierung==&lt;br /&gt;
Um diesen Grundlagenartikel zum RP6 nicht immer länger werden zu lassen, habe ich den Teil zur Programmierung des [[RP6_-_Programmierung#RP6_Base_und_CONTROL_M32|RP6]] und seiner Erweiterungsplatinen [[RP6_-_Programmierung#RP6_Base_und_CONTROL_M32|RP6 CONTROL M32]] und [[RP6_-_Programmierung#RP6_CCPRO_M128|RP6 CCPRO M128]] ausgelagert: [[RP6 - Programmierung]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==RP6v2==&lt;br /&gt;
Der neue [http://www.conrad.de/ce/de/product/191584/RP6-V2-ROBOTERSYSTEM RP6v2] ist weitgehend identisch mit dem RP6, so dass fast alle Angaben dieses Artikels auch für den RP6v2 zutreffen.&lt;br /&gt;
Für vom RP6 abweichende Details des RP6v2 und für dessen zukünftige Erweiterungsplatinen (z.B. das aktuell [http://www.arexx.com/forum/viewtopic.php?f=19&amp;amp;t=1797 hier] angekündigte Erweiterung-Modul [[RP6v2#RP6v2_M256_WiFi_Platine|RP6v2 M256 WiFi]]) gibt es einen eigenen Grundlagenartikel: [[RP6v2]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==RP6 Sensor Board und Xtra Module==&lt;br /&gt;
Einen eigenen Artikel gibt es auch für das [[RP6_Sensor_Board_und_Xtra_Module#RP6_Sensor_Board_2|RP6 Sensor Board]] und für die [[RP6_Sensor_Board_und_Xtra_Module#RP6_Xtra_Module_2|Xtra Module]]: [[RP6_Sensor_Board_und_Xtra_Module|RP6 Sensor Board und Xtra Module]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Erfahrungsberichte==&lt;br /&gt;
&lt;br /&gt;
...in Arbeit...(kann aber gerne ergänzt werden)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Siehe auch==&lt;br /&gt;
* [[RP6 - Programmierung]]&lt;br /&gt;
* [[RP6v2]]&lt;br /&gt;
* [[RP6_Sensor_Board_und_Xtra_Module]]&lt;br /&gt;
* [[RP6_Kamera_-_Mitmach-Projekt]]&lt;br /&gt;
* [[RP6v2_I2C-Portexpander]]&lt;br /&gt;
* [[RP6v2 USB-RS232-Adapter]]&lt;br /&gt;
* [[RP6v2 Orientierung]]&lt;br /&gt;
* [[RP6 Multi IO Projekt]]&lt;br /&gt;
* [[RP6 Multi IO Projekt - Software]]&lt;br /&gt;
* [[RP6 ArduIO]]&lt;br /&gt;
* [[RP6 ArduIO - Software]]&lt;br /&gt;
* [[Induktive_Ladestation_f%C3%BCr_den_RP6|Induktive Ladestation für den RP6]]&lt;br /&gt;
* [[IR-bake_f%C3%BCr_den_RP6|IR-bake für den RP6]]&lt;br /&gt;
* [[CCRP5]]&lt;br /&gt;
* [[Wild Thumper]]&lt;br /&gt;
* [[Wild Thumper - Programmierung]]&lt;br /&gt;
* [[Yeti]]&lt;br /&gt;
* [[Asuro]]&lt;br /&gt;
* [[C't-Bot]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Weblinks==&lt;br /&gt;
'''Siehe auch die Weblinks im [http://www.rn-wissen.de/index.php/RP6v2#Weblinks RP6v2 Artikel]!'''&lt;br /&gt;
&lt;br /&gt;
* [http://www.pcwelt.de/start/gaming_fun/gadgets/news/84558/ PC-Welt-Artikel]&lt;br /&gt;
&lt;br /&gt;
* Ankündigung des RP6 und der RP6 CONTROL M32 im [http://www.arexx.com/forum/viewtopic.php?t=370 AREXX Support Forum]&lt;br /&gt;
* Ankündigung der RP6 CCPRO M128 im [http://www.arexx.com/forum/viewtopic.php?f=19&amp;amp;t=834&amp;amp;start=0 AREXX Support Forum] und im [http://www.roboternetz.de/community/threads/42228-RP6-C-Control-PRO-MEGA128-Erweiterungsmodul-Website-online RoboterNETZ]&lt;br /&gt;
* Ankündigung des RP6v2 im [http://www.roboternetz.de/community/threads/56964-NEWS-RP6v2-die-neue-Version-2-des-RP6-Robot-Systems RoboterNETZ] und im [http://www.arexx.com/forum/viewtopic.php?f=19&amp;amp;t=1778 AREXX Support Forum]&lt;br /&gt;
* Ankündigung der RP6v2 M256 WiFi im [http://www.arexx.com/forum/viewtopic.php?f=19&amp;amp;t=1797 AREXX Support Forum]&lt;br /&gt;
* [http://www.arexx.com/rp6 AREXX RP6 Startseite]&lt;br /&gt;
* [http://www.arexx.com/forum/viewforum.php?f=19 AREXX Support Forum]&lt;br /&gt;
* [http://www.arexx.com/rp6/html/de/soft_doc_ccpro.htm AREXX CCPRO M128 Seite]&lt;br /&gt;
&lt;br /&gt;
* [http://www.conrad.de/ce/de/product/191524/RP6-ROBOTERSYSTEM RP6 bei CONRAD]&lt;br /&gt;
* [http://www.conrad.de/ce/de/product/191584/RP6-V2-ROBOTERSYSTEM RP6v2 bei CONRAD]&lt;br /&gt;
* [http://www.conrad.de/ce/de/product/191550/RP6-MEGA32-ERWEITERUNGSSATZ RP6 CONTROL M32 bei CONRAD]&lt;br /&gt;
* [http://www.conrad.de/ce/de/product/191563/RP6-CC-PRO-MEGA128-ERWEITERUNGSSATZ RP6 CCPRO M128 bei CONRAD]&lt;br /&gt;
* [http://www.c-control.de/c-control-pro/c-control-pro/startseite_c-control-pro.html C-Control PRO Startseite]&lt;br /&gt;
* [http://ccpro.cc2net.de/forum/ C-Control PRO Forum]&lt;br /&gt;
&lt;br /&gt;
* [http://www.roboternetz.de/phpBB2/viewforum.php?f=49 Roboternetz RP6 Forum]&lt;br /&gt;
* &amp;quot;Geburt&amp;quot; des Wiki im RN-Forum: [http://www.roboternetz.de/community/threads/32793-RP6-Wiki-Artikel RP6-Wiki-Artikel]&lt;br /&gt;
* Henkessoft: [http://www.henkessoft.de/Roboter/rp6.htm RP6]&lt;br /&gt;
* PIC-PROJEKTE Wiki: [http://pic-projekte.de/wiki/index.php?title=RP6  RP6]&lt;br /&gt;
* benhup.com: [http://www.benhup.com/?mf=eduntech&amp;amp;sf=rp6 Arexx RP6 Robot (with ATmega32 chip)]&lt;br /&gt;
* RP6 &amp;quot;Panzer&amp;quot;: [http://www.roboternetz.de/community/threads/57171-mein-(Heng-Long)-RP6 Heng-Long-RP6]&lt;br /&gt;
&lt;br /&gt;
* [http://www.youtube.com/results?search_query=rp6 RP6 Videos]&lt;br /&gt;
* [http://de-de.facebook.com/pages/Robby-RP6/155118711202285 facebook]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Robotikeinstieg]]	 &lt;br /&gt;
[[Kategorie:Praxis]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Autoren==&lt;br /&gt;
--[http://www.roboternetz.de/community/members/24729-sloti sloti] 22:23, 29. Dez 2007 (CET)&lt;br /&gt;
&lt;br /&gt;
--[http://www.roboternetz.de/community/members/44891-Tobias1 Tobias1] 18:30, 6. Apr 2010 (CET)&lt;br /&gt;
&lt;br /&gt;
--[http://www.roboternetz.de/community/members/1972-Dirk Dirk] 11:31, 31. Mär 2022 (CET)&lt;/div&gt;</summary>
		<author><name>Dirk NO2</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=RP6&amp;diff=28590</id>
		<title>RP6</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=RP6&amp;diff=28590"/>
				<updated>2022-03-31T13:48:25Z</updated>
		
		<summary type="html">&lt;p&gt;Dirk NO2: /* Beschreibung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Bild:RP6_2.jpg|RP6 Base Roboter|right|500px]]&lt;br /&gt;
==Was bisher geschah==&lt;br /&gt;
Fre, 08. Jun 2007 - Ankündigung des RP6 und der RP6 CONTROL M32&amp;lt;br/&amp;gt;&lt;br /&gt;
Mon, 02. Jul 2007 23:00 - Benachrichtigung der Tester&amp;lt;br/&amp;gt;&lt;br /&gt;
Die, 03. Jul 2007 15:00 - Bereitstellung der Dokumentation&amp;lt;br/&amp;gt;&lt;br /&gt;
Don, 05. Jul 2007 14:30 - Bereitstellung der Schaltungsunterlagen&amp;lt;br/&amp;gt;&lt;br /&gt;
Son, 08. Jul 2007 16:00 - Nachricht über den Versand der RP6&amp;lt;br/&amp;gt;&lt;br /&gt;
Mon, 09. Jul 2007 00:15 - Bereitstellung der Library und der Beispielprogramme&amp;lt;br/&amp;gt;&lt;br /&gt;
Die, 10. Jul 2007 - Eintreffen der RP6 bei den Testern&amp;lt;br/&amp;gt;&lt;br /&gt;
Mon, 16. Jul 2007 - Auslieferungsbeginn des RP6&amp;lt;br/&amp;gt;&lt;br /&gt;
Fre, 24. Apr 2009 - Ankündigung der RP6 CCPRO M128 (Auslieferung schon ab Mitte April 2009)&amp;lt;br/&amp;gt;&lt;br /&gt;
Mon, 27. Feb 2012 - Ankündigung des RP6v2&amp;lt;br/&amp;gt;&lt;br /&gt;
Don, 08. Mär 2012 - Auslieferungsbeginn des RP6v2&amp;lt;br/&amp;gt;&lt;br /&gt;
Sam, 17. Mär 2012 - Ankündigung der RP6v2 M256 WiFi&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Siehe auch &amp;quot;Was bisher geschah&amp;quot; im [http://www.rn-wissen.de/index.php/RP6v2#Was_bisher_geschah RP6v2 Artikel]!'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Allgemein==  &lt;br /&gt;
[[Bild:DSC03448.JPG|thumb|RP6 mit Erweiterungsboard]] [[Bild:RP6_Lieferumfang.jpg|thumb|RP6 im Lieferumfang]]&lt;br /&gt;
Der von Arexx entwickelte RP6 ([http://www.conrad.de/ce/de/product/191524/C-Control-Robot-System-RP6-Robotersystem 191524]) ist ein autonomes Raupenfahrzeug, das nicht nur für Schüler und Studenten zum Einstieg in das Gebiet Robotik sondern auch für Fortgeschrittene Elektroniker und Bastler sehr gut geeignet ist, da das System für selbstentworfene Erweiterungen ausgelegt ist. Der RP6 wird von einem, unter Roboterentwicklern beliebten, AVR Microcontroller von Atmel gesteuert und hat Lichtsensoren in Form von zwei LDRs, 2 Bumper an der Stoßstange, 6 Status LEDs, Sensoren zur Überwachung der Akkuspannung, Drehgeber mit 625 CPR, ein Infrarot Sensor zur Hinderniserkennung und Kommunikation und Motorstromsensoren zur Verfügung. Zudem liegt dem Roboter eine umfangreiche Anleitung, inklusive einem kleinen C-Crashkurs, ein USB-Interface zum Anschluss an den PC und ein USB Kabel bei.&lt;br /&gt;
&lt;br /&gt;
In diesem Artikel geht es um die Grundlagen des RP6. Zur Programmierung des RP6 gibt es eine eigene Seite: [[RP6 - Programmierung]]&lt;br /&gt;
&lt;br /&gt;
==Technische Daten==&lt;br /&gt;
{|  {{Blauetabelle}} &lt;br /&gt;
|'''Mikrocontroller:'''&lt;br /&gt;
|AVR [[ATmega32]]&lt;br /&gt;
|-&lt;br /&gt;
|'''Speicher:'''&lt;br /&gt;
|32 kB [[Flash]]-Speicher, davon 1 kB bereits vom Bootloader belegt&amp;lt;br/&amp;gt;&lt;br /&gt;
2 kB RAM&amp;lt;br/&amp;gt; &lt;br /&gt;
1 kB [[EEPROM]]&lt;br /&gt;
|-&lt;br /&gt;
|'''Programmierung:'''&lt;br /&gt;
|Über AVR-[[Bootloader]], belegt ca. 1 kB des Flash-Speichers&lt;br /&gt;
|-&lt;br /&gt;
|'''Vorhandene Sensoren:'''&lt;br /&gt;
|2 [[Sensorarten#Helligkeit|Lichtsensoren (LDR)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
1 [[Sensorarten#Helligkeit|Infrarot (ACS - Anti Collision System)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
2 [[Sensorarten#Bumpers|Bumper]] &amp;lt;br/&amp;gt; &lt;br /&gt;
2 [[Sensorarten#Incremental-Geber|Drehgeber (Encoder)]]&lt;br /&gt;
|-&lt;br /&gt;
|'''Vorhandene Aktoren:'''&lt;br /&gt;
|2 Motoren&amp;lt;br/&amp;gt;&lt;br /&gt;
6 Status-LEDs&amp;lt;br/&amp;gt;&lt;br /&gt;
1 IR-Sender&amp;lt;br/&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|'''Abmessungen:'''&lt;br /&gt;
|(L &amp;amp;times; B &amp;amp;times; H) 172 &amp;amp;times; 128 &amp;amp;times; 50 mm&lt;br /&gt;
|-&lt;br /&gt;
|'''Ausführung:'''&lt;br /&gt;
|Fertig aufgebauter Roboter&lt;br /&gt;
|-&lt;br /&gt;
|'''Stromversorgung:'''&lt;br /&gt;
|6 AA NiMH Akkus&lt;br /&gt;
|-&lt;br /&gt;
|'''Hersteller:'''&lt;br /&gt;
|Arexx Niederlande&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Mechanik==&lt;br /&gt;
===Beschreibung===&lt;br /&gt;
&lt;br /&gt;
===Sensoren===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Encoder====&lt;br /&gt;
&lt;br /&gt;
Die Drehgeber sind an den Getrieben der Motoren zur Drehzahlmessung angebracht. Es handelt sich dabei um Reflexlichtschranken, die auf Codierscheiben mit je 18 weissen und 18 schwarzen Segmenten ausgerichtet sind, also insgesamt 36 Segmente. Diese Codierscheiben sind wiederum an je eines der Zahnräder der beiden Getriebe geklebt worden. Wenn es sich dreht, wandern die einzelnen Segmente an der Reflexlichtschranke vorbei. Die weissen Segmente reflektieren das Infrarotlicht, die schwarzen Segmente nur wenig. Jedes der zwei mittleren Stufenzahnräder des Getriebes hat 50 Zähne auf dem großen, und 12 auf dem kleineren Zahnrad. Die Codierscheiben befinden sich auf dem Zahnrad neben dem Motor, also rechnet man:&lt;br /&gt;
50/12 * 50/12 =17.13/36; 17.13/36 * 36=625&lt;br /&gt;
Daher haben die Encoderscheiben auch Ihre 36 Segmente, denn das gibt eine schöne runde Zahl ohne gebrochenen Anteil. Die Drehgeber erzeugen also 625 Flanken pro Radumdrehung wobei jede Flanke einem Segment entspricht. Bei einem Raddurchmesser von ca. 50mm inkl. Raupenkette, ergibt sich rein rechnerisch ein Radumfang von ca. 157mm was 0.2512mm pro Zählschritt der Drehgeber entspricht. Da sich die Raupenketten aber fast immer etwas in den Untergrund eindrücken (bzw. auch selbst eingedrückt werden) kann man aber von 0.25mm pro Zählschritt ausgehen – meist ist es sogar etwas weniger, z.B. nur 0.24 oder 0.23mm. Das muss man durch abfahren von Teststrecken ermitteln, wie es im Anhang grob beschrieben ist. Sehr genau ist das allerdings durch Radschlupf (bzw. hier müssten wir eigentlich von „Kettenschlupf“ sprechen) und ähnlichen Dingen nicht - vor allem beim Rotieren auf der Stelle. Beim normalen Geradeausfahren ist dieser Fehler klein, aber beim Rotieren kann er schnell sehr große Werte annehmen! Abweichungen muss man evtl. durch weitere Tests ermitteln und mit einkalkulieren. Das ist bei Raupenantrieben leider so – auch bei viel teureren und hochwertigeren Robotern. Dafür hat man aber den Vorteil, dass der Roboter mit Raupenantrieb recht geländegängig ist im Vergleich zu Robotern mit normalem Differentialantrieb mit zwei Antriebsrädern und Stützrad. Kleinere Hindernisse und Rampen kann er meist problemlos überwinden.&lt;br /&gt;
Dabei sind die Encoder sehr nützlich, denn man kann die Geschwindigkeit gut einregeln, egal wie der Untergrund und die Motorbelastung gerade aussieht. Bei gemessenen 50 Segmenten pro Sekunde liegt die Geschwindigkeit bei 1.25 cm/s, sofern wir von 0.25mm pro Zählschritt ausgehen. Etwa 50 Segmente pro Sekunde ist auch die geringste gerade noch regelbare Geschwindigkeit (das variiert aber etwas von Roboter zu Roboter). Bei 1200 Segmenten pro Sekunde wären es die maximal möglichen 30 cm/s (bei 0.25mm Auflösung, bei 0.23 sind es 27.6 cm/s). Standardmäßig begrenzt die Funktionsbibliothek das aber auf 1000 Flanken pro Sekunde. Die maximale Geschwindigkeit ist vom Ladezustand der Akkus abhängig – daher wären 30cm/s nicht besonders lange haltbar. Außerdem erhöht sich die Lebensdauer der Getriebe und Motoren je langsamer man fährt! Wenn der Roboter 4000 Segmente gezählt hat, ist er übrigens etwa einen Meter weit gefahren. Aber wie schon gesagt, gilt das natürlich nur für genau 0.25mm Auflösung. Ohne Kalibrierung hat man hier immer mehr oder weniger starke Abweichungen. Wem es nicht auf jeden mm ankommt, braucht nichts zu kalibrieren und kann einfach von 0.25mm oder besser 0.24mm ausgehen!&lt;br /&gt;
&lt;br /&gt;
====Stoßstangensensoren====&lt;br /&gt;
&lt;br /&gt;
Vorn am Roboter sind zwei Mikroschalter mit langem Schalthebel auf einer separaten&lt;br /&gt;
Platine untergebracht, die etwas vor der anderen Sensorplatine liegt. Dadurch werden&lt;br /&gt;
die IR LEDs auf der Sensorplatine geschützt und können nicht so leicht verbiegen&lt;br /&gt;
wenn der Roboter mal gegen ein Hindernis fährt. Die Stoßstange kann man auch abmontieren und z.B. gegen eine Schuss- oder Sammelvorrichtung für Bälle o.ä. ersetzen wenn man möchte.&lt;br /&gt;
&lt;br /&gt;
====Lichtsensoren====&lt;br /&gt;
&lt;br /&gt;
Vorne auf der kleinen Sensorplatine des Roboters sind zwei sog.&lt;br /&gt;
LDRs (=&amp;quot;Light Dependant Resistors&amp;quot; also lichtabhängige Widerstände)&lt;br /&gt;
platziert und nach links bzw. rechts ausgerichtet. Zwischen&lt;br /&gt;
den beiden Sensoren ist noch eine kleine schwarze&lt;br /&gt;
„Trennwand“ damit das Licht aus einer Richtung möglichst nur&lt;br /&gt;
einen der Sensoren erreicht. Sie bilden zusammen mit je einem&lt;br /&gt;
normalen Widerstand wie beim Batteriesensor einen Spannungsteiler – hier allerdings&lt;br /&gt;
um das Umgebungslicht zu messen.&lt;br /&gt;
&lt;br /&gt;
====Anti Collision System====&lt;br /&gt;
&lt;br /&gt;
Der aus Softwaresicht komplexeste Sensor des RP6 ist das ACS - das&lt;br /&gt;
„Anti Collision System“ (engl. für Anti Kollisions System)! Es besteht&lt;br /&gt;
aus einem IR Empfänger (s. Abb.) und zwei vorne auf der Sensorplatine&lt;br /&gt;
links und rechts angebrachten IR LEDs.&lt;br /&gt;
Da es je eine IR LED links und rechts gibt, kann das ACS grob unterscheiden ob sich&lt;br /&gt;
das Objekt links, rechts oder mittig vor dem Roboter befindet.&lt;br /&gt;
Man kann zusätzlich noch die Stromstärke mit der die beiden IR LEDs gepulst werden&lt;br /&gt;
in drei Stufen einstellen. Das ACS funktioniert aber auch in der höchsten Stufe nicht&lt;br /&gt;
mit allen Objekten immer zuverlässig, denn es kommt auf die Beschaffenheit der&lt;br /&gt;
Oberfläche des jeweiligen Objekts an! Ein schwarzes Objekt reflektiert das IR Licht natürlich&lt;br /&gt;
viel schlechter als ein weisses Objekt und ein kantiges und spiegelndes Objekt&lt;br /&gt;
könnte das IR Licht hauptsächlich in eine bestimme Richtung reflektieren. Die Reichweite&lt;br /&gt;
ist also immer vom jeweiligen Objekt abhängig! Das ist eine prinzipielle Schwäche&lt;br /&gt;
von so gut wie allen IR Sensoren (jedenfalls in dieser Preisklasse).&lt;br /&gt;
Trotzdem werden die meisten Hindernisse zuverlässig erkannt und können umfahren&lt;br /&gt;
werden. Falls das mal nicht klappt, gibt es noch die Stoßstange mit den Tastsensoren&lt;br /&gt;
und falls auch die nicht richtig getroffen werden, kann der Roboter noch mit den Motorstromsensoren&lt;br /&gt;
oder den Encodern erkennen, ob die Motoren blockieren (s.u.)!&lt;br /&gt;
Wem das nicht reicht, der könnte zusätzlich z.B. noch Ultraschallsensoren anbringen...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Erweiterungssystem===&lt;br /&gt;
Auf dem Mainboard sind 22 freie 3,2mm Löcher vorhanden (im Chassis weitere 16), auf denen die Erweiterungsmodule symmetrisch vorne und hinten gestapelt werden können. Weil der Stromverbrauch durch mehr Module steigt, ist es sinnvoll nur insgesamt 6-8 Module auf dem Roboter zu stapeln. Auf dem Mainboard selbst sind noch 6 kleine Erweiterungsflächen verfügbar (plus 2 sehr kleine auf der Bumperplatine).&lt;br /&gt;
&lt;br /&gt;
===Antrieb===&lt;br /&gt;
&lt;br /&gt;
Die 7,2 VDC Motoren sind im Chassis eingebaut und werden mithilfe der H-Brücken gesteuert. Die maximale Geschwindigkeit liegt bei 25cm/s, das kann je nach Akkuspannung aber variieren. Ohne Softwarebegrenzung sind sogar 30cm/s möglich, dadurch verringert sich aber die Lebensdauer der Motoren. Die maximale Steigung, die der RP6 bewältigen kann, ist 30%, ohne Bumperplatine 40%, das hängt aber auch vom Untergrund ab. Kleine Hindernisse wie Bücher und Stifte kann der RP6 problemlos überqueren. Die Achsen der Räder sind in selbstschmierenden Sinterlagern mit 4mm Durchmesser gelagert.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Elektromechanik==&lt;br /&gt;
===Beschreibung===&lt;br /&gt;
===Odometrie===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Elektronik==&lt;br /&gt;
[[Bild:RP6 Block.jpg|thumb|Blockdiagramm]]&lt;br /&gt;
===Beschreibung===&lt;br /&gt;
&lt;br /&gt;
===Sensoren (SENSORS)===&lt;br /&gt;
&lt;br /&gt;
Die meisten Sensoren über die der Roboter verfügt, haben wir ja schon in anderen Abschnitten kurz genannt, wollen diese nun aber etwas detaillierter betrachten.&lt;br /&gt;
In dem Blockdiagramm sind einige der Sensoren nicht in dem blauen Bereich &amp;quot;Sensors&amp;quot; zu sehen, weil sie besser in andere Bereiche passen. Trotzdem zählen natürlich auch die Drehgeber (= “Encoder“), Motorstromsensoren und der Batteriespannungssensor zu den Sensoren und werden darum in diesem Abschnitt beschrieben!&lt;br /&gt;
&lt;br /&gt;
====Batteriespannungs-Sensor (Voltage Sensor)====&lt;br /&gt;
&lt;br /&gt;
Dieser &amp;quot;Sensor&amp;quot; ist eigentlich nur ein einfacher Spannungsteiler aus zwei Widerständen. Wir gehen davon aus, dass die Batterien insgesamt maximal 10V liefern können. 6 NiMH Akkus werden immer unterhalb davon bleiben. Die Referenzspannung des ADC, also die Spannung mit der er die gemessene Spannung vergleicht, beträgt 5V. Da auch die Betriebsspannung 5V beträgt, darf diese nicht überschritten werden. Also müssen wir die zu messende Spannung um die Hälfte herabsetzen! Dies geschieht über einen Spannungsteiler aus zwei Widerständen, der die Spannung an den Messbereich des ADCs anpasst. Der ADC löst mit 10 Bit auf (Wertebereich 0 bis 1023), was eine Auflösung von 10V/1024=9.765625mV ergibt. Ein Messwert von 512 entspricht hier also 5V und 1023 wären ungefähr 10V! Diese Grenzwerte sollten aber normalerweise nie erreicht werden! Das ist nicht besonders genau, da die Widerstände keineswegs Präzisionswiderstände sind. Abweichungen von einigen Prozent nach oben und unten sind möglich. Auch die Referenzspannung von 5V ist nicht ganz genau und kann bei normaler Belastung etwas variieren. Das stört hier nicht, denn wir brauchen ohnehin nur einen ungefähren Wert um festzustellen ob die Batterien sich langsam dem Ende nähern. Wer die Spannung genau messen will, braucht ein Multimeter um den Messfehler zu ermitteln und diesen dann in Software auszugleichen. Wenn man mit Fehlern leben kann, kann man die Spannung dank des günstigen Umrechnungsverhältnisses sogar direkt aus den ADC Werten ungefähr abschätzen: 720 entsprechen dann grob 7.2V, 700 etwa 7V und 650 wären etwa 6.5V. Bei einem konstanten Wert unter 560 kann man davon ausgehen, dass die Akkus fast leer sind.&lt;br /&gt;
&lt;br /&gt;
====Motorstrom====&lt;br /&gt;
[[Bild:RP6_MSS.jpg|thumb]]&lt;br /&gt;
Es befinden sich zwei Leistungswiderstände in den beiden Motorstromkreisen. Aus dem Ohm'schen Gesetz U=RxI folgt, dass sich die Spannung die an einem bestimmten Widerstand abfällt, proportional zum Strom verhält, der diesen durchfließt!&lt;br /&gt;
Damit die Spannungsabfälle an den Widerständen nicht zu groß werden, müssen die Widerstände klein gewählt werden. In unserem Fall haben Sie einen Wert von 0.1 Ohm&lt;br /&gt;
Die abfallende Spannung ist also nur sehr klein (0.1V bei einem Strom von 1A) und muss verstärkt werden bevor sie mit dem ADC gemessen werden kann. Das erledigt jeweils ein sog. Operationsverstärker (OPV). In der Schaltung des RP6 wird je Motorkanal ein OPV verwendet. Der Messbereich geht etwa bis 1.8A. Bei 1.8A fallen etwa 0.18V am Widerstand ab und es ergibt sich am Ausgang des OPV eine Spannung von etwa 4V. Mehr kann der verwendete OPV bei 5V Betriebsspannung nicht ausgeben:&lt;br /&gt;
&lt;br /&gt;
I = U / ((1 + (100k / 4,7k)) * 0,1)&lt;br /&gt;
&lt;br /&gt;
Die Leistungswiderstände haben eine Toleranz von 10%, die Widerstände am OPV 5%, also ist das alles nur sehr ungenau (Ungenauigkeiten im Bereich von etwa 270mA sind möglich wenn man die Sensoren nicht kalibriert!). Wir brauchen allerdings auch nur den ungefähren Wert um festzustellen ob die Motoren stark oder wenig belastet werden. So kann der Roboter gut blockierte oder gar defekte Motoren bzw. Drehgeber erkennen! Die DC-Motoren benötigen mehr Strom je stärker sie belastet werden (Drehmoment) und somit steigt der Strom sehr stark an wenn die Motoren blockiert sind. Das wird von der Robotersoftware zur Notabschaltung verwendet: wenn die Motoren dauerhaft mit hohem Strom betrieben würden, könnten diese sehr heiß werden und dadurch Schaden nehmen! Und wenn die Encoder mal ausfallen sollten – aus welchem Grund auch immer – kann auch das damit erkannt werden. Man würde dann eine Drehzahl von 0 messen. Lässt man die Motoren aber auf voller Kraft laufen und der Strom bleibt trotzdem klein (also sind die Ketten nicht blockiert!), kann man genau daraus schließen, dass entweder die Encoder, oder die Motoren ausgefallen sind (oder Encoder und Motorstromsensoren nicht funktionieren... das passiert z.B. wenn man vergessen hat diese vorher per Software einzuschalten).&lt;br /&gt;
&lt;br /&gt;
====Encoder====&lt;br /&gt;
[[Bild:RP6_ENCODER.jpg|thumb]]&lt;br /&gt;
Ganz anders als die letztgenannten Sensoren funktionieren die Drehgeber, die an den Getrieben der Motoren zur Drehzahlmessung angebracht sind. Es handelt sich dabei um Reflexlichtschranken, die auf Codierscheiben mit je 18 weissen und 18 schwarzen Segmenten ausgerichtet sind, also insgesamt 36 Segmente (s. Abb). Diese Codierscheiben sind wiederum an je eines der Zahnräder der beiden Getriebe geklebt worden. Wenn es sich dreht, wandern die einzelnen Segmente an der Reflexlichtschranke vorbei. Die weissen Segmente reflektieren das Infrarotlicht, die schwarzen Segmente nur wenig. Die Drehgeber erzeugen so zwar auch wie die anderen Sensoren ein analoges Signal, aber es wird digital interpretiert. Zunächst wird das Signal verstärkt und anschließend über einen sog. Schmitt Trigger in ein Rechtecksignal umgewandelt. Die Flanken dieses Signals, also die Wechsel von 5 auf 0V und umgekehrt, lösen jeweils ein Interrupt Ereignis aus und diese werden dann von der Software gezählt. So kann die zurückgelegte Wegstrecke gemessen und zusammen mit einem Timer zur Zeitmessung die Drehzahl und damit auch die Geschwindigkeit ermittelt werden. Die Ermittlung der Drehzahl ist auch Hauptanwendung der Encoder – nur mit den Encodern kann man die Drehzahl auf den gewünschten Sollwert einregeln. Ohne Regelung wäre die Drehzahl nämlich von der Akkuspannung, Belastung der Motoren usw. abhängig. Die hohe Auflösung ermöglicht es dabei, auch niedrige Geschwindigkeiten noch relativ genau einzuregeln. Jedes der zwei mittleren Stufenzahnräder des Getriebes hat 50 Zähne auf dem großen, und 12 auf dem kleineren Zahnrad (s. Abb). Die Codierscheiben befinden sich auf dem Zahnrad neben dem Motor, also rechnet man:&lt;br /&gt;
&lt;br /&gt;
50/12 * 50/12 =17.13/36; 17.13/36 * 36=625&lt;br /&gt;
&lt;br /&gt;
Daher haben die Encoderscheiben auch Ihre 36 Segmente, denn das gibt eine schöne runde Zahl ohne gebrochenen Anteil. Die Drehgeber erzeugen also 625 Flanken pro Radumdrehung wobei jede Flanke einem Segment entspricht. Bei einem Raddurchmesser von ca. 50mm inkl. Raupenkette, ergibt sich rein rechnerisch ein Radumfang von ca. 157mm was 0.2512mm pro Zählschritt der Drehgeber entspricht. Da sich die Raupenketten aber fast immer etwas in den Untergrund eindrücken (bzw. auch selbst eingedrückt werden) kann man aber von 0.25mm pro Zählschritt ausgehen – meist ist es sogar etwas weniger, z.B. nur 0.24 oder 0.23mm. Das muss man durch abfahren von Teststrecken ermitteln, wie es im Anhang grob beschrieben ist. Sehr genau ist das allerdings durch Radschlupf (bzw. hier müssten wir eigentlich von „Kettenschlupf“ sprechen) und ähnlichen Dingen nicht - vor allem beim Rotieren auf der Stelle. Beim normalen Geradeausfahren ist dieser Fehler klein, aber beim Rotieren kann er schnell sehr große Werte annehmen! Abweichungen muss man evtl. durch weitere Tests ermitteln und mit einkalkulieren. Das ist bei Raupenantrieben leider so – auch bei viel teureren und hochwertigeren Robotern. Dafür hat man aber den Vorteil, dass der Roboter mit Raupenantrieb recht geländegängig ist im Vergleich zu Robotern mit normalem Differentialantrieb mit zwei Antriebsrädern und Stützrad. Kleinere Hindernisse und Rampen kann er meist problemlos überwinden.&lt;br /&gt;
Dabei sind die Encoder sehr nützlich, denn man kann die Geschwindigkeit gut einregeln, egal wie der Untergrund und die Motorbelastung gerade aussieht. Bei gemessenen 50 Segmenten pro Sekunde liegt die Geschwindigkeit bei 1.25 cm/s, sofern wir von 0.25mm pro Zählschritt ausgehen. Etwa 50 Segmente pro Sekunde ist auch die geringste gerade noch regelbare Geschwindigkeit (das variiert aber etwas von Roboter zu Roboter). Bei 1200 Segmenten pro Sekunde wären es die maximal möglichen 30 cm/s (bei 0.25mm Auflösung, bei 0.23 sind es 27.6 cm/s). Standardmäßig begrenzt die Funktionsbibliothek das aber auf 1000 Flanken pro Sekunde. Die maximale Geschwindigkeit ist vom Ladezustand der Akkus abhängig – daher wären 30cm/s nicht besonders lange haltbar. Außerdem erhöht sich die Lebensdauer der Getriebe und Motoren je langsamer man fährt!&lt;br /&gt;
&lt;br /&gt;
=====Encoder justieren=====&lt;br /&gt;
Damit der RP6 die Signale der Drehgeber richtig auswerten kann, muss man evtl. die Drehgeber einmalig justieren. Dies kann auch schon bei einem neu gekauften RP6 notwendig sein.&lt;br /&gt;
Eine genaue Anleitung dazu findet man [http://www.arexx.com/rp6/downloads/RP6_ENCODER_DE_20071219.zip hier]. Es gibt auch ein [http://www.arexx.com/rp6/downloads/rp6_encoder_video.zip Video], das die Drehgeber-Justierung zeigt.&lt;br /&gt;
&lt;br /&gt;
=====Encoder kalibrieren=====&lt;br /&gt;
Wenn der Roboter 4000 Segmente gezählt hat, ist er etwa einen Meter weit gefahren. Aber wie schon gesagt, gilt das natürlich nur für genau 0.25mm Auflösung. Ohne Kalibrierung hat man hier immer mehr oder weniger starke Abweichungen. Wem es nicht auf jeden mm ankommt, braucht nichts zu kalibrieren und kann einfach von 0.25mm oder besser 0.24mm ausgehen!&lt;br /&gt;
Optimal ist es, wenn man sich für Weg- und Winkelmessungen nicht auf die Encoder Daten stützen muss, sondern externe Systeme wie Infrarotbaken oder einen genauen elektronischen Kompass dazu zur Verfügung hat.&lt;br /&gt;
&lt;br /&gt;
Will man die Drehgeber des RP6 dennoch kalibrieren, kann man ihn z.B. mit diesem Testprogramm:&lt;br /&gt;
&amp;lt;pre&amp;gt;#include &amp;quot;RP6RobotBaseLib.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
	initRobotBase();&lt;br /&gt;
	powerON();&lt;br /&gt;
&lt;br /&gt;
	// Test: Go ahead 1m and stop!&lt;br /&gt;
	move (80, FWD, DIST_MM(1000), true);&lt;br /&gt;
	writeString_P(&amp;quot;LEFT RIGHT&amp;quot;);&lt;br /&gt;
 	writeString_P(&amp;quot;\n&amp;quot;);&lt;br /&gt;
 	writeInteger(mleft_dist, DEC);&lt;br /&gt;
	writeChar(' ');&lt;br /&gt;
 	writeInteger(mright_dist, DEC);&lt;br /&gt;
	writeString_P(&amp;quot;\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
	powerOFF();&lt;br /&gt;
&lt;br /&gt;
	return 0;&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
... 1m weit fahren lassen und dann messen, wie weit er tatsächlich gefahren ist. Das Programm gibt auf dem Terminal den Stand der Drehgeber aus. Teilt man dann die gemessene Fahrstrecke in mm durch den Wert der Drehgeber, erhält man die Auflösung. Diesen Wert kann man dann der Konstanten ENCODER_RESOLUTION in der RP6Config.h zuweisen. Nach &amp;quot;Make Clean&amp;quot;, einer Neukompilierung und erneuter Ausführung des Testprogramms müßte der RP6 jetzt genau 1m weit fahren. Das gilt zumindest für den Untergrund, auf dem die Kalibrierung durchgeführt wurde.&lt;br /&gt;
&lt;br /&gt;
====Stoßstangensensoren (Bumper)====&lt;br /&gt;
&lt;br /&gt;
Vorn am Roboter sind zwei Mikroschalter mit langem Schalthebel auf einer separaten&lt;br /&gt;
Platine untergebracht, die etwas vor der anderen Sensorplatine liegt. Dadurch werden&lt;br /&gt;
die IR LEDs auf der Sensorplatine geschützt und können nicht so leicht verbiegen&lt;br /&gt;
wenn der Roboter mal gegen ein Hindernis fährt. Mit den zwei Schaltern kann der Mikrocontroller&lt;br /&gt;
einen solchen Aufprall registrieren und dann beispielsweise zurücksetzen,&lt;br /&gt;
sich etwas drehen und weiterfahren. Die Schalter sind an zwei der Ports die schon mit&lt;br /&gt;
den LEDs verbunden sind angeschlossen und blockieren so keine anderen Ports des&lt;br /&gt;
Mikrocontrollers. Daher leuchten die LEDs auch immer wenn man einen der Schalter&lt;br /&gt;
drückt! Da dies normalerweise relativ selten passiert, stört das aber nicht weiter.&lt;br /&gt;
Die Stoßstange kann man auch abmontieren und z.B. gegen eine Schuss- oder Sammelvorrichtung&lt;br /&gt;
für Bälle o.ä. ersetzen wenn man möchte.&lt;br /&gt;
&lt;br /&gt;
====Lichtsensoren (LDRs)====&lt;br /&gt;
[[Bild:RP6_Licht.jpg|thumb]]&lt;br /&gt;
Vorne auf der kleinen Sensorplatine des Roboters sind zwei sog.&lt;br /&gt;
LDRs (=&amp;quot;Light Dependant Resistors&amp;quot; also lichtabhängige Widerstände)&lt;br /&gt;
platziert und nach links bzw. rechts ausgerichtet. Zwischen&lt;br /&gt;
den beiden Sensoren ist noch eine kleine schwarze&lt;br /&gt;
„Trennwand“ damit das Licht aus einer Richtung möglichst nur&lt;br /&gt;
einen der Sensoren erreicht. Sie bilden zusammen mit je einem&lt;br /&gt;
normalen Widerstand wie beim Batteriesensor einen Spannungsteiler – hier allerdings&lt;br /&gt;
um das Umgebungslicht zu messen. Die 5V Betriebsspannung wird auch geteilt, aber&lt;br /&gt;
hier ist einer der Widerstände variabel! Es wird also das Teilungsverhältnis je nach Intensität&lt;br /&gt;
des Lichteinfalls verändert und somit eine vom Lichteinfall abhängige Spannung&lt;br /&gt;
an einen der A/D Wandler Kanäle geleitet!&lt;br /&gt;
Über den Spannungsunterschied zwischen den beiden Sensoren kann man ermitteln in&lt;br /&gt;
welcher Richtung sich eine bzw. die hellste Lichtquelle vor dem Roboter befindet:&lt;br /&gt;
Links, Rechts oder in der Mitte. Mit einem entsprechenden Programm, kann man so z.B. eine starke Taschenlampe in&lt;br /&gt;
einem abgedunkelten Zimmer verfolgen, oder den Roboter die hellste Stelle in einem&lt;br /&gt;
Raum suchen lassen! Klappt z.B. sehr gut mit einem stärkeren Hand-Halogenscheinwerfer:&lt;br /&gt;
Wenn man damit auf den Boden leuchtet, kann der Roboter dem Lichtfleck auf&lt;br /&gt;
dem Boden folgen.&lt;br /&gt;
Das geht natürlich auch umgekehrt: Der Roboter könnte z.B. auch versuchen sich vor&lt;br /&gt;
hellem Licht zu verstecken...&lt;br /&gt;
Wenn man noch ein oder zwei LDRs hinten am Roboter anbringen würde, könnte man&lt;br /&gt;
das noch verfeinern und die Richtung in der sich Lichtquellen befinden besser bestimmen.&lt;br /&gt;
Der Roboter kann sonst nämlich oft nur schwer unterscheiden ob die Lichtquelle&lt;br /&gt;
vor oder hinter ihm liegt. Zwei der A/D Wandler Kanäle sind noch frei...&lt;br /&gt;
&lt;br /&gt;
====Anti Collision System (ACS)====&lt;br /&gt;
[[Bild:RP6 ACS.jpg|thumb|Das ACS]]&lt;br /&gt;
Der aus Softwaresicht komplexeste Sensor des RP6 ist das ACS - das „Anti Collision System“ (engl. für Anti Kollisions System)! Es besteht aus einem IR Empfänger (s. Abb.) und zwei vorne auf der Sensorplatine links und rechts angebrachten IR LEDs. Die IR LEDs werden direkt vom Mikrocontroller angesteuert. Die Ansteuerungsroutinen können beliebig verändert und verbessert werden! Beim Vorgängermodell war dafür noch ein eigener Controller nötig, dessen Programm aber nicht vom Anwender geändert werden konnte...&lt;br /&gt;
Mit den IR LEDs werden kurze, mit 36kHz modulierte Infrarot Impulse ausgesandt, auf die der darauf ausgelegte IR Empfänger reagiert. Werden die IR Impulse an einem Gegenstand vor dem Roboter reflektiert und vom IR Empfänger detektiert, kann der Mikrocontroller darauf reagieren und z.B. ein Ausweichmanöver einleiten. Damit das ACS nicht zu empfindlich bzw. auf eventuelle Störungen reagiert, wartet die Software bis eine bestimmte Anzahl von Impulsen in einer bestimmten Zeit empfangen worden ist. Es wird auch eine Synchronisation mit dem RC5 Empfang durchgeführt und auf die RC5 Signale von TV/Hifi Fernbedienungen wird so nicht reagiert. Bei anderen Codes kann das aber nicht garantiert werden und das ACS könnte dann Hindernisse erkennen, wo gar keine sind! Da es je eine IR LED links und rechts gibt, kann das ACS grob unterscheiden ob sich das Objekt links, rechts oder mittig vor dem Roboter befindet.&lt;br /&gt;
Man kann zusätzlich noch die Stromstärke mit der die beiden IR LEDs gepulst werden in drei Stufen einstellen. Das ACS funktioniert aber auch in der höchsten Stufe nicht mit allen Objekten immer zuverlässig, denn es kommt auf die Beschaffenheit der Oberfläche des jeweiligen Objekts an! Ein schwarzes Objekt reflektiert das IR Licht natürlich viel schlechter als ein weisses Objekt und ein kantiges und spiegelndes Objekt könnte das IR Licht hauptsächlich in eine bestimme Richtung reflektieren. Die Reichweite ist also immer vom jeweiligen Objekt abhängig! Das ist eine prinzipielle Schwäche von so gut wie allen IR Sensoren (jedenfalls in dieser Preisklasse).&lt;br /&gt;
Trotzdem werden die meisten Hindernisse zuverlässig erkannt und können umfahren werden. Falls das mal nicht klappt, gibt es noch die Stoßstange mit den Tastsensoren und falls auch die nicht richtig getroffen werden, kann der Roboter noch mit den Motorstromsensoren oder den Encodern erkennen, ob die Motoren blockieren (s.u.)!&lt;br /&gt;
Wem das nicht reicht, der könnte zusätzlich z.B. noch Ultraschallsensoren anbringen...&lt;br /&gt;
&lt;br /&gt;
====IR-Kommunikation (IRCOMM)====&lt;br /&gt;
Der RP6 kann über die IR-LEDs links und rechts über der Bumper-Platine Daten zu anderen IR-Empfängern senden.  Es ist z.B. möglich, dass mehrere Roboter ihre Sensorwerte untereinander vergleichen.&lt;br /&gt;
&lt;br /&gt;
====6 Status-LEDs====&lt;br /&gt;
Die Status-LEDs sind vorne links und rechts über den Lichtsensoren auf der Hauptplatine angebracht.&lt;br /&gt;
&lt;br /&gt;
Über die Status-LEDs können Sensorzustände, z.B. des ACS, der Bumper oder der Lichtsensoren, dargestellt werden.&lt;br /&gt;
&lt;br /&gt;
====IR-Sender====&lt;br /&gt;
Über den IR-Sender können Daten zu anderen Geräten übertragen werden.&lt;br /&gt;
&lt;br /&gt;
===Erweiterungssystem (EXPANSION SYSTEM)===&lt;br /&gt;
[[Bild:RP6_EXP.jpg|thumb]]&lt;br /&gt;
Eines der nützlichsten Features des RP6 ist das Erweiterungssystem.&lt;br /&gt;
Man kann den RP6 damit genau so weit ausbauen,&lt;br /&gt;
wie man es benötigt. Aus Kostengründen bietet das&lt;br /&gt;
Basissystem schließlich nur relativ wenig Sensoren. Es sind&lt;br /&gt;
zwar schon mehr als bei vielen anderen Robotern in dieser&lt;br /&gt;
Preisklasse, aber erst mit weiteren Sensoren macht ein Roboter&lt;br /&gt;
so richtig Spaß. Das ACS kann beispielsweise nur grob&lt;br /&gt;
erkennen ob sich ein Hindernis vor dem Roboter befindet.&lt;br /&gt;
Mit Ultraschallsensoren oder besseren zusätzlichen IR Sensoren,&lt;br /&gt;
könnte man aber die Distanz ermitteln und so beispielsweise&lt;br /&gt;
bessere Ausweichmanöver fahren!&lt;br /&gt;
&lt;br /&gt;
Neben Sensoren macht es auch sehr viel Sinn, zusätzliche Controller einzubauen um&lt;br /&gt;
die anfallenden Aufgaben aufteilen zu können. Beispielsweise die RP6 CONTROL M32&lt;br /&gt;
Platine mit einem weiteren MEGA32 Mikrocontroller oder die CCPRO M128.&lt;br /&gt;
&lt;br /&gt;
Das Erweiterungssystem muss natürlich in der Lage sein, viele Erweiterungsmodule&lt;br /&gt;
miteinander zu verbinden, dabei mit wenigen Signalleitungen&lt;br /&gt;
auskommen und eine ausreichend hohe Geschwindigkeit bieten.&lt;br /&gt;
&lt;br /&gt;
Siehe [[I2C]]&lt;br /&gt;
&lt;br /&gt;
===Steuerung (CONTROL SYSTEM)===&lt;br /&gt;
&lt;br /&gt;
====Hauptprozessor (ATMEGA32)====&lt;br /&gt;
[[Bild:RP6_MEGA32.jpg|thumb|Der MEGA32]]&lt;br /&gt;
Der Hauptprozessor ist der ATMEGA32 vom Atmel. Er hat 32KB Flash ROM und 2KB RAM. Der ATMEGA ist mit 8Mhz getaktet, kann also bis zu 8 Millionen Befehle pro Sekunde ausführen. Es sind 32 I/O-Pins  am Controller verfügbar. Die I/O-Pins gehören zu I/O-Ports mit jeweils 8 Pins. Davon gibt es 4: PORTA, PORTB, PORTC und PORTD. Der Controller kann die Ports entweder ein oder ausschalten (Output), oder erkennen, ob Spannung angelegt wurde oder nicht (Input). Es gibt mehrere Module, die verschiedene Aufgaben übernehmen:&lt;br /&gt;
* 3 Timer, einer davon erzeugt die PWM-Signale für die Motoren&lt;br /&gt;
* Die serielle Schnittstelle (UART)&lt;br /&gt;
* Das TWI (Two Wire Interface, also Zweidraht Schnittstelle)&lt;br /&gt;
* Ein ADC (Analog to Digital Converter) mit 8 Eingangskanälen, welche mit 10bit (0-1023) auflösen&lt;br /&gt;
* Drei externe Interrupt Eingänge&lt;br /&gt;
&lt;br /&gt;
Auserdem befindet sich im Microcontroller ein sog. Bootloader, welcher mit dem RP6 Loader kommuniziert und neue Programme in den Speicher lädt.&lt;br /&gt;
&lt;br /&gt;
===Antrieb (DRIVE SYSTEM)===&lt;br /&gt;
[[Bild:RP6_H-Brücke.jpg|thumb|Die H-Brücke]]&lt;br /&gt;
[[Bild:RP6_Tastverhältniss.jpg|thumb]]&lt;br /&gt;
Der Antrieb des RP6 besteht aus zwei Gleichstrom Motoren mit nachgeschaltetem Getriebe,&lt;br /&gt;
über das die beiden Raupenketten angetrieben werden.&lt;br /&gt;
Die Motoren genehmigen sich je nach Belastung&lt;br /&gt;
einen recht hohen Strom und können&lt;br /&gt;
natürlich nicht direkt vom Mikrocontroller&lt;br /&gt;
angesteuert werden. Dazu braucht man&lt;br /&gt;
Leistungstreiber in Form von je einer H-Brücke&lt;br /&gt;
pro Motor. Das grundlegende Prinzip&lt;br /&gt;
ist in der nebenstehenden Abbildung dargestellt.&lt;br /&gt;
Eine H-Brücke besteht aus vier&lt;br /&gt;
&amp;quot;Schaltern&amp;quot;, die in Form eines H's um einen&lt;br /&gt;
Motor angeordnet sind. Nehmen wir mal an,&lt;br /&gt;
zunächst seien alle Schalter aus. Schaltet&lt;br /&gt;
man dann S1 und S4 (Rot) an, liegt eine&lt;br /&gt;
Spannung am Motor an und er dreht sich&lt;br /&gt;
z.B. nach rechts. Schalten wir nun S1 und&lt;br /&gt;
S4 wieder aus und danach S2 und S3 (Grün)&lt;br /&gt;
an, wird die am Motor anliegende Spannung umgepolt und er dreht sich in die entgegen gesetzte&lt;br /&gt;
Richtung, also nach links! Man muss darauf achten, nicht gleichzeitig S1&lt;br /&gt;
und S2, oder S3 und S4 einzuschalten, sonst entstünde ein Kurzschluss und dadurch&lt;br /&gt;
könnten die &amp;quot;Schalter&amp;quot; zerstört werden!&lt;br /&gt;
Natürlich verwenden wir auf dem RP6 keine mechanischen Schalter, sondern sog.&lt;br /&gt;
MOSFETs. Diese schalten beim Anlegen einer genügend hohen Spannung am Eingang&lt;br /&gt;
durch. Die Schaltvorgänge können sehr schnell erfolgen, mehrere Kilohertz sind bei&lt;br /&gt;
unserer Anwendung möglich.&lt;br /&gt;
So kann man also schon mal die Drehrichtung einstellen. Und wie bekommt man den&lt;br /&gt;
Motor nun schneller bzw. langsamer? Ein Elektromotor dreht umso schneller, je höher&lt;br /&gt;
die angelegte Spannung ist. Die Drehzahl kann also über die Spannung eingestellt&lt;br /&gt;
werden - und genau dazu können wir die H-Brücke auch verwenden!&lt;br /&gt;
Die Abbildung verdeutlicht das Prinzip&lt;br /&gt;
nach dem wir vorgehen können.&lt;br /&gt;
Wir erzeugen&lt;br /&gt;
ein Rechtecksignal fester Frequenz,&lt;br /&gt;
bei dem wir das sog. Tastverhältnis&lt;br /&gt;
verändern. Mit &amp;quot;Tastverhältnis&amp;quot; ist das&lt;br /&gt;
Verhältnis von der eingeschalteten zur&lt;br /&gt;
ausgeschalteten Zeit des Signals gemeint.&lt;br /&gt;
Am Motor liegt dann effektiv eine niedrigere,&lt;br /&gt;
mittlere Gleichspannung an, die dem&lt;br /&gt;
Tastverhältnis entspricht. In der Grafik ist&lt;br /&gt;
dies durch eine rote Linie (Ug) und die roten&lt;br /&gt;
Flächen verdeutlicht. Wenn z.B. eine&lt;br /&gt;
Spannung von 7 Volt von den Akkus an&lt;br /&gt;
den Motortreibern anliegt, und diese mit&lt;br /&gt;
einem Tastverhältnis von 50% angesteuert werden, würde die mittlere Spannung in&lt;br /&gt;
etwa bei der Hälfte, also 3.5V liegen! Das stimmt real nicht ganz, aber so kann man&lt;br /&gt;
es sich schon gut und einfach vorstellen.&lt;br /&gt;
Das Antriebssystem ist dank der hohen Untersetzung (~ 1:72) relativ stark und so&lt;br /&gt;
kann der RP6 viel schwerere Lasten tragen als es z.B. der kleine Roboter ASURO&lt;br /&gt;
könnte. Allerdings steigt mit zunehmendem Gewicht natürlich auch der Energiebedarf&lt;br /&gt;
und die Akkus werden schneller leer sein ...&lt;br /&gt;
Im Vergleich mit einem ferngesteuerten Rennwagen o.ä. könnte man denken der RP6&lt;br /&gt;
sei langsam - stimmt auch - das ist jedoch absichtlich so! Der Roboter wird von einem&lt;br /&gt;
Mikrocontroller gesteuert und wenn der Programmierer einen Fehler bei der Programmierung&lt;br /&gt;
gemacht hat, wäre es ungünstig mit 10km/h vor die Wand zu prallen! Bei&lt;br /&gt;
dem eher gemächlichen Tempo des RP6 passiert aber nicht so schnell etwas und nebenbei&lt;br /&gt;
haben die Sensoren mehr Zeit die Umgebung auf Hindernisse zu untersuchen.&lt;br /&gt;
Und da wäre natürlich noch der Vorteil der höheren Belastbarkeit und der viel genaueren&lt;br /&gt;
Geschwindigkeitsregelung!&lt;br /&gt;
&lt;br /&gt;
===Stromversorgung (POWER SUPPLY)===&lt;br /&gt;
[[Bild:RP6_IC1.jpg|thumb]]&lt;br /&gt;
Natürlich benötigt ein Roboter Energie. Diese trägt der RP6 gespeichert in 6 Akkus mit&lt;br /&gt;
sich herum. Die Laufzeit ist durch die Kapazität der Akkus eingeschränkt, denn auch&lt;br /&gt;
wenn die Elektronik verhältnismäßig wenig Energie benötigt, schlucken die Motoren je&lt;br /&gt;
nach Belastung doch ziemlich viel.&lt;br /&gt;
&lt;br /&gt;
Damit die Akkus möglichst lange halten und der Roboter nicht ständig Pause machen&lt;br /&gt;
muss, sollte man ihm daher etwas größere Energiespeicher mit etwa 2500mAh gönnen.&lt;br /&gt;
Kleinere mit 2000mAh oder mehr funktionieren aber auch. Mit guten Akkus kann&lt;br /&gt;
man 3 bis 6 Stunden oder mehr Laufzeit erreichen, abhängig von der Betriebszeit der&lt;br /&gt;
Motoren, deren Belastung und Qualität der Akkus. Die 6 Akkus die notwendig sind,&lt;br /&gt;
haben insgesamt eine Nennspannung von 6x 1.2V = 7.2V. Im Blockdiagramm ist dies&lt;br /&gt;
mit &amp;quot;UB&amp;quot; (= &amp;quot;U-Battery&amp;quot;, U ist der Formelbuchstabe für Spannung) bezeichnet. „Nennspannung&amp;quot;,&lt;br /&gt;
weil sich die Spannung mit der Zeit stark verändert. Voll aufgeladen können&lt;br /&gt;
die Akkus im Leerlauf insgesamt bis zu 8.5V liefern! Diese Spannung sinkt während&lt;br /&gt;
der Entladung ab und schwankt auch je nach Belastung (Motoren an oder aus,&lt;br /&gt;
schnell langsam etc. - wie stark die Spannung schwankt, hängt auch von der Qualität&lt;br /&gt;
der verwendeten Akkus ab. Der Innenwiderstand ist hier die kritische Größe).&lt;br /&gt;
Das ist für Messungen von Sensorwerten und ähnlichem natürlich nicht ohne weiteres&lt;br /&gt;
brauchbar. Noch wichtiger ist jedoch, dass viele der verwendeten Komponenten wie&lt;br /&gt;
z.B. der Mikrocontroller nur auf 5V oder weniger Betriebsspannung ausgelegt sind und&lt;br /&gt;
bei so hohen Spannungen zerstört würden. Die Akku Spannung muss also auf einen&lt;br /&gt;
definierten Wert heruntergeregelt und stabilisiert werden!&lt;br /&gt;
Das übernimmt ein 5V Spannungsregler, der einen Strom von&lt;br /&gt;
maximal 1.5A liefern kann (s. Abb.). Bei 1.5A würde er jedoch&lt;br /&gt;
ziemlich viel Wärme abgeben. Es gibt daher eine große Kühlfläche&lt;br /&gt;
auf der Platine an die der Regler festgeschraubt ist. Über 1A&lt;br /&gt;
sollte der Regler trotz Kühlung besser nur kurzzeitig (also wenige&lt;br /&gt;
Sekunden) belastet werden, wenn man nicht noch einen zusätzlichen&lt;br /&gt;
großen Kühlköper draufschraubt.&lt;br /&gt;
&lt;br /&gt;
Es wird empfohlen, 800mA Dauerlast nicht zu überschreiten! Bei&lt;br /&gt;
so einer Belastung und zusammen mit den Motoren wären die&lt;br /&gt;
Akkus auch recht schnell leer. Im normalen Betrieb ohne ein Erweiterungsboard&lt;br /&gt;
nimmt der Roboter übrigens nicht mehr als 40mA auf (ausser wenn&lt;br /&gt;
das IRCOMM sendet), also überhaupt kein Problem für den Regler und man hat noch&lt;br /&gt;
genug Reserven für die Erweiterungsmodule, die meistens auch nicht mehr als 50mA&lt;br /&gt;
aufnehmen sofern keine Motoren, große LEDs o.ä. daran angeschlossen sind.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Umbau-Optionen==&lt;br /&gt;
Hier soll beschrieben werden, welche Umbau-Optionen es für die RP6 Base gibt. Im Text gibt es Verweise auf den Schaltplan des RP6 (RP6_MAINBOARD.PDF) in der Form: (SP2 B1: Bauteil). Dies bedeutet, dass man das Bauteil auf Blatt 2 des RP6-Schaltplans im Feld B1 finden kann. Beispielhaft sind im folgenden Text Bestell-Nummern der Firma [http://www.conrad.de/ce/ CONRAD] genannt. Natürlich kann man die Teile auch bei anderen Versendern beziehen.&lt;br /&gt;
&lt;br /&gt;
Bei den Materialangaben ist öfter die Rede von &amp;quot;Steckbuchsen mit Litze&amp;quot;. Diese Steckbuchsen mit angelöteter Litze können auf die ein- oder zweireihigen Stiftleisten aufgesteckt werden. Leider gibt es sie nicht (mehr) fertig konfektioniert bei CONRAD. Die einreihigen Steckbuchsen (RM 2,54mm) kann man aber z.B. bei [http://www.elv.de/output/controller.aspx ELV] bekommen: 2-polig (68-016635), 3-polig (68-022503) und 5-polig (68-023073). An sie muss man dann noch Litzen in der entsprechenden Länge selbst anlöten.&lt;br /&gt;
&lt;br /&gt;
===Elko für den IR-Empfänger===&lt;br /&gt;
[[Bild:RP6_C29_TSOP.JPG|thumb|RP6 C29 TSOP]]&lt;br /&gt;
Zur Spannungsstabilisierung kann ein Elko (C29; SP2 E1: C29*) am TSOP 34836 eingelötet werden.&lt;br /&gt;
&lt;br /&gt;
Normalerweise ist dieser Elko nicht erforderlich.&lt;br /&gt;
&lt;br /&gt;
Man braucht dazu:&lt;br /&gt;
* Einen Elektrolyt-Kondensator stehend 10 uF / 16V (C29); RM 2,5mm (445631)&lt;br /&gt;
&lt;br /&gt;
Der Elko kann auch eine geringere Kapazität als 10 uF haben (1 uF bis 4,7 uF reichen auch). Man lötet den Elko auf seinen Platz. Bitte auf die Polung achten: Der Minuspol zeigt nach vorn (in Fahrtrichtung des RP6).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Anschlüsse===&lt;br /&gt;
Hier wird aufgelistet, wo man auf dem RP6 Mainboard Anschlüsse nutzen kann, um sie z.B. zu weiteren Sensoren, zum USRBUS oder (weniger empfehlenswert!) direkt zu EPs oder Erweiterungsplatinen (M32, CCPRO M128) zu führen.&lt;br /&gt;
&lt;br /&gt;
====Analoge Sensoren an ADC0/1====&lt;br /&gt;
[[Bild:RP6_ADC01.JPG|thumb|RP6 ADC0/1]]&lt;br /&gt;
&lt;br /&gt;
Wenn man bis zu zwei analoge Sensoren (z.B. IR-Distanz-Mess-Sensoren Sharp GP2Y0A02YK 185364) direkt an den RP6 anschließen möchte, dann gibt es da zwei 3-polige Kontakte, beschriftet mit VDD/GND/ADCx (x = 0..1). Hier kann man 3-polige Stiftleisten auflöten, an die dann die Sensoren angeschlossen werden.&lt;br /&gt;
&lt;br /&gt;
Man braucht dazu:&lt;br /&gt;
* 1-reihige Stiftleiste RM 2,54mm (z.B. 36-polig 732478)&lt;br /&gt;
* Zwei Keramik-Vielschicht-Kondensatoren 100nF (C27, C28); RM 2,54mm (453099)&lt;br /&gt;
* ENTWEDER einen Elektrolyt-Kondensator stehend 220 uF / 16V (C26); RM 3,5mm (445903)&lt;br /&gt;
* ODER einen Elektrolyt-Kondensator stehend 470 uF / 16V (C26); RM 3,5mm (446211)&lt;br /&gt;
* Zwei 3-polige Steckbuchsen mit Litze zum Anschluß der Sensoren&lt;br /&gt;
&lt;br /&gt;
Man trennt nun von der 1-reihigen Stiftleiste zweimal 3 Kontakte ab und lötet sie auf die weiß umrahmten Kontakte (VDD/GND/ADCx; SP2 B1: ADC0, ADC1), anschließend C27, C28 (SP2 A1: C27*, C28*) auf ihre Plätze und zum Schluß den Elko 220 uF oder 470 uF (C26; SP2 A1: C26*). Der Elko ist nur bei Sensoren mit hohem Strombedarf notwendig, siehe dazu auch Anleitung des RP6, Seite 136! Beim Elko auf die Polung achten: Er muss so sitzen, dass er mit seinem Pluspol in Fahrtrichtung des RP6 (nach vorn) schaut.&lt;br /&gt;
&lt;br /&gt;
Die Sensoren lötet man an die Litzen der 3-poligen Steckbuchsen und steckt diese auf die neuen Kontakte.&lt;br /&gt;
&lt;br /&gt;
Da manche Sensoren einen höheren Stromverbrauch haben, kann man die Stromversorgung an den VDD-Pins der ADC0/1-Stecker abschaltbar machen oder eine separate +5V-Spannung einspeisen. Siehe dazu den Abschnitt &amp;quot;Trennstellen - Getrennte Stromversorgung für ADC0/1&amp;quot; weiter unten!&lt;br /&gt;
&lt;br /&gt;
====ISP (In System Programming)====&lt;br /&gt;
Der ATMEGA32 des RP6 wird standardmäßig über den PROG/UART Stecker programmiert. Dazu befindet sich im Prozessor ein Bootloader-Programm. Wenn man stattdessen oder zusätzlich die ISP-Programmierung mit einem dafür geeigneten ISP-Programmier-Adapter nutzen will, kann man den Adapter an einen (noch einzulötenden) Wannenstecker auf dem RP6 anschließen.&lt;br /&gt;
Vorher sind aber ein paar &amp;quot;Umbauarbeiten&amp;quot; erforderlich.&lt;br /&gt;
&lt;br /&gt;
Man braucht dazu:&lt;br /&gt;
* 1-reihige Stiftleiste RM 2,54mm (z.B. 36-polig 732478)&lt;br /&gt;
* Wannenstecker 2x5-polig gerade RM 2,54mm (z.B. [http://www.reichelt.de./ Reichelt] WSL 10G)&lt;br /&gt;
* Eine SMD-Diode LL 4148 (140902)&lt;br /&gt;
* Eine Codierbrücke (z.B. aus Set 742902)&lt;br /&gt;
&lt;br /&gt;
Zwischen dem XBUS-Stecker und C13 befinden sich 10 Lötpunkte für den ISP-Anschluß, auf die der Wannenstecker gelötet wird, und drei Lötpunkte (beschriftet mit ISP* - BOOTLOAD; SP2 A3: YR1..3), auf die eine 3-polige Stiftleiste gelötet werden muss.&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_ISP.JPG|RP6 ISP]]&lt;br /&gt;
&lt;br /&gt;
Vorher muss eine kurze Leiterbahn zwischen den Lötpunkten BOOTLOAD aufgetrennt werden. Die Leiterbahn befindet sich auf der Lötseite der Platine und muss mit einem scharfen Messer oder einem speziellen Leiterbahn-Unterbrecher zwischen den beiden Lötpunkten unterbrochen werden. Man sollte anschließend mit einem Widerstandsmeßgerät nachmessen: Es sollte keine Verbindung mehr zwischen den Lötpunkten bestehen.&lt;br /&gt;
Man trennt dann von der 1-reihigen Stiftleiste 3 Kontakte ab und lötet sie auf die beschriebenen drei Lötpunkte.&lt;br /&gt;
&lt;br /&gt;
Zum Schluss lötet man noch die Diode LL 4148 (SP2 B3: D11*) auf ihre Lötflächen zwischen R3 und C6. Die Kathode (Strich) der Diode kommt nach vorn (in Fahrtrichtung RP6, bzw. liegt rechts von R3). Wenn man jetzt eine Codierbrücke auf die mit &amp;quot;BOOTLOAD&amp;quot; beschrifteten Pins steckt, bleibt alles unverändert: Die Programmierung erfolgt weiter über den PROG/UART-Stecker mithilfe des Bootloaders im Prozessor.&lt;br /&gt;
Wird die Codierbrücke in Stellung &amp;quot;ISP*&amp;quot; umgesteckt, kann der Prozessor mit ISP programmiert werden.&lt;br /&gt;
&lt;br /&gt;
Vorsicht: Das Bootloader-Programm kann dabei zerstört werden! Es müssen zusätzlich Fusebits des ATMEGA32 verändert werden. Dabei kann der Prozessor im schlimmsten Fall nicht mehr ansprechbar sein. Man sollte diesen Umbau und die ISP-Programmierung nur machen, wenn man genau weiß, was man macht!&lt;br /&gt;
&lt;br /&gt;
Eine Kopie des Bootloaders und eine Kurzanleitung zum Einstellen der Fusebits gibt es hier:&lt;br /&gt;
[http://www.arexx.com/rp6/downloads/RP6BASE_BOOTLOADER.zip RP6_BOOTLOADER]&lt;br /&gt;
&lt;br /&gt;
====IO1..IO4====&lt;br /&gt;
[[Bild:RP6_IO1-4.JPG|thumb|RP6 IO1..IO4]]&lt;br /&gt;
Die Anschlüsse IO1 bis IO4 (SP2 E3: IO1..4) steuern bereits die Status-LEDs 1, 2, 4 und 5 an. Trotzdem kann man sie auch noch mit leichten Einschränkungen als I/O-Pins benutzen. Dazu lötet man zweimal 2 Pins einer 1-reihigen Stiftleiste RM 2,54mm (z.B. 36-polig 732478) auf die IO1/2 und IO3/4 Lötpunkte.&lt;br /&gt;
Hier eine Tabelle, die die Port-Pins zeigt, die IO1..IO4 zugeordnet sind:&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |IO&lt;br /&gt;
 |Status-LED&lt;br /&gt;
 |Port-Pin&lt;br /&gt;
 |-&lt;br /&gt;
 |1&lt;br /&gt;
 |SL1&lt;br /&gt;
 |PC4&lt;br /&gt;
 |-&lt;br /&gt;
 |2&lt;br /&gt;
 |SL2&lt;br /&gt;
 |PC5&lt;br /&gt;
 |-&lt;br /&gt;
 |3&lt;br /&gt;
 |SL4&lt;br /&gt;
 |PB7&lt;br /&gt;
 |-&lt;br /&gt;
 |4&lt;br /&gt;
 |SL5&lt;br /&gt;
 |PB1&lt;br /&gt;
 |-&lt;br /&gt;
|}&lt;br /&gt;
Wie können nun IO1..IO4 genutzt werden?&lt;br /&gt;
&lt;br /&gt;
Als ...&lt;br /&gt;
* Eingang, z.B. für zusätzliche Tastschalter/Bumper&lt;br /&gt;
* Ausgang, z.B. zur Ansteuerung von Treiberstufen, low-current LEDs, ...&lt;br /&gt;
&lt;br /&gt;
Wird ein Anschluß IOx als Eingang verwendet, muss ein Widerstand von 470 Ohm in Reihe mit dem Taster an VDD eingebaut werden, zusätzlich ein Pulldown-Widerstand 100 kOhm. Diese Beschaltung zeigen z.B. an SL6 die Widerstände R43 und R46 (SP2 E4: R43, R46).&lt;br /&gt;
&lt;br /&gt;
Als Ausgang geschaltet sollte an IOx kein hoher Strom entnommen werden: 10mA sind max. zu empfehlen!&lt;br /&gt;
&lt;br /&gt;
====USRBUS====&lt;br /&gt;
Die 14 Kontakte der beiden USRBUS-Stecker sind auf dem RP6 nirgendwo angeschlossen, sondern können über die Lötpunkte Y1..Y14 mit beliebigen Punkten auf dem Mainboard verbunden werden.&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_USRBUS.JPG|thumb|RP6 USRBUS]]&lt;br /&gt;
&lt;br /&gt;
Ich würde auf Y1..Y14 eine Stiftleiste löten, damit die USRBUS-Belegung geändert werden kann.&lt;br /&gt;
&lt;br /&gt;
Man braucht dazu:&lt;br /&gt;
* 2-reihige Stiftleiste RM 2,54mm (z.B. 2x36-polig 742007)&lt;br /&gt;
* Einige Steckbuchsen mit Litze&lt;br /&gt;
&lt;br /&gt;
Man trennt von der 2-reihigen Stiftleiste 2x7 Kontakte ab und lötet sie auf die Punkte Y1..Y14 (SP4 E34: Y1..14, Y1'..Y14') neben den beiden Wannensteckern USRBUS1 (vorn) und USRBUS2 (hinten). Wird der RP6 über Flachkabel mit einem USRBUS-Stecker auf einer RP6 Experimentierplatine (EP) und/oder mit einer Erweiterungsplatine (M32, CCPRO M128) verbunden, dann hat man mit allen mit dem USRBUS verbundenen Platinen eine direkte 14-polige Verbindung,- eben den &amp;quot;User Bus&amp;quot;. Den kann man dann nutzen, wie man will. Auf dem RP6 kann man mit Steckbuchsen die Pins Y1..Y14 mit anderen Pins verbinden.&lt;br /&gt;
&lt;br /&gt;
Beispiel: Verbindet man den Pin &amp;quot;ADC0&amp;quot; mit Y1 des USRBUS1, dann steht der Eingang ADC0 auf allen an den USRBUS1 angeschlossenen Platinen auf dem vorderen Platinenstapel an Y1 zur Verfügung. Man braucht also diesen Eingang nicht über ein eigenes Kabel auf eine EP zu führen, sondern kann dazu den USRBUS nehmen. Dadurch bleibt der Gesamtaufbau auf dem RP6 übersichtlich und komplett trennbar (man braucht nur die Stecker XBUS und USRBUS abzuziehen!).&lt;br /&gt;
&lt;br /&gt;
Wichtig:&lt;br /&gt;
* Man sollte gut dokumentieren, wie man den USRBUS am RP6 (vorn und hinten getrennt!), auf EPs und der M32/M128 benutzt! Sonst kann es bei einer anderen Anordnung von EPs zu USRBUS Konflikten/Kurzschlüssen kommen.&lt;br /&gt;
* Der USRBUS1- und der USRBUS2-Stecker sind auf dem RP6 NICHT miteinander verbunden.&lt;br /&gt;
&lt;br /&gt;
Einen Vorschlag für die Belegung des USRBUS1 (vorn) gibt es z.B. &lt;br /&gt;
[http://www.roboternetz.de/phpBB2/viewtopic.php?t=32549 hier] oder &lt;br /&gt;
[http://www.roboternetz.de/community/showthread.php/47102-Sensor-anschließen?p=453061&amp;amp;viewfull=1#post453061 da.]&lt;br /&gt;
&lt;br /&gt;
====Start/Stop Button====&lt;br /&gt;
[[Bild:RP6_ST.JPG|thumb|RP6 ST]]&lt;br /&gt;
Am mittleren Lochrasterfeld links finden sich zwei Lötpunkte ST1, ST2 (SP2 D2: ST1, ST2), an die weitere Start/Stop Taster (NO, normal offen) parallel zum Taster auf dem RP6 Mainboard angeschlossen werden können.&lt;br /&gt;
&lt;br /&gt;
Zum Anschluß kann man auch Stiftleisten auflöten. ST1, ST2 könnte man auch mit dem USRBUS1 verbinden, wenn man den RP6 z.B. von einer EP aus zurücksetzen möchte.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Serielle Schnittstelle====&lt;br /&gt;
[[Bild:RP6_RST.JPG|thumb|RP6 RST]]&lt;br /&gt;
Neben dem USRBUS1 Stecker befinden sich 5 Lötpunkte mit den Signalen RST, TX, RX, GND, VDD (SP4 AB5: YRX, YTX, YMRESET, YVDD). Hier kann z.B. eine 5-polige Stiftleiste aufgelötet werden, um einen Anschluß an die serielle Schnittstelle zu ermöglichen.&lt;br /&gt;
&lt;br /&gt;
Von diesen 5 Lötpunkten könnte z.B. auch [http://www.roboternetz.de/phpBB2/viewtopic.php?t=32549 so] eine Verbindung zum benachbarten USRBUS1 hergestellt werden, um die serielle Schnittstelle des RP6 auf EPs zu führen.&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;
&lt;br /&gt;
====I2C-Schnittstelle====&lt;br /&gt;
[[Bild:RP6_I2C.JPG|thumb|RP6 I2C]]&lt;br /&gt;
Neben dem XBUS2 Stecker finden sich 5 Lötpunkte mit den Signalen der I2C-Schnittstelle (SP4 D12: Stecker I2C). Dies sind: VDD (Pin 1), GND, SDA, SCL, INT1 (Pin 5). Hier kann z.B. eine 5-polige Stiftleiste aufgelötet werden, um einen Anschluß an die I2C-Schnittstelle zu ermöglichen.&lt;br /&gt;
&lt;br /&gt;
Von diesen 5 Lötpunkten könnte z.B. auch eine Verbindung zum USRBUS1 oder USRBUS2 hergestellt werden, um die I2C-Schnittstelle des RP6 auf EPs zu führen, allerdings hat man SCL, SDA, INT1 ja auch schon am XBUS zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Interrupt-Leitungen====&lt;br /&gt;
[[Bild:RP6_INTx.JPG|thumb|RP6 INTx]]&lt;br /&gt;
Die Interrupt-Leitungen INTU, INT1..3, MRESET (SP4 D34: MRESET, INT1..3, INTU) sind an 5 Lötpunkten neben dem XBUS1 Stecker zu kontaktieren. Hier kann natürlich auch eine 5-polige Stiftleiste aufgelötet werden. In der Regel wird man diese Anschlüsse nicht brauchen, weil sie schon auf dem XBUS zur Verfügung stehen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====VDD/GND/+UB Anschluß====&lt;br /&gt;
[[Bild:RP6_VDDGNDUB.JPG|thumb|RP6 VDD GND +UB]]&lt;br /&gt;
In der Nähe von C4 im hinteren Bereich des Mainboards finden sich Lötpunkte (SP4 E12: YVDDx, YGNDx; SP4 D2 YUBx), an denen man VDD, GND und +UB finden kann.&lt;br /&gt;
&lt;br /&gt;
Wenn man höhere Ströme an VDD (z.B. für Servos) oder +UB (z.B. für einen anderen IRCOMM-Sender oder einen DC-Motor) entnehmen möchte, empfehlen sich diese Lötpunkte, auf die man auch Stiftleisten löten kann.&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;
====EXT Anschluß====&lt;br /&gt;
[[Bild:RP6_EXT.jpg|thumb|RP6 EXT Anschluß]]&lt;br /&gt;
Am hinteren Rand der RP6 Hauptplatine gibt es eine Reihe von 8 Lötpunkten. Dies ist der EXT Anschluß (SP1 C23: Stecker EXT):&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |Pin&lt;br /&gt;
 |Name&lt;br /&gt;
 |Beschreibung&lt;br /&gt;
 |-&lt;br /&gt;
 |1&lt;br /&gt;
 |GND&lt;br /&gt;
 |RP6 und Akku Minuspol (GND)&lt;br /&gt;
 |-&lt;br /&gt;
 |2&lt;br /&gt;
 |CHRG&lt;br /&gt;
 |Anschluß (+) für ext. Ladegerät, identisch mit Pluspol der Ladebuchse (CHARGER, Pin 1). Ladung nur möglich, wenn S1 AUS ist!&lt;br /&gt;
 |-&lt;br /&gt;
 |3&lt;br /&gt;
 |CHRG&lt;br /&gt;
 |wie Pin 2!&lt;br /&gt;
 |-&lt;br /&gt;
 |4&lt;br /&gt;
 | +BAT&lt;br /&gt;
 |Akku Pluspol über Sicherung F1&lt;br /&gt;
 |-&lt;br /&gt;
 |5&lt;br /&gt;
 | +BAT&lt;br /&gt;
 |wie Pin 4!&lt;br /&gt;
 |-&lt;br /&gt;
 |6&lt;br /&gt;
 | +UB&lt;br /&gt;
 |RP6 +UB (+7,2V=, Bereich min. +5,5 bis max. +10V=)&lt;br /&gt;
 |-&lt;br /&gt;
 |7&lt;br /&gt;
 | +UB&lt;br /&gt;
 |wie Pin 6!&lt;br /&gt;
 |-&lt;br /&gt;
 |8&lt;br /&gt;
 |GND&lt;br /&gt;
 |wie Pin 1!&lt;br /&gt;
 |-&lt;br /&gt;
|}&lt;br /&gt;
Man kann hier eine JST XH Stiftleiste gerade, 8-polig, RM 2,5mm ([http://www.conrad.de/ce/de/product/740105/Stiftleiste-gerade-RM-25-mm-Serie-XH-Rastermass-25-mm-Pole-8-Nennstrom-3-A-B8B-XH-A-LFSN-JST-Inhalt-1-St 740105]) auflöten.&lt;br /&gt;
&lt;br /&gt;
Wozu kann man diesen Anschluß nutzen?&lt;br /&gt;
&lt;br /&gt;
Der wesentliche Sinn des EXT Anschlusses besteht darin, andere Arten der Stromversorgung und der Akkuladung zu ermöglichen. Normalerweise schaltet man den RP6 mit S1 an und aus. In Stellung AUS kann der Akku geladen werden, indem man ein Ladegerät an die CHARGER Buchse anschließt. Alternativ kann man das Ladegerät mit seinem Pluspol auch an CHRG (Pins 2, 3) anschließen. Siehe auch den Abschnitt &amp;quot;Trennstellen - EXT Anschluß: Andere Stromversorgung&amp;quot; weiter unten!&lt;br /&gt;
&lt;br /&gt;
An +BAT (Pins 4, 5) kann man direkt (ohne Unterbrechung durch S1) Strom aus dem Akku entnehmen. Die Grenze des Stroms bestimmt die Sicherung F1 (2,5A). Eine weitere Möglichkeit besteht darin, über diesen Anschluß den Akku auch mit einem geeigneten Ladegerät zu LADEN. Hierbei muss man aber darauf achten, dass S1 AUSgeschaltet ist, weil sonst der RP6 über +UB eine unzulässig hohe Spannung bekommen könnte. Wenn man den Akku mit 6 Mignonzellen im RP6 nicht nutzen will (der Akku-Halter bleibt leer!), sondern nur einen externen Akku, wäre der auch mit seinem Pluspol an +BAT über eine eigene Sicherung (2,5A träge) anzuschließen.&lt;br /&gt;
&lt;br /&gt;
+UB (+7,2V) ist die Versorgungsspannung des RP6 (kommt vom Akku-Pluspol über die Sicherung F1 und Schalter S1!). Mit +UB werden die H-Brücken (Motoransteuerung) direkt und die RP6 &amp;quot;Elektronik&amp;quot; über den 5V-Spannungswandler (IC1; SP1 D3: IC1) versorgt (= VDD). An +UB könnte man den RP6 direkt mit einer Spannung von +7,2V versorgen (Absicherung nicht vergessen!), dazu muss S1 AUSgeschaltet sein, damit es keine Konflikte mit dem eingebauten Akku gibt.&lt;br /&gt;
&lt;br /&gt;
Den EXT Anschluß kann man damit nutzen für:&lt;br /&gt;
* Externes Ladegerät&lt;br /&gt;
* Externen Akku&lt;br /&gt;
* Externe Stromversorgung ohne Akku&lt;br /&gt;
* Direkte Stromentnahme aus dem Akku&lt;br /&gt;
* Ergänzungsladung mit Solarzelle&lt;br /&gt;
* Autonome Akkuladung (Ladestation mit Kontakten, Induktionsladung ...)&lt;br /&gt;
* ...&lt;br /&gt;
&lt;br /&gt;
Man sollte gewisse Elektronik-Kenntnisse haben, wenn man die Spannungsversorgung des RP6 verändert. VOR irgendwelchen Veränderungen seht euch auch zuerst den Schaltplan des RP6 (SP1) genau an!&lt;br /&gt;
&lt;br /&gt;
===Mess-/Kontaktpunkte===&lt;br /&gt;
Hier geht es um Kontaktpunkte, an denen man z.B. den Logik-Pegel (High/Low) oder eine analoge Spannung messen kann. Natürlich kann man die Signale auch zur Weiterleitung auf eine EP kontaktieren, dies wird man aber normalerweise nicht brauchen.&lt;br /&gt;
&lt;br /&gt;
====UBAT====&lt;br /&gt;
[[Bild:RP6_UBAT.JPG|thumb|RP6 UBAT]]&lt;br /&gt;
In der Mitte des Mainboards befindet sich ein Kontaktpunkt UBAT (SP1 E1: YUBAT). Dies ist ADC7 des RP6 Microcontrollers.&lt;br /&gt;
&lt;br /&gt;
Man kann hier die analoge Spannung (gegen GND) messen, die vom +UB-Spannungssensor geliefert wird.&lt;br /&gt;
&lt;br /&gt;
Die Spannung ist:&lt;br /&gt;
 UBAT = +UB / 2&lt;br /&gt;
Da der Spannungsteiler (SP1 D12: R1, R2) des +UB-Spannungssensors nicht aus Präzisionswiderständen besteht, kann man für den eigenen RP6 einen Korrekturfaktor berechnen, wenn UBAT deutlich von +UB / 2 (+ UB z.B. gemessen am EXT Stecker, Pins 6 u. 7) abweicht. Damit kann man +UB sehr viel genauer bestimmen.&lt;br /&gt;
&lt;br /&gt;
====ACS====&lt;br /&gt;
[[Bild:RP6_ACS_TSOP.JPG|thumb|RP6 ACS TSOP]]&lt;br /&gt;
Hinter dem TSOP (IC3) befindet sich der Kontaktpunkt ACS (SP2 E1: ACS).&lt;br /&gt;
&lt;br /&gt;
Dies ist der Ausgang des TSOP bzw. Eingang PB2 des RP6 Microcontrollers. Man kann hier das Ausgangssignal des IR-Empfängers abnehmen, z.B. um es mit einem Oszilloskop sichtbar zu machen.&lt;br /&gt;
&lt;br /&gt;
Rechts neben dem TSOP kann man noch die 3 Kontaktpunkte ACS_R, ACS_P und ACS_L (SP2 E2: ACS_P, ACS_R, ACS_L) des ACS-IR-Senders finden.&lt;br /&gt;
&lt;br /&gt;
Folgende Tabelle zeigt die Verbindungen:&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |Kontakt&lt;br /&gt;
 |Microcontroller-Portpin&lt;br /&gt;
 |SP-Verbindung&lt;br /&gt;
 |ACS-IR-Sendediode&lt;br /&gt;
 |-&lt;br /&gt;
 |ACS_P&lt;br /&gt;
 |über R8: ACS_PWRH (PB3), über R9: ACS_PWR (PD6)&lt;br /&gt;
 |SP2: 3&lt;br /&gt;
 |Anoden D1, D2&lt;br /&gt;
 |-&lt;br /&gt;
 |ACS_R&lt;br /&gt;
 |ACS_R (PC7)&lt;br /&gt;
 |SP2: 2&lt;br /&gt;
 |Kathode D1&lt;br /&gt;
 |-&lt;br /&gt;
 |ACS_L&lt;br /&gt;
 |ACS_L/MISO (PB6)&lt;br /&gt;
 |SP1: 5&lt;br /&gt;
 |Kathode D2&lt;br /&gt;
 |-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====IRC====&lt;br /&gt;
[[Bild:RP6_IRC.JPG|thumb|RP6 IRC]] [[Bild:RP6_IRC3.JPG|thumb|RP6 IRC3]]&lt;br /&gt;
Im der Nähe von C13 befinden sich die Lötpunkte IRC, IRC+, IRC- und IRC3 (SP2 D2: YIRC; SP2 CD2: IRC+/-; SP2 C2: IRC3). Zusammen mit der Trennstelle IRC (siehe Abschnitt &amp;quot;Trennstellen - IRC&amp;quot; weiter unten!) kann man diese Kontaktstellen im Umfeld des IRCOMM-Sendedioden Treibers IRLML2502PBF (SP2 CD12: Q5) finden. Am Kontaktpunkt IRC findet sich der Eingang des Treibers bzw. Ausgang PD7 des RP6 Microcontrollers. IRC+, IRC- sind die Kontaktpunkte, an denen die IRCOMM-Sendedioden D3, D4 in Reihe auf der Sensorplatine angeschlossen sind (IRC+ = Anode). IRC3 ist verbunden mit dem Trennstellen-Lötpunkt IRC1 und liegt bei geschlossener Trennstelle IRC an +UB.&lt;br /&gt;
&lt;br /&gt;
Was läßt sich mit diesen Kontaktpunkten machen:&lt;br /&gt;
* Der IRCOMM-Sender ist der zweitgrößte Stromverbraucher des RP6 (nach dem Antrieb). An IRC3 kann daher eine eigene Stromversorgung für die IRCOMM-Sendedioden angeschlossen werden. Dazu muss die Trennstelle IRC zwischen ihren Lötpunkten IRC1, IRC2 aufgetrennt werden.&lt;br /&gt;
* An IRC+, IRC- könnten andere/weitere IRCOMM-Sendedioden angeschlossen werden (Anode an IRC+). Wenn der Vorwiderstand R6 (SP2 C2: R6) der Sendedioden dann nicht mehr paßt (bezügl. Leistung und/oder Widerstandswert), können neue leistungsfähigere IRCOMM-Sendedioden zwischen IRC3 und IRC- (Anode an IRC3) mit einem dafür geeigneten Vorwiderstand angebracht werden.&lt;br /&gt;
&lt;br /&gt;
====LS====&lt;br /&gt;
[[Bild:RP6_LS.JPG|thumb|RP6 LS]]&lt;br /&gt;
Die beiden Lötpunkte LS_L und LS_R (SP2 B12: LS_L, LS_R) neben R7 vorn auf dem Mainboard sind die Ausgänge der Helligkeitssensoren (links und rechts) bzw. die ADC-Eingänge ADC3 und ADC2 des RP6 Microcontrollers.&lt;br /&gt;
&lt;br /&gt;
Hier kann man die Spannungen messen, die den Helligkeitswerten entsprechen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====BP, S====&lt;br /&gt;
[[Bild:RP6_BP_S.JPG|thumb|RP6 BP S]]&lt;br /&gt;
Die Messpunkte BPL, BPR und der Kontaktpunkt S (SP2 E2: S; SP2 E3: BPR; SP2 E4: BPL) befinden sich am vorderen Platinenrand. BPL und BPR sind die Kontakte der Bumper. S ist eine nicht genutzte Verbindung zwischen dem Mainboard und der Sensorplatine, die über die Verbindung SP1, Pin 3, geführt wird (siehe folgende Tabelle!).&lt;br /&gt;
&lt;br /&gt;
Hier eine Tabelle mit der Belegung der 90°-Winkelverbindung SP1, SP2 zwischen dem RP6 Mainboard und der Sensorplatine: &lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |Pin&lt;br /&gt;
 |SP1&lt;br /&gt;
 |SP2&lt;br /&gt;
 |-&lt;br /&gt;
 |1&lt;br /&gt;
 |LS_L  --- Light Sensor Left&lt;br /&gt;
 |IRC-  --- IRCOMM-&lt;br /&gt;
 |-&lt;br /&gt;
 |2&lt;br /&gt;
 |BPL   --- Bumper Left&lt;br /&gt;
 |ACS_R --- ACS Right&lt;br /&gt;
 |-&lt;br /&gt;
 |3&lt;br /&gt;
 |S     --- Free for all&lt;br /&gt;
 |ACS_P --- ACS Power&lt;br /&gt;
 |-&lt;br /&gt;
 |4&lt;br /&gt;
 |GND&lt;br /&gt;
 |VDD&lt;br /&gt;
 |-&lt;br /&gt;
 |5&lt;br /&gt;
 |ACS_L --- ACS Left&lt;br /&gt;
 |BPR   --- Bumper Right&lt;br /&gt;
 |-&lt;br /&gt;
 |6&lt;br /&gt;
 |IRC+  --- IRCOMM+&lt;br /&gt;
 |LS_R  --- Light Sensor Right&lt;br /&gt;
 |-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====ENC====&lt;br /&gt;
[[Bild:RP6_ENC.JPG|thumb|RP6 ENC]]&lt;br /&gt;
Die beiden Messpunkte ENCL, ENCR (SP4 B12: ENCL, ENCR) sind die Ausgänge der Radencoder. ENCL ist verbunden mit PD2 (INT0), ENCR mit PD3 (INT1) des RP6 Microcontrollers.&lt;br /&gt;
&lt;br /&gt;
===Trennstellen===&lt;br /&gt;
An diesen Stellen können Leiterbahnen unterbrochen werden, um Funktionen zu deaktivieren oder anders zu nutzen.&lt;br /&gt;
&lt;br /&gt;
=====Getrennte Stromversorgung für ADC0/1=====&lt;br /&gt;
Wenn man für die analogen Sensoren an ADC0/1 (siehe Abschnitt &amp;quot;Anschlüsse - Analoge Sensoren an ADC0/1&amp;quot; weiter oben!) eine GETRENNTE Stromversorgung vorsehen will und/oder mit Codierbrücke (oder MOSFET) die Stromversorgung abschaltbar machen möchte, muss man erst Vorarbeit leisten.&lt;br /&gt;
[[Bild:RP6_SV.JPG|thumb|RP6 SV]]&lt;br /&gt;
&lt;br /&gt;
Man braucht dazu:&lt;br /&gt;
* 1-reihige Stiftleiste RM 2,54mm (z.B. 36-polig 732478)&lt;br /&gt;
* Evtl.: Eine Codierbrücke (z.B. aus Set 742902)&lt;br /&gt;
* Evtl.: Eine 1-polige Steckbuchse mit Litze zur ext. Stromversorgung&lt;br /&gt;
Es muss eine kurze Leiterbahn zwischen den Punkten &amp;quot;SV1&amp;quot; und &amp;quot;SV2&amp;quot; (SP2 A1: SV1, SV2; zwischen dem PROG/UART- und dem USRBUS1-Stecker) aufgetrennt werden. Die Leiterbahn befindet sich auf der Lötseite der Platine und muss mit einem scharfen Messer oder einem speziellen Leiterbahn-Unterbrecher zwischen den beiden Lötpunkten unterbrochen werden. Man sollte anschließend mit einem Widerstandsmeßgerät zwischen SV1 und SV2 nachmessen: Es sollte keine Verbindung mehr bestehen. Jetzt trennt man von der 1-reihigen Stiftleiste 2 Kontakte ab und lötet sie auf die Punkte SV1/SV2.&lt;br /&gt;
&lt;br /&gt;
Man kann hier zunächst eine Codierbrücke aufstecken. Damit versorgt der RP6 Akku die Sensoren mit 5V an den Pins VDD. Möchte man später eine getrennte 5V-Spannung anlegen, zieht man einfach die Codierbrücke ab und speist die externe 5V-Spannung (mit einer 1-poligen Steckbuchse) am Pin SV2 ein. Achtung: An Pin SV1 wird dann nichts angeschlossen!&lt;br /&gt;
&lt;br /&gt;
Anstelle der Codierbrücke kann man natürlich auch einen MOSFET anschließen, um die Sensoren per Software abschalten zu können.&lt;br /&gt;
&lt;br /&gt;
====ACS====&lt;br /&gt;
[[Bild:RP6_ACS_JP.JPG|thumb|RP6 ACS JP]]&lt;br /&gt;
Die Trennstelle ACS (SP2 E1: YIR1, YIR2; SP2 F1: YIR3) befindet sich neben C29*. Sie besteht aus 3 Lötpunkten, von denen die linken beiden (IRC1, IRC2) verbunden sind. Trennt man die Leiterbahn zwischen diesen Lötpunkten auf und verbindet stattdessen die rechten beiden Lötpunkte (IRC2, IRC3) mit etwas Lötzinn oder mit einem SMD Null Ohm Widerstand, dann ist der IR-Empfänger (TSOP, IC3) dauerhaft EINgeschaltet und kann nicht mehr über das Signal PWRON (PB4) geschaltet werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====IRC====&lt;br /&gt;
[[Bild:RP6_IRC_JP.JPG|thumb|RP6 IRC JP]]&lt;br /&gt;
Die Trennstelle IRC (SP2 C1: IRC1..2) ist eng verknüpft mit den Mess- und Kontaktpunkten des IRCOMM-Senders (siehe Abschnitt &amp;quot;Mess-/Kontaktpunkte - IRC&amp;quot; weiter oben!). Wenn man sie auftrennt, kann man den IRCOMM-Sender mit einer getrennten Stromversorgung anstelle von +UB des RP6 versehen. Dies ist sehr sinnvoll, wenn man diese Funktion häufig verwendet oder sogar noch leistungsfähigere IR-Sendedioden einbaut, denn der IRCOMM-Sender ist der zweitgrößte Stromfresser (nach dem Antrieb) auf dem RP6 (von Erweiterungsplatinen und EPs Marke Eigenbau einmal abgesehen!). Man kann hier natürlich auch eine 2-polige Stiftleiste einlöten, um die Verbindung zu +UB mit einer Codierbrücke trennbar zu machen. Eine getrennte Stromversorgung +7,2V (Bereich: +5,5 .. +10V) kann man an IRC1 einspeisen. IRC1 dieser Trennstelle ist mit dem Kontaktpunkt IRC3 (siehe Abschnitt &amp;quot;Mess-/Kontaktpunkte - IRC&amp;quot; weiter oben!) verbunden. &lt;br /&gt;
&lt;br /&gt;
====RP6 Antrieb====&lt;br /&gt;
Mit den folgenden Trennstellen kann man den RP6 Antrieb (H-Brücken und Motoren) fast komplett vom Rest des RP6 Mainboards abtrennen (es bleibt nur die 5V-Versorgung (VDD) von IC4, T1, T2 bestehen!). Damit ist es möglich, mit dem RP6 Mainboard einen ganz anderen Antrieb (also z.B. ein anderes Roboter-Chassis mit eigenen Motoren und H-Brücken) zu steuern. Umgekehrt könnte man den RP6 Antrieb auch deshalb abtrennen, um ihn durch ein anderes Prozessorsystem (z.B. auch eine M32!) anzusteuern. It's up to you!&lt;br /&gt;
&lt;br /&gt;
=====+UB Power=====&lt;br /&gt;
[[Bild:RP6_HB_Power.jpg|thumb|RP6 HB Power]]&lt;br /&gt;
Der RP6 Antrieb wird direkt aus dem Akku (über S1 und F1) mit 7,2V (+UB) versorgt. Diese Stromversorgung kann man komplett abtrennen. Die Trennstelle (SP3 E34: X) liegt unter der Sicherung F1 (siehe Abb. RP6 HB Power). Zwischen den beiden doppelten Lötflächen befinden sich auf der Lötseite (Unterseite) des Mainboards vier parallele Leiterbahnen, die aufgetrennt werden müssen. Der Pluspol einer externen Spannung zur Versorgung des RP6 Antriebs kann dann mit einer Kabelverbindung an den doppelten Lötflächen (mit einem &amp;quot;+&amp;quot; gekennzeichnet) direkt neben dem Leistungswiderstand (R27) angeschlossen werden. Eine Absicherung dieser Stromversorgung sollte man unbedingt vorsehen (2,5A träge)!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=====Stromsensoren=====&lt;br /&gt;
[[Bild:RP6_CS.JPG|thumb|RP6 CS]]&lt;br /&gt;
Um den Motorstrom der beiden Motoren des RP6 zu messen, wird ein Dual-Operationsverstärker (IC5 = 27M2C; SP3 B23/D23: IC5B/A) eingesetzt. Dieses IC wird über PWRON (PB4) mit Strom versorgt. Die Stromsensoren funktionieren also nicht, wenn PWRON Low-Pegel führt (Befehl powerOFF() der RP6 Library!). Auf dem RP6 Mainboard gibt es eine Trennstelle mit drei Lötflächen (SP3 E34: CS1, CS2, CS3). Sie befindet sich auf dem Mainboard neben C23. Möchte man IC5 nicht mehr über PWRON mit Strom versorgen, sondern über VDD (+5V), dann trennt man die Leiterbahn zwischen den linken beiden Lötpunkten (CS1, CS2) auf und verbindet die rechten beiden Lötpunkte (CS2, CS3) mit etwas Lötzinn oder einem SMD Null Ohm Widerstand. Danach sind die Stromsensoren immer eingeschaltet und können über PWRON nicht mehr geschaltet werden. Alternativ kann man an CS2 auch eine externe Versorgungsspannung (+5V) für IC5 einspeisen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=====DR/MR/ML/DL=====&lt;br /&gt;
[[Bild:RP6_DR_MR_ML_DL.JPG|thumb|RP6 DR MR ML DL]]&lt;br /&gt;
An diesen Trennstellen können die Eingänge der H-Brücke für die Geschwindigkeit (PWM) und Drehrichtung der Motoren von den Portpins des Microcontrollers abgetrennt werden.&lt;br /&gt;
Für den rechten Motor sind dies die Trennstellen MR1/2 und DR1/2 (SP3 A23: MR1/2, DR1/2), für den linken Motor ML1/2 und DL1/2 (SP3 F23: ML1/2, DL1/2).&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |Trennstelle&lt;br /&gt;
 |Portpin&lt;br /&gt;
 |Funktion H-Brücke&lt;br /&gt;
 |-&lt;br /&gt;
 |MR1/2&lt;br /&gt;
 |PD5 (OC1A)&lt;br /&gt;
 |PWM Motor rechts&lt;br /&gt;
 |-&lt;br /&gt;
 |DR1/2&lt;br /&gt;
 |PC3 (TMS)&lt;br /&gt;
 |Fahrtrichtung rechts&lt;br /&gt;
 |-&lt;br /&gt;
 |ML1/2&lt;br /&gt;
 |PD4 (OC1B)&lt;br /&gt;
 |PWM Motor links&lt;br /&gt;
 |-&lt;br /&gt;
 |DL1/2&lt;br /&gt;
 |PC2 (TCK)&lt;br /&gt;
 |Fahrtrichtung links&lt;br /&gt;
 |-&lt;br /&gt;
|}&lt;br /&gt;
Trennt man die Leiterbahn (auf der Lötseite des RP6 Mainboards) zwischen den Lötpunkten der Trennstellen auf, kann man die Eingänge der H-Brücke (Mx1, Dx1) z.B. mit einem anderen Microcontroller verbinden. Die Ausgänge (Portpins) des RP6 Microcontrollers (Mx2, Dx2) können dann anders genutzt werden. Natürlich kann man auf die Lötpunkte dieser Trennstellen auch Stiftleisten löten, um den Anschluß steckbar zu machen.&lt;br /&gt;
&lt;br /&gt;
=====MCR/MCL=====&lt;br /&gt;
[[Bild:RP6_MCR_MCL.JPG|thumb|RP6 MCR MCL]]&lt;br /&gt;
An diesen Trennstellen können die Motorstromsensoren von den ADC-Eingängen des Microcontrollers abgetrennt werden.&lt;br /&gt;
&lt;br /&gt;
Für den rechten Sensor ist dies die Trennstelle MCR1/2 (SP3 A1: MCR1, MCR2), für den linken Sensor MCL1/2 (SP3 E1: MCL1, MCL2).&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |Trennstelle&lt;br /&gt;
 |Portpin&lt;br /&gt;
 |Funktion H-Brücke&lt;br /&gt;
 |-&lt;br /&gt;
 |MCR1/2&lt;br /&gt;
 |PA5 (ADC5)&lt;br /&gt;
 |Motorstrom rechts&lt;br /&gt;
 |-&lt;br /&gt;
 |MCL1/2&lt;br /&gt;
 |PA6 (ADC6)&lt;br /&gt;
 |Motorstrom links&lt;br /&gt;
 |-&lt;br /&gt;
|}&lt;br /&gt;
Trennt man die Leiterbahn (auf der Lötseite des RP6 Mainboards) zwischen den Lötpunkten der Trennstellen auf, kann man die ADC-Eingänge (Portpins) des RP6 Microcontrollers (MCx1) anders nutzen und die Ausgänge der Motorstromsensoren (MCx2) z.B. mit ADC-Eingängen eines anderen Microcontrollers verbinden. Natürlich kann man auf die Lötpunkte dieser Trennstellen auch Stiftleisten löten, um den Anschluß steckbar zu machen.&lt;br /&gt;
&lt;br /&gt;
====PWRON-LED====&lt;br /&gt;
[[Bild:RP6_PWRON_L.JPG|thumb|RP6 PWRON L]]&lt;br /&gt;
Auf dem RP6 Mainboard gibt es eine gelbe LED, die anzeigt, ob PWRON High-Pegel hat. Mit einer Trennstelle neben dieser LED (SP2 D4: YL1, YL2) kann diese LED deaktiviert werden (z.B. um Strom zu sparen).&lt;br /&gt;
&lt;br /&gt;
Dazu trennt man die Leiterbahn zwischen den Lötpunkten auf. Soll die LED wieder aktiviert werden, verbindet man die Lötpunkte wieder mit etwas Lötzinn oder einem SMD Null Ohm Widerstand.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====+UB Sensor====&lt;br /&gt;
[[Bild:RP6_UB.JPG|thumb|RP6 UB]]&lt;br /&gt;
Die Versorgungsspannung +UB des RP6 wird mit dem +UB-Spannungssensor an PA7 (ADC7) gemessen. Will man diesen Spannungssensor mit seinem Eingangsspannungsteiler R1, R2 (SP1 D12: R1, R2) von +UB abtrennen (z.B. um ihn anders zu verwenden), gibt es eine Trennstelle UB1/2 (SP1 D2: UB1, UB2). Trennt man die Leiterbahn auf der Lötseite des RP6 Mainboards zwischen den Lötpunkten auf, kann +UB nicht mehr gemessen werden. Man kann dann den Lötpunkt UB2 mit einem anderen Messpunkt (z.B. mit +BAT) verbinden und dort die Spannung (0..10V) messen. Natürlich kann man auf die Lötpunkte dieser Trennstellen auch Stiftleisten löten, um den Anschluß steckbar zu machen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====EXT Anschluß: Andere Stromversorgung====&lt;br /&gt;
[[Bild:RP6_S1_CHRG.jpg|thumb|RP6 S1 CHRG]]&lt;br /&gt;
Wenn man für den RP6 eine andere Stromversorgung oder Ladeschaltung anschließen will, geht dies gut am EXT Anschluß (SP1 C23: Stecker EXT). Siehe auch den Abschnitt &amp;quot;Anschlüsse - EXT Anschluß&amp;quot; weiter oben! Dann muss der Schalter S1 dauerhaft AUSgeschaltet bleiben und die Verbindung zwischen S1 und CHRG des EXT Anschlusses (SP1 C3: X) unterbrochen werden. Diese Trennstelle befindet sich auf der Lötseite (Unterseite) des RP6 Mainboards etwas versteckt zwischen S1 (Pin 3) und der benachbarten Leiterbahn, die CHRG des EXT Anschlusses mit der Ladebuchse CHARGER (Pin 1 +) verbindet. Dort sind fünf kurze, parallele Leiterbahnen zu unterbrechen (siehe gelbe Markierung in der Abb. RP6 S1 CHRG!). Will man das nicht machen, darf man die Ladebuchse CHARGER auf jeden Fall nicht mehr nutzen!&lt;br /&gt;
&lt;br /&gt;
===Lochraster-Felder===&lt;br /&gt;
Auf diesen Feldern kann man eigene kleine Schaltungen aufbauen. An jedem der sechs Felder stehen VDD (+5V) und GND zur Verfügung (SP4 E12: YVDDx, YGNDx).&lt;br /&gt;
&lt;br /&gt;
Bitte beachten: Die Lochreihen oder -spalten, die mit einer eckigen Klammer &amp;quot;[&amp;quot; markiert sind, liegen auf der Lötseite (Unterseite) direkt auf dem Rahmen des Chassis! Hier können also keine Drähte von unten verlötet werden.&lt;br /&gt;
&lt;br /&gt;
====Vorn links====&lt;br /&gt;
Das kleine Lochrasterfeld vorn links kann z.B. für Beleuchtung (Blinker, Scheinwerfer links) oder auch für einen zusätzlichen Sensor genutzt werden.&lt;br /&gt;
Zur Verfügung steht eine 2-adrige Verbindung zum mittleren Lochrasterfeld links.&lt;br /&gt;
&lt;br /&gt;
In der Nähe dieses Lochrasterfeldes gibt es auch:&lt;br /&gt;
* IO3, IO4 (SP2 E3: IO3, IO4)&lt;br /&gt;
* ADC0 (SP2 B1: ADC0)&lt;br /&gt;
&lt;br /&gt;
====Mitte links====&lt;br /&gt;
[[Bild:RP6_Lochfeld_LM.JPG|thumb|RP6 Lochrasterfeld Mitte links]]&lt;br /&gt;
Das größere Lochrasterfeld Mitte links kann z.B. für eine kleinere Schaltung zur Ansteuerung der Beleuchtung/Sensoren auf den Lochrasterfeldern vorn und hinten links oder für andere Zwecke genutzt werden.&lt;br /&gt;
&lt;br /&gt;
Es stehen hier folgende Anschlüsse zur Verfügung:&lt;br /&gt;
* 2-adrige Verbindung zum Lochrasterfeld vorn links&lt;br /&gt;
* 2-adrige Verbindung zum Lochrasterfeld hinten links&lt;br /&gt;
* ST1/ST2 zum Anschluß weiterer Start/Stop Taster (SP2 D2: ST1/2)&lt;br /&gt;
* PWR (SP2 D2: YPWR1)&lt;br /&gt;
* I2C-Bus (SCL, SDA; SP4 C1: YSCL1, YSDA1)&lt;br /&gt;
* +UB (SP4 D2: YUB1)&lt;br /&gt;
In der Nähe dieses Lochrasterfeldes gibt es auch:&lt;br /&gt;
* Serielle Schnittstelle (RST, TX, RX; SP4 AB5: YRX, YTX, YMRESET, YVDD)&lt;br /&gt;
* USRBUS1 (vorn; SP4 E34: Y1'..Y14')&lt;br /&gt;
&lt;br /&gt;
=====Schaltungsvorschläge=====&lt;br /&gt;
Wie kann z.B. eine Schaltung für Beleuchtungseffekte oder Sensoren aussehen?&lt;br /&gt;
&lt;br /&gt;
Man könnte 8 zusätzliche Schaltkanäle mit dem I2C-Portexpander-IC PCF8574(A)P gewinnen. Dieses IC passt mit wenigen Zusatzteilen auf die mittlere Lochrasterfläche. Angesteuert wird es über den I2C-Bus. Mit den 8 Ausgängen lassen sich einige Beleuchtungseffekte erreichen, die dann über Software schaltbar sind.&lt;br /&gt;
&lt;br /&gt;
Alternativ kann man auch das IC PCF8591P z.B. für den Anschluß von analogen Sensoren verwenden. Auch dieser Baustein wird über I2C angesteuert. Beide ICs sind bei [http://www.reichelt.de./ Reichelt] erhältlich.&lt;br /&gt;
&lt;br /&gt;
Will man nicht den I2C-Bus benutzen, kann man als I/O-Ports IO1..IO4 oder als analoge Eingänge ADC0 und ADC1 verwenden. Auch SCL und SDA stehen als I/O-Ports zur Verfügung, wenn der I2C-Bus im ganzen System nicht verwendet werden soll.&lt;br /&gt;
&lt;br /&gt;
Wichtig für Zusatzschaltungen, die fest auf dem RP6 verlötet werden, sind zwei Aspekte:&lt;br /&gt;
* Wenn sie die Stromversorgung belasten, sollten sie (z.B. über einen Transistor oder MOSFET) abschaltbar sein. Dazu kann man auch das Signal PWR heranziehen, das auf beiden mittleren Lochrasterflächen zur Verfügung steht. Dann kann man mit dem Befehl &amp;quot;powerOFF()&amp;quot; der RP6 Library die Stromversorgung per Software abschalten.&lt;br /&gt;
* Wenn man auch anderweitig genutzte Portpins (SDA, SCL, IO1..IO4, ADC0/1) für die eigene Schaltung einsetzt, sollte man die Verbindung zu den Portpins mit einer abziehbaren Codierbrücke trennbar machen.&lt;br /&gt;
&lt;br /&gt;
====Hinten links====&lt;br /&gt;
Das kleine Lochrasterfeld hinten links kann z.B. für Beleuchtung (Blinker, Rücklicht links) oder auch für einen zusätzlichen Sensor genutzt werden.&lt;br /&gt;
Zur Verfügung steht eine 2-adrige Verbindung zum mittleren Lochrasterfeld links.&lt;br /&gt;
&lt;br /&gt;
In der Nähe dieses Lochrasterfeldes gibt es auch:&lt;br /&gt;
* EXT Anschluß (SP1 C23: Stecker EXT)&lt;br /&gt;
&lt;br /&gt;
====Vorn rechts====&lt;br /&gt;
Das kleine Lochrasterfeld vorn rechts kann z.B. für Beleuchtung (Blinker, Scheinwerfer rechts) oder auch für einen zusätzlichen Sensor genutzt werden.&lt;br /&gt;
Zur Verfügung steht eine 2-adrige Verbindung zum mittleren Lochrasterfeld rechts.&lt;br /&gt;
&lt;br /&gt;
In der Nähe dieses Lochrasterfeldes gibt es auch:&lt;br /&gt;
* IO1, IO2 (SP2 E3: IO1, IO2)&lt;br /&gt;
* ADC1 (SP2 B1: ADC1)&lt;br /&gt;
&lt;br /&gt;
====Mitte rechts====&lt;br /&gt;
Das größere Lochrasterfeld Mitte rechts kann z.B. für eine kleinere Schaltung zur Ansteuerung der Beleuchtung/Sensoren auf den Lochrasterfeldern vorn und hinten rechts oder für andere Zwecke genutzt werden.&lt;br /&gt;
&lt;br /&gt;
Es stehen hier folgende Anschlüsse zur Verfügung:&lt;br /&gt;
* 2-adrige Verbindung zum Lochrasterfeld vorn rechts&lt;br /&gt;
* 2-adrige Verbindung zum Lochrasterfeld hinten rechts&lt;br /&gt;
* PWR (SP2 D2: YPWR2)&lt;br /&gt;
* I2C-Bus (SCL, SDA; SP4 C1: YSCL2, YSDA2)&lt;br /&gt;
* +UB (SP4 D2: YUB2)&lt;br /&gt;
In der Nähe dieses Lochrasterfeldes gibt es auch:&lt;br /&gt;
* Interrupt-Anschluß (INTU, INT1..3, MRESET; SP4 D34: MRESET, INT1..3, INTU)&lt;br /&gt;
* USRBUS2 (hinten; SP4 E34: Y1..Y14)&lt;br /&gt;
&lt;br /&gt;
====Hinten rechts====&lt;br /&gt;
Das kleine Lochrasterfeld hinten rechts kann z.B. für Beleuchtung (Blinker, Rücklicht rechts) oder auch für einen zusätzlichen Sensor genutzt werden.&lt;br /&gt;
Zur Verfügung steht eine 2-adrige Verbindung zum mittleren Lochrasterfeld rechts.&lt;br /&gt;
&lt;br /&gt;
In der Nähe dieses Lochrasterfeldes gibt es auch:&lt;br /&gt;
* EXT Anschluß (SP1 C23: Stecker EXT)&lt;br /&gt;
* Akku-Anschluß (SP1 B3: BATTERY)&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Erweiterungen==&lt;br /&gt;
Auf / An den RP6 könnte man z.B. noch folgendes anbauen / erweitern:&lt;br /&gt;
&lt;br /&gt;
* Einen Greifarm&lt;br /&gt;
* Einen Ultraschallsensor&lt;br /&gt;
* Zwei Lichtsensoren hinten, um die hellste / dunkelste Stelle im Raum besser zu finden&lt;br /&gt;
* Einen digitalen Kompass&lt;br /&gt;
* uvm.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Erweiterungs-Module==&lt;br /&gt;
&lt;br /&gt;
Es sind von Arexx schon einige Erweiterungsmöglichkeiten auf dem Markt. Zum Ersten die Experimentierplatinen ([http://www.conrad.de/ce/de/product/191537/Arexx-RP6-Experimentierplatine 191537] AUSVERKAUFT!), die zum Erstellen von eigenen Schaltungen und Sensoren gedacht sind, und von denen eine schon im Lieferumfang des RP6 enthalten war, das Erweiterungsboard RP6 CONTROL M32 ([http://www.conrad.de/ce/de/product/191550/Arexx-RP6-ATMEGA32-Erweiterungssatz 191550] AUSVERKAUFT!) und die RP6 CCPRO M128 ([http://www.conrad.de/ce/de/product/191563/Arexx-RP6-CC-PRO-MEGA128-Erweiterungssatz 191563]).&lt;br /&gt;
&lt;br /&gt;
Die Boards kann man dann über den I2C Bus mit dem Mainboard kommunizieren lassen.  Es ist sehr sinnvoll, die Module symmetrisch hintereinander zu stapeln und nicht mehr als 6-8 Module zu verbauen, weil der Roboter sonst immer schwerer und langsamer wird. Basierend auf dem Master-Slave System könnte man so bis zu 127 Slaves anschließen. Zudem ist es ratsam, qualitativ hochwertige Akkus und ein Ladegerät mit passendem Stecker zu verwenden, da man ansonsten immer das Mainboard abschrauben müsste um an die Akkus heranzukommen. Für den Fall wurde extra eine Ladebuchse eingebaut.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Experimentierplatine ===&lt;br /&gt;
[[Bild:RP6_Exp.jpg|RP6 Experimentierplatine]]&lt;br /&gt;
&lt;br /&gt;
====Beschreibung====&lt;br /&gt;
Die Experimentier-Platine ist dazu gedacht, eigene Schaltungen auf dem RP6 zu realisieren, und ist seit Mai 2020 bei CONRAD ausverkauft. Sie wird über den I²C-Bus mit den anderen Erweiterungsmodulen verbunden. Ausserdem ist es sinnvoll, die (freien) I/O-Ports (ADC-Kanäle) der RP6 Base, des M32 Erweiterungsmoduls bzw. des CCPRO M128 Moduls über ein [http://www.reichelt.de/?;ACTION=3;LA=444;GROUP=C63;GROUPID=3328;ARTICLE=47637;START=0;SORT=artnr;OFFSET=16;SID=1580faBqwQAQ8AAGY-ZAM7cd511ee04a106a88a359faaac0071e2 10-Pol-Flachbandkabel] mit [http://www.reichelt.de/?ACTION=3;GROUP=C151;GROUPID=3231;ARTICLE=14571;SID=1580faBqwQAQ8AAGY-ZAM7cd511ee04a106a88a359faaac0071e2 Stecker] auf die Experimentierplatine zu führen, weil es übersichtlicher bleibt und keine Kabel lose herumhängen. Auf der Experimentierplatine kann man dann LEDs oder einen Temperatursensor an die I/O-Ports bzw. an die ADC-Kanäle anschießen.&lt;br /&gt;
&lt;br /&gt;
====Technische Daten====&lt;br /&gt;
{|  {{Blauetabelle}} &lt;br /&gt;
|'''Mikrocontroller:'''&lt;br /&gt;
|Keiner&lt;br /&gt;
|-&lt;br /&gt;
|'''Speicher:'''&lt;br /&gt;
|Keiner&amp;lt;br/&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|'''Programmierung:'''&lt;br /&gt;
|Kein Programmieradapter&lt;br /&gt;
|-&lt;br /&gt;
|'''Vorhandene Sensoren:'''&lt;br /&gt;
|Keine&amp;lt;br/&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|'''Vorhandene Aktoren:'''&lt;br /&gt;
|Keine&amp;lt;br/&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|'''Abmessungen:'''&lt;br /&gt;
|(L &amp;amp;times; B &amp;amp;times; H) 112 &amp;amp;times; 90 &amp;amp;times; 10 mm&lt;br /&gt;
|-&lt;br /&gt;
|'''Ausführung:'''&lt;br /&gt;
|Bausatz&lt;br /&gt;
|-&lt;br /&gt;
|'''Stromversorgung:'''&lt;br /&gt;
|6 AA NiMH Akkus (über die RP6 Base)&lt;br /&gt;
|-&lt;br /&gt;
|'''Hersteller:'''&lt;br /&gt;
|Arexx Niederlande&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Schaltungsideen ====&lt;br /&gt;
Auf der / den Experimentierplatinen könnte man z.B. folgendes realisieren:&lt;br /&gt;
&lt;br /&gt;
* eine Kameraschaltung (wie [http://www.rn-wissen.de/index.php/RP6_Kamera_-_Mitmach-Projekt hier] gezeigt)&lt;br /&gt;
* Scheinwerfer, Rücklichter, Blinker etc. (ABER immer mit Vorwiderstand!!!)&lt;br /&gt;
* ein LED-Lauflicht (über I/O-Expander, gibt´s beim [http://www.reichelt.de/?ACTION=3;ARTICLE=14527;PROVID=2402 Reichelt])&lt;br /&gt;
* mehr ADC-Kanäle (über ADC-Expander, einfach mal nach PCF8591 [http://www.google.de/search?q=PCF8591 googlen])&lt;br /&gt;
* eine Wetterstation mit Luftfeuchtemesser, Temperaturfühler und Lichtmesser ([http://www.roboternetz.de/phpBB2/viewtopic.php?t=52298 hier] gibt es eine Wetterstation uvm.)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== RP6 CONTROL M32 Platine ===&lt;br /&gt;
[[Bild:RP6Control_M32.jpg|RP6 CONTROL M32]]&lt;br /&gt;
&lt;br /&gt;
====Beschreibung====&lt;br /&gt;
Auf der M32 ([http://www.conrad.de/ce/de/product/191550/Arexx-RP6-ATMEGA32-Erweiterungssatz 191550]) lassen sich weitere LEDs, Sensoren oder ähnliches anschließen, außerdem steht ein weiterer ATMEGA32 zur Verfügung, welcher sich gut im Master Modus betreiben lässt. Es sind ein Mikrofonsensor, fünf Taster, vier Status-LEDs, ein Display-Port, ein Beeper, 6 freie ADC-Kanäle, 8 freie I/O-Ports, ein Programmieradapter, ein JTAG-Anschluss, eine ISP-Programmierschnittstelle sowie ein freier Steckplatz für ein EEPROM verfügbar.&lt;br /&gt;
&lt;br /&gt;
Seit Ende 2021 ist die M32 bei CONRAD ausverkauft!&lt;br /&gt;
&lt;br /&gt;
====Technische Daten====&lt;br /&gt;
{|  {{Blauetabelle}} &lt;br /&gt;
|'''Mikrocontroller:'''&lt;br /&gt;
|AVR [[ATmega32]]&lt;br /&gt;
|-&lt;br /&gt;
|'''Speicher:'''&lt;br /&gt;
|32 kB [[Flash]]-Speicher, davon 1 kB bereits vom Bootloader belegt&amp;lt;br/&amp;gt;&lt;br /&gt;
2 kB SRAM&amp;lt;br/&amp;gt; &lt;br /&gt;
1 kB [[EEPROM]]&lt;br /&gt;
|-&lt;br /&gt;
|'''Programmierung:'''&lt;br /&gt;
|Über AVR-[[Bootloader]], belegt ca. 1 kB des Flash-Speichers&lt;br /&gt;
|-&lt;br /&gt;
|'''Vorhandene Sensoren:'''&lt;br /&gt;
|1 Mikrofonsensor&amp;lt;br/&amp;gt;&lt;br /&gt;
5 Eingabetaster&amp;lt;br/&amp;gt;&lt;br /&gt;
14 I/O Ports, davon 6 ADC-Wandler&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|'''Vorhandene Aktoren:'''&lt;br /&gt;
|1 Beeper&amp;lt;br/&amp;gt;&lt;br /&gt;
4 Status-LEDs&amp;lt;br/&amp;gt;&lt;br /&gt;
1 LC-Display-Port&amp;lt;br/&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|'''Abmessungen:'''&lt;br /&gt;
|(L &amp;amp;times; B &amp;amp;times; H) 112 &amp;amp;times; 90 &amp;amp;times; 15 mm&lt;br /&gt;
|-&lt;br /&gt;
|'''Ausführung:'''&lt;br /&gt;
|Fertig aufgebautes Erweiterungsmodul&lt;br /&gt;
|-&lt;br /&gt;
|'''Stromversorgung:'''&lt;br /&gt;
|6 AA NiMH Akkus (über die RP6 Base)&lt;br /&gt;
|-&lt;br /&gt;
|'''Hersteller:'''&lt;br /&gt;
|Arexx Niederlande&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Umbau-Optionen ====&lt;br /&gt;
Dieser Absatz soll die Möglichkeiten der RP6 CONTROL M32 Platine (im Folgenden &amp;quot;M32&amp;quot; genannt) auflisten, die es gibt, um auf einfache Weise weitere Anschlüsse oder Verbindungen zu ermöglichen. Nicht beschrieben werden die Anschlußmöglichkeiten, die in Form der vorhandenen Wannenstecker sowieso gegeben sind (z.B. am LCD-, I/O- oder ADC-Stecker). Im Text gibt es Verweise auf den Schaltplan der M32 (RP6_CONTROL_M32.PDF) in der Form: (SP2 B1: Bauteil).  Dies bedeutet, dass man das Bauteil auf Blatt 2 des RP6-M32-Schaltplans im Feld B1 finden kann.&lt;br /&gt;
&lt;br /&gt;
Folgende Möglichkeiten zum Umbau/Ausbau sind vorgesehen:&lt;br /&gt;
* Zweites SPI-EEPROM (IC5)&lt;br /&gt;
* Zwei analoge Sensoren, evtl. mit getrennter Stromversorgung&lt;br /&gt;
* ISP (In System Programming)&lt;br /&gt;
* JTAG-Programmierung&lt;br /&gt;
* USRBUS&lt;br /&gt;
* IRQ-Zuweisung ändern&lt;br /&gt;
* ADC0 und ADC1 anders nutzen&lt;br /&gt;
* Schieberegister kaskadieren&lt;br /&gt;
Im folgenden Text soll beschrieben werden, wie man die weiteren Möglichkeiten nutzen kann. Es wird jeweils erwähnt, was man an Material braucht. Beispielhaft sind da Bestell-Nummern der Firma [http://www.conrad.de/ce/ CONRAD] genannt. Natürlich kann man die Teile auch bei anderen Versendern beziehen. Durch die Nennung der Bestell-Nummer ist das jeweilige Teil aber gut zu identifizieren. Man sollte Löten können und sich bewußt sein, dass ggf. ein Garantieanspruch nicht mehr besteht, wenn man an der Platine gelötet hat.&lt;br /&gt;
&lt;br /&gt;
Bei den Materialangaben ist öfter die Rede von &amp;quot;Steckbuchsen mit Litze&amp;quot;. Diese Steckbuchsen mit angelöteter Litze können auf die ein- oder zweireihigen Stiftleisten aufgesteckt werden. Leider gibt es sie nicht (mehr) fertig konfektioniert bei CONRAD. Die einreihigen Steckbuchsen (RM 2,54mm) kann man aber z.B. bei [http://www.elv.de/output/controller.aspx ELV] bekommen: 2-polig (68-016635), 3-polig (68-022503) und 5-polig (68-023073). An sie muss man dann noch Litzen in der entsprechenden Länge selbst anlöten.&lt;br /&gt;
&lt;br /&gt;
===== Zweites SPI-EEPROM =====&lt;br /&gt;
Es ist sehr einfach, ein zweites SPI-EEPROM (SP1 A1: IC5*) auf der M32 zu nutzen.&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_M32_IC5-Socket.JPG|thumb|Sockel des 2. SPI-EEPROMs]]&lt;br /&gt;
&lt;br /&gt;
Man braucht dazu:&lt;br /&gt;
* Einen IC-Sockel 8-pol DIP für IC5 ([http://www.conrad.de/ce/de/product/189600/IC-FASSUNG-PRAeZISION-8POLIG 189600])&lt;br /&gt;
* Einen Keramik-Vielschicht-Kondensator 100nF (C19); RM 2,54mm ([http://www.conrad.de/ce/de/product/453099/?insert=36&amp;amp;insertNoDeeplink&amp;amp;productname=KONDENSATOR-01-F-KDPU-254-MM 453099])&lt;br /&gt;
* Ein serielles SPI-EEPROM im PDIP8 Gehäuse (IC5)&lt;br /&gt;
Zuerst wird der IC-Sockel eingelötet (Kerbe beachten!), dann C19 (SP1 A1: C19*). Das war's.&lt;br /&gt;
&lt;br /&gt;
Leider gibt es das EEPROM nicht bei den gängigeren Versendern. Bekommen kann man es aber z.B. bei [http://de.farnell.com/jsp/home/homepage.jsp Farnell]. Dort hat das SPI-EEPROM mit 256 kbit die Bezeichnung 25LC256-I/P (1331398). Wenn man es noch größer mag: 25LC1024 (1331392) mit 1024 kbit. SPI-EEPROMs führt inzwischen auch [http://www.reichelt.de./ Reichelt].&lt;br /&gt;
&lt;br /&gt;
'''Programmierung:'''&lt;br /&gt;
&lt;br /&gt;
In die RP6ControlLib.h bitte einfügen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#define SPI_EEPROM2_PAGESIZE 64&lt;br /&gt;
&lt;br /&gt;
uint8_t SPI_EEPROM2_readByte(uint16_t memAddr);&lt;br /&gt;
void SPI_EEPROM2_writeByte(uint16_t memAddr, uint8_t data);&lt;br /&gt;
void SPI_EEPROM2_enableWrite(void);&lt;br /&gt;
void SPI_EEPROM2_disableWrite(void);&lt;br /&gt;
uint8_t SPI_EEPROM2_getStatus(void);&lt;br /&gt;
&lt;br /&gt;
void SPI_EEPROM2_writeBytes(uint16_t startAddr, uint8_t *buffer, uint8_t length);&lt;br /&gt;
void SPI_EEPROM2_readBytes(uint16_t startAddr, uint8_t *buffer, uint8_t length);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Die Konstante SPI_EEPROM2_PAGESIZE ist abhängig von der Art und Größe des EEPROMs. Für ein 256 kbit-EEPROM ist die Seitengröße (pagesize) in der Regel 64, für einen 512 kbit-Typ 128 und für einen 1024 kbit-Typ 256.&lt;br /&gt;
&lt;br /&gt;
In die RP6ControlLib.c bitte einfügen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Second external SPI EEPROM:&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Reads a single Byte from the 2nd external EEPROM.&lt;br /&gt;
 */&lt;br /&gt;
uint8_t SPI_EEPROM2_readByte(uint16_t memAddr)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t data;&lt;br /&gt;
	PORTB &amp;amp;= ~MEM_CS2;&lt;br /&gt;
	writeSPI(SPI_EEPROM_READ);&lt;br /&gt;
	writeWordSPI(memAddr);&lt;br /&gt;
	data = readSPI();&lt;br /&gt;
	PORTB |= MEM_CS2;&lt;br /&gt;
	return data;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Reads &amp;quot;length&amp;quot; Bytes into the Buffer &amp;quot;buffer&amp;quot; from startAdr on. &lt;br /&gt;
 * You can read the complete 2nd EEPROM into a buffer at once - if it is large enough. &lt;br /&gt;
 * (But you only have 2KB SRAM on a MEGA32 ;) )&lt;br /&gt;
 */&lt;br /&gt;
void SPI_EEPROM2_readBytes(uint16_t startAddr, uint8_t *buffer, uint8_t length)&lt;br /&gt;
{&lt;br /&gt;
	PORTB &amp;amp;= ~MEM_CS2;&lt;br /&gt;
	writeSPI(SPI_EEPROM_READ);&lt;br /&gt;
	writeWordSPI(startAddr);&lt;br /&gt;
	readBufferSPI(&amp;amp;buffer[0], length);&lt;br /&gt;
	PORTB |= MEM_CS2;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Enable Write Mode&lt;br /&gt;
 */&lt;br /&gt;
void SPI_EEPROM2_enableWrite(void)&lt;br /&gt;
{&lt;br /&gt;
	PORTB &amp;amp;= ~MEM_CS2;&lt;br /&gt;
	writeSPI(SPI_EEPROM_WREN);&lt;br /&gt;
	PORTB |= MEM_CS2;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Disable Write Mode&lt;br /&gt;
 */&lt;br /&gt;
void SPI_EEPROM2_disableWrite(void)&lt;br /&gt;
{&lt;br /&gt;
	PORTB &amp;amp;= ~MEM_CS2;&lt;br /&gt;
	writeSPI(SPI_EEPROM_WRDI);&lt;br /&gt;
	PORTB |= MEM_CS2;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Write a single data byte to the specified 2nd EEPROM address.&lt;br /&gt;
 */&lt;br /&gt;
void SPI_EEPROM2_writeByte(uint16_t memAddr, uint8_t data)&lt;br /&gt;
{&lt;br /&gt;
	while(SPI_EEPROM2_getStatus() &amp;amp; SPI_EEPROM_STAT_WIP);&lt;br /&gt;
	SPI_EEPROM2_enableWrite();&lt;br /&gt;
	PORTB &amp;amp;= ~MEM_CS2;&lt;br /&gt;
	writeSPI(SPI_EEPROM_WRITE);&lt;br /&gt;
	writeWordSPI(memAddr);&lt;br /&gt;
	writeSPI(data);&lt;br /&gt;
	PORTB |= MEM_CS2;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Write &amp;quot;length&amp;quot; Bytes from the Buffer to the 2nd EEPROM. &lt;br /&gt;
 * YOU CAN ONLY WRITE MAXIMAL [SPI_EEPROM2_PAGESIZE] BYTES AT ONCE!!!&lt;br /&gt;
 * This is the Pagesize!&lt;br /&gt;
 * You can NOT cross a page boundary!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void SPI_EEPROM2_writeBytes(uint16_t startAddr, uint8_t *buffer, uint8_t length)&lt;br /&gt;
{&lt;br /&gt;
	while(SPI_EEPROM2_getStatus() &amp;amp; SPI_EEPROM_STAT_WIP);&lt;br /&gt;
	SPI_EEPROM2_enableWrite();&lt;br /&gt;
	PORTB &amp;amp;= ~MEM_CS2;&lt;br /&gt;
	writeSPI(SPI_EEPROM_WRITE);&lt;br /&gt;
	writeWordSPI(startAddr);&lt;br /&gt;
	writeBufferSPI(&amp;amp;buffer[0], length);&lt;br /&gt;
	PORTB |= MEM_CS2;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Returns EEPROM Status register - for checking if 2nd EEPROM is buisy. &lt;br /&gt;
 * Writing takes about 5ms. &lt;br /&gt;
 */&lt;br /&gt;
uint8_t SPI_EEPROM2_getStatus(void)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t status;&lt;br /&gt;
	PORTB &amp;amp;= ~MEM_CS2;&lt;br /&gt;
	writeSPI(SPI_EEPROM_RDSR);&lt;br /&gt;
	status = readSPI();&lt;br /&gt;
	PORTB |= MEM_CS2;&lt;br /&gt;
	return status;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Hinweis zum 1024 kbit-EEPROM:&lt;br /&gt;
&lt;br /&gt;
Dieses EEPROM benötigt 24-Bit Adressen und muss daher etwas anders angesprochen werden als die &amp;quot;kleineren&amp;quot; Typen bis 512 kbit.&lt;br /&gt;
Die Funktion SPI_EEPROM2_readByte() sieht für ein 1024 kbit-EEPROM z.B. so aus:&lt;br /&gt;
&amp;lt;pre&amp;gt;uint8_t SPI_EEPROM2_readByte(uint32_t memAddr)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t data;&lt;br /&gt;
	PORTB &amp;amp;= ~MEM_CS2;&lt;br /&gt;
	writeSPI(SPI_EEPROM_READ);&lt;br /&gt;
	writeSPI((uint8_t)(memAddr &amp;gt;&amp;gt; 16));&lt;br /&gt;
	writeWordSPI((uint16_t)memAddr);&lt;br /&gt;
	data = readSPI();&lt;br /&gt;
	PORTB |= MEM_CS2;&lt;br /&gt;
	return data;&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
Alle weiteren Funktionen, die EEPROM-Adressen verwenden (SPI_EEPROM2_readBytes, SPI_EEPROM2_writeByte, SPI_EEPROM2_writeBytes), müssen genau so angepasst werden.&lt;br /&gt;
&lt;br /&gt;
===== Anschlüsse =====&lt;br /&gt;
Hier wird aufgelistet, wo man auf der M32 Platine Anschlüsse nutzen kann, um sie z.B. zu weiteren Sensoren, zum USRBUS oder (weniger empfehlenswert!) direkt zu EPs, zur RP6 Base oder zur CCPRO M128 zu führen. &lt;br /&gt;
&lt;br /&gt;
====== Analoge Sensoren an ADC2/3 ======&lt;br /&gt;
[[Bild:RP6_M32_ADC23.JPG|thumb|ADC2 ADC3]]&lt;br /&gt;
Wenn man bis zu zwei analoge Sensoren (z.B. IR-Distanz-Mess-Sensoren Sharp GP2Y0A02YK 185364) direkt an die M32 anschließen möchte, dann gibt es da zwei 3-polige Kontakte, beschriftet mit VDD/GND/ADCx (x = 2..3). Hier kann man 3-polige Stiftleisten auflöten, an die dann die Sensoren angeschlossen werden.&lt;br /&gt;
&lt;br /&gt;
Man braucht dazu:&lt;br /&gt;
* 1-reihige Stiftleiste RM 2,54mm (z.B. 36-polig 732478)&lt;br /&gt;
* Zwei Keramik-Vielschicht-Kondensatoren 100nF (C16, C17); RM 2,54mm (453099)&lt;br /&gt;
* Ein Elektrolyt-Kondensator stehend 470 uF / 16V (C18); RM 3,5mm (446211)&lt;br /&gt;
* Zwei 3-polige Steckbuchsen mit Litze zum Anschluß der Sensoren&lt;br /&gt;
Man trennt von der 1-reihigen Stiftleiste zweimal 3 Kontakte ab und lötet sie auf die weiß umrahmten Kontakte (VDD/GND/ADCx; SP2 C23: ADC2, YGND8, YVDD6, ADC3, YGND7, YVDD5), anschließend C16, C17 (SP2 C1: C16*, C17*) auf ihre Plätze und zum Schluß den Elko 470 uF (C18; SP2 B1: C18*). Beim Elko auf die Polung achten: Er muss genau so sitzen wie sein Nachbar C1 (Minuspol schaut zum Beeper SND).&lt;br /&gt;
&lt;br /&gt;
Die Sensoren lötet man an die Litzen der 3-poligen Steckbuchsen und steckt diese auf die neuen Kontakte.&lt;br /&gt;
&lt;br /&gt;
Da manche Sensoren einen höheren Stromverbrauch haben, kann man die Stromversorgung an den VDD-Pins der ADC2/3-Stecker abschaltbar machen oder eine separate +5V-Spannung einspeisen. Siehe dazu den Abschnitt &amp;quot;Trennstellen - Getrennte Stromversorgung für ADC2/3&amp;quot; weiter unten!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====== ISP (In System Programming) ======&lt;br /&gt;
Der ATMEGA32 der M32 wird standardmäßig über den PROG/UART Stecker programmiert. Dazu befindet sich im Prozessor ein Bootloader-Programm. Wenn man stattdessen oder zusätzlich die ISP-Programmierung mit einem dafür geeigneten ISP-Programmier-Adapter nutzen will, kann man den Adapter an den gewinkelten ISP-Stecker auf der M32 anschließen.&lt;br /&gt;
Vorher sind aber ein paar &amp;quot;Umbauarbeiten&amp;quot; erforderlich.&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_M32_ISP.JPG|thumb|ISP]]&lt;br /&gt;
&lt;br /&gt;
Man braucht dazu:&lt;br /&gt;
* 1-reihige Stiftleiste RM 2,54mm (z.B. 36-polig 732478)&lt;br /&gt;
* Einen SMD-Widerstand 10 kOhm (406376)&lt;br /&gt;
* Eine SMD-Diode LL 4148 (140902)&lt;br /&gt;
* Eine Codierbrücke (z.B. aus Set 742902)&lt;br /&gt;
&lt;br /&gt;
Der SMD-Widerstand wird auf seinen Platz (R1; SP1 A3: R1*) neben dem XBUS2-Stecker gelötet, danach die Diode LL 4148 (D2; SP1 B3: D2*). Die Kathode (Strich) der Diode zeigt in Richtung des Quarzes (X1). Zwischen R1 und C1 befinden sich drei Lötpunkte (beschriftet mit ISP/DEBUG - BOOTLOAD; SP1 A34: YRST1..3), auf die eine 3-polige Stiftleiste gelötet werden muss. Vorher muss eine kurze Leiterbahn zwischen den Lötpunkten BOOTLOAD aufgetrennt werden. Die Leiterbahn befindet sich auf der Lötseite der Platine und muss mit einem scharfen Messer oder einem speziellen Leiterbahn-Unterbrecher zwischen den beiden Lötpunkten unterbrochen werden. Man sollte anschließend mit einem Widerstandsmeßgerät nachmessen: Es sollte keine Verbindung mehr zwischen den Lötpunkten bestehen.&lt;br /&gt;
Man trennt dann von der 1-reihigen Stiftleiste 3 Kontakte ab und lötet sie auf die beschriebenen drei Lötpunkte.&lt;br /&gt;
&lt;br /&gt;
Wenn man jetzt eine Codierbrücke auf die mit &amp;quot;BOOTLOAD&amp;quot; beschrifteten Pins steckt, bleibt alles unverändert: Die Programmierung erfolgt weiter über den PROG/UART-Stecker mithilfe des Bootloaders im Prozessor. Wird die Codierbrücke in Stellung &amp;quot;ISP/DEBUG&amp;quot; umgesteckt, kann der Prozessor mit ISP programmiert werden.&lt;br /&gt;
&lt;br /&gt;
Vorsicht: Das Bootloader-Programm kann dabei zerstört werden! Es müssen zusätzlich Fusebits des ATMEGA32 verändert werden. &lt;br /&gt;
&lt;br /&gt;
Dabei kann der Prozessor im schlimmsten Fall nicht mehr ansprechbar sein. Man sollte diesen Umbau und die ISP-Programmierung nur machen, wenn man genau weiß, was man macht!&lt;br /&gt;
&lt;br /&gt;
Eine Kopie des Bootloaders und eine Kurzanleitung zum Einstellen der Fusebits gibt es hier: &lt;br /&gt;
[http://www.arexx.com/rp6/downloads/RP6_M32_BOOTLOADER.zip RP6_M32_BOOTLOADER]&lt;br /&gt;
&lt;br /&gt;
====== JTAG ======&lt;br /&gt;
[[Bild:RP6_M32_JTAG.JPG|thumb|JTAG]]&lt;br /&gt;
Die Programmierung und ein Debuggen sind auch mit der JTAG-Schnittstelle möglich. Das ist nur zu empfehlen, wenn man Erfahrungen mitbringt, oder der Prozessor der M32 durch eine ISP-Falschprogrammierung z.B. nicht mehr ansprechbar ist.&lt;br /&gt;
Um die JTAG-Schnittstelle nutzen zu können, muss der ISP-Umbau durchgeführt worden sein und die dort beschriebene Codierbrücke auf &amp;quot;ISP/DEBUG&amp;quot; gesteckt sein. Der JTAG-Programmer kann dann an die Lötpunkte &amp;quot;JTAG&amp;quot; zwischen ISP- und I/O-Stecker angeschlossen werden.&lt;br /&gt;
&lt;br /&gt;
Man braucht dazu:&lt;br /&gt;
* 2-reihige Stiftleiste RM 2,54mm (z.B. 2x36-polig 742007)&lt;br /&gt;
Man trennt von der 2-reihigen Stiftleiste 2x5 Kontakte ab und lötet sie auf die 10 JTAG-Lötpunkte (SP2 A12: YTDI, YTDO, YTMS, YTCK, YTRST, YVDD3/4, YGND3/4, YNC). Hier kann jetzt der JTAG-Programmer z.B. mit einem 10-poligen Flachkabel-Stecker angeschlossen werden. Um das JTAG-Interface des ATMEGA32 nutzen zu können, müssen Änderungen an den Fusebits vorgenommen werden.&lt;br /&gt;
&lt;br /&gt;
Vorsicht: Man sollte die JTAG-Programmierung und Fusebit-Manipulationen nur machen, wenn man genau weiß, was man macht!&lt;br /&gt;
&lt;br /&gt;
====== USRBUS ======&lt;br /&gt;
Die 14 Kontakte der beiden USRBUS-Stecker sind auf der M32 nirgendwo angeschlossen, sondern können über die Lötpunkte Y1..Y14 mit beliebigen Punkten auf der M32 verbunden werden.&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_M32_USRBUS.JPG|thumb|USRBUS]]&lt;br /&gt;
&lt;br /&gt;
Ich würde auf Y1..Y14 eine Stiftleiste löten, damit die USRBUS-Belegung geändert werden kann.&lt;br /&gt;
&lt;br /&gt;
Man braucht dazu:&lt;br /&gt;
* 2-reihige Stiftleiste RM 2,54mm (z.B. 2x36-polig 742007)&lt;br /&gt;
* Einige Steckbuchsen mit Litze&lt;br /&gt;
&lt;br /&gt;
Man trennt von der 2-reihigen Stiftleiste 2x7 Kontakte ab und lötet sie auf die Punkte Y1..Y14 (SP2 E3: Y1..Y14) neben dem Wannenstecker USRBUS2. Wird die M32 über Flachkabel mit einem USRBUS-Stecker auf einer RP6 Experimentierplatine (EP) und/oder mit dem RP6 selbst verbunden, dann hat man mit allen mit dem USRBUS verbundenen Platinen eine direkte 14-polige Verbindung,- eben den &amp;quot;User Bus&amp;quot;. Den kann man dann nutzen, wie man will. Auf der M32 kann man mit Steckbuchsen die Pins Y1..Y14 mit anderen Pins verbinden.&lt;br /&gt;
&lt;br /&gt;
Beispiel: Verbindet man den Pin &amp;quot;ADC2&amp;quot; mit Y1 des USRBUS, dann steht der Eingang ADC2 auf allen an den USRBUS angeschlossenen Platinen an Y1 zur Verfügung. Man braucht also diesen Eingang nicht über ein eigenes Kabel auf eine EP zu führen, sondern kann dazu den USRBUS nehmen. Dadurch bleibt der Gesamtaufbau auf dem RP6 übersichtlich und komplett trennbar (man braucht nur die Stecker XBUS und USRBUS abzuziehen!).&lt;br /&gt;
&lt;br /&gt;
Wichtig: Man sollte gut dokumentieren, wie man den USRBUS am RP6 (vorn und hinten getrennt!), auf EPs und der M32/M128 benutzt! Sonst kann es bei einer anderen Anordnung von EPs zu USRBUS Konflikten/Kurzschlüssen kommen.&lt;br /&gt;
&lt;br /&gt;
====== Schieberegister kaskadieren ======&lt;br /&gt;
[[Bild:RP6_M32_SPI.JPG|thumb|SPI]]&lt;br /&gt;
Auf der M32 wird ein 8-Bit Schieberegister-Baustein (IC3: 74HC4094D) dazu gebraucht, vier Status-LEDs (LED1..LED4) und ein LCD (am Stecker LCD) anzusteuern. Durch Schieberegister kann man Port-Pins gewinnen, wenn die Pins des Prozessors nicht ausreichen.&lt;br /&gt;
&lt;br /&gt;
Solche Schieberegister kann man &amp;quot;kaskadieren&amp;quot;, d.h. weitere identische Bausteine einbauen, die weitere Port-Pins zur Verfügung stellen. Wenn man zusätzliche 74HC4094 einsetzen will, wird man das am besten auf einer EP aufbauen. Die Anschlüsse für diese Schieberegister werden auf der M32 an einer 6-poligen Reihe von Lötpunkten (beschriftet mit MISO, STR, MOSI, SCK, QS, QS*; SP1 D3: YQS1/2, YMOSI, YSCK, YSTR, YMISO) links von IC3 zur Verfügung gestellt.&lt;br /&gt;
&lt;br /&gt;
Wenn man diese 6 Signalleitungen auf eine EP führen will, gibt es dafür zwei Möglichkeiten:&lt;br /&gt;
* a) Direkte 6-polige Kabelverbindung von den oben beschriebenen Lötpunkten zur EP&lt;br /&gt;
* b) Nutzung des USRBUS, um die 6 Signale zur EP zu führen&lt;br /&gt;
Wenn man im Abschnitt &amp;quot;[[RP6#USRBUS|USRBUS]]&amp;quot; den entsprechenden Umbau gemacht hat, würde ich b) empfehlen! Man könnte dafür eine 6-polige Stiftleiste auf die o.g. Lötpunkte auflöten und 1:1 z.B. mit den Pins Y4, Y6, Y8, Y10, Y12, Y14 des USRBUS verbinden. Dann kann man auf der EP weitere Schieberegister- und SPI-Bausteine (z.B. SPI-EEPROMs, [http://www.pollin.de/shop/dt/MDU5OTgxOTk-/Bausaetze_Module/Module/Funkmodul_RFM12_433_Sende_Empfangsmodul.html RFM12 Transceiver] o.ä.) aufbauen.&lt;br /&gt;
&lt;br /&gt;
Man braucht dazu:&lt;br /&gt;
* 1-reihige Stiftleiste RM 2,54mm (z.B. 36-polig 732478)&lt;br /&gt;
* Steckbuchsen mit Litze&lt;br /&gt;
Man trennt von der 1-reihigen Stiftleiste 6 Kontakte ab und lötet sie auf die beschriebenen sechs Lötpunkte auf der M32. Mit den Steckbuchsen mit Litze wird dann die Verbindung entweder direkt zur EP (Option a) oder über den USRBUS zur EP (Option b) hergestellt.&lt;br /&gt;
&lt;br /&gt;
====== VDD/GND/+UB Anschluß ======&lt;br /&gt;
[[Bild:RP6_M32_VDDGNDUB.JPG|thumb|RP6 M32 VDD GND +UB]]&lt;br /&gt;
VDD, GND und +UB (SP2 C3: YUB1, YGND1/2/5, YVDD1/2) kann man auf der M32 an diesen Lötpunkten abnehmen.&lt;br /&gt;
&lt;br /&gt;
Natürlich kann man hier auch Stiftleisten auflöten.&lt;br /&gt;
&lt;br /&gt;
Auf der anderen Platinenseite (zwischen dem USRBUS1 und ISP Stecker) befinden sich zusätzlich noch 2 weitere Lötpunkte, an denen man VDD und GND kontaktieren kann.&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;
&lt;br /&gt;
====== Serielle Schnittstelle ======&lt;br /&gt;
[[Bild:RP6_M32_RST.JPG|thumb|RP6 M32 RST]]&lt;br /&gt;
Neben dem PROG/UART Stecker befinden sich 5 Lötpunkte mit den Signalen RST, TX, RX, GND, VDD (SP2 BC3: YRX, YTX, YRST, YVDD, YGND). Hier kann z.B. eine 5-polige Stiftleiste aufgelötet werden, um einen Anschluß an die serielle Schnittstelle zu ermöglichen.&lt;br /&gt;
 &lt;br /&gt;
Von diesen 5 Lötpunkten könnte z.B. auch eine Verbindung zum USRBUS hergestellt werden, um die serielle Schnittstelle der M32 auf EPs zu führen.&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;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====== MEM_CS2 ======&lt;br /&gt;
[[Bild:RP6_M32_MEM_CS2.JPG|thumb|RP6 M32 MEM_CS2]]&lt;br /&gt;
MEM_CS2 (M32 Microcontroller Pin PB1) kann man am IC5-Sockel an Pin 1 (SP1 A1: IC5*, Pin 1) kontaktieren. Falls IC5 nicht eingesetzt werden soll, kann man hier durch Einstecken eines Kabels in Pin 1 des IC5-Sockels PB1 nutzen und z.B. zum USRBUS führen.&lt;br /&gt;
&lt;br /&gt;
===== Mess-/Kontaktpunkte =====&lt;br /&gt;
Hier geht es um Kontaktpunkte, an denen man z.B. den Logik-Pegel (High/Low) oder eine analoge Spannung messen kann. Natürlich kann man die Signale auch zur Weiterleitung auf eine EP kontaktieren, dies wird man aber normalerweise nicht brauchen.&lt;br /&gt;
&lt;br /&gt;
====== M-Signal ======&lt;br /&gt;
[[Bild:RP6_M32_M_SIGNAL.JPG|thumb|RP6 M32 M-Signal]]&lt;br /&gt;
An diesem Messpunkt (SP1 E3: YM_SIGNAL) neben D1 kann man die Ausgangsspannung des Mikrofon-Verstärkers IC4 (SP1 E3: IC4) messen oder z.B. mit einem Oszilloskop darstellen.&lt;br /&gt;
&lt;br /&gt;
===== Trennstellen =====&lt;br /&gt;
An diesen Stellen können Leiterbahnen unterbrochen werden, um Funktionen zu deaktivieren oder anders zu nutzen. &lt;br /&gt;
&lt;br /&gt;
====== Getrennte Stromversorgung für ADC2/3 ======&lt;br /&gt;
Wenn man für die analogen Sensoren an ADC2/3 (siehe Abschnitt &amp;quot;Anschlüsse - Analoge Sensoren an ADC2/3&amp;quot; weiter oben!) eine GETRENNTE Stromversorgung vorsehen will und/oder mit Codierbrücke (oder MOSFET) die Stromversorgung abschaltbar machen möchte, muss man erst Vorarbeit leisten.&lt;br /&gt;
[[Bild:RP6_M32_SV.jpg|thumb|RP6 M32 SV]]&lt;br /&gt;
&lt;br /&gt;
Man braucht dazu:&lt;br /&gt;
* 1-reihige Stiftleiste RM 2,54mm (z.B. 36-polig 732478)&lt;br /&gt;
* Evtl.: Eine Codierbrücke (z.B. aus Set 742902)&lt;br /&gt;
* Evtl.: Eine 1-polige Steckbuchse mit Litze zur ext. Stromversorgung&lt;br /&gt;
Es muss eine kurze Leiterbahn zwischen den Punkten &amp;quot;SV1&amp;quot; und &amp;quot;SV2&amp;quot; (SP2 B2: SV1, SV2) aufgetrennt werden. Die Leiterbahn befindet sich auf der Lötseite der Platine und muss mit einem scharfen Messer oder einem speziellen Leiterbahn-Unterbrecher zwischen den beiden Lötpunkten unterbrochen werden. Man sollte anschließend mit einem Widerstandsmeßgerät zwischen SV1 und SV2 nachmessen: Es sollte keine Verbindung mehr bestehen. Jetzt trennt man von der 1-reihigen Stiftleiste 2 Kontakte ab und lötet sie auf die Punkte SV1/SV2.&lt;br /&gt;
&lt;br /&gt;
Man kann hier zunächst eine Codierbrücke aufstecken. Damit versorgt der RP6 Akku die Sensoren mit 5V an den Pins VDD. Möchte man später eine getrennte 5V-Spannung anlegen, zieht man einfach die Codierbrücke ab und speist die externe 5V-Spannung (mit einer 1-poligen Steckbuchse) am Pin SV2 ein. Achtung: An Pin SV1 wird dann nichts angeschlossen!&lt;br /&gt;
&lt;br /&gt;
Anstelle der Codierbrücke kann man natürlich auch einen MOSFET anschließen, um die Sensoren per Software abschalten zu können.&lt;br /&gt;
&lt;br /&gt;
====== Interrupt-Zuordnung ändern ======&lt;br /&gt;
Am XBUS stehen vier Interrupt-Pins (genannt INT1..INT3, INTU) zur Verfügung. INT1 ist auf der RP6 Base mit PA4 verbunden, auf der M32 mit PD2 (Prozessor INT0), auf der M128 mit PE5 (Prozessor INT5) und auf der [[RP6v2#RP6v2_M256_WiFi_Platine|RP6 M256 WiFi]] mit PJ3 (Prozessor PCINT12). Diese Tabelle zeigt die Verbindung aller Interruptleitungen auf den Platinen (RP6 Base, M32, M128, M256 WiFi) über den XBUS:&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |XBUS Pin&lt;br /&gt;
 |XBUS INTx&lt;br /&gt;
 |RP6 Base Pin&lt;br /&gt;
 |RP6 Base INTx&lt;br /&gt;
 |RP6 M32 Pin&lt;br /&gt;
 |RP6 M32 INTx&lt;br /&gt;
 |RP6 M128 Pin&lt;br /&gt;
 |RP6 M128 INTx&lt;br /&gt;
 |RP6 M256 Pin&lt;br /&gt;
 |RP6 M256 INTx&lt;br /&gt;
 |-&lt;br /&gt;
 |8&lt;br /&gt;
 |INT1&lt;br /&gt;
 |PA4&lt;br /&gt;
 |kein&lt;br /&gt;
 |PD2&lt;br /&gt;
 |INT0&lt;br /&gt;
 |PE5&lt;br /&gt;
 |INT5&lt;br /&gt;
 |PJ3&lt;br /&gt;
 |PCINT12&lt;br /&gt;
 |-&lt;br /&gt;
 |11&lt;br /&gt;
 |INT2&lt;br /&gt;
 |n.c.&lt;br /&gt;
 |&lt;br /&gt;
 |PD3 *&lt;br /&gt;
 |INT1&lt;br /&gt;
 |n.c.&lt;br /&gt;
 |&lt;br /&gt;
 |PJ6&lt;br /&gt;
 |PCINT15&lt;br /&gt;
 |-&lt;br /&gt;
 |9&lt;br /&gt;
 |INT3&lt;br /&gt;
 |n.c.&lt;br /&gt;
 |&lt;br /&gt;
 |PB2 *&lt;br /&gt;
 |INT2&lt;br /&gt;
 |PE6&lt;br /&gt;
 |INT6&lt;br /&gt;
 |PJ5&lt;br /&gt;
 |PCINT14&lt;br /&gt;
 |-&lt;br /&gt;
 |7&lt;br /&gt;
 |INTU&lt;br /&gt;
 |n.c.&lt;br /&gt;
 |&lt;br /&gt;
 |n.c.    *&lt;br /&gt;
 |&lt;br /&gt;
 |n.c.&lt;br /&gt;
 |&lt;br /&gt;
 |PJ4&lt;br /&gt;
 |PCINT13&lt;br /&gt;
 |-&lt;br /&gt;
|}&lt;br /&gt;
'''Zu *:''' Standard-Belegung. Ggf. abhängig von der nachfolgend beschriebenen Interrupt-Zuordnung!&lt;br /&gt;
&lt;br /&gt;
Auf der M32 kann man die Interrupt-Zuordnung für INT2, INT3 und INTU durch drei Codierbrücken (beschriftet mit I2-INTU, INT3-I3, I2-INT2; SP2 A3: YINT2/3/U, YI2_1/2, YI3) ändern.&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_M32_INTx.JPG|thumb|INTx]]&lt;br /&gt;
&lt;br /&gt;
Man braucht dazu:&lt;br /&gt;
* 2-reihige Stiftleiste RM 2,54mm (z.B. 2x36-polig 742007)&lt;br /&gt;
* Drei Codierbrücken (z.B. aus Set 742902)&lt;br /&gt;
Vor dem Auflöten der Stiftleiste müssen zwei kurze Leiterbahnen zwischen zwei Lötpunkten aufgetrennt werden, und zwar zwischen den Lötpunkten INT3-I3 und I2-INT2. Die Leiterbahnen müssen mit einem scharfen Messer oder einem speziellen Leiterbahn-Unterbrecher zwischen den beiden Lötpunkten unterbrochen werden. Man sollte anschließend mit einem Widerstandsmeßgerät nachmessen: Es sollte keine Verbindung mehr zwischen INT3-I3 und I2-INT2 bestehen. Man trennt dann von der 2-reihigen Stiftleiste 2x3 Kontakte ab und lötet sie auf das weiß umrahmte Feld mit der o.g. Beschriftung.&lt;br /&gt;
&lt;br /&gt;
Hier kann man auf INT3-I3 und I2-INT2 je eine Codierbrücke aufstecken, wenn man die Standard-Belegung beibehalten will. Steckt man auf I2-INTU eine Codierbrücke, dann ist INTU des XBUS mit Pin PD3 (I2) der M32 verbunden.&lt;br /&gt;
&lt;br /&gt;
'''Hinweis:''' Man kann auf die 6-polige Stiftleiste auch Codierbrücken QUER zur eigentlichen (horizontalen) Richtung aufsetzen. Dadurch kann jede der 3 Interruptleitungen des XBUS (INT2, INT3, INTU) mit jedem der 2 Interrupt Pins der M32 (PD3, PB2) verbunden werden.&lt;br /&gt;
&lt;br /&gt;
Wenn man keine der Codierbrücken aufsteckt, sind die Pins PD3 (I2) und PB2 (I3) des M32-Prozessors nicht mehr mit dem XBUS verbunden und können anders verwendet werden. Auf der M32 kann man dann z.B. auch andere Verbindungen zum XBUS herstellen, indem man auf die Pins INT2, INT3 oder INTU Kabelverbindungen aufsteckt.&lt;br /&gt;
&lt;br /&gt;
====== ADC0 und ADC1 frei nutzen ======&lt;br /&gt;
Auf der M32 ist ADC0 fest mit dem Mikrofon (MIC) und ADC1 mit den Tastern T1..T5 (KEYPAD) verbunden. Wenn man diese ADC-Eingänge für andere Sensoren benötigt, kann man das Mikrofon und die Taster von den Eingängen abtrennen.&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_M32_MIC_KEY.JPG|thumb|MIC_KEYPAD]]&lt;br /&gt;
&lt;br /&gt;
Man braucht dazu:&lt;br /&gt;
* 1-reihige Stiftleiste RM 2,54mm (z.B. 36-polig 732478)&lt;br /&gt;
* Eine Codierbrücke (z.B. aus Set 742902)&lt;br /&gt;
&lt;br /&gt;
MIC/ADC0:&lt;br /&gt;
Es muss eine kurze Leiterbahn zwischen zwei Lötpunkten aufgetrennt werden, die sich zwischen R2 und C19 befinden (SP1 D4: YM1, YM2). Die Leiterbahn muss mit einem scharfen Messer oder einem speziellen Leiterbahn-Unterbrecher zwischen den beiden Lötpunkten unterbrochen werden. Man sollte anschließend mit einem Widerstandsmeßgerät nachmessen: Es sollte keine Verbindung mehr bestehen. Vorsicht: Nicht R2 beschädigen! Damit ist das Mikrofon auf der M32 ohne Funktion und ADC0 kann anders genutzt werden. ADC0 ist dann am oberen Lötpunkt zwischen R2 und C19 verfügbar, dort müßte eine Kabelverbindung angelötet werden.&lt;br /&gt;
Soll das Mikrofon später doch wieder an ADC0 angeschlossen werden, verbindet man die beiden Lötpunkte zwischen R2 und C19 einfach mit etwas Lötzinn oder mit einem SMD Null Ohm Widerstand.&lt;br /&gt;
&lt;br /&gt;
KEYPAD/ADC1:&lt;br /&gt;
Es muss eine kurze Leiterbahn zwischen zwei Lötpunkten aufgetrennt werden, die sich unterhalb von R15 befinden (SP1 D2: YKP1, YKP2). Die Leiterbahn befindet sich auf der Lötseite der Platine und muss mit einem scharfen Messer oder einem speziellen Leiterbahn-Unterbrecher zwischen den beiden Lötpunkten unterbrochen werden. Man sollte anschließend mit einem Widerstandsmeßgerät nachmessen: Es sollte keine Verbindung mehr bestehen. Jetzt trennt man von der 1-reihigen Stiftleiste 2 Kontakte ab und lötet sie auf die beiden Punkte unterhalb von R15. Hier kann man jetzt eine Codierbrücke aufstecken, wenn man die Taster weiter benutzen will. Wenn die Brücke abgezogen ist, sind die Taster ohne Funktion und ADC1 kann anders genutzt werden. ADC1 ist dann am linken Pin der 2-poligen Stiftleiste unterhalb von R15 verfügbar.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== RP6 CCPRO M128 Platine===&lt;br /&gt;
&lt;br /&gt;
[[Bild:CCPRO M128 k-1-.jpg|Das CCPRO M128]]&lt;br /&gt;
&lt;br /&gt;
====Beschreibung====&lt;br /&gt;
Die M128 (191563) ergänzt das RP6 Roboter System um einen leistungsfähigen ATMEGA128 Prozessor.&lt;br /&gt;
Es sind ein Temperatursensor; 19 I/O-Ports, davon 8 ADCs, 3 PWM (Servos) und 2 I/Os für einen UART; 1 Beeper; 5 Status-LEDs; 1 LC-Display-Port sowie ein freier Steckplatz für ein EEPROM verfügbar.&lt;br /&gt;
&lt;br /&gt;
====Technische Daten====&lt;br /&gt;
{|  {{Blauetabelle}} &lt;br /&gt;
|'''Mikrocontroller:'''&lt;br /&gt;
|Steckplatz für ein C-Control PRO MEGA128 Modul mit einem ATMEGA 128 ([https://www.conrad.de/de/p/c-control-prozessor-unit-mega-128-pro-198219.html 198219])&lt;br /&gt;
|-&lt;br /&gt;
|'''Speicher:'''&lt;br /&gt;
|128 kB [[Flash]]-Speicher, davon 4 kB bereits vom Bootloader belegt&amp;lt;br/&amp;gt;&lt;br /&gt;
4 kB SRAM intern&amp;lt;br/&amp;gt; &lt;br /&gt;
64 kB SRAM extern&amp;lt;br/&amp;gt;&lt;br /&gt;
4 kB [[EEPROM]]&lt;br /&gt;
|-&lt;br /&gt;
|'''Programmierung:'''&lt;br /&gt;
|Über CCPRO-IDE&lt;br /&gt;
|-&lt;br /&gt;
|'''Vorhandene Sensoren:'''&lt;br /&gt;
|1 12bit I²C Temperatursensor &amp;lt;br/&amp;gt;&lt;br /&gt;
19 I/O-Ports, davon 8 ADCs, 3 PWM (Servos) und 2 I/Os für eine weitere serielle Schnittstelle (UART)&lt;br /&gt;
|-&lt;br /&gt;
|'''Vorhandene Aktoren:'''&lt;br /&gt;
|1 Beeper&amp;lt;br/&amp;gt;&lt;br /&gt;
5 Status-LEDs&amp;lt;br/&amp;gt;&lt;br /&gt;
1 LC-Display-Port&amp;lt;br/&amp;gt;&lt;br /&gt;
1 Sockel für ein I²C-Bus EEPROM vom Typ 24(L)Cxxx&lt;br /&gt;
|-&lt;br /&gt;
|'''Abmessungen:'''&lt;br /&gt;
|(L &amp;amp;times; B &amp;amp;times; H) 112 &amp;amp;times; 90 &amp;amp;times; 21 mm&lt;br /&gt;
|-&lt;br /&gt;
|'''Ausführung:'''&lt;br /&gt;
|Fertig aufgebautes Erweiterungsmodul&lt;br /&gt;
|-&lt;br /&gt;
|'''Stromversorgung:'''&lt;br /&gt;
|6 AA NiMH Akkus (über die RP6 Base)&lt;br /&gt;
|-&lt;br /&gt;
|'''Hersteller:'''&lt;br /&gt;
|Arexx Niederlande&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Umbauoptionen====&lt;br /&gt;
Auf der CCPRO M128 ([http://www.conrad.de/ce/de/product/191563/Arexx-RP6-CC-PRO-MEGA128-Erweiterungssatz 191563]) kann leider nicht so viel umgebaut werden:&lt;br /&gt;
&lt;br /&gt;
* I2C-EEPROM&lt;br /&gt;
* Freie Nutzung von PORTA* und PORTC*&lt;br /&gt;
* USRBUS&lt;br /&gt;
* A16-/PD4-Nutzung&lt;br /&gt;
&lt;br /&gt;
Im Text gibt es Verweise auf den Schaltplan der CCPRO M128 (RP6_CCPRO_M128_Schematic.PDF) in der Form: (SP2 B1: Bauteil).  Dies bedeutet, dass man das Bauteil auf Blatt 2 des M128-Schaltplans im Feld B1 finden kann.&lt;br /&gt;
&lt;br /&gt;
Bei den Materialangaben ist öfter die Rede von &amp;quot;Steckbuchsen mit Litze&amp;quot;. Diese Steckbuchsen mit angelöteter Litze können auf die ein- oder zweireihigen Stiftleisten aufgesteckt werden. Leider gibt es sie nicht (mehr) fertig konfektioniert bei CONRAD. Die einreihigen Steckbuchsen (RM 2,54mm) kann man aber z.B. bei [http://www.elv.de/output/controller.aspx ELV] bekommen: 2-polig (68-016635), 3-polig (68-022503) und 5-polig (68-023073). An sie muss man dann noch Litzen in der entsprechenden Länge selbst anlöten.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=====I2C-EEPROM=====&lt;br /&gt;
Zum Einsetzen eines I2C-EEPROMS (IC6; SP2 C1: IC6) braucht man nichts umzubauen. Man kauft einfach ein passendes EEPROM des Typs 24(L)Cxxxx-P und setzt es auf seinen Sockel, Kerbe zum oberen Platinenrand.&lt;br /&gt;
&lt;br /&gt;
Mögliche Typen (erhältlich z.B. bei [http://www.digikey.de/ Digi-Key] oder bei [http://www.reichelt.de./ Reichelt]):&lt;br /&gt;
* AT24C128  (AT24C128-10PU-2.7-ND)&lt;br /&gt;
* AT24C256  (AT24C256-10PU-2.7-ND)&lt;br /&gt;
* AT24C512  (AT24C512-10PU-2.7-ND)&lt;br /&gt;
* AT24C1024 (AT24C1024-10PI-2.7-ND)&lt;br /&gt;
&lt;br /&gt;
=====Anschlüsse=====&lt;br /&gt;
Hier wird aufgelistet, wo man auf der M128 Platine Anschlüsse nutzen kann, um sie z.B. zu weiteren Sensoren, zum USRBUS oder (weniger empfehlenswert!) direkt zu EPs, zur RP6 Base oder zur M32 zu führen. &lt;br /&gt;
&lt;br /&gt;
======Freie Nutzung von PORTA* und PORTC*======&lt;br /&gt;
Um PORTA* und PORTC* frei nutzen zu können (für weitere I/O-Ports), muss man auf das externe SRAM verzichten, was nicht sehr ratsam ist. Mehr I/O-Ports kann man alternativ durch I/O Expander gewinnen. Falls man das SRAM trotzdem deaktivieren will, hier die Anleitung.&lt;br /&gt;
&lt;br /&gt;
Für den Umbau braucht man:&lt;br /&gt;
* Wannenstecker 2x5-polig gerade RM 2,54mm (z.B. [http://www.reichelt.de./ Reichelt] WSL 10G)&lt;br /&gt;
* 1-reihige Stiftleiste RM 2,54mm (z.B. 36-polig 732478)&lt;br /&gt;
* Eine Codierbrücke (z.B. aus Set 742902)&lt;br /&gt;
[[Bild:RP6_M128_PortA.JPG|thumb|PORTA*]]&lt;br /&gt;
&lt;br /&gt;
Für die Bestückung von PORTA* (SP2 AB2: Stecker PORTA*) lötet man den Wannenstecker hier (siehe Abb. PORTA*) auf.&lt;br /&gt;
[[Bild:RP6_M128_PortC.JPG|thumb|PORTC*]]&lt;br /&gt;
&lt;br /&gt;
Für die Bestückung von PORTC* (SP1 A2: PC0..7, YGND1) trennt man von der 1-reihigen Stiftleiste 9 Kontakte ab und lötet sie auf die PORTC*-Lötpunkte (siehe Abb. PORTC*).&lt;br /&gt;
&lt;br /&gt;
Dann muss noch der SRAM-Enable Jumper (SP1 EF1: Y27..29) bestückt werden:&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_M128_EN_SRAM.JPG|EN_SRAM]]&lt;br /&gt;
&lt;br /&gt;
Man trennt von der 1-reihigen Stiftleiste 3 Kontakte ab und lötet sie auf die abgebildeten Lötpunkte. Vorher muss eine Leiterbahn auf der Lötseite der Platine zwischen den ENABLE-Lötpunkten aufgetrennt werden.&lt;br /&gt;
Wenn das SRAM wie bisher genutzt werden soll, steckt man die Codierbrücke auf die Stellung &amp;quot;ENABLE&amp;quot;. Will man stattdessen Port A und Port C frei nutzen (und damit auf SRAM verzichten!), kommt die Codierbrücke auf &amp;quot;DISABLE&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
======USRBUS======&lt;br /&gt;
Auf die 14 Kontakte neben dem Wannenstecker USRBUS2 ist noch nichts gelötet.&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_M128_USRBUS.JPG|thumb|USRBUS]]&lt;br /&gt;
&lt;br /&gt;
Ich würde auf Y1..Y14 eine Stiftleiste löten, damit die USRBUS-Belegung geändert werden kann.&lt;br /&gt;
&lt;br /&gt;
Man braucht dazu:&lt;br /&gt;
* 2-reihige Stiftleiste RM 2,54mm (z.B. 2x36-polig 742007)&lt;br /&gt;
* Einige Steckbuchsen mit Litze&lt;br /&gt;
&lt;br /&gt;
Man trennt von der 2-reihigen Stiftleiste 2x7 Kontakte ab und lötet sie auf die Punkte Y1..Y14 (SP2 E234: Y1..Y14) neben dem Wannenstecker USRBUS2. Wird die M128 über Flachkabel mit einem USRBUS-Stecker auf einer RP6 Experimentierplatine (EP) und/oder mit dem RP6 selbst verbunden, dann hat man mit allen mit dem USRBUS verbundenen Platinen eine direkte 14-polige Verbindung,- eben den &amp;quot;User Bus&amp;quot;. Den kann man dann nutzen, wie man will. Auf der M128 kann man mit Steckbuchsen die Pins Y1..Y14 mit anderen Pins verbinden.&lt;br /&gt;
&lt;br /&gt;
Beispiel: Verbindet man den Pin &amp;quot;ADC4&amp;quot; mit Y1 des USRBUS, dann steht der Eingang ADC4 auf allen an den USRBUS angeschlossenen Platinen an Y1 zur Verfügung. Man braucht also diesen Eingang nicht über ein eigenes Kabel auf eine EP zu führen, sondern kann dazu den USRBUS nehmen. Dadurch bleibt der Gesamtaufbau auf dem RP6 übersichtlich und komplett trennbar (man braucht nur die Stecker XBUS und USRBUS abzuziehen!).&lt;br /&gt;
&lt;br /&gt;
Wichtig: Man sollte gut dokumentieren, wie man den USRBUS am RP6 (vorn und hinten getrennt!), auf EPs und der M128 benutzt! Sonst kann es bei einer anderen Anordnung von EPs zu USRBUS Konflikten/Kurzschlüssen kommen.&lt;br /&gt;
&lt;br /&gt;
======IC5 ALERT======&lt;br /&gt;
[[Bild:RP6_M128_IC5_ALERT.JPG|thumb|IC5 ALERT]]&lt;br /&gt;
Dieser Lötpunkt (SP2 C2: AL) neben IC5 ist der Anschluß ALERT (Pin 3) des I2C-Temperatursensors TCN75A (SP2 C2: IC5).&lt;br /&gt;
&lt;br /&gt;
Dies ist ein Open-Drain Ausgang, der ein Alarm-Signal ausgibt, wenn die Temperatur die eingestellten Grenzen über-/unterschreitet (siehe auch Datenblatt des Sensors (TCN75A.pdf), Abschnitt 5.3.4!). Wenn man ALERT auf einen Eingang des Microcontrollers führen will, muß man auch noch einen Pullup-Widerstand vorsehen oder den internen Pullup des uC-Eingangs aktivieren.&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;
======VDD/GND Anschluß======&lt;br /&gt;
[[Bild:RP6_M128_VDDGND.JPG|thumb|VDD GND]]&lt;br /&gt;
Auf der CCPRO M128 gibt es 2 Lötpunkte (SP1 E34: YVDD3, YGND4) zwischen R5 und C7 bzw. direkt neben der Codierbrücke (SP1 E3: YL9, YL10) zum Deaktivieren von LED5.&lt;br /&gt;
&lt;br /&gt;
Hier könnte man VDD und GND kontaktieren. VDD ist der Lötpunkt, der näher an R5 liegt.&lt;br /&gt;
&lt;br /&gt;
=====Trennstellen=====&lt;br /&gt;
An diesen Stellen können Leiterbahnen unterbrochen werden, um Funktionen zu deaktivieren oder anders zu nutzen. &lt;br /&gt;
&lt;br /&gt;
======A16-/PD4-Nutzung======&lt;br /&gt;
&lt;br /&gt;
[[Bild:v2RP6_M128_A16.JPG|thumb|A16/PD4]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Auf der CCPRO M128 gibt es ein 3-poliges Feld von Lötpunkten (SP2 AB1: PD4, A16, GND) unter dem CCPRO MEGA128 Modul (IC1). Standardmässig ist A16 des SRAM (IC3) hier auf GND gelegt. Damit kann man PD4 des Prozessors (ICP1) frei nutzen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Will man A16 des SRAM mit PD4 schaltbar machen, muss man eine Leiterbahn auf der Bestückungsseite zwischen den oberen zwei der drei Lötpunkte auftrennen und die anderen (unteren) beiden Lötpunkte mit etwas Lötzinn oder einem SMD Null Ohm Widerstand verbinden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der Sinn dieses Umbaus besteht darin, dass man danach anstelle von 64kB nun die vollen 128kB SRAM des IC3 adressieren kann. Man muss dann aber PD4 selbst schalten, da C-Control PRO ab Version 1.50 nur 64kB ext. SRAM ansteuern kann. Immerhin könnte man dann 2 Blöcke à je 64kB nutzen und mit PD4 zwischen beiden Blöcken umschalten.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ob CCPRO damit klar kommt: Wohl kaum! Ich würde daher diesen Umbau nicht durchführen.&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Zubehör und Ersatzteile ==&lt;br /&gt;
Von [http://www.conrad.de/ce/ CONRAD] gibt es z.B. &lt;br /&gt;
&lt;br /&gt;
* das LC- ([http://www.conrad.de/ce/de/product/190911/LC-DISPLAY-16-X-2-KONFEKTIONIERT 190911] AUSVERKAUFT!) oder Backlight-Display ([http://www.conrad.de/ce/de/product/191621/DISPLAY-RP5RP6-BLAU-MIT-BACKLIGHT 191621] AUSVERKAUFT!), welche an die M32, an die CCPRO M128 und an die M256 WiFi angeschlossen werden können,&lt;br /&gt;
* einen IR-Ball ([http://www.conrad.de/ce/de/product/191437/INFRAROT-BALL-FUeR-ROBOTER-FUssBALL 191437] AUSVERKAUFT!),&lt;br /&gt;
* einen Graustufen-Boden-Sensor ([http://www.conrad.de/ce/de/product/191599/GRAUSTUFEN-BODEN-SENSOR-FUeR-FUssBALLROBOT 191599] AUSVERKAUFT!),&lt;br /&gt;
* eine IR-Fernbedienung Promo 8 ([http://www.conrad.de/ce/de/product/340720/PROMO-8-UNIVERSALFERNBEDIENUNG 340720] AUSVERKAUFT!) oder Vivanco UR 89 ([http://www.conrad.de/ce/de/product/351013/VivancoUR-89-Fernbedienung-8-Geraete 351013] AUSVERKAUFT!),&lt;br /&gt;
* Ersatzräder ([http://www.conrad.de/ce/de/product/191307/ANTRIEBSRAD-RP5RP6 191307] AUSVERKAUFT!),&lt;br /&gt;
* Ersatzzahnräder ([http://www.conrad.de/ce/de/product/191346/SCHRAeG-ZAHNRAeDERSATZ-RP5RP6 191346]) und&lt;br /&gt;
* Ersatzraupen ([http://www.conrad.de/ce/de/product/191333/RAUPENSATZ-RP5RP6 191333] AUSVERKAUFT!).&lt;br /&gt;
&lt;br /&gt;
===Displays===&lt;br /&gt;
Die vorkonfektionierten Displays kann man zum Ausgeben von Texten, Sensordaten und kleinen Animationen benutzen. Sie können an die M32, an die CCPRO M128 und an die M256 WiFi angeschlossen werden.&lt;br /&gt;
&lt;br /&gt;
Diese 16x2 Zeichen Displays sind bisher lieferbar:&lt;br /&gt;
&lt;br /&gt;
* LC-Display ([http://www.conrad.de/ce/de/product/190911/LC-DISPLAY-16-X-2-KONFEKTIONIERT 190911])&lt;br /&gt;
* OLED-Display (197622)&lt;br /&gt;
* Backlight-Display AREXX RP-DSP88 ([http://www.conrad.de/ce/de/product/191621/DISPLAY-RP5RP6-BLAU-MIT-BACKLIGHT 191621])&lt;br /&gt;
&lt;br /&gt;
Das LCD ist seit September 2018 bei CONRAD ausverkauft; zeitweise (2007/08) gab es unter dieser Bestellnummer eine Version, die zu klein (66 x 37mm) war, um sie auf der M32, der CCPRO M128 oder der M256 WiFi zu montieren.&lt;br /&gt;
&lt;br /&gt;
Das OLED-Display ist aktuell (April 2012) nicht mehr lieferbar.&lt;br /&gt;
&lt;br /&gt;
Das zuletzt ausschließlich nur noch erhältliche blaufarbige Backlight-Display ist seit Mai 2020 bei CONRAD ausverkauft.&lt;br /&gt;
&lt;br /&gt;
Diese Displays können mit 4 M3-Abstandbolzen 25 mm ([http://www.conrad.de/ce/de/product/526665/Abstandsbolzen1-x-Aussengewinde1-x-InnengewindeMessing-vernickelt-Schluesselweite-55-mm Bestell-Nr. 526665]) und 4 Muttern M3 ([http://www.conrad.de/ce/de/product/815624/TOOLCRAFT-Sechskant-Muttern-DIN-934-934-Stahl-verzinkt-M3-100-St z.B. aus 815624]), sowie 4 Schrauben M3 ([http://www.conrad.de/ce/de/product/815322/TOOLCRAFT-Linsenkopfschrauben-mit-Kreuzschlitz-DIN-7985-7985-6-mm-Stahl-verzinkt-Guete-48-M3-100-St z.B. aus 815322]) auf der M32, der CCPRO M128 oder der M256 WiFi befestigt werden. Leider sind die Befestigungslöcher der Displays zu klein für ein M3-Gewinde, so dass man die Löcher sehr vorsichtig auf 3..3,2 mm erweitern muss.&lt;br /&gt;
&lt;br /&gt;
===IR-Ball===&lt;br /&gt;
Den IR-Ball (AREXX IRB-35, AUSVERKAUFT!) kann man benutzen, um mit dem RP6 Fußball oder Ähnliches zu spielen. Der Ball kann dann von den IR-Sensoren des RP6 erkannt und geortet werden.&lt;br /&gt;
&lt;br /&gt;
===Graustufen-Boden-Sensor===&lt;br /&gt;
Der Graustufen-Boden-Sensor (AREXX ARX-GS7) dient zur Orientierung eines Roboters auf einem Fußballfeld, das in bestimmten Grauabstufungen eingefärbt ist (CONRAD 191404  AUSVERKAUFT!). Dieser Fußballfeld-Aufkleber (AREXX ARX-FF008) ist auch bei [http://www.elv.de ELV] (Artikel-Nummer 68-101831) ausverkauft.&lt;br /&gt;
&lt;br /&gt;
===IR-Fernbedienung===&lt;br /&gt;
[[Bild:RP6_RC.jpg|thumb|2 RC5 Fernbedienungen]]&lt;br /&gt;
Mit einer Universal-IR-Fernbedienung, die den RC5-IR-Code senden kann, kann der RP6 wie ein ferngesteuertes &amp;quot;Auto&amp;quot; verwendet werden. Im Beispielprogramm &amp;quot;Example_08_TV_REMOTE&amp;quot; im Ordner der RP6-Base-Demos wird das noch genauer erläutert.&lt;br /&gt;
&lt;br /&gt;
===Ersatzräder===&lt;br /&gt;
Die Ersatzräder dienen als Ersatzteile für den RP6, RP6v2 und das RP5/RP6-Fahrgestell.&lt;br /&gt;
&lt;br /&gt;
===Ersatzzahnräder===&lt;br /&gt;
Die Ersatzzahnräder dienen als Ersatzteile für den RP6, RP6v2 und das RP5/RP6-Fahrgestell.&lt;br /&gt;
&lt;br /&gt;
===Ersatzraupen===&lt;br /&gt;
Die Ersatzraupen dienen als Ersatzteile für den RP6, RP6v2 und das RP5/RP6-Fahrgestell.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Programmierung==&lt;br /&gt;
Um diesen Grundlagenartikel zum RP6 nicht immer länger werden zu lassen, habe ich den Teil zur Programmierung des [[RP6_-_Programmierung#RP6_Base_und_CONTROL_M32|RP6]] und seiner Erweiterungsplatinen [[RP6_-_Programmierung#RP6_Base_und_CONTROL_M32|RP6 CONTROL M32]] und [[RP6_-_Programmierung#RP6_CCPRO_M128|RP6 CCPRO M128]] ausgelagert: [[RP6 - Programmierung]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==RP6v2==&lt;br /&gt;
Der neue [http://www.conrad.de/ce/de/product/191584/RP6-V2-ROBOTERSYSTEM RP6v2] ist weitgehend identisch mit dem RP6, so dass fast alle Angaben dieses Artikels auch für den RP6v2 zutreffen.&lt;br /&gt;
Für vom RP6 abweichende Details des RP6v2 und für dessen zukünftige Erweiterungsplatinen (z.B. das aktuell [http://www.arexx.com/forum/viewtopic.php?f=19&amp;amp;t=1797 hier] angekündigte Erweiterung-Modul [[RP6v2#RP6v2_M256_WiFi_Platine|RP6v2 M256 WiFi]]) gibt es einen eigenen Grundlagenartikel: [[RP6v2]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==RP6 Sensor Board und Xtra Module==&lt;br /&gt;
Einen eigenen Artikel gibt es auch für das [[RP6_Sensor_Board_und_Xtra_Module#RP6_Sensor_Board_2|RP6 Sensor Board]] und für die [[RP6_Sensor_Board_und_Xtra_Module#RP6_Xtra_Module_2|Xtra Module]]: [[RP6_Sensor_Board_und_Xtra_Module|RP6 Sensor Board und Xtra Module]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Erfahrungsberichte==&lt;br /&gt;
&lt;br /&gt;
...in Arbeit...(kann aber gerne ergänzt werden)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Siehe auch==&lt;br /&gt;
* [[RP6 - Programmierung]]&lt;br /&gt;
* [[RP6v2]]&lt;br /&gt;
* [[RP6_Sensor_Board_und_Xtra_Module]]&lt;br /&gt;
* [[RP6_Kamera_-_Mitmach-Projekt]]&lt;br /&gt;
* [[RP6v2_I2C-Portexpander]]&lt;br /&gt;
* [[RP6v2 USB-RS232-Adapter]]&lt;br /&gt;
* [[RP6v2 Orientierung]]&lt;br /&gt;
* [[RP6 Multi IO Projekt]]&lt;br /&gt;
* [[RP6 Multi IO Projekt - Software]]&lt;br /&gt;
* [[RP6 ArduIO]]&lt;br /&gt;
* [[RP6 ArduIO - Software]]&lt;br /&gt;
* [[Induktive_Ladestation_f%C3%BCr_den_RP6|Induktive Ladestation für den RP6]]&lt;br /&gt;
* [[IR-bake_f%C3%BCr_den_RP6|IR-bake für den RP6]]&lt;br /&gt;
* [[CCRP5]]&lt;br /&gt;
* [[Wild Thumper]]&lt;br /&gt;
* [[Wild Thumper - Programmierung]]&lt;br /&gt;
* [[Yeti]]&lt;br /&gt;
* [[Asuro]]&lt;br /&gt;
* [[C't-Bot]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Weblinks==&lt;br /&gt;
'''Siehe auch die Weblinks im [http://www.rn-wissen.de/index.php/RP6v2#Weblinks RP6v2 Artikel]!'''&lt;br /&gt;
&lt;br /&gt;
* [http://www.pcwelt.de/start/gaming_fun/gadgets/news/84558/ PC-Welt-Artikel]&lt;br /&gt;
&lt;br /&gt;
* Ankündigung des RP6 und der RP6 CONTROL M32 im [http://www.arexx.com/forum/viewtopic.php?t=370 AREXX Support Forum]&lt;br /&gt;
* Ankündigung der RP6 CCPRO M128 im [http://www.arexx.com/forum/viewtopic.php?f=19&amp;amp;t=834&amp;amp;start=0 AREXX Support Forum] und im [http://www.roboternetz.de/community/threads/42228-RP6-C-Control-PRO-MEGA128-Erweiterungsmodul-Website-online RoboterNETZ]&lt;br /&gt;
* Ankündigung des RP6v2 im [http://www.roboternetz.de/community/threads/56964-NEWS-RP6v2-die-neue-Version-2-des-RP6-Robot-Systems RoboterNETZ] und im [http://www.arexx.com/forum/viewtopic.php?f=19&amp;amp;t=1778 AREXX Support Forum]&lt;br /&gt;
* Ankündigung der RP6v2 M256 WiFi im [http://www.arexx.com/forum/viewtopic.php?f=19&amp;amp;t=1797 AREXX Support Forum]&lt;br /&gt;
* [http://www.arexx.com/rp6 AREXX RP6 Startseite]&lt;br /&gt;
* [http://www.arexx.com/forum/viewforum.php?f=19 AREXX Support Forum]&lt;br /&gt;
* [http://www.arexx.com/rp6/html/de/soft_doc_ccpro.htm AREXX CCPRO M128 Seite]&lt;br /&gt;
&lt;br /&gt;
* [http://www.conrad.de/ce/de/product/191524/RP6-ROBOTERSYSTEM RP6 bei CONRAD]&lt;br /&gt;
* [http://www.conrad.de/ce/de/product/191584/RP6-V2-ROBOTERSYSTEM RP6v2 bei CONRAD]&lt;br /&gt;
* [http://www.conrad.de/ce/de/product/191550/RP6-MEGA32-ERWEITERUNGSSATZ RP6 CONTROL M32 bei CONRAD]&lt;br /&gt;
* [http://www.conrad.de/ce/de/product/191563/RP6-CC-PRO-MEGA128-ERWEITERUNGSSATZ RP6 CCPRO M128 bei CONRAD]&lt;br /&gt;
* [http://www.c-control.de/c-control-pro/c-control-pro/startseite_c-control-pro.html C-Control PRO Startseite]&lt;br /&gt;
* [http://ccpro.cc2net.de/forum/ C-Control PRO Forum]&lt;br /&gt;
&lt;br /&gt;
* [http://www.roboternetz.de/phpBB2/viewforum.php?f=49 Roboternetz RP6 Forum]&lt;br /&gt;
* &amp;quot;Geburt&amp;quot; des Wiki im RN-Forum: [http://www.roboternetz.de/community/threads/32793-RP6-Wiki-Artikel RP6-Wiki-Artikel]&lt;br /&gt;
* Henkessoft: [http://www.henkessoft.de/Roboter/rp6.htm RP6]&lt;br /&gt;
* PIC-PROJEKTE Wiki: [http://pic-projekte.de/wiki/index.php?title=RP6  RP6]&lt;br /&gt;
* benhup.com: [http://www.benhup.com/?mf=eduntech&amp;amp;sf=rp6 Arexx RP6 Robot (with ATmega32 chip)]&lt;br /&gt;
* RP6 &amp;quot;Panzer&amp;quot;: [http://www.roboternetz.de/community/threads/57171-mein-(Heng-Long)-RP6 Heng-Long-RP6]&lt;br /&gt;
&lt;br /&gt;
* [http://www.youtube.com/results?search_query=rp6 RP6 Videos]&lt;br /&gt;
* [http://de-de.facebook.com/pages/Robby-RP6/155118711202285 facebook]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Robotikeinstieg]]	 &lt;br /&gt;
[[Kategorie:Praxis]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Autoren==&lt;br /&gt;
--[http://www.roboternetz.de/community/members/24729-sloti sloti] 22:23, 29. Dez 2007 (CET)&lt;br /&gt;
&lt;br /&gt;
--[http://www.roboternetz.de/community/members/44891-Tobias1 Tobias1] 18:30, 6. Apr 2010 (CET)&lt;br /&gt;
&lt;br /&gt;
--[http://www.roboternetz.de/community/members/1972-Dirk Dirk] 11:31, 31. Mär 2022 (CET)&lt;/div&gt;</summary>
		<author><name>Dirk NO2</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=RP6v2&amp;diff=28589</id>
		<title>RP6v2</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=RP6v2&amp;diff=28589"/>
				<updated>2022-03-31T13:40:46Z</updated>
		
		<summary type="html">&lt;p&gt;Dirk NO2: /* Autoren */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Bild:rp6v2_2.jpg|RP6v2 Base Roboter|right|500px]]&lt;br /&gt;
==Was bisher geschah==&lt;br /&gt;
'''Siehe auch &amp;quot;Was bisher geschah&amp;quot; im [http://www.rn-wissen.de/index.php/RP6#Was_bisher_geschah RP6 Artikel]!'''&lt;br /&gt;
&lt;br /&gt;
Mon, 27. Feb 2012 - Ankündigung des '''RP6v2'''&amp;lt;br/&amp;gt;&lt;br /&gt;
Don, 08. Mär 2012 - Auslieferungsbeginn des RP6v2&amp;lt;br/&amp;gt;&lt;br /&gt;
Sam, 17. Mär 2012 - Ankündigung der '''[[RP6v2#RP6v2_M256_WiFi_Platine|RP6v2 M256 WiFi]]'''&amp;lt;br/&amp;gt;&lt;br /&gt;
Mon, 11. Jun 2012 - Beginn der &amp;quot;Testaktion: Kostenlose RP6v2-M256-WIFI Module!&amp;quot;&amp;lt;br/&amp;gt;&lt;br /&gt;
Die, 10. Jul 2012 - Ende der &amp;quot;Testaktion: Kostenlose RP6v2-M256-WIFI Module!&amp;quot; nach Abstimmung&amp;lt;br/&amp;gt;&lt;br /&gt;
Mit, 11. Jul 2012 - Veröffentlichung der RP6v2 M256 WiFi Bedienungsanleitung&amp;lt;br/&amp;gt;&lt;br /&gt;
Die, 17. Jul 2012 - Eintreffen der kostenlosen RP6v2 M256 WiFi bei den Testern&amp;lt;br/&amp;gt;&lt;br /&gt;
Mit, 25. Jul 2012 - Auslieferungsbeginn der RP6v2 M256 WiFi&amp;lt;br/&amp;gt;&lt;br /&gt;
Don, 01. Nov 2012 - Im Oktober 2012 Auslieferung einiger RP6v2 M256 WiFi mit &amp;quot;altem&amp;quot; Bootloader V1.2&amp;lt;br/&amp;gt;&lt;br /&gt;
Don, 11. Dez 2014 - Im 2. bis 4. Quartal 2014 Auslieferung einiger [http://www.arexx.com/forum/viewtopic.php?f=19&amp;amp;t=2618 USB Interfaces mit gefälschtem FTDI Chip]&amp;lt;br/&amp;gt;&lt;br /&gt;
Sam, 02. Jan 2016 - Unter der Bezeichnung '''[[RP6v2#Arexx_RP6-Xtra_Robotersystem|Arexx RP6-Xtra Robotersystem]]''' ist ein Set bestehend aus dem RP6, einer Experimentierplatine, einem RP6v2 Drehgeber-Satz und einem RP6 USB-Interface lieferbar&amp;lt;br/&amp;gt;&lt;br /&gt;
Mon, 12. Mär 2018 - Seit dem 1. Quartal 2018 ist das Arexx RP6-Xtra Robotersystem bei CONRAD ausverkauft&amp;lt;br/&amp;gt;&lt;br /&gt;
Sam, 31. Mär 2018 - Seit Ende März 2018 ist die RP6v2 M256 WiFi Zusatzpatine bei CONRAD ausverkauft&amp;lt;br/&amp;gt;&lt;br /&gt;
Mit, 12. Sep 2018 - Seit September 2018 ist das [[RP6#Displays|LC-Display]] bei CONRAD ausverkauft&amp;lt;br/&amp;gt;&lt;br /&gt;
Mit, 28. Nov 2018 - Seit November 2018 ist der RP6v2 bei CONRAD ausverkauft&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Siehe auch &amp;quot;Was bisher geschah&amp;quot; im [http://www.rn-wissen.de/index.php/RP6_Sensor_Board_und_Xtra_Module#Was_bisher_geschah RP6 Sensor Board und Xtra Module Artikel]!'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Allgemein==&lt;br /&gt;
Der RP6v2 ([http://www.conrad.de/ce/de/product/191584/RP6-V2-ROBOTERSYSTEM/ 191584]) wurde am 27.02.2012 von [http://www.roboternetz.de/community/members/120-SlyD SlyD] angekündigt (siehe Weblinks!). Er ist eine leicht verbesserte Version des [[RP6]]. Der RP6v2 ist softwarekompatibel zum RP6. '''Alle Erweiterungs-Module können auch mit dem RP6v2 eingesetzt werden.'''&lt;br /&gt;
&lt;br /&gt;
 '''Seit November 2018 ist der RP6v2 bei CONRAD ausverkauft.'''&lt;br /&gt;
 '''Damit endet die Ära des RP6 Robotersystems nun endgültig nach fast 11 1/2 Jahren.'''&lt;br /&gt;
&lt;br /&gt;
Dieser Artikel beschreibt die Grundlagen zum RP6v2, '''sofern sie vom RP6 abweichen''', und die Grundlagen und Programmierung seiner zukünftigen Erweiterungs-Module.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Eigenschaften==&lt;br /&gt;
Laut Ankündigung haben sich beim RP6v2 folgende Details gegenüber dem RP6 geändert:&lt;br /&gt;
* Neue Drehgeber&lt;br /&gt;
** Justierung dank neuer Sensortechnik üblicherweise nicht mehr erforderlich&lt;br /&gt;
** leicht zugängliches und deutlich größeres Potentiometer&lt;br /&gt;
** Potis nur noch zur Feinjustierung erforderlich&lt;br /&gt;
* Zusätzliche Steckverbinder (im RP6 schon seit 2010 verbaut)&lt;br /&gt;
** vom Mainboard zu den Drehgebern&lt;br /&gt;
** vom Mainboard zu den Motoren&lt;br /&gt;
* Neue Anschlüsse (Steckverbinder / Stiftleisten)&lt;br /&gt;
** 2 3-polige ADC Anschlüsse mit VDD/GND inkl. zusätzlichem Stützkondensator&lt;br /&gt;
** 2 4-polige VDD Anschlüsse (je 2x +5V und 2x GND)&lt;br /&gt;
** 1 3-poliger +UB Anschluß (1x +UB, 2x GND)&lt;br /&gt;
** 1 5-polige Stiftleiste für den I2C Bus und VDD/GND&lt;br /&gt;
** 1 8-poliger EXT Steckverbinder (JST-Wannenstecker)&lt;br /&gt;
** 2 4-polige Steckverbinder (LIO1/LIO2) für die I/O-Pins von 4 LEDs und VDD/GND&lt;br /&gt;
* Hauptsicherung&lt;br /&gt;
** von 2,5A auf 3,15A erhöht&lt;br /&gt;
* Motortreiber&lt;br /&gt;
** leistungsfähigere und robustere MOSFETs&lt;br /&gt;
* Experimentierplatine&lt;br /&gt;
** gehört nicht mehr zum Lieferumfang&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Technische Änderungen==&lt;br /&gt;
Der RP6v2 weist einige Detail-Änderungen gegenüber der Vorversion auf. '''Diese Änderungen sind für die Nutzung und Programmierung des RP6v2 weitgehend irrelevant.'''&lt;br /&gt;
&lt;br /&gt;
Fast alle passiven SMD-Bauteile sind jetzt in Bauform 0603 bestückt (Ausnahmen: R6 (SP2 C2: R6), Induktivitäten und größere Kondensatoren).&lt;br /&gt;
Im Text gibt es Verweise auf den Schaltplan des RP6v2 (RP6v2_MAINBOARD.pdf) in der Form: (SP2 B1: Bauteil). Dies bedeutet, dass man das Bauteil auf Blatt 2 des RP6v2-Schaltplans im Feld B1 finden kann.&lt;br /&gt;
&lt;br /&gt;
===Mainboard===&lt;br /&gt;
* C14 (SP2 A3: C14) -&amp;gt; Liegt jetzt an VDD (parallel u.a. zu C6..C10)&lt;br /&gt;
* C26 (SP2 A1: C26) -&amp;gt; Jetzt bestückt mit Elko 220uF/16V (laut SP: 470uF/16V!)&lt;br /&gt;
* C29 (SP2 E1: C29) -&amp;gt; Jetzt bestückt mit SMD Kondensator 10uF&lt;br /&gt;
* IO3/IO4 Bestückungsaufdruck geändert in IO4/IO5 (Stecker LIO2)&lt;br /&gt;
* UBAT Bestückungsaufdruck geändert in UBAT_SENSE&lt;br /&gt;
* F2.5A Bestückungsaufdruck geändert in F3.0A (Feinsicherung flink 3,0A)&lt;br /&gt;
* Trennstelle +UB Sensor (siehe Abschnitt 6.4.6 [[RP6#.2BUB_Sensor|+UB Sensor]] des RP6-Artikels!) existiert beim RP6v2 nicht mehr&lt;br /&gt;
* Als Motortreiber (SP3 BCD23: Q1..Q4) werden anstelle von IRF7309 (ID 3,0A; PD 1,4W) die leistungsfähigeren und ESD-geschützten Typen [http://media.digikey.com/pdf/Data%20Sheets/Rohm%20PDFs/SP8M3.pdf SP8M3] (ID 4,5A; PD 2W; Schutzdiode) verwendet&lt;br /&gt;
&lt;br /&gt;
===Encoderplatine===&lt;br /&gt;
Schaltung siehe Datei RP6v2_ENCODERS.pdf!&lt;br /&gt;
* Jetzt mit Operationsverstärker IC2 ([http://ww1.microchip.com/downloads/en/DeviceDoc/21733h.pdf MCP6001U]) anstelle eines Transistors&lt;br /&gt;
* Größeres Potentiometer R2 (200kOhm)&lt;br /&gt;
Die Encoder sind mittlerweile auch einzeln unter der Conrad-Bestellnummer '''[http://www.conrad.de/ce/de/product/191625/RP6-DREHGEBER-SATZ 191625-62]''' verfügbar.&lt;br /&gt;
&lt;br /&gt;
===USB-Interface===&lt;br /&gt;
Schaltung siehe Datei RP6v2_USB_INTERFACE.pdf!&lt;br /&gt;
* C2  -&amp;gt; Jetzt bestückt mit SMD Kondensator 10uF&lt;br /&gt;
* C5  -&amp;gt; Neuer Blockkondensator 100nF an VCCIO von IC1&lt;br /&gt;
&lt;br /&gt;
===Steckverbindungen und Stiftleisten===&lt;br /&gt;
&lt;br /&gt;
====Motoren====&lt;br /&gt;
[[Bild:RP6v2_Motorstecker.JPG|thumb]]&lt;br /&gt;
&lt;br /&gt;
Beim RP6v2 sind die beiden Motorkabel mit 2-poligen Winkelsteckern RM 7,5mm an das Mainboard angeschlossen. &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;
&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;
====Encoder====&lt;br /&gt;
[[Bild:RP6v2_Encoderstecker.JPG|thumb]]&lt;br /&gt;
&lt;br /&gt;
Beim RP6v2 sind die Encoder mit einer JST XH Stiftleiste gewinkelt, 6-polig, RM 2,5mm ([http://www.conrad.de/ce/de/product/740271/Stiftleiste-gewinkelt-RM-25-mm-Serie-XH-Rastermass-25-mm-Pole-6-Nennstrom-3-A-S6B-XH-A-LFSN-JST-Inhalt-1-St 740271]) an das Mainboard angeschlossen.&lt;br /&gt;
&lt;br /&gt;
Auch die 3-polige Verbindung zu den beiden Encoder-Platinen (JST XH Stiftleiste gewinkelt, 3-polig, RM 2,5mm ([http://www.conrad.de/ce/de/product/740174/Stiftleiste-gewinkelt-RM-25-mm-Serie-XH-Rastermass-25-mm-Pole-3-Nennstrom-3-A-S3B-XH-A-LFSN-JST-Inhalt-1-St 740174])) ist steckbar.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====LIO1/LIO2====&lt;br /&gt;
[[Bild:RP6v2_LIO12.JPG|thumb]]&lt;br /&gt;
&lt;br /&gt;
Beim RP6 waren die Anschlüsse der Status-LEDs SL1,2 und SL4,5 ([[RP6#IO1..IO4|IO1..IO4]]) einzeln auf dem Mainboard zu kontaktieren.&lt;br /&gt;
&lt;br /&gt;
Beim RP6v2 gibt es zwei 4-polige Stiftleisten (LIO1, LIO2). Sie führen an den Pins 1 und 2 +5V und GND.&lt;br /&gt;
&lt;br /&gt;
An den Pins 3 und 4 finden sich die Anschlüsse von IO2, IO1 (LIO1) bzw. IO4, IO5 (LIO2).&lt;br /&gt;
&lt;br /&gt;
Bitte beachten: '''Der Bestückungsaufdruck IO4, IO5 des RP6v2 bezeichnet die selben Anschlüsse, wie beim RP6 IO3, IO4!'''&lt;br /&gt;
&lt;br /&gt;
Es handelt sich in beiden Fällen um die Anschlüsse der Status-LEDs SL4 (PB7) und SL5 (PB1).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====ADC0/ADC1====&lt;br /&gt;
[[Bild:RP6v2_ADC01.JPG|thumb]]&lt;br /&gt;
&lt;br /&gt;
Beim RP6 waren die 3-poligen Anschlüsse von ADC0 und ADC1 ([[RP6#Analoge_Sensoren_an_ADC0.2F1|Analoge Sensoren an ADC0/1]]) nicht mit Stiftleisten bestückt.&lt;br /&gt;
&lt;br /&gt;
Dies ist jetzt beim RP6v2 der Fall,- zusätzlich ist auch C26 (SP2 A1: C26) bestückt.&lt;br /&gt;
&lt;br /&gt;
Damit können analoge Sensoren direkt angeschlossen werden.&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;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====I2C/+UB/+5V====&lt;br /&gt;
[[Bild:RP6v2_I2CUB5V.JPG|thumb]]&lt;br /&gt;
&lt;br /&gt;
Die beim RP6 vorhandene 5-polige I2C-Schnittstelle ([[RP6#I2C-Schnittstelle|I2C-Schnittstelle]]) findet sich (jetzt mit Stiftleiste bestückt) genau so auch beim RP6v2.&lt;br /&gt;
&lt;br /&gt;
Bitte beachten: '''Die Anordnung der Pins auf dem Mainboard ist beim RP6v2 umgekehrt wie beim RP6!'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beim RP6 gab es (nicht mit Stiftleisten bestückte) Anschlüsse für VDD und +UB ([[RP6#VDD.2FGND.2F.2BUB_Anschlu.C3.9F|VDD/GND/+UB Anschluß]]).&lt;br /&gt;
&lt;br /&gt;
Beim RP6v2 gibt es jetzt drei Stiftleisten für +UB, +5V (VDD) und GND:&lt;br /&gt;
* Eine 3-polige Stiftleiste mit GND, +UB, GND&lt;br /&gt;
* Zwei 4-polige Stiftleisten jeweils mit GND, +5V, +5V, GND&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;
====EXT====&lt;br /&gt;
[[Bild:RP6v2_EXT.JPG|thumb]]&lt;br /&gt;
&lt;br /&gt;
Beim RP6 war keine Stiftleiste für den 8-poligen EXT Anschluß bestückt.&lt;br /&gt;
&lt;br /&gt;
Beim RP6v2 ist jetzt an dieser Stelle eine JST XH Stiftleiste gerade, 8-polig, RM 2,5mm ([http://www.conrad.de/ce/de/product/740105/Stiftleiste-gerade-RM-25-mm-Serie-XH-Rastermass-25-mm-Pole-8-Nennstrom-3-A-B8B-XH-A-LFSN-JST-Inhalt-1-St 740105]) vorhanden, auf die auch Steckbuchsen (RM 2,54) gesteckt werden können.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beschreibung des EXT Anschlusses: [[RP6#EXT_Anschlu.C3.9F|EXT Anschluß]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Erweiterungs-Module==&lt;br /&gt;
Über die Erweiterungs-Module informiert der Abschnitt [[RP6#Erweiterungs-Module|Erweiterungs-Module]] im RP6 Artikel.&lt;br /&gt;
&lt;br /&gt;
Darüber hinaus sind bei [http://www.conrad.de/ce/ CONRAD] für den RP6v2 erhältlich:&lt;br /&gt;
* RP6v2 M256 WiFi Zusatzplatine ([http://www.conrad.de/ce/de/product/191609/Arexx-RP6-V2-Control-M256-WiFi-Kit-RP6v2-M256-WIFI 191609])&lt;br /&gt;
* RP6 Sensor Board ([http://www.conrad.de/ce/de/product/1082384/Arexx-RP6-Sensor-Board-RP6-JM03-61 1082384])&lt;br /&gt;
&lt;br /&gt;
===RP6v2 M256 WiFi Platine===&lt;br /&gt;
Die RP6v2 M256 WiFi Zusatzplatine ([http://www.conrad.de/ce/de/product/191609/Arexx-RP6-V2-Control-M256-WiFi-Kit-RP6v2-M256-WIFI 191609]) wurde am 17.03.2012 von [http://www.roboternetz.de/community/members/120-SlyD SlyD] angekündigt (siehe Weblink!).&lt;br /&gt;
&lt;br /&gt;
Aktuell (Ende März 2018) ist die RP6v2 M256 WiFi Zusatzplatine bei CONRAD ausverkauft. &lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6v2_M256_WIFI.JPG|Die RP6v2 M256 WiFi]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Beschreibung====&lt;br /&gt;
Laut Ankündigung bietet die RP6v2 M256 WiFi:&lt;br /&gt;
* Atmel ATmega2560 Mikrocontroller&lt;br /&gt;
** 256kB Flash ROM&lt;br /&gt;
** 8kB SRAM&lt;br /&gt;
** 4kB EEPROM&lt;br /&gt;
** 16MHz Taktfrequenz&lt;br /&gt;
** 6 Hardware Timer und 86 I/O Ports&lt;br /&gt;
** Bis zu 16 A/D Wandler Kanäle (10 Bit Auflösung)&lt;br /&gt;
** 12 16 Bit Hardware PWMs&lt;br /&gt;
** 2 USART/SPI Ports&lt;br /&gt;
* Energieeffizientes 802.11g WLAN Modul&lt;br /&gt;
** Typ: Roving Networks RN-171&lt;br /&gt;
** Telemetriedaten übertragen&lt;br /&gt;
** Roboter vom PC aus fernsteuern&lt;br /&gt;
** Neue Programme drahtlos per WLAN in den Mikrocontroller laden&lt;br /&gt;
** Bootloader nachträglich erweitern&lt;br /&gt;
** Einstellung des WLAN Moduls über das RP6 USB Interface mit dem RobotLoader 2.x&lt;br /&gt;
** Änderung der Einstellungen über eine Netzwerkverbindung oder mit dem eigenen Mikrocontrollerprogramm&lt;br /&gt;
** Eigener Prozessor (entlastet den ATmega)&lt;br /&gt;
** Funktioniert mit jedem Standard WLAN Accesspoint/Router&lt;br /&gt;
** Kann als transparente serielle Schnittstelle arbeiten&lt;br /&gt;
** Kann vom PC aus per TCP/IP angesprochen werden&lt;br /&gt;
** 10cm 2.4GHz Antenne mit RP-SMA Anschluß&lt;br /&gt;
* Sonstige Ausstattung&lt;br /&gt;
** 8 Bit Display Port&lt;br /&gt;
** I2C Bus&lt;br /&gt;
** microSD Kartenslot&lt;br /&gt;
** 7 Status LEDs&lt;br /&gt;
** 2 Eingabetaster&lt;br /&gt;
** ISP Anschluß&lt;br /&gt;
** 4 WLAN ADC Kanäle&lt;br /&gt;
** AREF 3,3 und 5V&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6v2_M256_WIFI_Q2_m.JPG|thumb]]&lt;br /&gt;
&lt;br /&gt;
Ab Mitte Juli 2012 trafen die ersten kostenlosen RP6v2 M256 WiFi Platinen bei den Testern ein, die sich vorher dafür im Roboternetz RP6 Forum beworben hatten. Es handelte sich um Vorserien-Modelle, die sich dadurch auszeichneten, dass die Lötpads für Q2 (SP2 C6/C7: Q2) vertauscht waren. Der MOSFET war daher manuell &amp;quot;verdreht&amp;quot; aufgelötet, siehe nebenstehende Abbildung.&lt;br /&gt;
&lt;br /&gt;
Bei den Serien-Modellen wurde dies korrigiert.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Technische Daten====&lt;br /&gt;
{|  {{Blauetabelle}} &lt;br /&gt;
|'''Mikrocontroller:'''&lt;br /&gt;
|AVR ATmega2560&lt;br /&gt;
|-&lt;br /&gt;
|'''Speicher:'''&lt;br /&gt;
|256 kB [[Flash]]-Speicher&amp;lt;br/&amp;gt;&lt;br /&gt;
8 kB SRAM&amp;lt;br/&amp;gt; &lt;br /&gt;
4 kB [[EEPROM]]&amp;lt;br/&amp;gt;&lt;br /&gt;
? GB microSD Speicherkarte&lt;br /&gt;
|-&lt;br /&gt;
|'''Programmierung:'''&lt;br /&gt;
|Über [[Bootloader]], belegt ca. 8 kB des Flash-Speichers&amp;lt;br/&amp;gt;&lt;br /&gt;
Drahtlos über WLAN&lt;br /&gt;
|-&lt;br /&gt;
|'''Vorhandene Sensoren:'''&lt;br /&gt;
|2 Eingabetaster&amp;lt;br/&amp;gt;&lt;br /&gt;
4 WLAN ADC Kanäle&amp;lt;br/&amp;gt;&lt;br /&gt;
60 GP I/O Ports, davon bis 16 AD-Wandler (10-bit)&amp;lt;br/&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|'''Vorhandene Aktoren:'''&lt;br /&gt;
|7 Status LEDs&amp;lt;br/&amp;gt;&lt;br /&gt;
1 LC-Display-Port&amp;lt;br/&amp;gt;&lt;br /&gt;
802.11g WLAN Modul&amp;lt;br/&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|'''Abmessungen:'''&lt;br /&gt;
|(L &amp;amp;times; B &amp;amp;times; H) 112 &amp;amp;times; 90 &amp;amp;times; 42 mm (ohne Antenne)&lt;br /&gt;
|-&lt;br /&gt;
|'''Ausführung:'''&lt;br /&gt;
|Fertig aufgebautes Erweiterungsmodul&lt;br /&gt;
|-&lt;br /&gt;
|'''Stromversorgung:'''&lt;br /&gt;
|6 AA NiMH Akkus (über die RP6v2 Base)&lt;br /&gt;
|-&lt;br /&gt;
|'''Hersteller:'''&lt;br /&gt;
|Arexx Niederlande&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====WLAN Modul RN-171====&lt;br /&gt;
Das auf der RP6v2 M256 WiFi eingesetzte WLAN Modul ist das [http://www.microchip.com/wwwproducts/en/RN171 RN-171] ursprünglich entwickelt von Roving Networks. Vor einigen Jahren wurde die Firma Roving Networks von [http://www.microchip.com MicroChip Technology] übernommen.&lt;br /&gt;
&lt;br /&gt;
Inzwischen (2017) wird das RN-171 zwar noch hergestellt, für neue Hardware Designs aber nicht mehr empfohlen.&lt;br /&gt;
&lt;br /&gt;
Die letzte Firmware Version trägt die Nummer 4.81.&lt;br /&gt;
&lt;br /&gt;
Für die Nutzung des RN-171 auf der RP6v2 M256 WiFi wird sowohl vonseiten des Hardware Designs der Platine, als auch vonseiten der Software davon ausgegangen, dass das RN-171 auch den &amp;quot;Ad-Hoc Modus&amp;quot; beherrscht. Dies ist der Fall bis zur Firmware Version 2.38.3. Höhere Versionen beherrschen diesen Modus nicht mehr.&lt;br /&gt;
&lt;br /&gt;
''Somit ist die Firmware 2.38.3 die höchste Version, die für das RN-171 auf der RP6v2 M256 WiFi nutzbar ist!''&lt;br /&gt;
&lt;br /&gt;
Diese Firmware Version (Datei: wifly7-2383.img) findet ihr in der ZIP in diesem [http://www.roboternetz.de/community/threads/64251-RP6M256-WLAN-Modul-RN-171-Firmware-Update?p=594781&amp;amp;viewfull=1#post594781 Post] im Roboternetz RP6 Forum. Seht euch vor einem eventuellen Firmware Update unbedingt den ganzen [http://www.roboternetz.de/community/threads/64251-RP6M256-WLAN-Modul-RN-171-Firmware-Update Thread] auch wegen der enthaltenen Warnhinweise an.&lt;br /&gt;
&lt;br /&gt;
====Umbau-Optionen====&lt;br /&gt;
Für die RP6v2 M256 WiFi gibt es keine Umbau-Optionen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===RP6 Sensor Board===&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_Sensor_Board.jpg|Das RP6 Sensor Board]]&lt;br /&gt;
&lt;br /&gt;
'''Die Beschreibung des RP6 Sensor Boards wurde ausgelagert in einen eigenen [[RP6_Sensor_Board_und_Xtra_Module#RP6_Sensor_Board_2|Artikel]]!'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Zubehör und Ersatzteile==&lt;br /&gt;
Über die Zubehör- und Ersatzteile informiert der Abschnitt [[RP6#Zubehör und Ersatzteile|Zubehör und Ersatzteile]] im RP6 Artikel.&lt;br /&gt;
&lt;br /&gt;
Darüber hinaus sind bei [http://www.conrad.de/ce/ CONRAD] für den RP6v2 erhältlich:&lt;br /&gt;
* Arexx RP6v2 Drehgeber-Satz RP6-ENCv2 ([http://www.conrad.de/ce/de/product/191625/RP6-DREHGEBER-SATZ 191625] AUSVERKAUFT!)&lt;br /&gt;
* Arexx RP6 USB-Interface RP6V2-TRANS ([http://www.conrad.de/ce/de/product/191638/Arexx-RP6-USB-Interface-RP6V2-TRANS 191638] AUSVERKAUFT!)&lt;br /&gt;
* Arexx RP6 Xtra Module&lt;br /&gt;
&lt;br /&gt;
===RP6v2 Drehgeber-Satz RP6-ENCv2===&lt;br /&gt;
Die RP6v2 [http://www.rn-wissen.de/index.php/RP6v2#Encoder Drehgeber-Sensoren] (AREXX RP6-ENCv2) sind als Ersatzteil für den RP6v2 (191584) erhältlich und jetzt seit Mai 2020 bei CONRAD ausverkauft. Sie können auch in den [[RP6|RP6]] (191524) und in das RP5/RP6-Fahrgestell ([http://www.conrad.de/ce/de/product/191152/Arexx-Fahrgestell-Robby-RP5RP6-Roboter 191152] AUSVERKAUFT!) eingebaut werden und sind Bestandteil des [[RP6v2#Arexx_RP6-Xtra_Robotersystem|Arexx RP6-Xtra Robotersystems]].&lt;br /&gt;
&lt;br /&gt;
===RP6 USB-Interface RP6V2-TRANS===&lt;br /&gt;
Das RP6 USB-Interface (AREXX RP6V2-TRANS) kann zur Kommunikation mit verschiedenen Robotern und Erweiterungsmodulen eingesetzt werden. Es lassen sich mit dem RobotLoader neue Programme in den Mikrocontroller laden, und es wird ein virtueller serieller Port zur Kommunikation bereitgestellt. Auf dem Modul befindet sich zusätzlich ein Anschluss für APC220 Funkmodule (z.B. aus [http://www.conrad.de/ce/de/product/191668/Arexx-Wireless-Kit-ARX-APC220 diesem] Set, AUSVERKAUFT!) und ein 3,3 V Spannungsregler. Das USB-Interface RP6V2-TRANS kann als Ersatz für das mit dem RP6 oder RP6v2 gelieferte USB-Interface dienen und ist Bestandteil des [[RP6v2#Arexx_RP6-Xtra_Robotersystem|Arexx RP6-Xtra Robotersystems]]. Seit Ende 2021 ist das USB-Interface bei CONRAD ausverkauft.&lt;br /&gt;
&lt;br /&gt;
===RP6 Xtra Module===&lt;br /&gt;
'''Die Beschreibung der RP6 Xtra Module wurde ausgelagert in einen eigenen [[RP6_Sensor_Board_und_Xtra_Module#RP6_Xtra_Module_2|Artikel]]!'''&lt;br /&gt;
&lt;br /&gt;
===Arexx RP6-Xtra Robotersystem===&lt;br /&gt;
Unter der Bezeichnung '''Arexx RP6-Xtra Robotersystem''' bzw. '''Arexx Roboter Bausatz RP6-S''' ([https://www.conrad.de/de/arexx-rp6-xtra-robotersystem-1395738.html 1395738]) ist ab Januar 2016 ein Set bestehend aus dem [[RP6|RP6]] ([https://www.conrad.de/de/rp6-robotersystem-191524.html 191524]), einer [[RP6#Experimentierplatine|Experimentierplatine]] ([https://www.conrad.de/de/arexx-rp6-experimentierplatine-191537.html 191537]), einem [[RP6v2#RP6v2_Drehgeber-Satz_RP6-ENCv2|RP6v2 Drehgeber-Satz]] ([https://www.conrad.de/de/arexx-rp6-v2-drehgeber-sensoren-rp6-encv2-191625.html 191625]) und einem [[RP6v2#RP6_USB-Interface_RP6V2-TRANS|RP6 USB-Interface]] ([https://www.conrad.de/de/arexx-rp6-usb-interface-rp6v2-trans-191638.html 191638]) lieferbar.&lt;br /&gt;
&lt;br /&gt;
Die RP6v2 Drehgeber müssen selbst montiert werden. Durch dieses Set entsteht aus dem &amp;quot;alten RP6&amp;quot; ein Robotersystem, das in seiner Funktion identisch mit dem RP6v2 ist.&lt;br /&gt;
&lt;br /&gt;
Seit dem 1. Quartal 2018 ist das Arexx RP6-Xtra Robotersystem bei CONRAD ausverkauft.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Programmierung==&lt;br /&gt;
===RobotLoader===&lt;br /&gt;
Der RobotLoader ist die Weiterentwicklung des RP6Loaders. Es gibt ihn und den USB Interface Treiber [http://www.arexx.com/rp6/html/de/software.htm hier].&lt;br /&gt;
Über die Funktionen des RP6Loaders (siehe [[RP6_-_Programmierung#RP6Loader|hier]]!) hinaus kann der RobotLoader ab Version 2.0 Folgendes:&lt;br /&gt;
* WiFi Loader (Programme über WiFi hochladen und starten, Programmspeicher löschen)&lt;br /&gt;
* WiFi Terminal (Zeichen über WiFi senden/empfangen)&lt;br /&gt;
* Abdocken der Fenster des (seriellen) Terminals und des WiFi Terminals&lt;br /&gt;
* Konfiguration des WiFi Moduls über die serielle Schnittstelle&lt;br /&gt;
* Nach WiFi Geräten suchen&lt;br /&gt;
* Ab Version 2.3 über Kommandozeile steuerbar&lt;br /&gt;
&lt;br /&gt;
'''Befehlszeilen Optionen'''&lt;br /&gt;
&amp;lt;pre&amp;gt;################################################################&lt;br /&gt;
RobotLoader - Commandline Options&lt;br /&gt;
-c | -command : Enable Commandline Mode&lt;br /&gt;
-h | -help : Show this help message&lt;br /&gt;
-port=&amp;lt;PORT&amp;gt; : specify which port to use&lt;br /&gt;
               Windows with JD2XX: USB0, USB1, ...&lt;br /&gt;
               Windows with RXTX: COM0, COM1, ...&lt;br /&gt;
               Linux with RXTX: /dev/ttyUSB0, /dev/ttyUSB1, ...&lt;br /&gt;
-e : Erase Memory&lt;br /&gt;
-hex=&amp;lt;FILE&amp;gt; : Upload &amp;lt;FILE&amp;gt;, you must specify the complete path!&lt;br /&gt;
-s : Start Program (after upload)&lt;br /&gt;
-id : Get Infos from connected Board&lt;br /&gt;
###############################################################&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Loader Versionen====&lt;br /&gt;
Hier eine Tabelle der (mir) bekannten RobotLoader Versionen für die RP6v2 Base, CONTROL M32 und ab Version 2.0 auch für die M256 WiFi:&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |ZIP-Datum&lt;br /&gt;
 |Version&lt;br /&gt;
 |Bemerkungen&lt;br /&gt;
 |Examples&lt;br /&gt;
 |-&lt;br /&gt;
 |12.07.2010&lt;br /&gt;
 |[http://www.arexx.com/rp6/downloads/RobotLoader_20100712.zip 1.5h]&lt;br /&gt;
 |Auch für die RP6 Base, für Roboterarme und Caterpillar&lt;br /&gt;
 |ab 16.10.2007&lt;br /&gt;
 |-&lt;br /&gt;
 |16.06.2011&lt;br /&gt;
 |1.6b&lt;br /&gt;
 |Version auf der AREXX Wild Thumper CD-ROM!&lt;br /&gt;
 |&lt;br /&gt;
 |-&lt;br /&gt;
 |23.02.2012&lt;br /&gt;
 |[http://www.arexx.com/rp6/downloads/RobotLoader_20120223.zip 2.0 BETA]&lt;br /&gt;
 |Testversion! Ab v2.0 auch für die RP6v2 M256 WiFi Platine&lt;br /&gt;
 |&lt;br /&gt;
 |-&lt;br /&gt;
 |16.03.2012&lt;br /&gt;
 |2.1c&lt;br /&gt;
 |Version auf der AREXX Wireless kits CD-ROM 2012!&lt;br /&gt;
 |&lt;br /&gt;
 |-&lt;br /&gt;
 |05.06.2012&lt;br /&gt;
 |[http://www.arexx.com/rp6/downloads/RobotLoader_20120605.zip 2.3a]&lt;br /&gt;
 |Testversion! Siehe auch [http://www.roboternetz.de/community/threads/58168-RobotLoader-2-3a hier]!&lt;br /&gt;
 |&lt;br /&gt;
 |-&lt;br /&gt;
 |18.06.2012&lt;br /&gt;
 |[http://www.arexx.com/rp6/downloads/RobotLoader_20120618.zip 2.3b]&lt;br /&gt;
 |Testversion! Siehe auch [http://www.roboternetz.de/community/threads/58168-RobotLoader-2-3a hier]!&lt;br /&gt;
 |&lt;br /&gt;
 |-&lt;br /&gt;
 |17.07.2012&lt;br /&gt;
 |[http://www.arexx.com/rp6/downloads/RobotLoader_20120717.zip 2.3c]&lt;br /&gt;
 |Über Kommandozeile nutzbar, siehe auch [http://www.roboternetz.de/community/threads/58168-RobotLoader-2-3a hier]!&lt;br /&gt;
 |ab 16.07.2012&lt;br /&gt;
 |-&lt;br /&gt;
 |24.09.2012&lt;br /&gt;
 |[http://www.arexx.com/rp6/downloads/RobotLoader_20120924.zip 2.4a]&lt;br /&gt;
 |Mit WLAN Firmware v. 2.32, siehe auch [http://www.roboternetz.de/community/threads/59336-RobotLoader-2-4a hier]!&lt;br /&gt;
 |&lt;br /&gt;
 |-&lt;br /&gt;
 |10.04.2013&lt;br /&gt;
 |[http://www.arexx.com/rp6/downloads/RobotLoader_20130410.zip 2.5a]&lt;br /&gt;
 |Mit WLAN Firmware v. 2.36, siehe auch [http://www.roboternetz.de/community/threads/61977-M256-WIFI-Manchmal-nicht-ansprechbar?p=578766&amp;amp;viewfull=1#post578766 hier]!&lt;br /&gt;
 |&lt;br /&gt;
 |-&lt;br /&gt;
|}&lt;br /&gt;
'''Hinweise:'''&lt;br /&gt;
* Ältere Versionen des RP6Loaders bis Version 1.4 findet ihr [[RP6_-_Programmierung#RP6Loader|hier]].&lt;br /&gt;
* Von JM3 Engineering wurde auch ein eigenes Programm [[RP6_Sensor_Board_und_Xtra_Module#Robot-Tool|&amp;quot;'''JM3 Robot-Tool'''&amp;quot;]] veröffentlicht, das im RP6-System (RP6(v2) Base, CONTROL M32, M256 WiFi) anstelle des RobotLoaders verwendet werden kann.&lt;br /&gt;
&lt;br /&gt;
====Projekte====&lt;br /&gt;
* Der RobotLoader 2.3a und [http://www.rn-wissen.de/index.php/LunaAVR LunaAVR] im [http://www.roboternetz.de/community/threads/58168-RobotLoader-2-3a?p=551535&amp;amp;viewfull=1#post551535 Roboternetz RP6 Forum] und im [http://forum.myluna.de/viewtopic.php?f=3&amp;amp;t=24#p94 LunaAVR Forum]&lt;br /&gt;
&lt;br /&gt;
===RP6v2===&lt;br /&gt;
'''Der RP6v2 ([http://www.conrad.de/ce/de/product/191584/RP6-V2-ROBOTERSYSTEM/ 191584]) ist softwarekompatibel zum RP6.'''&lt;br /&gt;
&lt;br /&gt;
Zur Programmierung des [[RP6]] und des RP6v2 gibt es einen eigenen Artikel: [[RP6 - Programmierung]]&lt;br /&gt;
&lt;br /&gt;
===RP6v2 M256 WiFi Platine===&lt;br /&gt;
&lt;br /&gt;
====Dokumentation====&lt;br /&gt;
Die Dokumentation (Anleitung der RP6v2 M256 WiFi und des WiFi-Moduls RN-171 WiFly) befindet sich [http://www.arexx.com/rp6/html/de/soft_doc_rp6m256.htm hier].&lt;br /&gt;
&lt;br /&gt;
=====Manuals=====&lt;br /&gt;
=====Schematics=====&lt;br /&gt;
=====Datasheets=====&lt;br /&gt;
&lt;br /&gt;
====Demo-Programmme====&lt;br /&gt;
Die RP6v2 M256 WiFi Demo Programme sind [http://www.arexx.com/rp6/html/de/soft_doc_rp6m256.htm hier] zu finden.&lt;br /&gt;
&lt;br /&gt;
=====Bug-Report=====&lt;br /&gt;
In [http://www.roboternetz.de/community/threads/64362-Programmstart-mit-Hindernissen diesem Thread] des Roboternetz-Forums geht es um eine Fehlfunktion der Programme ''Example_09_Move'' und ''Example_10_Move2'' für die RP6v2 M256 WiFi. Diese Demos werden nicht korrekt ausgeführt, wenn sie über WLAN gestartet werden. Sie funktionieren jedoch normal, wenn sie mit dem START/STOP-Button der RP6v2 Base gestartet werden.&lt;br /&gt;
&lt;br /&gt;
Dieses Fehlverhalten der beiden Demos (aus [http://www.arexx.com/rp6/downloads/RP6Examples_20120725f.zip Version 1.8 der RP6 Examples vom 25.07.2012]) kann durch Einfügen der Zeilen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	I2CTWI_transmitByte(0, 0);&lt;br /&gt;
	mSleep(200);&lt;br /&gt;
	I2CTWI_transmitByte(0, 0);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
... in ''Example_09_Move'' ab Zeile 129 und in ''Example_10_Move2'' ab Zeile 699 abgestellt werden.&lt;br /&gt;
&lt;br /&gt;
====Library====&lt;br /&gt;
Die Library für die RP6v2 M256 WiFi besteht aus folgenden 21 Dateien:&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |Library&lt;br /&gt;
 |Datei&lt;br /&gt;
 |Funktion&lt;br /&gt;
 |-&lt;br /&gt;
 |RP6M256&lt;br /&gt;
 |RP6M256.h&lt;br /&gt;
 |RP6M256 Hardware-Konfiguration&lt;br /&gt;
 |-&lt;br /&gt;
 |RP6M256&lt;br /&gt;
 |RP6M256Lib.h&lt;br /&gt;
 |RP6M256 Library Header&lt;br /&gt;
 |-&lt;br /&gt;
 |RP6M256&lt;br /&gt;
 |RP6M256Lib.c&lt;br /&gt;
 |RP6M256 Library&lt;br /&gt;
 |-&lt;br /&gt;
 |RP6M256uart&lt;br /&gt;
 |RP6M256uart.h&lt;br /&gt;
 |RS232 Funktionen Header&lt;br /&gt;
 |-&lt;br /&gt;
 |RP6M256uart&lt;br /&gt;
 |RP6M256uart.c&lt;br /&gt;
 |RS232 Funktionen&lt;br /&gt;
 |-&lt;br /&gt;
 |RP6M256_I2CMaster&lt;br /&gt;
 |RP6M256_I2CMasterLib.h&lt;br /&gt;
 |I2C Master Library Header&lt;br /&gt;
 |-&lt;br /&gt;
 |RP6M256_I2CMaster&lt;br /&gt;
 |RP6M256_I2CMasterLib.c&lt;br /&gt;
 |I2C Master Library&lt;br /&gt;
 |-&lt;br /&gt;
 |RP6M256_WIFI&lt;br /&gt;
 |RP6M256_WIFIlib.h&lt;br /&gt;
 |WIFI Library Header&lt;br /&gt;
 |-&lt;br /&gt;
 |RP6M256_WIFI&lt;br /&gt;
 |RP6M256_WIFIlib.c&lt;br /&gt;
 |WIFI Library&lt;br /&gt;
 |-&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |-&lt;br /&gt;
 |SDC&lt;br /&gt;
 |byteordering.h&lt;br /&gt;
 |Byte-order handling header&lt;br /&gt;
 |-&lt;br /&gt;
 |SDC&lt;br /&gt;
 |byteordering.c&lt;br /&gt;
 |Byte-order handling implementation&lt;br /&gt;
 |-&lt;br /&gt;
 |SDC&lt;br /&gt;
 |fat_config.h&lt;br /&gt;
 |FAT configuration&lt;br /&gt;
 |-&lt;br /&gt;
 |SDC&lt;br /&gt;
 |fat.h&lt;br /&gt;
 |FAT header&lt;br /&gt;
 |-&lt;br /&gt;
 |SDC&lt;br /&gt;
 |fat.c&lt;br /&gt;
 |FAT implementation&lt;br /&gt;
 |-&lt;br /&gt;
 |SDC&lt;br /&gt;
 |partition_config.h&lt;br /&gt;
 |Partition configuration&lt;br /&gt;
 |-&lt;br /&gt;
 |SDC&lt;br /&gt;
 |partition.h&lt;br /&gt;
 |Partition table header&lt;br /&gt;
 |-&lt;br /&gt;
 |SDC&lt;br /&gt;
 |partition.c&lt;br /&gt;
 |Partition table implementation&lt;br /&gt;
 |-&lt;br /&gt;
 |SDC&lt;br /&gt;
 |sd-reader_config.h&lt;br /&gt;
 |Common sd-reader configuration (all modules)&lt;br /&gt;
 |-&lt;br /&gt;
 |SDC&lt;br /&gt;
 |sd_raw_config.h&lt;br /&gt;
 |MMC/SD support configuration&lt;br /&gt;
 |-&lt;br /&gt;
 |SDC&lt;br /&gt;
 |sd_raw.h&lt;br /&gt;
 |MMC/SD/SDHC raw access header&lt;br /&gt;
 |-&lt;br /&gt;
 |SDC&lt;br /&gt;
 |sd_raw.c&lt;br /&gt;
 |MMC/SD/SDHC raw access implementation&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=====Versionen=====&lt;br /&gt;
Hier eine Tabelle der (mir) bekannten Library Versionen der RP6v2 M256 WiFi:&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |ZIP-Datum&lt;br /&gt;
 |VERSION_&lt;br /&gt;
 |RP6M256Library&lt;br /&gt;
 |RP6LIB_VERSION&lt;br /&gt;
 |RP6M256.h&lt;br /&gt;
 |RP6M256Lib&lt;br /&gt;
 |WifiLib&lt;br /&gt;
 |UartLib&lt;br /&gt;
 |I2CMasterLib&lt;br /&gt;
 |SDCLib **&lt;br /&gt;
 |-&lt;br /&gt;
 |24.02.2012&lt;br /&gt;
 |1.7&lt;br /&gt;
 |1.0_24.02.12&lt;br /&gt;
 |16&lt;br /&gt;
 |1.0_24.02.12&lt;br /&gt;
 |1.0_24.02.12&lt;br /&gt;
 |1.0_24.02.12&lt;br /&gt;
 |1.0_24.02.12&lt;br /&gt;
 |(1.0_24.02.12)&lt;br /&gt;
 |?&lt;br /&gt;
 |-&lt;br /&gt;
 |16.07.2012&lt;br /&gt;
 |[http://www.arexx.com/rp6/downloads/RP6Examples_20120716.zip 1.7] *&lt;br /&gt;
 |1.1_16.07.12&lt;br /&gt;
 |16&lt;br /&gt;
 |1.1_16.07.12&lt;br /&gt;
 |1.1_16.07.12&lt;br /&gt;
 |1.1_16.07.12&lt;br /&gt;
 |1.1_16.07.12&lt;br /&gt;
 |(1.0_24.02.12)&lt;br /&gt;
 |(2006-2011)&lt;br /&gt;
 |-&lt;br /&gt;
 |25.07.2012&lt;br /&gt;
 |[http://www.arexx.com/rp6/downloads/RP6Examples_20120725.zip 1.8]&lt;br /&gt;
 |1.1_16.07.12&lt;br /&gt;
 |16&lt;br /&gt;
 |1.1_16.07.12&lt;br /&gt;
 |1.1_16.07.12&lt;br /&gt;
 |1.1_16.07.12&lt;br /&gt;
 |1.1_16.07.12&lt;br /&gt;
 |(1.0_24.02.12)&lt;br /&gt;
 |(2006-2011)&lt;br /&gt;
 |-&lt;br /&gt;
 |25.07.2012 ²&lt;br /&gt;
 |[http://www.arexx.com/rp6/downloads/RP6Examples_20120725f.zip 1.8]&lt;br /&gt;
 |1.1_16.07.12&lt;br /&gt;
 |16&lt;br /&gt;
 |1.1_16.07.12&lt;br /&gt;
 |1.1_16.07.12&lt;br /&gt;
 |1.1_16.07.12&lt;br /&gt;
 |1.1_16.07.12&lt;br /&gt;
 |(1.0_24.02.12)&lt;br /&gt;
 |(2006-2011)&lt;br /&gt;
|}&lt;br /&gt;
'''Zu *:''' Ab der Version 1.7 sind auch die Libraries und Examples der RP6v2 Base und CONTROL M32 enthalten! Ältere Versionen dieser Libraries und Examples bis Version 1.5 findet ihr [[RP6_-_Programmierung#Versionen|hier]]!&lt;br /&gt;
&lt;br /&gt;
'''Zu **:''' Die SDC Library ist eine Open Source Bibliothek für den Zugriff auf SD-Karten. Sie steht unter der GNU General Public License version 2. Geschrieben wurde sie von Roland Riegel; sein [http://www.roland-riegel.de/sd-reader/index.html Projekt] könnt ihr im Internet verfolgen. Eventuelle Updates werden dort auch veröffentlicht.&lt;br /&gt;
Die Projektseiten sind auch im Verzeichnis ...\RP6Lib\RP6control_M256_WIFI\sdc\doc\html\ der RP6Examples zu finden. Ihr könnt in dem Verzeichnis die Datei &amp;quot;index.html&amp;quot; starten, um sie anzuzeigen.&lt;br /&gt;
&lt;br /&gt;
'''Zu ²:''' Die Datei heißt RP6Examples_20120725'''f'''.zip. Mir ist nicht bekannt, ob ein Unterschied zur RP6Examples_20120725.zip besteht.&lt;br /&gt;
&lt;br /&gt;
In der 1. Spalte findet ihr das Datum der RP6Examples.zip Datei, in der die Library enthalten ist. Die 2. Spalte nennt die Version, die im Dateinamen der VERSION_x.x.txt Datei als x.x vorkommt. In der 3. Spalte steht die Versionsangabe der RP6M256Library laut Angabe in der VERSION_x.x.txt Datei.&lt;br /&gt;
&lt;br /&gt;
In der 4. Spalte gebe ich den Wert der Konstante RP6LIB_VERSION an. Es gibt sie ab den RP6v2 Base und CONTROL M32 Examples vom 16.10.2007. In den Spalten 5 bis 10 führe ich nacheinander die Versionsnummern und ggf. das in der Datei genannte Datum der Header-Datei/Library an: RP6M256.h, RP6M256Lib, WifiLib, UartLib, I2CMasterLib, SDCLib.&lt;br /&gt;
&lt;br /&gt;
=====RP6M256=====&lt;br /&gt;
======Bug-Report======&lt;br /&gt;
======Konfiguration======&lt;br /&gt;
======Port-Verwendung======&lt;br /&gt;
Die Verwendung der Ports des RP6v2 M256 WiFi Microcontrollers wird festgelegt in der Header-Datei &amp;quot;RP6M256.h&amp;quot;. In dieser Datei wird auch noch Folgendes aufgeführt:&lt;br /&gt;
* Quarzfrequenz (F_CPU) &lt;br /&gt;
* True/false Definition &lt;br /&gt;
* Verschiedene Macros &lt;br /&gt;
* Baudraten und Baudraten-Tabelle &lt;br /&gt;
&lt;br /&gt;
Hier eine Tabelle mit den Port-Definitionen für die RP6v2 M256 WiFi:&lt;br /&gt;
 Erklärung der Spalten:&lt;br /&gt;
 Port        -&amp;gt; Atmel Portpin Bezeichnung&lt;br /&gt;
 Name        -&amp;gt; Atmel Funktionsbezeichnung&lt;br /&gt;
 In/Out      -&amp;gt; Eingang (In) oder Ausgang (Out)&lt;br /&gt;
 Pullup      -&amp;gt; Falls Eingang: Pullup ein- (1) oder ausgeschaltet (0)&lt;br /&gt;
 Wert        -&amp;gt; Falls Ausgang: Logikpegel high (1) oder low (0)&lt;br /&gt;
 Funktion    -&amp;gt; Schnittstellenfunktion&lt;br /&gt;
 Bezeichnung -&amp;gt; Portpin Bezeichnung der Library&lt;br /&gt;
 Stecker     -&amp;gt; Portpin verfügbar an STECKER: Pin&lt;br /&gt;
 Anmerkungen -&amp;gt; Kommentare (ADC_xx: ADC-Kanal Bezeichnung)&lt;br /&gt;
&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |Port&lt;br /&gt;
 |Name&lt;br /&gt;
 |In/Out&lt;br /&gt;
 |Pullup&lt;br /&gt;
 |Wert&lt;br /&gt;
 |Funktion&lt;br /&gt;
 |Bezeichnung&lt;br /&gt;
 |Stecker&lt;br /&gt;
 |Anmerkungen&lt;br /&gt;
 |-&lt;br /&gt;
 |PA0&lt;br /&gt;
 |AD0&lt;br /&gt;
 |Out&lt;br /&gt;
 |&lt;br /&gt;
 |0&lt;br /&gt;
 |&lt;br /&gt;
 |DISP_D0&lt;br /&gt;
 |DISPIO: 7&lt;br /&gt;
 |Display D0&lt;br /&gt;
 |-&lt;br /&gt;
 |PA1&lt;br /&gt;
 |AD1&lt;br /&gt;
 |Out&lt;br /&gt;
 |&lt;br /&gt;
 |0&lt;br /&gt;
 |&lt;br /&gt;
 |DISP_D1&lt;br /&gt;
 |DISPIO: 8&lt;br /&gt;
 |Display D1 &lt;br /&gt;
 |-&lt;br /&gt;
 |PA2&lt;br /&gt;
 |AD2&lt;br /&gt;
 |Out&lt;br /&gt;
 |&lt;br /&gt;
 |0&lt;br /&gt;
 |&lt;br /&gt;
 |DISP_D2&lt;br /&gt;
 |DISPIO: 9&lt;br /&gt;
 |Display D2 &lt;br /&gt;
 |-&lt;br /&gt;
 |PA3&lt;br /&gt;
 |AD3&lt;br /&gt;
 |Out&lt;br /&gt;
 |&lt;br /&gt;
 |0&lt;br /&gt;
 |&lt;br /&gt;
 |DISP_D3&lt;br /&gt;
 |DISPIO: 10&lt;br /&gt;
 |Display D3&lt;br /&gt;
 |-&lt;br /&gt;
 |PA4&lt;br /&gt;
 |AD4&lt;br /&gt;
 |Out&lt;br /&gt;
 |&lt;br /&gt;
 |0&lt;br /&gt;
 |&lt;br /&gt;
 |DISP_D4&lt;br /&gt;
 |DISPIO: 11&lt;br /&gt;
 |Display D4&lt;br /&gt;
 |-&lt;br /&gt;
 |PA5&lt;br /&gt;
 |AD5&lt;br /&gt;
 |Out&lt;br /&gt;
 |&lt;br /&gt;
 |0&lt;br /&gt;
 |&lt;br /&gt;
 |DISP_D5&lt;br /&gt;
 |DISPIO: 12&lt;br /&gt;
 |Display D5&lt;br /&gt;
 |-&lt;br /&gt;
 |PA6&lt;br /&gt;
 |AD6&lt;br /&gt;
 |Out&lt;br /&gt;
 |&lt;br /&gt;
 |0&lt;br /&gt;
 |&lt;br /&gt;
 |DISP_D6&lt;br /&gt;
 |DISPIO: 13&lt;br /&gt;
 |Display D6&lt;br /&gt;
 |-&lt;br /&gt;
 |PA7&lt;br /&gt;
 |AD7&lt;br /&gt;
 |Out&lt;br /&gt;
 |&lt;br /&gt;
 |0&lt;br /&gt;
 |&lt;br /&gt;
 |DISP_D7&lt;br /&gt;
 |DISPIO: 14&lt;br /&gt;
 |Display D7&lt;br /&gt;
 |-&lt;br /&gt;
 |PB0&lt;br /&gt;
 |SS/PCI0&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |SPI_SS *&lt;br /&gt;
 |&lt;br /&gt;
 |SDC Output DAT3 / CS&lt;br /&gt;
 |-&lt;br /&gt;
 |PB1&lt;br /&gt;
 |SCK/PCI1&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |ISP&lt;br /&gt;
 |SPI_SCK *&lt;br /&gt;
 |ISP: 3&lt;br /&gt;
 |SDC Output CLK&lt;br /&gt;
 |-&lt;br /&gt;
 |PB2&lt;br /&gt;
 |MOSI/PCI2&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |ISP&lt;br /&gt;
 |SPI_MOSI *&lt;br /&gt;
 |ISP: 4&lt;br /&gt;
 |SDC Output CMD / DI&lt;br /&gt;
 |-&lt;br /&gt;
 |PB3&lt;br /&gt;
 |MISO/PCI3&lt;br /&gt;
 |In&lt;br /&gt;
 |0&lt;br /&gt;
 |&lt;br /&gt;
 |ISP&lt;br /&gt;
 |SPI_MISO ***&lt;br /&gt;
 |ISP: 1&lt;br /&gt;
 |SDC Input DAT0 / DO&lt;br /&gt;
 |-&lt;br /&gt;
 |PB4&lt;br /&gt;
 |OC2A/PCI4&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |OC2A_PI4&lt;br /&gt;
 |PWM23: 5&lt;br /&gt;
 |frei&lt;br /&gt;
 |-&lt;br /&gt;
 |PB5&lt;br /&gt;
 |OC1A/PCI5&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |OC1A_PI5&lt;br /&gt;
 |PWM01: 7&lt;br /&gt;
 |frei&lt;br /&gt;
 |-&lt;br /&gt;
 |PB6&lt;br /&gt;
 |OC1B/PCI6&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |OC1B_PI6&lt;br /&gt;
 |PWM01: 9&lt;br /&gt;
 |frei&lt;br /&gt;
 |-&lt;br /&gt;
 |PB7&lt;br /&gt;
 |OC0A/OC1C/PCI7&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |OC0A_OCM_PI7&lt;br /&gt;
 |PWM01: 4&lt;br /&gt;
 |frei&lt;br /&gt;
 |-&lt;br /&gt;
 |PC0&lt;br /&gt;
 |A8&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_PC0&lt;br /&gt;
 |PC01: 2&lt;br /&gt;
 |XMEM A8, frei&lt;br /&gt;
 |-&lt;br /&gt;
 |PC1&lt;br /&gt;
 |A9&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_PC1&lt;br /&gt;
 |PC01: 1&lt;br /&gt;
 |XMEM A9, frei&lt;br /&gt;
 |-&lt;br /&gt;
 |PC2&lt;br /&gt;
 |A10&lt;br /&gt;
 |Out&lt;br /&gt;
 |&lt;br /&gt;
 |0&lt;br /&gt;
 |&lt;br /&gt;
 |SLED1&lt;br /&gt;
 |&lt;br /&gt;
 |Status LED SL1&lt;br /&gt;
 |-&lt;br /&gt;
 |PC3&lt;br /&gt;
 |A11&lt;br /&gt;
 |Out&lt;br /&gt;
 |&lt;br /&gt;
 |0&lt;br /&gt;
 |&lt;br /&gt;
 |SLED2&lt;br /&gt;
 |&lt;br /&gt;
 |Status LED SL2&lt;br /&gt;
 |-&lt;br /&gt;
 |PC4&lt;br /&gt;
 |A12&lt;br /&gt;
 |Out&lt;br /&gt;
 |&lt;br /&gt;
 |0&lt;br /&gt;
 |&lt;br /&gt;
 |SLED3&lt;br /&gt;
 |&lt;br /&gt;
 |Status LED SL3&lt;br /&gt;
 |-&lt;br /&gt;
 |PC5&lt;br /&gt;
 |A13&lt;br /&gt;
 |Out&lt;br /&gt;
 |&lt;br /&gt;
 |0&lt;br /&gt;
 |&lt;br /&gt;
 |SLED4&lt;br /&gt;
 |&lt;br /&gt;
 |Status LED SL4&lt;br /&gt;
 |-&lt;br /&gt;
 |PC6&lt;br /&gt;
 |A14&lt;br /&gt;
 |Out&lt;br /&gt;
 |&lt;br /&gt;
 |0&lt;br /&gt;
 |&lt;br /&gt;
 |WLAN_GPIO14_OUT *&lt;br /&gt;
 |&lt;br /&gt;
 |WLAN Output GPIO14&lt;br /&gt;
 |-&lt;br /&gt;
 |PC7&lt;br /&gt;
 |A15&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |WLAN_GPIO8_IN **&lt;br /&gt;
 |&lt;br /&gt;
 |WLAN Input GPIO8&lt;br /&gt;
 |-&lt;br /&gt;
 |PD0&lt;br /&gt;
 |SCL/INT0&lt;br /&gt;
 |In ²&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |I2C-Bus&lt;br /&gt;
 |SCL&lt;br /&gt;
 |XBUS: 10&lt;br /&gt;
 |XBUS SCL&lt;br /&gt;
 |-&lt;br /&gt;
 |PD1&lt;br /&gt;
 |SDA/INT1&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |I2C-Bus&lt;br /&gt;
 |SDA&lt;br /&gt;
 |XBUS: 12&lt;br /&gt;
 |XBUS SDA&lt;br /&gt;
 |-&lt;br /&gt;
 |PD2&lt;br /&gt;
 |RXD1/INT2&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |UART1&lt;br /&gt;
 |RXD1&lt;br /&gt;
 |USPI15: 8&lt;br /&gt;
 |USART1 RX, frei&lt;br /&gt;
 |-&lt;br /&gt;
 |PD3&lt;br /&gt;
 |TXD1/INT3&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |UART1&lt;br /&gt;
 |TXD1&lt;br /&gt;
 |USPI15: 6&lt;br /&gt;
 |USART1 TX, frei&lt;br /&gt;
 |-&lt;br /&gt;
 |PD4&lt;br /&gt;
 |ICP1&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_PD4_ICP1&lt;br /&gt;
 |PWM01: 1&lt;br /&gt;
 |frei&lt;br /&gt;
 |-&lt;br /&gt;
 |PD5&lt;br /&gt;
 |XCK1&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_PD5_XCK1&lt;br /&gt;
 |USPI15: 4&lt;br /&gt;
 |frei&lt;br /&gt;
 |-&lt;br /&gt;
 |PD6&lt;br /&gt;
 |T1&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_PD6_T1&lt;br /&gt;
 |PWM01: 3&lt;br /&gt;
 |frei&lt;br /&gt;
 |-&lt;br /&gt;
 |PD7&lt;br /&gt;
 |T0&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_PD7_T2&lt;br /&gt;
 |PWM01: 6&lt;br /&gt;
 |frei&lt;br /&gt;
 |-&lt;br /&gt;
 |PE0&lt;br /&gt;
 |RXD0/PCI8&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |UART0&lt;br /&gt;
 |RXD0&lt;br /&gt;
 |PROGU: 2&lt;br /&gt;
 |USART RX&lt;br /&gt;
 |-&lt;br /&gt;
 |PE1&lt;br /&gt;
 |TXD0&lt;br /&gt;
 |Out&lt;br /&gt;
 |&lt;br /&gt;
 |0&lt;br /&gt;
 |UART0&lt;br /&gt;
 |TXD0&lt;br /&gt;
 |PROGU: 3&lt;br /&gt;
 |USART TX&lt;br /&gt;
 |-&lt;br /&gt;
 |PE2&lt;br /&gt;
 |XCK0/AIN0&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_PE2_XCK0_AIN0&lt;br /&gt;
 |ADCIO2: 8&lt;br /&gt;
 |frei&lt;br /&gt;
 |-&lt;br /&gt;
 |PE3&lt;br /&gt;
 |OC3A/AIN1&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_PE3_OC3A_AIN1&lt;br /&gt;
 |ADCIO2: 4&lt;br /&gt;
 |frei&lt;br /&gt;
 |-&lt;br /&gt;
 |PE4&lt;br /&gt;
 |OC3B/INT4&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_PE4_OC3B_I4&lt;br /&gt;
 |PWM23: 9&lt;br /&gt;
 |frei&lt;br /&gt;
 |-&lt;br /&gt;
 |PE5&lt;br /&gt;
 |OC3C/INT5&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_PE5_OC3C_I5&lt;br /&gt;
 |PWM23: 4&lt;br /&gt;
 |frei&lt;br /&gt;
 |-&lt;br /&gt;
 |PE6&lt;br /&gt;
 |T3/INT6&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_PE6_T3_I6&lt;br /&gt;
 |PWM23: 3&lt;br /&gt;
 |frei&lt;br /&gt;
 |-&lt;br /&gt;
 |PE7&lt;br /&gt;
 |CLKO/ICP3/INT7&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_PE7_ICP3_I7&lt;br /&gt;
 |PWM23: 1&lt;br /&gt;
 |frei&lt;br /&gt;
 |-&lt;br /&gt;
 |PF0&lt;br /&gt;
 |ADC0&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_ADC0&lt;br /&gt;
 |ADCIO1: 3&lt;br /&gt;
 |ADC_0 (frei)&lt;br /&gt;
 |-&lt;br /&gt;
 |PF1&lt;br /&gt;
 |ADC1&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_ADC1&lt;br /&gt;
 |ADCIO1: 1&lt;br /&gt;
 |ADC_1 (frei)&lt;br /&gt;
 |-&lt;br /&gt;
 |PF2&lt;br /&gt;
 |ADC2&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_ADC2&lt;br /&gt;
 |ADCIO1: 5&lt;br /&gt;
 |ADC_2 (frei)&lt;br /&gt;
 |-&lt;br /&gt;
 |PF3&lt;br /&gt;
 |ADC3&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_ADC3&lt;br /&gt;
 |ADCIO1: 7&lt;br /&gt;
 |ADC_3 (frei)&lt;br /&gt;
 |-&lt;br /&gt;
 |PF4&lt;br /&gt;
 |ADC4/TCK&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |JTAG&lt;br /&gt;
 |IO_ADC4&lt;br /&gt;
 |ADCIO1: 9&lt;br /&gt;
 |ADC_4 (frei)&lt;br /&gt;
 |-&lt;br /&gt;
 |PF5&lt;br /&gt;
 |ADC5/TMS&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |JTAG&lt;br /&gt;
 |IO_ADC5&lt;br /&gt;
 |ADCIO1: 11&lt;br /&gt;
 |ADC_5 (frei)&lt;br /&gt;
 |-&lt;br /&gt;
 |PF6&lt;br /&gt;
 |ADC6/TDO&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |JTAG&lt;br /&gt;
 |IO_ADC6&lt;br /&gt;
 |ADCIO1: 12&lt;br /&gt;
 |ADC_6 (frei)&lt;br /&gt;
 |-&lt;br /&gt;
 |PF7&lt;br /&gt;
 |ADC7/TDI&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |JTAG&lt;br /&gt;
 |IO_ADC7&lt;br /&gt;
 |ADCIO1: 13&lt;br /&gt;
 |ADC_7 (frei)&lt;br /&gt;
 |-&lt;br /&gt;
 |PG0&lt;br /&gt;
 |WR&lt;br /&gt;
 |Out&lt;br /&gt;
 |&lt;br /&gt;
 |0&lt;br /&gt;
 |&lt;br /&gt;
 |DISP_WR&lt;br /&gt;
 |DISPIO: 5&lt;br /&gt;
 |Display WR&lt;br /&gt;
 |-&lt;br /&gt;
 |PG1&lt;br /&gt;
 |RD&lt;br /&gt;
 |Out&lt;br /&gt;
 |&lt;br /&gt;
 |0&lt;br /&gt;
 |&lt;br /&gt;
 |DISP_EN_RD&lt;br /&gt;
 |DISPIO: 6&lt;br /&gt;
 |Display RD&lt;br /&gt;
 |-&lt;br /&gt;
 |PG2&lt;br /&gt;
 |ALE&lt;br /&gt;
 |Out&lt;br /&gt;
 |&lt;br /&gt;
 |0&lt;br /&gt;
 |&lt;br /&gt;
 |DISP_RS_ALE&lt;br /&gt;
 |DISPIO: 4&lt;br /&gt;
 |Display ALE&lt;br /&gt;
 |-&lt;br /&gt;
 |PG3&lt;br /&gt;
 |TOSC2&lt;br /&gt;
 |In&lt;br /&gt;
 |1 &amp;quot;&amp;quot;&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |BUTTON_SW2&lt;br /&gt;
 |&lt;br /&gt;
 |Taster SW2&lt;br /&gt;
 |-&lt;br /&gt;
 |PG4&lt;br /&gt;
 |TOSC1&lt;br /&gt;
 |In&lt;br /&gt;
 |1 &amp;quot;&amp;quot;&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |BUTTON_SW1&lt;br /&gt;
 |&lt;br /&gt;
 |Taster SW1&lt;br /&gt;
 |-&lt;br /&gt;
 |PG5&lt;br /&gt;
 |OC0B&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_OC0B&lt;br /&gt;
 |PWM01: 5&lt;br /&gt;
 |frei&lt;br /&gt;
 |-&lt;br /&gt;
 |PH0&lt;br /&gt;
 |RXD2&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |UART2&lt;br /&gt;
 |RXD2&lt;br /&gt;
 |USPI24: 8&lt;br /&gt;
 |USART2 RX, frei&lt;br /&gt;
 |-&lt;br /&gt;
 |PH1&lt;br /&gt;
 |TXD2&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |UART2&lt;br /&gt;
 |TXD2&lt;br /&gt;
 |USPI24: 6&lt;br /&gt;
 |USART2 TX, frei&lt;br /&gt;
 |-&lt;br /&gt;
 |PH2&lt;br /&gt;
 |XCK2&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_PH2_XCK2&lt;br /&gt;
 |USPI24: 4&lt;br /&gt;
 |frei&lt;br /&gt;
 |-&lt;br /&gt;
 |PH3&lt;br /&gt;
 |OC4A&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_PH3_OC4A&lt;br /&gt;
 |USPI24: 9&lt;br /&gt;
 |frei&lt;br /&gt;
 |-&lt;br /&gt;
 |PH4&lt;br /&gt;
 |OC4B&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_PH4_OC4B&lt;br /&gt;
 |USPI24: 7&lt;br /&gt;
 |frei&lt;br /&gt;
 |-&lt;br /&gt;
 |PH5&lt;br /&gt;
 |OC4C&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_PH5_OC4C&lt;br /&gt;
 |USPI24: 5&lt;br /&gt;
 |frei&lt;br /&gt;
 |-&lt;br /&gt;
 |PH6&lt;br /&gt;
 |OC2B&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_PH6_OC2B&lt;br /&gt;
 |PWM23: 7&lt;br /&gt;
 |frei&lt;br /&gt;
 |-&lt;br /&gt;
 |PH7&lt;br /&gt;
 |T4&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_PH7_T4&lt;br /&gt;
 |USPI24: 3&lt;br /&gt;
 |frei&lt;br /&gt;
 |-&lt;br /&gt;
 |PJ0&lt;br /&gt;
 |RXD3/PCI9&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |UART3&lt;br /&gt;
 |WLAN_RXD3 **&lt;br /&gt;
 |&lt;br /&gt;
 |WLAN USART RX&lt;br /&gt;
 |-&lt;br /&gt;
 |PJ1&lt;br /&gt;
 |TXD3/PCI10&lt;br /&gt;
 |Out&lt;br /&gt;
 |&lt;br /&gt;
 |0&lt;br /&gt;
 |UART3&lt;br /&gt;
 |WLAN_TXD3 *&lt;br /&gt;
 |&lt;br /&gt;
 |WLAN USART TX&lt;br /&gt;
 |-&lt;br /&gt;
 |PJ2&lt;br /&gt;
 |XCK3/PCI11&lt;br /&gt;
 |Out&lt;br /&gt;
 |&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |WLAN_RTS *&lt;br /&gt;
 |&lt;br /&gt;
 |WLAN Output RTS&lt;br /&gt;
 |-&lt;br /&gt;
 |PJ3&lt;br /&gt;
 |PCI12&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |INT1_PI12&lt;br /&gt;
 |XBUS: 8&lt;br /&gt;
 |XBUS INT1&lt;br /&gt;
 |-&lt;br /&gt;
 |PJ4&lt;br /&gt;
 |PCI13&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |INTU_PI13&lt;br /&gt;
 |XBUS: 7&lt;br /&gt;
 |XBUS INTU&lt;br /&gt;
 |-&lt;br /&gt;
 |PJ5&lt;br /&gt;
 |PCI14&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |INT3_PI14&lt;br /&gt;
 |XBUS: 9&lt;br /&gt;
 |XBUS INT3&lt;br /&gt;
 |-&lt;br /&gt;
 |PJ6&lt;br /&gt;
 |PCI15&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |INT2_PI15&lt;br /&gt;
 |XBUS: 11&lt;br /&gt;
 |XBUS INT2&lt;br /&gt;
 |-&lt;br /&gt;
 |PJ7&lt;br /&gt;
 |&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |WLAN_CTS **&lt;br /&gt;
 |&lt;br /&gt;
 |WLAN Input CTS&lt;br /&gt;
 |-&lt;br /&gt;
 |PK0&lt;br /&gt;
 |ADC8/PCI16&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_ADC8_PI16&lt;br /&gt;
 |ADCIO2: 1&lt;br /&gt;
 |ADC_8 (frei)&lt;br /&gt;
 |-&lt;br /&gt;
 |PK1&lt;br /&gt;
 |ADC9/PCI17&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_ADC9_PI17&lt;br /&gt;
 |ADCIO2: 3&lt;br /&gt;
 |ADC_9 (frei)&lt;br /&gt;
 |-&lt;br /&gt;
 |PK2&lt;br /&gt;
 |ADC10/PCI18&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_ADC10_PI18&lt;br /&gt;
 |ADCIO2: 5&lt;br /&gt;
 |ADC_10 (frei)&lt;br /&gt;
 |-&lt;br /&gt;
 |PK3&lt;br /&gt;
 |ADC11/PCI19&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_ADC11_PI19&lt;br /&gt;
 |ADCIO2: 7&lt;br /&gt;
 |ADC_11 (frei)&lt;br /&gt;
 |-&lt;br /&gt;
 |PK4&lt;br /&gt;
 |ADC12/PCI20&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_ADC12_PI20&lt;br /&gt;
 |ADCIO2: 9&lt;br /&gt;
 |ADC_12 (frei)&lt;br /&gt;
 |-&lt;br /&gt;
 |PK5&lt;br /&gt;
 |ADC13/PCI21&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_ADC13_PI21&lt;br /&gt;
 |PWM01: 8&lt;br /&gt;
 |ADC_13 (frei)&lt;br /&gt;
 |-&lt;br /&gt;
 |PK6&lt;br /&gt;
 |ADC14/PCI22&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_ADC14_PI22&lt;br /&gt;
 |PWM23: 8&lt;br /&gt;
 |ADC_14 (frei)&lt;br /&gt;
 |-&lt;br /&gt;
 |PK7&lt;br /&gt;
 |ADC15/PCI23&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_ADC15_PI23&lt;br /&gt;
 |PWM23: 6&lt;br /&gt;
 |ADC_15 (frei)&lt;br /&gt;
 |-&lt;br /&gt;
 |PL0&lt;br /&gt;
 |ICP4&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_PL0_ICP4&lt;br /&gt;
 |USPI24: 1&lt;br /&gt;
 |frei&lt;br /&gt;
 |-&lt;br /&gt;
 |PL1&lt;br /&gt;
 |ICP5&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_PL1_ICP5&lt;br /&gt;
 |USPI15: 1&lt;br /&gt;
 |frei&lt;br /&gt;
 |-&lt;br /&gt;
 |PL2&lt;br /&gt;
 |T5&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_PL2_T5&lt;br /&gt;
 |USPI15: 3&lt;br /&gt;
 |frei&lt;br /&gt;
 |-&lt;br /&gt;
 |PL3&lt;br /&gt;
 |OC5A&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_PL3_OC5A&lt;br /&gt;
 |USPI15: 5&lt;br /&gt;
 |frei&lt;br /&gt;
 |-&lt;br /&gt;
 |PL4&lt;br /&gt;
 |OC5B&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_PL4_OC5B&lt;br /&gt;
 |USPI15: 9&lt;br /&gt;
 |frei&lt;br /&gt;
 |-&lt;br /&gt;
 |PL5&lt;br /&gt;
 |OC5C&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_PL5_OC5C&lt;br /&gt;
 |USPI15: 7&lt;br /&gt;
 |frei&lt;br /&gt;
 |-&lt;br /&gt;
 |PL6&lt;br /&gt;
 |&lt;br /&gt;
 |Out&lt;br /&gt;
 |³&lt;br /&gt;
 |0&lt;br /&gt;
 |&lt;br /&gt;
 |WLAN_WAKE&lt;br /&gt;
 |&lt;br /&gt;
 |WLAN Output WAKE&lt;br /&gt;
 |-&lt;br /&gt;
 |PL7&lt;br /&gt;
 |&lt;br /&gt;
 |Out&lt;br /&gt;
 |²&lt;br /&gt;
 |0&lt;br /&gt;
 |&lt;br /&gt;
 |WLAN_RESET&lt;br /&gt;
 |&lt;br /&gt;
 |WLAN Output RESET&lt;br /&gt;
 |-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
 Zeichen:&lt;br /&gt;
 *    Verbunden mit einem Eingang des I2C-Pegelwandlers NC7WZ16&lt;br /&gt;
 **   Verbunden mit einem Ausgang des I2C-Pegelwandlers NC7WZ16&lt;br /&gt;
 ***  Verbunden mit einem Ausgang des I2C-Pegelwandlers NC7WZ16&lt;br /&gt;
      über Widerstand 680 Ohm (R7)&lt;br /&gt;
 &lt;br /&gt;
 ²    Verbunden mit Pulldown 10 kOhm (R22) und MOSFET Gate (Q2)&lt;br /&gt;
 ³    Verbunden mit Spannungsteiler 68 / 100 kOhm (R21 / R23)&lt;br /&gt;
 &amp;quot;&amp;quot;   Verbunden mit Pullup-Widerstand 68 kOhm (und Taster nach GND)&lt;br /&gt;
 &lt;br /&gt;
 Kürzel (Spalte Name):&lt;br /&gt;
 PCIx     PCINTx&lt;br /&gt;
 &lt;br /&gt;
 Abkürzungen der IO-Stecker (Spalte Stecker):&lt;br /&gt;
 PWM01    IO_PWM/T0/T1&lt;br /&gt;
 PWM23    IO_PWM/T2/T3&lt;br /&gt;
 USPI15   UART_SPI1/T5&lt;br /&gt;
 USPI24   UART_SPI2/T4&lt;br /&gt;
 ADCIO1   ADC_IO1&lt;br /&gt;
 ADCIO2   ADC_IO2/CMP&lt;br /&gt;
 DISPIO   DISPLAY/IO&lt;br /&gt;
 PC01     PC0/1&lt;br /&gt;
 PROGU    PROG_UART&lt;br /&gt;
&lt;br /&gt;
======Timer-Nutzung======&lt;br /&gt;
&lt;br /&gt;
=====RP6M256uart=====&lt;br /&gt;
=====RP6M256_I2CMaster=====&lt;br /&gt;
=====RP6M256_WIFI=====&lt;br /&gt;
=====SDC=====&lt;br /&gt;
&lt;br /&gt;
====Projekte====&lt;br /&gt;
* Library:&lt;br /&gt;
** [http://www.roboternetz.de/community/threads/58744-RP6-M256-WIFI-Clock-Library RP6 M256 WIFI: Clock Library]&lt;br /&gt;
** [http://www.roboternetz.de/community/threads/58848-RP6-M256-WIFI-DCF77-Library RP6 M256 WIFI: DCF77 Library]&lt;br /&gt;
** [http://www.roboternetz.de/community/threads/66003-Peter-Fleury-s-I2C-Master-Library-f%C3%BCr-RP6 Peter Fleury's I2C Master Library für RP6]&lt;br /&gt;
** [http://www.roboternetz.de/community/threads/66586-RP6v2-Base-CONTROL-M32-M256-WiFi-100%C2%B5s-Stopwatches-Library Library für acht 100µs Stopwatches]&lt;br /&gt;
* Fernbedienung mit dem Browser (Demo):&lt;br /&gt;
** [http://www.roboternetz.de/community/threads/58162-Diskussion-zum-RP6-M256-WIFI-Modul?p=555102&amp;amp;viewfull=1#post555102 LED-Ansteuerung mit dem Browser]&lt;br /&gt;
** [http://www.roboternetz.de/community/threads/58162-Diskussion-zum-RP6-M256-WIFI-Modul?p=555651&amp;amp;viewfull=1#post555651 LEDs setzen und Daten der Browseranforderung anzeigen]&lt;br /&gt;
* I2C-Master für RP6Control M32 und RP6v2 Base (Demos, Library):&lt;br /&gt;
** [http://www.rn-wissen.de/index.php/RP6Control_M32:_I2C-Slave RP6Control M32 I2C-Slave]&lt;br /&gt;
* MultiIO Projekt (Demos, Library):&lt;br /&gt;
** [[RP6 Multi IO Projekt - Software#RP6_M256_WIFI|RP6 Multi IO Projekt - Software RP6 M256 WIFI]]&lt;br /&gt;
* ArduIO Projekt (Demos, Library):&lt;br /&gt;
** [http://rn-wissen.de/wiki/index.php/RP6_ArduIO_-_Software ArduIO Projekt - Software]&lt;br /&gt;
* Fernbedienung mit einer Android App (Demo):&lt;br /&gt;
** [http://www.roboternetz.de/community/threads/65626-RP6-WIFI-und-Wireless-IMU-%28f%C3%BCr-Android%29 RP6 WIFI und Wireless IMU (für Android)]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===RP6 Sensor Board===&lt;br /&gt;
&lt;br /&gt;
'''Die Beschreibung zur Programmierung des RP6 Sensor Boards wurde ausgelagert in einen eigenen [[RP6_Sensor_Board_und_Xtra_Module#RP6_Sensor_Board_3|Artikel]]!'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Erfahrungsberichte==&lt;br /&gt;
&lt;br /&gt;
...in Arbeit...(kann aber gerne ergänzt werden)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Siehe auch==&lt;br /&gt;
* [[RP6]]&lt;br /&gt;
* [[RP6 - Programmierung]]&lt;br /&gt;
* [[RP6 Sensor Board und Xtra Module]]&lt;br /&gt;
* [[RP6 Kamera - Mitmach-Projekt]]&lt;br /&gt;
* [[RP6v2 I2C-Portexpander]]&lt;br /&gt;
* [[RP6v2 USB-RS232-Adapter]]&lt;br /&gt;
* [[RP6v2 Orientierung]]&lt;br /&gt;
* [[RP6 Multi IO Projekt]]&lt;br /&gt;
* [[RP6 Multi IO Projekt - Software]]&lt;br /&gt;
* [[RP6 ArduIO]]&lt;br /&gt;
* [[RP6 ArduIO - Software]]&lt;br /&gt;
* [[Induktive_Ladestation_f%C3%BCr_den_RP6|Induktive Ladestation für den RP6]]&lt;br /&gt;
* [[IR-bake_f%C3%BCr_den_RP6|IR-bake für den RP6]]&lt;br /&gt;
* [[CCRP5]]&lt;br /&gt;
* [[Wild Thumper]]&lt;br /&gt;
* [[Wild Thumper - Programmierung]]&lt;br /&gt;
* [[Yeti]]&lt;br /&gt;
* [[Asuro]]&lt;br /&gt;
* [[C't-Bot]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Weblinks==&lt;br /&gt;
'''Siehe auch die Weblinks im [http://www.rn-wissen.de/index.php/RP6#Weblinks RP6 Artikel]!'''&lt;br /&gt;
&lt;br /&gt;
* Ankündigung des RP6v2 im [http://www.roboternetz.de/community/threads/56964-NEWS-RP6v2-die-neue-Version-2-des-RP6-Robot-Systems RoboterNETZ] und im [http://www.arexx.com/forum/viewtopic.php?f=19&amp;amp;t=1778 AREXX Support Forum]&lt;br /&gt;
* Ankündigung der RP6v2 M256 WiFi und der Testaktion im [http://www.arexx.com/forum/viewtopic.php?f=19&amp;amp;t=1797 AREXX Support Forum]&lt;br /&gt;
* Beginn der &amp;quot;Testaktion: Kostenlose RP6v2-M256-WIFI Module!&amp;quot; im [http://www.roboternetz.de/community/threads/58161-Kostenlose-RP6-M256-WIFI-Module-für-Testanwender! Roboternetz RP6 Forum]&lt;br /&gt;
* Ende der &amp;quot;Testaktion: Kostenlose RP6v2-M256-WIFI Module!&amp;quot; nach Abstimmung im [http://www.roboternetz.de/community/threads/58389-Wählt-Gewinner-der-RP6v2-M256-WIFI-Module Roboternetz RP6 Forum]&lt;br /&gt;
* Newsartikel zur RP6v2 M256 WiFi im [http://www.roboternetz.de/community/threads/58160-Funk-Erweiterungsmodul-für-den-RP6-und-RP6v2-Gratis-für-Tester! RoboterNETZ]&lt;br /&gt;
* Diskussions-Thread zur RP6v2 M256 WiFi im [http://www.roboternetz.de/community/threads/58162-Diskussion-zum-RP6-M256-WIFI-Modul Roboternetz RP6 Forum]&lt;br /&gt;
* Diskussions-Thread zur RP6v2 M256 WiFi [http://www.roboternetz.de/community/threads/59739-Probleme-mit-M256-WIFI-1-2 mit &amp;quot;altem&amp;quot; Bootloader V1.2]&lt;br /&gt;
&lt;br /&gt;
* [http://www.arexx.com/rp6/downloads/RP6M256_WIFI_BOOTLOADER.zip RP6M256_WIFI_BOOTLOADER]&lt;br /&gt;
* [http://arexx.com/rp6/downloads/RP6M256_baudrate_test.zip RP6v2 M256 WiFi Baudraten Test]&lt;br /&gt;
* [http://www.arexx.com/rp6/downloads/rp6m256_wlan_config_de.txt RP6v2 M256 WiFi Liste mit möglichen Problemlösungen]&lt;br /&gt;
* Kleinserie: [http://www.roboternetz.de/community/threads/59797-Kleinserie-hardware-für-die-M256-WIFI Hardware für die RP6v2 M256 WiFi ('''RP6 Multi IO Projekt''')]&lt;br /&gt;
* Kleinserie: [http://www.roboternetz.de/community/threads/65296-I-O-ADC-und-DAC-Erweiterung-f%C3%BCr-RP6-3-3V-und-5V%21 I/O-, ADC- und DAC Erweiterung für RP6??? 3,3V und 5V!? ('''RP6 ArduIO Projekt''')]&lt;br /&gt;
* JM3 Engeneering: [http://www.jm3-engineering.com/rp6.htm RP6 Roboter Erweiterung]&lt;br /&gt;
* Ankündigung einer Sensorerweiterungsplatine für die RP6v2 M256 WiFi im [http://www.roboternetz.de/community/threads/63595-Neue-Hardware-f%C3%BCr-RP6%28v2%29?p=590129&amp;amp;viewfull=1#post590129 Roboternetz RP6 Forum]&lt;br /&gt;
* Erfahrungsbericht zur Sensorerweiterungsplatine im [http://www.arexx.com/forum/viewtopic.php?f=19&amp;amp;t=2498 AREXX Support Forum] und im [http://www.roboternetz.de/community/threads/64414-RP6-Sensor-Board-Erster-Eindruck Roboternetz RP6 Forum]&lt;br /&gt;
&lt;br /&gt;
* [http://www.rn-wissen.de/index.php/RP6_mit_AVR_Studio RP6 mit AVR Studio]&lt;br /&gt;
&lt;br /&gt;
* [http://www.arexx.com/rp6 AREXX RP6 Startseite]&lt;br /&gt;
* [http://www.arexx.com/forum/viewforum.php?f=19 AREXX Support Forum]&lt;br /&gt;
&lt;br /&gt;
* [http://www.conrad.de/ce/de/product/191584/RP6-V2-ROBOTERSYSTEM RP6v2 bei CONRAD]&lt;br /&gt;
* [http://www.conrad.de/ce/de/product/191550/RP6-MEGA32-ERWEITERUNGSSATZ RP6 CONTROL M32 bei CONRAD]&lt;br /&gt;
* [http://www.conrad.de/ce/de/product/191563/RP6-CC-PRO-MEGA128-ERWEITERUNGSSATZ RP6 CCPRO M128 bei CONRAD]&lt;br /&gt;
* [http://www.conrad.de/ce/de/product/191609/Arexx-RP6-V2-Control-M256-WiFi-Kit-RP6v2-M256-WIFI RP6v2 M256 WiFi bei CONRAD]&lt;br /&gt;
* [http://www.conrad.de/ce/de/product/1082384/Arexx-RP6-Sensor-Board-RP6-JM03-61 RP6 Sensor Board bei CONRAD]&lt;br /&gt;
&lt;br /&gt;
* [http://www.microchip.com/wwwproducts/Devices.aspx?dDocName=en558370 WiFi-Modul RN-171] der RP6v2 M256 WiFi&lt;br /&gt;
* [http://www.arexx.com/rp6/downloads/RP6_M256_WIFI_MANUAL_DE_20120711.zip 1. Bedienungsanleitung] der RP6v2 M256 WiFi&lt;br /&gt;
&lt;br /&gt;
* [http://www.roboternetz.de/phpBB2/viewforum.php?f=49 Roboternetz RP6 Forum]&lt;br /&gt;
* &amp;quot;Geburt&amp;quot; des Wiki im RN-Forum: [http://www.roboternetz.de/community/threads/32793-RP6-Wiki-Artikel RP6-Wiki-Artikel]&lt;br /&gt;
* Roboter RoboPalm RP6: [http://www.ionix.de/doku.php/rp6/start Link]&lt;br /&gt;
&lt;br /&gt;
* [http://www.youtube.com/results?search_query=rp6 RP6 Videos]&lt;br /&gt;
* [http://de-de.facebook.com/pages/Robby-RP6/155118711202285 facebook]&lt;br /&gt;
* Abkündigung des RP6v2 im [https://www.roboternetz.de/community/threads/72730-Ende-des-RP6-Robotersystems-nach-fast-11-1-2-Jahren RoboterNETZ] &lt;br /&gt;
'''Siehe auch die Weblinks im [http://www.rn-wissen.de/index.php/RP6_Sensor_Board_und_Xtra_Module#Weblinks RP6 Sensor Board und Xtra Module Artikel]!'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Kategorie:Robotikeinstieg]]	 &lt;br /&gt;
[[Kategorie:Praxis]]&lt;br /&gt;
&lt;br /&gt;
==Autoren==&lt;br /&gt;
--[http://www.roboternetz.de/community/members/1972-Dirk Dirk] 15:40, 31. Mär 2022 (CET)&lt;/div&gt;</summary>
		<author><name>Dirk NO2</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=RP6v2&amp;diff=28588</id>
		<title>RP6v2</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=RP6v2&amp;diff=28588"/>
				<updated>2022-03-31T13:38:13Z</updated>
		
		<summary type="html">&lt;p&gt;Dirk NO2: /* RP6v2 Drehgeber-Satz RP6-ENCv2 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Bild:rp6v2_2.jpg|RP6v2 Base Roboter|right|500px]]&lt;br /&gt;
==Was bisher geschah==&lt;br /&gt;
'''Siehe auch &amp;quot;Was bisher geschah&amp;quot; im [http://www.rn-wissen.de/index.php/RP6#Was_bisher_geschah RP6 Artikel]!'''&lt;br /&gt;
&lt;br /&gt;
Mon, 27. Feb 2012 - Ankündigung des '''RP6v2'''&amp;lt;br/&amp;gt;&lt;br /&gt;
Don, 08. Mär 2012 - Auslieferungsbeginn des RP6v2&amp;lt;br/&amp;gt;&lt;br /&gt;
Sam, 17. Mär 2012 - Ankündigung der '''[[RP6v2#RP6v2_M256_WiFi_Platine|RP6v2 M256 WiFi]]'''&amp;lt;br/&amp;gt;&lt;br /&gt;
Mon, 11. Jun 2012 - Beginn der &amp;quot;Testaktion: Kostenlose RP6v2-M256-WIFI Module!&amp;quot;&amp;lt;br/&amp;gt;&lt;br /&gt;
Die, 10. Jul 2012 - Ende der &amp;quot;Testaktion: Kostenlose RP6v2-M256-WIFI Module!&amp;quot; nach Abstimmung&amp;lt;br/&amp;gt;&lt;br /&gt;
Mit, 11. Jul 2012 - Veröffentlichung der RP6v2 M256 WiFi Bedienungsanleitung&amp;lt;br/&amp;gt;&lt;br /&gt;
Die, 17. Jul 2012 - Eintreffen der kostenlosen RP6v2 M256 WiFi bei den Testern&amp;lt;br/&amp;gt;&lt;br /&gt;
Mit, 25. Jul 2012 - Auslieferungsbeginn der RP6v2 M256 WiFi&amp;lt;br/&amp;gt;&lt;br /&gt;
Don, 01. Nov 2012 - Im Oktober 2012 Auslieferung einiger RP6v2 M256 WiFi mit &amp;quot;altem&amp;quot; Bootloader V1.2&amp;lt;br/&amp;gt;&lt;br /&gt;
Don, 11. Dez 2014 - Im 2. bis 4. Quartal 2014 Auslieferung einiger [http://www.arexx.com/forum/viewtopic.php?f=19&amp;amp;t=2618 USB Interfaces mit gefälschtem FTDI Chip]&amp;lt;br/&amp;gt;&lt;br /&gt;
Sam, 02. Jan 2016 - Unter der Bezeichnung '''[[RP6v2#Arexx_RP6-Xtra_Robotersystem|Arexx RP6-Xtra Robotersystem]]''' ist ein Set bestehend aus dem RP6, einer Experimentierplatine, einem RP6v2 Drehgeber-Satz und einem RP6 USB-Interface lieferbar&amp;lt;br/&amp;gt;&lt;br /&gt;
Mon, 12. Mär 2018 - Seit dem 1. Quartal 2018 ist das Arexx RP6-Xtra Robotersystem bei CONRAD ausverkauft&amp;lt;br/&amp;gt;&lt;br /&gt;
Sam, 31. Mär 2018 - Seit Ende März 2018 ist die RP6v2 M256 WiFi Zusatzpatine bei CONRAD ausverkauft&amp;lt;br/&amp;gt;&lt;br /&gt;
Mit, 12. Sep 2018 - Seit September 2018 ist das [[RP6#Displays|LC-Display]] bei CONRAD ausverkauft&amp;lt;br/&amp;gt;&lt;br /&gt;
Mit, 28. Nov 2018 - Seit November 2018 ist der RP6v2 bei CONRAD ausverkauft&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Siehe auch &amp;quot;Was bisher geschah&amp;quot; im [http://www.rn-wissen.de/index.php/RP6_Sensor_Board_und_Xtra_Module#Was_bisher_geschah RP6 Sensor Board und Xtra Module Artikel]!'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Allgemein==&lt;br /&gt;
Der RP6v2 ([http://www.conrad.de/ce/de/product/191584/RP6-V2-ROBOTERSYSTEM/ 191584]) wurde am 27.02.2012 von [http://www.roboternetz.de/community/members/120-SlyD SlyD] angekündigt (siehe Weblinks!). Er ist eine leicht verbesserte Version des [[RP6]]. Der RP6v2 ist softwarekompatibel zum RP6. '''Alle Erweiterungs-Module können auch mit dem RP6v2 eingesetzt werden.'''&lt;br /&gt;
&lt;br /&gt;
 '''Seit November 2018 ist der RP6v2 bei CONRAD ausverkauft.'''&lt;br /&gt;
 '''Damit endet die Ära des RP6 Robotersystems nun endgültig nach fast 11 1/2 Jahren.'''&lt;br /&gt;
&lt;br /&gt;
Dieser Artikel beschreibt die Grundlagen zum RP6v2, '''sofern sie vom RP6 abweichen''', und die Grundlagen und Programmierung seiner zukünftigen Erweiterungs-Module.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Eigenschaften==&lt;br /&gt;
Laut Ankündigung haben sich beim RP6v2 folgende Details gegenüber dem RP6 geändert:&lt;br /&gt;
* Neue Drehgeber&lt;br /&gt;
** Justierung dank neuer Sensortechnik üblicherweise nicht mehr erforderlich&lt;br /&gt;
** leicht zugängliches und deutlich größeres Potentiometer&lt;br /&gt;
** Potis nur noch zur Feinjustierung erforderlich&lt;br /&gt;
* Zusätzliche Steckverbinder (im RP6 schon seit 2010 verbaut)&lt;br /&gt;
** vom Mainboard zu den Drehgebern&lt;br /&gt;
** vom Mainboard zu den Motoren&lt;br /&gt;
* Neue Anschlüsse (Steckverbinder / Stiftleisten)&lt;br /&gt;
** 2 3-polige ADC Anschlüsse mit VDD/GND inkl. zusätzlichem Stützkondensator&lt;br /&gt;
** 2 4-polige VDD Anschlüsse (je 2x +5V und 2x GND)&lt;br /&gt;
** 1 3-poliger +UB Anschluß (1x +UB, 2x GND)&lt;br /&gt;
** 1 5-polige Stiftleiste für den I2C Bus und VDD/GND&lt;br /&gt;
** 1 8-poliger EXT Steckverbinder (JST-Wannenstecker)&lt;br /&gt;
** 2 4-polige Steckverbinder (LIO1/LIO2) für die I/O-Pins von 4 LEDs und VDD/GND&lt;br /&gt;
* Hauptsicherung&lt;br /&gt;
** von 2,5A auf 3,15A erhöht&lt;br /&gt;
* Motortreiber&lt;br /&gt;
** leistungsfähigere und robustere MOSFETs&lt;br /&gt;
* Experimentierplatine&lt;br /&gt;
** gehört nicht mehr zum Lieferumfang&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Technische Änderungen==&lt;br /&gt;
Der RP6v2 weist einige Detail-Änderungen gegenüber der Vorversion auf. '''Diese Änderungen sind für die Nutzung und Programmierung des RP6v2 weitgehend irrelevant.'''&lt;br /&gt;
&lt;br /&gt;
Fast alle passiven SMD-Bauteile sind jetzt in Bauform 0603 bestückt (Ausnahmen: R6 (SP2 C2: R6), Induktivitäten und größere Kondensatoren).&lt;br /&gt;
Im Text gibt es Verweise auf den Schaltplan des RP6v2 (RP6v2_MAINBOARD.pdf) in der Form: (SP2 B1: Bauteil). Dies bedeutet, dass man das Bauteil auf Blatt 2 des RP6v2-Schaltplans im Feld B1 finden kann.&lt;br /&gt;
&lt;br /&gt;
===Mainboard===&lt;br /&gt;
* C14 (SP2 A3: C14) -&amp;gt; Liegt jetzt an VDD (parallel u.a. zu C6..C10)&lt;br /&gt;
* C26 (SP2 A1: C26) -&amp;gt; Jetzt bestückt mit Elko 220uF/16V (laut SP: 470uF/16V!)&lt;br /&gt;
* C29 (SP2 E1: C29) -&amp;gt; Jetzt bestückt mit SMD Kondensator 10uF&lt;br /&gt;
* IO3/IO4 Bestückungsaufdruck geändert in IO4/IO5 (Stecker LIO2)&lt;br /&gt;
* UBAT Bestückungsaufdruck geändert in UBAT_SENSE&lt;br /&gt;
* F2.5A Bestückungsaufdruck geändert in F3.0A (Feinsicherung flink 3,0A)&lt;br /&gt;
* Trennstelle +UB Sensor (siehe Abschnitt 6.4.6 [[RP6#.2BUB_Sensor|+UB Sensor]] des RP6-Artikels!) existiert beim RP6v2 nicht mehr&lt;br /&gt;
* Als Motortreiber (SP3 BCD23: Q1..Q4) werden anstelle von IRF7309 (ID 3,0A; PD 1,4W) die leistungsfähigeren und ESD-geschützten Typen [http://media.digikey.com/pdf/Data%20Sheets/Rohm%20PDFs/SP8M3.pdf SP8M3] (ID 4,5A; PD 2W; Schutzdiode) verwendet&lt;br /&gt;
&lt;br /&gt;
===Encoderplatine===&lt;br /&gt;
Schaltung siehe Datei RP6v2_ENCODERS.pdf!&lt;br /&gt;
* Jetzt mit Operationsverstärker IC2 ([http://ww1.microchip.com/downloads/en/DeviceDoc/21733h.pdf MCP6001U]) anstelle eines Transistors&lt;br /&gt;
* Größeres Potentiometer R2 (200kOhm)&lt;br /&gt;
Die Encoder sind mittlerweile auch einzeln unter der Conrad-Bestellnummer '''[http://www.conrad.de/ce/de/product/191625/RP6-DREHGEBER-SATZ 191625-62]''' verfügbar.&lt;br /&gt;
&lt;br /&gt;
===USB-Interface===&lt;br /&gt;
Schaltung siehe Datei RP6v2_USB_INTERFACE.pdf!&lt;br /&gt;
* C2  -&amp;gt; Jetzt bestückt mit SMD Kondensator 10uF&lt;br /&gt;
* C5  -&amp;gt; Neuer Blockkondensator 100nF an VCCIO von IC1&lt;br /&gt;
&lt;br /&gt;
===Steckverbindungen und Stiftleisten===&lt;br /&gt;
&lt;br /&gt;
====Motoren====&lt;br /&gt;
[[Bild:RP6v2_Motorstecker.JPG|thumb]]&lt;br /&gt;
&lt;br /&gt;
Beim RP6v2 sind die beiden Motorkabel mit 2-poligen Winkelsteckern RM 7,5mm an das Mainboard angeschlossen. &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;
&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;
====Encoder====&lt;br /&gt;
[[Bild:RP6v2_Encoderstecker.JPG|thumb]]&lt;br /&gt;
&lt;br /&gt;
Beim RP6v2 sind die Encoder mit einer JST XH Stiftleiste gewinkelt, 6-polig, RM 2,5mm ([http://www.conrad.de/ce/de/product/740271/Stiftleiste-gewinkelt-RM-25-mm-Serie-XH-Rastermass-25-mm-Pole-6-Nennstrom-3-A-S6B-XH-A-LFSN-JST-Inhalt-1-St 740271]) an das Mainboard angeschlossen.&lt;br /&gt;
&lt;br /&gt;
Auch die 3-polige Verbindung zu den beiden Encoder-Platinen (JST XH Stiftleiste gewinkelt, 3-polig, RM 2,5mm ([http://www.conrad.de/ce/de/product/740174/Stiftleiste-gewinkelt-RM-25-mm-Serie-XH-Rastermass-25-mm-Pole-3-Nennstrom-3-A-S3B-XH-A-LFSN-JST-Inhalt-1-St 740174])) ist steckbar.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====LIO1/LIO2====&lt;br /&gt;
[[Bild:RP6v2_LIO12.JPG|thumb]]&lt;br /&gt;
&lt;br /&gt;
Beim RP6 waren die Anschlüsse der Status-LEDs SL1,2 und SL4,5 ([[RP6#IO1..IO4|IO1..IO4]]) einzeln auf dem Mainboard zu kontaktieren.&lt;br /&gt;
&lt;br /&gt;
Beim RP6v2 gibt es zwei 4-polige Stiftleisten (LIO1, LIO2). Sie führen an den Pins 1 und 2 +5V und GND.&lt;br /&gt;
&lt;br /&gt;
An den Pins 3 und 4 finden sich die Anschlüsse von IO2, IO1 (LIO1) bzw. IO4, IO5 (LIO2).&lt;br /&gt;
&lt;br /&gt;
Bitte beachten: '''Der Bestückungsaufdruck IO4, IO5 des RP6v2 bezeichnet die selben Anschlüsse, wie beim RP6 IO3, IO4!'''&lt;br /&gt;
&lt;br /&gt;
Es handelt sich in beiden Fällen um die Anschlüsse der Status-LEDs SL4 (PB7) und SL5 (PB1).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====ADC0/ADC1====&lt;br /&gt;
[[Bild:RP6v2_ADC01.JPG|thumb]]&lt;br /&gt;
&lt;br /&gt;
Beim RP6 waren die 3-poligen Anschlüsse von ADC0 und ADC1 ([[RP6#Analoge_Sensoren_an_ADC0.2F1|Analoge Sensoren an ADC0/1]]) nicht mit Stiftleisten bestückt.&lt;br /&gt;
&lt;br /&gt;
Dies ist jetzt beim RP6v2 der Fall,- zusätzlich ist auch C26 (SP2 A1: C26) bestückt.&lt;br /&gt;
&lt;br /&gt;
Damit können analoge Sensoren direkt angeschlossen werden.&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;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====I2C/+UB/+5V====&lt;br /&gt;
[[Bild:RP6v2_I2CUB5V.JPG|thumb]]&lt;br /&gt;
&lt;br /&gt;
Die beim RP6 vorhandene 5-polige I2C-Schnittstelle ([[RP6#I2C-Schnittstelle|I2C-Schnittstelle]]) findet sich (jetzt mit Stiftleiste bestückt) genau so auch beim RP6v2.&lt;br /&gt;
&lt;br /&gt;
Bitte beachten: '''Die Anordnung der Pins auf dem Mainboard ist beim RP6v2 umgekehrt wie beim RP6!'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beim RP6 gab es (nicht mit Stiftleisten bestückte) Anschlüsse für VDD und +UB ([[RP6#VDD.2FGND.2F.2BUB_Anschlu.C3.9F|VDD/GND/+UB Anschluß]]).&lt;br /&gt;
&lt;br /&gt;
Beim RP6v2 gibt es jetzt drei Stiftleisten für +UB, +5V (VDD) und GND:&lt;br /&gt;
* Eine 3-polige Stiftleiste mit GND, +UB, GND&lt;br /&gt;
* Zwei 4-polige Stiftleisten jeweils mit GND, +5V, +5V, GND&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;
====EXT====&lt;br /&gt;
[[Bild:RP6v2_EXT.JPG|thumb]]&lt;br /&gt;
&lt;br /&gt;
Beim RP6 war keine Stiftleiste für den 8-poligen EXT Anschluß bestückt.&lt;br /&gt;
&lt;br /&gt;
Beim RP6v2 ist jetzt an dieser Stelle eine JST XH Stiftleiste gerade, 8-polig, RM 2,5mm ([http://www.conrad.de/ce/de/product/740105/Stiftleiste-gerade-RM-25-mm-Serie-XH-Rastermass-25-mm-Pole-8-Nennstrom-3-A-B8B-XH-A-LFSN-JST-Inhalt-1-St 740105]) vorhanden, auf die auch Steckbuchsen (RM 2,54) gesteckt werden können.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beschreibung des EXT Anschlusses: [[RP6#EXT_Anschlu.C3.9F|EXT Anschluß]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Erweiterungs-Module==&lt;br /&gt;
Über die Erweiterungs-Module informiert der Abschnitt [[RP6#Erweiterungs-Module|Erweiterungs-Module]] im RP6 Artikel.&lt;br /&gt;
&lt;br /&gt;
Darüber hinaus sind bei [http://www.conrad.de/ce/ CONRAD] für den RP6v2 erhältlich:&lt;br /&gt;
* RP6v2 M256 WiFi Zusatzplatine ([http://www.conrad.de/ce/de/product/191609/Arexx-RP6-V2-Control-M256-WiFi-Kit-RP6v2-M256-WIFI 191609])&lt;br /&gt;
* RP6 Sensor Board ([http://www.conrad.de/ce/de/product/1082384/Arexx-RP6-Sensor-Board-RP6-JM03-61 1082384])&lt;br /&gt;
&lt;br /&gt;
===RP6v2 M256 WiFi Platine===&lt;br /&gt;
Die RP6v2 M256 WiFi Zusatzplatine ([http://www.conrad.de/ce/de/product/191609/Arexx-RP6-V2-Control-M256-WiFi-Kit-RP6v2-M256-WIFI 191609]) wurde am 17.03.2012 von [http://www.roboternetz.de/community/members/120-SlyD SlyD] angekündigt (siehe Weblink!).&lt;br /&gt;
&lt;br /&gt;
Aktuell (Ende März 2018) ist die RP6v2 M256 WiFi Zusatzplatine bei CONRAD ausverkauft. &lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6v2_M256_WIFI.JPG|Die RP6v2 M256 WiFi]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Beschreibung====&lt;br /&gt;
Laut Ankündigung bietet die RP6v2 M256 WiFi:&lt;br /&gt;
* Atmel ATmega2560 Mikrocontroller&lt;br /&gt;
** 256kB Flash ROM&lt;br /&gt;
** 8kB SRAM&lt;br /&gt;
** 4kB EEPROM&lt;br /&gt;
** 16MHz Taktfrequenz&lt;br /&gt;
** 6 Hardware Timer und 86 I/O Ports&lt;br /&gt;
** Bis zu 16 A/D Wandler Kanäle (10 Bit Auflösung)&lt;br /&gt;
** 12 16 Bit Hardware PWMs&lt;br /&gt;
** 2 USART/SPI Ports&lt;br /&gt;
* Energieeffizientes 802.11g WLAN Modul&lt;br /&gt;
** Typ: Roving Networks RN-171&lt;br /&gt;
** Telemetriedaten übertragen&lt;br /&gt;
** Roboter vom PC aus fernsteuern&lt;br /&gt;
** Neue Programme drahtlos per WLAN in den Mikrocontroller laden&lt;br /&gt;
** Bootloader nachträglich erweitern&lt;br /&gt;
** Einstellung des WLAN Moduls über das RP6 USB Interface mit dem RobotLoader 2.x&lt;br /&gt;
** Änderung der Einstellungen über eine Netzwerkverbindung oder mit dem eigenen Mikrocontrollerprogramm&lt;br /&gt;
** Eigener Prozessor (entlastet den ATmega)&lt;br /&gt;
** Funktioniert mit jedem Standard WLAN Accesspoint/Router&lt;br /&gt;
** Kann als transparente serielle Schnittstelle arbeiten&lt;br /&gt;
** Kann vom PC aus per TCP/IP angesprochen werden&lt;br /&gt;
** 10cm 2.4GHz Antenne mit RP-SMA Anschluß&lt;br /&gt;
* Sonstige Ausstattung&lt;br /&gt;
** 8 Bit Display Port&lt;br /&gt;
** I2C Bus&lt;br /&gt;
** microSD Kartenslot&lt;br /&gt;
** 7 Status LEDs&lt;br /&gt;
** 2 Eingabetaster&lt;br /&gt;
** ISP Anschluß&lt;br /&gt;
** 4 WLAN ADC Kanäle&lt;br /&gt;
** AREF 3,3 und 5V&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6v2_M256_WIFI_Q2_m.JPG|thumb]]&lt;br /&gt;
&lt;br /&gt;
Ab Mitte Juli 2012 trafen die ersten kostenlosen RP6v2 M256 WiFi Platinen bei den Testern ein, die sich vorher dafür im Roboternetz RP6 Forum beworben hatten. Es handelte sich um Vorserien-Modelle, die sich dadurch auszeichneten, dass die Lötpads für Q2 (SP2 C6/C7: Q2) vertauscht waren. Der MOSFET war daher manuell &amp;quot;verdreht&amp;quot; aufgelötet, siehe nebenstehende Abbildung.&lt;br /&gt;
&lt;br /&gt;
Bei den Serien-Modellen wurde dies korrigiert.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Technische Daten====&lt;br /&gt;
{|  {{Blauetabelle}} &lt;br /&gt;
|'''Mikrocontroller:'''&lt;br /&gt;
|AVR ATmega2560&lt;br /&gt;
|-&lt;br /&gt;
|'''Speicher:'''&lt;br /&gt;
|256 kB [[Flash]]-Speicher&amp;lt;br/&amp;gt;&lt;br /&gt;
8 kB SRAM&amp;lt;br/&amp;gt; &lt;br /&gt;
4 kB [[EEPROM]]&amp;lt;br/&amp;gt;&lt;br /&gt;
? GB microSD Speicherkarte&lt;br /&gt;
|-&lt;br /&gt;
|'''Programmierung:'''&lt;br /&gt;
|Über [[Bootloader]], belegt ca. 8 kB des Flash-Speichers&amp;lt;br/&amp;gt;&lt;br /&gt;
Drahtlos über WLAN&lt;br /&gt;
|-&lt;br /&gt;
|'''Vorhandene Sensoren:'''&lt;br /&gt;
|2 Eingabetaster&amp;lt;br/&amp;gt;&lt;br /&gt;
4 WLAN ADC Kanäle&amp;lt;br/&amp;gt;&lt;br /&gt;
60 GP I/O Ports, davon bis 16 AD-Wandler (10-bit)&amp;lt;br/&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|'''Vorhandene Aktoren:'''&lt;br /&gt;
|7 Status LEDs&amp;lt;br/&amp;gt;&lt;br /&gt;
1 LC-Display-Port&amp;lt;br/&amp;gt;&lt;br /&gt;
802.11g WLAN Modul&amp;lt;br/&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|'''Abmessungen:'''&lt;br /&gt;
|(L &amp;amp;times; B &amp;amp;times; H) 112 &amp;amp;times; 90 &amp;amp;times; 42 mm (ohne Antenne)&lt;br /&gt;
|-&lt;br /&gt;
|'''Ausführung:'''&lt;br /&gt;
|Fertig aufgebautes Erweiterungsmodul&lt;br /&gt;
|-&lt;br /&gt;
|'''Stromversorgung:'''&lt;br /&gt;
|6 AA NiMH Akkus (über die RP6v2 Base)&lt;br /&gt;
|-&lt;br /&gt;
|'''Hersteller:'''&lt;br /&gt;
|Arexx Niederlande&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====WLAN Modul RN-171====&lt;br /&gt;
Das auf der RP6v2 M256 WiFi eingesetzte WLAN Modul ist das [http://www.microchip.com/wwwproducts/en/RN171 RN-171] ursprünglich entwickelt von Roving Networks. Vor einigen Jahren wurde die Firma Roving Networks von [http://www.microchip.com MicroChip Technology] übernommen.&lt;br /&gt;
&lt;br /&gt;
Inzwischen (2017) wird das RN-171 zwar noch hergestellt, für neue Hardware Designs aber nicht mehr empfohlen.&lt;br /&gt;
&lt;br /&gt;
Die letzte Firmware Version trägt die Nummer 4.81.&lt;br /&gt;
&lt;br /&gt;
Für die Nutzung des RN-171 auf der RP6v2 M256 WiFi wird sowohl vonseiten des Hardware Designs der Platine, als auch vonseiten der Software davon ausgegangen, dass das RN-171 auch den &amp;quot;Ad-Hoc Modus&amp;quot; beherrscht. Dies ist der Fall bis zur Firmware Version 2.38.3. Höhere Versionen beherrschen diesen Modus nicht mehr.&lt;br /&gt;
&lt;br /&gt;
''Somit ist die Firmware 2.38.3 die höchste Version, die für das RN-171 auf der RP6v2 M256 WiFi nutzbar ist!''&lt;br /&gt;
&lt;br /&gt;
Diese Firmware Version (Datei: wifly7-2383.img) findet ihr in der ZIP in diesem [http://www.roboternetz.de/community/threads/64251-RP6M256-WLAN-Modul-RN-171-Firmware-Update?p=594781&amp;amp;viewfull=1#post594781 Post] im Roboternetz RP6 Forum. Seht euch vor einem eventuellen Firmware Update unbedingt den ganzen [http://www.roboternetz.de/community/threads/64251-RP6M256-WLAN-Modul-RN-171-Firmware-Update Thread] auch wegen der enthaltenen Warnhinweise an.&lt;br /&gt;
&lt;br /&gt;
====Umbau-Optionen====&lt;br /&gt;
Für die RP6v2 M256 WiFi gibt es keine Umbau-Optionen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===RP6 Sensor Board===&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_Sensor_Board.jpg|Das RP6 Sensor Board]]&lt;br /&gt;
&lt;br /&gt;
'''Die Beschreibung des RP6 Sensor Boards wurde ausgelagert in einen eigenen [[RP6_Sensor_Board_und_Xtra_Module#RP6_Sensor_Board_2|Artikel]]!'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Zubehör und Ersatzteile==&lt;br /&gt;
Über die Zubehör- und Ersatzteile informiert der Abschnitt [[RP6#Zubehör und Ersatzteile|Zubehör und Ersatzteile]] im RP6 Artikel.&lt;br /&gt;
&lt;br /&gt;
Darüber hinaus sind bei [http://www.conrad.de/ce/ CONRAD] für den RP6v2 erhältlich:&lt;br /&gt;
* Arexx RP6v2 Drehgeber-Satz RP6-ENCv2 ([http://www.conrad.de/ce/de/product/191625/RP6-DREHGEBER-SATZ 191625] AUSVERKAUFT!)&lt;br /&gt;
* Arexx RP6 USB-Interface RP6V2-TRANS ([http://www.conrad.de/ce/de/product/191638/Arexx-RP6-USB-Interface-RP6V2-TRANS 191638] AUSVERKAUFT!)&lt;br /&gt;
* Arexx RP6 Xtra Module&lt;br /&gt;
&lt;br /&gt;
===RP6v2 Drehgeber-Satz RP6-ENCv2===&lt;br /&gt;
Die RP6v2 [http://www.rn-wissen.de/index.php/RP6v2#Encoder Drehgeber-Sensoren] (AREXX RP6-ENCv2) sind als Ersatzteil für den RP6v2 (191584) erhältlich und jetzt seit Mai 2020 bei CONRAD ausverkauft. Sie können auch in den [[RP6|RP6]] (191524) und in das RP5/RP6-Fahrgestell ([http://www.conrad.de/ce/de/product/191152/Arexx-Fahrgestell-Robby-RP5RP6-Roboter 191152] AUSVERKAUFT!) eingebaut werden und sind Bestandteil des [[RP6v2#Arexx_RP6-Xtra_Robotersystem|Arexx RP6-Xtra Robotersystems]].&lt;br /&gt;
&lt;br /&gt;
===RP6 USB-Interface RP6V2-TRANS===&lt;br /&gt;
Das RP6 USB-Interface (AREXX RP6V2-TRANS) kann zur Kommunikation mit verschiedenen Robotern und Erweiterungsmodulen eingesetzt werden. Es lassen sich mit dem RobotLoader neue Programme in den Mikrocontroller laden, und es wird ein virtueller serieller Port zur Kommunikation bereitgestellt. Auf dem Modul befindet sich zusätzlich ein Anschluss für APC220 Funkmodule (z.B. aus [http://www.conrad.de/ce/de/product/191668/Arexx-Wireless-Kit-ARX-APC220 diesem] Set, AUSVERKAUFT!) und ein 3,3 V Spannungsregler. Das USB-Interface RP6V2-TRANS kann als Ersatz für das mit dem RP6 oder RP6v2 gelieferte USB-Interface dienen und ist Bestandteil des [[RP6v2#Arexx_RP6-Xtra_Robotersystem|Arexx RP6-Xtra Robotersystems]]. Seit Ende 2021 ist das USB-Interface bei CONRAD ausverkauft.&lt;br /&gt;
&lt;br /&gt;
===RP6 Xtra Module===&lt;br /&gt;
'''Die Beschreibung der RP6 Xtra Module wurde ausgelagert in einen eigenen [[RP6_Sensor_Board_und_Xtra_Module#RP6_Xtra_Module_2|Artikel]]!'''&lt;br /&gt;
&lt;br /&gt;
===Arexx RP6-Xtra Robotersystem===&lt;br /&gt;
Unter der Bezeichnung '''Arexx RP6-Xtra Robotersystem''' bzw. '''Arexx Roboter Bausatz RP6-S''' ([https://www.conrad.de/de/arexx-rp6-xtra-robotersystem-1395738.html 1395738]) ist ab Januar 2016 ein Set bestehend aus dem [[RP6|RP6]] ([https://www.conrad.de/de/rp6-robotersystem-191524.html 191524]), einer [[RP6#Experimentierplatine|Experimentierplatine]] ([https://www.conrad.de/de/arexx-rp6-experimentierplatine-191537.html 191537]), einem [[RP6v2#RP6v2_Drehgeber-Satz_RP6-ENCv2|RP6v2 Drehgeber-Satz]] ([https://www.conrad.de/de/arexx-rp6-v2-drehgeber-sensoren-rp6-encv2-191625.html 191625]) und einem [[RP6v2#RP6_USB-Interface_RP6V2-TRANS|RP6 USB-Interface]] ([https://www.conrad.de/de/arexx-rp6-usb-interface-rp6v2-trans-191638.html 191638]) lieferbar.&lt;br /&gt;
&lt;br /&gt;
Die RP6v2 Drehgeber müssen selbst montiert werden. Durch dieses Set entsteht aus dem &amp;quot;alten RP6&amp;quot; ein Robotersystem, das in seiner Funktion identisch mit dem RP6v2 ist.&lt;br /&gt;
&lt;br /&gt;
Seit dem 1. Quartal 2018 ist das Arexx RP6-Xtra Robotersystem bei CONRAD ausverkauft.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Programmierung==&lt;br /&gt;
===RobotLoader===&lt;br /&gt;
Der RobotLoader ist die Weiterentwicklung des RP6Loaders. Es gibt ihn und den USB Interface Treiber [http://www.arexx.com/rp6/html/de/software.htm hier].&lt;br /&gt;
Über die Funktionen des RP6Loaders (siehe [[RP6_-_Programmierung#RP6Loader|hier]]!) hinaus kann der RobotLoader ab Version 2.0 Folgendes:&lt;br /&gt;
* WiFi Loader (Programme über WiFi hochladen und starten, Programmspeicher löschen)&lt;br /&gt;
* WiFi Terminal (Zeichen über WiFi senden/empfangen)&lt;br /&gt;
* Abdocken der Fenster des (seriellen) Terminals und des WiFi Terminals&lt;br /&gt;
* Konfiguration des WiFi Moduls über die serielle Schnittstelle&lt;br /&gt;
* Nach WiFi Geräten suchen&lt;br /&gt;
* Ab Version 2.3 über Kommandozeile steuerbar&lt;br /&gt;
&lt;br /&gt;
'''Befehlszeilen Optionen'''&lt;br /&gt;
&amp;lt;pre&amp;gt;################################################################&lt;br /&gt;
RobotLoader - Commandline Options&lt;br /&gt;
-c | -command : Enable Commandline Mode&lt;br /&gt;
-h | -help : Show this help message&lt;br /&gt;
-port=&amp;lt;PORT&amp;gt; : specify which port to use&lt;br /&gt;
               Windows with JD2XX: USB0, USB1, ...&lt;br /&gt;
               Windows with RXTX: COM0, COM1, ...&lt;br /&gt;
               Linux with RXTX: /dev/ttyUSB0, /dev/ttyUSB1, ...&lt;br /&gt;
-e : Erase Memory&lt;br /&gt;
-hex=&amp;lt;FILE&amp;gt; : Upload &amp;lt;FILE&amp;gt;, you must specify the complete path!&lt;br /&gt;
-s : Start Program (after upload)&lt;br /&gt;
-id : Get Infos from connected Board&lt;br /&gt;
###############################################################&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Loader Versionen====&lt;br /&gt;
Hier eine Tabelle der (mir) bekannten RobotLoader Versionen für die RP6v2 Base, CONTROL M32 und ab Version 2.0 auch für die M256 WiFi:&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |ZIP-Datum&lt;br /&gt;
 |Version&lt;br /&gt;
 |Bemerkungen&lt;br /&gt;
 |Examples&lt;br /&gt;
 |-&lt;br /&gt;
 |12.07.2010&lt;br /&gt;
 |[http://www.arexx.com/rp6/downloads/RobotLoader_20100712.zip 1.5h]&lt;br /&gt;
 |Auch für die RP6 Base, für Roboterarme und Caterpillar&lt;br /&gt;
 |ab 16.10.2007&lt;br /&gt;
 |-&lt;br /&gt;
 |16.06.2011&lt;br /&gt;
 |1.6b&lt;br /&gt;
 |Version auf der AREXX Wild Thumper CD-ROM!&lt;br /&gt;
 |&lt;br /&gt;
 |-&lt;br /&gt;
 |23.02.2012&lt;br /&gt;
 |[http://www.arexx.com/rp6/downloads/RobotLoader_20120223.zip 2.0 BETA]&lt;br /&gt;
 |Testversion! Ab v2.0 auch für die RP6v2 M256 WiFi Platine&lt;br /&gt;
 |&lt;br /&gt;
 |-&lt;br /&gt;
 |16.03.2012&lt;br /&gt;
 |2.1c&lt;br /&gt;
 |Version auf der AREXX Wireless kits CD-ROM 2012!&lt;br /&gt;
 |&lt;br /&gt;
 |-&lt;br /&gt;
 |05.06.2012&lt;br /&gt;
 |[http://www.arexx.com/rp6/downloads/RobotLoader_20120605.zip 2.3a]&lt;br /&gt;
 |Testversion! Siehe auch [http://www.roboternetz.de/community/threads/58168-RobotLoader-2-3a hier]!&lt;br /&gt;
 |&lt;br /&gt;
 |-&lt;br /&gt;
 |18.06.2012&lt;br /&gt;
 |[http://www.arexx.com/rp6/downloads/RobotLoader_20120618.zip 2.3b]&lt;br /&gt;
 |Testversion! Siehe auch [http://www.roboternetz.de/community/threads/58168-RobotLoader-2-3a hier]!&lt;br /&gt;
 |&lt;br /&gt;
 |-&lt;br /&gt;
 |17.07.2012&lt;br /&gt;
 |[http://www.arexx.com/rp6/downloads/RobotLoader_20120717.zip 2.3c]&lt;br /&gt;
 |Über Kommandozeile nutzbar, siehe auch [http://www.roboternetz.de/community/threads/58168-RobotLoader-2-3a hier]!&lt;br /&gt;
 |ab 16.07.2012&lt;br /&gt;
 |-&lt;br /&gt;
 |24.09.2012&lt;br /&gt;
 |[http://www.arexx.com/rp6/downloads/RobotLoader_20120924.zip 2.4a]&lt;br /&gt;
 |Mit WLAN Firmware v. 2.32, siehe auch [http://www.roboternetz.de/community/threads/59336-RobotLoader-2-4a hier]!&lt;br /&gt;
 |&lt;br /&gt;
 |-&lt;br /&gt;
 |10.04.2013&lt;br /&gt;
 |[http://www.arexx.com/rp6/downloads/RobotLoader_20130410.zip 2.5a]&lt;br /&gt;
 |Mit WLAN Firmware v. 2.36, siehe auch [http://www.roboternetz.de/community/threads/61977-M256-WIFI-Manchmal-nicht-ansprechbar?p=578766&amp;amp;viewfull=1#post578766 hier]!&lt;br /&gt;
 |&lt;br /&gt;
 |-&lt;br /&gt;
|}&lt;br /&gt;
'''Hinweise:'''&lt;br /&gt;
* Ältere Versionen des RP6Loaders bis Version 1.4 findet ihr [[RP6_-_Programmierung#RP6Loader|hier]].&lt;br /&gt;
* Von JM3 Engineering wurde auch ein eigenes Programm [[RP6_Sensor_Board_und_Xtra_Module#Robot-Tool|&amp;quot;'''JM3 Robot-Tool'''&amp;quot;]] veröffentlicht, das im RP6-System (RP6(v2) Base, CONTROL M32, M256 WiFi) anstelle des RobotLoaders verwendet werden kann.&lt;br /&gt;
&lt;br /&gt;
====Projekte====&lt;br /&gt;
* Der RobotLoader 2.3a und [http://www.rn-wissen.de/index.php/LunaAVR LunaAVR] im [http://www.roboternetz.de/community/threads/58168-RobotLoader-2-3a?p=551535&amp;amp;viewfull=1#post551535 Roboternetz RP6 Forum] und im [http://forum.myluna.de/viewtopic.php?f=3&amp;amp;t=24#p94 LunaAVR Forum]&lt;br /&gt;
&lt;br /&gt;
===RP6v2===&lt;br /&gt;
'''Der RP6v2 ([http://www.conrad.de/ce/de/product/191584/RP6-V2-ROBOTERSYSTEM/ 191584]) ist softwarekompatibel zum RP6.'''&lt;br /&gt;
&lt;br /&gt;
Zur Programmierung des [[RP6]] und des RP6v2 gibt es einen eigenen Artikel: [[RP6 - Programmierung]]&lt;br /&gt;
&lt;br /&gt;
===RP6v2 M256 WiFi Platine===&lt;br /&gt;
&lt;br /&gt;
====Dokumentation====&lt;br /&gt;
Die Dokumentation (Anleitung der RP6v2 M256 WiFi und des WiFi-Moduls RN-171 WiFly) befindet sich [http://www.arexx.com/rp6/html/de/soft_doc_rp6m256.htm hier].&lt;br /&gt;
&lt;br /&gt;
=====Manuals=====&lt;br /&gt;
=====Schematics=====&lt;br /&gt;
=====Datasheets=====&lt;br /&gt;
&lt;br /&gt;
====Demo-Programmme====&lt;br /&gt;
Die RP6v2 M256 WiFi Demo Programme sind [http://www.arexx.com/rp6/html/de/soft_doc_rp6m256.htm hier] zu finden.&lt;br /&gt;
&lt;br /&gt;
=====Bug-Report=====&lt;br /&gt;
In [http://www.roboternetz.de/community/threads/64362-Programmstart-mit-Hindernissen diesem Thread] des Roboternetz-Forums geht es um eine Fehlfunktion der Programme ''Example_09_Move'' und ''Example_10_Move2'' für die RP6v2 M256 WiFi. Diese Demos werden nicht korrekt ausgeführt, wenn sie über WLAN gestartet werden. Sie funktionieren jedoch normal, wenn sie mit dem START/STOP-Button der RP6v2 Base gestartet werden.&lt;br /&gt;
&lt;br /&gt;
Dieses Fehlverhalten der beiden Demos (aus [http://www.arexx.com/rp6/downloads/RP6Examples_20120725f.zip Version 1.8 der RP6 Examples vom 25.07.2012]) kann durch Einfügen der Zeilen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	I2CTWI_transmitByte(0, 0);&lt;br /&gt;
	mSleep(200);&lt;br /&gt;
	I2CTWI_transmitByte(0, 0);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
... in ''Example_09_Move'' ab Zeile 129 und in ''Example_10_Move2'' ab Zeile 699 abgestellt werden.&lt;br /&gt;
&lt;br /&gt;
====Library====&lt;br /&gt;
Die Library für die RP6v2 M256 WiFi besteht aus folgenden 21 Dateien:&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |Library&lt;br /&gt;
 |Datei&lt;br /&gt;
 |Funktion&lt;br /&gt;
 |-&lt;br /&gt;
 |RP6M256&lt;br /&gt;
 |RP6M256.h&lt;br /&gt;
 |RP6M256 Hardware-Konfiguration&lt;br /&gt;
 |-&lt;br /&gt;
 |RP6M256&lt;br /&gt;
 |RP6M256Lib.h&lt;br /&gt;
 |RP6M256 Library Header&lt;br /&gt;
 |-&lt;br /&gt;
 |RP6M256&lt;br /&gt;
 |RP6M256Lib.c&lt;br /&gt;
 |RP6M256 Library&lt;br /&gt;
 |-&lt;br /&gt;
 |RP6M256uart&lt;br /&gt;
 |RP6M256uart.h&lt;br /&gt;
 |RS232 Funktionen Header&lt;br /&gt;
 |-&lt;br /&gt;
 |RP6M256uart&lt;br /&gt;
 |RP6M256uart.c&lt;br /&gt;
 |RS232 Funktionen&lt;br /&gt;
 |-&lt;br /&gt;
 |RP6M256_I2CMaster&lt;br /&gt;
 |RP6M256_I2CMasterLib.h&lt;br /&gt;
 |I2C Master Library Header&lt;br /&gt;
 |-&lt;br /&gt;
 |RP6M256_I2CMaster&lt;br /&gt;
 |RP6M256_I2CMasterLib.c&lt;br /&gt;
 |I2C Master Library&lt;br /&gt;
 |-&lt;br /&gt;
 |RP6M256_WIFI&lt;br /&gt;
 |RP6M256_WIFIlib.h&lt;br /&gt;
 |WIFI Library Header&lt;br /&gt;
 |-&lt;br /&gt;
 |RP6M256_WIFI&lt;br /&gt;
 |RP6M256_WIFIlib.c&lt;br /&gt;
 |WIFI Library&lt;br /&gt;
 |-&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |-&lt;br /&gt;
 |SDC&lt;br /&gt;
 |byteordering.h&lt;br /&gt;
 |Byte-order handling header&lt;br /&gt;
 |-&lt;br /&gt;
 |SDC&lt;br /&gt;
 |byteordering.c&lt;br /&gt;
 |Byte-order handling implementation&lt;br /&gt;
 |-&lt;br /&gt;
 |SDC&lt;br /&gt;
 |fat_config.h&lt;br /&gt;
 |FAT configuration&lt;br /&gt;
 |-&lt;br /&gt;
 |SDC&lt;br /&gt;
 |fat.h&lt;br /&gt;
 |FAT header&lt;br /&gt;
 |-&lt;br /&gt;
 |SDC&lt;br /&gt;
 |fat.c&lt;br /&gt;
 |FAT implementation&lt;br /&gt;
 |-&lt;br /&gt;
 |SDC&lt;br /&gt;
 |partition_config.h&lt;br /&gt;
 |Partition configuration&lt;br /&gt;
 |-&lt;br /&gt;
 |SDC&lt;br /&gt;
 |partition.h&lt;br /&gt;
 |Partition table header&lt;br /&gt;
 |-&lt;br /&gt;
 |SDC&lt;br /&gt;
 |partition.c&lt;br /&gt;
 |Partition table implementation&lt;br /&gt;
 |-&lt;br /&gt;
 |SDC&lt;br /&gt;
 |sd-reader_config.h&lt;br /&gt;
 |Common sd-reader configuration (all modules)&lt;br /&gt;
 |-&lt;br /&gt;
 |SDC&lt;br /&gt;
 |sd_raw_config.h&lt;br /&gt;
 |MMC/SD support configuration&lt;br /&gt;
 |-&lt;br /&gt;
 |SDC&lt;br /&gt;
 |sd_raw.h&lt;br /&gt;
 |MMC/SD/SDHC raw access header&lt;br /&gt;
 |-&lt;br /&gt;
 |SDC&lt;br /&gt;
 |sd_raw.c&lt;br /&gt;
 |MMC/SD/SDHC raw access implementation&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=====Versionen=====&lt;br /&gt;
Hier eine Tabelle der (mir) bekannten Library Versionen der RP6v2 M256 WiFi:&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |ZIP-Datum&lt;br /&gt;
 |VERSION_&lt;br /&gt;
 |RP6M256Library&lt;br /&gt;
 |RP6LIB_VERSION&lt;br /&gt;
 |RP6M256.h&lt;br /&gt;
 |RP6M256Lib&lt;br /&gt;
 |WifiLib&lt;br /&gt;
 |UartLib&lt;br /&gt;
 |I2CMasterLib&lt;br /&gt;
 |SDCLib **&lt;br /&gt;
 |-&lt;br /&gt;
 |24.02.2012&lt;br /&gt;
 |1.7&lt;br /&gt;
 |1.0_24.02.12&lt;br /&gt;
 |16&lt;br /&gt;
 |1.0_24.02.12&lt;br /&gt;
 |1.0_24.02.12&lt;br /&gt;
 |1.0_24.02.12&lt;br /&gt;
 |1.0_24.02.12&lt;br /&gt;
 |(1.0_24.02.12)&lt;br /&gt;
 |?&lt;br /&gt;
 |-&lt;br /&gt;
 |16.07.2012&lt;br /&gt;
 |[http://www.arexx.com/rp6/downloads/RP6Examples_20120716.zip 1.7] *&lt;br /&gt;
 |1.1_16.07.12&lt;br /&gt;
 |16&lt;br /&gt;
 |1.1_16.07.12&lt;br /&gt;
 |1.1_16.07.12&lt;br /&gt;
 |1.1_16.07.12&lt;br /&gt;
 |1.1_16.07.12&lt;br /&gt;
 |(1.0_24.02.12)&lt;br /&gt;
 |(2006-2011)&lt;br /&gt;
 |-&lt;br /&gt;
 |25.07.2012&lt;br /&gt;
 |[http://www.arexx.com/rp6/downloads/RP6Examples_20120725.zip 1.8]&lt;br /&gt;
 |1.1_16.07.12&lt;br /&gt;
 |16&lt;br /&gt;
 |1.1_16.07.12&lt;br /&gt;
 |1.1_16.07.12&lt;br /&gt;
 |1.1_16.07.12&lt;br /&gt;
 |1.1_16.07.12&lt;br /&gt;
 |(1.0_24.02.12)&lt;br /&gt;
 |(2006-2011)&lt;br /&gt;
 |-&lt;br /&gt;
 |25.07.2012 ²&lt;br /&gt;
 |[http://www.arexx.com/rp6/downloads/RP6Examples_20120725f.zip 1.8]&lt;br /&gt;
 |1.1_16.07.12&lt;br /&gt;
 |16&lt;br /&gt;
 |1.1_16.07.12&lt;br /&gt;
 |1.1_16.07.12&lt;br /&gt;
 |1.1_16.07.12&lt;br /&gt;
 |1.1_16.07.12&lt;br /&gt;
 |(1.0_24.02.12)&lt;br /&gt;
 |(2006-2011)&lt;br /&gt;
|}&lt;br /&gt;
'''Zu *:''' Ab der Version 1.7 sind auch die Libraries und Examples der RP6v2 Base und CONTROL M32 enthalten! Ältere Versionen dieser Libraries und Examples bis Version 1.5 findet ihr [[RP6_-_Programmierung#Versionen|hier]]!&lt;br /&gt;
&lt;br /&gt;
'''Zu **:''' Die SDC Library ist eine Open Source Bibliothek für den Zugriff auf SD-Karten. Sie steht unter der GNU General Public License version 2. Geschrieben wurde sie von Roland Riegel; sein [http://www.roland-riegel.de/sd-reader/index.html Projekt] könnt ihr im Internet verfolgen. Eventuelle Updates werden dort auch veröffentlicht.&lt;br /&gt;
Die Projektseiten sind auch im Verzeichnis ...\RP6Lib\RP6control_M256_WIFI\sdc\doc\html\ der RP6Examples zu finden. Ihr könnt in dem Verzeichnis die Datei &amp;quot;index.html&amp;quot; starten, um sie anzuzeigen.&lt;br /&gt;
&lt;br /&gt;
'''Zu ²:''' Die Datei heißt RP6Examples_20120725'''f'''.zip. Mir ist nicht bekannt, ob ein Unterschied zur RP6Examples_20120725.zip besteht.&lt;br /&gt;
&lt;br /&gt;
In der 1. Spalte findet ihr das Datum der RP6Examples.zip Datei, in der die Library enthalten ist. Die 2. Spalte nennt die Version, die im Dateinamen der VERSION_x.x.txt Datei als x.x vorkommt. In der 3. Spalte steht die Versionsangabe der RP6M256Library laut Angabe in der VERSION_x.x.txt Datei.&lt;br /&gt;
&lt;br /&gt;
In der 4. Spalte gebe ich den Wert der Konstante RP6LIB_VERSION an. Es gibt sie ab den RP6v2 Base und CONTROL M32 Examples vom 16.10.2007. In den Spalten 5 bis 10 führe ich nacheinander die Versionsnummern und ggf. das in der Datei genannte Datum der Header-Datei/Library an: RP6M256.h, RP6M256Lib, WifiLib, UartLib, I2CMasterLib, SDCLib.&lt;br /&gt;
&lt;br /&gt;
=====RP6M256=====&lt;br /&gt;
======Bug-Report======&lt;br /&gt;
======Konfiguration======&lt;br /&gt;
======Port-Verwendung======&lt;br /&gt;
Die Verwendung der Ports des RP6v2 M256 WiFi Microcontrollers wird festgelegt in der Header-Datei &amp;quot;RP6M256.h&amp;quot;. In dieser Datei wird auch noch Folgendes aufgeführt:&lt;br /&gt;
* Quarzfrequenz (F_CPU) &lt;br /&gt;
* True/false Definition &lt;br /&gt;
* Verschiedene Macros &lt;br /&gt;
* Baudraten und Baudraten-Tabelle &lt;br /&gt;
&lt;br /&gt;
Hier eine Tabelle mit den Port-Definitionen für die RP6v2 M256 WiFi:&lt;br /&gt;
 Erklärung der Spalten:&lt;br /&gt;
 Port        -&amp;gt; Atmel Portpin Bezeichnung&lt;br /&gt;
 Name        -&amp;gt; Atmel Funktionsbezeichnung&lt;br /&gt;
 In/Out      -&amp;gt; Eingang (In) oder Ausgang (Out)&lt;br /&gt;
 Pullup      -&amp;gt; Falls Eingang: Pullup ein- (1) oder ausgeschaltet (0)&lt;br /&gt;
 Wert        -&amp;gt; Falls Ausgang: Logikpegel high (1) oder low (0)&lt;br /&gt;
 Funktion    -&amp;gt; Schnittstellenfunktion&lt;br /&gt;
 Bezeichnung -&amp;gt; Portpin Bezeichnung der Library&lt;br /&gt;
 Stecker     -&amp;gt; Portpin verfügbar an STECKER: Pin&lt;br /&gt;
 Anmerkungen -&amp;gt; Kommentare (ADC_xx: ADC-Kanal Bezeichnung)&lt;br /&gt;
&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |Port&lt;br /&gt;
 |Name&lt;br /&gt;
 |In/Out&lt;br /&gt;
 |Pullup&lt;br /&gt;
 |Wert&lt;br /&gt;
 |Funktion&lt;br /&gt;
 |Bezeichnung&lt;br /&gt;
 |Stecker&lt;br /&gt;
 |Anmerkungen&lt;br /&gt;
 |-&lt;br /&gt;
 |PA0&lt;br /&gt;
 |AD0&lt;br /&gt;
 |Out&lt;br /&gt;
 |&lt;br /&gt;
 |0&lt;br /&gt;
 |&lt;br /&gt;
 |DISP_D0&lt;br /&gt;
 |DISPIO: 7&lt;br /&gt;
 |Display D0&lt;br /&gt;
 |-&lt;br /&gt;
 |PA1&lt;br /&gt;
 |AD1&lt;br /&gt;
 |Out&lt;br /&gt;
 |&lt;br /&gt;
 |0&lt;br /&gt;
 |&lt;br /&gt;
 |DISP_D1&lt;br /&gt;
 |DISPIO: 8&lt;br /&gt;
 |Display D1 &lt;br /&gt;
 |-&lt;br /&gt;
 |PA2&lt;br /&gt;
 |AD2&lt;br /&gt;
 |Out&lt;br /&gt;
 |&lt;br /&gt;
 |0&lt;br /&gt;
 |&lt;br /&gt;
 |DISP_D2&lt;br /&gt;
 |DISPIO: 9&lt;br /&gt;
 |Display D2 &lt;br /&gt;
 |-&lt;br /&gt;
 |PA3&lt;br /&gt;
 |AD3&lt;br /&gt;
 |Out&lt;br /&gt;
 |&lt;br /&gt;
 |0&lt;br /&gt;
 |&lt;br /&gt;
 |DISP_D3&lt;br /&gt;
 |DISPIO: 10&lt;br /&gt;
 |Display D3&lt;br /&gt;
 |-&lt;br /&gt;
 |PA4&lt;br /&gt;
 |AD4&lt;br /&gt;
 |Out&lt;br /&gt;
 |&lt;br /&gt;
 |0&lt;br /&gt;
 |&lt;br /&gt;
 |DISP_D4&lt;br /&gt;
 |DISPIO: 11&lt;br /&gt;
 |Display D4&lt;br /&gt;
 |-&lt;br /&gt;
 |PA5&lt;br /&gt;
 |AD5&lt;br /&gt;
 |Out&lt;br /&gt;
 |&lt;br /&gt;
 |0&lt;br /&gt;
 |&lt;br /&gt;
 |DISP_D5&lt;br /&gt;
 |DISPIO: 12&lt;br /&gt;
 |Display D5&lt;br /&gt;
 |-&lt;br /&gt;
 |PA6&lt;br /&gt;
 |AD6&lt;br /&gt;
 |Out&lt;br /&gt;
 |&lt;br /&gt;
 |0&lt;br /&gt;
 |&lt;br /&gt;
 |DISP_D6&lt;br /&gt;
 |DISPIO: 13&lt;br /&gt;
 |Display D6&lt;br /&gt;
 |-&lt;br /&gt;
 |PA7&lt;br /&gt;
 |AD7&lt;br /&gt;
 |Out&lt;br /&gt;
 |&lt;br /&gt;
 |0&lt;br /&gt;
 |&lt;br /&gt;
 |DISP_D7&lt;br /&gt;
 |DISPIO: 14&lt;br /&gt;
 |Display D7&lt;br /&gt;
 |-&lt;br /&gt;
 |PB0&lt;br /&gt;
 |SS/PCI0&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |SPI_SS *&lt;br /&gt;
 |&lt;br /&gt;
 |SDC Output DAT3 / CS&lt;br /&gt;
 |-&lt;br /&gt;
 |PB1&lt;br /&gt;
 |SCK/PCI1&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |ISP&lt;br /&gt;
 |SPI_SCK *&lt;br /&gt;
 |ISP: 3&lt;br /&gt;
 |SDC Output CLK&lt;br /&gt;
 |-&lt;br /&gt;
 |PB2&lt;br /&gt;
 |MOSI/PCI2&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |ISP&lt;br /&gt;
 |SPI_MOSI *&lt;br /&gt;
 |ISP: 4&lt;br /&gt;
 |SDC Output CMD / DI&lt;br /&gt;
 |-&lt;br /&gt;
 |PB3&lt;br /&gt;
 |MISO/PCI3&lt;br /&gt;
 |In&lt;br /&gt;
 |0&lt;br /&gt;
 |&lt;br /&gt;
 |ISP&lt;br /&gt;
 |SPI_MISO ***&lt;br /&gt;
 |ISP: 1&lt;br /&gt;
 |SDC Input DAT0 / DO&lt;br /&gt;
 |-&lt;br /&gt;
 |PB4&lt;br /&gt;
 |OC2A/PCI4&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |OC2A_PI4&lt;br /&gt;
 |PWM23: 5&lt;br /&gt;
 |frei&lt;br /&gt;
 |-&lt;br /&gt;
 |PB5&lt;br /&gt;
 |OC1A/PCI5&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |OC1A_PI5&lt;br /&gt;
 |PWM01: 7&lt;br /&gt;
 |frei&lt;br /&gt;
 |-&lt;br /&gt;
 |PB6&lt;br /&gt;
 |OC1B/PCI6&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |OC1B_PI6&lt;br /&gt;
 |PWM01: 9&lt;br /&gt;
 |frei&lt;br /&gt;
 |-&lt;br /&gt;
 |PB7&lt;br /&gt;
 |OC0A/OC1C/PCI7&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |OC0A_OCM_PI7&lt;br /&gt;
 |PWM01: 4&lt;br /&gt;
 |frei&lt;br /&gt;
 |-&lt;br /&gt;
 |PC0&lt;br /&gt;
 |A8&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_PC0&lt;br /&gt;
 |PC01: 2&lt;br /&gt;
 |XMEM A8, frei&lt;br /&gt;
 |-&lt;br /&gt;
 |PC1&lt;br /&gt;
 |A9&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_PC1&lt;br /&gt;
 |PC01: 1&lt;br /&gt;
 |XMEM A9, frei&lt;br /&gt;
 |-&lt;br /&gt;
 |PC2&lt;br /&gt;
 |A10&lt;br /&gt;
 |Out&lt;br /&gt;
 |&lt;br /&gt;
 |0&lt;br /&gt;
 |&lt;br /&gt;
 |SLED1&lt;br /&gt;
 |&lt;br /&gt;
 |Status LED SL1&lt;br /&gt;
 |-&lt;br /&gt;
 |PC3&lt;br /&gt;
 |A11&lt;br /&gt;
 |Out&lt;br /&gt;
 |&lt;br /&gt;
 |0&lt;br /&gt;
 |&lt;br /&gt;
 |SLED2&lt;br /&gt;
 |&lt;br /&gt;
 |Status LED SL2&lt;br /&gt;
 |-&lt;br /&gt;
 |PC4&lt;br /&gt;
 |A12&lt;br /&gt;
 |Out&lt;br /&gt;
 |&lt;br /&gt;
 |0&lt;br /&gt;
 |&lt;br /&gt;
 |SLED3&lt;br /&gt;
 |&lt;br /&gt;
 |Status LED SL3&lt;br /&gt;
 |-&lt;br /&gt;
 |PC5&lt;br /&gt;
 |A13&lt;br /&gt;
 |Out&lt;br /&gt;
 |&lt;br /&gt;
 |0&lt;br /&gt;
 |&lt;br /&gt;
 |SLED4&lt;br /&gt;
 |&lt;br /&gt;
 |Status LED SL4&lt;br /&gt;
 |-&lt;br /&gt;
 |PC6&lt;br /&gt;
 |A14&lt;br /&gt;
 |Out&lt;br /&gt;
 |&lt;br /&gt;
 |0&lt;br /&gt;
 |&lt;br /&gt;
 |WLAN_GPIO14_OUT *&lt;br /&gt;
 |&lt;br /&gt;
 |WLAN Output GPIO14&lt;br /&gt;
 |-&lt;br /&gt;
 |PC7&lt;br /&gt;
 |A15&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |WLAN_GPIO8_IN **&lt;br /&gt;
 |&lt;br /&gt;
 |WLAN Input GPIO8&lt;br /&gt;
 |-&lt;br /&gt;
 |PD0&lt;br /&gt;
 |SCL/INT0&lt;br /&gt;
 |In ²&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |I2C-Bus&lt;br /&gt;
 |SCL&lt;br /&gt;
 |XBUS: 10&lt;br /&gt;
 |XBUS SCL&lt;br /&gt;
 |-&lt;br /&gt;
 |PD1&lt;br /&gt;
 |SDA/INT1&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |I2C-Bus&lt;br /&gt;
 |SDA&lt;br /&gt;
 |XBUS: 12&lt;br /&gt;
 |XBUS SDA&lt;br /&gt;
 |-&lt;br /&gt;
 |PD2&lt;br /&gt;
 |RXD1/INT2&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |UART1&lt;br /&gt;
 |RXD1&lt;br /&gt;
 |USPI15: 8&lt;br /&gt;
 |USART1 RX, frei&lt;br /&gt;
 |-&lt;br /&gt;
 |PD3&lt;br /&gt;
 |TXD1/INT3&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |UART1&lt;br /&gt;
 |TXD1&lt;br /&gt;
 |USPI15: 6&lt;br /&gt;
 |USART1 TX, frei&lt;br /&gt;
 |-&lt;br /&gt;
 |PD4&lt;br /&gt;
 |ICP1&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_PD4_ICP1&lt;br /&gt;
 |PWM01: 1&lt;br /&gt;
 |frei&lt;br /&gt;
 |-&lt;br /&gt;
 |PD5&lt;br /&gt;
 |XCK1&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_PD5_XCK1&lt;br /&gt;
 |USPI15: 4&lt;br /&gt;
 |frei&lt;br /&gt;
 |-&lt;br /&gt;
 |PD6&lt;br /&gt;
 |T1&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_PD6_T1&lt;br /&gt;
 |PWM01: 3&lt;br /&gt;
 |frei&lt;br /&gt;
 |-&lt;br /&gt;
 |PD7&lt;br /&gt;
 |T0&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_PD7_T2&lt;br /&gt;
 |PWM01: 6&lt;br /&gt;
 |frei&lt;br /&gt;
 |-&lt;br /&gt;
 |PE0&lt;br /&gt;
 |RXD0/PCI8&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |UART0&lt;br /&gt;
 |RXD0&lt;br /&gt;
 |PROGU: 2&lt;br /&gt;
 |USART RX&lt;br /&gt;
 |-&lt;br /&gt;
 |PE1&lt;br /&gt;
 |TXD0&lt;br /&gt;
 |Out&lt;br /&gt;
 |&lt;br /&gt;
 |0&lt;br /&gt;
 |UART0&lt;br /&gt;
 |TXD0&lt;br /&gt;
 |PROGU: 3&lt;br /&gt;
 |USART TX&lt;br /&gt;
 |-&lt;br /&gt;
 |PE2&lt;br /&gt;
 |XCK0/AIN0&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_PE2_XCK0_AIN0&lt;br /&gt;
 |ADCIO2: 8&lt;br /&gt;
 |frei&lt;br /&gt;
 |-&lt;br /&gt;
 |PE3&lt;br /&gt;
 |OC3A/AIN1&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_PE3_OC3A_AIN1&lt;br /&gt;
 |ADCIO2: 4&lt;br /&gt;
 |frei&lt;br /&gt;
 |-&lt;br /&gt;
 |PE4&lt;br /&gt;
 |OC3B/INT4&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_PE4_OC3B_I4&lt;br /&gt;
 |PWM23: 9&lt;br /&gt;
 |frei&lt;br /&gt;
 |-&lt;br /&gt;
 |PE5&lt;br /&gt;
 |OC3C/INT5&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_PE5_OC3C_I5&lt;br /&gt;
 |PWM23: 4&lt;br /&gt;
 |frei&lt;br /&gt;
 |-&lt;br /&gt;
 |PE6&lt;br /&gt;
 |T3/INT6&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_PE6_T3_I6&lt;br /&gt;
 |PWM23: 3&lt;br /&gt;
 |frei&lt;br /&gt;
 |-&lt;br /&gt;
 |PE7&lt;br /&gt;
 |CLKO/ICP3/INT7&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_PE7_ICP3_I7&lt;br /&gt;
 |PWM23: 1&lt;br /&gt;
 |frei&lt;br /&gt;
 |-&lt;br /&gt;
 |PF0&lt;br /&gt;
 |ADC0&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_ADC0&lt;br /&gt;
 |ADCIO1: 3&lt;br /&gt;
 |ADC_0 (frei)&lt;br /&gt;
 |-&lt;br /&gt;
 |PF1&lt;br /&gt;
 |ADC1&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_ADC1&lt;br /&gt;
 |ADCIO1: 1&lt;br /&gt;
 |ADC_1 (frei)&lt;br /&gt;
 |-&lt;br /&gt;
 |PF2&lt;br /&gt;
 |ADC2&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_ADC2&lt;br /&gt;
 |ADCIO1: 5&lt;br /&gt;
 |ADC_2 (frei)&lt;br /&gt;
 |-&lt;br /&gt;
 |PF3&lt;br /&gt;
 |ADC3&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_ADC3&lt;br /&gt;
 |ADCIO1: 7&lt;br /&gt;
 |ADC_3 (frei)&lt;br /&gt;
 |-&lt;br /&gt;
 |PF4&lt;br /&gt;
 |ADC4/TCK&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |JTAG&lt;br /&gt;
 |IO_ADC4&lt;br /&gt;
 |ADCIO1: 9&lt;br /&gt;
 |ADC_4 (frei)&lt;br /&gt;
 |-&lt;br /&gt;
 |PF5&lt;br /&gt;
 |ADC5/TMS&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |JTAG&lt;br /&gt;
 |IO_ADC5&lt;br /&gt;
 |ADCIO1: 11&lt;br /&gt;
 |ADC_5 (frei)&lt;br /&gt;
 |-&lt;br /&gt;
 |PF6&lt;br /&gt;
 |ADC6/TDO&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |JTAG&lt;br /&gt;
 |IO_ADC6&lt;br /&gt;
 |ADCIO1: 12&lt;br /&gt;
 |ADC_6 (frei)&lt;br /&gt;
 |-&lt;br /&gt;
 |PF7&lt;br /&gt;
 |ADC7/TDI&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |JTAG&lt;br /&gt;
 |IO_ADC7&lt;br /&gt;
 |ADCIO1: 13&lt;br /&gt;
 |ADC_7 (frei)&lt;br /&gt;
 |-&lt;br /&gt;
 |PG0&lt;br /&gt;
 |WR&lt;br /&gt;
 |Out&lt;br /&gt;
 |&lt;br /&gt;
 |0&lt;br /&gt;
 |&lt;br /&gt;
 |DISP_WR&lt;br /&gt;
 |DISPIO: 5&lt;br /&gt;
 |Display WR&lt;br /&gt;
 |-&lt;br /&gt;
 |PG1&lt;br /&gt;
 |RD&lt;br /&gt;
 |Out&lt;br /&gt;
 |&lt;br /&gt;
 |0&lt;br /&gt;
 |&lt;br /&gt;
 |DISP_EN_RD&lt;br /&gt;
 |DISPIO: 6&lt;br /&gt;
 |Display RD&lt;br /&gt;
 |-&lt;br /&gt;
 |PG2&lt;br /&gt;
 |ALE&lt;br /&gt;
 |Out&lt;br /&gt;
 |&lt;br /&gt;
 |0&lt;br /&gt;
 |&lt;br /&gt;
 |DISP_RS_ALE&lt;br /&gt;
 |DISPIO: 4&lt;br /&gt;
 |Display ALE&lt;br /&gt;
 |-&lt;br /&gt;
 |PG3&lt;br /&gt;
 |TOSC2&lt;br /&gt;
 |In&lt;br /&gt;
 |1 &amp;quot;&amp;quot;&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |BUTTON_SW2&lt;br /&gt;
 |&lt;br /&gt;
 |Taster SW2&lt;br /&gt;
 |-&lt;br /&gt;
 |PG4&lt;br /&gt;
 |TOSC1&lt;br /&gt;
 |In&lt;br /&gt;
 |1 &amp;quot;&amp;quot;&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |BUTTON_SW1&lt;br /&gt;
 |&lt;br /&gt;
 |Taster SW1&lt;br /&gt;
 |-&lt;br /&gt;
 |PG5&lt;br /&gt;
 |OC0B&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_OC0B&lt;br /&gt;
 |PWM01: 5&lt;br /&gt;
 |frei&lt;br /&gt;
 |-&lt;br /&gt;
 |PH0&lt;br /&gt;
 |RXD2&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |UART2&lt;br /&gt;
 |RXD2&lt;br /&gt;
 |USPI24: 8&lt;br /&gt;
 |USART2 RX, frei&lt;br /&gt;
 |-&lt;br /&gt;
 |PH1&lt;br /&gt;
 |TXD2&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |UART2&lt;br /&gt;
 |TXD2&lt;br /&gt;
 |USPI24: 6&lt;br /&gt;
 |USART2 TX, frei&lt;br /&gt;
 |-&lt;br /&gt;
 |PH2&lt;br /&gt;
 |XCK2&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_PH2_XCK2&lt;br /&gt;
 |USPI24: 4&lt;br /&gt;
 |frei&lt;br /&gt;
 |-&lt;br /&gt;
 |PH3&lt;br /&gt;
 |OC4A&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_PH3_OC4A&lt;br /&gt;
 |USPI24: 9&lt;br /&gt;
 |frei&lt;br /&gt;
 |-&lt;br /&gt;
 |PH4&lt;br /&gt;
 |OC4B&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_PH4_OC4B&lt;br /&gt;
 |USPI24: 7&lt;br /&gt;
 |frei&lt;br /&gt;
 |-&lt;br /&gt;
 |PH5&lt;br /&gt;
 |OC4C&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_PH5_OC4C&lt;br /&gt;
 |USPI24: 5&lt;br /&gt;
 |frei&lt;br /&gt;
 |-&lt;br /&gt;
 |PH6&lt;br /&gt;
 |OC2B&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_PH6_OC2B&lt;br /&gt;
 |PWM23: 7&lt;br /&gt;
 |frei&lt;br /&gt;
 |-&lt;br /&gt;
 |PH7&lt;br /&gt;
 |T4&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_PH7_T4&lt;br /&gt;
 |USPI24: 3&lt;br /&gt;
 |frei&lt;br /&gt;
 |-&lt;br /&gt;
 |PJ0&lt;br /&gt;
 |RXD3/PCI9&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |UART3&lt;br /&gt;
 |WLAN_RXD3 **&lt;br /&gt;
 |&lt;br /&gt;
 |WLAN USART RX&lt;br /&gt;
 |-&lt;br /&gt;
 |PJ1&lt;br /&gt;
 |TXD3/PCI10&lt;br /&gt;
 |Out&lt;br /&gt;
 |&lt;br /&gt;
 |0&lt;br /&gt;
 |UART3&lt;br /&gt;
 |WLAN_TXD3 *&lt;br /&gt;
 |&lt;br /&gt;
 |WLAN USART TX&lt;br /&gt;
 |-&lt;br /&gt;
 |PJ2&lt;br /&gt;
 |XCK3/PCI11&lt;br /&gt;
 |Out&lt;br /&gt;
 |&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |WLAN_RTS *&lt;br /&gt;
 |&lt;br /&gt;
 |WLAN Output RTS&lt;br /&gt;
 |-&lt;br /&gt;
 |PJ3&lt;br /&gt;
 |PCI12&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |INT1_PI12&lt;br /&gt;
 |XBUS: 8&lt;br /&gt;
 |XBUS INT1&lt;br /&gt;
 |-&lt;br /&gt;
 |PJ4&lt;br /&gt;
 |PCI13&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |INTU_PI13&lt;br /&gt;
 |XBUS: 7&lt;br /&gt;
 |XBUS INTU&lt;br /&gt;
 |-&lt;br /&gt;
 |PJ5&lt;br /&gt;
 |PCI14&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |INT3_PI14&lt;br /&gt;
 |XBUS: 9&lt;br /&gt;
 |XBUS INT3&lt;br /&gt;
 |-&lt;br /&gt;
 |PJ6&lt;br /&gt;
 |PCI15&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |INT2_PI15&lt;br /&gt;
 |XBUS: 11&lt;br /&gt;
 |XBUS INT2&lt;br /&gt;
 |-&lt;br /&gt;
 |PJ7&lt;br /&gt;
 |&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |WLAN_CTS **&lt;br /&gt;
 |&lt;br /&gt;
 |WLAN Input CTS&lt;br /&gt;
 |-&lt;br /&gt;
 |PK0&lt;br /&gt;
 |ADC8/PCI16&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_ADC8_PI16&lt;br /&gt;
 |ADCIO2: 1&lt;br /&gt;
 |ADC_8 (frei)&lt;br /&gt;
 |-&lt;br /&gt;
 |PK1&lt;br /&gt;
 |ADC9/PCI17&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_ADC9_PI17&lt;br /&gt;
 |ADCIO2: 3&lt;br /&gt;
 |ADC_9 (frei)&lt;br /&gt;
 |-&lt;br /&gt;
 |PK2&lt;br /&gt;
 |ADC10/PCI18&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_ADC10_PI18&lt;br /&gt;
 |ADCIO2: 5&lt;br /&gt;
 |ADC_10 (frei)&lt;br /&gt;
 |-&lt;br /&gt;
 |PK3&lt;br /&gt;
 |ADC11/PCI19&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_ADC11_PI19&lt;br /&gt;
 |ADCIO2: 7&lt;br /&gt;
 |ADC_11 (frei)&lt;br /&gt;
 |-&lt;br /&gt;
 |PK4&lt;br /&gt;
 |ADC12/PCI20&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_ADC12_PI20&lt;br /&gt;
 |ADCIO2: 9&lt;br /&gt;
 |ADC_12 (frei)&lt;br /&gt;
 |-&lt;br /&gt;
 |PK5&lt;br /&gt;
 |ADC13/PCI21&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_ADC13_PI21&lt;br /&gt;
 |PWM01: 8&lt;br /&gt;
 |ADC_13 (frei)&lt;br /&gt;
 |-&lt;br /&gt;
 |PK6&lt;br /&gt;
 |ADC14/PCI22&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_ADC14_PI22&lt;br /&gt;
 |PWM23: 8&lt;br /&gt;
 |ADC_14 (frei)&lt;br /&gt;
 |-&lt;br /&gt;
 |PK7&lt;br /&gt;
 |ADC15/PCI23&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_ADC15_PI23&lt;br /&gt;
 |PWM23: 6&lt;br /&gt;
 |ADC_15 (frei)&lt;br /&gt;
 |-&lt;br /&gt;
 |PL0&lt;br /&gt;
 |ICP4&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_PL0_ICP4&lt;br /&gt;
 |USPI24: 1&lt;br /&gt;
 |frei&lt;br /&gt;
 |-&lt;br /&gt;
 |PL1&lt;br /&gt;
 |ICP5&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_PL1_ICP5&lt;br /&gt;
 |USPI15: 1&lt;br /&gt;
 |frei&lt;br /&gt;
 |-&lt;br /&gt;
 |PL2&lt;br /&gt;
 |T5&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_PL2_T5&lt;br /&gt;
 |USPI15: 3&lt;br /&gt;
 |frei&lt;br /&gt;
 |-&lt;br /&gt;
 |PL3&lt;br /&gt;
 |OC5A&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_PL3_OC5A&lt;br /&gt;
 |USPI15: 5&lt;br /&gt;
 |frei&lt;br /&gt;
 |-&lt;br /&gt;
 |PL4&lt;br /&gt;
 |OC5B&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_PL4_OC5B&lt;br /&gt;
 |USPI15: 9&lt;br /&gt;
 |frei&lt;br /&gt;
 |-&lt;br /&gt;
 |PL5&lt;br /&gt;
 |OC5C&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_PL5_OC5C&lt;br /&gt;
 |USPI15: 7&lt;br /&gt;
 |frei&lt;br /&gt;
 |-&lt;br /&gt;
 |PL6&lt;br /&gt;
 |&lt;br /&gt;
 |Out&lt;br /&gt;
 |³&lt;br /&gt;
 |0&lt;br /&gt;
 |&lt;br /&gt;
 |WLAN_WAKE&lt;br /&gt;
 |&lt;br /&gt;
 |WLAN Output WAKE&lt;br /&gt;
 |-&lt;br /&gt;
 |PL7&lt;br /&gt;
 |&lt;br /&gt;
 |Out&lt;br /&gt;
 |²&lt;br /&gt;
 |0&lt;br /&gt;
 |&lt;br /&gt;
 |WLAN_RESET&lt;br /&gt;
 |&lt;br /&gt;
 |WLAN Output RESET&lt;br /&gt;
 |-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
 Zeichen:&lt;br /&gt;
 *    Verbunden mit einem Eingang des I2C-Pegelwandlers NC7WZ16&lt;br /&gt;
 **   Verbunden mit einem Ausgang des I2C-Pegelwandlers NC7WZ16&lt;br /&gt;
 ***  Verbunden mit einem Ausgang des I2C-Pegelwandlers NC7WZ16&lt;br /&gt;
      über Widerstand 680 Ohm (R7)&lt;br /&gt;
 &lt;br /&gt;
 ²    Verbunden mit Pulldown 10 kOhm (R22) und MOSFET Gate (Q2)&lt;br /&gt;
 ³    Verbunden mit Spannungsteiler 68 / 100 kOhm (R21 / R23)&lt;br /&gt;
 &amp;quot;&amp;quot;   Verbunden mit Pullup-Widerstand 68 kOhm (und Taster nach GND)&lt;br /&gt;
 &lt;br /&gt;
 Kürzel (Spalte Name):&lt;br /&gt;
 PCIx     PCINTx&lt;br /&gt;
 &lt;br /&gt;
 Abkürzungen der IO-Stecker (Spalte Stecker):&lt;br /&gt;
 PWM01    IO_PWM/T0/T1&lt;br /&gt;
 PWM23    IO_PWM/T2/T3&lt;br /&gt;
 USPI15   UART_SPI1/T5&lt;br /&gt;
 USPI24   UART_SPI2/T4&lt;br /&gt;
 ADCIO1   ADC_IO1&lt;br /&gt;
 ADCIO2   ADC_IO2/CMP&lt;br /&gt;
 DISPIO   DISPLAY/IO&lt;br /&gt;
 PC01     PC0/1&lt;br /&gt;
 PROGU    PROG_UART&lt;br /&gt;
&lt;br /&gt;
======Timer-Nutzung======&lt;br /&gt;
&lt;br /&gt;
=====RP6M256uart=====&lt;br /&gt;
=====RP6M256_I2CMaster=====&lt;br /&gt;
=====RP6M256_WIFI=====&lt;br /&gt;
=====SDC=====&lt;br /&gt;
&lt;br /&gt;
====Projekte====&lt;br /&gt;
* Library:&lt;br /&gt;
** [http://www.roboternetz.de/community/threads/58744-RP6-M256-WIFI-Clock-Library RP6 M256 WIFI: Clock Library]&lt;br /&gt;
** [http://www.roboternetz.de/community/threads/58848-RP6-M256-WIFI-DCF77-Library RP6 M256 WIFI: DCF77 Library]&lt;br /&gt;
** [http://www.roboternetz.de/community/threads/66003-Peter-Fleury-s-I2C-Master-Library-f%C3%BCr-RP6 Peter Fleury's I2C Master Library für RP6]&lt;br /&gt;
** [http://www.roboternetz.de/community/threads/66586-RP6v2-Base-CONTROL-M32-M256-WiFi-100%C2%B5s-Stopwatches-Library Library für acht 100µs Stopwatches]&lt;br /&gt;
* Fernbedienung mit dem Browser (Demo):&lt;br /&gt;
** [http://www.roboternetz.de/community/threads/58162-Diskussion-zum-RP6-M256-WIFI-Modul?p=555102&amp;amp;viewfull=1#post555102 LED-Ansteuerung mit dem Browser]&lt;br /&gt;
** [http://www.roboternetz.de/community/threads/58162-Diskussion-zum-RP6-M256-WIFI-Modul?p=555651&amp;amp;viewfull=1#post555651 LEDs setzen und Daten der Browseranforderung anzeigen]&lt;br /&gt;
* I2C-Master für RP6Control M32 und RP6v2 Base (Demos, Library):&lt;br /&gt;
** [http://www.rn-wissen.de/index.php/RP6Control_M32:_I2C-Slave RP6Control M32 I2C-Slave]&lt;br /&gt;
* MultiIO Projekt (Demos, Library):&lt;br /&gt;
** [[RP6 Multi IO Projekt - Software#RP6_M256_WIFI|RP6 Multi IO Projekt - Software RP6 M256 WIFI]]&lt;br /&gt;
* ArduIO Projekt (Demos, Library):&lt;br /&gt;
** [http://rn-wissen.de/wiki/index.php/RP6_ArduIO_-_Software ArduIO Projekt - Software]&lt;br /&gt;
* Fernbedienung mit einer Android App (Demo):&lt;br /&gt;
** [http://www.roboternetz.de/community/threads/65626-RP6-WIFI-und-Wireless-IMU-%28f%C3%BCr-Android%29 RP6 WIFI und Wireless IMU (für Android)]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===RP6 Sensor Board===&lt;br /&gt;
&lt;br /&gt;
'''Die Beschreibung zur Programmierung des RP6 Sensor Boards wurde ausgelagert in einen eigenen [[RP6_Sensor_Board_und_Xtra_Module#RP6_Sensor_Board_3|Artikel]]!'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Erfahrungsberichte==&lt;br /&gt;
&lt;br /&gt;
...in Arbeit...(kann aber gerne ergänzt werden)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Siehe auch==&lt;br /&gt;
* [[RP6]]&lt;br /&gt;
* [[RP6 - Programmierung]]&lt;br /&gt;
* [[RP6 Sensor Board und Xtra Module]]&lt;br /&gt;
* [[RP6 Kamera - Mitmach-Projekt]]&lt;br /&gt;
* [[RP6v2 I2C-Portexpander]]&lt;br /&gt;
* [[RP6v2 USB-RS232-Adapter]]&lt;br /&gt;
* [[RP6v2 Orientierung]]&lt;br /&gt;
* [[RP6 Multi IO Projekt]]&lt;br /&gt;
* [[RP6 Multi IO Projekt - Software]]&lt;br /&gt;
* [[RP6 ArduIO]]&lt;br /&gt;
* [[RP6 ArduIO - Software]]&lt;br /&gt;
* [[Induktive_Ladestation_f%C3%BCr_den_RP6|Induktive Ladestation für den RP6]]&lt;br /&gt;
* [[IR-bake_f%C3%BCr_den_RP6|IR-bake für den RP6]]&lt;br /&gt;
* [[CCRP5]]&lt;br /&gt;
* [[Wild Thumper]]&lt;br /&gt;
* [[Wild Thumper - Programmierung]]&lt;br /&gt;
* [[Yeti]]&lt;br /&gt;
* [[Asuro]]&lt;br /&gt;
* [[C't-Bot]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Weblinks==&lt;br /&gt;
'''Siehe auch die Weblinks im [http://www.rn-wissen.de/index.php/RP6#Weblinks RP6 Artikel]!'''&lt;br /&gt;
&lt;br /&gt;
* Ankündigung des RP6v2 im [http://www.roboternetz.de/community/threads/56964-NEWS-RP6v2-die-neue-Version-2-des-RP6-Robot-Systems RoboterNETZ] und im [http://www.arexx.com/forum/viewtopic.php?f=19&amp;amp;t=1778 AREXX Support Forum]&lt;br /&gt;
* Ankündigung der RP6v2 M256 WiFi und der Testaktion im [http://www.arexx.com/forum/viewtopic.php?f=19&amp;amp;t=1797 AREXX Support Forum]&lt;br /&gt;
* Beginn der &amp;quot;Testaktion: Kostenlose RP6v2-M256-WIFI Module!&amp;quot; im [http://www.roboternetz.de/community/threads/58161-Kostenlose-RP6-M256-WIFI-Module-für-Testanwender! Roboternetz RP6 Forum]&lt;br /&gt;
* Ende der &amp;quot;Testaktion: Kostenlose RP6v2-M256-WIFI Module!&amp;quot; nach Abstimmung im [http://www.roboternetz.de/community/threads/58389-Wählt-Gewinner-der-RP6v2-M256-WIFI-Module Roboternetz RP6 Forum]&lt;br /&gt;
* Newsartikel zur RP6v2 M256 WiFi im [http://www.roboternetz.de/community/threads/58160-Funk-Erweiterungsmodul-für-den-RP6-und-RP6v2-Gratis-für-Tester! RoboterNETZ]&lt;br /&gt;
* Diskussions-Thread zur RP6v2 M256 WiFi im [http://www.roboternetz.de/community/threads/58162-Diskussion-zum-RP6-M256-WIFI-Modul Roboternetz RP6 Forum]&lt;br /&gt;
* Diskussions-Thread zur RP6v2 M256 WiFi [http://www.roboternetz.de/community/threads/59739-Probleme-mit-M256-WIFI-1-2 mit &amp;quot;altem&amp;quot; Bootloader V1.2]&lt;br /&gt;
&lt;br /&gt;
* [http://www.arexx.com/rp6/downloads/RP6M256_WIFI_BOOTLOADER.zip RP6M256_WIFI_BOOTLOADER]&lt;br /&gt;
* [http://arexx.com/rp6/downloads/RP6M256_baudrate_test.zip RP6v2 M256 WiFi Baudraten Test]&lt;br /&gt;
* [http://www.arexx.com/rp6/downloads/rp6m256_wlan_config_de.txt RP6v2 M256 WiFi Liste mit möglichen Problemlösungen]&lt;br /&gt;
* Kleinserie: [http://www.roboternetz.de/community/threads/59797-Kleinserie-hardware-für-die-M256-WIFI Hardware für die RP6v2 M256 WiFi ('''RP6 Multi IO Projekt''')]&lt;br /&gt;
* Kleinserie: [http://www.roboternetz.de/community/threads/65296-I-O-ADC-und-DAC-Erweiterung-f%C3%BCr-RP6-3-3V-und-5V%21 I/O-, ADC- und DAC Erweiterung für RP6??? 3,3V und 5V!? ('''RP6 ArduIO Projekt''')]&lt;br /&gt;
* JM3 Engeneering: [http://www.jm3-engineering.com/rp6.htm RP6 Roboter Erweiterung]&lt;br /&gt;
* Ankündigung einer Sensorerweiterungsplatine für die RP6v2 M256 WiFi im [http://www.roboternetz.de/community/threads/63595-Neue-Hardware-f%C3%BCr-RP6%28v2%29?p=590129&amp;amp;viewfull=1#post590129 Roboternetz RP6 Forum]&lt;br /&gt;
* Erfahrungsbericht zur Sensorerweiterungsplatine im [http://www.arexx.com/forum/viewtopic.php?f=19&amp;amp;t=2498 AREXX Support Forum] und im [http://www.roboternetz.de/community/threads/64414-RP6-Sensor-Board-Erster-Eindruck Roboternetz RP6 Forum]&lt;br /&gt;
&lt;br /&gt;
* [http://www.rn-wissen.de/index.php/RP6_mit_AVR_Studio RP6 mit AVR Studio]&lt;br /&gt;
&lt;br /&gt;
* [http://www.arexx.com/rp6 AREXX RP6 Startseite]&lt;br /&gt;
* [http://www.arexx.com/forum/viewforum.php?f=19 AREXX Support Forum]&lt;br /&gt;
&lt;br /&gt;
* [http://www.conrad.de/ce/de/product/191584/RP6-V2-ROBOTERSYSTEM RP6v2 bei CONRAD]&lt;br /&gt;
* [http://www.conrad.de/ce/de/product/191550/RP6-MEGA32-ERWEITERUNGSSATZ RP6 CONTROL M32 bei CONRAD]&lt;br /&gt;
* [http://www.conrad.de/ce/de/product/191563/RP6-CC-PRO-MEGA128-ERWEITERUNGSSATZ RP6 CCPRO M128 bei CONRAD]&lt;br /&gt;
* [http://www.conrad.de/ce/de/product/191609/Arexx-RP6-V2-Control-M256-WiFi-Kit-RP6v2-M256-WIFI RP6v2 M256 WiFi bei CONRAD]&lt;br /&gt;
* [http://www.conrad.de/ce/de/product/1082384/Arexx-RP6-Sensor-Board-RP6-JM03-61 RP6 Sensor Board bei CONRAD]&lt;br /&gt;
&lt;br /&gt;
* [http://www.microchip.com/wwwproducts/Devices.aspx?dDocName=en558370 WiFi-Modul RN-171] der RP6v2 M256 WiFi&lt;br /&gt;
* [http://www.arexx.com/rp6/downloads/RP6_M256_WIFI_MANUAL_DE_20120711.zip 1. Bedienungsanleitung] der RP6v2 M256 WiFi&lt;br /&gt;
&lt;br /&gt;
* [http://www.roboternetz.de/phpBB2/viewforum.php?f=49 Roboternetz RP6 Forum]&lt;br /&gt;
* &amp;quot;Geburt&amp;quot; des Wiki im RN-Forum: [http://www.roboternetz.de/community/threads/32793-RP6-Wiki-Artikel RP6-Wiki-Artikel]&lt;br /&gt;
* Roboter RoboPalm RP6: [http://www.ionix.de/doku.php/rp6/start Link]&lt;br /&gt;
&lt;br /&gt;
* [http://www.youtube.com/results?search_query=rp6 RP6 Videos]&lt;br /&gt;
* [http://de-de.facebook.com/pages/Robby-RP6/155118711202285 facebook]&lt;br /&gt;
* Abkündigung des RP6v2 im [https://www.roboternetz.de/community/threads/72730-Ende-des-RP6-Robotersystems-nach-fast-11-1-2-Jahren RoboterNETZ] &lt;br /&gt;
'''Siehe auch die Weblinks im [http://www.rn-wissen.de/index.php/RP6_Sensor_Board_und_Xtra_Module#Weblinks RP6 Sensor Board und Xtra Module Artikel]!'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Kategorie:Robotikeinstieg]]	 &lt;br /&gt;
[[Kategorie:Praxis]]&lt;br /&gt;
&lt;br /&gt;
==Autoren==&lt;br /&gt;
--[http://www.roboternetz.de/community/members/1972-Dirk Dirk] 15:35, 31. Mär 2022 (CET)&lt;/div&gt;</summary>
		<author><name>Dirk NO2</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=RP6v2&amp;diff=28587</id>
		<title>RP6v2</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=RP6v2&amp;diff=28587"/>
				<updated>2022-03-31T13:35:55Z</updated>
		
		<summary type="html">&lt;p&gt;Dirk NO2: /* Autoren */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Bild:rp6v2_2.jpg|RP6v2 Base Roboter|right|500px]]&lt;br /&gt;
==Was bisher geschah==&lt;br /&gt;
'''Siehe auch &amp;quot;Was bisher geschah&amp;quot; im [http://www.rn-wissen.de/index.php/RP6#Was_bisher_geschah RP6 Artikel]!'''&lt;br /&gt;
&lt;br /&gt;
Mon, 27. Feb 2012 - Ankündigung des '''RP6v2'''&amp;lt;br/&amp;gt;&lt;br /&gt;
Don, 08. Mär 2012 - Auslieferungsbeginn des RP6v2&amp;lt;br/&amp;gt;&lt;br /&gt;
Sam, 17. Mär 2012 - Ankündigung der '''[[RP6v2#RP6v2_M256_WiFi_Platine|RP6v2 M256 WiFi]]'''&amp;lt;br/&amp;gt;&lt;br /&gt;
Mon, 11. Jun 2012 - Beginn der &amp;quot;Testaktion: Kostenlose RP6v2-M256-WIFI Module!&amp;quot;&amp;lt;br/&amp;gt;&lt;br /&gt;
Die, 10. Jul 2012 - Ende der &amp;quot;Testaktion: Kostenlose RP6v2-M256-WIFI Module!&amp;quot; nach Abstimmung&amp;lt;br/&amp;gt;&lt;br /&gt;
Mit, 11. Jul 2012 - Veröffentlichung der RP6v2 M256 WiFi Bedienungsanleitung&amp;lt;br/&amp;gt;&lt;br /&gt;
Die, 17. Jul 2012 - Eintreffen der kostenlosen RP6v2 M256 WiFi bei den Testern&amp;lt;br/&amp;gt;&lt;br /&gt;
Mit, 25. Jul 2012 - Auslieferungsbeginn der RP6v2 M256 WiFi&amp;lt;br/&amp;gt;&lt;br /&gt;
Don, 01. Nov 2012 - Im Oktober 2012 Auslieferung einiger RP6v2 M256 WiFi mit &amp;quot;altem&amp;quot; Bootloader V1.2&amp;lt;br/&amp;gt;&lt;br /&gt;
Don, 11. Dez 2014 - Im 2. bis 4. Quartal 2014 Auslieferung einiger [http://www.arexx.com/forum/viewtopic.php?f=19&amp;amp;t=2618 USB Interfaces mit gefälschtem FTDI Chip]&amp;lt;br/&amp;gt;&lt;br /&gt;
Sam, 02. Jan 2016 - Unter der Bezeichnung '''[[RP6v2#Arexx_RP6-Xtra_Robotersystem|Arexx RP6-Xtra Robotersystem]]''' ist ein Set bestehend aus dem RP6, einer Experimentierplatine, einem RP6v2 Drehgeber-Satz und einem RP6 USB-Interface lieferbar&amp;lt;br/&amp;gt;&lt;br /&gt;
Mon, 12. Mär 2018 - Seit dem 1. Quartal 2018 ist das Arexx RP6-Xtra Robotersystem bei CONRAD ausverkauft&amp;lt;br/&amp;gt;&lt;br /&gt;
Sam, 31. Mär 2018 - Seit Ende März 2018 ist die RP6v2 M256 WiFi Zusatzpatine bei CONRAD ausverkauft&amp;lt;br/&amp;gt;&lt;br /&gt;
Mit, 12. Sep 2018 - Seit September 2018 ist das [[RP6#Displays|LC-Display]] bei CONRAD ausverkauft&amp;lt;br/&amp;gt;&lt;br /&gt;
Mit, 28. Nov 2018 - Seit November 2018 ist der RP6v2 bei CONRAD ausverkauft&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Siehe auch &amp;quot;Was bisher geschah&amp;quot; im [http://www.rn-wissen.de/index.php/RP6_Sensor_Board_und_Xtra_Module#Was_bisher_geschah RP6 Sensor Board und Xtra Module Artikel]!'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Allgemein==&lt;br /&gt;
Der RP6v2 ([http://www.conrad.de/ce/de/product/191584/RP6-V2-ROBOTERSYSTEM/ 191584]) wurde am 27.02.2012 von [http://www.roboternetz.de/community/members/120-SlyD SlyD] angekündigt (siehe Weblinks!). Er ist eine leicht verbesserte Version des [[RP6]]. Der RP6v2 ist softwarekompatibel zum RP6. '''Alle Erweiterungs-Module können auch mit dem RP6v2 eingesetzt werden.'''&lt;br /&gt;
&lt;br /&gt;
 '''Seit November 2018 ist der RP6v2 bei CONRAD ausverkauft.'''&lt;br /&gt;
 '''Damit endet die Ära des RP6 Robotersystems nun endgültig nach fast 11 1/2 Jahren.'''&lt;br /&gt;
&lt;br /&gt;
Dieser Artikel beschreibt die Grundlagen zum RP6v2, '''sofern sie vom RP6 abweichen''', und die Grundlagen und Programmierung seiner zukünftigen Erweiterungs-Module.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Eigenschaften==&lt;br /&gt;
Laut Ankündigung haben sich beim RP6v2 folgende Details gegenüber dem RP6 geändert:&lt;br /&gt;
* Neue Drehgeber&lt;br /&gt;
** Justierung dank neuer Sensortechnik üblicherweise nicht mehr erforderlich&lt;br /&gt;
** leicht zugängliches und deutlich größeres Potentiometer&lt;br /&gt;
** Potis nur noch zur Feinjustierung erforderlich&lt;br /&gt;
* Zusätzliche Steckverbinder (im RP6 schon seit 2010 verbaut)&lt;br /&gt;
** vom Mainboard zu den Drehgebern&lt;br /&gt;
** vom Mainboard zu den Motoren&lt;br /&gt;
* Neue Anschlüsse (Steckverbinder / Stiftleisten)&lt;br /&gt;
** 2 3-polige ADC Anschlüsse mit VDD/GND inkl. zusätzlichem Stützkondensator&lt;br /&gt;
** 2 4-polige VDD Anschlüsse (je 2x +5V und 2x GND)&lt;br /&gt;
** 1 3-poliger +UB Anschluß (1x +UB, 2x GND)&lt;br /&gt;
** 1 5-polige Stiftleiste für den I2C Bus und VDD/GND&lt;br /&gt;
** 1 8-poliger EXT Steckverbinder (JST-Wannenstecker)&lt;br /&gt;
** 2 4-polige Steckverbinder (LIO1/LIO2) für die I/O-Pins von 4 LEDs und VDD/GND&lt;br /&gt;
* Hauptsicherung&lt;br /&gt;
** von 2,5A auf 3,15A erhöht&lt;br /&gt;
* Motortreiber&lt;br /&gt;
** leistungsfähigere und robustere MOSFETs&lt;br /&gt;
* Experimentierplatine&lt;br /&gt;
** gehört nicht mehr zum Lieferumfang&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Technische Änderungen==&lt;br /&gt;
Der RP6v2 weist einige Detail-Änderungen gegenüber der Vorversion auf. '''Diese Änderungen sind für die Nutzung und Programmierung des RP6v2 weitgehend irrelevant.'''&lt;br /&gt;
&lt;br /&gt;
Fast alle passiven SMD-Bauteile sind jetzt in Bauform 0603 bestückt (Ausnahmen: R6 (SP2 C2: R6), Induktivitäten und größere Kondensatoren).&lt;br /&gt;
Im Text gibt es Verweise auf den Schaltplan des RP6v2 (RP6v2_MAINBOARD.pdf) in der Form: (SP2 B1: Bauteil). Dies bedeutet, dass man das Bauteil auf Blatt 2 des RP6v2-Schaltplans im Feld B1 finden kann.&lt;br /&gt;
&lt;br /&gt;
===Mainboard===&lt;br /&gt;
* C14 (SP2 A3: C14) -&amp;gt; Liegt jetzt an VDD (parallel u.a. zu C6..C10)&lt;br /&gt;
* C26 (SP2 A1: C26) -&amp;gt; Jetzt bestückt mit Elko 220uF/16V (laut SP: 470uF/16V!)&lt;br /&gt;
* C29 (SP2 E1: C29) -&amp;gt; Jetzt bestückt mit SMD Kondensator 10uF&lt;br /&gt;
* IO3/IO4 Bestückungsaufdruck geändert in IO4/IO5 (Stecker LIO2)&lt;br /&gt;
* UBAT Bestückungsaufdruck geändert in UBAT_SENSE&lt;br /&gt;
* F2.5A Bestückungsaufdruck geändert in F3.0A (Feinsicherung flink 3,0A)&lt;br /&gt;
* Trennstelle +UB Sensor (siehe Abschnitt 6.4.6 [[RP6#.2BUB_Sensor|+UB Sensor]] des RP6-Artikels!) existiert beim RP6v2 nicht mehr&lt;br /&gt;
* Als Motortreiber (SP3 BCD23: Q1..Q4) werden anstelle von IRF7309 (ID 3,0A; PD 1,4W) die leistungsfähigeren und ESD-geschützten Typen [http://media.digikey.com/pdf/Data%20Sheets/Rohm%20PDFs/SP8M3.pdf SP8M3] (ID 4,5A; PD 2W; Schutzdiode) verwendet&lt;br /&gt;
&lt;br /&gt;
===Encoderplatine===&lt;br /&gt;
Schaltung siehe Datei RP6v2_ENCODERS.pdf!&lt;br /&gt;
* Jetzt mit Operationsverstärker IC2 ([http://ww1.microchip.com/downloads/en/DeviceDoc/21733h.pdf MCP6001U]) anstelle eines Transistors&lt;br /&gt;
* Größeres Potentiometer R2 (200kOhm)&lt;br /&gt;
Die Encoder sind mittlerweile auch einzeln unter der Conrad-Bestellnummer '''[http://www.conrad.de/ce/de/product/191625/RP6-DREHGEBER-SATZ 191625-62]''' verfügbar.&lt;br /&gt;
&lt;br /&gt;
===USB-Interface===&lt;br /&gt;
Schaltung siehe Datei RP6v2_USB_INTERFACE.pdf!&lt;br /&gt;
* C2  -&amp;gt; Jetzt bestückt mit SMD Kondensator 10uF&lt;br /&gt;
* C5  -&amp;gt; Neuer Blockkondensator 100nF an VCCIO von IC1&lt;br /&gt;
&lt;br /&gt;
===Steckverbindungen und Stiftleisten===&lt;br /&gt;
&lt;br /&gt;
====Motoren====&lt;br /&gt;
[[Bild:RP6v2_Motorstecker.JPG|thumb]]&lt;br /&gt;
&lt;br /&gt;
Beim RP6v2 sind die beiden Motorkabel mit 2-poligen Winkelsteckern RM 7,5mm an das Mainboard angeschlossen. &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;
&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;
====Encoder====&lt;br /&gt;
[[Bild:RP6v2_Encoderstecker.JPG|thumb]]&lt;br /&gt;
&lt;br /&gt;
Beim RP6v2 sind die Encoder mit einer JST XH Stiftleiste gewinkelt, 6-polig, RM 2,5mm ([http://www.conrad.de/ce/de/product/740271/Stiftleiste-gewinkelt-RM-25-mm-Serie-XH-Rastermass-25-mm-Pole-6-Nennstrom-3-A-S6B-XH-A-LFSN-JST-Inhalt-1-St 740271]) an das Mainboard angeschlossen.&lt;br /&gt;
&lt;br /&gt;
Auch die 3-polige Verbindung zu den beiden Encoder-Platinen (JST XH Stiftleiste gewinkelt, 3-polig, RM 2,5mm ([http://www.conrad.de/ce/de/product/740174/Stiftleiste-gewinkelt-RM-25-mm-Serie-XH-Rastermass-25-mm-Pole-3-Nennstrom-3-A-S3B-XH-A-LFSN-JST-Inhalt-1-St 740174])) ist steckbar.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====LIO1/LIO2====&lt;br /&gt;
[[Bild:RP6v2_LIO12.JPG|thumb]]&lt;br /&gt;
&lt;br /&gt;
Beim RP6 waren die Anschlüsse der Status-LEDs SL1,2 und SL4,5 ([[RP6#IO1..IO4|IO1..IO4]]) einzeln auf dem Mainboard zu kontaktieren.&lt;br /&gt;
&lt;br /&gt;
Beim RP6v2 gibt es zwei 4-polige Stiftleisten (LIO1, LIO2). Sie führen an den Pins 1 und 2 +5V und GND.&lt;br /&gt;
&lt;br /&gt;
An den Pins 3 und 4 finden sich die Anschlüsse von IO2, IO1 (LIO1) bzw. IO4, IO5 (LIO2).&lt;br /&gt;
&lt;br /&gt;
Bitte beachten: '''Der Bestückungsaufdruck IO4, IO5 des RP6v2 bezeichnet die selben Anschlüsse, wie beim RP6 IO3, IO4!'''&lt;br /&gt;
&lt;br /&gt;
Es handelt sich in beiden Fällen um die Anschlüsse der Status-LEDs SL4 (PB7) und SL5 (PB1).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====ADC0/ADC1====&lt;br /&gt;
[[Bild:RP6v2_ADC01.JPG|thumb]]&lt;br /&gt;
&lt;br /&gt;
Beim RP6 waren die 3-poligen Anschlüsse von ADC0 und ADC1 ([[RP6#Analoge_Sensoren_an_ADC0.2F1|Analoge Sensoren an ADC0/1]]) nicht mit Stiftleisten bestückt.&lt;br /&gt;
&lt;br /&gt;
Dies ist jetzt beim RP6v2 der Fall,- zusätzlich ist auch C26 (SP2 A1: C26) bestückt.&lt;br /&gt;
&lt;br /&gt;
Damit können analoge Sensoren direkt angeschlossen werden.&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;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====I2C/+UB/+5V====&lt;br /&gt;
[[Bild:RP6v2_I2CUB5V.JPG|thumb]]&lt;br /&gt;
&lt;br /&gt;
Die beim RP6 vorhandene 5-polige I2C-Schnittstelle ([[RP6#I2C-Schnittstelle|I2C-Schnittstelle]]) findet sich (jetzt mit Stiftleiste bestückt) genau so auch beim RP6v2.&lt;br /&gt;
&lt;br /&gt;
Bitte beachten: '''Die Anordnung der Pins auf dem Mainboard ist beim RP6v2 umgekehrt wie beim RP6!'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beim RP6 gab es (nicht mit Stiftleisten bestückte) Anschlüsse für VDD und +UB ([[RP6#VDD.2FGND.2F.2BUB_Anschlu.C3.9F|VDD/GND/+UB Anschluß]]).&lt;br /&gt;
&lt;br /&gt;
Beim RP6v2 gibt es jetzt drei Stiftleisten für +UB, +5V (VDD) und GND:&lt;br /&gt;
* Eine 3-polige Stiftleiste mit GND, +UB, GND&lt;br /&gt;
* Zwei 4-polige Stiftleisten jeweils mit GND, +5V, +5V, GND&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;
====EXT====&lt;br /&gt;
[[Bild:RP6v2_EXT.JPG|thumb]]&lt;br /&gt;
&lt;br /&gt;
Beim RP6 war keine Stiftleiste für den 8-poligen EXT Anschluß bestückt.&lt;br /&gt;
&lt;br /&gt;
Beim RP6v2 ist jetzt an dieser Stelle eine JST XH Stiftleiste gerade, 8-polig, RM 2,5mm ([http://www.conrad.de/ce/de/product/740105/Stiftleiste-gerade-RM-25-mm-Serie-XH-Rastermass-25-mm-Pole-8-Nennstrom-3-A-B8B-XH-A-LFSN-JST-Inhalt-1-St 740105]) vorhanden, auf die auch Steckbuchsen (RM 2,54) gesteckt werden können.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beschreibung des EXT Anschlusses: [[RP6#EXT_Anschlu.C3.9F|EXT Anschluß]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Erweiterungs-Module==&lt;br /&gt;
Über die Erweiterungs-Module informiert der Abschnitt [[RP6#Erweiterungs-Module|Erweiterungs-Module]] im RP6 Artikel.&lt;br /&gt;
&lt;br /&gt;
Darüber hinaus sind bei [http://www.conrad.de/ce/ CONRAD] für den RP6v2 erhältlich:&lt;br /&gt;
* RP6v2 M256 WiFi Zusatzplatine ([http://www.conrad.de/ce/de/product/191609/Arexx-RP6-V2-Control-M256-WiFi-Kit-RP6v2-M256-WIFI 191609])&lt;br /&gt;
* RP6 Sensor Board ([http://www.conrad.de/ce/de/product/1082384/Arexx-RP6-Sensor-Board-RP6-JM03-61 1082384])&lt;br /&gt;
&lt;br /&gt;
===RP6v2 M256 WiFi Platine===&lt;br /&gt;
Die RP6v2 M256 WiFi Zusatzplatine ([http://www.conrad.de/ce/de/product/191609/Arexx-RP6-V2-Control-M256-WiFi-Kit-RP6v2-M256-WIFI 191609]) wurde am 17.03.2012 von [http://www.roboternetz.de/community/members/120-SlyD SlyD] angekündigt (siehe Weblink!).&lt;br /&gt;
&lt;br /&gt;
Aktuell (Ende März 2018) ist die RP6v2 M256 WiFi Zusatzplatine bei CONRAD ausverkauft. &lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6v2_M256_WIFI.JPG|Die RP6v2 M256 WiFi]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Beschreibung====&lt;br /&gt;
Laut Ankündigung bietet die RP6v2 M256 WiFi:&lt;br /&gt;
* Atmel ATmega2560 Mikrocontroller&lt;br /&gt;
** 256kB Flash ROM&lt;br /&gt;
** 8kB SRAM&lt;br /&gt;
** 4kB EEPROM&lt;br /&gt;
** 16MHz Taktfrequenz&lt;br /&gt;
** 6 Hardware Timer und 86 I/O Ports&lt;br /&gt;
** Bis zu 16 A/D Wandler Kanäle (10 Bit Auflösung)&lt;br /&gt;
** 12 16 Bit Hardware PWMs&lt;br /&gt;
** 2 USART/SPI Ports&lt;br /&gt;
* Energieeffizientes 802.11g WLAN Modul&lt;br /&gt;
** Typ: Roving Networks RN-171&lt;br /&gt;
** Telemetriedaten übertragen&lt;br /&gt;
** Roboter vom PC aus fernsteuern&lt;br /&gt;
** Neue Programme drahtlos per WLAN in den Mikrocontroller laden&lt;br /&gt;
** Bootloader nachträglich erweitern&lt;br /&gt;
** Einstellung des WLAN Moduls über das RP6 USB Interface mit dem RobotLoader 2.x&lt;br /&gt;
** Änderung der Einstellungen über eine Netzwerkverbindung oder mit dem eigenen Mikrocontrollerprogramm&lt;br /&gt;
** Eigener Prozessor (entlastet den ATmega)&lt;br /&gt;
** Funktioniert mit jedem Standard WLAN Accesspoint/Router&lt;br /&gt;
** Kann als transparente serielle Schnittstelle arbeiten&lt;br /&gt;
** Kann vom PC aus per TCP/IP angesprochen werden&lt;br /&gt;
** 10cm 2.4GHz Antenne mit RP-SMA Anschluß&lt;br /&gt;
* Sonstige Ausstattung&lt;br /&gt;
** 8 Bit Display Port&lt;br /&gt;
** I2C Bus&lt;br /&gt;
** microSD Kartenslot&lt;br /&gt;
** 7 Status LEDs&lt;br /&gt;
** 2 Eingabetaster&lt;br /&gt;
** ISP Anschluß&lt;br /&gt;
** 4 WLAN ADC Kanäle&lt;br /&gt;
** AREF 3,3 und 5V&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6v2_M256_WIFI_Q2_m.JPG|thumb]]&lt;br /&gt;
&lt;br /&gt;
Ab Mitte Juli 2012 trafen die ersten kostenlosen RP6v2 M256 WiFi Platinen bei den Testern ein, die sich vorher dafür im Roboternetz RP6 Forum beworben hatten. Es handelte sich um Vorserien-Modelle, die sich dadurch auszeichneten, dass die Lötpads für Q2 (SP2 C6/C7: Q2) vertauscht waren. Der MOSFET war daher manuell &amp;quot;verdreht&amp;quot; aufgelötet, siehe nebenstehende Abbildung.&lt;br /&gt;
&lt;br /&gt;
Bei den Serien-Modellen wurde dies korrigiert.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Technische Daten====&lt;br /&gt;
{|  {{Blauetabelle}} &lt;br /&gt;
|'''Mikrocontroller:'''&lt;br /&gt;
|AVR ATmega2560&lt;br /&gt;
|-&lt;br /&gt;
|'''Speicher:'''&lt;br /&gt;
|256 kB [[Flash]]-Speicher&amp;lt;br/&amp;gt;&lt;br /&gt;
8 kB SRAM&amp;lt;br/&amp;gt; &lt;br /&gt;
4 kB [[EEPROM]]&amp;lt;br/&amp;gt;&lt;br /&gt;
? GB microSD Speicherkarte&lt;br /&gt;
|-&lt;br /&gt;
|'''Programmierung:'''&lt;br /&gt;
|Über [[Bootloader]], belegt ca. 8 kB des Flash-Speichers&amp;lt;br/&amp;gt;&lt;br /&gt;
Drahtlos über WLAN&lt;br /&gt;
|-&lt;br /&gt;
|'''Vorhandene Sensoren:'''&lt;br /&gt;
|2 Eingabetaster&amp;lt;br/&amp;gt;&lt;br /&gt;
4 WLAN ADC Kanäle&amp;lt;br/&amp;gt;&lt;br /&gt;
60 GP I/O Ports, davon bis 16 AD-Wandler (10-bit)&amp;lt;br/&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|'''Vorhandene Aktoren:'''&lt;br /&gt;
|7 Status LEDs&amp;lt;br/&amp;gt;&lt;br /&gt;
1 LC-Display-Port&amp;lt;br/&amp;gt;&lt;br /&gt;
802.11g WLAN Modul&amp;lt;br/&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|'''Abmessungen:'''&lt;br /&gt;
|(L &amp;amp;times; B &amp;amp;times; H) 112 &amp;amp;times; 90 &amp;amp;times; 42 mm (ohne Antenne)&lt;br /&gt;
|-&lt;br /&gt;
|'''Ausführung:'''&lt;br /&gt;
|Fertig aufgebautes Erweiterungsmodul&lt;br /&gt;
|-&lt;br /&gt;
|'''Stromversorgung:'''&lt;br /&gt;
|6 AA NiMH Akkus (über die RP6v2 Base)&lt;br /&gt;
|-&lt;br /&gt;
|'''Hersteller:'''&lt;br /&gt;
|Arexx Niederlande&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====WLAN Modul RN-171====&lt;br /&gt;
Das auf der RP6v2 M256 WiFi eingesetzte WLAN Modul ist das [http://www.microchip.com/wwwproducts/en/RN171 RN-171] ursprünglich entwickelt von Roving Networks. Vor einigen Jahren wurde die Firma Roving Networks von [http://www.microchip.com MicroChip Technology] übernommen.&lt;br /&gt;
&lt;br /&gt;
Inzwischen (2017) wird das RN-171 zwar noch hergestellt, für neue Hardware Designs aber nicht mehr empfohlen.&lt;br /&gt;
&lt;br /&gt;
Die letzte Firmware Version trägt die Nummer 4.81.&lt;br /&gt;
&lt;br /&gt;
Für die Nutzung des RN-171 auf der RP6v2 M256 WiFi wird sowohl vonseiten des Hardware Designs der Platine, als auch vonseiten der Software davon ausgegangen, dass das RN-171 auch den &amp;quot;Ad-Hoc Modus&amp;quot; beherrscht. Dies ist der Fall bis zur Firmware Version 2.38.3. Höhere Versionen beherrschen diesen Modus nicht mehr.&lt;br /&gt;
&lt;br /&gt;
''Somit ist die Firmware 2.38.3 die höchste Version, die für das RN-171 auf der RP6v2 M256 WiFi nutzbar ist!''&lt;br /&gt;
&lt;br /&gt;
Diese Firmware Version (Datei: wifly7-2383.img) findet ihr in der ZIP in diesem [http://www.roboternetz.de/community/threads/64251-RP6M256-WLAN-Modul-RN-171-Firmware-Update?p=594781&amp;amp;viewfull=1#post594781 Post] im Roboternetz RP6 Forum. Seht euch vor einem eventuellen Firmware Update unbedingt den ganzen [http://www.roboternetz.de/community/threads/64251-RP6M256-WLAN-Modul-RN-171-Firmware-Update Thread] auch wegen der enthaltenen Warnhinweise an.&lt;br /&gt;
&lt;br /&gt;
====Umbau-Optionen====&lt;br /&gt;
Für die RP6v2 M256 WiFi gibt es keine Umbau-Optionen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===RP6 Sensor Board===&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_Sensor_Board.jpg|Das RP6 Sensor Board]]&lt;br /&gt;
&lt;br /&gt;
'''Die Beschreibung des RP6 Sensor Boards wurde ausgelagert in einen eigenen [[RP6_Sensor_Board_und_Xtra_Module#RP6_Sensor_Board_2|Artikel]]!'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Zubehör und Ersatzteile==&lt;br /&gt;
Über die Zubehör- und Ersatzteile informiert der Abschnitt [[RP6#Zubehör und Ersatzteile|Zubehör und Ersatzteile]] im RP6 Artikel.&lt;br /&gt;
&lt;br /&gt;
Darüber hinaus sind bei [http://www.conrad.de/ce/ CONRAD] für den RP6v2 erhältlich:&lt;br /&gt;
* Arexx RP6v2 Drehgeber-Satz RP6-ENCv2 ([http://www.conrad.de/ce/de/product/191625/RP6-DREHGEBER-SATZ 191625] AUSVERKAUFT!)&lt;br /&gt;
* Arexx RP6 USB-Interface RP6V2-TRANS ([http://www.conrad.de/ce/de/product/191638/Arexx-RP6-USB-Interface-RP6V2-TRANS 191638] AUSVERKAUFT!)&lt;br /&gt;
* Arexx RP6 Xtra Module&lt;br /&gt;
&lt;br /&gt;
===RP6v2 Drehgeber-Satz RP6-ENCv2===&lt;br /&gt;
Die RP6v2 [http://www.rn-wissen.de/index.php/RP6v2#Encoder Drehgeber-Sensoren] (AREXX RP6-ENCv2) sind als Ersatzteil für den RP6v2 (191584) erhältlich und jetzt seit Mai 2020 bei CONRAD ausverkauft. Sie können auch in den [[RP6|RP6]] (191524) und in das RP5/RP6-Chassis ([http://www.conrad.de/ce/de/product/191152/Arexx-Fahrgestell-Robby-RP5RP6-Roboter 191152] AUSVERKAUFT!) eingebaut werden und sind Bestandteil des [[RP6v2#Arexx_RP6-Xtra_Robotersystem|Arexx RP6-Xtra Robotersystems]].&lt;br /&gt;
&lt;br /&gt;
===RP6 USB-Interface RP6V2-TRANS===&lt;br /&gt;
Das RP6 USB-Interface (AREXX RP6V2-TRANS) kann zur Kommunikation mit verschiedenen Robotern und Erweiterungsmodulen eingesetzt werden. Es lassen sich mit dem RobotLoader neue Programme in den Mikrocontroller laden, und es wird ein virtueller serieller Port zur Kommunikation bereitgestellt. Auf dem Modul befindet sich zusätzlich ein Anschluss für APC220 Funkmodule (z.B. aus [http://www.conrad.de/ce/de/product/191668/Arexx-Wireless-Kit-ARX-APC220 diesem] Set, AUSVERKAUFT!) und ein 3,3 V Spannungsregler. Das USB-Interface RP6V2-TRANS kann als Ersatz für das mit dem RP6 oder RP6v2 gelieferte USB-Interface dienen und ist Bestandteil des [[RP6v2#Arexx_RP6-Xtra_Robotersystem|Arexx RP6-Xtra Robotersystems]]. Seit Ende 2021 ist das USB-Interface bei CONRAD ausverkauft.&lt;br /&gt;
&lt;br /&gt;
===RP6 Xtra Module===&lt;br /&gt;
'''Die Beschreibung der RP6 Xtra Module wurde ausgelagert in einen eigenen [[RP6_Sensor_Board_und_Xtra_Module#RP6_Xtra_Module_2|Artikel]]!'''&lt;br /&gt;
&lt;br /&gt;
===Arexx RP6-Xtra Robotersystem===&lt;br /&gt;
Unter der Bezeichnung '''Arexx RP6-Xtra Robotersystem''' bzw. '''Arexx Roboter Bausatz RP6-S''' ([https://www.conrad.de/de/arexx-rp6-xtra-robotersystem-1395738.html 1395738]) ist ab Januar 2016 ein Set bestehend aus dem [[RP6|RP6]] ([https://www.conrad.de/de/rp6-robotersystem-191524.html 191524]), einer [[RP6#Experimentierplatine|Experimentierplatine]] ([https://www.conrad.de/de/arexx-rp6-experimentierplatine-191537.html 191537]), einem [[RP6v2#RP6v2_Drehgeber-Satz_RP6-ENCv2|RP6v2 Drehgeber-Satz]] ([https://www.conrad.de/de/arexx-rp6-v2-drehgeber-sensoren-rp6-encv2-191625.html 191625]) und einem [[RP6v2#RP6_USB-Interface_RP6V2-TRANS|RP6 USB-Interface]] ([https://www.conrad.de/de/arexx-rp6-usb-interface-rp6v2-trans-191638.html 191638]) lieferbar.&lt;br /&gt;
&lt;br /&gt;
Die RP6v2 Drehgeber müssen selbst montiert werden. Durch dieses Set entsteht aus dem &amp;quot;alten RP6&amp;quot; ein Robotersystem, das in seiner Funktion identisch mit dem RP6v2 ist.&lt;br /&gt;
&lt;br /&gt;
Seit dem 1. Quartal 2018 ist das Arexx RP6-Xtra Robotersystem bei CONRAD ausverkauft.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Programmierung==&lt;br /&gt;
===RobotLoader===&lt;br /&gt;
Der RobotLoader ist die Weiterentwicklung des RP6Loaders. Es gibt ihn und den USB Interface Treiber [http://www.arexx.com/rp6/html/de/software.htm hier].&lt;br /&gt;
Über die Funktionen des RP6Loaders (siehe [[RP6_-_Programmierung#RP6Loader|hier]]!) hinaus kann der RobotLoader ab Version 2.0 Folgendes:&lt;br /&gt;
* WiFi Loader (Programme über WiFi hochladen und starten, Programmspeicher löschen)&lt;br /&gt;
* WiFi Terminal (Zeichen über WiFi senden/empfangen)&lt;br /&gt;
* Abdocken der Fenster des (seriellen) Terminals und des WiFi Terminals&lt;br /&gt;
* Konfiguration des WiFi Moduls über die serielle Schnittstelle&lt;br /&gt;
* Nach WiFi Geräten suchen&lt;br /&gt;
* Ab Version 2.3 über Kommandozeile steuerbar&lt;br /&gt;
&lt;br /&gt;
'''Befehlszeilen Optionen'''&lt;br /&gt;
&amp;lt;pre&amp;gt;################################################################&lt;br /&gt;
RobotLoader - Commandline Options&lt;br /&gt;
-c | -command : Enable Commandline Mode&lt;br /&gt;
-h | -help : Show this help message&lt;br /&gt;
-port=&amp;lt;PORT&amp;gt; : specify which port to use&lt;br /&gt;
               Windows with JD2XX: USB0, USB1, ...&lt;br /&gt;
               Windows with RXTX: COM0, COM1, ...&lt;br /&gt;
               Linux with RXTX: /dev/ttyUSB0, /dev/ttyUSB1, ...&lt;br /&gt;
-e : Erase Memory&lt;br /&gt;
-hex=&amp;lt;FILE&amp;gt; : Upload &amp;lt;FILE&amp;gt;, you must specify the complete path!&lt;br /&gt;
-s : Start Program (after upload)&lt;br /&gt;
-id : Get Infos from connected Board&lt;br /&gt;
###############################################################&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Loader Versionen====&lt;br /&gt;
Hier eine Tabelle der (mir) bekannten RobotLoader Versionen für die RP6v2 Base, CONTROL M32 und ab Version 2.0 auch für die M256 WiFi:&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |ZIP-Datum&lt;br /&gt;
 |Version&lt;br /&gt;
 |Bemerkungen&lt;br /&gt;
 |Examples&lt;br /&gt;
 |-&lt;br /&gt;
 |12.07.2010&lt;br /&gt;
 |[http://www.arexx.com/rp6/downloads/RobotLoader_20100712.zip 1.5h]&lt;br /&gt;
 |Auch für die RP6 Base, für Roboterarme und Caterpillar&lt;br /&gt;
 |ab 16.10.2007&lt;br /&gt;
 |-&lt;br /&gt;
 |16.06.2011&lt;br /&gt;
 |1.6b&lt;br /&gt;
 |Version auf der AREXX Wild Thumper CD-ROM!&lt;br /&gt;
 |&lt;br /&gt;
 |-&lt;br /&gt;
 |23.02.2012&lt;br /&gt;
 |[http://www.arexx.com/rp6/downloads/RobotLoader_20120223.zip 2.0 BETA]&lt;br /&gt;
 |Testversion! Ab v2.0 auch für die RP6v2 M256 WiFi Platine&lt;br /&gt;
 |&lt;br /&gt;
 |-&lt;br /&gt;
 |16.03.2012&lt;br /&gt;
 |2.1c&lt;br /&gt;
 |Version auf der AREXX Wireless kits CD-ROM 2012!&lt;br /&gt;
 |&lt;br /&gt;
 |-&lt;br /&gt;
 |05.06.2012&lt;br /&gt;
 |[http://www.arexx.com/rp6/downloads/RobotLoader_20120605.zip 2.3a]&lt;br /&gt;
 |Testversion! Siehe auch [http://www.roboternetz.de/community/threads/58168-RobotLoader-2-3a hier]!&lt;br /&gt;
 |&lt;br /&gt;
 |-&lt;br /&gt;
 |18.06.2012&lt;br /&gt;
 |[http://www.arexx.com/rp6/downloads/RobotLoader_20120618.zip 2.3b]&lt;br /&gt;
 |Testversion! Siehe auch [http://www.roboternetz.de/community/threads/58168-RobotLoader-2-3a hier]!&lt;br /&gt;
 |&lt;br /&gt;
 |-&lt;br /&gt;
 |17.07.2012&lt;br /&gt;
 |[http://www.arexx.com/rp6/downloads/RobotLoader_20120717.zip 2.3c]&lt;br /&gt;
 |Über Kommandozeile nutzbar, siehe auch [http://www.roboternetz.de/community/threads/58168-RobotLoader-2-3a hier]!&lt;br /&gt;
 |ab 16.07.2012&lt;br /&gt;
 |-&lt;br /&gt;
 |24.09.2012&lt;br /&gt;
 |[http://www.arexx.com/rp6/downloads/RobotLoader_20120924.zip 2.4a]&lt;br /&gt;
 |Mit WLAN Firmware v. 2.32, siehe auch [http://www.roboternetz.de/community/threads/59336-RobotLoader-2-4a hier]!&lt;br /&gt;
 |&lt;br /&gt;
 |-&lt;br /&gt;
 |10.04.2013&lt;br /&gt;
 |[http://www.arexx.com/rp6/downloads/RobotLoader_20130410.zip 2.5a]&lt;br /&gt;
 |Mit WLAN Firmware v. 2.36, siehe auch [http://www.roboternetz.de/community/threads/61977-M256-WIFI-Manchmal-nicht-ansprechbar?p=578766&amp;amp;viewfull=1#post578766 hier]!&lt;br /&gt;
 |&lt;br /&gt;
 |-&lt;br /&gt;
|}&lt;br /&gt;
'''Hinweise:'''&lt;br /&gt;
* Ältere Versionen des RP6Loaders bis Version 1.4 findet ihr [[RP6_-_Programmierung#RP6Loader|hier]].&lt;br /&gt;
* Von JM3 Engineering wurde auch ein eigenes Programm [[RP6_Sensor_Board_und_Xtra_Module#Robot-Tool|&amp;quot;'''JM3 Robot-Tool'''&amp;quot;]] veröffentlicht, das im RP6-System (RP6(v2) Base, CONTROL M32, M256 WiFi) anstelle des RobotLoaders verwendet werden kann.&lt;br /&gt;
&lt;br /&gt;
====Projekte====&lt;br /&gt;
* Der RobotLoader 2.3a und [http://www.rn-wissen.de/index.php/LunaAVR LunaAVR] im [http://www.roboternetz.de/community/threads/58168-RobotLoader-2-3a?p=551535&amp;amp;viewfull=1#post551535 Roboternetz RP6 Forum] und im [http://forum.myluna.de/viewtopic.php?f=3&amp;amp;t=24#p94 LunaAVR Forum]&lt;br /&gt;
&lt;br /&gt;
===RP6v2===&lt;br /&gt;
'''Der RP6v2 ([http://www.conrad.de/ce/de/product/191584/RP6-V2-ROBOTERSYSTEM/ 191584]) ist softwarekompatibel zum RP6.'''&lt;br /&gt;
&lt;br /&gt;
Zur Programmierung des [[RP6]] und des RP6v2 gibt es einen eigenen Artikel: [[RP6 - Programmierung]]&lt;br /&gt;
&lt;br /&gt;
===RP6v2 M256 WiFi Platine===&lt;br /&gt;
&lt;br /&gt;
====Dokumentation====&lt;br /&gt;
Die Dokumentation (Anleitung der RP6v2 M256 WiFi und des WiFi-Moduls RN-171 WiFly) befindet sich [http://www.arexx.com/rp6/html/de/soft_doc_rp6m256.htm hier].&lt;br /&gt;
&lt;br /&gt;
=====Manuals=====&lt;br /&gt;
=====Schematics=====&lt;br /&gt;
=====Datasheets=====&lt;br /&gt;
&lt;br /&gt;
====Demo-Programmme====&lt;br /&gt;
Die RP6v2 M256 WiFi Demo Programme sind [http://www.arexx.com/rp6/html/de/soft_doc_rp6m256.htm hier] zu finden.&lt;br /&gt;
&lt;br /&gt;
=====Bug-Report=====&lt;br /&gt;
In [http://www.roboternetz.de/community/threads/64362-Programmstart-mit-Hindernissen diesem Thread] des Roboternetz-Forums geht es um eine Fehlfunktion der Programme ''Example_09_Move'' und ''Example_10_Move2'' für die RP6v2 M256 WiFi. Diese Demos werden nicht korrekt ausgeführt, wenn sie über WLAN gestartet werden. Sie funktionieren jedoch normal, wenn sie mit dem START/STOP-Button der RP6v2 Base gestartet werden.&lt;br /&gt;
&lt;br /&gt;
Dieses Fehlverhalten der beiden Demos (aus [http://www.arexx.com/rp6/downloads/RP6Examples_20120725f.zip Version 1.8 der RP6 Examples vom 25.07.2012]) kann durch Einfügen der Zeilen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	I2CTWI_transmitByte(0, 0);&lt;br /&gt;
	mSleep(200);&lt;br /&gt;
	I2CTWI_transmitByte(0, 0);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
... in ''Example_09_Move'' ab Zeile 129 und in ''Example_10_Move2'' ab Zeile 699 abgestellt werden.&lt;br /&gt;
&lt;br /&gt;
====Library====&lt;br /&gt;
Die Library für die RP6v2 M256 WiFi besteht aus folgenden 21 Dateien:&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |Library&lt;br /&gt;
 |Datei&lt;br /&gt;
 |Funktion&lt;br /&gt;
 |-&lt;br /&gt;
 |RP6M256&lt;br /&gt;
 |RP6M256.h&lt;br /&gt;
 |RP6M256 Hardware-Konfiguration&lt;br /&gt;
 |-&lt;br /&gt;
 |RP6M256&lt;br /&gt;
 |RP6M256Lib.h&lt;br /&gt;
 |RP6M256 Library Header&lt;br /&gt;
 |-&lt;br /&gt;
 |RP6M256&lt;br /&gt;
 |RP6M256Lib.c&lt;br /&gt;
 |RP6M256 Library&lt;br /&gt;
 |-&lt;br /&gt;
 |RP6M256uart&lt;br /&gt;
 |RP6M256uart.h&lt;br /&gt;
 |RS232 Funktionen Header&lt;br /&gt;
 |-&lt;br /&gt;
 |RP6M256uart&lt;br /&gt;
 |RP6M256uart.c&lt;br /&gt;
 |RS232 Funktionen&lt;br /&gt;
 |-&lt;br /&gt;
 |RP6M256_I2CMaster&lt;br /&gt;
 |RP6M256_I2CMasterLib.h&lt;br /&gt;
 |I2C Master Library Header&lt;br /&gt;
 |-&lt;br /&gt;
 |RP6M256_I2CMaster&lt;br /&gt;
 |RP6M256_I2CMasterLib.c&lt;br /&gt;
 |I2C Master Library&lt;br /&gt;
 |-&lt;br /&gt;
 |RP6M256_WIFI&lt;br /&gt;
 |RP6M256_WIFIlib.h&lt;br /&gt;
 |WIFI Library Header&lt;br /&gt;
 |-&lt;br /&gt;
 |RP6M256_WIFI&lt;br /&gt;
 |RP6M256_WIFIlib.c&lt;br /&gt;
 |WIFI Library&lt;br /&gt;
 |-&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |-&lt;br /&gt;
 |SDC&lt;br /&gt;
 |byteordering.h&lt;br /&gt;
 |Byte-order handling header&lt;br /&gt;
 |-&lt;br /&gt;
 |SDC&lt;br /&gt;
 |byteordering.c&lt;br /&gt;
 |Byte-order handling implementation&lt;br /&gt;
 |-&lt;br /&gt;
 |SDC&lt;br /&gt;
 |fat_config.h&lt;br /&gt;
 |FAT configuration&lt;br /&gt;
 |-&lt;br /&gt;
 |SDC&lt;br /&gt;
 |fat.h&lt;br /&gt;
 |FAT header&lt;br /&gt;
 |-&lt;br /&gt;
 |SDC&lt;br /&gt;
 |fat.c&lt;br /&gt;
 |FAT implementation&lt;br /&gt;
 |-&lt;br /&gt;
 |SDC&lt;br /&gt;
 |partition_config.h&lt;br /&gt;
 |Partition configuration&lt;br /&gt;
 |-&lt;br /&gt;
 |SDC&lt;br /&gt;
 |partition.h&lt;br /&gt;
 |Partition table header&lt;br /&gt;
 |-&lt;br /&gt;
 |SDC&lt;br /&gt;
 |partition.c&lt;br /&gt;
 |Partition table implementation&lt;br /&gt;
 |-&lt;br /&gt;
 |SDC&lt;br /&gt;
 |sd-reader_config.h&lt;br /&gt;
 |Common sd-reader configuration (all modules)&lt;br /&gt;
 |-&lt;br /&gt;
 |SDC&lt;br /&gt;
 |sd_raw_config.h&lt;br /&gt;
 |MMC/SD support configuration&lt;br /&gt;
 |-&lt;br /&gt;
 |SDC&lt;br /&gt;
 |sd_raw.h&lt;br /&gt;
 |MMC/SD/SDHC raw access header&lt;br /&gt;
 |-&lt;br /&gt;
 |SDC&lt;br /&gt;
 |sd_raw.c&lt;br /&gt;
 |MMC/SD/SDHC raw access implementation&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=====Versionen=====&lt;br /&gt;
Hier eine Tabelle der (mir) bekannten Library Versionen der RP6v2 M256 WiFi:&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |ZIP-Datum&lt;br /&gt;
 |VERSION_&lt;br /&gt;
 |RP6M256Library&lt;br /&gt;
 |RP6LIB_VERSION&lt;br /&gt;
 |RP6M256.h&lt;br /&gt;
 |RP6M256Lib&lt;br /&gt;
 |WifiLib&lt;br /&gt;
 |UartLib&lt;br /&gt;
 |I2CMasterLib&lt;br /&gt;
 |SDCLib **&lt;br /&gt;
 |-&lt;br /&gt;
 |24.02.2012&lt;br /&gt;
 |1.7&lt;br /&gt;
 |1.0_24.02.12&lt;br /&gt;
 |16&lt;br /&gt;
 |1.0_24.02.12&lt;br /&gt;
 |1.0_24.02.12&lt;br /&gt;
 |1.0_24.02.12&lt;br /&gt;
 |1.0_24.02.12&lt;br /&gt;
 |(1.0_24.02.12)&lt;br /&gt;
 |?&lt;br /&gt;
 |-&lt;br /&gt;
 |16.07.2012&lt;br /&gt;
 |[http://www.arexx.com/rp6/downloads/RP6Examples_20120716.zip 1.7] *&lt;br /&gt;
 |1.1_16.07.12&lt;br /&gt;
 |16&lt;br /&gt;
 |1.1_16.07.12&lt;br /&gt;
 |1.1_16.07.12&lt;br /&gt;
 |1.1_16.07.12&lt;br /&gt;
 |1.1_16.07.12&lt;br /&gt;
 |(1.0_24.02.12)&lt;br /&gt;
 |(2006-2011)&lt;br /&gt;
 |-&lt;br /&gt;
 |25.07.2012&lt;br /&gt;
 |[http://www.arexx.com/rp6/downloads/RP6Examples_20120725.zip 1.8]&lt;br /&gt;
 |1.1_16.07.12&lt;br /&gt;
 |16&lt;br /&gt;
 |1.1_16.07.12&lt;br /&gt;
 |1.1_16.07.12&lt;br /&gt;
 |1.1_16.07.12&lt;br /&gt;
 |1.1_16.07.12&lt;br /&gt;
 |(1.0_24.02.12)&lt;br /&gt;
 |(2006-2011)&lt;br /&gt;
 |-&lt;br /&gt;
 |25.07.2012 ²&lt;br /&gt;
 |[http://www.arexx.com/rp6/downloads/RP6Examples_20120725f.zip 1.8]&lt;br /&gt;
 |1.1_16.07.12&lt;br /&gt;
 |16&lt;br /&gt;
 |1.1_16.07.12&lt;br /&gt;
 |1.1_16.07.12&lt;br /&gt;
 |1.1_16.07.12&lt;br /&gt;
 |1.1_16.07.12&lt;br /&gt;
 |(1.0_24.02.12)&lt;br /&gt;
 |(2006-2011)&lt;br /&gt;
|}&lt;br /&gt;
'''Zu *:''' Ab der Version 1.7 sind auch die Libraries und Examples der RP6v2 Base und CONTROL M32 enthalten! Ältere Versionen dieser Libraries und Examples bis Version 1.5 findet ihr [[RP6_-_Programmierung#Versionen|hier]]!&lt;br /&gt;
&lt;br /&gt;
'''Zu **:''' Die SDC Library ist eine Open Source Bibliothek für den Zugriff auf SD-Karten. Sie steht unter der GNU General Public License version 2. Geschrieben wurde sie von Roland Riegel; sein [http://www.roland-riegel.de/sd-reader/index.html Projekt] könnt ihr im Internet verfolgen. Eventuelle Updates werden dort auch veröffentlicht.&lt;br /&gt;
Die Projektseiten sind auch im Verzeichnis ...\RP6Lib\RP6control_M256_WIFI\sdc\doc\html\ der RP6Examples zu finden. Ihr könnt in dem Verzeichnis die Datei &amp;quot;index.html&amp;quot; starten, um sie anzuzeigen.&lt;br /&gt;
&lt;br /&gt;
'''Zu ²:''' Die Datei heißt RP6Examples_20120725'''f'''.zip. Mir ist nicht bekannt, ob ein Unterschied zur RP6Examples_20120725.zip besteht.&lt;br /&gt;
&lt;br /&gt;
In der 1. Spalte findet ihr das Datum der RP6Examples.zip Datei, in der die Library enthalten ist. Die 2. Spalte nennt die Version, die im Dateinamen der VERSION_x.x.txt Datei als x.x vorkommt. In der 3. Spalte steht die Versionsangabe der RP6M256Library laut Angabe in der VERSION_x.x.txt Datei.&lt;br /&gt;
&lt;br /&gt;
In der 4. Spalte gebe ich den Wert der Konstante RP6LIB_VERSION an. Es gibt sie ab den RP6v2 Base und CONTROL M32 Examples vom 16.10.2007. In den Spalten 5 bis 10 führe ich nacheinander die Versionsnummern und ggf. das in der Datei genannte Datum der Header-Datei/Library an: RP6M256.h, RP6M256Lib, WifiLib, UartLib, I2CMasterLib, SDCLib.&lt;br /&gt;
&lt;br /&gt;
=====RP6M256=====&lt;br /&gt;
======Bug-Report======&lt;br /&gt;
======Konfiguration======&lt;br /&gt;
======Port-Verwendung======&lt;br /&gt;
Die Verwendung der Ports des RP6v2 M256 WiFi Microcontrollers wird festgelegt in der Header-Datei &amp;quot;RP6M256.h&amp;quot;. In dieser Datei wird auch noch Folgendes aufgeführt:&lt;br /&gt;
* Quarzfrequenz (F_CPU) &lt;br /&gt;
* True/false Definition &lt;br /&gt;
* Verschiedene Macros &lt;br /&gt;
* Baudraten und Baudraten-Tabelle &lt;br /&gt;
&lt;br /&gt;
Hier eine Tabelle mit den Port-Definitionen für die RP6v2 M256 WiFi:&lt;br /&gt;
 Erklärung der Spalten:&lt;br /&gt;
 Port        -&amp;gt; Atmel Portpin Bezeichnung&lt;br /&gt;
 Name        -&amp;gt; Atmel Funktionsbezeichnung&lt;br /&gt;
 In/Out      -&amp;gt; Eingang (In) oder Ausgang (Out)&lt;br /&gt;
 Pullup      -&amp;gt; Falls Eingang: Pullup ein- (1) oder ausgeschaltet (0)&lt;br /&gt;
 Wert        -&amp;gt; Falls Ausgang: Logikpegel high (1) oder low (0)&lt;br /&gt;
 Funktion    -&amp;gt; Schnittstellenfunktion&lt;br /&gt;
 Bezeichnung -&amp;gt; Portpin Bezeichnung der Library&lt;br /&gt;
 Stecker     -&amp;gt; Portpin verfügbar an STECKER: Pin&lt;br /&gt;
 Anmerkungen -&amp;gt; Kommentare (ADC_xx: ADC-Kanal Bezeichnung)&lt;br /&gt;
&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |Port&lt;br /&gt;
 |Name&lt;br /&gt;
 |In/Out&lt;br /&gt;
 |Pullup&lt;br /&gt;
 |Wert&lt;br /&gt;
 |Funktion&lt;br /&gt;
 |Bezeichnung&lt;br /&gt;
 |Stecker&lt;br /&gt;
 |Anmerkungen&lt;br /&gt;
 |-&lt;br /&gt;
 |PA0&lt;br /&gt;
 |AD0&lt;br /&gt;
 |Out&lt;br /&gt;
 |&lt;br /&gt;
 |0&lt;br /&gt;
 |&lt;br /&gt;
 |DISP_D0&lt;br /&gt;
 |DISPIO: 7&lt;br /&gt;
 |Display D0&lt;br /&gt;
 |-&lt;br /&gt;
 |PA1&lt;br /&gt;
 |AD1&lt;br /&gt;
 |Out&lt;br /&gt;
 |&lt;br /&gt;
 |0&lt;br /&gt;
 |&lt;br /&gt;
 |DISP_D1&lt;br /&gt;
 |DISPIO: 8&lt;br /&gt;
 |Display D1 &lt;br /&gt;
 |-&lt;br /&gt;
 |PA2&lt;br /&gt;
 |AD2&lt;br /&gt;
 |Out&lt;br /&gt;
 |&lt;br /&gt;
 |0&lt;br /&gt;
 |&lt;br /&gt;
 |DISP_D2&lt;br /&gt;
 |DISPIO: 9&lt;br /&gt;
 |Display D2 &lt;br /&gt;
 |-&lt;br /&gt;
 |PA3&lt;br /&gt;
 |AD3&lt;br /&gt;
 |Out&lt;br /&gt;
 |&lt;br /&gt;
 |0&lt;br /&gt;
 |&lt;br /&gt;
 |DISP_D3&lt;br /&gt;
 |DISPIO: 10&lt;br /&gt;
 |Display D3&lt;br /&gt;
 |-&lt;br /&gt;
 |PA4&lt;br /&gt;
 |AD4&lt;br /&gt;
 |Out&lt;br /&gt;
 |&lt;br /&gt;
 |0&lt;br /&gt;
 |&lt;br /&gt;
 |DISP_D4&lt;br /&gt;
 |DISPIO: 11&lt;br /&gt;
 |Display D4&lt;br /&gt;
 |-&lt;br /&gt;
 |PA5&lt;br /&gt;
 |AD5&lt;br /&gt;
 |Out&lt;br /&gt;
 |&lt;br /&gt;
 |0&lt;br /&gt;
 |&lt;br /&gt;
 |DISP_D5&lt;br /&gt;
 |DISPIO: 12&lt;br /&gt;
 |Display D5&lt;br /&gt;
 |-&lt;br /&gt;
 |PA6&lt;br /&gt;
 |AD6&lt;br /&gt;
 |Out&lt;br /&gt;
 |&lt;br /&gt;
 |0&lt;br /&gt;
 |&lt;br /&gt;
 |DISP_D6&lt;br /&gt;
 |DISPIO: 13&lt;br /&gt;
 |Display D6&lt;br /&gt;
 |-&lt;br /&gt;
 |PA7&lt;br /&gt;
 |AD7&lt;br /&gt;
 |Out&lt;br /&gt;
 |&lt;br /&gt;
 |0&lt;br /&gt;
 |&lt;br /&gt;
 |DISP_D7&lt;br /&gt;
 |DISPIO: 14&lt;br /&gt;
 |Display D7&lt;br /&gt;
 |-&lt;br /&gt;
 |PB0&lt;br /&gt;
 |SS/PCI0&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |SPI_SS *&lt;br /&gt;
 |&lt;br /&gt;
 |SDC Output DAT3 / CS&lt;br /&gt;
 |-&lt;br /&gt;
 |PB1&lt;br /&gt;
 |SCK/PCI1&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |ISP&lt;br /&gt;
 |SPI_SCK *&lt;br /&gt;
 |ISP: 3&lt;br /&gt;
 |SDC Output CLK&lt;br /&gt;
 |-&lt;br /&gt;
 |PB2&lt;br /&gt;
 |MOSI/PCI2&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |ISP&lt;br /&gt;
 |SPI_MOSI *&lt;br /&gt;
 |ISP: 4&lt;br /&gt;
 |SDC Output CMD / DI&lt;br /&gt;
 |-&lt;br /&gt;
 |PB3&lt;br /&gt;
 |MISO/PCI3&lt;br /&gt;
 |In&lt;br /&gt;
 |0&lt;br /&gt;
 |&lt;br /&gt;
 |ISP&lt;br /&gt;
 |SPI_MISO ***&lt;br /&gt;
 |ISP: 1&lt;br /&gt;
 |SDC Input DAT0 / DO&lt;br /&gt;
 |-&lt;br /&gt;
 |PB4&lt;br /&gt;
 |OC2A/PCI4&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |OC2A_PI4&lt;br /&gt;
 |PWM23: 5&lt;br /&gt;
 |frei&lt;br /&gt;
 |-&lt;br /&gt;
 |PB5&lt;br /&gt;
 |OC1A/PCI5&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |OC1A_PI5&lt;br /&gt;
 |PWM01: 7&lt;br /&gt;
 |frei&lt;br /&gt;
 |-&lt;br /&gt;
 |PB6&lt;br /&gt;
 |OC1B/PCI6&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |OC1B_PI6&lt;br /&gt;
 |PWM01: 9&lt;br /&gt;
 |frei&lt;br /&gt;
 |-&lt;br /&gt;
 |PB7&lt;br /&gt;
 |OC0A/OC1C/PCI7&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |OC0A_OCM_PI7&lt;br /&gt;
 |PWM01: 4&lt;br /&gt;
 |frei&lt;br /&gt;
 |-&lt;br /&gt;
 |PC0&lt;br /&gt;
 |A8&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_PC0&lt;br /&gt;
 |PC01: 2&lt;br /&gt;
 |XMEM A8, frei&lt;br /&gt;
 |-&lt;br /&gt;
 |PC1&lt;br /&gt;
 |A9&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_PC1&lt;br /&gt;
 |PC01: 1&lt;br /&gt;
 |XMEM A9, frei&lt;br /&gt;
 |-&lt;br /&gt;
 |PC2&lt;br /&gt;
 |A10&lt;br /&gt;
 |Out&lt;br /&gt;
 |&lt;br /&gt;
 |0&lt;br /&gt;
 |&lt;br /&gt;
 |SLED1&lt;br /&gt;
 |&lt;br /&gt;
 |Status LED SL1&lt;br /&gt;
 |-&lt;br /&gt;
 |PC3&lt;br /&gt;
 |A11&lt;br /&gt;
 |Out&lt;br /&gt;
 |&lt;br /&gt;
 |0&lt;br /&gt;
 |&lt;br /&gt;
 |SLED2&lt;br /&gt;
 |&lt;br /&gt;
 |Status LED SL2&lt;br /&gt;
 |-&lt;br /&gt;
 |PC4&lt;br /&gt;
 |A12&lt;br /&gt;
 |Out&lt;br /&gt;
 |&lt;br /&gt;
 |0&lt;br /&gt;
 |&lt;br /&gt;
 |SLED3&lt;br /&gt;
 |&lt;br /&gt;
 |Status LED SL3&lt;br /&gt;
 |-&lt;br /&gt;
 |PC5&lt;br /&gt;
 |A13&lt;br /&gt;
 |Out&lt;br /&gt;
 |&lt;br /&gt;
 |0&lt;br /&gt;
 |&lt;br /&gt;
 |SLED4&lt;br /&gt;
 |&lt;br /&gt;
 |Status LED SL4&lt;br /&gt;
 |-&lt;br /&gt;
 |PC6&lt;br /&gt;
 |A14&lt;br /&gt;
 |Out&lt;br /&gt;
 |&lt;br /&gt;
 |0&lt;br /&gt;
 |&lt;br /&gt;
 |WLAN_GPIO14_OUT *&lt;br /&gt;
 |&lt;br /&gt;
 |WLAN Output GPIO14&lt;br /&gt;
 |-&lt;br /&gt;
 |PC7&lt;br /&gt;
 |A15&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |WLAN_GPIO8_IN **&lt;br /&gt;
 |&lt;br /&gt;
 |WLAN Input GPIO8&lt;br /&gt;
 |-&lt;br /&gt;
 |PD0&lt;br /&gt;
 |SCL/INT0&lt;br /&gt;
 |In ²&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |I2C-Bus&lt;br /&gt;
 |SCL&lt;br /&gt;
 |XBUS: 10&lt;br /&gt;
 |XBUS SCL&lt;br /&gt;
 |-&lt;br /&gt;
 |PD1&lt;br /&gt;
 |SDA/INT1&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |I2C-Bus&lt;br /&gt;
 |SDA&lt;br /&gt;
 |XBUS: 12&lt;br /&gt;
 |XBUS SDA&lt;br /&gt;
 |-&lt;br /&gt;
 |PD2&lt;br /&gt;
 |RXD1/INT2&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |UART1&lt;br /&gt;
 |RXD1&lt;br /&gt;
 |USPI15: 8&lt;br /&gt;
 |USART1 RX, frei&lt;br /&gt;
 |-&lt;br /&gt;
 |PD3&lt;br /&gt;
 |TXD1/INT3&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |UART1&lt;br /&gt;
 |TXD1&lt;br /&gt;
 |USPI15: 6&lt;br /&gt;
 |USART1 TX, frei&lt;br /&gt;
 |-&lt;br /&gt;
 |PD4&lt;br /&gt;
 |ICP1&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_PD4_ICP1&lt;br /&gt;
 |PWM01: 1&lt;br /&gt;
 |frei&lt;br /&gt;
 |-&lt;br /&gt;
 |PD5&lt;br /&gt;
 |XCK1&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_PD5_XCK1&lt;br /&gt;
 |USPI15: 4&lt;br /&gt;
 |frei&lt;br /&gt;
 |-&lt;br /&gt;
 |PD6&lt;br /&gt;
 |T1&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_PD6_T1&lt;br /&gt;
 |PWM01: 3&lt;br /&gt;
 |frei&lt;br /&gt;
 |-&lt;br /&gt;
 |PD7&lt;br /&gt;
 |T0&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_PD7_T2&lt;br /&gt;
 |PWM01: 6&lt;br /&gt;
 |frei&lt;br /&gt;
 |-&lt;br /&gt;
 |PE0&lt;br /&gt;
 |RXD0/PCI8&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |UART0&lt;br /&gt;
 |RXD0&lt;br /&gt;
 |PROGU: 2&lt;br /&gt;
 |USART RX&lt;br /&gt;
 |-&lt;br /&gt;
 |PE1&lt;br /&gt;
 |TXD0&lt;br /&gt;
 |Out&lt;br /&gt;
 |&lt;br /&gt;
 |0&lt;br /&gt;
 |UART0&lt;br /&gt;
 |TXD0&lt;br /&gt;
 |PROGU: 3&lt;br /&gt;
 |USART TX&lt;br /&gt;
 |-&lt;br /&gt;
 |PE2&lt;br /&gt;
 |XCK0/AIN0&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_PE2_XCK0_AIN0&lt;br /&gt;
 |ADCIO2: 8&lt;br /&gt;
 |frei&lt;br /&gt;
 |-&lt;br /&gt;
 |PE3&lt;br /&gt;
 |OC3A/AIN1&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_PE3_OC3A_AIN1&lt;br /&gt;
 |ADCIO2: 4&lt;br /&gt;
 |frei&lt;br /&gt;
 |-&lt;br /&gt;
 |PE4&lt;br /&gt;
 |OC3B/INT4&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_PE4_OC3B_I4&lt;br /&gt;
 |PWM23: 9&lt;br /&gt;
 |frei&lt;br /&gt;
 |-&lt;br /&gt;
 |PE5&lt;br /&gt;
 |OC3C/INT5&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_PE5_OC3C_I5&lt;br /&gt;
 |PWM23: 4&lt;br /&gt;
 |frei&lt;br /&gt;
 |-&lt;br /&gt;
 |PE6&lt;br /&gt;
 |T3/INT6&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_PE6_T3_I6&lt;br /&gt;
 |PWM23: 3&lt;br /&gt;
 |frei&lt;br /&gt;
 |-&lt;br /&gt;
 |PE7&lt;br /&gt;
 |CLKO/ICP3/INT7&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_PE7_ICP3_I7&lt;br /&gt;
 |PWM23: 1&lt;br /&gt;
 |frei&lt;br /&gt;
 |-&lt;br /&gt;
 |PF0&lt;br /&gt;
 |ADC0&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_ADC0&lt;br /&gt;
 |ADCIO1: 3&lt;br /&gt;
 |ADC_0 (frei)&lt;br /&gt;
 |-&lt;br /&gt;
 |PF1&lt;br /&gt;
 |ADC1&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_ADC1&lt;br /&gt;
 |ADCIO1: 1&lt;br /&gt;
 |ADC_1 (frei)&lt;br /&gt;
 |-&lt;br /&gt;
 |PF2&lt;br /&gt;
 |ADC2&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_ADC2&lt;br /&gt;
 |ADCIO1: 5&lt;br /&gt;
 |ADC_2 (frei)&lt;br /&gt;
 |-&lt;br /&gt;
 |PF3&lt;br /&gt;
 |ADC3&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_ADC3&lt;br /&gt;
 |ADCIO1: 7&lt;br /&gt;
 |ADC_3 (frei)&lt;br /&gt;
 |-&lt;br /&gt;
 |PF4&lt;br /&gt;
 |ADC4/TCK&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |JTAG&lt;br /&gt;
 |IO_ADC4&lt;br /&gt;
 |ADCIO1: 9&lt;br /&gt;
 |ADC_4 (frei)&lt;br /&gt;
 |-&lt;br /&gt;
 |PF5&lt;br /&gt;
 |ADC5/TMS&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |JTAG&lt;br /&gt;
 |IO_ADC5&lt;br /&gt;
 |ADCIO1: 11&lt;br /&gt;
 |ADC_5 (frei)&lt;br /&gt;
 |-&lt;br /&gt;
 |PF6&lt;br /&gt;
 |ADC6/TDO&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |JTAG&lt;br /&gt;
 |IO_ADC6&lt;br /&gt;
 |ADCIO1: 12&lt;br /&gt;
 |ADC_6 (frei)&lt;br /&gt;
 |-&lt;br /&gt;
 |PF7&lt;br /&gt;
 |ADC7/TDI&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |JTAG&lt;br /&gt;
 |IO_ADC7&lt;br /&gt;
 |ADCIO1: 13&lt;br /&gt;
 |ADC_7 (frei)&lt;br /&gt;
 |-&lt;br /&gt;
 |PG0&lt;br /&gt;
 |WR&lt;br /&gt;
 |Out&lt;br /&gt;
 |&lt;br /&gt;
 |0&lt;br /&gt;
 |&lt;br /&gt;
 |DISP_WR&lt;br /&gt;
 |DISPIO: 5&lt;br /&gt;
 |Display WR&lt;br /&gt;
 |-&lt;br /&gt;
 |PG1&lt;br /&gt;
 |RD&lt;br /&gt;
 |Out&lt;br /&gt;
 |&lt;br /&gt;
 |0&lt;br /&gt;
 |&lt;br /&gt;
 |DISP_EN_RD&lt;br /&gt;
 |DISPIO: 6&lt;br /&gt;
 |Display RD&lt;br /&gt;
 |-&lt;br /&gt;
 |PG2&lt;br /&gt;
 |ALE&lt;br /&gt;
 |Out&lt;br /&gt;
 |&lt;br /&gt;
 |0&lt;br /&gt;
 |&lt;br /&gt;
 |DISP_RS_ALE&lt;br /&gt;
 |DISPIO: 4&lt;br /&gt;
 |Display ALE&lt;br /&gt;
 |-&lt;br /&gt;
 |PG3&lt;br /&gt;
 |TOSC2&lt;br /&gt;
 |In&lt;br /&gt;
 |1 &amp;quot;&amp;quot;&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |BUTTON_SW2&lt;br /&gt;
 |&lt;br /&gt;
 |Taster SW2&lt;br /&gt;
 |-&lt;br /&gt;
 |PG4&lt;br /&gt;
 |TOSC1&lt;br /&gt;
 |In&lt;br /&gt;
 |1 &amp;quot;&amp;quot;&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |BUTTON_SW1&lt;br /&gt;
 |&lt;br /&gt;
 |Taster SW1&lt;br /&gt;
 |-&lt;br /&gt;
 |PG5&lt;br /&gt;
 |OC0B&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_OC0B&lt;br /&gt;
 |PWM01: 5&lt;br /&gt;
 |frei&lt;br /&gt;
 |-&lt;br /&gt;
 |PH0&lt;br /&gt;
 |RXD2&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |UART2&lt;br /&gt;
 |RXD2&lt;br /&gt;
 |USPI24: 8&lt;br /&gt;
 |USART2 RX, frei&lt;br /&gt;
 |-&lt;br /&gt;
 |PH1&lt;br /&gt;
 |TXD2&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |UART2&lt;br /&gt;
 |TXD2&lt;br /&gt;
 |USPI24: 6&lt;br /&gt;
 |USART2 TX, frei&lt;br /&gt;
 |-&lt;br /&gt;
 |PH2&lt;br /&gt;
 |XCK2&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_PH2_XCK2&lt;br /&gt;
 |USPI24: 4&lt;br /&gt;
 |frei&lt;br /&gt;
 |-&lt;br /&gt;
 |PH3&lt;br /&gt;
 |OC4A&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_PH3_OC4A&lt;br /&gt;
 |USPI24: 9&lt;br /&gt;
 |frei&lt;br /&gt;
 |-&lt;br /&gt;
 |PH4&lt;br /&gt;
 |OC4B&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_PH4_OC4B&lt;br /&gt;
 |USPI24: 7&lt;br /&gt;
 |frei&lt;br /&gt;
 |-&lt;br /&gt;
 |PH5&lt;br /&gt;
 |OC4C&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_PH5_OC4C&lt;br /&gt;
 |USPI24: 5&lt;br /&gt;
 |frei&lt;br /&gt;
 |-&lt;br /&gt;
 |PH6&lt;br /&gt;
 |OC2B&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_PH6_OC2B&lt;br /&gt;
 |PWM23: 7&lt;br /&gt;
 |frei&lt;br /&gt;
 |-&lt;br /&gt;
 |PH7&lt;br /&gt;
 |T4&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_PH7_T4&lt;br /&gt;
 |USPI24: 3&lt;br /&gt;
 |frei&lt;br /&gt;
 |-&lt;br /&gt;
 |PJ0&lt;br /&gt;
 |RXD3/PCI9&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |UART3&lt;br /&gt;
 |WLAN_RXD3 **&lt;br /&gt;
 |&lt;br /&gt;
 |WLAN USART RX&lt;br /&gt;
 |-&lt;br /&gt;
 |PJ1&lt;br /&gt;
 |TXD3/PCI10&lt;br /&gt;
 |Out&lt;br /&gt;
 |&lt;br /&gt;
 |0&lt;br /&gt;
 |UART3&lt;br /&gt;
 |WLAN_TXD3 *&lt;br /&gt;
 |&lt;br /&gt;
 |WLAN USART TX&lt;br /&gt;
 |-&lt;br /&gt;
 |PJ2&lt;br /&gt;
 |XCK3/PCI11&lt;br /&gt;
 |Out&lt;br /&gt;
 |&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |WLAN_RTS *&lt;br /&gt;
 |&lt;br /&gt;
 |WLAN Output RTS&lt;br /&gt;
 |-&lt;br /&gt;
 |PJ3&lt;br /&gt;
 |PCI12&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |INT1_PI12&lt;br /&gt;
 |XBUS: 8&lt;br /&gt;
 |XBUS INT1&lt;br /&gt;
 |-&lt;br /&gt;
 |PJ4&lt;br /&gt;
 |PCI13&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |INTU_PI13&lt;br /&gt;
 |XBUS: 7&lt;br /&gt;
 |XBUS INTU&lt;br /&gt;
 |-&lt;br /&gt;
 |PJ5&lt;br /&gt;
 |PCI14&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |INT3_PI14&lt;br /&gt;
 |XBUS: 9&lt;br /&gt;
 |XBUS INT3&lt;br /&gt;
 |-&lt;br /&gt;
 |PJ6&lt;br /&gt;
 |PCI15&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |INT2_PI15&lt;br /&gt;
 |XBUS: 11&lt;br /&gt;
 |XBUS INT2&lt;br /&gt;
 |-&lt;br /&gt;
 |PJ7&lt;br /&gt;
 |&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |WLAN_CTS **&lt;br /&gt;
 |&lt;br /&gt;
 |WLAN Input CTS&lt;br /&gt;
 |-&lt;br /&gt;
 |PK0&lt;br /&gt;
 |ADC8/PCI16&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_ADC8_PI16&lt;br /&gt;
 |ADCIO2: 1&lt;br /&gt;
 |ADC_8 (frei)&lt;br /&gt;
 |-&lt;br /&gt;
 |PK1&lt;br /&gt;
 |ADC9/PCI17&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_ADC9_PI17&lt;br /&gt;
 |ADCIO2: 3&lt;br /&gt;
 |ADC_9 (frei)&lt;br /&gt;
 |-&lt;br /&gt;
 |PK2&lt;br /&gt;
 |ADC10/PCI18&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_ADC10_PI18&lt;br /&gt;
 |ADCIO2: 5&lt;br /&gt;
 |ADC_10 (frei)&lt;br /&gt;
 |-&lt;br /&gt;
 |PK3&lt;br /&gt;
 |ADC11/PCI19&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_ADC11_PI19&lt;br /&gt;
 |ADCIO2: 7&lt;br /&gt;
 |ADC_11 (frei)&lt;br /&gt;
 |-&lt;br /&gt;
 |PK4&lt;br /&gt;
 |ADC12/PCI20&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_ADC12_PI20&lt;br /&gt;
 |ADCIO2: 9&lt;br /&gt;
 |ADC_12 (frei)&lt;br /&gt;
 |-&lt;br /&gt;
 |PK5&lt;br /&gt;
 |ADC13/PCI21&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_ADC13_PI21&lt;br /&gt;
 |PWM01: 8&lt;br /&gt;
 |ADC_13 (frei)&lt;br /&gt;
 |-&lt;br /&gt;
 |PK6&lt;br /&gt;
 |ADC14/PCI22&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_ADC14_PI22&lt;br /&gt;
 |PWM23: 8&lt;br /&gt;
 |ADC_14 (frei)&lt;br /&gt;
 |-&lt;br /&gt;
 |PK7&lt;br /&gt;
 |ADC15/PCI23&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_ADC15_PI23&lt;br /&gt;
 |PWM23: 6&lt;br /&gt;
 |ADC_15 (frei)&lt;br /&gt;
 |-&lt;br /&gt;
 |PL0&lt;br /&gt;
 |ICP4&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_PL0_ICP4&lt;br /&gt;
 |USPI24: 1&lt;br /&gt;
 |frei&lt;br /&gt;
 |-&lt;br /&gt;
 |PL1&lt;br /&gt;
 |ICP5&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_PL1_ICP5&lt;br /&gt;
 |USPI15: 1&lt;br /&gt;
 |frei&lt;br /&gt;
 |-&lt;br /&gt;
 |PL2&lt;br /&gt;
 |T5&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_PL2_T5&lt;br /&gt;
 |USPI15: 3&lt;br /&gt;
 |frei&lt;br /&gt;
 |-&lt;br /&gt;
 |PL3&lt;br /&gt;
 |OC5A&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_PL3_OC5A&lt;br /&gt;
 |USPI15: 5&lt;br /&gt;
 |frei&lt;br /&gt;
 |-&lt;br /&gt;
 |PL4&lt;br /&gt;
 |OC5B&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_PL4_OC5B&lt;br /&gt;
 |USPI15: 9&lt;br /&gt;
 |frei&lt;br /&gt;
 |-&lt;br /&gt;
 |PL5&lt;br /&gt;
 |OC5C&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_PL5_OC5C&lt;br /&gt;
 |USPI15: 7&lt;br /&gt;
 |frei&lt;br /&gt;
 |-&lt;br /&gt;
 |PL6&lt;br /&gt;
 |&lt;br /&gt;
 |Out&lt;br /&gt;
 |³&lt;br /&gt;
 |0&lt;br /&gt;
 |&lt;br /&gt;
 |WLAN_WAKE&lt;br /&gt;
 |&lt;br /&gt;
 |WLAN Output WAKE&lt;br /&gt;
 |-&lt;br /&gt;
 |PL7&lt;br /&gt;
 |&lt;br /&gt;
 |Out&lt;br /&gt;
 |²&lt;br /&gt;
 |0&lt;br /&gt;
 |&lt;br /&gt;
 |WLAN_RESET&lt;br /&gt;
 |&lt;br /&gt;
 |WLAN Output RESET&lt;br /&gt;
 |-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
 Zeichen:&lt;br /&gt;
 *    Verbunden mit einem Eingang des I2C-Pegelwandlers NC7WZ16&lt;br /&gt;
 **   Verbunden mit einem Ausgang des I2C-Pegelwandlers NC7WZ16&lt;br /&gt;
 ***  Verbunden mit einem Ausgang des I2C-Pegelwandlers NC7WZ16&lt;br /&gt;
      über Widerstand 680 Ohm (R7)&lt;br /&gt;
 &lt;br /&gt;
 ²    Verbunden mit Pulldown 10 kOhm (R22) und MOSFET Gate (Q2)&lt;br /&gt;
 ³    Verbunden mit Spannungsteiler 68 / 100 kOhm (R21 / R23)&lt;br /&gt;
 &amp;quot;&amp;quot;   Verbunden mit Pullup-Widerstand 68 kOhm (und Taster nach GND)&lt;br /&gt;
 &lt;br /&gt;
 Kürzel (Spalte Name):&lt;br /&gt;
 PCIx     PCINTx&lt;br /&gt;
 &lt;br /&gt;
 Abkürzungen der IO-Stecker (Spalte Stecker):&lt;br /&gt;
 PWM01    IO_PWM/T0/T1&lt;br /&gt;
 PWM23    IO_PWM/T2/T3&lt;br /&gt;
 USPI15   UART_SPI1/T5&lt;br /&gt;
 USPI24   UART_SPI2/T4&lt;br /&gt;
 ADCIO1   ADC_IO1&lt;br /&gt;
 ADCIO2   ADC_IO2/CMP&lt;br /&gt;
 DISPIO   DISPLAY/IO&lt;br /&gt;
 PC01     PC0/1&lt;br /&gt;
 PROGU    PROG_UART&lt;br /&gt;
&lt;br /&gt;
======Timer-Nutzung======&lt;br /&gt;
&lt;br /&gt;
=====RP6M256uart=====&lt;br /&gt;
=====RP6M256_I2CMaster=====&lt;br /&gt;
=====RP6M256_WIFI=====&lt;br /&gt;
=====SDC=====&lt;br /&gt;
&lt;br /&gt;
====Projekte====&lt;br /&gt;
* Library:&lt;br /&gt;
** [http://www.roboternetz.de/community/threads/58744-RP6-M256-WIFI-Clock-Library RP6 M256 WIFI: Clock Library]&lt;br /&gt;
** [http://www.roboternetz.de/community/threads/58848-RP6-M256-WIFI-DCF77-Library RP6 M256 WIFI: DCF77 Library]&lt;br /&gt;
** [http://www.roboternetz.de/community/threads/66003-Peter-Fleury-s-I2C-Master-Library-f%C3%BCr-RP6 Peter Fleury's I2C Master Library für RP6]&lt;br /&gt;
** [http://www.roboternetz.de/community/threads/66586-RP6v2-Base-CONTROL-M32-M256-WiFi-100%C2%B5s-Stopwatches-Library Library für acht 100µs Stopwatches]&lt;br /&gt;
* Fernbedienung mit dem Browser (Demo):&lt;br /&gt;
** [http://www.roboternetz.de/community/threads/58162-Diskussion-zum-RP6-M256-WIFI-Modul?p=555102&amp;amp;viewfull=1#post555102 LED-Ansteuerung mit dem Browser]&lt;br /&gt;
** [http://www.roboternetz.de/community/threads/58162-Diskussion-zum-RP6-M256-WIFI-Modul?p=555651&amp;amp;viewfull=1#post555651 LEDs setzen und Daten der Browseranforderung anzeigen]&lt;br /&gt;
* I2C-Master für RP6Control M32 und RP6v2 Base (Demos, Library):&lt;br /&gt;
** [http://www.rn-wissen.de/index.php/RP6Control_M32:_I2C-Slave RP6Control M32 I2C-Slave]&lt;br /&gt;
* MultiIO Projekt (Demos, Library):&lt;br /&gt;
** [[RP6 Multi IO Projekt - Software#RP6_M256_WIFI|RP6 Multi IO Projekt - Software RP6 M256 WIFI]]&lt;br /&gt;
* ArduIO Projekt (Demos, Library):&lt;br /&gt;
** [http://rn-wissen.de/wiki/index.php/RP6_ArduIO_-_Software ArduIO Projekt - Software]&lt;br /&gt;
* Fernbedienung mit einer Android App (Demo):&lt;br /&gt;
** [http://www.roboternetz.de/community/threads/65626-RP6-WIFI-und-Wireless-IMU-%28f%C3%BCr-Android%29 RP6 WIFI und Wireless IMU (für Android)]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===RP6 Sensor Board===&lt;br /&gt;
&lt;br /&gt;
'''Die Beschreibung zur Programmierung des RP6 Sensor Boards wurde ausgelagert in einen eigenen [[RP6_Sensor_Board_und_Xtra_Module#RP6_Sensor_Board_3|Artikel]]!'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Erfahrungsberichte==&lt;br /&gt;
&lt;br /&gt;
...in Arbeit...(kann aber gerne ergänzt werden)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Siehe auch==&lt;br /&gt;
* [[RP6]]&lt;br /&gt;
* [[RP6 - Programmierung]]&lt;br /&gt;
* [[RP6 Sensor Board und Xtra Module]]&lt;br /&gt;
* [[RP6 Kamera - Mitmach-Projekt]]&lt;br /&gt;
* [[RP6v2 I2C-Portexpander]]&lt;br /&gt;
* [[RP6v2 USB-RS232-Adapter]]&lt;br /&gt;
* [[RP6v2 Orientierung]]&lt;br /&gt;
* [[RP6 Multi IO Projekt]]&lt;br /&gt;
* [[RP6 Multi IO Projekt - Software]]&lt;br /&gt;
* [[RP6 ArduIO]]&lt;br /&gt;
* [[RP6 ArduIO - Software]]&lt;br /&gt;
* [[Induktive_Ladestation_f%C3%BCr_den_RP6|Induktive Ladestation für den RP6]]&lt;br /&gt;
* [[IR-bake_f%C3%BCr_den_RP6|IR-bake für den RP6]]&lt;br /&gt;
* [[CCRP5]]&lt;br /&gt;
* [[Wild Thumper]]&lt;br /&gt;
* [[Wild Thumper - Programmierung]]&lt;br /&gt;
* [[Yeti]]&lt;br /&gt;
* [[Asuro]]&lt;br /&gt;
* [[C't-Bot]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Weblinks==&lt;br /&gt;
'''Siehe auch die Weblinks im [http://www.rn-wissen.de/index.php/RP6#Weblinks RP6 Artikel]!'''&lt;br /&gt;
&lt;br /&gt;
* Ankündigung des RP6v2 im [http://www.roboternetz.de/community/threads/56964-NEWS-RP6v2-die-neue-Version-2-des-RP6-Robot-Systems RoboterNETZ] und im [http://www.arexx.com/forum/viewtopic.php?f=19&amp;amp;t=1778 AREXX Support Forum]&lt;br /&gt;
* Ankündigung der RP6v2 M256 WiFi und der Testaktion im [http://www.arexx.com/forum/viewtopic.php?f=19&amp;amp;t=1797 AREXX Support Forum]&lt;br /&gt;
* Beginn der &amp;quot;Testaktion: Kostenlose RP6v2-M256-WIFI Module!&amp;quot; im [http://www.roboternetz.de/community/threads/58161-Kostenlose-RP6-M256-WIFI-Module-für-Testanwender! Roboternetz RP6 Forum]&lt;br /&gt;
* Ende der &amp;quot;Testaktion: Kostenlose RP6v2-M256-WIFI Module!&amp;quot; nach Abstimmung im [http://www.roboternetz.de/community/threads/58389-Wählt-Gewinner-der-RP6v2-M256-WIFI-Module Roboternetz RP6 Forum]&lt;br /&gt;
* Newsartikel zur RP6v2 M256 WiFi im [http://www.roboternetz.de/community/threads/58160-Funk-Erweiterungsmodul-für-den-RP6-und-RP6v2-Gratis-für-Tester! RoboterNETZ]&lt;br /&gt;
* Diskussions-Thread zur RP6v2 M256 WiFi im [http://www.roboternetz.de/community/threads/58162-Diskussion-zum-RP6-M256-WIFI-Modul Roboternetz RP6 Forum]&lt;br /&gt;
* Diskussions-Thread zur RP6v2 M256 WiFi [http://www.roboternetz.de/community/threads/59739-Probleme-mit-M256-WIFI-1-2 mit &amp;quot;altem&amp;quot; Bootloader V1.2]&lt;br /&gt;
&lt;br /&gt;
* [http://www.arexx.com/rp6/downloads/RP6M256_WIFI_BOOTLOADER.zip RP6M256_WIFI_BOOTLOADER]&lt;br /&gt;
* [http://arexx.com/rp6/downloads/RP6M256_baudrate_test.zip RP6v2 M256 WiFi Baudraten Test]&lt;br /&gt;
* [http://www.arexx.com/rp6/downloads/rp6m256_wlan_config_de.txt RP6v2 M256 WiFi Liste mit möglichen Problemlösungen]&lt;br /&gt;
* Kleinserie: [http://www.roboternetz.de/community/threads/59797-Kleinserie-hardware-für-die-M256-WIFI Hardware für die RP6v2 M256 WiFi ('''RP6 Multi IO Projekt''')]&lt;br /&gt;
* Kleinserie: [http://www.roboternetz.de/community/threads/65296-I-O-ADC-und-DAC-Erweiterung-f%C3%BCr-RP6-3-3V-und-5V%21 I/O-, ADC- und DAC Erweiterung für RP6??? 3,3V und 5V!? ('''RP6 ArduIO Projekt''')]&lt;br /&gt;
* JM3 Engeneering: [http://www.jm3-engineering.com/rp6.htm RP6 Roboter Erweiterung]&lt;br /&gt;
* Ankündigung einer Sensorerweiterungsplatine für die RP6v2 M256 WiFi im [http://www.roboternetz.de/community/threads/63595-Neue-Hardware-f%C3%BCr-RP6%28v2%29?p=590129&amp;amp;viewfull=1#post590129 Roboternetz RP6 Forum]&lt;br /&gt;
* Erfahrungsbericht zur Sensorerweiterungsplatine im [http://www.arexx.com/forum/viewtopic.php?f=19&amp;amp;t=2498 AREXX Support Forum] und im [http://www.roboternetz.de/community/threads/64414-RP6-Sensor-Board-Erster-Eindruck Roboternetz RP6 Forum]&lt;br /&gt;
&lt;br /&gt;
* [http://www.rn-wissen.de/index.php/RP6_mit_AVR_Studio RP6 mit AVR Studio]&lt;br /&gt;
&lt;br /&gt;
* [http://www.arexx.com/rp6 AREXX RP6 Startseite]&lt;br /&gt;
* [http://www.arexx.com/forum/viewforum.php?f=19 AREXX Support Forum]&lt;br /&gt;
&lt;br /&gt;
* [http://www.conrad.de/ce/de/product/191584/RP6-V2-ROBOTERSYSTEM RP6v2 bei CONRAD]&lt;br /&gt;
* [http://www.conrad.de/ce/de/product/191550/RP6-MEGA32-ERWEITERUNGSSATZ RP6 CONTROL M32 bei CONRAD]&lt;br /&gt;
* [http://www.conrad.de/ce/de/product/191563/RP6-CC-PRO-MEGA128-ERWEITERUNGSSATZ RP6 CCPRO M128 bei CONRAD]&lt;br /&gt;
* [http://www.conrad.de/ce/de/product/191609/Arexx-RP6-V2-Control-M256-WiFi-Kit-RP6v2-M256-WIFI RP6v2 M256 WiFi bei CONRAD]&lt;br /&gt;
* [http://www.conrad.de/ce/de/product/1082384/Arexx-RP6-Sensor-Board-RP6-JM03-61 RP6 Sensor Board bei CONRAD]&lt;br /&gt;
&lt;br /&gt;
* [http://www.microchip.com/wwwproducts/Devices.aspx?dDocName=en558370 WiFi-Modul RN-171] der RP6v2 M256 WiFi&lt;br /&gt;
* [http://www.arexx.com/rp6/downloads/RP6_M256_WIFI_MANUAL_DE_20120711.zip 1. Bedienungsanleitung] der RP6v2 M256 WiFi&lt;br /&gt;
&lt;br /&gt;
* [http://www.roboternetz.de/phpBB2/viewforum.php?f=49 Roboternetz RP6 Forum]&lt;br /&gt;
* &amp;quot;Geburt&amp;quot; des Wiki im RN-Forum: [http://www.roboternetz.de/community/threads/32793-RP6-Wiki-Artikel RP6-Wiki-Artikel]&lt;br /&gt;
* Roboter RoboPalm RP6: [http://www.ionix.de/doku.php/rp6/start Link]&lt;br /&gt;
&lt;br /&gt;
* [http://www.youtube.com/results?search_query=rp6 RP6 Videos]&lt;br /&gt;
* [http://de-de.facebook.com/pages/Robby-RP6/155118711202285 facebook]&lt;br /&gt;
* Abkündigung des RP6v2 im [https://www.roboternetz.de/community/threads/72730-Ende-des-RP6-Robotersystems-nach-fast-11-1-2-Jahren RoboterNETZ] &lt;br /&gt;
'''Siehe auch die Weblinks im [http://www.rn-wissen.de/index.php/RP6_Sensor_Board_und_Xtra_Module#Weblinks RP6 Sensor Board und Xtra Module Artikel]!'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Kategorie:Robotikeinstieg]]	 &lt;br /&gt;
[[Kategorie:Praxis]]&lt;br /&gt;
&lt;br /&gt;
==Autoren==&lt;br /&gt;
--[http://www.roboternetz.de/community/members/1972-Dirk Dirk] 15:35, 31. Mär 2022 (CET)&lt;/div&gt;</summary>
		<author><name>Dirk NO2</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=RP6v2&amp;diff=28586</id>
		<title>RP6v2</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=RP6v2&amp;diff=28586"/>
				<updated>2022-03-31T13:34:01Z</updated>
		
		<summary type="html">&lt;p&gt;Dirk NO2: /* RP6v2 Drehgeber-Satz RP6-ENCv2 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Bild:rp6v2_2.jpg|RP6v2 Base Roboter|right|500px]]&lt;br /&gt;
==Was bisher geschah==&lt;br /&gt;
'''Siehe auch &amp;quot;Was bisher geschah&amp;quot; im [http://www.rn-wissen.de/index.php/RP6#Was_bisher_geschah RP6 Artikel]!'''&lt;br /&gt;
&lt;br /&gt;
Mon, 27. Feb 2012 - Ankündigung des '''RP6v2'''&amp;lt;br/&amp;gt;&lt;br /&gt;
Don, 08. Mär 2012 - Auslieferungsbeginn des RP6v2&amp;lt;br/&amp;gt;&lt;br /&gt;
Sam, 17. Mär 2012 - Ankündigung der '''[[RP6v2#RP6v2_M256_WiFi_Platine|RP6v2 M256 WiFi]]'''&amp;lt;br/&amp;gt;&lt;br /&gt;
Mon, 11. Jun 2012 - Beginn der &amp;quot;Testaktion: Kostenlose RP6v2-M256-WIFI Module!&amp;quot;&amp;lt;br/&amp;gt;&lt;br /&gt;
Die, 10. Jul 2012 - Ende der &amp;quot;Testaktion: Kostenlose RP6v2-M256-WIFI Module!&amp;quot; nach Abstimmung&amp;lt;br/&amp;gt;&lt;br /&gt;
Mit, 11. Jul 2012 - Veröffentlichung der RP6v2 M256 WiFi Bedienungsanleitung&amp;lt;br/&amp;gt;&lt;br /&gt;
Die, 17. Jul 2012 - Eintreffen der kostenlosen RP6v2 M256 WiFi bei den Testern&amp;lt;br/&amp;gt;&lt;br /&gt;
Mit, 25. Jul 2012 - Auslieferungsbeginn der RP6v2 M256 WiFi&amp;lt;br/&amp;gt;&lt;br /&gt;
Don, 01. Nov 2012 - Im Oktober 2012 Auslieferung einiger RP6v2 M256 WiFi mit &amp;quot;altem&amp;quot; Bootloader V1.2&amp;lt;br/&amp;gt;&lt;br /&gt;
Don, 11. Dez 2014 - Im 2. bis 4. Quartal 2014 Auslieferung einiger [http://www.arexx.com/forum/viewtopic.php?f=19&amp;amp;t=2618 USB Interfaces mit gefälschtem FTDI Chip]&amp;lt;br/&amp;gt;&lt;br /&gt;
Sam, 02. Jan 2016 - Unter der Bezeichnung '''[[RP6v2#Arexx_RP6-Xtra_Robotersystem|Arexx RP6-Xtra Robotersystem]]''' ist ein Set bestehend aus dem RP6, einer Experimentierplatine, einem RP6v2 Drehgeber-Satz und einem RP6 USB-Interface lieferbar&amp;lt;br/&amp;gt;&lt;br /&gt;
Mon, 12. Mär 2018 - Seit dem 1. Quartal 2018 ist das Arexx RP6-Xtra Robotersystem bei CONRAD ausverkauft&amp;lt;br/&amp;gt;&lt;br /&gt;
Sam, 31. Mär 2018 - Seit Ende März 2018 ist die RP6v2 M256 WiFi Zusatzpatine bei CONRAD ausverkauft&amp;lt;br/&amp;gt;&lt;br /&gt;
Mit, 12. Sep 2018 - Seit September 2018 ist das [[RP6#Displays|LC-Display]] bei CONRAD ausverkauft&amp;lt;br/&amp;gt;&lt;br /&gt;
Mit, 28. Nov 2018 - Seit November 2018 ist der RP6v2 bei CONRAD ausverkauft&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Siehe auch &amp;quot;Was bisher geschah&amp;quot; im [http://www.rn-wissen.de/index.php/RP6_Sensor_Board_und_Xtra_Module#Was_bisher_geschah RP6 Sensor Board und Xtra Module Artikel]!'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Allgemein==&lt;br /&gt;
Der RP6v2 ([http://www.conrad.de/ce/de/product/191584/RP6-V2-ROBOTERSYSTEM/ 191584]) wurde am 27.02.2012 von [http://www.roboternetz.de/community/members/120-SlyD SlyD] angekündigt (siehe Weblinks!). Er ist eine leicht verbesserte Version des [[RP6]]. Der RP6v2 ist softwarekompatibel zum RP6. '''Alle Erweiterungs-Module können auch mit dem RP6v2 eingesetzt werden.'''&lt;br /&gt;
&lt;br /&gt;
 '''Seit November 2018 ist der RP6v2 bei CONRAD ausverkauft.'''&lt;br /&gt;
 '''Damit endet die Ära des RP6 Robotersystems nun endgültig nach fast 11 1/2 Jahren.'''&lt;br /&gt;
&lt;br /&gt;
Dieser Artikel beschreibt die Grundlagen zum RP6v2, '''sofern sie vom RP6 abweichen''', und die Grundlagen und Programmierung seiner zukünftigen Erweiterungs-Module.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Eigenschaften==&lt;br /&gt;
Laut Ankündigung haben sich beim RP6v2 folgende Details gegenüber dem RP6 geändert:&lt;br /&gt;
* Neue Drehgeber&lt;br /&gt;
** Justierung dank neuer Sensortechnik üblicherweise nicht mehr erforderlich&lt;br /&gt;
** leicht zugängliches und deutlich größeres Potentiometer&lt;br /&gt;
** Potis nur noch zur Feinjustierung erforderlich&lt;br /&gt;
* Zusätzliche Steckverbinder (im RP6 schon seit 2010 verbaut)&lt;br /&gt;
** vom Mainboard zu den Drehgebern&lt;br /&gt;
** vom Mainboard zu den Motoren&lt;br /&gt;
* Neue Anschlüsse (Steckverbinder / Stiftleisten)&lt;br /&gt;
** 2 3-polige ADC Anschlüsse mit VDD/GND inkl. zusätzlichem Stützkondensator&lt;br /&gt;
** 2 4-polige VDD Anschlüsse (je 2x +5V und 2x GND)&lt;br /&gt;
** 1 3-poliger +UB Anschluß (1x +UB, 2x GND)&lt;br /&gt;
** 1 5-polige Stiftleiste für den I2C Bus und VDD/GND&lt;br /&gt;
** 1 8-poliger EXT Steckverbinder (JST-Wannenstecker)&lt;br /&gt;
** 2 4-polige Steckverbinder (LIO1/LIO2) für die I/O-Pins von 4 LEDs und VDD/GND&lt;br /&gt;
* Hauptsicherung&lt;br /&gt;
** von 2,5A auf 3,15A erhöht&lt;br /&gt;
* Motortreiber&lt;br /&gt;
** leistungsfähigere und robustere MOSFETs&lt;br /&gt;
* Experimentierplatine&lt;br /&gt;
** gehört nicht mehr zum Lieferumfang&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Technische Änderungen==&lt;br /&gt;
Der RP6v2 weist einige Detail-Änderungen gegenüber der Vorversion auf. '''Diese Änderungen sind für die Nutzung und Programmierung des RP6v2 weitgehend irrelevant.'''&lt;br /&gt;
&lt;br /&gt;
Fast alle passiven SMD-Bauteile sind jetzt in Bauform 0603 bestückt (Ausnahmen: R6 (SP2 C2: R6), Induktivitäten und größere Kondensatoren).&lt;br /&gt;
Im Text gibt es Verweise auf den Schaltplan des RP6v2 (RP6v2_MAINBOARD.pdf) in der Form: (SP2 B1: Bauteil). Dies bedeutet, dass man das Bauteil auf Blatt 2 des RP6v2-Schaltplans im Feld B1 finden kann.&lt;br /&gt;
&lt;br /&gt;
===Mainboard===&lt;br /&gt;
* C14 (SP2 A3: C14) -&amp;gt; Liegt jetzt an VDD (parallel u.a. zu C6..C10)&lt;br /&gt;
* C26 (SP2 A1: C26) -&amp;gt; Jetzt bestückt mit Elko 220uF/16V (laut SP: 470uF/16V!)&lt;br /&gt;
* C29 (SP2 E1: C29) -&amp;gt; Jetzt bestückt mit SMD Kondensator 10uF&lt;br /&gt;
* IO3/IO4 Bestückungsaufdruck geändert in IO4/IO5 (Stecker LIO2)&lt;br /&gt;
* UBAT Bestückungsaufdruck geändert in UBAT_SENSE&lt;br /&gt;
* F2.5A Bestückungsaufdruck geändert in F3.0A (Feinsicherung flink 3,0A)&lt;br /&gt;
* Trennstelle +UB Sensor (siehe Abschnitt 6.4.6 [[RP6#.2BUB_Sensor|+UB Sensor]] des RP6-Artikels!) existiert beim RP6v2 nicht mehr&lt;br /&gt;
* Als Motortreiber (SP3 BCD23: Q1..Q4) werden anstelle von IRF7309 (ID 3,0A; PD 1,4W) die leistungsfähigeren und ESD-geschützten Typen [http://media.digikey.com/pdf/Data%20Sheets/Rohm%20PDFs/SP8M3.pdf SP8M3] (ID 4,5A; PD 2W; Schutzdiode) verwendet&lt;br /&gt;
&lt;br /&gt;
===Encoderplatine===&lt;br /&gt;
Schaltung siehe Datei RP6v2_ENCODERS.pdf!&lt;br /&gt;
* Jetzt mit Operationsverstärker IC2 ([http://ww1.microchip.com/downloads/en/DeviceDoc/21733h.pdf MCP6001U]) anstelle eines Transistors&lt;br /&gt;
* Größeres Potentiometer R2 (200kOhm)&lt;br /&gt;
Die Encoder sind mittlerweile auch einzeln unter der Conrad-Bestellnummer '''[http://www.conrad.de/ce/de/product/191625/RP6-DREHGEBER-SATZ 191625-62]''' verfügbar.&lt;br /&gt;
&lt;br /&gt;
===USB-Interface===&lt;br /&gt;
Schaltung siehe Datei RP6v2_USB_INTERFACE.pdf!&lt;br /&gt;
* C2  -&amp;gt; Jetzt bestückt mit SMD Kondensator 10uF&lt;br /&gt;
* C5  -&amp;gt; Neuer Blockkondensator 100nF an VCCIO von IC1&lt;br /&gt;
&lt;br /&gt;
===Steckverbindungen und Stiftleisten===&lt;br /&gt;
&lt;br /&gt;
====Motoren====&lt;br /&gt;
[[Bild:RP6v2_Motorstecker.JPG|thumb]]&lt;br /&gt;
&lt;br /&gt;
Beim RP6v2 sind die beiden Motorkabel mit 2-poligen Winkelsteckern RM 7,5mm an das Mainboard angeschlossen. &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;
&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;
====Encoder====&lt;br /&gt;
[[Bild:RP6v2_Encoderstecker.JPG|thumb]]&lt;br /&gt;
&lt;br /&gt;
Beim RP6v2 sind die Encoder mit einer JST XH Stiftleiste gewinkelt, 6-polig, RM 2,5mm ([http://www.conrad.de/ce/de/product/740271/Stiftleiste-gewinkelt-RM-25-mm-Serie-XH-Rastermass-25-mm-Pole-6-Nennstrom-3-A-S6B-XH-A-LFSN-JST-Inhalt-1-St 740271]) an das Mainboard angeschlossen.&lt;br /&gt;
&lt;br /&gt;
Auch die 3-polige Verbindung zu den beiden Encoder-Platinen (JST XH Stiftleiste gewinkelt, 3-polig, RM 2,5mm ([http://www.conrad.de/ce/de/product/740174/Stiftleiste-gewinkelt-RM-25-mm-Serie-XH-Rastermass-25-mm-Pole-3-Nennstrom-3-A-S3B-XH-A-LFSN-JST-Inhalt-1-St 740174])) ist steckbar.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====LIO1/LIO2====&lt;br /&gt;
[[Bild:RP6v2_LIO12.JPG|thumb]]&lt;br /&gt;
&lt;br /&gt;
Beim RP6 waren die Anschlüsse der Status-LEDs SL1,2 und SL4,5 ([[RP6#IO1..IO4|IO1..IO4]]) einzeln auf dem Mainboard zu kontaktieren.&lt;br /&gt;
&lt;br /&gt;
Beim RP6v2 gibt es zwei 4-polige Stiftleisten (LIO1, LIO2). Sie führen an den Pins 1 und 2 +5V und GND.&lt;br /&gt;
&lt;br /&gt;
An den Pins 3 und 4 finden sich die Anschlüsse von IO2, IO1 (LIO1) bzw. IO4, IO5 (LIO2).&lt;br /&gt;
&lt;br /&gt;
Bitte beachten: '''Der Bestückungsaufdruck IO4, IO5 des RP6v2 bezeichnet die selben Anschlüsse, wie beim RP6 IO3, IO4!'''&lt;br /&gt;
&lt;br /&gt;
Es handelt sich in beiden Fällen um die Anschlüsse der Status-LEDs SL4 (PB7) und SL5 (PB1).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====ADC0/ADC1====&lt;br /&gt;
[[Bild:RP6v2_ADC01.JPG|thumb]]&lt;br /&gt;
&lt;br /&gt;
Beim RP6 waren die 3-poligen Anschlüsse von ADC0 und ADC1 ([[RP6#Analoge_Sensoren_an_ADC0.2F1|Analoge Sensoren an ADC0/1]]) nicht mit Stiftleisten bestückt.&lt;br /&gt;
&lt;br /&gt;
Dies ist jetzt beim RP6v2 der Fall,- zusätzlich ist auch C26 (SP2 A1: C26) bestückt.&lt;br /&gt;
&lt;br /&gt;
Damit können analoge Sensoren direkt angeschlossen werden.&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;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====I2C/+UB/+5V====&lt;br /&gt;
[[Bild:RP6v2_I2CUB5V.JPG|thumb]]&lt;br /&gt;
&lt;br /&gt;
Die beim RP6 vorhandene 5-polige I2C-Schnittstelle ([[RP6#I2C-Schnittstelle|I2C-Schnittstelle]]) findet sich (jetzt mit Stiftleiste bestückt) genau so auch beim RP6v2.&lt;br /&gt;
&lt;br /&gt;
Bitte beachten: '''Die Anordnung der Pins auf dem Mainboard ist beim RP6v2 umgekehrt wie beim RP6!'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beim RP6 gab es (nicht mit Stiftleisten bestückte) Anschlüsse für VDD und +UB ([[RP6#VDD.2FGND.2F.2BUB_Anschlu.C3.9F|VDD/GND/+UB Anschluß]]).&lt;br /&gt;
&lt;br /&gt;
Beim RP6v2 gibt es jetzt drei Stiftleisten für +UB, +5V (VDD) und GND:&lt;br /&gt;
* Eine 3-polige Stiftleiste mit GND, +UB, GND&lt;br /&gt;
* Zwei 4-polige Stiftleisten jeweils mit GND, +5V, +5V, GND&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;
====EXT====&lt;br /&gt;
[[Bild:RP6v2_EXT.JPG|thumb]]&lt;br /&gt;
&lt;br /&gt;
Beim RP6 war keine Stiftleiste für den 8-poligen EXT Anschluß bestückt.&lt;br /&gt;
&lt;br /&gt;
Beim RP6v2 ist jetzt an dieser Stelle eine JST XH Stiftleiste gerade, 8-polig, RM 2,5mm ([http://www.conrad.de/ce/de/product/740105/Stiftleiste-gerade-RM-25-mm-Serie-XH-Rastermass-25-mm-Pole-8-Nennstrom-3-A-B8B-XH-A-LFSN-JST-Inhalt-1-St 740105]) vorhanden, auf die auch Steckbuchsen (RM 2,54) gesteckt werden können.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beschreibung des EXT Anschlusses: [[RP6#EXT_Anschlu.C3.9F|EXT Anschluß]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Erweiterungs-Module==&lt;br /&gt;
Über die Erweiterungs-Module informiert der Abschnitt [[RP6#Erweiterungs-Module|Erweiterungs-Module]] im RP6 Artikel.&lt;br /&gt;
&lt;br /&gt;
Darüber hinaus sind bei [http://www.conrad.de/ce/ CONRAD] für den RP6v2 erhältlich:&lt;br /&gt;
* RP6v2 M256 WiFi Zusatzplatine ([http://www.conrad.de/ce/de/product/191609/Arexx-RP6-V2-Control-M256-WiFi-Kit-RP6v2-M256-WIFI 191609])&lt;br /&gt;
* RP6 Sensor Board ([http://www.conrad.de/ce/de/product/1082384/Arexx-RP6-Sensor-Board-RP6-JM03-61 1082384])&lt;br /&gt;
&lt;br /&gt;
===RP6v2 M256 WiFi Platine===&lt;br /&gt;
Die RP6v2 M256 WiFi Zusatzplatine ([http://www.conrad.de/ce/de/product/191609/Arexx-RP6-V2-Control-M256-WiFi-Kit-RP6v2-M256-WIFI 191609]) wurde am 17.03.2012 von [http://www.roboternetz.de/community/members/120-SlyD SlyD] angekündigt (siehe Weblink!).&lt;br /&gt;
&lt;br /&gt;
Aktuell (Ende März 2018) ist die RP6v2 M256 WiFi Zusatzplatine bei CONRAD ausverkauft. &lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6v2_M256_WIFI.JPG|Die RP6v2 M256 WiFi]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Beschreibung====&lt;br /&gt;
Laut Ankündigung bietet die RP6v2 M256 WiFi:&lt;br /&gt;
* Atmel ATmega2560 Mikrocontroller&lt;br /&gt;
** 256kB Flash ROM&lt;br /&gt;
** 8kB SRAM&lt;br /&gt;
** 4kB EEPROM&lt;br /&gt;
** 16MHz Taktfrequenz&lt;br /&gt;
** 6 Hardware Timer und 86 I/O Ports&lt;br /&gt;
** Bis zu 16 A/D Wandler Kanäle (10 Bit Auflösung)&lt;br /&gt;
** 12 16 Bit Hardware PWMs&lt;br /&gt;
** 2 USART/SPI Ports&lt;br /&gt;
* Energieeffizientes 802.11g WLAN Modul&lt;br /&gt;
** Typ: Roving Networks RN-171&lt;br /&gt;
** Telemetriedaten übertragen&lt;br /&gt;
** Roboter vom PC aus fernsteuern&lt;br /&gt;
** Neue Programme drahtlos per WLAN in den Mikrocontroller laden&lt;br /&gt;
** Bootloader nachträglich erweitern&lt;br /&gt;
** Einstellung des WLAN Moduls über das RP6 USB Interface mit dem RobotLoader 2.x&lt;br /&gt;
** Änderung der Einstellungen über eine Netzwerkverbindung oder mit dem eigenen Mikrocontrollerprogramm&lt;br /&gt;
** Eigener Prozessor (entlastet den ATmega)&lt;br /&gt;
** Funktioniert mit jedem Standard WLAN Accesspoint/Router&lt;br /&gt;
** Kann als transparente serielle Schnittstelle arbeiten&lt;br /&gt;
** Kann vom PC aus per TCP/IP angesprochen werden&lt;br /&gt;
** 10cm 2.4GHz Antenne mit RP-SMA Anschluß&lt;br /&gt;
* Sonstige Ausstattung&lt;br /&gt;
** 8 Bit Display Port&lt;br /&gt;
** I2C Bus&lt;br /&gt;
** microSD Kartenslot&lt;br /&gt;
** 7 Status LEDs&lt;br /&gt;
** 2 Eingabetaster&lt;br /&gt;
** ISP Anschluß&lt;br /&gt;
** 4 WLAN ADC Kanäle&lt;br /&gt;
** AREF 3,3 und 5V&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6v2_M256_WIFI_Q2_m.JPG|thumb]]&lt;br /&gt;
&lt;br /&gt;
Ab Mitte Juli 2012 trafen die ersten kostenlosen RP6v2 M256 WiFi Platinen bei den Testern ein, die sich vorher dafür im Roboternetz RP6 Forum beworben hatten. Es handelte sich um Vorserien-Modelle, die sich dadurch auszeichneten, dass die Lötpads für Q2 (SP2 C6/C7: Q2) vertauscht waren. Der MOSFET war daher manuell &amp;quot;verdreht&amp;quot; aufgelötet, siehe nebenstehende Abbildung.&lt;br /&gt;
&lt;br /&gt;
Bei den Serien-Modellen wurde dies korrigiert.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Technische Daten====&lt;br /&gt;
{|  {{Blauetabelle}} &lt;br /&gt;
|'''Mikrocontroller:'''&lt;br /&gt;
|AVR ATmega2560&lt;br /&gt;
|-&lt;br /&gt;
|'''Speicher:'''&lt;br /&gt;
|256 kB [[Flash]]-Speicher&amp;lt;br/&amp;gt;&lt;br /&gt;
8 kB SRAM&amp;lt;br/&amp;gt; &lt;br /&gt;
4 kB [[EEPROM]]&amp;lt;br/&amp;gt;&lt;br /&gt;
? GB microSD Speicherkarte&lt;br /&gt;
|-&lt;br /&gt;
|'''Programmierung:'''&lt;br /&gt;
|Über [[Bootloader]], belegt ca. 8 kB des Flash-Speichers&amp;lt;br/&amp;gt;&lt;br /&gt;
Drahtlos über WLAN&lt;br /&gt;
|-&lt;br /&gt;
|'''Vorhandene Sensoren:'''&lt;br /&gt;
|2 Eingabetaster&amp;lt;br/&amp;gt;&lt;br /&gt;
4 WLAN ADC Kanäle&amp;lt;br/&amp;gt;&lt;br /&gt;
60 GP I/O Ports, davon bis 16 AD-Wandler (10-bit)&amp;lt;br/&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|'''Vorhandene Aktoren:'''&lt;br /&gt;
|7 Status LEDs&amp;lt;br/&amp;gt;&lt;br /&gt;
1 LC-Display-Port&amp;lt;br/&amp;gt;&lt;br /&gt;
802.11g WLAN Modul&amp;lt;br/&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|'''Abmessungen:'''&lt;br /&gt;
|(L &amp;amp;times; B &amp;amp;times; H) 112 &amp;amp;times; 90 &amp;amp;times; 42 mm (ohne Antenne)&lt;br /&gt;
|-&lt;br /&gt;
|'''Ausführung:'''&lt;br /&gt;
|Fertig aufgebautes Erweiterungsmodul&lt;br /&gt;
|-&lt;br /&gt;
|'''Stromversorgung:'''&lt;br /&gt;
|6 AA NiMH Akkus (über die RP6v2 Base)&lt;br /&gt;
|-&lt;br /&gt;
|'''Hersteller:'''&lt;br /&gt;
|Arexx Niederlande&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====WLAN Modul RN-171====&lt;br /&gt;
Das auf der RP6v2 M256 WiFi eingesetzte WLAN Modul ist das [http://www.microchip.com/wwwproducts/en/RN171 RN-171] ursprünglich entwickelt von Roving Networks. Vor einigen Jahren wurde die Firma Roving Networks von [http://www.microchip.com MicroChip Technology] übernommen.&lt;br /&gt;
&lt;br /&gt;
Inzwischen (2017) wird das RN-171 zwar noch hergestellt, für neue Hardware Designs aber nicht mehr empfohlen.&lt;br /&gt;
&lt;br /&gt;
Die letzte Firmware Version trägt die Nummer 4.81.&lt;br /&gt;
&lt;br /&gt;
Für die Nutzung des RN-171 auf der RP6v2 M256 WiFi wird sowohl vonseiten des Hardware Designs der Platine, als auch vonseiten der Software davon ausgegangen, dass das RN-171 auch den &amp;quot;Ad-Hoc Modus&amp;quot; beherrscht. Dies ist der Fall bis zur Firmware Version 2.38.3. Höhere Versionen beherrschen diesen Modus nicht mehr.&lt;br /&gt;
&lt;br /&gt;
''Somit ist die Firmware 2.38.3 die höchste Version, die für das RN-171 auf der RP6v2 M256 WiFi nutzbar ist!''&lt;br /&gt;
&lt;br /&gt;
Diese Firmware Version (Datei: wifly7-2383.img) findet ihr in der ZIP in diesem [http://www.roboternetz.de/community/threads/64251-RP6M256-WLAN-Modul-RN-171-Firmware-Update?p=594781&amp;amp;viewfull=1#post594781 Post] im Roboternetz RP6 Forum. Seht euch vor einem eventuellen Firmware Update unbedingt den ganzen [http://www.roboternetz.de/community/threads/64251-RP6M256-WLAN-Modul-RN-171-Firmware-Update Thread] auch wegen der enthaltenen Warnhinweise an.&lt;br /&gt;
&lt;br /&gt;
====Umbau-Optionen====&lt;br /&gt;
Für die RP6v2 M256 WiFi gibt es keine Umbau-Optionen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===RP6 Sensor Board===&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_Sensor_Board.jpg|Das RP6 Sensor Board]]&lt;br /&gt;
&lt;br /&gt;
'''Die Beschreibung des RP6 Sensor Boards wurde ausgelagert in einen eigenen [[RP6_Sensor_Board_und_Xtra_Module#RP6_Sensor_Board_2|Artikel]]!'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Zubehör und Ersatzteile==&lt;br /&gt;
Über die Zubehör- und Ersatzteile informiert der Abschnitt [[RP6#Zubehör und Ersatzteile|Zubehör und Ersatzteile]] im RP6 Artikel.&lt;br /&gt;
&lt;br /&gt;
Darüber hinaus sind bei [http://www.conrad.de/ce/ CONRAD] für den RP6v2 erhältlich:&lt;br /&gt;
* Arexx RP6v2 Drehgeber-Satz RP6-ENCv2 ([http://www.conrad.de/ce/de/product/191625/RP6-DREHGEBER-SATZ 191625] AUSVERKAUFT!)&lt;br /&gt;
* Arexx RP6 USB-Interface RP6V2-TRANS ([http://www.conrad.de/ce/de/product/191638/Arexx-RP6-USB-Interface-RP6V2-TRANS 191638] AUSVERKAUFT!)&lt;br /&gt;
* Arexx RP6 Xtra Module&lt;br /&gt;
&lt;br /&gt;
===RP6v2 Drehgeber-Satz RP6-ENCv2===&lt;br /&gt;
Die RP6v2 [http://www.rn-wissen.de/index.php/RP6v2#Encoder Drehgeber-Sensoren] (AREXX RP6-ENCv2) sind als Ersatzteil für den RP6v2 (191584) erhältlich und jetzt seit Mai 2020 bei CONRAD ausverkauft. Sie können auch in den [[RP6|RP6]] (191524) und in das RP5/RP6-Chassis ([http://www.conrad.de/ce/de/product/191152/Arexx-Fahrgestell-Robby-RP5RP6-Roboter 191152] AUSVERKAUFT!) eingebaut werden und sind Bestandteil des [[RP6v2#Arexx_RP6-Xtra_Robotersystem|Arexx RP6-Xtra Robotersystems]].&lt;br /&gt;
&lt;br /&gt;
===RP6 USB-Interface RP6V2-TRANS===&lt;br /&gt;
Das RP6 USB-Interface (AREXX RP6V2-TRANS) kann zur Kommunikation mit verschiedenen Robotern und Erweiterungsmodulen eingesetzt werden. Es lassen sich mit dem RobotLoader neue Programme in den Mikrocontroller laden, und es wird ein virtueller serieller Port zur Kommunikation bereitgestellt. Auf dem Modul befindet sich zusätzlich ein Anschluss für APC220 Funkmodule (z.B. aus [http://www.conrad.de/ce/de/product/191668/Arexx-Wireless-Kit-ARX-APC220 diesem] Set, AUSVERKAUFT!) und ein 3,3 V Spannungsregler. Das USB-Interface RP6V2-TRANS kann als Ersatz für das mit dem RP6 oder RP6v2 gelieferte USB-Interface dienen und ist Bestandteil des [[RP6v2#Arexx_RP6-Xtra_Robotersystem|Arexx RP6-Xtra Robotersystems]]. Seit Ende 2021 ist das USB-Interface bei CONRAD ausverkauft.&lt;br /&gt;
&lt;br /&gt;
===RP6 Xtra Module===&lt;br /&gt;
'''Die Beschreibung der RP6 Xtra Module wurde ausgelagert in einen eigenen [[RP6_Sensor_Board_und_Xtra_Module#RP6_Xtra_Module_2|Artikel]]!'''&lt;br /&gt;
&lt;br /&gt;
===Arexx RP6-Xtra Robotersystem===&lt;br /&gt;
Unter der Bezeichnung '''Arexx RP6-Xtra Robotersystem''' bzw. '''Arexx Roboter Bausatz RP6-S''' ([https://www.conrad.de/de/arexx-rp6-xtra-robotersystem-1395738.html 1395738]) ist ab Januar 2016 ein Set bestehend aus dem [[RP6|RP6]] ([https://www.conrad.de/de/rp6-robotersystem-191524.html 191524]), einer [[RP6#Experimentierplatine|Experimentierplatine]] ([https://www.conrad.de/de/arexx-rp6-experimentierplatine-191537.html 191537]), einem [[RP6v2#RP6v2_Drehgeber-Satz_RP6-ENCv2|RP6v2 Drehgeber-Satz]] ([https://www.conrad.de/de/arexx-rp6-v2-drehgeber-sensoren-rp6-encv2-191625.html 191625]) und einem [[RP6v2#RP6_USB-Interface_RP6V2-TRANS|RP6 USB-Interface]] ([https://www.conrad.de/de/arexx-rp6-usb-interface-rp6v2-trans-191638.html 191638]) lieferbar.&lt;br /&gt;
&lt;br /&gt;
Die RP6v2 Drehgeber müssen selbst montiert werden. Durch dieses Set entsteht aus dem &amp;quot;alten RP6&amp;quot; ein Robotersystem, das in seiner Funktion identisch mit dem RP6v2 ist.&lt;br /&gt;
&lt;br /&gt;
Seit dem 1. Quartal 2018 ist das Arexx RP6-Xtra Robotersystem bei CONRAD ausverkauft.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Programmierung==&lt;br /&gt;
===RobotLoader===&lt;br /&gt;
Der RobotLoader ist die Weiterentwicklung des RP6Loaders. Es gibt ihn und den USB Interface Treiber [http://www.arexx.com/rp6/html/de/software.htm hier].&lt;br /&gt;
Über die Funktionen des RP6Loaders (siehe [[RP6_-_Programmierung#RP6Loader|hier]]!) hinaus kann der RobotLoader ab Version 2.0 Folgendes:&lt;br /&gt;
* WiFi Loader (Programme über WiFi hochladen und starten, Programmspeicher löschen)&lt;br /&gt;
* WiFi Terminal (Zeichen über WiFi senden/empfangen)&lt;br /&gt;
* Abdocken der Fenster des (seriellen) Terminals und des WiFi Terminals&lt;br /&gt;
* Konfiguration des WiFi Moduls über die serielle Schnittstelle&lt;br /&gt;
* Nach WiFi Geräten suchen&lt;br /&gt;
* Ab Version 2.3 über Kommandozeile steuerbar&lt;br /&gt;
&lt;br /&gt;
'''Befehlszeilen Optionen'''&lt;br /&gt;
&amp;lt;pre&amp;gt;################################################################&lt;br /&gt;
RobotLoader - Commandline Options&lt;br /&gt;
-c | -command : Enable Commandline Mode&lt;br /&gt;
-h | -help : Show this help message&lt;br /&gt;
-port=&amp;lt;PORT&amp;gt; : specify which port to use&lt;br /&gt;
               Windows with JD2XX: USB0, USB1, ...&lt;br /&gt;
               Windows with RXTX: COM0, COM1, ...&lt;br /&gt;
               Linux with RXTX: /dev/ttyUSB0, /dev/ttyUSB1, ...&lt;br /&gt;
-e : Erase Memory&lt;br /&gt;
-hex=&amp;lt;FILE&amp;gt; : Upload &amp;lt;FILE&amp;gt;, you must specify the complete path!&lt;br /&gt;
-s : Start Program (after upload)&lt;br /&gt;
-id : Get Infos from connected Board&lt;br /&gt;
###############################################################&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Loader Versionen====&lt;br /&gt;
Hier eine Tabelle der (mir) bekannten RobotLoader Versionen für die RP6v2 Base, CONTROL M32 und ab Version 2.0 auch für die M256 WiFi:&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |ZIP-Datum&lt;br /&gt;
 |Version&lt;br /&gt;
 |Bemerkungen&lt;br /&gt;
 |Examples&lt;br /&gt;
 |-&lt;br /&gt;
 |12.07.2010&lt;br /&gt;
 |[http://www.arexx.com/rp6/downloads/RobotLoader_20100712.zip 1.5h]&lt;br /&gt;
 |Auch für die RP6 Base, für Roboterarme und Caterpillar&lt;br /&gt;
 |ab 16.10.2007&lt;br /&gt;
 |-&lt;br /&gt;
 |16.06.2011&lt;br /&gt;
 |1.6b&lt;br /&gt;
 |Version auf der AREXX Wild Thumper CD-ROM!&lt;br /&gt;
 |&lt;br /&gt;
 |-&lt;br /&gt;
 |23.02.2012&lt;br /&gt;
 |[http://www.arexx.com/rp6/downloads/RobotLoader_20120223.zip 2.0 BETA]&lt;br /&gt;
 |Testversion! Ab v2.0 auch für die RP6v2 M256 WiFi Platine&lt;br /&gt;
 |&lt;br /&gt;
 |-&lt;br /&gt;
 |16.03.2012&lt;br /&gt;
 |2.1c&lt;br /&gt;
 |Version auf der AREXX Wireless kits CD-ROM 2012!&lt;br /&gt;
 |&lt;br /&gt;
 |-&lt;br /&gt;
 |05.06.2012&lt;br /&gt;
 |[http://www.arexx.com/rp6/downloads/RobotLoader_20120605.zip 2.3a]&lt;br /&gt;
 |Testversion! Siehe auch [http://www.roboternetz.de/community/threads/58168-RobotLoader-2-3a hier]!&lt;br /&gt;
 |&lt;br /&gt;
 |-&lt;br /&gt;
 |18.06.2012&lt;br /&gt;
 |[http://www.arexx.com/rp6/downloads/RobotLoader_20120618.zip 2.3b]&lt;br /&gt;
 |Testversion! Siehe auch [http://www.roboternetz.de/community/threads/58168-RobotLoader-2-3a hier]!&lt;br /&gt;
 |&lt;br /&gt;
 |-&lt;br /&gt;
 |17.07.2012&lt;br /&gt;
 |[http://www.arexx.com/rp6/downloads/RobotLoader_20120717.zip 2.3c]&lt;br /&gt;
 |Über Kommandozeile nutzbar, siehe auch [http://www.roboternetz.de/community/threads/58168-RobotLoader-2-3a hier]!&lt;br /&gt;
 |ab 16.07.2012&lt;br /&gt;
 |-&lt;br /&gt;
 |24.09.2012&lt;br /&gt;
 |[http://www.arexx.com/rp6/downloads/RobotLoader_20120924.zip 2.4a]&lt;br /&gt;
 |Mit WLAN Firmware v. 2.32, siehe auch [http://www.roboternetz.de/community/threads/59336-RobotLoader-2-4a hier]!&lt;br /&gt;
 |&lt;br /&gt;
 |-&lt;br /&gt;
 |10.04.2013&lt;br /&gt;
 |[http://www.arexx.com/rp6/downloads/RobotLoader_20130410.zip 2.5a]&lt;br /&gt;
 |Mit WLAN Firmware v. 2.36, siehe auch [http://www.roboternetz.de/community/threads/61977-M256-WIFI-Manchmal-nicht-ansprechbar?p=578766&amp;amp;viewfull=1#post578766 hier]!&lt;br /&gt;
 |&lt;br /&gt;
 |-&lt;br /&gt;
|}&lt;br /&gt;
'''Hinweise:'''&lt;br /&gt;
* Ältere Versionen des RP6Loaders bis Version 1.4 findet ihr [[RP6_-_Programmierung#RP6Loader|hier]].&lt;br /&gt;
* Von JM3 Engineering wurde auch ein eigenes Programm [[RP6_Sensor_Board_und_Xtra_Module#Robot-Tool|&amp;quot;'''JM3 Robot-Tool'''&amp;quot;]] veröffentlicht, das im RP6-System (RP6(v2) Base, CONTROL M32, M256 WiFi) anstelle des RobotLoaders verwendet werden kann.&lt;br /&gt;
&lt;br /&gt;
====Projekte====&lt;br /&gt;
* Der RobotLoader 2.3a und [http://www.rn-wissen.de/index.php/LunaAVR LunaAVR] im [http://www.roboternetz.de/community/threads/58168-RobotLoader-2-3a?p=551535&amp;amp;viewfull=1#post551535 Roboternetz RP6 Forum] und im [http://forum.myluna.de/viewtopic.php?f=3&amp;amp;t=24#p94 LunaAVR Forum]&lt;br /&gt;
&lt;br /&gt;
===RP6v2===&lt;br /&gt;
'''Der RP6v2 ([http://www.conrad.de/ce/de/product/191584/RP6-V2-ROBOTERSYSTEM/ 191584]) ist softwarekompatibel zum RP6.'''&lt;br /&gt;
&lt;br /&gt;
Zur Programmierung des [[RP6]] und des RP6v2 gibt es einen eigenen Artikel: [[RP6 - Programmierung]]&lt;br /&gt;
&lt;br /&gt;
===RP6v2 M256 WiFi Platine===&lt;br /&gt;
&lt;br /&gt;
====Dokumentation====&lt;br /&gt;
Die Dokumentation (Anleitung der RP6v2 M256 WiFi und des WiFi-Moduls RN-171 WiFly) befindet sich [http://www.arexx.com/rp6/html/de/soft_doc_rp6m256.htm hier].&lt;br /&gt;
&lt;br /&gt;
=====Manuals=====&lt;br /&gt;
=====Schematics=====&lt;br /&gt;
=====Datasheets=====&lt;br /&gt;
&lt;br /&gt;
====Demo-Programmme====&lt;br /&gt;
Die RP6v2 M256 WiFi Demo Programme sind [http://www.arexx.com/rp6/html/de/soft_doc_rp6m256.htm hier] zu finden.&lt;br /&gt;
&lt;br /&gt;
=====Bug-Report=====&lt;br /&gt;
In [http://www.roboternetz.de/community/threads/64362-Programmstart-mit-Hindernissen diesem Thread] des Roboternetz-Forums geht es um eine Fehlfunktion der Programme ''Example_09_Move'' und ''Example_10_Move2'' für die RP6v2 M256 WiFi. Diese Demos werden nicht korrekt ausgeführt, wenn sie über WLAN gestartet werden. Sie funktionieren jedoch normal, wenn sie mit dem START/STOP-Button der RP6v2 Base gestartet werden.&lt;br /&gt;
&lt;br /&gt;
Dieses Fehlverhalten der beiden Demos (aus [http://www.arexx.com/rp6/downloads/RP6Examples_20120725f.zip Version 1.8 der RP6 Examples vom 25.07.2012]) kann durch Einfügen der Zeilen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	I2CTWI_transmitByte(0, 0);&lt;br /&gt;
	mSleep(200);&lt;br /&gt;
	I2CTWI_transmitByte(0, 0);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
... in ''Example_09_Move'' ab Zeile 129 und in ''Example_10_Move2'' ab Zeile 699 abgestellt werden.&lt;br /&gt;
&lt;br /&gt;
====Library====&lt;br /&gt;
Die Library für die RP6v2 M256 WiFi besteht aus folgenden 21 Dateien:&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |Library&lt;br /&gt;
 |Datei&lt;br /&gt;
 |Funktion&lt;br /&gt;
 |-&lt;br /&gt;
 |RP6M256&lt;br /&gt;
 |RP6M256.h&lt;br /&gt;
 |RP6M256 Hardware-Konfiguration&lt;br /&gt;
 |-&lt;br /&gt;
 |RP6M256&lt;br /&gt;
 |RP6M256Lib.h&lt;br /&gt;
 |RP6M256 Library Header&lt;br /&gt;
 |-&lt;br /&gt;
 |RP6M256&lt;br /&gt;
 |RP6M256Lib.c&lt;br /&gt;
 |RP6M256 Library&lt;br /&gt;
 |-&lt;br /&gt;
 |RP6M256uart&lt;br /&gt;
 |RP6M256uart.h&lt;br /&gt;
 |RS232 Funktionen Header&lt;br /&gt;
 |-&lt;br /&gt;
 |RP6M256uart&lt;br /&gt;
 |RP6M256uart.c&lt;br /&gt;
 |RS232 Funktionen&lt;br /&gt;
 |-&lt;br /&gt;
 |RP6M256_I2CMaster&lt;br /&gt;
 |RP6M256_I2CMasterLib.h&lt;br /&gt;
 |I2C Master Library Header&lt;br /&gt;
 |-&lt;br /&gt;
 |RP6M256_I2CMaster&lt;br /&gt;
 |RP6M256_I2CMasterLib.c&lt;br /&gt;
 |I2C Master Library&lt;br /&gt;
 |-&lt;br /&gt;
 |RP6M256_WIFI&lt;br /&gt;
 |RP6M256_WIFIlib.h&lt;br /&gt;
 |WIFI Library Header&lt;br /&gt;
 |-&lt;br /&gt;
 |RP6M256_WIFI&lt;br /&gt;
 |RP6M256_WIFIlib.c&lt;br /&gt;
 |WIFI Library&lt;br /&gt;
 |-&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |-&lt;br /&gt;
 |SDC&lt;br /&gt;
 |byteordering.h&lt;br /&gt;
 |Byte-order handling header&lt;br /&gt;
 |-&lt;br /&gt;
 |SDC&lt;br /&gt;
 |byteordering.c&lt;br /&gt;
 |Byte-order handling implementation&lt;br /&gt;
 |-&lt;br /&gt;
 |SDC&lt;br /&gt;
 |fat_config.h&lt;br /&gt;
 |FAT configuration&lt;br /&gt;
 |-&lt;br /&gt;
 |SDC&lt;br /&gt;
 |fat.h&lt;br /&gt;
 |FAT header&lt;br /&gt;
 |-&lt;br /&gt;
 |SDC&lt;br /&gt;
 |fat.c&lt;br /&gt;
 |FAT implementation&lt;br /&gt;
 |-&lt;br /&gt;
 |SDC&lt;br /&gt;
 |partition_config.h&lt;br /&gt;
 |Partition configuration&lt;br /&gt;
 |-&lt;br /&gt;
 |SDC&lt;br /&gt;
 |partition.h&lt;br /&gt;
 |Partition table header&lt;br /&gt;
 |-&lt;br /&gt;
 |SDC&lt;br /&gt;
 |partition.c&lt;br /&gt;
 |Partition table implementation&lt;br /&gt;
 |-&lt;br /&gt;
 |SDC&lt;br /&gt;
 |sd-reader_config.h&lt;br /&gt;
 |Common sd-reader configuration (all modules)&lt;br /&gt;
 |-&lt;br /&gt;
 |SDC&lt;br /&gt;
 |sd_raw_config.h&lt;br /&gt;
 |MMC/SD support configuration&lt;br /&gt;
 |-&lt;br /&gt;
 |SDC&lt;br /&gt;
 |sd_raw.h&lt;br /&gt;
 |MMC/SD/SDHC raw access header&lt;br /&gt;
 |-&lt;br /&gt;
 |SDC&lt;br /&gt;
 |sd_raw.c&lt;br /&gt;
 |MMC/SD/SDHC raw access implementation&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=====Versionen=====&lt;br /&gt;
Hier eine Tabelle der (mir) bekannten Library Versionen der RP6v2 M256 WiFi:&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |ZIP-Datum&lt;br /&gt;
 |VERSION_&lt;br /&gt;
 |RP6M256Library&lt;br /&gt;
 |RP6LIB_VERSION&lt;br /&gt;
 |RP6M256.h&lt;br /&gt;
 |RP6M256Lib&lt;br /&gt;
 |WifiLib&lt;br /&gt;
 |UartLib&lt;br /&gt;
 |I2CMasterLib&lt;br /&gt;
 |SDCLib **&lt;br /&gt;
 |-&lt;br /&gt;
 |24.02.2012&lt;br /&gt;
 |1.7&lt;br /&gt;
 |1.0_24.02.12&lt;br /&gt;
 |16&lt;br /&gt;
 |1.0_24.02.12&lt;br /&gt;
 |1.0_24.02.12&lt;br /&gt;
 |1.0_24.02.12&lt;br /&gt;
 |1.0_24.02.12&lt;br /&gt;
 |(1.0_24.02.12)&lt;br /&gt;
 |?&lt;br /&gt;
 |-&lt;br /&gt;
 |16.07.2012&lt;br /&gt;
 |[http://www.arexx.com/rp6/downloads/RP6Examples_20120716.zip 1.7] *&lt;br /&gt;
 |1.1_16.07.12&lt;br /&gt;
 |16&lt;br /&gt;
 |1.1_16.07.12&lt;br /&gt;
 |1.1_16.07.12&lt;br /&gt;
 |1.1_16.07.12&lt;br /&gt;
 |1.1_16.07.12&lt;br /&gt;
 |(1.0_24.02.12)&lt;br /&gt;
 |(2006-2011)&lt;br /&gt;
 |-&lt;br /&gt;
 |25.07.2012&lt;br /&gt;
 |[http://www.arexx.com/rp6/downloads/RP6Examples_20120725.zip 1.8]&lt;br /&gt;
 |1.1_16.07.12&lt;br /&gt;
 |16&lt;br /&gt;
 |1.1_16.07.12&lt;br /&gt;
 |1.1_16.07.12&lt;br /&gt;
 |1.1_16.07.12&lt;br /&gt;
 |1.1_16.07.12&lt;br /&gt;
 |(1.0_24.02.12)&lt;br /&gt;
 |(2006-2011)&lt;br /&gt;
 |-&lt;br /&gt;
 |25.07.2012 ²&lt;br /&gt;
 |[http://www.arexx.com/rp6/downloads/RP6Examples_20120725f.zip 1.8]&lt;br /&gt;
 |1.1_16.07.12&lt;br /&gt;
 |16&lt;br /&gt;
 |1.1_16.07.12&lt;br /&gt;
 |1.1_16.07.12&lt;br /&gt;
 |1.1_16.07.12&lt;br /&gt;
 |1.1_16.07.12&lt;br /&gt;
 |(1.0_24.02.12)&lt;br /&gt;
 |(2006-2011)&lt;br /&gt;
|}&lt;br /&gt;
'''Zu *:''' Ab der Version 1.7 sind auch die Libraries und Examples der RP6v2 Base und CONTROL M32 enthalten! Ältere Versionen dieser Libraries und Examples bis Version 1.5 findet ihr [[RP6_-_Programmierung#Versionen|hier]]!&lt;br /&gt;
&lt;br /&gt;
'''Zu **:''' Die SDC Library ist eine Open Source Bibliothek für den Zugriff auf SD-Karten. Sie steht unter der GNU General Public License version 2. Geschrieben wurde sie von Roland Riegel; sein [http://www.roland-riegel.de/sd-reader/index.html Projekt] könnt ihr im Internet verfolgen. Eventuelle Updates werden dort auch veröffentlicht.&lt;br /&gt;
Die Projektseiten sind auch im Verzeichnis ...\RP6Lib\RP6control_M256_WIFI\sdc\doc\html\ der RP6Examples zu finden. Ihr könnt in dem Verzeichnis die Datei &amp;quot;index.html&amp;quot; starten, um sie anzuzeigen.&lt;br /&gt;
&lt;br /&gt;
'''Zu ²:''' Die Datei heißt RP6Examples_20120725'''f'''.zip. Mir ist nicht bekannt, ob ein Unterschied zur RP6Examples_20120725.zip besteht.&lt;br /&gt;
&lt;br /&gt;
In der 1. Spalte findet ihr das Datum der RP6Examples.zip Datei, in der die Library enthalten ist. Die 2. Spalte nennt die Version, die im Dateinamen der VERSION_x.x.txt Datei als x.x vorkommt. In der 3. Spalte steht die Versionsangabe der RP6M256Library laut Angabe in der VERSION_x.x.txt Datei.&lt;br /&gt;
&lt;br /&gt;
In der 4. Spalte gebe ich den Wert der Konstante RP6LIB_VERSION an. Es gibt sie ab den RP6v2 Base und CONTROL M32 Examples vom 16.10.2007. In den Spalten 5 bis 10 führe ich nacheinander die Versionsnummern und ggf. das in der Datei genannte Datum der Header-Datei/Library an: RP6M256.h, RP6M256Lib, WifiLib, UartLib, I2CMasterLib, SDCLib.&lt;br /&gt;
&lt;br /&gt;
=====RP6M256=====&lt;br /&gt;
======Bug-Report======&lt;br /&gt;
======Konfiguration======&lt;br /&gt;
======Port-Verwendung======&lt;br /&gt;
Die Verwendung der Ports des RP6v2 M256 WiFi Microcontrollers wird festgelegt in der Header-Datei &amp;quot;RP6M256.h&amp;quot;. In dieser Datei wird auch noch Folgendes aufgeführt:&lt;br /&gt;
* Quarzfrequenz (F_CPU) &lt;br /&gt;
* True/false Definition &lt;br /&gt;
* Verschiedene Macros &lt;br /&gt;
* Baudraten und Baudraten-Tabelle &lt;br /&gt;
&lt;br /&gt;
Hier eine Tabelle mit den Port-Definitionen für die RP6v2 M256 WiFi:&lt;br /&gt;
 Erklärung der Spalten:&lt;br /&gt;
 Port        -&amp;gt; Atmel Portpin Bezeichnung&lt;br /&gt;
 Name        -&amp;gt; Atmel Funktionsbezeichnung&lt;br /&gt;
 In/Out      -&amp;gt; Eingang (In) oder Ausgang (Out)&lt;br /&gt;
 Pullup      -&amp;gt; Falls Eingang: Pullup ein- (1) oder ausgeschaltet (0)&lt;br /&gt;
 Wert        -&amp;gt; Falls Ausgang: Logikpegel high (1) oder low (0)&lt;br /&gt;
 Funktion    -&amp;gt; Schnittstellenfunktion&lt;br /&gt;
 Bezeichnung -&amp;gt; Portpin Bezeichnung der Library&lt;br /&gt;
 Stecker     -&amp;gt; Portpin verfügbar an STECKER: Pin&lt;br /&gt;
 Anmerkungen -&amp;gt; Kommentare (ADC_xx: ADC-Kanal Bezeichnung)&lt;br /&gt;
&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |Port&lt;br /&gt;
 |Name&lt;br /&gt;
 |In/Out&lt;br /&gt;
 |Pullup&lt;br /&gt;
 |Wert&lt;br /&gt;
 |Funktion&lt;br /&gt;
 |Bezeichnung&lt;br /&gt;
 |Stecker&lt;br /&gt;
 |Anmerkungen&lt;br /&gt;
 |-&lt;br /&gt;
 |PA0&lt;br /&gt;
 |AD0&lt;br /&gt;
 |Out&lt;br /&gt;
 |&lt;br /&gt;
 |0&lt;br /&gt;
 |&lt;br /&gt;
 |DISP_D0&lt;br /&gt;
 |DISPIO: 7&lt;br /&gt;
 |Display D0&lt;br /&gt;
 |-&lt;br /&gt;
 |PA1&lt;br /&gt;
 |AD1&lt;br /&gt;
 |Out&lt;br /&gt;
 |&lt;br /&gt;
 |0&lt;br /&gt;
 |&lt;br /&gt;
 |DISP_D1&lt;br /&gt;
 |DISPIO: 8&lt;br /&gt;
 |Display D1 &lt;br /&gt;
 |-&lt;br /&gt;
 |PA2&lt;br /&gt;
 |AD2&lt;br /&gt;
 |Out&lt;br /&gt;
 |&lt;br /&gt;
 |0&lt;br /&gt;
 |&lt;br /&gt;
 |DISP_D2&lt;br /&gt;
 |DISPIO: 9&lt;br /&gt;
 |Display D2 &lt;br /&gt;
 |-&lt;br /&gt;
 |PA3&lt;br /&gt;
 |AD3&lt;br /&gt;
 |Out&lt;br /&gt;
 |&lt;br /&gt;
 |0&lt;br /&gt;
 |&lt;br /&gt;
 |DISP_D3&lt;br /&gt;
 |DISPIO: 10&lt;br /&gt;
 |Display D3&lt;br /&gt;
 |-&lt;br /&gt;
 |PA4&lt;br /&gt;
 |AD4&lt;br /&gt;
 |Out&lt;br /&gt;
 |&lt;br /&gt;
 |0&lt;br /&gt;
 |&lt;br /&gt;
 |DISP_D4&lt;br /&gt;
 |DISPIO: 11&lt;br /&gt;
 |Display D4&lt;br /&gt;
 |-&lt;br /&gt;
 |PA5&lt;br /&gt;
 |AD5&lt;br /&gt;
 |Out&lt;br /&gt;
 |&lt;br /&gt;
 |0&lt;br /&gt;
 |&lt;br /&gt;
 |DISP_D5&lt;br /&gt;
 |DISPIO: 12&lt;br /&gt;
 |Display D5&lt;br /&gt;
 |-&lt;br /&gt;
 |PA6&lt;br /&gt;
 |AD6&lt;br /&gt;
 |Out&lt;br /&gt;
 |&lt;br /&gt;
 |0&lt;br /&gt;
 |&lt;br /&gt;
 |DISP_D6&lt;br /&gt;
 |DISPIO: 13&lt;br /&gt;
 |Display D6&lt;br /&gt;
 |-&lt;br /&gt;
 |PA7&lt;br /&gt;
 |AD7&lt;br /&gt;
 |Out&lt;br /&gt;
 |&lt;br /&gt;
 |0&lt;br /&gt;
 |&lt;br /&gt;
 |DISP_D7&lt;br /&gt;
 |DISPIO: 14&lt;br /&gt;
 |Display D7&lt;br /&gt;
 |-&lt;br /&gt;
 |PB0&lt;br /&gt;
 |SS/PCI0&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |SPI_SS *&lt;br /&gt;
 |&lt;br /&gt;
 |SDC Output DAT3 / CS&lt;br /&gt;
 |-&lt;br /&gt;
 |PB1&lt;br /&gt;
 |SCK/PCI1&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |ISP&lt;br /&gt;
 |SPI_SCK *&lt;br /&gt;
 |ISP: 3&lt;br /&gt;
 |SDC Output CLK&lt;br /&gt;
 |-&lt;br /&gt;
 |PB2&lt;br /&gt;
 |MOSI/PCI2&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |ISP&lt;br /&gt;
 |SPI_MOSI *&lt;br /&gt;
 |ISP: 4&lt;br /&gt;
 |SDC Output CMD / DI&lt;br /&gt;
 |-&lt;br /&gt;
 |PB3&lt;br /&gt;
 |MISO/PCI3&lt;br /&gt;
 |In&lt;br /&gt;
 |0&lt;br /&gt;
 |&lt;br /&gt;
 |ISP&lt;br /&gt;
 |SPI_MISO ***&lt;br /&gt;
 |ISP: 1&lt;br /&gt;
 |SDC Input DAT0 / DO&lt;br /&gt;
 |-&lt;br /&gt;
 |PB4&lt;br /&gt;
 |OC2A/PCI4&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |OC2A_PI4&lt;br /&gt;
 |PWM23: 5&lt;br /&gt;
 |frei&lt;br /&gt;
 |-&lt;br /&gt;
 |PB5&lt;br /&gt;
 |OC1A/PCI5&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |OC1A_PI5&lt;br /&gt;
 |PWM01: 7&lt;br /&gt;
 |frei&lt;br /&gt;
 |-&lt;br /&gt;
 |PB6&lt;br /&gt;
 |OC1B/PCI6&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |OC1B_PI6&lt;br /&gt;
 |PWM01: 9&lt;br /&gt;
 |frei&lt;br /&gt;
 |-&lt;br /&gt;
 |PB7&lt;br /&gt;
 |OC0A/OC1C/PCI7&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |OC0A_OCM_PI7&lt;br /&gt;
 |PWM01: 4&lt;br /&gt;
 |frei&lt;br /&gt;
 |-&lt;br /&gt;
 |PC0&lt;br /&gt;
 |A8&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_PC0&lt;br /&gt;
 |PC01: 2&lt;br /&gt;
 |XMEM A8, frei&lt;br /&gt;
 |-&lt;br /&gt;
 |PC1&lt;br /&gt;
 |A9&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_PC1&lt;br /&gt;
 |PC01: 1&lt;br /&gt;
 |XMEM A9, frei&lt;br /&gt;
 |-&lt;br /&gt;
 |PC2&lt;br /&gt;
 |A10&lt;br /&gt;
 |Out&lt;br /&gt;
 |&lt;br /&gt;
 |0&lt;br /&gt;
 |&lt;br /&gt;
 |SLED1&lt;br /&gt;
 |&lt;br /&gt;
 |Status LED SL1&lt;br /&gt;
 |-&lt;br /&gt;
 |PC3&lt;br /&gt;
 |A11&lt;br /&gt;
 |Out&lt;br /&gt;
 |&lt;br /&gt;
 |0&lt;br /&gt;
 |&lt;br /&gt;
 |SLED2&lt;br /&gt;
 |&lt;br /&gt;
 |Status LED SL2&lt;br /&gt;
 |-&lt;br /&gt;
 |PC4&lt;br /&gt;
 |A12&lt;br /&gt;
 |Out&lt;br /&gt;
 |&lt;br /&gt;
 |0&lt;br /&gt;
 |&lt;br /&gt;
 |SLED3&lt;br /&gt;
 |&lt;br /&gt;
 |Status LED SL3&lt;br /&gt;
 |-&lt;br /&gt;
 |PC5&lt;br /&gt;
 |A13&lt;br /&gt;
 |Out&lt;br /&gt;
 |&lt;br /&gt;
 |0&lt;br /&gt;
 |&lt;br /&gt;
 |SLED4&lt;br /&gt;
 |&lt;br /&gt;
 |Status LED SL4&lt;br /&gt;
 |-&lt;br /&gt;
 |PC6&lt;br /&gt;
 |A14&lt;br /&gt;
 |Out&lt;br /&gt;
 |&lt;br /&gt;
 |0&lt;br /&gt;
 |&lt;br /&gt;
 |WLAN_GPIO14_OUT *&lt;br /&gt;
 |&lt;br /&gt;
 |WLAN Output GPIO14&lt;br /&gt;
 |-&lt;br /&gt;
 |PC7&lt;br /&gt;
 |A15&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |WLAN_GPIO8_IN **&lt;br /&gt;
 |&lt;br /&gt;
 |WLAN Input GPIO8&lt;br /&gt;
 |-&lt;br /&gt;
 |PD0&lt;br /&gt;
 |SCL/INT0&lt;br /&gt;
 |In ²&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |I2C-Bus&lt;br /&gt;
 |SCL&lt;br /&gt;
 |XBUS: 10&lt;br /&gt;
 |XBUS SCL&lt;br /&gt;
 |-&lt;br /&gt;
 |PD1&lt;br /&gt;
 |SDA/INT1&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |I2C-Bus&lt;br /&gt;
 |SDA&lt;br /&gt;
 |XBUS: 12&lt;br /&gt;
 |XBUS SDA&lt;br /&gt;
 |-&lt;br /&gt;
 |PD2&lt;br /&gt;
 |RXD1/INT2&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |UART1&lt;br /&gt;
 |RXD1&lt;br /&gt;
 |USPI15: 8&lt;br /&gt;
 |USART1 RX, frei&lt;br /&gt;
 |-&lt;br /&gt;
 |PD3&lt;br /&gt;
 |TXD1/INT3&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |UART1&lt;br /&gt;
 |TXD1&lt;br /&gt;
 |USPI15: 6&lt;br /&gt;
 |USART1 TX, frei&lt;br /&gt;
 |-&lt;br /&gt;
 |PD4&lt;br /&gt;
 |ICP1&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_PD4_ICP1&lt;br /&gt;
 |PWM01: 1&lt;br /&gt;
 |frei&lt;br /&gt;
 |-&lt;br /&gt;
 |PD5&lt;br /&gt;
 |XCK1&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_PD5_XCK1&lt;br /&gt;
 |USPI15: 4&lt;br /&gt;
 |frei&lt;br /&gt;
 |-&lt;br /&gt;
 |PD6&lt;br /&gt;
 |T1&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_PD6_T1&lt;br /&gt;
 |PWM01: 3&lt;br /&gt;
 |frei&lt;br /&gt;
 |-&lt;br /&gt;
 |PD7&lt;br /&gt;
 |T0&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_PD7_T2&lt;br /&gt;
 |PWM01: 6&lt;br /&gt;
 |frei&lt;br /&gt;
 |-&lt;br /&gt;
 |PE0&lt;br /&gt;
 |RXD0/PCI8&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |UART0&lt;br /&gt;
 |RXD0&lt;br /&gt;
 |PROGU: 2&lt;br /&gt;
 |USART RX&lt;br /&gt;
 |-&lt;br /&gt;
 |PE1&lt;br /&gt;
 |TXD0&lt;br /&gt;
 |Out&lt;br /&gt;
 |&lt;br /&gt;
 |0&lt;br /&gt;
 |UART0&lt;br /&gt;
 |TXD0&lt;br /&gt;
 |PROGU: 3&lt;br /&gt;
 |USART TX&lt;br /&gt;
 |-&lt;br /&gt;
 |PE2&lt;br /&gt;
 |XCK0/AIN0&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_PE2_XCK0_AIN0&lt;br /&gt;
 |ADCIO2: 8&lt;br /&gt;
 |frei&lt;br /&gt;
 |-&lt;br /&gt;
 |PE3&lt;br /&gt;
 |OC3A/AIN1&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_PE3_OC3A_AIN1&lt;br /&gt;
 |ADCIO2: 4&lt;br /&gt;
 |frei&lt;br /&gt;
 |-&lt;br /&gt;
 |PE4&lt;br /&gt;
 |OC3B/INT4&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_PE4_OC3B_I4&lt;br /&gt;
 |PWM23: 9&lt;br /&gt;
 |frei&lt;br /&gt;
 |-&lt;br /&gt;
 |PE5&lt;br /&gt;
 |OC3C/INT5&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_PE5_OC3C_I5&lt;br /&gt;
 |PWM23: 4&lt;br /&gt;
 |frei&lt;br /&gt;
 |-&lt;br /&gt;
 |PE6&lt;br /&gt;
 |T3/INT6&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_PE6_T3_I6&lt;br /&gt;
 |PWM23: 3&lt;br /&gt;
 |frei&lt;br /&gt;
 |-&lt;br /&gt;
 |PE7&lt;br /&gt;
 |CLKO/ICP3/INT7&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_PE7_ICP3_I7&lt;br /&gt;
 |PWM23: 1&lt;br /&gt;
 |frei&lt;br /&gt;
 |-&lt;br /&gt;
 |PF0&lt;br /&gt;
 |ADC0&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_ADC0&lt;br /&gt;
 |ADCIO1: 3&lt;br /&gt;
 |ADC_0 (frei)&lt;br /&gt;
 |-&lt;br /&gt;
 |PF1&lt;br /&gt;
 |ADC1&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_ADC1&lt;br /&gt;
 |ADCIO1: 1&lt;br /&gt;
 |ADC_1 (frei)&lt;br /&gt;
 |-&lt;br /&gt;
 |PF2&lt;br /&gt;
 |ADC2&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_ADC2&lt;br /&gt;
 |ADCIO1: 5&lt;br /&gt;
 |ADC_2 (frei)&lt;br /&gt;
 |-&lt;br /&gt;
 |PF3&lt;br /&gt;
 |ADC3&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_ADC3&lt;br /&gt;
 |ADCIO1: 7&lt;br /&gt;
 |ADC_3 (frei)&lt;br /&gt;
 |-&lt;br /&gt;
 |PF4&lt;br /&gt;
 |ADC4/TCK&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |JTAG&lt;br /&gt;
 |IO_ADC4&lt;br /&gt;
 |ADCIO1: 9&lt;br /&gt;
 |ADC_4 (frei)&lt;br /&gt;
 |-&lt;br /&gt;
 |PF5&lt;br /&gt;
 |ADC5/TMS&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |JTAG&lt;br /&gt;
 |IO_ADC5&lt;br /&gt;
 |ADCIO1: 11&lt;br /&gt;
 |ADC_5 (frei)&lt;br /&gt;
 |-&lt;br /&gt;
 |PF6&lt;br /&gt;
 |ADC6/TDO&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |JTAG&lt;br /&gt;
 |IO_ADC6&lt;br /&gt;
 |ADCIO1: 12&lt;br /&gt;
 |ADC_6 (frei)&lt;br /&gt;
 |-&lt;br /&gt;
 |PF7&lt;br /&gt;
 |ADC7/TDI&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |JTAG&lt;br /&gt;
 |IO_ADC7&lt;br /&gt;
 |ADCIO1: 13&lt;br /&gt;
 |ADC_7 (frei)&lt;br /&gt;
 |-&lt;br /&gt;
 |PG0&lt;br /&gt;
 |WR&lt;br /&gt;
 |Out&lt;br /&gt;
 |&lt;br /&gt;
 |0&lt;br /&gt;
 |&lt;br /&gt;
 |DISP_WR&lt;br /&gt;
 |DISPIO: 5&lt;br /&gt;
 |Display WR&lt;br /&gt;
 |-&lt;br /&gt;
 |PG1&lt;br /&gt;
 |RD&lt;br /&gt;
 |Out&lt;br /&gt;
 |&lt;br /&gt;
 |0&lt;br /&gt;
 |&lt;br /&gt;
 |DISP_EN_RD&lt;br /&gt;
 |DISPIO: 6&lt;br /&gt;
 |Display RD&lt;br /&gt;
 |-&lt;br /&gt;
 |PG2&lt;br /&gt;
 |ALE&lt;br /&gt;
 |Out&lt;br /&gt;
 |&lt;br /&gt;
 |0&lt;br /&gt;
 |&lt;br /&gt;
 |DISP_RS_ALE&lt;br /&gt;
 |DISPIO: 4&lt;br /&gt;
 |Display ALE&lt;br /&gt;
 |-&lt;br /&gt;
 |PG3&lt;br /&gt;
 |TOSC2&lt;br /&gt;
 |In&lt;br /&gt;
 |1 &amp;quot;&amp;quot;&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |BUTTON_SW2&lt;br /&gt;
 |&lt;br /&gt;
 |Taster SW2&lt;br /&gt;
 |-&lt;br /&gt;
 |PG4&lt;br /&gt;
 |TOSC1&lt;br /&gt;
 |In&lt;br /&gt;
 |1 &amp;quot;&amp;quot;&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |BUTTON_SW1&lt;br /&gt;
 |&lt;br /&gt;
 |Taster SW1&lt;br /&gt;
 |-&lt;br /&gt;
 |PG5&lt;br /&gt;
 |OC0B&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_OC0B&lt;br /&gt;
 |PWM01: 5&lt;br /&gt;
 |frei&lt;br /&gt;
 |-&lt;br /&gt;
 |PH0&lt;br /&gt;
 |RXD2&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |UART2&lt;br /&gt;
 |RXD2&lt;br /&gt;
 |USPI24: 8&lt;br /&gt;
 |USART2 RX, frei&lt;br /&gt;
 |-&lt;br /&gt;
 |PH1&lt;br /&gt;
 |TXD2&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |UART2&lt;br /&gt;
 |TXD2&lt;br /&gt;
 |USPI24: 6&lt;br /&gt;
 |USART2 TX, frei&lt;br /&gt;
 |-&lt;br /&gt;
 |PH2&lt;br /&gt;
 |XCK2&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_PH2_XCK2&lt;br /&gt;
 |USPI24: 4&lt;br /&gt;
 |frei&lt;br /&gt;
 |-&lt;br /&gt;
 |PH3&lt;br /&gt;
 |OC4A&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_PH3_OC4A&lt;br /&gt;
 |USPI24: 9&lt;br /&gt;
 |frei&lt;br /&gt;
 |-&lt;br /&gt;
 |PH4&lt;br /&gt;
 |OC4B&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_PH4_OC4B&lt;br /&gt;
 |USPI24: 7&lt;br /&gt;
 |frei&lt;br /&gt;
 |-&lt;br /&gt;
 |PH5&lt;br /&gt;
 |OC4C&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_PH5_OC4C&lt;br /&gt;
 |USPI24: 5&lt;br /&gt;
 |frei&lt;br /&gt;
 |-&lt;br /&gt;
 |PH6&lt;br /&gt;
 |OC2B&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_PH6_OC2B&lt;br /&gt;
 |PWM23: 7&lt;br /&gt;
 |frei&lt;br /&gt;
 |-&lt;br /&gt;
 |PH7&lt;br /&gt;
 |T4&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_PH7_T4&lt;br /&gt;
 |USPI24: 3&lt;br /&gt;
 |frei&lt;br /&gt;
 |-&lt;br /&gt;
 |PJ0&lt;br /&gt;
 |RXD3/PCI9&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |UART3&lt;br /&gt;
 |WLAN_RXD3 **&lt;br /&gt;
 |&lt;br /&gt;
 |WLAN USART RX&lt;br /&gt;
 |-&lt;br /&gt;
 |PJ1&lt;br /&gt;
 |TXD3/PCI10&lt;br /&gt;
 |Out&lt;br /&gt;
 |&lt;br /&gt;
 |0&lt;br /&gt;
 |UART3&lt;br /&gt;
 |WLAN_TXD3 *&lt;br /&gt;
 |&lt;br /&gt;
 |WLAN USART TX&lt;br /&gt;
 |-&lt;br /&gt;
 |PJ2&lt;br /&gt;
 |XCK3/PCI11&lt;br /&gt;
 |Out&lt;br /&gt;
 |&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |WLAN_RTS *&lt;br /&gt;
 |&lt;br /&gt;
 |WLAN Output RTS&lt;br /&gt;
 |-&lt;br /&gt;
 |PJ3&lt;br /&gt;
 |PCI12&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |INT1_PI12&lt;br /&gt;
 |XBUS: 8&lt;br /&gt;
 |XBUS INT1&lt;br /&gt;
 |-&lt;br /&gt;
 |PJ4&lt;br /&gt;
 |PCI13&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |INTU_PI13&lt;br /&gt;
 |XBUS: 7&lt;br /&gt;
 |XBUS INTU&lt;br /&gt;
 |-&lt;br /&gt;
 |PJ5&lt;br /&gt;
 |PCI14&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |INT3_PI14&lt;br /&gt;
 |XBUS: 9&lt;br /&gt;
 |XBUS INT3&lt;br /&gt;
 |-&lt;br /&gt;
 |PJ6&lt;br /&gt;
 |PCI15&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |INT2_PI15&lt;br /&gt;
 |XBUS: 11&lt;br /&gt;
 |XBUS INT2&lt;br /&gt;
 |-&lt;br /&gt;
 |PJ7&lt;br /&gt;
 |&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |WLAN_CTS **&lt;br /&gt;
 |&lt;br /&gt;
 |WLAN Input CTS&lt;br /&gt;
 |-&lt;br /&gt;
 |PK0&lt;br /&gt;
 |ADC8/PCI16&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_ADC8_PI16&lt;br /&gt;
 |ADCIO2: 1&lt;br /&gt;
 |ADC_8 (frei)&lt;br /&gt;
 |-&lt;br /&gt;
 |PK1&lt;br /&gt;
 |ADC9/PCI17&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_ADC9_PI17&lt;br /&gt;
 |ADCIO2: 3&lt;br /&gt;
 |ADC_9 (frei)&lt;br /&gt;
 |-&lt;br /&gt;
 |PK2&lt;br /&gt;
 |ADC10/PCI18&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_ADC10_PI18&lt;br /&gt;
 |ADCIO2: 5&lt;br /&gt;
 |ADC_10 (frei)&lt;br /&gt;
 |-&lt;br /&gt;
 |PK3&lt;br /&gt;
 |ADC11/PCI19&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_ADC11_PI19&lt;br /&gt;
 |ADCIO2: 7&lt;br /&gt;
 |ADC_11 (frei)&lt;br /&gt;
 |-&lt;br /&gt;
 |PK4&lt;br /&gt;
 |ADC12/PCI20&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_ADC12_PI20&lt;br /&gt;
 |ADCIO2: 9&lt;br /&gt;
 |ADC_12 (frei)&lt;br /&gt;
 |-&lt;br /&gt;
 |PK5&lt;br /&gt;
 |ADC13/PCI21&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_ADC13_PI21&lt;br /&gt;
 |PWM01: 8&lt;br /&gt;
 |ADC_13 (frei)&lt;br /&gt;
 |-&lt;br /&gt;
 |PK6&lt;br /&gt;
 |ADC14/PCI22&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_ADC14_PI22&lt;br /&gt;
 |PWM23: 8&lt;br /&gt;
 |ADC_14 (frei)&lt;br /&gt;
 |-&lt;br /&gt;
 |PK7&lt;br /&gt;
 |ADC15/PCI23&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_ADC15_PI23&lt;br /&gt;
 |PWM23: 6&lt;br /&gt;
 |ADC_15 (frei)&lt;br /&gt;
 |-&lt;br /&gt;
 |PL0&lt;br /&gt;
 |ICP4&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_PL0_ICP4&lt;br /&gt;
 |USPI24: 1&lt;br /&gt;
 |frei&lt;br /&gt;
 |-&lt;br /&gt;
 |PL1&lt;br /&gt;
 |ICP5&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_PL1_ICP5&lt;br /&gt;
 |USPI15: 1&lt;br /&gt;
 |frei&lt;br /&gt;
 |-&lt;br /&gt;
 |PL2&lt;br /&gt;
 |T5&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_PL2_T5&lt;br /&gt;
 |USPI15: 3&lt;br /&gt;
 |frei&lt;br /&gt;
 |-&lt;br /&gt;
 |PL3&lt;br /&gt;
 |OC5A&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_PL3_OC5A&lt;br /&gt;
 |USPI15: 5&lt;br /&gt;
 |frei&lt;br /&gt;
 |-&lt;br /&gt;
 |PL4&lt;br /&gt;
 |OC5B&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_PL4_OC5B&lt;br /&gt;
 |USPI15: 9&lt;br /&gt;
 |frei&lt;br /&gt;
 |-&lt;br /&gt;
 |PL5&lt;br /&gt;
 |OC5C&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_PL5_OC5C&lt;br /&gt;
 |USPI15: 7&lt;br /&gt;
 |frei&lt;br /&gt;
 |-&lt;br /&gt;
 |PL6&lt;br /&gt;
 |&lt;br /&gt;
 |Out&lt;br /&gt;
 |³&lt;br /&gt;
 |0&lt;br /&gt;
 |&lt;br /&gt;
 |WLAN_WAKE&lt;br /&gt;
 |&lt;br /&gt;
 |WLAN Output WAKE&lt;br /&gt;
 |-&lt;br /&gt;
 |PL7&lt;br /&gt;
 |&lt;br /&gt;
 |Out&lt;br /&gt;
 |²&lt;br /&gt;
 |0&lt;br /&gt;
 |&lt;br /&gt;
 |WLAN_RESET&lt;br /&gt;
 |&lt;br /&gt;
 |WLAN Output RESET&lt;br /&gt;
 |-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
 Zeichen:&lt;br /&gt;
 *    Verbunden mit einem Eingang des I2C-Pegelwandlers NC7WZ16&lt;br /&gt;
 **   Verbunden mit einem Ausgang des I2C-Pegelwandlers NC7WZ16&lt;br /&gt;
 ***  Verbunden mit einem Ausgang des I2C-Pegelwandlers NC7WZ16&lt;br /&gt;
      über Widerstand 680 Ohm (R7)&lt;br /&gt;
 &lt;br /&gt;
 ²    Verbunden mit Pulldown 10 kOhm (R22) und MOSFET Gate (Q2)&lt;br /&gt;
 ³    Verbunden mit Spannungsteiler 68 / 100 kOhm (R21 / R23)&lt;br /&gt;
 &amp;quot;&amp;quot;   Verbunden mit Pullup-Widerstand 68 kOhm (und Taster nach GND)&lt;br /&gt;
 &lt;br /&gt;
 Kürzel (Spalte Name):&lt;br /&gt;
 PCIx     PCINTx&lt;br /&gt;
 &lt;br /&gt;
 Abkürzungen der IO-Stecker (Spalte Stecker):&lt;br /&gt;
 PWM01    IO_PWM/T0/T1&lt;br /&gt;
 PWM23    IO_PWM/T2/T3&lt;br /&gt;
 USPI15   UART_SPI1/T5&lt;br /&gt;
 USPI24   UART_SPI2/T4&lt;br /&gt;
 ADCIO1   ADC_IO1&lt;br /&gt;
 ADCIO2   ADC_IO2/CMP&lt;br /&gt;
 DISPIO   DISPLAY/IO&lt;br /&gt;
 PC01     PC0/1&lt;br /&gt;
 PROGU    PROG_UART&lt;br /&gt;
&lt;br /&gt;
======Timer-Nutzung======&lt;br /&gt;
&lt;br /&gt;
=====RP6M256uart=====&lt;br /&gt;
=====RP6M256_I2CMaster=====&lt;br /&gt;
=====RP6M256_WIFI=====&lt;br /&gt;
=====SDC=====&lt;br /&gt;
&lt;br /&gt;
====Projekte====&lt;br /&gt;
* Library:&lt;br /&gt;
** [http://www.roboternetz.de/community/threads/58744-RP6-M256-WIFI-Clock-Library RP6 M256 WIFI: Clock Library]&lt;br /&gt;
** [http://www.roboternetz.de/community/threads/58848-RP6-M256-WIFI-DCF77-Library RP6 M256 WIFI: DCF77 Library]&lt;br /&gt;
** [http://www.roboternetz.de/community/threads/66003-Peter-Fleury-s-I2C-Master-Library-f%C3%BCr-RP6 Peter Fleury's I2C Master Library für RP6]&lt;br /&gt;
** [http://www.roboternetz.de/community/threads/66586-RP6v2-Base-CONTROL-M32-M256-WiFi-100%C2%B5s-Stopwatches-Library Library für acht 100µs Stopwatches]&lt;br /&gt;
* Fernbedienung mit dem Browser (Demo):&lt;br /&gt;
** [http://www.roboternetz.de/community/threads/58162-Diskussion-zum-RP6-M256-WIFI-Modul?p=555102&amp;amp;viewfull=1#post555102 LED-Ansteuerung mit dem Browser]&lt;br /&gt;
** [http://www.roboternetz.de/community/threads/58162-Diskussion-zum-RP6-M256-WIFI-Modul?p=555651&amp;amp;viewfull=1#post555651 LEDs setzen und Daten der Browseranforderung anzeigen]&lt;br /&gt;
* I2C-Master für RP6Control M32 und RP6v2 Base (Demos, Library):&lt;br /&gt;
** [http://www.rn-wissen.de/index.php/RP6Control_M32:_I2C-Slave RP6Control M32 I2C-Slave]&lt;br /&gt;
* MultiIO Projekt (Demos, Library):&lt;br /&gt;
** [[RP6 Multi IO Projekt - Software#RP6_M256_WIFI|RP6 Multi IO Projekt - Software RP6 M256 WIFI]]&lt;br /&gt;
* ArduIO Projekt (Demos, Library):&lt;br /&gt;
** [http://rn-wissen.de/wiki/index.php/RP6_ArduIO_-_Software ArduIO Projekt - Software]&lt;br /&gt;
* Fernbedienung mit einer Android App (Demo):&lt;br /&gt;
** [http://www.roboternetz.de/community/threads/65626-RP6-WIFI-und-Wireless-IMU-%28f%C3%BCr-Android%29 RP6 WIFI und Wireless IMU (für Android)]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===RP6 Sensor Board===&lt;br /&gt;
&lt;br /&gt;
'''Die Beschreibung zur Programmierung des RP6 Sensor Boards wurde ausgelagert in einen eigenen [[RP6_Sensor_Board_und_Xtra_Module#RP6_Sensor_Board_3|Artikel]]!'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Erfahrungsberichte==&lt;br /&gt;
&lt;br /&gt;
...in Arbeit...(kann aber gerne ergänzt werden)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Siehe auch==&lt;br /&gt;
* [[RP6]]&lt;br /&gt;
* [[RP6 - Programmierung]]&lt;br /&gt;
* [[RP6 Sensor Board und Xtra Module]]&lt;br /&gt;
* [[RP6 Kamera - Mitmach-Projekt]]&lt;br /&gt;
* [[RP6v2 I2C-Portexpander]]&lt;br /&gt;
* [[RP6v2 USB-RS232-Adapter]]&lt;br /&gt;
* [[RP6v2 Orientierung]]&lt;br /&gt;
* [[RP6 Multi IO Projekt]]&lt;br /&gt;
* [[RP6 Multi IO Projekt - Software]]&lt;br /&gt;
* [[RP6 ArduIO]]&lt;br /&gt;
* [[RP6 ArduIO - Software]]&lt;br /&gt;
* [[Induktive_Ladestation_f%C3%BCr_den_RP6|Induktive Ladestation für den RP6]]&lt;br /&gt;
* [[IR-bake_f%C3%BCr_den_RP6|IR-bake für den RP6]]&lt;br /&gt;
* [[CCRP5]]&lt;br /&gt;
* [[Wild Thumper]]&lt;br /&gt;
* [[Wild Thumper - Programmierung]]&lt;br /&gt;
* [[Yeti]]&lt;br /&gt;
* [[Asuro]]&lt;br /&gt;
* [[C't-Bot]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Weblinks==&lt;br /&gt;
'''Siehe auch die Weblinks im [http://www.rn-wissen.de/index.php/RP6#Weblinks RP6 Artikel]!'''&lt;br /&gt;
&lt;br /&gt;
* Ankündigung des RP6v2 im [http://www.roboternetz.de/community/threads/56964-NEWS-RP6v2-die-neue-Version-2-des-RP6-Robot-Systems RoboterNETZ] und im [http://www.arexx.com/forum/viewtopic.php?f=19&amp;amp;t=1778 AREXX Support Forum]&lt;br /&gt;
* Ankündigung der RP6v2 M256 WiFi und der Testaktion im [http://www.arexx.com/forum/viewtopic.php?f=19&amp;amp;t=1797 AREXX Support Forum]&lt;br /&gt;
* Beginn der &amp;quot;Testaktion: Kostenlose RP6v2-M256-WIFI Module!&amp;quot; im [http://www.roboternetz.de/community/threads/58161-Kostenlose-RP6-M256-WIFI-Module-für-Testanwender! Roboternetz RP6 Forum]&lt;br /&gt;
* Ende der &amp;quot;Testaktion: Kostenlose RP6v2-M256-WIFI Module!&amp;quot; nach Abstimmung im [http://www.roboternetz.de/community/threads/58389-Wählt-Gewinner-der-RP6v2-M256-WIFI-Module Roboternetz RP6 Forum]&lt;br /&gt;
* Newsartikel zur RP6v2 M256 WiFi im [http://www.roboternetz.de/community/threads/58160-Funk-Erweiterungsmodul-für-den-RP6-und-RP6v2-Gratis-für-Tester! RoboterNETZ]&lt;br /&gt;
* Diskussions-Thread zur RP6v2 M256 WiFi im [http://www.roboternetz.de/community/threads/58162-Diskussion-zum-RP6-M256-WIFI-Modul Roboternetz RP6 Forum]&lt;br /&gt;
* Diskussions-Thread zur RP6v2 M256 WiFi [http://www.roboternetz.de/community/threads/59739-Probleme-mit-M256-WIFI-1-2 mit &amp;quot;altem&amp;quot; Bootloader V1.2]&lt;br /&gt;
&lt;br /&gt;
* [http://www.arexx.com/rp6/downloads/RP6M256_WIFI_BOOTLOADER.zip RP6M256_WIFI_BOOTLOADER]&lt;br /&gt;
* [http://arexx.com/rp6/downloads/RP6M256_baudrate_test.zip RP6v2 M256 WiFi Baudraten Test]&lt;br /&gt;
* [http://www.arexx.com/rp6/downloads/rp6m256_wlan_config_de.txt RP6v2 M256 WiFi Liste mit möglichen Problemlösungen]&lt;br /&gt;
* Kleinserie: [http://www.roboternetz.de/community/threads/59797-Kleinserie-hardware-für-die-M256-WIFI Hardware für die RP6v2 M256 WiFi ('''RP6 Multi IO Projekt''')]&lt;br /&gt;
* Kleinserie: [http://www.roboternetz.de/community/threads/65296-I-O-ADC-und-DAC-Erweiterung-f%C3%BCr-RP6-3-3V-und-5V%21 I/O-, ADC- und DAC Erweiterung für RP6??? 3,3V und 5V!? ('''RP6 ArduIO Projekt''')]&lt;br /&gt;
* JM3 Engeneering: [http://www.jm3-engineering.com/rp6.htm RP6 Roboter Erweiterung]&lt;br /&gt;
* Ankündigung einer Sensorerweiterungsplatine für die RP6v2 M256 WiFi im [http://www.roboternetz.de/community/threads/63595-Neue-Hardware-f%C3%BCr-RP6%28v2%29?p=590129&amp;amp;viewfull=1#post590129 Roboternetz RP6 Forum]&lt;br /&gt;
* Erfahrungsbericht zur Sensorerweiterungsplatine im [http://www.arexx.com/forum/viewtopic.php?f=19&amp;amp;t=2498 AREXX Support Forum] und im [http://www.roboternetz.de/community/threads/64414-RP6-Sensor-Board-Erster-Eindruck Roboternetz RP6 Forum]&lt;br /&gt;
&lt;br /&gt;
* [http://www.rn-wissen.de/index.php/RP6_mit_AVR_Studio RP6 mit AVR Studio]&lt;br /&gt;
&lt;br /&gt;
* [http://www.arexx.com/rp6 AREXX RP6 Startseite]&lt;br /&gt;
* [http://www.arexx.com/forum/viewforum.php?f=19 AREXX Support Forum]&lt;br /&gt;
&lt;br /&gt;
* [http://www.conrad.de/ce/de/product/191584/RP6-V2-ROBOTERSYSTEM RP6v2 bei CONRAD]&lt;br /&gt;
* [http://www.conrad.de/ce/de/product/191550/RP6-MEGA32-ERWEITERUNGSSATZ RP6 CONTROL M32 bei CONRAD]&lt;br /&gt;
* [http://www.conrad.de/ce/de/product/191563/RP6-CC-PRO-MEGA128-ERWEITERUNGSSATZ RP6 CCPRO M128 bei CONRAD]&lt;br /&gt;
* [http://www.conrad.de/ce/de/product/191609/Arexx-RP6-V2-Control-M256-WiFi-Kit-RP6v2-M256-WIFI RP6v2 M256 WiFi bei CONRAD]&lt;br /&gt;
* [http://www.conrad.de/ce/de/product/1082384/Arexx-RP6-Sensor-Board-RP6-JM03-61 RP6 Sensor Board bei CONRAD]&lt;br /&gt;
&lt;br /&gt;
* [http://www.microchip.com/wwwproducts/Devices.aspx?dDocName=en558370 WiFi-Modul RN-171] der RP6v2 M256 WiFi&lt;br /&gt;
* [http://www.arexx.com/rp6/downloads/RP6_M256_WIFI_MANUAL_DE_20120711.zip 1. Bedienungsanleitung] der RP6v2 M256 WiFi&lt;br /&gt;
&lt;br /&gt;
* [http://www.roboternetz.de/phpBB2/viewforum.php?f=49 Roboternetz RP6 Forum]&lt;br /&gt;
* &amp;quot;Geburt&amp;quot; des Wiki im RN-Forum: [http://www.roboternetz.de/community/threads/32793-RP6-Wiki-Artikel RP6-Wiki-Artikel]&lt;br /&gt;
* Roboter RoboPalm RP6: [http://www.ionix.de/doku.php/rp6/start Link]&lt;br /&gt;
&lt;br /&gt;
* [http://www.youtube.com/results?search_query=rp6 RP6 Videos]&lt;br /&gt;
* [http://de-de.facebook.com/pages/Robby-RP6/155118711202285 facebook]&lt;br /&gt;
* Abkündigung des RP6v2 im [https://www.roboternetz.de/community/threads/72730-Ende-des-RP6-Robotersystems-nach-fast-11-1-2-Jahren RoboterNETZ] &lt;br /&gt;
'''Siehe auch die Weblinks im [http://www.rn-wissen.de/index.php/RP6_Sensor_Board_und_Xtra_Module#Weblinks RP6 Sensor Board und Xtra Module Artikel]!'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Kategorie:Robotikeinstieg]]	 &lt;br /&gt;
[[Kategorie:Praxis]]&lt;br /&gt;
&lt;br /&gt;
==Autoren==&lt;br /&gt;
--[http://www.roboternetz.de/community/members/1972-Dirk Dirk] 11:30, 31. Mär 2022 (CET)&lt;/div&gt;</summary>
		<author><name>Dirk NO2</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=RP6_Sensor_Board_und_Xtra_Module&amp;diff=28585</id>
		<title>RP6 Sensor Board und Xtra Module</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=RP6_Sensor_Board_und_Xtra_Module&amp;diff=28585"/>
				<updated>2022-03-31T13:30:51Z</updated>
		
		<summary type="html">&lt;p&gt;Dirk NO2: /* Autoren */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Bild:RP6_Sensor_Board.jpg|Das RP6 Sensor Board|right|500px]]&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_Xtra_module.JPG|RP6 Xtra module|right|500px]]&lt;br /&gt;
==Was bisher geschah==&lt;br /&gt;
'''Siehe auch &amp;quot;Was bisher geschah&amp;quot; im [http://www.rn-wissen.de/index.php/RP6v2#Was_bisher_geschah RP6v2] und im [http://www.rn-wissen.de/index.php/RP6#Was_bisher_geschah RP6] Artikel!'''&lt;br /&gt;
&lt;br /&gt;
Mit, 27. Nov 2013 - Ankündigung einer Sensorerweiterungsplatine, die an die RP6v2-M256-WIFI angeschlossen werden kann&amp;lt;br/&amp;gt;&lt;br /&gt;
Sam, 22. Feb 2014 - Auslieferungsbeginn des RP6 Sensor Boards, des I2C GPS Empfängers, des 3D Accelerometer Moduls und des Gyro Moduls&amp;lt;br/&amp;gt;&lt;br /&gt;
Mon, 17. Mär 2014 - Das RP6 Sensor Board ist &amp;quot;nicht lieferbar&amp;quot;, neuer Liefertermin angekündigt für den 12.06.2014 (!?)&amp;lt;br/&amp;gt;&lt;br /&gt;
Die, 25. Mär 2014 - Das RP6 Sensor Board ist wieder &amp;quot;sofort lieferbar&amp;quot;&amp;lt;br/&amp;gt;&lt;br /&gt;
August 2014 - Ein neues Xtra Modul wird von JM3 Engineering angekündigt: Das &amp;quot;Wetterstations Sensor Modul&amp;quot;&amp;lt;br/&amp;gt;&lt;br /&gt;
November 2014 - Das &amp;quot;Wetterstations Sensor Modul&amp;quot; ist bei [http://www.jm3-engineering.com/sensors.htm JM3 Engineering] als &amp;quot;BHT Modul&amp;quot; abgebildet und ein Manual verfügbar&amp;lt;br/&amp;gt;&lt;br /&gt;
Don, 22. Jan 2015 - Auslieferungsbeginn des BHT Moduls&amp;lt;br/&amp;gt;&lt;br /&gt;
Son, 18. Dez 2016 - Laut JM3 Engineering wird das 3D Accelerometer DIL Modul nicht mehr produziert, ist aber weiterhin erhältlich&amp;lt;br/&amp;gt;&lt;br /&gt;
Oktober 2017 - Das RP6 Sensor Board und der I2C GPS Empfänger sind bei CONRAD ausverkauft&amp;lt;br/&amp;gt;&lt;br /&gt;
April 2019 - Das Gyro Modul und das BHT Modul sind bei CONRAD ausverkauft&amp;lt;br/&amp;gt;&lt;br /&gt;
Mai 2020 - Die Experimentierplatine, das Backlight-Display, der Graustufen-Boden-Sensor, der Drehgeber-Satz RP6-ENCv3 und das 3D Accelerometer Modul sind bei CONRAD ausverkauft&amp;lt;br/&amp;gt;&lt;br /&gt;
Ende 2021 - Die RP6 CONTROL M32 Platine, die Ersatzräder, die Ersatzraupen und das RP6 USB-Interface RP6V2-TRANS sind bei CONRAD ausverkauft&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Allgemein==&lt;br /&gt;
Dieser Artikel beschreibt die Grundlagen und Programmierung des RP6 Sensor Boards und der RP6 Xtra Module. Dieses Erweiterungs-Modul und die Xtra Module sind Teile des RP6-Systems, das in den RN-Wissen-Artikeln [[RP6]], [[RP6v2]] und [[RP6_-_Programmierung|RP6 - Programmierung]] ausführlich beschrieben wird. Ausgegliedert aus den &amp;quot;Haupt-Artikeln&amp;quot; habe ich diese Module, da sie m.E. zu einer neuen &amp;quot;Ära&amp;quot; des RP6-Systems gehören:&lt;br /&gt;
&lt;br /&gt;
Sie wurden nicht mehr von '''[http://www.roboternetz.de/community/members/120-SlyD SlyD] (Dominik S. Herwald)''' in Zusammenarbeit mit '''[http://www.arexx.com/ AREXX]''' entwickelt, sondern ab 2013 von '''[http://jm3-engineering.com/ JM3 Engineering] (Dipl.-Ing. Jürgen Maisel)'''. Ab Februar 2014 waren dann das '''RP6 Sensor Board RP6-JM03-61''' ([http://www.conrad.de/ce/de/product/1082384/Arexx-RP6-Sensor-Board-RP6-JM03-61 1082384]) und die drei RP6 Xtra Module '''I2C GPS Empfänger JM3-GPS''' ([http://www.conrad.de/ce/de/product/1082385/Arexx-IC-GPS-Empfaenger-JM3-GPS 1082385]), '''Gyro Modul JM3-GYRO''' ([http://www.conrad.de/ce/de/product/1082386/Arexx-Gyro-Modul-JM3-GYRO 1082386]) und '''3D Accelerometer Modul JM3-3DA''' ([http://www.conrad.de/ce/de/product/1082387/Arexx-3D-Accelerometer-Modul-JM3-3DA 1082387]) bei CONRAD lieferbar. Einen ersten Eindruck vom Sensor Board kann man im RoboterNetz und AREXX Support Forum bekommen,- siehe unter [[RP6_Sensor_Board_und_Xtra_Module#Weblinks|Weblinks]]!&lt;br /&gt;
&lt;br /&gt;
===RP6 Sensor Board===&lt;br /&gt;
Das [[RP6_Sensor_Board_und_Xtra_Module#RP6_Sensor_Board_2|RP6 Sensor Board]] gehört zu den &amp;quot;Erweiterungs-Modulen&amp;quot; des RP6-Systems. '''Andere &amp;quot;Erweiterungs-Module&amp;quot; werden im [[RP6v2#Erweiterungs-Module|RP6v2]] und im [[RP6#Erweiterungs-Module|RP6]] Artikel beschrieben!'''&lt;br /&gt;
&lt;br /&gt;
Das ''RP6 Sensor Board'' ist das erste &amp;quot;Erweiterungs-Modul&amp;quot;, das nicht über einen eigenen Microprozessor verfügt,- es ist also ein ''passives Modul'', das von einem Microprozessor-System (z.B. RP6v2, M32, M128, M256 Wifi) angesteuert werden muss. Es ist ebenfalls das erste Modul, das nicht mehr über die rautenförmige Einbuchtung an der Vorderkante verfügt, sondern komplett rechteckig ist. Damit passt es (montiert auf den Standard-Abstandbolzen) nur auf den vorderen Platinenstapel 1 des RP6.&lt;br /&gt;
&lt;br /&gt;
===RP6 Xtra Module===&lt;br /&gt;
Die [[RP6_Sensor_Board_und_Xtra_Module#RP6_Xtra_Module_2|RP6 Xtra Module]] gehören zu den &amp;quot;Zubehör- und Ersatzteilen&amp;quot; des RP6-Systems. '''Über die weiteren &amp;quot;Zubehör- und Ersatzteile&amp;quot; zum RP6 informiert der entsprechende Abschnitt im [[RP6v2#Zubeh.C3.B6r_und_Ersatzteile|RP6v2]] und im [[RP6#Zubehör und Ersatzteile|RP6]] Artikel!'''&lt;br /&gt;
&lt;br /&gt;
Die ''RP6 Xtra Module'' unterscheiden sich von den weiteren &amp;quot;Zubehör- und Ersatzteilen&amp;quot; dadurch, dass sie selbstständige Sensor-Platinen sind, die ideal zum RP6-System passen, aber auch mit anderen Microcontroller-Plattformen nutzbar sind.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==RP6 Sensor Board==&lt;br /&gt;
Das RP6 Sensor Board RP6-JM03-61 ([http://www.conrad.de/ce/de/product/1082384/Arexx-RP6-Sensor-Board-RP6-JM03-61 1082384]) wurde am 27.11.2013 von [http://www.roboternetz.de/community/members/120-SlyD SlyD] angekündigt (siehe Weblink!).&lt;br /&gt;
&lt;br /&gt;
Aktuell (Oktober 2017) ist das RP6 Sensor Board bei CONRAD ausverkauft.&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_Sensor_Board.jpg|Das RP6 Sensor Board]]&lt;br /&gt;
&lt;br /&gt;
===Beschreibung===&lt;br /&gt;
(Laut Online-Katalog der Firma CONRAD!)&lt;br /&gt;
&lt;br /&gt;
''&amp;quot;Das RP6 Sensor Board erweitert die Möglichkeiten aller RP6 Roboter um wesentliche Sensorsignale für Robotik-Anwendungen wie zum Beispiel Dreharten (Yaw-Gyro), Kipp- und Neigewinkel, Kompassrichtung oder aber auch Zeit und Datum.&lt;br /&gt;
Sie können einfach mit zusätzlichen Sharp Sensoren Abstände genau messen, z.B. für autonome Fahrrouten oder falls der Sensor nach unten gerichtet ist, kann er Treppenstufen oder ähnliches entdecken. Außerdem gibt es die Möglichkeit z.B. die Sharp Sensoren ein- bzw. auszuschalten um Strom zu sparen. Zusätzlich können bis zu 8 Servos angesteuert werden um z.B. einen Roboterarm zu bewegen, der auch mechanisch einfach zu montieren ist. Um die Möglichkeiten des RP6 Sensor Boards komplett ausnutzen zu können, wird ein RP6V2 und RP6Wifi Control Board empfohlen. Die ermöglicht den Roboter über Wifi fernzusteuern oder Sensordaten auf dem Kommandozentrum (PC) z.B Kompassdaten, Temperatur oder Kipp- und Neigewinkel anzeigen zu lassen.&amp;quot;''&lt;br /&gt;
&lt;br /&gt;
'''Ausstattung'''&lt;br /&gt;
* Magnetometer- und Accelerometer für Kompassfunktion&lt;br /&gt;
* Gyro Sensor (Yaw)&lt;br /&gt;
* Sharp-Sensor Schnittstelle&lt;br /&gt;
* LED Scheinwerfer&lt;br /&gt;
* LED Treiber mit Smart Funktionen&lt;br /&gt;
* I²C Bus mit max. 400 kHz Übertragungsrate; Hot Swap I²C-Bus Buffer&lt;br /&gt;
* Taster mit LED&lt;br /&gt;
* Echtzeit-Uhr RTC&lt;br /&gt;
* Backupbatterie (Aufladung während des Betriebs)&lt;br /&gt;
* Expansion Port z.B. für GPS-I²C Bus Modul&lt;br /&gt;
* 8 Servo-Ausgänge mit eigenem Schaltregler&lt;br /&gt;
* 8 PWM Ausgänge&lt;br /&gt;
* 5 LED Ausgänge und 2 Digital-I/O Ausgänge.&lt;br /&gt;
&lt;br /&gt;
'''Lieferumfang'''&lt;br /&gt;
* RP6 Sensor Board&lt;br /&gt;
* Montage-Kit&lt;br /&gt;
* Kabel&lt;br /&gt;
* Anleitung und CD mit Dokumentation.&lt;br /&gt;
&lt;br /&gt;
====Blockschaltbild====&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_Sensor_Board_BSP.png|RP6 Sensor Board Blockschaltbild]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Technische Daten===&lt;br /&gt;
{|  {{Blauetabelle}} &lt;br /&gt;
|'''Mikrocontroller:'''&lt;br /&gt;
|kein&lt;br /&gt;
|-&lt;br /&gt;
|'''Speicher:'''&lt;br /&gt;
|kein&amp;lt;br/&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|'''Programmierung:'''&lt;br /&gt;
|C++ (GCC, u.a.) über externes µC-System&lt;br /&gt;
|-&lt;br /&gt;
|'''Vorhandene Sensoren:'''&lt;br /&gt;
|Temperatur, 3D Magnetfeld (Kompass), 3D Beschleunigung, Yaw-Gyro&amp;lt;br/&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|'''Vorhandene Aktoren:'''&lt;br /&gt;
|LED Controller (2 LEDs on board, 5 freie LED Ports), Status LED,&amp;lt;br/&amp;gt;Button, Servo (PWM) Controller für 8 Servos und 8 PWM-Kanäle,&amp;lt;br/&amp;gt;Real Time Clock (RTC), 2 freie I/O Ports&lt;br /&gt;
|-&lt;br /&gt;
|'''Abmessungen:'''&lt;br /&gt;
|(L &amp;amp;times; B &amp;amp;times; H) 112 &amp;amp;times; 90 &amp;amp;times; 19 mm&amp;lt;br/&amp;gt;(B + 5 mm durch Scheinwerfer vorn)&lt;br /&gt;
|-&lt;br /&gt;
|'''Ausführung:'''&lt;br /&gt;
|Fertig aufgebautes Erweiterungsmodul&lt;br /&gt;
|-&lt;br /&gt;
|'''Stromversorgung:'''&lt;br /&gt;
|6 AA NiMH Akkus (über die RP6v2 Base)&amp;lt;br/&amp;gt;und optionaler Zusatzakku 7,2..10 V für Servo Power&lt;br /&gt;
|-&lt;br /&gt;
|'''Hersteller:'''&lt;br /&gt;
|Arexx Niederlande&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Umbau-Optionen===&lt;br /&gt;
Hier soll beschrieben werden, welche Umbau-Optionen es für das RP6 Sensor Board gibt. Im Text gibt es Verweise auf den Schaltplan des RP6 Sensor Boards (RP6_Sensor_Board_Rev2_Schema.pdf) in der Form: (SP2: Bauteil). Dies bedeutet, dass man das Bauteil auf Blatt 2 des Schaltplans finden kann. Beispielhaft sind im folgenden Text Bestell-Nummern der Firma [http://www.conrad.de/ce/ CONRAD] genannt. Natürlich kann man die Teile auch bei anderen Versendern beziehen.&lt;br /&gt;
&lt;br /&gt;
====USRBUS- und XBUS-Wannenstecker====&lt;br /&gt;
Der zweite Wannenstecker für den XBUS (SP3: K14) und USRBUS (SP3: K16) kann nachbestückt werden.&lt;br /&gt;
Man braucht dazu: &lt;br /&gt;
* 2 Wannenstecker 2x7-polig gerade RM 2,54mm (CONRAD [http://www.conrad.de/ce/de/product/741687/Stiftleiste-Print-Montage-gerade-Rastermass-254-mm-Pole-2-x-7-10120556-BKL-Electronic-Inhalt-1-St 741687])&lt;br /&gt;
Die Wannenstecker lötet man auf die eingezeichneten Positionen.&lt;br /&gt;
&lt;br /&gt;
'''USRBUS-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''USRBUS''' || '''Sensor Board-Funktion''' || '''Verwendung''' || '''I/O'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Y1 || &amp;quot;ADC0&amp;quot; || SHARP vorn || I&lt;br /&gt;
|-&lt;br /&gt;
| 2 || Y2 || &amp;quot;ADC1&amp;quot; || Yaw-Gyro || I&lt;br /&gt;
|-&lt;br /&gt;
| 3 || Y3 || PWR || Power für&amp;lt;br/&amp;gt;SHARPs, CAM_IF,&amp;lt;br/&amp;gt;I2C-MODULE || O&lt;br /&gt;
|-&lt;br /&gt;
| 4 || Y4 || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 5 || Y5 || &amp;quot;ADC4&amp;quot; || SHARP hinten ||I&lt;br /&gt;
|-&lt;br /&gt;
| 6..14 || Y6..Y14 || || keine ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
'''XBUS-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''XBUS''' || '''M256-Port''' ||'''M256-Funktion''' || '''Sensor Board-Funktion''' || '''Jumper''' || '''Verwendung''' || '''I/O'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || GND || || GND || GND || || ||&lt;br /&gt;
|-&lt;br /&gt;
| 2 || GND || || GND || GND || || ||&lt;br /&gt;
|-&lt;br /&gt;
| 3 || VDD || || VDD|| VDD_1 || || VDD +5V ||&lt;br /&gt;
|-&lt;br /&gt;
| 4 || +UB || || +UB || VSS_1 || || CAM_IF Power ||&lt;br /&gt;
|-&lt;br /&gt;
| 5 || VDD || || VDD || VDD_1 || || VDD +5V ||&lt;br /&gt;
|-&lt;br /&gt;
| 6 || +UB || || +UB || VSS_1 || || CAM_IF Power ||&lt;br /&gt;
|-&lt;br /&gt;
| 7 || INTU || PJ4 || PCINT13 || INTU || || keine || I&lt;br /&gt;
|-&lt;br /&gt;
| 8 || INT1 || PJ3 || PCINT12 || INT1 || 3 || LSM303DLHC: INT1 || I&lt;br /&gt;
|-&lt;br /&gt;
| 9 || INT3 || PJ5 || PCINT14 || INT3 || 2&amp;lt;br/&amp;gt;5 || DS1339: SQW/INT_N&amp;lt;br/&amp;gt;LSM303DLHC: INT2 || I&amp;lt;br/&amp;gt;I&lt;br /&gt;
|-&lt;br /&gt;
| 10 || SCL || PD0 || SCL || SCL_M || || I2C-Bus || O&lt;br /&gt;
|-&lt;br /&gt;
| 11 || INT2 || PJ6 || PCINT15 || INT2 || 4 || MAX7311: INT_N || I&lt;br /&gt;
|-&lt;br /&gt;
| 12 || SDA || PD1 || SDA || SDA_M || || I2C-Bus || I/O&lt;br /&gt;
|-&lt;br /&gt;
| 13 || MRESET || || MRESET || MRESET || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 14 || GND || || GND || GND || || ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====I/O-Patchfield_1====&lt;br /&gt;
Dieses 2x 5-polige &amp;quot;Patchfield_1&amp;quot; (SP3: K8), beschriftet mit &amp;quot;I/O&amp;quot; liegt neben dem Wannenstecker I/O und weist dieselbe Belegung auf. Möchte man auf dem Sensor Board Verbindungen über den Wannenstecker I/O zu einer angeschlossenen Microprozessor-Platine herstellen, dann kann man auf das &amp;quot;Patchfield_1&amp;quot; eine Stiftleiste löten.&lt;br /&gt;
Man braucht dazu: &lt;br /&gt;
* 2-reihige Stiftleiste RM 2,54mm (z.B. 2x40-polig [http://www.conrad.de/ce/de/product/741306/Doppelreihige-Stiftleiste-RM-254-gerade-Pole-2-x-40-10120173-BKL-Electronic-Inhalt-1-St 741306]) &lt;br /&gt;
Man trennt von der 2-reihigen Stiftleiste 2x5 Kontakte ab und lötet sie auf die Lötpunkte &amp;quot;I/O&amp;quot;. Zuvor muss man u.U. Lötzinnreste aus den Lötpunkten mit Entlötlitze bzw. Entlötsaugpumpe entfernen.&lt;br /&gt;
&lt;br /&gt;
'''Stecker I/O an M256 IO_PWM/T0/T1:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''M256-Port''' ||'''M256-Funktion''' || '''Sensor Board-Funktion''' || '''Verwendung''' || '''I/O'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || PD4 || ICP1 || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 2 || || GND || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 3 || PD6 || T1 || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 4 || PB7 || OC0A || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 5 || PG5 || OC0B || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 6 || PD7 || T0 || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 7 || PB5 || OC1A || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 8 || PK5 || ADC13 || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 9 || PB6 || OC1B || &amp;quot;PD5&amp;quot; || I2C Bus Buffer Enable || O&lt;br /&gt;
|-&lt;br /&gt;
| 10 || || VDD || || keine ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====ADC-Patchfield_2====&lt;br /&gt;
Dieses 2x 5-polige &amp;quot;Patchfield_2&amp;quot; (SP3: K9), beschriftet mit &amp;quot;ADC&amp;quot; liegt neben dem Wannenstecker ADC und weist dieselbe Belegung auf. Möchte man auf dem Sensor Board Verbindungen über den Wannenstecker ADC zu einer angeschlossenen Microprozessor-Platine herstellen, dann kann man auf das &amp;quot;Patchfield_2&amp;quot; eine Stiftleiste löten.&lt;br /&gt;
Man braucht dazu: &lt;br /&gt;
* 2-reihige Stiftleiste RM 2,54mm (z.B. 2x40-polig [http://www.conrad.de/ce/de/product/741306/Doppelreihige-Stiftleiste-RM-254-gerade-Pole-2-x-40-10120173-BKL-Electronic-Inhalt-1-St 741306]) &lt;br /&gt;
Man trennt von der 2-reihigen Stiftleiste 2x5 Kontakte ab und lötet sie auf die Lötpunkte &amp;quot;ADC&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
'''Stecker ADC an M256 ADC_IO2/CMP:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''M256-Port''' ||'''M256-Funktion''' || '''Sensor Board-Funktion''' || '''Jumper''' || '''Verwendung''' || '''I/O'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || PK0 || ADC8 || || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 2 || || GND || || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 3 || PK1 || ADC9 || &amp;quot;ADC4&amp;quot; || 6 || SHARP hinten || I&lt;br /&gt;
|-&lt;br /&gt;
| 4 || PE3 || OC3A/AIN1 || || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 5 || PK2 || ADC10 || || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 6 || || GND || || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 7 || PK3 || ADC11 || || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 8 || PE2 || XCK0/AIN0 || || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 9 || PK4 || ADC12 || || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 10 || || VDD || || || keine ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Anschluss-Optionen===&lt;br /&gt;
Hier soll beschrieben werden, welche Anschluss-Optionen es für das RP6 Sensor Board gibt. In erster Linie geht es dabei um die Belegung der vorhandenen Stecker bzw. Stiftleisten.&lt;br /&gt;
&lt;br /&gt;
Allgemein kann man Anschlüsse an Stiftleisten mit entsprechenden Steckbuchsen erreichen. Solche Steckbuchsen sind z.B. bei ELV erhältlich:&lt;br /&gt;
* Steckbuchse, 2-polig, RM 2,54mm ([http://www.elv.de/steckbuchse-2-polig.html ELV 68-016635])&lt;br /&gt;
* Steckbuchse, 3-polig, RM 2,54mm ([http://www.elv.de/steckbuchse-3-polig.html ELV 68-022503])&lt;br /&gt;
* Steckbuchse, 5-polig, RM 2,54mm ([http://www.elv.de/steckbuchse-5-polig.html ELV 68-023073])&lt;br /&gt;
Die Crimpkontakte dieser Steckbuchse werden an Litzen angequetscht (oder angelötet) und zum entsprechenden Sensor bzw. Aktor geführt. &lt;br /&gt;
&lt;br /&gt;
====I2C-MODULE====&lt;br /&gt;
Der I2C-MODULE Anschluss (SP1: M1) auf dem Sensor Board besteht aus einer 9-poligen Präzisions-Buchsenleiste RM 2,54mm (z.B. [http://www.conrad.de/ce/de/product/741360/Praezisions-Buchsenleiste-RM-254-gerade-Pole-1-x-20-10120832-BKL-Electronic-Inhalt-1-St 741360]). Wenn man eigene I2C-Module hier anschliessen will, braucht man zur Kontaktierung:&lt;br /&gt;
* Präzisions-Stiftleiste, 9-polig, RM 2,54mm (z.B. [http://www.conrad.de/ce/de/product/741307/Praezisions-Stiftleiste-RM-254-gerade-Pole-1-x-20-10120536-BKL-Electronic-Inhalt-1-St 741307])&lt;br /&gt;
&lt;br /&gt;
'''I2C-MODULE-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''Sensor Board&amp;lt;br/&amp;gt;-Funktion (M1)''' || '''Verwendung''' || '''I/O''' |||| [[RP6_Sensor_Board_und_Xtra_Module#I2C_GPS_Empf.C3.A4nger_JM3-GPS|'''I2C GPS Empfänger]]&amp;lt;br/&amp;gt;-Funktion (K1)''' ||&lt;br /&gt;
[[RP6_Sensor_Board_und_Xtra_Module#BHT_Modul_JM3-BHT31|'''BHT Modul]]&amp;lt;br/&amp;gt;-Funktion (K1)'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || VCC || +5V || |||| VCC_1 || VDD&lt;br /&gt;
|-&lt;br /&gt;
| 2 || SCLOUT || Buffered I2C-Bus || O |||| SCL/SCK || SCL&lt;br /&gt;
|-&lt;br /&gt;
| 3 || SDAOUT || Buffered I2C-Bus || I/O |||| SDA/MOSI || SDA&lt;br /&gt;
|-&lt;br /&gt;
| 4 || NC || keine || |||| ||&lt;br /&gt;
|-&lt;br /&gt;
| 5 || I/O1 || Status LED || O |||| ||&lt;br /&gt;
|-&lt;br /&gt;
| 6 || I/O2 || Taster || I |||| ||&lt;br /&gt;
|-&lt;br /&gt;
| 7 || NC || keine || |||| ||&lt;br /&gt;
|-&lt;br /&gt;
| 8 || GND || GND (geschaltet!) || |||| GND || GND&lt;br /&gt;
|-&lt;br /&gt;
| 9 || GND || GND (geschaltet!) || |||| GND || GND&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====CAM_IF====&lt;br /&gt;
Der CAM_IF Anschluss (SP1: K28) ist eine 2x 3-polige Stiftleiste mit der folgenden Belegung:&lt;br /&gt;
&lt;br /&gt;
'''CAM_IF-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''Sensor Board&amp;lt;br/&amp;gt;-Funktion (K28)''' || '''Verwendung''' || '''I/O'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || GND || GND (geschaltet!) ||&lt;br /&gt;
|-&lt;br /&gt;
| 2 || VSS_1 || +7,2..10V (RP6: +UB) ||&lt;br /&gt;
|-&lt;br /&gt;
| 3 || SCLOUT || Buffered I2C-Bus || O&lt;br /&gt;
|-&lt;br /&gt;
| 4 || SDAOUT || Buffered I2C-Bus || I/O&lt;br /&gt;
|-&lt;br /&gt;
| 5 || SCL_M || I2C-Bus || O&lt;br /&gt;
|-&lt;br /&gt;
| 6 || SDA_M || I2C-Bus || I/O&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====IO_EXT====&lt;br /&gt;
Der IO_EXT Anschluss (SP1: K19) ist eine 2x 2-polige Stiftleiste mit der folgenden Belegung:&lt;br /&gt;
&lt;br /&gt;
'''IO_EXT-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''Sensor Board&amp;lt;br/&amp;gt;-Funktion (K19)''' || '''Verwendung''' || '''I/O'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || MAX7311: I/O1.2 || freier I/O Port || I/O&lt;br /&gt;
|-&lt;br /&gt;
| 2 || GND || ||&lt;br /&gt;
|-&lt;br /&gt;
| 3 || MAX7311: I/O1.1 || freier I/O Port || I/O&lt;br /&gt;
|-&lt;br /&gt;
| 4 || GND || ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====PWM_OUT====&lt;br /&gt;
Der PWM_OUT Anschluss (SP5: K12) ist eine 2x 4-polige Stiftleiste mit der folgenden Belegung:&lt;br /&gt;
&lt;br /&gt;
'''PWM_OUT-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''Sensor Board&amp;lt;br/&amp;gt;-Funktion (K12)''' || '''Verwendung''' || '''I/O'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || PCA9685: PWM0 || freier PWM Port || O&lt;br /&gt;
|-&lt;br /&gt;
| 2 || PCA9685: PWM1 || freier PWM Port || O&lt;br /&gt;
|-&lt;br /&gt;
| 3 || PCA9685: PWM2 || freier PWM Port || O&lt;br /&gt;
|-&lt;br /&gt;
| 4 || PCA9685: PWM3 || freier PWM Port || O&lt;br /&gt;
|-&lt;br /&gt;
| 5 || PCA9685: PWM4 || freier PWM Port || O&lt;br /&gt;
|-&lt;br /&gt;
| 6 || PCA9685: PWM5 || freier PWM Port || O&lt;br /&gt;
|-&lt;br /&gt;
| 7 || PCA9685: PWM6 || freier PWM Port || O&lt;br /&gt;
|-&lt;br /&gt;
| 8 || PCA9685: PWM7 || freier PWM Port || O&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====TP1====&lt;br /&gt;
Am Testpunkt TP1 (SP4: TP1) kann man das Signal SQW/INT_N der RTC (DS1339) prüfen/messen.&lt;br /&gt;
&lt;br /&gt;
====LEDs====&lt;br /&gt;
=====Rücklichter=====&lt;br /&gt;
Der Rücklichter Anschluss (SP1: K10) ist eine 2-polige Stiftleiste mit der folgenden Belegung:&lt;br /&gt;
&lt;br /&gt;
'''Rücklichter-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''Sensor Board&amp;lt;br/&amp;gt;-Funktion (K10)''' || '''Verwendung''' || '''I/O'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || TCA6507: P3 || Rücklicht rechts || O&lt;br /&gt;
|-&lt;br /&gt;
| 2 || TCA6507: P4 || Rücklicht links || O&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=====Display-Hintergrundbeleuchtung=====&lt;br /&gt;
Der Display-Hintergrundbeleuchtung Anschluss (SP1: K7) ist eine 2-polige Stiftleiste mit der folgenden Belegung:&lt;br /&gt;
&lt;br /&gt;
'''Display-Hintergrundbeleuchtung-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''Sensor Board&amp;lt;br/&amp;gt;-Funktion (K7)''' || '''Verwendung''' || '''I/O'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || TCA6507: P0 || Display-Hintergrundbeleuchtung || O&lt;br /&gt;
|-&lt;br /&gt;
| 2 || VDD_1 || +5V ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=====Freie Ausgänge=====&lt;br /&gt;
Der freie Ausgang 1 Anschluss (SP1: K4) ist eine 2-polige Stiftleiste mit der folgenden Belegung:&lt;br /&gt;
&lt;br /&gt;
'''Freier Ausgang 1-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''Sensor Board&amp;lt;br/&amp;gt;-Funktion (K4)''' || '''Verwendung''' || '''I/O'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || TCA6507: P1 || freier LED Port || O&lt;br /&gt;
|-&lt;br /&gt;
| 2 || VDD_1 || +5V ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Der freie Ausgang 2 Anschluss (SP1: K2) ist eine 2-polige Stiftleiste mit der folgenden Belegung:&lt;br /&gt;
&lt;br /&gt;
'''Freier Ausgang 2-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''Sensor Board&amp;lt;br/&amp;gt;-Funktion (K2)''' || '''Verwendung''' || '''I/O'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || TCA6507: P2 || freier LED Port || O&lt;br /&gt;
|-&lt;br /&gt;
| 2 || VDD_1 || +5V ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====SHARP Sensoren====&lt;br /&gt;
Das RP6 Sensor Board verfügt über zwei Stecker SHARP_F (SP1: K5) und SHARP_R (SP1: K3) zum Anschluß von analogen SHARP Infrarot-Distanz-Sensoren. Folgende SHARP Sensoren sind anschließbar:&lt;br /&gt;
* 1. SHARP Distanz-Sensor GP2Y0A41SK0F ([http://www.conrad.de/ce/de/product/504596/Distanz-Sensor-GP2Y0A41SK0F-Sharp-GP2Y0A41SK0F-Messbereiche-Erfassungsbereich-4-30-cm-5-VDC 504596]), Messbereich 4..30cm&lt;br /&gt;
* 2. SHARP Distanz-Sensor GP2Y0A21YK0F ([http://www.conrad.de/ce/de/product/504591/Distanz-Sensor-GP2Y0A21YK0F-Sharp-GP2Y0A21YK0F-Messbereiche-Erfassungsbereich-10-80-cm-5-VDC 504591]), Messbereich 10..80cm&lt;br /&gt;
* 3. SHARP Distanz-Sensor GP2Y0A02YK ([http://www.conrad.de/ce/de/product/185364/Distanz-Sensor-GP-2-Y0A-02-YK-Sharp-GP-2-Y0A-02-YK-Messbereiche-Erfassungsbereich-20-150-cm-5-VDC 185364]), Messbereich 20..150cm&lt;br /&gt;
* 4. SHARP Distanz-Sensor GP2Y0A710K0F ([http://www.conrad.de/ce/de/product/504597/Distanz-Sensor-GP2Y0A710K0F-Sharp-GP2Y0A710K0F-Messbereiche-Erfassungsbereich-100-550-cm-5-VDC 504597]), Messbereich 100..550cm&lt;br /&gt;
''Die Auswahl der geeigneten SHARP Sensoren hängt von der gewünschten Funktion ab: Zur Erkundung großer Räume eignet sich insbesondere der Typ 4 mit einer hohen Reichweite von 5,5m. Er ist aber ungeeignet, die Distanz von Objekten zu erkennen, die sich näher als 1m vor dem Sensor befinden. Ein guter Kompromiss zwischen Nahbereichsmessung und &amp;quot;Fernsicht&amp;quot; sind die Typen 2 (10..80cm) und 3 (20..150cm). Will man den Distanz-Sensor vor allem zur Vermeidung eins Sturzes von einer Treppe (Tiefenerkennung) oder nur zur Erkennung von Hindernissen direkt vor dem Roboter (Kollisionserkennung) benutzen, dann eignet sich insbesondere für den vorderen Sensor (SHARP_F) der Typ 1, da er im Nahbereich von 4 bis 30cm messen kann.''&lt;br /&gt;
&lt;br /&gt;
Für die Verbindung zwischen den beiden 3-poligen JST XH Steckern (K3, 5) auf dem Sensor Board und den SHARP-Sensoren braucht man auf der Sensor Board Seite folgende Stecker-/buchsenteile:&lt;br /&gt;
* 2x JST XH Gehäuse, 3-polig, RM 2,5mm ([http://www.conrad.de/ce/de/product/740583/Gehaeuse-RM-25-mm-Serie-XH-Rastermass-25-mm-Pole-3-Nennstrom-3-A-XHP-3-JST-Inhalt-1-St 740583])&lt;br /&gt;
* 6x JST XH Crimpkontakt f. RM 2,5mm ([http://www.conrad.de/ce/de/product/741112/Crimpkontakt-fuer-RM-25-mm-Serie-XH-Rastermass-25-mm-BXH-001T-P06-JST-Inhalt-1-St 741112])&lt;br /&gt;
Die Crimpkontakte dieser Steckbuchse werden an die meist 3-adrige Litze des Sensors angequetscht (oder angelötet). Zur Belegung des Sensor Anschlusses siehe das jeweilige Datenblatt!&lt;br /&gt;
&lt;br /&gt;
=====Vorn=====&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_Sensor_Board_SHARP_F.JPG|RP6 Sensor Board SHARP Sensor vorn|thumb]]&lt;br /&gt;
&lt;br /&gt;
Der vordere SHARP Sensor kann auch mechanisch am Sensor Board befestigt werden. Dazu gibt es an der Vorderkante der Platine zwei Befestigungslöcher.&lt;br /&gt;
&lt;br /&gt;
Das Bild rechts zeigt den SHARP Distanzsensor GP2Y0A02YK montiert vorn auf dem Sensor Board mit zwei M3 Gelenkbolzen ([http://www.conrad.de/ce/de/product/521043/Gelenkbolzen-1-x-Aussengewinde1-x-Innengewinde-Messing-vernickelt-Schluesselweite-55-mm/ 521043]) und passenden Schrauben/Muttern.&lt;br /&gt;
&lt;br /&gt;
'''Vorn-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''RP6v2-Port''' ||'''RP6v2-Funktion''' || '''Sensor Board&amp;lt;br/&amp;gt;-Funktion (K5)''' || '''Verwendung''' || '''I/O''' |||| '''SHARP Sensor&amp;lt;br/&amp;gt;-Funktion''' &lt;br /&gt;
|-&lt;br /&gt;
| 1 || PA0 || ADC0 || &amp;quot;ADC0&amp;quot; || SHARP vorn || I |||| Vo&lt;br /&gt;
|-&lt;br /&gt;
| 2 || || || VDD_1 || +5V || |||| Vcc&lt;br /&gt;
|-&lt;br /&gt;
| 3 || || || GND || GND (geschaltet!) || |||| GND&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=====Hinten=====&lt;br /&gt;
Der hintere SHARP Sensor kann z.B. an der Rückseite des RP6v2 Fahrgestells befestigt werden.&lt;br /&gt;
&lt;br /&gt;
'''Hinten-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''M256-Port''' ||'''M256-Funktion''' || '''Sensor Board&amp;lt;br/&amp;gt;-Funktion (K3)''' || '''Verwendung''' || '''I/O''' |||| '''SHARP Sensor&amp;lt;br/&amp;gt;-Funktion''' &lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| 1 || PK1 || ADC9 || &amp;quot;ADC4&amp;quot; || SHARP hinten || I |||| Vo&lt;br /&gt;
|-&lt;br /&gt;
| 2 || || || VDD_1 || +5V || |||| Vcc&lt;br /&gt;
|-&lt;br /&gt;
| 3 || || || GND || GND (geschaltet!) || |||| GND&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Servos====&lt;br /&gt;
=====Power=====&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_Sensor_Board_Servo-PWR.jpg|RP6 Sensor Board Servo-PWR Stecker|thumb]]&lt;br /&gt;
&lt;br /&gt;
An den SERVO_PWR Stecker (SP5: K1) muss ein Akku zur Stromversorgung der mit dem Sensor Board verbundenen Servos angeschlossen werden. Der Stecker hat folgende Belegung:&lt;br /&gt;
 &lt;br /&gt;
'''SERVO_PWR-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''Sensor Board&amp;lt;br/&amp;gt;-Funktion (K1)''' || '''Verwendung'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || GND_POWER || Servo Power GND&lt;br /&gt;
|-&lt;br /&gt;
| 2 || VSS_POWER || Servo Power Eingang +7,2..10V&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Der Akku zur Versorgung der Servos muss eine Nennspannung von 7,2..10V aufweisen. Der Schaltregler auf dem Sensor Board kann bei einer 5,0V Servo-Spannung Ströme bis 3,0A (Spitzen bis 5,0A) liefern. '''Die Polung des Akkus darf am Stecker SERVO_PWR nicht vertauscht werden.''' Siehe den oberen Teil der nebenstehenden Abbildung! Ratsam ist es, eine Sicherung 3,15A in die Plusleitung zwischen Akku und SERVO_PWR Stecker zu legen.&lt;br /&gt;
&lt;br /&gt;
Für die Verbindung zwischen dem 2-poligen JST XH Stecker (SERVO_PWR, K1) auf dem Sensor Board und dem Akku braucht man auf der Sensor Board Seite folgende Stecker-/buchsenteile:&lt;br /&gt;
* JST XH Gehäuse, 2-polig, RM 2,5mm ([http://www.conrad.de/ce/de/product/740549/Gehaeuse-RM-25-mm-Serie-XH-Rastermass-25-mm-Pole-2-Nennstrom-3-A-XHP-2-JST-Inhalt-1-St 740549])&lt;br /&gt;
* 2x JST XH Crimpkontakt f. RM 2,5mm ([http://www.conrad.de/ce/de/product/741112/Crimpkontakt-fuer-RM-25-mm-Serie-XH-Rastermass-25-mm-BXH-001T-P06-JST-Inhalt-1-St 741112])&lt;br /&gt;
Die Crimpkontakte dieser Steckbuchse werden an die 2-adrige Litze zum Akku angequetscht (oder angelötet).&lt;br /&gt;
&lt;br /&gt;
Wenn man keinen separaten Akku zur Versorgung der Servos nehmen will, kann man auch +UB der RP6v2 Base dafür nutzen. An +UB liegt die Akkuspannung der Base (Nennspannung 7,2V) über eine Sicherung F1 3,15A (RP6v2) bzw. 2,5A (RP6) auf dem Mainboard an. +UB kann man z.B. am [[RP6#EXT_Anschlu.C3.9F|EXT Anschluß der Base]] entnehmen. Die nebenstehende Abbildung zeigt im unteren Teil, an welchen Pins man dort +UB kontaktieren kann!&lt;br /&gt;
&lt;br /&gt;
Dabei ist zu beachten, dass die Sicherung F1 auf dem RP6(v2) Mainboard den nutzbaren Strom für die Servos deutlich begrenzt: Durch diese Sicherung fließt ja nicht nur der Servo-Strom, sondern auch der Strom für den RP6 und alle darauf montierten Zusatzplatinen. Wenn der RP6 also herumfährt und z.B. noch die IRCOMM-Sendedioden nutzt, bleibt kaum noch Stromreserve für die Servos auf dem Sensor Board übrig.&lt;br /&gt;
'''Das bedeutet: Man sollte unbedingt einen separaten Akku für die Servos auf dem Sensor Board benutzen!'''&lt;br /&gt;
&lt;br /&gt;
======SERVO_PWR-EXT Verbindung======&lt;br /&gt;
Für die Verbindung zwischen dem 2-poligen JST XH Stecker (SERVO_PWR, K1) auf dem Sensor Board und dem 8-poligen JST XH Stecker (EXT) auf dem RP6v2 Mainboard braucht man folgende Stecker-/buchsenteile:&lt;br /&gt;
* JST XH Gehäuse, 2-polig, RM 2,5mm ([http://www.conrad.de/ce/de/product/740549/Gehaeuse-RM-25-mm-Serie-XH-Rastermass-25-mm-Pole-2-Nennstrom-3-A-XHP-2-JST-Inhalt-1-St 740549])&lt;br /&gt;
* JST XH Gehäuse, 8-polig, RM 2,5mm ([http://www.conrad.de/ce/de/product/740928/Gehaeuse-RM-25-mm-Serie-XH-Rastermass-25-mm-Pole-8-Nennstrom-3-A-XHP-8-JST-Inhalt-1-St 740928])&lt;br /&gt;
* 10x JST XH Crimpkontakt f. RM 2,5mm ([http://www.conrad.de/ce/de/product/741112/Crimpkontakt-fuer-RM-25-mm-Serie-XH-Rastermass-25-mm-BXH-001T-P06-JST-Inhalt-1-St 741112])&lt;br /&gt;
Mit einer 2-adrigen Litze, die beidseits mit den Crimpkontakten verquetscht (oder verlötet) wird, verbindet man dann den SERVO_PWR Stecker mit dem EXT Stecker, wie in der Abbildung oben gezeigt. ''Achtung: Plus (+) und Minus (-) nicht vertauschen!''&lt;br /&gt;
 Ein passendes Kabel soll zukünftig (*) mitgeliefert werden.&lt;br /&gt;
&lt;br /&gt;
Auf dem RP6 Mainboard ist der 8-polige EXT Stecker noch nicht bestückt. Wenn man ihn nachrüsten will, muss man noch bestellen:&lt;br /&gt;
* JST XH Stiftleiste gerade, 8-polig, RM 2,5mm ([http://www.conrad.de/ce/de/product/740105/Stiftleiste-gerade-RM-25-mm-Serie-XH-Rastermass-25-mm-Pole-8-Nennstrom-3-A-B8B-XH-A-LFSN-JST-Inhalt-1-St 740105])&lt;br /&gt;
Die Stiftleiste wird auf das RP6 Mainboard gelötet, dabei weisen die beiden Einkerbungen an einer Längsseite der Stiftleiste nach hinten zum Rand des Mainboards.&lt;br /&gt;
 Auch diese Stiftleiste soll zukünftig (*) zum Lieferumfang gehören.&lt;br /&gt;
'''Zu *)''' Meinem RP6 Sensor Board (bestellt am 1.3.2014) lag das konfektionierte Kabel und die Stiftleiste noch nicht bei!&lt;br /&gt;
&lt;br /&gt;
=====Stecker=====&lt;br /&gt;
An die acht 3-poligen Stiftleisten SERVO_1 bis SERVO_8 (SP5: K6, 11, 29..34) können Servos angeschlossen werden. Direkt aufstecken kann man Servo-Steckbuchsen mit der Belegung von CONRAD, Graupner/JR und Robbe/Futaba (Versorgungsspannung Plus am mittleren Pin). Auf der Sensor Board Platine kann man den Pin 3 (Servo Power GND) der 3-poligen Stiftleisten daran erkennen, dass er näher zum rechten Platinenrand (Seite mit dem XBUS Stecker) angeordnet ist als der zugehörige Pin 1 (Servo Signal).&lt;br /&gt;
&lt;br /&gt;
Wenn Servos mit nicht passender Steckbuchse angeschlossen werden sollen, dann braucht man auf der Sensor Board Seite folgende Stecker-/buchsenteile für jedes Servo:&lt;br /&gt;
* Steckbuchse, 3-polig, RM 2,54mm ([http://www.elv.de/steckbuchse-3-polig.html ELV 68-022503])&lt;br /&gt;
Die Crimpkontakte dieser Steckbuchse werden an die 3-adrige Litze des Servos angequetscht (oder angelötet). &lt;br /&gt;
&lt;br /&gt;
'''SERVO_1..8-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''Sensor Board&amp;lt;br/&amp;gt;-Funktion (K6,11,29..34)''' || '''Verwendung''' || '''I/O''' |||| '''Servo-&amp;lt;br/&amp;gt;Kabelfarben'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || PCA9685: PWM15..8 || Servo Signal || O |||| Weiß, Orange&lt;br /&gt;
|-&lt;br /&gt;
| 2 || Servo_PWR || Servo Power +5V (geschaltet!) || |||| Rot&lt;br /&gt;
|-&lt;br /&gt;
| 3 || GND_POWER || Servo Power GND || |||| Schwarz, Braun&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Roboterarm RA2-HOBBY====&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_Sensor_Board_RA2-MINI.JPG|RP6 Sensor Board mit Roboterarm RA2-MINI|thumb]]&lt;br /&gt;
&lt;br /&gt;
In der Anleitung zum RP6 Sensor Board ist der Arexx Roboterarm RA2-HOBBY bzw. RA2-MINI [http://www.conrad.de/ce/de/product/191534/Arexx-Mini-Roboterarm-RA2-MINI (191534)] abgebildet. Er ist dort ohne Grundgestell und Controller-Platine auf dem Sensor Board befestigt.&lt;br /&gt;
Das Sensor Board eignet sich sehr gut zur Ansteuerung der 6 Servos des Roboterarms.&lt;br /&gt;
&lt;br /&gt;
Zur Montage des RA2-MINI auf dem Sensor Board geht man so vor:&lt;br /&gt;
* Lösen der 4 Rundkopfschrauben M3x6, die die Servobodenplatte mit den Abstandbolzen M3x30 auf der Controller-Platine verbinden (siehe Anleitung zum RA2-MINI, Seite 19!)&lt;br /&gt;
* Lösen der Servobodenplatte vom Bodenservo (siehe Anleitung zum RA2-MINI, Seite 8!)&lt;br /&gt;
* Bohren der Befestigungslöcher in die Servobodenplatte:&lt;br /&gt;
** Rechts-Links Lochabstand 4,75cm, Vorn-Hinten Lochabstand 4,1cm&lt;br /&gt;
** Ungefähre Lage der Löcher siehe Abbildung in der Anleitung zum Sensor Board, Seite 4!&lt;br /&gt;
** Markierung der Bohrlöcher auf der Rückseite der Servobodenplatte:&lt;br /&gt;
*** 1. Mit einer Hilfslinie die Hinterkante des Servoausschnitts (das ist die kürzere Kante, die näher am Rand der Bodenplatte liegt!) nach beiden Seiten verlängern&lt;br /&gt;
*** 2. Eine 2. Hilfslinie parallel zur ersten im Abstand von 1,4cm zur Mitte der Servobodenplatte hin einzeichnen&lt;br /&gt;
*** 3. Auf dieser Linie jetzt die beiden hinteren Bohrlöcher symmetrisch im Abstand von 4,75cm markieren&lt;br /&gt;
*** 4. Für die vorderen Bohrlöcher eine 3. Hilfslinie im Abstand von 4,1cm parallel zur 2. Linie einzeichnen&lt;br /&gt;
*** 5. Auf dieser Linie die beiden vorderen Bohrlöcher symmetrisch im Abstand von 4,75cm markieren&lt;br /&gt;
*** 6. Kontrolle: Die 4 markierten Bohrlochpositionen bilden ein Rechteck mit 4,1cm seitlicher und 4,75cm vorderer/hinterer Kantenlänge&lt;br /&gt;
** Bohren der 4 Löcher (D = 3,2mm) in die Servobodenplatte&lt;br /&gt;
* Befestigen des Bodenservos auf der Servobodenplatte (siehe Anleitung zum RA2-MINI, Seite 8!)&lt;br /&gt;
* Anbringen des Roboterarms auf dem Sensor Board mit 4 Abstandbolzen M3 (L = 30..50mm) und passenden Schrauben/Muttern&lt;br /&gt;
&lt;br /&gt;
Die Servo-Steckbuchsen werden dann ''in der selben Reihenfolge (S1..S6) wie vorher auf der Controller-Platine des Roboterarms'' auf die Stiftleisten SERVO_1 bis SERVO_6 des Sensor Boards gesteckt.&lt;br /&gt;
'''Man sollte unbedingt einen separaten Akku für die Servos auf dem Sensor Board benutzen!'''&lt;br /&gt;
&lt;br /&gt;
====Grafik-Display====&lt;br /&gt;
Ob es mal ein Grafik-Display für das RP6 Sensor Board geben wird, ist ''pure Spekulation''. Allerdings gibt es zwei Hinweise darauf, dass eine solche Hardware-Ergänzung kommen könnte:&lt;br /&gt;
* 1. Der vorbereitete Anschluss für eine [[RP6_Sensor_Board_und_Xtra_Module#Display-Hintergrundbeleuchtung|Display-Hintergrundbeleuchtung]]&lt;br /&gt;
* 2. Die 4 Befestigungslöcher in der Mitte des Sensor Boards&lt;br /&gt;
Wir werden sehen ...&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==RP6 Xtra Module==&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_Xtra_module.JPG|RP6 Xtra module|right|500px]]&lt;br /&gt;
&lt;br /&gt;
Von den '''AREXX RP6 Xtra Modulen''' sind bei [http://www.conrad.de/ce/ CONRAD] für den RP6v2 erhältlich:&lt;br /&gt;
* Arexx [[RP6_Sensor_Board_und_Xtra_Module#I2C_GPS_Empf.C3.A4nger_JM3-GPS|I2C GPS Empfänger JM3-GPS]] ([http://www.conrad.de/ce/de/product/1082385/Arexx-IC-GPS-Empfaenger-JM3-GPS 1082385] AUSVERKAUFT!)&lt;br /&gt;
* Arexx [[RP6_Sensor_Board_und_Xtra_Module#Gyro_Modul_JM3-GYRO|Gyro Modul JM3-GYRO]] ([http://www.conrad.de/ce/de/product/1082386/Arexx-Gyro-Modul-JM3-GYRO 1082386] AUSVERKAUFT!)&lt;br /&gt;
* Arexx [[RP6_Sensor_Board_und_Xtra_Module#3D_Accelerometer_Modul_JM3-3DA|3D Accelerometer Modul JM3-3DA]] ([http://www.conrad.de/ce/de/product/1082387/Arexx-3D-Accelerometer-Modul-JM3-3DA 1082387] AUSVERKAUFT!)&lt;br /&gt;
* Arexx [[RP6_Sensor_Board_und_Xtra_Module#BHT_Modul_JM3-BHT31|BHT Modul JM3-BHT31]] ([http://www.conrad.de/ce/de/product/1302995/Arexx-Asuro-xTend-BHT-JM3-BHT31 1302995] AUSVERKAUFT!)&lt;br /&gt;
&lt;br /&gt;
===I2C GPS Empfänger JM3-GPS===&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_I2C_GPS_Empfänger.JPG|RP6 I2C GPS Empfänger|thumb]]&lt;br /&gt;
&lt;br /&gt;
(Laut Online-Katalog der Firma CONRAD!)&lt;br /&gt;
&lt;br /&gt;
''&amp;quot;Universelles GPS-I²C-Bus Modul für RP6 Roboter. Der GPS Empfänger stellt die NMEA-0183 Datensätze GGA, RMC, GSA und VTG in den veschiedenen Registern zur Verfügung. Damit ist eine einfache Weiterverarbeitung möglich.&amp;quot;''&lt;br /&gt;
&lt;br /&gt;
Aktuell (Oktober 2017) ist der I2C GPS Empfänger bei CONRAD ausverkauft.&lt;br /&gt;
&lt;br /&gt;
====Beschreibung====&lt;br /&gt;
Der I2C GPS Empfänger ist eine kleine (38 x 23 mm) Zusatzplatine (RP6 Xtra Modul), die direkt auf das [[RP6_Sensor_Board_und_Xtra_Module#RP6_Sensor_Board_2|RP6 Sensor Board]] aufgesteckt werden kann. Sie kann aber auch überall eingesetzt werden, wo eine stabilisierte 5V Versorgungsspannung und ein 5V-I2C-Bus bis 400 kHz zur Verfügung steht.&lt;br /&gt;
&lt;br /&gt;
Die Platine ist bestückt mit dem &amp;quot;Fastrax GPS antenna module&amp;quot; [https://www.u-blox.com/de/positioning-antennas/gnss-antenna-modules/uc530.html UC530]. Als Backup-Batterie dient eine wieder aufladbare Lithium-Batterie ([http://www.farnell.com/datasheets/321180.pdf MS621FE]). Zur Kommunikation zwischen dem UC530 und dem I2C-Bus ist ein [http://www.atmel.com/Images/Atmel-8303-8-bit-AVR-Microcontroller-tinyAVR-ATtiny1634_Datasheet.pdf ATtiny1634] an Bord, der auch die Auswertung des [http://de.wikipedia.org/wiki/NMEA_0183 NMEA Protokolls] übernimmt. Die 3,3 V Versorgungsspannung wird auf der Platine durch einen Spannungsregler ([http://www.mouser.com/ds/2/405/lm3480-316799.pdf LM3480IM3-3.3]) erzeugt. Über den I2C-Bus können folgende Daten der NMEA-0183 Datensätze GGA, RMC, GSA und VTG auf einfache Weise gelesen werden:&lt;br /&gt;
&lt;br /&gt;
* Geograf. Breite&lt;br /&gt;
* Geograf. Länge&lt;br /&gt;
* GPS Status&lt;br /&gt;
* HDOP&lt;br /&gt;
* Satellitenzahl&lt;br /&gt;
* Kurs&lt;br /&gt;
* Geschwindigkeit&lt;br /&gt;
* Höhe&lt;br /&gt;
* UTC-Zeit&lt;br /&gt;
* Datum&lt;br /&gt;
* PDOP&lt;br /&gt;
* VDOP&lt;br /&gt;
* Satellit 1..12&lt;br /&gt;
&lt;br /&gt;
Der ATtiny1634 ist natürlich vorprogrammiert, kann aber über eine vorbereitete 6-polige ISP-Schnittstelle auf der Platine auch umprogrammiert werden.&lt;br /&gt;
&lt;br /&gt;
'''Lieferumfang'''&lt;br /&gt;
* I2C GPS Empfänger&lt;br /&gt;
* CD mit Anleitung und Software-Beispielen.&lt;br /&gt;
&lt;br /&gt;
====Technische Daten====&lt;br /&gt;
* Versorgungsspannung: 5,0 V +/- 5%&lt;br /&gt;
* Stromverbrauch: &amp;lt;= 20 mA (typ.)&lt;br /&gt;
* I2C-Bus Geschwindigkeit: &amp;lt;= 400 kHz&lt;br /&gt;
* GPS Antenne: eingebaut&lt;br /&gt;
* Backup Batterie: Lithium, im Betrieb wieder aufladbar&lt;br /&gt;
* Temperatur Bereich: -10 bis 65 °C&lt;br /&gt;
* Form Faktor: 38 x 23 mm&lt;br /&gt;
* Gewicht: ca. 6 g&lt;br /&gt;
* Empfänger Spezifikationen (UC530):&lt;br /&gt;
** Empfänger: GPS L1 C/A-Code, SPS&lt;br /&gt;
** Kanäle: 66/22 (Suche/Track)&lt;br /&gt;
** Tracking Empfindlichkeit: -165 dBm typ.&lt;br /&gt;
** Navigations Empfindlichkeit: -148 dbm typ (Kaltstart)&lt;br /&gt;
** Update Rate: 1 Sek.&lt;br /&gt;
** Positions Genauigkeit:&lt;br /&gt;
*** 3,0m (67%) typ. horizontal&lt;br /&gt;
*** 5,0m (67%) typ. vertikal&lt;br /&gt;
*** 0,02 m/s (50%) typ. Geschwindigkeit&lt;br /&gt;
** Zeit bis zum ersten Fix: typ. 31 Sek.&lt;br /&gt;
** Protokoll: NMEA-0183 Rev. 3.01&lt;br /&gt;
&lt;br /&gt;
====Anschluss-Schema====&lt;br /&gt;
Belegung des 9-poligen Anschluss-Steckers (K1) siehe in [[RP6_Sensor_Board_und_Xtra_Module#I2C-MODULE|dieser]] Tabelle!&lt;br /&gt;
&lt;br /&gt;
====Umbau-Optionen====&lt;br /&gt;
Wenn man den ATtiny1634 selbst programmieren will, muss man Stiftleisten auf die Platine löten.&lt;br /&gt;
&lt;br /&gt;
Man braucht dazu: &lt;br /&gt;
* 2-reihige Stiftleiste RM 2,54mm (z.B. 2x40-polig 741306) &lt;br /&gt;
&lt;br /&gt;
Man trennt von der 2-reihigen Stiftleiste 2x3 Kontakte ab und lötet sie auf die Punkte &amp;quot;ISP6&amp;quot;.&lt;br /&gt;
Mit einem ISP-Programmer kann dann eine neue Firmware geflasht werden. Die aktuelle Firmware des ATtiny1634 (Version 1.2) wird als .HEX mitgeliefert, leider ohne Source-Code.&lt;br /&gt;
&lt;br /&gt;
Vorsicht: Dabei kann der Prozessor im schlimmsten Fall nicht mehr ansprechbar sein oder der GPS Empfänger UC530 beschädigt werden. Man sollte diesen Umbau und die ISP-Programmierung nur machen, wenn man genau weiß, was man macht! &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Gyro Modul JM3-GYRO===&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_Gyro_Modul.JPG|RP6 Gyro Modul|right|200px]]&lt;br /&gt;
&lt;br /&gt;
(Laut Online-Katalog der Firma CONRAD!)&lt;br /&gt;
&lt;br /&gt;
''&amp;quot;Das universelle Gyro-Sensor Modul für RP6, RP6 V2, RP6 ATMEGA32 und das RP6 V2 Control M256 Wifi-Kit ist ideal zur Erkennung der Blockierung des Roboters in seiner Drehbewegung, sowie der Stabilisierung der Geradeausfahrt.&amp;quot;''&lt;br /&gt;
&lt;br /&gt;
Aktuell (April 2019) ist das Gyro Modul bei CONRAD ausverkauft. &lt;br /&gt;
&lt;br /&gt;
====Beschreibung====&lt;br /&gt;
Das Gyro Modul ist eine kleine (19 x 17 mm) Zusatzplatine (RP6 Xtra Modul), die im RP6-System genutzt werden kann. Es gibt zwar keinen direkt passenden &amp;quot;Steckplatz&amp;quot; auf einer der Microcontroller-Plattformen (RP6v2, M32, M128, M256 Wifi), jedoch ist der Anschluß einfach:&lt;br /&gt;
Benötigt werden +5V und GND, sowie ein freier ADC-Kanal, der bis 5V messen kann. Damit kann das Gyro Modul sehr universell eingesetzt werden. Es misst die Drehrate um die Z-Achse (Hochachse oder Yaw).&lt;br /&gt;
&lt;br /&gt;
Die Platine ist bestückt mit dem analogen Gyro-Sensor [http://www.st.com/web/en/resource/technical/document/datasheet/CD00254111.pdf LY330ALH], dessen Ausgangsspannung durch zwei OP-Amps ([http://www.ti.com.cn/cn/lit/ds/symlink/lm321.pdf LM321], [http://www.produktinfo.conrad.com/datenblaetter/00000-24999/001072615-da-01-en-IC_AMP_PREC_LMP7731MF_NOPB_SOT_23_5_TID.pdf LMP7731MF]) in Ruhe bei 2,5 V liegt. Höhere Ausgangsspannungen (bis 5 V) bedeuten eine Drehgeschwindigkeit nach LINKS, niedrigere (bis 0 V) eine Drehgeschwindigkeit nach RECHTS. Die 3,3 V Versorgungsspannung des LY330ALH wird auf der Platine durch einen Spannungsregler ([http://www.mouser.com/ds/2/405/lm3480-316799.pdf LM3480IM3-3.3]) erzeugt.&lt;br /&gt;
&lt;br /&gt;
'''Lieferumfang'''&lt;br /&gt;
* Gyro Modul&lt;br /&gt;
* CD mit Anleitung und Software-Beispielen.&lt;br /&gt;
&lt;br /&gt;
====Technische Daten====&lt;br /&gt;
&lt;br /&gt;
* VDD: 5,0 V +/- 5%&lt;br /&gt;
* Vout(0): 2,5 V +/- 2% (ohne Bewegung)&lt;br /&gt;
* Vout: Vout(0) + 10mV / dps +/- 2%&lt;br /&gt;
* Messbereich: ca. 200 dps max.&lt;br /&gt;
&lt;br /&gt;
====Anschluss-Schema====&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_Gyro_Modul_SP.JPG|RP6 Gyro Modul - Anschluss-Schema]]&lt;br /&gt;
&lt;br /&gt;
====Umbau-Optionen====&lt;br /&gt;
Am Gyro Modul gibt es nichts umzubauen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===3D Accelerometer Modul JM3-3DA===&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_3D_Accelerometer_Modul.JPG|RP6 3D Accelerometer Modul|right|105px]]&lt;br /&gt;
&lt;br /&gt;
(Laut Online-Katalog der Firma CONRAD!)&lt;br /&gt;
&lt;br /&gt;
''&amp;quot;Universeller 3-Achsen Beschleunigungssensor für RP6, RP6 V2, RP6 ATMEGA32 und das RP6 V2 Control M256 WIFI-Kit. Ideal zur Winkelmessung (Neigung-, Kipp-Winkel) und vieles mehr.&amp;quot;''&lt;br /&gt;
&lt;br /&gt;
Seit Mai 2020 ist das 3D Accelerometer Modul bei CONRAD ausverkauft.&lt;br /&gt;
&lt;br /&gt;
====Beschreibung====&lt;br /&gt;
&lt;br /&gt;
Das 3D Accelerometer Modul ist eine kleine (15 x 10 mm) Zusatzplatine (RP6 Xtra Modul), die direkt auf den EEPROM-Sockel (IC5) der Zusatzplatine [[RP6#RP6_CONTROL_M32_Platine|RP6 CONTROL M32]] gesteckt und über den SPI-Bus angesteuert werden kann. Das Accelerometer Modul kann aber auch mit allen Microcontroller-Plattformen betrieben werden, die eine stabilisierte 5V-Versorgungsspannung und einen SPI- oder I2C-Bus bieten.&lt;br /&gt;
&lt;br /&gt;
Die Platine ist bestückt mit dem 3D Beschleunigungs-Sensor [http://www.farnell.com/datasheets/1691680.pdf LIS302DLH]. Die 3,3 V Versorgungsspannung des LIS302DLH wird auf der Platine durch einen Spannungsregler ([http://www.mouser.com/ds/2/405/lm3480-316799.pdf LM3480IM3-3.3]) erzeugt.&lt;br /&gt;
&lt;br /&gt;
'''Lieferumfang'''&lt;br /&gt;
* 3D Accelerometer Modul&lt;br /&gt;
* CD mit Anleitung und Software-Beispielen.&lt;br /&gt;
&lt;br /&gt;
====Technische Daten====&lt;br /&gt;
&lt;br /&gt;
* VDD: 5,0 V +/- 5%&lt;br /&gt;
* Messbereiche: +-2 g, +-4 g, +-8 g&lt;br /&gt;
* Datenausgabe: 16 Bit&lt;br /&gt;
* Schnittstellen: I2C, SPI&lt;br /&gt;
&lt;br /&gt;
====Anschluss-Schema====&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_3D_Accelerometer_Modul_SP.JPG|RP6 3D Accelerometer Modul - Anschluss-Schema|350px]]&lt;br /&gt;
&lt;br /&gt;
====Umbau-Optionen====&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_3D_Accelerometer_Modul_M32.JPG|RP6 3D Accelerometer Modul auf der M32|right|500px]]&lt;br /&gt;
&lt;br /&gt;
'''Will man das Modul auf der M32 einsetzen, muss man auf dem 3D Accelerometer Modul die Widerstände R2 und R3 (falls vorhanden!) auslöten (siehe Anleitung zum Modul, Seiten 4/5!)''' und einen IC-Sockel an Position IC5 und einen Kondensator an Position C19 auf der M32 einlöten, siehe [[RP6#Zweites_SPI-EEPROM|hier]]!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die Abbildung rechts zeigt das 3D Accelerometer Modul auf der M32.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===BHT Modul JM3-BHT31===&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_BHT_Modul.PNG|RP6 BHT Modul|right|203px]]&lt;br /&gt;
&lt;br /&gt;
Dieses [http://jm3-engineering.com/sensors.htm BHT Modul] zur Messung von Luftdruck, Luftfeuchte und Temperatur war für das Ende des 3. Quartals 2014 angekündigt und ist nun ab dem 22.01.2015 lieferbar.&lt;br /&gt;
&lt;br /&gt;
(Laut Online-Katalog der Firma CONRAD!)&lt;br /&gt;
&lt;br /&gt;
''&amp;quot;Ein Luftdruck-, rel. Luftfeuchtigkeits- und Temperatursensor Modul für vielfältige Anwendungen. Es kann direkt in den Asuro Expansion-Port auf dem Asuro xTend Bord eingesteckt werden. Das Asuro Modul kann mit den anderen erhältlichen Modulen (Kompass/Gyro und RTC kombiniert werden (Stack-up)). Außerdem kann es auch auf dem RP6 Sensor Bord in dem I2C Modulsteckplatz verwendet werden. Das Sensor Modul verwendet den hochauflösenden Drucksensor-Chip MS5607-02BA und den Luftfeuchtigkeitssensor HTU21D von MEAS Switzerland mit I2C Bus Interface. Der barometrische Drucksensor ist für Höhenmesser und Variometer optimiert und hat eine Auflösung von 20cm. Der relative Luftfeuchtigkeits- und Temperatursensor bietet zuverlässige und genaue Daten, welche sich auch besonders für Wetterstations-Informationen eignen.&amp;quot;''&lt;br /&gt;
&lt;br /&gt;
Aktuell (April 2019) ist das BHT Modul bei CONRAD ausverkauft. &lt;br /&gt;
&lt;br /&gt;
====Beschreibung====&lt;br /&gt;
Das BHT Modul ist eine kleine (24 x 14 mm) Zusatzplatine (ASURO xTend bzw. RP6 Xtra Modul), die direkt auf das [[RP6_Sensor_Board_und_Xtra_Module#RP6_Sensor_Board_2|RP6 Sensor Board]] aufgesteckt werden kann. Sie kann auch auf dem [http://www.conrad.de/ce/de/product/1302085/Arexx-Asuro-xTend-Board-JM3-AXT3 Arexx Asuro xTend Board] und überall eingesetzt werden, wo eine stabilisierte 5V Versorgungsspannung und ein I2C-Bus bis 400 kHz zur Verfügung steht.&lt;br /&gt;
&lt;br /&gt;
Die Platine ist bestückt mit dem barometrischen Drucksensor [http://www.parallax.com/sites/default/files/downloads/29124-MS5607-02BA03-Datasheet.pdf MS5607-02BA] und dem relativen Luftfeuchtigkeits- und Temperatursensor [http://www.meas-spec.com/downloads/HTU21D.pdf HTU21D]. Die 3,0 V Versorgungsspannung der Sensoren wird auf der Platine durch einen Spannungsregler ([http://www.farnell.com/datasheets/78902.pdf LP2980AIM5-3.0]) erzeugt. &lt;br /&gt;
&lt;br /&gt;
'''Lieferumfang'''&lt;br /&gt;
* BHT Modul&lt;br /&gt;
* CD mit Dokumentation&lt;br /&gt;
&lt;br /&gt;
====Technische Daten====&lt;br /&gt;
&lt;br /&gt;
* Nennspannung: 3,3 V (?)&lt;br /&gt;
* Nennstrom: 0,2 mA (typ.) &amp;lt; 1,5mA peaktyp.&lt;br /&gt;
* I2C Bus Geschwindigkeit: 400kHz max.&lt;br /&gt;
* Sensor Modul mit MS5607-02BA und HTU21D&lt;br /&gt;
* Hohe Auflösung des Sensorelements - Höhe: 20cm /- rel. Luftfeuchtigkeit: 0,04%&lt;br /&gt;
* Schneller AD-Wandler&lt;br /&gt;
* Digitaler Drucksensor (24 bit ΔΣ ADC)&lt;br /&gt;
* Luftdruckbereich: 10 bis 1200 mbar&lt;br /&gt;
* Exzellente Langzeitstabilität&lt;br /&gt;
* Unmittelbare Desaturierung&lt;br /&gt;
* Kalibrierung in der Fabrik&lt;br /&gt;
&lt;br /&gt;
====Anschluss-Schema====&lt;br /&gt;
Belegung des 9-poligen Anschluss-Steckers (K1) siehe in [[RP6_Sensor_Board_und_Xtra_Module#I2C-MODULE|dieser]] Tabelle!&lt;br /&gt;
&lt;br /&gt;
====Umbau-Optionen====&lt;br /&gt;
&lt;br /&gt;
===Xtra Module auf einer Experimentierplatine===&lt;br /&gt;
&lt;br /&gt;
Die drei bis jetzt (09/2014) erhältlichen [[RP6_Sensor_Board_und_Xtra_Module#RP6_Xtra_Module_2|Xtra Module]], die die Navigation eines Roboters ermöglichen, können problemlos im RP6-System genutzt werden,- zwei davon sogar in Form des direkten Aufsteckens auf eine der Zusatz-Platinen: Für den [[RP6_Sensor_Board_und_Xtra_Module#I2C_GPS_Empf.C3.A4nger_JM3-GPS|I2C GPS Empfänger]] gibt es einen Steckplatz auf dem [[RP6_Sensor_Board_und_Xtra_Module#RP6_Sensor_Board_2|RP6 Sensor Board]], das [[RP6_Sensor_Board_und_Xtra_Module#3D_Accelerometer_Modul_JM3-3DA|3D Accelerometer Modul]] kann auf der [[RP6#RP6_CONTROL_M32_Platine|RP6 CONTROL M32]] aufgesteckt werden.&lt;br /&gt;
&lt;br /&gt;
Natürlich können die Xtra Module auch allein (&amp;quot;stand-alone&amp;quot;) ohne RP6 Sensor Board oder RP6 CONTROL M32 betrieben werden. Dazu kann man sie z.B. auf einer [[RP6#Experimentierplatine|Experimentierplatine]] aufbauen. &lt;br /&gt;
&lt;br /&gt;
Das soll hier mit einer kurzen Aufbauanleitung demonstriert werden.&lt;br /&gt;
&lt;br /&gt;
====Schaltplan====&lt;br /&gt;
&lt;br /&gt;
Aber zunächst der Schaltplan:&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6v2_Xtra_Module_SP.jpg|RP6 Experimentierplatine für Xtra Module - Schaltplan]]&lt;br /&gt;
&lt;br /&gt;
Man erkennt die drei XTra Module, die (bis auf das Gyro Modul) an den I2C-Bus am XBUS Stecker des RP6 angeschlossen sind. Das [[RP6_Sensor_Board_und_Xtra_Module#Gyro_Modul_JM3-GYRO|Gyro Modul JM3-GYRO]] wird nicht über I2C angesteuert, sondern liefert an seinem Pin OUT ein analoges Ausgangssignal, das mit einem ADC Eingang (0..5V) gemessen werden kann.&lt;br /&gt;
&lt;br /&gt;
Der Jumper (Steckbrücke) JP1 dient zum Einstellen der I2C-Adresse des 3D Accelerometer Moduls (0x30, 0x32).&lt;br /&gt;
Mit JP2/3 wird die [[RP6_Sensor_Board_und_Xtra_Module#Optionale_Ansteuerung|Betriebsart des Gyro Moduls]] festgelegt.&lt;br /&gt;
Die Jumper JP4 bis JP9 dienen zur Verteilung von INT1, INT2 des 3D Accelerometer Moduls und des OUT Signals des Gyro Moduls auf die INT-Anschlüsse INT1..3, INTU des XBUS. Wenn man die Interrupts des 3D Accelerometer Moduls nicht nutzen will, kann man die Jumper JP4 bis JP8 auch weglassen. Mit JP9 wird das analoge Signal des Gyro Moduls an INT1 des XBUS gelegt. Dies ist nur dann sinnvoll, wenn man die Platine mit der RP6v2 Base betreibt, weil hier an INT1 ein ADC Eingang (ADC4) liegt. Bei allen anderen Plattformen des RP6-Systems (M32, CCPRO M128, M256 WiFi) muss JP9 offen bleiben.&lt;br /&gt;
&lt;br /&gt;
Mit dieser Schaltung kann man also den Beschleunigungssensor (3D Accelerometer) und den GPS Empfänger über I2C auslesen. Der Gyro wird entweder mit ADC4 der RP6v2 Base (JP9 geschlossen!) ausgewertet oder durch einen anderen ADC Eingang. Dazu kann man das Ausgangssignal des Gyros an Pin 3 der Stiftleiste ST1 abnehmen. Von dort kann es z.B. zu ADC0 oder ADC1 der RP6v2 Base oder der RP6 CONTROL M32 geführt werden oder zu einem beliebigen ADC Eingang der CCPRO M128 oder der M256 WiFi. Die Stiftleiste ST1 liegt direkt neben dem USRBUS, so dass die Verbindung auch über den USRBUS hergestellt werden kann. Dazu verbindet man Pin 3 von ST1 mit einem Pin (Y1..Y14) des USRBUS.&lt;br /&gt;
&lt;br /&gt;
====Bestückungsplan====&lt;br /&gt;
&lt;br /&gt;
So kann z.B. der Bestückungsplan mit Leiterbahnführung auf der Experimentierplatine (Exp) aussehen:&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6v2_Xtra_Module.jpg|RP6 Experimentierplatine für Xtra Module]]&lt;br /&gt;
&lt;br /&gt;
Was braucht man allgemein für den Aufbau einer Schaltung auf der Exp:&lt;br /&gt;
* Seitenschneider, Schere, Zange&lt;br /&gt;
* Lötkolben 25..30 Watt, Lötzinn&lt;br /&gt;
* Plastik 70 Schutzlack (CONRAD 813621)&lt;br /&gt;
* Isolierter Schaltdraht YV 0,20 mm² (CONRAD 606065)&lt;br /&gt;
* Versilberter CU-Draht 0,6 mm (CONRAD 605581)&lt;br /&gt;
&lt;br /&gt;
Mit dem versilberten CU-Draht stellt man auf der Unterseite (= Lötseite) der Exp Verbindungen zwischen den Bauteilen her; mit dem isolierten Schaltdraht werden Drahtbrücken auf der Oberseite (= Bestückungsseite) der Exp eingesetzt. Die Lage der Xtra Module und der Verbindungen kann man im Bestückungsplan (s.o.!) erkennen, Drahtbrücken sind rot hervorgehoben.&lt;br /&gt;
&lt;br /&gt;
Zusätzlich zu den RP6 Xtra Modulen braucht man folgende Bauteile (Bestell-Nummern von CONRAD):&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| Anzahl || Bestell-Nr. || Bauteil-Bezeichnung || Verwendung&lt;br /&gt;
|-&lt;br /&gt;
| 1 || [http://www.conrad.de/ce/de/product/191537/Arexx-RP6-Experimentierplatine?queryFromSuggest=true 191537] || RP6 Experimentierplatine || &lt;br /&gt;
|-&lt;br /&gt;
| 1 || [http://www.conrad.de/ce/de/product/189600/Praezisions-IC-Fassung-MPE-Garry-MP-083-STG-BU-Pole-8-Rastermass-762-mm-Material-Kontaktfeder-025-Gold-ueber-Nickel 189600] || Präzisions-IC-Fassung (8 Pole) || Stecksockel für Accelerometer Modul&lt;br /&gt;
|-&lt;br /&gt;
| 1 || [http://www.conrad.de/ce/de/product/741360/Praezisions-Buchsenleiste-RM-254-gerade-Pole-1-x-20-10120832-BKL-Electronic-Inhalt-1-St 741360] || Präzisions-Buchsenleiste RM 2,54mm (9 Pole) || Stecksockel für GPS Empfänger&lt;br /&gt;
|-&lt;br /&gt;
| 1 || [http://www.conrad.de/ce/de/product/741307/Praezisions-Stiftleiste-RM-254-gerade-Pole-1-x-20-10120536-BKL-Electronic-Inhalt-1-St 741307] || Präzisions-Stiftleiste RM 2,54mm (2 x 4 Pole) || Stecksockel für Gyro Modul&lt;br /&gt;
|-&lt;br /&gt;
| 1 || [http://www.conrad.de/ce/de/product/741119/Stiftleiste-RM-254-gerade-Pole-1-x-36-10120182-BKL-Electronic-Inhalt-1-St 741119] || 1-reihige Stiftleiste RM 2,54mm (ges. 36-polig) || JP1, ST1&lt;br /&gt;
|-&lt;br /&gt;
| 1 || [http://www.conrad.de/ce/de/product/741186/Doppelreihige-Stiftleiste-RM-254-gerade-Pole-2-x-8-10120514-BKL-Electronic-Inhalt-1-St 741186] || 2-reihige Stiftleiste RM 2,54mm (ges. 8-polig) || JP2..9&lt;br /&gt;
|-&lt;br /&gt;
| 1 || [http://www.conrad.de/ce/de/product/742902/Codier-Adressierbruecken-Set-Rastermass-25254-mm-10120906-BKL-Electronic-Inhalt-1-Set 742902] || Sechs Codierbrücken (aus Set) || Steckbrücken&lt;br /&gt;
|-&lt;br /&gt;
| 2 || [http://www.conrad.de/ce/de/product/453099/Keramik-Kondensator-01-F-50-V-20-B-x-H-508-mm-x-508-mm-1-St 453099] || Keramik Kondensator 100 nF || Blockkondensatoren C2, C3&lt;br /&gt;
|-&lt;br /&gt;
| 1 || [http://www.conrad.de/ce/de/product/421986/Elektrolyt-Kondensator-radial-bedrahtet-25-mm-10-F-50-V-20--x-H-5-mm-x-11-mm-Panasonic-EEUFC1H100LH-1-St 421986] || Elektrolyt Kondensator 10 uF/50 V || Spannungsstabilisierung C1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Viel Erfolg beim Aufbau!&lt;br /&gt;
&lt;br /&gt;
 Natürlich muss man nicht alle drei Sensoren aufbauen!&lt;br /&gt;
 Man kann einfach den/die Sensor/en weglassen, den/die man nicht nutzen will!&lt;br /&gt;
&lt;br /&gt;
Noch ein Wort zur Programmierung des 3D Accelerometer Moduls: Es wird auf dieser Exp über den I2C Bus angesteuert. Damit kann man die [[RP6_Sensor_Board_und_Xtra_Module#RP6_CONTROL_M32:_ACCSENS_Library|nachfolgende Library]] für dieses Modul hier NICHT benutzen!&lt;br /&gt;
&lt;br /&gt;
====Magnetfeldsensor====&lt;br /&gt;
&lt;br /&gt;
Wenn man die oben beschriebene Experimentierplatine aufgebaut hat, hat man für die Navigation eines mobilen Roboters (wie des RP6v2) schon drei benötigte Sensoren zur Verfügung: einen GPS Empfänger, einen 3D-Beschleunigungssensor und einen 1D-Gyrosensor.&lt;br /&gt;
&lt;br /&gt;
Was fehlt, ist z.B. ein '''Magnetfeldsensor (Kompass-Sensor)''', mit dem der Roboter die Himmelsrichtung feststellen kann. Einen Magnetfeldsensor gibt es (noch) nicht als Xtra Modul.&lt;br /&gt;
&lt;br /&gt;
Auf der beschriebenen Experimentierplatine ist durchaus noch Platz (z.B. in der rechten oberen Ecke) für einen Magnetfeldsensor. Geeignet ist z.B. das 2D-Kompassmodul HDMM01 ([http://www.pollin.de/shop/dt/NTM4OTgxOTk-/Bausaetze_Module/Module/Kompassmodul_HDMM01.html Pollin 94-810 164] NICHT MEHR LIEFERBAR!).&lt;br /&gt;
&lt;br /&gt;
Hier ist der um den Magnetfeldsensor erweiterte Schaltplan:&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6v2_Xtra_Module_HDMM01_SP.jpg|RP6 Experimentierplatine für Xtra Module und HDMM01 - Schaltplan]]&lt;br /&gt;
&lt;br /&gt;
Das kleine Kompassmodul dürfte doch noch einfach auf der Experimentierplatine unterzubringen sein, oder?&lt;br /&gt;
&lt;br /&gt;
Zur Programmierung des Magnetfeldsensors HDMM01 gibt es [[RP6v2_Orientierung#Kompassmodul_HDMM01_2|HIER]] Anregungen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Programmierung==&lt;br /&gt;
In diesem Abschnitt geht es um die Programmierung der Sensoren und Aktoren auf dem [[RP6_Sensor_Board_und_Xtra_Module#RP6_Sensor_Board_3|RP6 Sensor Board]] und auf den [[RP6_Sensor_Board_und_Xtra_Module#RP6_Xtra_Module_3|Xtra Modulen]]. Die hier veröffentlichte Software baut NICHT auf die mitgelieferten C++ Software-Beispiele auf der ''&amp;quot;RP6 Robot System Xtra Modules CD-ROM&amp;quot;'' auf, sondern basiert auf Eigenentwicklungen in GCC.&lt;br /&gt;
&lt;br /&gt;
===RP6 Sensor Board===&lt;br /&gt;
Das RP6 Sensor Board RP6-JM03-61 verfügt nicht über einen eigenen Microprozessor. Daher geht es hier eigentlich nicht um die Programmierung des Sensor Boards, sondern um die Programmierung der Microcontroller-Plattform, an die das Sensor Board angeschlossen ist. In der Regel wird das die RP6 M256 WiFi Zusatzplatine sein, aber auch die RP6v2 Base steuert (als I2C-Slave) in der vorgesehenen Konfiguration gewisse Funktionen des Sensor Boards an.&lt;br /&gt;
Prinzipiell kann das Sensor Board aber auch an der RP6 CONTROL M32 (''passende Library auf Anfrage beim Autor!'') oder der RP6 CCPRO M128 Zusatzplatine betrieben werden.&lt;br /&gt;
&lt;br /&gt;
====Dokumentation====&lt;br /&gt;
Die Dokumentation zum RP6 Sensor Board befindet sich auf der mitgelieferten ''&amp;quot;RP6 Robot System Xtra Modules CD-ROM&amp;quot;''.&lt;br /&gt;
&lt;br /&gt;
=====Manuals=====&lt;br /&gt;
Das Handbuch in der aktuellen Version kann [http://www.jm3-engineering.com/download/doc/ManualRP6SensorBoard_de.pdf hier] oder [http://www.produktinfo.conrad.com/datenblaetter/00000-24999/001082384-an-01-de-RP6_SENSOR_BOARD.pdf da] eingesehen werden.&lt;br /&gt;
 ACHTUNG: Das Manual enthielt in der Version 1.11 noch teils irreführende&lt;br /&gt;
          Beschreibungen, die in der aktuellen Version 1.20 vom 20.04.2014&lt;br /&gt;
          korrigiert wurden!&lt;br /&gt;
&lt;br /&gt;
====Robot-Tool====&lt;br /&gt;
[[Bild:JM3 Robot-Tool.PNG|JM3 Robot-Tool|thumb]]&lt;br /&gt;
&lt;br /&gt;
Von JM3 Engineering wurde auch ein eigenes Programm &amp;quot;'''JM3 Robot-Tool'''&amp;quot; veröffentlicht, das im RP6-System (RP6(v2) Base, CONTROL M32, M256 WiFi) anstelle des [[RP6v2#RobotLoader|RobotLoaders]] verwendet werden kann.&lt;br /&gt;
&lt;br /&gt;
Vom Robot-Tool gibt es auch eine Kommandozeilen-Version &amp;quot;'''Multiloader'''&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Befehlszeilen Optionen'''&lt;br /&gt;
 Multi Loader v1.0.1&lt;br /&gt;
 &lt;br /&gt;
 Usage:&lt;br /&gt;
 multiloader [filename] [port/hostname] [device] [-l]&lt;br /&gt;
  -l forces RP6 low speed mode.&lt;br /&gt;
 &lt;br /&gt;
 Valid devices:&lt;br /&gt;
  - Asuro&lt;br /&gt;
  - AsuroCtrl&lt;br /&gt;
  - RP6Base&lt;br /&gt;
  - RP6CtrlM32&lt;br /&gt;
  - RobotArm&lt;br /&gt;
  - RP6Wifi&lt;br /&gt;
 Attention: Device names are case-sensitive&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 Multi Loader v2.0.0&lt;br /&gt;
 &lt;br /&gt;
 Usage: multiloader [load/conf] [...]&lt;br /&gt;
 &lt;br /&gt;
         load    Load .hex file into robot.&lt;br /&gt;
                 arguments: [filename] [port/host] [device] [interface] [-l]&lt;br /&gt;
 &lt;br /&gt;
                 [interface] specifies programming interface type.&lt;br /&gt;
                 Valid interface types are UART and TCP.&lt;br /&gt;
                 -l forces RP6 low speed mode.&lt;br /&gt;
 &lt;br /&gt;
                 Valid devices:  [interfaces]&lt;br /&gt;
                 - Asuro     UART&lt;br /&gt;
                 - AsuroXT   UART&lt;br /&gt;
                 - Marvin    UART&lt;br /&gt;
                 - MarvinFW  UART&lt;br /&gt;
                 - RP6       UART&lt;br /&gt;
                 - RP6M32    UART&lt;br /&gt;
                 - RP6Wifi   TCP&lt;br /&gt;
                 - RobotArm  UART&lt;br /&gt;
 &lt;br /&gt;
                 Attention: Device names are case-sensitive&lt;br /&gt;
 &lt;br /&gt;
=====Versionen=====&lt;br /&gt;
Hier eine Tabelle der (mir) bekannten Robot-Tool Versionen:&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |rowspan=2|ZIP-Datum&lt;br /&gt;
 |colspan=2|Robot-Tool:&lt;br /&gt;
 |colspan=2|Multiloader:&lt;br /&gt;
 |rowspan=2|Bemerkungen&lt;br /&gt;
 |-&lt;br /&gt;
 |Windows&lt;br /&gt;
 |Linux&lt;br /&gt;
 |Windows&lt;br /&gt;
 |Linux&lt;br /&gt;
 |-&lt;br /&gt;
 |25.10.2014&lt;br /&gt;
 |1.0.1-1&lt;br /&gt;
 |1.0.1-1&lt;br /&gt;
 |1.0.1-1&lt;br /&gt;
 |1.0.1-1&lt;br /&gt;
 |Erste veröffentlichte Version!&lt;br /&gt;
 |-&lt;br /&gt;
 |30.01.2017&lt;br /&gt;
 |[http://www.jm3-engineering.com/download/robottool-v2.0-win32.7z 2.0]&lt;br /&gt;
 |[http://www.jm3-engineering.com/download/robottool-v2.0-linux.tar.xz 2.0]&lt;br /&gt;
 |2.0&lt;br /&gt;
 |2.0&lt;br /&gt;
 |auch für [http://www.jm3-engineering.com/download/robottool-v2.0-osx.tar.gz Mac OSX]!&lt;br /&gt;
 |-&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
'''Hinweise:'''&lt;br /&gt;
* 1. Falls die Links in der Tabelle auf die Seite &amp;quot;Neuigkeiten&amp;quot; von JM3-Engineering führen, kann man dort auf die Seite &amp;quot;Software Downloads&amp;quot; wechseln und die Dateien im Absatz &amp;quot;JM3 Robot-Tool V2.0&amp;quot; herunterladen.&lt;br /&gt;
* 2. Ab Version 2.0 ist der Multiloader in der ZIP des Robot-Tools enthalten.&lt;br /&gt;
&lt;br /&gt;
====AVR-GCC und Visual Studio====&lt;br /&gt;
Die Demo-Programme zum RP6 Sensor Board wurden mit [https://www.microsoft.com/de-de/download/details.aspx?id=5555&amp;amp;fa43d42b-25b5-4a42-fe9b-1634f450f5ee=True Microsoft Visual C++ 2010] und [http://www.jm3-engineering.com/download/avr-gcc-4.8.1-win32.7z AVR-GCC] erstellt.&lt;br /&gt;
&lt;br /&gt;
Eine Anleitung zur Installation unter Windows befindet sich [http://www.jm3-engineering.com/download/doc/avr-gcc-vs_de.pdf hier].&lt;br /&gt;
&lt;br /&gt;
====Demo-Programmme====&lt;br /&gt;
Demo-Programme und eine &amp;quot;Library&amp;quot; zum RP6 Sensor Board befinden sich auf der mitgelieferten ''&amp;quot;RP6 Robot System Xtra Modules CD-ROM&amp;quot;''. Sie können auch in der aktuellen Version im Download Bereich von [http://www.jm3-engineering.com/downloads.htm JM3 Engineering] herunter geladen werden:&lt;br /&gt;
* [http://www.jm3-engineering.com/download/RP6SensorBoardDemo_1.1-1.7z RP6 Sensor Board Demo Programm und Library]&lt;br /&gt;
* [http://www.jm3-engineering.com/download/RP6SensorBoardDemo_noVC_1.1-1.7z RP6 Sensor Board Demo Programm und Library (ohne Visual Studio Projekt Dateien)]&lt;br /&gt;
* [http://www.jm3-engineering.com/download/RP6-RC_1.0-1.7z Remote Control Software]&lt;br /&gt;
'''Hinweis:'''&lt;br /&gt;
Falls die o.g. Links auf die Seite &amp;quot;Neuigkeiten&amp;quot; von JM3-Engineering führen, kann man dort auf die Seite &amp;quot;Software Downloads&amp;quot; wechseln und die Dateien im Absatz &amp;quot;RP6 Sensor Board Library und Demo-Programm&amp;quot; herunterladen.&lt;br /&gt;
&lt;br /&gt;
====Library====&lt;br /&gt;
Eine &amp;quot;Library&amp;quot; zum RP6 Sensor Board, bestehend aus einigen Einzel-Dateien mit jeweils eigenen Versions-Nummern, befindet sich auf der mitgelieferten ''&amp;quot;RP6 Robot System Xtra Modules CD-ROM&amp;quot;''. Sie ist in der aktuellen Version auch in den Demo-Programmen enthalten ([[RP6_Sensor_Board_und_Xtra_Module#Demo-Programmme|s.o.!]]).&lt;br /&gt;
&lt;br /&gt;
=====Versionen=====&lt;br /&gt;
Hier eine Tabelle der (mir) bekannten Library Versionen für das RP6 Sensor Board:&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |ZIP-Datum *&lt;br /&gt;
 |Version&lt;br /&gt;
 |RP6SensorBoardDemo&lt;br /&gt;
 |RP6-RC&lt;br /&gt;
 |RP6M256_I2CMasterLib&lt;br /&gt;
 |RP6M256Lib&lt;br /&gt;
 |RP6I2CmasterTWI&lt;br /&gt;
 |-&lt;br /&gt;
 |09.12.2013&lt;br /&gt;
 |1.0&lt;br /&gt;
 |1.0&lt;br /&gt;
 |1.0&lt;br /&gt;
 |(1.0_24.02.12) ²&lt;br /&gt;
 |1.1_16.07.12 ²&lt;br /&gt;
 |1.1_04.09.12 ³&lt;br /&gt;
 |-&lt;br /&gt;
 |27.12.2014&lt;br /&gt;
 |1.1&lt;br /&gt;
 |1.1-1&lt;br /&gt;
 |1.0-1&lt;br /&gt;
 |Modified 02.11.14 ³&lt;br /&gt;
 |1.1.1_25.10.14 ³&lt;br /&gt;
 |1.1_04.09.12 ³&lt;br /&gt;
 |-&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
'''Zu *:''' Alternativ: Datum der Verzeichnisse (z.B. auf der ''&amp;quot;RP6 Robot System Xtra Modules CD-ROM&amp;quot;'')!&lt;br /&gt;
&lt;br /&gt;
'''Zu ²:''' Neueste Original Version der [http://rn-wissen.de/wiki/index.php/RP6v2#Versionen RP6 Library]!&lt;br /&gt;
&lt;br /&gt;
'''Zu ³:''' Modifiziert von [http://www.jm3-engineering.com/ JM3 Engineering]!&lt;br /&gt;
&lt;br /&gt;
=====Modifizierte RP6 Libraries=====&lt;br /&gt;
Von [http://www.jm3-engineering.com/ JM3 Engineering] wurden bis jetzt drei [http://rn-wissen.de/wiki/index.php/RP6v2#Versionen RP6 &amp;quot;Original&amp;quot;-Libraries] leicht modifiziert, um sie für die eigenen Programme für das RP6 Sensor Board optimal nutzen zu können.&lt;br /&gt;
In diesem Abschnitt soll kurz erwähnt werden, WAS verändert wurde.&lt;br /&gt;
 &lt;br /&gt;
======RP6M256_I2CMasterLib======&lt;br /&gt;
Die RP6M256_I2CMasterLib wurde von JM3 Engineering ab der Software Version 1.1 für das RP6 Sensor Board verändert, um sie in einer eigenen Bibliothek bestehend aus mehreren Modulen nutzen zu können. Folgendes wurde angepasst:&lt;br /&gt;
* Neue typedef unions:&lt;br /&gt;
** u_interrupt_status&lt;br /&gt;
** u_status&lt;br /&gt;
** u_drive_status&lt;br /&gt;
** u_statusLEDs&lt;br /&gt;
&lt;br /&gt;
Die modifizierte RP6M256_I2CMasterLib vom 2.11.2014 ist kompatibel zur Original-Version vom 24.02.2012.&lt;br /&gt;
&lt;br /&gt;
======RP6M256Lib======&lt;br /&gt;
Eine modifizierte Version 1.1.1 der RP6M256Lib mit Datum vom 25.10.2014 wurde von JM3 Engineering im November 2014 zusammen mit der Software Version 1.1 für das RP6 Sensor Board veröffentlicht. Sie ist kompatibel zur Version 1.1 der RP6M256Lib vom 16.07.2012 und enthält folgende Änderung:&lt;br /&gt;
* In der Datei RP6M256.h wird die Variable &amp;quot;timer&amp;quot; korrekt als &amp;quot;''extern'' volatile uint16_t timer&amp;quot; deklariert.&lt;br /&gt;
&lt;br /&gt;
======RP6I2CmasterTWI======&lt;br /&gt;
Eine erweiterte I2C Master-Library (Version 1.1) gibt es mit Datum vom 04.09.2012, veröffentlicht ab Februar 2014 von JM3 Engineering für das RP6 Sensor Board und die Xtra Module. Sie ist abwärts-kompatibel zur I2C Master-Library in der Version 1.0 vom 16.05.2007 und bietet lediglich folgende Erweiterung: &lt;br /&gt;
* Neue Funktion I2CTWI_readWordRegisters() zum Lesen von 16 Bit Registern&lt;br /&gt;
&lt;br /&gt;
====RP6 M256 WiFi: Sensor Board Library====&lt;br /&gt;
Die nachfolgende RP6M256_Sensor_BoardLib (Eigenentwicklung in GCC) dient zur Ansteuerung des Sensor Boards durch die RP6M256 WiFi.&lt;br /&gt;
&lt;br /&gt;
=====Configuration Header=====&lt;br /&gt;
Vor dem Kompilieren der Library muss eine Anpassung des Configuration Headers an die eigenen Hardware-Voraussetzungen erfolgen.&lt;br /&gt;
Dazu gibt es im Configuration Header eine Definition:&lt;br /&gt;
* USE_PD5 -&amp;gt; Die Sensor Board Funktion &amp;quot;PD5&amp;quot; steuert den TCA4311A Enable Pin (EN).&lt;br /&gt;
Im nachfolgenden Listing ist die Definition USE_PD5 NICHT aktiv (d.h. der TCA4311A Enable Pin (EN) wird vom MAX7311 I/O 1.0 Pin angesteuert!). Dies muss an die eigene Hardware angepaßt werden. Wenn &amp;quot;PD5&amp;quot; den TCA4311A Enable Pin (EN) steuern soll, muss die Zeile mit &amp;quot;USE_PD5&amp;quot; &amp;quot;aktiviert&amp;quot; werden. Dazu entfernt man &amp;quot;//&amp;quot; am Zeilenanfang:&lt;br /&gt;
 #define USE_PD5&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Bevor man Beschleunigungs-, Magnetfeldsensor und Gyroskop nutzen kann, muss man sie kalibrieren:&lt;br /&gt;
&lt;br /&gt;
* '''Accelerometer:'''&lt;br /&gt;
** Die X-Achse wird kalibriert, indem man den RP6 mit der rechten Seite nach unten hält und den Maximalwert in MAX_X_A einträgt. Dann neigt man ihn auf seine linke Seite und trägt den negativen Maximalwert in MIN_X_A ein.&lt;br /&gt;
** Die Y-Achse wird kalibriert, indem man den RP6 mit der Vorderseite nach oben hält und den Maximalwert in MAX_Y_A einträgt. Dann kippt man die Vorderseite nach unten und trägt den negativen Maximalwert in MIN_Y_A ein.&lt;br /&gt;
** Die Z-Achse wird kalibriert, indem man den RP6 normal waagerecht hält und den Maximalwert in MAX_Z_A einträgt. Dann dreht man den RP6 &amp;quot;auf den Kopf&amp;quot; und trägt den negativen Maximalwert in MIN_Z_A ein.&lt;br /&gt;
** Sollten die angezeigten Pitch- und Roll-Werte nach der Kalibrierung der Achsen und genau waagerecht stehendem Sensor bzw. RP6 vom Nullwert deutlich abweichen, kann man sie mithilfe der Definitionen OFFSET_PITCH_A und OFFSET_ROLL_A &amp;quot;nullen&amp;quot;. Die Einheit dieser Definitionen ist °.&lt;br /&gt;
 ''HINWEIS: Die internen Berechnungen werden durch diese Offset-Korrektur&lt;br /&gt;
 NICHT beeinflußt. Die Offset-Werte können also nicht dazu benutzt werden,&lt;br /&gt;
 eine Achsenabweichung zwischen Sensor und RP6 zu kompensieren!''&lt;br /&gt;
* '''Magnetometer:'''&lt;br /&gt;
** Zur Kalibrierung des Magnetfeldsensors stellt man den RP6 auf eine waagerechte Fläche. Es dürfen keine Elektrogeräte, Metallteile und stromführende Leitungen in der Nähe sein, die das Magnetfeld verändern können.&lt;br /&gt;
** Zunächst ist es möglich, die sogenannten &amp;quot;hard iron&amp;quot; Effekte auszugleichen. Dies sind feste Magnetfeldabweichungen, die durch das &amp;quot;Gerät&amp;quot; (in unserem Fall also durch den kompletten RP6) verursacht werden, in oder auf dem der Sensor angebracht ist. Mit den Definitionen OFFSET_X_M, OFFSET_Y_M und OFFSET_Z_M können diese Effekte ausgeglichen werden. Diese Kalibrierung wird hier aktuell (noch) nicht beschrieben, so dass man die Werte für diese Definitionen zunächst bei 0 belassen sollte.&lt;br /&gt;
** Die X-Achse und Y-Achse wird kalibriert, indem man den RP6 langsam mehrfach um die eigene (Z-)Achse dreht und die Maximalwerte in MAX_X_M und MAX_Y_M einträgt. Die negativen Maximalwerte trägt man in MIN_X_M und MIN_Y_M ein.&lt;br /&gt;
** Die Z-Achse wird kalibriert, indem man den RP6 auf die rechte oder linke Seite legt, ihn dann langsam mehrfach auf der Stelle (um seine Y-Achse) dreht und den Maximalwert in MAX_Z_M und den negativen Maximalwert in MIN_Z_M einträgt.&lt;br /&gt;
** Mit der Definition DECLINATION_M kann man zur Verbesserung der Genauigkeit der Richtungsangaben den magnetischen Deklinationswert [°] (d.h. die magnetische Missweisung) am aktuellen Standort festlegen. [http://www.ngdc.noaa.gov/geomag-web/#declination Hier] befindet sich ein &amp;quot;Deklinations-Rechner&amp;quot;, mit dem man den Deklinationswert für den eigenen Standort ermitteln kann. &lt;br /&gt;
** Wenn man den Temperaturwert des LSM303DLHC nutzen will, muss man die Definition GET_TEMP_M aktivieren (Standard!). Den Temperaturwert kann man noch eichen, indem man die Definition OFFSET_TEMP_M anpasst. Die Einheit von OFFSET_TEMP_M ist °C.&lt;br /&gt;
* '''Gyroskop:'''&lt;br /&gt;
** In Ruhelage des RP6 wird ein ADC-Wert von ca. 511 angezeigt, wenn die Definition ADCVAL_ZERORATE_LEVEL im Configuration Header (RP6M256_Sensor_Board.h) vor der ersten Kompilierung zunächst auf 0 gesetzt wurde. Die Kalibrierung des Gyroskops ist abgeschlossen, nachdem man den in Ruhelage angezeigten ADC-Wert als ADCVAL_ZERORATE_LEVEL eingetragen hat.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''HINWEISE ZUR KALIBRIERUNG:'''&lt;br /&gt;
* Das Demo-Programm ist nicht sehr gut geeignet, um die Kalibrierungen durchzuführen.&lt;br /&gt;
* Man sollte mit einem eigenen kurzen ''Kalibrierungs-Programm'' nur die Rohwerte der jeweiligen X-, Y- und Z-Achse z.B. zweimal pro Sekunde ausgeben.&lt;br /&gt;
* Die Rohwerte sind in Variablen x_axis..., y_axis..., z_axis... enthalten. Da die Rohwerte in den Funktionen normalizeLSM303DLHC_A() bzw. normalizeLSM303DLHC_M() ggf. verändert werden, müssen die Rohwerte VOR Durchlaufen dieser Funktionen ausgegeben werden.&lt;br /&gt;
* '''Ohne eine sorgfältige Kalibrierung wird die Kompass-Funktion (insbesondere die neigungskompensierte Ausgabe der Himmelsrichtung) nicht funktionieren!'''&lt;br /&gt;
* Nach dem Eintragen der Kalibrierungs-Werte in den Configuration Header (RP6M256_Sensor_Board.h) muss die ''Demo'' neu kompiliert werden. Vorher sollten die Compiler-Hilfsdateien der Sensor Board-Library (Dateiendungen .st und .o) im Programmverzeichnis gelöscht werden.&lt;br /&gt;
* Getestet wird das Ergebnis der Kalibrierung, indem die Ausgabewerte (Temperatur, Pitch, Roll, Heading, Neigungs-kompensiertes Heading) der ''Demo'' überprüft werden. Dazu kann man Vergleichswerte (Thermometer, Winkelmesser für Pitch, Roll und externer Kompass für Heading) heranziehen.&lt;br /&gt;
* Wenn die Ausgabewerte nicht den Erwartungen entsprechen, muss die Kalibrierung wiederholt werden.&lt;br /&gt;
* Eine Kalibrierung der Sensoren ist nur zuverlässig, solange die Position des jeweiligen Sensors und seine komplette Hardware-Umgebung (also der RP6 mit allen seinen Teilen!) nicht verändert wird. Gibt es trotzdem Veränderungen, z.B. durch weitere Aufbauten auf dem RP6, müssen diese Sensoren neu kalibriert werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Datei: RP6M256_Sensor_Board.h&lt;br /&gt;
&amp;lt;pre&amp;gt;/* ****************************************************************************&lt;br /&gt;
 *                           _______________________&lt;br /&gt;
 *                           \| RP6  ROBOT SYSTEM |/&lt;br /&gt;
 *                            \_-_-_-_-_-_-_-_-_-_/           &amp;gt;&amp;gt;&amp;gt; RP6 M256 WIFI&lt;br /&gt;
 * ----------------------------------------------------------------------------&lt;br /&gt;
 * ----------------------------- [c]2014 - Dirk -------------------------------&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * File: RP6M256_Sensor_Board.h&lt;br /&gt;
 * Version: 1.1&lt;br /&gt;
 * Target: RP6 M256 WIFI - ATMEGA2560 @16.00MHz&lt;br /&gt;
 * Author(s): Dirk&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Description:&lt;br /&gt;
 * Configuration header file for new RP6 Sensor Board library.&lt;br /&gt;
 * The RP6 Sensor Board (CONRAD 1082384) is connected to the RP6M256 with the&lt;br /&gt;
 * two plugs:&lt;br /&gt;
 *   Sensor Board &amp;lt;---&amp;gt; RP6M256&lt;br /&gt;
 *   --------------------------------&lt;br /&gt;
 *   I/O (K17)    &amp;lt;---&amp;gt; IO_PWM/T0/T1&lt;br /&gt;
 *   ADC (K18)    &amp;lt;---&amp;gt; ADC_IO2/CMP&lt;br /&gt;
 * The RP6 Sensor Board function &amp;quot;PD5&amp;quot; (IC6: EN) is now connected to RP6M256&lt;br /&gt;
 * OC1B (PB6) and the RP6 Sensor Board function &amp;quot;ADC4&amp;quot; (SHARP_R) to RP6M256&lt;br /&gt;
 * ADC9 (PK1).&lt;br /&gt;
 * On the RP6 Sensor Board the functions &amp;quot;ADC0&amp;quot;, &amp;quot;ADC1&amp;quot;, &amp;quot;PWR&amp;quot; and &amp;quot;ADC4&amp;quot; are&lt;br /&gt;
 * connected to the USRBUS. The USRBUS may be wired on the RP6 mainboard like&lt;br /&gt;
 * this:&lt;br /&gt;
 *   Function : Sensor Board - USRBUS: * &amp;lt;---&amp;gt; RP6 Mainboard&lt;br /&gt;
 *   --------------------------------------------------------&lt;br /&gt;
 *   SHARP_F  : &amp;quot;ADC0&amp;quot;       - Pin 1     &amp;lt;---&amp;gt; ADC0: Pin 3&lt;br /&gt;
 *   GYRO     : &amp;quot;ADC1&amp;quot;       - Pin 2     &amp;lt;---&amp;gt; ADC1: Pin 3&lt;br /&gt;
 *   PWRON ²  : &amp;quot;PWR&amp;quot;        - Pin 3     &amp;lt;---&amp;gt; PWR&lt;br /&gt;
 *   SHARP_R  : &amp;quot;ADC4&amp;quot;       - Pin 5     &amp;lt;---&amp;gt; Not connected!&lt;br /&gt;
 * At *) It is also possible not to use the USRBUS, but to connect the RP6&lt;br /&gt;
 *       Sensor Board directly to the RP6 mainboard with 3 single cables.&lt;br /&gt;
 * At ²) See RP6 manual &amp;quot;4.6.8. Stromsparfunktionen&amp;quot;! &lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
#ifndef RP6M256_SENSOR_BOARD_H&lt;br /&gt;
#define RP6M256_SENSOR_BOARD_H&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// RP6 Sensor Board hardwired components:&lt;br /&gt;
// - I2C I/O Port Expander (MAX7311)&lt;br /&gt;
// - I2C Real Time Clock (RTC DS1339)&lt;br /&gt;
// - I2C Temperature Sensor (LM75B)&lt;br /&gt;
// - I2C Servo Controller (PCA9685)&lt;br /&gt;
// - I2C LED Driver (TCA6507)&lt;br /&gt;
// - I2C 3D Magnetometer &amp;amp; Accelerometer (LSM303DLHC)&lt;br /&gt;
// - Analog Yaw-Rate Gyroscope (LY330ALH)&lt;br /&gt;
// - Hot Swappable 2-Wire Bus Buffer (TCA4311A)&lt;br /&gt;
// - Button&lt;br /&gt;
// - Status LED&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C I/O Port Expander (MAX7311):&lt;br /&gt;
#define I2C_SENSOR_PORTEXP_ADR			0x40	// Default&lt;br /&gt;
&lt;br /&gt;
// Interrupt I/O portpin definitions (RP6M256):&lt;br /&gt;
#define IO_SENSOR_INT1_IN				INT1_PI12 // PCINT12 PJ3  XBUS Pin 8&lt;br /&gt;
#define IO_SENSOR_INT1_DDR				DDRJ&lt;br /&gt;
#define IO_SENSOR_INT1_PIN				PINJ&lt;br /&gt;
#define IO_SENSOR_INT1_PORT				PORTJ&lt;br /&gt;
#define IO_SENSOR_INT2_IN				INT2_PI15 // PCINT15 PJ6  XBUS Pin 11&lt;br /&gt;
#define IO_SENSOR_INT2_DDR				DDRJ&lt;br /&gt;
#define IO_SENSOR_INT2_PIN				PINJ&lt;br /&gt;
#define IO_SENSOR_INT2_PORT				PORTJ&lt;br /&gt;
#define IO_SENSOR_INT3_IN				INT3_PI14 // PCINT14 PJ5  XBUS Pin 9&lt;br /&gt;
#define IO_SENSOR_INT3_DDR				DDRJ&lt;br /&gt;
#define IO_SENSOR_INT3_PIN				PINJ&lt;br /&gt;
#define IO_SENSOR_INT3_PORT				PORTJ&lt;br /&gt;
#define IO_SENSOR_INTU_IN				INTU_PI13 // PCINT13 PJ4  XBUS Pin 7&lt;br /&gt;
#define IO_SENSOR_INTU_DDR				DDRJ&lt;br /&gt;
#define IO_SENSOR_INTU_PIN				PINJ&lt;br /&gt;
#define IO_SENSOR_INTU_PORT				PORTJ&lt;br /&gt;
&lt;br /&gt;
// I/O PORT pin numbers:&lt;br /&gt;
#define PIN7							7&lt;br /&gt;
#define PIN6							6&lt;br /&gt;
#define PIN5							5&lt;br /&gt;
#define PIN4							4&lt;br /&gt;
#define PIN3							3&lt;br /&gt;
#define PIN2							2&lt;br /&gt;
#define PIN1							1&lt;br /&gt;
#define PIN0							0&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Real Time Clock (RTC DS1339):&lt;br /&gt;
#define I2C_SENSOR_RTC_ADR				0xd0	// Default&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Temperature Sensor (LM75B):&lt;br /&gt;
#define I2C_SENSOR_TEMP_ADR				0x90	// Default&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Servo Controller (PCA9685):&lt;br /&gt;
#define I2C_SENSOR_SERVO_ADR			0x88	// Default&lt;br /&gt;
&lt;br /&gt;
// Servo and PWM channels:&lt;br /&gt;
#define CH_SERVO_1						16		// At K6: 1  &amp;quot;SERVO_1&amp;quot;&lt;br /&gt;
#define CH_SERVO_2						15		// At K11: 1 &amp;quot;SERVO_2&amp;quot;&lt;br /&gt;
#define CH_SERVO_3						13		// At K29: 1 &amp;quot;SERVO_3&amp;quot;&lt;br /&gt;
#define CH_SERVO_4						14		// At K30: 1 &amp;quot;SERVO_4&amp;quot;&lt;br /&gt;
#define CH_SERVO_5						11		// At K31: 1 &amp;quot;SERVO_5&amp;quot;&lt;br /&gt;
#define CH_SERVO_6						12		// At K32: 1 &amp;quot;SERVO_6&amp;quot;&lt;br /&gt;
#define CH_SERVO_7						9		// At K33: 1 &amp;quot;SERVO_7&amp;quot;&lt;br /&gt;
#define CH_SERVO_8						10		// At K34: 1 &amp;quot;SERVO_8&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#define CH_PWM_OUT_1					1		// At K12: 1 &amp;quot;PWM_OUT&amp;quot;&lt;br /&gt;
#define CH_PWM_OUT_2					2		// At K12: 2&lt;br /&gt;
#define CH_PWM_OUT_3					3		// At K12: 3&lt;br /&gt;
#define CH_PWM_OUT_4					4		// At K12: 4&lt;br /&gt;
#define CH_PWM_OUT_5					5		// At K12: 5&lt;br /&gt;
#define CH_PWM_OUT_6					6		// At K12: 6&lt;br /&gt;
#define CH_PWM_OUT_7					7		// At K12: 7&lt;br /&gt;
#define CH_PWM_OUT_8					8		// At K12: 8&lt;br /&gt;
&lt;br /&gt;
// Servo left touch (LT), right touch (RT), middle position (MP) constants:&lt;br /&gt;
// (Hints: - Servo impulse length [ms] = Servo position value / 204.8&lt;br /&gt;
//           (Formula only valid for a PWM of 50 Hz!)&lt;br /&gt;
//         - Min. servo impulse (0,7 ms) = Servo position 143&lt;br /&gt;
//         - Mid. servo impulse (1,5 ms) = Servo position 307&lt;br /&gt;
//         - Max. servo impulse (2,3 ms) = Servo position 471&lt;br /&gt;
//         - !!! You should NOT use servo position values &amp;lt; 143 or &amp;gt; 471 !!!)&lt;br /&gt;
#define SERVO1_LT						205		// Servo impulse ~1ms&lt;br /&gt;
#define SERVO1_RT						410		// Servo impulse ~2ms&lt;br /&gt;
#define SERVO1_MP						((SERVO1_RT - SERVO1_LT) / 2 + SERVO1_LT)&lt;br /&gt;
#define SERVO2_LT						205&lt;br /&gt;
#define SERVO2_RT						410&lt;br /&gt;
#define SERVO2_MP						((SERVO2_RT - SERVO2_LT) / 2 + SERVO2_LT)&lt;br /&gt;
#define SERVO3_LT						205&lt;br /&gt;
#define SERVO3_RT						410&lt;br /&gt;
#define SERVO3_MP						((SERVO3_RT - SERVO3_LT) / 2 + SERVO3_LT)&lt;br /&gt;
#define SERVO4_LT						205&lt;br /&gt;
#define SERVO4_RT						410&lt;br /&gt;
#define SERVO4_MP						((SERVO4_RT - SERVO4_LT) / 2 + SERVO4_LT)&lt;br /&gt;
#define SERVO5_LT						205&lt;br /&gt;
#define SERVO5_RT						410&lt;br /&gt;
#define SERVO5_MP						((SERVO5_RT - SERVO5_LT) / 2 + SERVO5_LT)&lt;br /&gt;
#define SERVO6_LT						205&lt;br /&gt;
#define SERVO6_RT						410&lt;br /&gt;
#define SERVO6_MP						((SERVO6_RT - SERVO6_LT) / 2 + SERVO6_LT)&lt;br /&gt;
#define SERVO7_LT						205&lt;br /&gt;
#define SERVO7_RT						410&lt;br /&gt;
#define SERVO7_MP						((SERVO7_RT - SERVO7_LT) / 2 + SERVO7_LT)&lt;br /&gt;
#define SERVO8_LT						205&lt;br /&gt;
#define SERVO8_RT						410&lt;br /&gt;
#define SERVO8_MP						((SERVO8_RT - SERVO8_LT) / 2 + SERVO8_LT)&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C LED Driver (TCA6507):&lt;br /&gt;
#define I2C_SENSOR_LEDDRIVER_ADR		0x8a	// Default&lt;br /&gt;
&lt;br /&gt;
// LED numbers:&lt;br /&gt;
#define SB_LED0							0		// At K7&lt;br /&gt;
#define DISPLAY_BACKLIGHT				0		// Display background light&lt;br /&gt;
#define SB_LED1							1		// At K4&lt;br /&gt;
#define SB_LED2							2		// At K2&lt;br /&gt;
#define SB_LED3							3		// At K10: 1&lt;br /&gt;
#define BACKLIGHT_R						3		// Right backlight&lt;br /&gt;
#define SB_LED4							4		// At K10: 2&lt;br /&gt;
#define BACKLIGHT_L						4		// Left backlight&lt;br /&gt;
#define SB_LED5							5		// White LED (D3)&lt;br /&gt;
#define HEADLIGHT_R						5		// Right headlight&lt;br /&gt;
#define SB_LED6							6		// White LED (D1)&lt;br /&gt;
#define HEADLIGHT_L						6		// Left headlight&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C 3D Magnetometer &amp;amp; Accelerometer (LSM303DLHC):&lt;br /&gt;
&lt;br /&gt;
// LSM303DLHC accelerometer:&lt;br /&gt;
#define I2C_SENSOR_LSM303DLHC_A_ADR 	0x32	// Default&lt;br /&gt;
&lt;br /&gt;
// LSM303DLHC accelerometer calibration data:&lt;br /&gt;
#define MAX_X_A						1037		// Max. X-axis value&lt;br /&gt;
#define MIN_X_A						-1030		// Min. X-axis value&lt;br /&gt;
#define MAX_Y_A						1030		// Max. Y-axis value&lt;br /&gt;
#define MIN_Y_A						-1019		// Min. Y-axis value&lt;br /&gt;
#define MAX_Z_A						1062		// Max. Z-axis value&lt;br /&gt;
#define MIN_Z_A						-1056		// Min. Z-axis value&lt;br /&gt;
#define OFFSET_PITCH_A				0.0			// Offset Pitch [°]&lt;br /&gt;
#define OFFSET_ROLL_A				0.0			// Offset Roll [°]&lt;br /&gt;
&lt;br /&gt;
// LSM303DLHC magnetometer:&lt;br /&gt;
#define I2C_SENSOR_LSM303DLHC_M_ADR		0x3c	// Default&lt;br /&gt;
&lt;br /&gt;
// LSM303DLHC magnetometer calibration data:&lt;br /&gt;
#define MAX_X_M						-111.0		// Max. X-axis value&lt;br /&gt;
#define MIN_X_M						-634.0		// Min. X-axis value&lt;br /&gt;
#define OFFSET_X_M					0			// Hard iron X-axis offset&lt;br /&gt;
#define MAX_Y_M						297.0		// Max. Y-axis value&lt;br /&gt;
#define MIN_Y_M						-215.0		// Min. Y-axis value&lt;br /&gt;
#define OFFSET_Y_M					0			// Hard iron Y-axis offset&lt;br /&gt;
#define MAX_Z_M						183.0		// Max. Z-axis value&lt;br /&gt;
#define MIN_Z_M						-214.0		// Min. Z-axis value&lt;br /&gt;
#define OFFSET_Z_M					0			// Hard iron Z-axis offset&lt;br /&gt;
#define DECLINATION_M				0.0			// E at local position [°]&lt;br /&gt;
&lt;br /&gt;
// LSM303DLHC temperature sensor definitions:&lt;br /&gt;
#define GET_TEMP_M								// Enable temperature sensor&lt;br /&gt;
#define OFFSET_TEMP_M				0.0			// Temperature offset [°C]&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Analog Yaw-Rate Gyroscope (LY330ALH):&lt;br /&gt;
&lt;br /&gt;
// LY330ALH gyroscope:&lt;br /&gt;
#define ADC_SENSOR_LY330ALH				ADC_1	// At USRBUS: 2 (RP6BASE)&lt;br /&gt;
&lt;br /&gt;
// LY330ALH gyroscope calibration data:&lt;br /&gt;
// (Higher values [505..1023] mean an angular velocity while rotating LEFT&lt;br /&gt;
//  and lower values [503..0] while rotating RIGHT!)&lt;br /&gt;
#define ADCVAL_MINRATE					0		// Min. rate value&lt;br /&gt;
#define ADCVAL_ZERORATE_LEVEL			504		// Zero rate level&lt;br /&gt;
#define ADCVAL_MAXRATE					1023	// Max. rate value&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Hot Swappable 2-Wire Bus Buffer (TCA4311A):&lt;br /&gt;
&lt;br /&gt;
// Define USE_PD5, if you want to control the TCA4311A enable pin (EN) with&lt;br /&gt;
// the RP6 Sensor Board function &amp;quot;PD5&amp;quot;. If USE_PD5 is NOT defined (default),&lt;br /&gt;
// the TCA4311A EN pin is controlled by the MAX7311 I/O 1.0 pin.&lt;br /&gt;
// ---------------&lt;br /&gt;
//#define USE_PD5&lt;br /&gt;
// ---------------&lt;br /&gt;
&lt;br /&gt;
#define IO_SENSOR_TCA4311A_EN_IN		OC1B_PI6 // At I/O: 9 (RP6M256)&lt;br /&gt;
#define IO_SENSOR_TCA4311A_EN_DDR		DDRB&lt;br /&gt;
#define IO_SENSOR_TCA4311A_EN_PIN		PINB&lt;br /&gt;
#define IO_SENSOR_TCA4311A_EN_PORT		PORTB&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Button:&lt;br /&gt;
&lt;br /&gt;
// (Button is connected to I/O 1.7 of the MAX7311!)&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Status LED:&lt;br /&gt;
&lt;br /&gt;
// (Status LED is connected to I/O 1.6 of the MAX7311!)&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Other ADC channel definitions:&lt;br /&gt;
&lt;br /&gt;
// (Depending on connections on the RP6 Sensor Board!)&lt;br /&gt;
#define ADC_SENSOR_SHARP_F				ADC_0	// At USRBUS: 1 (RP6BASE)&lt;br /&gt;
#define ADC_SENSOR_SHARP_R				ADC_9	// At ADC: 3    (RP6M256)&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
/******************************************************************************&lt;br /&gt;
 * Additional info&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Changelog:&lt;br /&gt;
 * &lt;br /&gt;
 *  ---&amp;gt; changes are documented in the file &amp;quot;RP6M256_Sensor_BoardLib.c&amp;quot;&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=====Library Header=====&lt;br /&gt;
Datei: RP6M256_Sensor_BoardLib.h&lt;br /&gt;
&amp;lt;pre&amp;gt;/* ****************************************************************************&lt;br /&gt;
 *                           _______________________&lt;br /&gt;
 *                           \| RP6  ROBOT SYSTEM |/&lt;br /&gt;
 *                            \_-_-_-_-_-_-_-_-_-_/           &amp;gt;&amp;gt;&amp;gt; RP6 M256 WIFI&lt;br /&gt;
 * ----------------------------------------------------------------------------&lt;br /&gt;
 * ----------------------------- [c]2014 - Dirk -------------------------------&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * File: RP6M256_Sensor_BoardLib.h&lt;br /&gt;
 * Version: 1.1&lt;br /&gt;
 * Target: RP6 M256 WIFI - ATMEGA2560 @16.00MHz&lt;br /&gt;
 * Author(s): Dirk&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Description:&lt;br /&gt;
 * Header file for new RP6 Sensor Board library.&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
#ifndef RP6M256_SENSOR_BOARDLIB_H&lt;br /&gt;
#define RP6M256_SENSOR_BOARDLIB_H&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// RP6 Sensor Board hardwired components:&lt;br /&gt;
// - I2C I/O Port Expander (MAX7311)&lt;br /&gt;
// - I2C Real Time Clock (RTC DS1339)&lt;br /&gt;
// - I2C Temperature Sensor (LM75B)&lt;br /&gt;
// - I2C Servo Controller (PCA9685)&lt;br /&gt;
// - I2C LED Driver (TCA6507)&lt;br /&gt;
// - I2C 3D Magnetometer &amp;amp; Accelerometer (LSM303DLHC)&lt;br /&gt;
// - Analog Yaw-Rate Gyroscope (LY330ALH)&lt;br /&gt;
// - Hot Swappable 2-Wire Bus Buffer (TCA4311A)&lt;br /&gt;
// - Button&lt;br /&gt;
// - Status LED&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Includes:&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6M256Lib.h&amp;quot;&lt;br /&gt;
#include &amp;quot;RP6I2CmasterTWI.h&amp;quot;&lt;br /&gt;
#include &amp;quot;RP6M256_Sensor_Board.h&amp;quot;&lt;br /&gt;
#include &amp;lt;math.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// RP6M256_I2CMasterLib definitions:&lt;br /&gt;
&lt;br /&gt;
#ifndef I2C_RP6_BASE_ADR&lt;br /&gt;
	#define I2C_RP6_BASE_ADR			10&lt;br /&gt;
#endif&lt;br /&gt;
#ifndef I2C_REG_ADC_ADC0_L&lt;br /&gt;
	#define I2C_REG_ADC_ADC0_L			23&lt;br /&gt;
#endif&lt;br /&gt;
#ifndef I2C_REG_ADC_ADC1_L&lt;br /&gt;
	#define I2C_REG_ADC_ADC1_L			25&lt;br /&gt;
#endif&lt;br /&gt;
#ifndef CMD_POWER_OFF&lt;br /&gt;
	#define CMD_POWER_OFF				0&lt;br /&gt;
#endif&lt;br /&gt;
#ifndef CMD_POWER_ON&lt;br /&gt;
	#define CMD_POWER_ON				1&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C I/O Port Expander (MAX7311):&lt;br /&gt;
&lt;br /&gt;
// Registers:&lt;br /&gt;
#define MAX7311_INPUT_PORT1				0&lt;br /&gt;
#define MAX7311_INPUT_PORT2				1&lt;br /&gt;
#define MAX7311_OUTPUT_PORT1			2&lt;br /&gt;
#define MAX7311_OUTPUT_PORT2			3&lt;br /&gt;
#define MAX7311_PORT1_POL_INV			4&lt;br /&gt;
#define MAX7311_PORT2_POL_INV			5&lt;br /&gt;
#define MAX7311_PORT1_CONFIG			6&lt;br /&gt;
#define MAX7311_PORT2_CONFIG			7&lt;br /&gt;
#define MAX7311_TIMEOUT					8&lt;br /&gt;
&lt;br /&gt;
// Port 1 configuration register bitmasks:&lt;br /&gt;
#define ST_GYRO							(1 &amp;lt;&amp;lt; PIN7)	// I/O 0.7 (Output)&lt;br /&gt;
#define PD_GYRO							(1 &amp;lt;&amp;lt; PIN6)	// I/O 0.6 (Output)&lt;br /&gt;
#define PWR_CAM_IF						(1 &amp;lt;&amp;lt; PIN5)	// I/O 0.5 (Output)&lt;br /&gt;
#define EN_LEDDRIV						(1 &amp;lt;&amp;lt; PIN4)	// I/O 0.4 (Output)&lt;br /&gt;
#define RDY_BUSBUFF						(1 &amp;lt;&amp;lt; PIN3)	// I/O 0.3 (Input)&lt;br /&gt;
#define PWR_SHARP_R						(1 &amp;lt;&amp;lt; PIN2)	// I/O 0.2 (Output)&lt;br /&gt;
#define PWR_SHARP_F						(1 &amp;lt;&amp;lt; PIN1)	// I/O 0.1 (Output)&lt;br /&gt;
#define PWR_I2C							(1 &amp;lt;&amp;lt; PIN0)	// I/O 0.0 (Output)&lt;br /&gt;
&lt;br /&gt;
// Port 2 configuration register bitmasks:&lt;br /&gt;
#define IO2_I2C							(1 &amp;lt;&amp;lt; PIN7)	// I/O 1.7 (Input)&lt;br /&gt;
#define IO1_I2C							(1 &amp;lt;&amp;lt; PIN6)	// I/O 1.6 (Output)&lt;br /&gt;
#define DRDY_MAGACC						(1 &amp;lt;&amp;lt; PIN5)	// I/O 1.5 (Input)&lt;br /&gt;
#define PWR_SERVO						(1 &amp;lt;&amp;lt; PIN4)	// I/O 1.4 (Output)&lt;br /&gt;
#define OEN_SERVO						(1 &amp;lt;&amp;lt; PIN3)	// I/O 1.3 (Output)&lt;br /&gt;
#define IO_K19_1						(1 &amp;lt;&amp;lt; PIN2)	// I/O 1.2 (Input)&lt;br /&gt;
#define IO_K19_3						(1 &amp;lt;&amp;lt; PIN1)	// I/O 1.1 (Input)&lt;br /&gt;
#define EN_BUSBUFF						(1 &amp;lt;&amp;lt; PIN0)	// I/O 1.0 (Output)&lt;br /&gt;
&lt;br /&gt;
// Port 1 &amp;amp; 2 register 16-bit bitmasks:&lt;br /&gt;
// (CONFIG: 1 = Input, 0 = Output)&lt;br /&gt;
#define MAX7311_CONFIG_DEFAULT			0b1010011000001000&lt;br /&gt;
#define MAX7311_CONFIG_USE_PD5			0b1010011100001000&lt;br /&gt;
// (OUTPUT: 1 = High/True, 0 = Low/False)&lt;br /&gt;
#define MAX7311_OUTPUT_DEFAULT			0b0100000100010000&lt;br /&gt;
#define MAX7311_OUTPUT_FULLPOWER		0b0001000100110111&lt;br /&gt;
#define MAX7311_OUTPUT_SHUTDOWN			0b0100100011000000&lt;br /&gt;
&lt;br /&gt;
// Safe configuration:&lt;br /&gt;
// (Ensures if activated, that I/Os 0.3, 1.5 and 1.7 cannot be configured&lt;br /&gt;
//  as output with the function MAX7311_write_cfg(). This may protect the&lt;br /&gt;
//  RP6 Sensor Board from hardware damage.)&lt;br /&gt;
// -------------------&lt;br /&gt;
#define SAFE_CONFIG&lt;br /&gt;
// -------------------&lt;br /&gt;
&lt;br /&gt;
typedef union {&lt;br /&gt;
 	uint8_t byte;&lt;br /&gt;
	struct {&lt;br /&gt;
		unsigned int1   :1;				// INT1  XBUS Pin 8&lt;br /&gt;
		unsigned int2   :1;				// INT2  XBUS Pin 11&lt;br /&gt;
		unsigned int3   :1;				// INT3  XBUS Pin 9&lt;br /&gt;
		unsigned intu   :1;				// INTU  XBUS Pin 7&lt;br /&gt;
		unsigned unused :4;&lt;br /&gt;
	};&lt;br /&gt;
	struct {&lt;br /&gt;
		unsigned magacc1     :1;		// INT1: LSM303DLHC INT1&lt;br /&gt;
		unsigned portexp     :1;		// INT2: MAX7311 INT_N&lt;br /&gt;
		unsigned magacc2_rtc :1;		// INT3: LSM303DLHC INT2&lt;br /&gt;
		unsigned noname      :5;		//       OR DS1339 SQW/INT_N&lt;br /&gt;
	};&lt;br /&gt;
} interrupt_RP6SBstatus_t;&lt;br /&gt;
extern interrupt_RP6SBstatus_t interrupt_RP6SBstatus;&lt;br /&gt;
&lt;br /&gt;
typedef union {&lt;br /&gt;
	uint16_t word;&lt;br /&gt;
	struct {&lt;br /&gt;
		unsigned pwr_i2c     :1;		// I/O 0.0 (Output)&lt;br /&gt;
		unsigned pwr_sharp_f :1;		// I/O 0.1 (Output)&lt;br /&gt;
		unsigned pwr_sharp_r :1;		// I/O 0.2 (Output)&lt;br /&gt;
		unsigned rdy_busbuff :1;		// I/O 0.3 (Input)&lt;br /&gt;
		unsigned en_leddriv  :1;		// I/O 0.4 (Output)&lt;br /&gt;
		unsigned pwr_cam_if  :1;		// I/O 0.5 (Output)&lt;br /&gt;
		unsigned pd_gyro     :1;		// I/O 0.6 (Output)&lt;br /&gt;
		unsigned st_gyro     :1;		// I/O 0.7 (Output)&lt;br /&gt;
		unsigned en_busbuff  :1;		// I/O 1.0 (Output)&lt;br /&gt;
		unsigned io_k19_3    :1;		// I/O 1.1 (Input)&lt;br /&gt;
		unsigned io_k19_1    :1;		// I/O 1.2 (Input)&lt;br /&gt;
		unsigned oen_servo   :1;		// I/O 1.3 (Output)&lt;br /&gt;
		unsigned pwr_servo   :1;		// I/O 1.4 (Output)&lt;br /&gt;
		unsigned drdy_magacc :1;		// I/O 1.5 (Input)&lt;br /&gt;
		unsigned io1_i2c     :1;		// I/O 1.6 (Output)&lt;br /&gt;
		unsigned io2_i2c     :1;		// I/O 1.7 (Input)&lt;br /&gt;
	};&lt;br /&gt;
} max7311IOs_t;&lt;br /&gt;
extern max7311IOs_t inport;&lt;br /&gt;
extern max7311IOs_t outport;&lt;br /&gt;
extern uint8_t readyBusbuff;&lt;br /&gt;
extern uint8_t pressedButton;&lt;br /&gt;
&lt;br /&gt;
void MAX7311_write_cfg(uint16_t);&lt;br /&gt;
void task_checkINTs(void);&lt;br /&gt;
void task_RP6SensorBoard(void);&lt;br /&gt;
void MAX7311_update(void);&lt;br /&gt;
void MAX7311_write(uint16_t);&lt;br /&gt;
void MAX7311_init(void);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Real Time Clock (RTC DS1339):&lt;br /&gt;
&lt;br /&gt;
// Registers:&lt;br /&gt;
#define DS1339_SECONDS					0&lt;br /&gt;
#define DS1339_MINUTES					1&lt;br /&gt;
#define DS1339_HOURS					2&lt;br /&gt;
#define DS1339_DAY						3&lt;br /&gt;
#define DS1339_DATE						4&lt;br /&gt;
#define DS1339_MONTH_CENTURY			5&lt;br /&gt;
#define DS1339_YEAR						6&lt;br /&gt;
#define DS1339_ALARM1_SECONDS			7&lt;br /&gt;
#define DS1339_ALARM1_MINUTES			8&lt;br /&gt;
#define DS1339_ALARM1_HOURS				9&lt;br /&gt;
#define DS1339_ALARM1_DAY_DATE			10&lt;br /&gt;
#define DS1339_ALARM2_MINUTES			11&lt;br /&gt;
#define DS1339_ALARM2_HOURS				12&lt;br /&gt;
#define DS1339_ALARM2_DAY_DATE			13&lt;br /&gt;
#define DS1339_CONTROL					14&lt;br /&gt;
#define DS1339_STATUS					15&lt;br /&gt;
#define DS1339_TRICKLE_CHARGER			16&lt;br /&gt;
&lt;br /&gt;
// Control register bitmasks:&lt;br /&gt;
#define DS1339_CONTROL_DEFAULT			0		// Power on default&lt;br /&gt;
#define DS1339_CONTROL_A1IE				1&lt;br /&gt;
#define DS1339_CONTROL_A2IE				2&lt;br /&gt;
#define DS1339_CONTROL_INTCN			4&lt;br /&gt;
#define DS1339_CONTROL_RS1				8&lt;br /&gt;
#define DS1339_CONTROL_RS2				16&lt;br /&gt;
#define DS1339_CONTROL_BBSQI			32&lt;br /&gt;
#define DS1339_CONTROL_EOSC				128&lt;br /&gt;
&lt;br /&gt;
// Trickle Charger register bitmasks:&lt;br /&gt;
#define DS1339_TRICKLE_CHARGER_DEFAULT	0b10101010 // One diode, 2k resistor&lt;br /&gt;
#define DS1339_TRICKLE_CHARGER_ROUT0	1&lt;br /&gt;
#define DS1339_TRICKLE_CHARGER_ROUT1	2&lt;br /&gt;
#define DS1339_TRICKLE_CHARGER_DS0		4&lt;br /&gt;
#define DS1339_TRICKLE_CHARGER_DS1		8&lt;br /&gt;
#define DS1339_TRICKLE_CHARGER_TCS0		16&lt;br /&gt;
#define DS1339_TRICKLE_CHARGER_TCS1		32&lt;br /&gt;
#define DS1339_TRICKLE_CHARGER_TCS2		64&lt;br /&gt;
#define DS1339_TRICKLE_CHARGER_TCS3		128&lt;br /&gt;
&lt;br /&gt;
enum RTCWEEKDAYS {&lt;br /&gt;
	R_MO = 1, R_TU, R_WE, R_TH, R_FR, R_SA, R_SU&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
typedef struct {&lt;br /&gt;
	uint16_t         year;				// Year&lt;br /&gt;
	uint8_t          month;				// Month   [1..12]&lt;br /&gt;
	enum RTCWEEKDAYS weekday;			// Weekday [1..7 = R_MO..R_SU]&lt;br /&gt;
	uint8_t          day;				// Day     [1..31]&lt;br /&gt;
} rtcdate_t;&lt;br /&gt;
rtcdate_t rtc_date;&lt;br /&gt;
&lt;br /&gt;
typedef struct {&lt;br /&gt;
	uint8_t dst;						// Daylight-saving-time (time zone)&lt;br /&gt;
	uint8_t hour;						// Hour    [0..23]&lt;br /&gt;
	uint8_t minute;						// Minute  [0..59]&lt;br /&gt;
	uint8_t second;						// Second  [0..59]&lt;br /&gt;
} rtctime_t;&lt;br /&gt;
rtctime_t rtc_time;&lt;br /&gt;
&lt;br /&gt;
uint8_t BCD2DEC(uint8_t);&lt;br /&gt;
uint8_t DEC2BCD(uint8_t);&lt;br /&gt;
void DS1339_write_cfg(uint8_t);&lt;br /&gt;
void DS1339_init(void);&lt;br /&gt;
#define CALC_DST						// Time zone will be calculated&lt;br /&gt;
void DS1339_read(void);&lt;br /&gt;
void DS1339_write(void);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Temperature Sensor (LM75B):&lt;br /&gt;
&lt;br /&gt;
// Registers:&lt;br /&gt;
#define LM75B_TEMP						0&lt;br /&gt;
#define LM75B_CONF						1&lt;br /&gt;
#define LM75B_THYST						2&lt;br /&gt;
#define LM75B_TOS						3&lt;br /&gt;
&lt;br /&gt;
// Conf register bitmasks:&lt;br /&gt;
#define LM75B_CONF_DEFAULT				0		// Power on default&lt;br /&gt;
#define LM75B_CONF_SHUTDOWN				1&lt;br /&gt;
#define LM75B_CONF_OS_COMP_INT			2&lt;br /&gt;
#define LM75B_CONF_OS_POL				4&lt;br /&gt;
#define LM75B_CONF_OS_F_QUE0			8&lt;br /&gt;
#define LM75B_CONF_OS_F_QUE1			16&lt;br /&gt;
&lt;br /&gt;
extern double temperature;&lt;br /&gt;
&lt;br /&gt;
void LM75B_write_cfg(uint8_t);&lt;br /&gt;
#define LM75B_shutdown() {LM75B_write_cfg(LM75B_CONF_SHUTDOWN);}&lt;br /&gt;
#define LM75B_init() {LM75B_write_cfg(LM75B_CONF_DEFAULT);}&lt;br /&gt;
extern uint8_t temperature_low;&lt;br /&gt;
extern uint8_t temperature_high;&lt;br /&gt;
#define getTemperatureHigh() (temperature_high)&lt;br /&gt;
#define getTemperatureLow() (temperature_low)&lt;br /&gt;
void LM75B_read(void);&lt;br /&gt;
double LM75B_calculate(void);&lt;br /&gt;
double LM75B_measure(void);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Servo Controller (PCA9685):&lt;br /&gt;
&lt;br /&gt;
// Registers:&lt;br /&gt;
#define PCA9685_MODE1					0&lt;br /&gt;
#define PCA9685_MODE2					1&lt;br /&gt;
#define PCA9685_SUBADR1					2&lt;br /&gt;
#define PCA9685_SUBADR2					3&lt;br /&gt;
#define PCA9685_SUBADR3					4&lt;br /&gt;
#define PCA9685_ALLCALLADR				5&lt;br /&gt;
#define PCA9685_LED0_ON_L				6&lt;br /&gt;
#define PCA9685_LED0_ON_H				7&lt;br /&gt;
#define PCA9685_LED0_OFF_L				8&lt;br /&gt;
#define PCA9685_LED0_OFF_H				9&lt;br /&gt;
#define PCA9685_LED1_ON_L				10&lt;br /&gt;
#define PCA9685_LED1_ON_H				11&lt;br /&gt;
#define PCA9685_LED1_OFF_L				12&lt;br /&gt;
#define PCA9685_LED1_OFF_H				13&lt;br /&gt;
#define PCA9685_LED2_ON_L				14&lt;br /&gt;
#define PCA9685_LED2_ON_H				15&lt;br /&gt;
#define PCA9685_LED2_OFF_L				16&lt;br /&gt;
#define PCA9685_LED2_OFF_H				17&lt;br /&gt;
#define PCA9685_LED3_ON_L				18&lt;br /&gt;
#define PCA9685_LED3_ON_H				19&lt;br /&gt;
#define PCA9685_LED3_OFF_L				20&lt;br /&gt;
#define PCA9685_LED3_OFF_H				21&lt;br /&gt;
#define PCA9685_LED4_ON_L				22&lt;br /&gt;
#define PCA9685_LED4_ON_H				23&lt;br /&gt;
#define PCA9685_LED4_OFF_L				24&lt;br /&gt;
#define PCA9685_LED4_OFF_H				25&lt;br /&gt;
#define PCA9685_LED5_ON_L				26&lt;br /&gt;
#define PCA9685_LED5_ON_H				27&lt;br /&gt;
#define PCA9685_LED5_OFF_L				28&lt;br /&gt;
#define PCA9685_LED5_OFF_H				29&lt;br /&gt;
#define PCA9685_LED6_ON_L				30&lt;br /&gt;
#define PCA9685_LED6_ON_H				31&lt;br /&gt;
#define PCA9685_LED6_OFF_L				32&lt;br /&gt;
#define PCA9685_LED6_OFF_H				33&lt;br /&gt;
#define PCA9685_LED7_ON_L				34&lt;br /&gt;
#define PCA9685_LED7_ON_H				35&lt;br /&gt;
#define PCA9685_LED7_OFF_L				36&lt;br /&gt;
#define PCA9685_LED7_OFF_H				37&lt;br /&gt;
#define PCA9685_LED8_ON_L				38&lt;br /&gt;
#define PCA9685_LED8_ON_H				39&lt;br /&gt;
#define PCA9685_LED8_OFF_L				40&lt;br /&gt;
#define PCA9685_LED8_OFF_H				41&lt;br /&gt;
#define PCA9685_LED9_ON_L				42&lt;br /&gt;
#define PCA9685_LED9_ON_H				43&lt;br /&gt;
#define PCA9685_LED9_OFF_L				44&lt;br /&gt;
#define PCA9685_LED9_OFF_H				45&lt;br /&gt;
#define PCA9685_LED10_ON_L				46&lt;br /&gt;
#define PCA9685_LED10_ON_H				47&lt;br /&gt;
#define PCA9685_LED10_OFF_L				48&lt;br /&gt;
#define PCA9685_LED10_OFF_H				49&lt;br /&gt;
#define PCA9685_LED11_ON_L				50&lt;br /&gt;
#define PCA9685_LED11_ON_H				51&lt;br /&gt;
#define PCA9685_LED11_OFF_L				52&lt;br /&gt;
#define PCA9685_LED11_OFF_H				53&lt;br /&gt;
#define PCA9685_LED12_ON_L				54&lt;br /&gt;
#define PCA9685_LED12_ON_H				55&lt;br /&gt;
#define PCA9685_LED12_OFF_L				56&lt;br /&gt;
#define PCA9685_LED12_OFF_H				57&lt;br /&gt;
#define PCA9685_LED13_ON_L				58&lt;br /&gt;
#define PCA9685_LED13_ON_H				59&lt;br /&gt;
#define PCA9685_LED13_OFF_L				60&lt;br /&gt;
#define PCA9685_LED13_OFF_H				61&lt;br /&gt;
#define PCA9685_LED14_ON_L				62&lt;br /&gt;
#define PCA9685_LED14_ON_H				63&lt;br /&gt;
#define PCA9685_LED14_OFF_L				64&lt;br /&gt;
#define PCA9685_LED14_OFF_H				65&lt;br /&gt;
#define PCA9685_LED15_ON_L				66&lt;br /&gt;
#define PCA9685_LED15_ON_H				67&lt;br /&gt;
#define PCA9685_LED15_OFF_L				68&lt;br /&gt;
#define PCA9685_LED15_OFF_H				69&lt;br /&gt;
#define PCA9685_ALL_LED_ON_L			250&lt;br /&gt;
#define PCA9685_ALL_LED_ON_H			251&lt;br /&gt;
#define PCA9685_ALL_LED_OFF_L			252&lt;br /&gt;
#define PCA9685_ALL_LED_OFF_H			253&lt;br /&gt;
#define PCA9685_PRE_SCALE				254&lt;br /&gt;
#define PCA9685_TESTMODE				255&lt;br /&gt;
&lt;br /&gt;
// Mode1 register bitmasks:&lt;br /&gt;
#define PCA9685_MODE1_ALLCALL			1&lt;br /&gt;
#define PCA9685_MODE1_SUB3				2&lt;br /&gt;
#define PCA9685_MODE1_SUB2				4&lt;br /&gt;
#define PCA9685_MODE1_SUB1				8&lt;br /&gt;
#define PCA9685_MODE1_SLEEP				16&lt;br /&gt;
#define PCA9685_MODE1_AI				32&lt;br /&gt;
#define PCA9685_MODE1_EXTCLK			64&lt;br /&gt;
#define PCA9685_MODE1_RESTART			128&lt;br /&gt;
&lt;br /&gt;
// Mode2 register bitmasks:&lt;br /&gt;
#define PCA9685_MODE2_OUTNE01_DEFAULT	0&lt;br /&gt;
#define PCA9685_MODE2_OUTDRV			4&lt;br /&gt;
#define PCA9685_MODE2_OCH				8&lt;br /&gt;
#define PCA9685_MODE2_INVRT				16&lt;br /&gt;
&lt;br /&gt;
#define F_PCA9685						25000000.0	// Int. Clock: 25 MHz&lt;br /&gt;
&lt;br /&gt;
void PCA9685_init(uint16_t);&lt;br /&gt;
#define initServo(__FREQ__) {PCA9685_init(__FREQ__);}&lt;br /&gt;
uint8_t servo(uint8_t);&lt;br /&gt;
void PCA9685_set(uint8_t, uint16_t);&lt;br /&gt;
#define setServo(__SERVO__,__POS__) {PCA9685_set(servo(__SERVO__),__POS__);}&lt;br /&gt;
void PCA9685_shutdown(void);&lt;br /&gt;
void PCA9685_restart(void);&lt;br /&gt;
void setServoPower(uint8_t);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C LED Driver (TCA6507):&lt;br /&gt;
&lt;br /&gt;
// Registers:&lt;br /&gt;
#define TCA6507_SELECT0				0&lt;br /&gt;
#define TCA6507_SELECT1				1&lt;br /&gt;
#define TCA6507_SELECT2				2&lt;br /&gt;
#define TCA6507_FADEON_TIME			3&lt;br /&gt;
#define TCA6507_FULLYON_TIME		4&lt;br /&gt;
#define TCA6507_FADEOFF_TIME		5&lt;br /&gt;
#define TCA6507_1ST_FULLYOFF_TIME	6&lt;br /&gt;
#define TCA6507_2ND_FULLYOFF_TIME	7&lt;br /&gt;
#define TCA6507_MAXIMUM_INTENSITY	8&lt;br /&gt;
#define TCA6507_MASTER_INTENSITY	9&lt;br /&gt;
#define TCA6507_INITIALIZATION		10&lt;br /&gt;
&lt;br /&gt;
// Output states:&lt;br /&gt;
#define STATE_OFF					0&lt;br /&gt;
#define STATE_PWM0					2&lt;br /&gt;
#define STATE_PWM1					3&lt;br /&gt;
#define STATE_ON					4&lt;br /&gt;
#define STATE_MINT					5&lt;br /&gt;
#define STATE_BLINK0				6&lt;br /&gt;
#define STATE_BLINK1				7&lt;br /&gt;
&lt;br /&gt;
extern uint8_t select[3];&lt;br /&gt;
&lt;br /&gt;
void TCA6507_write_cfg(uint8_t, uint8_t);&lt;br /&gt;
void TCA6507_update(void);&lt;br /&gt;
void TCA6507_set(uint8_t, uint8_t);&lt;br /&gt;
#define setLED(__LED__,__STATE__) {TCA6507_set(__LED__,__STATE__);}&lt;br /&gt;
void TCA6507_shutdown(void);&lt;br /&gt;
void TCA6507_restart(void);&lt;br /&gt;
void TCA6507_init(void);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C 3D Magnetometer &amp;amp; Accelerometer (LSM303DLHC):&lt;br /&gt;
&lt;br /&gt;
// LSM303DLHC accelerometer internal registers:&lt;br /&gt;
#define CTRL_REG1_A					0x20&lt;br /&gt;
#define CTRL_REG2_A					0x21&lt;br /&gt;
#define CTRL_REG3_A					0x22&lt;br /&gt;
#define CTRL_REG4_A					0x23&lt;br /&gt;
#define CTRL_REG5_A					0x24&lt;br /&gt;
#define CTRL_REG6_A					0x25&lt;br /&gt;
#define REFERENCE_A					0x26&lt;br /&gt;
#define STATUS_REG_A				0x27&lt;br /&gt;
#define OUT_X_L_A					0x28&lt;br /&gt;
#define OUT_X_H_A					0x29&lt;br /&gt;
#define OUT_Y_L_A					0x2a&lt;br /&gt;
#define OUT_Y_H_A					0x2b&lt;br /&gt;
#define OUT_Z_L_A					0x2c&lt;br /&gt;
#define OUT_Z_H_A					0x2d&lt;br /&gt;
#define FIFO_CTRL_REG_A				0x2e&lt;br /&gt;
#define FIFO_SRC_REG_A				0x2f&lt;br /&gt;
#define INT1_CFG_A					0x30&lt;br /&gt;
#define INT1_SOURCE_A				0x31&lt;br /&gt;
#define INT1_THS_A					0x32&lt;br /&gt;
#define INT1_DURATION_A				0x33&lt;br /&gt;
#define INT2_CFG_A					0x34&lt;br /&gt;
#define INT2_SOURCE_A				0x35&lt;br /&gt;
#define INT2_THS_A					0x36&lt;br /&gt;
#define INT2_DURATION_A				0x37&lt;br /&gt;
#define CLICK_CFG_A					0x38&lt;br /&gt;
#define CLICK_SRC_A					0x39&lt;br /&gt;
#define CLICK_THS_A					0x3a&lt;br /&gt;
#define TIME_LIMIT_A				0x3b&lt;br /&gt;
#define TIME_LATENCY_A				0x3c&lt;br /&gt;
#define TIME_WINDOW_A				0x3d&lt;br /&gt;
&lt;br /&gt;
// LSM303DLHC accelerometer register settings:&lt;br /&gt;
#define CTRL_REG1_A_10HZ			0b00100111	// 10Hz &amp;amp; all axes enable&lt;br /&gt;
#define CTRL_REG1_A_50HZ			0b01000111	// 50Hz &amp;amp; all axes enable&lt;br /&gt;
#define CTRL_REG4_A_DEFAULT			0b00000000	// Default (Normal mode)&lt;br /&gt;
#define CTRL_REG4_A_HR				0b00001000	// HR output mode&lt;br /&gt;
&lt;br /&gt;
// LSM303DLHC magnetometer internal registers:&lt;br /&gt;
#define CRA_REG_M					0x00&lt;br /&gt;
#define CRB_REG_M					0x01&lt;br /&gt;
#define MR_REG_M					0x02&lt;br /&gt;
#define OUT_X_H_M					0x03&lt;br /&gt;
#define OUT_X_L_M					0x04&lt;br /&gt;
#define OUT_Z_H_M					0x05&lt;br /&gt;
#define OUT_Z_L_M					0x06&lt;br /&gt;
#define OUT_Y_H_M					0x07&lt;br /&gt;
#define OUT_Y_L_M					0x08&lt;br /&gt;
#define SR_REG_MG					0x09&lt;br /&gt;
#define IRA_REG_M					0x0a&lt;br /&gt;
#define IRB_REG_M					0x0b&lt;br /&gt;
#define IRC_REG_M					0x0c&lt;br /&gt;
#define TEMP_OUT_H_M				0x31&lt;br /&gt;
#define TEMP_OUT_L_M				0x32&lt;br /&gt;
&lt;br /&gt;
// LSM303DLHC magnetometer register settings:&lt;br /&gt;
#define CRA_REG_M_15HZ				0b00010000	// Default (Data rate 15Hz)&lt;br /&gt;
#define CRA_REG_M_15HZ_T_EN			0b10010000	// 15Hz &amp;amp; temperature enable&lt;br /&gt;
#define CRB_REG_M_13GAUSS			0b00100000	// Gain +-1.3Gauss&lt;br /&gt;
#define MR_REG_M_CCM				0b00000000	// Continuous-conversion mode&lt;br /&gt;
#define MR_REG_M_SCM				0b00000001	// Single-conversion mode&lt;br /&gt;
#define MR_REG_M_SLEEP				0b00000011	// Default (Sleep-mode)&lt;br /&gt;
&lt;br /&gt;
extern int16_t x_axisa, y_axisa, z_axisa;&lt;br /&gt;
extern double pitch, roll;&lt;br /&gt;
extern double xa, ya, za;&lt;br /&gt;
extern double the, phi;&lt;br /&gt;
&lt;br /&gt;
extern int16_t x_axism, y_axism, z_axism;&lt;br /&gt;
extern int16_t headingm;&lt;br /&gt;
extern double xm, ym, zm;&lt;br /&gt;
#ifdef GET_TEMP_M&lt;br /&gt;
extern int16_t temperaturem;&lt;br /&gt;
extern double temperature_mag;&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
extern int16_t headingtc;&lt;br /&gt;
&lt;br /&gt;
void LSM303DLHC_A_init(void);&lt;br /&gt;
void readLSM303DLHC_A(void);&lt;br /&gt;
void normalizeLSM303DLHC_A(void);&lt;br /&gt;
void positionLSM303DLHC_A(void);&lt;br /&gt;
&lt;br /&gt;
void LSM303DLHC_M_init(void);&lt;br /&gt;
void readLSM303DLHC_M(void);&lt;br /&gt;
void normalizeLSM303DLHC_M(void);&lt;br /&gt;
int16_t headingLSM303DLHC_M(void);&lt;br /&gt;
&lt;br /&gt;
int16_t headingLSM303DLHC_TC(void);&lt;br /&gt;
&lt;br /&gt;
void LSM303DLHC_init(void);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Analog Yaw-Rate Gyroscope (LY330ALH):&lt;br /&gt;
&lt;br /&gt;
#define LY330ALH_MODE_NORMAL		0			// Power on default&lt;br /&gt;
#define LY330ALH_MODE_SLEEP			1&lt;br /&gt;
#define LY330ALH_MODE_SELFTEST		2&lt;br /&gt;
#define LY330ALH_MODE_POWERDOWN		3			// Shutdown mode&lt;br /&gt;
&lt;br /&gt;
extern int16_t z_axisg;&lt;br /&gt;
&lt;br /&gt;
void LY330ALH_set_mode(uint8_t);&lt;br /&gt;
uint16_t getRP6Base_ADC1(void);&lt;br /&gt;
int16_t LY330ALH_measure(void);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Hot Swappable 2-Wire Bus Buffer (TCA4311A):&lt;br /&gt;
&lt;br /&gt;
//extern uint8_t readyBusbuff;			// See &amp;quot;I2C I/O Port Expander&amp;quot; section&lt;br /&gt;
extern uint8_t errorBusbuff;&lt;br /&gt;
&lt;br /&gt;
#define getReadyBusbuff() (readyBusbuff)&lt;br /&gt;
uint8_t readReadyBusbuff(void);&lt;br /&gt;
void TCA4311A_shutdown(void);&lt;br /&gt;
void TCA4311A_reconnect(void);&lt;br /&gt;
void setRP6Base_PWR(uint8_t);&lt;br /&gt;
void setI2CModulePower(uint8_t);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Button:&lt;br /&gt;
&lt;br /&gt;
//extern uint8_t pressedButton;			// See &amp;quot;I2C I/O Port Expander&amp;quot; section&lt;br /&gt;
&lt;br /&gt;
#define getPressedButton() (pressedButton)&lt;br /&gt;
uint8_t readButton(void);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Status LED:&lt;br /&gt;
&lt;br /&gt;
void setStatusLED(uint8_t);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// RP6 Sensor Board initialisation and shutdown:&lt;br /&gt;
&lt;br /&gt;
void sensor_board_init(void);&lt;br /&gt;
void sensor_board_shutdown(void);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
/******************************************************************************&lt;br /&gt;
 * Additional info&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Changelog:&lt;br /&gt;
 * &lt;br /&gt;
 *  ---&amp;gt; changes are documented in the file &amp;quot;RP6M256_Sensor_BoardLib.c&amp;quot;&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=====Library Source=====&lt;br /&gt;
Datei: RP6M256_Sensor_BoardLib.c&lt;br /&gt;
&amp;lt;pre&amp;gt;/* ****************************************************************************&lt;br /&gt;
 *                           _______________________&lt;br /&gt;
 *                           \| RP6  ROBOT SYSTEM |/&lt;br /&gt;
 *                            \_-_-_-_-_-_-_-_-_-_/           &amp;gt;&amp;gt;&amp;gt; RP6 M256 WIFI&lt;br /&gt;
 * ----------------------------------------------------------------------------&lt;br /&gt;
 * ----------------------------- [c]2014 - Dirk -------------------------------&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * File: RP6M256_Sensor_BoardLib.c&lt;br /&gt;
 * Version: 1.1&lt;br /&gt;
 * Target: RP6 M256 WIFI - ATMEGA2560 @16.00MHz&lt;br /&gt;
 *         and a RP6 Sensor Board (CONRAD 1082384)&lt;br /&gt;
 * Author(s): Dirk&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Description:&lt;br /&gt;
 * This is our new Library that contains basic routines and functions for&lt;br /&gt;
 * accessing the hardwired components of the RP6 Sensor Board (CONRAD 1082384).&lt;br /&gt;
 * This library assumes the RP6 Sensor Board Revision 2.0 (04.07.13).&lt;br /&gt;
 *&lt;br /&gt;
 * There are more sensors and actors, that may be connected to the RP6 Sensor&lt;br /&gt;
 * Board: Many I2C components including a GPS module (CONRAD 1082385), servo&lt;br /&gt;
 *        motors, SHARP IR distance sensors, LEDs, a camera ...&lt;br /&gt;
 * This library doesn't contain functions for these sensors/actors, because&lt;br /&gt;
 * they are not HARDWIRED to the RP6 Sensor Board and may be connected&lt;br /&gt;
 * OPTIONALLY.&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// RP6 Sensor Board hardwired components:&lt;br /&gt;
// - I2C I/O Port Expander (MAX7311)&lt;br /&gt;
// - I2C Real Time Clock (RTC DS1339)&lt;br /&gt;
// - I2C Temperature Sensor (LM75B)&lt;br /&gt;
// - I2C Servo Controller (PCA9685)&lt;br /&gt;
// - I2C LED Driver (TCA6507)&lt;br /&gt;
// - I2C 3D Magnetometer &amp;amp; Accelerometer (LSM303DLHC)&lt;br /&gt;
// - Analog Yaw-Rate Gyroscope (LY330ALH)&lt;br /&gt;
// - Hot Swappable 2-Wire Bus Buffer (TCA4311A)&lt;br /&gt;
// - Button&lt;br /&gt;
// - Status LED&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Includes:&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6M256_Sensor_BoardLib.h&amp;quot; 		&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Variables:&lt;br /&gt;
&lt;br /&gt;
uint8_t registerBuf[13]; &lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C I/O Port Expander (MAX7311):&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Sends the configuration word to a MAX7311.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: config -&amp;gt; Config word for control&lt;br /&gt;
 *                  registers&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void MAX7311_write_cfg(uint16_t config)&lt;br /&gt;
{&lt;br /&gt;
#ifdef SAFE_CONFIG&lt;br /&gt;
	config |= 0b1010000000001000;&lt;br /&gt;
#endif&lt;br /&gt;
	I2CTWI_transmit3Bytes(I2C_SENSOR_PORTEXP_ADR, MAX7311_PORT1_CONFIG, config, (config&amp;gt;&amp;gt;8));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
interrupt_RP6SBstatus_t interrupt_RP6SBstatus;&lt;br /&gt;
&lt;br /&gt;
/** &lt;br /&gt;
 * This function checks all interrupt pins on&lt;br /&gt;
 * the XBUS (INT1..3, INTU).&lt;br /&gt;
 * This function must be called VERY frequently&lt;br /&gt;
 * out of the main loop.&lt;br /&gt;
 * Bigger delays result in slower reaction to&lt;br /&gt;
 * interrupt requests of the RP6 Sensor Board.&lt;br /&gt;
 * Interrupt function table:&lt;br /&gt;
 *   Int. : Function 1      IRQ  Function 2       IRQ&lt;br /&gt;
 *   -------------------------------------------------&lt;br /&gt;
 *   INT1 : LSM303DLHC INT1  H&lt;br /&gt;
 *   INT2 : MAX7311   INT_N  L&lt;br /&gt;
 *   INT3 : LSM303DLHC INT2  H   DS1339 SQW/INT_N  L&lt;br /&gt;
 *   INTU : not used&lt;br /&gt;
 * You can see in the &amp;quot;IRQ&amp;quot; column, which level&lt;br /&gt;
 * (H/L) means an ACTIVE INTERRUPT signal.&lt;br /&gt;
 * The interrupt pin levels (H=true/L=false) are&lt;br /&gt;
 * read into the global interrupt_RP6SBstatus&lt;br /&gt;
 * variable.&lt;br /&gt;
 *&lt;br /&gt;
 * Hints: - This function checks the interrupt&lt;br /&gt;
 *          signals by polling. This is NOT the&lt;br /&gt;
 *          best way to do this job. You will&lt;br /&gt;
 *          have to write your own task, if you&lt;br /&gt;
 *          want to use the Pin Change Interrupt&lt;br /&gt;
 *          function of the ATmega2560&lt;br /&gt;
 *          microcontroller.&lt;br /&gt;
 *        - You cannot use both interrupt sources&lt;br /&gt;
 *          for INT3! So you should not use INT2&lt;br /&gt;
 *          of the LSM303DLHC together with the&lt;br /&gt;
 *          alarm function of the DS1339 (RTC)!&lt;br /&gt;
 *        - Every interrupt signal of the Sensor&lt;br /&gt;
 *          Board may be cut off from the XBUS&lt;br /&gt;
 *          by opening a jumper (Jx):&lt;br /&gt;
 *          INT1 -&amp;gt; J3 (LSM303DLHC INT1)&lt;br /&gt;
 *          INT2 -&amp;gt; J4 (MAX7311 INT_N)&lt;br /&gt;
 *          INT3 -&amp;gt; J2 (DS1339 SQW/INT_N)&lt;br /&gt;
 *          INT3 -&amp;gt; J5 (LSM303DLHC INT2)&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *&lt;br /&gt;
 *   if (!interrupt_RP6SBstatus.portexp)&lt;br /&gt;
 *        writeString_P(&amp;quot;==&amp;gt; MAX7311 INT_N!!!&amp;quot;);&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void task_checkINTs(void)&lt;br /&gt;
{&lt;br /&gt;
	if(IO_SENSOR_INT1_PIN &amp;amp; IO_SENSOR_INT1_IN)	// XBUS INT1 -&amp;gt; PJ3 (PCINT12)&lt;br /&gt;
		interrupt_RP6SBstatus.int1 = true;&lt;br /&gt;
	else&lt;br /&gt;
		interrupt_RP6SBstatus.int1 = false;&lt;br /&gt;
	if(IO_SENSOR_INT2_PIN &amp;amp; IO_SENSOR_INT2_IN)	// XBUS INT2 -&amp;gt; PJ6 (PCINT15)&lt;br /&gt;
		interrupt_RP6SBstatus.int2 = true;&lt;br /&gt;
	else&lt;br /&gt;
		interrupt_RP6SBstatus.int2 = false;&lt;br /&gt;
	if(IO_SENSOR_INT3_PIN &amp;amp; IO_SENSOR_INT3_IN)	// XBUS INT3 -&amp;gt; PJ5 (PCINT14)&lt;br /&gt;
		interrupt_RP6SBstatus.int3 = true;&lt;br /&gt;
	else&lt;br /&gt;
		interrupt_RP6SBstatus.int3 = false;&lt;br /&gt;
//	if(IO_SENSOR_INTU_PIN &amp;amp; IO_SENSOR_INTU_IN)	// XBUS INTU -&amp;gt; PJ4 (PCINT13)&lt;br /&gt;
//		interrupt_RP6SBstatus.intu = true;&lt;br /&gt;
//	else&lt;br /&gt;
//		interrupt_RP6SBstatus.intu = false;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
max7311IOs_t inport;&lt;br /&gt;
uint8_t readyBusbuff;&lt;br /&gt;
uint8_t pressedButton;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function checks all I/O ports (I/O 0.0..1.7)&lt;br /&gt;
 * of the MAX7311 sequentially!&lt;br /&gt;
 * You must call this function frequently out of&lt;br /&gt;
 * the main loop.&lt;br /&gt;
 * The I/O port values (true/false) are read into&lt;br /&gt;
 * the global inport variable.&lt;br /&gt;
 * The global variables readyBusbuff (2-Wire Bus&lt;br /&gt;
 * Buffer: Enable) and pressedButton (Button S1:&lt;br /&gt;
 * Pressed) contain actual values (true/false)&lt;br /&gt;
 * after execution of this task.&lt;br /&gt;
 *&lt;br /&gt;
 * Examples:&lt;br /&gt;
 *&lt;br /&gt;
 *   if (inport.rdy_busbuff)&lt;br /&gt;
 *        writeString_P(&amp;quot;I/O 0.3: High&amp;quot;);&lt;br /&gt;
 *   else writeString_P(&amp;quot;I/O 0.3: Low&amp;quot;);&lt;br /&gt;
 *   if (!inport.drdy_magacc)&lt;br /&gt;
 *        writeString_P(&amp;quot;I/O 1.5: Low&amp;quot;);&lt;br /&gt;
 *   if (pressedButton)&lt;br /&gt;
 *        writeString_P(&amp;quot;Button pressed!&amp;quot;);&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void task_RP6SensorBoard(void)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmitByte(I2C_SENSOR_PORTEXP_ADR, MAX7311_INPUT_PORT1);&lt;br /&gt;
	I2CTWI_readBytes(I2C_SENSOR_PORTEXP_ADR, registerBuf, 2);&lt;br /&gt;
	inport.word = (registerBuf[1] &amp;lt;&amp;lt; 8) + registerBuf[0];&lt;br /&gt;
	readyBusbuff = inport.rdy_busbuff;&lt;br /&gt;
	pressedButton = inport.io2_i2c;&lt;br /&gt;
	pressedButton = !pressedButton;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
max7311IOs_t outport;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Updates the I/O ports with current value from&lt;br /&gt;
 * the global outport variable!&lt;br /&gt;
 * If one or more port pins were configured as&lt;br /&gt;
 * output before, they will be set (high) or&lt;br /&gt;
 * cleared (low).&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *&lt;br /&gt;
 *   outport.word = 0b0000000000001001;&lt;br /&gt;
 *   MAX7311_update();&lt;br /&gt;
 *   // This clears all I/O ports and sets&lt;br /&gt;
 *   // the ports I/O 0.0 and I/O 0.3!&lt;br /&gt;
 *&lt;br /&gt;
 *   // Other possibility:&lt;br /&gt;
 *   outport.pwr_sharp_f = true;&lt;br /&gt;
 *   MAX7311_update();&lt;br /&gt;
 *   // This sets I/O 0.1 and does not&lt;br /&gt;
 *   // affect any other I/O port!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void MAX7311_update(void)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmit3Bytes(I2C_SENSOR_PORTEXP_ADR, MAX7311_OUTPUT_PORT1, outport.word, (outport.word&amp;gt;&amp;gt;8));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Writes the 16-bit data to a MAX7311.&lt;br /&gt;
 * The data are output with those I/O ports that&lt;br /&gt;
 * were configured as output before.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: data -&amp;gt; Data word&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void MAX7311_write(uint16_t data)&lt;br /&gt;
{&lt;br /&gt;
	outport.word = data;&lt;br /&gt;
	MAX7311_update();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Initializes the I/O Port Expander after power&lt;br /&gt;
 * on.&lt;br /&gt;
 *&lt;br /&gt;
 * Hint: If USE_PD5 is defined in the&lt;br /&gt;
 *       configuration header file, this&lt;br /&gt;
 *       function uses the RP6M256 portpin,&lt;br /&gt;
 *       that is connected to plug I/O: Pin 9&lt;br /&gt;
 *       instead of MAX7311 I/O 1.0!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void MAX7311_init(void)&lt;br /&gt;
{&lt;br /&gt;
#ifdef USE_PD5&lt;br /&gt;
	MAX7311_write_cfg(MAX7311_CONFIG_USE_PD5);&lt;br /&gt;
	IO_SENSOR_TCA4311A_EN_DDR |= IO_SENSOR_TCA4311A_EN_IN;		// Output&lt;br /&gt;
	IO_SENSOR_TCA4311A_EN_PORT |= IO_SENSOR_TCA4311A_EN_IN;		// High&lt;br /&gt;
#else&lt;br /&gt;
	MAX7311_write_cfg(MAX7311_CONFIG_DEFAULT);&lt;br /&gt;
#endif&lt;br /&gt;
	MAX7311_write(MAX7311_OUTPUT_DEFAULT);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Real Time Clock (RTC DS1339):&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function converts a BCD to a DEC value.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
uint8_t BCD2DEC(uint8_t bcd)&lt;br /&gt;
{&lt;br /&gt;
	return ((bcd &amp;gt;&amp;gt; 4) * 10 + (bcd &amp;amp; 0x0f));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function converts a DEC to a BCD value.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
uint8_t DEC2BCD(uint8_t dec)&lt;br /&gt;
{uint8_t units = dec % 10;&lt;br /&gt;
	if (dec /= 10) {&lt;br /&gt;
		return (units + (DEC2BCD(dec) &amp;lt;&amp;lt; 4));&lt;br /&gt;
	}&lt;br /&gt;
	else {&lt;br /&gt;
		return units;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Sends the configuration byte to a DS1339.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: Config byte for control register&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void DS1339_write_cfg(uint8_t config)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_RTC_ADR, DS1339_CONTROL, config);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Initializes the DS1339 Trickle Charger&lt;br /&gt;
 * function to the default for the RP6 Sensor&lt;br /&gt;
 * Board: One diode and 2kOhm resistor.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void DS1339_init(void)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_RTC_ADR, DS1339_TRICKLE_CHARGER, DS1339_TRICKLE_CHARGER_DEFAULT);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Reads all data registers of the Real Time Clock (RTC).&lt;br /&gt;
 * They are stored in the time &amp;amp; date variables defined in&lt;br /&gt;
 * the library header.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void DS1339_read(void)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmitByte(I2C_SENSOR_RTC_ADR, DS1339_SECONDS);&lt;br /&gt;
	I2CTWI_readBytes(I2C_SENSOR_RTC_ADR, registerBuf, 7);&lt;br /&gt;
	rtc_time.second = BCD2DEC(registerBuf[0]);&lt;br /&gt;
	rtc_time.minute = BCD2DEC(registerBuf[1]);&lt;br /&gt;
	rtc_time.hour = BCD2DEC(registerBuf[2] &amp;amp; 0x3f);&lt;br /&gt;
	rtc_date.weekday = (registerBuf[3] &amp;amp; 0x07);&lt;br /&gt;
	rtc_date.day = BCD2DEC(registerBuf[4]);&lt;br /&gt;
	rtc_date.month = BCD2DEC(registerBuf[5] &amp;amp; 0x7f);&lt;br /&gt;
	if(registerBuf[5] &amp;amp; 0x80) rtc_date.year = 100;&lt;br /&gt;
	else rtc_date.year = 0;&lt;br /&gt;
	rtc_date.year += BCD2DEC(registerBuf[6]);&lt;br /&gt;
	rtc_date.year += 2000;&lt;br /&gt;
	rtc_time.dst = 0;&lt;br /&gt;
#ifdef CALC_DST&lt;br /&gt;
	// Calculate MESZ (DST):&lt;br /&gt;
	uint8_t wday = rtc_date.weekday;			// Weekday [1..7 = R_MO..R_SU]&lt;br /&gt;
	if(wday == 7) wday = 0;&lt;br /&gt;
	if(rtc_date.month &amp;lt; 3 || rtc_date.month &amp;gt; 10) {&lt;br /&gt;
		return;&lt;br /&gt;
	}&lt;br /&gt;
	if((rtc_date.day - wday &amp;gt;= 25)&lt;br /&gt;
	 &amp;amp;&amp;amp; (wday || rtc_time.hour &amp;gt;= 2)) {&lt;br /&gt;
		if(rtc_date.month == 10)&lt;br /&gt;
			return;&lt;br /&gt;
	}&lt;br /&gt;
	else {&lt;br /&gt;
		if(rtc_date.month == 3) {&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	rtc_time.dst = 1;&lt;br /&gt;
#endif&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Writes the time &amp;amp; date infos in the variables defined in&lt;br /&gt;
 * the library header to the Real Time Clock (RTC).&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void DS1339_write(void)&lt;br /&gt;
{&lt;br /&gt;
	registerBuf[0] = DS1339_SECONDS;&lt;br /&gt;
	registerBuf[1] = DEC2BCD(rtc_time.second);&lt;br /&gt;
	registerBuf[2] = DEC2BCD(rtc_time.minute);&lt;br /&gt;
	registerBuf[3] = DEC2BCD(rtc_time.hour);&lt;br /&gt;
	registerBuf[4] = rtc_date.weekday;&lt;br /&gt;
	registerBuf[5] = DEC2BCD(rtc_date.day);&lt;br /&gt;
	registerBuf[6] = DEC2BCD(rtc_date.month);&lt;br /&gt;
	registerBuf[7] = DEC2BCD(rtc_date.year - 2000);&lt;br /&gt;
	I2CTWI_transmitBytes(I2C_SENSOR_RTC_ADR, &amp;amp;registerBuf[0], 8);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Temperature Sensor (LM75B):&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Sends the configuration byte to a LM75B.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: Config byte for Conf register&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void LM75B_write_cfg(uint8_t config)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_TEMP_ADR, LM75B_CONF, config);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
uint8_t temperature_low;&lt;br /&gt;
uint8_t temperature_high;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Reads the two data registers of the temperature&lt;br /&gt;
 * sensor's Temp register.&lt;br /&gt;
 * They are stored in the variables temperature_low&lt;br /&gt;
 * and _high.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void LM75B_read(void)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmitByte(I2C_SENSOR_TEMP_ADR, LM75B_TEMP);&lt;br /&gt;
	I2CTWI_readBytes(I2C_SENSOR_TEMP_ADR, registerBuf, 2);&lt;br /&gt;
	temperature_high = registerBuf[0];&lt;br /&gt;
	temperature_low = registerBuf[1];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
double temperature;						// Temperature [°C]&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Calculates and returns the temperature value&lt;br /&gt;
 * by using the data read from the LM75B with&lt;br /&gt;
 * the function LM75B_read(). The sensor is&lt;br /&gt;
 * designed for 11 bit measurement and 0.125°C&lt;br /&gt;
 * resolution.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
double LM75B_calculate(void)&lt;br /&gt;
{&lt;br /&gt;
	int16_t tempraw = 0;&lt;br /&gt;
	double temp;&lt;br /&gt;
&lt;br /&gt;
	tempraw = (getTemperatureHigh() &amp;lt;&amp;lt; 8) | getTemperatureLow();&lt;br /&gt;
	tempraw &amp;gt;&amp;gt;= 5;&lt;br /&gt;
	if (tempraw &amp;amp; 1024)							// Calculate temperature&lt;br /&gt;
		tempraw = (tempraw &amp;amp; 1023) - 1024;&lt;br /&gt;
	else&lt;br /&gt;
		tempraw = tempraw &amp;amp; 1023;&lt;br /&gt;
	temp = tempraw * 0.125;&lt;br /&gt;
	return temp;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Performs a 11 bit measurement and returns the&lt;br /&gt;
 * temperature [°C]. The sensor has a measuring&lt;br /&gt;
 * cycle of 100ms. So it makes no sense calling&lt;br /&gt;
 * this function at a frequency above 10Hz.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
double LM75B_measure(void)&lt;br /&gt;
{&lt;br /&gt;
//	LM75B_init();&lt;br /&gt;
	LM75B_read();								// Read data&lt;br /&gt;
	return (LM75B_calculate());					// Calculate value&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Servo Controller (PCA9685):&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Call this once before using the servo function.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: PWM frequency [40..1000 Hz]&lt;br /&gt;
 *&lt;br /&gt;
 * Hints: - Default servo frequency is 50 Hz!&lt;br /&gt;
 *        - The servo power is NOT switched on by&lt;br /&gt;
 *          this function!&lt;br /&gt;
 *&lt;br /&gt;
 * There is also a macro initServo(freq), which&lt;br /&gt;
 * does exactly the same as this function.&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *   initServo(50);&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void PCA9685_init(uint16_t freq)&lt;br /&gt;
{&lt;br /&gt;
	outport.oen_servo = false;					// I/O 1.3: Low&lt;br /&gt;
	MAX7311_update();&lt;br /&gt;
	if ((freq &amp;lt; 40) || (freq &amp;gt; 1000)) freq = 50;&lt;br /&gt;
	I2CTWI_transmitByte(I2C_SENSOR_SERVO_ADR, PCA9685_MODE2);&lt;br /&gt;
	uint8_t last_mode = I2CTWI_readByte(I2C_SENSOR_SERVO_ADR);&lt;br /&gt;
	last_mode &amp;amp;= ~PCA9685_MODE2_INVRT;			// Clear INVRT bit&lt;br /&gt;
	last_mode |= PCA9685_MODE2_OUTDRV;			// Set OUTDRV bit&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_SERVO_ADR, PCA9685_MODE2, last_mode);&lt;br /&gt;
	I2CTWI_transmitByte(I2C_SENSOR_SERVO_ADR, PCA9685_MODE1);&lt;br /&gt;
	last_mode = I2CTWI_readByte(I2C_SENSOR_SERVO_ADR);&lt;br /&gt;
	last_mode |= PCA9685_MODE1_AI;				// Set AI bit&lt;br /&gt;
	uint8_t mode1 = last_mode;&lt;br /&gt;
	mode1 |= PCA9685_MODE1_SLEEP;				// Set SLEEP bit&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_SERVO_ADR, PCA9685_MODE1, mode1);&lt;br /&gt;
	uint8_t prescale = (uint8_t) (F_PCA9685 / 4096 / freq - 0.5);&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_SERVO_ADR, PCA9685_PRE_SCALE, prescale);&lt;br /&gt;
	last_mode &amp;amp;= ~PCA9685_MODE1_SLEEP;			// Clear SLEEP bit&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_SERVO_ADR, PCA9685_MODE1, last_mode);&lt;br /&gt;
	mSleep(1);&lt;br /&gt;
	last_mode |= PCA9685_MODE1_RESTART;			// Clear RESTART bit&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_SERVO_ADR, PCA9685_MODE1, last_mode);&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_SERVO_ADR, PCA9685_LED8_ON_H, 0x10);&lt;br /&gt;
	return;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/** &lt;br /&gt;
 * Returns the channel belonging to a servo number.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: number -&amp;gt; Servo number [1..8]&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
uint8_t servo(uint8_t number)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t channel;&lt;br /&gt;
&lt;br /&gt;
	switch (number) {&lt;br /&gt;
		case 1 :&lt;br /&gt;
			channel = CH_SERVO_1; break;&lt;br /&gt;
		case 2 :&lt;br /&gt;
			channel = CH_SERVO_2; break;&lt;br /&gt;
		case 3 :&lt;br /&gt;
			channel = CH_SERVO_3; break;&lt;br /&gt;
		case 4 :&lt;br /&gt;
			channel = CH_SERVO_4; break;&lt;br /&gt;
		case 5 :&lt;br /&gt;
			channel = CH_SERVO_5; break;&lt;br /&gt;
		case 6 :&lt;br /&gt;
			channel = CH_SERVO_6; break;&lt;br /&gt;
		case 7 :&lt;br /&gt;
			channel = CH_SERVO_7; break;&lt;br /&gt;
		case 8 :&lt;br /&gt;
			channel = CH_SERVO_8; break;&lt;br /&gt;
		default : channel = CH_SERVO_1;&lt;br /&gt;
	}&lt;br /&gt;
	return channel;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This is the servo position set function.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: channel -&amp;gt; Channel number [1..16]&lt;br /&gt;
 *        pos     -&amp;gt; Servo position [SERVOx_LT..SERVOx_RT]&lt;br /&gt;
 *&lt;br /&gt;
 * Hints: - A servo position of 205 means 1 ms servo impulse,&lt;br /&gt;
 *          a position of 410 means a 2 ms servo impulse!&lt;br /&gt;
 *          You may calculate the servo impulse length by:&lt;br /&gt;
 *          ==&amp;gt; Impulse [ms] = servo position / 204.8 &amp;lt;==&lt;br /&gt;
 *          (Formula only valid for a PWM of 50 Hz!)&lt;br /&gt;
 *&lt;br /&gt;
 * There is also a macro setServo(servo, pos), which&lt;br /&gt;
 * does nearly the same as this function, but the first&lt;br /&gt;
 * parameter is the servo and NOT the channel number.&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *   setServo(2,300);&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void PCA9685_set(uint8_t channel, uint16_t pos)&lt;br /&gt;
{&lt;br /&gt;
	if ((channel == 0) || (channel &amp;gt; 16))&lt;br /&gt;
		return;&lt;br /&gt;
	uint8_t reg = channel * 4 + 4;				// Register LEDx_OFF_L&lt;br /&gt;
	I2CTWI_transmit3Bytes(I2C_SENSOR_SERVO_ADR, reg, (pos &amp;amp; 0x00ff), (pos &amp;gt;&amp;gt; 8));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * If the servos are not moving for a while, the&lt;br /&gt;
 * servo function can be stopped with this&lt;br /&gt;
 * function (PCA9685 set to sleep mode).&lt;br /&gt;
 *&lt;br /&gt;
 * Hint: The servo power is NOT switched off by&lt;br /&gt;
 *       this function!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void PCA9685_shutdown(void)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_SERVO_ADR, PCA9685_ALL_LED_OFF_H, 0x10);&lt;br /&gt;
	I2CTWI_transmitByte(I2C_SENSOR_SERVO_ADR, PCA9685_MODE1);&lt;br /&gt;
	uint8_t mode1 = I2CTWI_readByte(I2C_SENSOR_SERVO_ADR);&lt;br /&gt;
	mode1 |= PCA9685_MODE1_SLEEP;				// Set SLEEP bit&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_SERVO_ADR, PCA9685_MODE1, mode1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * If the servo function was stopped with the&lt;br /&gt;
 * function PCA9685_shutdown() before, it can be&lt;br /&gt;
 * (re)started again with this function.&lt;br /&gt;
 *&lt;br /&gt;
 * Hint: The servo power is NOT switched on by&lt;br /&gt;
 *       this function!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void PCA9685_restart(void)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmitByte(I2C_SENSOR_SERVO_ADR, PCA9685_MODE1);&lt;br /&gt;
	uint8_t mode1 = I2CTWI_readByte(I2C_SENSOR_SERVO_ADR);&lt;br /&gt;
	if (mode1 &amp;amp; PCA9685_MODE1_RESTART) {		// RESTART bit set?&lt;br /&gt;
		mode1 &amp;amp;= ~PCA9685_MODE1_SLEEP;			// Clear SLEEP bit&lt;br /&gt;
		I2CTWI_transmit2Bytes(I2C_SENSOR_SERVO_ADR, PCA9685_MODE1, mode1);&lt;br /&gt;
		mSleep(1);&lt;br /&gt;
		mode1 |= PCA9685_MODE1_RESTART;			// Clear RESTART bit&lt;br /&gt;
		I2CTWI_transmit2Bytes(I2C_SENSOR_SERVO_ADR, PCA9685_MODE1, mode1);&lt;br /&gt;
		I2CTWI_transmit2Bytes(I2C_SENSOR_SERVO_ADR, PCA9685_ALL_LED_OFF_H, 0);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/** &lt;br /&gt;
 * With this function you can switch the servo&lt;br /&gt;
 * power on or off.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: pwr -&amp;gt; 0 (false) = servo power off&lt;br /&gt;
 *               &amp;gt;0 (true) = servo power on&lt;br /&gt;
 *&lt;br /&gt;
 * Hints: - If connected servos are not used, you&lt;br /&gt;
 *          should always switch the servo power off&lt;br /&gt;
 *          (default) to save energy!&lt;br /&gt;
 *        - The PCA9685 is NOT restarted or put into&lt;br /&gt;
 *          shutdown mode by this function!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void setServoPower(uint8_t pwr)&lt;br /&gt;
{&lt;br /&gt;
	if(pwr &amp;gt; 0)&lt;br /&gt;
		outport.pwr_servo = true;				// I/O 1.4: High&lt;br /&gt;
	else&lt;br /&gt;
		outport.pwr_servo = false;				// I/O 1.4: Low&lt;br /&gt;
	MAX7311_update();&lt;br /&gt;
}	&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C LED Driver (TCA6507):&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Sends the configuration byte to TCA6507's&lt;br /&gt;
 * internal registers.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: reg    -&amp;gt; Register address [0..10]&lt;br /&gt;
 *        config -&amp;gt; Config byte for internal&lt;br /&gt;
 *                  registers&lt;br /&gt;
 *&lt;br /&gt;
 * Hints: - With this function you can write to&lt;br /&gt;
 *          all internal registers of the LED&lt;br /&gt;
 *          driver, see &amp;quot;Registers:&amp;quot; in the&lt;br /&gt;
 *          library header file!&lt;br /&gt;
 *        - Mainly you will use this function&lt;br /&gt;
 *          for setting time (regs 3..7) and&lt;br /&gt;
 *          intensity (regs 8, 9) values.&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *   TCA6507_write_cfg(TCA6507_MAXIMUM_INTENSITY,0x77);&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void TCA6507_write_cfg(uint8_t reg, uint8_t config)&lt;br /&gt;
{&lt;br /&gt;
	if(reg &amp;gt; 10) reg = 0;&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_LEDDRIVER_ADR, reg, config);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
uint8_t select[3];&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Updates the LED driver select registers (0..2)&lt;br /&gt;
 * with the global select array!&lt;br /&gt;
 *&lt;br /&gt;
 * Hint: - Also have a look at Table 4 in the&lt;br /&gt;
 *         TCA6507 datasheet!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void TCA6507_update(void)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmit4Bytes(I2C_SENSOR_LEDDRIVER_ADR, (TCA6507_SELECT0 | 0x10), select[0], select[1], select[2]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This is the LED state set function.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: led   -&amp;gt; LED number [0..6]&lt;br /&gt;
 *        state -&amp;gt; LED state  [0..7]&lt;br /&gt;
 *&lt;br /&gt;
 * Hints: - Possible driver states [0..7] see&lt;br /&gt;
 *          &amp;quot;Output states:&amp;quot; in the library&lt;br /&gt;
 *          header file!&lt;br /&gt;
 *        - Also have a look at Table 4 in the&lt;br /&gt;
 *          TCA6507 datasheet!&lt;br /&gt;
 *&lt;br /&gt;
 * There is also a macro setLED(led, state), which&lt;br /&gt;
 * does exactly the same as this function.&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *   setLED(1,4);&lt;br /&gt;
 *   // Switches LED1 ON&lt;br /&gt;
 *   // ... OR ...&lt;br /&gt;
 *   setLED(SB_LED1,STATE_ON);&lt;br /&gt;
 *   // does the same.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void TCA6507_set(uint8_t led, uint8_t state)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t i, mask;&lt;br /&gt;
&lt;br /&gt;
	if(led &amp;gt; 6) led = 0;&lt;br /&gt;
	led = 1 &amp;lt;&amp;lt; led;&lt;br /&gt;
	mask = 1;&lt;br /&gt;
	for(i = 0; i &amp;lt; 3; i++) {&lt;br /&gt;
		select[i] &amp;amp;= ~led;&lt;br /&gt;
		if(state &amp;amp; mask)&lt;br /&gt;
			select[i] |= led;&lt;br /&gt;
		mask &amp;lt;&amp;lt;= 1;&lt;br /&gt;
	}&lt;br /&gt;
	TCA6507_update();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * If the LEDs are not needed for a while, the&lt;br /&gt;
 * LED driver can be stopped with this function&lt;br /&gt;
 * (TCA6507 set to shutdown mode).&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void TCA6507_shutdown(void)&lt;br /&gt;
{&lt;br /&gt;
	outport.en_leddriv = false;					// I/O 0.4: Low&lt;br /&gt;
	MAX7311_update();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * If the LED driver was stopped with the&lt;br /&gt;
 * function TCA6507_shutdown() before, it can be&lt;br /&gt;
 * (re)started again with this function.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void TCA6507_restart(void)&lt;br /&gt;
{&lt;br /&gt;
	outport.en_leddriv = true;					// I/O 0.4: High&lt;br /&gt;
	MAX7311_update();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Initializes the LED driver after power on by&lt;br /&gt;
 * switching all LEDs off.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void TCA6507_init(void)&lt;br /&gt;
{&lt;br /&gt;
	select[0] = 0;&lt;br /&gt;
	select[1] = 0;&lt;br /&gt;
	select[2] = 0;&lt;br /&gt;
	TCA6507_update();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C 3D Magnetometer &amp;amp; Accelerometer (LSM303DLHC):&lt;br /&gt;
&lt;br /&gt;
// --------------------------------------------&lt;br /&gt;
// LSM303DLHC accelerometer functions:&lt;br /&gt;
int16_t x_axisa, y_axisa, z_axisa;&lt;br /&gt;
double pitch, roll;&lt;br /&gt;
double xa, ya, za;&lt;br /&gt;
double the, phi;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Call this once before using the 3D-Accelerometer.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void LSM303DLHC_A_init(void)&lt;br /&gt;
{&lt;br /&gt;
	// Set normal power mode, 10 Hz data rate, all axes enabled:&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_LSM303DLHC_A_ADR, CTRL_REG1_A, CTRL_REG1_A_10HZ);&lt;br /&gt;
	mSleep(10);&lt;br /&gt;
	// Set HD mode:&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_LSM303DLHC_A_ADR, CTRL_REG4_A, CTRL_REG4_A_HR);&lt;br /&gt;
	mSleep(10);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function reads the X-axis, Y-axis and Z-axis values&lt;br /&gt;
 * from the LSM303DLHC accelerometer and stores them in the&lt;br /&gt;
 * global variables x_axisa, y_axisa and z_axisa.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void readLSM303DLHC_A(void)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t readBuf[6];&lt;br /&gt;
&lt;br /&gt;
	I2CTWI_transmitByte(I2C_SENSOR_LSM303DLHC_A_ADR, (OUT_X_L_A | 0x80));&lt;br /&gt;
	I2CTWI_readBytes(I2C_SENSOR_LSM303DLHC_A_ADR, readBuf, 6); // Read  X-/Y-/Z-axis&lt;br /&gt;
	// xb = y:&lt;br /&gt;
	x_axisa = ((readBuf[OUT_Y_H_A - OUT_X_L_A] &amp;lt;&amp;lt; 8) + readBuf[OUT_Y_L_A - OUT_X_L_A]) / 16;&lt;br /&gt;
	// yb = x:&lt;br /&gt;
	y_axisa = ((readBuf[OUT_X_H_A - OUT_X_L_A] &amp;lt;&amp;lt; 8) + readBuf[OUT_X_L_A - OUT_X_L_A]) / 16;&lt;br /&gt;
	// zb = z:&lt;br /&gt;
	z_axisa = ((readBuf[OUT_Z_H_A - OUT_X_L_A] &amp;lt;&amp;lt; 8) + readBuf[OUT_Z_L_A - OUT_X_L_A]) / 16;&lt;br /&gt;
	mSleep(10);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function limits and normalizes the x-axisa,&lt;br /&gt;
 * y-axisa and z-axisa values read from the LSM303DLHC&lt;br /&gt;
 * accelerometer with the function readLSM303DLHC_A() and&lt;br /&gt;
 * stores them in the global double variables xa, ya and&lt;br /&gt;
 * za.&lt;br /&gt;
 * It also calculates the position in space in form of the&lt;br /&gt;
 * tilt angles (the = pitch, phi = roll) and stores them&lt;br /&gt;
 * in the global double variables the and phi.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void normalizeLSM303DLHC_A(void)&lt;br /&gt;
{&lt;br /&gt;
	// Limit raw values:&lt;br /&gt;
	if (x_axisa &amp;lt; MIN_X_A) x_axisa = MIN_X_A;&lt;br /&gt;
	if (x_axisa &amp;gt; MAX_X_A) x_axisa = MAX_X_A;&lt;br /&gt;
	if (y_axisa &amp;lt; MIN_Y_A) y_axisa = MIN_Y_A;&lt;br /&gt;
	if (y_axisa &amp;gt; MAX_Y_A) y_axisa = MAX_Y_A;&lt;br /&gt;
	if (z_axisa &amp;lt; MIN_Z_A) z_axisa = MIN_Z_A;&lt;br /&gt;
	if (z_axisa &amp;gt; MAX_Z_A) z_axisa = MAX_Z_A;&lt;br /&gt;
	xa = (double) x_axisa / 1000.0;&lt;br /&gt;
	ya = (double) y_axisa / 1000.0;&lt;br /&gt;
	za = (double) z_axisa / 1000.0;&lt;br /&gt;
	// Calculate Pitch and Roll:&lt;br /&gt;
	phi = asin(xa);								// Calculate the and phi&lt;br /&gt;
	the = asin(ya / cos(the));					//  from the raw values&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function calculates the position in space by&lt;br /&gt;
 * using the the and phi values (see function&lt;br /&gt;
 * normalizeLSM303DLHC_A()!). It stores the position&lt;br /&gt;
 * in the global double variables pitch and roll. &lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void positionLSM303DLHC_A(void)&lt;br /&gt;
{&lt;br /&gt;
	pitch = the * 180 / M_PI + OFFSET_PITCH_A;&lt;br /&gt;
	roll = phi * 180 / M_PI + OFFSET_ROLL_A;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// LSM303DLHC magnetometer functions:&lt;br /&gt;
int16_t x_axism, y_axism, z_axism;&lt;br /&gt;
int16_t headingm;&lt;br /&gt;
double xm, ym, zm;&lt;br /&gt;
#ifdef GET_TEMP_M&lt;br /&gt;
int16_t temperaturem;&lt;br /&gt;
double temperature_mag;&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
int16_t headingtc;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Call this once before using the 3D-Compass.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void LSM303DLHC_M_init(void)&lt;br /&gt;
{&lt;br /&gt;
#ifdef GET_TEMP_M&lt;br /&gt;
	// Set Data output rate to 15Hz, enable temperature sensor:&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_LSM303DLHC_M_ADR, CRA_REG_M, CRA_REG_M_15HZ_T_EN);&lt;br /&gt;
#else&lt;br /&gt;
	// Set Data output rate to 15Hz:&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_LSM303DLHC_M_ADR, CRA_REG_M, CRA_REG_M_15HZ);&lt;br /&gt;
#endif&lt;br /&gt;
	mSleep(10);&lt;br /&gt;
	// Set Gain to +-1.3Gauss:&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_LSM303DLHC_M_ADR, CRB_REG_M, CRB_REG_M_13GAUSS);&lt;br /&gt;
	mSleep(10);&lt;br /&gt;
	// Set Continuous-conversion mode:&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_LSM303DLHC_M_ADR, MR_REG_M, MR_REG_M_CCM);&lt;br /&gt;
	mSleep(10);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function reads the X-axis, Y-axis, Z-axis and&lt;br /&gt;
 * temperature values from the LSM303DLHC magnetometer&lt;br /&gt;
 * and stores them in the global variables x_axism,&lt;br /&gt;
 * y_axism, z_axism and temperaturem.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void readLSM303DLHC_M(void)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t readBuf[6];&lt;br /&gt;
&lt;br /&gt;
	I2CTWI_transmitByte(I2C_SENSOR_LSM303DLHC_M_ADR, OUT_X_H_M);&lt;br /&gt;
	I2CTWI_readBytes(I2C_SENSOR_LSM303DLHC_M_ADR, readBuf, 6); // Read  X-/Y-/Z-axis&lt;br /&gt;
	// xb = x:&lt;br /&gt;
	x_axism = (readBuf[OUT_X_H_M - OUT_X_H_M] &amp;lt;&amp;lt; 8) + readBuf[OUT_X_L_M - OUT_X_H_M];&lt;br /&gt;
	// yb = y:&lt;br /&gt;
	y_axism = (readBuf[OUT_Y_H_M - OUT_X_H_M] &amp;lt;&amp;lt; 8) + readBuf[OUT_Y_L_M - OUT_X_H_M];&lt;br /&gt;
	// zb = z:&lt;br /&gt;
	z_axism = (readBuf[OUT_Z_H_M - OUT_X_H_M] &amp;lt;&amp;lt; 8) + readBuf[OUT_Z_L_M - OUT_X_H_M];&lt;br /&gt;
	mSleep(10);&lt;br /&gt;
#ifdef GET_TEMP_M&lt;br /&gt;
	// Read temperature raw value:&lt;br /&gt;
	I2CTWI_transmitByte(I2C_SENSOR_LSM303DLHC_M_ADR, TEMP_OUT_H_M);&lt;br /&gt;
	readBuf[0] = I2CTWI_readByte(I2C_SENSOR_LSM303DLHC_M_ADR);&lt;br /&gt;
	I2CTWI_transmitByte(I2C_SENSOR_LSM303DLHC_M_ADR, TEMP_OUT_L_M);&lt;br /&gt;
	readBuf[1] = I2CTWI_readByte(I2C_SENSOR_LSM303DLHC_M_ADR);&lt;br /&gt;
	temperaturem = (readBuf[0] &amp;lt;&amp;lt; 8) | readBuf[1];&lt;br /&gt;
	temperaturem &amp;gt;&amp;gt;= 4;&lt;br /&gt;
	if (temperaturem &amp;amp; 2048)					// Calculate temperature&lt;br /&gt;
		temperaturem = (temperaturem &amp;amp; 2047) - 2048;&lt;br /&gt;
	else&lt;br /&gt;
		temperaturem = temperaturem &amp;amp; 2047;&lt;br /&gt;
	mSleep(10);&lt;br /&gt;
#endif&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function compensates hard iron effects and&lt;br /&gt;
 * scales the x-axism, y-axism and z-axism values read&lt;br /&gt;
 * from the LSM303DLHC magnetometer with the function&lt;br /&gt;
 * readLSM303DLHC_M() and stores them in the global&lt;br /&gt;
 * double variables xm, ym and zm.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void normalizeLSM303DLHC_M(void)&lt;br /&gt;
{&lt;br /&gt;
	// Add hard iron offsets:&lt;br /&gt;
	x_axism += OFFSET_X_M;&lt;br /&gt;
	y_axism += OFFSET_Y_M;&lt;br /&gt;
	z_axism += OFFSET_Z_M;&lt;br /&gt;
	// Scale raw values:&lt;br /&gt;
	xm = (x_axism - MIN_X_M) / (MAX_X_M - MIN_X_M) * 2 - 1;&lt;br /&gt;
	ym = (y_axism - MIN_Y_M) / (MAX_Y_M - MIN_Y_M) * 2 - 1;&lt;br /&gt;
	zm = (z_axism - MIN_Z_M) / (MAX_Z_M - MIN_Z_M) * 2 - 1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function calculates the heading by using the&lt;br /&gt;
 * normalized sensor values xm and ym (see function&lt;br /&gt;
 * normalizeLSM303DLHC_M()!). The heading is a value&lt;br /&gt;
 * from 0° to 359°. If the robot's front (and the&lt;br /&gt;
 * RP6 Sensor Board's front edge with the two&lt;br /&gt;
 * headlights) points to ...&lt;br /&gt;
 *   north -&amp;gt; heading is 0°,&lt;br /&gt;
 *   east  -&amp;gt; heading is 90°,&lt;br /&gt;
 *   south -&amp;gt; heading is 180°,&lt;br /&gt;
 *   west  -&amp;gt; heading is 270°.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
int16_t headingLSM303DLHC_M(void)&lt;br /&gt;
{&lt;br /&gt;
	double hdg = atan2(ym, xm) * 180 / M_PI + DECLINATION_M;&lt;br /&gt;
	if(hdg &amp;lt; 0.0) hdg += 360.0;&lt;br /&gt;
	return ((int16_t) hdg);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// --------------------------------------------&lt;br /&gt;
/**&lt;br /&gt;
 * This function calculates the TILT COMPENSATED&lt;br /&gt;
 * heading by using accelerometer (the, phi) AND&lt;br /&gt;
 * magnetometer (xm, ym, zm) data. The heading is a&lt;br /&gt;
 * value from 0° to 359°. If the robot's front (and&lt;br /&gt;
 * the RP6 Sensor Board's front edge with the two&lt;br /&gt;
 * headlights) points to ...&lt;br /&gt;
 *   north -&amp;gt; heading is 0°,&lt;br /&gt;
 *   east  -&amp;gt; heading is 90°,&lt;br /&gt;
 *   south -&amp;gt; heading is 180°,&lt;br /&gt;
 *   west  -&amp;gt; heading is 270°.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
int16_t headingLSM303DLHC_TC(void)&lt;br /&gt;
{&lt;br /&gt;
	double hdgtc, xh, yh;&lt;br /&gt;
&lt;br /&gt;
	xh = xm * cos(the) + zm * sin(the);&lt;br /&gt;
	yh = xm * sin(phi) * sin(the) + ym * cos(phi) - zm * sin(phi) * cos(the);&lt;br /&gt;
//	zh = -xm * cos(phi) * sin(the) + ym * sin(phi) + zm * cos(phi) * cos(the);&lt;br /&gt;
	hdgtc = atan2(yh, xh) * 180 / M_PI + DECLINATION_M;&lt;br /&gt;
	if(hdgtc &amp;lt; 0.0) hdgtc += 360.0;&lt;br /&gt;
	return ((int16_t) hdgtc);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// --------------------------------------------&lt;br /&gt;
/**&lt;br /&gt;
 * Call this once before using the LSM303DLHC.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void LSM303DLHC_init(void)&lt;br /&gt;
{&lt;br /&gt;
	LSM303DLHC_A_init();						// Accelerometer init&lt;br /&gt;
	LSM303DLHC_M_init();						// Magnetometer init&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Analog Yaw-Rate Gyroscope (LY330ALH):&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Sets the LY330ALH mode of operation.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: mode -&amp;gt; Mode [0..3]&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void LY330ALH_set_mode(uint8_t mode)&lt;br /&gt;
{&lt;br /&gt;
	outport.pd_gyro = false;					// I/O 0.6: Low&lt;br /&gt;
	outport.st_gyro = false;					// I/O 0.7: Low&lt;br /&gt;
	if(mode &amp;amp; 1) outport.pd_gyro = true;&lt;br /&gt;
	if(mode &amp;amp; 2) outport.st_gyro = true;&lt;br /&gt;
	MAX7311_update();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Reads the ADC1 value from the RP6Base.&lt;br /&gt;
 *&lt;br /&gt;
 * Hints: - The RP6Base input ADC1 has to be&lt;br /&gt;
 *          connected to the USRBUS: Pin 2 on&lt;br /&gt;
 *          the RP6 mainboard!&lt;br /&gt;
 *        - The RP6Base_I2CSlave program has to&lt;br /&gt;
 *          be loaded into the RP6Base&lt;br /&gt;
 *          microcontroller!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
uint16_t getRP6Base_ADC1(void)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_readRegisters(I2C_RP6_BASE_ADR, I2C_REG_ADC_ADC1_L, registerBuf, 2);&lt;br /&gt;
	return (registerBuf[0] + (registerBuf[1] &amp;lt;&amp;lt; 8));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int16_t z_axisg;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Performs a LY330ALH gyroscope measurement and&lt;br /&gt;
 * returns the angular rate (velocity).&lt;br /&gt;
 * Positive values mean an angular rate while&lt;br /&gt;
 * rotating LEFT and negative values while&lt;br /&gt;
 * rotating RIGHT!&lt;br /&gt;
 * The global integer variable z_axisg also&lt;br /&gt;
 * contains the measurement result.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
int16_t LY330ALH_measure(void)&lt;br /&gt;
{&lt;br /&gt;
	z_axisg = getRP6Base_ADC1();				// Read raw data&lt;br /&gt;
	z_axisg -= ADCVAL_ZERORATE_LEVEL;			// Calculate value&lt;br /&gt;
	return (z_axisg);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Hot Swappable 2-Wire Bus Buffer (TCA4311A):&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Reads the TCA4311A Ready output. &lt;br /&gt;
 * The function returns the state (true/false).&lt;br /&gt;
 * The global variable readyBusbuff is also&lt;br /&gt;
 * filled with the Ready output state.&lt;br /&gt;
 *&lt;br /&gt;
 * Hint: You don't have to use this function,&lt;br /&gt;
 *       if the task task_RP6SensorBoard() is&lt;br /&gt;
 *       called frequently out of the main&lt;br /&gt;
 *       loop, because readyBusbuff will be&lt;br /&gt;
 *       updated by this task!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
uint8_t readReadyBusbuff(void)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmitByte(I2C_SENSOR_PORTEXP_ADR, MAX7311_INPUT_PORT1);&lt;br /&gt;
	readyBusbuff = I2CTWI_readByte(I2C_SENSOR_PORTEXP_ADR);&lt;br /&gt;
	readyBusbuff &amp;amp;= RDY_BUSBUFF;&lt;br /&gt;
	return readyBusbuff;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
uint8_t errorBusbuff;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * If the I2C bus for the I2C-MODULE (SCLOUT,&lt;br /&gt;
 * SDAOUT) is not used or shall be isolated from&lt;br /&gt;
 * the RP6 I2C bus, this can be done with this&lt;br /&gt;
 * function.&lt;br /&gt;
 *&lt;br /&gt;
 * Hints: - The I2C-MODULE power is NOT switched&lt;br /&gt;
 *          off by this function!&lt;br /&gt;
 *        - If USE_PD5 is defined in the&lt;br /&gt;
 *          configuration header file, this&lt;br /&gt;
 *          function uses the RP6M256 portpin,&lt;br /&gt;
 *          that is connected to plug I/O: Pin 9&lt;br /&gt;
 *          instead of MAX7311 I/O 1.0!&lt;br /&gt;
 *        - If the global variable errorBusbuff&lt;br /&gt;
 *          returns true, the bus buffer could&lt;br /&gt;
 *          not be switched to shutdown mode!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void TCA4311A_shutdown(void)&lt;br /&gt;
{&lt;br /&gt;
	// Wait until the I2C bus is idle:&lt;br /&gt;
	while(I2CTWI_isBusy() || TWI_operation != I2CTWI_NO_OPERATION) task_I2CTWI();&lt;br /&gt;
#ifdef USE_PD5&lt;br /&gt;
	IO_SENSOR_TCA4311A_EN_PORT &amp;amp;= ~IO_SENSOR_TCA4311A_EN_IN; // Low&lt;br /&gt;
#else&lt;br /&gt;
	outport.en_busbuff = false;					// I/O 1.0: Low&lt;br /&gt;
	MAX7311_update();&lt;br /&gt;
#endif&lt;br /&gt;
	errorBusbuff = readReadyBusbuff();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * If the I2C bus for the I2C-MODULE (SCLOUT,&lt;br /&gt;
 * SDAOUT) was isolated from the RP6 I2C bus with&lt;br /&gt;
 * the function TCA4311A_shutdown() before, it&lt;br /&gt;
 * can be connected again with this function.&lt;br /&gt;
 *&lt;br /&gt;
 * Hints: - The I2C-MODULE power is NOT switched&lt;br /&gt;
 *          on by this function!&lt;br /&gt;
 *        - If USE_PD5 is defined in the&lt;br /&gt;
 *          configuration header file, this&lt;br /&gt;
 *          function uses the RP6M256 portpin,&lt;br /&gt;
 *          that is connected to plug I/O: Pin 9&lt;br /&gt;
 *          instead of MAX7311 I/O 1.0!&lt;br /&gt;
 *        - If the global variable errorBusbuff&lt;br /&gt;
 *          returns true, the bus buffer could&lt;br /&gt;
 *          not be switched to normal operation!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void TCA4311A_reconnect(void)&lt;br /&gt;
{&lt;br /&gt;
	// Wait until the I2C bus is idle:&lt;br /&gt;
	while(I2CTWI_isBusy() || TWI_operation != I2CTWI_NO_OPERATION) task_I2CTWI();&lt;br /&gt;
#ifdef USE_PD5&lt;br /&gt;
	IO_SENSOR_TCA4311A_EN_PORT |= IO_SENSOR_TCA4311A_EN_IN; // High&lt;br /&gt;
#else&lt;br /&gt;
	outport.en_busbuff = true;					// I/O 1.0: High&lt;br /&gt;
	MAX7311_update();&lt;br /&gt;
#endif&lt;br /&gt;
	errorBusbuff = !readReadyBusbuff();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Sets/clears the RP6Base signal PWR.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: pwr -&amp;gt; 0 (false) = PWR off&lt;br /&gt;
 *               &amp;gt;0 (true) = PWR on&lt;br /&gt;
 *&lt;br /&gt;
 * Hints: - The RP6Base signal PWR has to be&lt;br /&gt;
 *          connected to the USRBUS: Pin 3 on&lt;br /&gt;
 *          the RP6 mainboard!&lt;br /&gt;
 *        - The RP6Base_I2CSlave program has to&lt;br /&gt;
 *          be loaded into the RP6Base&lt;br /&gt;
 *          microcontroller!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void setRP6Base_PWR(uint8_t pwr)&lt;br /&gt;
{&lt;br /&gt;
	if(pwr &amp;gt; 0)&lt;br /&gt;
		I2CTWI_transmit2Bytes(I2C_RP6_BASE_ADR, 0, CMD_POWER_ON);&lt;br /&gt;
	else&lt;br /&gt;
		I2CTWI_transmit2Bytes(I2C_RP6_BASE_ADR, 0, CMD_POWER_OFF);&lt;br /&gt;
	while(I2CTWI_isBusy() || TWI_operation != I2CTWI_NO_OPERATION) task_I2CTWI();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/** &lt;br /&gt;
 * With this function you can switch the I2C-&lt;br /&gt;
 * MODULE (plug M1) power on or off.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: pwr -&amp;gt; 0 (false) = I2C-MODULE power off&lt;br /&gt;
 *               &amp;gt;0 (true) = I2C-MODULE power on&lt;br /&gt;
 *&lt;br /&gt;
 * Hints: - If the I2C-MODULE plug is not used,&lt;br /&gt;
 *          you should always switch the&lt;br /&gt;
 *          I2C-MODULE power off (default)!&lt;br /&gt;
 *        - The TCA4311A is NOT switched to&lt;br /&gt;
 *          normal operation (default) or&lt;br /&gt;
 *          shutdown mode by this function!&lt;br /&gt;
 *        - The RP6Base signal PWR has to be&lt;br /&gt;
 *          connected to the USRBUS: Pin 3 on&lt;br /&gt;
 *          the RP6 mainboard!&lt;br /&gt;
 *        - The RP6Base_I2CSlave program has to&lt;br /&gt;
 *          be loaded into the RP6Base&lt;br /&gt;
 *          microcontroller!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void setI2CModulePower(uint8_t pwr)&lt;br /&gt;
{&lt;br /&gt;
	if(pwr &amp;gt; 0) {&lt;br /&gt;
		setRP6Base_PWR(1);						// RP6Base PWR on&lt;br /&gt;
		outport.pwr_i2c = true;					// I/O 0.0: High&lt;br /&gt;
	}&lt;br /&gt;
	else&lt;br /&gt;
		outport.pwr_i2c = false;				// I/O 0.0: Low&lt;br /&gt;
	MAX7311_update();&lt;br /&gt;
}	&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Button:&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Reads the MAX7311 I/O port 1.7. &lt;br /&gt;
 * The function returns true, if  button S1 is&lt;br /&gt;
 * pressed (I/O 1.7: Low!) and false, if it is&lt;br /&gt;
 * not pressed (I/O 1.7: High!).&lt;br /&gt;
 * The global variable pressedButton is also&lt;br /&gt;
 * filled with the I/O 1.7 output state.&lt;br /&gt;
 *&lt;br /&gt;
 * Hint: You don't have to use this function,&lt;br /&gt;
 *       if the task task_RP6SensorBoard() is&lt;br /&gt;
 *       called frequently out of the main&lt;br /&gt;
 *       loop, because pressedButton will be&lt;br /&gt;
 *       updated by this task!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
uint8_t readButton(void)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmitByte(I2C_SENSOR_PORTEXP_ADR, MAX7311_INPUT_PORT2);&lt;br /&gt;
	pressedButton = I2CTWI_readByte(I2C_SENSOR_PORTEXP_ADR);&lt;br /&gt;
	pressedButton &amp;amp;= IO2_I2C;&lt;br /&gt;
	pressedButton = !pressedButton;&lt;br /&gt;
	return pressedButton;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Status LED:&lt;br /&gt;
&lt;br /&gt;
/** &lt;br /&gt;
 * Sets the status LED (D2) of the RP6 Sensor&lt;br /&gt;
 * Board.&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *   setStatusLED(1);&lt;br /&gt;
 *   // This switches the status LED on!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void setStatusLED(uint8_t on)&lt;br /&gt;
{&lt;br /&gt;
	if(on &amp;gt; 0)&lt;br /&gt;
		outport.io1_i2c = false;				// I/O 1.6: Low&lt;br /&gt;
	else&lt;br /&gt;
		outport.io1_i2c = true;					// I/O 1.6: High&lt;br /&gt;
	MAX7311_update();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// RP6 Sensor Board initialisation and shutdown:&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * You MUST call this function at the beginning of a&lt;br /&gt;
 * main program, that uses the RP6 Sensor Board. &lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void sensor_board_init(void)&lt;br /&gt;
{&lt;br /&gt;
	// I/O Port Expander:&lt;br /&gt;
	MAX7311_init();&lt;br /&gt;
	// RTC:&lt;br /&gt;
	DS1339_init();&lt;br /&gt;
	// Temperature Sensor:&lt;br /&gt;
	LM75B_init();&lt;br /&gt;
	// Servo Controller:&lt;br /&gt;
	PCA9685_init(50);							// Init PWM 50 Hz&lt;br /&gt;
	// LED Driver:&lt;br /&gt;
	TCA6507_init();&lt;br /&gt;
	// 3D Magnetometer &amp;amp; Accelerometer:&lt;br /&gt;
	LSM303DLHC_init();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * If you don't use any function of the RP6&lt;br /&gt;
 * Sensor Board, you can put the board into&lt;br /&gt;
 * &amp;quot;SHUTDOWN MODE&amp;quot;. In this mode the electric&lt;br /&gt;
 * power consumption is very low to save energy.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void sensor_board_shutdown(void)&lt;br /&gt;
{&lt;br /&gt;
	// Servo Controller:&lt;br /&gt;
	PCA9685_shutdown();							// Shutdown PCA9685&lt;br /&gt;
	// Temperature Sensor:&lt;br /&gt;
	LM75B_shutdown();							// Shutdown LM75B&lt;br /&gt;
	// I/O Port Expander:&lt;br /&gt;
	MAX7311_write(MAX7311_OUTPUT_SHUTDOWN);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&lt;br /&gt;
/******************************************************************************&lt;br /&gt;
 * Additional info&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Changelog:&lt;br /&gt;
 * - v. 1.1 RP6M256_I2CMasterLib compatibility 16.09.2014 by Dirk&lt;br /&gt;
 * - v. 1.0 TCA4311A reconnect problem fixed 10.04.2014 by Dirk&lt;br /&gt;
 * - v. 0.9 Interrupt status functions added 09.04.2014 by Dirk&lt;br /&gt;
 * - v. 0.8 (initial release) 17.03.2014 by Dirk&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Erklärung&lt;br /&gt;
&lt;br /&gt;
=====Demo=====&lt;br /&gt;
makefile:&lt;br /&gt;
&amp;lt;pre&amp;gt;...&lt;br /&gt;
TARGET = RP6M256_Sensor_Board_01&lt;br /&gt;
...&lt;br /&gt;
SRC += $(RP6_LIB_PATH)/RP6common/RP6I2CmasterTWI.c&lt;br /&gt;
&lt;br /&gt;
SRC += $(RP6_LIB_PATH)/RP6control_M256_WIFI/RP6M256_Sensor_BoardLib.c&lt;br /&gt;
...&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Datei: RP6M256_Sensor_Board_01.c&lt;br /&gt;
&amp;lt;pre&amp;gt;/* &lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * RP6 ROBOT SYSTEM - RP6 CONTROL M256 Examples&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Example: RP6M256 Sensor Board&lt;br /&gt;
 * Author(s): Dirk&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Description:&lt;br /&gt;
 * In this example we show a first test for the RP6 Sensor Board.&lt;br /&gt;
 * &lt;br /&gt;
 * ############################################################################&lt;br /&gt;
 * The Robot does NOT move in this example! You can simply put it on a table&lt;br /&gt;
 * next to your PC and you should connect it to the PC via the USB Interface!&lt;br /&gt;
 * You should also connect to it via WIFI.&lt;br /&gt;
 * ############################################################################&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Includes:&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6M256Lib.h&amp;quot; 				// The RP6 M256 Library. &lt;br /&gt;
										// Always needs to be included!&lt;br /&gt;
#include &amp;quot;RP6I2CmasterTWI.h&amp;quot;			// Include the I2C-Bus Master Library&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Include our new &amp;quot;RP6M256 Sensor Board library&amp;quot;:&lt;br /&gt;
// (This is the library for accessing the RP6 Sensor Board!)&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6M256_Sensor_BoardLib.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Variables:&lt;br /&gt;
&lt;br /&gt;
char dir[3];&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Returns a 2 character string for the eighth&lt;br /&gt;
 * parts of the direction calculated from the&lt;br /&gt;
 * heading value.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: heading -&amp;gt; Heading value [0..359]&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void calculateDir(char *dir, uint16_t heading)&lt;br /&gt;
{&lt;br /&gt;
	dir[1] = ' ';&lt;br /&gt;
	dir[2] = '\0';&lt;br /&gt;
	if ((heading &amp;lt;= 22) || (heading &amp;gt;=338)) dir[0] = 'N';&lt;br /&gt;
	if ((heading &amp;gt;= 23) &amp;amp;&amp;amp; (heading &amp;lt;= 67)) {dir[0] = 'N'; dir[1] = 'E';} &lt;br /&gt;
	if ((heading &amp;gt;= 68) &amp;amp;&amp;amp; (heading &amp;lt;= 112)) dir[0] = 'E';&lt;br /&gt;
	if ((heading &amp;gt;= 113) &amp;amp;&amp;amp; (heading &amp;lt;= 157)) {dir[0] = 'S'; dir[1] = 'E';}&lt;br /&gt;
	if ((heading &amp;gt;= 158) &amp;amp;&amp;amp; (heading &amp;lt;= 202)) dir[0] = 'S';&lt;br /&gt;
	if ((heading &amp;gt;= 203) &amp;amp;&amp;amp; (heading &amp;lt;= 247)) {dir[0] = 'S'; dir[1] = 'W';}&lt;br /&gt;
	if ((heading &amp;gt;= 248) &amp;amp;&amp;amp; (heading &amp;lt;= 292)) dir[0] = 'W';&lt;br /&gt;
	if ((heading &amp;gt;= 293) &amp;amp;&amp;amp; (heading &amp;lt;= 337)) {dir[0] = 'N'; dir[1] = 'W';}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Write a floating point number to the WIFI.&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *&lt;br /&gt;
 *			// Write a floating point number to the WIFI (no exponent):&lt;br /&gt;
 *			writeDouble_WIFI(1234567.890, 11, 3);&lt;br /&gt;
 *&lt;br /&gt;
 * The value of prec (precision) defines the number of decimal places.&lt;br /&gt;
 * For 32 bit floating point variables (float, double ...) 6 is&lt;br /&gt;
 * the max. value for prec (7 relevant digits).&lt;br /&gt;
 * The value of width defines the overall number of characters in the&lt;br /&gt;
 * floating point number including the decimal point. The number of&lt;br /&gt;
 * pre-decimal positions is: (width - prec - 1).&lt;br /&gt;
 */&lt;br /&gt;
void writeDouble_WIFI(double number, uint8_t width, uint8_t prec)&lt;br /&gt;
{char buffer[width + 1];&lt;br /&gt;
	dtostrf(number, width, prec, &amp;amp;buffer[0]);&lt;br /&gt;
	writeString_WIFI(&amp;amp;buffer[0]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Write a floating point number to the LCD.&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *&lt;br /&gt;
 *			// Write a floating point number to the LCD (no exponent):&lt;br /&gt;
 *			writeDoubleLCD(1234567.890, 11, 3);&lt;br /&gt;
 *&lt;br /&gt;
 * The value of prec (precision) defines the number of decimal places.&lt;br /&gt;
 * For 32 bit floating point variables (float, double ...) 6 is&lt;br /&gt;
 * the max. value for prec (7 relevant digits).&lt;br /&gt;
 * The value of width defines the overall number of characters in the&lt;br /&gt;
 * floating point number including the decimal point. The number of&lt;br /&gt;
 * pre-decimal positions is: (width - prec - 1).&lt;br /&gt;
 */&lt;br /&gt;
void writeDoubleLCD(double number, uint8_t width, uint8_t prec)&lt;br /&gt;
{char buffer[width + 1];&lt;br /&gt;
	dtostrf(number, width, prec, &amp;amp;buffer[0]);&lt;br /&gt;
	writeStringLCD(&amp;amp;buffer[0]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Error handler&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function gets called automatically if there was an I2C Error like&lt;br /&gt;
 * the slave sent a &amp;quot;not acknowledge&amp;quot; (NACK, error codes e.g. 0x20 or 0x30).&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void I2C_transmissionError(uint8_t errorState)&lt;br /&gt;
{&lt;br /&gt;
	writeString_P_WIFI(&amp;quot;\nI2C ERROR - TWI STATE: 0x&amp;quot;);&lt;br /&gt;
	writeInteger_WIFI(errorState, HEX);&lt;br /&gt;
	writeChar_WIFI('\n');&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Main function - The program starts here:&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
	initRP6M256();    // Always call this first! The Processor will not work&lt;br /&gt;
					  // correctly otherwise. &lt;br /&gt;
&lt;br /&gt;
	initLCD(); // Initialize the LC-Display (LCD)&lt;br /&gt;
			   // Always call this before using the LCD!&lt;br /&gt;
&lt;br /&gt;
	setLEDs(0b1111);&lt;br /&gt;
	mSleep(500);&lt;br /&gt;
	setLEDs(0b0000);&lt;br /&gt;
&lt;br /&gt;
	writeString_P_WIFI(&amp;quot;\n\nRP6 Sensor Board Selftest 1!\n&amp;quot;); &lt;br /&gt;
&lt;br /&gt;
	// IMPORTANT:&lt;br /&gt;
	I2CTWI_initMaster(100); // Initialize the TWI Module for Master operation&lt;br /&gt;
							// with 100kHz SCL Frequency&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	// Register the event handler:&lt;br /&gt;
	I2CTWI_setTransmissionErrorHandler(I2C_transmissionError);&lt;br /&gt;
&lt;br /&gt;
	setLEDs(0b1111);&lt;br /&gt;
&lt;br /&gt;
	// Write a text message to the LCD:&lt;br /&gt;
	showScreenLCD(&amp;quot;################&amp;quot;, &amp;quot;################&amp;quot;);&lt;br /&gt;
	mSleep(1500);&lt;br /&gt;
	showScreenLCD(&amp;quot;RP6v2-M256-WIFI &amp;quot;, &amp;quot;Example Program&amp;quot;);&lt;br /&gt;
	mSleep(2500); &lt;br /&gt;
	showScreenLCD(&amp;quot;RP6 Sensor Board&amp;quot;, &amp;quot;   Selftest 1&amp;quot;);&lt;br /&gt;
	mSleep(2500);&lt;br /&gt;
	clearLCD();&lt;br /&gt;
&lt;br /&gt;
	setLEDs(0b0000);&lt;br /&gt;
&lt;br /&gt;
	// ---------------------------------------&lt;br /&gt;
&lt;br /&gt;
	uint8_t onoff = 0;&lt;br /&gt;
	uint16_t servopos = SERVO1_LT;&lt;br /&gt;
	int16_t rate;&lt;br /&gt;
&lt;br /&gt;
	startStopwatch1();&lt;br /&gt;
	startStopwatch2();&lt;br /&gt;
&lt;br /&gt;
	// IMPORTANT:&lt;br /&gt;
	sensor_board_init();						// RP6 Sensor Board init!!!&lt;br /&gt;
	setServoPower(1);							// Servo power ON!&lt;br /&gt;
/*&lt;br /&gt;
	// ----------------------------------------------&lt;br /&gt;
	// Set RTC once (battery empty or not existing:&lt;br /&gt;
	rtc_time.second = 0;&lt;br /&gt;
	rtc_time.minute = 15;&lt;br /&gt;
	rtc_time.hour = 20;				// 20:15&lt;br /&gt;
	rtc_date.weekday = R_SU;&lt;br /&gt;
	rtc_date.day = 20;&lt;br /&gt;
	rtc_date.month = 4;&lt;br /&gt;
	rtc_date.year = 2014;			// Su, 20.4.2014&lt;br /&gt;
	DS1339_write();&lt;br /&gt;
	// Remove this, if RTC is set and running!!!&lt;br /&gt;
	// ----------------------------------------------&lt;br /&gt;
*/&lt;br /&gt;
	while(true) &lt;br /&gt;
	{&lt;br /&gt;
		if(getStopwatch1() &amp;gt; 1000) // 1s&lt;br /&gt;
		{&lt;br /&gt;
			if (onoff) onoff = 0;&lt;br /&gt;
			else onoff = 1;&lt;br /&gt;
&lt;br /&gt;
			// Interrupt status:&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nInterrupt Status:      &amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(interrupt_RP6SBstatus.byte, BIN, 8);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			// Inport status:&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;Inport Status: &amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(inport.word, BIN, 16);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			// Temperature sensor test:&lt;br /&gt;
			temperature = LM75B_measure();		// Measure&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;Temperature: &amp;quot;);&lt;br /&gt;
			writeDouble_WIFI(temperature, 7, 3);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;°\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			// LED driver test:&lt;br /&gt;
			if (onoff) {&lt;br /&gt;
				setLED(HEADLIGHT_R, STATE_ON);&lt;br /&gt;
				setLED(HEADLIGHT_L, STATE_OFF);&lt;br /&gt;
			}&lt;br /&gt;
			else {&lt;br /&gt;
				setLED(HEADLIGHT_L, STATE_ON);&lt;br /&gt;
				setLED(HEADLIGHT_R, STATE_OFF);&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			// Servo controller test (SERVO_1):&lt;br /&gt;
			setServo(1, servopos);&lt;br /&gt;
			servopos += 10;&lt;br /&gt;
			if (servopos &amp;gt; SERVO1_RT) servopos = SERVO1_LT;&lt;br /&gt;
&lt;br /&gt;
			// RTC test:&lt;br /&gt;
			DS1339_read();&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;RTC: &amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(rtc_time.hour, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;:&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(rtc_time.minute, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;:&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(rtc_time.second, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;  &amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(rtc_date.day, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;.&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(rtc_date.month, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;.&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(rtc_date.year, DEC, 4);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			// 3D Magnetometer &amp;amp; Accelerometer test:&lt;br /&gt;
			//  LSM303DLHC accelerometer:&lt;br /&gt;
			task_I2CTWI();&lt;br /&gt;
			readLSM303DLHC_A();					// Get sensor values&lt;br /&gt;
			task_I2CTWI();&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\n3D-Acceleration SENSOR -&amp;gt;\n&amp;quot;);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;X-axis: &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(x_axisa, DEC);&lt;br /&gt;
			writeChar_WIFI('\n');&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;Y-axis: &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(y_axisa, DEC);&lt;br /&gt;
			writeChar_WIFI('\n');&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;Z-axis: &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(z_axisa, DEC);&lt;br /&gt;
			writeChar_WIFI('\n');&lt;br /&gt;
			normalizeLSM303DLHC_A();			// Normalize data&lt;br /&gt;
			positionLSM303DLHC_A();				// Calculate position&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;POSITION: \n&amp;quot;);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;  Pitch [°]: &amp;quot;);&lt;br /&gt;
			writeDouble_WIFI(pitch, 6, 1);&lt;br /&gt;
			writeChar_WIFI('\n');&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;  Roll [°]:  &amp;quot;);&lt;br /&gt;
			writeDouble_WIFI(roll, 6, 1);&lt;br /&gt;
			writeChar_WIFI('\n');&lt;br /&gt;
&lt;br /&gt;
			//  LSM303DLHC magnetometer:&lt;br /&gt;
			task_I2CTWI();&lt;br /&gt;
			readLSM303DLHC_M();					// Get sensor values&lt;br /&gt;
			task_I2CTWI();&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\n3D-Compass SENSOR -&amp;gt;\n&amp;quot;);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;X-axis: &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(x_axism, DEC);&lt;br /&gt;
			writeChar_WIFI('\n');&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;Y-axis: &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(y_axism, DEC);&lt;br /&gt;
			writeChar_WIFI('\n');&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;Z-axis: &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(z_axism, DEC);&lt;br /&gt;
			writeChar_WIFI('\n');&lt;br /&gt;
			normalizeLSM303DLHC_M();			// Normalize data&lt;br /&gt;
			headingm = headingLSM303DLHC_M();	// Calculate heading&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;                 Heading [°]: &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(headingm, DEC);&lt;br /&gt;
			calculateDir(dir, headingm);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;  Direction: &amp;quot;);&lt;br /&gt;
			writeString_WIFI(dir);&lt;br /&gt;
			writeChar_WIFI('\n');&lt;br /&gt;
			headingtc = headingLSM303DLHC_TC();	// Calculate TILT COMPENSATED&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;TILT COMPENSATED heading [°]: &amp;quot;); // heading&lt;br /&gt;
			writeInteger_WIFI(headingtc, DEC);&lt;br /&gt;
			calculateDir(dir, headingtc);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;  Direction: &amp;quot;);&lt;br /&gt;
			writeString_WIFI(dir);&lt;br /&gt;
			writeChar_WIFI('\n');&lt;br /&gt;
#ifdef GET_TEMP_M&lt;br /&gt;
			temperature_mag = (double) temperaturem / 8.0 + OFFSET_TEMP_M;&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;Temperature [°]: &amp;quot;);&lt;br /&gt;
			writeDouble_WIFI(temperature_mag, 7, 2);&lt;br /&gt;
			writeChar_WIFI('\n');&lt;br /&gt;
#endif&lt;br /&gt;
			// Yaw-Rate Gyroscope test:&lt;br /&gt;
			rate = LY330ALH_measure();&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\n1D-Gyro SENSOR -&amp;gt;\n&amp;quot;);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;Z-axis: &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(rate, DEC);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			// RP6 Sensor Board shutdown (button &amp;amp; status LED test):&lt;br /&gt;
			if (pressedButton) {&lt;br /&gt;
				setStatusLED(1);&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;\nPress button again for RP6 Sensor Board SHUTDOWN!\n&amp;quot;);&lt;br /&gt;
				mSleep(2000);&lt;br /&gt;
				do {&lt;br /&gt;
					if(getStopwatch2() &amp;gt; 200) { // 0.2s&lt;br /&gt;
						if (onoff) onoff = 0;&lt;br /&gt;
						else onoff = 1;&lt;br /&gt;
						if (onoff) setStatusLED(1);&lt;br /&gt;
						else setStatusLED(0);&lt;br /&gt;
						setStopwatch2(0);&lt;br /&gt;
					}&lt;br /&gt;
					mSleep(1);&lt;br /&gt;
					task_I2CTWI();&lt;br /&gt;
				} while (!readButton());&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;\n\n\n\n\nPlease wait for RP6 Sensor Board SHUTDOWN...\n&amp;quot;);&lt;br /&gt;
				sensor_board_shutdown();&lt;br /&gt;
				mSleep(3000);&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;\n\n\nThe RP6 Sensor Board now is in SHUTDOWN MODE!!!\n&amp;quot;);&lt;br /&gt;
				mSleep(1000);&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;\nRESET the M256 microcontroller now...\n\n&amp;quot;);&lt;br /&gt;
				while(true) {};&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			setStopwatch1(0);&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		task_checkINTs();						// Read interrupt signals&lt;br /&gt;
		task_RP6SensorBoard();					// RP6 Sensor Board task&lt;br /&gt;
&lt;br /&gt;
		task_I2CTWI();&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Erklärung&lt;br /&gt;
&lt;br /&gt;
====Projekte====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===RP6 Xtra Module===&lt;br /&gt;
Die Dokumentation zu den RP6 Xtra Modulen befindet sich auf der mitgelieferten ''&amp;quot;RP6 Robot System Xtra Modules CD-ROM&amp;quot;''. Auf der CD-ROM sind auch Software-Beispiele zu finden.&lt;br /&gt;
&lt;br /&gt;
Die hier veröffentlichte Software zu den Xtra Modulen ist eine Eigenentwicklung in GCC:&lt;br /&gt;
* Arexx [[RP6_Sensor_Board_und_Xtra_Module#I2C_GPS_Empf.C3.A4nger_JM3-GPS_2|I2C GPS Empfänger JM3-GPS]]&lt;br /&gt;
* Arexx [[RP6_Sensor_Board_und_Xtra_Module#Gyro_Modul_JM3-GYRO_2|Gyro Modul JM3-GYRO]]&lt;br /&gt;
* Arexx [[RP6_Sensor_Board_und_Xtra_Module#3D_Accelerometer_Modul_JM3-3DA_2|3D Accelerometer Modul JM3-3DA]]&lt;br /&gt;
* Arexx [[RP6_Sensor_Board_und_Xtra_Module#BHT_Modul_JM3-BHT31_2|BHT Modul JM3-BHT31]]&lt;br /&gt;
&lt;br /&gt;
====I2C GPS Empfänger JM3-GPS====&lt;br /&gt;
=====Dokumentation=====&lt;br /&gt;
Die Dokumentation zum I2C GPS Empfänger befindet sich auf der mitgelieferten ''&amp;quot;RP6 Robot System Xtra Modules CD-ROM&amp;quot;''.&lt;br /&gt;
&lt;br /&gt;
======Manuals======&lt;br /&gt;
Das Handbuch in der aktuellen Version kann [http://www.jm3-engineering.com/download/doc/ManualGPSModule_de.pdf hier] eingesehen werden.&lt;br /&gt;
&lt;br /&gt;
=====Demo-Programme=====&lt;br /&gt;
Ein Demo-Programm zum I2C GPS Empfänger befindet sich integriert in die RP6 Sensor Board Demo auf der mitgelieferten ''&amp;quot;RP6 Robot System Xtra Modules CD-ROM&amp;quot;''. Diese Demo kann auch in der aktuellen Version im Download Bereich von [http://www.jm3-engineering.com/downloads.htm JM3 Engineering] herunter geladen werden.&lt;br /&gt;
&lt;br /&gt;
=====RP6M256 WiFi: I2C_GPS Library=====&lt;br /&gt;
Die nachfolgende RP6M256_I2C_GPSLib (Eigenentwicklung in GCC) dient zur Ansteuerung des I2C GPS Empfängers durch die RP6M256 WiFi.&lt;br /&gt;
 &lt;br /&gt;
======Libary Header======&lt;br /&gt;
Datei: RP6M256_I2C_GPSLib.h&lt;br /&gt;
&amp;lt;pre&amp;gt;/* ****************************************************************************&lt;br /&gt;
 *                           _______________________&lt;br /&gt;
 *                           \| RP6  ROBOT SYSTEM |/&lt;br /&gt;
 *                            \_-_-_-_-_-_-_-_-_-_/           &amp;gt;&amp;gt;&amp;gt; RP6 M256 WIFI&lt;br /&gt;
 * ----------------------------------------------------------------------------&lt;br /&gt;
 * ----------------------------- [c]2014 - Dirk -------------------------------&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * File: RP6M256_I2C_GPSLib.h&lt;br /&gt;
 * Version: 1.0&lt;br /&gt;
 * Target: RP6 M256 WIFI - ATMEGA2560 @16.00MHz&lt;br /&gt;
 * Author(s): Dirk&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Description:&lt;br /&gt;
 * Header file for new RP6 I2C GPS Receiver library.&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
#ifndef RP6M256_I2C_GPSLIB_H&lt;br /&gt;
#define RP6M256_I2C_GPSLIB_H&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// RP6 Sensor Board:&lt;br /&gt;
&lt;br /&gt;
// If you want to use the RP6 I2C GPS Receiver on the RP6 Sensor Board, you&lt;br /&gt;
// have to define SENSOR_BOARD (default)!&lt;br /&gt;
// If SENSOR_BOARD is NOT defined, this library assumes that the RP6 I2C GPS&lt;br /&gt;
// Receiver is used stand-alone.&lt;br /&gt;
// ------------------&lt;br /&gt;
#define SENSOR_BOARD&lt;br /&gt;
// ------------------&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Includes:&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6M256Lib.h&amp;quot;&lt;br /&gt;
#include &amp;quot;RP6I2CmasterTWI.h&amp;quot;&lt;br /&gt;
#ifdef SENSOR_BOARD&lt;br /&gt;
	#include &amp;quot;RP6M256_Sensor_BoardLib.h&amp;quot;&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// RP6 I2C GPS Receiver:&lt;br /&gt;
#define I2C_GPS_RECEIVER_ADR			0xc8	// Default&lt;br /&gt;
//#define I2C_GPS_RECEIVER_ADR			0xca&lt;br /&gt;
//#define I2C_GPS_RECEIVER_ADR			0xcc&lt;br /&gt;
//#define I2C_GPS_RECEIVER_ADR			0xce&lt;br /&gt;
//#define I2C_GPS_RECEIVER_ADR			0xd0	// DO NOT USE on Sensor Board!&lt;br /&gt;
//#define I2C_GPS_RECEIVER_ADR			0xd2&lt;br /&gt;
//#define I2C_GPS_RECEIVER_ADR			0xd4&lt;br /&gt;
//#define I2C_GPS_RECEIVER_ADR			0xd6&lt;br /&gt;
//#define I2C_GPS_RECEIVER_ADR			0xd8&lt;br /&gt;
//#define I2C_GPS_RECEIVER_ADR			0xda&lt;br /&gt;
//#define I2C_GPS_RECEIVER_ADR			0xdc&lt;br /&gt;
//#define I2C_GPS_RECEIVER_ADR			0xde&lt;br /&gt;
&lt;br /&gt;
// Read registers:&lt;br /&gt;
#define WHO_AM_I						0x20	// I2C address [0xc8..0xde]&lt;br /&gt;
#define LAT_DEG							0x21	// Degrees&lt;br /&gt;
#define LAT_MIN							0x22	// Minutes&lt;br /&gt;
#define LAT_MIN_D_L						0x23	// Minutes decimal part low&lt;br /&gt;
#define LAT_MIN_D_H						0x24	// Minutes decimal part high&lt;br /&gt;
#define LON_DEG							0x25	// Degrees&lt;br /&gt;
#define LON_MIN							0x26	// Minutes&lt;br /&gt;
#define LON_MIN_D_L						0x27	// Minutes decimal part low&lt;br /&gt;
#define LON_MIN_D_H						0x28	// Minutes decimal part high&lt;br /&gt;
#define STATUS							0x29	// Status flags&lt;br /&gt;
#define FIX_IND							0x2a	// FIX_IND&lt;br /&gt;
#define HDOP							0x2b	// HDOP&lt;br /&gt;
#define HDOP_D							0x2c	// HDOP_D&lt;br /&gt;
#define SAT_N							0x2d	// Number of satellites&lt;br /&gt;
#define COURSE_T_L						0x2e	// True heading low byte&lt;br /&gt;
#define COURSE_T_H						0x2f	// True heading high byte&lt;br /&gt;
#define COURSE_T_D						0x30	// Decimal part of course&lt;br /&gt;
#define SPEED_L							0x31	// Speed low byte&lt;br /&gt;
#define SPEED_H							0x32	// Speed high byte&lt;br /&gt;
#define SPEED_D							0x33	// Speed decimal part&lt;br /&gt;
#define ALT_L							0x34	// Altitude low byte&lt;br /&gt;
#define ALT_H							0x35	// Altitude high byte&lt;br /&gt;
#define ALT_DIF_L						0x36	// Differ. WGS-84 MSL low byte&lt;br /&gt;
#define ALT_DIF_H						0x37	// Differ. WGS-84 MSL high byte&lt;br /&gt;
#define UTC_H							0x38	// UTC hour&lt;br /&gt;
#define UTC_MIN							0x39	// UTC minute&lt;br /&gt;
#define UTC_S							0x3a	// UTC second&lt;br /&gt;
#define DAY								0x3b	// Day&lt;br /&gt;
#define YEAR_L							0x3c	// Year low byte&lt;br /&gt;
#define YEAR_H							0x3d	// Year high byte&lt;br /&gt;
#define MONTH							0x3e	// Month&lt;br /&gt;
#define PDOP							0x3f	// PDOP&lt;br /&gt;
#define PDOP_D							0x40	// PDOP_D&lt;br /&gt;
#define VDOP							0x41	// VDOP&lt;br /&gt;
#define VDOP_D							0x42	// VDOP_D&lt;br /&gt;
#define SAT_1							0x43	// SAT # 1&lt;br /&gt;
#define SAT_2							0x44	// SAT # 2&lt;br /&gt;
#define SAT_3							0x45	// SAT # 3&lt;br /&gt;
#define SAT_4							0x46	// SAT # 4&lt;br /&gt;
#define SAT_5							0x47	// SAT # 5&lt;br /&gt;
#define SAT_6							0x48	// SAT # 6&lt;br /&gt;
#define SAT_7							0x49	// SAT # 7&lt;br /&gt;
#define SAT_8							0x4a	// SAT # 8&lt;br /&gt;
#define SAT_9							0x4b	// SAT # 9&lt;br /&gt;
#define SAT_A							0x4c	// SAT # 10&lt;br /&gt;
#define SAT_B							0x4d	// SAT # 11&lt;br /&gt;
#define SAT_C							0x4e	// SAT # 12&lt;br /&gt;
#define SW_VERSION						0x4f	// SW_Version&lt;br /&gt;
#define HEARTBEAT						0x50	// Heartbeat&lt;br /&gt;
&lt;br /&gt;
// Status and Fix_Ind register bitmasks:&lt;br /&gt;
#define STATUS_NS						0b00000001&lt;br /&gt;
#define STATUS_EW						0b00000010&lt;br /&gt;
#define STATUS_SPU						0b00000100&lt;br /&gt;
#define STATUS_AUTON					0b00001000&lt;br /&gt;
#define FIX_IND_UI_FIX					0b10000000&lt;br /&gt;
&lt;br /&gt;
// Write registers:&lt;br /&gt;
#define INIT_CFG						0x90	// INIT CFG&lt;br /&gt;
#define SET_FIX_TIME					0x91	// Pos_Fix_Time&lt;br /&gt;
#define STBY							0x92	// STBY&lt;br /&gt;
#define FAC_RES							0x93	// Factory Reset&lt;br /&gt;
#define EN_JAM							0x94	// Jamming Remover&lt;br /&gt;
#define TEST_MODE						0x96	// Test Mode&lt;br /&gt;
&lt;br /&gt;
// Write register values (commands):&lt;br /&gt;
#define INIT_CFG_HOT_START				1		// Hot Start&lt;br /&gt;
#define INIT_CFG_WARM_START				2		// Warm Start init data loaded&lt;br /&gt;
#define INIT_CFG_WARM_START_EPH_CLR		3		// Warm Start Ephemeris cleared&lt;br /&gt;
#define INIT_CFG_COLD_START				4		// Cold Start&lt;br /&gt;
#define SET_FIX_TIME_1S					1		// Pos Fix Time 1 second&lt;br /&gt;
#define SET_FIX_TIME_2S					2		// Pos Fix Time 2 seconds&lt;br /&gt;
#define STBY_ENTER						1		// Standby (cleared after write)&lt;br /&gt;
#define FAC_RES_ENTER					1		// Factory Reset&lt;br /&gt;
#define EN_JAM_DISABLE					0		// Jamming Remover disable&lt;br /&gt;
#define EN_JAM_ENABLE					1		// Jamming Remover enable&lt;br /&gt;
#define TEST_MODE_INACTIVE				0		// Test Mode inactive&lt;br /&gt;
#define TEST_MODE_ACTIVE				0x15	// Test Mode active&lt;br /&gt;
&lt;br /&gt;
// Data structure (starts at LAT_DEG):&lt;br /&gt;
#define DATA_STRUCT						LAT_DEG	// Start&lt;br /&gt;
// All data from LAT_DEG to HEARTBEAT (48 bytes):&lt;br /&gt;
#define DATA_LENGTH						(HEARTBEAT - LAT_DEG + 1)&lt;br /&gt;
// Basic data from LAT_DEG to SAT_N (13 bytes):&lt;br /&gt;
#define DATA_BASIC						(SAT_N - LAT_DEG + 1)&lt;br /&gt;
&lt;br /&gt;
typedef union {&lt;br /&gt;
 	uint8_t byte;&lt;br /&gt;
	struct {&lt;br /&gt;
		unsigned ns    :1;				// 1: North 0: South&lt;br /&gt;
		unsigned ew    :1;				// 1: East 0: West&lt;br /&gt;
		unsigned spu   :1;				// 1: km/h 0: kn&lt;br /&gt;
		unsigned auton :1;				// 1: Data not valid 0: Autonomous&lt;br /&gt;
		unsigned fix0  :1;&lt;br /&gt;
		unsigned fix1  :1;&lt;br /&gt;
		unsigned stat0 :1;				// Invalid&lt;br /&gt;
		unsigned stat1 :1;				// GPS Com Error&lt;br /&gt;
	};&lt;br /&gt;
	struct {&lt;br /&gt;
		unsigned ns    :1;				// 1: North 0: South&lt;br /&gt;
		unsigned ew    :1;				// 1: East 0: West&lt;br /&gt;
		unsigned spu   :1;				// 1: km/h 0: kn&lt;br /&gt;
		unsigned auton :1;				// 1: Data not valid 0: Autonomous&lt;br /&gt;
		unsigned fix   :2;&lt;br /&gt;
		unsigned stat  :2;				// 00 -&amp;gt; Valid&lt;br /&gt;
										// 01 -&amp;gt; Invalid&lt;br /&gt;
										// 10 -&amp;gt; GPS Com Error&lt;br /&gt;
										// 11 -&amp;gt; n. def.&lt;br /&gt;
	};&lt;br /&gt;
} status_t;&lt;br /&gt;
&lt;br /&gt;
typedef union {&lt;br /&gt;
 	uint8_t byte;&lt;br /&gt;
	struct {							// Fix indicator:&lt;br /&gt;
		unsigned fix_0  :1;				//  1: GPS fix          2: DGPS fix&lt;br /&gt;
		unsigned fix_1  :1;				//  3: PPS fix          4: RTK&lt;br /&gt;
		unsigned fix_2  :1;				//  5: Float RTK        6: Dead reck.&lt;br /&gt;
		unsigned fix_3  :1;				//  7: Manual inp. mode 8: Simul. mode&lt;br /&gt;
		unsigned unused :3;&lt;br /&gt;
		unsigned ui_fix :1;				// HW signal from UC530&lt;br /&gt;
	};&lt;br /&gt;
	struct {&lt;br /&gt;
		unsigned fix    :4;				// See above &amp;quot;Fix indicator&amp;quot;!&lt;br /&gt;
		unsigned unused :3;&lt;br /&gt;
		unsigned ui_fix :1;				// HW signal from UC530&lt;br /&gt;
	};&lt;br /&gt;
} fix_ind_t;&lt;br /&gt;
&lt;br /&gt;
typedef union {&lt;br /&gt;
	struct {&lt;br /&gt;
		uint8_t   latDeg;&lt;br /&gt;
		uint8_t   latMin;&lt;br /&gt;
		uint16_t  latMinDec;&lt;br /&gt;
		uint8_t   lonDeg;&lt;br /&gt;
		uint8_t   lonMin;&lt;br /&gt;
		uint16_t  lonMinDec;&lt;br /&gt;
		status_t  status;&lt;br /&gt;
		fix_ind_t fixInd;&lt;br /&gt;
		uint8_t   hdop;&lt;br /&gt;
		uint8_t   hdopDec;&lt;br /&gt;
		uint8_t   satCount;&lt;br /&gt;
		uint16_t  course;&lt;br /&gt;
		uint8_t   courseDec;&lt;br /&gt;
		uint16_t  speed;&lt;br /&gt;
		uint8_t   speedDec;&lt;br /&gt;
		uint16_t  altitude;&lt;br /&gt;
		uint16_t  altDif;&lt;br /&gt;
		uint8_t   utcHour;&lt;br /&gt;
		uint8_t   utcMinute;&lt;br /&gt;
		uint8_t   utcSec;&lt;br /&gt;
		uint8_t   day;&lt;br /&gt;
		uint16_t  year;&lt;br /&gt;
		uint8_t   month;&lt;br /&gt;
		uint8_t   pdop;&lt;br /&gt;
		uint8_t   pdopDec;&lt;br /&gt;
		uint8_t   vdop;&lt;br /&gt;
		uint8_t   vdopDec;&lt;br /&gt;
		uint8_t   sat[12];&lt;br /&gt;
		uint8_t   swVersion;&lt;br /&gt;
		uint8_t   heartbeat;&lt;br /&gt;
	};&lt;br /&gt;
} gpsdata_t;&lt;br /&gt;
extern gpsdata_t gpsdata;&lt;br /&gt;
&lt;br /&gt;
void I2C_GPS_reset(void);&lt;br /&gt;
void I2C_GPS_write_cmd(uint8_t, uint8_t);&lt;br /&gt;
uint8_t I2C_GPS_read_reg(uint8_t);&lt;br /&gt;
void I2C_GPS_read(uint8_t);&lt;br /&gt;
void I2C_GPS_init(void);&lt;br /&gt;
void I2C_GPS_new_addr(uint8_t);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
/******************************************************************************&lt;br /&gt;
 * Additional info&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Changelog:&lt;br /&gt;
 * &lt;br /&gt;
 *  ---&amp;gt; changes are documented in the file &amp;quot;RP6M256_I2C_GPSLib.c&amp;quot;&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
======Libary Source======&lt;br /&gt;
Datei: RP6M256_I2C_GPSLib.c&lt;br /&gt;
&amp;lt;pre&amp;gt;/* ****************************************************************************&lt;br /&gt;
 *                           _______________________&lt;br /&gt;
 *                           \| RP6  ROBOT SYSTEM |/&lt;br /&gt;
 *                            \_-_-_-_-_-_-_-_-_-_/           &amp;gt;&amp;gt;&amp;gt; RP6 M256 WIFI&lt;br /&gt;
 * ----------------------------------------------------------------------------&lt;br /&gt;
 * ----------------------------- [c]2014 - Dirk -------------------------------&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * File: RP6M256_I2C_GPSLib.c&lt;br /&gt;
 * Version: 1.0&lt;br /&gt;
 * Target: RP6 M256 WIFI - ATMEGA2560 @16.00MHz&lt;br /&gt;
 *         and a RP6 I2C GPS Receiver (CONRAD 1082385)&lt;br /&gt;
 *         optionally on a RP6 Sensor Board (CONRAD 1082384)&lt;br /&gt;
 * Author(s): Dirk&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Description:&lt;br /&gt;
 * &lt;br /&gt;
 * This is our new Library that contains basic routines and functions for&lt;br /&gt;
 * accessing the RP6 I2C GPS Receiver JM3-GPS (CONRAD 1082385).&lt;br /&gt;
 * The library assumes the I2C GPS Receiver software (firmware) v1.2.&lt;br /&gt;
 * If the I2C GPS Receiver is located on the RP6 Sensor Board (CONRAD 1082384)&lt;br /&gt;
 * and connected to the I2C-MODULE plug M1, the RP6M256_Sensor_BoardLib has to&lt;br /&gt;
 * be included!&lt;br /&gt;
 * &lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Includes:&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6M256_I2C_GPSLib.h&amp;quot; 		&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Variables:&lt;br /&gt;
&lt;br /&gt;
uint8_t gpsdataBuf[DATA_LENGTH + 1]; &lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Software reset for the I2C GPS Receiver.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void I2C_GPS_reset(void)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_GPS_RECEIVER_ADR, 0, 0x06);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Writes a command cmd to a register reg of the&lt;br /&gt;
 * I2C GPS Receiver.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: reg -&amp;gt; Write register [0x90..0x96]&lt;br /&gt;
 *        cmd -&amp;gt; Command&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void I2C_GPS_write_cmd(uint8_t reg, uint8_t cmd)&lt;br /&gt;
{&lt;br /&gt;
	if((reg &amp;lt; INIT_CFG) || (reg &amp;gt; TEST_MODE)) return;&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_GPS_RECEIVER_ADR, reg, cmd);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Reads a single register reg from the I2C GPS&lt;br /&gt;
 * Receiver.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: reg -&amp;gt; Read register [0x20..0x50]&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
uint8_t I2C_GPS_read_reg(uint8_t reg)&lt;br /&gt;
{&lt;br /&gt;
	if((reg &amp;lt; WHO_AM_I) || (reg &amp;gt; HEARTBEAT)) reg = WHO_AM_I;&lt;br /&gt;
	I2CTWI_transmitByte(I2C_GPS_RECEIVER_ADR, reg);&lt;br /&gt;
	return (I2CTWI_readByte(I2C_GPS_RECEIVER_ADR));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
gpsdata_t gpsdata;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Reads the GPS data from the I2C GPS Receiver.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: length -&amp;gt; Number of data bytes [1..48]&lt;br /&gt;
 *&lt;br /&gt;
 * Hint: If length = DATA_BASIC, only basic GPS&lt;br /&gt;
 *       data are read. If length = DATA_LENGTH,&lt;br /&gt;
 *       ALL GPS data are read.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void I2C_GPS_read(uint8_t length)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t i;&lt;br /&gt;
&lt;br /&gt;
	if(length &amp;gt; DATA_LENGTH) length = DATA_LENGTH;&lt;br /&gt;
	I2CTWI_readRegisters(I2C_GPS_RECEIVER_ADR, DATA_STRUCT, gpsdataBuf, length);&lt;br /&gt;
	for(i = length; i &amp;lt; DATA_LENGTH; i++) {&lt;br /&gt;
		gpsdataBuf[i] = 0;&lt;br /&gt;
	}&lt;br /&gt;
	gpsdata.latDeg = gpsdataBuf[0];&lt;br /&gt;
	gpsdata.latMin = gpsdataBuf[1];&lt;br /&gt;
	gpsdata.latMinDec = gpsdataBuf[2] + (gpsdataBuf[3] &amp;lt;&amp;lt; 8);&lt;br /&gt;
	gpsdata.lonDeg = gpsdataBuf[4];&lt;br /&gt;
	gpsdata.lonMin = gpsdataBuf[5];&lt;br /&gt;
	gpsdata.lonMinDec = gpsdataBuf[6] + (gpsdataBuf[7] &amp;lt;&amp;lt; 8);&lt;br /&gt;
	gpsdata.status.byte = gpsdataBuf[8];&lt;br /&gt;
	gpsdata.fixInd.byte = gpsdataBuf[9];&lt;br /&gt;
	gpsdata.hdop = gpsdataBuf[10];&lt;br /&gt;
	gpsdata.hdopDec = gpsdataBuf[11];&lt;br /&gt;
	gpsdata.satCount = gpsdataBuf[12];&lt;br /&gt;
	if(length == DATA_BASIC) return;&lt;br /&gt;
	gpsdata.course = gpsdataBuf[13] + (gpsdataBuf[14] &amp;lt;&amp;lt; 8);&lt;br /&gt;
	gpsdata.courseDec = gpsdataBuf[15];&lt;br /&gt;
	gpsdata.speed = gpsdataBuf[16] + (gpsdataBuf[17] &amp;lt;&amp;lt; 8);&lt;br /&gt;
	gpsdata.speedDec = gpsdataBuf[18];&lt;br /&gt;
	gpsdata.altitude = gpsdataBuf[19] + (gpsdataBuf[20] &amp;lt;&amp;lt; 8);&lt;br /&gt;
	gpsdata.altDif = gpsdataBuf[21] + (gpsdataBuf[22] &amp;lt;&amp;lt; 8);&lt;br /&gt;
	gpsdata.utcHour = gpsdataBuf[23];&lt;br /&gt;
	gpsdata.utcMinute = gpsdataBuf[24];&lt;br /&gt;
	gpsdata.utcSec = gpsdataBuf[25];&lt;br /&gt;
	gpsdata.day = gpsdataBuf[26];&lt;br /&gt;
	gpsdata.year = gpsdataBuf[27] + (gpsdataBuf[28] * 100);&lt;br /&gt;
	gpsdata.month = gpsdataBuf[29];&lt;br /&gt;
	gpsdata.pdop = gpsdataBuf[30];&lt;br /&gt;
	gpsdata.pdopDec = gpsdataBuf[31];&lt;br /&gt;
	gpsdata.vdop = gpsdataBuf[32];&lt;br /&gt;
	gpsdata.vdopDec = gpsdataBuf[33];&lt;br /&gt;
	for(i = 34; i &amp;lt; 46; i++) {&lt;br /&gt;
		gpsdata.sat[i - 34] = gpsdataBuf[i];&lt;br /&gt;
	}&lt;br /&gt;
	gpsdata.swVersion = gpsdataBuf[46];&lt;br /&gt;
	gpsdata.heartbeat = gpsdataBuf[47];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * You MUST call this function at the beginning of a&lt;br /&gt;
 * main program, that uses the RP6 I2C GPS Receiver. &lt;br /&gt;
 * If SENSOR_BOARD is defined, the I2C-MODULE power&lt;br /&gt;
 * will be switched on with the function&lt;br /&gt;
 * setI2CModulePower() defined in the&lt;br /&gt;
 * RP6M256_Sensor_BoardLib, which will be included&lt;br /&gt;
 * then.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void I2C_GPS_init(void)&lt;br /&gt;
{&lt;br /&gt;
#ifdef SENSOR_BOARD&lt;br /&gt;
	// I2C-MODULE (plug M1) power on: &lt;br /&gt;
	setI2CModulePower(1);&lt;br /&gt;
#endif&lt;br /&gt;
	// Other init procedures here!&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Writes a new I2C address to the I2C GPS Receiver.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: addr -&amp;gt; New I2C address [0xc8..0xde]&lt;br /&gt;
 *&lt;br /&gt;
 * Hints: - Default I2C address is 0xc8.&lt;br /&gt;
 *        - You may choose a new I2C address in&lt;br /&gt;
 *          the range 0xc8..0xde.&lt;br /&gt;
 *        - After writing a new address you have&lt;br /&gt;
 *          to switch the I2C GPS Receiver off&lt;br /&gt;
 *          and on again.&lt;br /&gt;
 *        - Definition I2C_GPS_RECEIVER_ADR must&lt;br /&gt;
 *          be adapted to the new I2C address!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void I2C_GPS_new_addr(uint8_t addr)&lt;br /&gt;
{&lt;br /&gt;
	if((addr &amp;lt; 0xc8) || (addr &amp;gt; 0xde)) return;&lt;br /&gt;
	addr &amp;amp;= 0xfe;								// Clear R/W bit&lt;br /&gt;
	I2CTWI_transmit3Bytes(I2C_GPS_RECEIVER_ADR, 0, 0x04, addr);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&lt;br /&gt;
/******************************************************************************&lt;br /&gt;
 * Additional info&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Changelog:&lt;br /&gt;
 * - v. 1.0 (initial release) 21.04.2014 by Dirk&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Erklärung&lt;br /&gt;
&lt;br /&gt;
======Demo======&lt;br /&gt;
makefile:&lt;br /&gt;
&amp;lt;pre&amp;gt;...&lt;br /&gt;
TARGET = RP6M256_Sensor_Board_02&lt;br /&gt;
...&lt;br /&gt;
SRC += $(RP6_LIB_PATH)/RP6common/RP6I2CmasterTWI.c&lt;br /&gt;
&lt;br /&gt;
SRC += $(RP6_LIB_PATH)/RP6control_M256_WIFI/RP6M256_Sensor_BoardLib.c&lt;br /&gt;
SRC += $(RP6_LIB_PATH)/RP6control_M256_WIFI/RP6M256_I2C_GPSLib.c&lt;br /&gt;
...&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Datei: RP6M256_Sensor_Board_02.c&lt;br /&gt;
&amp;lt;pre&amp;gt;/* &lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * RP6 ROBOT SYSTEM - RP6 CONTROL M256 Examples&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Example: RP6M256 Sensor Board&lt;br /&gt;
 * Author(s): Dirk&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Description:&lt;br /&gt;
 * In this example we show a second test for the RP6 Sensor Board.&lt;br /&gt;
 * &lt;br /&gt;
 * ############################################################################&lt;br /&gt;
 * The Robot does NOT move in this example! You can simply put it on a table&lt;br /&gt;
 * next to your PC and you should connect it to the PC via the USB Interface!&lt;br /&gt;
 * You should also connect to it via WIFI.&lt;br /&gt;
 * ############################################################################&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Includes:&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6M256Lib.h&amp;quot; 				// The RP6 M256 Library. &lt;br /&gt;
										// Always needs to be included!&lt;br /&gt;
#include &amp;quot;RP6I2CmasterTWI.h&amp;quot;			// Include the I2C-Bus Master Library&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Include our new &amp;quot;RP6M256 I2C GPS Receiver library&amp;quot;:&lt;br /&gt;
// (This is the library for accessing the RP6 I2C GPS Receiver!)&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6M256_I2C_GPSLib.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Write a floating point number to the WIFI.&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *&lt;br /&gt;
 *			// Write a floating point number to the WIFI (no exponent):&lt;br /&gt;
 *			writeDouble_WIFI(1234567.890, 11, 3);&lt;br /&gt;
 *&lt;br /&gt;
 * The value of prec (precision) defines the number of decimal places.&lt;br /&gt;
 * For 32 bit floating point variables (float, double ...) 6 is&lt;br /&gt;
 * the max. value for prec (7 relevant digits).&lt;br /&gt;
 * The value of width defines the overall number of characters in the&lt;br /&gt;
 * floating point number including the decimal point. The number of&lt;br /&gt;
 * pre-decimal positions is: (width - prec - 1).&lt;br /&gt;
 */&lt;br /&gt;
void writeDouble_WIFI(double number, uint8_t width, uint8_t prec)&lt;br /&gt;
{char buffer[width + 1];&lt;br /&gt;
	dtostrf(number, width, prec, &amp;amp;buffer[0]);&lt;br /&gt;
	writeString_WIFI(&amp;amp;buffer[0]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Write a floating point number to the LCD.&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *&lt;br /&gt;
 *			// Write a floating point number to the LCD (no exponent):&lt;br /&gt;
 *			writeDoubleLCD(1234567.890, 11, 3);&lt;br /&gt;
 *&lt;br /&gt;
 * The value of prec (precision) defines the number of decimal places.&lt;br /&gt;
 * For 32 bit floating point variables (float, double ...) 6 is&lt;br /&gt;
 * the max. value for prec (7 relevant digits).&lt;br /&gt;
 * The value of width defines the overall number of characters in the&lt;br /&gt;
 * floating point number including the decimal point. The number of&lt;br /&gt;
 * pre-decimal positions is: (width - prec - 1).&lt;br /&gt;
 */&lt;br /&gt;
void writeDoubleLCD(double number, uint8_t width, uint8_t prec)&lt;br /&gt;
{char buffer[width + 1];&lt;br /&gt;
	dtostrf(number, width, prec, &amp;amp;buffer[0]);&lt;br /&gt;
	writeStringLCD(&amp;amp;buffer[0]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Error handler&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function gets called automatically if there was an I2C Error like&lt;br /&gt;
 * the slave sent a &amp;quot;not acknowledge&amp;quot; (NACK, error codes e.g. 0x20 or 0x30).&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void I2C_transmissionError(uint8_t errorState)&lt;br /&gt;
{&lt;br /&gt;
	writeString_P_WIFI(&amp;quot;\nI2C ERROR - TWI STATE: 0x&amp;quot;);&lt;br /&gt;
	writeInteger_WIFI(errorState, HEX);&lt;br /&gt;
	writeChar_WIFI('\n');&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Main function - The program starts here:&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
	initRP6M256();    // Always call this first! The Processor will not work&lt;br /&gt;
					  // correctly otherwise. &lt;br /&gt;
&lt;br /&gt;
	initLCD(); // Initialize the LC-Display (LCD)&lt;br /&gt;
			   // Always call this before using the LCD!&lt;br /&gt;
&lt;br /&gt;
	setLEDs(0b1111);&lt;br /&gt;
	mSleep(500);&lt;br /&gt;
	setLEDs(0b0000);&lt;br /&gt;
&lt;br /&gt;
	writeString_P_WIFI(&amp;quot;\n\nRP6 Sensor Board Selftest 2!\n&amp;quot;); &lt;br /&gt;
&lt;br /&gt;
	// IMPORTANT:&lt;br /&gt;
	I2CTWI_initMaster(100); // Initialize the TWI Module for Master operation&lt;br /&gt;
							// with 100kHz SCL Frequency&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	// Register the event handler:&lt;br /&gt;
	I2CTWI_setTransmissionErrorHandler(I2C_transmissionError);&lt;br /&gt;
&lt;br /&gt;
	setLEDs(0b1111);&lt;br /&gt;
&lt;br /&gt;
	// Write a text message to the LCD:&lt;br /&gt;
	showScreenLCD(&amp;quot;################&amp;quot;, &amp;quot;################&amp;quot;);&lt;br /&gt;
	mSleep(1500);&lt;br /&gt;
	showScreenLCD(&amp;quot;RP6v2-M256-WIFI &amp;quot;, &amp;quot;Example Program&amp;quot;);&lt;br /&gt;
	mSleep(2500); &lt;br /&gt;
	showScreenLCD(&amp;quot;RP6 Sensor Board&amp;quot;, &amp;quot;   Selftest 2&amp;quot;);&lt;br /&gt;
	mSleep(2500);&lt;br /&gt;
	clearLCD();&lt;br /&gt;
&lt;br /&gt;
	setLEDs(0b0000);&lt;br /&gt;
&lt;br /&gt;
	// ---------------------------------------&lt;br /&gt;
&lt;br /&gt;
	uint8_t onoff = 0;&lt;br /&gt;
	uint8_t i;&lt;br /&gt;
&lt;br /&gt;
	startStopwatch1();&lt;br /&gt;
	startStopwatch2();&lt;br /&gt;
&lt;br /&gt;
	// IMPORTANT:&lt;br /&gt;
	sensor_board_init();						// RP6 Sensor Board init!!!&lt;br /&gt;
	I2C_GPS_init();								// RP6 I2C GPS Receiver init&lt;br /&gt;
&lt;br /&gt;
	while(true) &lt;br /&gt;
	{&lt;br /&gt;
		if(getStopwatch1() &amp;gt; 1000) // 1s&lt;br /&gt;
		{&lt;br /&gt;
			if (onoff) onoff = 0;&lt;br /&gt;
			else onoff = 1;&lt;br /&gt;
&lt;br /&gt;
			// Show GPS data:&lt;br /&gt;
			I2C_GPS_read(DATA_LENGTH);			// Read data&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nLAT_DEG:     &amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.latDeg, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;° &amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.latMin, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;.&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.latMinDec, DEC, 4);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;' &amp;quot;);&lt;br /&gt;
			if(gpsdata.status.ns)&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;N&amp;quot;);&lt;br /&gt;
			else&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;S&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nLON_DEG:    &amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.lonDeg, DEC, 3);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;° &amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.lonMin, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;.&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.lonMinDec, DEC, 4);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;' &amp;quot;);&lt;br /&gt;
			if(gpsdata.status.ew)&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;E&amp;quot;);&lt;br /&gt;
			else&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;W&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nSTATUS:     &amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.status.byte, BIN, 8);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nFIX_IND:    &amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.fixInd.byte, BIN, 8);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nHDOP:       &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(gpsdata.hdop, DEC);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;.&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.hdopDec, DEC, 2);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nSAT_N:      &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(gpsdata.satCount, DEC);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nCOURSE_T:   &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(gpsdata.course, DEC);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;.&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.courseDec, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;°&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nSPEED:      &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(gpsdata.speed, DEC);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;.&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.speedDec, DEC, 2);&lt;br /&gt;
			if(gpsdata.status.spu)&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;km/h&amp;quot;);&lt;br /&gt;
			else&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;kn&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nALT:        &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(gpsdata.altitude, DEC);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;m\nALT_DIF:    &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(gpsdata.altDif, DEC);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;m\nUTC:        &amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.utcHour, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;:&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.utcMinute, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;:&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.utcSec, DEC, 2);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nDATE:       &amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.day, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;.&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.month, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;.&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.year, DEC, 4);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nPDOP:       &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(gpsdata.pdop, DEC);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;.&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.pdopDec, DEC, 2);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nVDOP:       &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(gpsdata.vdop, DEC);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;.&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.vdopDec, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			for(i = 0; i &amp;lt; gpsdata.satCount; i++) {&lt;br /&gt;
				if(i == 8) writeString_P_WIFI(&amp;quot;\n&amp;quot;);&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;  SAT_&amp;quot;);&lt;br /&gt;
				writeIntegerLength_WIFI(i + 1, HEX, 1);&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;: &amp;quot;);&lt;br /&gt;
				writeInteger_WIFI(gpsdata.sat[i], DEC);&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nSW_VERSION: &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(gpsdata.swVersion, DEC);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nHEARTBEAT:  &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(gpsdata.heartbeat, DEC);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			// RP6 Sensor Board shutdown (button &amp;amp; status LED test):&lt;br /&gt;
			if (pressedButton) {&lt;br /&gt;
				setStatusLED(1);&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;\nPress button again for RP6 Sensor Board SHUTDOWN!\n&amp;quot;);&lt;br /&gt;
				mSleep(2000);&lt;br /&gt;
				do {&lt;br /&gt;
					if(getStopwatch2() &amp;gt; 200) { // 0.2s&lt;br /&gt;
						if (onoff) onoff = 0;&lt;br /&gt;
						else onoff = 1;&lt;br /&gt;
						if (onoff) setStatusLED(1);&lt;br /&gt;
						else setStatusLED(0);&lt;br /&gt;
						setStopwatch2(0);&lt;br /&gt;
					}&lt;br /&gt;
					mSleep(1);&lt;br /&gt;
					task_I2CTWI();&lt;br /&gt;
				} while (!readButton());&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;\n\n\n\n\nPlease wait for RP6 Sensor Board SHUTDOWN...\n&amp;quot;);&lt;br /&gt;
				sensor_board_shutdown();&lt;br /&gt;
				mSleep(3000);&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;\n\n\nThe RP6 Sensor Board now is in SHUTDOWN MODE!!!\n&amp;quot;);&lt;br /&gt;
				mSleep(1000);&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;\nRESET the M256 microcontroller now...\n\n&amp;quot;);&lt;br /&gt;
				while(true) {};&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			setStopwatch1(0);&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		task_RP6SensorBoard();					// RP6 Sensor Board task&lt;br /&gt;
&lt;br /&gt;
		task_I2CTWI();&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Erklärung&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Gyro Modul JM3-GYRO====&lt;br /&gt;
=====Dokumentation=====&lt;br /&gt;
Die Dokumentation zum Gyro Modul befindet sich auf der mitgelieferten ''&amp;quot;RP6 Robot System Xtra Modules CD-ROM&amp;quot;''.&lt;br /&gt;
&lt;br /&gt;
======Manuals======&lt;br /&gt;
Das Handbuch in der aktuellen Version kann [http://www.jm3-engineering.com/download/doc/ManualGyroModule_de.pdf hier] eingesehen werden.&lt;br /&gt;
&lt;br /&gt;
=====Demo-Programme=====&lt;br /&gt;
Ein Demo-Programm zum Gyro Modul befindet sich integriert in die RP6 Sensor Board Demo auf der mitgelieferten ''&amp;quot;RP6 Robot System Xtra Modules CD-ROM&amp;quot;''. Diese Demo kann auch in der aktuellen Version im Download Bereich von [http://www.jm3-engineering.com/downloads.htm JM3 Engineering] herunter geladen werden.&lt;br /&gt;
&lt;br /&gt;
=====Analoge Auswertung=====&lt;br /&gt;
Am Pin ''OUT'' des Gyro Moduls (siehe [http://www.rn-wissen.de/index.php/RP6_Sensor_Board_und_Xtra_Module#Anschluss-Schema_2 Anschluss-Schema]!) liegt die Ausgangsspannung des Sensors (0..5V) an. Sie kann mit einem ADC-Eingang eines Microcontrollers gemessen werden.&lt;br /&gt;
Syntax mit den Libraries der RP6Base, M32 oder M256 WiFi (ADC Kanal 0):&lt;br /&gt;
 uint16_t result = readADC(0);&lt;br /&gt;
In der C-Control-Pro Umgebung der M128 sieht das z.B. in CompactC so aus (ADC Kanal 0):&lt;br /&gt;
 word result;&lt;br /&gt;
 ADC_Set(ADC_VREF_VCC, 0);&lt;br /&gt;
 ...&lt;br /&gt;
 result = ADC_Read();&lt;br /&gt;
Das Ergebnis ''result'' kann noch zur Weiterverarbeitung angepasst werden:&lt;br /&gt;
 #define ADCVAL_ZERORATE_LEVEL			511		// Zero rate Level&lt;br /&gt;
 ...&lt;br /&gt;
 int16_t z_axisg = result - ADCVAL_ZERORATE_LEVEL;&lt;br /&gt;
Dadurch zeigt ''z_axisg'' Null an, wenn keine Rotation anliegt und wird positiv, wenn nach LINKS gedreht wird und negativ bei RECHTS-Drehung. Die Definition ADCVAL_ZERORATE_LEVEL muss natürlich an den eigenen Sensor-Nullwert angepasst werden.&lt;br /&gt;
&lt;br /&gt;
Aus dem Absolutwert von ''z_axisg'' kann man die Drehrate (Drehgeschwindigkeit) auch bestimmen:&lt;br /&gt;
&lt;br /&gt;
In den [[RP6_Sensor_Board_und_Xtra_Module#Technische_Daten_3|Technischen Daten]] ist die Empfindlichkeit des Sensors mit '''10mV/dps''' (0,01V pro Grad und Sekunde) angegeben. Damit errechnet sich die Drehrate als:&lt;br /&gt;
 Drehrate [dps] = abs(z_axisg) * (5 / 1024 / 0.01) = abs(z_axisg) * 0.48828125&lt;br /&gt;
&lt;br /&gt;
=====Optionale Ansteuerung=====&lt;br /&gt;
Im [[RP6_Sensor_Board_und_Xtra_Module#Anschluss-Schema_2|Anschluss-Schema]] ist erkennbar, dass es noch 2 Steuerleitungen ''SLEEP/PD'' und ''ST'' gibt. Mit diesen Anschlüssen kann die Betriebsart des Gyro Moduls festgelegt werden, siehe nachfolgende Tabelle:&lt;br /&gt;
{|  {{Blauetabelle}} &lt;br /&gt;
|Betriebsart&lt;br /&gt;
|ST&lt;br /&gt;
|SLEEP/PD&lt;br /&gt;
|Stromverbrauch&lt;br /&gt;
|-&lt;br /&gt;
|Normal&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|4,2mA&lt;br /&gt;
|-&lt;br /&gt;
|Sleep&lt;br /&gt;
|0&lt;br /&gt;
|1&lt;br /&gt;
|2,2mA&lt;br /&gt;
|-&lt;br /&gt;
|Self-test&lt;br /&gt;
|1&lt;br /&gt;
|0&lt;br /&gt;
|4,2mA&lt;br /&gt;
|-&lt;br /&gt;
|Power-down&lt;br /&gt;
|1&lt;br /&gt;
|1&lt;br /&gt;
|'''5µA'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
Will man zwischen den Betriebsarten per Software umschalten, muss man die beiden Steuerleitungen mit I/O Portpins des Microcontrollers verbinden, die als Ausgänge konfiguriert sind. Braucht man diese Funktion nicht, reicht es, ''ST'' und ''SLEEP/PD'' mit GND zu verbinden (Betriebsart &amp;quot;Normal&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====3D Accelerometer Modul JM3-3DA====&lt;br /&gt;
Das 3D Accelerometer Modul kann über den I2C- oder den SPI-Bus angesteuert werden. Wird das Modul auf der RP6 CONTROL M32 Platine betrieben (es sitzt also auf dem Sockel IC5 für das 2. SPI-EEPROM), dann erfolgt die Ansteuerung über den SPI-Bus. Die SPI-Grundfunktionen befinden sich in der RP6ControlLib, die daher eingebunden werden muss.&lt;br /&gt;
&lt;br /&gt;
=====Dokumentation=====&lt;br /&gt;
Die Dokumentation zum 3D Accelerometer Modul befindet sich auf der mitgelieferten ''&amp;quot;RP6 Robot System Xtra Modules CD-ROM&amp;quot;''.&lt;br /&gt;
&lt;br /&gt;
======Manuals======&lt;br /&gt;
Das Handbuch in der aktuellen Version kann [http://www.jm3-engineering.com/download/doc/Manual3DAccelerometer_de.pdf hier] eingesehen werden.&lt;br /&gt;
&lt;br /&gt;
=====Demo-Programme=====&lt;br /&gt;
Ein Demo-Programm zum 3D Accelerometer Modul befindet sich integriert in die RP6 Sensor Board Demo auf der mitgelieferten ''&amp;quot;RP6 Robot System Xtra Modules CD-ROM&amp;quot;''. Diese Demo kann auch in der aktuellen Version im Download Bereich von [http://www.jm3-engineering.com/downloads.htm JM3 Engineering] herunter geladen werden.&lt;br /&gt;
&lt;br /&gt;
=====RP6 CONTROL M32: ACCSENS Library=====&lt;br /&gt;
Die nachfolgende RP6ControlACCSENSLib (Eigenentwicklung in GCC) dient zur Ansteuerung des 3D Accelerometer Moduls durch die RP6 CONTROL M32.&lt;br /&gt;
&lt;br /&gt;
======Configuration Header======&lt;br /&gt;
Vor dem Kompilieren der Library muss eine Anpassung des Configuration Headers an die eigenen Hardware-Voraussetzungen erfolgen.&lt;br /&gt;
Dazu gibt es im Configuration Header eine Definition:&lt;br /&gt;
* EXP_STACK_1 -&amp;gt; Die RP6 CONTROL M32 sitzt auf dem vorderen Platinenstapel 1 des RP6&lt;br /&gt;
Im nachfolgenden Listing ist die Definition EXP_STACK_1 NICHT aktiv (d.h. die M32 sitzt auf dem hinteren Platinenstapel 2!). Dies muss an die eigene Hardware angepaßt werden. Wenn die RP6 CONTROL M32 auf dem vorderen Platinenstapel 1 des RP6 sitzt, muss die Zeile mit &amp;quot;EXP_STACK_1&amp;quot; &amp;quot;aktiviert&amp;quot; werden. Dazu entfernt man &amp;quot;//&amp;quot; am Zeilenanfang:&lt;br /&gt;
 #define EXP_STACK_1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Bevor man den Beschleunigungssensor nutzen kann, muss man ihn kalibrieren:&lt;br /&gt;
&lt;br /&gt;
'''Accelerometer:'''&lt;br /&gt;
* Die X-Achse wird kalibriert, indem man den RP6 mit der rechten Seite nach unten hält und den Maximalwert in MAX_X_A einträgt. Dann neigt man ihn auf seine linke Seite und trägt den negativen Maximalwert in MIN_X_A ein.&lt;br /&gt;
* Die Y-Achse wird kalibriert, indem man den RP6 mit der Vorderseite nach oben hält und den Maximalwert in MAX_Y_A einträgt. Dann kippt man die Vorderseite nach unten und trägt den negativen Maximalwert in MIN_Y_A ein.&lt;br /&gt;
* Die Z-Achse wird kalibriert, indem man den RP6 normal waagerecht hält und den Maximalwert in MAX_Z_A einträgt. Dann dreht man den RP6 &amp;quot;auf den Kopf&amp;quot; und trägt den negativen Maximalwert in MIN_Z_A ein.&lt;br /&gt;
* Sollten die angezeigten Pitch- und Roll-Werte nach der Kalibrierung der Achsen und genau waagerecht stehendem Sensor bzw. RP6 vom Nullwert deutlich abweichen, kann man sie mithilfe der Definitionen OFFSET_PITCH_A und OFFSET_ROLL_A &amp;quot;nullen&amp;quot;. Die Einheit dieser Definitionen ist °.&lt;br /&gt;
Nach dem Eintragen der Kalibrierungswerte muss das Programm neu kompiliert werden!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Datei: RP6ControlACCSENS.h&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;/* ****************************************************************************&lt;br /&gt;
 *                           _______________________&lt;br /&gt;
 *                           \| RP6  ROBOT SYSTEM |/&lt;br /&gt;
 *                            \_-_-_-_-_-_-_-_-_-_/             &amp;gt;&amp;gt;&amp;gt; RP6 CONTROL&lt;br /&gt;
 * ----------------------------------------------------------------------------&lt;br /&gt;
 * ----------------------------- [c]2014 - Dirk -------------------------------&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * File: RP6ControlACCSENS.h&lt;br /&gt;
 * Version: 1.0&lt;br /&gt;
 * Target: RP6 CONTROL - ATMEGA32 @16.00MHz&lt;br /&gt;
 * Author(s): Dirk&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Description:&lt;br /&gt;
 * Configuration header file for new ACCSENS library.&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * THE CHANGELOG CAN BE FOUND AT THE END OF THIS FILE!&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
#ifndef RP6CONTROLACCSENS_H&lt;br /&gt;
#define RP6CONTROLACCSENS_H&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Sensor position on the RP6 robot:&lt;br /&gt;
// (If EXP_STACK_1 is defined, the RP6 CONTROL M32 is located on the front&lt;br /&gt;
//  stack for addon boards on the RP6 robot. If EXP_STACK_1 is NOT defined&lt;br /&gt;
//  (default), the RP6 CONTROL M32 is mounted on the rear stack.)&lt;br /&gt;
// -------------------&lt;br /&gt;
//#define EXP_STACK_1&lt;br /&gt;
// -------------------&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// The following sensor is used:&lt;br /&gt;
// - 3D Accelerometer Modul (CONRAD 1082387-62) with LIS302DLH 3-axis&lt;br /&gt;
//   accelerometer&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// LIS302DLH accelerometer calibration data:&lt;br /&gt;
#define MAX_X_A						32767		// Max. X-axis value&lt;br /&gt;
#define MIN_X_A						-32768		// Min. X-axis value&lt;br /&gt;
#define MAX_Y_A						32767		// Max. Y-axis value&lt;br /&gt;
#define MIN_Y_A						-32768		// Min. Y-axis value&lt;br /&gt;
#define MAX_Z_A						32767		// Max. Z-axis value&lt;br /&gt;
#define MIN_Z_A						-32768		// Min. Z-axis value&lt;br /&gt;
#define OFFSET_PITCH_A				0.0			// Offset Pitch [°]&lt;br /&gt;
#define OFFSET_ROLL_A				0.0			// Offset Roll [°]&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
/******************************************************************************&lt;br /&gt;
 * Additional info&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Changelog:&lt;br /&gt;
 * &lt;br /&gt;
 *  ---&amp;gt; changes are documented in the file &amp;quot;RP6ControlACCSENSLib.c&amp;quot;&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
======Library Header======&lt;br /&gt;
Datei: RP6ControlACCSENSLib.h&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;/* ****************************************************************************&lt;br /&gt;
 *                           _______________________&lt;br /&gt;
 *                           \| RP6  ROBOT SYSTEM |/&lt;br /&gt;
 *                            \_-_-_-_-_-_-_-_-_-_/             &amp;gt;&amp;gt;&amp;gt; RP6 CONTROL&lt;br /&gt;
 * ----------------------------------------------------------------------------&lt;br /&gt;
 * ----------------------------- [c]2014 - Dirk -------------------------------&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * File: RP6ControlACCSENSLib.h&lt;br /&gt;
 * Version: 1.0&lt;br /&gt;
 * Target: RP6 CONTROL - ATMEGA32 @16.00MHz&lt;br /&gt;
 * Author(s): Dirk&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Description:&lt;br /&gt;
 * This is the RP6ControlACCSENSLib header file.&lt;br /&gt;
 * You have to include this file, if you want to use the library&lt;br /&gt;
 * RP6ControlACCSENSLib.c in your own projects.&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * THE CHANGELOG CAN BE FOUND AT THE END OF THIS FILE!&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
#ifndef RP6CONTROLACCSENSLIB_H&lt;br /&gt;
#define RP6CONTROLACCSENSLIB_H&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Includes:&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6ControlLib.h&amp;quot; 		// The RP6 Control Library (v. 1.1 or higher). &lt;br /&gt;
#include &amp;quot;RP6ControlACCSENS.h&amp;quot;&lt;br /&gt;
#include &amp;lt;math.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&lt;br /&gt;
#define ACC_CS							MEM_CS2&lt;br /&gt;
#define DEVICE_IDENTIFIER				0x32&lt;br /&gt;
&lt;br /&gt;
// Registers:&lt;br /&gt;
#define WHO_AM_I						0x0f&lt;br /&gt;
#define CTRL_REG1						0x20&lt;br /&gt;
#define CTRL_REG2						0x21&lt;br /&gt;
#define CTRL_REG3						0x22&lt;br /&gt;
#define CTRL_REG4						0x23&lt;br /&gt;
#define CTRL_REG5						0x24&lt;br /&gt;
#define HP_FILTER_RESET					0x25&lt;br /&gt;
#define REFERENCE						0x26&lt;br /&gt;
#define STATUS_REG						0x27&lt;br /&gt;
#define OUT_X_L							0x28&lt;br /&gt;
#define OUT_X_H							0x29&lt;br /&gt;
#define OUT_Y_L							0x2a&lt;br /&gt;
#define OUT_Y_H							0x2b&lt;br /&gt;
#define OUT_Z_L							0x2c&lt;br /&gt;
#define OUT_Z_H							0x2d&lt;br /&gt;
#define INT1_CFG						0x30&lt;br /&gt;
#define INT1_SOURCE						0x31&lt;br /&gt;
#define INT1_THS						0x32&lt;br /&gt;
#define INT1_DURATION					0x33&lt;br /&gt;
#define INT2_CFG						0x34&lt;br /&gt;
#define INT2_SOURCE						0x35&lt;br /&gt;
#define INT2_THS						0x36&lt;br /&gt;
#define INT2_DURATION					0x37&lt;br /&gt;
&lt;br /&gt;
// Control Register bitmasks:&lt;br /&gt;
#define CTRL_REG1_POWERDOWN				0b00000000&lt;br /&gt;
#define CTRL_REG1_3D_DEFAULT			0b00000111&lt;br /&gt;
#define CTRL_REG1_3D_LOPWR_10HZ			0b11000111&lt;br /&gt;
#define CTRL_REG2_DEFAULT				0b00000000&lt;br /&gt;
#define CTRL_REG3_DEFAULT				0b00000000&lt;br /&gt;
#define CTRL_REG4_DEFAULT				0b00000000&lt;br /&gt;
#define CTRL_REG4_BDU_2G				0b10000000&lt;br /&gt;
#define CTRL_REG4_BDU_2G_STSIGN			0b10001000&lt;br /&gt;
#define CTRL_REG4_BDU_BLE_2G			0b11000000&lt;br /&gt;
#define CTRL_REG4_BDU_BLE_2G_STSIGN		0b11001000&lt;br /&gt;
#define CTRL_REG5_DEFAULT				0b00000000&lt;br /&gt;
&lt;br /&gt;
// Read/write address bitmasks:&lt;br /&gt;
#define READ_MASK						0b10000000&lt;br /&gt;
#define READ_AUTOINC_MASK				0b11000000&lt;br /&gt;
#define WRITE_MASK						0b01111111&lt;br /&gt;
&lt;br /&gt;
extern int16_t x_axisa, y_axisa, z_axisa;&lt;br /&gt;
extern double pitch, roll;&lt;br /&gt;
extern double xa, ya, za;&lt;br /&gt;
extern double the, phi;&lt;br /&gt;
&lt;br /&gt;
uint8_t SPI_ACCSENS_readByte(uint8_t regAddr);&lt;br /&gt;
void SPI_ACCSENS_readBytes(uint8_t startAddr, uint8_t *buffer, uint8_t length);&lt;br /&gt;
void SPI_ACCSENS_writeByte(uint8_t regAddr, uint8_t data);&lt;br /&gt;
uint8_t SPI_ACCSENS_getStatus(void);&lt;br /&gt;
&lt;br /&gt;
void SPI_ACCSENS_init(void);&lt;br /&gt;
void SPI_ACCSENS_shutdown(void);&lt;br /&gt;
void SPI_ACCSENS_read(void);&lt;br /&gt;
void SPI_ACCSENS_normalize(void);&lt;br /&gt;
void SPI_ACCSENS_position(void);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
/******************************************************************************&lt;br /&gt;
 * Additional info&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Changelog:&lt;br /&gt;
 * &lt;br /&gt;
 *  ---&amp;gt; changes are documented in the file &amp;quot;RP6ControlACCSENSLib.c&amp;quot;&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
======Library Source======&lt;br /&gt;
Datei: RP6ControlACCSENSLib.c&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;/* ****************************************************************************&lt;br /&gt;
 *                           _______________________&lt;br /&gt;
 *                           \| RP6  ROBOT SYSTEM |/&lt;br /&gt;
 *                            \_-_-_-_-_-_-_-_-_-_/             &amp;gt;&amp;gt;&amp;gt; RP6 CONTROL&lt;br /&gt;
 * ----------------------------------------------------------------------------&lt;br /&gt;
 * ----------------------------- [c]2014 - Dirk -------------------------------&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * File: RP6ControlACCSENSLib.c&lt;br /&gt;
 * Version: 1.0&lt;br /&gt;
 * Target: RP6 CONTROL - ATMEGA32 @16.00MHz&lt;br /&gt;
 *         with optional LC-Display 16x2 chars (CONRAD 190911-62)&lt;br /&gt;
 *         and a 3D Accelerometer Modul (CONRAD 1082387-62) (IC5)&lt;br /&gt;
 * Author(s): Dirk&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Description:&lt;br /&gt;
 * This is my RP6 Control ACCSENS Library. This library may be used to access&lt;br /&gt;
 * the basic functions of the 3D Accelerometer Modul. This RP6 Xtra module may&lt;br /&gt;
 * be placed on the IC5 socket on the RP6 CONTROL M32 instead of a second&lt;br /&gt;
 * EEPROM.&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * THE CHANGELOG CAN BE FOUND AT THE END OF THIS FILE!&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
 &lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Includes:&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6ControlACCSENSLib.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// SPI functions:&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Reads a single register from the 3D Accelerometer&lt;br /&gt;
 * Modul (ACCSENS).&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
uint8_t SPI_ACCSENS_readByte(uint8_t regAddr)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t data;&lt;br /&gt;
	regAddr |= READ_MASK;						// Read byte&lt;br /&gt;
	PORTB &amp;amp;= ~ACC_CS;&lt;br /&gt;
	writeSPI(regAddr);&lt;br /&gt;
	data = readSPI();&lt;br /&gt;
	PORTB |= ACC_CS;&lt;br /&gt;
	return data;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Reads &amp;quot;length&amp;quot; bytes into the buffer &amp;quot;buffer&amp;quot;&lt;br /&gt;
 * from startAddr on. &lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void SPI_ACCSENS_readBytes(uint8_t startAddr, uint8_t *buffer, uint8_t length)&lt;br /&gt;
{&lt;br /&gt;
	startAddr |= READ_AUTOINC_MASK;				// Read byte, auto increment&lt;br /&gt;
	PORTB &amp;amp;= ~ACC_CS;&lt;br /&gt;
	writeSPI(startAddr);&lt;br /&gt;
	readBufferSPI(&amp;amp;buffer[0], length);&lt;br /&gt;
	PORTB |= ACC_CS;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Write a single data byte to the specified sensor&lt;br /&gt;
 * address.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void SPI_ACCSENS_writeByte(uint8_t regAddr, uint8_t data)&lt;br /&gt;
{&lt;br /&gt;
	PORTB &amp;amp;= ~ACC_CS;&lt;br /&gt;
	writeSPI(regAddr);&lt;br /&gt;
	writeSPI(data);&lt;br /&gt;
	PORTB |= ACC_CS;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Returns sensor status register - for checking if&lt;br /&gt;
 * sensor is busy. &lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
uint8_t SPI_ACCSENS_getStatus(void)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t status;&lt;br /&gt;
	PORTB &amp;amp;= ~ACC_CS;&lt;br /&gt;
	writeSPI(STATUS_REG);&lt;br /&gt;
	status = readSPI();&lt;br /&gt;
	PORTB |= ACC_CS;&lt;br /&gt;
	return status;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// 3D accelerometer functions:&lt;br /&gt;
&lt;br /&gt;
int16_t x_axisa, y_axisa, z_axisa;&lt;br /&gt;
double pitch, roll;&lt;br /&gt;
double xa, ya, za;&lt;br /&gt;
double the, phi;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Initializes the sensor. You must call this&lt;br /&gt;
 * function at the beginning of a program, that&lt;br /&gt;
 * uses the 3D Accelerometer Modul.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void SPI_ACCSENS_init(void)&lt;br /&gt;
{&lt;br /&gt;
	// All axes enable, low power, 10Hz output data rate:&lt;br /&gt;
	SPI_ACCSENS_writeByte(CTRL_REG1, CTRL_REG1_3D_LOPWR_10HZ);&lt;br /&gt;
	// No update while reading, +- 2g, self-test minus:&lt;br /&gt;
	SPI_ACCSENS_writeByte(CTRL_REG4, CTRL_REG4_BDU_2G_STSIGN);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Sets the LIS302DLH power-down mode. If you&lt;br /&gt;
 * do not need the sensor, you can save energy&lt;br /&gt;
 * by using the sensor power-down mode.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void SPI_ACCSENS_shutdown(void)&lt;br /&gt;
{&lt;br /&gt;
	// LIS302DLH in power-down mode:&lt;br /&gt;
	SPI_ACCSENS_writeByte(CTRL_REG1, CTRL_REG1_POWERDOWN);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function reads the X-axis, Y-axis and Z-axis&lt;br /&gt;
 * values from the LIS302DLH accelerometer and stores&lt;br /&gt;
 * them in the global variables x_axisa, y_axisa and&lt;br /&gt;
 * z_axisa.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void SPI_ACCSENS_read(void)&lt;br /&gt;
{&lt;br /&gt;
#ifndef EXP_STACK_1&lt;br /&gt;
	// Default sensor position (M32 located on the RP6 rear stack):&lt;br /&gt;
	// xb = -y:&lt;br /&gt;
	x_axisa = SPI_ACCSENS_readByte(OUT_Y_L) | (SPI_ACCSENS_readByte(OUT_Y_H) &amp;lt;&amp;lt; 8);&lt;br /&gt;
	x_axisa *= -1;&lt;br /&gt;
	// yb = -x:&lt;br /&gt;
	y_axisa = SPI_ACCSENS_readByte(OUT_X_L) | (SPI_ACCSENS_readByte(OUT_X_H) &amp;lt;&amp;lt; 8);&lt;br /&gt;
	y_axisa *= -1;&lt;br /&gt;
	// zb = z:&lt;br /&gt;
	z_axisa = SPI_ACCSENS_readByte(OUT_Z_L) | (SPI_ACCSENS_readByte(OUT_Z_H) &amp;lt;&amp;lt; 8);&lt;br /&gt;
#else&lt;br /&gt;
	// Other sensor position (M32 located on the RP6 front stack):&lt;br /&gt;
	// xb = y:&lt;br /&gt;
	x_axisa = SPI_ACCSENS_readByte(OUT_Y_L) | (SPI_ACCSENS_readByte(OUT_Y_H) &amp;lt;&amp;lt; 8);&lt;br /&gt;
	// yb = x:&lt;br /&gt;
	y_axisa = SPI_ACCSENS_readByte(OUT_X_L) | (SPI_ACCSENS_readByte(OUT_X_H) &amp;lt;&amp;lt; 8);&lt;br /&gt;
	// zb = z:&lt;br /&gt;
	z_axisa = SPI_ACCSENS_readByte(OUT_Z_L) | (SPI_ACCSENS_readByte(OUT_Z_H) &amp;lt;&amp;lt; 8);&lt;br /&gt;
#endif&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function limits and normalizes the x-axisa,&lt;br /&gt;
 * y-axisa and z-axisa values read from the LIS302DLH&lt;br /&gt;
 * accelerometer with the function SPI_ACCSENS_read() and&lt;br /&gt;
 * stores them in the global double variables xa, ya and&lt;br /&gt;
 * za.&lt;br /&gt;
 * It also calculates the position in space in form of the&lt;br /&gt;
 * tilt angles (the = pitch, phi = roll) and stores them&lt;br /&gt;
 * in the global double variables the and phi.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void SPI_ACCSENS_normalize(void)&lt;br /&gt;
{&lt;br /&gt;
	// Limit raw values:&lt;br /&gt;
	if (x_axisa &amp;lt; MIN_X_A) x_axisa = MIN_X_A;&lt;br /&gt;
	if (x_axisa &amp;gt; MAX_X_A) x_axisa = MAX_X_A;&lt;br /&gt;
	if (y_axisa &amp;lt; MIN_Y_A) y_axisa = MIN_Y_A;&lt;br /&gt;
	if (y_axisa &amp;gt; MAX_Y_A) y_axisa = MAX_Y_A;&lt;br /&gt;
	if (z_axisa &amp;lt; MIN_Z_A) z_axisa = MIN_Z_A;&lt;br /&gt;
	if (z_axisa &amp;gt; MAX_Z_A) z_axisa = MAX_Z_A;&lt;br /&gt;
	xa = (double) x_axisa / 10000.0;&lt;br /&gt;
	ya = (double) y_axisa / 10000.0;&lt;br /&gt;
	za = (double) z_axisa / 10000.0;&lt;br /&gt;
	// Calculate Pitch and Roll:&lt;br /&gt;
	phi = asin(xa);								// Calculate the and phi&lt;br /&gt;
	the = asin(ya / cos(the));					//  from the raw values&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function calculates the position in space by&lt;br /&gt;
 * using the the and phi values (see function&lt;br /&gt;
 * SPI_ACCSENS_normalize()!). It stores the position&lt;br /&gt;
 * in the global double variables pitch and roll. &lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void SPI_ACCSENS_position(void)&lt;br /&gt;
{&lt;br /&gt;
	pitch = the * 180 / M_PI + OFFSET_PITCH_A;&lt;br /&gt;
	roll = phi * 180 / M_PI + OFFSET_ROLL_A;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/******************************************************************************&lt;br /&gt;
 * Additional info&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Changelog:&lt;br /&gt;
 * - v. 1.0 (initial release) 04.04.2014 by Dirk&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Erklärung&lt;br /&gt;
&lt;br /&gt;
======Demo======&lt;br /&gt;
makefile:&lt;br /&gt;
&amp;lt;pre&amp;gt;...&lt;br /&gt;
TARGET = RP6Control_01_ACCSENS&lt;br /&gt;
...&lt;br /&gt;
SRC += $(RP6_LIB_PATH)/RP6control/RP6ControlLib.c&lt;br /&gt;
SRC += $(RP6_LIB_PATH)/RP6common/RP6uart.c&lt;br /&gt;
SRC += $(RP6_LIB_PATH)/RP6control/RP6ControlACCSENSLib.c&lt;br /&gt;
...&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Datei: RP6Control_01_ACCSENS.c&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;// Uncommented Version of RP6Control_01_ACCSENS.c&lt;br /&gt;
// written by Dirk&lt;br /&gt;
// ------------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6ControlACCSENSLib.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void writeDouble(double number, uint8_t width, uint8_t prec)&lt;br /&gt;
{char buffer[width + 1];&lt;br /&gt;
	dtostrf(number, width, prec, &amp;amp;buffer[0]);&lt;br /&gt;
	writeString(&amp;amp;buffer[0]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void writeDoubleLCD(double number, uint8_t width, uint8_t prec)&lt;br /&gt;
{char buffer[width + 1];&lt;br /&gt;
	dtostrf(number, width, prec, &amp;amp;buffer[0]);&lt;br /&gt;
	writeStringLCD(&amp;amp;buffer[0]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
	initRP6Control();&lt;br /&gt;
&lt;br /&gt;
	writeString_P(&amp;quot;\n\nRP6Control SPI ACCSENS Test Program!\n&amp;quot;); &lt;br /&gt;
	setLEDs(0b1111);&lt;br /&gt;
	mSleep(50);&lt;br /&gt;
	initLCD(); &lt;br /&gt;
	showScreenLCD(&amp;quot;################&amp;quot;, &amp;quot;################&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
	showScreenLCD(&amp;quot;  SPI ACCSENS&amp;quot;, &amp;quot;  Test Program&amp;quot;);&lt;br /&gt;
	mSleep(1000);&lt;br /&gt;
	setLEDs(0b0000);&lt;br /&gt;
&lt;br /&gt;
	SPI_ACCSENS_init();&lt;br /&gt;
&lt;br /&gt;
	uint8_t whoami = SPI_ACCSENS_readByte(WHO_AM_I);&lt;br /&gt;
	writeString_P(&amp;quot;\nWHO AM I: &amp;quot;);&lt;br /&gt;
	writeInteger(whoami, HEX);&lt;br /&gt;
	writeChar('\n');&lt;br /&gt;
	mSleep(2000);&lt;br /&gt;
	&lt;br /&gt;
	startStopwatch1();&lt;br /&gt;
&lt;br /&gt;
	while(true) &lt;br /&gt;
	{&lt;br /&gt;
		if(getStopwatch1() &amp;gt; 1000)&lt;br /&gt;
		{&lt;br /&gt;
			SPI_ACCSENS_read();&lt;br /&gt;
			writeString_P(&amp;quot;\n3D Accelerometer SENSOR -&amp;gt;\n&amp;quot;);&lt;br /&gt;
			writeString_P(&amp;quot;X-axis: &amp;quot;);&lt;br /&gt;
			writeInteger(x_axisa, DEC);&lt;br /&gt;
			writeChar('\n');&lt;br /&gt;
			writeString_P(&amp;quot;Y-axis: &amp;quot;);&lt;br /&gt;
			writeInteger(y_axisa, DEC);&lt;br /&gt;
			writeChar('\n');&lt;br /&gt;
			writeString_P(&amp;quot;Z-axis: &amp;quot;);&lt;br /&gt;
			writeInteger(z_axisa, DEC);&lt;br /&gt;
			writeChar('\n');&lt;br /&gt;
			SPI_ACCSENS_normalize();&lt;br /&gt;
			SPI_ACCSENS_position();&lt;br /&gt;
			writeString_P(&amp;quot;POSITION: \n&amp;quot;);&lt;br /&gt;
			writeString_P(&amp;quot;  Pitch [°]: &amp;quot;);&lt;br /&gt;
			writeDouble(pitch, 6, 1);&lt;br /&gt;
			writeChar('\n');&lt;br /&gt;
			writeString_P(&amp;quot;  Roll [°]:  &amp;quot;);&lt;br /&gt;
			writeDouble(roll, 6, 1);&lt;br /&gt;
			writeChar('\n');&lt;br /&gt;
			setCursorPosLCD(0, 0);&lt;br /&gt;
			writeStringLCD_P(&amp;quot;P&amp;quot;);&lt;br /&gt;
			writeDoubleLCD(pitch, 6, 1);&lt;br /&gt;
			writeStringLCD_P(&amp;quot; &amp;quot;);&lt;br /&gt;
			setCursorPosLCD(0, 8);&lt;br /&gt;
			writeStringLCD_P(&amp;quot;R&amp;quot;);&lt;br /&gt;
			writeDoubleLCD(roll, 6, 1);&lt;br /&gt;
			writeStringLCD_P(&amp;quot; &amp;quot;);&lt;br /&gt;
			setCursorPosLCD(1, 0);&lt;br /&gt;
			writeStringLCD_P(&amp;quot;X&amp;quot;);&lt;br /&gt;
			writeIntegerLCD(x_axisa, DEC);&lt;br /&gt;
			writeStringLCD_P(&amp;quot;   &amp;quot;);&lt;br /&gt;
			setCursorPosLCD(1, 5);&lt;br /&gt;
			writeStringLCD_P(&amp;quot;Y&amp;quot;);&lt;br /&gt;
			writeIntegerLCD(y_axisa, DEC);&lt;br /&gt;
			writeStringLCD_P(&amp;quot;   &amp;quot;);&lt;br /&gt;
			setCursorPosLCD(1, 10);&lt;br /&gt;
			writeStringLCD_P(&amp;quot;Z&amp;quot;);&lt;br /&gt;
			writeIntegerLCD(z_axisa, DEC);&lt;br /&gt;
			writeStringLCD_P(&amp;quot;    &amp;quot;);&lt;br /&gt;
			mSleep(2000);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Erklärung&lt;br /&gt;
&lt;br /&gt;
====BHT Modul JM3-BHT31====&lt;br /&gt;
Dieses Modul zur Messung von Luftdruck, Luftfeuchte und Temperatur ist seit dem 22.01.2015 lieferbar.&lt;br /&gt;
&lt;br /&gt;
=====Dokumentation=====&lt;br /&gt;
Die Dokumentation zum BHT Modul befindet sich auf der mitgelieferten ''&amp;quot;ASURO xTend-On CD-ROM&amp;quot;''.&lt;br /&gt;
&lt;br /&gt;
======Manuals======&lt;br /&gt;
Das Handbuch in der aktuellen Version kann [http://www.jm3-engineering.com/download/doc/ManualAsuroBHT_de.pdf hier] eingesehen werden.&lt;br /&gt;
&lt;br /&gt;
=====Demo-Programme=====&lt;br /&gt;
Ein Demo-Programm zum BHT Modul befindet sich integriert in die RP6 Sensor Board Demo auf der ''&amp;quot;RP6 Robot System Xtra Modules CD-ROM&amp;quot;''. Diese Demo kann auch in der aktuellen Version im Download Bereich von [http://www.jm3-engineering.com/downloads.htm JM3 Engineering] herunter geladen werden.&lt;br /&gt;
&lt;br /&gt;
=====RP6M256 WiFi: I2C_BHT Library=====&lt;br /&gt;
Die nachfolgende RP6M256_I2C_BHTLib (Eigenentwicklung in GCC) dient zur Ansteuerung des I2C BHT Moduls durch die RP6M256 WiFi.&lt;br /&gt;
&lt;br /&gt;
======Library Header======&lt;br /&gt;
Datei: RP6M256_I2C_BHTLib.h&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;/* ****************************************************************************&lt;br /&gt;
 *                           _______________________&lt;br /&gt;
 *                           \| RP6  ROBOT SYSTEM |/&lt;br /&gt;
 *                            \_-_-_-_-_-_-_-_-_-_/           &amp;gt;&amp;gt;&amp;gt; RP6 M256 WIFI&lt;br /&gt;
 * ----------------------------------------------------------------------------&lt;br /&gt;
 * ----------------------------- [c]2015 - Dirk -------------------------------&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * File: RP6M256_I2C_BHTLib.h&lt;br /&gt;
 * Version: 0.9&lt;br /&gt;
 * Target: RP6 M256 WIFI - ATMEGA2560 @16.00MHz&lt;br /&gt;
 * Author(s): Dirk&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Description:&lt;br /&gt;
 * Header file for new RP6 BHT Module library.&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
#ifndef RP6M256_I2C_BHTLIB_H&lt;br /&gt;
#define RP6M256_I2C_BHTLIB_H&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// RP6 BHT Module components:&lt;br /&gt;
// - I2C Barometric Pressure Sensor (MS5607-02BA)&lt;br /&gt;
// - I2C Relative Humidity Sensor (HTU21D)&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// RP6 Sensor Board:&lt;br /&gt;
&lt;br /&gt;
// If you want to use the RP6 BHT Module on the RP6 Sensor Board, you&lt;br /&gt;
// have to define SENSOR_BOARD (default)!&lt;br /&gt;
// If SENSOR_BOARD is NOT defined, this library assumes that the RP6 BHT&lt;br /&gt;
// Module is used stand-alone.&lt;br /&gt;
// ------------------&lt;br /&gt;
#define SENSOR_BOARD&lt;br /&gt;
// ------------------&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Includes:&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6M256Lib.h&amp;quot;&lt;br /&gt;
#include &amp;quot;RP6I2CmasterTWI.h&amp;quot;&lt;br /&gt;
#ifdef SENSOR_BOARD&lt;br /&gt;
	#include &amp;quot;RP6M256_Sensor_BoardLib.h&amp;quot;&lt;br /&gt;
#endif&lt;br /&gt;
#include &amp;lt;math.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Barometric Pressure Sensor (MS5607-02BA):&lt;br /&gt;
#define I2C_BHT_B_ADR					0xee	// Default&lt;br /&gt;
&lt;br /&gt;
// Weather station's data:&lt;br /&gt;
#define ALTITUDE			156			// Weather station's altitude [m]&lt;br /&gt;
//#define ALTITUDE			110			// 2nd altitude: Location 2 [m]&lt;br /&gt;
&lt;br /&gt;
// Temperature default data:&lt;br /&gt;
#define TEMP_ZERO			273.15		// 273.15 K = 0 °C&lt;br /&gt;
#define TA_DEFAULT			15.0		// Outside temp. default [°C]&lt;br /&gt;
#define TI_DEFAULT			21.0		// Inside temp. default [°C]&lt;br /&gt;
&lt;br /&gt;
// Commands:&lt;br /&gt;
#define MS5607_CMD_RESET				0x1e	// ADC reset command&lt;br /&gt;
#define MS5607_CMD_ADC_READ				0x00	// ADC read command&lt;br /&gt;
#define MS5607_CMD_ADC_CONV				0x40	// ADC conversion command&lt;br /&gt;
#define MS5607_CMD_ADC_D1				0x00	// ADC D1 conversion&lt;br /&gt;
#define MS5607_CMD_ADC_D2				0x10	// ADC D2 conversion&lt;br /&gt;
#define MS5607_CMD_ADC_256				0x00	// ADC OSR=256&lt;br /&gt;
#define MS5607_CMD_ADC_512				0x02	// ADC OSR=512&lt;br /&gt;
#define MS5607_CMD_ADC_1024				0x04	// ADC OSR=1024&lt;br /&gt;
#define MS5607_CMD_ADC_2048				0x06	// ADC OSR=2048&lt;br /&gt;
#define MS5607_CMD_ADC_4096				0x08	// ADC OSR=4096&lt;br /&gt;
#define MS5607_CMD_PROM_RD				0xa0	// Prom read command&lt;br /&gt;
&lt;br /&gt;
extern uint32_t D1;		// ADC value of the pressure conversion&lt;br /&gt;
extern uint32_t D2;		// ADC value of the temperature conversion&lt;br /&gt;
extern uint16_t C[8];	// calibration coefficients&lt;br /&gt;
extern double P;		// compensated pressure value&lt;br /&gt;
extern double P0;		// compensated pressure value at sea level (0 m)&lt;br /&gt;
extern double T;		// compensated temperature value&lt;br /&gt;
extern double dT;		// difference between actual and measured temperature&lt;br /&gt;
extern double OFF;		// offset at actual temperature&lt;br /&gt;
extern double SENS;		// sensitivity at actual temperature&lt;br /&gt;
extern uint8_t n_crc;	// crc value of the prom&lt;br /&gt;
&lt;br /&gt;
void I2C_BHT_B_reset(void);&lt;br /&gt;
uint32_t I2C_BHT_B_cmd_adc(uint8_t cmd);&lt;br /&gt;
uint16_t I2C_BHT_B_cmd_prom(uint8_t coef_num);&lt;br /&gt;
uint8_t I2C_BHT_B_crc4(uint16_t n_prom[]);&lt;br /&gt;
void I2C_BHT_B_read(void);&lt;br /&gt;
void I2C_BHT_B_init(void);&lt;br /&gt;
double reduceAirPressure(double pa, double ta);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Relative Humidity Sensor (HTU21D):&lt;br /&gt;
#define I2C_BHT_HT_ADR					0x80	// Default&lt;br /&gt;
&lt;br /&gt;
// Commands:&lt;br /&gt;
#define HTU21D_TRIG_T_MEASUREMENT_HM    0xe3	// Trig. temp meas. hold master&lt;br /&gt;
#define HTU21D_TRIG_RH_MEASUREMENT_HM   0xe5	// Trig. humidity meas. hold master&lt;br /&gt;
#define HTU21D_TRIG_T_MEASUREMENT_POLL  0xf3	// Trig. temp meas. no hold master&lt;br /&gt;
#define HTU21D_TRIG_RH_MEASUREMENT_POLL 0xf5	// Trig. humidity meas. no hold master&lt;br /&gt;
#define HTU21D_USER_REG_W               0xe6	// Writing user register&lt;br /&gt;
#define HTU21D_USER_REG_R               0xe7	// Reading user register&lt;br /&gt;
#define HTU21D_SOFT_RESET               0xfe	// Soft reset&lt;br /&gt;
&lt;br /&gt;
// Resolutions:&lt;br /&gt;
#define HTU21D_RES_12_14BIT             0x00	// RH=12bit, T=14bit&lt;br /&gt;
#define HTU21D_RES_8_12BIT              0x01	// RH= 8bit, T=12bit&lt;br /&gt;
#define HTU21D_RES_10_13BIT             0x80	// RH=10bit, T=13bit&lt;br /&gt;
#define HTU21D_RES_11_11BIT             0x81	// RH=11bit, T=11bit&lt;br /&gt;
&lt;br /&gt;
// User register bitmasks:&lt;br /&gt;
#define HTU21D_RES_MASK                 0x81	// Mask for res. bits (7, 0)&lt;br /&gt;
#define HTU21D_EOB_ON                   0x40	// End of battery&lt;br /&gt;
#define HTU21D_EOB_MASK                 0x40	// Mask for EOB bit(6)&lt;br /&gt;
#define HTU21D_HEATER_ON                0x04	// Heater on&lt;br /&gt;
#define HTU21D_HEATER_OFF               0x00	// Heater off&lt;br /&gt;
#define HTU21D_HEATER_MASK              0x04	// Mask for Heater bit (2)&lt;br /&gt;
&lt;br /&gt;
extern uint16_t rawHumidity;	// raw humidity value&lt;br /&gt;
extern uint16_t rawTemperature;	// raw temperature value&lt;br /&gt;
extern double H;				// relative humidity value [%]&lt;br /&gt;
extern double HT;				// temperature value [°C]&lt;br /&gt;
extern uint8_t resolution;		// sensor resolution [0..3]&lt;br /&gt;
extern uint8_t ht_crc;			// message crc value&lt;br /&gt;
&lt;br /&gt;
void I2C_BHT_HT_reset(void);&lt;br /&gt;
uint8_t I2C_BHT_HT_crc8(uint16_t message, uint8_t checksum);&lt;br /&gt;
double I2C_BHT_HT_readHumidity(void);&lt;br /&gt;
double I2C_BHT_HT_readTemperature(void);&lt;br /&gt;
void I2C_BHT_HT_setResolution(uint8_t resBits);&lt;br /&gt;
void I2C_BHT_HT_init(void);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// RP6 BHT Module initialisation:&lt;br /&gt;
&lt;br /&gt;
void I2C_BHT_init(void);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
/******************************************************************************&lt;br /&gt;
 * Additional info&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Changelog:&lt;br /&gt;
 * &lt;br /&gt;
 *  ---&amp;gt; changes are documented in the file &amp;quot;RP6M256_I2C_BHTLib.c&amp;quot;&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
======Library Source======&lt;br /&gt;
Datei: RP6M256_I2C_BHTLib.c&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;/* ****************************************************************************&lt;br /&gt;
 *                           _______________________&lt;br /&gt;
 *                           \| RP6  ROBOT SYSTEM |/&lt;br /&gt;
 *                            \_-_-_-_-_-_-_-_-_-_/           &amp;gt;&amp;gt;&amp;gt; RP6 M256 WIFI&lt;br /&gt;
 * ----------------------------------------------------------------------------&lt;br /&gt;
 * ----------------------------- [c]2015 - Dirk -------------------------------&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * File: RP6M256_I2C_BHTLib.c&lt;br /&gt;
 * Version: 0.9&lt;br /&gt;
 * Target: RP6 M256 WIFI - ATMEGA2560 @16.00MHz&lt;br /&gt;
 *         and a RP6 BHT Module (CONRAD 1302995)&lt;br /&gt;
 *         optionally on a RP6 Sensor Board (CONRAD 1082384)&lt;br /&gt;
 * Author(s): Dirk&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Description:&lt;br /&gt;
 * &lt;br /&gt;
 * This is our new Library that contains basic routines and functions for&lt;br /&gt;
 * accessing the RP6 BHT Module JM3-BHT31 (CONRAD 1302995).&lt;br /&gt;
 * If the RP6 BHT Module is located on the RP6 Sensor Board (CONRAD 1082384)&lt;br /&gt;
 * and connected to the I2C-MODULE plug M1, the RP6M256_Sensor_BoardLib has to&lt;br /&gt;
 * be included!&lt;br /&gt;
 * &lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// RP6 BHT Module components:&lt;br /&gt;
// - I2C Barometric Pressure Sensor (MS5607-02BA)&lt;br /&gt;
// - I2C Relative Humidity Sensor (HTU21D)&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Includes:&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6M256_I2C_BHTLib.h&amp;quot; 		&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Variables:&lt;br /&gt;
&lt;br /&gt;
uint8_t bhtdataBuf[4]; &lt;br /&gt;
uint8_t i;&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Barometric Pressure Sensor (MS5607-02BA):&lt;br /&gt;
// (Following the C-code example published 2011 by MEAS in AN520!)&lt;br /&gt;
&lt;br /&gt;
uint32_t D1;			// ADC value of the pressure conversion&lt;br /&gt;
uint32_t D2;			// ADC value of the temperature conversion&lt;br /&gt;
uint16_t C[8];			// calibration coefficients&lt;br /&gt;
double P;				// compensated pressure value&lt;br /&gt;
double P0;				// compensated pressure value at sea level (0 m)&lt;br /&gt;
double T;				// compensated temperature value&lt;br /&gt;
double dT;				// difference between actual and measured temperature&lt;br /&gt;
double OFF;				// offset at actual temperature&lt;br /&gt;
double SENS;			// sensitivity at actual temperature&lt;br /&gt;
uint8_t n_crc;			// crc value of the prom&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Reset sequence for the Pressure Sensor.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void I2C_BHT_B_reset(void)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmitByte(I2C_BHT_B_ADR, MS5607_CMD_RESET);&lt;br /&gt;
	mSleep(3);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Reads and returns pressure or temperature ADC&lt;br /&gt;
 * values measured with the chosen resolution.&lt;br /&gt;
 * This function is BLOCKING during the conversion&lt;br /&gt;
 * time (up to 10 ms).&lt;br /&gt;
 *&lt;br /&gt;
 * Input: cmd -&amp;gt; MS5607_CMD_ADC_D1   = Read pressure ADC value&lt;br /&gt;
 *               MS5607_CMD_ADC_D2   = Read temperature ADC value&lt;br /&gt;
 *               ... plus ...&lt;br /&gt;
 *               MS5607_CMD_ADC_256  = Resolution 0.130 hPa / 0.012 °C&lt;br /&gt;
 *               MS5607_CMD_ADC_512  = Resolution 0.084 hPa / 0.008 °C&lt;br /&gt;
 *               MS5607_CMD_ADC_1024 = Resolution 0.054 hPa / 0.005 °C&lt;br /&gt;
 *               MS5607_CMD_ADC_2048 = Resolution 0.036 hPa / 0.003 °C&lt;br /&gt;
 *               MS5607_CMD_ADC_4096 = Resolution 0.024 hPa / 0.002 °C&lt;br /&gt;
 *&lt;br /&gt;
 * Examples:&lt;br /&gt;
 *   D1 = I2C_BHT_B_cmd_adc(MS5607_CMD_ADC_D1 + MS5607_CMD_ADC_4096);&lt;br /&gt;
 *   // This returns the pressure ADC value (D1) with a 0.024 hPa&lt;br /&gt;
 *   // resolution!&lt;br /&gt;
 *   D2 = I2C_BHT_B_cmd_adc(MS5607_CMD_ADC_D2 + MS5607_CMD_ADC_4096);&lt;br /&gt;
 *   // This returns the temperature ADC value (D2) with a 0.002 °C&lt;br /&gt;
 *   // resolution!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
uint32_t I2C_BHT_B_cmd_adc(uint8_t cmd)&lt;br /&gt;
{&lt;br /&gt;
	uint32_t temp = 0;&lt;br /&gt;
&lt;br /&gt;
	I2CTWI_transmitByte(I2C_BHT_B_ADR, (MS5607_CMD_ADC_CONV + cmd));&lt;br /&gt;
	switch (cmd &amp;amp; 0x0f) {&lt;br /&gt;
		case MS5607_CMD_ADC_256  : mSleep(1); break;&lt;br /&gt;
		case MS5607_CMD_ADC_512  : mSleep(2); break;&lt;br /&gt;
		case MS5607_CMD_ADC_1024 : mSleep(3); break;&lt;br /&gt;
		case MS5607_CMD_ADC_2048 : mSleep(5); break;&lt;br /&gt;
		case MS5607_CMD_ADC_4096 : mSleep(10);&lt;br /&gt;
	}&lt;br /&gt;
	I2CTWI_transmitByte(I2C_BHT_B_ADR, MS5607_CMD_ADC_READ);&lt;br /&gt;
	I2CTWI_readBytes(I2C_BHT_B_ADR, bhtdataBuf, 3);&lt;br /&gt;
	temp = bhtdataBuf[0];						// MSB&lt;br /&gt;
	temp &amp;lt;&amp;lt;= 8;&lt;br /&gt;
	temp |= bhtdataBuf[1];&lt;br /&gt;
	temp &amp;lt;&amp;lt;= 8;&lt;br /&gt;
	temp |= bhtdataBuf[2];						// LSB&lt;br /&gt;
	return temp;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Reads and returns the calibration coefficient&lt;br /&gt;
 * (16 bit) with the number coef_num from the&lt;br /&gt;
 * Pressure Sensor's PROM.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: coef_num -&amp;gt; Calibration coefficient&lt;br /&gt;
 *                    number [0..7]&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
uint16_t I2C_BHT_B_cmd_prom(uint8_t coef_num)&lt;br /&gt;
{&lt;br /&gt;
	uint16_t rC = 0;&lt;br /&gt;
&lt;br /&gt;
	I2CTWI_transmitByte(I2C_BHT_B_ADR, (MS5607_CMD_PROM_RD + coef_num * 2));&lt;br /&gt;
	I2CTWI_readBytes(I2C_BHT_B_ADR, bhtdataBuf, 2);&lt;br /&gt;
	rC = bhtdataBuf[0];							// MSB&lt;br /&gt;
	rC &amp;lt;&amp;lt;= 8;&lt;br /&gt;
	rC |= bhtdataBuf[1];						// LSB&lt;br /&gt;
	return rC;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Calculates and returns the Pressure Sensor's&lt;br /&gt;
 * PROM CRC-4 value (8 bit).&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
uint8_t I2C_BHT_B_crc4(uint16_t n_prom[])&lt;br /&gt;
{&lt;br /&gt;
	uint16_t n_rem;&lt;br /&gt;
	uint16_t crc_read;&lt;br /&gt;
	uint8_t n_bit;&lt;br /&gt;
&lt;br /&gt;
	n_rem = 0x00;&lt;br /&gt;
	crc_read = n_prom[7];&lt;br /&gt;
	n_prom[7] = (0xff00 &amp;amp; (n_prom[7]));&lt;br /&gt;
	for (i = 0; i &amp;lt; 16; i++)&lt;br /&gt;
	{&lt;br /&gt;
		if (i % 2 == 1) n_rem ^= (uint8_t) ((n_prom[i &amp;gt;&amp;gt; 1]) &amp;amp; 0x00ff);&lt;br /&gt;
		else n_rem ^= (uint8_t) (n_prom[i &amp;gt;&amp;gt; 1] &amp;gt;&amp;gt; 8);&lt;br /&gt;
		for (n_bit = 8; n_bit &amp;gt; 0; n_bit--)&lt;br /&gt;
		{&lt;br /&gt;
			if (n_rem &amp;amp; 0x8000) n_rem = (n_rem &amp;lt;&amp;lt; 1) ^ 0x3000;&lt;br /&gt;
			else n_rem = n_rem &amp;lt;&amp;lt; 1;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	n_rem = (0x000f &amp;amp; (n_rem &amp;gt;&amp;gt; 12));&lt;br /&gt;
	n_prom[7] = crc_read;&lt;br /&gt;
	return (n_rem ^ 0x0);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Reads and calculates the pressure and&lt;br /&gt;
 * temperature values with the MS5607 1st order&lt;br /&gt;
 * algorithm.&lt;br /&gt;
 * The 2 values are stored in the global floating&lt;br /&gt;
 * point variables P and T:&lt;br /&gt;
 *   P -&amp;gt; Pressure value [hPa]&lt;br /&gt;
 *   T -&amp;gt; Temperature value [°C]&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void I2C_BHT_B_read(void)&lt;br /&gt;
{&lt;br /&gt;
	D2 = I2C_BHT_B_cmd_adc(MS5607_CMD_ADC_D2 + MS5607_CMD_ADC_4096); // Read D2&lt;br /&gt;
	D1 = I2C_BHT_B_cmd_adc(MS5607_CMD_ADC_D1 + MS5607_CMD_ADC_4096); // Read D1&lt;br /&gt;
&lt;br /&gt;
	// Calculate 1st order pressure and temperature (MS5607 1st order algorithm)&lt;br /&gt;
	dT = D2 - C[5] * pow(2, 8);&lt;br /&gt;
	OFF = C[2] * pow(2, 17) + dT * C[4] / pow(2, 6);&lt;br /&gt;
	SENS = C[1] * pow(2, 16) + dT * C[3] / pow(2, 7);&lt;br /&gt;
&lt;br /&gt;
	T = (2000 + (dT * C[6]) / pow(2, 23)) / 100;&lt;br /&gt;
	P = (((D1 * SENS) / pow(2, 21) - OFF) / pow(2, 15)) / 100;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * You MUST call this function at the beginning of a&lt;br /&gt;
 * main program, that uses the Pressure Sensor. &lt;br /&gt;
 * If SENSOR_BOARD is defined, the I2C-MODULE power&lt;br /&gt;
 * will be switched on with the function&lt;br /&gt;
 * setI2CModulePower() defined in the&lt;br /&gt;
 * RP6M256_Sensor_BoardLib, which will be included&lt;br /&gt;
 * then.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void I2C_BHT_B_init(void)&lt;br /&gt;
{&lt;br /&gt;
#ifdef SENSOR_BOARD&lt;br /&gt;
	// I2C-MODULE (plug M1) power on: &lt;br /&gt;
	setI2CModulePower(1);&lt;br /&gt;
#endif&lt;br /&gt;
	D1 = 0;										// Clear pressure ADC value&lt;br /&gt;
	D2 = 0;										// Clear temperature ADC value&lt;br /&gt;
	I2C_BHT_B_reset();							// Reset the Pressure Sensor&lt;br /&gt;
	for (i = 0; i &amp;lt; 8; i++) {C[i] = I2C_BHT_B_cmd_prom(i);} // Read PROM&lt;br /&gt;
	n_crc = I2C_BHT_B_crc4(C);					// Calculate PROM CRC&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Calculates and returns the relative air pressure&lt;br /&gt;
 * [hPa] at sea level (0 m).&lt;br /&gt;
 *&lt;br /&gt;
 * Input:  pa        -&amp;gt; Absolute air pressure [hPa] at ALTITUDE&lt;br /&gt;
 *         ta        -&amp;gt; OUTSIDE temperature [°C] at ALTITUDE&lt;br /&gt;
 *         ALTITUDE  -&amp;gt; Weather station's altitude [m]&lt;br /&gt;
 *         TEMP_ZERO -&amp;gt; 273.15 K&lt;br /&gt;
 * Output: p0        -&amp;gt; Relative air pressure [hPa] at sea level (0 m)&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
double reduceAirPressure(double pa, double ta)&lt;br /&gt;
{double p0;&lt;br /&gt;
	p0 = pa * (pow ((TEMP_ZERO + ta) / (TEMP_ZERO + ta + 0.0065 * ALTITUDE), -5.255));&lt;br /&gt;
	return p0;									// P0 [hPa]&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Relative Humidity Sensor (HTU21D):&lt;br /&gt;
// (Following a library published 2011 by MEAS France!)&lt;br /&gt;
&lt;br /&gt;
uint16_t rawHumidity;		// raw humidity value&lt;br /&gt;
uint16_t rawTemperature;	// raw temperature value&lt;br /&gt;
double H;					// relative humidity value [%]&lt;br /&gt;
double HT;					// temperature value [°C]&lt;br /&gt;
uint8_t resolution;			// sensor resolution [0..3]&lt;br /&gt;
uint8_t ht_crc;				// message crc value&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Soft reset for the Humidity Sensor.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void I2C_BHT_HT_reset(void)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmitByte(I2C_BHT_HT_ADR, HTU21D_SOFT_RESET);&lt;br /&gt;
	mSleep(15);&lt;br /&gt;
	resolution = 0;								// Default: RH 12, T 14 bit&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Reads the Humidity Sensor's user register.&lt;br /&gt;
 *&lt;br /&gt;
 * Hint: The user register bits are described on&lt;br /&gt;
 *       page 13 of the HTU21D datasheet!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
uint8_t read_user_register(void)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t userRegister;&lt;br /&gt;
  &lt;br /&gt;
	I2CTWI_transmitByte(I2C_BHT_HT_ADR, HTU21D_USER_REG_R);&lt;br /&gt;
	userRegister = I2CTWI_readByte(I2C_BHT_HT_ADR);&lt;br /&gt;
	return userRegister;  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Sets the Humidity Sensor's resolution to one&lt;br /&gt;
 * of four steps. The step number [0..3] is stored&lt;br /&gt;
 * in the global variable resolution:&lt;br /&gt;
 *   Step  RH   T&lt;br /&gt;
 *    0:   12  14 bit&lt;br /&gt;
 *    1:    8  12 bit&lt;br /&gt;
 *    2:   10  13 bit&lt;br /&gt;
 *    3:   11  11 bit&lt;br /&gt;
 *                                      RH   T&lt;br /&gt;
 * Input:  resBits -&amp;gt; 0b00000000   (0): 12  14 bit&lt;br /&gt;
 *                 -&amp;gt; 0b00000001   (1):  8  12 bit&lt;br /&gt;
 *                 -&amp;gt; 0b10000000 (128): 10  13 bit&lt;br /&gt;
 *                 -&amp;gt; 0b10000001 (129): 11  11 bit&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void I2C_BHT_HT_setResolution(uint8_t resBits)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t userRegister;&lt;br /&gt;
&lt;br /&gt;
	userRegister = read_user_register();&lt;br /&gt;
	userRegister &amp;amp;= 0b01111110;&lt;br /&gt;
	resBits &amp;amp;= 0b10000001;&lt;br /&gt;
	resolution = (resBits &amp;gt;&amp;gt; 6) | (resBits &amp;amp; 1); // Step 0..3&lt;br /&gt;
	userRegister |= resBits;&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_BHT_HT_ADR, HTU21D_USER_REG_W, userRegister);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#define SHIFTED_DIVISOR                 0x988000&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Calculates the Humidity Sensor's message CRC-8&lt;br /&gt;
 * value (8 bit) and returns 0 (false), if the&lt;br /&gt;
 * message transmission is good.&lt;br /&gt;
 *&lt;br /&gt;
 * Input:  message         -&amp;gt; Message from&lt;br /&gt;
 *                            Humidity Sensor&lt;br /&gt;
 *         checksum        -&amp;gt; Checksum from&lt;br /&gt;
 *                            Humidity Sensor&lt;br /&gt;
 *         SHIFTED_DIVISOR -&amp;gt; 0x0131 polynomial&lt;br /&gt;
 *                            shifted to farthest&lt;br /&gt;
 *                            left of three bytes&lt;br /&gt;
 * Output: remainder       -&amp;gt; 0  = Transmission good&lt;br /&gt;
 *                         -&amp;gt; &amp;gt;0 = Transm. corrupted&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
uint8_t I2C_BHT_HT_crc8(uint16_t message, uint8_t checksum)&lt;br /&gt;
{&lt;br /&gt;
	uint32_t remainder, divisor;&lt;br /&gt;
&lt;br /&gt;
	remainder = (uint32_t) message &amp;lt;&amp;lt; 8;&lt;br /&gt;
	remainder |= checksum;&lt;br /&gt;
	divisor = (uint32_t) SHIFTED_DIVISOR;&lt;br /&gt;
	for (i = 0; i &amp;lt; 16; i++)&lt;br /&gt;
	{&lt;br /&gt;
		if (remainder &amp;amp; (uint32_t) 1 &amp;lt;&amp;lt; (23 - i))&lt;br /&gt;
			remainder ^= divisor;&lt;br /&gt;
		divisor &amp;gt;&amp;gt;= 1;&lt;br /&gt;
	}&lt;br /&gt;
	return (uint8_t) remainder;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Calculates and returns the humidity value.&lt;br /&gt;
 * This function is BLOCKING during the conversion&lt;br /&gt;
 * time (up to 17 ms depending on resolution).&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
double I2C_BHT_HT_readHumidity(void)&lt;br /&gt;
{&lt;br /&gt;
	uint32_t temp = 0;&lt;br /&gt;
&lt;br /&gt;
	I2CTWI_transmitByte(I2C_BHT_HT_ADR, HTU21D_TRIG_RH_MEASUREMENT_POLL);&lt;br /&gt;
	switch (resolution) {&lt;br /&gt;
		case 1 : mSleep(4); break;				// RH 8 bit&lt;br /&gt;
		case 2 : mSleep(6); break;				// RH 10 bit&lt;br /&gt;
		case 3 : mSleep(9); break;				// RH 11 bit&lt;br /&gt;
		case 0 : mSleep(17);					// RH 12 bit&lt;br /&gt;
	}&lt;br /&gt;
	I2CTWI_readBytes(I2C_BHT_HT_ADR, bhtdataBuf, 3);&lt;br /&gt;
	temp = bhtdataBuf[0];						// MSB&lt;br /&gt;
	temp &amp;lt;&amp;lt;= 8;&lt;br /&gt;
	temp |= bhtdataBuf[1];						// LSB&lt;br /&gt;
	temp &amp;lt;&amp;lt;= 8;&lt;br /&gt;
	temp |= bhtdataBuf[2];						// Checksum&lt;br /&gt;
	rawHumidity = temp &amp;gt;&amp;gt; 8;&lt;br /&gt;
	ht_crc = (uint8_t) temp;&lt;br /&gt;
	rawHumidity &amp;amp;= 0xfffc;&lt;br /&gt;
	double tempRH = rawHumidity / (double) 65536;&lt;br /&gt;
	double rh = -6 + (125 * tempRH);&lt;br /&gt;
	return rh;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Calculates and returns the temperature value.&lt;br /&gt;
 * This function is BLOCKING during the conversion&lt;br /&gt;
 * time (up to 51 ms depending on resolution).&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
double I2C_BHT_HT_readTemperature(void)&lt;br /&gt;
{&lt;br /&gt;
	uint32_t temp = 0;&lt;br /&gt;
&lt;br /&gt;
	I2CTWI_transmitByte(I2C_BHT_HT_ADR, HTU21D_TRIG_T_MEASUREMENT_POLL);&lt;br /&gt;
	switch (resolution) {&lt;br /&gt;
		case 3 : mSleep(8); break;				// T 11 bit&lt;br /&gt;
		case 1 : mSleep(14); break;				// T 12 bit&lt;br /&gt;
		case 2 : mSleep(26); break;				// T 13 bit&lt;br /&gt;
		case 0 : mSleep(51);					// T 14 bit&lt;br /&gt;
	}&lt;br /&gt;
	I2CTWI_readBytes(I2C_BHT_HT_ADR, bhtdataBuf, 3);&lt;br /&gt;
	temp = bhtdataBuf[0];						// MSB&lt;br /&gt;
	temp &amp;lt;&amp;lt;= 8;&lt;br /&gt;
	temp |= bhtdataBuf[1];						// LSB&lt;br /&gt;
	temp &amp;lt;&amp;lt;= 8;&lt;br /&gt;
	temp |= bhtdataBuf[2];						// Checksum&lt;br /&gt;
	rawTemperature = temp &amp;gt;&amp;gt; 8;&lt;br /&gt;
	ht_crc = (uint8_t) temp;&lt;br /&gt;
	rawTemperature &amp;amp;= 0xfffc;&lt;br /&gt;
	double tempTemperature = rawTemperature / (double) 65536;&lt;br /&gt;
	double realTemperature = -46.85 + (175.72 * tempTemperature);&lt;br /&gt;
	return realTemperature;  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * You MUST call this function at the beginning of a&lt;br /&gt;
 * main program, that uses the Humidity Sensor. &lt;br /&gt;
 * If SENSOR_BOARD is defined, the I2C-MODULE power&lt;br /&gt;
 * will be switched on with the function&lt;br /&gt;
 * setI2CModulePower() defined in the&lt;br /&gt;
 * RP6M256_Sensor_BoardLib, which will be included&lt;br /&gt;
 * then.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void I2C_BHT_HT_init(void)&lt;br /&gt;
{&lt;br /&gt;
#ifdef SENSOR_BOARD&lt;br /&gt;
	// I2C-MODULE (plug M1) power on: &lt;br /&gt;
	setI2CModulePower(1);&lt;br /&gt;
#endif&lt;br /&gt;
	I2C_BHT_HT_reset();							// Reset the Humidity Sensor&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// RP6 BHT Module initialisation:&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * You MUST call this function at the beginning of a&lt;br /&gt;
 * main program, that uses the RP6 BHT Module. &lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void I2C_BHT_init(void)&lt;br /&gt;
{&lt;br /&gt;
	// I2C Barometric Pressure Sensor:&lt;br /&gt;
	I2C_BHT_B_init();&lt;br /&gt;
	// I2C Relative Humidity Sensor:&lt;br /&gt;
	I2C_BHT_HT_init();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&lt;br /&gt;
/******************************************************************************&lt;br /&gt;
 * Additional info&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Changelog:&lt;br /&gt;
 * - v. 0.9 (initial release) 20.03.2015 by Dirk&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
======Demo======&lt;br /&gt;
makefile:&lt;br /&gt;
&amp;lt;pre&amp;gt;...&lt;br /&gt;
TARGET = RP6M256_Sensor_Board_03&lt;br /&gt;
...&lt;br /&gt;
SRC += $(RP6_LIB_PATH)/RP6common/RP6I2CmasterTWI.c&lt;br /&gt;
&lt;br /&gt;
SRC += $(RP6_LIB_PATH)/RP6control_M256_WIFI/RP6M256_Sensor_BoardLib.c&lt;br /&gt;
SRC += $(RP6_LIB_PATH)/RP6control_M256_WIFI/RP6M256_I2C_BHTLib.c&lt;br /&gt;
...&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Datei: RP6M256_Sensor_Board_03.c&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;/* &lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * RP6 ROBOT SYSTEM - RP6 CONTROL M256 Examples&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Example: RP6M256 Sensor Board&lt;br /&gt;
 * Author(s): Dirk&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Description:&lt;br /&gt;
 * In this example we show a third test for the RP6 Sensor Board.&lt;br /&gt;
 * &lt;br /&gt;
 * ############################################################################&lt;br /&gt;
 * The Robot does NOT move in this example! You can simply put it on a table&lt;br /&gt;
 * next to your PC and you should connect it to the PC via the USB Interface!&lt;br /&gt;
 * You should also connect to it via WIFI.&lt;br /&gt;
 * ############################################################################&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Includes:&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6M256Lib.h&amp;quot; 				// The RP6 M256 Library. &lt;br /&gt;
										// Always needs to be included!&lt;br /&gt;
#include &amp;quot;RP6I2CmasterTWI.h&amp;quot;			// Include the I2C-Bus Master Library&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Include our new &amp;quot;RP6M256 I2C BHT Module library&amp;quot;:&lt;br /&gt;
// (This is the library for accessing the RP6 BHT Module!)&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6M256_I2C_BHTLib.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Write a floating point number to the WIFI.&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *&lt;br /&gt;
 *			// Write a floating point number to the WIFI (no exponent):&lt;br /&gt;
 *			writeDouble_WIFI(1234567.890, 11, 3);&lt;br /&gt;
 *&lt;br /&gt;
 * The value of prec (precision) defines the number of decimal places.&lt;br /&gt;
 * For 32 bit floating point variables (float, double ...) 6 is&lt;br /&gt;
 * the max. value for prec (7 relevant digits).&lt;br /&gt;
 * The value of width defines the overall number of characters in the&lt;br /&gt;
 * floating point number including the decimal point. The number of&lt;br /&gt;
 * pre-decimal positions is: (width - prec - 1).&lt;br /&gt;
 */&lt;br /&gt;
void writeDouble_WIFI(double number, uint8_t width, uint8_t prec)&lt;br /&gt;
{char buffer[width + 1];&lt;br /&gt;
	dtostrf(number, width, prec, &amp;amp;buffer[0]);&lt;br /&gt;
	writeString_WIFI(&amp;amp;buffer[0]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Write a floating point number to the LCD.&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *&lt;br /&gt;
 *			// Write a floating point number to the LCD (no exponent):&lt;br /&gt;
 *			writeDoubleLCD(1234567.890, 11, 3);&lt;br /&gt;
 *&lt;br /&gt;
 * The value of prec (precision) defines the number of decimal places.&lt;br /&gt;
 * For 32 bit floating point variables (float, double ...) 6 is&lt;br /&gt;
 * the max. value for prec (7 relevant digits).&lt;br /&gt;
 * The value of width defines the overall number of characters in the&lt;br /&gt;
 * floating point number including the decimal point. The number of&lt;br /&gt;
 * pre-decimal positions is: (width - prec - 1).&lt;br /&gt;
 */&lt;br /&gt;
void writeDoubleLCD(double number, uint8_t width, uint8_t prec)&lt;br /&gt;
{char buffer[width + 1];&lt;br /&gt;
	dtostrf(number, width, prec, &amp;amp;buffer[0]);&lt;br /&gt;
	writeStringLCD(&amp;amp;buffer[0]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Error handler&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function gets called automatically if there was an I2C Error like&lt;br /&gt;
 * the slave sent a &amp;quot;not acknowledge&amp;quot; (NACK, error codes e.g. 0x20 or 0x30).&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void I2C_transmissionError(uint8_t errorState)&lt;br /&gt;
{&lt;br /&gt;
	writeString_P_WIFI(&amp;quot;\nI2C ERROR - TWI STATE: 0x&amp;quot;);&lt;br /&gt;
	writeInteger_WIFI(errorState, HEX);&lt;br /&gt;
	writeChar_WIFI('\n');&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Main function - The program starts here:&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
	initRP6M256();    // Always call this first! The Processor will not work&lt;br /&gt;
					  // correctly otherwise. &lt;br /&gt;
&lt;br /&gt;
	initLCD(); // Initialize the LC-Display (LCD)&lt;br /&gt;
			   // Always call this before using the LCD!&lt;br /&gt;
&lt;br /&gt;
	setLEDs(0b1111);&lt;br /&gt;
	mSleep(500);&lt;br /&gt;
	setLEDs(0b0000);&lt;br /&gt;
&lt;br /&gt;
	writeString_P_WIFI(&amp;quot;\n\nRP6 Sensor Board Selftest 3!\n&amp;quot;); &lt;br /&gt;
&lt;br /&gt;
	// IMPORTANT:&lt;br /&gt;
	I2CTWI_initMaster(100); // Initialize the TWI Module for Master operation&lt;br /&gt;
							// with 100kHz SCL Frequency&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	// Register the event handler:&lt;br /&gt;
	I2CTWI_setTransmissionErrorHandler(I2C_transmissionError);&lt;br /&gt;
&lt;br /&gt;
	setLEDs(0b1111);&lt;br /&gt;
&lt;br /&gt;
	// Write a text message to the LCD:&lt;br /&gt;
	showScreenLCD(&amp;quot;################&amp;quot;, &amp;quot;################&amp;quot;);&lt;br /&gt;
	mSleep(1500);&lt;br /&gt;
	showScreenLCD(&amp;quot;RP6v2-M256-WIFI &amp;quot;, &amp;quot;Example Program&amp;quot;);&lt;br /&gt;
	mSleep(2500); &lt;br /&gt;
	showScreenLCD(&amp;quot;RP6 Sensor Board&amp;quot;, &amp;quot;   Selftest 3&amp;quot;);&lt;br /&gt;
	mSleep(2500);&lt;br /&gt;
	clearLCD();&lt;br /&gt;
&lt;br /&gt;
	setLEDs(0b0000);&lt;br /&gt;
&lt;br /&gt;
	// ---------------------------------------&lt;br /&gt;
&lt;br /&gt;
	uint8_t onoff = 0;&lt;br /&gt;
&lt;br /&gt;
	startStopwatch1();&lt;br /&gt;
	startStopwatch2();&lt;br /&gt;
&lt;br /&gt;
	// IMPORTANT:&lt;br /&gt;
	sensor_board_init();						// RP6 Sensor Board init!!!&lt;br /&gt;
	mSleep(200);&lt;br /&gt;
	I2C_BHT_init();								// RP6 BHT Module init&lt;br /&gt;
&lt;br /&gt;
	while(true) &lt;br /&gt;
	{&lt;br /&gt;
		if(getStopwatch1() &amp;gt; 1000) // 1s&lt;br /&gt;
		{&lt;br /&gt;
//			if (onoff) onoff = 0;&lt;br /&gt;
//			else onoff = 1;&lt;br /&gt;
&lt;br /&gt;
			// Show Pressure Sensor data:&lt;br /&gt;
			I2C_BHT_B_read();					// Read data&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nLuftdruck:   &amp;quot;);&lt;br /&gt;
			writeDouble_WIFI(P, 7, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot; hPa am Messort (ALTITUDE m)\n&amp;quot;);&lt;br /&gt;
			// Calculate pressure at sea level at TA_DEFAULT (15 °C):&lt;br /&gt;
			P0 = reduceAirPressure(P, TA_DEFAULT);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;Luftdruck:   &amp;quot;);&lt;br /&gt;
			writeDouble_WIFI(P0, 7, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot; hPa in Meereshöhe (0 m, 15 C)\n&amp;quot;);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;Temperatur:  &amp;quot;);&lt;br /&gt;
			writeDouble_WIFI(T, 7, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot; C\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			// Show Humidity Sensor data:&lt;br /&gt;
			H = I2C_BHT_HT_readHumidity();		// Read data&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nLuftfeuchte: &amp;quot;);&lt;br /&gt;
			writeDouble_WIFI(H, 7, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot; % RH\n&amp;quot;);&lt;br /&gt;
			HT = I2C_BHT_HT_readTemperature();	// Read data&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;Temperatur:  &amp;quot;);&lt;br /&gt;
			writeDouble_WIFI(HT, 7, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot; C\n\n\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			// RP6 Sensor Board shutdown (button &amp;amp; status LED test):&lt;br /&gt;
			if (pressedButton) {&lt;br /&gt;
				setStatusLED(1);&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;\nPress button again for RP6 Sensor Board SHUTDOWN!\n&amp;quot;);&lt;br /&gt;
				mSleep(2000);&lt;br /&gt;
				do {&lt;br /&gt;
					if(getStopwatch2() &amp;gt; 200) { // 0.2s&lt;br /&gt;
						if (onoff) onoff = 0;&lt;br /&gt;
						else onoff = 1;&lt;br /&gt;
						if (onoff) setStatusLED(1);&lt;br /&gt;
						else setStatusLED(0);&lt;br /&gt;
						setStopwatch2(0);&lt;br /&gt;
					}&lt;br /&gt;
					mSleep(1);&lt;br /&gt;
					task_I2CTWI();&lt;br /&gt;
				} while (!readButton());&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;\n\n\n\n\nPlease wait for RP6 Sensor Board SHUTDOWN...\n&amp;quot;);&lt;br /&gt;
				sensor_board_shutdown();&lt;br /&gt;
				mSleep(3000);&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;\n\n\nThe RP6 Sensor Board now is in SHUTDOWN MODE!!!\n&amp;quot;);&lt;br /&gt;
				mSleep(1000);&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;\nRESET the M256 microcontroller now...\n\n&amp;quot;);&lt;br /&gt;
				while(true) {};&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			setStopwatch1(0);&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		task_RP6SensorBoard();					// RP6 Sensor Board task&lt;br /&gt;
&lt;br /&gt;
		task_I2CTWI();&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Erklärung&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Erfahrungsberichte==&lt;br /&gt;
&lt;br /&gt;
...in Arbeit...(kann aber gerne ergänzt werden)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Siehe auch==&lt;br /&gt;
* [[RP6v2]]&lt;br /&gt;
* [[RP6]]&lt;br /&gt;
* [[RP6 - Programmierung]]&lt;br /&gt;
* [[RP6 Kamera - Mitmach-Projekt]]&lt;br /&gt;
* [[RP6v2 I2C-Portexpander]]&lt;br /&gt;
* [[RP6v2 USB-RS232-Adapter]]&lt;br /&gt;
* [[RP6v2 Orientierung]]&lt;br /&gt;
* [[RP6 Multi IO Projekt]]&lt;br /&gt;
* [[RP6 Multi IO Projekt - Software]]&lt;br /&gt;
* [[RP6 ArduIO]]&lt;br /&gt;
* [[RP6 ArduIO - Software]]&lt;br /&gt;
* [[Induktive_Ladestation_f%C3%BCr_den_RP6|Induktive Ladestation für den RP6]]&lt;br /&gt;
* [[IR-bake_f%C3%BCr_den_RP6|IR-bake für den RP6]]&lt;br /&gt;
* [[CCRP5]]&lt;br /&gt;
* [[Wild Thumper]]&lt;br /&gt;
* [[Wild Thumper - Programmierung]]&lt;br /&gt;
* [[Yeti]]&lt;br /&gt;
* [[Asuro]]&lt;br /&gt;
* [[C't-Bot]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Weblinks==&lt;br /&gt;
'''Siehe auch die Weblinks im [http://www.rn-wissen.de/index.php/RP6v2#Weblinks RP6v2] und im [http://www.rn-wissen.de/index.php/RP6#Weblinks RP6] Artikel!'''&lt;br /&gt;
&lt;br /&gt;
* [http://www.conrad.de/ce/de/product/1082384/Arexx-RP6-Sensor-Board-RP6-JM03-61 RP6 Sensor Board bei CONRAD]&lt;br /&gt;
* JM3 Engineering:&lt;br /&gt;
** [http://www.jm3-engineering.com/rp6.htm RP6 Roboter Erweiterung]&lt;br /&gt;
** [http://www.jm3-engineering.com/sensors.htm Sensor Module]&lt;br /&gt;
** [http://www.jm3-engineering.com/downloads.htm Software Downloads]&lt;br /&gt;
* Ankündigung einer Sensorerweiterungsplatine für die RP6v2 M256 WiFi im [http://www.roboternetz.de/community/threads/63595-Neue-Hardware-f%C3%BCr-RP6%28v2%29?p=590129&amp;amp;viewfull=1#post590129 Roboternetz RP6 Forum]&lt;br /&gt;
* Erfahrungsbericht zum Sensor Board im [http://www.arexx.com/forum/viewtopic.php?f=19&amp;amp;t=2498 AREXX Support Forum] und im [http://www.roboternetz.de/community/threads/64414-RP6-Sensor-Board-Erster-Eindruck Roboternetz RP6 Forum]&lt;br /&gt;
* Erfahrungsbericht zum I2C GPS Empfänger im [http://www.arexx.com/forum/viewtopic.php?f=19&amp;amp;t=2509 AREXX Support Forum]&lt;br /&gt;
* Erfahrungsbericht zum I2C BHT Modul im [http://www.arexx.com/forum/viewtopic.php?f=19&amp;amp;t=2646 AREXX Support Forum]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Kategorie:Robotikeinstieg]]	 &lt;br /&gt;
[[Kategorie:Praxis]]&lt;br /&gt;
&lt;br /&gt;
==Autoren==&lt;br /&gt;
--[http://www.roboternetz.de/community/members/1972-Dirk Dirk] 15:30, 31. Mär 2022 (CET)&lt;/div&gt;</summary>
		<author><name>Dirk NO2</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=RP6_Sensor_Board_und_Xtra_Module&amp;diff=28584</id>
		<title>RP6 Sensor Board und Xtra Module</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=RP6_Sensor_Board_und_Xtra_Module&amp;diff=28584"/>
				<updated>2022-03-31T13:29:03Z</updated>
		
		<summary type="html">&lt;p&gt;Dirk NO2: /* Was bisher geschah */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Bild:RP6_Sensor_Board.jpg|Das RP6 Sensor Board|right|500px]]&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_Xtra_module.JPG|RP6 Xtra module|right|500px]]&lt;br /&gt;
==Was bisher geschah==&lt;br /&gt;
'''Siehe auch &amp;quot;Was bisher geschah&amp;quot; im [http://www.rn-wissen.de/index.php/RP6v2#Was_bisher_geschah RP6v2] und im [http://www.rn-wissen.de/index.php/RP6#Was_bisher_geschah RP6] Artikel!'''&lt;br /&gt;
&lt;br /&gt;
Mit, 27. Nov 2013 - Ankündigung einer Sensorerweiterungsplatine, die an die RP6v2-M256-WIFI angeschlossen werden kann&amp;lt;br/&amp;gt;&lt;br /&gt;
Sam, 22. Feb 2014 - Auslieferungsbeginn des RP6 Sensor Boards, des I2C GPS Empfängers, des 3D Accelerometer Moduls und des Gyro Moduls&amp;lt;br/&amp;gt;&lt;br /&gt;
Mon, 17. Mär 2014 - Das RP6 Sensor Board ist &amp;quot;nicht lieferbar&amp;quot;, neuer Liefertermin angekündigt für den 12.06.2014 (!?)&amp;lt;br/&amp;gt;&lt;br /&gt;
Die, 25. Mär 2014 - Das RP6 Sensor Board ist wieder &amp;quot;sofort lieferbar&amp;quot;&amp;lt;br/&amp;gt;&lt;br /&gt;
August 2014 - Ein neues Xtra Modul wird von JM3 Engineering angekündigt: Das &amp;quot;Wetterstations Sensor Modul&amp;quot;&amp;lt;br/&amp;gt;&lt;br /&gt;
November 2014 - Das &amp;quot;Wetterstations Sensor Modul&amp;quot; ist bei [http://www.jm3-engineering.com/sensors.htm JM3 Engineering] als &amp;quot;BHT Modul&amp;quot; abgebildet und ein Manual verfügbar&amp;lt;br/&amp;gt;&lt;br /&gt;
Don, 22. Jan 2015 - Auslieferungsbeginn des BHT Moduls&amp;lt;br/&amp;gt;&lt;br /&gt;
Son, 18. Dez 2016 - Laut JM3 Engineering wird das 3D Accelerometer DIL Modul nicht mehr produziert, ist aber weiterhin erhältlich&amp;lt;br/&amp;gt;&lt;br /&gt;
Oktober 2017 - Das RP6 Sensor Board und der I2C GPS Empfänger sind bei CONRAD ausverkauft&amp;lt;br/&amp;gt;&lt;br /&gt;
April 2019 - Das Gyro Modul und das BHT Modul sind bei CONRAD ausverkauft&amp;lt;br/&amp;gt;&lt;br /&gt;
Mai 2020 - Die Experimentierplatine, das Backlight-Display, der Graustufen-Boden-Sensor, der Drehgeber-Satz RP6-ENCv3 und das 3D Accelerometer Modul sind bei CONRAD ausverkauft&amp;lt;br/&amp;gt;&lt;br /&gt;
Ende 2021 - Die RP6 CONTROL M32 Platine, die Ersatzräder, die Ersatzraupen und das RP6 USB-Interface RP6V2-TRANS sind bei CONRAD ausverkauft&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Allgemein==&lt;br /&gt;
Dieser Artikel beschreibt die Grundlagen und Programmierung des RP6 Sensor Boards und der RP6 Xtra Module. Dieses Erweiterungs-Modul und die Xtra Module sind Teile des RP6-Systems, das in den RN-Wissen-Artikeln [[RP6]], [[RP6v2]] und [[RP6_-_Programmierung|RP6 - Programmierung]] ausführlich beschrieben wird. Ausgegliedert aus den &amp;quot;Haupt-Artikeln&amp;quot; habe ich diese Module, da sie m.E. zu einer neuen &amp;quot;Ära&amp;quot; des RP6-Systems gehören:&lt;br /&gt;
&lt;br /&gt;
Sie wurden nicht mehr von '''[http://www.roboternetz.de/community/members/120-SlyD SlyD] (Dominik S. Herwald)''' in Zusammenarbeit mit '''[http://www.arexx.com/ AREXX]''' entwickelt, sondern ab 2013 von '''[http://jm3-engineering.com/ JM3 Engineering] (Dipl.-Ing. Jürgen Maisel)'''. Ab Februar 2014 waren dann das '''RP6 Sensor Board RP6-JM03-61''' ([http://www.conrad.de/ce/de/product/1082384/Arexx-RP6-Sensor-Board-RP6-JM03-61 1082384]) und die drei RP6 Xtra Module '''I2C GPS Empfänger JM3-GPS''' ([http://www.conrad.de/ce/de/product/1082385/Arexx-IC-GPS-Empfaenger-JM3-GPS 1082385]), '''Gyro Modul JM3-GYRO''' ([http://www.conrad.de/ce/de/product/1082386/Arexx-Gyro-Modul-JM3-GYRO 1082386]) und '''3D Accelerometer Modul JM3-3DA''' ([http://www.conrad.de/ce/de/product/1082387/Arexx-3D-Accelerometer-Modul-JM3-3DA 1082387]) bei CONRAD lieferbar. Einen ersten Eindruck vom Sensor Board kann man im RoboterNetz und AREXX Support Forum bekommen,- siehe unter [[RP6_Sensor_Board_und_Xtra_Module#Weblinks|Weblinks]]!&lt;br /&gt;
&lt;br /&gt;
===RP6 Sensor Board===&lt;br /&gt;
Das [[RP6_Sensor_Board_und_Xtra_Module#RP6_Sensor_Board_2|RP6 Sensor Board]] gehört zu den &amp;quot;Erweiterungs-Modulen&amp;quot; des RP6-Systems. '''Andere &amp;quot;Erweiterungs-Module&amp;quot; werden im [[RP6v2#Erweiterungs-Module|RP6v2]] und im [[RP6#Erweiterungs-Module|RP6]] Artikel beschrieben!'''&lt;br /&gt;
&lt;br /&gt;
Das ''RP6 Sensor Board'' ist das erste &amp;quot;Erweiterungs-Modul&amp;quot;, das nicht über einen eigenen Microprozessor verfügt,- es ist also ein ''passives Modul'', das von einem Microprozessor-System (z.B. RP6v2, M32, M128, M256 Wifi) angesteuert werden muss. Es ist ebenfalls das erste Modul, das nicht mehr über die rautenförmige Einbuchtung an der Vorderkante verfügt, sondern komplett rechteckig ist. Damit passt es (montiert auf den Standard-Abstandbolzen) nur auf den vorderen Platinenstapel 1 des RP6.&lt;br /&gt;
&lt;br /&gt;
===RP6 Xtra Module===&lt;br /&gt;
Die [[RP6_Sensor_Board_und_Xtra_Module#RP6_Xtra_Module_2|RP6 Xtra Module]] gehören zu den &amp;quot;Zubehör- und Ersatzteilen&amp;quot; des RP6-Systems. '''Über die weiteren &amp;quot;Zubehör- und Ersatzteile&amp;quot; zum RP6 informiert der entsprechende Abschnitt im [[RP6v2#Zubeh.C3.B6r_und_Ersatzteile|RP6v2]] und im [[RP6#Zubehör und Ersatzteile|RP6]] Artikel!'''&lt;br /&gt;
&lt;br /&gt;
Die ''RP6 Xtra Module'' unterscheiden sich von den weiteren &amp;quot;Zubehör- und Ersatzteilen&amp;quot; dadurch, dass sie selbstständige Sensor-Platinen sind, die ideal zum RP6-System passen, aber auch mit anderen Microcontroller-Plattformen nutzbar sind.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==RP6 Sensor Board==&lt;br /&gt;
Das RP6 Sensor Board RP6-JM03-61 ([http://www.conrad.de/ce/de/product/1082384/Arexx-RP6-Sensor-Board-RP6-JM03-61 1082384]) wurde am 27.11.2013 von [http://www.roboternetz.de/community/members/120-SlyD SlyD] angekündigt (siehe Weblink!).&lt;br /&gt;
&lt;br /&gt;
Aktuell (Oktober 2017) ist das RP6 Sensor Board bei CONRAD ausverkauft.&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_Sensor_Board.jpg|Das RP6 Sensor Board]]&lt;br /&gt;
&lt;br /&gt;
===Beschreibung===&lt;br /&gt;
(Laut Online-Katalog der Firma CONRAD!)&lt;br /&gt;
&lt;br /&gt;
''&amp;quot;Das RP6 Sensor Board erweitert die Möglichkeiten aller RP6 Roboter um wesentliche Sensorsignale für Robotik-Anwendungen wie zum Beispiel Dreharten (Yaw-Gyro), Kipp- und Neigewinkel, Kompassrichtung oder aber auch Zeit und Datum.&lt;br /&gt;
Sie können einfach mit zusätzlichen Sharp Sensoren Abstände genau messen, z.B. für autonome Fahrrouten oder falls der Sensor nach unten gerichtet ist, kann er Treppenstufen oder ähnliches entdecken. Außerdem gibt es die Möglichkeit z.B. die Sharp Sensoren ein- bzw. auszuschalten um Strom zu sparen. Zusätzlich können bis zu 8 Servos angesteuert werden um z.B. einen Roboterarm zu bewegen, der auch mechanisch einfach zu montieren ist. Um die Möglichkeiten des RP6 Sensor Boards komplett ausnutzen zu können, wird ein RP6V2 und RP6Wifi Control Board empfohlen. Die ermöglicht den Roboter über Wifi fernzusteuern oder Sensordaten auf dem Kommandozentrum (PC) z.B Kompassdaten, Temperatur oder Kipp- und Neigewinkel anzeigen zu lassen.&amp;quot;''&lt;br /&gt;
&lt;br /&gt;
'''Ausstattung'''&lt;br /&gt;
* Magnetometer- und Accelerometer für Kompassfunktion&lt;br /&gt;
* Gyro Sensor (Yaw)&lt;br /&gt;
* Sharp-Sensor Schnittstelle&lt;br /&gt;
* LED Scheinwerfer&lt;br /&gt;
* LED Treiber mit Smart Funktionen&lt;br /&gt;
* I²C Bus mit max. 400 kHz Übertragungsrate; Hot Swap I²C-Bus Buffer&lt;br /&gt;
* Taster mit LED&lt;br /&gt;
* Echtzeit-Uhr RTC&lt;br /&gt;
* Backupbatterie (Aufladung während des Betriebs)&lt;br /&gt;
* Expansion Port z.B. für GPS-I²C Bus Modul&lt;br /&gt;
* 8 Servo-Ausgänge mit eigenem Schaltregler&lt;br /&gt;
* 8 PWM Ausgänge&lt;br /&gt;
* 5 LED Ausgänge und 2 Digital-I/O Ausgänge.&lt;br /&gt;
&lt;br /&gt;
'''Lieferumfang'''&lt;br /&gt;
* RP6 Sensor Board&lt;br /&gt;
* Montage-Kit&lt;br /&gt;
* Kabel&lt;br /&gt;
* Anleitung und CD mit Dokumentation.&lt;br /&gt;
&lt;br /&gt;
====Blockschaltbild====&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_Sensor_Board_BSP.png|RP6 Sensor Board Blockschaltbild]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Technische Daten===&lt;br /&gt;
{|  {{Blauetabelle}} &lt;br /&gt;
|'''Mikrocontroller:'''&lt;br /&gt;
|kein&lt;br /&gt;
|-&lt;br /&gt;
|'''Speicher:'''&lt;br /&gt;
|kein&amp;lt;br/&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|'''Programmierung:'''&lt;br /&gt;
|C++ (GCC, u.a.) über externes µC-System&lt;br /&gt;
|-&lt;br /&gt;
|'''Vorhandene Sensoren:'''&lt;br /&gt;
|Temperatur, 3D Magnetfeld (Kompass), 3D Beschleunigung, Yaw-Gyro&amp;lt;br/&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|'''Vorhandene Aktoren:'''&lt;br /&gt;
|LED Controller (2 LEDs on board, 5 freie LED Ports), Status LED,&amp;lt;br/&amp;gt;Button, Servo (PWM) Controller für 8 Servos und 8 PWM-Kanäle,&amp;lt;br/&amp;gt;Real Time Clock (RTC), 2 freie I/O Ports&lt;br /&gt;
|-&lt;br /&gt;
|'''Abmessungen:'''&lt;br /&gt;
|(L &amp;amp;times; B &amp;amp;times; H) 112 &amp;amp;times; 90 &amp;amp;times; 19 mm&amp;lt;br/&amp;gt;(B + 5 mm durch Scheinwerfer vorn)&lt;br /&gt;
|-&lt;br /&gt;
|'''Ausführung:'''&lt;br /&gt;
|Fertig aufgebautes Erweiterungsmodul&lt;br /&gt;
|-&lt;br /&gt;
|'''Stromversorgung:'''&lt;br /&gt;
|6 AA NiMH Akkus (über die RP6v2 Base)&amp;lt;br/&amp;gt;und optionaler Zusatzakku 7,2..10 V für Servo Power&lt;br /&gt;
|-&lt;br /&gt;
|'''Hersteller:'''&lt;br /&gt;
|Arexx Niederlande&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Umbau-Optionen===&lt;br /&gt;
Hier soll beschrieben werden, welche Umbau-Optionen es für das RP6 Sensor Board gibt. Im Text gibt es Verweise auf den Schaltplan des RP6 Sensor Boards (RP6_Sensor_Board_Rev2_Schema.pdf) in der Form: (SP2: Bauteil). Dies bedeutet, dass man das Bauteil auf Blatt 2 des Schaltplans finden kann. Beispielhaft sind im folgenden Text Bestell-Nummern der Firma [http://www.conrad.de/ce/ CONRAD] genannt. Natürlich kann man die Teile auch bei anderen Versendern beziehen.&lt;br /&gt;
&lt;br /&gt;
====USRBUS- und XBUS-Wannenstecker====&lt;br /&gt;
Der zweite Wannenstecker für den XBUS (SP3: K14) und USRBUS (SP3: K16) kann nachbestückt werden.&lt;br /&gt;
Man braucht dazu: &lt;br /&gt;
* 2 Wannenstecker 2x7-polig gerade RM 2,54mm (CONRAD [http://www.conrad.de/ce/de/product/741687/Stiftleiste-Print-Montage-gerade-Rastermass-254-mm-Pole-2-x-7-10120556-BKL-Electronic-Inhalt-1-St 741687])&lt;br /&gt;
Die Wannenstecker lötet man auf die eingezeichneten Positionen.&lt;br /&gt;
&lt;br /&gt;
'''USRBUS-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''USRBUS''' || '''Sensor Board-Funktion''' || '''Verwendung''' || '''I/O'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Y1 || &amp;quot;ADC0&amp;quot; || SHARP vorn || I&lt;br /&gt;
|-&lt;br /&gt;
| 2 || Y2 || &amp;quot;ADC1&amp;quot; || Yaw-Gyro || I&lt;br /&gt;
|-&lt;br /&gt;
| 3 || Y3 || PWR || Power für&amp;lt;br/&amp;gt;SHARPs, CAM_IF,&amp;lt;br/&amp;gt;I2C-MODULE || O&lt;br /&gt;
|-&lt;br /&gt;
| 4 || Y4 || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 5 || Y5 || &amp;quot;ADC4&amp;quot; || SHARP hinten ||I&lt;br /&gt;
|-&lt;br /&gt;
| 6..14 || Y6..Y14 || || keine ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
'''XBUS-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''XBUS''' || '''M256-Port''' ||'''M256-Funktion''' || '''Sensor Board-Funktion''' || '''Jumper''' || '''Verwendung''' || '''I/O'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || GND || || GND || GND || || ||&lt;br /&gt;
|-&lt;br /&gt;
| 2 || GND || || GND || GND || || ||&lt;br /&gt;
|-&lt;br /&gt;
| 3 || VDD || || VDD|| VDD_1 || || VDD +5V ||&lt;br /&gt;
|-&lt;br /&gt;
| 4 || +UB || || +UB || VSS_1 || || CAM_IF Power ||&lt;br /&gt;
|-&lt;br /&gt;
| 5 || VDD || || VDD || VDD_1 || || VDD +5V ||&lt;br /&gt;
|-&lt;br /&gt;
| 6 || +UB || || +UB || VSS_1 || || CAM_IF Power ||&lt;br /&gt;
|-&lt;br /&gt;
| 7 || INTU || PJ4 || PCINT13 || INTU || || keine || I&lt;br /&gt;
|-&lt;br /&gt;
| 8 || INT1 || PJ3 || PCINT12 || INT1 || 3 || LSM303DLHC: INT1 || I&lt;br /&gt;
|-&lt;br /&gt;
| 9 || INT3 || PJ5 || PCINT14 || INT3 || 2&amp;lt;br/&amp;gt;5 || DS1339: SQW/INT_N&amp;lt;br/&amp;gt;LSM303DLHC: INT2 || I&amp;lt;br/&amp;gt;I&lt;br /&gt;
|-&lt;br /&gt;
| 10 || SCL || PD0 || SCL || SCL_M || || I2C-Bus || O&lt;br /&gt;
|-&lt;br /&gt;
| 11 || INT2 || PJ6 || PCINT15 || INT2 || 4 || MAX7311: INT_N || I&lt;br /&gt;
|-&lt;br /&gt;
| 12 || SDA || PD1 || SDA || SDA_M || || I2C-Bus || I/O&lt;br /&gt;
|-&lt;br /&gt;
| 13 || MRESET || || MRESET || MRESET || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 14 || GND || || GND || GND || || ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====I/O-Patchfield_1====&lt;br /&gt;
Dieses 2x 5-polige &amp;quot;Patchfield_1&amp;quot; (SP3: K8), beschriftet mit &amp;quot;I/O&amp;quot; liegt neben dem Wannenstecker I/O und weist dieselbe Belegung auf. Möchte man auf dem Sensor Board Verbindungen über den Wannenstecker I/O zu einer angeschlossenen Microprozessor-Platine herstellen, dann kann man auf das &amp;quot;Patchfield_1&amp;quot; eine Stiftleiste löten.&lt;br /&gt;
Man braucht dazu: &lt;br /&gt;
* 2-reihige Stiftleiste RM 2,54mm (z.B. 2x40-polig [http://www.conrad.de/ce/de/product/741306/Doppelreihige-Stiftleiste-RM-254-gerade-Pole-2-x-40-10120173-BKL-Electronic-Inhalt-1-St 741306]) &lt;br /&gt;
Man trennt von der 2-reihigen Stiftleiste 2x5 Kontakte ab und lötet sie auf die Lötpunkte &amp;quot;I/O&amp;quot;. Zuvor muss man u.U. Lötzinnreste aus den Lötpunkten mit Entlötlitze bzw. Entlötsaugpumpe entfernen.&lt;br /&gt;
&lt;br /&gt;
'''Stecker I/O an M256 IO_PWM/T0/T1:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''M256-Port''' ||'''M256-Funktion''' || '''Sensor Board-Funktion''' || '''Verwendung''' || '''I/O'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || PD4 || ICP1 || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 2 || || GND || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 3 || PD6 || T1 || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 4 || PB7 || OC0A || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 5 || PG5 || OC0B || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 6 || PD7 || T0 || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 7 || PB5 || OC1A || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 8 || PK5 || ADC13 || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 9 || PB6 || OC1B || &amp;quot;PD5&amp;quot; || I2C Bus Buffer Enable || O&lt;br /&gt;
|-&lt;br /&gt;
| 10 || || VDD || || keine ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====ADC-Patchfield_2====&lt;br /&gt;
Dieses 2x 5-polige &amp;quot;Patchfield_2&amp;quot; (SP3: K9), beschriftet mit &amp;quot;ADC&amp;quot; liegt neben dem Wannenstecker ADC und weist dieselbe Belegung auf. Möchte man auf dem Sensor Board Verbindungen über den Wannenstecker ADC zu einer angeschlossenen Microprozessor-Platine herstellen, dann kann man auf das &amp;quot;Patchfield_2&amp;quot; eine Stiftleiste löten.&lt;br /&gt;
Man braucht dazu: &lt;br /&gt;
* 2-reihige Stiftleiste RM 2,54mm (z.B. 2x40-polig [http://www.conrad.de/ce/de/product/741306/Doppelreihige-Stiftleiste-RM-254-gerade-Pole-2-x-40-10120173-BKL-Electronic-Inhalt-1-St 741306]) &lt;br /&gt;
Man trennt von der 2-reihigen Stiftleiste 2x5 Kontakte ab und lötet sie auf die Lötpunkte &amp;quot;ADC&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
'''Stecker ADC an M256 ADC_IO2/CMP:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''M256-Port''' ||'''M256-Funktion''' || '''Sensor Board-Funktion''' || '''Jumper''' || '''Verwendung''' || '''I/O'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || PK0 || ADC8 || || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 2 || || GND || || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 3 || PK1 || ADC9 || &amp;quot;ADC4&amp;quot; || 6 || SHARP hinten || I&lt;br /&gt;
|-&lt;br /&gt;
| 4 || PE3 || OC3A/AIN1 || || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 5 || PK2 || ADC10 || || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 6 || || GND || || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 7 || PK3 || ADC11 || || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 8 || PE2 || XCK0/AIN0 || || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 9 || PK4 || ADC12 || || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 10 || || VDD || || || keine ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Anschluss-Optionen===&lt;br /&gt;
Hier soll beschrieben werden, welche Anschluss-Optionen es für das RP6 Sensor Board gibt. In erster Linie geht es dabei um die Belegung der vorhandenen Stecker bzw. Stiftleisten.&lt;br /&gt;
&lt;br /&gt;
Allgemein kann man Anschlüsse an Stiftleisten mit entsprechenden Steckbuchsen erreichen. Solche Steckbuchsen sind z.B. bei ELV erhältlich:&lt;br /&gt;
* Steckbuchse, 2-polig, RM 2,54mm ([http://www.elv.de/steckbuchse-2-polig.html ELV 68-016635])&lt;br /&gt;
* Steckbuchse, 3-polig, RM 2,54mm ([http://www.elv.de/steckbuchse-3-polig.html ELV 68-022503])&lt;br /&gt;
* Steckbuchse, 5-polig, RM 2,54mm ([http://www.elv.de/steckbuchse-5-polig.html ELV 68-023073])&lt;br /&gt;
Die Crimpkontakte dieser Steckbuchse werden an Litzen angequetscht (oder angelötet) und zum entsprechenden Sensor bzw. Aktor geführt. &lt;br /&gt;
&lt;br /&gt;
====I2C-MODULE====&lt;br /&gt;
Der I2C-MODULE Anschluss (SP1: M1) auf dem Sensor Board besteht aus einer 9-poligen Präzisions-Buchsenleiste RM 2,54mm (z.B. [http://www.conrad.de/ce/de/product/741360/Praezisions-Buchsenleiste-RM-254-gerade-Pole-1-x-20-10120832-BKL-Electronic-Inhalt-1-St 741360]). Wenn man eigene I2C-Module hier anschliessen will, braucht man zur Kontaktierung:&lt;br /&gt;
* Präzisions-Stiftleiste, 9-polig, RM 2,54mm (z.B. [http://www.conrad.de/ce/de/product/741307/Praezisions-Stiftleiste-RM-254-gerade-Pole-1-x-20-10120536-BKL-Electronic-Inhalt-1-St 741307])&lt;br /&gt;
&lt;br /&gt;
'''I2C-MODULE-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''Sensor Board&amp;lt;br/&amp;gt;-Funktion (M1)''' || '''Verwendung''' || '''I/O''' |||| [[RP6_Sensor_Board_und_Xtra_Module#I2C_GPS_Empf.C3.A4nger_JM3-GPS|'''I2C GPS Empfänger]]&amp;lt;br/&amp;gt;-Funktion (K1)''' ||&lt;br /&gt;
[[RP6_Sensor_Board_und_Xtra_Module#BHT_Modul_JM3-BHT31|'''BHT Modul]]&amp;lt;br/&amp;gt;-Funktion (K1)'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || VCC || +5V || |||| VCC_1 || VDD&lt;br /&gt;
|-&lt;br /&gt;
| 2 || SCLOUT || Buffered I2C-Bus || O |||| SCL/SCK || SCL&lt;br /&gt;
|-&lt;br /&gt;
| 3 || SDAOUT || Buffered I2C-Bus || I/O |||| SDA/MOSI || SDA&lt;br /&gt;
|-&lt;br /&gt;
| 4 || NC || keine || |||| ||&lt;br /&gt;
|-&lt;br /&gt;
| 5 || I/O1 || Status LED || O |||| ||&lt;br /&gt;
|-&lt;br /&gt;
| 6 || I/O2 || Taster || I |||| ||&lt;br /&gt;
|-&lt;br /&gt;
| 7 || NC || keine || |||| ||&lt;br /&gt;
|-&lt;br /&gt;
| 8 || GND || GND (geschaltet!) || |||| GND || GND&lt;br /&gt;
|-&lt;br /&gt;
| 9 || GND || GND (geschaltet!) || |||| GND || GND&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====CAM_IF====&lt;br /&gt;
Der CAM_IF Anschluss (SP1: K28) ist eine 2x 3-polige Stiftleiste mit der folgenden Belegung:&lt;br /&gt;
&lt;br /&gt;
'''CAM_IF-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''Sensor Board&amp;lt;br/&amp;gt;-Funktion (K28)''' || '''Verwendung''' || '''I/O'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || GND || GND (geschaltet!) ||&lt;br /&gt;
|-&lt;br /&gt;
| 2 || VSS_1 || +7,2..10V (RP6: +UB) ||&lt;br /&gt;
|-&lt;br /&gt;
| 3 || SCLOUT || Buffered I2C-Bus || O&lt;br /&gt;
|-&lt;br /&gt;
| 4 || SDAOUT || Buffered I2C-Bus || I/O&lt;br /&gt;
|-&lt;br /&gt;
| 5 || SCL_M || I2C-Bus || O&lt;br /&gt;
|-&lt;br /&gt;
| 6 || SDA_M || I2C-Bus || I/O&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====IO_EXT====&lt;br /&gt;
Der IO_EXT Anschluss (SP1: K19) ist eine 2x 2-polige Stiftleiste mit der folgenden Belegung:&lt;br /&gt;
&lt;br /&gt;
'''IO_EXT-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''Sensor Board&amp;lt;br/&amp;gt;-Funktion (K19)''' || '''Verwendung''' || '''I/O'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || MAX7311: I/O1.2 || freier I/O Port || I/O&lt;br /&gt;
|-&lt;br /&gt;
| 2 || GND || ||&lt;br /&gt;
|-&lt;br /&gt;
| 3 || MAX7311: I/O1.1 || freier I/O Port || I/O&lt;br /&gt;
|-&lt;br /&gt;
| 4 || GND || ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====PWM_OUT====&lt;br /&gt;
Der PWM_OUT Anschluss (SP5: K12) ist eine 2x 4-polige Stiftleiste mit der folgenden Belegung:&lt;br /&gt;
&lt;br /&gt;
'''PWM_OUT-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''Sensor Board&amp;lt;br/&amp;gt;-Funktion (K12)''' || '''Verwendung''' || '''I/O'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || PCA9685: PWM0 || freier PWM Port || O&lt;br /&gt;
|-&lt;br /&gt;
| 2 || PCA9685: PWM1 || freier PWM Port || O&lt;br /&gt;
|-&lt;br /&gt;
| 3 || PCA9685: PWM2 || freier PWM Port || O&lt;br /&gt;
|-&lt;br /&gt;
| 4 || PCA9685: PWM3 || freier PWM Port || O&lt;br /&gt;
|-&lt;br /&gt;
| 5 || PCA9685: PWM4 || freier PWM Port || O&lt;br /&gt;
|-&lt;br /&gt;
| 6 || PCA9685: PWM5 || freier PWM Port || O&lt;br /&gt;
|-&lt;br /&gt;
| 7 || PCA9685: PWM6 || freier PWM Port || O&lt;br /&gt;
|-&lt;br /&gt;
| 8 || PCA9685: PWM7 || freier PWM Port || O&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====TP1====&lt;br /&gt;
Am Testpunkt TP1 (SP4: TP1) kann man das Signal SQW/INT_N der RTC (DS1339) prüfen/messen.&lt;br /&gt;
&lt;br /&gt;
====LEDs====&lt;br /&gt;
=====Rücklichter=====&lt;br /&gt;
Der Rücklichter Anschluss (SP1: K10) ist eine 2-polige Stiftleiste mit der folgenden Belegung:&lt;br /&gt;
&lt;br /&gt;
'''Rücklichter-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''Sensor Board&amp;lt;br/&amp;gt;-Funktion (K10)''' || '''Verwendung''' || '''I/O'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || TCA6507: P3 || Rücklicht rechts || O&lt;br /&gt;
|-&lt;br /&gt;
| 2 || TCA6507: P4 || Rücklicht links || O&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=====Display-Hintergrundbeleuchtung=====&lt;br /&gt;
Der Display-Hintergrundbeleuchtung Anschluss (SP1: K7) ist eine 2-polige Stiftleiste mit der folgenden Belegung:&lt;br /&gt;
&lt;br /&gt;
'''Display-Hintergrundbeleuchtung-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''Sensor Board&amp;lt;br/&amp;gt;-Funktion (K7)''' || '''Verwendung''' || '''I/O'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || TCA6507: P0 || Display-Hintergrundbeleuchtung || O&lt;br /&gt;
|-&lt;br /&gt;
| 2 || VDD_1 || +5V ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=====Freie Ausgänge=====&lt;br /&gt;
Der freie Ausgang 1 Anschluss (SP1: K4) ist eine 2-polige Stiftleiste mit der folgenden Belegung:&lt;br /&gt;
&lt;br /&gt;
'''Freier Ausgang 1-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''Sensor Board&amp;lt;br/&amp;gt;-Funktion (K4)''' || '''Verwendung''' || '''I/O'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || TCA6507: P1 || freier LED Port || O&lt;br /&gt;
|-&lt;br /&gt;
| 2 || VDD_1 || +5V ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Der freie Ausgang 2 Anschluss (SP1: K2) ist eine 2-polige Stiftleiste mit der folgenden Belegung:&lt;br /&gt;
&lt;br /&gt;
'''Freier Ausgang 2-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''Sensor Board&amp;lt;br/&amp;gt;-Funktion (K2)''' || '''Verwendung''' || '''I/O'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || TCA6507: P2 || freier LED Port || O&lt;br /&gt;
|-&lt;br /&gt;
| 2 || VDD_1 || +5V ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====SHARP Sensoren====&lt;br /&gt;
Das RP6 Sensor Board verfügt über zwei Stecker SHARP_F (SP1: K5) und SHARP_R (SP1: K3) zum Anschluß von analogen SHARP Infrarot-Distanz-Sensoren. Folgende SHARP Sensoren sind anschließbar:&lt;br /&gt;
* 1. SHARP Distanz-Sensor GP2Y0A41SK0F ([http://www.conrad.de/ce/de/product/504596/Distanz-Sensor-GP2Y0A41SK0F-Sharp-GP2Y0A41SK0F-Messbereiche-Erfassungsbereich-4-30-cm-5-VDC 504596]), Messbereich 4..30cm&lt;br /&gt;
* 2. SHARP Distanz-Sensor GP2Y0A21YK0F ([http://www.conrad.de/ce/de/product/504591/Distanz-Sensor-GP2Y0A21YK0F-Sharp-GP2Y0A21YK0F-Messbereiche-Erfassungsbereich-10-80-cm-5-VDC 504591]), Messbereich 10..80cm&lt;br /&gt;
* 3. SHARP Distanz-Sensor GP2Y0A02YK ([http://www.conrad.de/ce/de/product/185364/Distanz-Sensor-GP-2-Y0A-02-YK-Sharp-GP-2-Y0A-02-YK-Messbereiche-Erfassungsbereich-20-150-cm-5-VDC 185364]), Messbereich 20..150cm&lt;br /&gt;
* 4. SHARP Distanz-Sensor GP2Y0A710K0F ([http://www.conrad.de/ce/de/product/504597/Distanz-Sensor-GP2Y0A710K0F-Sharp-GP2Y0A710K0F-Messbereiche-Erfassungsbereich-100-550-cm-5-VDC 504597]), Messbereich 100..550cm&lt;br /&gt;
''Die Auswahl der geeigneten SHARP Sensoren hängt von der gewünschten Funktion ab: Zur Erkundung großer Räume eignet sich insbesondere der Typ 4 mit einer hohen Reichweite von 5,5m. Er ist aber ungeeignet, die Distanz von Objekten zu erkennen, die sich näher als 1m vor dem Sensor befinden. Ein guter Kompromiss zwischen Nahbereichsmessung und &amp;quot;Fernsicht&amp;quot; sind die Typen 2 (10..80cm) und 3 (20..150cm). Will man den Distanz-Sensor vor allem zur Vermeidung eins Sturzes von einer Treppe (Tiefenerkennung) oder nur zur Erkennung von Hindernissen direkt vor dem Roboter (Kollisionserkennung) benutzen, dann eignet sich insbesondere für den vorderen Sensor (SHARP_F) der Typ 1, da er im Nahbereich von 4 bis 30cm messen kann.''&lt;br /&gt;
&lt;br /&gt;
Für die Verbindung zwischen den beiden 3-poligen JST XH Steckern (K3, 5) auf dem Sensor Board und den SHARP-Sensoren braucht man auf der Sensor Board Seite folgende Stecker-/buchsenteile:&lt;br /&gt;
* 2x JST XH Gehäuse, 3-polig, RM 2,5mm ([http://www.conrad.de/ce/de/product/740583/Gehaeuse-RM-25-mm-Serie-XH-Rastermass-25-mm-Pole-3-Nennstrom-3-A-XHP-3-JST-Inhalt-1-St 740583])&lt;br /&gt;
* 6x JST XH Crimpkontakt f. RM 2,5mm ([http://www.conrad.de/ce/de/product/741112/Crimpkontakt-fuer-RM-25-mm-Serie-XH-Rastermass-25-mm-BXH-001T-P06-JST-Inhalt-1-St 741112])&lt;br /&gt;
Die Crimpkontakte dieser Steckbuchse werden an die meist 3-adrige Litze des Sensors angequetscht (oder angelötet). Zur Belegung des Sensor Anschlusses siehe das jeweilige Datenblatt!&lt;br /&gt;
&lt;br /&gt;
=====Vorn=====&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_Sensor_Board_SHARP_F.JPG|RP6 Sensor Board SHARP Sensor vorn|thumb]]&lt;br /&gt;
&lt;br /&gt;
Der vordere SHARP Sensor kann auch mechanisch am Sensor Board befestigt werden. Dazu gibt es an der Vorderkante der Platine zwei Befestigungslöcher.&lt;br /&gt;
&lt;br /&gt;
Das Bild rechts zeigt den SHARP Distanzsensor GP2Y0A02YK montiert vorn auf dem Sensor Board mit zwei M3 Gelenkbolzen ([http://www.conrad.de/ce/de/product/521043/Gelenkbolzen-1-x-Aussengewinde1-x-Innengewinde-Messing-vernickelt-Schluesselweite-55-mm/ 521043]) und passenden Schrauben/Muttern.&lt;br /&gt;
&lt;br /&gt;
'''Vorn-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''RP6v2-Port''' ||'''RP6v2-Funktion''' || '''Sensor Board&amp;lt;br/&amp;gt;-Funktion (K5)''' || '''Verwendung''' || '''I/O''' |||| '''SHARP Sensor&amp;lt;br/&amp;gt;-Funktion''' &lt;br /&gt;
|-&lt;br /&gt;
| 1 || PA0 || ADC0 || &amp;quot;ADC0&amp;quot; || SHARP vorn || I |||| Vo&lt;br /&gt;
|-&lt;br /&gt;
| 2 || || || VDD_1 || +5V || |||| Vcc&lt;br /&gt;
|-&lt;br /&gt;
| 3 || || || GND || GND (geschaltet!) || |||| GND&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=====Hinten=====&lt;br /&gt;
Der hintere SHARP Sensor kann z.B. an der Rückseite des RP6v2 Fahrgestells befestigt werden.&lt;br /&gt;
&lt;br /&gt;
'''Hinten-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''M256-Port''' ||'''M256-Funktion''' || '''Sensor Board&amp;lt;br/&amp;gt;-Funktion (K3)''' || '''Verwendung''' || '''I/O''' |||| '''SHARP Sensor&amp;lt;br/&amp;gt;-Funktion''' &lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| 1 || PK1 || ADC9 || &amp;quot;ADC4&amp;quot; || SHARP hinten || I |||| Vo&lt;br /&gt;
|-&lt;br /&gt;
| 2 || || || VDD_1 || +5V || |||| Vcc&lt;br /&gt;
|-&lt;br /&gt;
| 3 || || || GND || GND (geschaltet!) || |||| GND&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Servos====&lt;br /&gt;
=====Power=====&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_Sensor_Board_Servo-PWR.jpg|RP6 Sensor Board Servo-PWR Stecker|thumb]]&lt;br /&gt;
&lt;br /&gt;
An den SERVO_PWR Stecker (SP5: K1) muss ein Akku zur Stromversorgung der mit dem Sensor Board verbundenen Servos angeschlossen werden. Der Stecker hat folgende Belegung:&lt;br /&gt;
 &lt;br /&gt;
'''SERVO_PWR-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''Sensor Board&amp;lt;br/&amp;gt;-Funktion (K1)''' || '''Verwendung'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || GND_POWER || Servo Power GND&lt;br /&gt;
|-&lt;br /&gt;
| 2 || VSS_POWER || Servo Power Eingang +7,2..10V&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Der Akku zur Versorgung der Servos muss eine Nennspannung von 7,2..10V aufweisen. Der Schaltregler auf dem Sensor Board kann bei einer 5,0V Servo-Spannung Ströme bis 3,0A (Spitzen bis 5,0A) liefern. '''Die Polung des Akkus darf am Stecker SERVO_PWR nicht vertauscht werden.''' Siehe den oberen Teil der nebenstehenden Abbildung! Ratsam ist es, eine Sicherung 3,15A in die Plusleitung zwischen Akku und SERVO_PWR Stecker zu legen.&lt;br /&gt;
&lt;br /&gt;
Für die Verbindung zwischen dem 2-poligen JST XH Stecker (SERVO_PWR, K1) auf dem Sensor Board und dem Akku braucht man auf der Sensor Board Seite folgende Stecker-/buchsenteile:&lt;br /&gt;
* JST XH Gehäuse, 2-polig, RM 2,5mm ([http://www.conrad.de/ce/de/product/740549/Gehaeuse-RM-25-mm-Serie-XH-Rastermass-25-mm-Pole-2-Nennstrom-3-A-XHP-2-JST-Inhalt-1-St 740549])&lt;br /&gt;
* 2x JST XH Crimpkontakt f. RM 2,5mm ([http://www.conrad.de/ce/de/product/741112/Crimpkontakt-fuer-RM-25-mm-Serie-XH-Rastermass-25-mm-BXH-001T-P06-JST-Inhalt-1-St 741112])&lt;br /&gt;
Die Crimpkontakte dieser Steckbuchse werden an die 2-adrige Litze zum Akku angequetscht (oder angelötet).&lt;br /&gt;
&lt;br /&gt;
Wenn man keinen separaten Akku zur Versorgung der Servos nehmen will, kann man auch +UB der RP6v2 Base dafür nutzen. An +UB liegt die Akkuspannung der Base (Nennspannung 7,2V) über eine Sicherung F1 3,15A (RP6v2) bzw. 2,5A (RP6) auf dem Mainboard an. +UB kann man z.B. am [[RP6#EXT_Anschlu.C3.9F|EXT Anschluß der Base]] entnehmen. Die nebenstehende Abbildung zeigt im unteren Teil, an welchen Pins man dort +UB kontaktieren kann!&lt;br /&gt;
&lt;br /&gt;
Dabei ist zu beachten, dass die Sicherung F1 auf dem RP6(v2) Mainboard den nutzbaren Strom für die Servos deutlich begrenzt: Durch diese Sicherung fließt ja nicht nur der Servo-Strom, sondern auch der Strom für den RP6 und alle darauf montierten Zusatzplatinen. Wenn der RP6 also herumfährt und z.B. noch die IRCOMM-Sendedioden nutzt, bleibt kaum noch Stromreserve für die Servos auf dem Sensor Board übrig.&lt;br /&gt;
'''Das bedeutet: Man sollte unbedingt einen separaten Akku für die Servos auf dem Sensor Board benutzen!'''&lt;br /&gt;
&lt;br /&gt;
======SERVO_PWR-EXT Verbindung======&lt;br /&gt;
Für die Verbindung zwischen dem 2-poligen JST XH Stecker (SERVO_PWR, K1) auf dem Sensor Board und dem 8-poligen JST XH Stecker (EXT) auf dem RP6v2 Mainboard braucht man folgende Stecker-/buchsenteile:&lt;br /&gt;
* JST XH Gehäuse, 2-polig, RM 2,5mm ([http://www.conrad.de/ce/de/product/740549/Gehaeuse-RM-25-mm-Serie-XH-Rastermass-25-mm-Pole-2-Nennstrom-3-A-XHP-2-JST-Inhalt-1-St 740549])&lt;br /&gt;
* JST XH Gehäuse, 8-polig, RM 2,5mm ([http://www.conrad.de/ce/de/product/740928/Gehaeuse-RM-25-mm-Serie-XH-Rastermass-25-mm-Pole-8-Nennstrom-3-A-XHP-8-JST-Inhalt-1-St 740928])&lt;br /&gt;
* 10x JST XH Crimpkontakt f. RM 2,5mm ([http://www.conrad.de/ce/de/product/741112/Crimpkontakt-fuer-RM-25-mm-Serie-XH-Rastermass-25-mm-BXH-001T-P06-JST-Inhalt-1-St 741112])&lt;br /&gt;
Mit einer 2-adrigen Litze, die beidseits mit den Crimpkontakten verquetscht (oder verlötet) wird, verbindet man dann den SERVO_PWR Stecker mit dem EXT Stecker, wie in der Abbildung oben gezeigt. ''Achtung: Plus (+) und Minus (-) nicht vertauschen!''&lt;br /&gt;
 Ein passendes Kabel soll zukünftig (*) mitgeliefert werden.&lt;br /&gt;
&lt;br /&gt;
Auf dem RP6 Mainboard ist der 8-polige EXT Stecker noch nicht bestückt. Wenn man ihn nachrüsten will, muss man noch bestellen:&lt;br /&gt;
* JST XH Stiftleiste gerade, 8-polig, RM 2,5mm ([http://www.conrad.de/ce/de/product/740105/Stiftleiste-gerade-RM-25-mm-Serie-XH-Rastermass-25-mm-Pole-8-Nennstrom-3-A-B8B-XH-A-LFSN-JST-Inhalt-1-St 740105])&lt;br /&gt;
Die Stiftleiste wird auf das RP6 Mainboard gelötet, dabei weisen die beiden Einkerbungen an einer Längsseite der Stiftleiste nach hinten zum Rand des Mainboards.&lt;br /&gt;
 Auch diese Stiftleiste soll zukünftig (*) zum Lieferumfang gehören.&lt;br /&gt;
'''Zu *)''' Meinem RP6 Sensor Board (bestellt am 1.3.2014) lag das konfektionierte Kabel und die Stiftleiste noch nicht bei!&lt;br /&gt;
&lt;br /&gt;
=====Stecker=====&lt;br /&gt;
An die acht 3-poligen Stiftleisten SERVO_1 bis SERVO_8 (SP5: K6, 11, 29..34) können Servos angeschlossen werden. Direkt aufstecken kann man Servo-Steckbuchsen mit der Belegung von CONRAD, Graupner/JR und Robbe/Futaba (Versorgungsspannung Plus am mittleren Pin). Auf der Sensor Board Platine kann man den Pin 3 (Servo Power GND) der 3-poligen Stiftleisten daran erkennen, dass er näher zum rechten Platinenrand (Seite mit dem XBUS Stecker) angeordnet ist als der zugehörige Pin 1 (Servo Signal).&lt;br /&gt;
&lt;br /&gt;
Wenn Servos mit nicht passender Steckbuchse angeschlossen werden sollen, dann braucht man auf der Sensor Board Seite folgende Stecker-/buchsenteile für jedes Servo:&lt;br /&gt;
* Steckbuchse, 3-polig, RM 2,54mm ([http://www.elv.de/steckbuchse-3-polig.html ELV 68-022503])&lt;br /&gt;
Die Crimpkontakte dieser Steckbuchse werden an die 3-adrige Litze des Servos angequetscht (oder angelötet). &lt;br /&gt;
&lt;br /&gt;
'''SERVO_1..8-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''Sensor Board&amp;lt;br/&amp;gt;-Funktion (K6,11,29..34)''' || '''Verwendung''' || '''I/O''' |||| '''Servo-&amp;lt;br/&amp;gt;Kabelfarben'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || PCA9685: PWM15..8 || Servo Signal || O |||| Weiß, Orange&lt;br /&gt;
|-&lt;br /&gt;
| 2 || Servo_PWR || Servo Power +5V (geschaltet!) || |||| Rot&lt;br /&gt;
|-&lt;br /&gt;
| 3 || GND_POWER || Servo Power GND || |||| Schwarz, Braun&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Roboterarm RA2-HOBBY====&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_Sensor_Board_RA2-MINI.JPG|RP6 Sensor Board mit Roboterarm RA2-MINI|thumb]]&lt;br /&gt;
&lt;br /&gt;
In der Anleitung zum RP6 Sensor Board ist der Arexx Roboterarm RA2-HOBBY bzw. RA2-MINI [http://www.conrad.de/ce/de/product/191534/Arexx-Mini-Roboterarm-RA2-MINI (191534)] abgebildet. Er ist dort ohne Grundgestell und Controller-Platine auf dem Sensor Board befestigt.&lt;br /&gt;
Das Sensor Board eignet sich sehr gut zur Ansteuerung der 6 Servos des Roboterarms.&lt;br /&gt;
&lt;br /&gt;
Zur Montage des RA2-MINI auf dem Sensor Board geht man so vor:&lt;br /&gt;
* Lösen der 4 Rundkopfschrauben M3x6, die die Servobodenplatte mit den Abstandbolzen M3x30 auf der Controller-Platine verbinden (siehe Anleitung zum RA2-MINI, Seite 19!)&lt;br /&gt;
* Lösen der Servobodenplatte vom Bodenservo (siehe Anleitung zum RA2-MINI, Seite 8!)&lt;br /&gt;
* Bohren der Befestigungslöcher in die Servobodenplatte:&lt;br /&gt;
** Rechts-Links Lochabstand 4,75cm, Vorn-Hinten Lochabstand 4,1cm&lt;br /&gt;
** Ungefähre Lage der Löcher siehe Abbildung in der Anleitung zum Sensor Board, Seite 4!&lt;br /&gt;
** Markierung der Bohrlöcher auf der Rückseite der Servobodenplatte:&lt;br /&gt;
*** 1. Mit einer Hilfslinie die Hinterkante des Servoausschnitts (das ist die kürzere Kante, die näher am Rand der Bodenplatte liegt!) nach beiden Seiten verlängern&lt;br /&gt;
*** 2. Eine 2. Hilfslinie parallel zur ersten im Abstand von 1,4cm zur Mitte der Servobodenplatte hin einzeichnen&lt;br /&gt;
*** 3. Auf dieser Linie jetzt die beiden hinteren Bohrlöcher symmetrisch im Abstand von 4,75cm markieren&lt;br /&gt;
*** 4. Für die vorderen Bohrlöcher eine 3. Hilfslinie im Abstand von 4,1cm parallel zur 2. Linie einzeichnen&lt;br /&gt;
*** 5. Auf dieser Linie die beiden vorderen Bohrlöcher symmetrisch im Abstand von 4,75cm markieren&lt;br /&gt;
*** 6. Kontrolle: Die 4 markierten Bohrlochpositionen bilden ein Rechteck mit 4,1cm seitlicher und 4,75cm vorderer/hinterer Kantenlänge&lt;br /&gt;
** Bohren der 4 Löcher (D = 3,2mm) in die Servobodenplatte&lt;br /&gt;
* Befestigen des Bodenservos auf der Servobodenplatte (siehe Anleitung zum RA2-MINI, Seite 8!)&lt;br /&gt;
* Anbringen des Roboterarms auf dem Sensor Board mit 4 Abstandbolzen M3 (L = 30..50mm) und passenden Schrauben/Muttern&lt;br /&gt;
&lt;br /&gt;
Die Servo-Steckbuchsen werden dann ''in der selben Reihenfolge (S1..S6) wie vorher auf der Controller-Platine des Roboterarms'' auf die Stiftleisten SERVO_1 bis SERVO_6 des Sensor Boards gesteckt.&lt;br /&gt;
'''Man sollte unbedingt einen separaten Akku für die Servos auf dem Sensor Board benutzen!'''&lt;br /&gt;
&lt;br /&gt;
====Grafik-Display====&lt;br /&gt;
Ob es mal ein Grafik-Display für das RP6 Sensor Board geben wird, ist ''pure Spekulation''. Allerdings gibt es zwei Hinweise darauf, dass eine solche Hardware-Ergänzung kommen könnte:&lt;br /&gt;
* 1. Der vorbereitete Anschluss für eine [[RP6_Sensor_Board_und_Xtra_Module#Display-Hintergrundbeleuchtung|Display-Hintergrundbeleuchtung]]&lt;br /&gt;
* 2. Die 4 Befestigungslöcher in der Mitte des Sensor Boards&lt;br /&gt;
Wir werden sehen ...&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==RP6 Xtra Module==&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_Xtra_module.JPG|RP6 Xtra module|right|500px]]&lt;br /&gt;
&lt;br /&gt;
Von den '''AREXX RP6 Xtra Modulen''' sind bei [http://www.conrad.de/ce/ CONRAD] für den RP6v2 erhältlich:&lt;br /&gt;
* Arexx [[RP6_Sensor_Board_und_Xtra_Module#I2C_GPS_Empf.C3.A4nger_JM3-GPS|I2C GPS Empfänger JM3-GPS]] ([http://www.conrad.de/ce/de/product/1082385/Arexx-IC-GPS-Empfaenger-JM3-GPS 1082385] AUSVERKAUFT!)&lt;br /&gt;
* Arexx [[RP6_Sensor_Board_und_Xtra_Module#Gyro_Modul_JM3-GYRO|Gyro Modul JM3-GYRO]] ([http://www.conrad.de/ce/de/product/1082386/Arexx-Gyro-Modul-JM3-GYRO 1082386] AUSVERKAUFT!)&lt;br /&gt;
* Arexx [[RP6_Sensor_Board_und_Xtra_Module#3D_Accelerometer_Modul_JM3-3DA|3D Accelerometer Modul JM3-3DA]] ([http://www.conrad.de/ce/de/product/1082387/Arexx-3D-Accelerometer-Modul-JM3-3DA 1082387] AUSVERKAUFT!)&lt;br /&gt;
* Arexx [[RP6_Sensor_Board_und_Xtra_Module#BHT_Modul_JM3-BHT31|BHT Modul JM3-BHT31]] ([http://www.conrad.de/ce/de/product/1302995/Arexx-Asuro-xTend-BHT-JM3-BHT31 1302995] AUSVERKAUFT!)&lt;br /&gt;
&lt;br /&gt;
===I2C GPS Empfänger JM3-GPS===&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_I2C_GPS_Empfänger.JPG|RP6 I2C GPS Empfänger|thumb]]&lt;br /&gt;
&lt;br /&gt;
(Laut Online-Katalog der Firma CONRAD!)&lt;br /&gt;
&lt;br /&gt;
''&amp;quot;Universelles GPS-I²C-Bus Modul für RP6 Roboter. Der GPS Empfänger stellt die NMEA-0183 Datensätze GGA, RMC, GSA und VTG in den veschiedenen Registern zur Verfügung. Damit ist eine einfache Weiterverarbeitung möglich.&amp;quot;''&lt;br /&gt;
&lt;br /&gt;
Aktuell (Oktober 2017) ist der I2C GPS Empfänger bei CONRAD ausverkauft.&lt;br /&gt;
&lt;br /&gt;
====Beschreibung====&lt;br /&gt;
Der I2C GPS Empfänger ist eine kleine (38 x 23 mm) Zusatzplatine (RP6 Xtra Modul), die direkt auf das [[RP6_Sensor_Board_und_Xtra_Module#RP6_Sensor_Board_2|RP6 Sensor Board]] aufgesteckt werden kann. Sie kann aber auch überall eingesetzt werden, wo eine stabilisierte 5V Versorgungsspannung und ein 5V-I2C-Bus bis 400 kHz zur Verfügung steht.&lt;br /&gt;
&lt;br /&gt;
Die Platine ist bestückt mit dem &amp;quot;Fastrax GPS antenna module&amp;quot; [https://www.u-blox.com/de/positioning-antennas/gnss-antenna-modules/uc530.html UC530]. Als Backup-Batterie dient eine wieder aufladbare Lithium-Batterie ([http://www.farnell.com/datasheets/321180.pdf MS621FE]). Zur Kommunikation zwischen dem UC530 und dem I2C-Bus ist ein [http://www.atmel.com/Images/Atmel-8303-8-bit-AVR-Microcontroller-tinyAVR-ATtiny1634_Datasheet.pdf ATtiny1634] an Bord, der auch die Auswertung des [http://de.wikipedia.org/wiki/NMEA_0183 NMEA Protokolls] übernimmt. Die 3,3 V Versorgungsspannung wird auf der Platine durch einen Spannungsregler ([http://www.mouser.com/ds/2/405/lm3480-316799.pdf LM3480IM3-3.3]) erzeugt. Über den I2C-Bus können folgende Daten der NMEA-0183 Datensätze GGA, RMC, GSA und VTG auf einfache Weise gelesen werden:&lt;br /&gt;
&lt;br /&gt;
* Geograf. Breite&lt;br /&gt;
* Geograf. Länge&lt;br /&gt;
* GPS Status&lt;br /&gt;
* HDOP&lt;br /&gt;
* Satellitenzahl&lt;br /&gt;
* Kurs&lt;br /&gt;
* Geschwindigkeit&lt;br /&gt;
* Höhe&lt;br /&gt;
* UTC-Zeit&lt;br /&gt;
* Datum&lt;br /&gt;
* PDOP&lt;br /&gt;
* VDOP&lt;br /&gt;
* Satellit 1..12&lt;br /&gt;
&lt;br /&gt;
Der ATtiny1634 ist natürlich vorprogrammiert, kann aber über eine vorbereitete 6-polige ISP-Schnittstelle auf der Platine auch umprogrammiert werden.&lt;br /&gt;
&lt;br /&gt;
'''Lieferumfang'''&lt;br /&gt;
* I2C GPS Empfänger&lt;br /&gt;
* CD mit Anleitung und Software-Beispielen.&lt;br /&gt;
&lt;br /&gt;
====Technische Daten====&lt;br /&gt;
* Versorgungsspannung: 5,0 V +/- 5%&lt;br /&gt;
* Stromverbrauch: &amp;lt;= 20 mA (typ.)&lt;br /&gt;
* I2C-Bus Geschwindigkeit: &amp;lt;= 400 kHz&lt;br /&gt;
* GPS Antenne: eingebaut&lt;br /&gt;
* Backup Batterie: Lithium, im Betrieb wieder aufladbar&lt;br /&gt;
* Temperatur Bereich: -10 bis 65 °C&lt;br /&gt;
* Form Faktor: 38 x 23 mm&lt;br /&gt;
* Gewicht: ca. 6 g&lt;br /&gt;
* Empfänger Spezifikationen (UC530):&lt;br /&gt;
** Empfänger: GPS L1 C/A-Code, SPS&lt;br /&gt;
** Kanäle: 66/22 (Suche/Track)&lt;br /&gt;
** Tracking Empfindlichkeit: -165 dBm typ.&lt;br /&gt;
** Navigations Empfindlichkeit: -148 dbm typ (Kaltstart)&lt;br /&gt;
** Update Rate: 1 Sek.&lt;br /&gt;
** Positions Genauigkeit:&lt;br /&gt;
*** 3,0m (67%) typ. horizontal&lt;br /&gt;
*** 5,0m (67%) typ. vertikal&lt;br /&gt;
*** 0,02 m/s (50%) typ. Geschwindigkeit&lt;br /&gt;
** Zeit bis zum ersten Fix: typ. 31 Sek.&lt;br /&gt;
** Protokoll: NMEA-0183 Rev. 3.01&lt;br /&gt;
&lt;br /&gt;
====Anschluss-Schema====&lt;br /&gt;
Belegung des 9-poligen Anschluss-Steckers (K1) siehe in [[RP6_Sensor_Board_und_Xtra_Module#I2C-MODULE|dieser]] Tabelle!&lt;br /&gt;
&lt;br /&gt;
====Umbau-Optionen====&lt;br /&gt;
Wenn man den ATtiny1634 selbst programmieren will, muss man Stiftleisten auf die Platine löten.&lt;br /&gt;
&lt;br /&gt;
Man braucht dazu: &lt;br /&gt;
* 2-reihige Stiftleiste RM 2,54mm (z.B. 2x40-polig 741306) &lt;br /&gt;
&lt;br /&gt;
Man trennt von der 2-reihigen Stiftleiste 2x3 Kontakte ab und lötet sie auf die Punkte &amp;quot;ISP6&amp;quot;.&lt;br /&gt;
Mit einem ISP-Programmer kann dann eine neue Firmware geflasht werden. Die aktuelle Firmware des ATtiny1634 (Version 1.2) wird als .HEX mitgeliefert, leider ohne Source-Code.&lt;br /&gt;
&lt;br /&gt;
Vorsicht: Dabei kann der Prozessor im schlimmsten Fall nicht mehr ansprechbar sein oder der GPS Empfänger UC530 beschädigt werden. Man sollte diesen Umbau und die ISP-Programmierung nur machen, wenn man genau weiß, was man macht! &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Gyro Modul JM3-GYRO===&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_Gyro_Modul.JPG|RP6 Gyro Modul|right|200px]]&lt;br /&gt;
&lt;br /&gt;
(Laut Online-Katalog der Firma CONRAD!)&lt;br /&gt;
&lt;br /&gt;
''&amp;quot;Das universelle Gyro-Sensor Modul für RP6, RP6 V2, RP6 ATMEGA32 und das RP6 V2 Control M256 Wifi-Kit ist ideal zur Erkennung der Blockierung des Roboters in seiner Drehbewegung, sowie der Stabilisierung der Geradeausfahrt.&amp;quot;''&lt;br /&gt;
&lt;br /&gt;
Aktuell (April 2019) ist das Gyro Modul bei CONRAD ausverkauft. &lt;br /&gt;
&lt;br /&gt;
====Beschreibung====&lt;br /&gt;
Das Gyro Modul ist eine kleine (19 x 17 mm) Zusatzplatine (RP6 Xtra Modul), die im RP6-System genutzt werden kann. Es gibt zwar keinen direkt passenden &amp;quot;Steckplatz&amp;quot; auf einer der Microcontroller-Plattformen (RP6v2, M32, M128, M256 Wifi), jedoch ist der Anschluß einfach:&lt;br /&gt;
Benötigt werden +5V und GND, sowie ein freier ADC-Kanal, der bis 5V messen kann. Damit kann das Gyro Modul sehr universell eingesetzt werden. Es misst die Drehrate um die Z-Achse (Hochachse oder Yaw).&lt;br /&gt;
&lt;br /&gt;
Die Platine ist bestückt mit dem analogen Gyro-Sensor [http://www.st.com/web/en/resource/technical/document/datasheet/CD00254111.pdf LY330ALH], dessen Ausgangsspannung durch zwei OP-Amps ([http://www.ti.com.cn/cn/lit/ds/symlink/lm321.pdf LM321], [http://www.produktinfo.conrad.com/datenblaetter/00000-24999/001072615-da-01-en-IC_AMP_PREC_LMP7731MF_NOPB_SOT_23_5_TID.pdf LMP7731MF]) in Ruhe bei 2,5 V liegt. Höhere Ausgangsspannungen (bis 5 V) bedeuten eine Drehgeschwindigkeit nach LINKS, niedrigere (bis 0 V) eine Drehgeschwindigkeit nach RECHTS. Die 3,3 V Versorgungsspannung des LY330ALH wird auf der Platine durch einen Spannungsregler ([http://www.mouser.com/ds/2/405/lm3480-316799.pdf LM3480IM3-3.3]) erzeugt.&lt;br /&gt;
&lt;br /&gt;
'''Lieferumfang'''&lt;br /&gt;
* Gyro Modul&lt;br /&gt;
* CD mit Anleitung und Software-Beispielen.&lt;br /&gt;
&lt;br /&gt;
====Technische Daten====&lt;br /&gt;
&lt;br /&gt;
* VDD: 5,0 V +/- 5%&lt;br /&gt;
* Vout(0): 2,5 V +/- 2% (ohne Bewegung)&lt;br /&gt;
* Vout: Vout(0) + 10mV / dps +/- 2%&lt;br /&gt;
* Messbereich: ca. 200 dps max.&lt;br /&gt;
&lt;br /&gt;
====Anschluss-Schema====&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_Gyro_Modul_SP.JPG|RP6 Gyro Modul - Anschluss-Schema]]&lt;br /&gt;
&lt;br /&gt;
====Umbau-Optionen====&lt;br /&gt;
Am Gyro Modul gibt es nichts umzubauen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===3D Accelerometer Modul JM3-3DA===&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_3D_Accelerometer_Modul.JPG|RP6 3D Accelerometer Modul|right|105px]]&lt;br /&gt;
&lt;br /&gt;
(Laut Online-Katalog der Firma CONRAD!)&lt;br /&gt;
&lt;br /&gt;
''&amp;quot;Universeller 3-Achsen Beschleunigungssensor für RP6, RP6 V2, RP6 ATMEGA32 und das RP6 V2 Control M256 WIFI-Kit. Ideal zur Winkelmessung (Neigung-, Kipp-Winkel) und vieles mehr.&amp;quot;''&lt;br /&gt;
&lt;br /&gt;
Seit Mai 2020 ist das 3D Accelerometer Modul bei CONRAD ausverkauft.&lt;br /&gt;
&lt;br /&gt;
====Beschreibung====&lt;br /&gt;
&lt;br /&gt;
Das 3D Accelerometer Modul ist eine kleine (15 x 10 mm) Zusatzplatine (RP6 Xtra Modul), die direkt auf den EEPROM-Sockel (IC5) der Zusatzplatine [[RP6#RP6_CONTROL_M32_Platine|RP6 CONTROL M32]] gesteckt und über den SPI-Bus angesteuert werden kann. Das Accelerometer Modul kann aber auch mit allen Microcontroller-Plattformen betrieben werden, die eine stabilisierte 5V-Versorgungsspannung und einen SPI- oder I2C-Bus bieten.&lt;br /&gt;
&lt;br /&gt;
Die Platine ist bestückt mit dem 3D Beschleunigungs-Sensor [http://www.farnell.com/datasheets/1691680.pdf LIS302DLH]. Die 3,3 V Versorgungsspannung des LIS302DLH wird auf der Platine durch einen Spannungsregler ([http://www.mouser.com/ds/2/405/lm3480-316799.pdf LM3480IM3-3.3]) erzeugt.&lt;br /&gt;
&lt;br /&gt;
'''Lieferumfang'''&lt;br /&gt;
* 3D Accelerometer Modul&lt;br /&gt;
* CD mit Anleitung und Software-Beispielen.&lt;br /&gt;
&lt;br /&gt;
====Technische Daten====&lt;br /&gt;
&lt;br /&gt;
* VDD: 5,0 V +/- 5%&lt;br /&gt;
* Messbereiche: +-2 g, +-4 g, +-8 g&lt;br /&gt;
* Datenausgabe: 16 Bit&lt;br /&gt;
* Schnittstellen: I2C, SPI&lt;br /&gt;
&lt;br /&gt;
====Anschluss-Schema====&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_3D_Accelerometer_Modul_SP.JPG|RP6 3D Accelerometer Modul - Anschluss-Schema|350px]]&lt;br /&gt;
&lt;br /&gt;
====Umbau-Optionen====&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_3D_Accelerometer_Modul_M32.JPG|RP6 3D Accelerometer Modul auf der M32|right|500px]]&lt;br /&gt;
&lt;br /&gt;
'''Will man das Modul auf der M32 einsetzen, muss man auf dem 3D Accelerometer Modul die Widerstände R2 und R3 (falls vorhanden!) auslöten (siehe Anleitung zum Modul, Seiten 4/5!)''' und einen IC-Sockel an Position IC5 und einen Kondensator an Position C19 auf der M32 einlöten, siehe [[RP6#Zweites_SPI-EEPROM|hier]]!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die Abbildung rechts zeigt das 3D Accelerometer Modul auf der M32.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===BHT Modul JM3-BHT31===&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_BHT_Modul.PNG|RP6 BHT Modul|right|203px]]&lt;br /&gt;
&lt;br /&gt;
Dieses [http://jm3-engineering.com/sensors.htm BHT Modul] zur Messung von Luftdruck, Luftfeuchte und Temperatur war für das Ende des 3. Quartals 2014 angekündigt und ist nun ab dem 22.01.2015 lieferbar.&lt;br /&gt;
&lt;br /&gt;
(Laut Online-Katalog der Firma CONRAD!)&lt;br /&gt;
&lt;br /&gt;
''&amp;quot;Ein Luftdruck-, rel. Luftfeuchtigkeits- und Temperatursensor Modul für vielfältige Anwendungen. Es kann direkt in den Asuro Expansion-Port auf dem Asuro xTend Bord eingesteckt werden. Das Asuro Modul kann mit den anderen erhältlichen Modulen (Kompass/Gyro und RTC kombiniert werden (Stack-up)). Außerdem kann es auch auf dem RP6 Sensor Bord in dem I2C Modulsteckplatz verwendet werden. Das Sensor Modul verwendet den hochauflösenden Drucksensor-Chip MS5607-02BA und den Luftfeuchtigkeitssensor HTU21D von MEAS Switzerland mit I2C Bus Interface. Der barometrische Drucksensor ist für Höhenmesser und Variometer optimiert und hat eine Auflösung von 20cm. Der relative Luftfeuchtigkeits- und Temperatursensor bietet zuverlässige und genaue Daten, welche sich auch besonders für Wetterstations-Informationen eignen.&amp;quot;''&lt;br /&gt;
&lt;br /&gt;
Aktuell (April 2019) ist das BHT Modul bei CONRAD ausverkauft. &lt;br /&gt;
&lt;br /&gt;
====Beschreibung====&lt;br /&gt;
Das BHT Modul ist eine kleine (24 x 14 mm) Zusatzplatine (ASURO xTend bzw. RP6 Xtra Modul), die direkt auf das [[RP6_Sensor_Board_und_Xtra_Module#RP6_Sensor_Board_2|RP6 Sensor Board]] aufgesteckt werden kann. Sie kann auch auf dem [http://www.conrad.de/ce/de/product/1302085/Arexx-Asuro-xTend-Board-JM3-AXT3 Arexx Asuro xTend Board] und überall eingesetzt werden, wo eine stabilisierte 5V Versorgungsspannung und ein I2C-Bus bis 400 kHz zur Verfügung steht.&lt;br /&gt;
&lt;br /&gt;
Die Platine ist bestückt mit dem barometrischen Drucksensor [http://www.parallax.com/sites/default/files/downloads/29124-MS5607-02BA03-Datasheet.pdf MS5607-02BA] und dem relativen Luftfeuchtigkeits- und Temperatursensor [http://www.meas-spec.com/downloads/HTU21D.pdf HTU21D]. Die 3,0 V Versorgungsspannung der Sensoren wird auf der Platine durch einen Spannungsregler ([http://www.farnell.com/datasheets/78902.pdf LP2980AIM5-3.0]) erzeugt. &lt;br /&gt;
&lt;br /&gt;
'''Lieferumfang'''&lt;br /&gt;
* BHT Modul&lt;br /&gt;
* CD mit Dokumentation&lt;br /&gt;
&lt;br /&gt;
====Technische Daten====&lt;br /&gt;
&lt;br /&gt;
* Nennspannung: 3,3 V (?)&lt;br /&gt;
* Nennstrom: 0,2 mA (typ.) &amp;lt; 1,5mA peaktyp.&lt;br /&gt;
* I2C Bus Geschwindigkeit: 400kHz max.&lt;br /&gt;
* Sensor Modul mit MS5607-02BA und HTU21D&lt;br /&gt;
* Hohe Auflösung des Sensorelements - Höhe: 20cm /- rel. Luftfeuchtigkeit: 0,04%&lt;br /&gt;
* Schneller AD-Wandler&lt;br /&gt;
* Digitaler Drucksensor (24 bit ΔΣ ADC)&lt;br /&gt;
* Luftdruckbereich: 10 bis 1200 mbar&lt;br /&gt;
* Exzellente Langzeitstabilität&lt;br /&gt;
* Unmittelbare Desaturierung&lt;br /&gt;
* Kalibrierung in der Fabrik&lt;br /&gt;
&lt;br /&gt;
====Anschluss-Schema====&lt;br /&gt;
Belegung des 9-poligen Anschluss-Steckers (K1) siehe in [[RP6_Sensor_Board_und_Xtra_Module#I2C-MODULE|dieser]] Tabelle!&lt;br /&gt;
&lt;br /&gt;
====Umbau-Optionen====&lt;br /&gt;
&lt;br /&gt;
===Xtra Module auf einer Experimentierplatine===&lt;br /&gt;
&lt;br /&gt;
Die drei bis jetzt (09/2014) erhältlichen [[RP6_Sensor_Board_und_Xtra_Module#RP6_Xtra_Module_2|Xtra Module]], die die Navigation eines Roboters ermöglichen, können problemlos im RP6-System genutzt werden,- zwei davon sogar in Form des direkten Aufsteckens auf eine der Zusatz-Platinen: Für den [[RP6_Sensor_Board_und_Xtra_Module#I2C_GPS_Empf.C3.A4nger_JM3-GPS|I2C GPS Empfänger]] gibt es einen Steckplatz auf dem [[RP6_Sensor_Board_und_Xtra_Module#RP6_Sensor_Board_2|RP6 Sensor Board]], das [[RP6_Sensor_Board_und_Xtra_Module#3D_Accelerometer_Modul_JM3-3DA|3D Accelerometer Modul]] kann auf der [[RP6#RP6_CONTROL_M32_Platine|RP6 CONTROL M32]] aufgesteckt werden.&lt;br /&gt;
&lt;br /&gt;
Natürlich können die Xtra Module auch allein (&amp;quot;stand-alone&amp;quot;) ohne RP6 Sensor Board oder RP6 CONTROL M32 betrieben werden. Dazu kann man sie z.B. auf einer [[RP6#Experimentierplatine|Experimentierplatine]] aufbauen. &lt;br /&gt;
&lt;br /&gt;
Das soll hier mit einer kurzen Aufbauanleitung demonstriert werden.&lt;br /&gt;
&lt;br /&gt;
====Schaltplan====&lt;br /&gt;
&lt;br /&gt;
Aber zunächst der Schaltplan:&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6v2_Xtra_Module_SP.jpg|RP6 Experimentierplatine für Xtra Module - Schaltplan]]&lt;br /&gt;
&lt;br /&gt;
Man erkennt die drei XTra Module, die (bis auf das Gyro Modul) an den I2C-Bus am XBUS Stecker des RP6 angeschlossen sind. Das [[RP6_Sensor_Board_und_Xtra_Module#Gyro_Modul_JM3-GYRO|Gyro Modul JM3-GYRO]] wird nicht über I2C angesteuert, sondern liefert an seinem Pin OUT ein analoges Ausgangssignal, das mit einem ADC Eingang (0..5V) gemessen werden kann.&lt;br /&gt;
&lt;br /&gt;
Der Jumper (Steckbrücke) JP1 dient zum Einstellen der I2C-Adresse des 3D Accelerometer Moduls (0x30, 0x32).&lt;br /&gt;
Mit JP2/3 wird die [[RP6_Sensor_Board_und_Xtra_Module#Optionale_Ansteuerung|Betriebsart des Gyro Moduls]] festgelegt.&lt;br /&gt;
Die Jumper JP4 bis JP9 dienen zur Verteilung von INT1, INT2 des 3D Accelerometer Moduls und des OUT Signals des Gyro Moduls auf die INT-Anschlüsse INT1..3, INTU des XBUS. Wenn man die Interrupts des 3D Accelerometer Moduls nicht nutzen will, kann man die Jumper JP4 bis JP8 auch weglassen. Mit JP9 wird das analoge Signal des Gyro Moduls an INT1 des XBUS gelegt. Dies ist nur dann sinnvoll, wenn man die Platine mit der RP6v2 Base betreibt, weil hier an INT1 ein ADC Eingang (ADC4) liegt. Bei allen anderen Plattformen des RP6-Systems (M32, CCPRO M128, M256 WiFi) muss JP9 offen bleiben.&lt;br /&gt;
&lt;br /&gt;
Mit dieser Schaltung kann man also den Beschleunigungssensor (3D Accelerometer) und den GPS Empfänger über I2C auslesen. Der Gyro wird entweder mit ADC4 der RP6v2 Base (JP9 geschlossen!) ausgewertet oder durch einen anderen ADC Eingang. Dazu kann man das Ausgangssignal des Gyros an Pin 3 der Stiftleiste ST1 abnehmen. Von dort kann es z.B. zu ADC0 oder ADC1 der RP6v2 Base oder der RP6 CONTROL M32 geführt werden oder zu einem beliebigen ADC Eingang der CCPRO M128 oder der M256 WiFi. Die Stiftleiste ST1 liegt direkt neben dem USRBUS, so dass die Verbindung auch über den USRBUS hergestellt werden kann. Dazu verbindet man Pin 3 von ST1 mit einem Pin (Y1..Y14) des USRBUS.&lt;br /&gt;
&lt;br /&gt;
====Bestückungsplan====&lt;br /&gt;
&lt;br /&gt;
So kann z.B. der Bestückungsplan mit Leiterbahnführung auf der Experimentierplatine (Exp) aussehen:&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6v2_Xtra_Module.jpg|RP6 Experimentierplatine für Xtra Module]]&lt;br /&gt;
&lt;br /&gt;
Was braucht man allgemein für den Aufbau einer Schaltung auf der Exp:&lt;br /&gt;
* Seitenschneider, Schere, Zange&lt;br /&gt;
* Lötkolben 25..30 Watt, Lötzinn&lt;br /&gt;
* Plastik 70 Schutzlack (CONRAD 813621)&lt;br /&gt;
* Isolierter Schaltdraht YV 0,20 mm² (CONRAD 606065)&lt;br /&gt;
* Versilberter CU-Draht 0,6 mm (CONRAD 605581)&lt;br /&gt;
&lt;br /&gt;
Mit dem versilberten CU-Draht stellt man auf der Unterseite (= Lötseite) der Exp Verbindungen zwischen den Bauteilen her; mit dem isolierten Schaltdraht werden Drahtbrücken auf der Oberseite (= Bestückungsseite) der Exp eingesetzt. Die Lage der Xtra Module und der Verbindungen kann man im Bestückungsplan (s.o.!) erkennen, Drahtbrücken sind rot hervorgehoben.&lt;br /&gt;
&lt;br /&gt;
Zusätzlich zu den RP6 Xtra Modulen braucht man folgende Bauteile (Bestell-Nummern von CONRAD):&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| Anzahl || Bestell-Nr. || Bauteil-Bezeichnung || Verwendung&lt;br /&gt;
|-&lt;br /&gt;
| 1 || [http://www.conrad.de/ce/de/product/191537/Arexx-RP6-Experimentierplatine?queryFromSuggest=true 191537] || RP6 Experimentierplatine || &lt;br /&gt;
|-&lt;br /&gt;
| 1 || [http://www.conrad.de/ce/de/product/189600/Praezisions-IC-Fassung-MPE-Garry-MP-083-STG-BU-Pole-8-Rastermass-762-mm-Material-Kontaktfeder-025-Gold-ueber-Nickel 189600] || Präzisions-IC-Fassung (8 Pole) || Stecksockel für Accelerometer Modul&lt;br /&gt;
|-&lt;br /&gt;
| 1 || [http://www.conrad.de/ce/de/product/741360/Praezisions-Buchsenleiste-RM-254-gerade-Pole-1-x-20-10120832-BKL-Electronic-Inhalt-1-St 741360] || Präzisions-Buchsenleiste RM 2,54mm (9 Pole) || Stecksockel für GPS Empfänger&lt;br /&gt;
|-&lt;br /&gt;
| 1 || [http://www.conrad.de/ce/de/product/741307/Praezisions-Stiftleiste-RM-254-gerade-Pole-1-x-20-10120536-BKL-Electronic-Inhalt-1-St 741307] || Präzisions-Stiftleiste RM 2,54mm (2 x 4 Pole) || Stecksockel für Gyro Modul&lt;br /&gt;
|-&lt;br /&gt;
| 1 || [http://www.conrad.de/ce/de/product/741119/Stiftleiste-RM-254-gerade-Pole-1-x-36-10120182-BKL-Electronic-Inhalt-1-St 741119] || 1-reihige Stiftleiste RM 2,54mm (ges. 36-polig) || JP1, ST1&lt;br /&gt;
|-&lt;br /&gt;
| 1 || [http://www.conrad.de/ce/de/product/741186/Doppelreihige-Stiftleiste-RM-254-gerade-Pole-2-x-8-10120514-BKL-Electronic-Inhalt-1-St 741186] || 2-reihige Stiftleiste RM 2,54mm (ges. 8-polig) || JP2..9&lt;br /&gt;
|-&lt;br /&gt;
| 1 || [http://www.conrad.de/ce/de/product/742902/Codier-Adressierbruecken-Set-Rastermass-25254-mm-10120906-BKL-Electronic-Inhalt-1-Set 742902] || Sechs Codierbrücken (aus Set) || Steckbrücken&lt;br /&gt;
|-&lt;br /&gt;
| 2 || [http://www.conrad.de/ce/de/product/453099/Keramik-Kondensator-01-F-50-V-20-B-x-H-508-mm-x-508-mm-1-St 453099] || Keramik Kondensator 100 nF || Blockkondensatoren C2, C3&lt;br /&gt;
|-&lt;br /&gt;
| 1 || [http://www.conrad.de/ce/de/product/421986/Elektrolyt-Kondensator-radial-bedrahtet-25-mm-10-F-50-V-20--x-H-5-mm-x-11-mm-Panasonic-EEUFC1H100LH-1-St 421986] || Elektrolyt Kondensator 10 uF/50 V || Spannungsstabilisierung C1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Viel Erfolg beim Aufbau!&lt;br /&gt;
&lt;br /&gt;
 Natürlich muss man nicht alle drei Sensoren aufbauen!&lt;br /&gt;
 Man kann einfach den/die Sensor/en weglassen, den/die man nicht nutzen will!&lt;br /&gt;
&lt;br /&gt;
Noch ein Wort zur Programmierung des 3D Accelerometer Moduls: Es wird auf dieser Exp über den I2C Bus angesteuert. Damit kann man die [[RP6_Sensor_Board_und_Xtra_Module#RP6_CONTROL_M32:_ACCSENS_Library|nachfolgende Library]] für dieses Modul hier NICHT benutzen!&lt;br /&gt;
&lt;br /&gt;
====Magnetfeldsensor====&lt;br /&gt;
&lt;br /&gt;
Wenn man die oben beschriebene Experimentierplatine aufgebaut hat, hat man für die Navigation eines mobilen Roboters (wie des RP6v2) schon drei benötigte Sensoren zur Verfügung: einen GPS Empfänger, einen 3D-Beschleunigungssensor und einen 1D-Gyrosensor.&lt;br /&gt;
&lt;br /&gt;
Was fehlt, ist z.B. ein '''Magnetfeldsensor (Kompass-Sensor)''', mit dem der Roboter die Himmelsrichtung feststellen kann. Einen Magnetfeldsensor gibt es (noch) nicht als Xtra Modul.&lt;br /&gt;
&lt;br /&gt;
Auf der beschriebenen Experimentierplatine ist durchaus noch Platz (z.B. in der rechten oberen Ecke) für einen Magnetfeldsensor. Geeignet ist z.B. das 2D-Kompassmodul HDMM01 ([http://www.pollin.de/shop/dt/NTM4OTgxOTk-/Bausaetze_Module/Module/Kompassmodul_HDMM01.html Pollin 94-810 164] NICHT MEHR LIEFERBAR!).&lt;br /&gt;
&lt;br /&gt;
Hier ist der um den Magnetfeldsensor erweiterte Schaltplan:&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6v2_Xtra_Module_HDMM01_SP.jpg|RP6 Experimentierplatine für Xtra Module und HDMM01 - Schaltplan]]&lt;br /&gt;
&lt;br /&gt;
Das kleine Kompassmodul dürfte doch noch einfach auf der Experimentierplatine unterzubringen sein, oder?&lt;br /&gt;
&lt;br /&gt;
Zur Programmierung des Magnetfeldsensors HDMM01 gibt es [[RP6v2_Orientierung#Kompassmodul_HDMM01_2|HIER]] Anregungen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Programmierung==&lt;br /&gt;
In diesem Abschnitt geht es um die Programmierung der Sensoren und Aktoren auf dem [[RP6_Sensor_Board_und_Xtra_Module#RP6_Sensor_Board_3|RP6 Sensor Board]] und auf den [[RP6_Sensor_Board_und_Xtra_Module#RP6_Xtra_Module_3|Xtra Modulen]]. Die hier veröffentlichte Software baut NICHT auf die mitgelieferten C++ Software-Beispiele auf der ''&amp;quot;RP6 Robot System Xtra Modules CD-ROM&amp;quot;'' auf, sondern basiert auf Eigenentwicklungen in GCC.&lt;br /&gt;
&lt;br /&gt;
===RP6 Sensor Board===&lt;br /&gt;
Das RP6 Sensor Board RP6-JM03-61 verfügt nicht über einen eigenen Microprozessor. Daher geht es hier eigentlich nicht um die Programmierung des Sensor Boards, sondern um die Programmierung der Microcontroller-Plattform, an die das Sensor Board angeschlossen ist. In der Regel wird das die RP6 M256 WiFi Zusatzplatine sein, aber auch die RP6v2 Base steuert (als I2C-Slave) in der vorgesehenen Konfiguration gewisse Funktionen des Sensor Boards an.&lt;br /&gt;
Prinzipiell kann das Sensor Board aber auch an der RP6 CONTROL M32 (''passende Library auf Anfrage beim Autor!'') oder der RP6 CCPRO M128 Zusatzplatine betrieben werden.&lt;br /&gt;
&lt;br /&gt;
====Dokumentation====&lt;br /&gt;
Die Dokumentation zum RP6 Sensor Board befindet sich auf der mitgelieferten ''&amp;quot;RP6 Robot System Xtra Modules CD-ROM&amp;quot;''.&lt;br /&gt;
&lt;br /&gt;
=====Manuals=====&lt;br /&gt;
Das Handbuch in der aktuellen Version kann [http://www.jm3-engineering.com/download/doc/ManualRP6SensorBoard_de.pdf hier] oder [http://www.produktinfo.conrad.com/datenblaetter/00000-24999/001082384-an-01-de-RP6_SENSOR_BOARD.pdf da] eingesehen werden.&lt;br /&gt;
 ACHTUNG: Das Manual enthielt in der Version 1.11 noch teils irreführende&lt;br /&gt;
          Beschreibungen, die in der aktuellen Version 1.20 vom 20.04.2014&lt;br /&gt;
          korrigiert wurden!&lt;br /&gt;
&lt;br /&gt;
====Robot-Tool====&lt;br /&gt;
[[Bild:JM3 Robot-Tool.PNG|JM3 Robot-Tool|thumb]]&lt;br /&gt;
&lt;br /&gt;
Von JM3 Engineering wurde auch ein eigenes Programm &amp;quot;'''JM3 Robot-Tool'''&amp;quot; veröffentlicht, das im RP6-System (RP6(v2) Base, CONTROL M32, M256 WiFi) anstelle des [[RP6v2#RobotLoader|RobotLoaders]] verwendet werden kann.&lt;br /&gt;
&lt;br /&gt;
Vom Robot-Tool gibt es auch eine Kommandozeilen-Version &amp;quot;'''Multiloader'''&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Befehlszeilen Optionen'''&lt;br /&gt;
 Multi Loader v1.0.1&lt;br /&gt;
 &lt;br /&gt;
 Usage:&lt;br /&gt;
 multiloader [filename] [port/hostname] [device] [-l]&lt;br /&gt;
  -l forces RP6 low speed mode.&lt;br /&gt;
 &lt;br /&gt;
 Valid devices:&lt;br /&gt;
  - Asuro&lt;br /&gt;
  - AsuroCtrl&lt;br /&gt;
  - RP6Base&lt;br /&gt;
  - RP6CtrlM32&lt;br /&gt;
  - RobotArm&lt;br /&gt;
  - RP6Wifi&lt;br /&gt;
 Attention: Device names are case-sensitive&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 Multi Loader v2.0.0&lt;br /&gt;
 &lt;br /&gt;
 Usage: multiloader [load/conf] [...]&lt;br /&gt;
 &lt;br /&gt;
         load    Load .hex file into robot.&lt;br /&gt;
                 arguments: [filename] [port/host] [device] [interface] [-l]&lt;br /&gt;
 &lt;br /&gt;
                 [interface] specifies programming interface type.&lt;br /&gt;
                 Valid interface types are UART and TCP.&lt;br /&gt;
                 -l forces RP6 low speed mode.&lt;br /&gt;
 &lt;br /&gt;
                 Valid devices:  [interfaces]&lt;br /&gt;
                 - Asuro     UART&lt;br /&gt;
                 - AsuroXT   UART&lt;br /&gt;
                 - Marvin    UART&lt;br /&gt;
                 - MarvinFW  UART&lt;br /&gt;
                 - RP6       UART&lt;br /&gt;
                 - RP6M32    UART&lt;br /&gt;
                 - RP6Wifi   TCP&lt;br /&gt;
                 - RobotArm  UART&lt;br /&gt;
 &lt;br /&gt;
                 Attention: Device names are case-sensitive&lt;br /&gt;
 &lt;br /&gt;
=====Versionen=====&lt;br /&gt;
Hier eine Tabelle der (mir) bekannten Robot-Tool Versionen:&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |rowspan=2|ZIP-Datum&lt;br /&gt;
 |colspan=2|Robot-Tool:&lt;br /&gt;
 |colspan=2|Multiloader:&lt;br /&gt;
 |rowspan=2|Bemerkungen&lt;br /&gt;
 |-&lt;br /&gt;
 |Windows&lt;br /&gt;
 |Linux&lt;br /&gt;
 |Windows&lt;br /&gt;
 |Linux&lt;br /&gt;
 |-&lt;br /&gt;
 |25.10.2014&lt;br /&gt;
 |1.0.1-1&lt;br /&gt;
 |1.0.1-1&lt;br /&gt;
 |1.0.1-1&lt;br /&gt;
 |1.0.1-1&lt;br /&gt;
 |Erste veröffentlichte Version!&lt;br /&gt;
 |-&lt;br /&gt;
 |30.01.2017&lt;br /&gt;
 |[http://www.jm3-engineering.com/download/robottool-v2.0-win32.7z 2.0]&lt;br /&gt;
 |[http://www.jm3-engineering.com/download/robottool-v2.0-linux.tar.xz 2.0]&lt;br /&gt;
 |2.0&lt;br /&gt;
 |2.0&lt;br /&gt;
 |auch für [http://www.jm3-engineering.com/download/robottool-v2.0-osx.tar.gz Mac OSX]!&lt;br /&gt;
 |-&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
'''Hinweise:'''&lt;br /&gt;
* 1. Falls die Links in der Tabelle auf die Seite &amp;quot;Neuigkeiten&amp;quot; von JM3-Engineering führen, kann man dort auf die Seite &amp;quot;Software Downloads&amp;quot; wechseln und die Dateien im Absatz &amp;quot;JM3 Robot-Tool V2.0&amp;quot; herunterladen.&lt;br /&gt;
* 2. Ab Version 2.0 ist der Multiloader in der ZIP des Robot-Tools enthalten.&lt;br /&gt;
&lt;br /&gt;
====AVR-GCC und Visual Studio====&lt;br /&gt;
Die Demo-Programme zum RP6 Sensor Board wurden mit [https://www.microsoft.com/de-de/download/details.aspx?id=5555&amp;amp;fa43d42b-25b5-4a42-fe9b-1634f450f5ee=True Microsoft Visual C++ 2010] und [http://www.jm3-engineering.com/download/avr-gcc-4.8.1-win32.7z AVR-GCC] erstellt.&lt;br /&gt;
&lt;br /&gt;
Eine Anleitung zur Installation unter Windows befindet sich [http://www.jm3-engineering.com/download/doc/avr-gcc-vs_de.pdf hier].&lt;br /&gt;
&lt;br /&gt;
====Demo-Programmme====&lt;br /&gt;
Demo-Programme und eine &amp;quot;Library&amp;quot; zum RP6 Sensor Board befinden sich auf der mitgelieferten ''&amp;quot;RP6 Robot System Xtra Modules CD-ROM&amp;quot;''. Sie können auch in der aktuellen Version im Download Bereich von [http://www.jm3-engineering.com/downloads.htm JM3 Engineering] herunter geladen werden:&lt;br /&gt;
* [http://www.jm3-engineering.com/download/RP6SensorBoardDemo_1.1-1.7z RP6 Sensor Board Demo Programm und Library]&lt;br /&gt;
* [http://www.jm3-engineering.com/download/RP6SensorBoardDemo_noVC_1.1-1.7z RP6 Sensor Board Demo Programm und Library (ohne Visual Studio Projekt Dateien)]&lt;br /&gt;
* [http://www.jm3-engineering.com/download/RP6-RC_1.0-1.7z Remote Control Software]&lt;br /&gt;
'''Hinweis:'''&lt;br /&gt;
Falls die o.g. Links auf die Seite &amp;quot;Neuigkeiten&amp;quot; von JM3-Engineering führen, kann man dort auf die Seite &amp;quot;Software Downloads&amp;quot; wechseln und die Dateien im Absatz &amp;quot;RP6 Sensor Board Library und Demo-Programm&amp;quot; herunterladen.&lt;br /&gt;
&lt;br /&gt;
====Library====&lt;br /&gt;
Eine &amp;quot;Library&amp;quot; zum RP6 Sensor Board, bestehend aus einigen Einzel-Dateien mit jeweils eigenen Versions-Nummern, befindet sich auf der mitgelieferten ''&amp;quot;RP6 Robot System Xtra Modules CD-ROM&amp;quot;''. Sie ist in der aktuellen Version auch in den Demo-Programmen enthalten ([[RP6_Sensor_Board_und_Xtra_Module#Demo-Programmme|s.o.!]]).&lt;br /&gt;
&lt;br /&gt;
=====Versionen=====&lt;br /&gt;
Hier eine Tabelle der (mir) bekannten Library Versionen für das RP6 Sensor Board:&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |ZIP-Datum *&lt;br /&gt;
 |Version&lt;br /&gt;
 |RP6SensorBoardDemo&lt;br /&gt;
 |RP6-RC&lt;br /&gt;
 |RP6M256_I2CMasterLib&lt;br /&gt;
 |RP6M256Lib&lt;br /&gt;
 |RP6I2CmasterTWI&lt;br /&gt;
 |-&lt;br /&gt;
 |09.12.2013&lt;br /&gt;
 |1.0&lt;br /&gt;
 |1.0&lt;br /&gt;
 |1.0&lt;br /&gt;
 |(1.0_24.02.12) ²&lt;br /&gt;
 |1.1_16.07.12 ²&lt;br /&gt;
 |1.1_04.09.12 ³&lt;br /&gt;
 |-&lt;br /&gt;
 |27.12.2014&lt;br /&gt;
 |1.1&lt;br /&gt;
 |1.1-1&lt;br /&gt;
 |1.0-1&lt;br /&gt;
 |Modified 02.11.14 ³&lt;br /&gt;
 |1.1.1_25.10.14 ³&lt;br /&gt;
 |1.1_04.09.12 ³&lt;br /&gt;
 |-&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
'''Zu *:''' Alternativ: Datum der Verzeichnisse (z.B. auf der ''&amp;quot;RP6 Robot System Xtra Modules CD-ROM&amp;quot;'')!&lt;br /&gt;
&lt;br /&gt;
'''Zu ²:''' Neueste Original Version der [http://rn-wissen.de/wiki/index.php/RP6v2#Versionen RP6 Library]!&lt;br /&gt;
&lt;br /&gt;
'''Zu ³:''' Modifiziert von [http://www.jm3-engineering.com/ JM3 Engineering]!&lt;br /&gt;
&lt;br /&gt;
=====Modifizierte RP6 Libraries=====&lt;br /&gt;
Von [http://www.jm3-engineering.com/ JM3 Engineering] wurden bis jetzt drei [http://rn-wissen.de/wiki/index.php/RP6v2#Versionen RP6 &amp;quot;Original&amp;quot;-Libraries] leicht modifiziert, um sie für die eigenen Programme für das RP6 Sensor Board optimal nutzen zu können.&lt;br /&gt;
In diesem Abschnitt soll kurz erwähnt werden, WAS verändert wurde.&lt;br /&gt;
 &lt;br /&gt;
======RP6M256_I2CMasterLib======&lt;br /&gt;
Die RP6M256_I2CMasterLib wurde von JM3 Engineering ab der Software Version 1.1 für das RP6 Sensor Board verändert, um sie in einer eigenen Bibliothek bestehend aus mehreren Modulen nutzen zu können. Folgendes wurde angepasst:&lt;br /&gt;
* Neue typedef unions:&lt;br /&gt;
** u_interrupt_status&lt;br /&gt;
** u_status&lt;br /&gt;
** u_drive_status&lt;br /&gt;
** u_statusLEDs&lt;br /&gt;
&lt;br /&gt;
Die modifizierte RP6M256_I2CMasterLib vom 2.11.2014 ist kompatibel zur Original-Version vom 24.02.2012.&lt;br /&gt;
&lt;br /&gt;
======RP6M256Lib======&lt;br /&gt;
Eine modifizierte Version 1.1.1 der RP6M256Lib mit Datum vom 25.10.2014 wurde von JM3 Engineering im November 2014 zusammen mit der Software Version 1.1 für das RP6 Sensor Board veröffentlicht. Sie ist kompatibel zur Version 1.1 der RP6M256Lib vom 16.07.2012 und enthält folgende Änderung:&lt;br /&gt;
* In der Datei RP6M256.h wird die Variable &amp;quot;timer&amp;quot; korrekt als &amp;quot;''extern'' volatile uint16_t timer&amp;quot; deklariert.&lt;br /&gt;
&lt;br /&gt;
======RP6I2CmasterTWI======&lt;br /&gt;
Eine erweiterte I2C Master-Library (Version 1.1) gibt es mit Datum vom 04.09.2012, veröffentlicht ab Februar 2014 von JM3 Engineering für das RP6 Sensor Board und die Xtra Module. Sie ist abwärts-kompatibel zur I2C Master-Library in der Version 1.0 vom 16.05.2007 und bietet lediglich folgende Erweiterung: &lt;br /&gt;
* Neue Funktion I2CTWI_readWordRegisters() zum Lesen von 16 Bit Registern&lt;br /&gt;
&lt;br /&gt;
====RP6 M256 WiFi: Sensor Board Library====&lt;br /&gt;
Die nachfolgende RP6M256_Sensor_BoardLib (Eigenentwicklung in GCC) dient zur Ansteuerung des Sensor Boards durch die RP6M256 WiFi.&lt;br /&gt;
&lt;br /&gt;
=====Configuration Header=====&lt;br /&gt;
Vor dem Kompilieren der Library muss eine Anpassung des Configuration Headers an die eigenen Hardware-Voraussetzungen erfolgen.&lt;br /&gt;
Dazu gibt es im Configuration Header eine Definition:&lt;br /&gt;
* USE_PD5 -&amp;gt; Die Sensor Board Funktion &amp;quot;PD5&amp;quot; steuert den TCA4311A Enable Pin (EN).&lt;br /&gt;
Im nachfolgenden Listing ist die Definition USE_PD5 NICHT aktiv (d.h. der TCA4311A Enable Pin (EN) wird vom MAX7311 I/O 1.0 Pin angesteuert!). Dies muss an die eigene Hardware angepaßt werden. Wenn &amp;quot;PD5&amp;quot; den TCA4311A Enable Pin (EN) steuern soll, muss die Zeile mit &amp;quot;USE_PD5&amp;quot; &amp;quot;aktiviert&amp;quot; werden. Dazu entfernt man &amp;quot;//&amp;quot; am Zeilenanfang:&lt;br /&gt;
 #define USE_PD5&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Bevor man Beschleunigungs-, Magnetfeldsensor und Gyroskop nutzen kann, muss man sie kalibrieren:&lt;br /&gt;
&lt;br /&gt;
* '''Accelerometer:'''&lt;br /&gt;
** Die X-Achse wird kalibriert, indem man den RP6 mit der rechten Seite nach unten hält und den Maximalwert in MAX_X_A einträgt. Dann neigt man ihn auf seine linke Seite und trägt den negativen Maximalwert in MIN_X_A ein.&lt;br /&gt;
** Die Y-Achse wird kalibriert, indem man den RP6 mit der Vorderseite nach oben hält und den Maximalwert in MAX_Y_A einträgt. Dann kippt man die Vorderseite nach unten und trägt den negativen Maximalwert in MIN_Y_A ein.&lt;br /&gt;
** Die Z-Achse wird kalibriert, indem man den RP6 normal waagerecht hält und den Maximalwert in MAX_Z_A einträgt. Dann dreht man den RP6 &amp;quot;auf den Kopf&amp;quot; und trägt den negativen Maximalwert in MIN_Z_A ein.&lt;br /&gt;
** Sollten die angezeigten Pitch- und Roll-Werte nach der Kalibrierung der Achsen und genau waagerecht stehendem Sensor bzw. RP6 vom Nullwert deutlich abweichen, kann man sie mithilfe der Definitionen OFFSET_PITCH_A und OFFSET_ROLL_A &amp;quot;nullen&amp;quot;. Die Einheit dieser Definitionen ist °.&lt;br /&gt;
 ''HINWEIS: Die internen Berechnungen werden durch diese Offset-Korrektur&lt;br /&gt;
 NICHT beeinflußt. Die Offset-Werte können also nicht dazu benutzt werden,&lt;br /&gt;
 eine Achsenabweichung zwischen Sensor und RP6 zu kompensieren!''&lt;br /&gt;
* '''Magnetometer:'''&lt;br /&gt;
** Zur Kalibrierung des Magnetfeldsensors stellt man den RP6 auf eine waagerechte Fläche. Es dürfen keine Elektrogeräte, Metallteile und stromführende Leitungen in der Nähe sein, die das Magnetfeld verändern können.&lt;br /&gt;
** Zunächst ist es möglich, die sogenannten &amp;quot;hard iron&amp;quot; Effekte auszugleichen. Dies sind feste Magnetfeldabweichungen, die durch das &amp;quot;Gerät&amp;quot; (in unserem Fall also durch den kompletten RP6) verursacht werden, in oder auf dem der Sensor angebracht ist. Mit den Definitionen OFFSET_X_M, OFFSET_Y_M und OFFSET_Z_M können diese Effekte ausgeglichen werden. Diese Kalibrierung wird hier aktuell (noch) nicht beschrieben, so dass man die Werte für diese Definitionen zunächst bei 0 belassen sollte.&lt;br /&gt;
** Die X-Achse und Y-Achse wird kalibriert, indem man den RP6 langsam mehrfach um die eigene (Z-)Achse dreht und die Maximalwerte in MAX_X_M und MAX_Y_M einträgt. Die negativen Maximalwerte trägt man in MIN_X_M und MIN_Y_M ein.&lt;br /&gt;
** Die Z-Achse wird kalibriert, indem man den RP6 auf die rechte oder linke Seite legt, ihn dann langsam mehrfach auf der Stelle (um seine Y-Achse) dreht und den Maximalwert in MAX_Z_M und den negativen Maximalwert in MIN_Z_M einträgt.&lt;br /&gt;
** Mit der Definition DECLINATION_M kann man zur Verbesserung der Genauigkeit der Richtungsangaben den magnetischen Deklinationswert [°] (d.h. die magnetische Missweisung) am aktuellen Standort festlegen. [http://www.ngdc.noaa.gov/geomag-web/#declination Hier] befindet sich ein &amp;quot;Deklinations-Rechner&amp;quot;, mit dem man den Deklinationswert für den eigenen Standort ermitteln kann. &lt;br /&gt;
** Wenn man den Temperaturwert des LSM303DLHC nutzen will, muss man die Definition GET_TEMP_M aktivieren (Standard!). Den Temperaturwert kann man noch eichen, indem man die Definition OFFSET_TEMP_M anpasst. Die Einheit von OFFSET_TEMP_M ist °C.&lt;br /&gt;
* '''Gyroskop:'''&lt;br /&gt;
** In Ruhelage des RP6 wird ein ADC-Wert von ca. 511 angezeigt, wenn die Definition ADCVAL_ZERORATE_LEVEL im Configuration Header (RP6M256_Sensor_Board.h) vor der ersten Kompilierung zunächst auf 0 gesetzt wurde. Die Kalibrierung des Gyroskops ist abgeschlossen, nachdem man den in Ruhelage angezeigten ADC-Wert als ADCVAL_ZERORATE_LEVEL eingetragen hat.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''HINWEISE ZUR KALIBRIERUNG:'''&lt;br /&gt;
* Das Demo-Programm ist nicht sehr gut geeignet, um die Kalibrierungen durchzuführen.&lt;br /&gt;
* Man sollte mit einem eigenen kurzen ''Kalibrierungs-Programm'' nur die Rohwerte der jeweiligen X-, Y- und Z-Achse z.B. zweimal pro Sekunde ausgeben.&lt;br /&gt;
* Die Rohwerte sind in Variablen x_axis..., y_axis..., z_axis... enthalten. Da die Rohwerte in den Funktionen normalizeLSM303DLHC_A() bzw. normalizeLSM303DLHC_M() ggf. verändert werden, müssen die Rohwerte VOR Durchlaufen dieser Funktionen ausgegeben werden.&lt;br /&gt;
* '''Ohne eine sorgfältige Kalibrierung wird die Kompass-Funktion (insbesondere die neigungskompensierte Ausgabe der Himmelsrichtung) nicht funktionieren!'''&lt;br /&gt;
* Nach dem Eintragen der Kalibrierungs-Werte in den Configuration Header (RP6M256_Sensor_Board.h) muss die ''Demo'' neu kompiliert werden. Vorher sollten die Compiler-Hilfsdateien der Sensor Board-Library (Dateiendungen .st und .o) im Programmverzeichnis gelöscht werden.&lt;br /&gt;
* Getestet wird das Ergebnis der Kalibrierung, indem die Ausgabewerte (Temperatur, Pitch, Roll, Heading, Neigungs-kompensiertes Heading) der ''Demo'' überprüft werden. Dazu kann man Vergleichswerte (Thermometer, Winkelmesser für Pitch, Roll und externer Kompass für Heading) heranziehen.&lt;br /&gt;
* Wenn die Ausgabewerte nicht den Erwartungen entsprechen, muss die Kalibrierung wiederholt werden.&lt;br /&gt;
* Eine Kalibrierung der Sensoren ist nur zuverlässig, solange die Position des jeweiligen Sensors und seine komplette Hardware-Umgebung (also der RP6 mit allen seinen Teilen!) nicht verändert wird. Gibt es trotzdem Veränderungen, z.B. durch weitere Aufbauten auf dem RP6, müssen diese Sensoren neu kalibriert werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Datei: RP6M256_Sensor_Board.h&lt;br /&gt;
&amp;lt;pre&amp;gt;/* ****************************************************************************&lt;br /&gt;
 *                           _______________________&lt;br /&gt;
 *                           \| RP6  ROBOT SYSTEM |/&lt;br /&gt;
 *                            \_-_-_-_-_-_-_-_-_-_/           &amp;gt;&amp;gt;&amp;gt; RP6 M256 WIFI&lt;br /&gt;
 * ----------------------------------------------------------------------------&lt;br /&gt;
 * ----------------------------- [c]2014 - Dirk -------------------------------&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * File: RP6M256_Sensor_Board.h&lt;br /&gt;
 * Version: 1.1&lt;br /&gt;
 * Target: RP6 M256 WIFI - ATMEGA2560 @16.00MHz&lt;br /&gt;
 * Author(s): Dirk&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Description:&lt;br /&gt;
 * Configuration header file for new RP6 Sensor Board library.&lt;br /&gt;
 * The RP6 Sensor Board (CONRAD 1082384) is connected to the RP6M256 with the&lt;br /&gt;
 * two plugs:&lt;br /&gt;
 *   Sensor Board &amp;lt;---&amp;gt; RP6M256&lt;br /&gt;
 *   --------------------------------&lt;br /&gt;
 *   I/O (K17)    &amp;lt;---&amp;gt; IO_PWM/T0/T1&lt;br /&gt;
 *   ADC (K18)    &amp;lt;---&amp;gt; ADC_IO2/CMP&lt;br /&gt;
 * The RP6 Sensor Board function &amp;quot;PD5&amp;quot; (IC6: EN) is now connected to RP6M256&lt;br /&gt;
 * OC1B (PB6) and the RP6 Sensor Board function &amp;quot;ADC4&amp;quot; (SHARP_R) to RP6M256&lt;br /&gt;
 * ADC9 (PK1).&lt;br /&gt;
 * On the RP6 Sensor Board the functions &amp;quot;ADC0&amp;quot;, &amp;quot;ADC1&amp;quot;, &amp;quot;PWR&amp;quot; and &amp;quot;ADC4&amp;quot; are&lt;br /&gt;
 * connected to the USRBUS. The USRBUS may be wired on the RP6 mainboard like&lt;br /&gt;
 * this:&lt;br /&gt;
 *   Function : Sensor Board - USRBUS: * &amp;lt;---&amp;gt; RP6 Mainboard&lt;br /&gt;
 *   --------------------------------------------------------&lt;br /&gt;
 *   SHARP_F  : &amp;quot;ADC0&amp;quot;       - Pin 1     &amp;lt;---&amp;gt; ADC0: Pin 3&lt;br /&gt;
 *   GYRO     : &amp;quot;ADC1&amp;quot;       - Pin 2     &amp;lt;---&amp;gt; ADC1: Pin 3&lt;br /&gt;
 *   PWRON ²  : &amp;quot;PWR&amp;quot;        - Pin 3     &amp;lt;---&amp;gt; PWR&lt;br /&gt;
 *   SHARP_R  : &amp;quot;ADC4&amp;quot;       - Pin 5     &amp;lt;---&amp;gt; Not connected!&lt;br /&gt;
 * At *) It is also possible not to use the USRBUS, but to connect the RP6&lt;br /&gt;
 *       Sensor Board directly to the RP6 mainboard with 3 single cables.&lt;br /&gt;
 * At ²) See RP6 manual &amp;quot;4.6.8. Stromsparfunktionen&amp;quot;! &lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
#ifndef RP6M256_SENSOR_BOARD_H&lt;br /&gt;
#define RP6M256_SENSOR_BOARD_H&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// RP6 Sensor Board hardwired components:&lt;br /&gt;
// - I2C I/O Port Expander (MAX7311)&lt;br /&gt;
// - I2C Real Time Clock (RTC DS1339)&lt;br /&gt;
// - I2C Temperature Sensor (LM75B)&lt;br /&gt;
// - I2C Servo Controller (PCA9685)&lt;br /&gt;
// - I2C LED Driver (TCA6507)&lt;br /&gt;
// - I2C 3D Magnetometer &amp;amp; Accelerometer (LSM303DLHC)&lt;br /&gt;
// - Analog Yaw-Rate Gyroscope (LY330ALH)&lt;br /&gt;
// - Hot Swappable 2-Wire Bus Buffer (TCA4311A)&lt;br /&gt;
// - Button&lt;br /&gt;
// - Status LED&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C I/O Port Expander (MAX7311):&lt;br /&gt;
#define I2C_SENSOR_PORTEXP_ADR			0x40	// Default&lt;br /&gt;
&lt;br /&gt;
// Interrupt I/O portpin definitions (RP6M256):&lt;br /&gt;
#define IO_SENSOR_INT1_IN				INT1_PI12 // PCINT12 PJ3  XBUS Pin 8&lt;br /&gt;
#define IO_SENSOR_INT1_DDR				DDRJ&lt;br /&gt;
#define IO_SENSOR_INT1_PIN				PINJ&lt;br /&gt;
#define IO_SENSOR_INT1_PORT				PORTJ&lt;br /&gt;
#define IO_SENSOR_INT2_IN				INT2_PI15 // PCINT15 PJ6  XBUS Pin 11&lt;br /&gt;
#define IO_SENSOR_INT2_DDR				DDRJ&lt;br /&gt;
#define IO_SENSOR_INT2_PIN				PINJ&lt;br /&gt;
#define IO_SENSOR_INT2_PORT				PORTJ&lt;br /&gt;
#define IO_SENSOR_INT3_IN				INT3_PI14 // PCINT14 PJ5  XBUS Pin 9&lt;br /&gt;
#define IO_SENSOR_INT3_DDR				DDRJ&lt;br /&gt;
#define IO_SENSOR_INT3_PIN				PINJ&lt;br /&gt;
#define IO_SENSOR_INT3_PORT				PORTJ&lt;br /&gt;
#define IO_SENSOR_INTU_IN				INTU_PI13 // PCINT13 PJ4  XBUS Pin 7&lt;br /&gt;
#define IO_SENSOR_INTU_DDR				DDRJ&lt;br /&gt;
#define IO_SENSOR_INTU_PIN				PINJ&lt;br /&gt;
#define IO_SENSOR_INTU_PORT				PORTJ&lt;br /&gt;
&lt;br /&gt;
// I/O PORT pin numbers:&lt;br /&gt;
#define PIN7							7&lt;br /&gt;
#define PIN6							6&lt;br /&gt;
#define PIN5							5&lt;br /&gt;
#define PIN4							4&lt;br /&gt;
#define PIN3							3&lt;br /&gt;
#define PIN2							2&lt;br /&gt;
#define PIN1							1&lt;br /&gt;
#define PIN0							0&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Real Time Clock (RTC DS1339):&lt;br /&gt;
#define I2C_SENSOR_RTC_ADR				0xd0	// Default&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Temperature Sensor (LM75B):&lt;br /&gt;
#define I2C_SENSOR_TEMP_ADR				0x90	// Default&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Servo Controller (PCA9685):&lt;br /&gt;
#define I2C_SENSOR_SERVO_ADR			0x88	// Default&lt;br /&gt;
&lt;br /&gt;
// Servo and PWM channels:&lt;br /&gt;
#define CH_SERVO_1						16		// At K6: 1  &amp;quot;SERVO_1&amp;quot;&lt;br /&gt;
#define CH_SERVO_2						15		// At K11: 1 &amp;quot;SERVO_2&amp;quot;&lt;br /&gt;
#define CH_SERVO_3						13		// At K29: 1 &amp;quot;SERVO_3&amp;quot;&lt;br /&gt;
#define CH_SERVO_4						14		// At K30: 1 &amp;quot;SERVO_4&amp;quot;&lt;br /&gt;
#define CH_SERVO_5						11		// At K31: 1 &amp;quot;SERVO_5&amp;quot;&lt;br /&gt;
#define CH_SERVO_6						12		// At K32: 1 &amp;quot;SERVO_6&amp;quot;&lt;br /&gt;
#define CH_SERVO_7						9		// At K33: 1 &amp;quot;SERVO_7&amp;quot;&lt;br /&gt;
#define CH_SERVO_8						10		// At K34: 1 &amp;quot;SERVO_8&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#define CH_PWM_OUT_1					1		// At K12: 1 &amp;quot;PWM_OUT&amp;quot;&lt;br /&gt;
#define CH_PWM_OUT_2					2		// At K12: 2&lt;br /&gt;
#define CH_PWM_OUT_3					3		// At K12: 3&lt;br /&gt;
#define CH_PWM_OUT_4					4		// At K12: 4&lt;br /&gt;
#define CH_PWM_OUT_5					5		// At K12: 5&lt;br /&gt;
#define CH_PWM_OUT_6					6		// At K12: 6&lt;br /&gt;
#define CH_PWM_OUT_7					7		// At K12: 7&lt;br /&gt;
#define CH_PWM_OUT_8					8		// At K12: 8&lt;br /&gt;
&lt;br /&gt;
// Servo left touch (LT), right touch (RT), middle position (MP) constants:&lt;br /&gt;
// (Hints: - Servo impulse length [ms] = Servo position value / 204.8&lt;br /&gt;
//           (Formula only valid for a PWM of 50 Hz!)&lt;br /&gt;
//         - Min. servo impulse (0,7 ms) = Servo position 143&lt;br /&gt;
//         - Mid. servo impulse (1,5 ms) = Servo position 307&lt;br /&gt;
//         - Max. servo impulse (2,3 ms) = Servo position 471&lt;br /&gt;
//         - !!! You should NOT use servo position values &amp;lt; 143 or &amp;gt; 471 !!!)&lt;br /&gt;
#define SERVO1_LT						205		// Servo impulse ~1ms&lt;br /&gt;
#define SERVO1_RT						410		// Servo impulse ~2ms&lt;br /&gt;
#define SERVO1_MP						((SERVO1_RT - SERVO1_LT) / 2 + SERVO1_LT)&lt;br /&gt;
#define SERVO2_LT						205&lt;br /&gt;
#define SERVO2_RT						410&lt;br /&gt;
#define SERVO2_MP						((SERVO2_RT - SERVO2_LT) / 2 + SERVO2_LT)&lt;br /&gt;
#define SERVO3_LT						205&lt;br /&gt;
#define SERVO3_RT						410&lt;br /&gt;
#define SERVO3_MP						((SERVO3_RT - SERVO3_LT) / 2 + SERVO3_LT)&lt;br /&gt;
#define SERVO4_LT						205&lt;br /&gt;
#define SERVO4_RT						410&lt;br /&gt;
#define SERVO4_MP						((SERVO4_RT - SERVO4_LT) / 2 + SERVO4_LT)&lt;br /&gt;
#define SERVO5_LT						205&lt;br /&gt;
#define SERVO5_RT						410&lt;br /&gt;
#define SERVO5_MP						((SERVO5_RT - SERVO5_LT) / 2 + SERVO5_LT)&lt;br /&gt;
#define SERVO6_LT						205&lt;br /&gt;
#define SERVO6_RT						410&lt;br /&gt;
#define SERVO6_MP						((SERVO6_RT - SERVO6_LT) / 2 + SERVO6_LT)&lt;br /&gt;
#define SERVO7_LT						205&lt;br /&gt;
#define SERVO7_RT						410&lt;br /&gt;
#define SERVO7_MP						((SERVO7_RT - SERVO7_LT) / 2 + SERVO7_LT)&lt;br /&gt;
#define SERVO8_LT						205&lt;br /&gt;
#define SERVO8_RT						410&lt;br /&gt;
#define SERVO8_MP						((SERVO8_RT - SERVO8_LT) / 2 + SERVO8_LT)&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C LED Driver (TCA6507):&lt;br /&gt;
#define I2C_SENSOR_LEDDRIVER_ADR		0x8a	// Default&lt;br /&gt;
&lt;br /&gt;
// LED numbers:&lt;br /&gt;
#define SB_LED0							0		// At K7&lt;br /&gt;
#define DISPLAY_BACKLIGHT				0		// Display background light&lt;br /&gt;
#define SB_LED1							1		// At K4&lt;br /&gt;
#define SB_LED2							2		// At K2&lt;br /&gt;
#define SB_LED3							3		// At K10: 1&lt;br /&gt;
#define BACKLIGHT_R						3		// Right backlight&lt;br /&gt;
#define SB_LED4							4		// At K10: 2&lt;br /&gt;
#define BACKLIGHT_L						4		// Left backlight&lt;br /&gt;
#define SB_LED5							5		// White LED (D3)&lt;br /&gt;
#define HEADLIGHT_R						5		// Right headlight&lt;br /&gt;
#define SB_LED6							6		// White LED (D1)&lt;br /&gt;
#define HEADLIGHT_L						6		// Left headlight&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C 3D Magnetometer &amp;amp; Accelerometer (LSM303DLHC):&lt;br /&gt;
&lt;br /&gt;
// LSM303DLHC accelerometer:&lt;br /&gt;
#define I2C_SENSOR_LSM303DLHC_A_ADR 	0x32	// Default&lt;br /&gt;
&lt;br /&gt;
// LSM303DLHC accelerometer calibration data:&lt;br /&gt;
#define MAX_X_A						1037		// Max. X-axis value&lt;br /&gt;
#define MIN_X_A						-1030		// Min. X-axis value&lt;br /&gt;
#define MAX_Y_A						1030		// Max. Y-axis value&lt;br /&gt;
#define MIN_Y_A						-1019		// Min. Y-axis value&lt;br /&gt;
#define MAX_Z_A						1062		// Max. Z-axis value&lt;br /&gt;
#define MIN_Z_A						-1056		// Min. Z-axis value&lt;br /&gt;
#define OFFSET_PITCH_A				0.0			// Offset Pitch [°]&lt;br /&gt;
#define OFFSET_ROLL_A				0.0			// Offset Roll [°]&lt;br /&gt;
&lt;br /&gt;
// LSM303DLHC magnetometer:&lt;br /&gt;
#define I2C_SENSOR_LSM303DLHC_M_ADR		0x3c	// Default&lt;br /&gt;
&lt;br /&gt;
// LSM303DLHC magnetometer calibration data:&lt;br /&gt;
#define MAX_X_M						-111.0		// Max. X-axis value&lt;br /&gt;
#define MIN_X_M						-634.0		// Min. X-axis value&lt;br /&gt;
#define OFFSET_X_M					0			// Hard iron X-axis offset&lt;br /&gt;
#define MAX_Y_M						297.0		// Max. Y-axis value&lt;br /&gt;
#define MIN_Y_M						-215.0		// Min. Y-axis value&lt;br /&gt;
#define OFFSET_Y_M					0			// Hard iron Y-axis offset&lt;br /&gt;
#define MAX_Z_M						183.0		// Max. Z-axis value&lt;br /&gt;
#define MIN_Z_M						-214.0		// Min. Z-axis value&lt;br /&gt;
#define OFFSET_Z_M					0			// Hard iron Z-axis offset&lt;br /&gt;
#define DECLINATION_M				0.0			// E at local position [°]&lt;br /&gt;
&lt;br /&gt;
// LSM303DLHC temperature sensor definitions:&lt;br /&gt;
#define GET_TEMP_M								// Enable temperature sensor&lt;br /&gt;
#define OFFSET_TEMP_M				0.0			// Temperature offset [°C]&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Analog Yaw-Rate Gyroscope (LY330ALH):&lt;br /&gt;
&lt;br /&gt;
// LY330ALH gyroscope:&lt;br /&gt;
#define ADC_SENSOR_LY330ALH				ADC_1	// At USRBUS: 2 (RP6BASE)&lt;br /&gt;
&lt;br /&gt;
// LY330ALH gyroscope calibration data:&lt;br /&gt;
// (Higher values [505..1023] mean an angular velocity while rotating LEFT&lt;br /&gt;
//  and lower values [503..0] while rotating RIGHT!)&lt;br /&gt;
#define ADCVAL_MINRATE					0		// Min. rate value&lt;br /&gt;
#define ADCVAL_ZERORATE_LEVEL			504		// Zero rate level&lt;br /&gt;
#define ADCVAL_MAXRATE					1023	// Max. rate value&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Hot Swappable 2-Wire Bus Buffer (TCA4311A):&lt;br /&gt;
&lt;br /&gt;
// Define USE_PD5, if you want to control the TCA4311A enable pin (EN) with&lt;br /&gt;
// the RP6 Sensor Board function &amp;quot;PD5&amp;quot;. If USE_PD5 is NOT defined (default),&lt;br /&gt;
// the TCA4311A EN pin is controlled by the MAX7311 I/O 1.0 pin.&lt;br /&gt;
// ---------------&lt;br /&gt;
//#define USE_PD5&lt;br /&gt;
// ---------------&lt;br /&gt;
&lt;br /&gt;
#define IO_SENSOR_TCA4311A_EN_IN		OC1B_PI6 // At I/O: 9 (RP6M256)&lt;br /&gt;
#define IO_SENSOR_TCA4311A_EN_DDR		DDRB&lt;br /&gt;
#define IO_SENSOR_TCA4311A_EN_PIN		PINB&lt;br /&gt;
#define IO_SENSOR_TCA4311A_EN_PORT		PORTB&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Button:&lt;br /&gt;
&lt;br /&gt;
// (Button is connected to I/O 1.7 of the MAX7311!)&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Status LED:&lt;br /&gt;
&lt;br /&gt;
// (Status LED is connected to I/O 1.6 of the MAX7311!)&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Other ADC channel definitions:&lt;br /&gt;
&lt;br /&gt;
// (Depending on connections on the RP6 Sensor Board!)&lt;br /&gt;
#define ADC_SENSOR_SHARP_F				ADC_0	// At USRBUS: 1 (RP6BASE)&lt;br /&gt;
#define ADC_SENSOR_SHARP_R				ADC_9	// At ADC: 3    (RP6M256)&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
/******************************************************************************&lt;br /&gt;
 * Additional info&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Changelog:&lt;br /&gt;
 * &lt;br /&gt;
 *  ---&amp;gt; changes are documented in the file &amp;quot;RP6M256_Sensor_BoardLib.c&amp;quot;&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=====Library Header=====&lt;br /&gt;
Datei: RP6M256_Sensor_BoardLib.h&lt;br /&gt;
&amp;lt;pre&amp;gt;/* ****************************************************************************&lt;br /&gt;
 *                           _______________________&lt;br /&gt;
 *                           \| RP6  ROBOT SYSTEM |/&lt;br /&gt;
 *                            \_-_-_-_-_-_-_-_-_-_/           &amp;gt;&amp;gt;&amp;gt; RP6 M256 WIFI&lt;br /&gt;
 * ----------------------------------------------------------------------------&lt;br /&gt;
 * ----------------------------- [c]2014 - Dirk -------------------------------&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * File: RP6M256_Sensor_BoardLib.h&lt;br /&gt;
 * Version: 1.1&lt;br /&gt;
 * Target: RP6 M256 WIFI - ATMEGA2560 @16.00MHz&lt;br /&gt;
 * Author(s): Dirk&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Description:&lt;br /&gt;
 * Header file for new RP6 Sensor Board library.&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
#ifndef RP6M256_SENSOR_BOARDLIB_H&lt;br /&gt;
#define RP6M256_SENSOR_BOARDLIB_H&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// RP6 Sensor Board hardwired components:&lt;br /&gt;
// - I2C I/O Port Expander (MAX7311)&lt;br /&gt;
// - I2C Real Time Clock (RTC DS1339)&lt;br /&gt;
// - I2C Temperature Sensor (LM75B)&lt;br /&gt;
// - I2C Servo Controller (PCA9685)&lt;br /&gt;
// - I2C LED Driver (TCA6507)&lt;br /&gt;
// - I2C 3D Magnetometer &amp;amp; Accelerometer (LSM303DLHC)&lt;br /&gt;
// - Analog Yaw-Rate Gyroscope (LY330ALH)&lt;br /&gt;
// - Hot Swappable 2-Wire Bus Buffer (TCA4311A)&lt;br /&gt;
// - Button&lt;br /&gt;
// - Status LED&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Includes:&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6M256Lib.h&amp;quot;&lt;br /&gt;
#include &amp;quot;RP6I2CmasterTWI.h&amp;quot;&lt;br /&gt;
#include &amp;quot;RP6M256_Sensor_Board.h&amp;quot;&lt;br /&gt;
#include &amp;lt;math.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// RP6M256_I2CMasterLib definitions:&lt;br /&gt;
&lt;br /&gt;
#ifndef I2C_RP6_BASE_ADR&lt;br /&gt;
	#define I2C_RP6_BASE_ADR			10&lt;br /&gt;
#endif&lt;br /&gt;
#ifndef I2C_REG_ADC_ADC0_L&lt;br /&gt;
	#define I2C_REG_ADC_ADC0_L			23&lt;br /&gt;
#endif&lt;br /&gt;
#ifndef I2C_REG_ADC_ADC1_L&lt;br /&gt;
	#define I2C_REG_ADC_ADC1_L			25&lt;br /&gt;
#endif&lt;br /&gt;
#ifndef CMD_POWER_OFF&lt;br /&gt;
	#define CMD_POWER_OFF				0&lt;br /&gt;
#endif&lt;br /&gt;
#ifndef CMD_POWER_ON&lt;br /&gt;
	#define CMD_POWER_ON				1&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C I/O Port Expander (MAX7311):&lt;br /&gt;
&lt;br /&gt;
// Registers:&lt;br /&gt;
#define MAX7311_INPUT_PORT1				0&lt;br /&gt;
#define MAX7311_INPUT_PORT2				1&lt;br /&gt;
#define MAX7311_OUTPUT_PORT1			2&lt;br /&gt;
#define MAX7311_OUTPUT_PORT2			3&lt;br /&gt;
#define MAX7311_PORT1_POL_INV			4&lt;br /&gt;
#define MAX7311_PORT2_POL_INV			5&lt;br /&gt;
#define MAX7311_PORT1_CONFIG			6&lt;br /&gt;
#define MAX7311_PORT2_CONFIG			7&lt;br /&gt;
#define MAX7311_TIMEOUT					8&lt;br /&gt;
&lt;br /&gt;
// Port 1 configuration register bitmasks:&lt;br /&gt;
#define ST_GYRO							(1 &amp;lt;&amp;lt; PIN7)	// I/O 0.7 (Output)&lt;br /&gt;
#define PD_GYRO							(1 &amp;lt;&amp;lt; PIN6)	// I/O 0.6 (Output)&lt;br /&gt;
#define PWR_CAM_IF						(1 &amp;lt;&amp;lt; PIN5)	// I/O 0.5 (Output)&lt;br /&gt;
#define EN_LEDDRIV						(1 &amp;lt;&amp;lt; PIN4)	// I/O 0.4 (Output)&lt;br /&gt;
#define RDY_BUSBUFF						(1 &amp;lt;&amp;lt; PIN3)	// I/O 0.3 (Input)&lt;br /&gt;
#define PWR_SHARP_R						(1 &amp;lt;&amp;lt; PIN2)	// I/O 0.2 (Output)&lt;br /&gt;
#define PWR_SHARP_F						(1 &amp;lt;&amp;lt; PIN1)	// I/O 0.1 (Output)&lt;br /&gt;
#define PWR_I2C							(1 &amp;lt;&amp;lt; PIN0)	// I/O 0.0 (Output)&lt;br /&gt;
&lt;br /&gt;
// Port 2 configuration register bitmasks:&lt;br /&gt;
#define IO2_I2C							(1 &amp;lt;&amp;lt; PIN7)	// I/O 1.7 (Input)&lt;br /&gt;
#define IO1_I2C							(1 &amp;lt;&amp;lt; PIN6)	// I/O 1.6 (Output)&lt;br /&gt;
#define DRDY_MAGACC						(1 &amp;lt;&amp;lt; PIN5)	// I/O 1.5 (Input)&lt;br /&gt;
#define PWR_SERVO						(1 &amp;lt;&amp;lt; PIN4)	// I/O 1.4 (Output)&lt;br /&gt;
#define OEN_SERVO						(1 &amp;lt;&amp;lt; PIN3)	// I/O 1.3 (Output)&lt;br /&gt;
#define IO_K19_1						(1 &amp;lt;&amp;lt; PIN2)	// I/O 1.2 (Input)&lt;br /&gt;
#define IO_K19_3						(1 &amp;lt;&amp;lt; PIN1)	// I/O 1.1 (Input)&lt;br /&gt;
#define EN_BUSBUFF						(1 &amp;lt;&amp;lt; PIN0)	// I/O 1.0 (Output)&lt;br /&gt;
&lt;br /&gt;
// Port 1 &amp;amp; 2 register 16-bit bitmasks:&lt;br /&gt;
// (CONFIG: 1 = Input, 0 = Output)&lt;br /&gt;
#define MAX7311_CONFIG_DEFAULT			0b1010011000001000&lt;br /&gt;
#define MAX7311_CONFIG_USE_PD5			0b1010011100001000&lt;br /&gt;
// (OUTPUT: 1 = High/True, 0 = Low/False)&lt;br /&gt;
#define MAX7311_OUTPUT_DEFAULT			0b0100000100010000&lt;br /&gt;
#define MAX7311_OUTPUT_FULLPOWER		0b0001000100110111&lt;br /&gt;
#define MAX7311_OUTPUT_SHUTDOWN			0b0100100011000000&lt;br /&gt;
&lt;br /&gt;
// Safe configuration:&lt;br /&gt;
// (Ensures if activated, that I/Os 0.3, 1.5 and 1.7 cannot be configured&lt;br /&gt;
//  as output with the function MAX7311_write_cfg(). This may protect the&lt;br /&gt;
//  RP6 Sensor Board from hardware damage.)&lt;br /&gt;
// -------------------&lt;br /&gt;
#define SAFE_CONFIG&lt;br /&gt;
// -------------------&lt;br /&gt;
&lt;br /&gt;
typedef union {&lt;br /&gt;
 	uint8_t byte;&lt;br /&gt;
	struct {&lt;br /&gt;
		unsigned int1   :1;				// INT1  XBUS Pin 8&lt;br /&gt;
		unsigned int2   :1;				// INT2  XBUS Pin 11&lt;br /&gt;
		unsigned int3   :1;				// INT3  XBUS Pin 9&lt;br /&gt;
		unsigned intu   :1;				// INTU  XBUS Pin 7&lt;br /&gt;
		unsigned unused :4;&lt;br /&gt;
	};&lt;br /&gt;
	struct {&lt;br /&gt;
		unsigned magacc1     :1;		// INT1: LSM303DLHC INT1&lt;br /&gt;
		unsigned portexp     :1;		// INT2: MAX7311 INT_N&lt;br /&gt;
		unsigned magacc2_rtc :1;		// INT3: LSM303DLHC INT2&lt;br /&gt;
		unsigned noname      :5;		//       OR DS1339 SQW/INT_N&lt;br /&gt;
	};&lt;br /&gt;
} interrupt_RP6SBstatus_t;&lt;br /&gt;
extern interrupt_RP6SBstatus_t interrupt_RP6SBstatus;&lt;br /&gt;
&lt;br /&gt;
typedef union {&lt;br /&gt;
	uint16_t word;&lt;br /&gt;
	struct {&lt;br /&gt;
		unsigned pwr_i2c     :1;		// I/O 0.0 (Output)&lt;br /&gt;
		unsigned pwr_sharp_f :1;		// I/O 0.1 (Output)&lt;br /&gt;
		unsigned pwr_sharp_r :1;		// I/O 0.2 (Output)&lt;br /&gt;
		unsigned rdy_busbuff :1;		// I/O 0.3 (Input)&lt;br /&gt;
		unsigned en_leddriv  :1;		// I/O 0.4 (Output)&lt;br /&gt;
		unsigned pwr_cam_if  :1;		// I/O 0.5 (Output)&lt;br /&gt;
		unsigned pd_gyro     :1;		// I/O 0.6 (Output)&lt;br /&gt;
		unsigned st_gyro     :1;		// I/O 0.7 (Output)&lt;br /&gt;
		unsigned en_busbuff  :1;		// I/O 1.0 (Output)&lt;br /&gt;
		unsigned io_k19_3    :1;		// I/O 1.1 (Input)&lt;br /&gt;
		unsigned io_k19_1    :1;		// I/O 1.2 (Input)&lt;br /&gt;
		unsigned oen_servo   :1;		// I/O 1.3 (Output)&lt;br /&gt;
		unsigned pwr_servo   :1;		// I/O 1.4 (Output)&lt;br /&gt;
		unsigned drdy_magacc :1;		// I/O 1.5 (Input)&lt;br /&gt;
		unsigned io1_i2c     :1;		// I/O 1.6 (Output)&lt;br /&gt;
		unsigned io2_i2c     :1;		// I/O 1.7 (Input)&lt;br /&gt;
	};&lt;br /&gt;
} max7311IOs_t;&lt;br /&gt;
extern max7311IOs_t inport;&lt;br /&gt;
extern max7311IOs_t outport;&lt;br /&gt;
extern uint8_t readyBusbuff;&lt;br /&gt;
extern uint8_t pressedButton;&lt;br /&gt;
&lt;br /&gt;
void MAX7311_write_cfg(uint16_t);&lt;br /&gt;
void task_checkINTs(void);&lt;br /&gt;
void task_RP6SensorBoard(void);&lt;br /&gt;
void MAX7311_update(void);&lt;br /&gt;
void MAX7311_write(uint16_t);&lt;br /&gt;
void MAX7311_init(void);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Real Time Clock (RTC DS1339):&lt;br /&gt;
&lt;br /&gt;
// Registers:&lt;br /&gt;
#define DS1339_SECONDS					0&lt;br /&gt;
#define DS1339_MINUTES					1&lt;br /&gt;
#define DS1339_HOURS					2&lt;br /&gt;
#define DS1339_DAY						3&lt;br /&gt;
#define DS1339_DATE						4&lt;br /&gt;
#define DS1339_MONTH_CENTURY			5&lt;br /&gt;
#define DS1339_YEAR						6&lt;br /&gt;
#define DS1339_ALARM1_SECONDS			7&lt;br /&gt;
#define DS1339_ALARM1_MINUTES			8&lt;br /&gt;
#define DS1339_ALARM1_HOURS				9&lt;br /&gt;
#define DS1339_ALARM1_DAY_DATE			10&lt;br /&gt;
#define DS1339_ALARM2_MINUTES			11&lt;br /&gt;
#define DS1339_ALARM2_HOURS				12&lt;br /&gt;
#define DS1339_ALARM2_DAY_DATE			13&lt;br /&gt;
#define DS1339_CONTROL					14&lt;br /&gt;
#define DS1339_STATUS					15&lt;br /&gt;
#define DS1339_TRICKLE_CHARGER			16&lt;br /&gt;
&lt;br /&gt;
// Control register bitmasks:&lt;br /&gt;
#define DS1339_CONTROL_DEFAULT			0		// Power on default&lt;br /&gt;
#define DS1339_CONTROL_A1IE				1&lt;br /&gt;
#define DS1339_CONTROL_A2IE				2&lt;br /&gt;
#define DS1339_CONTROL_INTCN			4&lt;br /&gt;
#define DS1339_CONTROL_RS1				8&lt;br /&gt;
#define DS1339_CONTROL_RS2				16&lt;br /&gt;
#define DS1339_CONTROL_BBSQI			32&lt;br /&gt;
#define DS1339_CONTROL_EOSC				128&lt;br /&gt;
&lt;br /&gt;
// Trickle Charger register bitmasks:&lt;br /&gt;
#define DS1339_TRICKLE_CHARGER_DEFAULT	0b10101010 // One diode, 2k resistor&lt;br /&gt;
#define DS1339_TRICKLE_CHARGER_ROUT0	1&lt;br /&gt;
#define DS1339_TRICKLE_CHARGER_ROUT1	2&lt;br /&gt;
#define DS1339_TRICKLE_CHARGER_DS0		4&lt;br /&gt;
#define DS1339_TRICKLE_CHARGER_DS1		8&lt;br /&gt;
#define DS1339_TRICKLE_CHARGER_TCS0		16&lt;br /&gt;
#define DS1339_TRICKLE_CHARGER_TCS1		32&lt;br /&gt;
#define DS1339_TRICKLE_CHARGER_TCS2		64&lt;br /&gt;
#define DS1339_TRICKLE_CHARGER_TCS3		128&lt;br /&gt;
&lt;br /&gt;
enum RTCWEEKDAYS {&lt;br /&gt;
	R_MO = 1, R_TU, R_WE, R_TH, R_FR, R_SA, R_SU&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
typedef struct {&lt;br /&gt;
	uint16_t         year;				// Year&lt;br /&gt;
	uint8_t          month;				// Month   [1..12]&lt;br /&gt;
	enum RTCWEEKDAYS weekday;			// Weekday [1..7 = R_MO..R_SU]&lt;br /&gt;
	uint8_t          day;				// Day     [1..31]&lt;br /&gt;
} rtcdate_t;&lt;br /&gt;
rtcdate_t rtc_date;&lt;br /&gt;
&lt;br /&gt;
typedef struct {&lt;br /&gt;
	uint8_t dst;						// Daylight-saving-time (time zone)&lt;br /&gt;
	uint8_t hour;						// Hour    [0..23]&lt;br /&gt;
	uint8_t minute;						// Minute  [0..59]&lt;br /&gt;
	uint8_t second;						// Second  [0..59]&lt;br /&gt;
} rtctime_t;&lt;br /&gt;
rtctime_t rtc_time;&lt;br /&gt;
&lt;br /&gt;
uint8_t BCD2DEC(uint8_t);&lt;br /&gt;
uint8_t DEC2BCD(uint8_t);&lt;br /&gt;
void DS1339_write_cfg(uint8_t);&lt;br /&gt;
void DS1339_init(void);&lt;br /&gt;
#define CALC_DST						// Time zone will be calculated&lt;br /&gt;
void DS1339_read(void);&lt;br /&gt;
void DS1339_write(void);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Temperature Sensor (LM75B):&lt;br /&gt;
&lt;br /&gt;
// Registers:&lt;br /&gt;
#define LM75B_TEMP						0&lt;br /&gt;
#define LM75B_CONF						1&lt;br /&gt;
#define LM75B_THYST						2&lt;br /&gt;
#define LM75B_TOS						3&lt;br /&gt;
&lt;br /&gt;
// Conf register bitmasks:&lt;br /&gt;
#define LM75B_CONF_DEFAULT				0		// Power on default&lt;br /&gt;
#define LM75B_CONF_SHUTDOWN				1&lt;br /&gt;
#define LM75B_CONF_OS_COMP_INT			2&lt;br /&gt;
#define LM75B_CONF_OS_POL				4&lt;br /&gt;
#define LM75B_CONF_OS_F_QUE0			8&lt;br /&gt;
#define LM75B_CONF_OS_F_QUE1			16&lt;br /&gt;
&lt;br /&gt;
extern double temperature;&lt;br /&gt;
&lt;br /&gt;
void LM75B_write_cfg(uint8_t);&lt;br /&gt;
#define LM75B_shutdown() {LM75B_write_cfg(LM75B_CONF_SHUTDOWN);}&lt;br /&gt;
#define LM75B_init() {LM75B_write_cfg(LM75B_CONF_DEFAULT);}&lt;br /&gt;
extern uint8_t temperature_low;&lt;br /&gt;
extern uint8_t temperature_high;&lt;br /&gt;
#define getTemperatureHigh() (temperature_high)&lt;br /&gt;
#define getTemperatureLow() (temperature_low)&lt;br /&gt;
void LM75B_read(void);&lt;br /&gt;
double LM75B_calculate(void);&lt;br /&gt;
double LM75B_measure(void);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Servo Controller (PCA9685):&lt;br /&gt;
&lt;br /&gt;
// Registers:&lt;br /&gt;
#define PCA9685_MODE1					0&lt;br /&gt;
#define PCA9685_MODE2					1&lt;br /&gt;
#define PCA9685_SUBADR1					2&lt;br /&gt;
#define PCA9685_SUBADR2					3&lt;br /&gt;
#define PCA9685_SUBADR3					4&lt;br /&gt;
#define PCA9685_ALLCALLADR				5&lt;br /&gt;
#define PCA9685_LED0_ON_L				6&lt;br /&gt;
#define PCA9685_LED0_ON_H				7&lt;br /&gt;
#define PCA9685_LED0_OFF_L				8&lt;br /&gt;
#define PCA9685_LED0_OFF_H				9&lt;br /&gt;
#define PCA9685_LED1_ON_L				10&lt;br /&gt;
#define PCA9685_LED1_ON_H				11&lt;br /&gt;
#define PCA9685_LED1_OFF_L				12&lt;br /&gt;
#define PCA9685_LED1_OFF_H				13&lt;br /&gt;
#define PCA9685_LED2_ON_L				14&lt;br /&gt;
#define PCA9685_LED2_ON_H				15&lt;br /&gt;
#define PCA9685_LED2_OFF_L				16&lt;br /&gt;
#define PCA9685_LED2_OFF_H				17&lt;br /&gt;
#define PCA9685_LED3_ON_L				18&lt;br /&gt;
#define PCA9685_LED3_ON_H				19&lt;br /&gt;
#define PCA9685_LED3_OFF_L				20&lt;br /&gt;
#define PCA9685_LED3_OFF_H				21&lt;br /&gt;
#define PCA9685_LED4_ON_L				22&lt;br /&gt;
#define PCA9685_LED4_ON_H				23&lt;br /&gt;
#define PCA9685_LED4_OFF_L				24&lt;br /&gt;
#define PCA9685_LED4_OFF_H				25&lt;br /&gt;
#define PCA9685_LED5_ON_L				26&lt;br /&gt;
#define PCA9685_LED5_ON_H				27&lt;br /&gt;
#define PCA9685_LED5_OFF_L				28&lt;br /&gt;
#define PCA9685_LED5_OFF_H				29&lt;br /&gt;
#define PCA9685_LED6_ON_L				30&lt;br /&gt;
#define PCA9685_LED6_ON_H				31&lt;br /&gt;
#define PCA9685_LED6_OFF_L				32&lt;br /&gt;
#define PCA9685_LED6_OFF_H				33&lt;br /&gt;
#define PCA9685_LED7_ON_L				34&lt;br /&gt;
#define PCA9685_LED7_ON_H				35&lt;br /&gt;
#define PCA9685_LED7_OFF_L				36&lt;br /&gt;
#define PCA9685_LED7_OFF_H				37&lt;br /&gt;
#define PCA9685_LED8_ON_L				38&lt;br /&gt;
#define PCA9685_LED8_ON_H				39&lt;br /&gt;
#define PCA9685_LED8_OFF_L				40&lt;br /&gt;
#define PCA9685_LED8_OFF_H				41&lt;br /&gt;
#define PCA9685_LED9_ON_L				42&lt;br /&gt;
#define PCA9685_LED9_ON_H				43&lt;br /&gt;
#define PCA9685_LED9_OFF_L				44&lt;br /&gt;
#define PCA9685_LED9_OFF_H				45&lt;br /&gt;
#define PCA9685_LED10_ON_L				46&lt;br /&gt;
#define PCA9685_LED10_ON_H				47&lt;br /&gt;
#define PCA9685_LED10_OFF_L				48&lt;br /&gt;
#define PCA9685_LED10_OFF_H				49&lt;br /&gt;
#define PCA9685_LED11_ON_L				50&lt;br /&gt;
#define PCA9685_LED11_ON_H				51&lt;br /&gt;
#define PCA9685_LED11_OFF_L				52&lt;br /&gt;
#define PCA9685_LED11_OFF_H				53&lt;br /&gt;
#define PCA9685_LED12_ON_L				54&lt;br /&gt;
#define PCA9685_LED12_ON_H				55&lt;br /&gt;
#define PCA9685_LED12_OFF_L				56&lt;br /&gt;
#define PCA9685_LED12_OFF_H				57&lt;br /&gt;
#define PCA9685_LED13_ON_L				58&lt;br /&gt;
#define PCA9685_LED13_ON_H				59&lt;br /&gt;
#define PCA9685_LED13_OFF_L				60&lt;br /&gt;
#define PCA9685_LED13_OFF_H				61&lt;br /&gt;
#define PCA9685_LED14_ON_L				62&lt;br /&gt;
#define PCA9685_LED14_ON_H				63&lt;br /&gt;
#define PCA9685_LED14_OFF_L				64&lt;br /&gt;
#define PCA9685_LED14_OFF_H				65&lt;br /&gt;
#define PCA9685_LED15_ON_L				66&lt;br /&gt;
#define PCA9685_LED15_ON_H				67&lt;br /&gt;
#define PCA9685_LED15_OFF_L				68&lt;br /&gt;
#define PCA9685_LED15_OFF_H				69&lt;br /&gt;
#define PCA9685_ALL_LED_ON_L			250&lt;br /&gt;
#define PCA9685_ALL_LED_ON_H			251&lt;br /&gt;
#define PCA9685_ALL_LED_OFF_L			252&lt;br /&gt;
#define PCA9685_ALL_LED_OFF_H			253&lt;br /&gt;
#define PCA9685_PRE_SCALE				254&lt;br /&gt;
#define PCA9685_TESTMODE				255&lt;br /&gt;
&lt;br /&gt;
// Mode1 register bitmasks:&lt;br /&gt;
#define PCA9685_MODE1_ALLCALL			1&lt;br /&gt;
#define PCA9685_MODE1_SUB3				2&lt;br /&gt;
#define PCA9685_MODE1_SUB2				4&lt;br /&gt;
#define PCA9685_MODE1_SUB1				8&lt;br /&gt;
#define PCA9685_MODE1_SLEEP				16&lt;br /&gt;
#define PCA9685_MODE1_AI				32&lt;br /&gt;
#define PCA9685_MODE1_EXTCLK			64&lt;br /&gt;
#define PCA9685_MODE1_RESTART			128&lt;br /&gt;
&lt;br /&gt;
// Mode2 register bitmasks:&lt;br /&gt;
#define PCA9685_MODE2_OUTNE01_DEFAULT	0&lt;br /&gt;
#define PCA9685_MODE2_OUTDRV			4&lt;br /&gt;
#define PCA9685_MODE2_OCH				8&lt;br /&gt;
#define PCA9685_MODE2_INVRT				16&lt;br /&gt;
&lt;br /&gt;
#define F_PCA9685						25000000.0	// Int. Clock: 25 MHz&lt;br /&gt;
&lt;br /&gt;
void PCA9685_init(uint16_t);&lt;br /&gt;
#define initServo(__FREQ__) {PCA9685_init(__FREQ__);}&lt;br /&gt;
uint8_t servo(uint8_t);&lt;br /&gt;
void PCA9685_set(uint8_t, uint16_t);&lt;br /&gt;
#define setServo(__SERVO__,__POS__) {PCA9685_set(servo(__SERVO__),__POS__);}&lt;br /&gt;
void PCA9685_shutdown(void);&lt;br /&gt;
void PCA9685_restart(void);&lt;br /&gt;
void setServoPower(uint8_t);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C LED Driver (TCA6507):&lt;br /&gt;
&lt;br /&gt;
// Registers:&lt;br /&gt;
#define TCA6507_SELECT0				0&lt;br /&gt;
#define TCA6507_SELECT1				1&lt;br /&gt;
#define TCA6507_SELECT2				2&lt;br /&gt;
#define TCA6507_FADEON_TIME			3&lt;br /&gt;
#define TCA6507_FULLYON_TIME		4&lt;br /&gt;
#define TCA6507_FADEOFF_TIME		5&lt;br /&gt;
#define TCA6507_1ST_FULLYOFF_TIME	6&lt;br /&gt;
#define TCA6507_2ND_FULLYOFF_TIME	7&lt;br /&gt;
#define TCA6507_MAXIMUM_INTENSITY	8&lt;br /&gt;
#define TCA6507_MASTER_INTENSITY	9&lt;br /&gt;
#define TCA6507_INITIALIZATION		10&lt;br /&gt;
&lt;br /&gt;
// Output states:&lt;br /&gt;
#define STATE_OFF					0&lt;br /&gt;
#define STATE_PWM0					2&lt;br /&gt;
#define STATE_PWM1					3&lt;br /&gt;
#define STATE_ON					4&lt;br /&gt;
#define STATE_MINT					5&lt;br /&gt;
#define STATE_BLINK0				6&lt;br /&gt;
#define STATE_BLINK1				7&lt;br /&gt;
&lt;br /&gt;
extern uint8_t select[3];&lt;br /&gt;
&lt;br /&gt;
void TCA6507_write_cfg(uint8_t, uint8_t);&lt;br /&gt;
void TCA6507_update(void);&lt;br /&gt;
void TCA6507_set(uint8_t, uint8_t);&lt;br /&gt;
#define setLED(__LED__,__STATE__) {TCA6507_set(__LED__,__STATE__);}&lt;br /&gt;
void TCA6507_shutdown(void);&lt;br /&gt;
void TCA6507_restart(void);&lt;br /&gt;
void TCA6507_init(void);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C 3D Magnetometer &amp;amp; Accelerometer (LSM303DLHC):&lt;br /&gt;
&lt;br /&gt;
// LSM303DLHC accelerometer internal registers:&lt;br /&gt;
#define CTRL_REG1_A					0x20&lt;br /&gt;
#define CTRL_REG2_A					0x21&lt;br /&gt;
#define CTRL_REG3_A					0x22&lt;br /&gt;
#define CTRL_REG4_A					0x23&lt;br /&gt;
#define CTRL_REG5_A					0x24&lt;br /&gt;
#define CTRL_REG6_A					0x25&lt;br /&gt;
#define REFERENCE_A					0x26&lt;br /&gt;
#define STATUS_REG_A				0x27&lt;br /&gt;
#define OUT_X_L_A					0x28&lt;br /&gt;
#define OUT_X_H_A					0x29&lt;br /&gt;
#define OUT_Y_L_A					0x2a&lt;br /&gt;
#define OUT_Y_H_A					0x2b&lt;br /&gt;
#define OUT_Z_L_A					0x2c&lt;br /&gt;
#define OUT_Z_H_A					0x2d&lt;br /&gt;
#define FIFO_CTRL_REG_A				0x2e&lt;br /&gt;
#define FIFO_SRC_REG_A				0x2f&lt;br /&gt;
#define INT1_CFG_A					0x30&lt;br /&gt;
#define INT1_SOURCE_A				0x31&lt;br /&gt;
#define INT1_THS_A					0x32&lt;br /&gt;
#define INT1_DURATION_A				0x33&lt;br /&gt;
#define INT2_CFG_A					0x34&lt;br /&gt;
#define INT2_SOURCE_A				0x35&lt;br /&gt;
#define INT2_THS_A					0x36&lt;br /&gt;
#define INT2_DURATION_A				0x37&lt;br /&gt;
#define CLICK_CFG_A					0x38&lt;br /&gt;
#define CLICK_SRC_A					0x39&lt;br /&gt;
#define CLICK_THS_A					0x3a&lt;br /&gt;
#define TIME_LIMIT_A				0x3b&lt;br /&gt;
#define TIME_LATENCY_A				0x3c&lt;br /&gt;
#define TIME_WINDOW_A				0x3d&lt;br /&gt;
&lt;br /&gt;
// LSM303DLHC accelerometer register settings:&lt;br /&gt;
#define CTRL_REG1_A_10HZ			0b00100111	// 10Hz &amp;amp; all axes enable&lt;br /&gt;
#define CTRL_REG1_A_50HZ			0b01000111	// 50Hz &amp;amp; all axes enable&lt;br /&gt;
#define CTRL_REG4_A_DEFAULT			0b00000000	// Default (Normal mode)&lt;br /&gt;
#define CTRL_REG4_A_HR				0b00001000	// HR output mode&lt;br /&gt;
&lt;br /&gt;
// LSM303DLHC magnetometer internal registers:&lt;br /&gt;
#define CRA_REG_M					0x00&lt;br /&gt;
#define CRB_REG_M					0x01&lt;br /&gt;
#define MR_REG_M					0x02&lt;br /&gt;
#define OUT_X_H_M					0x03&lt;br /&gt;
#define OUT_X_L_M					0x04&lt;br /&gt;
#define OUT_Z_H_M					0x05&lt;br /&gt;
#define OUT_Z_L_M					0x06&lt;br /&gt;
#define OUT_Y_H_M					0x07&lt;br /&gt;
#define OUT_Y_L_M					0x08&lt;br /&gt;
#define SR_REG_MG					0x09&lt;br /&gt;
#define IRA_REG_M					0x0a&lt;br /&gt;
#define IRB_REG_M					0x0b&lt;br /&gt;
#define IRC_REG_M					0x0c&lt;br /&gt;
#define TEMP_OUT_H_M				0x31&lt;br /&gt;
#define TEMP_OUT_L_M				0x32&lt;br /&gt;
&lt;br /&gt;
// LSM303DLHC magnetometer register settings:&lt;br /&gt;
#define CRA_REG_M_15HZ				0b00010000	// Default (Data rate 15Hz)&lt;br /&gt;
#define CRA_REG_M_15HZ_T_EN			0b10010000	// 15Hz &amp;amp; temperature enable&lt;br /&gt;
#define CRB_REG_M_13GAUSS			0b00100000	// Gain +-1.3Gauss&lt;br /&gt;
#define MR_REG_M_CCM				0b00000000	// Continuous-conversion mode&lt;br /&gt;
#define MR_REG_M_SCM				0b00000001	// Single-conversion mode&lt;br /&gt;
#define MR_REG_M_SLEEP				0b00000011	// Default (Sleep-mode)&lt;br /&gt;
&lt;br /&gt;
extern int16_t x_axisa, y_axisa, z_axisa;&lt;br /&gt;
extern double pitch, roll;&lt;br /&gt;
extern double xa, ya, za;&lt;br /&gt;
extern double the, phi;&lt;br /&gt;
&lt;br /&gt;
extern int16_t x_axism, y_axism, z_axism;&lt;br /&gt;
extern int16_t headingm;&lt;br /&gt;
extern double xm, ym, zm;&lt;br /&gt;
#ifdef GET_TEMP_M&lt;br /&gt;
extern int16_t temperaturem;&lt;br /&gt;
extern double temperature_mag;&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
extern int16_t headingtc;&lt;br /&gt;
&lt;br /&gt;
void LSM303DLHC_A_init(void);&lt;br /&gt;
void readLSM303DLHC_A(void);&lt;br /&gt;
void normalizeLSM303DLHC_A(void);&lt;br /&gt;
void positionLSM303DLHC_A(void);&lt;br /&gt;
&lt;br /&gt;
void LSM303DLHC_M_init(void);&lt;br /&gt;
void readLSM303DLHC_M(void);&lt;br /&gt;
void normalizeLSM303DLHC_M(void);&lt;br /&gt;
int16_t headingLSM303DLHC_M(void);&lt;br /&gt;
&lt;br /&gt;
int16_t headingLSM303DLHC_TC(void);&lt;br /&gt;
&lt;br /&gt;
void LSM303DLHC_init(void);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Analog Yaw-Rate Gyroscope (LY330ALH):&lt;br /&gt;
&lt;br /&gt;
#define LY330ALH_MODE_NORMAL		0			// Power on default&lt;br /&gt;
#define LY330ALH_MODE_SLEEP			1&lt;br /&gt;
#define LY330ALH_MODE_SELFTEST		2&lt;br /&gt;
#define LY330ALH_MODE_POWERDOWN		3			// Shutdown mode&lt;br /&gt;
&lt;br /&gt;
extern int16_t z_axisg;&lt;br /&gt;
&lt;br /&gt;
void LY330ALH_set_mode(uint8_t);&lt;br /&gt;
uint16_t getRP6Base_ADC1(void);&lt;br /&gt;
int16_t LY330ALH_measure(void);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Hot Swappable 2-Wire Bus Buffer (TCA4311A):&lt;br /&gt;
&lt;br /&gt;
//extern uint8_t readyBusbuff;			// See &amp;quot;I2C I/O Port Expander&amp;quot; section&lt;br /&gt;
extern uint8_t errorBusbuff;&lt;br /&gt;
&lt;br /&gt;
#define getReadyBusbuff() (readyBusbuff)&lt;br /&gt;
uint8_t readReadyBusbuff(void);&lt;br /&gt;
void TCA4311A_shutdown(void);&lt;br /&gt;
void TCA4311A_reconnect(void);&lt;br /&gt;
void setRP6Base_PWR(uint8_t);&lt;br /&gt;
void setI2CModulePower(uint8_t);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Button:&lt;br /&gt;
&lt;br /&gt;
//extern uint8_t pressedButton;			// See &amp;quot;I2C I/O Port Expander&amp;quot; section&lt;br /&gt;
&lt;br /&gt;
#define getPressedButton() (pressedButton)&lt;br /&gt;
uint8_t readButton(void);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Status LED:&lt;br /&gt;
&lt;br /&gt;
void setStatusLED(uint8_t);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// RP6 Sensor Board initialisation and shutdown:&lt;br /&gt;
&lt;br /&gt;
void sensor_board_init(void);&lt;br /&gt;
void sensor_board_shutdown(void);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
/******************************************************************************&lt;br /&gt;
 * Additional info&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Changelog:&lt;br /&gt;
 * &lt;br /&gt;
 *  ---&amp;gt; changes are documented in the file &amp;quot;RP6M256_Sensor_BoardLib.c&amp;quot;&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=====Library Source=====&lt;br /&gt;
Datei: RP6M256_Sensor_BoardLib.c&lt;br /&gt;
&amp;lt;pre&amp;gt;/* ****************************************************************************&lt;br /&gt;
 *                           _______________________&lt;br /&gt;
 *                           \| RP6  ROBOT SYSTEM |/&lt;br /&gt;
 *                            \_-_-_-_-_-_-_-_-_-_/           &amp;gt;&amp;gt;&amp;gt; RP6 M256 WIFI&lt;br /&gt;
 * ----------------------------------------------------------------------------&lt;br /&gt;
 * ----------------------------- [c]2014 - Dirk -------------------------------&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * File: RP6M256_Sensor_BoardLib.c&lt;br /&gt;
 * Version: 1.1&lt;br /&gt;
 * Target: RP6 M256 WIFI - ATMEGA2560 @16.00MHz&lt;br /&gt;
 *         and a RP6 Sensor Board (CONRAD 1082384)&lt;br /&gt;
 * Author(s): Dirk&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Description:&lt;br /&gt;
 * This is our new Library that contains basic routines and functions for&lt;br /&gt;
 * accessing the hardwired components of the RP6 Sensor Board (CONRAD 1082384).&lt;br /&gt;
 * This library assumes the RP6 Sensor Board Revision 2.0 (04.07.13).&lt;br /&gt;
 *&lt;br /&gt;
 * There are more sensors and actors, that may be connected to the RP6 Sensor&lt;br /&gt;
 * Board: Many I2C components including a GPS module (CONRAD 1082385), servo&lt;br /&gt;
 *        motors, SHARP IR distance sensors, LEDs, a camera ...&lt;br /&gt;
 * This library doesn't contain functions for these sensors/actors, because&lt;br /&gt;
 * they are not HARDWIRED to the RP6 Sensor Board and may be connected&lt;br /&gt;
 * OPTIONALLY.&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// RP6 Sensor Board hardwired components:&lt;br /&gt;
// - I2C I/O Port Expander (MAX7311)&lt;br /&gt;
// - I2C Real Time Clock (RTC DS1339)&lt;br /&gt;
// - I2C Temperature Sensor (LM75B)&lt;br /&gt;
// - I2C Servo Controller (PCA9685)&lt;br /&gt;
// - I2C LED Driver (TCA6507)&lt;br /&gt;
// - I2C 3D Magnetometer &amp;amp; Accelerometer (LSM303DLHC)&lt;br /&gt;
// - Analog Yaw-Rate Gyroscope (LY330ALH)&lt;br /&gt;
// - Hot Swappable 2-Wire Bus Buffer (TCA4311A)&lt;br /&gt;
// - Button&lt;br /&gt;
// - Status LED&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Includes:&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6M256_Sensor_BoardLib.h&amp;quot; 		&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Variables:&lt;br /&gt;
&lt;br /&gt;
uint8_t registerBuf[13]; &lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C I/O Port Expander (MAX7311):&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Sends the configuration word to a MAX7311.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: config -&amp;gt; Config word for control&lt;br /&gt;
 *                  registers&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void MAX7311_write_cfg(uint16_t config)&lt;br /&gt;
{&lt;br /&gt;
#ifdef SAFE_CONFIG&lt;br /&gt;
	config |= 0b1010000000001000;&lt;br /&gt;
#endif&lt;br /&gt;
	I2CTWI_transmit3Bytes(I2C_SENSOR_PORTEXP_ADR, MAX7311_PORT1_CONFIG, config, (config&amp;gt;&amp;gt;8));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
interrupt_RP6SBstatus_t interrupt_RP6SBstatus;&lt;br /&gt;
&lt;br /&gt;
/** &lt;br /&gt;
 * This function checks all interrupt pins on&lt;br /&gt;
 * the XBUS (INT1..3, INTU).&lt;br /&gt;
 * This function must be called VERY frequently&lt;br /&gt;
 * out of the main loop.&lt;br /&gt;
 * Bigger delays result in slower reaction to&lt;br /&gt;
 * interrupt requests of the RP6 Sensor Board.&lt;br /&gt;
 * Interrupt function table:&lt;br /&gt;
 *   Int. : Function 1      IRQ  Function 2       IRQ&lt;br /&gt;
 *   -------------------------------------------------&lt;br /&gt;
 *   INT1 : LSM303DLHC INT1  H&lt;br /&gt;
 *   INT2 : MAX7311   INT_N  L&lt;br /&gt;
 *   INT3 : LSM303DLHC INT2  H   DS1339 SQW/INT_N  L&lt;br /&gt;
 *   INTU : not used&lt;br /&gt;
 * You can see in the &amp;quot;IRQ&amp;quot; column, which level&lt;br /&gt;
 * (H/L) means an ACTIVE INTERRUPT signal.&lt;br /&gt;
 * The interrupt pin levels (H=true/L=false) are&lt;br /&gt;
 * read into the global interrupt_RP6SBstatus&lt;br /&gt;
 * variable.&lt;br /&gt;
 *&lt;br /&gt;
 * Hints: - This function checks the interrupt&lt;br /&gt;
 *          signals by polling. This is NOT the&lt;br /&gt;
 *          best way to do this job. You will&lt;br /&gt;
 *          have to write your own task, if you&lt;br /&gt;
 *          want to use the Pin Change Interrupt&lt;br /&gt;
 *          function of the ATmega2560&lt;br /&gt;
 *          microcontroller.&lt;br /&gt;
 *        - You cannot use both interrupt sources&lt;br /&gt;
 *          for INT3! So you should not use INT2&lt;br /&gt;
 *          of the LSM303DLHC together with the&lt;br /&gt;
 *          alarm function of the DS1339 (RTC)!&lt;br /&gt;
 *        - Every interrupt signal of the Sensor&lt;br /&gt;
 *          Board may be cut off from the XBUS&lt;br /&gt;
 *          by opening a jumper (Jx):&lt;br /&gt;
 *          INT1 -&amp;gt; J3 (LSM303DLHC INT1)&lt;br /&gt;
 *          INT2 -&amp;gt; J4 (MAX7311 INT_N)&lt;br /&gt;
 *          INT3 -&amp;gt; J2 (DS1339 SQW/INT_N)&lt;br /&gt;
 *          INT3 -&amp;gt; J5 (LSM303DLHC INT2)&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *&lt;br /&gt;
 *   if (!interrupt_RP6SBstatus.portexp)&lt;br /&gt;
 *        writeString_P(&amp;quot;==&amp;gt; MAX7311 INT_N!!!&amp;quot;);&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void task_checkINTs(void)&lt;br /&gt;
{&lt;br /&gt;
	if(IO_SENSOR_INT1_PIN &amp;amp; IO_SENSOR_INT1_IN)	// XBUS INT1 -&amp;gt; PJ3 (PCINT12)&lt;br /&gt;
		interrupt_RP6SBstatus.int1 = true;&lt;br /&gt;
	else&lt;br /&gt;
		interrupt_RP6SBstatus.int1 = false;&lt;br /&gt;
	if(IO_SENSOR_INT2_PIN &amp;amp; IO_SENSOR_INT2_IN)	// XBUS INT2 -&amp;gt; PJ6 (PCINT15)&lt;br /&gt;
		interrupt_RP6SBstatus.int2 = true;&lt;br /&gt;
	else&lt;br /&gt;
		interrupt_RP6SBstatus.int2 = false;&lt;br /&gt;
	if(IO_SENSOR_INT3_PIN &amp;amp; IO_SENSOR_INT3_IN)	// XBUS INT3 -&amp;gt; PJ5 (PCINT14)&lt;br /&gt;
		interrupt_RP6SBstatus.int3 = true;&lt;br /&gt;
	else&lt;br /&gt;
		interrupt_RP6SBstatus.int3 = false;&lt;br /&gt;
//	if(IO_SENSOR_INTU_PIN &amp;amp; IO_SENSOR_INTU_IN)	// XBUS INTU -&amp;gt; PJ4 (PCINT13)&lt;br /&gt;
//		interrupt_RP6SBstatus.intu = true;&lt;br /&gt;
//	else&lt;br /&gt;
//		interrupt_RP6SBstatus.intu = false;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
max7311IOs_t inport;&lt;br /&gt;
uint8_t readyBusbuff;&lt;br /&gt;
uint8_t pressedButton;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function checks all I/O ports (I/O 0.0..1.7)&lt;br /&gt;
 * of the MAX7311 sequentially!&lt;br /&gt;
 * You must call this function frequently out of&lt;br /&gt;
 * the main loop.&lt;br /&gt;
 * The I/O port values (true/false) are read into&lt;br /&gt;
 * the global inport variable.&lt;br /&gt;
 * The global variables readyBusbuff (2-Wire Bus&lt;br /&gt;
 * Buffer: Enable) and pressedButton (Button S1:&lt;br /&gt;
 * Pressed) contain actual values (true/false)&lt;br /&gt;
 * after execution of this task.&lt;br /&gt;
 *&lt;br /&gt;
 * Examples:&lt;br /&gt;
 *&lt;br /&gt;
 *   if (inport.rdy_busbuff)&lt;br /&gt;
 *        writeString_P(&amp;quot;I/O 0.3: High&amp;quot;);&lt;br /&gt;
 *   else writeString_P(&amp;quot;I/O 0.3: Low&amp;quot;);&lt;br /&gt;
 *   if (!inport.drdy_magacc)&lt;br /&gt;
 *        writeString_P(&amp;quot;I/O 1.5: Low&amp;quot;);&lt;br /&gt;
 *   if (pressedButton)&lt;br /&gt;
 *        writeString_P(&amp;quot;Button pressed!&amp;quot;);&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void task_RP6SensorBoard(void)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmitByte(I2C_SENSOR_PORTEXP_ADR, MAX7311_INPUT_PORT1);&lt;br /&gt;
	I2CTWI_readBytes(I2C_SENSOR_PORTEXP_ADR, registerBuf, 2);&lt;br /&gt;
	inport.word = (registerBuf[1] &amp;lt;&amp;lt; 8) + registerBuf[0];&lt;br /&gt;
	readyBusbuff = inport.rdy_busbuff;&lt;br /&gt;
	pressedButton = inport.io2_i2c;&lt;br /&gt;
	pressedButton = !pressedButton;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
max7311IOs_t outport;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Updates the I/O ports with current value from&lt;br /&gt;
 * the global outport variable!&lt;br /&gt;
 * If one or more port pins were configured as&lt;br /&gt;
 * output before, they will be set (high) or&lt;br /&gt;
 * cleared (low).&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *&lt;br /&gt;
 *   outport.word = 0b0000000000001001;&lt;br /&gt;
 *   MAX7311_update();&lt;br /&gt;
 *   // This clears all I/O ports and sets&lt;br /&gt;
 *   // the ports I/O 0.0 and I/O 0.3!&lt;br /&gt;
 *&lt;br /&gt;
 *   // Other possibility:&lt;br /&gt;
 *   outport.pwr_sharp_f = true;&lt;br /&gt;
 *   MAX7311_update();&lt;br /&gt;
 *   // This sets I/O 0.1 and does not&lt;br /&gt;
 *   // affect any other I/O port!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void MAX7311_update(void)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmit3Bytes(I2C_SENSOR_PORTEXP_ADR, MAX7311_OUTPUT_PORT1, outport.word, (outport.word&amp;gt;&amp;gt;8));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Writes the 16-bit data to a MAX7311.&lt;br /&gt;
 * The data are output with those I/O ports that&lt;br /&gt;
 * were configured as output before.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: data -&amp;gt; Data word&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void MAX7311_write(uint16_t data)&lt;br /&gt;
{&lt;br /&gt;
	outport.word = data;&lt;br /&gt;
	MAX7311_update();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Initializes the I/O Port Expander after power&lt;br /&gt;
 * on.&lt;br /&gt;
 *&lt;br /&gt;
 * Hint: If USE_PD5 is defined in the&lt;br /&gt;
 *       configuration header file, this&lt;br /&gt;
 *       function uses the RP6M256 portpin,&lt;br /&gt;
 *       that is connected to plug I/O: Pin 9&lt;br /&gt;
 *       instead of MAX7311 I/O 1.0!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void MAX7311_init(void)&lt;br /&gt;
{&lt;br /&gt;
#ifdef USE_PD5&lt;br /&gt;
	MAX7311_write_cfg(MAX7311_CONFIG_USE_PD5);&lt;br /&gt;
	IO_SENSOR_TCA4311A_EN_DDR |= IO_SENSOR_TCA4311A_EN_IN;		// Output&lt;br /&gt;
	IO_SENSOR_TCA4311A_EN_PORT |= IO_SENSOR_TCA4311A_EN_IN;		// High&lt;br /&gt;
#else&lt;br /&gt;
	MAX7311_write_cfg(MAX7311_CONFIG_DEFAULT);&lt;br /&gt;
#endif&lt;br /&gt;
	MAX7311_write(MAX7311_OUTPUT_DEFAULT);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Real Time Clock (RTC DS1339):&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function converts a BCD to a DEC value.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
uint8_t BCD2DEC(uint8_t bcd)&lt;br /&gt;
{&lt;br /&gt;
	return ((bcd &amp;gt;&amp;gt; 4) * 10 + (bcd &amp;amp; 0x0f));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function converts a DEC to a BCD value.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
uint8_t DEC2BCD(uint8_t dec)&lt;br /&gt;
{uint8_t units = dec % 10;&lt;br /&gt;
	if (dec /= 10) {&lt;br /&gt;
		return (units + (DEC2BCD(dec) &amp;lt;&amp;lt; 4));&lt;br /&gt;
	}&lt;br /&gt;
	else {&lt;br /&gt;
		return units;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Sends the configuration byte to a DS1339.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: Config byte for control register&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void DS1339_write_cfg(uint8_t config)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_RTC_ADR, DS1339_CONTROL, config);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Initializes the DS1339 Trickle Charger&lt;br /&gt;
 * function to the default for the RP6 Sensor&lt;br /&gt;
 * Board: One diode and 2kOhm resistor.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void DS1339_init(void)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_RTC_ADR, DS1339_TRICKLE_CHARGER, DS1339_TRICKLE_CHARGER_DEFAULT);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Reads all data registers of the Real Time Clock (RTC).&lt;br /&gt;
 * They are stored in the time &amp;amp; date variables defined in&lt;br /&gt;
 * the library header.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void DS1339_read(void)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmitByte(I2C_SENSOR_RTC_ADR, DS1339_SECONDS);&lt;br /&gt;
	I2CTWI_readBytes(I2C_SENSOR_RTC_ADR, registerBuf, 7);&lt;br /&gt;
	rtc_time.second = BCD2DEC(registerBuf[0]);&lt;br /&gt;
	rtc_time.minute = BCD2DEC(registerBuf[1]);&lt;br /&gt;
	rtc_time.hour = BCD2DEC(registerBuf[2] &amp;amp; 0x3f);&lt;br /&gt;
	rtc_date.weekday = (registerBuf[3] &amp;amp; 0x07);&lt;br /&gt;
	rtc_date.day = BCD2DEC(registerBuf[4]);&lt;br /&gt;
	rtc_date.month = BCD2DEC(registerBuf[5] &amp;amp; 0x7f);&lt;br /&gt;
	if(registerBuf[5] &amp;amp; 0x80) rtc_date.year = 100;&lt;br /&gt;
	else rtc_date.year = 0;&lt;br /&gt;
	rtc_date.year += BCD2DEC(registerBuf[6]);&lt;br /&gt;
	rtc_date.year += 2000;&lt;br /&gt;
	rtc_time.dst = 0;&lt;br /&gt;
#ifdef CALC_DST&lt;br /&gt;
	// Calculate MESZ (DST):&lt;br /&gt;
	uint8_t wday = rtc_date.weekday;			// Weekday [1..7 = R_MO..R_SU]&lt;br /&gt;
	if(wday == 7) wday = 0;&lt;br /&gt;
	if(rtc_date.month &amp;lt; 3 || rtc_date.month &amp;gt; 10) {&lt;br /&gt;
		return;&lt;br /&gt;
	}&lt;br /&gt;
	if((rtc_date.day - wday &amp;gt;= 25)&lt;br /&gt;
	 &amp;amp;&amp;amp; (wday || rtc_time.hour &amp;gt;= 2)) {&lt;br /&gt;
		if(rtc_date.month == 10)&lt;br /&gt;
			return;&lt;br /&gt;
	}&lt;br /&gt;
	else {&lt;br /&gt;
		if(rtc_date.month == 3) {&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	rtc_time.dst = 1;&lt;br /&gt;
#endif&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Writes the time &amp;amp; date infos in the variables defined in&lt;br /&gt;
 * the library header to the Real Time Clock (RTC).&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void DS1339_write(void)&lt;br /&gt;
{&lt;br /&gt;
	registerBuf[0] = DS1339_SECONDS;&lt;br /&gt;
	registerBuf[1] = DEC2BCD(rtc_time.second);&lt;br /&gt;
	registerBuf[2] = DEC2BCD(rtc_time.minute);&lt;br /&gt;
	registerBuf[3] = DEC2BCD(rtc_time.hour);&lt;br /&gt;
	registerBuf[4] = rtc_date.weekday;&lt;br /&gt;
	registerBuf[5] = DEC2BCD(rtc_date.day);&lt;br /&gt;
	registerBuf[6] = DEC2BCD(rtc_date.month);&lt;br /&gt;
	registerBuf[7] = DEC2BCD(rtc_date.year - 2000);&lt;br /&gt;
	I2CTWI_transmitBytes(I2C_SENSOR_RTC_ADR, &amp;amp;registerBuf[0], 8);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Temperature Sensor (LM75B):&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Sends the configuration byte to a LM75B.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: Config byte for Conf register&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void LM75B_write_cfg(uint8_t config)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_TEMP_ADR, LM75B_CONF, config);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
uint8_t temperature_low;&lt;br /&gt;
uint8_t temperature_high;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Reads the two data registers of the temperature&lt;br /&gt;
 * sensor's Temp register.&lt;br /&gt;
 * They are stored in the variables temperature_low&lt;br /&gt;
 * and _high.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void LM75B_read(void)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmitByte(I2C_SENSOR_TEMP_ADR, LM75B_TEMP);&lt;br /&gt;
	I2CTWI_readBytes(I2C_SENSOR_TEMP_ADR, registerBuf, 2);&lt;br /&gt;
	temperature_high = registerBuf[0];&lt;br /&gt;
	temperature_low = registerBuf[1];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
double temperature;						// Temperature [°C]&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Calculates and returns the temperature value&lt;br /&gt;
 * by using the data read from the LM75B with&lt;br /&gt;
 * the function LM75B_read(). The sensor is&lt;br /&gt;
 * designed for 11 bit measurement and 0.125°C&lt;br /&gt;
 * resolution.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
double LM75B_calculate(void)&lt;br /&gt;
{&lt;br /&gt;
	int16_t tempraw = 0;&lt;br /&gt;
	double temp;&lt;br /&gt;
&lt;br /&gt;
	tempraw = (getTemperatureHigh() &amp;lt;&amp;lt; 8) | getTemperatureLow();&lt;br /&gt;
	tempraw &amp;gt;&amp;gt;= 5;&lt;br /&gt;
	if (tempraw &amp;amp; 1024)							// Calculate temperature&lt;br /&gt;
		tempraw = (tempraw &amp;amp; 1023) - 1024;&lt;br /&gt;
	else&lt;br /&gt;
		tempraw = tempraw &amp;amp; 1023;&lt;br /&gt;
	temp = tempraw * 0.125;&lt;br /&gt;
	return temp;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Performs a 11 bit measurement and returns the&lt;br /&gt;
 * temperature [°C]. The sensor has a measuring&lt;br /&gt;
 * cycle of 100ms. So it makes no sense calling&lt;br /&gt;
 * this function at a frequency above 10Hz.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
double LM75B_measure(void)&lt;br /&gt;
{&lt;br /&gt;
//	LM75B_init();&lt;br /&gt;
	LM75B_read();								// Read data&lt;br /&gt;
	return (LM75B_calculate());					// Calculate value&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Servo Controller (PCA9685):&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Call this once before using the servo function.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: PWM frequency [40..1000 Hz]&lt;br /&gt;
 *&lt;br /&gt;
 * Hints: - Default servo frequency is 50 Hz!&lt;br /&gt;
 *        - The servo power is NOT switched on by&lt;br /&gt;
 *          this function!&lt;br /&gt;
 *&lt;br /&gt;
 * There is also a macro initServo(freq), which&lt;br /&gt;
 * does exactly the same as this function.&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *   initServo(50);&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void PCA9685_init(uint16_t freq)&lt;br /&gt;
{&lt;br /&gt;
	outport.oen_servo = false;					// I/O 1.3: Low&lt;br /&gt;
	MAX7311_update();&lt;br /&gt;
	if ((freq &amp;lt; 40) || (freq &amp;gt; 1000)) freq = 50;&lt;br /&gt;
	I2CTWI_transmitByte(I2C_SENSOR_SERVO_ADR, PCA9685_MODE2);&lt;br /&gt;
	uint8_t last_mode = I2CTWI_readByte(I2C_SENSOR_SERVO_ADR);&lt;br /&gt;
	last_mode &amp;amp;= ~PCA9685_MODE2_INVRT;			// Clear INVRT bit&lt;br /&gt;
	last_mode |= PCA9685_MODE2_OUTDRV;			// Set OUTDRV bit&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_SERVO_ADR, PCA9685_MODE2, last_mode);&lt;br /&gt;
	I2CTWI_transmitByte(I2C_SENSOR_SERVO_ADR, PCA9685_MODE1);&lt;br /&gt;
	last_mode = I2CTWI_readByte(I2C_SENSOR_SERVO_ADR);&lt;br /&gt;
	last_mode |= PCA9685_MODE1_AI;				// Set AI bit&lt;br /&gt;
	uint8_t mode1 = last_mode;&lt;br /&gt;
	mode1 |= PCA9685_MODE1_SLEEP;				// Set SLEEP bit&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_SERVO_ADR, PCA9685_MODE1, mode1);&lt;br /&gt;
	uint8_t prescale = (uint8_t) (F_PCA9685 / 4096 / freq - 0.5);&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_SERVO_ADR, PCA9685_PRE_SCALE, prescale);&lt;br /&gt;
	last_mode &amp;amp;= ~PCA9685_MODE1_SLEEP;			// Clear SLEEP bit&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_SERVO_ADR, PCA9685_MODE1, last_mode);&lt;br /&gt;
	mSleep(1);&lt;br /&gt;
	last_mode |= PCA9685_MODE1_RESTART;			// Clear RESTART bit&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_SERVO_ADR, PCA9685_MODE1, last_mode);&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_SERVO_ADR, PCA9685_LED8_ON_H, 0x10);&lt;br /&gt;
	return;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/** &lt;br /&gt;
 * Returns the channel belonging to a servo number.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: number -&amp;gt; Servo number [1..8]&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
uint8_t servo(uint8_t number)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t channel;&lt;br /&gt;
&lt;br /&gt;
	switch (number) {&lt;br /&gt;
		case 1 :&lt;br /&gt;
			channel = CH_SERVO_1; break;&lt;br /&gt;
		case 2 :&lt;br /&gt;
			channel = CH_SERVO_2; break;&lt;br /&gt;
		case 3 :&lt;br /&gt;
			channel = CH_SERVO_3; break;&lt;br /&gt;
		case 4 :&lt;br /&gt;
			channel = CH_SERVO_4; break;&lt;br /&gt;
		case 5 :&lt;br /&gt;
			channel = CH_SERVO_5; break;&lt;br /&gt;
		case 6 :&lt;br /&gt;
			channel = CH_SERVO_6; break;&lt;br /&gt;
		case 7 :&lt;br /&gt;
			channel = CH_SERVO_7; break;&lt;br /&gt;
		case 8 :&lt;br /&gt;
			channel = CH_SERVO_8; break;&lt;br /&gt;
		default : channel = CH_SERVO_1;&lt;br /&gt;
	}&lt;br /&gt;
	return channel;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This is the servo position set function.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: channel -&amp;gt; Channel number [1..16]&lt;br /&gt;
 *        pos     -&amp;gt; Servo position [SERVOx_LT..SERVOx_RT]&lt;br /&gt;
 *&lt;br /&gt;
 * Hints: - A servo position of 205 means 1 ms servo impulse,&lt;br /&gt;
 *          a position of 410 means a 2 ms servo impulse!&lt;br /&gt;
 *          You may calculate the servo impulse length by:&lt;br /&gt;
 *          ==&amp;gt; Impulse [ms] = servo position / 204.8 &amp;lt;==&lt;br /&gt;
 *          (Formula only valid for a PWM of 50 Hz!)&lt;br /&gt;
 *&lt;br /&gt;
 * There is also a macro setServo(servo, pos), which&lt;br /&gt;
 * does nearly the same as this function, but the first&lt;br /&gt;
 * parameter is the servo and NOT the channel number.&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *   setServo(2,300);&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void PCA9685_set(uint8_t channel, uint16_t pos)&lt;br /&gt;
{&lt;br /&gt;
	if ((channel == 0) || (channel &amp;gt; 16))&lt;br /&gt;
		return;&lt;br /&gt;
	uint8_t reg = channel * 4 + 4;				// Register LEDx_OFF_L&lt;br /&gt;
	I2CTWI_transmit3Bytes(I2C_SENSOR_SERVO_ADR, reg, (pos &amp;amp; 0x00ff), (pos &amp;gt;&amp;gt; 8));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * If the servos are not moving for a while, the&lt;br /&gt;
 * servo function can be stopped with this&lt;br /&gt;
 * function (PCA9685 set to sleep mode).&lt;br /&gt;
 *&lt;br /&gt;
 * Hint: The servo power is NOT switched off by&lt;br /&gt;
 *       this function!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void PCA9685_shutdown(void)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_SERVO_ADR, PCA9685_ALL_LED_OFF_H, 0x10);&lt;br /&gt;
	I2CTWI_transmitByte(I2C_SENSOR_SERVO_ADR, PCA9685_MODE1);&lt;br /&gt;
	uint8_t mode1 = I2CTWI_readByte(I2C_SENSOR_SERVO_ADR);&lt;br /&gt;
	mode1 |= PCA9685_MODE1_SLEEP;				// Set SLEEP bit&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_SERVO_ADR, PCA9685_MODE1, mode1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * If the servo function was stopped with the&lt;br /&gt;
 * function PCA9685_shutdown() before, it can be&lt;br /&gt;
 * (re)started again with this function.&lt;br /&gt;
 *&lt;br /&gt;
 * Hint: The servo power is NOT switched on by&lt;br /&gt;
 *       this function!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void PCA9685_restart(void)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmitByte(I2C_SENSOR_SERVO_ADR, PCA9685_MODE1);&lt;br /&gt;
	uint8_t mode1 = I2CTWI_readByte(I2C_SENSOR_SERVO_ADR);&lt;br /&gt;
	if (mode1 &amp;amp; PCA9685_MODE1_RESTART) {		// RESTART bit set?&lt;br /&gt;
		mode1 &amp;amp;= ~PCA9685_MODE1_SLEEP;			// Clear SLEEP bit&lt;br /&gt;
		I2CTWI_transmit2Bytes(I2C_SENSOR_SERVO_ADR, PCA9685_MODE1, mode1);&lt;br /&gt;
		mSleep(1);&lt;br /&gt;
		mode1 |= PCA9685_MODE1_RESTART;			// Clear RESTART bit&lt;br /&gt;
		I2CTWI_transmit2Bytes(I2C_SENSOR_SERVO_ADR, PCA9685_MODE1, mode1);&lt;br /&gt;
		I2CTWI_transmit2Bytes(I2C_SENSOR_SERVO_ADR, PCA9685_ALL_LED_OFF_H, 0);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/** &lt;br /&gt;
 * With this function you can switch the servo&lt;br /&gt;
 * power on or off.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: pwr -&amp;gt; 0 (false) = servo power off&lt;br /&gt;
 *               &amp;gt;0 (true) = servo power on&lt;br /&gt;
 *&lt;br /&gt;
 * Hints: - If connected servos are not used, you&lt;br /&gt;
 *          should always switch the servo power off&lt;br /&gt;
 *          (default) to save energy!&lt;br /&gt;
 *        - The PCA9685 is NOT restarted or put into&lt;br /&gt;
 *          shutdown mode by this function!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void setServoPower(uint8_t pwr)&lt;br /&gt;
{&lt;br /&gt;
	if(pwr &amp;gt; 0)&lt;br /&gt;
		outport.pwr_servo = true;				// I/O 1.4: High&lt;br /&gt;
	else&lt;br /&gt;
		outport.pwr_servo = false;				// I/O 1.4: Low&lt;br /&gt;
	MAX7311_update();&lt;br /&gt;
}	&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C LED Driver (TCA6507):&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Sends the configuration byte to TCA6507's&lt;br /&gt;
 * internal registers.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: reg    -&amp;gt; Register address [0..10]&lt;br /&gt;
 *        config -&amp;gt; Config byte for internal&lt;br /&gt;
 *                  registers&lt;br /&gt;
 *&lt;br /&gt;
 * Hints: - With this function you can write to&lt;br /&gt;
 *          all internal registers of the LED&lt;br /&gt;
 *          driver, see &amp;quot;Registers:&amp;quot; in the&lt;br /&gt;
 *          library header file!&lt;br /&gt;
 *        - Mainly you will use this function&lt;br /&gt;
 *          for setting time (regs 3..7) and&lt;br /&gt;
 *          intensity (regs 8, 9) values.&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *   TCA6507_write_cfg(TCA6507_MAXIMUM_INTENSITY,0x77);&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void TCA6507_write_cfg(uint8_t reg, uint8_t config)&lt;br /&gt;
{&lt;br /&gt;
	if(reg &amp;gt; 10) reg = 0;&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_LEDDRIVER_ADR, reg, config);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
uint8_t select[3];&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Updates the LED driver select registers (0..2)&lt;br /&gt;
 * with the global select array!&lt;br /&gt;
 *&lt;br /&gt;
 * Hint: - Also have a look at Table 4 in the&lt;br /&gt;
 *         TCA6507 datasheet!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void TCA6507_update(void)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmit4Bytes(I2C_SENSOR_LEDDRIVER_ADR, (TCA6507_SELECT0 | 0x10), select[0], select[1], select[2]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This is the LED state set function.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: led   -&amp;gt; LED number [0..6]&lt;br /&gt;
 *        state -&amp;gt; LED state  [0..7]&lt;br /&gt;
 *&lt;br /&gt;
 * Hints: - Possible driver states [0..7] see&lt;br /&gt;
 *          &amp;quot;Output states:&amp;quot; in the library&lt;br /&gt;
 *          header file!&lt;br /&gt;
 *        - Also have a look at Table 4 in the&lt;br /&gt;
 *          TCA6507 datasheet!&lt;br /&gt;
 *&lt;br /&gt;
 * There is also a macro setLED(led, state), which&lt;br /&gt;
 * does exactly the same as this function.&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *   setLED(1,4);&lt;br /&gt;
 *   // Switches LED1 ON&lt;br /&gt;
 *   // ... OR ...&lt;br /&gt;
 *   setLED(SB_LED1,STATE_ON);&lt;br /&gt;
 *   // does the same.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void TCA6507_set(uint8_t led, uint8_t state)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t i, mask;&lt;br /&gt;
&lt;br /&gt;
	if(led &amp;gt; 6) led = 0;&lt;br /&gt;
	led = 1 &amp;lt;&amp;lt; led;&lt;br /&gt;
	mask = 1;&lt;br /&gt;
	for(i = 0; i &amp;lt; 3; i++) {&lt;br /&gt;
		select[i] &amp;amp;= ~led;&lt;br /&gt;
		if(state &amp;amp; mask)&lt;br /&gt;
			select[i] |= led;&lt;br /&gt;
		mask &amp;lt;&amp;lt;= 1;&lt;br /&gt;
	}&lt;br /&gt;
	TCA6507_update();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * If the LEDs are not needed for a while, the&lt;br /&gt;
 * LED driver can be stopped with this function&lt;br /&gt;
 * (TCA6507 set to shutdown mode).&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void TCA6507_shutdown(void)&lt;br /&gt;
{&lt;br /&gt;
	outport.en_leddriv = false;					// I/O 0.4: Low&lt;br /&gt;
	MAX7311_update();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * If the LED driver was stopped with the&lt;br /&gt;
 * function TCA6507_shutdown() before, it can be&lt;br /&gt;
 * (re)started again with this function.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void TCA6507_restart(void)&lt;br /&gt;
{&lt;br /&gt;
	outport.en_leddriv = true;					// I/O 0.4: High&lt;br /&gt;
	MAX7311_update();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Initializes the LED driver after power on by&lt;br /&gt;
 * switching all LEDs off.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void TCA6507_init(void)&lt;br /&gt;
{&lt;br /&gt;
	select[0] = 0;&lt;br /&gt;
	select[1] = 0;&lt;br /&gt;
	select[2] = 0;&lt;br /&gt;
	TCA6507_update();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C 3D Magnetometer &amp;amp; Accelerometer (LSM303DLHC):&lt;br /&gt;
&lt;br /&gt;
// --------------------------------------------&lt;br /&gt;
// LSM303DLHC accelerometer functions:&lt;br /&gt;
int16_t x_axisa, y_axisa, z_axisa;&lt;br /&gt;
double pitch, roll;&lt;br /&gt;
double xa, ya, za;&lt;br /&gt;
double the, phi;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Call this once before using the 3D-Accelerometer.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void LSM303DLHC_A_init(void)&lt;br /&gt;
{&lt;br /&gt;
	// Set normal power mode, 10 Hz data rate, all axes enabled:&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_LSM303DLHC_A_ADR, CTRL_REG1_A, CTRL_REG1_A_10HZ);&lt;br /&gt;
	mSleep(10);&lt;br /&gt;
	// Set HD mode:&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_LSM303DLHC_A_ADR, CTRL_REG4_A, CTRL_REG4_A_HR);&lt;br /&gt;
	mSleep(10);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function reads the X-axis, Y-axis and Z-axis values&lt;br /&gt;
 * from the LSM303DLHC accelerometer and stores them in the&lt;br /&gt;
 * global variables x_axisa, y_axisa and z_axisa.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void readLSM303DLHC_A(void)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t readBuf[6];&lt;br /&gt;
&lt;br /&gt;
	I2CTWI_transmitByte(I2C_SENSOR_LSM303DLHC_A_ADR, (OUT_X_L_A | 0x80));&lt;br /&gt;
	I2CTWI_readBytes(I2C_SENSOR_LSM303DLHC_A_ADR, readBuf, 6); // Read  X-/Y-/Z-axis&lt;br /&gt;
	// xb = y:&lt;br /&gt;
	x_axisa = ((readBuf[OUT_Y_H_A - OUT_X_L_A] &amp;lt;&amp;lt; 8) + readBuf[OUT_Y_L_A - OUT_X_L_A]) / 16;&lt;br /&gt;
	// yb = x:&lt;br /&gt;
	y_axisa = ((readBuf[OUT_X_H_A - OUT_X_L_A] &amp;lt;&amp;lt; 8) + readBuf[OUT_X_L_A - OUT_X_L_A]) / 16;&lt;br /&gt;
	// zb = z:&lt;br /&gt;
	z_axisa = ((readBuf[OUT_Z_H_A - OUT_X_L_A] &amp;lt;&amp;lt; 8) + readBuf[OUT_Z_L_A - OUT_X_L_A]) / 16;&lt;br /&gt;
	mSleep(10);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function limits and normalizes the x-axisa,&lt;br /&gt;
 * y-axisa and z-axisa values read from the LSM303DLHC&lt;br /&gt;
 * accelerometer with the function readLSM303DLHC_A() and&lt;br /&gt;
 * stores them in the global double variables xa, ya and&lt;br /&gt;
 * za.&lt;br /&gt;
 * It also calculates the position in space in form of the&lt;br /&gt;
 * tilt angles (the = pitch, phi = roll) and stores them&lt;br /&gt;
 * in the global double variables the and phi.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void normalizeLSM303DLHC_A(void)&lt;br /&gt;
{&lt;br /&gt;
	// Limit raw values:&lt;br /&gt;
	if (x_axisa &amp;lt; MIN_X_A) x_axisa = MIN_X_A;&lt;br /&gt;
	if (x_axisa &amp;gt; MAX_X_A) x_axisa = MAX_X_A;&lt;br /&gt;
	if (y_axisa &amp;lt; MIN_Y_A) y_axisa = MIN_Y_A;&lt;br /&gt;
	if (y_axisa &amp;gt; MAX_Y_A) y_axisa = MAX_Y_A;&lt;br /&gt;
	if (z_axisa &amp;lt; MIN_Z_A) z_axisa = MIN_Z_A;&lt;br /&gt;
	if (z_axisa &amp;gt; MAX_Z_A) z_axisa = MAX_Z_A;&lt;br /&gt;
	xa = (double) x_axisa / 1000.0;&lt;br /&gt;
	ya = (double) y_axisa / 1000.0;&lt;br /&gt;
	za = (double) z_axisa / 1000.0;&lt;br /&gt;
	// Calculate Pitch and Roll:&lt;br /&gt;
	phi = asin(xa);								// Calculate the and phi&lt;br /&gt;
	the = asin(ya / cos(the));					//  from the raw values&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function calculates the position in space by&lt;br /&gt;
 * using the the and phi values (see function&lt;br /&gt;
 * normalizeLSM303DLHC_A()!). It stores the position&lt;br /&gt;
 * in the global double variables pitch and roll. &lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void positionLSM303DLHC_A(void)&lt;br /&gt;
{&lt;br /&gt;
	pitch = the * 180 / M_PI + OFFSET_PITCH_A;&lt;br /&gt;
	roll = phi * 180 / M_PI + OFFSET_ROLL_A;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// LSM303DLHC magnetometer functions:&lt;br /&gt;
int16_t x_axism, y_axism, z_axism;&lt;br /&gt;
int16_t headingm;&lt;br /&gt;
double xm, ym, zm;&lt;br /&gt;
#ifdef GET_TEMP_M&lt;br /&gt;
int16_t temperaturem;&lt;br /&gt;
double temperature_mag;&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
int16_t headingtc;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Call this once before using the 3D-Compass.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void LSM303DLHC_M_init(void)&lt;br /&gt;
{&lt;br /&gt;
#ifdef GET_TEMP_M&lt;br /&gt;
	// Set Data output rate to 15Hz, enable temperature sensor:&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_LSM303DLHC_M_ADR, CRA_REG_M, CRA_REG_M_15HZ_T_EN);&lt;br /&gt;
#else&lt;br /&gt;
	// Set Data output rate to 15Hz:&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_LSM303DLHC_M_ADR, CRA_REG_M, CRA_REG_M_15HZ);&lt;br /&gt;
#endif&lt;br /&gt;
	mSleep(10);&lt;br /&gt;
	// Set Gain to +-1.3Gauss:&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_LSM303DLHC_M_ADR, CRB_REG_M, CRB_REG_M_13GAUSS);&lt;br /&gt;
	mSleep(10);&lt;br /&gt;
	// Set Continuous-conversion mode:&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_LSM303DLHC_M_ADR, MR_REG_M, MR_REG_M_CCM);&lt;br /&gt;
	mSleep(10);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function reads the X-axis, Y-axis, Z-axis and&lt;br /&gt;
 * temperature values from the LSM303DLHC magnetometer&lt;br /&gt;
 * and stores them in the global variables x_axism,&lt;br /&gt;
 * y_axism, z_axism and temperaturem.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void readLSM303DLHC_M(void)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t readBuf[6];&lt;br /&gt;
&lt;br /&gt;
	I2CTWI_transmitByte(I2C_SENSOR_LSM303DLHC_M_ADR, OUT_X_H_M);&lt;br /&gt;
	I2CTWI_readBytes(I2C_SENSOR_LSM303DLHC_M_ADR, readBuf, 6); // Read  X-/Y-/Z-axis&lt;br /&gt;
	// xb = x:&lt;br /&gt;
	x_axism = (readBuf[OUT_X_H_M - OUT_X_H_M] &amp;lt;&amp;lt; 8) + readBuf[OUT_X_L_M - OUT_X_H_M];&lt;br /&gt;
	// yb = y:&lt;br /&gt;
	y_axism = (readBuf[OUT_Y_H_M - OUT_X_H_M] &amp;lt;&amp;lt; 8) + readBuf[OUT_Y_L_M - OUT_X_H_M];&lt;br /&gt;
	// zb = z:&lt;br /&gt;
	z_axism = (readBuf[OUT_Z_H_M - OUT_X_H_M] &amp;lt;&amp;lt; 8) + readBuf[OUT_Z_L_M - OUT_X_H_M];&lt;br /&gt;
	mSleep(10);&lt;br /&gt;
#ifdef GET_TEMP_M&lt;br /&gt;
	// Read temperature raw value:&lt;br /&gt;
	I2CTWI_transmitByte(I2C_SENSOR_LSM303DLHC_M_ADR, TEMP_OUT_H_M);&lt;br /&gt;
	readBuf[0] = I2CTWI_readByte(I2C_SENSOR_LSM303DLHC_M_ADR);&lt;br /&gt;
	I2CTWI_transmitByte(I2C_SENSOR_LSM303DLHC_M_ADR, TEMP_OUT_L_M);&lt;br /&gt;
	readBuf[1] = I2CTWI_readByte(I2C_SENSOR_LSM303DLHC_M_ADR);&lt;br /&gt;
	temperaturem = (readBuf[0] &amp;lt;&amp;lt; 8) | readBuf[1];&lt;br /&gt;
	temperaturem &amp;gt;&amp;gt;= 4;&lt;br /&gt;
	if (temperaturem &amp;amp; 2048)					// Calculate temperature&lt;br /&gt;
		temperaturem = (temperaturem &amp;amp; 2047) - 2048;&lt;br /&gt;
	else&lt;br /&gt;
		temperaturem = temperaturem &amp;amp; 2047;&lt;br /&gt;
	mSleep(10);&lt;br /&gt;
#endif&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function compensates hard iron effects and&lt;br /&gt;
 * scales the x-axism, y-axism and z-axism values read&lt;br /&gt;
 * from the LSM303DLHC magnetometer with the function&lt;br /&gt;
 * readLSM303DLHC_M() and stores them in the global&lt;br /&gt;
 * double variables xm, ym and zm.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void normalizeLSM303DLHC_M(void)&lt;br /&gt;
{&lt;br /&gt;
	// Add hard iron offsets:&lt;br /&gt;
	x_axism += OFFSET_X_M;&lt;br /&gt;
	y_axism += OFFSET_Y_M;&lt;br /&gt;
	z_axism += OFFSET_Z_M;&lt;br /&gt;
	// Scale raw values:&lt;br /&gt;
	xm = (x_axism - MIN_X_M) / (MAX_X_M - MIN_X_M) * 2 - 1;&lt;br /&gt;
	ym = (y_axism - MIN_Y_M) / (MAX_Y_M - MIN_Y_M) * 2 - 1;&lt;br /&gt;
	zm = (z_axism - MIN_Z_M) / (MAX_Z_M - MIN_Z_M) * 2 - 1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function calculates the heading by using the&lt;br /&gt;
 * normalized sensor values xm and ym (see function&lt;br /&gt;
 * normalizeLSM303DLHC_M()!). The heading is a value&lt;br /&gt;
 * from 0° to 359°. If the robot's front (and the&lt;br /&gt;
 * RP6 Sensor Board's front edge with the two&lt;br /&gt;
 * headlights) points to ...&lt;br /&gt;
 *   north -&amp;gt; heading is 0°,&lt;br /&gt;
 *   east  -&amp;gt; heading is 90°,&lt;br /&gt;
 *   south -&amp;gt; heading is 180°,&lt;br /&gt;
 *   west  -&amp;gt; heading is 270°.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
int16_t headingLSM303DLHC_M(void)&lt;br /&gt;
{&lt;br /&gt;
	double hdg = atan2(ym, xm) * 180 / M_PI + DECLINATION_M;&lt;br /&gt;
	if(hdg &amp;lt; 0.0) hdg += 360.0;&lt;br /&gt;
	return ((int16_t) hdg);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// --------------------------------------------&lt;br /&gt;
/**&lt;br /&gt;
 * This function calculates the TILT COMPENSATED&lt;br /&gt;
 * heading by using accelerometer (the, phi) AND&lt;br /&gt;
 * magnetometer (xm, ym, zm) data. The heading is a&lt;br /&gt;
 * value from 0° to 359°. If the robot's front (and&lt;br /&gt;
 * the RP6 Sensor Board's front edge with the two&lt;br /&gt;
 * headlights) points to ...&lt;br /&gt;
 *   north -&amp;gt; heading is 0°,&lt;br /&gt;
 *   east  -&amp;gt; heading is 90°,&lt;br /&gt;
 *   south -&amp;gt; heading is 180°,&lt;br /&gt;
 *   west  -&amp;gt; heading is 270°.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
int16_t headingLSM303DLHC_TC(void)&lt;br /&gt;
{&lt;br /&gt;
	double hdgtc, xh, yh;&lt;br /&gt;
&lt;br /&gt;
	xh = xm * cos(the) + zm * sin(the);&lt;br /&gt;
	yh = xm * sin(phi) * sin(the) + ym * cos(phi) - zm * sin(phi) * cos(the);&lt;br /&gt;
//	zh = -xm * cos(phi) * sin(the) + ym * sin(phi) + zm * cos(phi) * cos(the);&lt;br /&gt;
	hdgtc = atan2(yh, xh) * 180 / M_PI + DECLINATION_M;&lt;br /&gt;
	if(hdgtc &amp;lt; 0.0) hdgtc += 360.0;&lt;br /&gt;
	return ((int16_t) hdgtc);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// --------------------------------------------&lt;br /&gt;
/**&lt;br /&gt;
 * Call this once before using the LSM303DLHC.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void LSM303DLHC_init(void)&lt;br /&gt;
{&lt;br /&gt;
	LSM303DLHC_A_init();						// Accelerometer init&lt;br /&gt;
	LSM303DLHC_M_init();						// Magnetometer init&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Analog Yaw-Rate Gyroscope (LY330ALH):&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Sets the LY330ALH mode of operation.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: mode -&amp;gt; Mode [0..3]&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void LY330ALH_set_mode(uint8_t mode)&lt;br /&gt;
{&lt;br /&gt;
	outport.pd_gyro = false;					// I/O 0.6: Low&lt;br /&gt;
	outport.st_gyro = false;					// I/O 0.7: Low&lt;br /&gt;
	if(mode &amp;amp; 1) outport.pd_gyro = true;&lt;br /&gt;
	if(mode &amp;amp; 2) outport.st_gyro = true;&lt;br /&gt;
	MAX7311_update();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Reads the ADC1 value from the RP6Base.&lt;br /&gt;
 *&lt;br /&gt;
 * Hints: - The RP6Base input ADC1 has to be&lt;br /&gt;
 *          connected to the USRBUS: Pin 2 on&lt;br /&gt;
 *          the RP6 mainboard!&lt;br /&gt;
 *        - The RP6Base_I2CSlave program has to&lt;br /&gt;
 *          be loaded into the RP6Base&lt;br /&gt;
 *          microcontroller!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
uint16_t getRP6Base_ADC1(void)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_readRegisters(I2C_RP6_BASE_ADR, I2C_REG_ADC_ADC1_L, registerBuf, 2);&lt;br /&gt;
	return (registerBuf[0] + (registerBuf[1] &amp;lt;&amp;lt; 8));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int16_t z_axisg;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Performs a LY330ALH gyroscope measurement and&lt;br /&gt;
 * returns the angular rate (velocity).&lt;br /&gt;
 * Positive values mean an angular rate while&lt;br /&gt;
 * rotating LEFT and negative values while&lt;br /&gt;
 * rotating RIGHT!&lt;br /&gt;
 * The global integer variable z_axisg also&lt;br /&gt;
 * contains the measurement result.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
int16_t LY330ALH_measure(void)&lt;br /&gt;
{&lt;br /&gt;
	z_axisg = getRP6Base_ADC1();				// Read raw data&lt;br /&gt;
	z_axisg -= ADCVAL_ZERORATE_LEVEL;			// Calculate value&lt;br /&gt;
	return (z_axisg);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Hot Swappable 2-Wire Bus Buffer (TCA4311A):&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Reads the TCA4311A Ready output. &lt;br /&gt;
 * The function returns the state (true/false).&lt;br /&gt;
 * The global variable readyBusbuff is also&lt;br /&gt;
 * filled with the Ready output state.&lt;br /&gt;
 *&lt;br /&gt;
 * Hint: You don't have to use this function,&lt;br /&gt;
 *       if the task task_RP6SensorBoard() is&lt;br /&gt;
 *       called frequently out of the main&lt;br /&gt;
 *       loop, because readyBusbuff will be&lt;br /&gt;
 *       updated by this task!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
uint8_t readReadyBusbuff(void)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmitByte(I2C_SENSOR_PORTEXP_ADR, MAX7311_INPUT_PORT1);&lt;br /&gt;
	readyBusbuff = I2CTWI_readByte(I2C_SENSOR_PORTEXP_ADR);&lt;br /&gt;
	readyBusbuff &amp;amp;= RDY_BUSBUFF;&lt;br /&gt;
	return readyBusbuff;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
uint8_t errorBusbuff;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * If the I2C bus for the I2C-MODULE (SCLOUT,&lt;br /&gt;
 * SDAOUT) is not used or shall be isolated from&lt;br /&gt;
 * the RP6 I2C bus, this can be done with this&lt;br /&gt;
 * function.&lt;br /&gt;
 *&lt;br /&gt;
 * Hints: - The I2C-MODULE power is NOT switched&lt;br /&gt;
 *          off by this function!&lt;br /&gt;
 *        - If USE_PD5 is defined in the&lt;br /&gt;
 *          configuration header file, this&lt;br /&gt;
 *          function uses the RP6M256 portpin,&lt;br /&gt;
 *          that is connected to plug I/O: Pin 9&lt;br /&gt;
 *          instead of MAX7311 I/O 1.0!&lt;br /&gt;
 *        - If the global variable errorBusbuff&lt;br /&gt;
 *          returns true, the bus buffer could&lt;br /&gt;
 *          not be switched to shutdown mode!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void TCA4311A_shutdown(void)&lt;br /&gt;
{&lt;br /&gt;
	// Wait until the I2C bus is idle:&lt;br /&gt;
	while(I2CTWI_isBusy() || TWI_operation != I2CTWI_NO_OPERATION) task_I2CTWI();&lt;br /&gt;
#ifdef USE_PD5&lt;br /&gt;
	IO_SENSOR_TCA4311A_EN_PORT &amp;amp;= ~IO_SENSOR_TCA4311A_EN_IN; // Low&lt;br /&gt;
#else&lt;br /&gt;
	outport.en_busbuff = false;					// I/O 1.0: Low&lt;br /&gt;
	MAX7311_update();&lt;br /&gt;
#endif&lt;br /&gt;
	errorBusbuff = readReadyBusbuff();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * If the I2C bus for the I2C-MODULE (SCLOUT,&lt;br /&gt;
 * SDAOUT) was isolated from the RP6 I2C bus with&lt;br /&gt;
 * the function TCA4311A_shutdown() before, it&lt;br /&gt;
 * can be connected again with this function.&lt;br /&gt;
 *&lt;br /&gt;
 * Hints: - The I2C-MODULE power is NOT switched&lt;br /&gt;
 *          on by this function!&lt;br /&gt;
 *        - If USE_PD5 is defined in the&lt;br /&gt;
 *          configuration header file, this&lt;br /&gt;
 *          function uses the RP6M256 portpin,&lt;br /&gt;
 *          that is connected to plug I/O: Pin 9&lt;br /&gt;
 *          instead of MAX7311 I/O 1.0!&lt;br /&gt;
 *        - If the global variable errorBusbuff&lt;br /&gt;
 *          returns true, the bus buffer could&lt;br /&gt;
 *          not be switched to normal operation!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void TCA4311A_reconnect(void)&lt;br /&gt;
{&lt;br /&gt;
	// Wait until the I2C bus is idle:&lt;br /&gt;
	while(I2CTWI_isBusy() || TWI_operation != I2CTWI_NO_OPERATION) task_I2CTWI();&lt;br /&gt;
#ifdef USE_PD5&lt;br /&gt;
	IO_SENSOR_TCA4311A_EN_PORT |= IO_SENSOR_TCA4311A_EN_IN; // High&lt;br /&gt;
#else&lt;br /&gt;
	outport.en_busbuff = true;					// I/O 1.0: High&lt;br /&gt;
	MAX7311_update();&lt;br /&gt;
#endif&lt;br /&gt;
	errorBusbuff = !readReadyBusbuff();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Sets/clears the RP6Base signal PWR.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: pwr -&amp;gt; 0 (false) = PWR off&lt;br /&gt;
 *               &amp;gt;0 (true) = PWR on&lt;br /&gt;
 *&lt;br /&gt;
 * Hints: - The RP6Base signal PWR has to be&lt;br /&gt;
 *          connected to the USRBUS: Pin 3 on&lt;br /&gt;
 *          the RP6 mainboard!&lt;br /&gt;
 *        - The RP6Base_I2CSlave program has to&lt;br /&gt;
 *          be loaded into the RP6Base&lt;br /&gt;
 *          microcontroller!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void setRP6Base_PWR(uint8_t pwr)&lt;br /&gt;
{&lt;br /&gt;
	if(pwr &amp;gt; 0)&lt;br /&gt;
		I2CTWI_transmit2Bytes(I2C_RP6_BASE_ADR, 0, CMD_POWER_ON);&lt;br /&gt;
	else&lt;br /&gt;
		I2CTWI_transmit2Bytes(I2C_RP6_BASE_ADR, 0, CMD_POWER_OFF);&lt;br /&gt;
	while(I2CTWI_isBusy() || TWI_operation != I2CTWI_NO_OPERATION) task_I2CTWI();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/** &lt;br /&gt;
 * With this function you can switch the I2C-&lt;br /&gt;
 * MODULE (plug M1) power on or off.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: pwr -&amp;gt; 0 (false) = I2C-MODULE power off&lt;br /&gt;
 *               &amp;gt;0 (true) = I2C-MODULE power on&lt;br /&gt;
 *&lt;br /&gt;
 * Hints: - If the I2C-MODULE plug is not used,&lt;br /&gt;
 *          you should always switch the&lt;br /&gt;
 *          I2C-MODULE power off (default)!&lt;br /&gt;
 *        - The TCA4311A is NOT switched to&lt;br /&gt;
 *          normal operation (default) or&lt;br /&gt;
 *          shutdown mode by this function!&lt;br /&gt;
 *        - The RP6Base signal PWR has to be&lt;br /&gt;
 *          connected to the USRBUS: Pin 3 on&lt;br /&gt;
 *          the RP6 mainboard!&lt;br /&gt;
 *        - The RP6Base_I2CSlave program has to&lt;br /&gt;
 *          be loaded into the RP6Base&lt;br /&gt;
 *          microcontroller!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void setI2CModulePower(uint8_t pwr)&lt;br /&gt;
{&lt;br /&gt;
	if(pwr &amp;gt; 0) {&lt;br /&gt;
		setRP6Base_PWR(1);						// RP6Base PWR on&lt;br /&gt;
		outport.pwr_i2c = true;					// I/O 0.0: High&lt;br /&gt;
	}&lt;br /&gt;
	else&lt;br /&gt;
		outport.pwr_i2c = false;				// I/O 0.0: Low&lt;br /&gt;
	MAX7311_update();&lt;br /&gt;
}	&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Button:&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Reads the MAX7311 I/O port 1.7. &lt;br /&gt;
 * The function returns true, if  button S1 is&lt;br /&gt;
 * pressed (I/O 1.7: Low!) and false, if it is&lt;br /&gt;
 * not pressed (I/O 1.7: High!).&lt;br /&gt;
 * The global variable pressedButton is also&lt;br /&gt;
 * filled with the I/O 1.7 output state.&lt;br /&gt;
 *&lt;br /&gt;
 * Hint: You don't have to use this function,&lt;br /&gt;
 *       if the task task_RP6SensorBoard() is&lt;br /&gt;
 *       called frequently out of the main&lt;br /&gt;
 *       loop, because pressedButton will be&lt;br /&gt;
 *       updated by this task!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
uint8_t readButton(void)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmitByte(I2C_SENSOR_PORTEXP_ADR, MAX7311_INPUT_PORT2);&lt;br /&gt;
	pressedButton = I2CTWI_readByte(I2C_SENSOR_PORTEXP_ADR);&lt;br /&gt;
	pressedButton &amp;amp;= IO2_I2C;&lt;br /&gt;
	pressedButton = !pressedButton;&lt;br /&gt;
	return pressedButton;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Status LED:&lt;br /&gt;
&lt;br /&gt;
/** &lt;br /&gt;
 * Sets the status LED (D2) of the RP6 Sensor&lt;br /&gt;
 * Board.&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *   setStatusLED(1);&lt;br /&gt;
 *   // This switches the status LED on!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void setStatusLED(uint8_t on)&lt;br /&gt;
{&lt;br /&gt;
	if(on &amp;gt; 0)&lt;br /&gt;
		outport.io1_i2c = false;				// I/O 1.6: Low&lt;br /&gt;
	else&lt;br /&gt;
		outport.io1_i2c = true;					// I/O 1.6: High&lt;br /&gt;
	MAX7311_update();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// RP6 Sensor Board initialisation and shutdown:&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * You MUST call this function at the beginning of a&lt;br /&gt;
 * main program, that uses the RP6 Sensor Board. &lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void sensor_board_init(void)&lt;br /&gt;
{&lt;br /&gt;
	// I/O Port Expander:&lt;br /&gt;
	MAX7311_init();&lt;br /&gt;
	// RTC:&lt;br /&gt;
	DS1339_init();&lt;br /&gt;
	// Temperature Sensor:&lt;br /&gt;
	LM75B_init();&lt;br /&gt;
	// Servo Controller:&lt;br /&gt;
	PCA9685_init(50);							// Init PWM 50 Hz&lt;br /&gt;
	// LED Driver:&lt;br /&gt;
	TCA6507_init();&lt;br /&gt;
	// 3D Magnetometer &amp;amp; Accelerometer:&lt;br /&gt;
	LSM303DLHC_init();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * If you don't use any function of the RP6&lt;br /&gt;
 * Sensor Board, you can put the board into&lt;br /&gt;
 * &amp;quot;SHUTDOWN MODE&amp;quot;. In this mode the electric&lt;br /&gt;
 * power consumption is very low to save energy.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void sensor_board_shutdown(void)&lt;br /&gt;
{&lt;br /&gt;
	// Servo Controller:&lt;br /&gt;
	PCA9685_shutdown();							// Shutdown PCA9685&lt;br /&gt;
	// Temperature Sensor:&lt;br /&gt;
	LM75B_shutdown();							// Shutdown LM75B&lt;br /&gt;
	// I/O Port Expander:&lt;br /&gt;
	MAX7311_write(MAX7311_OUTPUT_SHUTDOWN);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&lt;br /&gt;
/******************************************************************************&lt;br /&gt;
 * Additional info&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Changelog:&lt;br /&gt;
 * - v. 1.1 RP6M256_I2CMasterLib compatibility 16.09.2014 by Dirk&lt;br /&gt;
 * - v. 1.0 TCA4311A reconnect problem fixed 10.04.2014 by Dirk&lt;br /&gt;
 * - v. 0.9 Interrupt status functions added 09.04.2014 by Dirk&lt;br /&gt;
 * - v. 0.8 (initial release) 17.03.2014 by Dirk&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Erklärung&lt;br /&gt;
&lt;br /&gt;
=====Demo=====&lt;br /&gt;
makefile:&lt;br /&gt;
&amp;lt;pre&amp;gt;...&lt;br /&gt;
TARGET = RP6M256_Sensor_Board_01&lt;br /&gt;
...&lt;br /&gt;
SRC += $(RP6_LIB_PATH)/RP6common/RP6I2CmasterTWI.c&lt;br /&gt;
&lt;br /&gt;
SRC += $(RP6_LIB_PATH)/RP6control_M256_WIFI/RP6M256_Sensor_BoardLib.c&lt;br /&gt;
...&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Datei: RP6M256_Sensor_Board_01.c&lt;br /&gt;
&amp;lt;pre&amp;gt;/* &lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * RP6 ROBOT SYSTEM - RP6 CONTROL M256 Examples&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Example: RP6M256 Sensor Board&lt;br /&gt;
 * Author(s): Dirk&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Description:&lt;br /&gt;
 * In this example we show a first test for the RP6 Sensor Board.&lt;br /&gt;
 * &lt;br /&gt;
 * ############################################################################&lt;br /&gt;
 * The Robot does NOT move in this example! You can simply put it on a table&lt;br /&gt;
 * next to your PC and you should connect it to the PC via the USB Interface!&lt;br /&gt;
 * You should also connect to it via WIFI.&lt;br /&gt;
 * ############################################################################&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Includes:&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6M256Lib.h&amp;quot; 				// The RP6 M256 Library. &lt;br /&gt;
										// Always needs to be included!&lt;br /&gt;
#include &amp;quot;RP6I2CmasterTWI.h&amp;quot;			// Include the I2C-Bus Master Library&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Include our new &amp;quot;RP6M256 Sensor Board library&amp;quot;:&lt;br /&gt;
// (This is the library for accessing the RP6 Sensor Board!)&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6M256_Sensor_BoardLib.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Variables:&lt;br /&gt;
&lt;br /&gt;
char dir[3];&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Returns a 2 character string for the eighth&lt;br /&gt;
 * parts of the direction calculated from the&lt;br /&gt;
 * heading value.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: heading -&amp;gt; Heading value [0..359]&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void calculateDir(char *dir, uint16_t heading)&lt;br /&gt;
{&lt;br /&gt;
	dir[1] = ' ';&lt;br /&gt;
	dir[2] = '\0';&lt;br /&gt;
	if ((heading &amp;lt;= 22) || (heading &amp;gt;=338)) dir[0] = 'N';&lt;br /&gt;
	if ((heading &amp;gt;= 23) &amp;amp;&amp;amp; (heading &amp;lt;= 67)) {dir[0] = 'N'; dir[1] = 'E';} &lt;br /&gt;
	if ((heading &amp;gt;= 68) &amp;amp;&amp;amp; (heading &amp;lt;= 112)) dir[0] = 'E';&lt;br /&gt;
	if ((heading &amp;gt;= 113) &amp;amp;&amp;amp; (heading &amp;lt;= 157)) {dir[0] = 'S'; dir[1] = 'E';}&lt;br /&gt;
	if ((heading &amp;gt;= 158) &amp;amp;&amp;amp; (heading &amp;lt;= 202)) dir[0] = 'S';&lt;br /&gt;
	if ((heading &amp;gt;= 203) &amp;amp;&amp;amp; (heading &amp;lt;= 247)) {dir[0] = 'S'; dir[1] = 'W';}&lt;br /&gt;
	if ((heading &amp;gt;= 248) &amp;amp;&amp;amp; (heading &amp;lt;= 292)) dir[0] = 'W';&lt;br /&gt;
	if ((heading &amp;gt;= 293) &amp;amp;&amp;amp; (heading &amp;lt;= 337)) {dir[0] = 'N'; dir[1] = 'W';}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Write a floating point number to the WIFI.&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *&lt;br /&gt;
 *			// Write a floating point number to the WIFI (no exponent):&lt;br /&gt;
 *			writeDouble_WIFI(1234567.890, 11, 3);&lt;br /&gt;
 *&lt;br /&gt;
 * The value of prec (precision) defines the number of decimal places.&lt;br /&gt;
 * For 32 bit floating point variables (float, double ...) 6 is&lt;br /&gt;
 * the max. value for prec (7 relevant digits).&lt;br /&gt;
 * The value of width defines the overall number of characters in the&lt;br /&gt;
 * floating point number including the decimal point. The number of&lt;br /&gt;
 * pre-decimal positions is: (width - prec - 1).&lt;br /&gt;
 */&lt;br /&gt;
void writeDouble_WIFI(double number, uint8_t width, uint8_t prec)&lt;br /&gt;
{char buffer[width + 1];&lt;br /&gt;
	dtostrf(number, width, prec, &amp;amp;buffer[0]);&lt;br /&gt;
	writeString_WIFI(&amp;amp;buffer[0]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Write a floating point number to the LCD.&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *&lt;br /&gt;
 *			// Write a floating point number to the LCD (no exponent):&lt;br /&gt;
 *			writeDoubleLCD(1234567.890, 11, 3);&lt;br /&gt;
 *&lt;br /&gt;
 * The value of prec (precision) defines the number of decimal places.&lt;br /&gt;
 * For 32 bit floating point variables (float, double ...) 6 is&lt;br /&gt;
 * the max. value for prec (7 relevant digits).&lt;br /&gt;
 * The value of width defines the overall number of characters in the&lt;br /&gt;
 * floating point number including the decimal point. The number of&lt;br /&gt;
 * pre-decimal positions is: (width - prec - 1).&lt;br /&gt;
 */&lt;br /&gt;
void writeDoubleLCD(double number, uint8_t width, uint8_t prec)&lt;br /&gt;
{char buffer[width + 1];&lt;br /&gt;
	dtostrf(number, width, prec, &amp;amp;buffer[0]);&lt;br /&gt;
	writeStringLCD(&amp;amp;buffer[0]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Error handler&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function gets called automatically if there was an I2C Error like&lt;br /&gt;
 * the slave sent a &amp;quot;not acknowledge&amp;quot; (NACK, error codes e.g. 0x20 or 0x30).&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void I2C_transmissionError(uint8_t errorState)&lt;br /&gt;
{&lt;br /&gt;
	writeString_P_WIFI(&amp;quot;\nI2C ERROR - TWI STATE: 0x&amp;quot;);&lt;br /&gt;
	writeInteger_WIFI(errorState, HEX);&lt;br /&gt;
	writeChar_WIFI('\n');&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Main function - The program starts here:&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
	initRP6M256();    // Always call this first! The Processor will not work&lt;br /&gt;
					  // correctly otherwise. &lt;br /&gt;
&lt;br /&gt;
	initLCD(); // Initialize the LC-Display (LCD)&lt;br /&gt;
			   // Always call this before using the LCD!&lt;br /&gt;
&lt;br /&gt;
	setLEDs(0b1111);&lt;br /&gt;
	mSleep(500);&lt;br /&gt;
	setLEDs(0b0000);&lt;br /&gt;
&lt;br /&gt;
	writeString_P_WIFI(&amp;quot;\n\nRP6 Sensor Board Selftest 1!\n&amp;quot;); &lt;br /&gt;
&lt;br /&gt;
	// IMPORTANT:&lt;br /&gt;
	I2CTWI_initMaster(100); // Initialize the TWI Module for Master operation&lt;br /&gt;
							// with 100kHz SCL Frequency&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	// Register the event handler:&lt;br /&gt;
	I2CTWI_setTransmissionErrorHandler(I2C_transmissionError);&lt;br /&gt;
&lt;br /&gt;
	setLEDs(0b1111);&lt;br /&gt;
&lt;br /&gt;
	// Write a text message to the LCD:&lt;br /&gt;
	showScreenLCD(&amp;quot;################&amp;quot;, &amp;quot;################&amp;quot;);&lt;br /&gt;
	mSleep(1500);&lt;br /&gt;
	showScreenLCD(&amp;quot;RP6v2-M256-WIFI &amp;quot;, &amp;quot;Example Program&amp;quot;);&lt;br /&gt;
	mSleep(2500); &lt;br /&gt;
	showScreenLCD(&amp;quot;RP6 Sensor Board&amp;quot;, &amp;quot;   Selftest 1&amp;quot;);&lt;br /&gt;
	mSleep(2500);&lt;br /&gt;
	clearLCD();&lt;br /&gt;
&lt;br /&gt;
	setLEDs(0b0000);&lt;br /&gt;
&lt;br /&gt;
	// ---------------------------------------&lt;br /&gt;
&lt;br /&gt;
	uint8_t onoff = 0;&lt;br /&gt;
	uint16_t servopos = SERVO1_LT;&lt;br /&gt;
	int16_t rate;&lt;br /&gt;
&lt;br /&gt;
	startStopwatch1();&lt;br /&gt;
	startStopwatch2();&lt;br /&gt;
&lt;br /&gt;
	// IMPORTANT:&lt;br /&gt;
	sensor_board_init();						// RP6 Sensor Board init!!!&lt;br /&gt;
	setServoPower(1);							// Servo power ON!&lt;br /&gt;
/*&lt;br /&gt;
	// ----------------------------------------------&lt;br /&gt;
	// Set RTC once (battery empty or not existing:&lt;br /&gt;
	rtc_time.second = 0;&lt;br /&gt;
	rtc_time.minute = 15;&lt;br /&gt;
	rtc_time.hour = 20;				// 20:15&lt;br /&gt;
	rtc_date.weekday = R_SU;&lt;br /&gt;
	rtc_date.day = 20;&lt;br /&gt;
	rtc_date.month = 4;&lt;br /&gt;
	rtc_date.year = 2014;			// Su, 20.4.2014&lt;br /&gt;
	DS1339_write();&lt;br /&gt;
	// Remove this, if RTC is set and running!!!&lt;br /&gt;
	// ----------------------------------------------&lt;br /&gt;
*/&lt;br /&gt;
	while(true) &lt;br /&gt;
	{&lt;br /&gt;
		if(getStopwatch1() &amp;gt; 1000) // 1s&lt;br /&gt;
		{&lt;br /&gt;
			if (onoff) onoff = 0;&lt;br /&gt;
			else onoff = 1;&lt;br /&gt;
&lt;br /&gt;
			// Interrupt status:&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nInterrupt Status:      &amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(interrupt_RP6SBstatus.byte, BIN, 8);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			// Inport status:&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;Inport Status: &amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(inport.word, BIN, 16);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			// Temperature sensor test:&lt;br /&gt;
			temperature = LM75B_measure();		// Measure&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;Temperature: &amp;quot;);&lt;br /&gt;
			writeDouble_WIFI(temperature, 7, 3);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;°\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			// LED driver test:&lt;br /&gt;
			if (onoff) {&lt;br /&gt;
				setLED(HEADLIGHT_R, STATE_ON);&lt;br /&gt;
				setLED(HEADLIGHT_L, STATE_OFF);&lt;br /&gt;
			}&lt;br /&gt;
			else {&lt;br /&gt;
				setLED(HEADLIGHT_L, STATE_ON);&lt;br /&gt;
				setLED(HEADLIGHT_R, STATE_OFF);&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			// Servo controller test (SERVO_1):&lt;br /&gt;
			setServo(1, servopos);&lt;br /&gt;
			servopos += 10;&lt;br /&gt;
			if (servopos &amp;gt; SERVO1_RT) servopos = SERVO1_LT;&lt;br /&gt;
&lt;br /&gt;
			// RTC test:&lt;br /&gt;
			DS1339_read();&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;RTC: &amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(rtc_time.hour, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;:&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(rtc_time.minute, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;:&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(rtc_time.second, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;  &amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(rtc_date.day, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;.&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(rtc_date.month, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;.&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(rtc_date.year, DEC, 4);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			// 3D Magnetometer &amp;amp; Accelerometer test:&lt;br /&gt;
			//  LSM303DLHC accelerometer:&lt;br /&gt;
			task_I2CTWI();&lt;br /&gt;
			readLSM303DLHC_A();					// Get sensor values&lt;br /&gt;
			task_I2CTWI();&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\n3D-Acceleration SENSOR -&amp;gt;\n&amp;quot;);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;X-axis: &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(x_axisa, DEC);&lt;br /&gt;
			writeChar_WIFI('\n');&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;Y-axis: &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(y_axisa, DEC);&lt;br /&gt;
			writeChar_WIFI('\n');&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;Z-axis: &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(z_axisa, DEC);&lt;br /&gt;
			writeChar_WIFI('\n');&lt;br /&gt;
			normalizeLSM303DLHC_A();			// Normalize data&lt;br /&gt;
			positionLSM303DLHC_A();				// Calculate position&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;POSITION: \n&amp;quot;);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;  Pitch [°]: &amp;quot;);&lt;br /&gt;
			writeDouble_WIFI(pitch, 6, 1);&lt;br /&gt;
			writeChar_WIFI('\n');&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;  Roll [°]:  &amp;quot;);&lt;br /&gt;
			writeDouble_WIFI(roll, 6, 1);&lt;br /&gt;
			writeChar_WIFI('\n');&lt;br /&gt;
&lt;br /&gt;
			//  LSM303DLHC magnetometer:&lt;br /&gt;
			task_I2CTWI();&lt;br /&gt;
			readLSM303DLHC_M();					// Get sensor values&lt;br /&gt;
			task_I2CTWI();&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\n3D-Compass SENSOR -&amp;gt;\n&amp;quot;);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;X-axis: &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(x_axism, DEC);&lt;br /&gt;
			writeChar_WIFI('\n');&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;Y-axis: &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(y_axism, DEC);&lt;br /&gt;
			writeChar_WIFI('\n');&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;Z-axis: &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(z_axism, DEC);&lt;br /&gt;
			writeChar_WIFI('\n');&lt;br /&gt;
			normalizeLSM303DLHC_M();			// Normalize data&lt;br /&gt;
			headingm = headingLSM303DLHC_M();	// Calculate heading&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;                 Heading [°]: &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(headingm, DEC);&lt;br /&gt;
			calculateDir(dir, headingm);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;  Direction: &amp;quot;);&lt;br /&gt;
			writeString_WIFI(dir);&lt;br /&gt;
			writeChar_WIFI('\n');&lt;br /&gt;
			headingtc = headingLSM303DLHC_TC();	// Calculate TILT COMPENSATED&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;TILT COMPENSATED heading [°]: &amp;quot;); // heading&lt;br /&gt;
			writeInteger_WIFI(headingtc, DEC);&lt;br /&gt;
			calculateDir(dir, headingtc);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;  Direction: &amp;quot;);&lt;br /&gt;
			writeString_WIFI(dir);&lt;br /&gt;
			writeChar_WIFI('\n');&lt;br /&gt;
#ifdef GET_TEMP_M&lt;br /&gt;
			temperature_mag = (double) temperaturem / 8.0 + OFFSET_TEMP_M;&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;Temperature [°]: &amp;quot;);&lt;br /&gt;
			writeDouble_WIFI(temperature_mag, 7, 2);&lt;br /&gt;
			writeChar_WIFI('\n');&lt;br /&gt;
#endif&lt;br /&gt;
			// Yaw-Rate Gyroscope test:&lt;br /&gt;
			rate = LY330ALH_measure();&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\n1D-Gyro SENSOR -&amp;gt;\n&amp;quot;);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;Z-axis: &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(rate, DEC);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			// RP6 Sensor Board shutdown (button &amp;amp; status LED test):&lt;br /&gt;
			if (pressedButton) {&lt;br /&gt;
				setStatusLED(1);&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;\nPress button again for RP6 Sensor Board SHUTDOWN!\n&amp;quot;);&lt;br /&gt;
				mSleep(2000);&lt;br /&gt;
				do {&lt;br /&gt;
					if(getStopwatch2() &amp;gt; 200) { // 0.2s&lt;br /&gt;
						if (onoff) onoff = 0;&lt;br /&gt;
						else onoff = 1;&lt;br /&gt;
						if (onoff) setStatusLED(1);&lt;br /&gt;
						else setStatusLED(0);&lt;br /&gt;
						setStopwatch2(0);&lt;br /&gt;
					}&lt;br /&gt;
					mSleep(1);&lt;br /&gt;
					task_I2CTWI();&lt;br /&gt;
				} while (!readButton());&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;\n\n\n\n\nPlease wait for RP6 Sensor Board SHUTDOWN...\n&amp;quot;);&lt;br /&gt;
				sensor_board_shutdown();&lt;br /&gt;
				mSleep(3000);&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;\n\n\nThe RP6 Sensor Board now is in SHUTDOWN MODE!!!\n&amp;quot;);&lt;br /&gt;
				mSleep(1000);&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;\nRESET the M256 microcontroller now...\n\n&amp;quot;);&lt;br /&gt;
				while(true) {};&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			setStopwatch1(0);&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		task_checkINTs();						// Read interrupt signals&lt;br /&gt;
		task_RP6SensorBoard();					// RP6 Sensor Board task&lt;br /&gt;
&lt;br /&gt;
		task_I2CTWI();&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Erklärung&lt;br /&gt;
&lt;br /&gt;
====Projekte====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===RP6 Xtra Module===&lt;br /&gt;
Die Dokumentation zu den RP6 Xtra Modulen befindet sich auf der mitgelieferten ''&amp;quot;RP6 Robot System Xtra Modules CD-ROM&amp;quot;''. Auf der CD-ROM sind auch Software-Beispiele zu finden.&lt;br /&gt;
&lt;br /&gt;
Die hier veröffentlichte Software zu den Xtra Modulen ist eine Eigenentwicklung in GCC:&lt;br /&gt;
* Arexx [[RP6_Sensor_Board_und_Xtra_Module#I2C_GPS_Empf.C3.A4nger_JM3-GPS_2|I2C GPS Empfänger JM3-GPS]]&lt;br /&gt;
* Arexx [[RP6_Sensor_Board_und_Xtra_Module#Gyro_Modul_JM3-GYRO_2|Gyro Modul JM3-GYRO]]&lt;br /&gt;
* Arexx [[RP6_Sensor_Board_und_Xtra_Module#3D_Accelerometer_Modul_JM3-3DA_2|3D Accelerometer Modul JM3-3DA]]&lt;br /&gt;
* Arexx [[RP6_Sensor_Board_und_Xtra_Module#BHT_Modul_JM3-BHT31_2|BHT Modul JM3-BHT31]]&lt;br /&gt;
&lt;br /&gt;
====I2C GPS Empfänger JM3-GPS====&lt;br /&gt;
=====Dokumentation=====&lt;br /&gt;
Die Dokumentation zum I2C GPS Empfänger befindet sich auf der mitgelieferten ''&amp;quot;RP6 Robot System Xtra Modules CD-ROM&amp;quot;''.&lt;br /&gt;
&lt;br /&gt;
======Manuals======&lt;br /&gt;
Das Handbuch in der aktuellen Version kann [http://www.jm3-engineering.com/download/doc/ManualGPSModule_de.pdf hier] eingesehen werden.&lt;br /&gt;
&lt;br /&gt;
=====Demo-Programme=====&lt;br /&gt;
Ein Demo-Programm zum I2C GPS Empfänger befindet sich integriert in die RP6 Sensor Board Demo auf der mitgelieferten ''&amp;quot;RP6 Robot System Xtra Modules CD-ROM&amp;quot;''. Diese Demo kann auch in der aktuellen Version im Download Bereich von [http://www.jm3-engineering.com/downloads.htm JM3 Engineering] herunter geladen werden.&lt;br /&gt;
&lt;br /&gt;
=====RP6M256 WiFi: I2C_GPS Library=====&lt;br /&gt;
Die nachfolgende RP6M256_I2C_GPSLib (Eigenentwicklung in GCC) dient zur Ansteuerung des I2C GPS Empfängers durch die RP6M256 WiFi.&lt;br /&gt;
 &lt;br /&gt;
======Libary Header======&lt;br /&gt;
Datei: RP6M256_I2C_GPSLib.h&lt;br /&gt;
&amp;lt;pre&amp;gt;/* ****************************************************************************&lt;br /&gt;
 *                           _______________________&lt;br /&gt;
 *                           \| RP6  ROBOT SYSTEM |/&lt;br /&gt;
 *                            \_-_-_-_-_-_-_-_-_-_/           &amp;gt;&amp;gt;&amp;gt; RP6 M256 WIFI&lt;br /&gt;
 * ----------------------------------------------------------------------------&lt;br /&gt;
 * ----------------------------- [c]2014 - Dirk -------------------------------&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * File: RP6M256_I2C_GPSLib.h&lt;br /&gt;
 * Version: 1.0&lt;br /&gt;
 * Target: RP6 M256 WIFI - ATMEGA2560 @16.00MHz&lt;br /&gt;
 * Author(s): Dirk&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Description:&lt;br /&gt;
 * Header file for new RP6 I2C GPS Receiver library.&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
#ifndef RP6M256_I2C_GPSLIB_H&lt;br /&gt;
#define RP6M256_I2C_GPSLIB_H&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// RP6 Sensor Board:&lt;br /&gt;
&lt;br /&gt;
// If you want to use the RP6 I2C GPS Receiver on the RP6 Sensor Board, you&lt;br /&gt;
// have to define SENSOR_BOARD (default)!&lt;br /&gt;
// If SENSOR_BOARD is NOT defined, this library assumes that the RP6 I2C GPS&lt;br /&gt;
// Receiver is used stand-alone.&lt;br /&gt;
// ------------------&lt;br /&gt;
#define SENSOR_BOARD&lt;br /&gt;
// ------------------&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Includes:&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6M256Lib.h&amp;quot;&lt;br /&gt;
#include &amp;quot;RP6I2CmasterTWI.h&amp;quot;&lt;br /&gt;
#ifdef SENSOR_BOARD&lt;br /&gt;
	#include &amp;quot;RP6M256_Sensor_BoardLib.h&amp;quot;&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// RP6 I2C GPS Receiver:&lt;br /&gt;
#define I2C_GPS_RECEIVER_ADR			0xc8	// Default&lt;br /&gt;
//#define I2C_GPS_RECEIVER_ADR			0xca&lt;br /&gt;
//#define I2C_GPS_RECEIVER_ADR			0xcc&lt;br /&gt;
//#define I2C_GPS_RECEIVER_ADR			0xce&lt;br /&gt;
//#define I2C_GPS_RECEIVER_ADR			0xd0	// DO NOT USE on Sensor Board!&lt;br /&gt;
//#define I2C_GPS_RECEIVER_ADR			0xd2&lt;br /&gt;
//#define I2C_GPS_RECEIVER_ADR			0xd4&lt;br /&gt;
//#define I2C_GPS_RECEIVER_ADR			0xd6&lt;br /&gt;
//#define I2C_GPS_RECEIVER_ADR			0xd8&lt;br /&gt;
//#define I2C_GPS_RECEIVER_ADR			0xda&lt;br /&gt;
//#define I2C_GPS_RECEIVER_ADR			0xdc&lt;br /&gt;
//#define I2C_GPS_RECEIVER_ADR			0xde&lt;br /&gt;
&lt;br /&gt;
// Read registers:&lt;br /&gt;
#define WHO_AM_I						0x20	// I2C address [0xc8..0xde]&lt;br /&gt;
#define LAT_DEG							0x21	// Degrees&lt;br /&gt;
#define LAT_MIN							0x22	// Minutes&lt;br /&gt;
#define LAT_MIN_D_L						0x23	// Minutes decimal part low&lt;br /&gt;
#define LAT_MIN_D_H						0x24	// Minutes decimal part high&lt;br /&gt;
#define LON_DEG							0x25	// Degrees&lt;br /&gt;
#define LON_MIN							0x26	// Minutes&lt;br /&gt;
#define LON_MIN_D_L						0x27	// Minutes decimal part low&lt;br /&gt;
#define LON_MIN_D_H						0x28	// Minutes decimal part high&lt;br /&gt;
#define STATUS							0x29	// Status flags&lt;br /&gt;
#define FIX_IND							0x2a	// FIX_IND&lt;br /&gt;
#define HDOP							0x2b	// HDOP&lt;br /&gt;
#define HDOP_D							0x2c	// HDOP_D&lt;br /&gt;
#define SAT_N							0x2d	// Number of satellites&lt;br /&gt;
#define COURSE_T_L						0x2e	// True heading low byte&lt;br /&gt;
#define COURSE_T_H						0x2f	// True heading high byte&lt;br /&gt;
#define COURSE_T_D						0x30	// Decimal part of course&lt;br /&gt;
#define SPEED_L							0x31	// Speed low byte&lt;br /&gt;
#define SPEED_H							0x32	// Speed high byte&lt;br /&gt;
#define SPEED_D							0x33	// Speed decimal part&lt;br /&gt;
#define ALT_L							0x34	// Altitude low byte&lt;br /&gt;
#define ALT_H							0x35	// Altitude high byte&lt;br /&gt;
#define ALT_DIF_L						0x36	// Differ. WGS-84 MSL low byte&lt;br /&gt;
#define ALT_DIF_H						0x37	// Differ. WGS-84 MSL high byte&lt;br /&gt;
#define UTC_H							0x38	// UTC hour&lt;br /&gt;
#define UTC_MIN							0x39	// UTC minute&lt;br /&gt;
#define UTC_S							0x3a	// UTC second&lt;br /&gt;
#define DAY								0x3b	// Day&lt;br /&gt;
#define YEAR_L							0x3c	// Year low byte&lt;br /&gt;
#define YEAR_H							0x3d	// Year high byte&lt;br /&gt;
#define MONTH							0x3e	// Month&lt;br /&gt;
#define PDOP							0x3f	// PDOP&lt;br /&gt;
#define PDOP_D							0x40	// PDOP_D&lt;br /&gt;
#define VDOP							0x41	// VDOP&lt;br /&gt;
#define VDOP_D							0x42	// VDOP_D&lt;br /&gt;
#define SAT_1							0x43	// SAT # 1&lt;br /&gt;
#define SAT_2							0x44	// SAT # 2&lt;br /&gt;
#define SAT_3							0x45	// SAT # 3&lt;br /&gt;
#define SAT_4							0x46	// SAT # 4&lt;br /&gt;
#define SAT_5							0x47	// SAT # 5&lt;br /&gt;
#define SAT_6							0x48	// SAT # 6&lt;br /&gt;
#define SAT_7							0x49	// SAT # 7&lt;br /&gt;
#define SAT_8							0x4a	// SAT # 8&lt;br /&gt;
#define SAT_9							0x4b	// SAT # 9&lt;br /&gt;
#define SAT_A							0x4c	// SAT # 10&lt;br /&gt;
#define SAT_B							0x4d	// SAT # 11&lt;br /&gt;
#define SAT_C							0x4e	// SAT # 12&lt;br /&gt;
#define SW_VERSION						0x4f	// SW_Version&lt;br /&gt;
#define HEARTBEAT						0x50	// Heartbeat&lt;br /&gt;
&lt;br /&gt;
// Status and Fix_Ind register bitmasks:&lt;br /&gt;
#define STATUS_NS						0b00000001&lt;br /&gt;
#define STATUS_EW						0b00000010&lt;br /&gt;
#define STATUS_SPU						0b00000100&lt;br /&gt;
#define STATUS_AUTON					0b00001000&lt;br /&gt;
#define FIX_IND_UI_FIX					0b10000000&lt;br /&gt;
&lt;br /&gt;
// Write registers:&lt;br /&gt;
#define INIT_CFG						0x90	// INIT CFG&lt;br /&gt;
#define SET_FIX_TIME					0x91	// Pos_Fix_Time&lt;br /&gt;
#define STBY							0x92	// STBY&lt;br /&gt;
#define FAC_RES							0x93	// Factory Reset&lt;br /&gt;
#define EN_JAM							0x94	// Jamming Remover&lt;br /&gt;
#define TEST_MODE						0x96	// Test Mode&lt;br /&gt;
&lt;br /&gt;
// Write register values (commands):&lt;br /&gt;
#define INIT_CFG_HOT_START				1		// Hot Start&lt;br /&gt;
#define INIT_CFG_WARM_START				2		// Warm Start init data loaded&lt;br /&gt;
#define INIT_CFG_WARM_START_EPH_CLR		3		// Warm Start Ephemeris cleared&lt;br /&gt;
#define INIT_CFG_COLD_START				4		// Cold Start&lt;br /&gt;
#define SET_FIX_TIME_1S					1		// Pos Fix Time 1 second&lt;br /&gt;
#define SET_FIX_TIME_2S					2		// Pos Fix Time 2 seconds&lt;br /&gt;
#define STBY_ENTER						1		// Standby (cleared after write)&lt;br /&gt;
#define FAC_RES_ENTER					1		// Factory Reset&lt;br /&gt;
#define EN_JAM_DISABLE					0		// Jamming Remover disable&lt;br /&gt;
#define EN_JAM_ENABLE					1		// Jamming Remover enable&lt;br /&gt;
#define TEST_MODE_INACTIVE				0		// Test Mode inactive&lt;br /&gt;
#define TEST_MODE_ACTIVE				0x15	// Test Mode active&lt;br /&gt;
&lt;br /&gt;
// Data structure (starts at LAT_DEG):&lt;br /&gt;
#define DATA_STRUCT						LAT_DEG	// Start&lt;br /&gt;
// All data from LAT_DEG to HEARTBEAT (48 bytes):&lt;br /&gt;
#define DATA_LENGTH						(HEARTBEAT - LAT_DEG + 1)&lt;br /&gt;
// Basic data from LAT_DEG to SAT_N (13 bytes):&lt;br /&gt;
#define DATA_BASIC						(SAT_N - LAT_DEG + 1)&lt;br /&gt;
&lt;br /&gt;
typedef union {&lt;br /&gt;
 	uint8_t byte;&lt;br /&gt;
	struct {&lt;br /&gt;
		unsigned ns    :1;				// 1: North 0: South&lt;br /&gt;
		unsigned ew    :1;				// 1: East 0: West&lt;br /&gt;
		unsigned spu   :1;				// 1: km/h 0: kn&lt;br /&gt;
		unsigned auton :1;				// 1: Data not valid 0: Autonomous&lt;br /&gt;
		unsigned fix0  :1;&lt;br /&gt;
		unsigned fix1  :1;&lt;br /&gt;
		unsigned stat0 :1;				// Invalid&lt;br /&gt;
		unsigned stat1 :1;				// GPS Com Error&lt;br /&gt;
	};&lt;br /&gt;
	struct {&lt;br /&gt;
		unsigned ns    :1;				// 1: North 0: South&lt;br /&gt;
		unsigned ew    :1;				// 1: East 0: West&lt;br /&gt;
		unsigned spu   :1;				// 1: km/h 0: kn&lt;br /&gt;
		unsigned auton :1;				// 1: Data not valid 0: Autonomous&lt;br /&gt;
		unsigned fix   :2;&lt;br /&gt;
		unsigned stat  :2;				// 00 -&amp;gt; Valid&lt;br /&gt;
										// 01 -&amp;gt; Invalid&lt;br /&gt;
										// 10 -&amp;gt; GPS Com Error&lt;br /&gt;
										// 11 -&amp;gt; n. def.&lt;br /&gt;
	};&lt;br /&gt;
} status_t;&lt;br /&gt;
&lt;br /&gt;
typedef union {&lt;br /&gt;
 	uint8_t byte;&lt;br /&gt;
	struct {							// Fix indicator:&lt;br /&gt;
		unsigned fix_0  :1;				//  1: GPS fix          2: DGPS fix&lt;br /&gt;
		unsigned fix_1  :1;				//  3: PPS fix          4: RTK&lt;br /&gt;
		unsigned fix_2  :1;				//  5: Float RTK        6: Dead reck.&lt;br /&gt;
		unsigned fix_3  :1;				//  7: Manual inp. mode 8: Simul. mode&lt;br /&gt;
		unsigned unused :3;&lt;br /&gt;
		unsigned ui_fix :1;				// HW signal from UC530&lt;br /&gt;
	};&lt;br /&gt;
	struct {&lt;br /&gt;
		unsigned fix    :4;				// See above &amp;quot;Fix indicator&amp;quot;!&lt;br /&gt;
		unsigned unused :3;&lt;br /&gt;
		unsigned ui_fix :1;				// HW signal from UC530&lt;br /&gt;
	};&lt;br /&gt;
} fix_ind_t;&lt;br /&gt;
&lt;br /&gt;
typedef union {&lt;br /&gt;
	struct {&lt;br /&gt;
		uint8_t   latDeg;&lt;br /&gt;
		uint8_t   latMin;&lt;br /&gt;
		uint16_t  latMinDec;&lt;br /&gt;
		uint8_t   lonDeg;&lt;br /&gt;
		uint8_t   lonMin;&lt;br /&gt;
		uint16_t  lonMinDec;&lt;br /&gt;
		status_t  status;&lt;br /&gt;
		fix_ind_t fixInd;&lt;br /&gt;
		uint8_t   hdop;&lt;br /&gt;
		uint8_t   hdopDec;&lt;br /&gt;
		uint8_t   satCount;&lt;br /&gt;
		uint16_t  course;&lt;br /&gt;
		uint8_t   courseDec;&lt;br /&gt;
		uint16_t  speed;&lt;br /&gt;
		uint8_t   speedDec;&lt;br /&gt;
		uint16_t  altitude;&lt;br /&gt;
		uint16_t  altDif;&lt;br /&gt;
		uint8_t   utcHour;&lt;br /&gt;
		uint8_t   utcMinute;&lt;br /&gt;
		uint8_t   utcSec;&lt;br /&gt;
		uint8_t   day;&lt;br /&gt;
		uint16_t  year;&lt;br /&gt;
		uint8_t   month;&lt;br /&gt;
		uint8_t   pdop;&lt;br /&gt;
		uint8_t   pdopDec;&lt;br /&gt;
		uint8_t   vdop;&lt;br /&gt;
		uint8_t   vdopDec;&lt;br /&gt;
		uint8_t   sat[12];&lt;br /&gt;
		uint8_t   swVersion;&lt;br /&gt;
		uint8_t   heartbeat;&lt;br /&gt;
	};&lt;br /&gt;
} gpsdata_t;&lt;br /&gt;
extern gpsdata_t gpsdata;&lt;br /&gt;
&lt;br /&gt;
void I2C_GPS_reset(void);&lt;br /&gt;
void I2C_GPS_write_cmd(uint8_t, uint8_t);&lt;br /&gt;
uint8_t I2C_GPS_read_reg(uint8_t);&lt;br /&gt;
void I2C_GPS_read(uint8_t);&lt;br /&gt;
void I2C_GPS_init(void);&lt;br /&gt;
void I2C_GPS_new_addr(uint8_t);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
/******************************************************************************&lt;br /&gt;
 * Additional info&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Changelog:&lt;br /&gt;
 * &lt;br /&gt;
 *  ---&amp;gt; changes are documented in the file &amp;quot;RP6M256_I2C_GPSLib.c&amp;quot;&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
======Libary Source======&lt;br /&gt;
Datei: RP6M256_I2C_GPSLib.c&lt;br /&gt;
&amp;lt;pre&amp;gt;/* ****************************************************************************&lt;br /&gt;
 *                           _______________________&lt;br /&gt;
 *                           \| RP6  ROBOT SYSTEM |/&lt;br /&gt;
 *                            \_-_-_-_-_-_-_-_-_-_/           &amp;gt;&amp;gt;&amp;gt; RP6 M256 WIFI&lt;br /&gt;
 * ----------------------------------------------------------------------------&lt;br /&gt;
 * ----------------------------- [c]2014 - Dirk -------------------------------&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * File: RP6M256_I2C_GPSLib.c&lt;br /&gt;
 * Version: 1.0&lt;br /&gt;
 * Target: RP6 M256 WIFI - ATMEGA2560 @16.00MHz&lt;br /&gt;
 *         and a RP6 I2C GPS Receiver (CONRAD 1082385)&lt;br /&gt;
 *         optionally on a RP6 Sensor Board (CONRAD 1082384)&lt;br /&gt;
 * Author(s): Dirk&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Description:&lt;br /&gt;
 * &lt;br /&gt;
 * This is our new Library that contains basic routines and functions for&lt;br /&gt;
 * accessing the RP6 I2C GPS Receiver JM3-GPS (CONRAD 1082385).&lt;br /&gt;
 * The library assumes the I2C GPS Receiver software (firmware) v1.2.&lt;br /&gt;
 * If the I2C GPS Receiver is located on the RP6 Sensor Board (CONRAD 1082384)&lt;br /&gt;
 * and connected to the I2C-MODULE plug M1, the RP6M256_Sensor_BoardLib has to&lt;br /&gt;
 * be included!&lt;br /&gt;
 * &lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Includes:&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6M256_I2C_GPSLib.h&amp;quot; 		&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Variables:&lt;br /&gt;
&lt;br /&gt;
uint8_t gpsdataBuf[DATA_LENGTH + 1]; &lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Software reset for the I2C GPS Receiver.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void I2C_GPS_reset(void)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_GPS_RECEIVER_ADR, 0, 0x06);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Writes a command cmd to a register reg of the&lt;br /&gt;
 * I2C GPS Receiver.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: reg -&amp;gt; Write register [0x90..0x96]&lt;br /&gt;
 *        cmd -&amp;gt; Command&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void I2C_GPS_write_cmd(uint8_t reg, uint8_t cmd)&lt;br /&gt;
{&lt;br /&gt;
	if((reg &amp;lt; INIT_CFG) || (reg &amp;gt; TEST_MODE)) return;&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_GPS_RECEIVER_ADR, reg, cmd);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Reads a single register reg from the I2C GPS&lt;br /&gt;
 * Receiver.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: reg -&amp;gt; Read register [0x20..0x50]&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
uint8_t I2C_GPS_read_reg(uint8_t reg)&lt;br /&gt;
{&lt;br /&gt;
	if((reg &amp;lt; WHO_AM_I) || (reg &amp;gt; HEARTBEAT)) reg = WHO_AM_I;&lt;br /&gt;
	I2CTWI_transmitByte(I2C_GPS_RECEIVER_ADR, reg);&lt;br /&gt;
	return (I2CTWI_readByte(I2C_GPS_RECEIVER_ADR));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
gpsdata_t gpsdata;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Reads the GPS data from the I2C GPS Receiver.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: length -&amp;gt; Number of data bytes [1..48]&lt;br /&gt;
 *&lt;br /&gt;
 * Hint: If length = DATA_BASIC, only basic GPS&lt;br /&gt;
 *       data are read. If length = DATA_LENGTH,&lt;br /&gt;
 *       ALL GPS data are read.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void I2C_GPS_read(uint8_t length)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t i;&lt;br /&gt;
&lt;br /&gt;
	if(length &amp;gt; DATA_LENGTH) length = DATA_LENGTH;&lt;br /&gt;
	I2CTWI_readRegisters(I2C_GPS_RECEIVER_ADR, DATA_STRUCT, gpsdataBuf, length);&lt;br /&gt;
	for(i = length; i &amp;lt; DATA_LENGTH; i++) {&lt;br /&gt;
		gpsdataBuf[i] = 0;&lt;br /&gt;
	}&lt;br /&gt;
	gpsdata.latDeg = gpsdataBuf[0];&lt;br /&gt;
	gpsdata.latMin = gpsdataBuf[1];&lt;br /&gt;
	gpsdata.latMinDec = gpsdataBuf[2] + (gpsdataBuf[3] &amp;lt;&amp;lt; 8);&lt;br /&gt;
	gpsdata.lonDeg = gpsdataBuf[4];&lt;br /&gt;
	gpsdata.lonMin = gpsdataBuf[5];&lt;br /&gt;
	gpsdata.lonMinDec = gpsdataBuf[6] + (gpsdataBuf[7] &amp;lt;&amp;lt; 8);&lt;br /&gt;
	gpsdata.status.byte = gpsdataBuf[8];&lt;br /&gt;
	gpsdata.fixInd.byte = gpsdataBuf[9];&lt;br /&gt;
	gpsdata.hdop = gpsdataBuf[10];&lt;br /&gt;
	gpsdata.hdopDec = gpsdataBuf[11];&lt;br /&gt;
	gpsdata.satCount = gpsdataBuf[12];&lt;br /&gt;
	if(length == DATA_BASIC) return;&lt;br /&gt;
	gpsdata.course = gpsdataBuf[13] + (gpsdataBuf[14] &amp;lt;&amp;lt; 8);&lt;br /&gt;
	gpsdata.courseDec = gpsdataBuf[15];&lt;br /&gt;
	gpsdata.speed = gpsdataBuf[16] + (gpsdataBuf[17] &amp;lt;&amp;lt; 8);&lt;br /&gt;
	gpsdata.speedDec = gpsdataBuf[18];&lt;br /&gt;
	gpsdata.altitude = gpsdataBuf[19] + (gpsdataBuf[20] &amp;lt;&amp;lt; 8);&lt;br /&gt;
	gpsdata.altDif = gpsdataBuf[21] + (gpsdataBuf[22] &amp;lt;&amp;lt; 8);&lt;br /&gt;
	gpsdata.utcHour = gpsdataBuf[23];&lt;br /&gt;
	gpsdata.utcMinute = gpsdataBuf[24];&lt;br /&gt;
	gpsdata.utcSec = gpsdataBuf[25];&lt;br /&gt;
	gpsdata.day = gpsdataBuf[26];&lt;br /&gt;
	gpsdata.year = gpsdataBuf[27] + (gpsdataBuf[28] * 100);&lt;br /&gt;
	gpsdata.month = gpsdataBuf[29];&lt;br /&gt;
	gpsdata.pdop = gpsdataBuf[30];&lt;br /&gt;
	gpsdata.pdopDec = gpsdataBuf[31];&lt;br /&gt;
	gpsdata.vdop = gpsdataBuf[32];&lt;br /&gt;
	gpsdata.vdopDec = gpsdataBuf[33];&lt;br /&gt;
	for(i = 34; i &amp;lt; 46; i++) {&lt;br /&gt;
		gpsdata.sat[i - 34] = gpsdataBuf[i];&lt;br /&gt;
	}&lt;br /&gt;
	gpsdata.swVersion = gpsdataBuf[46];&lt;br /&gt;
	gpsdata.heartbeat = gpsdataBuf[47];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * You MUST call this function at the beginning of a&lt;br /&gt;
 * main program, that uses the RP6 I2C GPS Receiver. &lt;br /&gt;
 * If SENSOR_BOARD is defined, the I2C-MODULE power&lt;br /&gt;
 * will be switched on with the function&lt;br /&gt;
 * setI2CModulePower() defined in the&lt;br /&gt;
 * RP6M256_Sensor_BoardLib, which will be included&lt;br /&gt;
 * then.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void I2C_GPS_init(void)&lt;br /&gt;
{&lt;br /&gt;
#ifdef SENSOR_BOARD&lt;br /&gt;
	// I2C-MODULE (plug M1) power on: &lt;br /&gt;
	setI2CModulePower(1);&lt;br /&gt;
#endif&lt;br /&gt;
	// Other init procedures here!&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Writes a new I2C address to the I2C GPS Receiver.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: addr -&amp;gt; New I2C address [0xc8..0xde]&lt;br /&gt;
 *&lt;br /&gt;
 * Hints: - Default I2C address is 0xc8.&lt;br /&gt;
 *        - You may choose a new I2C address in&lt;br /&gt;
 *          the range 0xc8..0xde.&lt;br /&gt;
 *        - After writing a new address you have&lt;br /&gt;
 *          to switch the I2C GPS Receiver off&lt;br /&gt;
 *          and on again.&lt;br /&gt;
 *        - Definition I2C_GPS_RECEIVER_ADR must&lt;br /&gt;
 *          be adapted to the new I2C address!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void I2C_GPS_new_addr(uint8_t addr)&lt;br /&gt;
{&lt;br /&gt;
	if((addr &amp;lt; 0xc8) || (addr &amp;gt; 0xde)) return;&lt;br /&gt;
	addr &amp;amp;= 0xfe;								// Clear R/W bit&lt;br /&gt;
	I2CTWI_transmit3Bytes(I2C_GPS_RECEIVER_ADR, 0, 0x04, addr);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&lt;br /&gt;
/******************************************************************************&lt;br /&gt;
 * Additional info&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Changelog:&lt;br /&gt;
 * - v. 1.0 (initial release) 21.04.2014 by Dirk&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Erklärung&lt;br /&gt;
&lt;br /&gt;
======Demo======&lt;br /&gt;
makefile:&lt;br /&gt;
&amp;lt;pre&amp;gt;...&lt;br /&gt;
TARGET = RP6M256_Sensor_Board_02&lt;br /&gt;
...&lt;br /&gt;
SRC += $(RP6_LIB_PATH)/RP6common/RP6I2CmasterTWI.c&lt;br /&gt;
&lt;br /&gt;
SRC += $(RP6_LIB_PATH)/RP6control_M256_WIFI/RP6M256_Sensor_BoardLib.c&lt;br /&gt;
SRC += $(RP6_LIB_PATH)/RP6control_M256_WIFI/RP6M256_I2C_GPSLib.c&lt;br /&gt;
...&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Datei: RP6M256_Sensor_Board_02.c&lt;br /&gt;
&amp;lt;pre&amp;gt;/* &lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * RP6 ROBOT SYSTEM - RP6 CONTROL M256 Examples&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Example: RP6M256 Sensor Board&lt;br /&gt;
 * Author(s): Dirk&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Description:&lt;br /&gt;
 * In this example we show a second test for the RP6 Sensor Board.&lt;br /&gt;
 * &lt;br /&gt;
 * ############################################################################&lt;br /&gt;
 * The Robot does NOT move in this example! You can simply put it on a table&lt;br /&gt;
 * next to your PC and you should connect it to the PC via the USB Interface!&lt;br /&gt;
 * You should also connect to it via WIFI.&lt;br /&gt;
 * ############################################################################&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Includes:&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6M256Lib.h&amp;quot; 				// The RP6 M256 Library. &lt;br /&gt;
										// Always needs to be included!&lt;br /&gt;
#include &amp;quot;RP6I2CmasterTWI.h&amp;quot;			// Include the I2C-Bus Master Library&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Include our new &amp;quot;RP6M256 I2C GPS Receiver library&amp;quot;:&lt;br /&gt;
// (This is the library for accessing the RP6 I2C GPS Receiver!)&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6M256_I2C_GPSLib.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Write a floating point number to the WIFI.&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *&lt;br /&gt;
 *			// Write a floating point number to the WIFI (no exponent):&lt;br /&gt;
 *			writeDouble_WIFI(1234567.890, 11, 3);&lt;br /&gt;
 *&lt;br /&gt;
 * The value of prec (precision) defines the number of decimal places.&lt;br /&gt;
 * For 32 bit floating point variables (float, double ...) 6 is&lt;br /&gt;
 * the max. value for prec (7 relevant digits).&lt;br /&gt;
 * The value of width defines the overall number of characters in the&lt;br /&gt;
 * floating point number including the decimal point. The number of&lt;br /&gt;
 * pre-decimal positions is: (width - prec - 1).&lt;br /&gt;
 */&lt;br /&gt;
void writeDouble_WIFI(double number, uint8_t width, uint8_t prec)&lt;br /&gt;
{char buffer[width + 1];&lt;br /&gt;
	dtostrf(number, width, prec, &amp;amp;buffer[0]);&lt;br /&gt;
	writeString_WIFI(&amp;amp;buffer[0]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Write a floating point number to the LCD.&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *&lt;br /&gt;
 *			// Write a floating point number to the LCD (no exponent):&lt;br /&gt;
 *			writeDoubleLCD(1234567.890, 11, 3);&lt;br /&gt;
 *&lt;br /&gt;
 * The value of prec (precision) defines the number of decimal places.&lt;br /&gt;
 * For 32 bit floating point variables (float, double ...) 6 is&lt;br /&gt;
 * the max. value for prec (7 relevant digits).&lt;br /&gt;
 * The value of width defines the overall number of characters in the&lt;br /&gt;
 * floating point number including the decimal point. The number of&lt;br /&gt;
 * pre-decimal positions is: (width - prec - 1).&lt;br /&gt;
 */&lt;br /&gt;
void writeDoubleLCD(double number, uint8_t width, uint8_t prec)&lt;br /&gt;
{char buffer[width + 1];&lt;br /&gt;
	dtostrf(number, width, prec, &amp;amp;buffer[0]);&lt;br /&gt;
	writeStringLCD(&amp;amp;buffer[0]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Error handler&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function gets called automatically if there was an I2C Error like&lt;br /&gt;
 * the slave sent a &amp;quot;not acknowledge&amp;quot; (NACK, error codes e.g. 0x20 or 0x30).&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void I2C_transmissionError(uint8_t errorState)&lt;br /&gt;
{&lt;br /&gt;
	writeString_P_WIFI(&amp;quot;\nI2C ERROR - TWI STATE: 0x&amp;quot;);&lt;br /&gt;
	writeInteger_WIFI(errorState, HEX);&lt;br /&gt;
	writeChar_WIFI('\n');&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Main function - The program starts here:&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
	initRP6M256();    // Always call this first! The Processor will not work&lt;br /&gt;
					  // correctly otherwise. &lt;br /&gt;
&lt;br /&gt;
	initLCD(); // Initialize the LC-Display (LCD)&lt;br /&gt;
			   // Always call this before using the LCD!&lt;br /&gt;
&lt;br /&gt;
	setLEDs(0b1111);&lt;br /&gt;
	mSleep(500);&lt;br /&gt;
	setLEDs(0b0000);&lt;br /&gt;
&lt;br /&gt;
	writeString_P_WIFI(&amp;quot;\n\nRP6 Sensor Board Selftest 2!\n&amp;quot;); &lt;br /&gt;
&lt;br /&gt;
	// IMPORTANT:&lt;br /&gt;
	I2CTWI_initMaster(100); // Initialize the TWI Module for Master operation&lt;br /&gt;
							// with 100kHz SCL Frequency&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	// Register the event handler:&lt;br /&gt;
	I2CTWI_setTransmissionErrorHandler(I2C_transmissionError);&lt;br /&gt;
&lt;br /&gt;
	setLEDs(0b1111);&lt;br /&gt;
&lt;br /&gt;
	// Write a text message to the LCD:&lt;br /&gt;
	showScreenLCD(&amp;quot;################&amp;quot;, &amp;quot;################&amp;quot;);&lt;br /&gt;
	mSleep(1500);&lt;br /&gt;
	showScreenLCD(&amp;quot;RP6v2-M256-WIFI &amp;quot;, &amp;quot;Example Program&amp;quot;);&lt;br /&gt;
	mSleep(2500); &lt;br /&gt;
	showScreenLCD(&amp;quot;RP6 Sensor Board&amp;quot;, &amp;quot;   Selftest 2&amp;quot;);&lt;br /&gt;
	mSleep(2500);&lt;br /&gt;
	clearLCD();&lt;br /&gt;
&lt;br /&gt;
	setLEDs(0b0000);&lt;br /&gt;
&lt;br /&gt;
	// ---------------------------------------&lt;br /&gt;
&lt;br /&gt;
	uint8_t onoff = 0;&lt;br /&gt;
	uint8_t i;&lt;br /&gt;
&lt;br /&gt;
	startStopwatch1();&lt;br /&gt;
	startStopwatch2();&lt;br /&gt;
&lt;br /&gt;
	// IMPORTANT:&lt;br /&gt;
	sensor_board_init();						// RP6 Sensor Board init!!!&lt;br /&gt;
	I2C_GPS_init();								// RP6 I2C GPS Receiver init&lt;br /&gt;
&lt;br /&gt;
	while(true) &lt;br /&gt;
	{&lt;br /&gt;
		if(getStopwatch1() &amp;gt; 1000) // 1s&lt;br /&gt;
		{&lt;br /&gt;
			if (onoff) onoff = 0;&lt;br /&gt;
			else onoff = 1;&lt;br /&gt;
&lt;br /&gt;
			// Show GPS data:&lt;br /&gt;
			I2C_GPS_read(DATA_LENGTH);			// Read data&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nLAT_DEG:     &amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.latDeg, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;° &amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.latMin, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;.&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.latMinDec, DEC, 4);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;' &amp;quot;);&lt;br /&gt;
			if(gpsdata.status.ns)&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;N&amp;quot;);&lt;br /&gt;
			else&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;S&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nLON_DEG:    &amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.lonDeg, DEC, 3);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;° &amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.lonMin, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;.&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.lonMinDec, DEC, 4);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;' &amp;quot;);&lt;br /&gt;
			if(gpsdata.status.ew)&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;E&amp;quot;);&lt;br /&gt;
			else&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;W&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nSTATUS:     &amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.status.byte, BIN, 8);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nFIX_IND:    &amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.fixInd.byte, BIN, 8);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nHDOP:       &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(gpsdata.hdop, DEC);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;.&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.hdopDec, DEC, 2);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nSAT_N:      &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(gpsdata.satCount, DEC);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nCOURSE_T:   &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(gpsdata.course, DEC);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;.&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.courseDec, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;°&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nSPEED:      &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(gpsdata.speed, DEC);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;.&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.speedDec, DEC, 2);&lt;br /&gt;
			if(gpsdata.status.spu)&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;km/h&amp;quot;);&lt;br /&gt;
			else&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;kn&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nALT:        &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(gpsdata.altitude, DEC);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;m\nALT_DIF:    &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(gpsdata.altDif, DEC);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;m\nUTC:        &amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.utcHour, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;:&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.utcMinute, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;:&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.utcSec, DEC, 2);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nDATE:       &amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.day, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;.&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.month, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;.&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.year, DEC, 4);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nPDOP:       &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(gpsdata.pdop, DEC);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;.&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.pdopDec, DEC, 2);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nVDOP:       &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(gpsdata.vdop, DEC);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;.&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.vdopDec, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			for(i = 0; i &amp;lt; gpsdata.satCount; i++) {&lt;br /&gt;
				if(i == 8) writeString_P_WIFI(&amp;quot;\n&amp;quot;);&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;  SAT_&amp;quot;);&lt;br /&gt;
				writeIntegerLength_WIFI(i + 1, HEX, 1);&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;: &amp;quot;);&lt;br /&gt;
				writeInteger_WIFI(gpsdata.sat[i], DEC);&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nSW_VERSION: &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(gpsdata.swVersion, DEC);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nHEARTBEAT:  &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(gpsdata.heartbeat, DEC);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			// RP6 Sensor Board shutdown (button &amp;amp; status LED test):&lt;br /&gt;
			if (pressedButton) {&lt;br /&gt;
				setStatusLED(1);&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;\nPress button again for RP6 Sensor Board SHUTDOWN!\n&amp;quot;);&lt;br /&gt;
				mSleep(2000);&lt;br /&gt;
				do {&lt;br /&gt;
					if(getStopwatch2() &amp;gt; 200) { // 0.2s&lt;br /&gt;
						if (onoff) onoff = 0;&lt;br /&gt;
						else onoff = 1;&lt;br /&gt;
						if (onoff) setStatusLED(1);&lt;br /&gt;
						else setStatusLED(0);&lt;br /&gt;
						setStopwatch2(0);&lt;br /&gt;
					}&lt;br /&gt;
					mSleep(1);&lt;br /&gt;
					task_I2CTWI();&lt;br /&gt;
				} while (!readButton());&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;\n\n\n\n\nPlease wait for RP6 Sensor Board SHUTDOWN...\n&amp;quot;);&lt;br /&gt;
				sensor_board_shutdown();&lt;br /&gt;
				mSleep(3000);&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;\n\n\nThe RP6 Sensor Board now is in SHUTDOWN MODE!!!\n&amp;quot;);&lt;br /&gt;
				mSleep(1000);&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;\nRESET the M256 microcontroller now...\n\n&amp;quot;);&lt;br /&gt;
				while(true) {};&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			setStopwatch1(0);&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		task_RP6SensorBoard();					// RP6 Sensor Board task&lt;br /&gt;
&lt;br /&gt;
		task_I2CTWI();&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Erklärung&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Gyro Modul JM3-GYRO====&lt;br /&gt;
=====Dokumentation=====&lt;br /&gt;
Die Dokumentation zum Gyro Modul befindet sich auf der mitgelieferten ''&amp;quot;RP6 Robot System Xtra Modules CD-ROM&amp;quot;''.&lt;br /&gt;
&lt;br /&gt;
======Manuals======&lt;br /&gt;
Das Handbuch in der aktuellen Version kann [http://www.jm3-engineering.com/download/doc/ManualGyroModule_de.pdf hier] eingesehen werden.&lt;br /&gt;
&lt;br /&gt;
=====Demo-Programme=====&lt;br /&gt;
Ein Demo-Programm zum Gyro Modul befindet sich integriert in die RP6 Sensor Board Demo auf der mitgelieferten ''&amp;quot;RP6 Robot System Xtra Modules CD-ROM&amp;quot;''. Diese Demo kann auch in der aktuellen Version im Download Bereich von [http://www.jm3-engineering.com/downloads.htm JM3 Engineering] herunter geladen werden.&lt;br /&gt;
&lt;br /&gt;
=====Analoge Auswertung=====&lt;br /&gt;
Am Pin ''OUT'' des Gyro Moduls (siehe [http://www.rn-wissen.de/index.php/RP6_Sensor_Board_und_Xtra_Module#Anschluss-Schema_2 Anschluss-Schema]!) liegt die Ausgangsspannung des Sensors (0..5V) an. Sie kann mit einem ADC-Eingang eines Microcontrollers gemessen werden.&lt;br /&gt;
Syntax mit den Libraries der RP6Base, M32 oder M256 WiFi (ADC Kanal 0):&lt;br /&gt;
 uint16_t result = readADC(0);&lt;br /&gt;
In der C-Control-Pro Umgebung der M128 sieht das z.B. in CompactC so aus (ADC Kanal 0):&lt;br /&gt;
 word result;&lt;br /&gt;
 ADC_Set(ADC_VREF_VCC, 0);&lt;br /&gt;
 ...&lt;br /&gt;
 result = ADC_Read();&lt;br /&gt;
Das Ergebnis ''result'' kann noch zur Weiterverarbeitung angepasst werden:&lt;br /&gt;
 #define ADCVAL_ZERORATE_LEVEL			511		// Zero rate Level&lt;br /&gt;
 ...&lt;br /&gt;
 int16_t z_axisg = result - ADCVAL_ZERORATE_LEVEL;&lt;br /&gt;
Dadurch zeigt ''z_axisg'' Null an, wenn keine Rotation anliegt und wird positiv, wenn nach LINKS gedreht wird und negativ bei RECHTS-Drehung. Die Definition ADCVAL_ZERORATE_LEVEL muss natürlich an den eigenen Sensor-Nullwert angepasst werden.&lt;br /&gt;
&lt;br /&gt;
Aus dem Absolutwert von ''z_axisg'' kann man die Drehrate (Drehgeschwindigkeit) auch bestimmen:&lt;br /&gt;
&lt;br /&gt;
In den [[RP6_Sensor_Board_und_Xtra_Module#Technische_Daten_3|Technischen Daten]] ist die Empfindlichkeit des Sensors mit '''10mV/dps''' (0,01V pro Grad und Sekunde) angegeben. Damit errechnet sich die Drehrate als:&lt;br /&gt;
 Drehrate [dps] = abs(z_axisg) * (5 / 1024 / 0.01) = abs(z_axisg) * 0.48828125&lt;br /&gt;
&lt;br /&gt;
=====Optionale Ansteuerung=====&lt;br /&gt;
Im [[RP6_Sensor_Board_und_Xtra_Module#Anschluss-Schema_2|Anschluss-Schema]] ist erkennbar, dass es noch 2 Steuerleitungen ''SLEEP/PD'' und ''ST'' gibt. Mit diesen Anschlüssen kann die Betriebsart des Gyro Moduls festgelegt werden, siehe nachfolgende Tabelle:&lt;br /&gt;
{|  {{Blauetabelle}} &lt;br /&gt;
|Betriebsart&lt;br /&gt;
|ST&lt;br /&gt;
|SLEEP/PD&lt;br /&gt;
|Stromverbrauch&lt;br /&gt;
|-&lt;br /&gt;
|Normal&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|4,2mA&lt;br /&gt;
|-&lt;br /&gt;
|Sleep&lt;br /&gt;
|0&lt;br /&gt;
|1&lt;br /&gt;
|2,2mA&lt;br /&gt;
|-&lt;br /&gt;
|Self-test&lt;br /&gt;
|1&lt;br /&gt;
|0&lt;br /&gt;
|4,2mA&lt;br /&gt;
|-&lt;br /&gt;
|Power-down&lt;br /&gt;
|1&lt;br /&gt;
|1&lt;br /&gt;
|'''5µA'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
Will man zwischen den Betriebsarten per Software umschalten, muss man die beiden Steuerleitungen mit I/O Portpins des Microcontrollers verbinden, die als Ausgänge konfiguriert sind. Braucht man diese Funktion nicht, reicht es, ''ST'' und ''SLEEP/PD'' mit GND zu verbinden (Betriebsart &amp;quot;Normal&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====3D Accelerometer Modul JM3-3DA====&lt;br /&gt;
Das 3D Accelerometer Modul kann über den I2C- oder den SPI-Bus angesteuert werden. Wird das Modul auf der RP6 CONTROL M32 Platine betrieben (es sitzt also auf dem Sockel IC5 für das 2. SPI-EEPROM), dann erfolgt die Ansteuerung über den SPI-Bus. Die SPI-Grundfunktionen befinden sich in der RP6ControlLib, die daher eingebunden werden muss.&lt;br /&gt;
&lt;br /&gt;
=====Dokumentation=====&lt;br /&gt;
Die Dokumentation zum 3D Accelerometer Modul befindet sich auf der mitgelieferten ''&amp;quot;RP6 Robot System Xtra Modules CD-ROM&amp;quot;''.&lt;br /&gt;
&lt;br /&gt;
======Manuals======&lt;br /&gt;
Das Handbuch in der aktuellen Version kann [http://www.jm3-engineering.com/download/doc/Manual3DAccelerometer_de.pdf hier] eingesehen werden.&lt;br /&gt;
&lt;br /&gt;
=====Demo-Programme=====&lt;br /&gt;
Ein Demo-Programm zum 3D Accelerometer Modul befindet sich integriert in die RP6 Sensor Board Demo auf der mitgelieferten ''&amp;quot;RP6 Robot System Xtra Modules CD-ROM&amp;quot;''. Diese Demo kann auch in der aktuellen Version im Download Bereich von [http://www.jm3-engineering.com/downloads.htm JM3 Engineering] herunter geladen werden.&lt;br /&gt;
&lt;br /&gt;
=====RP6 CONTROL M32: ACCSENS Library=====&lt;br /&gt;
Die nachfolgende RP6ControlACCSENSLib (Eigenentwicklung in GCC) dient zur Ansteuerung des 3D Accelerometer Moduls durch die RP6 CONTROL M32.&lt;br /&gt;
&lt;br /&gt;
======Configuration Header======&lt;br /&gt;
Vor dem Kompilieren der Library muss eine Anpassung des Configuration Headers an die eigenen Hardware-Voraussetzungen erfolgen.&lt;br /&gt;
Dazu gibt es im Configuration Header eine Definition:&lt;br /&gt;
* EXP_STACK_1 -&amp;gt; Die RP6 CONTROL M32 sitzt auf dem vorderen Platinenstapel 1 des RP6&lt;br /&gt;
Im nachfolgenden Listing ist die Definition EXP_STACK_1 NICHT aktiv (d.h. die M32 sitzt auf dem hinteren Platinenstapel 2!). Dies muss an die eigene Hardware angepaßt werden. Wenn die RP6 CONTROL M32 auf dem vorderen Platinenstapel 1 des RP6 sitzt, muss die Zeile mit &amp;quot;EXP_STACK_1&amp;quot; &amp;quot;aktiviert&amp;quot; werden. Dazu entfernt man &amp;quot;//&amp;quot; am Zeilenanfang:&lt;br /&gt;
 #define EXP_STACK_1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Bevor man den Beschleunigungssensor nutzen kann, muss man ihn kalibrieren:&lt;br /&gt;
&lt;br /&gt;
'''Accelerometer:'''&lt;br /&gt;
* Die X-Achse wird kalibriert, indem man den RP6 mit der rechten Seite nach unten hält und den Maximalwert in MAX_X_A einträgt. Dann neigt man ihn auf seine linke Seite und trägt den negativen Maximalwert in MIN_X_A ein.&lt;br /&gt;
* Die Y-Achse wird kalibriert, indem man den RP6 mit der Vorderseite nach oben hält und den Maximalwert in MAX_Y_A einträgt. Dann kippt man die Vorderseite nach unten und trägt den negativen Maximalwert in MIN_Y_A ein.&lt;br /&gt;
* Die Z-Achse wird kalibriert, indem man den RP6 normal waagerecht hält und den Maximalwert in MAX_Z_A einträgt. Dann dreht man den RP6 &amp;quot;auf den Kopf&amp;quot; und trägt den negativen Maximalwert in MIN_Z_A ein.&lt;br /&gt;
* Sollten die angezeigten Pitch- und Roll-Werte nach der Kalibrierung der Achsen und genau waagerecht stehendem Sensor bzw. RP6 vom Nullwert deutlich abweichen, kann man sie mithilfe der Definitionen OFFSET_PITCH_A und OFFSET_ROLL_A &amp;quot;nullen&amp;quot;. Die Einheit dieser Definitionen ist °.&lt;br /&gt;
Nach dem Eintragen der Kalibrierungswerte muss das Programm neu kompiliert werden!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Datei: RP6ControlACCSENS.h&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;/* ****************************************************************************&lt;br /&gt;
 *                           _______________________&lt;br /&gt;
 *                           \| RP6  ROBOT SYSTEM |/&lt;br /&gt;
 *                            \_-_-_-_-_-_-_-_-_-_/             &amp;gt;&amp;gt;&amp;gt; RP6 CONTROL&lt;br /&gt;
 * ----------------------------------------------------------------------------&lt;br /&gt;
 * ----------------------------- [c]2014 - Dirk -------------------------------&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * File: RP6ControlACCSENS.h&lt;br /&gt;
 * Version: 1.0&lt;br /&gt;
 * Target: RP6 CONTROL - ATMEGA32 @16.00MHz&lt;br /&gt;
 * Author(s): Dirk&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Description:&lt;br /&gt;
 * Configuration header file for new ACCSENS library.&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * THE CHANGELOG CAN BE FOUND AT THE END OF THIS FILE!&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
#ifndef RP6CONTROLACCSENS_H&lt;br /&gt;
#define RP6CONTROLACCSENS_H&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Sensor position on the RP6 robot:&lt;br /&gt;
// (If EXP_STACK_1 is defined, the RP6 CONTROL M32 is located on the front&lt;br /&gt;
//  stack for addon boards on the RP6 robot. If EXP_STACK_1 is NOT defined&lt;br /&gt;
//  (default), the RP6 CONTROL M32 is mounted on the rear stack.)&lt;br /&gt;
// -------------------&lt;br /&gt;
//#define EXP_STACK_1&lt;br /&gt;
// -------------------&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// The following sensor is used:&lt;br /&gt;
// - 3D Accelerometer Modul (CONRAD 1082387-62) with LIS302DLH 3-axis&lt;br /&gt;
//   accelerometer&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// LIS302DLH accelerometer calibration data:&lt;br /&gt;
#define MAX_X_A						32767		// Max. X-axis value&lt;br /&gt;
#define MIN_X_A						-32768		// Min. X-axis value&lt;br /&gt;
#define MAX_Y_A						32767		// Max. Y-axis value&lt;br /&gt;
#define MIN_Y_A						-32768		// Min. Y-axis value&lt;br /&gt;
#define MAX_Z_A						32767		// Max. Z-axis value&lt;br /&gt;
#define MIN_Z_A						-32768		// Min. Z-axis value&lt;br /&gt;
#define OFFSET_PITCH_A				0.0			// Offset Pitch [°]&lt;br /&gt;
#define OFFSET_ROLL_A				0.0			// Offset Roll [°]&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
/******************************************************************************&lt;br /&gt;
 * Additional info&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Changelog:&lt;br /&gt;
 * &lt;br /&gt;
 *  ---&amp;gt; changes are documented in the file &amp;quot;RP6ControlACCSENSLib.c&amp;quot;&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
======Library Header======&lt;br /&gt;
Datei: RP6ControlACCSENSLib.h&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;/* ****************************************************************************&lt;br /&gt;
 *                           _______________________&lt;br /&gt;
 *                           \| RP6  ROBOT SYSTEM |/&lt;br /&gt;
 *                            \_-_-_-_-_-_-_-_-_-_/             &amp;gt;&amp;gt;&amp;gt; RP6 CONTROL&lt;br /&gt;
 * ----------------------------------------------------------------------------&lt;br /&gt;
 * ----------------------------- [c]2014 - Dirk -------------------------------&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * File: RP6ControlACCSENSLib.h&lt;br /&gt;
 * Version: 1.0&lt;br /&gt;
 * Target: RP6 CONTROL - ATMEGA32 @16.00MHz&lt;br /&gt;
 * Author(s): Dirk&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Description:&lt;br /&gt;
 * This is the RP6ControlACCSENSLib header file.&lt;br /&gt;
 * You have to include this file, if you want to use the library&lt;br /&gt;
 * RP6ControlACCSENSLib.c in your own projects.&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * THE CHANGELOG CAN BE FOUND AT THE END OF THIS FILE!&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
#ifndef RP6CONTROLACCSENSLIB_H&lt;br /&gt;
#define RP6CONTROLACCSENSLIB_H&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Includes:&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6ControlLib.h&amp;quot; 		// The RP6 Control Library (v. 1.1 or higher). &lt;br /&gt;
#include &amp;quot;RP6ControlACCSENS.h&amp;quot;&lt;br /&gt;
#include &amp;lt;math.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&lt;br /&gt;
#define ACC_CS							MEM_CS2&lt;br /&gt;
#define DEVICE_IDENTIFIER				0x32&lt;br /&gt;
&lt;br /&gt;
// Registers:&lt;br /&gt;
#define WHO_AM_I						0x0f&lt;br /&gt;
#define CTRL_REG1						0x20&lt;br /&gt;
#define CTRL_REG2						0x21&lt;br /&gt;
#define CTRL_REG3						0x22&lt;br /&gt;
#define CTRL_REG4						0x23&lt;br /&gt;
#define CTRL_REG5						0x24&lt;br /&gt;
#define HP_FILTER_RESET					0x25&lt;br /&gt;
#define REFERENCE						0x26&lt;br /&gt;
#define STATUS_REG						0x27&lt;br /&gt;
#define OUT_X_L							0x28&lt;br /&gt;
#define OUT_X_H							0x29&lt;br /&gt;
#define OUT_Y_L							0x2a&lt;br /&gt;
#define OUT_Y_H							0x2b&lt;br /&gt;
#define OUT_Z_L							0x2c&lt;br /&gt;
#define OUT_Z_H							0x2d&lt;br /&gt;
#define INT1_CFG						0x30&lt;br /&gt;
#define INT1_SOURCE						0x31&lt;br /&gt;
#define INT1_THS						0x32&lt;br /&gt;
#define INT1_DURATION					0x33&lt;br /&gt;
#define INT2_CFG						0x34&lt;br /&gt;
#define INT2_SOURCE						0x35&lt;br /&gt;
#define INT2_THS						0x36&lt;br /&gt;
#define INT2_DURATION					0x37&lt;br /&gt;
&lt;br /&gt;
// Control Register bitmasks:&lt;br /&gt;
#define CTRL_REG1_POWERDOWN				0b00000000&lt;br /&gt;
#define CTRL_REG1_3D_DEFAULT			0b00000111&lt;br /&gt;
#define CTRL_REG1_3D_LOPWR_10HZ			0b11000111&lt;br /&gt;
#define CTRL_REG2_DEFAULT				0b00000000&lt;br /&gt;
#define CTRL_REG3_DEFAULT				0b00000000&lt;br /&gt;
#define CTRL_REG4_DEFAULT				0b00000000&lt;br /&gt;
#define CTRL_REG4_BDU_2G				0b10000000&lt;br /&gt;
#define CTRL_REG4_BDU_2G_STSIGN			0b10001000&lt;br /&gt;
#define CTRL_REG4_BDU_BLE_2G			0b11000000&lt;br /&gt;
#define CTRL_REG4_BDU_BLE_2G_STSIGN		0b11001000&lt;br /&gt;
#define CTRL_REG5_DEFAULT				0b00000000&lt;br /&gt;
&lt;br /&gt;
// Read/write address bitmasks:&lt;br /&gt;
#define READ_MASK						0b10000000&lt;br /&gt;
#define READ_AUTOINC_MASK				0b11000000&lt;br /&gt;
#define WRITE_MASK						0b01111111&lt;br /&gt;
&lt;br /&gt;
extern int16_t x_axisa, y_axisa, z_axisa;&lt;br /&gt;
extern double pitch, roll;&lt;br /&gt;
extern double xa, ya, za;&lt;br /&gt;
extern double the, phi;&lt;br /&gt;
&lt;br /&gt;
uint8_t SPI_ACCSENS_readByte(uint8_t regAddr);&lt;br /&gt;
void SPI_ACCSENS_readBytes(uint8_t startAddr, uint8_t *buffer, uint8_t length);&lt;br /&gt;
void SPI_ACCSENS_writeByte(uint8_t regAddr, uint8_t data);&lt;br /&gt;
uint8_t SPI_ACCSENS_getStatus(void);&lt;br /&gt;
&lt;br /&gt;
void SPI_ACCSENS_init(void);&lt;br /&gt;
void SPI_ACCSENS_shutdown(void);&lt;br /&gt;
void SPI_ACCSENS_read(void);&lt;br /&gt;
void SPI_ACCSENS_normalize(void);&lt;br /&gt;
void SPI_ACCSENS_position(void);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
/******************************************************************************&lt;br /&gt;
 * Additional info&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Changelog:&lt;br /&gt;
 * &lt;br /&gt;
 *  ---&amp;gt; changes are documented in the file &amp;quot;RP6ControlACCSENSLib.c&amp;quot;&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
======Library Source======&lt;br /&gt;
Datei: RP6ControlACCSENSLib.c&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;/* ****************************************************************************&lt;br /&gt;
 *                           _______________________&lt;br /&gt;
 *                           \| RP6  ROBOT SYSTEM |/&lt;br /&gt;
 *                            \_-_-_-_-_-_-_-_-_-_/             &amp;gt;&amp;gt;&amp;gt; RP6 CONTROL&lt;br /&gt;
 * ----------------------------------------------------------------------------&lt;br /&gt;
 * ----------------------------- [c]2014 - Dirk -------------------------------&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * File: RP6ControlACCSENSLib.c&lt;br /&gt;
 * Version: 1.0&lt;br /&gt;
 * Target: RP6 CONTROL - ATMEGA32 @16.00MHz&lt;br /&gt;
 *         with optional LC-Display 16x2 chars (CONRAD 190911-62)&lt;br /&gt;
 *         and a 3D Accelerometer Modul (CONRAD 1082387-62) (IC5)&lt;br /&gt;
 * Author(s): Dirk&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Description:&lt;br /&gt;
 * This is my RP6 Control ACCSENS Library. This library may be used to access&lt;br /&gt;
 * the basic functions of the 3D Accelerometer Modul. This RP6 Xtra module may&lt;br /&gt;
 * be placed on the IC5 socket on the RP6 CONTROL M32 instead of a second&lt;br /&gt;
 * EEPROM.&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * THE CHANGELOG CAN BE FOUND AT THE END OF THIS FILE!&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
 &lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Includes:&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6ControlACCSENSLib.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// SPI functions:&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Reads a single register from the 3D Accelerometer&lt;br /&gt;
 * Modul (ACCSENS).&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
uint8_t SPI_ACCSENS_readByte(uint8_t regAddr)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t data;&lt;br /&gt;
	regAddr |= READ_MASK;						// Read byte&lt;br /&gt;
	PORTB &amp;amp;= ~ACC_CS;&lt;br /&gt;
	writeSPI(regAddr);&lt;br /&gt;
	data = readSPI();&lt;br /&gt;
	PORTB |= ACC_CS;&lt;br /&gt;
	return data;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Reads &amp;quot;length&amp;quot; bytes into the buffer &amp;quot;buffer&amp;quot;&lt;br /&gt;
 * from startAddr on. &lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void SPI_ACCSENS_readBytes(uint8_t startAddr, uint8_t *buffer, uint8_t length)&lt;br /&gt;
{&lt;br /&gt;
	startAddr |= READ_AUTOINC_MASK;				// Read byte, auto increment&lt;br /&gt;
	PORTB &amp;amp;= ~ACC_CS;&lt;br /&gt;
	writeSPI(startAddr);&lt;br /&gt;
	readBufferSPI(&amp;amp;buffer[0], length);&lt;br /&gt;
	PORTB |= ACC_CS;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Write a single data byte to the specified sensor&lt;br /&gt;
 * address.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void SPI_ACCSENS_writeByte(uint8_t regAddr, uint8_t data)&lt;br /&gt;
{&lt;br /&gt;
	PORTB &amp;amp;= ~ACC_CS;&lt;br /&gt;
	writeSPI(regAddr);&lt;br /&gt;
	writeSPI(data);&lt;br /&gt;
	PORTB |= ACC_CS;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Returns sensor status register - for checking if&lt;br /&gt;
 * sensor is busy. &lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
uint8_t SPI_ACCSENS_getStatus(void)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t status;&lt;br /&gt;
	PORTB &amp;amp;= ~ACC_CS;&lt;br /&gt;
	writeSPI(STATUS_REG);&lt;br /&gt;
	status = readSPI();&lt;br /&gt;
	PORTB |= ACC_CS;&lt;br /&gt;
	return status;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// 3D accelerometer functions:&lt;br /&gt;
&lt;br /&gt;
int16_t x_axisa, y_axisa, z_axisa;&lt;br /&gt;
double pitch, roll;&lt;br /&gt;
double xa, ya, za;&lt;br /&gt;
double the, phi;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Initializes the sensor. You must call this&lt;br /&gt;
 * function at the beginning of a program, that&lt;br /&gt;
 * uses the 3D Accelerometer Modul.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void SPI_ACCSENS_init(void)&lt;br /&gt;
{&lt;br /&gt;
	// All axes enable, low power, 10Hz output data rate:&lt;br /&gt;
	SPI_ACCSENS_writeByte(CTRL_REG1, CTRL_REG1_3D_LOPWR_10HZ);&lt;br /&gt;
	// No update while reading, +- 2g, self-test minus:&lt;br /&gt;
	SPI_ACCSENS_writeByte(CTRL_REG4, CTRL_REG4_BDU_2G_STSIGN);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Sets the LIS302DLH power-down mode. If you&lt;br /&gt;
 * do not need the sensor, you can save energy&lt;br /&gt;
 * by using the sensor power-down mode.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void SPI_ACCSENS_shutdown(void)&lt;br /&gt;
{&lt;br /&gt;
	// LIS302DLH in power-down mode:&lt;br /&gt;
	SPI_ACCSENS_writeByte(CTRL_REG1, CTRL_REG1_POWERDOWN);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function reads the X-axis, Y-axis and Z-axis&lt;br /&gt;
 * values from the LIS302DLH accelerometer and stores&lt;br /&gt;
 * them in the global variables x_axisa, y_axisa and&lt;br /&gt;
 * z_axisa.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void SPI_ACCSENS_read(void)&lt;br /&gt;
{&lt;br /&gt;
#ifndef EXP_STACK_1&lt;br /&gt;
	// Default sensor position (M32 located on the RP6 rear stack):&lt;br /&gt;
	// xb = -y:&lt;br /&gt;
	x_axisa = SPI_ACCSENS_readByte(OUT_Y_L) | (SPI_ACCSENS_readByte(OUT_Y_H) &amp;lt;&amp;lt; 8);&lt;br /&gt;
	x_axisa *= -1;&lt;br /&gt;
	// yb = -x:&lt;br /&gt;
	y_axisa = SPI_ACCSENS_readByte(OUT_X_L) | (SPI_ACCSENS_readByte(OUT_X_H) &amp;lt;&amp;lt; 8);&lt;br /&gt;
	y_axisa *= -1;&lt;br /&gt;
	// zb = z:&lt;br /&gt;
	z_axisa = SPI_ACCSENS_readByte(OUT_Z_L) | (SPI_ACCSENS_readByte(OUT_Z_H) &amp;lt;&amp;lt; 8);&lt;br /&gt;
#else&lt;br /&gt;
	// Other sensor position (M32 located on the RP6 front stack):&lt;br /&gt;
	// xb = y:&lt;br /&gt;
	x_axisa = SPI_ACCSENS_readByte(OUT_Y_L) | (SPI_ACCSENS_readByte(OUT_Y_H) &amp;lt;&amp;lt; 8);&lt;br /&gt;
	// yb = x:&lt;br /&gt;
	y_axisa = SPI_ACCSENS_readByte(OUT_X_L) | (SPI_ACCSENS_readByte(OUT_X_H) &amp;lt;&amp;lt; 8);&lt;br /&gt;
	// zb = z:&lt;br /&gt;
	z_axisa = SPI_ACCSENS_readByte(OUT_Z_L) | (SPI_ACCSENS_readByte(OUT_Z_H) &amp;lt;&amp;lt; 8);&lt;br /&gt;
#endif&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function limits and normalizes the x-axisa,&lt;br /&gt;
 * y-axisa and z-axisa values read from the LIS302DLH&lt;br /&gt;
 * accelerometer with the function SPI_ACCSENS_read() and&lt;br /&gt;
 * stores them in the global double variables xa, ya and&lt;br /&gt;
 * za.&lt;br /&gt;
 * It also calculates the position in space in form of the&lt;br /&gt;
 * tilt angles (the = pitch, phi = roll) and stores them&lt;br /&gt;
 * in the global double variables the and phi.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void SPI_ACCSENS_normalize(void)&lt;br /&gt;
{&lt;br /&gt;
	// Limit raw values:&lt;br /&gt;
	if (x_axisa &amp;lt; MIN_X_A) x_axisa = MIN_X_A;&lt;br /&gt;
	if (x_axisa &amp;gt; MAX_X_A) x_axisa = MAX_X_A;&lt;br /&gt;
	if (y_axisa &amp;lt; MIN_Y_A) y_axisa = MIN_Y_A;&lt;br /&gt;
	if (y_axisa &amp;gt; MAX_Y_A) y_axisa = MAX_Y_A;&lt;br /&gt;
	if (z_axisa &amp;lt; MIN_Z_A) z_axisa = MIN_Z_A;&lt;br /&gt;
	if (z_axisa &amp;gt; MAX_Z_A) z_axisa = MAX_Z_A;&lt;br /&gt;
	xa = (double) x_axisa / 10000.0;&lt;br /&gt;
	ya = (double) y_axisa / 10000.0;&lt;br /&gt;
	za = (double) z_axisa / 10000.0;&lt;br /&gt;
	// Calculate Pitch and Roll:&lt;br /&gt;
	phi = asin(xa);								// Calculate the and phi&lt;br /&gt;
	the = asin(ya / cos(the));					//  from the raw values&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function calculates the position in space by&lt;br /&gt;
 * using the the and phi values (see function&lt;br /&gt;
 * SPI_ACCSENS_normalize()!). It stores the position&lt;br /&gt;
 * in the global double variables pitch and roll. &lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void SPI_ACCSENS_position(void)&lt;br /&gt;
{&lt;br /&gt;
	pitch = the * 180 / M_PI + OFFSET_PITCH_A;&lt;br /&gt;
	roll = phi * 180 / M_PI + OFFSET_ROLL_A;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/******************************************************************************&lt;br /&gt;
 * Additional info&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Changelog:&lt;br /&gt;
 * - v. 1.0 (initial release) 04.04.2014 by Dirk&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Erklärung&lt;br /&gt;
&lt;br /&gt;
======Demo======&lt;br /&gt;
makefile:&lt;br /&gt;
&amp;lt;pre&amp;gt;...&lt;br /&gt;
TARGET = RP6Control_01_ACCSENS&lt;br /&gt;
...&lt;br /&gt;
SRC += $(RP6_LIB_PATH)/RP6control/RP6ControlLib.c&lt;br /&gt;
SRC += $(RP6_LIB_PATH)/RP6common/RP6uart.c&lt;br /&gt;
SRC += $(RP6_LIB_PATH)/RP6control/RP6ControlACCSENSLib.c&lt;br /&gt;
...&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Datei: RP6Control_01_ACCSENS.c&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;// Uncommented Version of RP6Control_01_ACCSENS.c&lt;br /&gt;
// written by Dirk&lt;br /&gt;
// ------------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6ControlACCSENSLib.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void writeDouble(double number, uint8_t width, uint8_t prec)&lt;br /&gt;
{char buffer[width + 1];&lt;br /&gt;
	dtostrf(number, width, prec, &amp;amp;buffer[0]);&lt;br /&gt;
	writeString(&amp;amp;buffer[0]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void writeDoubleLCD(double number, uint8_t width, uint8_t prec)&lt;br /&gt;
{char buffer[width + 1];&lt;br /&gt;
	dtostrf(number, width, prec, &amp;amp;buffer[0]);&lt;br /&gt;
	writeStringLCD(&amp;amp;buffer[0]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
	initRP6Control();&lt;br /&gt;
&lt;br /&gt;
	writeString_P(&amp;quot;\n\nRP6Control SPI ACCSENS Test Program!\n&amp;quot;); &lt;br /&gt;
	setLEDs(0b1111);&lt;br /&gt;
	mSleep(50);&lt;br /&gt;
	initLCD(); &lt;br /&gt;
	showScreenLCD(&amp;quot;################&amp;quot;, &amp;quot;################&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
	showScreenLCD(&amp;quot;  SPI ACCSENS&amp;quot;, &amp;quot;  Test Program&amp;quot;);&lt;br /&gt;
	mSleep(1000);&lt;br /&gt;
	setLEDs(0b0000);&lt;br /&gt;
&lt;br /&gt;
	SPI_ACCSENS_init();&lt;br /&gt;
&lt;br /&gt;
	uint8_t whoami = SPI_ACCSENS_readByte(WHO_AM_I);&lt;br /&gt;
	writeString_P(&amp;quot;\nWHO AM I: &amp;quot;);&lt;br /&gt;
	writeInteger(whoami, HEX);&lt;br /&gt;
	writeChar('\n');&lt;br /&gt;
	mSleep(2000);&lt;br /&gt;
	&lt;br /&gt;
	startStopwatch1();&lt;br /&gt;
&lt;br /&gt;
	while(true) &lt;br /&gt;
	{&lt;br /&gt;
		if(getStopwatch1() &amp;gt; 1000)&lt;br /&gt;
		{&lt;br /&gt;
			SPI_ACCSENS_read();&lt;br /&gt;
			writeString_P(&amp;quot;\n3D Accelerometer SENSOR -&amp;gt;\n&amp;quot;);&lt;br /&gt;
			writeString_P(&amp;quot;X-axis: &amp;quot;);&lt;br /&gt;
			writeInteger(x_axisa, DEC);&lt;br /&gt;
			writeChar('\n');&lt;br /&gt;
			writeString_P(&amp;quot;Y-axis: &amp;quot;);&lt;br /&gt;
			writeInteger(y_axisa, DEC);&lt;br /&gt;
			writeChar('\n');&lt;br /&gt;
			writeString_P(&amp;quot;Z-axis: &amp;quot;);&lt;br /&gt;
			writeInteger(z_axisa, DEC);&lt;br /&gt;
			writeChar('\n');&lt;br /&gt;
			SPI_ACCSENS_normalize();&lt;br /&gt;
			SPI_ACCSENS_position();&lt;br /&gt;
			writeString_P(&amp;quot;POSITION: \n&amp;quot;);&lt;br /&gt;
			writeString_P(&amp;quot;  Pitch [°]: &amp;quot;);&lt;br /&gt;
			writeDouble(pitch, 6, 1);&lt;br /&gt;
			writeChar('\n');&lt;br /&gt;
			writeString_P(&amp;quot;  Roll [°]:  &amp;quot;);&lt;br /&gt;
			writeDouble(roll, 6, 1);&lt;br /&gt;
			writeChar('\n');&lt;br /&gt;
			setCursorPosLCD(0, 0);&lt;br /&gt;
			writeStringLCD_P(&amp;quot;P&amp;quot;);&lt;br /&gt;
			writeDoubleLCD(pitch, 6, 1);&lt;br /&gt;
			writeStringLCD_P(&amp;quot; &amp;quot;);&lt;br /&gt;
			setCursorPosLCD(0, 8);&lt;br /&gt;
			writeStringLCD_P(&amp;quot;R&amp;quot;);&lt;br /&gt;
			writeDoubleLCD(roll, 6, 1);&lt;br /&gt;
			writeStringLCD_P(&amp;quot; &amp;quot;);&lt;br /&gt;
			setCursorPosLCD(1, 0);&lt;br /&gt;
			writeStringLCD_P(&amp;quot;X&amp;quot;);&lt;br /&gt;
			writeIntegerLCD(x_axisa, DEC);&lt;br /&gt;
			writeStringLCD_P(&amp;quot;   &amp;quot;);&lt;br /&gt;
			setCursorPosLCD(1, 5);&lt;br /&gt;
			writeStringLCD_P(&amp;quot;Y&amp;quot;);&lt;br /&gt;
			writeIntegerLCD(y_axisa, DEC);&lt;br /&gt;
			writeStringLCD_P(&amp;quot;   &amp;quot;);&lt;br /&gt;
			setCursorPosLCD(1, 10);&lt;br /&gt;
			writeStringLCD_P(&amp;quot;Z&amp;quot;);&lt;br /&gt;
			writeIntegerLCD(z_axisa, DEC);&lt;br /&gt;
			writeStringLCD_P(&amp;quot;    &amp;quot;);&lt;br /&gt;
			mSleep(2000);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Erklärung&lt;br /&gt;
&lt;br /&gt;
====BHT Modul JM3-BHT31====&lt;br /&gt;
Dieses Modul zur Messung von Luftdruck, Luftfeuchte und Temperatur ist seit dem 22.01.2015 lieferbar.&lt;br /&gt;
&lt;br /&gt;
=====Dokumentation=====&lt;br /&gt;
Die Dokumentation zum BHT Modul befindet sich auf der mitgelieferten ''&amp;quot;ASURO xTend-On CD-ROM&amp;quot;''.&lt;br /&gt;
&lt;br /&gt;
======Manuals======&lt;br /&gt;
Das Handbuch in der aktuellen Version kann [http://www.jm3-engineering.com/download/doc/ManualAsuroBHT_de.pdf hier] eingesehen werden.&lt;br /&gt;
&lt;br /&gt;
=====Demo-Programme=====&lt;br /&gt;
Ein Demo-Programm zum BHT Modul befindet sich integriert in die RP6 Sensor Board Demo auf der ''&amp;quot;RP6 Robot System Xtra Modules CD-ROM&amp;quot;''. Diese Demo kann auch in der aktuellen Version im Download Bereich von [http://www.jm3-engineering.com/downloads.htm JM3 Engineering] herunter geladen werden.&lt;br /&gt;
&lt;br /&gt;
=====RP6M256 WiFi: I2C_BHT Library=====&lt;br /&gt;
Die nachfolgende RP6M256_I2C_BHTLib (Eigenentwicklung in GCC) dient zur Ansteuerung des I2C BHT Moduls durch die RP6M256 WiFi.&lt;br /&gt;
&lt;br /&gt;
======Library Header======&lt;br /&gt;
Datei: RP6M256_I2C_BHTLib.h&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;/* ****************************************************************************&lt;br /&gt;
 *                           _______________________&lt;br /&gt;
 *                           \| RP6  ROBOT SYSTEM |/&lt;br /&gt;
 *                            \_-_-_-_-_-_-_-_-_-_/           &amp;gt;&amp;gt;&amp;gt; RP6 M256 WIFI&lt;br /&gt;
 * ----------------------------------------------------------------------------&lt;br /&gt;
 * ----------------------------- [c]2015 - Dirk -------------------------------&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * File: RP6M256_I2C_BHTLib.h&lt;br /&gt;
 * Version: 0.9&lt;br /&gt;
 * Target: RP6 M256 WIFI - ATMEGA2560 @16.00MHz&lt;br /&gt;
 * Author(s): Dirk&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Description:&lt;br /&gt;
 * Header file for new RP6 BHT Module library.&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
#ifndef RP6M256_I2C_BHTLIB_H&lt;br /&gt;
#define RP6M256_I2C_BHTLIB_H&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// RP6 BHT Module components:&lt;br /&gt;
// - I2C Barometric Pressure Sensor (MS5607-02BA)&lt;br /&gt;
// - I2C Relative Humidity Sensor (HTU21D)&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// RP6 Sensor Board:&lt;br /&gt;
&lt;br /&gt;
// If you want to use the RP6 BHT Module on the RP6 Sensor Board, you&lt;br /&gt;
// have to define SENSOR_BOARD (default)!&lt;br /&gt;
// If SENSOR_BOARD is NOT defined, this library assumes that the RP6 BHT&lt;br /&gt;
// Module is used stand-alone.&lt;br /&gt;
// ------------------&lt;br /&gt;
#define SENSOR_BOARD&lt;br /&gt;
// ------------------&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Includes:&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6M256Lib.h&amp;quot;&lt;br /&gt;
#include &amp;quot;RP6I2CmasterTWI.h&amp;quot;&lt;br /&gt;
#ifdef SENSOR_BOARD&lt;br /&gt;
	#include &amp;quot;RP6M256_Sensor_BoardLib.h&amp;quot;&lt;br /&gt;
#endif&lt;br /&gt;
#include &amp;lt;math.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Barometric Pressure Sensor (MS5607-02BA):&lt;br /&gt;
#define I2C_BHT_B_ADR					0xee	// Default&lt;br /&gt;
&lt;br /&gt;
// Weather station's data:&lt;br /&gt;
#define ALTITUDE			156			// Weather station's altitude [m]&lt;br /&gt;
//#define ALTITUDE			110			// 2nd altitude: Location 2 [m]&lt;br /&gt;
&lt;br /&gt;
// Temperature default data:&lt;br /&gt;
#define TEMP_ZERO			273.15		// 273.15 K = 0 °C&lt;br /&gt;
#define TA_DEFAULT			15.0		// Outside temp. default [°C]&lt;br /&gt;
#define TI_DEFAULT			21.0		// Inside temp. default [°C]&lt;br /&gt;
&lt;br /&gt;
// Commands:&lt;br /&gt;
#define MS5607_CMD_RESET				0x1e	// ADC reset command&lt;br /&gt;
#define MS5607_CMD_ADC_READ				0x00	// ADC read command&lt;br /&gt;
#define MS5607_CMD_ADC_CONV				0x40	// ADC conversion command&lt;br /&gt;
#define MS5607_CMD_ADC_D1				0x00	// ADC D1 conversion&lt;br /&gt;
#define MS5607_CMD_ADC_D2				0x10	// ADC D2 conversion&lt;br /&gt;
#define MS5607_CMD_ADC_256				0x00	// ADC OSR=256&lt;br /&gt;
#define MS5607_CMD_ADC_512				0x02	// ADC OSR=512&lt;br /&gt;
#define MS5607_CMD_ADC_1024				0x04	// ADC OSR=1024&lt;br /&gt;
#define MS5607_CMD_ADC_2048				0x06	// ADC OSR=2048&lt;br /&gt;
#define MS5607_CMD_ADC_4096				0x08	// ADC OSR=4096&lt;br /&gt;
#define MS5607_CMD_PROM_RD				0xa0	// Prom read command&lt;br /&gt;
&lt;br /&gt;
extern uint32_t D1;		// ADC value of the pressure conversion&lt;br /&gt;
extern uint32_t D2;		// ADC value of the temperature conversion&lt;br /&gt;
extern uint16_t C[8];	// calibration coefficients&lt;br /&gt;
extern double P;		// compensated pressure value&lt;br /&gt;
extern double P0;		// compensated pressure value at sea level (0 m)&lt;br /&gt;
extern double T;		// compensated temperature value&lt;br /&gt;
extern double dT;		// difference between actual and measured temperature&lt;br /&gt;
extern double OFF;		// offset at actual temperature&lt;br /&gt;
extern double SENS;		// sensitivity at actual temperature&lt;br /&gt;
extern uint8_t n_crc;	// crc value of the prom&lt;br /&gt;
&lt;br /&gt;
void I2C_BHT_B_reset(void);&lt;br /&gt;
uint32_t I2C_BHT_B_cmd_adc(uint8_t cmd);&lt;br /&gt;
uint16_t I2C_BHT_B_cmd_prom(uint8_t coef_num);&lt;br /&gt;
uint8_t I2C_BHT_B_crc4(uint16_t n_prom[]);&lt;br /&gt;
void I2C_BHT_B_read(void);&lt;br /&gt;
void I2C_BHT_B_init(void);&lt;br /&gt;
double reduceAirPressure(double pa, double ta);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Relative Humidity Sensor (HTU21D):&lt;br /&gt;
#define I2C_BHT_HT_ADR					0x80	// Default&lt;br /&gt;
&lt;br /&gt;
// Commands:&lt;br /&gt;
#define HTU21D_TRIG_T_MEASUREMENT_HM    0xe3	// Trig. temp meas. hold master&lt;br /&gt;
#define HTU21D_TRIG_RH_MEASUREMENT_HM   0xe5	// Trig. humidity meas. hold master&lt;br /&gt;
#define HTU21D_TRIG_T_MEASUREMENT_POLL  0xf3	// Trig. temp meas. no hold master&lt;br /&gt;
#define HTU21D_TRIG_RH_MEASUREMENT_POLL 0xf5	// Trig. humidity meas. no hold master&lt;br /&gt;
#define HTU21D_USER_REG_W               0xe6	// Writing user register&lt;br /&gt;
#define HTU21D_USER_REG_R               0xe7	// Reading user register&lt;br /&gt;
#define HTU21D_SOFT_RESET               0xfe	// Soft reset&lt;br /&gt;
&lt;br /&gt;
// Resolutions:&lt;br /&gt;
#define HTU21D_RES_12_14BIT             0x00	// RH=12bit, T=14bit&lt;br /&gt;
#define HTU21D_RES_8_12BIT              0x01	// RH= 8bit, T=12bit&lt;br /&gt;
#define HTU21D_RES_10_13BIT             0x80	// RH=10bit, T=13bit&lt;br /&gt;
#define HTU21D_RES_11_11BIT             0x81	// RH=11bit, T=11bit&lt;br /&gt;
&lt;br /&gt;
// User register bitmasks:&lt;br /&gt;
#define HTU21D_RES_MASK                 0x81	// Mask for res. bits (7, 0)&lt;br /&gt;
#define HTU21D_EOB_ON                   0x40	// End of battery&lt;br /&gt;
#define HTU21D_EOB_MASK                 0x40	// Mask for EOB bit(6)&lt;br /&gt;
#define HTU21D_HEATER_ON                0x04	// Heater on&lt;br /&gt;
#define HTU21D_HEATER_OFF               0x00	// Heater off&lt;br /&gt;
#define HTU21D_HEATER_MASK              0x04	// Mask for Heater bit (2)&lt;br /&gt;
&lt;br /&gt;
extern uint16_t rawHumidity;	// raw humidity value&lt;br /&gt;
extern uint16_t rawTemperature;	// raw temperature value&lt;br /&gt;
extern double H;				// relative humidity value [%]&lt;br /&gt;
extern double HT;				// temperature value [°C]&lt;br /&gt;
extern uint8_t resolution;		// sensor resolution [0..3]&lt;br /&gt;
extern uint8_t ht_crc;			// message crc value&lt;br /&gt;
&lt;br /&gt;
void I2C_BHT_HT_reset(void);&lt;br /&gt;
uint8_t I2C_BHT_HT_crc8(uint16_t message, uint8_t checksum);&lt;br /&gt;
double I2C_BHT_HT_readHumidity(void);&lt;br /&gt;
double I2C_BHT_HT_readTemperature(void);&lt;br /&gt;
void I2C_BHT_HT_setResolution(uint8_t resBits);&lt;br /&gt;
void I2C_BHT_HT_init(void);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// RP6 BHT Module initialisation:&lt;br /&gt;
&lt;br /&gt;
void I2C_BHT_init(void);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
/******************************************************************************&lt;br /&gt;
 * Additional info&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Changelog:&lt;br /&gt;
 * &lt;br /&gt;
 *  ---&amp;gt; changes are documented in the file &amp;quot;RP6M256_I2C_BHTLib.c&amp;quot;&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
======Library Source======&lt;br /&gt;
Datei: RP6M256_I2C_BHTLib.c&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;/* ****************************************************************************&lt;br /&gt;
 *                           _______________________&lt;br /&gt;
 *                           \| RP6  ROBOT SYSTEM |/&lt;br /&gt;
 *                            \_-_-_-_-_-_-_-_-_-_/           &amp;gt;&amp;gt;&amp;gt; RP6 M256 WIFI&lt;br /&gt;
 * ----------------------------------------------------------------------------&lt;br /&gt;
 * ----------------------------- [c]2015 - Dirk -------------------------------&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * File: RP6M256_I2C_BHTLib.c&lt;br /&gt;
 * Version: 0.9&lt;br /&gt;
 * Target: RP6 M256 WIFI - ATMEGA2560 @16.00MHz&lt;br /&gt;
 *         and a RP6 BHT Module (CONRAD 1302995)&lt;br /&gt;
 *         optionally on a RP6 Sensor Board (CONRAD 1082384)&lt;br /&gt;
 * Author(s): Dirk&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Description:&lt;br /&gt;
 * &lt;br /&gt;
 * This is our new Library that contains basic routines and functions for&lt;br /&gt;
 * accessing the RP6 BHT Module JM3-BHT31 (CONRAD 1302995).&lt;br /&gt;
 * If the RP6 BHT Module is located on the RP6 Sensor Board (CONRAD 1082384)&lt;br /&gt;
 * and connected to the I2C-MODULE plug M1, the RP6M256_Sensor_BoardLib has to&lt;br /&gt;
 * be included!&lt;br /&gt;
 * &lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// RP6 BHT Module components:&lt;br /&gt;
// - I2C Barometric Pressure Sensor (MS5607-02BA)&lt;br /&gt;
// - I2C Relative Humidity Sensor (HTU21D)&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Includes:&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6M256_I2C_BHTLib.h&amp;quot; 		&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Variables:&lt;br /&gt;
&lt;br /&gt;
uint8_t bhtdataBuf[4]; &lt;br /&gt;
uint8_t i;&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Barometric Pressure Sensor (MS5607-02BA):&lt;br /&gt;
// (Following the C-code example published 2011 by MEAS in AN520!)&lt;br /&gt;
&lt;br /&gt;
uint32_t D1;			// ADC value of the pressure conversion&lt;br /&gt;
uint32_t D2;			// ADC value of the temperature conversion&lt;br /&gt;
uint16_t C[8];			// calibration coefficients&lt;br /&gt;
double P;				// compensated pressure value&lt;br /&gt;
double P0;				// compensated pressure value at sea level (0 m)&lt;br /&gt;
double T;				// compensated temperature value&lt;br /&gt;
double dT;				// difference between actual and measured temperature&lt;br /&gt;
double OFF;				// offset at actual temperature&lt;br /&gt;
double SENS;			// sensitivity at actual temperature&lt;br /&gt;
uint8_t n_crc;			// crc value of the prom&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Reset sequence for the Pressure Sensor.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void I2C_BHT_B_reset(void)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmitByte(I2C_BHT_B_ADR, MS5607_CMD_RESET);&lt;br /&gt;
	mSleep(3);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Reads and returns pressure or temperature ADC&lt;br /&gt;
 * values measured with the chosen resolution.&lt;br /&gt;
 * This function is BLOCKING during the conversion&lt;br /&gt;
 * time (up to 10 ms).&lt;br /&gt;
 *&lt;br /&gt;
 * Input: cmd -&amp;gt; MS5607_CMD_ADC_D1   = Read pressure ADC value&lt;br /&gt;
 *               MS5607_CMD_ADC_D2   = Read temperature ADC value&lt;br /&gt;
 *               ... plus ...&lt;br /&gt;
 *               MS5607_CMD_ADC_256  = Resolution 0.130 hPa / 0.012 °C&lt;br /&gt;
 *               MS5607_CMD_ADC_512  = Resolution 0.084 hPa / 0.008 °C&lt;br /&gt;
 *               MS5607_CMD_ADC_1024 = Resolution 0.054 hPa / 0.005 °C&lt;br /&gt;
 *               MS5607_CMD_ADC_2048 = Resolution 0.036 hPa / 0.003 °C&lt;br /&gt;
 *               MS5607_CMD_ADC_4096 = Resolution 0.024 hPa / 0.002 °C&lt;br /&gt;
 *&lt;br /&gt;
 * Examples:&lt;br /&gt;
 *   D1 = I2C_BHT_B_cmd_adc(MS5607_CMD_ADC_D1 + MS5607_CMD_ADC_4096);&lt;br /&gt;
 *   // This returns the pressure ADC value (D1) with a 0.024 hPa&lt;br /&gt;
 *   // resolution!&lt;br /&gt;
 *   D2 = I2C_BHT_B_cmd_adc(MS5607_CMD_ADC_D2 + MS5607_CMD_ADC_4096);&lt;br /&gt;
 *   // This returns the temperature ADC value (D2) with a 0.002 °C&lt;br /&gt;
 *   // resolution!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
uint32_t I2C_BHT_B_cmd_adc(uint8_t cmd)&lt;br /&gt;
{&lt;br /&gt;
	uint32_t temp = 0;&lt;br /&gt;
&lt;br /&gt;
	I2CTWI_transmitByte(I2C_BHT_B_ADR, (MS5607_CMD_ADC_CONV + cmd));&lt;br /&gt;
	switch (cmd &amp;amp; 0x0f) {&lt;br /&gt;
		case MS5607_CMD_ADC_256  : mSleep(1); break;&lt;br /&gt;
		case MS5607_CMD_ADC_512  : mSleep(2); break;&lt;br /&gt;
		case MS5607_CMD_ADC_1024 : mSleep(3); break;&lt;br /&gt;
		case MS5607_CMD_ADC_2048 : mSleep(5); break;&lt;br /&gt;
		case MS5607_CMD_ADC_4096 : mSleep(10);&lt;br /&gt;
	}&lt;br /&gt;
	I2CTWI_transmitByte(I2C_BHT_B_ADR, MS5607_CMD_ADC_READ);&lt;br /&gt;
	I2CTWI_readBytes(I2C_BHT_B_ADR, bhtdataBuf, 3);&lt;br /&gt;
	temp = bhtdataBuf[0];						// MSB&lt;br /&gt;
	temp &amp;lt;&amp;lt;= 8;&lt;br /&gt;
	temp |= bhtdataBuf[1];&lt;br /&gt;
	temp &amp;lt;&amp;lt;= 8;&lt;br /&gt;
	temp |= bhtdataBuf[2];						// LSB&lt;br /&gt;
	return temp;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Reads and returns the calibration coefficient&lt;br /&gt;
 * (16 bit) with the number coef_num from the&lt;br /&gt;
 * Pressure Sensor's PROM.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: coef_num -&amp;gt; Calibration coefficient&lt;br /&gt;
 *                    number [0..7]&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
uint16_t I2C_BHT_B_cmd_prom(uint8_t coef_num)&lt;br /&gt;
{&lt;br /&gt;
	uint16_t rC = 0;&lt;br /&gt;
&lt;br /&gt;
	I2CTWI_transmitByte(I2C_BHT_B_ADR, (MS5607_CMD_PROM_RD + coef_num * 2));&lt;br /&gt;
	I2CTWI_readBytes(I2C_BHT_B_ADR, bhtdataBuf, 2);&lt;br /&gt;
	rC = bhtdataBuf[0];							// MSB&lt;br /&gt;
	rC &amp;lt;&amp;lt;= 8;&lt;br /&gt;
	rC |= bhtdataBuf[1];						// LSB&lt;br /&gt;
	return rC;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Calculates and returns the Pressure Sensor's&lt;br /&gt;
 * PROM CRC-4 value (8 bit).&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
uint8_t I2C_BHT_B_crc4(uint16_t n_prom[])&lt;br /&gt;
{&lt;br /&gt;
	uint16_t n_rem;&lt;br /&gt;
	uint16_t crc_read;&lt;br /&gt;
	uint8_t n_bit;&lt;br /&gt;
&lt;br /&gt;
	n_rem = 0x00;&lt;br /&gt;
	crc_read = n_prom[7];&lt;br /&gt;
	n_prom[7] = (0xff00 &amp;amp; (n_prom[7]));&lt;br /&gt;
	for (i = 0; i &amp;lt; 16; i++)&lt;br /&gt;
	{&lt;br /&gt;
		if (i % 2 == 1) n_rem ^= (uint8_t) ((n_prom[i &amp;gt;&amp;gt; 1]) &amp;amp; 0x00ff);&lt;br /&gt;
		else n_rem ^= (uint8_t) (n_prom[i &amp;gt;&amp;gt; 1] &amp;gt;&amp;gt; 8);&lt;br /&gt;
		for (n_bit = 8; n_bit &amp;gt; 0; n_bit--)&lt;br /&gt;
		{&lt;br /&gt;
			if (n_rem &amp;amp; 0x8000) n_rem = (n_rem &amp;lt;&amp;lt; 1) ^ 0x3000;&lt;br /&gt;
			else n_rem = n_rem &amp;lt;&amp;lt; 1;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	n_rem = (0x000f &amp;amp; (n_rem &amp;gt;&amp;gt; 12));&lt;br /&gt;
	n_prom[7] = crc_read;&lt;br /&gt;
	return (n_rem ^ 0x0);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Reads and calculates the pressure and&lt;br /&gt;
 * temperature values with the MS5607 1st order&lt;br /&gt;
 * algorithm.&lt;br /&gt;
 * The 2 values are stored in the global floating&lt;br /&gt;
 * point variables P and T:&lt;br /&gt;
 *   P -&amp;gt; Pressure value [hPa]&lt;br /&gt;
 *   T -&amp;gt; Temperature value [°C]&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void I2C_BHT_B_read(void)&lt;br /&gt;
{&lt;br /&gt;
	D2 = I2C_BHT_B_cmd_adc(MS5607_CMD_ADC_D2 + MS5607_CMD_ADC_4096); // Read D2&lt;br /&gt;
	D1 = I2C_BHT_B_cmd_adc(MS5607_CMD_ADC_D1 + MS5607_CMD_ADC_4096); // Read D1&lt;br /&gt;
&lt;br /&gt;
	// Calculate 1st order pressure and temperature (MS5607 1st order algorithm)&lt;br /&gt;
	dT = D2 - C[5] * pow(2, 8);&lt;br /&gt;
	OFF = C[2] * pow(2, 17) + dT * C[4] / pow(2, 6);&lt;br /&gt;
	SENS = C[1] * pow(2, 16) + dT * C[3] / pow(2, 7);&lt;br /&gt;
&lt;br /&gt;
	T = (2000 + (dT * C[6]) / pow(2, 23)) / 100;&lt;br /&gt;
	P = (((D1 * SENS) / pow(2, 21) - OFF) / pow(2, 15)) / 100;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * You MUST call this function at the beginning of a&lt;br /&gt;
 * main program, that uses the Pressure Sensor. &lt;br /&gt;
 * If SENSOR_BOARD is defined, the I2C-MODULE power&lt;br /&gt;
 * will be switched on with the function&lt;br /&gt;
 * setI2CModulePower() defined in the&lt;br /&gt;
 * RP6M256_Sensor_BoardLib, which will be included&lt;br /&gt;
 * then.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void I2C_BHT_B_init(void)&lt;br /&gt;
{&lt;br /&gt;
#ifdef SENSOR_BOARD&lt;br /&gt;
	// I2C-MODULE (plug M1) power on: &lt;br /&gt;
	setI2CModulePower(1);&lt;br /&gt;
#endif&lt;br /&gt;
	D1 = 0;										// Clear pressure ADC value&lt;br /&gt;
	D2 = 0;										// Clear temperature ADC value&lt;br /&gt;
	I2C_BHT_B_reset();							// Reset the Pressure Sensor&lt;br /&gt;
	for (i = 0; i &amp;lt; 8; i++) {C[i] = I2C_BHT_B_cmd_prom(i);} // Read PROM&lt;br /&gt;
	n_crc = I2C_BHT_B_crc4(C);					// Calculate PROM CRC&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Calculates and returns the relative air pressure&lt;br /&gt;
 * [hPa] at sea level (0 m).&lt;br /&gt;
 *&lt;br /&gt;
 * Input:  pa        -&amp;gt; Absolute air pressure [hPa] at ALTITUDE&lt;br /&gt;
 *         ta        -&amp;gt; OUTSIDE temperature [°C] at ALTITUDE&lt;br /&gt;
 *         ALTITUDE  -&amp;gt; Weather station's altitude [m]&lt;br /&gt;
 *         TEMP_ZERO -&amp;gt; 273.15 K&lt;br /&gt;
 * Output: p0        -&amp;gt; Relative air pressure [hPa] at sea level (0 m)&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
double reduceAirPressure(double pa, double ta)&lt;br /&gt;
{double p0;&lt;br /&gt;
	p0 = pa * (pow ((TEMP_ZERO + ta) / (TEMP_ZERO + ta + 0.0065 * ALTITUDE), -5.255));&lt;br /&gt;
	return p0;									// P0 [hPa]&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Relative Humidity Sensor (HTU21D):&lt;br /&gt;
// (Following a library published 2011 by MEAS France!)&lt;br /&gt;
&lt;br /&gt;
uint16_t rawHumidity;		// raw humidity value&lt;br /&gt;
uint16_t rawTemperature;	// raw temperature value&lt;br /&gt;
double H;					// relative humidity value [%]&lt;br /&gt;
double HT;					// temperature value [°C]&lt;br /&gt;
uint8_t resolution;			// sensor resolution [0..3]&lt;br /&gt;
uint8_t ht_crc;				// message crc value&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Soft reset for the Humidity Sensor.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void I2C_BHT_HT_reset(void)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmitByte(I2C_BHT_HT_ADR, HTU21D_SOFT_RESET);&lt;br /&gt;
	mSleep(15);&lt;br /&gt;
	resolution = 0;								// Default: RH 12, T 14 bit&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Reads the Humidity Sensor's user register.&lt;br /&gt;
 *&lt;br /&gt;
 * Hint: The user register bits are described on&lt;br /&gt;
 *       page 13 of the HTU21D datasheet!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
uint8_t read_user_register(void)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t userRegister;&lt;br /&gt;
  &lt;br /&gt;
	I2CTWI_transmitByte(I2C_BHT_HT_ADR, HTU21D_USER_REG_R);&lt;br /&gt;
	userRegister = I2CTWI_readByte(I2C_BHT_HT_ADR);&lt;br /&gt;
	return userRegister;  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Sets the Humidity Sensor's resolution to one&lt;br /&gt;
 * of four steps. The step number [0..3] is stored&lt;br /&gt;
 * in the global variable resolution:&lt;br /&gt;
 *   Step  RH   T&lt;br /&gt;
 *    0:   12  14 bit&lt;br /&gt;
 *    1:    8  12 bit&lt;br /&gt;
 *    2:   10  13 bit&lt;br /&gt;
 *    3:   11  11 bit&lt;br /&gt;
 *                                      RH   T&lt;br /&gt;
 * Input:  resBits -&amp;gt; 0b00000000   (0): 12  14 bit&lt;br /&gt;
 *                 -&amp;gt; 0b00000001   (1):  8  12 bit&lt;br /&gt;
 *                 -&amp;gt; 0b10000000 (128): 10  13 bit&lt;br /&gt;
 *                 -&amp;gt; 0b10000001 (129): 11  11 bit&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void I2C_BHT_HT_setResolution(uint8_t resBits)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t userRegister;&lt;br /&gt;
&lt;br /&gt;
	userRegister = read_user_register();&lt;br /&gt;
	userRegister &amp;amp;= 0b01111110;&lt;br /&gt;
	resBits &amp;amp;= 0b10000001;&lt;br /&gt;
	resolution = (resBits &amp;gt;&amp;gt; 6) | (resBits &amp;amp; 1); // Step 0..3&lt;br /&gt;
	userRegister |= resBits;&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_BHT_HT_ADR, HTU21D_USER_REG_W, userRegister);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#define SHIFTED_DIVISOR                 0x988000&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Calculates the Humidity Sensor's message CRC-8&lt;br /&gt;
 * value (8 bit) and returns 0 (false), if the&lt;br /&gt;
 * message transmission is good.&lt;br /&gt;
 *&lt;br /&gt;
 * Input:  message         -&amp;gt; Message from&lt;br /&gt;
 *                            Humidity Sensor&lt;br /&gt;
 *         checksum        -&amp;gt; Checksum from&lt;br /&gt;
 *                            Humidity Sensor&lt;br /&gt;
 *         SHIFTED_DIVISOR -&amp;gt; 0x0131 polynomial&lt;br /&gt;
 *                            shifted to farthest&lt;br /&gt;
 *                            left of three bytes&lt;br /&gt;
 * Output: remainder       -&amp;gt; 0  = Transmission good&lt;br /&gt;
 *                         -&amp;gt; &amp;gt;0 = Transm. corrupted&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
uint8_t I2C_BHT_HT_crc8(uint16_t message, uint8_t checksum)&lt;br /&gt;
{&lt;br /&gt;
	uint32_t remainder, divisor;&lt;br /&gt;
&lt;br /&gt;
	remainder = (uint32_t) message &amp;lt;&amp;lt; 8;&lt;br /&gt;
	remainder |= checksum;&lt;br /&gt;
	divisor = (uint32_t) SHIFTED_DIVISOR;&lt;br /&gt;
	for (i = 0; i &amp;lt; 16; i++)&lt;br /&gt;
	{&lt;br /&gt;
		if (remainder &amp;amp; (uint32_t) 1 &amp;lt;&amp;lt; (23 - i))&lt;br /&gt;
			remainder ^= divisor;&lt;br /&gt;
		divisor &amp;gt;&amp;gt;= 1;&lt;br /&gt;
	}&lt;br /&gt;
	return (uint8_t) remainder;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Calculates and returns the humidity value.&lt;br /&gt;
 * This function is BLOCKING during the conversion&lt;br /&gt;
 * time (up to 17 ms depending on resolution).&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
double I2C_BHT_HT_readHumidity(void)&lt;br /&gt;
{&lt;br /&gt;
	uint32_t temp = 0;&lt;br /&gt;
&lt;br /&gt;
	I2CTWI_transmitByte(I2C_BHT_HT_ADR, HTU21D_TRIG_RH_MEASUREMENT_POLL);&lt;br /&gt;
	switch (resolution) {&lt;br /&gt;
		case 1 : mSleep(4); break;				// RH 8 bit&lt;br /&gt;
		case 2 : mSleep(6); break;				// RH 10 bit&lt;br /&gt;
		case 3 : mSleep(9); break;				// RH 11 bit&lt;br /&gt;
		case 0 : mSleep(17);					// RH 12 bit&lt;br /&gt;
	}&lt;br /&gt;
	I2CTWI_readBytes(I2C_BHT_HT_ADR, bhtdataBuf, 3);&lt;br /&gt;
	temp = bhtdataBuf[0];						// MSB&lt;br /&gt;
	temp &amp;lt;&amp;lt;= 8;&lt;br /&gt;
	temp |= bhtdataBuf[1];						// LSB&lt;br /&gt;
	temp &amp;lt;&amp;lt;= 8;&lt;br /&gt;
	temp |= bhtdataBuf[2];						// Checksum&lt;br /&gt;
	rawHumidity = temp &amp;gt;&amp;gt; 8;&lt;br /&gt;
	ht_crc = (uint8_t) temp;&lt;br /&gt;
	rawHumidity &amp;amp;= 0xfffc;&lt;br /&gt;
	double tempRH = rawHumidity / (double) 65536;&lt;br /&gt;
	double rh = -6 + (125 * tempRH);&lt;br /&gt;
	return rh;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Calculates and returns the temperature value.&lt;br /&gt;
 * This function is BLOCKING during the conversion&lt;br /&gt;
 * time (up to 51 ms depending on resolution).&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
double I2C_BHT_HT_readTemperature(void)&lt;br /&gt;
{&lt;br /&gt;
	uint32_t temp = 0;&lt;br /&gt;
&lt;br /&gt;
	I2CTWI_transmitByte(I2C_BHT_HT_ADR, HTU21D_TRIG_T_MEASUREMENT_POLL);&lt;br /&gt;
	switch (resolution) {&lt;br /&gt;
		case 3 : mSleep(8); break;				// T 11 bit&lt;br /&gt;
		case 1 : mSleep(14); break;				// T 12 bit&lt;br /&gt;
		case 2 : mSleep(26); break;				// T 13 bit&lt;br /&gt;
		case 0 : mSleep(51);					// T 14 bit&lt;br /&gt;
	}&lt;br /&gt;
	I2CTWI_readBytes(I2C_BHT_HT_ADR, bhtdataBuf, 3);&lt;br /&gt;
	temp = bhtdataBuf[0];						// MSB&lt;br /&gt;
	temp &amp;lt;&amp;lt;= 8;&lt;br /&gt;
	temp |= bhtdataBuf[1];						// LSB&lt;br /&gt;
	temp &amp;lt;&amp;lt;= 8;&lt;br /&gt;
	temp |= bhtdataBuf[2];						// Checksum&lt;br /&gt;
	rawTemperature = temp &amp;gt;&amp;gt; 8;&lt;br /&gt;
	ht_crc = (uint8_t) temp;&lt;br /&gt;
	rawTemperature &amp;amp;= 0xfffc;&lt;br /&gt;
	double tempTemperature = rawTemperature / (double) 65536;&lt;br /&gt;
	double realTemperature = -46.85 + (175.72 * tempTemperature);&lt;br /&gt;
	return realTemperature;  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * You MUST call this function at the beginning of a&lt;br /&gt;
 * main program, that uses the Humidity Sensor. &lt;br /&gt;
 * If SENSOR_BOARD is defined, the I2C-MODULE power&lt;br /&gt;
 * will be switched on with the function&lt;br /&gt;
 * setI2CModulePower() defined in the&lt;br /&gt;
 * RP6M256_Sensor_BoardLib, which will be included&lt;br /&gt;
 * then.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void I2C_BHT_HT_init(void)&lt;br /&gt;
{&lt;br /&gt;
#ifdef SENSOR_BOARD&lt;br /&gt;
	// I2C-MODULE (plug M1) power on: &lt;br /&gt;
	setI2CModulePower(1);&lt;br /&gt;
#endif&lt;br /&gt;
	I2C_BHT_HT_reset();							// Reset the Humidity Sensor&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// RP6 BHT Module initialisation:&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * You MUST call this function at the beginning of a&lt;br /&gt;
 * main program, that uses the RP6 BHT Module. &lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void I2C_BHT_init(void)&lt;br /&gt;
{&lt;br /&gt;
	// I2C Barometric Pressure Sensor:&lt;br /&gt;
	I2C_BHT_B_init();&lt;br /&gt;
	// I2C Relative Humidity Sensor:&lt;br /&gt;
	I2C_BHT_HT_init();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&lt;br /&gt;
/******************************************************************************&lt;br /&gt;
 * Additional info&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Changelog:&lt;br /&gt;
 * - v. 0.9 (initial release) 20.03.2015 by Dirk&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
======Demo======&lt;br /&gt;
makefile:&lt;br /&gt;
&amp;lt;pre&amp;gt;...&lt;br /&gt;
TARGET = RP6M256_Sensor_Board_03&lt;br /&gt;
...&lt;br /&gt;
SRC += $(RP6_LIB_PATH)/RP6common/RP6I2CmasterTWI.c&lt;br /&gt;
&lt;br /&gt;
SRC += $(RP6_LIB_PATH)/RP6control_M256_WIFI/RP6M256_Sensor_BoardLib.c&lt;br /&gt;
SRC += $(RP6_LIB_PATH)/RP6control_M256_WIFI/RP6M256_I2C_BHTLib.c&lt;br /&gt;
...&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Datei: RP6M256_Sensor_Board_03.c&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;/* &lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * RP6 ROBOT SYSTEM - RP6 CONTROL M256 Examples&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Example: RP6M256 Sensor Board&lt;br /&gt;
 * Author(s): Dirk&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Description:&lt;br /&gt;
 * In this example we show a third test for the RP6 Sensor Board.&lt;br /&gt;
 * &lt;br /&gt;
 * ############################################################################&lt;br /&gt;
 * The Robot does NOT move in this example! You can simply put it on a table&lt;br /&gt;
 * next to your PC and you should connect it to the PC via the USB Interface!&lt;br /&gt;
 * You should also connect to it via WIFI.&lt;br /&gt;
 * ############################################################################&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Includes:&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6M256Lib.h&amp;quot; 				// The RP6 M256 Library. &lt;br /&gt;
										// Always needs to be included!&lt;br /&gt;
#include &amp;quot;RP6I2CmasterTWI.h&amp;quot;			// Include the I2C-Bus Master Library&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Include our new &amp;quot;RP6M256 I2C BHT Module library&amp;quot;:&lt;br /&gt;
// (This is the library for accessing the RP6 BHT Module!)&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6M256_I2C_BHTLib.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Write a floating point number to the WIFI.&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *&lt;br /&gt;
 *			// Write a floating point number to the WIFI (no exponent):&lt;br /&gt;
 *			writeDouble_WIFI(1234567.890, 11, 3);&lt;br /&gt;
 *&lt;br /&gt;
 * The value of prec (precision) defines the number of decimal places.&lt;br /&gt;
 * For 32 bit floating point variables (float, double ...) 6 is&lt;br /&gt;
 * the max. value for prec (7 relevant digits).&lt;br /&gt;
 * The value of width defines the overall number of characters in the&lt;br /&gt;
 * floating point number including the decimal point. The number of&lt;br /&gt;
 * pre-decimal positions is: (width - prec - 1).&lt;br /&gt;
 */&lt;br /&gt;
void writeDouble_WIFI(double number, uint8_t width, uint8_t prec)&lt;br /&gt;
{char buffer[width + 1];&lt;br /&gt;
	dtostrf(number, width, prec, &amp;amp;buffer[0]);&lt;br /&gt;
	writeString_WIFI(&amp;amp;buffer[0]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Write a floating point number to the LCD.&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *&lt;br /&gt;
 *			// Write a floating point number to the LCD (no exponent):&lt;br /&gt;
 *			writeDoubleLCD(1234567.890, 11, 3);&lt;br /&gt;
 *&lt;br /&gt;
 * The value of prec (precision) defines the number of decimal places.&lt;br /&gt;
 * For 32 bit floating point variables (float, double ...) 6 is&lt;br /&gt;
 * the max. value for prec (7 relevant digits).&lt;br /&gt;
 * The value of width defines the overall number of characters in the&lt;br /&gt;
 * floating point number including the decimal point. The number of&lt;br /&gt;
 * pre-decimal positions is: (width - prec - 1).&lt;br /&gt;
 */&lt;br /&gt;
void writeDoubleLCD(double number, uint8_t width, uint8_t prec)&lt;br /&gt;
{char buffer[width + 1];&lt;br /&gt;
	dtostrf(number, width, prec, &amp;amp;buffer[0]);&lt;br /&gt;
	writeStringLCD(&amp;amp;buffer[0]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Error handler&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function gets called automatically if there was an I2C Error like&lt;br /&gt;
 * the slave sent a &amp;quot;not acknowledge&amp;quot; (NACK, error codes e.g. 0x20 or 0x30).&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void I2C_transmissionError(uint8_t errorState)&lt;br /&gt;
{&lt;br /&gt;
	writeString_P_WIFI(&amp;quot;\nI2C ERROR - TWI STATE: 0x&amp;quot;);&lt;br /&gt;
	writeInteger_WIFI(errorState, HEX);&lt;br /&gt;
	writeChar_WIFI('\n');&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Main function - The program starts here:&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
	initRP6M256();    // Always call this first! The Processor will not work&lt;br /&gt;
					  // correctly otherwise. &lt;br /&gt;
&lt;br /&gt;
	initLCD(); // Initialize the LC-Display (LCD)&lt;br /&gt;
			   // Always call this before using the LCD!&lt;br /&gt;
&lt;br /&gt;
	setLEDs(0b1111);&lt;br /&gt;
	mSleep(500);&lt;br /&gt;
	setLEDs(0b0000);&lt;br /&gt;
&lt;br /&gt;
	writeString_P_WIFI(&amp;quot;\n\nRP6 Sensor Board Selftest 3!\n&amp;quot;); &lt;br /&gt;
&lt;br /&gt;
	// IMPORTANT:&lt;br /&gt;
	I2CTWI_initMaster(100); // Initialize the TWI Module for Master operation&lt;br /&gt;
							// with 100kHz SCL Frequency&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	// Register the event handler:&lt;br /&gt;
	I2CTWI_setTransmissionErrorHandler(I2C_transmissionError);&lt;br /&gt;
&lt;br /&gt;
	setLEDs(0b1111);&lt;br /&gt;
&lt;br /&gt;
	// Write a text message to the LCD:&lt;br /&gt;
	showScreenLCD(&amp;quot;################&amp;quot;, &amp;quot;################&amp;quot;);&lt;br /&gt;
	mSleep(1500);&lt;br /&gt;
	showScreenLCD(&amp;quot;RP6v2-M256-WIFI &amp;quot;, &amp;quot;Example Program&amp;quot;);&lt;br /&gt;
	mSleep(2500); &lt;br /&gt;
	showScreenLCD(&amp;quot;RP6 Sensor Board&amp;quot;, &amp;quot;   Selftest 3&amp;quot;);&lt;br /&gt;
	mSleep(2500);&lt;br /&gt;
	clearLCD();&lt;br /&gt;
&lt;br /&gt;
	setLEDs(0b0000);&lt;br /&gt;
&lt;br /&gt;
	// ---------------------------------------&lt;br /&gt;
&lt;br /&gt;
	uint8_t onoff = 0;&lt;br /&gt;
&lt;br /&gt;
	startStopwatch1();&lt;br /&gt;
	startStopwatch2();&lt;br /&gt;
&lt;br /&gt;
	// IMPORTANT:&lt;br /&gt;
	sensor_board_init();						// RP6 Sensor Board init!!!&lt;br /&gt;
	mSleep(200);&lt;br /&gt;
	I2C_BHT_init();								// RP6 BHT Module init&lt;br /&gt;
&lt;br /&gt;
	while(true) &lt;br /&gt;
	{&lt;br /&gt;
		if(getStopwatch1() &amp;gt; 1000) // 1s&lt;br /&gt;
		{&lt;br /&gt;
//			if (onoff) onoff = 0;&lt;br /&gt;
//			else onoff = 1;&lt;br /&gt;
&lt;br /&gt;
			// Show Pressure Sensor data:&lt;br /&gt;
			I2C_BHT_B_read();					// Read data&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nLuftdruck:   &amp;quot;);&lt;br /&gt;
			writeDouble_WIFI(P, 7, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot; hPa am Messort (ALTITUDE m)\n&amp;quot;);&lt;br /&gt;
			// Calculate pressure at sea level at TA_DEFAULT (15 °C):&lt;br /&gt;
			P0 = reduceAirPressure(P, TA_DEFAULT);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;Luftdruck:   &amp;quot;);&lt;br /&gt;
			writeDouble_WIFI(P0, 7, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot; hPa in Meereshöhe (0 m, 15 C)\n&amp;quot;);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;Temperatur:  &amp;quot;);&lt;br /&gt;
			writeDouble_WIFI(T, 7, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot; C\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			// Show Humidity Sensor data:&lt;br /&gt;
			H = I2C_BHT_HT_readHumidity();		// Read data&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nLuftfeuchte: &amp;quot;);&lt;br /&gt;
			writeDouble_WIFI(H, 7, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot; % RH\n&amp;quot;);&lt;br /&gt;
			HT = I2C_BHT_HT_readTemperature();	// Read data&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;Temperatur:  &amp;quot;);&lt;br /&gt;
			writeDouble_WIFI(HT, 7, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot; C\n\n\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			// RP6 Sensor Board shutdown (button &amp;amp; status LED test):&lt;br /&gt;
			if (pressedButton) {&lt;br /&gt;
				setStatusLED(1);&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;\nPress button again for RP6 Sensor Board SHUTDOWN!\n&amp;quot;);&lt;br /&gt;
				mSleep(2000);&lt;br /&gt;
				do {&lt;br /&gt;
					if(getStopwatch2() &amp;gt; 200) { // 0.2s&lt;br /&gt;
						if (onoff) onoff = 0;&lt;br /&gt;
						else onoff = 1;&lt;br /&gt;
						if (onoff) setStatusLED(1);&lt;br /&gt;
						else setStatusLED(0);&lt;br /&gt;
						setStopwatch2(0);&lt;br /&gt;
					}&lt;br /&gt;
					mSleep(1);&lt;br /&gt;
					task_I2CTWI();&lt;br /&gt;
				} while (!readButton());&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;\n\n\n\n\nPlease wait for RP6 Sensor Board SHUTDOWN...\n&amp;quot;);&lt;br /&gt;
				sensor_board_shutdown();&lt;br /&gt;
				mSleep(3000);&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;\n\n\nThe RP6 Sensor Board now is in SHUTDOWN MODE!!!\n&amp;quot;);&lt;br /&gt;
				mSleep(1000);&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;\nRESET the M256 microcontroller now...\n\n&amp;quot;);&lt;br /&gt;
				while(true) {};&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			setStopwatch1(0);&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		task_RP6SensorBoard();					// RP6 Sensor Board task&lt;br /&gt;
&lt;br /&gt;
		task_I2CTWI();&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Erklärung&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Erfahrungsberichte==&lt;br /&gt;
&lt;br /&gt;
...in Arbeit...(kann aber gerne ergänzt werden)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Siehe auch==&lt;br /&gt;
* [[RP6v2]]&lt;br /&gt;
* [[RP6]]&lt;br /&gt;
* [[RP6 - Programmierung]]&lt;br /&gt;
* [[RP6 Kamera - Mitmach-Projekt]]&lt;br /&gt;
* [[RP6v2 I2C-Portexpander]]&lt;br /&gt;
* [[RP6v2 USB-RS232-Adapter]]&lt;br /&gt;
* [[RP6v2 Orientierung]]&lt;br /&gt;
* [[RP6 Multi IO Projekt]]&lt;br /&gt;
* [[RP6 Multi IO Projekt - Software]]&lt;br /&gt;
* [[RP6 ArduIO]]&lt;br /&gt;
* [[RP6 ArduIO - Software]]&lt;br /&gt;
* [[Induktive_Ladestation_f%C3%BCr_den_RP6|Induktive Ladestation für den RP6]]&lt;br /&gt;
* [[IR-bake_f%C3%BCr_den_RP6|IR-bake für den RP6]]&lt;br /&gt;
* [[CCRP5]]&lt;br /&gt;
* [[Wild Thumper]]&lt;br /&gt;
* [[Wild Thumper - Programmierung]]&lt;br /&gt;
* [[Yeti]]&lt;br /&gt;
* [[Asuro]]&lt;br /&gt;
* [[C't-Bot]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Weblinks==&lt;br /&gt;
'''Siehe auch die Weblinks im [http://www.rn-wissen.de/index.php/RP6v2#Weblinks RP6v2] und im [http://www.rn-wissen.de/index.php/RP6#Weblinks RP6] Artikel!'''&lt;br /&gt;
&lt;br /&gt;
* [http://www.conrad.de/ce/de/product/1082384/Arexx-RP6-Sensor-Board-RP6-JM03-61 RP6 Sensor Board bei CONRAD]&lt;br /&gt;
* JM3 Engineering:&lt;br /&gt;
** [http://www.jm3-engineering.com/rp6.htm RP6 Roboter Erweiterung]&lt;br /&gt;
** [http://www.jm3-engineering.com/sensors.htm Sensor Module]&lt;br /&gt;
** [http://www.jm3-engineering.com/downloads.htm Software Downloads]&lt;br /&gt;
* Ankündigung einer Sensorerweiterungsplatine für die RP6v2 M256 WiFi im [http://www.roboternetz.de/community/threads/63595-Neue-Hardware-f%C3%BCr-RP6%28v2%29?p=590129&amp;amp;viewfull=1#post590129 Roboternetz RP6 Forum]&lt;br /&gt;
* Erfahrungsbericht zum Sensor Board im [http://www.arexx.com/forum/viewtopic.php?f=19&amp;amp;t=2498 AREXX Support Forum] und im [http://www.roboternetz.de/community/threads/64414-RP6-Sensor-Board-Erster-Eindruck Roboternetz RP6 Forum]&lt;br /&gt;
* Erfahrungsbericht zum I2C GPS Empfänger im [http://www.arexx.com/forum/viewtopic.php?f=19&amp;amp;t=2509 AREXX Support Forum]&lt;br /&gt;
* Erfahrungsbericht zum I2C BHT Modul im [http://www.arexx.com/forum/viewtopic.php?f=19&amp;amp;t=2646 AREXX Support Forum]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Kategorie:Robotikeinstieg]]	 &lt;br /&gt;
[[Kategorie:Praxis]]&lt;br /&gt;
&lt;br /&gt;
==Autoren==&lt;br /&gt;
--[http://www.roboternetz.de/community/members/1972-Dirk Dirk] 11:28, 31. Mär 2022 (CET)&lt;/div&gt;</summary>
		<author><name>Dirk NO2</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=RP6&amp;diff=28583</id>
		<title>RP6</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=RP6&amp;diff=28583"/>
				<updated>2022-03-31T09:31:24Z</updated>
		
		<summary type="html">&lt;p&gt;Dirk NO2: /* Autoren */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Bild:RP6_2.jpg|RP6 Base Roboter|right|500px]]&lt;br /&gt;
==Was bisher geschah==&lt;br /&gt;
Fre, 08. Jun 2007 - Ankündigung des RP6 und der RP6 CONTROL M32&amp;lt;br/&amp;gt;&lt;br /&gt;
Mon, 02. Jul 2007 23:00 - Benachrichtigung der Tester&amp;lt;br/&amp;gt;&lt;br /&gt;
Die, 03. Jul 2007 15:00 - Bereitstellung der Dokumentation&amp;lt;br/&amp;gt;&lt;br /&gt;
Don, 05. Jul 2007 14:30 - Bereitstellung der Schaltungsunterlagen&amp;lt;br/&amp;gt;&lt;br /&gt;
Son, 08. Jul 2007 16:00 - Nachricht über den Versand der RP6&amp;lt;br/&amp;gt;&lt;br /&gt;
Mon, 09. Jul 2007 00:15 - Bereitstellung der Library und der Beispielprogramme&amp;lt;br/&amp;gt;&lt;br /&gt;
Die, 10. Jul 2007 - Eintreffen der RP6 bei den Testern&amp;lt;br/&amp;gt;&lt;br /&gt;
Mon, 16. Jul 2007 - Auslieferungsbeginn des RP6&amp;lt;br/&amp;gt;&lt;br /&gt;
Fre, 24. Apr 2009 - Ankündigung der RP6 CCPRO M128 (Auslieferung schon ab Mitte April 2009)&amp;lt;br/&amp;gt;&lt;br /&gt;
Mon, 27. Feb 2012 - Ankündigung des RP6v2&amp;lt;br/&amp;gt;&lt;br /&gt;
Don, 08. Mär 2012 - Auslieferungsbeginn des RP6v2&amp;lt;br/&amp;gt;&lt;br /&gt;
Sam, 17. Mär 2012 - Ankündigung der RP6v2 M256 WiFi&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Siehe auch &amp;quot;Was bisher geschah&amp;quot; im [http://www.rn-wissen.de/index.php/RP6v2#Was_bisher_geschah RP6v2 Artikel]!'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Allgemein==  &lt;br /&gt;
[[Bild:DSC03448.JPG|thumb|RP6 mit Erweiterungsboard]] [[Bild:RP6_Lieferumfang.jpg|thumb|RP6 im Lieferumfang]]&lt;br /&gt;
Der von Arexx entwickelte RP6 ([http://www.conrad.de/ce/de/product/191524/C-Control-Robot-System-RP6-Robotersystem 191524]) ist ein autonomes Raupenfahrzeug, das nicht nur für Schüler und Studenten zum Einstieg in das Gebiet Robotik sondern auch für Fortgeschrittene Elektroniker und Bastler sehr gut geeignet ist, da das System für selbstentworfene Erweiterungen ausgelegt ist. Der RP6 wird von einem, unter Roboterentwicklern beliebten, AVR Microcontroller von Atmel gesteuert und hat Lichtsensoren in Form von zwei LDRs, 2 Bumper an der Stoßstange, 6 Status LEDs, Sensoren zur Überwachung der Akkuspannung, Drehgeber mit 625 CPR, ein Infrarot Sensor zur Hinderniserkennung und Kommunikation und Motorstromsensoren zur Verfügung. Zudem liegt dem Roboter eine umfangreiche Anleitung, inklusive einem kleinen C-Crashkurs, ein USB-Interface zum Anschluss an den PC und ein USB Kabel bei.&lt;br /&gt;
&lt;br /&gt;
In diesem Artikel geht es um die Grundlagen des RP6. Zur Programmierung des RP6 gibt es eine eigene Seite: [[RP6 - Programmierung]]&lt;br /&gt;
&lt;br /&gt;
==Technische Daten==&lt;br /&gt;
{|  {{Blauetabelle}} &lt;br /&gt;
|'''Mikrocontroller:'''&lt;br /&gt;
|AVR [[ATmega32]]&lt;br /&gt;
|-&lt;br /&gt;
|'''Speicher:'''&lt;br /&gt;
|32 kB [[Flash]]-Speicher, davon 1 kB bereits vom Bootloader belegt&amp;lt;br/&amp;gt;&lt;br /&gt;
2 kB RAM&amp;lt;br/&amp;gt; &lt;br /&gt;
1 kB [[EEPROM]]&lt;br /&gt;
|-&lt;br /&gt;
|'''Programmierung:'''&lt;br /&gt;
|Über AVR-[[Bootloader]], belegt ca. 1 kB des Flash-Speichers&lt;br /&gt;
|-&lt;br /&gt;
|'''Vorhandene Sensoren:'''&lt;br /&gt;
|2 [[Sensorarten#Helligkeit|Lichtsensoren (LDR)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
1 [[Sensorarten#Helligkeit|Infrarot (ACS - Anti Collision System)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
2 [[Sensorarten#Bumpers|Bumper]] &amp;lt;br/&amp;gt; &lt;br /&gt;
2 [[Sensorarten#Incremental-Geber|Drehgeber (Encoder)]]&lt;br /&gt;
|-&lt;br /&gt;
|'''Vorhandene Aktoren:'''&lt;br /&gt;
|2 Motoren&amp;lt;br/&amp;gt;&lt;br /&gt;
6 Status-LEDs&amp;lt;br/&amp;gt;&lt;br /&gt;
1 IR-Sender&amp;lt;br/&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|'''Abmessungen:'''&lt;br /&gt;
|(L &amp;amp;times; B &amp;amp;times; H) 172 &amp;amp;times; 128 &amp;amp;times; 50 mm&lt;br /&gt;
|-&lt;br /&gt;
|'''Ausführung:'''&lt;br /&gt;
|Fertig aufgebauter Roboter&lt;br /&gt;
|-&lt;br /&gt;
|'''Stromversorgung:'''&lt;br /&gt;
|6 AA NiMH Akkus&lt;br /&gt;
|-&lt;br /&gt;
|'''Hersteller:'''&lt;br /&gt;
|Arexx Niederlande&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Mechanik==&lt;br /&gt;
===Beschreibung===&lt;br /&gt;
&lt;br /&gt;
===Sensoren===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Encoder====&lt;br /&gt;
&lt;br /&gt;
Die Drehgeber sind an den Getrieben der Motoren zur Drehzahlmessung angebracht. Es handelt sich dabei um Reflexlichtschranken, die auf Codierscheiben mit je 18 weissen und 18 schwarzen Segmenten ausgerichtet sind, also insgesamt 36 Segmente. Diese Codierscheiben sind wiederum an je eines der Zahnräder der beiden Getriebe geklebt worden. Wenn es sich dreht, wandern die einzelnen Segmente an der Reflexlichtschranke vorbei. Die weissen Segmente reflektieren das Infrarotlicht, die schwarzen Segmente nur wenig. Jedes der zwei mittleren Stufenzahnräder des Getriebes hat 50 Zähne auf dem großen, und 12 auf dem kleineren Zahnrad. Die Codierscheiben befinden sich auf dem Zahnrad neben dem Motor, also rechnet man:&lt;br /&gt;
50/12 * 50/12 =17.13/36; 17.13/36 * 36=625&lt;br /&gt;
Daher haben die Encoderscheiben auch Ihre 36 Segmente, denn das gibt eine schöne runde Zahl ohne gebrochenen Anteil. Die Drehgeber erzeugen also 625 Flanken pro Radumdrehung wobei jede Flanke einem Segment entspricht. Bei einem Raddurchmesser von ca. 50mm inkl. Raupenkette, ergibt sich rein rechnerisch ein Radumfang von ca. 157mm was 0.2512mm pro Zählschritt der Drehgeber entspricht. Da sich die Raupenketten aber fast immer etwas in den Untergrund eindrücken (bzw. auch selbst eingedrückt werden) kann man aber von 0.25mm pro Zählschritt ausgehen – meist ist es sogar etwas weniger, z.B. nur 0.24 oder 0.23mm. Das muss man durch abfahren von Teststrecken ermitteln, wie es im Anhang grob beschrieben ist. Sehr genau ist das allerdings durch Radschlupf (bzw. hier müssten wir eigentlich von „Kettenschlupf“ sprechen) und ähnlichen Dingen nicht - vor allem beim Rotieren auf der Stelle. Beim normalen Geradeausfahren ist dieser Fehler klein, aber beim Rotieren kann er schnell sehr große Werte annehmen! Abweichungen muss man evtl. durch weitere Tests ermitteln und mit einkalkulieren. Das ist bei Raupenantrieben leider so – auch bei viel teureren und hochwertigeren Robotern. Dafür hat man aber den Vorteil, dass der Roboter mit Raupenantrieb recht geländegängig ist im Vergleich zu Robotern mit normalem Differentialantrieb mit zwei Antriebsrädern und Stützrad. Kleinere Hindernisse und Rampen kann er meist problemlos überwinden.&lt;br /&gt;
Dabei sind die Encoder sehr nützlich, denn man kann die Geschwindigkeit gut einregeln, egal wie der Untergrund und die Motorbelastung gerade aussieht. Bei gemessenen 50 Segmenten pro Sekunde liegt die Geschwindigkeit bei 1.25 cm/s, sofern wir von 0.25mm pro Zählschritt ausgehen. Etwa 50 Segmente pro Sekunde ist auch die geringste gerade noch regelbare Geschwindigkeit (das variiert aber etwas von Roboter zu Roboter). Bei 1200 Segmenten pro Sekunde wären es die maximal möglichen 30 cm/s (bei 0.25mm Auflösung, bei 0.23 sind es 27.6 cm/s). Standardmäßig begrenzt die Funktionsbibliothek das aber auf 1000 Flanken pro Sekunde. Die maximale Geschwindigkeit ist vom Ladezustand der Akkus abhängig – daher wären 30cm/s nicht besonders lange haltbar. Außerdem erhöht sich die Lebensdauer der Getriebe und Motoren je langsamer man fährt! Wenn der Roboter 4000 Segmente gezählt hat, ist er übrigens etwa einen Meter weit gefahren. Aber wie schon gesagt, gilt das natürlich nur für genau 0.25mm Auflösung. Ohne Kalibrierung hat man hier immer mehr oder weniger starke Abweichungen. Wem es nicht auf jeden mm ankommt, braucht nichts zu kalibrieren und kann einfach von 0.25mm oder besser 0.24mm ausgehen!&lt;br /&gt;
&lt;br /&gt;
====Stoßstangensensoren====&lt;br /&gt;
&lt;br /&gt;
Vorn am Roboter sind zwei Mikroschalter mit langem Schalthebel auf einer separaten&lt;br /&gt;
Platine untergebracht, die etwas vor der anderen Sensorplatine liegt. Dadurch werden&lt;br /&gt;
die IR LEDs auf der Sensorplatine geschützt und können nicht so leicht verbiegen&lt;br /&gt;
wenn der Roboter mal gegen ein Hindernis fährt. Die Stoßstange kann man auch abmontieren und z.B. gegen eine Schuss- oder Sammelvorrichtung für Bälle o.ä. ersetzen wenn man möchte.&lt;br /&gt;
&lt;br /&gt;
====Lichtsensoren====&lt;br /&gt;
&lt;br /&gt;
Vorne auf der kleinen Sensorplatine des Roboters sind zwei sog.&lt;br /&gt;
LDRs (=&amp;quot;Light Dependant Resistors&amp;quot; also lichtabhängige Widerstände)&lt;br /&gt;
platziert und nach links bzw. rechts ausgerichtet. Zwischen&lt;br /&gt;
den beiden Sensoren ist noch eine kleine schwarze&lt;br /&gt;
„Trennwand“ damit das Licht aus einer Richtung möglichst nur&lt;br /&gt;
einen der Sensoren erreicht. Sie bilden zusammen mit je einem&lt;br /&gt;
normalen Widerstand wie beim Batteriesensor einen Spannungsteiler – hier allerdings&lt;br /&gt;
um das Umgebungslicht zu messen.&lt;br /&gt;
&lt;br /&gt;
====Anti Collision System====&lt;br /&gt;
&lt;br /&gt;
Der aus Softwaresicht komplexeste Sensor des RP6 ist das ACS - das&lt;br /&gt;
„Anti Collision System“ (engl. für Anti Kollisions System)! Es besteht&lt;br /&gt;
aus einem IR Empfänger (s. Abb.) und zwei vorne auf der Sensorplatine&lt;br /&gt;
links und rechts angebrachten IR LEDs.&lt;br /&gt;
Da es je eine IR LED links und rechts gibt, kann das ACS grob unterscheiden ob sich&lt;br /&gt;
das Objekt links, rechts oder mittig vor dem Roboter befindet.&lt;br /&gt;
Man kann zusätzlich noch die Stromstärke mit der die beiden IR LEDs gepulst werden&lt;br /&gt;
in drei Stufen einstellen. Das ACS funktioniert aber auch in der höchsten Stufe nicht&lt;br /&gt;
mit allen Objekten immer zuverlässig, denn es kommt auf die Beschaffenheit der&lt;br /&gt;
Oberfläche des jeweiligen Objekts an! Ein schwarzes Objekt reflektiert das IR Licht natürlich&lt;br /&gt;
viel schlechter als ein weisses Objekt und ein kantiges und spiegelndes Objekt&lt;br /&gt;
könnte das IR Licht hauptsächlich in eine bestimme Richtung reflektieren. Die Reichweite&lt;br /&gt;
ist also immer vom jeweiligen Objekt abhängig! Das ist eine prinzipielle Schwäche&lt;br /&gt;
von so gut wie allen IR Sensoren (jedenfalls in dieser Preisklasse).&lt;br /&gt;
Trotzdem werden die meisten Hindernisse zuverlässig erkannt und können umfahren&lt;br /&gt;
werden. Falls das mal nicht klappt, gibt es noch die Stoßstange mit den Tastsensoren&lt;br /&gt;
und falls auch die nicht richtig getroffen werden, kann der Roboter noch mit den Motorstromsensoren&lt;br /&gt;
oder den Encodern erkennen, ob die Motoren blockieren (s.u.)!&lt;br /&gt;
Wem das nicht reicht, der könnte zusätzlich z.B. noch Ultraschallsensoren anbringen...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Erweiterungssystem===&lt;br /&gt;
Auf dem Mainboard sind 22 freie 3,2mm Löcher vorhanden (im Chassis weitere 16), auf denen die Erweiterungsmodule symmetrisch vorne und hinten gestapelt werden können. Weil der Stromverbrauch durch mehr Module steigt, ist es sinnvoll nur insgesamt 6-8 Module auf dem Roboter zu stapeln. Auf dem Mainboard selbst sind noch 6 kleine Erweiterungsflächen verfügbar (plus 2 sehr kleine auf der Bumperplatine).&lt;br /&gt;
&lt;br /&gt;
===Antrieb===&lt;br /&gt;
&lt;br /&gt;
Die 7,2 VDC Motoren sind im Chassis eingebaut und werden mithilfe der H-Brücken gesteuert. Die maximale Geschwindigkeit liegt bei 25cm/s, das kann je nach Akkuspannung aber variieren. Ohne Softwarebegrenzung sind sogar 30cm/s möglich, dadurch verringert sich aber die Lebensdauer der Motoren. Die maximale Steigung, die der RP6 bewältigen kann, ist 30%, ohne Bumperplatine 40%, das hängt aber auch vom Untergrund ab. Kleine Hindernisse wie Bücher und Stifte kann der RP6 problemlos überqueren. Die Achsen der Räder sind in selbstschmierenden Sinterlagern mit 4mm Durchmesser gelagert.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Elektromechanik==&lt;br /&gt;
===Beschreibung===&lt;br /&gt;
===Odometrie===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Elektronik==&lt;br /&gt;
[[Bild:RP6 Block.jpg|thumb|Blockdiagramm]]&lt;br /&gt;
===Beschreibung===&lt;br /&gt;
&lt;br /&gt;
===Sensoren (SENSORS)===&lt;br /&gt;
&lt;br /&gt;
Die meisten Sensoren über die der Roboter verfügt, haben wir ja schon in anderen Abschnitten kurz genannt, wollen diese nun aber etwas detaillierter betrachten.&lt;br /&gt;
In dem Blockdiagramm sind einige der Sensoren nicht in dem blauen Bereich &amp;quot;Sensors&amp;quot; zu sehen, weil sie besser in andere Bereiche passen. Trotzdem zählen natürlich auch die Drehgeber (= “Encoder“), Motorstromsensoren und der Batteriespannungssensor zu den Sensoren und werden darum in diesem Abschnitt beschrieben!&lt;br /&gt;
&lt;br /&gt;
====Batteriespannungs-Sensor (Voltage Sensor)====&lt;br /&gt;
&lt;br /&gt;
Dieser &amp;quot;Sensor&amp;quot; ist eigentlich nur ein einfacher Spannungsteiler aus zwei Widerständen. Wir gehen davon aus, dass die Batterien insgesamt maximal 10V liefern können. 6 NiMH Akkus werden immer unterhalb davon bleiben. Die Referenzspannung des ADC, also die Spannung mit der er die gemessene Spannung vergleicht, beträgt 5V. Da auch die Betriebsspannung 5V beträgt, darf diese nicht überschritten werden. Also müssen wir die zu messende Spannung um die Hälfte herabsetzen! Dies geschieht über einen Spannungsteiler aus zwei Widerständen, der die Spannung an den Messbereich des ADCs anpasst. Der ADC löst mit 10 Bit auf (Wertebereich 0 bis 1023), was eine Auflösung von 10V/1024=9.765625mV ergibt. Ein Messwert von 512 entspricht hier also 5V und 1023 wären ungefähr 10V! Diese Grenzwerte sollten aber normalerweise nie erreicht werden! Das ist nicht besonders genau, da die Widerstände keineswegs Präzisionswiderstände sind. Abweichungen von einigen Prozent nach oben und unten sind möglich. Auch die Referenzspannung von 5V ist nicht ganz genau und kann bei normaler Belastung etwas variieren. Das stört hier nicht, denn wir brauchen ohnehin nur einen ungefähren Wert um festzustellen ob die Batterien sich langsam dem Ende nähern. Wer die Spannung genau messen will, braucht ein Multimeter um den Messfehler zu ermitteln und diesen dann in Software auszugleichen. Wenn man mit Fehlern leben kann, kann man die Spannung dank des günstigen Umrechnungsverhältnisses sogar direkt aus den ADC Werten ungefähr abschätzen: 720 entsprechen dann grob 7.2V, 700 etwa 7V und 650 wären etwa 6.5V. Bei einem konstanten Wert unter 560 kann man davon ausgehen, dass die Akkus fast leer sind.&lt;br /&gt;
&lt;br /&gt;
====Motorstrom====&lt;br /&gt;
[[Bild:RP6_MSS.jpg|thumb]]&lt;br /&gt;
Es befinden sich zwei Leistungswiderstände in den beiden Motorstromkreisen. Aus dem Ohm'schen Gesetz U=RxI folgt, dass sich die Spannung die an einem bestimmten Widerstand abfällt, proportional zum Strom verhält, der diesen durchfließt!&lt;br /&gt;
Damit die Spannungsabfälle an den Widerständen nicht zu groß werden, müssen die Widerstände klein gewählt werden. In unserem Fall haben Sie einen Wert von 0.1 Ohm&lt;br /&gt;
Die abfallende Spannung ist also nur sehr klein (0.1V bei einem Strom von 1A) und muss verstärkt werden bevor sie mit dem ADC gemessen werden kann. Das erledigt jeweils ein sog. Operationsverstärker (OPV). In der Schaltung des RP6 wird je Motorkanal ein OPV verwendet. Der Messbereich geht etwa bis 1.8A. Bei 1.8A fallen etwa 0.18V am Widerstand ab und es ergibt sich am Ausgang des OPV eine Spannung von etwa 4V. Mehr kann der verwendete OPV bei 5V Betriebsspannung nicht ausgeben:&lt;br /&gt;
&lt;br /&gt;
I = U / ((1 + (100k / 4,7k)) * 0,1)&lt;br /&gt;
&lt;br /&gt;
Die Leistungswiderstände haben eine Toleranz von 10%, die Widerstände am OPV 5%, also ist das alles nur sehr ungenau (Ungenauigkeiten im Bereich von etwa 270mA sind möglich wenn man die Sensoren nicht kalibriert!). Wir brauchen allerdings auch nur den ungefähren Wert um festzustellen ob die Motoren stark oder wenig belastet werden. So kann der Roboter gut blockierte oder gar defekte Motoren bzw. Drehgeber erkennen! Die DC-Motoren benötigen mehr Strom je stärker sie belastet werden (Drehmoment) und somit steigt der Strom sehr stark an wenn die Motoren blockiert sind. Das wird von der Robotersoftware zur Notabschaltung verwendet: wenn die Motoren dauerhaft mit hohem Strom betrieben würden, könnten diese sehr heiß werden und dadurch Schaden nehmen! Und wenn die Encoder mal ausfallen sollten – aus welchem Grund auch immer – kann auch das damit erkannt werden. Man würde dann eine Drehzahl von 0 messen. Lässt man die Motoren aber auf voller Kraft laufen und der Strom bleibt trotzdem klein (also sind die Ketten nicht blockiert!), kann man genau daraus schließen, dass entweder die Encoder, oder die Motoren ausgefallen sind (oder Encoder und Motorstromsensoren nicht funktionieren... das passiert z.B. wenn man vergessen hat diese vorher per Software einzuschalten).&lt;br /&gt;
&lt;br /&gt;
====Encoder====&lt;br /&gt;
[[Bild:RP6_ENCODER.jpg|thumb]]&lt;br /&gt;
Ganz anders als die letztgenannten Sensoren funktionieren die Drehgeber, die an den Getrieben der Motoren zur Drehzahlmessung angebracht sind. Es handelt sich dabei um Reflexlichtschranken, die auf Codierscheiben mit je 18 weissen und 18 schwarzen Segmenten ausgerichtet sind, also insgesamt 36 Segmente (s. Abb). Diese Codierscheiben sind wiederum an je eines der Zahnräder der beiden Getriebe geklebt worden. Wenn es sich dreht, wandern die einzelnen Segmente an der Reflexlichtschranke vorbei. Die weissen Segmente reflektieren das Infrarotlicht, die schwarzen Segmente nur wenig. Die Drehgeber erzeugen so zwar auch wie die anderen Sensoren ein analoges Signal, aber es wird digital interpretiert. Zunächst wird das Signal verstärkt und anschließend über einen sog. Schmitt Trigger in ein Rechtecksignal umgewandelt. Die Flanken dieses Signals, also die Wechsel von 5 auf 0V und umgekehrt, lösen jeweils ein Interrupt Ereignis aus und diese werden dann von der Software gezählt. So kann die zurückgelegte Wegstrecke gemessen und zusammen mit einem Timer zur Zeitmessung die Drehzahl und damit auch die Geschwindigkeit ermittelt werden. Die Ermittlung der Drehzahl ist auch Hauptanwendung der Encoder – nur mit den Encodern kann man die Drehzahl auf den gewünschten Sollwert einregeln. Ohne Regelung wäre die Drehzahl nämlich von der Akkuspannung, Belastung der Motoren usw. abhängig. Die hohe Auflösung ermöglicht es dabei, auch niedrige Geschwindigkeiten noch relativ genau einzuregeln. Jedes der zwei mittleren Stufenzahnräder des Getriebes hat 50 Zähne auf dem großen, und 12 auf dem kleineren Zahnrad (s. Abb). Die Codierscheiben befinden sich auf dem Zahnrad neben dem Motor, also rechnet man:&lt;br /&gt;
&lt;br /&gt;
50/12 * 50/12 =17.13/36; 17.13/36 * 36=625&lt;br /&gt;
&lt;br /&gt;
Daher haben die Encoderscheiben auch Ihre 36 Segmente, denn das gibt eine schöne runde Zahl ohne gebrochenen Anteil. Die Drehgeber erzeugen also 625 Flanken pro Radumdrehung wobei jede Flanke einem Segment entspricht. Bei einem Raddurchmesser von ca. 50mm inkl. Raupenkette, ergibt sich rein rechnerisch ein Radumfang von ca. 157mm was 0.2512mm pro Zählschritt der Drehgeber entspricht. Da sich die Raupenketten aber fast immer etwas in den Untergrund eindrücken (bzw. auch selbst eingedrückt werden) kann man aber von 0.25mm pro Zählschritt ausgehen – meist ist es sogar etwas weniger, z.B. nur 0.24 oder 0.23mm. Das muss man durch abfahren von Teststrecken ermitteln, wie es im Anhang grob beschrieben ist. Sehr genau ist das allerdings durch Radschlupf (bzw. hier müssten wir eigentlich von „Kettenschlupf“ sprechen) und ähnlichen Dingen nicht - vor allem beim Rotieren auf der Stelle. Beim normalen Geradeausfahren ist dieser Fehler klein, aber beim Rotieren kann er schnell sehr große Werte annehmen! Abweichungen muss man evtl. durch weitere Tests ermitteln und mit einkalkulieren. Das ist bei Raupenantrieben leider so – auch bei viel teureren und hochwertigeren Robotern. Dafür hat man aber den Vorteil, dass der Roboter mit Raupenantrieb recht geländegängig ist im Vergleich zu Robotern mit normalem Differentialantrieb mit zwei Antriebsrädern und Stützrad. Kleinere Hindernisse und Rampen kann er meist problemlos überwinden.&lt;br /&gt;
Dabei sind die Encoder sehr nützlich, denn man kann die Geschwindigkeit gut einregeln, egal wie der Untergrund und die Motorbelastung gerade aussieht. Bei gemessenen 50 Segmenten pro Sekunde liegt die Geschwindigkeit bei 1.25 cm/s, sofern wir von 0.25mm pro Zählschritt ausgehen. Etwa 50 Segmente pro Sekunde ist auch die geringste gerade noch regelbare Geschwindigkeit (das variiert aber etwas von Roboter zu Roboter). Bei 1200 Segmenten pro Sekunde wären es die maximal möglichen 30 cm/s (bei 0.25mm Auflösung, bei 0.23 sind es 27.6 cm/s). Standardmäßig begrenzt die Funktionsbibliothek das aber auf 1000 Flanken pro Sekunde. Die maximale Geschwindigkeit ist vom Ladezustand der Akkus abhängig – daher wären 30cm/s nicht besonders lange haltbar. Außerdem erhöht sich die Lebensdauer der Getriebe und Motoren je langsamer man fährt!&lt;br /&gt;
&lt;br /&gt;
=====Encoder justieren=====&lt;br /&gt;
Damit der RP6 die Signale der Drehgeber richtig auswerten kann, muss man evtl. die Drehgeber einmalig justieren. Dies kann auch schon bei einem neu gekauften RP6 notwendig sein.&lt;br /&gt;
Eine genaue Anleitung dazu findet man [http://www.arexx.com/rp6/downloads/RP6_ENCODER_DE_20071219.zip hier]. Es gibt auch ein [http://www.arexx.com/rp6/downloads/rp6_encoder_video.zip Video], das die Drehgeber-Justierung zeigt.&lt;br /&gt;
&lt;br /&gt;
=====Encoder kalibrieren=====&lt;br /&gt;
Wenn der Roboter 4000 Segmente gezählt hat, ist er etwa einen Meter weit gefahren. Aber wie schon gesagt, gilt das natürlich nur für genau 0.25mm Auflösung. Ohne Kalibrierung hat man hier immer mehr oder weniger starke Abweichungen. Wem es nicht auf jeden mm ankommt, braucht nichts zu kalibrieren und kann einfach von 0.25mm oder besser 0.24mm ausgehen!&lt;br /&gt;
Optimal ist es, wenn man sich für Weg- und Winkelmessungen nicht auf die Encoder Daten stützen muss, sondern externe Systeme wie Infrarotbaken oder einen genauen elektronischen Kompass dazu zur Verfügung hat.&lt;br /&gt;
&lt;br /&gt;
Will man die Drehgeber des RP6 dennoch kalibrieren, kann man ihn z.B. mit diesem Testprogramm:&lt;br /&gt;
&amp;lt;pre&amp;gt;#include &amp;quot;RP6RobotBaseLib.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
	initRobotBase();&lt;br /&gt;
	powerON();&lt;br /&gt;
&lt;br /&gt;
	// Test: Go ahead 1m and stop!&lt;br /&gt;
	move (80, FWD, DIST_MM(1000), true);&lt;br /&gt;
	writeString_P(&amp;quot;LEFT RIGHT&amp;quot;);&lt;br /&gt;
 	writeString_P(&amp;quot;\n&amp;quot;);&lt;br /&gt;
 	writeInteger(mleft_dist, DEC);&lt;br /&gt;
	writeChar(' ');&lt;br /&gt;
 	writeInteger(mright_dist, DEC);&lt;br /&gt;
	writeString_P(&amp;quot;\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
	powerOFF();&lt;br /&gt;
&lt;br /&gt;
	return 0;&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
... 1m weit fahren lassen und dann messen, wie weit er tatsächlich gefahren ist. Das Programm gibt auf dem Terminal den Stand der Drehgeber aus. Teilt man dann die gemessene Fahrstrecke in mm durch den Wert der Drehgeber, erhält man die Auflösung. Diesen Wert kann man dann der Konstanten ENCODER_RESOLUTION in der RP6Config.h zuweisen. Nach &amp;quot;Make Clean&amp;quot;, einer Neukompilierung und erneuter Ausführung des Testprogramms müßte der RP6 jetzt genau 1m weit fahren. Das gilt zumindest für den Untergrund, auf dem die Kalibrierung durchgeführt wurde.&lt;br /&gt;
&lt;br /&gt;
====Stoßstangensensoren (Bumper)====&lt;br /&gt;
&lt;br /&gt;
Vorn am Roboter sind zwei Mikroschalter mit langem Schalthebel auf einer separaten&lt;br /&gt;
Platine untergebracht, die etwas vor der anderen Sensorplatine liegt. Dadurch werden&lt;br /&gt;
die IR LEDs auf der Sensorplatine geschützt und können nicht so leicht verbiegen&lt;br /&gt;
wenn der Roboter mal gegen ein Hindernis fährt. Mit den zwei Schaltern kann der Mikrocontroller&lt;br /&gt;
einen solchen Aufprall registrieren und dann beispielsweise zurücksetzen,&lt;br /&gt;
sich etwas drehen und weiterfahren. Die Schalter sind an zwei der Ports die schon mit&lt;br /&gt;
den LEDs verbunden sind angeschlossen und blockieren so keine anderen Ports des&lt;br /&gt;
Mikrocontrollers. Daher leuchten die LEDs auch immer wenn man einen der Schalter&lt;br /&gt;
drückt! Da dies normalerweise relativ selten passiert, stört das aber nicht weiter.&lt;br /&gt;
Die Stoßstange kann man auch abmontieren und z.B. gegen eine Schuss- oder Sammelvorrichtung&lt;br /&gt;
für Bälle o.ä. ersetzen wenn man möchte.&lt;br /&gt;
&lt;br /&gt;
====Lichtsensoren (LDRs)====&lt;br /&gt;
[[Bild:RP6_Licht.jpg|thumb]]&lt;br /&gt;
Vorne auf der kleinen Sensorplatine des Roboters sind zwei sog.&lt;br /&gt;
LDRs (=&amp;quot;Light Dependant Resistors&amp;quot; also lichtabhängige Widerstände)&lt;br /&gt;
platziert und nach links bzw. rechts ausgerichtet. Zwischen&lt;br /&gt;
den beiden Sensoren ist noch eine kleine schwarze&lt;br /&gt;
„Trennwand“ damit das Licht aus einer Richtung möglichst nur&lt;br /&gt;
einen der Sensoren erreicht. Sie bilden zusammen mit je einem&lt;br /&gt;
normalen Widerstand wie beim Batteriesensor einen Spannungsteiler – hier allerdings&lt;br /&gt;
um das Umgebungslicht zu messen. Die 5V Betriebsspannung wird auch geteilt, aber&lt;br /&gt;
hier ist einer der Widerstände variabel! Es wird also das Teilungsverhältnis je nach Intensität&lt;br /&gt;
des Lichteinfalls verändert und somit eine vom Lichteinfall abhängige Spannung&lt;br /&gt;
an einen der A/D Wandler Kanäle geleitet!&lt;br /&gt;
Über den Spannungsunterschied zwischen den beiden Sensoren kann man ermitteln in&lt;br /&gt;
welcher Richtung sich eine bzw. die hellste Lichtquelle vor dem Roboter befindet:&lt;br /&gt;
Links, Rechts oder in der Mitte. Mit einem entsprechenden Programm, kann man so z.B. eine starke Taschenlampe in&lt;br /&gt;
einem abgedunkelten Zimmer verfolgen, oder den Roboter die hellste Stelle in einem&lt;br /&gt;
Raum suchen lassen! Klappt z.B. sehr gut mit einem stärkeren Hand-Halogenscheinwerfer:&lt;br /&gt;
Wenn man damit auf den Boden leuchtet, kann der Roboter dem Lichtfleck auf&lt;br /&gt;
dem Boden folgen.&lt;br /&gt;
Das geht natürlich auch umgekehrt: Der Roboter könnte z.B. auch versuchen sich vor&lt;br /&gt;
hellem Licht zu verstecken...&lt;br /&gt;
Wenn man noch ein oder zwei LDRs hinten am Roboter anbringen würde, könnte man&lt;br /&gt;
das noch verfeinern und die Richtung in der sich Lichtquellen befinden besser bestimmen.&lt;br /&gt;
Der Roboter kann sonst nämlich oft nur schwer unterscheiden ob die Lichtquelle&lt;br /&gt;
vor oder hinter ihm liegt. Zwei der A/D Wandler Kanäle sind noch frei...&lt;br /&gt;
&lt;br /&gt;
====Anti Collision System (ACS)====&lt;br /&gt;
[[Bild:RP6 ACS.jpg|thumb|Das ACS]]&lt;br /&gt;
Der aus Softwaresicht komplexeste Sensor des RP6 ist das ACS - das „Anti Collision System“ (engl. für Anti Kollisions System)! Es besteht aus einem IR Empfänger (s. Abb.) und zwei vorne auf der Sensorplatine links und rechts angebrachten IR LEDs. Die IR LEDs werden direkt vom Mikrocontroller angesteuert. Die Ansteuerungsroutinen können beliebig verändert und verbessert werden! Beim Vorgängermodell war dafür noch ein eigener Controller nötig, dessen Programm aber nicht vom Anwender geändert werden konnte...&lt;br /&gt;
Mit den IR LEDs werden kurze, mit 36kHz modulierte Infrarot Impulse ausgesandt, auf die der darauf ausgelegte IR Empfänger reagiert. Werden die IR Impulse an einem Gegenstand vor dem Roboter reflektiert und vom IR Empfänger detektiert, kann der Mikrocontroller darauf reagieren und z.B. ein Ausweichmanöver einleiten. Damit das ACS nicht zu empfindlich bzw. auf eventuelle Störungen reagiert, wartet die Software bis eine bestimmte Anzahl von Impulsen in einer bestimmten Zeit empfangen worden ist. Es wird auch eine Synchronisation mit dem RC5 Empfang durchgeführt und auf die RC5 Signale von TV/Hifi Fernbedienungen wird so nicht reagiert. Bei anderen Codes kann das aber nicht garantiert werden und das ACS könnte dann Hindernisse erkennen, wo gar keine sind! Da es je eine IR LED links und rechts gibt, kann das ACS grob unterscheiden ob sich das Objekt links, rechts oder mittig vor dem Roboter befindet.&lt;br /&gt;
Man kann zusätzlich noch die Stromstärke mit der die beiden IR LEDs gepulst werden in drei Stufen einstellen. Das ACS funktioniert aber auch in der höchsten Stufe nicht mit allen Objekten immer zuverlässig, denn es kommt auf die Beschaffenheit der Oberfläche des jeweiligen Objekts an! Ein schwarzes Objekt reflektiert das IR Licht natürlich viel schlechter als ein weisses Objekt und ein kantiges und spiegelndes Objekt könnte das IR Licht hauptsächlich in eine bestimme Richtung reflektieren. Die Reichweite ist also immer vom jeweiligen Objekt abhängig! Das ist eine prinzipielle Schwäche von so gut wie allen IR Sensoren (jedenfalls in dieser Preisklasse).&lt;br /&gt;
Trotzdem werden die meisten Hindernisse zuverlässig erkannt und können umfahren werden. Falls das mal nicht klappt, gibt es noch die Stoßstange mit den Tastsensoren und falls auch die nicht richtig getroffen werden, kann der Roboter noch mit den Motorstromsensoren oder den Encodern erkennen, ob die Motoren blockieren (s.u.)!&lt;br /&gt;
Wem das nicht reicht, der könnte zusätzlich z.B. noch Ultraschallsensoren anbringen...&lt;br /&gt;
&lt;br /&gt;
====IR-Kommunikation (IRCOMM)====&lt;br /&gt;
Der RP6 kann über die IR-LEDs links und rechts über der Bumper-Platine Daten zu anderen IR-Empfängern senden.  Es ist z.B. möglich, dass mehrere Roboter ihre Sensorwerte untereinander vergleichen.&lt;br /&gt;
&lt;br /&gt;
====6 Status-LEDs====&lt;br /&gt;
Die Status-LEDs sind vorne links und rechts über den Lichtsensoren auf der Hauptplatine angebracht.&lt;br /&gt;
&lt;br /&gt;
Über die Status-LEDs können Sensorzustände, z.B. des ACS, der Bumper oder der Lichtsensoren, dargestellt werden.&lt;br /&gt;
&lt;br /&gt;
====IR-Sender====&lt;br /&gt;
Über den IR-Sender können Daten zu anderen Geräten übertragen werden.&lt;br /&gt;
&lt;br /&gt;
===Erweiterungssystem (EXPANSION SYSTEM)===&lt;br /&gt;
[[Bild:RP6_EXP.jpg|thumb]]&lt;br /&gt;
Eines der nützlichsten Features des RP6 ist das Erweiterungssystem.&lt;br /&gt;
Man kann den RP6 damit genau so weit ausbauen,&lt;br /&gt;
wie man es benötigt. Aus Kostengründen bietet das&lt;br /&gt;
Basissystem schließlich nur relativ wenig Sensoren. Es sind&lt;br /&gt;
zwar schon mehr als bei vielen anderen Robotern in dieser&lt;br /&gt;
Preisklasse, aber erst mit weiteren Sensoren macht ein Roboter&lt;br /&gt;
so richtig Spaß. Das ACS kann beispielsweise nur grob&lt;br /&gt;
erkennen ob sich ein Hindernis vor dem Roboter befindet.&lt;br /&gt;
Mit Ultraschallsensoren oder besseren zusätzlichen IR Sensoren,&lt;br /&gt;
könnte man aber die Distanz ermitteln und so beispielsweise&lt;br /&gt;
bessere Ausweichmanöver fahren!&lt;br /&gt;
&lt;br /&gt;
Neben Sensoren macht es auch sehr viel Sinn, zusätzliche Controller einzubauen um&lt;br /&gt;
die anfallenden Aufgaben aufteilen zu können. Beispielsweise die RP6 CONTROL M32&lt;br /&gt;
Platine mit einem weiteren MEGA32 Mikrocontroller oder die CCPRO M128.&lt;br /&gt;
&lt;br /&gt;
Das Erweiterungssystem muss natürlich in der Lage sein, viele Erweiterungsmodule&lt;br /&gt;
miteinander zu verbinden, dabei mit wenigen Signalleitungen&lt;br /&gt;
auskommen und eine ausreichend hohe Geschwindigkeit bieten.&lt;br /&gt;
&lt;br /&gt;
Siehe [[I2C]]&lt;br /&gt;
&lt;br /&gt;
===Steuerung (CONTROL SYSTEM)===&lt;br /&gt;
&lt;br /&gt;
====Hauptprozessor (ATMEGA32)====&lt;br /&gt;
[[Bild:RP6_MEGA32.jpg|thumb|Der MEGA32]]&lt;br /&gt;
Der Hauptprozessor ist der ATMEGA32 vom Atmel. Er hat 32KB Flash ROM und 2KB RAM. Der ATMEGA ist mit 8Mhz getaktet, kann also bis zu 8 Millionen Befehle pro Sekunde ausführen. Es sind 32 I/O-Pins  am Controller verfügbar. Die I/O-Pins gehören zu I/O-Ports mit jeweils 8 Pins. Davon gibt es 4: PORTA, PORTB, PORTC und PORTD. Der Controller kann die Ports entweder ein oder ausschalten (Output), oder erkennen, ob Spannung angelegt wurde oder nicht (Input). Es gibt mehrere Module, die verschiedene Aufgaben übernehmen:&lt;br /&gt;
* 3 Timer, einer davon erzeugt die PWM-Signale für die Motoren&lt;br /&gt;
* Die serielle Schnittstelle (UART)&lt;br /&gt;
* Das TWI (Two Wire Interface, also Zweidraht Schnittstelle)&lt;br /&gt;
* Ein ADC (Analog to Digital Converter) mit 8 Eingangskanälen, welche mit 10bit (0-1023) auflösen&lt;br /&gt;
* Drei externe Interrupt Eingänge&lt;br /&gt;
&lt;br /&gt;
Auserdem befindet sich im Microcontroller ein sog. Bootloader, welcher mit dem RP6 Loader kommuniziert und neue Programme in den Speicher lädt.&lt;br /&gt;
&lt;br /&gt;
===Antrieb (DRIVE SYSTEM)===&lt;br /&gt;
[[Bild:RP6_H-Brücke.jpg|thumb|Die H-Brücke]]&lt;br /&gt;
[[Bild:RP6_Tastverhältniss.jpg|thumb]]&lt;br /&gt;
Der Antrieb des RP6 besteht aus zwei Gleichstrom Motoren mit nachgeschaltetem Getriebe,&lt;br /&gt;
über das die beiden Raupenketten angetrieben werden.&lt;br /&gt;
Die Motoren genehmigen sich je nach Belastung&lt;br /&gt;
einen recht hohen Strom und können&lt;br /&gt;
natürlich nicht direkt vom Mikrocontroller&lt;br /&gt;
angesteuert werden. Dazu braucht man&lt;br /&gt;
Leistungstreiber in Form von je einer H-Brücke&lt;br /&gt;
pro Motor. Das grundlegende Prinzip&lt;br /&gt;
ist in der nebenstehenden Abbildung dargestellt.&lt;br /&gt;
Eine H-Brücke besteht aus vier&lt;br /&gt;
&amp;quot;Schaltern&amp;quot;, die in Form eines H's um einen&lt;br /&gt;
Motor angeordnet sind. Nehmen wir mal an,&lt;br /&gt;
zunächst seien alle Schalter aus. Schaltet&lt;br /&gt;
man dann S1 und S4 (Rot) an, liegt eine&lt;br /&gt;
Spannung am Motor an und er dreht sich&lt;br /&gt;
z.B. nach rechts. Schalten wir nun S1 und&lt;br /&gt;
S4 wieder aus und danach S2 und S3 (Grün)&lt;br /&gt;
an, wird die am Motor anliegende Spannung umgepolt und er dreht sich in die entgegen gesetzte&lt;br /&gt;
Richtung, also nach links! Man muss darauf achten, nicht gleichzeitig S1&lt;br /&gt;
und S2, oder S3 und S4 einzuschalten, sonst entstünde ein Kurzschluss und dadurch&lt;br /&gt;
könnten die &amp;quot;Schalter&amp;quot; zerstört werden!&lt;br /&gt;
Natürlich verwenden wir auf dem RP6 keine mechanischen Schalter, sondern sog.&lt;br /&gt;
MOSFETs. Diese schalten beim Anlegen einer genügend hohen Spannung am Eingang&lt;br /&gt;
durch. Die Schaltvorgänge können sehr schnell erfolgen, mehrere Kilohertz sind bei&lt;br /&gt;
unserer Anwendung möglich.&lt;br /&gt;
So kann man also schon mal die Drehrichtung einstellen. Und wie bekommt man den&lt;br /&gt;
Motor nun schneller bzw. langsamer? Ein Elektromotor dreht umso schneller, je höher&lt;br /&gt;
die angelegte Spannung ist. Die Drehzahl kann also über die Spannung eingestellt&lt;br /&gt;
werden - und genau dazu können wir die H-Brücke auch verwenden!&lt;br /&gt;
Die Abbildung verdeutlicht das Prinzip&lt;br /&gt;
nach dem wir vorgehen können.&lt;br /&gt;
Wir erzeugen&lt;br /&gt;
ein Rechtecksignal fester Frequenz,&lt;br /&gt;
bei dem wir das sog. Tastverhältnis&lt;br /&gt;
verändern. Mit &amp;quot;Tastverhältnis&amp;quot; ist das&lt;br /&gt;
Verhältnis von der eingeschalteten zur&lt;br /&gt;
ausgeschalteten Zeit des Signals gemeint.&lt;br /&gt;
Am Motor liegt dann effektiv eine niedrigere,&lt;br /&gt;
mittlere Gleichspannung an, die dem&lt;br /&gt;
Tastverhältnis entspricht. In der Grafik ist&lt;br /&gt;
dies durch eine rote Linie (Ug) und die roten&lt;br /&gt;
Flächen verdeutlicht. Wenn z.B. eine&lt;br /&gt;
Spannung von 7 Volt von den Akkus an&lt;br /&gt;
den Motortreibern anliegt, und diese mit&lt;br /&gt;
einem Tastverhältnis von 50% angesteuert werden, würde die mittlere Spannung in&lt;br /&gt;
etwa bei der Hälfte, also 3.5V liegen! Das stimmt real nicht ganz, aber so kann man&lt;br /&gt;
es sich schon gut und einfach vorstellen.&lt;br /&gt;
Das Antriebssystem ist dank der hohen Untersetzung (~ 1:72) relativ stark und so&lt;br /&gt;
kann der RP6 viel schwerere Lasten tragen als es z.B. der kleine Roboter ASURO&lt;br /&gt;
könnte. Allerdings steigt mit zunehmendem Gewicht natürlich auch der Energiebedarf&lt;br /&gt;
und die Akkus werden schneller leer sein ...&lt;br /&gt;
Im Vergleich mit einem ferngesteuerten Rennwagen o.ä. könnte man denken der RP6&lt;br /&gt;
sei langsam - stimmt auch - das ist jedoch absichtlich so! Der Roboter wird von einem&lt;br /&gt;
Mikrocontroller gesteuert und wenn der Programmierer einen Fehler bei der Programmierung&lt;br /&gt;
gemacht hat, wäre es ungünstig mit 10km/h vor die Wand zu prallen! Bei&lt;br /&gt;
dem eher gemächlichen Tempo des RP6 passiert aber nicht so schnell etwas und nebenbei&lt;br /&gt;
haben die Sensoren mehr Zeit die Umgebung auf Hindernisse zu untersuchen.&lt;br /&gt;
Und da wäre natürlich noch der Vorteil der höheren Belastbarkeit und der viel genaueren&lt;br /&gt;
Geschwindigkeitsregelung!&lt;br /&gt;
&lt;br /&gt;
===Stromversorgung (POWER SUPPLY)===&lt;br /&gt;
[[Bild:RP6_IC1.jpg|thumb]]&lt;br /&gt;
Natürlich benötigt ein Roboter Energie. Diese trägt der RP6 gespeichert in 6 Akkus mit&lt;br /&gt;
sich herum. Die Laufzeit ist durch die Kapazität der Akkus eingeschränkt, denn auch&lt;br /&gt;
wenn die Elektronik verhältnismäßig wenig Energie benötigt, schlucken die Motoren je&lt;br /&gt;
nach Belastung doch ziemlich viel.&lt;br /&gt;
&lt;br /&gt;
Damit die Akkus möglichst lange halten und der Roboter nicht ständig Pause machen&lt;br /&gt;
muss, sollte man ihm daher etwas größere Energiespeicher mit etwa 2500mAh gönnen.&lt;br /&gt;
Kleinere mit 2000mAh oder mehr funktionieren aber auch. Mit guten Akkus kann&lt;br /&gt;
man 3 bis 6 Stunden oder mehr Laufzeit erreichen, abhängig von der Betriebszeit der&lt;br /&gt;
Motoren, deren Belastung und Qualität der Akkus. Die 6 Akkus die notwendig sind,&lt;br /&gt;
haben insgesamt eine Nennspannung von 6x 1.2V = 7.2V. Im Blockdiagramm ist dies&lt;br /&gt;
mit &amp;quot;UB&amp;quot; (= &amp;quot;U-Battery&amp;quot;, U ist der Formelbuchstabe für Spannung) bezeichnet. „Nennspannung&amp;quot;,&lt;br /&gt;
weil sich die Spannung mit der Zeit stark verändert. Voll aufgeladen können&lt;br /&gt;
die Akkus im Leerlauf insgesamt bis zu 8.5V liefern! Diese Spannung sinkt während&lt;br /&gt;
der Entladung ab und schwankt auch je nach Belastung (Motoren an oder aus,&lt;br /&gt;
schnell langsam etc. - wie stark die Spannung schwankt, hängt auch von der Qualität&lt;br /&gt;
der verwendeten Akkus ab. Der Innenwiderstand ist hier die kritische Größe).&lt;br /&gt;
Das ist für Messungen von Sensorwerten und ähnlichem natürlich nicht ohne weiteres&lt;br /&gt;
brauchbar. Noch wichtiger ist jedoch, dass viele der verwendeten Komponenten wie&lt;br /&gt;
z.B. der Mikrocontroller nur auf 5V oder weniger Betriebsspannung ausgelegt sind und&lt;br /&gt;
bei so hohen Spannungen zerstört würden. Die Akku Spannung muss also auf einen&lt;br /&gt;
definierten Wert heruntergeregelt und stabilisiert werden!&lt;br /&gt;
Das übernimmt ein 5V Spannungsregler, der einen Strom von&lt;br /&gt;
maximal 1.5A liefern kann (s. Abb.). Bei 1.5A würde er jedoch&lt;br /&gt;
ziemlich viel Wärme abgeben. Es gibt daher eine große Kühlfläche&lt;br /&gt;
auf der Platine an die der Regler festgeschraubt ist. Über 1A&lt;br /&gt;
sollte der Regler trotz Kühlung besser nur kurzzeitig (also wenige&lt;br /&gt;
Sekunden) belastet werden, wenn man nicht noch einen zusätzlichen&lt;br /&gt;
großen Kühlköper draufschraubt.&lt;br /&gt;
&lt;br /&gt;
Es wird empfohlen, 800mA Dauerlast nicht zu überschreiten! Bei&lt;br /&gt;
so einer Belastung und zusammen mit den Motoren wären die&lt;br /&gt;
Akkus auch recht schnell leer. Im normalen Betrieb ohne ein Erweiterungsboard&lt;br /&gt;
nimmt der Roboter übrigens nicht mehr als 40mA auf (ausser wenn&lt;br /&gt;
das IRCOMM sendet), also überhaupt kein Problem für den Regler und man hat noch&lt;br /&gt;
genug Reserven für die Erweiterungsmodule, die meistens auch nicht mehr als 50mA&lt;br /&gt;
aufnehmen sofern keine Motoren, große LEDs o.ä. daran angeschlossen sind.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Umbau-Optionen==&lt;br /&gt;
Hier soll beschrieben werden, welche Umbau-Optionen es für die RP6 Base gibt. Im Text gibt es Verweise auf den Schaltplan des RP6 (RP6_MAINBOARD.PDF) in der Form: (SP2 B1: Bauteil). Dies bedeutet, dass man das Bauteil auf Blatt 2 des RP6-Schaltplans im Feld B1 finden kann. Beispielhaft sind im folgenden Text Bestell-Nummern der Firma [http://www.conrad.de/ce/ CONRAD] genannt. Natürlich kann man die Teile auch bei anderen Versendern beziehen.&lt;br /&gt;
&lt;br /&gt;
Bei den Materialangaben ist öfter die Rede von &amp;quot;Steckbuchsen mit Litze&amp;quot;. Diese Steckbuchsen mit angelöteter Litze können auf die ein- oder zweireihigen Stiftleisten aufgesteckt werden. Leider gibt es sie nicht (mehr) fertig konfektioniert bei CONRAD. Die einreihigen Steckbuchsen (RM 2,54mm) kann man aber z.B. bei [http://www.elv.de/output/controller.aspx ELV] bekommen: 2-polig (68-016635), 3-polig (68-022503) und 5-polig (68-023073). An sie muss man dann noch Litzen in der entsprechenden Länge selbst anlöten.&lt;br /&gt;
&lt;br /&gt;
===Elko für den IR-Empfänger===&lt;br /&gt;
[[Bild:RP6_C29_TSOP.JPG|thumb|RP6 C29 TSOP]]&lt;br /&gt;
Zur Spannungsstabilisierung kann ein Elko (C29; SP2 E1: C29*) am TSOP 34836 eingelötet werden.&lt;br /&gt;
&lt;br /&gt;
Normalerweise ist dieser Elko nicht erforderlich.&lt;br /&gt;
&lt;br /&gt;
Man braucht dazu:&lt;br /&gt;
* Einen Elektrolyt-Kondensator stehend 10 uF / 16V (C29); RM 2,5mm (445631)&lt;br /&gt;
&lt;br /&gt;
Der Elko kann auch eine geringere Kapazität als 10 uF haben (1 uF bis 4,7 uF reichen auch). Man lötet den Elko auf seinen Platz. Bitte auf die Polung achten: Der Minuspol zeigt nach vorn (in Fahrtrichtung des RP6).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Anschlüsse===&lt;br /&gt;
Hier wird aufgelistet, wo man auf dem RP6 Mainboard Anschlüsse nutzen kann, um sie z.B. zu weiteren Sensoren, zum USRBUS oder (weniger empfehlenswert!) direkt zu EPs oder Erweiterungsplatinen (M32, CCPRO M128) zu führen.&lt;br /&gt;
&lt;br /&gt;
====Analoge Sensoren an ADC0/1====&lt;br /&gt;
[[Bild:RP6_ADC01.JPG|thumb|RP6 ADC0/1]]&lt;br /&gt;
&lt;br /&gt;
Wenn man bis zu zwei analoge Sensoren (z.B. IR-Distanz-Mess-Sensoren Sharp GP2Y0A02YK 185364) direkt an den RP6 anschließen möchte, dann gibt es da zwei 3-polige Kontakte, beschriftet mit VDD/GND/ADCx (x = 0..1). Hier kann man 3-polige Stiftleisten auflöten, an die dann die Sensoren angeschlossen werden.&lt;br /&gt;
&lt;br /&gt;
Man braucht dazu:&lt;br /&gt;
* 1-reihige Stiftleiste RM 2,54mm (z.B. 36-polig 732478)&lt;br /&gt;
* Zwei Keramik-Vielschicht-Kondensatoren 100nF (C27, C28); RM 2,54mm (453099)&lt;br /&gt;
* ENTWEDER einen Elektrolyt-Kondensator stehend 220 uF / 16V (C26); RM 3,5mm (445903)&lt;br /&gt;
* ODER einen Elektrolyt-Kondensator stehend 470 uF / 16V (C26); RM 3,5mm (446211)&lt;br /&gt;
* Zwei 3-polige Steckbuchsen mit Litze zum Anschluß der Sensoren&lt;br /&gt;
&lt;br /&gt;
Man trennt nun von der 1-reihigen Stiftleiste zweimal 3 Kontakte ab und lötet sie auf die weiß umrahmten Kontakte (VDD/GND/ADCx; SP2 B1: ADC0, ADC1), anschließend C27, C28 (SP2 A1: C27*, C28*) auf ihre Plätze und zum Schluß den Elko 220 uF oder 470 uF (C26; SP2 A1: C26*). Der Elko ist nur bei Sensoren mit hohem Strombedarf notwendig, siehe dazu auch Anleitung des RP6, Seite 136! Beim Elko auf die Polung achten: Er muss so sitzen, dass er mit seinem Pluspol in Fahrtrichtung des RP6 (nach vorn) schaut.&lt;br /&gt;
&lt;br /&gt;
Die Sensoren lötet man an die Litzen der 3-poligen Steckbuchsen und steckt diese auf die neuen Kontakte.&lt;br /&gt;
&lt;br /&gt;
Da manche Sensoren einen höheren Stromverbrauch haben, kann man die Stromversorgung an den VDD-Pins der ADC0/1-Stecker abschaltbar machen oder eine separate +5V-Spannung einspeisen. Siehe dazu den Abschnitt &amp;quot;Trennstellen - Getrennte Stromversorgung für ADC0/1&amp;quot; weiter unten!&lt;br /&gt;
&lt;br /&gt;
====ISP (In System Programming)====&lt;br /&gt;
Der ATMEGA32 des RP6 wird standardmäßig über den PROG/UART Stecker programmiert. Dazu befindet sich im Prozessor ein Bootloader-Programm. Wenn man stattdessen oder zusätzlich die ISP-Programmierung mit einem dafür geeigneten ISP-Programmier-Adapter nutzen will, kann man den Adapter an einen (noch einzulötenden) Wannenstecker auf dem RP6 anschließen.&lt;br /&gt;
Vorher sind aber ein paar &amp;quot;Umbauarbeiten&amp;quot; erforderlich.&lt;br /&gt;
&lt;br /&gt;
Man braucht dazu:&lt;br /&gt;
* 1-reihige Stiftleiste RM 2,54mm (z.B. 36-polig 732478)&lt;br /&gt;
* Wannenstecker 2x5-polig gerade RM 2,54mm (z.B. [http://www.reichelt.de./ Reichelt] WSL 10G)&lt;br /&gt;
* Eine SMD-Diode LL 4148 (140902)&lt;br /&gt;
* Eine Codierbrücke (z.B. aus Set 742902)&lt;br /&gt;
&lt;br /&gt;
Zwischen dem XBUS-Stecker und C13 befinden sich 10 Lötpunkte für den ISP-Anschluß, auf die der Wannenstecker gelötet wird, und drei Lötpunkte (beschriftet mit ISP* - BOOTLOAD; SP2 A3: YR1..3), auf die eine 3-polige Stiftleiste gelötet werden muss.&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_ISP.JPG|RP6 ISP]]&lt;br /&gt;
&lt;br /&gt;
Vorher muss eine kurze Leiterbahn zwischen den Lötpunkten BOOTLOAD aufgetrennt werden. Die Leiterbahn befindet sich auf der Lötseite der Platine und muss mit einem scharfen Messer oder einem speziellen Leiterbahn-Unterbrecher zwischen den beiden Lötpunkten unterbrochen werden. Man sollte anschließend mit einem Widerstandsmeßgerät nachmessen: Es sollte keine Verbindung mehr zwischen den Lötpunkten bestehen.&lt;br /&gt;
Man trennt dann von der 1-reihigen Stiftleiste 3 Kontakte ab und lötet sie auf die beschriebenen drei Lötpunkte.&lt;br /&gt;
&lt;br /&gt;
Zum Schluss lötet man noch die Diode LL 4148 (SP2 B3: D11*) auf ihre Lötflächen zwischen R3 und C6. Die Kathode (Strich) der Diode kommt nach vorn (in Fahrtrichtung RP6, bzw. liegt rechts von R3). Wenn man jetzt eine Codierbrücke auf die mit &amp;quot;BOOTLOAD&amp;quot; beschrifteten Pins steckt, bleibt alles unverändert: Die Programmierung erfolgt weiter über den PROG/UART-Stecker mithilfe des Bootloaders im Prozessor.&lt;br /&gt;
Wird die Codierbrücke in Stellung &amp;quot;ISP*&amp;quot; umgesteckt, kann der Prozessor mit ISP programmiert werden.&lt;br /&gt;
&lt;br /&gt;
Vorsicht: Das Bootloader-Programm kann dabei zerstört werden! Es müssen zusätzlich Fusebits des ATMEGA32 verändert werden. Dabei kann der Prozessor im schlimmsten Fall nicht mehr ansprechbar sein. Man sollte diesen Umbau und die ISP-Programmierung nur machen, wenn man genau weiß, was man macht!&lt;br /&gt;
&lt;br /&gt;
Eine Kopie des Bootloaders und eine Kurzanleitung zum Einstellen der Fusebits gibt es hier:&lt;br /&gt;
[http://www.arexx.com/rp6/downloads/RP6BASE_BOOTLOADER.zip RP6_BOOTLOADER]&lt;br /&gt;
&lt;br /&gt;
====IO1..IO4====&lt;br /&gt;
[[Bild:RP6_IO1-4.JPG|thumb|RP6 IO1..IO4]]&lt;br /&gt;
Die Anschlüsse IO1 bis IO4 (SP2 E3: IO1..4) steuern bereits die Status-LEDs 1, 2, 4 und 5 an. Trotzdem kann man sie auch noch mit leichten Einschränkungen als I/O-Pins benutzen. Dazu lötet man zweimal 2 Pins einer 1-reihigen Stiftleiste RM 2,54mm (z.B. 36-polig 732478) auf die IO1/2 und IO3/4 Lötpunkte.&lt;br /&gt;
Hier eine Tabelle, die die Port-Pins zeigt, die IO1..IO4 zugeordnet sind:&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |IO&lt;br /&gt;
 |Status-LED&lt;br /&gt;
 |Port-Pin&lt;br /&gt;
 |-&lt;br /&gt;
 |1&lt;br /&gt;
 |SL1&lt;br /&gt;
 |PC4&lt;br /&gt;
 |-&lt;br /&gt;
 |2&lt;br /&gt;
 |SL2&lt;br /&gt;
 |PC5&lt;br /&gt;
 |-&lt;br /&gt;
 |3&lt;br /&gt;
 |SL4&lt;br /&gt;
 |PB7&lt;br /&gt;
 |-&lt;br /&gt;
 |4&lt;br /&gt;
 |SL5&lt;br /&gt;
 |PB1&lt;br /&gt;
 |-&lt;br /&gt;
|}&lt;br /&gt;
Wie können nun IO1..IO4 genutzt werden?&lt;br /&gt;
&lt;br /&gt;
Als ...&lt;br /&gt;
* Eingang, z.B. für zusätzliche Tastschalter/Bumper&lt;br /&gt;
* Ausgang, z.B. zur Ansteuerung von Treiberstufen, low-current LEDs, ...&lt;br /&gt;
&lt;br /&gt;
Wird ein Anschluß IOx als Eingang verwendet, muss ein Widerstand von 470 Ohm in Reihe mit dem Taster an VDD eingebaut werden, zusätzlich ein Pulldown-Widerstand 100 kOhm. Diese Beschaltung zeigen z.B. an SL6 die Widerstände R43 und R46 (SP2 E4: R43, R46).&lt;br /&gt;
&lt;br /&gt;
Als Ausgang geschaltet sollte an IOx kein hoher Strom entnommen werden: 10mA sind max. zu empfehlen!&lt;br /&gt;
&lt;br /&gt;
====USRBUS====&lt;br /&gt;
Die 14 Kontakte der beiden USRBUS-Stecker sind auf dem RP6 nirgendwo angeschlossen, sondern können über die Lötpunkte Y1..Y14 mit beliebigen Punkten auf dem Mainboard verbunden werden.&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_USRBUS.JPG|thumb|RP6 USRBUS]]&lt;br /&gt;
&lt;br /&gt;
Ich würde auf Y1..Y14 eine Stiftleiste löten, damit die USRBUS-Belegung geändert werden kann.&lt;br /&gt;
&lt;br /&gt;
Man braucht dazu:&lt;br /&gt;
* 2-reihige Stiftleiste RM 2,54mm (z.B. 2x36-polig 742007)&lt;br /&gt;
* Einige Steckbuchsen mit Litze&lt;br /&gt;
&lt;br /&gt;
Man trennt von der 2-reihigen Stiftleiste 2x7 Kontakte ab und lötet sie auf die Punkte Y1..Y14 (SP4 E34: Y1..14, Y1'..Y14') neben den beiden Wannensteckern USRBUS1 (vorn) und USRBUS2 (hinten). Wird der RP6 über Flachkabel mit einem USRBUS-Stecker auf einer RP6 Experimentierplatine (EP) und/oder mit einer Erweiterungsplatine (M32, CCPRO M128) verbunden, dann hat man mit allen mit dem USRBUS verbundenen Platinen eine direkte 14-polige Verbindung,- eben den &amp;quot;User Bus&amp;quot;. Den kann man dann nutzen, wie man will. Auf dem RP6 kann man mit Steckbuchsen die Pins Y1..Y14 mit anderen Pins verbinden.&lt;br /&gt;
&lt;br /&gt;
Beispiel: Verbindet man den Pin &amp;quot;ADC0&amp;quot; mit Y1 des USRBUS1, dann steht der Eingang ADC0 auf allen an den USRBUS1 angeschlossenen Platinen auf dem vorderen Platinenstapel an Y1 zur Verfügung. Man braucht also diesen Eingang nicht über ein eigenes Kabel auf eine EP zu führen, sondern kann dazu den USRBUS nehmen. Dadurch bleibt der Gesamtaufbau auf dem RP6 übersichtlich und komplett trennbar (man braucht nur die Stecker XBUS und USRBUS abzuziehen!).&lt;br /&gt;
&lt;br /&gt;
Wichtig:&lt;br /&gt;
* Man sollte gut dokumentieren, wie man den USRBUS am RP6 (vorn und hinten getrennt!), auf EPs und der M32/M128 benutzt! Sonst kann es bei einer anderen Anordnung von EPs zu USRBUS Konflikten/Kurzschlüssen kommen.&lt;br /&gt;
* Der USRBUS1- und der USRBUS2-Stecker sind auf dem RP6 NICHT miteinander verbunden.&lt;br /&gt;
&lt;br /&gt;
Einen Vorschlag für die Belegung des USRBUS1 (vorn) gibt es z.B. &lt;br /&gt;
[http://www.roboternetz.de/phpBB2/viewtopic.php?t=32549 hier] oder &lt;br /&gt;
[http://www.roboternetz.de/community/showthread.php/47102-Sensor-anschließen?p=453061&amp;amp;viewfull=1#post453061 da.]&lt;br /&gt;
&lt;br /&gt;
====Start/Stop Button====&lt;br /&gt;
[[Bild:RP6_ST.JPG|thumb|RP6 ST]]&lt;br /&gt;
Am mittleren Lochrasterfeld links finden sich zwei Lötpunkte ST1, ST2 (SP2 D2: ST1, ST2), an die weitere Start/Stop Taster (NO, normal offen) parallel zum Taster auf dem RP6 Mainboard angeschlossen werden können.&lt;br /&gt;
&lt;br /&gt;
Zum Anschluß kann man auch Stiftleisten auflöten. ST1, ST2 könnte man auch mit dem USRBUS1 verbinden, wenn man den RP6 z.B. von einer EP aus zurücksetzen möchte.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Serielle Schnittstelle====&lt;br /&gt;
[[Bild:RP6_RST.JPG|thumb|RP6 RST]]&lt;br /&gt;
Neben dem USRBUS1 Stecker befinden sich 5 Lötpunkte mit den Signalen RST, TX, RX, GND, VDD (SP4 AB5: YRX, YTX, YMRESET, YVDD). Hier kann z.B. eine 5-polige Stiftleiste aufgelötet werden, um einen Anschluß an die serielle Schnittstelle zu ermöglichen.&lt;br /&gt;
&lt;br /&gt;
Von diesen 5 Lötpunkten könnte z.B. auch [http://www.roboternetz.de/phpBB2/viewtopic.php?t=32549 so] eine Verbindung zum benachbarten USRBUS1 hergestellt werden, um die serielle Schnittstelle des RP6 auf EPs zu führen.&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;
&lt;br /&gt;
====I2C-Schnittstelle====&lt;br /&gt;
[[Bild:RP6_I2C.JPG|thumb|RP6 I2C]]&lt;br /&gt;
Neben dem XBUS2 Stecker finden sich 5 Lötpunkte mit den Signalen der I2C-Schnittstelle (SP4 D12: Stecker I2C). Dies sind: VDD (Pin 1), GND, SDA, SCL, INT1 (Pin 5). Hier kann z.B. eine 5-polige Stiftleiste aufgelötet werden, um einen Anschluß an die I2C-Schnittstelle zu ermöglichen.&lt;br /&gt;
&lt;br /&gt;
Von diesen 5 Lötpunkten könnte z.B. auch eine Verbindung zum USRBUS1 oder USRBUS2 hergestellt werden, um die I2C-Schnittstelle des RP6 auf EPs zu führen, allerdings hat man SCL, SDA, INT1 ja auch schon am XBUS zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Interrupt-Leitungen====&lt;br /&gt;
[[Bild:RP6_INTx.JPG|thumb|RP6 INTx]]&lt;br /&gt;
Die Interrupt-Leitungen INTU, INT1..3, MRESET (SP4 D34: MRESET, INT1..3, INTU) sind an 5 Lötpunkten neben dem XBUS1 Stecker zu kontaktieren. Hier kann natürlich auch eine 5-polige Stiftleiste aufgelötet werden. In der Regel wird man diese Anschlüsse nicht brauchen, weil sie schon auf dem XBUS zur Verfügung stehen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====VDD/GND/+UB Anschluß====&lt;br /&gt;
[[Bild:RP6_VDDGNDUB.JPG|thumb|RP6 VDD GND +UB]]&lt;br /&gt;
In der Nähe von C4 im hinteren Bereich des Mainboards finden sich Lötpunkte (SP4 E12: YVDDx, YGNDx; SP4 D2 YUBx), an denen man VDD, GND und +UB finden kann.&lt;br /&gt;
&lt;br /&gt;
Wenn man höhere Ströme an VDD (z.B. für Servos) oder +UB (z.B. für einen anderen IRCOMM-Sender oder einen DC-Motor) entnehmen möchte, empfehlen sich diese Lötpunkte, auf die man auch Stiftleisten löten kann.&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;
====EXT Anschluß====&lt;br /&gt;
[[Bild:RP6_EXT.jpg|thumb|RP6 EXT Anschluß]]&lt;br /&gt;
Am hinteren Rand der RP6 Hauptplatine gibt es eine Reihe von 8 Lötpunkten. Dies ist der EXT Anschluß (SP1 C23: Stecker EXT):&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |Pin&lt;br /&gt;
 |Name&lt;br /&gt;
 |Beschreibung&lt;br /&gt;
 |-&lt;br /&gt;
 |1&lt;br /&gt;
 |GND&lt;br /&gt;
 |RP6 und Akku Minuspol (GND)&lt;br /&gt;
 |-&lt;br /&gt;
 |2&lt;br /&gt;
 |CHRG&lt;br /&gt;
 |Anschluß (+) für ext. Ladegerät, identisch mit Pluspol der Ladebuchse (CHARGER, Pin 1). Ladung nur möglich, wenn S1 AUS ist!&lt;br /&gt;
 |-&lt;br /&gt;
 |3&lt;br /&gt;
 |CHRG&lt;br /&gt;
 |wie Pin 2!&lt;br /&gt;
 |-&lt;br /&gt;
 |4&lt;br /&gt;
 | +BAT&lt;br /&gt;
 |Akku Pluspol über Sicherung F1&lt;br /&gt;
 |-&lt;br /&gt;
 |5&lt;br /&gt;
 | +BAT&lt;br /&gt;
 |wie Pin 4!&lt;br /&gt;
 |-&lt;br /&gt;
 |6&lt;br /&gt;
 | +UB&lt;br /&gt;
 |RP6 +UB (+7,2V=, Bereich min. +5,5 bis max. +10V=)&lt;br /&gt;
 |-&lt;br /&gt;
 |7&lt;br /&gt;
 | +UB&lt;br /&gt;
 |wie Pin 6!&lt;br /&gt;
 |-&lt;br /&gt;
 |8&lt;br /&gt;
 |GND&lt;br /&gt;
 |wie Pin 1!&lt;br /&gt;
 |-&lt;br /&gt;
|}&lt;br /&gt;
Man kann hier eine JST XH Stiftleiste gerade, 8-polig, RM 2,5mm ([http://www.conrad.de/ce/de/product/740105/Stiftleiste-gerade-RM-25-mm-Serie-XH-Rastermass-25-mm-Pole-8-Nennstrom-3-A-B8B-XH-A-LFSN-JST-Inhalt-1-St 740105]) auflöten.&lt;br /&gt;
&lt;br /&gt;
Wozu kann man diesen Anschluß nutzen?&lt;br /&gt;
&lt;br /&gt;
Der wesentliche Sinn des EXT Anschlusses besteht darin, andere Arten der Stromversorgung und der Akkuladung zu ermöglichen. Normalerweise schaltet man den RP6 mit S1 an und aus. In Stellung AUS kann der Akku geladen werden, indem man ein Ladegerät an die CHARGER Buchse anschließt. Alternativ kann man das Ladegerät mit seinem Pluspol auch an CHRG (Pins 2, 3) anschließen. Siehe auch den Abschnitt &amp;quot;Trennstellen - EXT Anschluß: Andere Stromversorgung&amp;quot; weiter unten!&lt;br /&gt;
&lt;br /&gt;
An +BAT (Pins 4, 5) kann man direkt (ohne Unterbrechung durch S1) Strom aus dem Akku entnehmen. Die Grenze des Stroms bestimmt die Sicherung F1 (2,5A). Eine weitere Möglichkeit besteht darin, über diesen Anschluß den Akku auch mit einem geeigneten Ladegerät zu LADEN. Hierbei muss man aber darauf achten, dass S1 AUSgeschaltet ist, weil sonst der RP6 über +UB eine unzulässig hohe Spannung bekommen könnte. Wenn man den Akku mit 6 Mignonzellen im RP6 nicht nutzen will (der Akku-Halter bleibt leer!), sondern nur einen externen Akku, wäre der auch mit seinem Pluspol an +BAT über eine eigene Sicherung (2,5A träge) anzuschließen.&lt;br /&gt;
&lt;br /&gt;
+UB (+7,2V) ist die Versorgungsspannung des RP6 (kommt vom Akku-Pluspol über die Sicherung F1 und Schalter S1!). Mit +UB werden die H-Brücken (Motoransteuerung) direkt und die RP6 &amp;quot;Elektronik&amp;quot; über den 5V-Spannungswandler (IC1; SP1 D3: IC1) versorgt (= VDD). An +UB könnte man den RP6 direkt mit einer Spannung von +7,2V versorgen (Absicherung nicht vergessen!), dazu muss S1 AUSgeschaltet sein, damit es keine Konflikte mit dem eingebauten Akku gibt.&lt;br /&gt;
&lt;br /&gt;
Den EXT Anschluß kann man damit nutzen für:&lt;br /&gt;
* Externes Ladegerät&lt;br /&gt;
* Externen Akku&lt;br /&gt;
* Externe Stromversorgung ohne Akku&lt;br /&gt;
* Direkte Stromentnahme aus dem Akku&lt;br /&gt;
* Ergänzungsladung mit Solarzelle&lt;br /&gt;
* Autonome Akkuladung (Ladestation mit Kontakten, Induktionsladung ...)&lt;br /&gt;
* ...&lt;br /&gt;
&lt;br /&gt;
Man sollte gewisse Elektronik-Kenntnisse haben, wenn man die Spannungsversorgung des RP6 verändert. VOR irgendwelchen Veränderungen seht euch auch zuerst den Schaltplan des RP6 (SP1) genau an!&lt;br /&gt;
&lt;br /&gt;
===Mess-/Kontaktpunkte===&lt;br /&gt;
Hier geht es um Kontaktpunkte, an denen man z.B. den Logik-Pegel (High/Low) oder eine analoge Spannung messen kann. Natürlich kann man die Signale auch zur Weiterleitung auf eine EP kontaktieren, dies wird man aber normalerweise nicht brauchen.&lt;br /&gt;
&lt;br /&gt;
====UBAT====&lt;br /&gt;
[[Bild:RP6_UBAT.JPG|thumb|RP6 UBAT]]&lt;br /&gt;
In der Mitte des Mainboards befindet sich ein Kontaktpunkt UBAT (SP1 E1: YUBAT). Dies ist ADC7 des RP6 Microcontrollers.&lt;br /&gt;
&lt;br /&gt;
Man kann hier die analoge Spannung (gegen GND) messen, die vom +UB-Spannungssensor geliefert wird.&lt;br /&gt;
&lt;br /&gt;
Die Spannung ist:&lt;br /&gt;
 UBAT = +UB / 2&lt;br /&gt;
Da der Spannungsteiler (SP1 D12: R1, R2) des +UB-Spannungssensors nicht aus Präzisionswiderständen besteht, kann man für den eigenen RP6 einen Korrekturfaktor berechnen, wenn UBAT deutlich von +UB / 2 (+ UB z.B. gemessen am EXT Stecker, Pins 6 u. 7) abweicht. Damit kann man +UB sehr viel genauer bestimmen.&lt;br /&gt;
&lt;br /&gt;
====ACS====&lt;br /&gt;
[[Bild:RP6_ACS_TSOP.JPG|thumb|RP6 ACS TSOP]]&lt;br /&gt;
Hinter dem TSOP (IC3) befindet sich der Kontaktpunkt ACS (SP2 E1: ACS).&lt;br /&gt;
&lt;br /&gt;
Dies ist der Ausgang des TSOP bzw. Eingang PB2 des RP6 Microcontrollers. Man kann hier das Ausgangssignal des IR-Empfängers abnehmen, z.B. um es mit einem Oszilloskop sichtbar zu machen.&lt;br /&gt;
&lt;br /&gt;
Rechts neben dem TSOP kann man noch die 3 Kontaktpunkte ACS_R, ACS_P und ACS_L (SP2 E2: ACS_P, ACS_R, ACS_L) des ACS-IR-Senders finden.&lt;br /&gt;
&lt;br /&gt;
Folgende Tabelle zeigt die Verbindungen:&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |Kontakt&lt;br /&gt;
 |Microcontroller-Portpin&lt;br /&gt;
 |SP-Verbindung&lt;br /&gt;
 |ACS-IR-Sendediode&lt;br /&gt;
 |-&lt;br /&gt;
 |ACS_P&lt;br /&gt;
 |über R8: ACS_PWRH (PB3), über R9: ACS_PWR (PD6)&lt;br /&gt;
 |SP2: 3&lt;br /&gt;
 |Anoden D1, D2&lt;br /&gt;
 |-&lt;br /&gt;
 |ACS_R&lt;br /&gt;
 |ACS_R (PC7)&lt;br /&gt;
 |SP2: 2&lt;br /&gt;
 |Kathode D1&lt;br /&gt;
 |-&lt;br /&gt;
 |ACS_L&lt;br /&gt;
 |ACS_L/MISO (PB6)&lt;br /&gt;
 |SP1: 5&lt;br /&gt;
 |Kathode D2&lt;br /&gt;
 |-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====IRC====&lt;br /&gt;
[[Bild:RP6_IRC.JPG|thumb|RP6 IRC]] [[Bild:RP6_IRC3.JPG|thumb|RP6 IRC3]]&lt;br /&gt;
Im der Nähe von C13 befinden sich die Lötpunkte IRC, IRC+, IRC- und IRC3 (SP2 D2: YIRC; SP2 CD2: IRC+/-; SP2 C2: IRC3). Zusammen mit der Trennstelle IRC (siehe Abschnitt &amp;quot;Trennstellen - IRC&amp;quot; weiter unten!) kann man diese Kontaktstellen im Umfeld des IRCOMM-Sendedioden Treibers IRLML2502PBF (SP2 CD12: Q5) finden. Am Kontaktpunkt IRC findet sich der Eingang des Treibers bzw. Ausgang PD7 des RP6 Microcontrollers. IRC+, IRC- sind die Kontaktpunkte, an denen die IRCOMM-Sendedioden D3, D4 in Reihe auf der Sensorplatine angeschlossen sind (IRC+ = Anode). IRC3 ist verbunden mit dem Trennstellen-Lötpunkt IRC1 und liegt bei geschlossener Trennstelle IRC an +UB.&lt;br /&gt;
&lt;br /&gt;
Was läßt sich mit diesen Kontaktpunkten machen:&lt;br /&gt;
* Der IRCOMM-Sender ist der zweitgrößte Stromverbraucher des RP6 (nach dem Antrieb). An IRC3 kann daher eine eigene Stromversorgung für die IRCOMM-Sendedioden angeschlossen werden. Dazu muss die Trennstelle IRC zwischen ihren Lötpunkten IRC1, IRC2 aufgetrennt werden.&lt;br /&gt;
* An IRC+, IRC- könnten andere/weitere IRCOMM-Sendedioden angeschlossen werden (Anode an IRC+). Wenn der Vorwiderstand R6 (SP2 C2: R6) der Sendedioden dann nicht mehr paßt (bezügl. Leistung und/oder Widerstandswert), können neue leistungsfähigere IRCOMM-Sendedioden zwischen IRC3 und IRC- (Anode an IRC3) mit einem dafür geeigneten Vorwiderstand angebracht werden.&lt;br /&gt;
&lt;br /&gt;
====LS====&lt;br /&gt;
[[Bild:RP6_LS.JPG|thumb|RP6 LS]]&lt;br /&gt;
Die beiden Lötpunkte LS_L und LS_R (SP2 B12: LS_L, LS_R) neben R7 vorn auf dem Mainboard sind die Ausgänge der Helligkeitssensoren (links und rechts) bzw. die ADC-Eingänge ADC3 und ADC2 des RP6 Microcontrollers.&lt;br /&gt;
&lt;br /&gt;
Hier kann man die Spannungen messen, die den Helligkeitswerten entsprechen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====BP, S====&lt;br /&gt;
[[Bild:RP6_BP_S.JPG|thumb|RP6 BP S]]&lt;br /&gt;
Die Messpunkte BPL, BPR und der Kontaktpunkt S (SP2 E2: S; SP2 E3: BPR; SP2 E4: BPL) befinden sich am vorderen Platinenrand. BPL und BPR sind die Kontakte der Bumper. S ist eine nicht genutzte Verbindung zwischen dem Mainboard und der Sensorplatine, die über die Verbindung SP1, Pin 3, geführt wird (siehe folgende Tabelle!).&lt;br /&gt;
&lt;br /&gt;
Hier eine Tabelle mit der Belegung der 90°-Winkelverbindung SP1, SP2 zwischen dem RP6 Mainboard und der Sensorplatine: &lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |Pin&lt;br /&gt;
 |SP1&lt;br /&gt;
 |SP2&lt;br /&gt;
 |-&lt;br /&gt;
 |1&lt;br /&gt;
 |LS_L  --- Light Sensor Left&lt;br /&gt;
 |IRC-  --- IRCOMM-&lt;br /&gt;
 |-&lt;br /&gt;
 |2&lt;br /&gt;
 |BPL   --- Bumper Left&lt;br /&gt;
 |ACS_R --- ACS Right&lt;br /&gt;
 |-&lt;br /&gt;
 |3&lt;br /&gt;
 |S     --- Free for all&lt;br /&gt;
 |ACS_P --- ACS Power&lt;br /&gt;
 |-&lt;br /&gt;
 |4&lt;br /&gt;
 |GND&lt;br /&gt;
 |VDD&lt;br /&gt;
 |-&lt;br /&gt;
 |5&lt;br /&gt;
 |ACS_L --- ACS Left&lt;br /&gt;
 |BPR   --- Bumper Right&lt;br /&gt;
 |-&lt;br /&gt;
 |6&lt;br /&gt;
 |IRC+  --- IRCOMM+&lt;br /&gt;
 |LS_R  --- Light Sensor Right&lt;br /&gt;
 |-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====ENC====&lt;br /&gt;
[[Bild:RP6_ENC.JPG|thumb|RP6 ENC]]&lt;br /&gt;
Die beiden Messpunkte ENCL, ENCR (SP4 B12: ENCL, ENCR) sind die Ausgänge der Radencoder. ENCL ist verbunden mit PD2 (INT0), ENCR mit PD3 (INT1) des RP6 Microcontrollers.&lt;br /&gt;
&lt;br /&gt;
===Trennstellen===&lt;br /&gt;
An diesen Stellen können Leiterbahnen unterbrochen werden, um Funktionen zu deaktivieren oder anders zu nutzen.&lt;br /&gt;
&lt;br /&gt;
=====Getrennte Stromversorgung für ADC0/1=====&lt;br /&gt;
Wenn man für die analogen Sensoren an ADC0/1 (siehe Abschnitt &amp;quot;Anschlüsse - Analoge Sensoren an ADC0/1&amp;quot; weiter oben!) eine GETRENNTE Stromversorgung vorsehen will und/oder mit Codierbrücke (oder MOSFET) die Stromversorgung abschaltbar machen möchte, muss man erst Vorarbeit leisten.&lt;br /&gt;
[[Bild:RP6_SV.JPG|thumb|RP6 SV]]&lt;br /&gt;
&lt;br /&gt;
Man braucht dazu:&lt;br /&gt;
* 1-reihige Stiftleiste RM 2,54mm (z.B. 36-polig 732478)&lt;br /&gt;
* Evtl.: Eine Codierbrücke (z.B. aus Set 742902)&lt;br /&gt;
* Evtl.: Eine 1-polige Steckbuchse mit Litze zur ext. Stromversorgung&lt;br /&gt;
Es muss eine kurze Leiterbahn zwischen den Punkten &amp;quot;SV1&amp;quot; und &amp;quot;SV2&amp;quot; (SP2 A1: SV1, SV2; zwischen dem PROG/UART- und dem USRBUS1-Stecker) aufgetrennt werden. Die Leiterbahn befindet sich auf der Lötseite der Platine und muss mit einem scharfen Messer oder einem speziellen Leiterbahn-Unterbrecher zwischen den beiden Lötpunkten unterbrochen werden. Man sollte anschließend mit einem Widerstandsmeßgerät zwischen SV1 und SV2 nachmessen: Es sollte keine Verbindung mehr bestehen. Jetzt trennt man von der 1-reihigen Stiftleiste 2 Kontakte ab und lötet sie auf die Punkte SV1/SV2.&lt;br /&gt;
&lt;br /&gt;
Man kann hier zunächst eine Codierbrücke aufstecken. Damit versorgt der RP6 Akku die Sensoren mit 5V an den Pins VDD. Möchte man später eine getrennte 5V-Spannung anlegen, zieht man einfach die Codierbrücke ab und speist die externe 5V-Spannung (mit einer 1-poligen Steckbuchse) am Pin SV2 ein. Achtung: An Pin SV1 wird dann nichts angeschlossen!&lt;br /&gt;
&lt;br /&gt;
Anstelle der Codierbrücke kann man natürlich auch einen MOSFET anschließen, um die Sensoren per Software abschalten zu können.&lt;br /&gt;
&lt;br /&gt;
====ACS====&lt;br /&gt;
[[Bild:RP6_ACS_JP.JPG|thumb|RP6 ACS JP]]&lt;br /&gt;
Die Trennstelle ACS (SP2 E1: YIR1, YIR2; SP2 F1: YIR3) befindet sich neben C29*. Sie besteht aus 3 Lötpunkten, von denen die linken beiden (IRC1, IRC2) verbunden sind. Trennt man die Leiterbahn zwischen diesen Lötpunkten auf und verbindet stattdessen die rechten beiden Lötpunkte (IRC2, IRC3) mit etwas Lötzinn oder mit einem SMD Null Ohm Widerstand, dann ist der IR-Empfänger (TSOP, IC3) dauerhaft EINgeschaltet und kann nicht mehr über das Signal PWRON (PB4) geschaltet werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====IRC====&lt;br /&gt;
[[Bild:RP6_IRC_JP.JPG|thumb|RP6 IRC JP]]&lt;br /&gt;
Die Trennstelle IRC (SP2 C1: IRC1..2) ist eng verknüpft mit den Mess- und Kontaktpunkten des IRCOMM-Senders (siehe Abschnitt &amp;quot;Mess-/Kontaktpunkte - IRC&amp;quot; weiter oben!). Wenn man sie auftrennt, kann man den IRCOMM-Sender mit einer getrennten Stromversorgung anstelle von +UB des RP6 versehen. Dies ist sehr sinnvoll, wenn man diese Funktion häufig verwendet oder sogar noch leistungsfähigere IR-Sendedioden einbaut, denn der IRCOMM-Sender ist der zweitgrößte Stromfresser (nach dem Antrieb) auf dem RP6 (von Erweiterungsplatinen und EPs Marke Eigenbau einmal abgesehen!). Man kann hier natürlich auch eine 2-polige Stiftleiste einlöten, um die Verbindung zu +UB mit einer Codierbrücke trennbar zu machen. Eine getrennte Stromversorgung +7,2V (Bereich: +5,5 .. +10V) kann man an IRC1 einspeisen. IRC1 dieser Trennstelle ist mit dem Kontaktpunkt IRC3 (siehe Abschnitt &amp;quot;Mess-/Kontaktpunkte - IRC&amp;quot; weiter oben!) verbunden. &lt;br /&gt;
&lt;br /&gt;
====RP6 Antrieb====&lt;br /&gt;
Mit den folgenden Trennstellen kann man den RP6 Antrieb (H-Brücken und Motoren) fast komplett vom Rest des RP6 Mainboards abtrennen (es bleibt nur die 5V-Versorgung (VDD) von IC4, T1, T2 bestehen!). Damit ist es möglich, mit dem RP6 Mainboard einen ganz anderen Antrieb (also z.B. ein anderes Roboter-Chassis mit eigenen Motoren und H-Brücken) zu steuern. Umgekehrt könnte man den RP6 Antrieb auch deshalb abtrennen, um ihn durch ein anderes Prozessorsystem (z.B. auch eine M32!) anzusteuern. It's up to you!&lt;br /&gt;
&lt;br /&gt;
=====+UB Power=====&lt;br /&gt;
[[Bild:RP6_HB_Power.jpg|thumb|RP6 HB Power]]&lt;br /&gt;
Der RP6 Antrieb wird direkt aus dem Akku (über S1 und F1) mit 7,2V (+UB) versorgt. Diese Stromversorgung kann man komplett abtrennen. Die Trennstelle (SP3 E34: X) liegt unter der Sicherung F1 (siehe Abb. RP6 HB Power). Zwischen den beiden doppelten Lötflächen befinden sich auf der Lötseite (Unterseite) des Mainboards vier parallele Leiterbahnen, die aufgetrennt werden müssen. Der Pluspol einer externen Spannung zur Versorgung des RP6 Antriebs kann dann mit einer Kabelverbindung an den doppelten Lötflächen (mit einem &amp;quot;+&amp;quot; gekennzeichnet) direkt neben dem Leistungswiderstand (R27) angeschlossen werden. Eine Absicherung dieser Stromversorgung sollte man unbedingt vorsehen (2,5A träge)!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=====Stromsensoren=====&lt;br /&gt;
[[Bild:RP6_CS.JPG|thumb|RP6 CS]]&lt;br /&gt;
Um den Motorstrom der beiden Motoren des RP6 zu messen, wird ein Dual-Operationsverstärker (IC5 = 27M2C; SP3 B23/D23: IC5B/A) eingesetzt. Dieses IC wird über PWRON (PB4) mit Strom versorgt. Die Stromsensoren funktionieren also nicht, wenn PWRON Low-Pegel führt (Befehl powerOFF() der RP6 Library!). Auf dem RP6 Mainboard gibt es eine Trennstelle mit drei Lötflächen (SP3 E34: CS1, CS2, CS3). Sie befindet sich auf dem Mainboard neben C23. Möchte man IC5 nicht mehr über PWRON mit Strom versorgen, sondern über VDD (+5V), dann trennt man die Leiterbahn zwischen den linken beiden Lötpunkten (CS1, CS2) auf und verbindet die rechten beiden Lötpunkte (CS2, CS3) mit etwas Lötzinn oder einem SMD Null Ohm Widerstand. Danach sind die Stromsensoren immer eingeschaltet und können über PWRON nicht mehr geschaltet werden. Alternativ kann man an CS2 auch eine externe Versorgungsspannung (+5V) für IC5 einspeisen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=====DR/MR/ML/DL=====&lt;br /&gt;
[[Bild:RP6_DR_MR_ML_DL.JPG|thumb|RP6 DR MR ML DL]]&lt;br /&gt;
An diesen Trennstellen können die Eingänge der H-Brücke für die Geschwindigkeit (PWM) und Drehrichtung der Motoren von den Portpins des Microcontrollers abgetrennt werden.&lt;br /&gt;
Für den rechten Motor sind dies die Trennstellen MR1/2 und DR1/2 (SP3 A23: MR1/2, DR1/2), für den linken Motor ML1/2 und DL1/2 (SP3 F23: ML1/2, DL1/2).&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |Trennstelle&lt;br /&gt;
 |Portpin&lt;br /&gt;
 |Funktion H-Brücke&lt;br /&gt;
 |-&lt;br /&gt;
 |MR1/2&lt;br /&gt;
 |PD5 (OC1A)&lt;br /&gt;
 |PWM Motor rechts&lt;br /&gt;
 |-&lt;br /&gt;
 |DR1/2&lt;br /&gt;
 |PC3 (TMS)&lt;br /&gt;
 |Fahrtrichtung rechts&lt;br /&gt;
 |-&lt;br /&gt;
 |ML1/2&lt;br /&gt;
 |PD4 (OC1B)&lt;br /&gt;
 |PWM Motor links&lt;br /&gt;
 |-&lt;br /&gt;
 |DL1/2&lt;br /&gt;
 |PC2 (TCK)&lt;br /&gt;
 |Fahrtrichtung links&lt;br /&gt;
 |-&lt;br /&gt;
|}&lt;br /&gt;
Trennt man die Leiterbahn (auf der Lötseite des RP6 Mainboards) zwischen den Lötpunkten der Trennstellen auf, kann man die Eingänge der H-Brücke (Mx1, Dx1) z.B. mit einem anderen Microcontroller verbinden. Die Ausgänge (Portpins) des RP6 Microcontrollers (Mx2, Dx2) können dann anders genutzt werden. Natürlich kann man auf die Lötpunkte dieser Trennstellen auch Stiftleisten löten, um den Anschluß steckbar zu machen.&lt;br /&gt;
&lt;br /&gt;
=====MCR/MCL=====&lt;br /&gt;
[[Bild:RP6_MCR_MCL.JPG|thumb|RP6 MCR MCL]]&lt;br /&gt;
An diesen Trennstellen können die Motorstromsensoren von den ADC-Eingängen des Microcontrollers abgetrennt werden.&lt;br /&gt;
&lt;br /&gt;
Für den rechten Sensor ist dies die Trennstelle MCR1/2 (SP3 A1: MCR1, MCR2), für den linken Sensor MCL1/2 (SP3 E1: MCL1, MCL2).&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |Trennstelle&lt;br /&gt;
 |Portpin&lt;br /&gt;
 |Funktion H-Brücke&lt;br /&gt;
 |-&lt;br /&gt;
 |MCR1/2&lt;br /&gt;
 |PA5 (ADC5)&lt;br /&gt;
 |Motorstrom rechts&lt;br /&gt;
 |-&lt;br /&gt;
 |MCL1/2&lt;br /&gt;
 |PA6 (ADC6)&lt;br /&gt;
 |Motorstrom links&lt;br /&gt;
 |-&lt;br /&gt;
|}&lt;br /&gt;
Trennt man die Leiterbahn (auf der Lötseite des RP6 Mainboards) zwischen den Lötpunkten der Trennstellen auf, kann man die ADC-Eingänge (Portpins) des RP6 Microcontrollers (MCx1) anders nutzen und die Ausgänge der Motorstromsensoren (MCx2) z.B. mit ADC-Eingängen eines anderen Microcontrollers verbinden. Natürlich kann man auf die Lötpunkte dieser Trennstellen auch Stiftleisten löten, um den Anschluß steckbar zu machen.&lt;br /&gt;
&lt;br /&gt;
====PWRON-LED====&lt;br /&gt;
[[Bild:RP6_PWRON_L.JPG|thumb|RP6 PWRON L]]&lt;br /&gt;
Auf dem RP6 Mainboard gibt es eine gelbe LED, die anzeigt, ob PWRON High-Pegel hat. Mit einer Trennstelle neben dieser LED (SP2 D4: YL1, YL2) kann diese LED deaktiviert werden (z.B. um Strom zu sparen).&lt;br /&gt;
&lt;br /&gt;
Dazu trennt man die Leiterbahn zwischen den Lötpunkten auf. Soll die LED wieder aktiviert werden, verbindet man die Lötpunkte wieder mit etwas Lötzinn oder einem SMD Null Ohm Widerstand.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====+UB Sensor====&lt;br /&gt;
[[Bild:RP6_UB.JPG|thumb|RP6 UB]]&lt;br /&gt;
Die Versorgungsspannung +UB des RP6 wird mit dem +UB-Spannungssensor an PA7 (ADC7) gemessen. Will man diesen Spannungssensor mit seinem Eingangsspannungsteiler R1, R2 (SP1 D12: R1, R2) von +UB abtrennen (z.B. um ihn anders zu verwenden), gibt es eine Trennstelle UB1/2 (SP1 D2: UB1, UB2). Trennt man die Leiterbahn auf der Lötseite des RP6 Mainboards zwischen den Lötpunkten auf, kann +UB nicht mehr gemessen werden. Man kann dann den Lötpunkt UB2 mit einem anderen Messpunkt (z.B. mit +BAT) verbinden und dort die Spannung (0..10V) messen. Natürlich kann man auf die Lötpunkte dieser Trennstellen auch Stiftleisten löten, um den Anschluß steckbar zu machen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====EXT Anschluß: Andere Stromversorgung====&lt;br /&gt;
[[Bild:RP6_S1_CHRG.jpg|thumb|RP6 S1 CHRG]]&lt;br /&gt;
Wenn man für den RP6 eine andere Stromversorgung oder Ladeschaltung anschließen will, geht dies gut am EXT Anschluß (SP1 C23: Stecker EXT). Siehe auch den Abschnitt &amp;quot;Anschlüsse - EXT Anschluß&amp;quot; weiter oben! Dann muss der Schalter S1 dauerhaft AUSgeschaltet bleiben und die Verbindung zwischen S1 und CHRG des EXT Anschlusses (SP1 C3: X) unterbrochen werden. Diese Trennstelle befindet sich auf der Lötseite (Unterseite) des RP6 Mainboards etwas versteckt zwischen S1 (Pin 3) und der benachbarten Leiterbahn, die CHRG des EXT Anschlusses mit der Ladebuchse CHARGER (Pin 1 +) verbindet. Dort sind fünf kurze, parallele Leiterbahnen zu unterbrechen (siehe gelbe Markierung in der Abb. RP6 S1 CHRG!). Will man das nicht machen, darf man die Ladebuchse CHARGER auf jeden Fall nicht mehr nutzen!&lt;br /&gt;
&lt;br /&gt;
===Lochraster-Felder===&lt;br /&gt;
Auf diesen Feldern kann man eigene kleine Schaltungen aufbauen. An jedem der sechs Felder stehen VDD (+5V) und GND zur Verfügung (SP4 E12: YVDDx, YGNDx).&lt;br /&gt;
&lt;br /&gt;
Bitte beachten: Die Lochreihen oder -spalten, die mit einer eckigen Klammer &amp;quot;[&amp;quot; markiert sind, liegen auf der Lötseite (Unterseite) direkt auf dem Rahmen des Chassis! Hier können also keine Drähte von unten verlötet werden.&lt;br /&gt;
&lt;br /&gt;
====Vorn links====&lt;br /&gt;
Das kleine Lochrasterfeld vorn links kann z.B. für Beleuchtung (Blinker, Scheinwerfer links) oder auch für einen zusätzlichen Sensor genutzt werden.&lt;br /&gt;
Zur Verfügung steht eine 2-adrige Verbindung zum mittleren Lochrasterfeld links.&lt;br /&gt;
&lt;br /&gt;
In der Nähe dieses Lochrasterfeldes gibt es auch:&lt;br /&gt;
* IO3, IO4 (SP2 E3: IO3, IO4)&lt;br /&gt;
* ADC0 (SP2 B1: ADC0)&lt;br /&gt;
&lt;br /&gt;
====Mitte links====&lt;br /&gt;
[[Bild:RP6_Lochfeld_LM.JPG|thumb|RP6 Lochrasterfeld Mitte links]]&lt;br /&gt;
Das größere Lochrasterfeld Mitte links kann z.B. für eine kleinere Schaltung zur Ansteuerung der Beleuchtung/Sensoren auf den Lochrasterfeldern vorn und hinten links oder für andere Zwecke genutzt werden.&lt;br /&gt;
&lt;br /&gt;
Es stehen hier folgende Anschlüsse zur Verfügung:&lt;br /&gt;
* 2-adrige Verbindung zum Lochrasterfeld vorn links&lt;br /&gt;
* 2-adrige Verbindung zum Lochrasterfeld hinten links&lt;br /&gt;
* ST1/ST2 zum Anschluß weiterer Start/Stop Taster (SP2 D2: ST1/2)&lt;br /&gt;
* PWR (SP2 D2: YPWR1)&lt;br /&gt;
* I2C-Bus (SCL, SDA; SP4 C1: YSCL1, YSDA1)&lt;br /&gt;
* +UB (SP4 D2: YUB1)&lt;br /&gt;
In der Nähe dieses Lochrasterfeldes gibt es auch:&lt;br /&gt;
* Serielle Schnittstelle (RST, TX, RX; SP4 AB5: YRX, YTX, YMRESET, YVDD)&lt;br /&gt;
* USRBUS1 (vorn; SP4 E34: Y1'..Y14')&lt;br /&gt;
&lt;br /&gt;
=====Schaltungsvorschläge=====&lt;br /&gt;
Wie kann z.B. eine Schaltung für Beleuchtungseffekte oder Sensoren aussehen?&lt;br /&gt;
&lt;br /&gt;
Man könnte 8 zusätzliche Schaltkanäle mit dem I2C-Portexpander-IC PCF8574(A)P gewinnen. Dieses IC passt mit wenigen Zusatzteilen auf die mittlere Lochrasterfläche. Angesteuert wird es über den I2C-Bus. Mit den 8 Ausgängen lassen sich einige Beleuchtungseffekte erreichen, die dann über Software schaltbar sind.&lt;br /&gt;
&lt;br /&gt;
Alternativ kann man auch das IC PCF8591P z.B. für den Anschluß von analogen Sensoren verwenden. Auch dieser Baustein wird über I2C angesteuert. Beide ICs sind bei [http://www.reichelt.de./ Reichelt] erhältlich.&lt;br /&gt;
&lt;br /&gt;
Will man nicht den I2C-Bus benutzen, kann man als I/O-Ports IO1..IO4 oder als analoge Eingänge ADC0 und ADC1 verwenden. Auch SCL und SDA stehen als I/O-Ports zur Verfügung, wenn der I2C-Bus im ganzen System nicht verwendet werden soll.&lt;br /&gt;
&lt;br /&gt;
Wichtig für Zusatzschaltungen, die fest auf dem RP6 verlötet werden, sind zwei Aspekte:&lt;br /&gt;
* Wenn sie die Stromversorgung belasten, sollten sie (z.B. über einen Transistor oder MOSFET) abschaltbar sein. Dazu kann man auch das Signal PWR heranziehen, das auf beiden mittleren Lochrasterflächen zur Verfügung steht. Dann kann man mit dem Befehl &amp;quot;powerOFF()&amp;quot; der RP6 Library die Stromversorgung per Software abschalten.&lt;br /&gt;
* Wenn man auch anderweitig genutzte Portpins (SDA, SCL, IO1..IO4, ADC0/1) für die eigene Schaltung einsetzt, sollte man die Verbindung zu den Portpins mit einer abziehbaren Codierbrücke trennbar machen.&lt;br /&gt;
&lt;br /&gt;
====Hinten links====&lt;br /&gt;
Das kleine Lochrasterfeld hinten links kann z.B. für Beleuchtung (Blinker, Rücklicht links) oder auch für einen zusätzlichen Sensor genutzt werden.&lt;br /&gt;
Zur Verfügung steht eine 2-adrige Verbindung zum mittleren Lochrasterfeld links.&lt;br /&gt;
&lt;br /&gt;
In der Nähe dieses Lochrasterfeldes gibt es auch:&lt;br /&gt;
* EXT Anschluß (SP1 C23: Stecker EXT)&lt;br /&gt;
&lt;br /&gt;
====Vorn rechts====&lt;br /&gt;
Das kleine Lochrasterfeld vorn rechts kann z.B. für Beleuchtung (Blinker, Scheinwerfer rechts) oder auch für einen zusätzlichen Sensor genutzt werden.&lt;br /&gt;
Zur Verfügung steht eine 2-adrige Verbindung zum mittleren Lochrasterfeld rechts.&lt;br /&gt;
&lt;br /&gt;
In der Nähe dieses Lochrasterfeldes gibt es auch:&lt;br /&gt;
* IO1, IO2 (SP2 E3: IO1, IO2)&lt;br /&gt;
* ADC1 (SP2 B1: ADC1)&lt;br /&gt;
&lt;br /&gt;
====Mitte rechts====&lt;br /&gt;
Das größere Lochrasterfeld Mitte rechts kann z.B. für eine kleinere Schaltung zur Ansteuerung der Beleuchtung/Sensoren auf den Lochrasterfeldern vorn und hinten rechts oder für andere Zwecke genutzt werden.&lt;br /&gt;
&lt;br /&gt;
Es stehen hier folgende Anschlüsse zur Verfügung:&lt;br /&gt;
* 2-adrige Verbindung zum Lochrasterfeld vorn rechts&lt;br /&gt;
* 2-adrige Verbindung zum Lochrasterfeld hinten rechts&lt;br /&gt;
* PWR (SP2 D2: YPWR2)&lt;br /&gt;
* I2C-Bus (SCL, SDA; SP4 C1: YSCL2, YSDA2)&lt;br /&gt;
* +UB (SP4 D2: YUB2)&lt;br /&gt;
In der Nähe dieses Lochrasterfeldes gibt es auch:&lt;br /&gt;
* Interrupt-Anschluß (INTU, INT1..3, MRESET; SP4 D34: MRESET, INT1..3, INTU)&lt;br /&gt;
* USRBUS2 (hinten; SP4 E34: Y1..Y14)&lt;br /&gt;
&lt;br /&gt;
====Hinten rechts====&lt;br /&gt;
Das kleine Lochrasterfeld hinten rechts kann z.B. für Beleuchtung (Blinker, Rücklicht rechts) oder auch für einen zusätzlichen Sensor genutzt werden.&lt;br /&gt;
Zur Verfügung steht eine 2-adrige Verbindung zum mittleren Lochrasterfeld rechts.&lt;br /&gt;
&lt;br /&gt;
In der Nähe dieses Lochrasterfeldes gibt es auch:&lt;br /&gt;
* EXT Anschluß (SP1 C23: Stecker EXT)&lt;br /&gt;
* Akku-Anschluß (SP1 B3: BATTERY)&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Erweiterungen==&lt;br /&gt;
Auf / An den RP6 könnte man z.B. noch folgendes anbauen / erweitern:&lt;br /&gt;
&lt;br /&gt;
* Einen Greifarm&lt;br /&gt;
* Einen Ultraschallsensor&lt;br /&gt;
* Zwei Lichtsensoren hinten, um die hellste / dunkelste Stelle im Raum besser zu finden&lt;br /&gt;
* Einen digitalen Kompass&lt;br /&gt;
* uvm.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Erweiterungs-Module==&lt;br /&gt;
&lt;br /&gt;
Es sind von Arexx schon einige Erweiterungsmöglichkeiten auf dem Markt. Zum Ersten die Experimentierplatinen ([http://www.conrad.de/ce/de/product/191537/Arexx-RP6-Experimentierplatine 191537] AUSVERKAUFT!), die zum Erstellen von eigenen Schaltungen und Sensoren gedacht sind, und von denen eine schon im Lieferumfang des RP6 enthalten war, das Erweiterungsboard RP6 CONTROL M32 ([http://www.conrad.de/ce/de/product/191550/Arexx-RP6-ATMEGA32-Erweiterungssatz 191550] AUSVERKAUFT!) und die RP6 CCPRO M128 ([http://www.conrad.de/ce/de/product/191563/Arexx-RP6-CC-PRO-MEGA128-Erweiterungssatz 191563]).&lt;br /&gt;
&lt;br /&gt;
Die Boards kann man dann über den I2C Bus mit dem Mainboard kommunizieren lassen.  Es ist sehr sinnvoll, die Module symmetrisch hintereinander zu stapeln und nicht mehr als 6-8 Module zu verbauen, weil der Roboter sonst immer schwerer und langsamer wird. Basierend auf dem Master-Slave System könnte man so bis zu 127 Slaves anschließen. Zudem ist es ratsam, qualitativ hochwertige Akkus und ein Ladegerät mit passendem Stecker zu verwenden, da man ansonsten immer das Mainboard abschrauben müsste um an die Akkus heranzukommen. Für den Fall wurde extra eine Ladebuchse eingebaut.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Experimentierplatine ===&lt;br /&gt;
[[Bild:RP6_Exp.jpg|RP6 Experimentierplatine]]&lt;br /&gt;
&lt;br /&gt;
====Beschreibung====&lt;br /&gt;
Die Experimentier-Platine ist dazu gedacht, eigene Schaltungen auf dem RP6 zu realisieren, und ist seit Mai 2020 bei CONRAD ausverkauft. Sie wird über den I²C-Bus mit den anderen Erweiterungsmodulen verbunden. Ausserdem ist es sinnvoll, die (freien) I/O-Ports (ADC-Kanäle) der RP6 Base, des M32 Erweiterungsmoduls bzw. des CCPRO M128 Moduls über ein [http://www.reichelt.de/?;ACTION=3;LA=444;GROUP=C63;GROUPID=3328;ARTICLE=47637;START=0;SORT=artnr;OFFSET=16;SID=1580faBqwQAQ8AAGY-ZAM7cd511ee04a106a88a359faaac0071e2 10-Pol-Flachbandkabel] mit [http://www.reichelt.de/?ACTION=3;GROUP=C151;GROUPID=3231;ARTICLE=14571;SID=1580faBqwQAQ8AAGY-ZAM7cd511ee04a106a88a359faaac0071e2 Stecker] auf die Experimentierplatine zu führen, weil es übersichtlicher bleibt und keine Kabel lose herumhängen. Auf der Experimentierplatine kann man dann LEDs oder einen Temperatursensor an die I/O-Ports bzw. an die ADC-Kanäle anschießen.&lt;br /&gt;
&lt;br /&gt;
====Technische Daten====&lt;br /&gt;
{|  {{Blauetabelle}} &lt;br /&gt;
|'''Mikrocontroller:'''&lt;br /&gt;
|Keiner&lt;br /&gt;
|-&lt;br /&gt;
|'''Speicher:'''&lt;br /&gt;
|Keiner&amp;lt;br/&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|'''Programmierung:'''&lt;br /&gt;
|Kein Programmieradapter&lt;br /&gt;
|-&lt;br /&gt;
|'''Vorhandene Sensoren:'''&lt;br /&gt;
|Keine&amp;lt;br/&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|'''Vorhandene Aktoren:'''&lt;br /&gt;
|Keine&amp;lt;br/&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|'''Abmessungen:'''&lt;br /&gt;
|(L &amp;amp;times; B &amp;amp;times; H) 112 &amp;amp;times; 90 &amp;amp;times; 10 mm&lt;br /&gt;
|-&lt;br /&gt;
|'''Ausführung:'''&lt;br /&gt;
|Bausatz&lt;br /&gt;
|-&lt;br /&gt;
|'''Stromversorgung:'''&lt;br /&gt;
|6 AA NiMH Akkus (über die RP6 Base)&lt;br /&gt;
|-&lt;br /&gt;
|'''Hersteller:'''&lt;br /&gt;
|Arexx Niederlande&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Schaltungsideen ====&lt;br /&gt;
Auf der / den Experimentierplatinen könnte man z.B. folgendes realisieren:&lt;br /&gt;
&lt;br /&gt;
* eine Kameraschaltung (wie [http://www.rn-wissen.de/index.php/RP6_Kamera_-_Mitmach-Projekt hier] gezeigt)&lt;br /&gt;
* Scheinwerfer, Rücklichter, Blinker etc. (ABER immer mit Vorwiderstand!!!)&lt;br /&gt;
* ein LED-Lauflicht (über I/O-Expander, gibt´s beim [http://www.reichelt.de/?ACTION=3;ARTICLE=14527;PROVID=2402 Reichelt])&lt;br /&gt;
* mehr ADC-Kanäle (über ADC-Expander, einfach mal nach PCF8591 [http://www.google.de/search?q=PCF8591 googlen])&lt;br /&gt;
* eine Wetterstation mit Luftfeuchtemesser, Temperaturfühler und Lichtmesser ([http://www.roboternetz.de/phpBB2/viewtopic.php?t=52298 hier] gibt es eine Wetterstation uvm.)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== RP6 CONTROL M32 Platine ===&lt;br /&gt;
[[Bild:RP6Control_M32.jpg|RP6 CONTROL M32]]&lt;br /&gt;
&lt;br /&gt;
====Beschreibung====&lt;br /&gt;
Auf der M32 ([http://www.conrad.de/ce/de/product/191550/Arexx-RP6-ATMEGA32-Erweiterungssatz 191550]) lassen sich weitere LEDs, Sensoren oder ähnliches anschließen, außerdem steht ein weiterer ATMEGA32 zur Verfügung, welcher sich gut im Master Modus betreiben lässt. Es sind ein Mikrofonsensor, fünf Taster, vier Status-LEDs, ein Display-Port, ein Beeper, 6 freie ADC-Kanäle, 8 freie I/O-Ports, ein Programmieradapter, ein JTAG-Anschluss, eine ISP-Programmierschnittstelle sowie ein freier Steckplatz für ein EEPROM verfügbar.&lt;br /&gt;
&lt;br /&gt;
Seit Ende 2021 ist die M32 bei CONRAD ausverkauft!&lt;br /&gt;
&lt;br /&gt;
====Technische Daten====&lt;br /&gt;
{|  {{Blauetabelle}} &lt;br /&gt;
|'''Mikrocontroller:'''&lt;br /&gt;
|AVR [[ATmega32]]&lt;br /&gt;
|-&lt;br /&gt;
|'''Speicher:'''&lt;br /&gt;
|32 kB [[Flash]]-Speicher, davon 1 kB bereits vom Bootloader belegt&amp;lt;br/&amp;gt;&lt;br /&gt;
2 kB SRAM&amp;lt;br/&amp;gt; &lt;br /&gt;
1 kB [[EEPROM]]&lt;br /&gt;
|-&lt;br /&gt;
|'''Programmierung:'''&lt;br /&gt;
|Über AVR-[[Bootloader]], belegt ca. 1 kB des Flash-Speichers&lt;br /&gt;
|-&lt;br /&gt;
|'''Vorhandene Sensoren:'''&lt;br /&gt;
|1 Mikrofonsensor&amp;lt;br/&amp;gt;&lt;br /&gt;
5 Eingabetaster&amp;lt;br/&amp;gt;&lt;br /&gt;
14 I/O Ports, davon 6 ADC-Wandler&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|'''Vorhandene Aktoren:'''&lt;br /&gt;
|1 Beeper&amp;lt;br/&amp;gt;&lt;br /&gt;
4 Status-LEDs&amp;lt;br/&amp;gt;&lt;br /&gt;
1 LC-Display-Port&amp;lt;br/&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|'''Abmessungen:'''&lt;br /&gt;
|(L &amp;amp;times; B &amp;amp;times; H) 112 &amp;amp;times; 90 &amp;amp;times; 15 mm&lt;br /&gt;
|-&lt;br /&gt;
|'''Ausführung:'''&lt;br /&gt;
|Fertig aufgebautes Erweiterungsmodul&lt;br /&gt;
|-&lt;br /&gt;
|'''Stromversorgung:'''&lt;br /&gt;
|6 AA NiMH Akkus (über die RP6 Base)&lt;br /&gt;
|-&lt;br /&gt;
|'''Hersteller:'''&lt;br /&gt;
|Arexx Niederlande&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Umbau-Optionen ====&lt;br /&gt;
Dieser Absatz soll die Möglichkeiten der RP6 CONTROL M32 Platine (im Folgenden &amp;quot;M32&amp;quot; genannt) auflisten, die es gibt, um auf einfache Weise weitere Anschlüsse oder Verbindungen zu ermöglichen. Nicht beschrieben werden die Anschlußmöglichkeiten, die in Form der vorhandenen Wannenstecker sowieso gegeben sind (z.B. am LCD-, I/O- oder ADC-Stecker). Im Text gibt es Verweise auf den Schaltplan der M32 (RP6_CONTROL_M32.PDF) in der Form: (SP2 B1: Bauteil).  Dies bedeutet, dass man das Bauteil auf Blatt 2 des RP6-M32-Schaltplans im Feld B1 finden kann.&lt;br /&gt;
&lt;br /&gt;
Folgende Möglichkeiten zum Umbau/Ausbau sind vorgesehen:&lt;br /&gt;
* Zweites SPI-EEPROM (IC5)&lt;br /&gt;
* Zwei analoge Sensoren, evtl. mit getrennter Stromversorgung&lt;br /&gt;
* ISP (In System Programming)&lt;br /&gt;
* JTAG-Programmierung&lt;br /&gt;
* USRBUS&lt;br /&gt;
* IRQ-Zuweisung ändern&lt;br /&gt;
* ADC0 und ADC1 anders nutzen&lt;br /&gt;
* Schieberegister kaskadieren&lt;br /&gt;
Im folgenden Text soll beschrieben werden, wie man die weiteren Möglichkeiten nutzen kann. Es wird jeweils erwähnt, was man an Material braucht. Beispielhaft sind da Bestell-Nummern der Firma [http://www.conrad.de/ce/ CONRAD] genannt. Natürlich kann man die Teile auch bei anderen Versendern beziehen. Durch die Nennung der Bestell-Nummer ist das jeweilige Teil aber gut zu identifizieren. Man sollte Löten können und sich bewußt sein, dass ggf. ein Garantieanspruch nicht mehr besteht, wenn man an der Platine gelötet hat.&lt;br /&gt;
&lt;br /&gt;
Bei den Materialangaben ist öfter die Rede von &amp;quot;Steckbuchsen mit Litze&amp;quot;. Diese Steckbuchsen mit angelöteter Litze können auf die ein- oder zweireihigen Stiftleisten aufgesteckt werden. Leider gibt es sie nicht (mehr) fertig konfektioniert bei CONRAD. Die einreihigen Steckbuchsen (RM 2,54mm) kann man aber z.B. bei [http://www.elv.de/output/controller.aspx ELV] bekommen: 2-polig (68-016635), 3-polig (68-022503) und 5-polig (68-023073). An sie muss man dann noch Litzen in der entsprechenden Länge selbst anlöten.&lt;br /&gt;
&lt;br /&gt;
===== Zweites SPI-EEPROM =====&lt;br /&gt;
Es ist sehr einfach, ein zweites SPI-EEPROM (SP1 A1: IC5*) auf der M32 zu nutzen.&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_M32_IC5-Socket.JPG|thumb|Sockel des 2. SPI-EEPROMs]]&lt;br /&gt;
&lt;br /&gt;
Man braucht dazu:&lt;br /&gt;
* Einen IC-Sockel 8-pol DIP für IC5 ([http://www.conrad.de/ce/de/product/189600/IC-FASSUNG-PRAeZISION-8POLIG 189600])&lt;br /&gt;
* Einen Keramik-Vielschicht-Kondensator 100nF (C19); RM 2,54mm ([http://www.conrad.de/ce/de/product/453099/?insert=36&amp;amp;insertNoDeeplink&amp;amp;productname=KONDENSATOR-01-F-KDPU-254-MM 453099])&lt;br /&gt;
* Ein serielles SPI-EEPROM im PDIP8 Gehäuse (IC5)&lt;br /&gt;
Zuerst wird der IC-Sockel eingelötet (Kerbe beachten!), dann C19 (SP1 A1: C19*). Das war's.&lt;br /&gt;
&lt;br /&gt;
Leider gibt es das EEPROM nicht bei den gängigeren Versendern. Bekommen kann man es aber z.B. bei [http://de.farnell.com/jsp/home/homepage.jsp Farnell]. Dort hat das SPI-EEPROM mit 256 kbit die Bezeichnung 25LC256-I/P (1331398). Wenn man es noch größer mag: 25LC1024 (1331392) mit 1024 kbit. SPI-EEPROMs führt inzwischen auch [http://www.reichelt.de./ Reichelt].&lt;br /&gt;
&lt;br /&gt;
'''Programmierung:'''&lt;br /&gt;
&lt;br /&gt;
In die RP6ControlLib.h bitte einfügen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#define SPI_EEPROM2_PAGESIZE 64&lt;br /&gt;
&lt;br /&gt;
uint8_t SPI_EEPROM2_readByte(uint16_t memAddr);&lt;br /&gt;
void SPI_EEPROM2_writeByte(uint16_t memAddr, uint8_t data);&lt;br /&gt;
void SPI_EEPROM2_enableWrite(void);&lt;br /&gt;
void SPI_EEPROM2_disableWrite(void);&lt;br /&gt;
uint8_t SPI_EEPROM2_getStatus(void);&lt;br /&gt;
&lt;br /&gt;
void SPI_EEPROM2_writeBytes(uint16_t startAddr, uint8_t *buffer, uint8_t length);&lt;br /&gt;
void SPI_EEPROM2_readBytes(uint16_t startAddr, uint8_t *buffer, uint8_t length);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Die Konstante SPI_EEPROM2_PAGESIZE ist abhängig von der Art und Größe des EEPROMs. Für ein 256 kbit-EEPROM ist die Seitengröße (pagesize) in der Regel 64, für einen 512 kbit-Typ 128 und für einen 1024 kbit-Typ 256.&lt;br /&gt;
&lt;br /&gt;
In die RP6ControlLib.c bitte einfügen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Second external SPI EEPROM:&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Reads a single Byte from the 2nd external EEPROM.&lt;br /&gt;
 */&lt;br /&gt;
uint8_t SPI_EEPROM2_readByte(uint16_t memAddr)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t data;&lt;br /&gt;
	PORTB &amp;amp;= ~MEM_CS2;&lt;br /&gt;
	writeSPI(SPI_EEPROM_READ);&lt;br /&gt;
	writeWordSPI(memAddr);&lt;br /&gt;
	data = readSPI();&lt;br /&gt;
	PORTB |= MEM_CS2;&lt;br /&gt;
	return data;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Reads &amp;quot;length&amp;quot; Bytes into the Buffer &amp;quot;buffer&amp;quot; from startAdr on. &lt;br /&gt;
 * You can read the complete 2nd EEPROM into a buffer at once - if it is large enough. &lt;br /&gt;
 * (But you only have 2KB SRAM on a MEGA32 ;) )&lt;br /&gt;
 */&lt;br /&gt;
void SPI_EEPROM2_readBytes(uint16_t startAddr, uint8_t *buffer, uint8_t length)&lt;br /&gt;
{&lt;br /&gt;
	PORTB &amp;amp;= ~MEM_CS2;&lt;br /&gt;
	writeSPI(SPI_EEPROM_READ);&lt;br /&gt;
	writeWordSPI(startAddr);&lt;br /&gt;
	readBufferSPI(&amp;amp;buffer[0], length);&lt;br /&gt;
	PORTB |= MEM_CS2;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Enable Write Mode&lt;br /&gt;
 */&lt;br /&gt;
void SPI_EEPROM2_enableWrite(void)&lt;br /&gt;
{&lt;br /&gt;
	PORTB &amp;amp;= ~MEM_CS2;&lt;br /&gt;
	writeSPI(SPI_EEPROM_WREN);&lt;br /&gt;
	PORTB |= MEM_CS2;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Disable Write Mode&lt;br /&gt;
 */&lt;br /&gt;
void SPI_EEPROM2_disableWrite(void)&lt;br /&gt;
{&lt;br /&gt;
	PORTB &amp;amp;= ~MEM_CS2;&lt;br /&gt;
	writeSPI(SPI_EEPROM_WRDI);&lt;br /&gt;
	PORTB |= MEM_CS2;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Write a single data byte to the specified 2nd EEPROM address.&lt;br /&gt;
 */&lt;br /&gt;
void SPI_EEPROM2_writeByte(uint16_t memAddr, uint8_t data)&lt;br /&gt;
{&lt;br /&gt;
	while(SPI_EEPROM2_getStatus() &amp;amp; SPI_EEPROM_STAT_WIP);&lt;br /&gt;
	SPI_EEPROM2_enableWrite();&lt;br /&gt;
	PORTB &amp;amp;= ~MEM_CS2;&lt;br /&gt;
	writeSPI(SPI_EEPROM_WRITE);&lt;br /&gt;
	writeWordSPI(memAddr);&lt;br /&gt;
	writeSPI(data);&lt;br /&gt;
	PORTB |= MEM_CS2;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Write &amp;quot;length&amp;quot; Bytes from the Buffer to the 2nd EEPROM. &lt;br /&gt;
 * YOU CAN ONLY WRITE MAXIMAL [SPI_EEPROM2_PAGESIZE] BYTES AT ONCE!!!&lt;br /&gt;
 * This is the Pagesize!&lt;br /&gt;
 * You can NOT cross a page boundary!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void SPI_EEPROM2_writeBytes(uint16_t startAddr, uint8_t *buffer, uint8_t length)&lt;br /&gt;
{&lt;br /&gt;
	while(SPI_EEPROM2_getStatus() &amp;amp; SPI_EEPROM_STAT_WIP);&lt;br /&gt;
	SPI_EEPROM2_enableWrite();&lt;br /&gt;
	PORTB &amp;amp;= ~MEM_CS2;&lt;br /&gt;
	writeSPI(SPI_EEPROM_WRITE);&lt;br /&gt;
	writeWordSPI(startAddr);&lt;br /&gt;
	writeBufferSPI(&amp;amp;buffer[0], length);&lt;br /&gt;
	PORTB |= MEM_CS2;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Returns EEPROM Status register - for checking if 2nd EEPROM is buisy. &lt;br /&gt;
 * Writing takes about 5ms. &lt;br /&gt;
 */&lt;br /&gt;
uint8_t SPI_EEPROM2_getStatus(void)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t status;&lt;br /&gt;
	PORTB &amp;amp;= ~MEM_CS2;&lt;br /&gt;
	writeSPI(SPI_EEPROM_RDSR);&lt;br /&gt;
	status = readSPI();&lt;br /&gt;
	PORTB |= MEM_CS2;&lt;br /&gt;
	return status;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Hinweis zum 1024 kbit-EEPROM:&lt;br /&gt;
&lt;br /&gt;
Dieses EEPROM benötigt 24-Bit Adressen und muss daher etwas anders angesprochen werden als die &amp;quot;kleineren&amp;quot; Typen bis 512 kbit.&lt;br /&gt;
Die Funktion SPI_EEPROM2_readByte() sieht für ein 1024 kbit-EEPROM z.B. so aus:&lt;br /&gt;
&amp;lt;pre&amp;gt;uint8_t SPI_EEPROM2_readByte(uint32_t memAddr)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t data;&lt;br /&gt;
	PORTB &amp;amp;= ~MEM_CS2;&lt;br /&gt;
	writeSPI(SPI_EEPROM_READ);&lt;br /&gt;
	writeSPI((uint8_t)(memAddr &amp;gt;&amp;gt; 16));&lt;br /&gt;
	writeWordSPI((uint16_t)memAddr);&lt;br /&gt;
	data = readSPI();&lt;br /&gt;
	PORTB |= MEM_CS2;&lt;br /&gt;
	return data;&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
Alle weiteren Funktionen, die EEPROM-Adressen verwenden (SPI_EEPROM2_readBytes, SPI_EEPROM2_writeByte, SPI_EEPROM2_writeBytes), müssen genau so angepasst werden.&lt;br /&gt;
&lt;br /&gt;
===== Anschlüsse =====&lt;br /&gt;
Hier wird aufgelistet, wo man auf der M32 Platine Anschlüsse nutzen kann, um sie z.B. zu weiteren Sensoren, zum USRBUS oder (weniger empfehlenswert!) direkt zu EPs, zur RP6 Base oder zur CCPRO M128 zu führen. &lt;br /&gt;
&lt;br /&gt;
====== Analoge Sensoren an ADC2/3 ======&lt;br /&gt;
[[Bild:RP6_M32_ADC23.JPG|thumb|ADC2 ADC3]]&lt;br /&gt;
Wenn man bis zu zwei analoge Sensoren (z.B. IR-Distanz-Mess-Sensoren Sharp GP2Y0A02YK 185364) direkt an die M32 anschließen möchte, dann gibt es da zwei 3-polige Kontakte, beschriftet mit VDD/GND/ADCx (x = 2..3). Hier kann man 3-polige Stiftleisten auflöten, an die dann die Sensoren angeschlossen werden.&lt;br /&gt;
&lt;br /&gt;
Man braucht dazu:&lt;br /&gt;
* 1-reihige Stiftleiste RM 2,54mm (z.B. 36-polig 732478)&lt;br /&gt;
* Zwei Keramik-Vielschicht-Kondensatoren 100nF (C16, C17); RM 2,54mm (453099)&lt;br /&gt;
* Ein Elektrolyt-Kondensator stehend 470 uF / 16V (C18); RM 3,5mm (446211)&lt;br /&gt;
* Zwei 3-polige Steckbuchsen mit Litze zum Anschluß der Sensoren&lt;br /&gt;
Man trennt von der 1-reihigen Stiftleiste zweimal 3 Kontakte ab und lötet sie auf die weiß umrahmten Kontakte (VDD/GND/ADCx; SP2 C23: ADC2, YGND8, YVDD6, ADC3, YGND7, YVDD5), anschließend C16, C17 (SP2 C1: C16*, C17*) auf ihre Plätze und zum Schluß den Elko 470 uF (C18; SP2 B1: C18*). Beim Elko auf die Polung achten: Er muss genau so sitzen wie sein Nachbar C1 (Minuspol schaut zum Beeper SND).&lt;br /&gt;
&lt;br /&gt;
Die Sensoren lötet man an die Litzen der 3-poligen Steckbuchsen und steckt diese auf die neuen Kontakte.&lt;br /&gt;
&lt;br /&gt;
Da manche Sensoren einen höheren Stromverbrauch haben, kann man die Stromversorgung an den VDD-Pins der ADC2/3-Stecker abschaltbar machen oder eine separate +5V-Spannung einspeisen. Siehe dazu den Abschnitt &amp;quot;Trennstellen - Getrennte Stromversorgung für ADC2/3&amp;quot; weiter unten!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====== ISP (In System Programming) ======&lt;br /&gt;
Der ATMEGA32 der M32 wird standardmäßig über den PROG/UART Stecker programmiert. Dazu befindet sich im Prozessor ein Bootloader-Programm. Wenn man stattdessen oder zusätzlich die ISP-Programmierung mit einem dafür geeigneten ISP-Programmier-Adapter nutzen will, kann man den Adapter an den gewinkelten ISP-Stecker auf der M32 anschließen.&lt;br /&gt;
Vorher sind aber ein paar &amp;quot;Umbauarbeiten&amp;quot; erforderlich.&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_M32_ISP.JPG|thumb|ISP]]&lt;br /&gt;
&lt;br /&gt;
Man braucht dazu:&lt;br /&gt;
* 1-reihige Stiftleiste RM 2,54mm (z.B. 36-polig 732478)&lt;br /&gt;
* Einen SMD-Widerstand 10 kOhm (406376)&lt;br /&gt;
* Eine SMD-Diode LL 4148 (140902)&lt;br /&gt;
* Eine Codierbrücke (z.B. aus Set 742902)&lt;br /&gt;
&lt;br /&gt;
Der SMD-Widerstand wird auf seinen Platz (R1; SP1 A3: R1*) neben dem XBUS2-Stecker gelötet, danach die Diode LL 4148 (D2; SP1 B3: D2*). Die Kathode (Strich) der Diode zeigt in Richtung des Quarzes (X1). Zwischen R1 und C1 befinden sich drei Lötpunkte (beschriftet mit ISP/DEBUG - BOOTLOAD; SP1 A34: YRST1..3), auf die eine 3-polige Stiftleiste gelötet werden muss. Vorher muss eine kurze Leiterbahn zwischen den Lötpunkten BOOTLOAD aufgetrennt werden. Die Leiterbahn befindet sich auf der Lötseite der Platine und muss mit einem scharfen Messer oder einem speziellen Leiterbahn-Unterbrecher zwischen den beiden Lötpunkten unterbrochen werden. Man sollte anschließend mit einem Widerstandsmeßgerät nachmessen: Es sollte keine Verbindung mehr zwischen den Lötpunkten bestehen.&lt;br /&gt;
Man trennt dann von der 1-reihigen Stiftleiste 3 Kontakte ab und lötet sie auf die beschriebenen drei Lötpunkte.&lt;br /&gt;
&lt;br /&gt;
Wenn man jetzt eine Codierbrücke auf die mit &amp;quot;BOOTLOAD&amp;quot; beschrifteten Pins steckt, bleibt alles unverändert: Die Programmierung erfolgt weiter über den PROG/UART-Stecker mithilfe des Bootloaders im Prozessor. Wird die Codierbrücke in Stellung &amp;quot;ISP/DEBUG&amp;quot; umgesteckt, kann der Prozessor mit ISP programmiert werden.&lt;br /&gt;
&lt;br /&gt;
Vorsicht: Das Bootloader-Programm kann dabei zerstört werden! Es müssen zusätzlich Fusebits des ATMEGA32 verändert werden. &lt;br /&gt;
&lt;br /&gt;
Dabei kann der Prozessor im schlimmsten Fall nicht mehr ansprechbar sein. Man sollte diesen Umbau und die ISP-Programmierung nur machen, wenn man genau weiß, was man macht!&lt;br /&gt;
&lt;br /&gt;
Eine Kopie des Bootloaders und eine Kurzanleitung zum Einstellen der Fusebits gibt es hier: &lt;br /&gt;
[http://www.arexx.com/rp6/downloads/RP6_M32_BOOTLOADER.zip RP6_M32_BOOTLOADER]&lt;br /&gt;
&lt;br /&gt;
====== JTAG ======&lt;br /&gt;
[[Bild:RP6_M32_JTAG.JPG|thumb|JTAG]]&lt;br /&gt;
Die Programmierung und ein Debuggen sind auch mit der JTAG-Schnittstelle möglich. Das ist nur zu empfehlen, wenn man Erfahrungen mitbringt, oder der Prozessor der M32 durch eine ISP-Falschprogrammierung z.B. nicht mehr ansprechbar ist.&lt;br /&gt;
Um die JTAG-Schnittstelle nutzen zu können, muss der ISP-Umbau durchgeführt worden sein und die dort beschriebene Codierbrücke auf &amp;quot;ISP/DEBUG&amp;quot; gesteckt sein. Der JTAG-Programmer kann dann an die Lötpunkte &amp;quot;JTAG&amp;quot; zwischen ISP- und I/O-Stecker angeschlossen werden.&lt;br /&gt;
&lt;br /&gt;
Man braucht dazu:&lt;br /&gt;
* 2-reihige Stiftleiste RM 2,54mm (z.B. 2x36-polig 742007)&lt;br /&gt;
Man trennt von der 2-reihigen Stiftleiste 2x5 Kontakte ab und lötet sie auf die 10 JTAG-Lötpunkte (SP2 A12: YTDI, YTDO, YTMS, YTCK, YTRST, YVDD3/4, YGND3/4, YNC). Hier kann jetzt der JTAG-Programmer z.B. mit einem 10-poligen Flachkabel-Stecker angeschlossen werden. Um das JTAG-Interface des ATMEGA32 nutzen zu können, müssen Änderungen an den Fusebits vorgenommen werden.&lt;br /&gt;
&lt;br /&gt;
Vorsicht: Man sollte die JTAG-Programmierung und Fusebit-Manipulationen nur machen, wenn man genau weiß, was man macht!&lt;br /&gt;
&lt;br /&gt;
====== USRBUS ======&lt;br /&gt;
Die 14 Kontakte der beiden USRBUS-Stecker sind auf der M32 nirgendwo angeschlossen, sondern können über die Lötpunkte Y1..Y14 mit beliebigen Punkten auf der M32 verbunden werden.&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_M32_USRBUS.JPG|thumb|USRBUS]]&lt;br /&gt;
&lt;br /&gt;
Ich würde auf Y1..Y14 eine Stiftleiste löten, damit die USRBUS-Belegung geändert werden kann.&lt;br /&gt;
&lt;br /&gt;
Man braucht dazu:&lt;br /&gt;
* 2-reihige Stiftleiste RM 2,54mm (z.B. 2x36-polig 742007)&lt;br /&gt;
* Einige Steckbuchsen mit Litze&lt;br /&gt;
&lt;br /&gt;
Man trennt von der 2-reihigen Stiftleiste 2x7 Kontakte ab und lötet sie auf die Punkte Y1..Y14 (SP2 E3: Y1..Y14) neben dem Wannenstecker USRBUS2. Wird die M32 über Flachkabel mit einem USRBUS-Stecker auf einer RP6 Experimentierplatine (EP) und/oder mit dem RP6 selbst verbunden, dann hat man mit allen mit dem USRBUS verbundenen Platinen eine direkte 14-polige Verbindung,- eben den &amp;quot;User Bus&amp;quot;. Den kann man dann nutzen, wie man will. Auf der M32 kann man mit Steckbuchsen die Pins Y1..Y14 mit anderen Pins verbinden.&lt;br /&gt;
&lt;br /&gt;
Beispiel: Verbindet man den Pin &amp;quot;ADC2&amp;quot; mit Y1 des USRBUS, dann steht der Eingang ADC2 auf allen an den USRBUS angeschlossenen Platinen an Y1 zur Verfügung. Man braucht also diesen Eingang nicht über ein eigenes Kabel auf eine EP zu führen, sondern kann dazu den USRBUS nehmen. Dadurch bleibt der Gesamtaufbau auf dem RP6 übersichtlich und komplett trennbar (man braucht nur die Stecker XBUS und USRBUS abzuziehen!).&lt;br /&gt;
&lt;br /&gt;
Wichtig: Man sollte gut dokumentieren, wie man den USRBUS am RP6 (vorn und hinten getrennt!), auf EPs und der M32/M128 benutzt! Sonst kann es bei einer anderen Anordnung von EPs zu USRBUS Konflikten/Kurzschlüssen kommen.&lt;br /&gt;
&lt;br /&gt;
====== Schieberegister kaskadieren ======&lt;br /&gt;
[[Bild:RP6_M32_SPI.JPG|thumb|SPI]]&lt;br /&gt;
Auf der M32 wird ein 8-Bit Schieberegister-Baustein (IC3: 74HC4094D) dazu gebraucht, vier Status-LEDs (LED1..LED4) und ein LCD (am Stecker LCD) anzusteuern. Durch Schieberegister kann man Port-Pins gewinnen, wenn die Pins des Prozessors nicht ausreichen.&lt;br /&gt;
&lt;br /&gt;
Solche Schieberegister kann man &amp;quot;kaskadieren&amp;quot;, d.h. weitere identische Bausteine einbauen, die weitere Port-Pins zur Verfügung stellen. Wenn man zusätzliche 74HC4094 einsetzen will, wird man das am besten auf einer EP aufbauen. Die Anschlüsse für diese Schieberegister werden auf der M32 an einer 6-poligen Reihe von Lötpunkten (beschriftet mit MISO, STR, MOSI, SCK, QS, QS*; SP1 D3: YQS1/2, YMOSI, YSCK, YSTR, YMISO) links von IC3 zur Verfügung gestellt.&lt;br /&gt;
&lt;br /&gt;
Wenn man diese 6 Signalleitungen auf eine EP führen will, gibt es dafür zwei Möglichkeiten:&lt;br /&gt;
* a) Direkte 6-polige Kabelverbindung von den oben beschriebenen Lötpunkten zur EP&lt;br /&gt;
* b) Nutzung des USRBUS, um die 6 Signale zur EP zu führen&lt;br /&gt;
Wenn man im Abschnitt &amp;quot;[[RP6#USRBUS|USRBUS]]&amp;quot; den entsprechenden Umbau gemacht hat, würde ich b) empfehlen! Man könnte dafür eine 6-polige Stiftleiste auf die o.g. Lötpunkte auflöten und 1:1 z.B. mit den Pins Y4, Y6, Y8, Y10, Y12, Y14 des USRBUS verbinden. Dann kann man auf der EP weitere Schieberegister- und SPI-Bausteine (z.B. SPI-EEPROMs, [http://www.pollin.de/shop/dt/MDU5OTgxOTk-/Bausaetze_Module/Module/Funkmodul_RFM12_433_Sende_Empfangsmodul.html RFM12 Transceiver] o.ä.) aufbauen.&lt;br /&gt;
&lt;br /&gt;
Man braucht dazu:&lt;br /&gt;
* 1-reihige Stiftleiste RM 2,54mm (z.B. 36-polig 732478)&lt;br /&gt;
* Steckbuchsen mit Litze&lt;br /&gt;
Man trennt von der 1-reihigen Stiftleiste 6 Kontakte ab und lötet sie auf die beschriebenen sechs Lötpunkte auf der M32. Mit den Steckbuchsen mit Litze wird dann die Verbindung entweder direkt zur EP (Option a) oder über den USRBUS zur EP (Option b) hergestellt.&lt;br /&gt;
&lt;br /&gt;
====== VDD/GND/+UB Anschluß ======&lt;br /&gt;
[[Bild:RP6_M32_VDDGNDUB.JPG|thumb|RP6 M32 VDD GND +UB]]&lt;br /&gt;
VDD, GND und +UB (SP2 C3: YUB1, YGND1/2/5, YVDD1/2) kann man auf der M32 an diesen Lötpunkten abnehmen.&lt;br /&gt;
&lt;br /&gt;
Natürlich kann man hier auch Stiftleisten auflöten.&lt;br /&gt;
&lt;br /&gt;
Auf der anderen Platinenseite (zwischen dem USRBUS1 und ISP Stecker) befinden sich zusätzlich noch 2 weitere Lötpunkte, an denen man VDD und GND kontaktieren kann.&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;
&lt;br /&gt;
====== Serielle Schnittstelle ======&lt;br /&gt;
[[Bild:RP6_M32_RST.JPG|thumb|RP6 M32 RST]]&lt;br /&gt;
Neben dem PROG/UART Stecker befinden sich 5 Lötpunkte mit den Signalen RST, TX, RX, GND, VDD (SP2 BC3: YRX, YTX, YRST, YVDD, YGND). Hier kann z.B. eine 5-polige Stiftleiste aufgelötet werden, um einen Anschluß an die serielle Schnittstelle zu ermöglichen.&lt;br /&gt;
 &lt;br /&gt;
Von diesen 5 Lötpunkten könnte z.B. auch eine Verbindung zum USRBUS hergestellt werden, um die serielle Schnittstelle der M32 auf EPs zu führen.&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;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====== MEM_CS2 ======&lt;br /&gt;
[[Bild:RP6_M32_MEM_CS2.JPG|thumb|RP6 M32 MEM_CS2]]&lt;br /&gt;
MEM_CS2 (M32 Microcontroller Pin PB1) kann man am IC5-Sockel an Pin 1 (SP1 A1: IC5*, Pin 1) kontaktieren. Falls IC5 nicht eingesetzt werden soll, kann man hier durch Einstecken eines Kabels in Pin 1 des IC5-Sockels PB1 nutzen und z.B. zum USRBUS führen.&lt;br /&gt;
&lt;br /&gt;
===== Mess-/Kontaktpunkte =====&lt;br /&gt;
Hier geht es um Kontaktpunkte, an denen man z.B. den Logik-Pegel (High/Low) oder eine analoge Spannung messen kann. Natürlich kann man die Signale auch zur Weiterleitung auf eine EP kontaktieren, dies wird man aber normalerweise nicht brauchen.&lt;br /&gt;
&lt;br /&gt;
====== M-Signal ======&lt;br /&gt;
[[Bild:RP6_M32_M_SIGNAL.JPG|thumb|RP6 M32 M-Signal]]&lt;br /&gt;
An diesem Messpunkt (SP1 E3: YM_SIGNAL) neben D1 kann man die Ausgangsspannung des Mikrofon-Verstärkers IC4 (SP1 E3: IC4) messen oder z.B. mit einem Oszilloskop darstellen.&lt;br /&gt;
&lt;br /&gt;
===== Trennstellen =====&lt;br /&gt;
An diesen Stellen können Leiterbahnen unterbrochen werden, um Funktionen zu deaktivieren oder anders zu nutzen. &lt;br /&gt;
&lt;br /&gt;
====== Getrennte Stromversorgung für ADC2/3 ======&lt;br /&gt;
Wenn man für die analogen Sensoren an ADC2/3 (siehe Abschnitt &amp;quot;Anschlüsse - Analoge Sensoren an ADC2/3&amp;quot; weiter oben!) eine GETRENNTE Stromversorgung vorsehen will und/oder mit Codierbrücke (oder MOSFET) die Stromversorgung abschaltbar machen möchte, muss man erst Vorarbeit leisten.&lt;br /&gt;
[[Bild:RP6_M32_SV.jpg|thumb|RP6 M32 SV]]&lt;br /&gt;
&lt;br /&gt;
Man braucht dazu:&lt;br /&gt;
* 1-reihige Stiftleiste RM 2,54mm (z.B. 36-polig 732478)&lt;br /&gt;
* Evtl.: Eine Codierbrücke (z.B. aus Set 742902)&lt;br /&gt;
* Evtl.: Eine 1-polige Steckbuchse mit Litze zur ext. Stromversorgung&lt;br /&gt;
Es muss eine kurze Leiterbahn zwischen den Punkten &amp;quot;SV1&amp;quot; und &amp;quot;SV2&amp;quot; (SP2 B2: SV1, SV2) aufgetrennt werden. Die Leiterbahn befindet sich auf der Lötseite der Platine und muss mit einem scharfen Messer oder einem speziellen Leiterbahn-Unterbrecher zwischen den beiden Lötpunkten unterbrochen werden. Man sollte anschließend mit einem Widerstandsmeßgerät zwischen SV1 und SV2 nachmessen: Es sollte keine Verbindung mehr bestehen. Jetzt trennt man von der 1-reihigen Stiftleiste 2 Kontakte ab und lötet sie auf die Punkte SV1/SV2.&lt;br /&gt;
&lt;br /&gt;
Man kann hier zunächst eine Codierbrücke aufstecken. Damit versorgt der RP6 Akku die Sensoren mit 5V an den Pins VDD. Möchte man später eine getrennte 5V-Spannung anlegen, zieht man einfach die Codierbrücke ab und speist die externe 5V-Spannung (mit einer 1-poligen Steckbuchse) am Pin SV2 ein. Achtung: An Pin SV1 wird dann nichts angeschlossen!&lt;br /&gt;
&lt;br /&gt;
Anstelle der Codierbrücke kann man natürlich auch einen MOSFET anschließen, um die Sensoren per Software abschalten zu können.&lt;br /&gt;
&lt;br /&gt;
====== Interrupt-Zuordnung ändern ======&lt;br /&gt;
Am XBUS stehen vier Interrupt-Pins (genannt INT1..INT3, INTU) zur Verfügung. INT1 ist auf der RP6 Base mit PA4 verbunden, auf der M32 mit PD2 (Prozessor INT0), auf der M128 mit PE5 (Prozessor INT5) und auf der [[RP6v2#RP6v2_M256_WiFi_Platine|RP6 M256 WiFi]] mit PJ3 (Prozessor PCINT12). Diese Tabelle zeigt die Verbindung aller Interruptleitungen auf den Platinen (RP6 Base, M32, M128, M256 WiFi) über den XBUS:&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |XBUS Pin&lt;br /&gt;
 |XBUS INTx&lt;br /&gt;
 |RP6 Base Pin&lt;br /&gt;
 |RP6 Base INTx&lt;br /&gt;
 |RP6 M32 Pin&lt;br /&gt;
 |RP6 M32 INTx&lt;br /&gt;
 |RP6 M128 Pin&lt;br /&gt;
 |RP6 M128 INTx&lt;br /&gt;
 |RP6 M256 Pin&lt;br /&gt;
 |RP6 M256 INTx&lt;br /&gt;
 |-&lt;br /&gt;
 |8&lt;br /&gt;
 |INT1&lt;br /&gt;
 |PA4&lt;br /&gt;
 |kein&lt;br /&gt;
 |PD2&lt;br /&gt;
 |INT0&lt;br /&gt;
 |PE5&lt;br /&gt;
 |INT5&lt;br /&gt;
 |PJ3&lt;br /&gt;
 |PCINT12&lt;br /&gt;
 |-&lt;br /&gt;
 |11&lt;br /&gt;
 |INT2&lt;br /&gt;
 |n.c.&lt;br /&gt;
 |&lt;br /&gt;
 |PD3 *&lt;br /&gt;
 |INT1&lt;br /&gt;
 |n.c.&lt;br /&gt;
 |&lt;br /&gt;
 |PJ6&lt;br /&gt;
 |PCINT15&lt;br /&gt;
 |-&lt;br /&gt;
 |9&lt;br /&gt;
 |INT3&lt;br /&gt;
 |n.c.&lt;br /&gt;
 |&lt;br /&gt;
 |PB2 *&lt;br /&gt;
 |INT2&lt;br /&gt;
 |PE6&lt;br /&gt;
 |INT6&lt;br /&gt;
 |PJ5&lt;br /&gt;
 |PCINT14&lt;br /&gt;
 |-&lt;br /&gt;
 |7&lt;br /&gt;
 |INTU&lt;br /&gt;
 |n.c.&lt;br /&gt;
 |&lt;br /&gt;
 |n.c.    *&lt;br /&gt;
 |&lt;br /&gt;
 |n.c.&lt;br /&gt;
 |&lt;br /&gt;
 |PJ4&lt;br /&gt;
 |PCINT13&lt;br /&gt;
 |-&lt;br /&gt;
|}&lt;br /&gt;
'''Zu *:''' Standard-Belegung. Ggf. abhängig von der nachfolgend beschriebenen Interrupt-Zuordnung!&lt;br /&gt;
&lt;br /&gt;
Auf der M32 kann man die Interrupt-Zuordnung für INT2, INT3 und INTU durch drei Codierbrücken (beschriftet mit I2-INTU, INT3-I3, I2-INT2; SP2 A3: YINT2/3/U, YI2_1/2, YI3) ändern.&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_M32_INTx.JPG|thumb|INTx]]&lt;br /&gt;
&lt;br /&gt;
Man braucht dazu:&lt;br /&gt;
* 2-reihige Stiftleiste RM 2,54mm (z.B. 2x36-polig 742007)&lt;br /&gt;
* Drei Codierbrücken (z.B. aus Set 742902)&lt;br /&gt;
Vor dem Auflöten der Stiftleiste müssen zwei kurze Leiterbahnen zwischen zwei Lötpunkten aufgetrennt werden, und zwar zwischen den Lötpunkten INT3-I3 und I2-INT2. Die Leiterbahnen müssen mit einem scharfen Messer oder einem speziellen Leiterbahn-Unterbrecher zwischen den beiden Lötpunkten unterbrochen werden. Man sollte anschließend mit einem Widerstandsmeßgerät nachmessen: Es sollte keine Verbindung mehr zwischen INT3-I3 und I2-INT2 bestehen. Man trennt dann von der 2-reihigen Stiftleiste 2x3 Kontakte ab und lötet sie auf das weiß umrahmte Feld mit der o.g. Beschriftung.&lt;br /&gt;
&lt;br /&gt;
Hier kann man auf INT3-I3 und I2-INT2 je eine Codierbrücke aufstecken, wenn man die Standard-Belegung beibehalten will. Steckt man auf I2-INTU eine Codierbrücke, dann ist INTU des XBUS mit Pin PD3 (I2) der M32 verbunden.&lt;br /&gt;
&lt;br /&gt;
'''Hinweis:''' Man kann auf die 6-polige Stiftleiste auch Codierbrücken QUER zur eigentlichen (horizontalen) Richtung aufsetzen. Dadurch kann jede der 3 Interruptleitungen des XBUS (INT2, INT3, INTU) mit jedem der 2 Interrupt Pins der M32 (PD3, PB2) verbunden werden.&lt;br /&gt;
&lt;br /&gt;
Wenn man keine der Codierbrücken aufsteckt, sind die Pins PD3 (I2) und PB2 (I3) des M32-Prozessors nicht mehr mit dem XBUS verbunden und können anders verwendet werden. Auf der M32 kann man dann z.B. auch andere Verbindungen zum XBUS herstellen, indem man auf die Pins INT2, INT3 oder INTU Kabelverbindungen aufsteckt.&lt;br /&gt;
&lt;br /&gt;
====== ADC0 und ADC1 frei nutzen ======&lt;br /&gt;
Auf der M32 ist ADC0 fest mit dem Mikrofon (MIC) und ADC1 mit den Tastern T1..T5 (KEYPAD) verbunden. Wenn man diese ADC-Eingänge für andere Sensoren benötigt, kann man das Mikrofon und die Taster von den Eingängen abtrennen.&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_M32_MIC_KEY.JPG|thumb|MIC_KEYPAD]]&lt;br /&gt;
&lt;br /&gt;
Man braucht dazu:&lt;br /&gt;
* 1-reihige Stiftleiste RM 2,54mm (z.B. 36-polig 732478)&lt;br /&gt;
* Eine Codierbrücke (z.B. aus Set 742902)&lt;br /&gt;
&lt;br /&gt;
MIC/ADC0:&lt;br /&gt;
Es muss eine kurze Leiterbahn zwischen zwei Lötpunkten aufgetrennt werden, die sich zwischen R2 und C19 befinden (SP1 D4: YM1, YM2). Die Leiterbahn muss mit einem scharfen Messer oder einem speziellen Leiterbahn-Unterbrecher zwischen den beiden Lötpunkten unterbrochen werden. Man sollte anschließend mit einem Widerstandsmeßgerät nachmessen: Es sollte keine Verbindung mehr bestehen. Vorsicht: Nicht R2 beschädigen! Damit ist das Mikrofon auf der M32 ohne Funktion und ADC0 kann anders genutzt werden. ADC0 ist dann am oberen Lötpunkt zwischen R2 und C19 verfügbar, dort müßte eine Kabelverbindung angelötet werden.&lt;br /&gt;
Soll das Mikrofon später doch wieder an ADC0 angeschlossen werden, verbindet man die beiden Lötpunkte zwischen R2 und C19 einfach mit etwas Lötzinn oder mit einem SMD Null Ohm Widerstand.&lt;br /&gt;
&lt;br /&gt;
KEYPAD/ADC1:&lt;br /&gt;
Es muss eine kurze Leiterbahn zwischen zwei Lötpunkten aufgetrennt werden, die sich unterhalb von R15 befinden (SP1 D2: YKP1, YKP2). Die Leiterbahn befindet sich auf der Lötseite der Platine und muss mit einem scharfen Messer oder einem speziellen Leiterbahn-Unterbrecher zwischen den beiden Lötpunkten unterbrochen werden. Man sollte anschließend mit einem Widerstandsmeßgerät nachmessen: Es sollte keine Verbindung mehr bestehen. Jetzt trennt man von der 1-reihigen Stiftleiste 2 Kontakte ab und lötet sie auf die beiden Punkte unterhalb von R15. Hier kann man jetzt eine Codierbrücke aufstecken, wenn man die Taster weiter benutzen will. Wenn die Brücke abgezogen ist, sind die Taster ohne Funktion und ADC1 kann anders genutzt werden. ADC1 ist dann am linken Pin der 2-poligen Stiftleiste unterhalb von R15 verfügbar.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== RP6 CCPRO M128 Platine===&lt;br /&gt;
&lt;br /&gt;
[[Bild:CCPRO M128 k-1-.jpg|Das CCPRO M128]]&lt;br /&gt;
&lt;br /&gt;
====Beschreibung====&lt;br /&gt;
Die M128 (191563) ergänzt das RP6 Roboter System um einen leistungsfähigen ATMEGA 128 Prozessor.&lt;br /&gt;
Es sind ein I²C Temperatursensor; 19 I/O-Ports, davon 8 ADCs, 3 PWM (Servos) und 2 I/Os für einen UART; 1 Beeper; 5 Status-LEDs; 1 LC-Display-Port sowie ein freier Steckplatz für ein EEPROM verfügbar.&lt;br /&gt;
&lt;br /&gt;
====Technische Daten====&lt;br /&gt;
{|  {{Blauetabelle}} &lt;br /&gt;
|'''Mikrocontroller:'''&lt;br /&gt;
|Steckplatz für ein C-Control PRO MEGA128 Modul mit einem ATMEGA 128 ([https://www.conrad.de/de/p/c-control-prozessor-unit-mega-128-pro-198219.html 198219])&lt;br /&gt;
|-&lt;br /&gt;
|'''Speicher:'''&lt;br /&gt;
|128 kB [[Flash]]-Speicher, davon 4 kB bereits vom Bootloader belegt&amp;lt;br/&amp;gt;&lt;br /&gt;
4 kB SRAM intern&amp;lt;br/&amp;gt; &lt;br /&gt;
64 kB SRAM extern&amp;lt;br/&amp;gt;&lt;br /&gt;
4 kB [[EEPROM]]&lt;br /&gt;
|-&lt;br /&gt;
|'''Programmierung:'''&lt;br /&gt;
|Über CCPRO-IDE&lt;br /&gt;
|-&lt;br /&gt;
|'''Vorhandene Sensoren:'''&lt;br /&gt;
|1 12bit I²C Temperatursensor &amp;lt;br/&amp;gt;&lt;br /&gt;
19 I/O-Ports, davon 8 ADCs, 3 PWM (Servos) und 2 I/Os für eine weitere serielle Schnittstelle (UART)&lt;br /&gt;
|-&lt;br /&gt;
|'''Vorhandene Aktoren:'''&lt;br /&gt;
|1 Beeper&amp;lt;br/&amp;gt;&lt;br /&gt;
5 Status-LEDs&amp;lt;br/&amp;gt;&lt;br /&gt;
1 LC-Display-Port&amp;lt;br/&amp;gt;&lt;br /&gt;
1 Sockel für ein I²C-Bus EEPROM vom Typ 24(L)Cxxx&lt;br /&gt;
|-&lt;br /&gt;
|'''Abmessungen:'''&lt;br /&gt;
|(L &amp;amp;times; B &amp;amp;times; H) 112 &amp;amp;times; 90 &amp;amp;times; 21 mm&lt;br /&gt;
|-&lt;br /&gt;
|'''Ausführung:'''&lt;br /&gt;
|Fertig aufgebautes Erweiterungsmodul&lt;br /&gt;
|-&lt;br /&gt;
|'''Stromversorgung:'''&lt;br /&gt;
|6 AA NiMH Akkus (über die RP6 Base)&lt;br /&gt;
|-&lt;br /&gt;
|'''Hersteller:'''&lt;br /&gt;
|Arexx Niederlande&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Umbauoptionen====&lt;br /&gt;
Auf der CCPRO M128 ([http://www.conrad.de/ce/de/product/191563/Arexx-RP6-CC-PRO-MEGA128-Erweiterungssatz 191563]) kann leider nicht so viel umgebaut werden:&lt;br /&gt;
&lt;br /&gt;
* I2C-EEPROM&lt;br /&gt;
* Freie Nutzung von PORTA* und PORTC*&lt;br /&gt;
* USRBUS&lt;br /&gt;
* A16-/PD4-Nutzung&lt;br /&gt;
&lt;br /&gt;
Im Text gibt es Verweise auf den Schaltplan der CCPRO M128 (RP6_CCPRO_M128_Schematic.PDF) in der Form: (SP2 B1: Bauteil).  Dies bedeutet, dass man das Bauteil auf Blatt 2 des M128-Schaltplans im Feld B1 finden kann.&lt;br /&gt;
&lt;br /&gt;
Bei den Materialangaben ist öfter die Rede von &amp;quot;Steckbuchsen mit Litze&amp;quot;. Diese Steckbuchsen mit angelöteter Litze können auf die ein- oder zweireihigen Stiftleisten aufgesteckt werden. Leider gibt es sie nicht (mehr) fertig konfektioniert bei CONRAD. Die einreihigen Steckbuchsen (RM 2,54mm) kann man aber z.B. bei [http://www.elv.de/output/controller.aspx ELV] bekommen: 2-polig (68-016635), 3-polig (68-022503) und 5-polig (68-023073). An sie muss man dann noch Litzen in der entsprechenden Länge selbst anlöten.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=====I2C-EEPROM=====&lt;br /&gt;
Zum Einsetzen eines I2C-EEPROMS (IC6; SP2 C1: IC6) braucht man nichts umzubauen. Man kauft einfach ein passendes EEPROM des Typs 24(L)Cxxxx-P und setzt es auf seinen Sockel, Kerbe zum oberen Platinenrand.&lt;br /&gt;
&lt;br /&gt;
Mögliche Typen (erhältlich z.B. bei [http://www.digikey.de/ Digi-Key] oder bei [http://www.reichelt.de./ Reichelt]):&lt;br /&gt;
* AT24C128  (AT24C128-10PU-2.7-ND)&lt;br /&gt;
* AT24C256  (AT24C256-10PU-2.7-ND)&lt;br /&gt;
* AT24C512  (AT24C512-10PU-2.7-ND)&lt;br /&gt;
* AT24C1024 (AT24C1024-10PI-2.7-ND)&lt;br /&gt;
&lt;br /&gt;
=====Anschlüsse=====&lt;br /&gt;
Hier wird aufgelistet, wo man auf der M128 Platine Anschlüsse nutzen kann, um sie z.B. zu weiteren Sensoren, zum USRBUS oder (weniger empfehlenswert!) direkt zu EPs, zur RP6 Base oder zur M32 zu führen. &lt;br /&gt;
&lt;br /&gt;
======Freie Nutzung von PORTA* und PORTC*======&lt;br /&gt;
Um PORTA* und PORTC* frei nutzen zu können (für weitere I/O-Ports), muss man auf das externe SRAM verzichten, was nicht sehr ratsam ist. Mehr I/O-Ports kann man alternativ durch I/O Expander gewinnen. Falls man das SRAM trotzdem deaktivieren will, hier die Anleitung.&lt;br /&gt;
&lt;br /&gt;
Für den Umbau braucht man:&lt;br /&gt;
* Wannenstecker 2x5-polig gerade RM 2,54mm (z.B. [http://www.reichelt.de./ Reichelt] WSL 10G)&lt;br /&gt;
* 1-reihige Stiftleiste RM 2,54mm (z.B. 36-polig 732478)&lt;br /&gt;
* Eine Codierbrücke (z.B. aus Set 742902)&lt;br /&gt;
[[Bild:RP6_M128_PortA.JPG|thumb|PORTA*]]&lt;br /&gt;
&lt;br /&gt;
Für die Bestückung von PORTA* (SP2 AB2: Stecker PORTA*) lötet man den Wannenstecker hier (siehe Abb. PORTA*) auf.&lt;br /&gt;
[[Bild:RP6_M128_PortC.JPG|thumb|PORTC*]]&lt;br /&gt;
&lt;br /&gt;
Für die Bestückung von PORTC* (SP1 A2: PC0..7, YGND1) trennt man von der 1-reihigen Stiftleiste 9 Kontakte ab und lötet sie auf die PORTC*-Lötpunkte (siehe Abb. PORTC*).&lt;br /&gt;
&lt;br /&gt;
Dann muss noch der SRAM-Enable Jumper (SP1 EF1: Y27..29) bestückt werden:&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_M128_EN_SRAM.JPG|EN_SRAM]]&lt;br /&gt;
&lt;br /&gt;
Man trennt von der 1-reihigen Stiftleiste 3 Kontakte ab und lötet sie auf die abgebildeten Lötpunkte. Vorher muss eine Leiterbahn auf der Lötseite der Platine zwischen den ENABLE-Lötpunkten aufgetrennt werden.&lt;br /&gt;
Wenn das SRAM wie bisher genutzt werden soll, steckt man die Codierbrücke auf die Stellung &amp;quot;ENABLE&amp;quot;. Will man stattdessen Port A und Port C frei nutzen (und damit auf SRAM verzichten!), kommt die Codierbrücke auf &amp;quot;DISABLE&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
======USRBUS======&lt;br /&gt;
Auf die 14 Kontakte neben dem Wannenstecker USRBUS2 ist noch nichts gelötet.&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_M128_USRBUS.JPG|thumb|USRBUS]]&lt;br /&gt;
&lt;br /&gt;
Ich würde auf Y1..Y14 eine Stiftleiste löten, damit die USRBUS-Belegung geändert werden kann.&lt;br /&gt;
&lt;br /&gt;
Man braucht dazu:&lt;br /&gt;
* 2-reihige Stiftleiste RM 2,54mm (z.B. 2x36-polig 742007)&lt;br /&gt;
* Einige Steckbuchsen mit Litze&lt;br /&gt;
&lt;br /&gt;
Man trennt von der 2-reihigen Stiftleiste 2x7 Kontakte ab und lötet sie auf die Punkte Y1..Y14 (SP2 E234: Y1..Y14) neben dem Wannenstecker USRBUS2. Wird die M128 über Flachkabel mit einem USRBUS-Stecker auf einer RP6 Experimentierplatine (EP) und/oder mit dem RP6 selbst verbunden, dann hat man mit allen mit dem USRBUS verbundenen Platinen eine direkte 14-polige Verbindung,- eben den &amp;quot;User Bus&amp;quot;. Den kann man dann nutzen, wie man will. Auf der M128 kann man mit Steckbuchsen die Pins Y1..Y14 mit anderen Pins verbinden.&lt;br /&gt;
&lt;br /&gt;
Beispiel: Verbindet man den Pin &amp;quot;ADC4&amp;quot; mit Y1 des USRBUS, dann steht der Eingang ADC4 auf allen an den USRBUS angeschlossenen Platinen an Y1 zur Verfügung. Man braucht also diesen Eingang nicht über ein eigenes Kabel auf eine EP zu führen, sondern kann dazu den USRBUS nehmen. Dadurch bleibt der Gesamtaufbau auf dem RP6 übersichtlich und komplett trennbar (man braucht nur die Stecker XBUS und USRBUS abzuziehen!).&lt;br /&gt;
&lt;br /&gt;
Wichtig: Man sollte gut dokumentieren, wie man den USRBUS am RP6 (vorn und hinten getrennt!), auf EPs und der M128 benutzt! Sonst kann es bei einer anderen Anordnung von EPs zu USRBUS Konflikten/Kurzschlüssen kommen.&lt;br /&gt;
&lt;br /&gt;
======IC5 ALERT======&lt;br /&gt;
[[Bild:RP6_M128_IC5_ALERT.JPG|thumb|IC5 ALERT]]&lt;br /&gt;
Dieser Lötpunkt (SP2 C2: AL) neben IC5 ist der Anschluß ALERT (Pin 3) des I2C-Temperatursensors TCN75A (SP2 C2: IC5).&lt;br /&gt;
&lt;br /&gt;
Dies ist ein Open-Drain Ausgang, der ein Alarm-Signal ausgibt, wenn die Temperatur die eingestellten Grenzen über-/unterschreitet (siehe auch Datenblatt des Sensors (TCN75A.pdf), Abschnitt 5.3.4!). Wenn man ALERT auf einen Eingang des Microcontrollers führen will, muß man auch noch einen Pullup-Widerstand vorsehen oder den internen Pullup des uC-Eingangs aktivieren.&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;
======VDD/GND Anschluß======&lt;br /&gt;
[[Bild:RP6_M128_VDDGND.JPG|thumb|VDD GND]]&lt;br /&gt;
Auf der CCPRO M128 gibt es 2 Lötpunkte (SP1 E34: YVDD3, YGND4) zwischen R5 und C7 bzw. direkt neben der Codierbrücke (SP1 E3: YL9, YL10) zum Deaktivieren von LED5.&lt;br /&gt;
&lt;br /&gt;
Hier könnte man VDD und GND kontaktieren. VDD ist der Lötpunkt, der näher an R5 liegt.&lt;br /&gt;
&lt;br /&gt;
=====Trennstellen=====&lt;br /&gt;
An diesen Stellen können Leiterbahnen unterbrochen werden, um Funktionen zu deaktivieren oder anders zu nutzen. &lt;br /&gt;
&lt;br /&gt;
======A16-/PD4-Nutzung======&lt;br /&gt;
&lt;br /&gt;
[[Bild:v2RP6_M128_A16.JPG|thumb|A16/PD4]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Auf der CCPRO M128 gibt es ein 3-poliges Feld von Lötpunkten (SP2 AB1: PD4, A16, GND) unter dem CCPRO MEGA128 Modul (IC1). Standardmässig ist A16 des SRAM (IC3) hier auf GND gelegt. Damit kann man PD4 des Prozessors (ICP1) frei nutzen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Will man A16 des SRAM mit PD4 schaltbar machen, muss man eine Leiterbahn auf der Bestückungsseite zwischen den oberen zwei der drei Lötpunkte auftrennen und die anderen (unteren) beiden Lötpunkte mit etwas Lötzinn oder einem SMD Null Ohm Widerstand verbinden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der Sinn dieses Umbaus besteht darin, dass man danach anstelle von 64kB nun die vollen 128kB SRAM des IC3 adressieren kann. Man muss dann aber PD4 selbst schalten, da C-Control PRO ab Version 1.50 nur 64kB ext. SRAM ansteuern kann. Immerhin könnte man dann 2 Blöcke à je 64kB nutzen und mit PD4 zwischen beiden Blöcken umschalten.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ob CCPRO damit klar kommt: Wohl kaum! Ich würde daher diesen Umbau nicht durchführen.&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Zubehör und Ersatzteile ==&lt;br /&gt;
Von [http://www.conrad.de/ce/ CONRAD] gibt es z.B. &lt;br /&gt;
&lt;br /&gt;
* das LC- ([http://www.conrad.de/ce/de/product/190911/LC-DISPLAY-16-X-2-KONFEKTIONIERT 190911] AUSVERKAUFT!) oder Backlight-Display ([http://www.conrad.de/ce/de/product/191621/DISPLAY-RP5RP6-BLAU-MIT-BACKLIGHT 191621] AUSVERKAUFT!), welche an die M32, an die CCPRO M128 und an die M256 WiFi angeschlossen werden können,&lt;br /&gt;
* einen IR-Ball ([http://www.conrad.de/ce/de/product/191437/INFRAROT-BALL-FUeR-ROBOTER-FUssBALL 191437] AUSVERKAUFT!),&lt;br /&gt;
* einen Graustufen-Boden-Sensor ([http://www.conrad.de/ce/de/product/191599/GRAUSTUFEN-BODEN-SENSOR-FUeR-FUssBALLROBOT 191599] AUSVERKAUFT!),&lt;br /&gt;
* eine IR-Fernbedienung Promo 8 ([http://www.conrad.de/ce/de/product/340720/PROMO-8-UNIVERSALFERNBEDIENUNG 340720] AUSVERKAUFT!) oder Vivanco UR 89 ([http://www.conrad.de/ce/de/product/351013/VivancoUR-89-Fernbedienung-8-Geraete 351013] AUSVERKAUFT!),&lt;br /&gt;
* Ersatzräder ([http://www.conrad.de/ce/de/product/191307/ANTRIEBSRAD-RP5RP6 191307] AUSVERKAUFT!),&lt;br /&gt;
* Ersatzzahnräder ([http://www.conrad.de/ce/de/product/191346/SCHRAeG-ZAHNRAeDERSATZ-RP5RP6 191346]) und&lt;br /&gt;
* Ersatzraupen ([http://www.conrad.de/ce/de/product/191333/RAUPENSATZ-RP5RP6 191333] AUSVERKAUFT!).&lt;br /&gt;
&lt;br /&gt;
===Displays===&lt;br /&gt;
Die vorkonfektionierten Displays kann man zum Ausgeben von Texten, Sensordaten und kleinen Animationen benutzen. Sie können an die M32, an die CCPRO M128 und an die M256 WiFi angeschlossen werden.&lt;br /&gt;
&lt;br /&gt;
Diese 16x2 Zeichen Displays sind bisher lieferbar:&lt;br /&gt;
&lt;br /&gt;
* LC-Display ([http://www.conrad.de/ce/de/product/190911/LC-DISPLAY-16-X-2-KONFEKTIONIERT 190911])&lt;br /&gt;
* OLED-Display (197622)&lt;br /&gt;
* Backlight-Display AREXX RP-DSP88 ([http://www.conrad.de/ce/de/product/191621/DISPLAY-RP5RP6-BLAU-MIT-BACKLIGHT 191621])&lt;br /&gt;
&lt;br /&gt;
Das LCD ist seit September 2018 bei CONRAD ausverkauft; zeitweise (2007/08) gab es unter dieser Bestellnummer eine Version, die zu klein (66 x 37mm) war, um sie auf der M32, der CCPRO M128 oder der M256 WiFi zu montieren.&lt;br /&gt;
&lt;br /&gt;
Das OLED-Display ist aktuell (April 2012) nicht mehr lieferbar.&lt;br /&gt;
&lt;br /&gt;
Das zuletzt ausschließlich nur noch erhältliche blaufarbige Backlight-Display ist seit Mai 2020 bei CONRAD ausverkauft.&lt;br /&gt;
&lt;br /&gt;
Diese Displays können mit 4 M3-Abstandbolzen 25 mm ([http://www.conrad.de/ce/de/product/526665/Abstandsbolzen1-x-Aussengewinde1-x-InnengewindeMessing-vernickelt-Schluesselweite-55-mm Bestell-Nr. 526665]) und 4 Muttern M3 ([http://www.conrad.de/ce/de/product/815624/TOOLCRAFT-Sechskant-Muttern-DIN-934-934-Stahl-verzinkt-M3-100-St z.B. aus 815624]), sowie 4 Schrauben M3 ([http://www.conrad.de/ce/de/product/815322/TOOLCRAFT-Linsenkopfschrauben-mit-Kreuzschlitz-DIN-7985-7985-6-mm-Stahl-verzinkt-Guete-48-M3-100-St z.B. aus 815322]) auf der M32, der CCPRO M128 oder der M256 WiFi befestigt werden. Leider sind die Befestigungslöcher der Displays zu klein für ein M3-Gewinde, so dass man die Löcher sehr vorsichtig auf 3..3,2 mm erweitern muss.&lt;br /&gt;
&lt;br /&gt;
===IR-Ball===&lt;br /&gt;
Den IR-Ball (AREXX IRB-35, AUSVERKAUFT!) kann man benutzen, um mit dem RP6 Fußball oder Ähnliches zu spielen. Der Ball kann dann von den IR-Sensoren des RP6 erkannt und geortet werden.&lt;br /&gt;
&lt;br /&gt;
===Graustufen-Boden-Sensor===&lt;br /&gt;
Der Graustufen-Boden-Sensor (AREXX ARX-GS7) dient zur Orientierung eines Roboters auf einem Fußballfeld, das in bestimmten Grauabstufungen eingefärbt ist (CONRAD 191404  AUSVERKAUFT!). Dieser Fußballfeld-Aufkleber (AREXX ARX-FF008) ist auch bei [http://www.elv.de ELV] (Artikel-Nummer 68-101831) ausverkauft.&lt;br /&gt;
&lt;br /&gt;
===IR-Fernbedienung===&lt;br /&gt;
[[Bild:RP6_RC.jpg|thumb|2 RC5 Fernbedienungen]]&lt;br /&gt;
Mit einer Universal-IR-Fernbedienung, die den RC5-IR-Code senden kann, kann der RP6 wie ein ferngesteuertes &amp;quot;Auto&amp;quot; verwendet werden. Im Beispielprogramm &amp;quot;Example_08_TV_REMOTE&amp;quot; im Ordner der RP6-Base-Demos wird das noch genauer erläutert.&lt;br /&gt;
&lt;br /&gt;
===Ersatzräder===&lt;br /&gt;
Die Ersatzräder dienen als Ersatzteile für den RP6, RP6v2 und das RP5/RP6-Fahrgestell.&lt;br /&gt;
&lt;br /&gt;
===Ersatzzahnräder===&lt;br /&gt;
Die Ersatzzahnräder dienen als Ersatzteile für den RP6, RP6v2 und das RP5/RP6-Fahrgestell.&lt;br /&gt;
&lt;br /&gt;
===Ersatzraupen===&lt;br /&gt;
Die Ersatzraupen dienen als Ersatzteile für den RP6, RP6v2 und das RP5/RP6-Fahrgestell.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Programmierung==&lt;br /&gt;
Um diesen Grundlagenartikel zum RP6 nicht immer länger werden zu lassen, habe ich den Teil zur Programmierung des [[RP6_-_Programmierung#RP6_Base_und_CONTROL_M32|RP6]] und seiner Erweiterungsplatinen [[RP6_-_Programmierung#RP6_Base_und_CONTROL_M32|RP6 CONTROL M32]] und [[RP6_-_Programmierung#RP6_CCPRO_M128|RP6 CCPRO M128]] ausgelagert: [[RP6 - Programmierung]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==RP6v2==&lt;br /&gt;
Der neue [http://www.conrad.de/ce/de/product/191584/RP6-V2-ROBOTERSYSTEM RP6v2] ist weitgehend identisch mit dem RP6, so dass fast alle Angaben dieses Artikels auch für den RP6v2 zutreffen.&lt;br /&gt;
Für vom RP6 abweichende Details des RP6v2 und für dessen zukünftige Erweiterungsplatinen (z.B. das aktuell [http://www.arexx.com/forum/viewtopic.php?f=19&amp;amp;t=1797 hier] angekündigte Erweiterung-Modul [[RP6v2#RP6v2_M256_WiFi_Platine|RP6v2 M256 WiFi]]) gibt es einen eigenen Grundlagenartikel: [[RP6v2]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==RP6 Sensor Board und Xtra Module==&lt;br /&gt;
Einen eigenen Artikel gibt es auch für das [[RP6_Sensor_Board_und_Xtra_Module#RP6_Sensor_Board_2|RP6 Sensor Board]] und für die [[RP6_Sensor_Board_und_Xtra_Module#RP6_Xtra_Module_2|Xtra Module]]: [[RP6_Sensor_Board_und_Xtra_Module|RP6 Sensor Board und Xtra Module]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Erfahrungsberichte==&lt;br /&gt;
&lt;br /&gt;
...in Arbeit...(kann aber gerne ergänzt werden)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Siehe auch==&lt;br /&gt;
* [[RP6 - Programmierung]]&lt;br /&gt;
* [[RP6v2]]&lt;br /&gt;
* [[RP6_Sensor_Board_und_Xtra_Module]]&lt;br /&gt;
* [[RP6_Kamera_-_Mitmach-Projekt]]&lt;br /&gt;
* [[RP6v2_I2C-Portexpander]]&lt;br /&gt;
* [[RP6v2 USB-RS232-Adapter]]&lt;br /&gt;
* [[RP6v2 Orientierung]]&lt;br /&gt;
* [[RP6 Multi IO Projekt]]&lt;br /&gt;
* [[RP6 Multi IO Projekt - Software]]&lt;br /&gt;
* [[RP6 ArduIO]]&lt;br /&gt;
* [[RP6 ArduIO - Software]]&lt;br /&gt;
* [[Induktive_Ladestation_f%C3%BCr_den_RP6|Induktive Ladestation für den RP6]]&lt;br /&gt;
* [[IR-bake_f%C3%BCr_den_RP6|IR-bake für den RP6]]&lt;br /&gt;
* [[CCRP5]]&lt;br /&gt;
* [[Wild Thumper]]&lt;br /&gt;
* [[Wild Thumper - Programmierung]]&lt;br /&gt;
* [[Yeti]]&lt;br /&gt;
* [[Asuro]]&lt;br /&gt;
* [[C't-Bot]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Weblinks==&lt;br /&gt;
'''Siehe auch die Weblinks im [http://www.rn-wissen.de/index.php/RP6v2#Weblinks RP6v2 Artikel]!'''&lt;br /&gt;
&lt;br /&gt;
* [http://www.pcwelt.de/start/gaming_fun/gadgets/news/84558/ PC-Welt-Artikel]&lt;br /&gt;
&lt;br /&gt;
* Ankündigung des RP6 und der RP6 CONTROL M32 im [http://www.arexx.com/forum/viewtopic.php?t=370 AREXX Support Forum]&lt;br /&gt;
* Ankündigung der RP6 CCPRO M128 im [http://www.arexx.com/forum/viewtopic.php?f=19&amp;amp;t=834&amp;amp;start=0 AREXX Support Forum] und im [http://www.roboternetz.de/community/threads/42228-RP6-C-Control-PRO-MEGA128-Erweiterungsmodul-Website-online RoboterNETZ]&lt;br /&gt;
* Ankündigung des RP6v2 im [http://www.roboternetz.de/community/threads/56964-NEWS-RP6v2-die-neue-Version-2-des-RP6-Robot-Systems RoboterNETZ] und im [http://www.arexx.com/forum/viewtopic.php?f=19&amp;amp;t=1778 AREXX Support Forum]&lt;br /&gt;
* Ankündigung der RP6v2 M256 WiFi im [http://www.arexx.com/forum/viewtopic.php?f=19&amp;amp;t=1797 AREXX Support Forum]&lt;br /&gt;
* [http://www.arexx.com/rp6 AREXX RP6 Startseite]&lt;br /&gt;
* [http://www.arexx.com/forum/viewforum.php?f=19 AREXX Support Forum]&lt;br /&gt;
* [http://www.arexx.com/rp6/html/de/soft_doc_ccpro.htm AREXX CCPRO M128 Seite]&lt;br /&gt;
&lt;br /&gt;
* [http://www.conrad.de/ce/de/product/191524/RP6-ROBOTERSYSTEM RP6 bei CONRAD]&lt;br /&gt;
* [http://www.conrad.de/ce/de/product/191584/RP6-V2-ROBOTERSYSTEM RP6v2 bei CONRAD]&lt;br /&gt;
* [http://www.conrad.de/ce/de/product/191550/RP6-MEGA32-ERWEITERUNGSSATZ RP6 CONTROL M32 bei CONRAD]&lt;br /&gt;
* [http://www.conrad.de/ce/de/product/191563/RP6-CC-PRO-MEGA128-ERWEITERUNGSSATZ RP6 CCPRO M128 bei CONRAD]&lt;br /&gt;
* [http://www.c-control.de/c-control-pro/c-control-pro/startseite_c-control-pro.html C-Control PRO Startseite]&lt;br /&gt;
* [http://ccpro.cc2net.de/forum/ C-Control PRO Forum]&lt;br /&gt;
&lt;br /&gt;
* [http://www.roboternetz.de/phpBB2/viewforum.php?f=49 Roboternetz RP6 Forum]&lt;br /&gt;
* &amp;quot;Geburt&amp;quot; des Wiki im RN-Forum: [http://www.roboternetz.de/community/threads/32793-RP6-Wiki-Artikel RP6-Wiki-Artikel]&lt;br /&gt;
* Henkessoft: [http://www.henkessoft.de/Roboter/rp6.htm RP6]&lt;br /&gt;
* PIC-PROJEKTE Wiki: [http://pic-projekte.de/wiki/index.php?title=RP6  RP6]&lt;br /&gt;
* benhup.com: [http://www.benhup.com/?mf=eduntech&amp;amp;sf=rp6 Arexx RP6 Robot (with ATmega32 chip)]&lt;br /&gt;
* RP6 &amp;quot;Panzer&amp;quot;: [http://www.roboternetz.de/community/threads/57171-mein-(Heng-Long)-RP6 Heng-Long-RP6]&lt;br /&gt;
&lt;br /&gt;
* [http://www.youtube.com/results?search_query=rp6 RP6 Videos]&lt;br /&gt;
* [http://de-de.facebook.com/pages/Robby-RP6/155118711202285 facebook]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Robotikeinstieg]]	 &lt;br /&gt;
[[Kategorie:Praxis]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Autoren==&lt;br /&gt;
--[http://www.roboternetz.de/community/members/24729-sloti sloti] 22:23, 29. Dez 2007 (CET)&lt;br /&gt;
&lt;br /&gt;
--[http://www.roboternetz.de/community/members/44891-Tobias1 Tobias1] 18:30, 6. Apr 2010 (CET)&lt;br /&gt;
&lt;br /&gt;
--[http://www.roboternetz.de/community/members/1972-Dirk Dirk] 11:31, 31. Mär 2022 (CET)&lt;/div&gt;</summary>
		<author><name>Dirk NO2</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=RP6v2&amp;diff=28582</id>
		<title>RP6v2</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=RP6v2&amp;diff=28582"/>
				<updated>2022-03-31T09:30:17Z</updated>
		
		<summary type="html">&lt;p&gt;Dirk NO2: /* Autoren */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Bild:rp6v2_2.jpg|RP6v2 Base Roboter|right|500px]]&lt;br /&gt;
==Was bisher geschah==&lt;br /&gt;
'''Siehe auch &amp;quot;Was bisher geschah&amp;quot; im [http://www.rn-wissen.de/index.php/RP6#Was_bisher_geschah RP6 Artikel]!'''&lt;br /&gt;
&lt;br /&gt;
Mon, 27. Feb 2012 - Ankündigung des '''RP6v2'''&amp;lt;br/&amp;gt;&lt;br /&gt;
Don, 08. Mär 2012 - Auslieferungsbeginn des RP6v2&amp;lt;br/&amp;gt;&lt;br /&gt;
Sam, 17. Mär 2012 - Ankündigung der '''[[RP6v2#RP6v2_M256_WiFi_Platine|RP6v2 M256 WiFi]]'''&amp;lt;br/&amp;gt;&lt;br /&gt;
Mon, 11. Jun 2012 - Beginn der &amp;quot;Testaktion: Kostenlose RP6v2-M256-WIFI Module!&amp;quot;&amp;lt;br/&amp;gt;&lt;br /&gt;
Die, 10. Jul 2012 - Ende der &amp;quot;Testaktion: Kostenlose RP6v2-M256-WIFI Module!&amp;quot; nach Abstimmung&amp;lt;br/&amp;gt;&lt;br /&gt;
Mit, 11. Jul 2012 - Veröffentlichung der RP6v2 M256 WiFi Bedienungsanleitung&amp;lt;br/&amp;gt;&lt;br /&gt;
Die, 17. Jul 2012 - Eintreffen der kostenlosen RP6v2 M256 WiFi bei den Testern&amp;lt;br/&amp;gt;&lt;br /&gt;
Mit, 25. Jul 2012 - Auslieferungsbeginn der RP6v2 M256 WiFi&amp;lt;br/&amp;gt;&lt;br /&gt;
Don, 01. Nov 2012 - Im Oktober 2012 Auslieferung einiger RP6v2 M256 WiFi mit &amp;quot;altem&amp;quot; Bootloader V1.2&amp;lt;br/&amp;gt;&lt;br /&gt;
Don, 11. Dez 2014 - Im 2. bis 4. Quartal 2014 Auslieferung einiger [http://www.arexx.com/forum/viewtopic.php?f=19&amp;amp;t=2618 USB Interfaces mit gefälschtem FTDI Chip]&amp;lt;br/&amp;gt;&lt;br /&gt;
Sam, 02. Jan 2016 - Unter der Bezeichnung '''[[RP6v2#Arexx_RP6-Xtra_Robotersystem|Arexx RP6-Xtra Robotersystem]]''' ist ein Set bestehend aus dem RP6, einer Experimentierplatine, einem RP6v2 Drehgeber-Satz und einem RP6 USB-Interface lieferbar&amp;lt;br/&amp;gt;&lt;br /&gt;
Mon, 12. Mär 2018 - Seit dem 1. Quartal 2018 ist das Arexx RP6-Xtra Robotersystem bei CONRAD ausverkauft&amp;lt;br/&amp;gt;&lt;br /&gt;
Sam, 31. Mär 2018 - Seit Ende März 2018 ist die RP6v2 M256 WiFi Zusatzpatine bei CONRAD ausverkauft&amp;lt;br/&amp;gt;&lt;br /&gt;
Mit, 12. Sep 2018 - Seit September 2018 ist das [[RP6#Displays|LC-Display]] bei CONRAD ausverkauft&amp;lt;br/&amp;gt;&lt;br /&gt;
Mit, 28. Nov 2018 - Seit November 2018 ist der RP6v2 bei CONRAD ausverkauft&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Siehe auch &amp;quot;Was bisher geschah&amp;quot; im [http://www.rn-wissen.de/index.php/RP6_Sensor_Board_und_Xtra_Module#Was_bisher_geschah RP6 Sensor Board und Xtra Module Artikel]!'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Allgemein==&lt;br /&gt;
Der RP6v2 ([http://www.conrad.de/ce/de/product/191584/RP6-V2-ROBOTERSYSTEM/ 191584]) wurde am 27.02.2012 von [http://www.roboternetz.de/community/members/120-SlyD SlyD] angekündigt (siehe Weblinks!). Er ist eine leicht verbesserte Version des [[RP6]]. Der RP6v2 ist softwarekompatibel zum RP6. '''Alle Erweiterungs-Module können auch mit dem RP6v2 eingesetzt werden.'''&lt;br /&gt;
&lt;br /&gt;
 '''Seit November 2018 ist der RP6v2 bei CONRAD ausverkauft.'''&lt;br /&gt;
 '''Damit endet die Ära des RP6 Robotersystems nun endgültig nach fast 11 1/2 Jahren.'''&lt;br /&gt;
&lt;br /&gt;
Dieser Artikel beschreibt die Grundlagen zum RP6v2, '''sofern sie vom RP6 abweichen''', und die Grundlagen und Programmierung seiner zukünftigen Erweiterungs-Module.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Eigenschaften==&lt;br /&gt;
Laut Ankündigung haben sich beim RP6v2 folgende Details gegenüber dem RP6 geändert:&lt;br /&gt;
* Neue Drehgeber&lt;br /&gt;
** Justierung dank neuer Sensortechnik üblicherweise nicht mehr erforderlich&lt;br /&gt;
** leicht zugängliches und deutlich größeres Potentiometer&lt;br /&gt;
** Potis nur noch zur Feinjustierung erforderlich&lt;br /&gt;
* Zusätzliche Steckverbinder (im RP6 schon seit 2010 verbaut)&lt;br /&gt;
** vom Mainboard zu den Drehgebern&lt;br /&gt;
** vom Mainboard zu den Motoren&lt;br /&gt;
* Neue Anschlüsse (Steckverbinder / Stiftleisten)&lt;br /&gt;
** 2 3-polige ADC Anschlüsse mit VDD/GND inkl. zusätzlichem Stützkondensator&lt;br /&gt;
** 2 4-polige VDD Anschlüsse (je 2x +5V und 2x GND)&lt;br /&gt;
** 1 3-poliger +UB Anschluß (1x +UB, 2x GND)&lt;br /&gt;
** 1 5-polige Stiftleiste für den I2C Bus und VDD/GND&lt;br /&gt;
** 1 8-poliger EXT Steckverbinder (JST-Wannenstecker)&lt;br /&gt;
** 2 4-polige Steckverbinder (LIO1/LIO2) für die I/O-Pins von 4 LEDs und VDD/GND&lt;br /&gt;
* Hauptsicherung&lt;br /&gt;
** von 2,5A auf 3,15A erhöht&lt;br /&gt;
* Motortreiber&lt;br /&gt;
** leistungsfähigere und robustere MOSFETs&lt;br /&gt;
* Experimentierplatine&lt;br /&gt;
** gehört nicht mehr zum Lieferumfang&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Technische Änderungen==&lt;br /&gt;
Der RP6v2 weist einige Detail-Änderungen gegenüber der Vorversion auf. '''Diese Änderungen sind für die Nutzung und Programmierung des RP6v2 weitgehend irrelevant.'''&lt;br /&gt;
&lt;br /&gt;
Fast alle passiven SMD-Bauteile sind jetzt in Bauform 0603 bestückt (Ausnahmen: R6 (SP2 C2: R6), Induktivitäten und größere Kondensatoren).&lt;br /&gt;
Im Text gibt es Verweise auf den Schaltplan des RP6v2 (RP6v2_MAINBOARD.pdf) in der Form: (SP2 B1: Bauteil). Dies bedeutet, dass man das Bauteil auf Blatt 2 des RP6v2-Schaltplans im Feld B1 finden kann.&lt;br /&gt;
&lt;br /&gt;
===Mainboard===&lt;br /&gt;
* C14 (SP2 A3: C14) -&amp;gt; Liegt jetzt an VDD (parallel u.a. zu C6..C10)&lt;br /&gt;
* C26 (SP2 A1: C26) -&amp;gt; Jetzt bestückt mit Elko 220uF/16V (laut SP: 470uF/16V!)&lt;br /&gt;
* C29 (SP2 E1: C29) -&amp;gt; Jetzt bestückt mit SMD Kondensator 10uF&lt;br /&gt;
* IO3/IO4 Bestückungsaufdruck geändert in IO4/IO5 (Stecker LIO2)&lt;br /&gt;
* UBAT Bestückungsaufdruck geändert in UBAT_SENSE&lt;br /&gt;
* F2.5A Bestückungsaufdruck geändert in F3.0A (Feinsicherung flink 3,0A)&lt;br /&gt;
* Trennstelle +UB Sensor (siehe Abschnitt 6.4.6 [[RP6#.2BUB_Sensor|+UB Sensor]] des RP6-Artikels!) existiert beim RP6v2 nicht mehr&lt;br /&gt;
* Als Motortreiber (SP3 BCD23: Q1..Q4) werden anstelle von IRF7309 (ID 3,0A; PD 1,4W) die leistungsfähigeren und ESD-geschützten Typen [http://media.digikey.com/pdf/Data%20Sheets/Rohm%20PDFs/SP8M3.pdf SP8M3] (ID 4,5A; PD 2W; Schutzdiode) verwendet&lt;br /&gt;
&lt;br /&gt;
===Encoderplatine===&lt;br /&gt;
Schaltung siehe Datei RP6v2_ENCODERS.pdf!&lt;br /&gt;
* Jetzt mit Operationsverstärker IC2 ([http://ww1.microchip.com/downloads/en/DeviceDoc/21733h.pdf MCP6001U]) anstelle eines Transistors&lt;br /&gt;
* Größeres Potentiometer R2 (200kOhm)&lt;br /&gt;
Die Encoder sind mittlerweile auch einzeln unter der Conrad-Bestellnummer '''[http://www.conrad.de/ce/de/product/191625/RP6-DREHGEBER-SATZ 191625-62]''' verfügbar.&lt;br /&gt;
&lt;br /&gt;
===USB-Interface===&lt;br /&gt;
Schaltung siehe Datei RP6v2_USB_INTERFACE.pdf!&lt;br /&gt;
* C2  -&amp;gt; Jetzt bestückt mit SMD Kondensator 10uF&lt;br /&gt;
* C5  -&amp;gt; Neuer Blockkondensator 100nF an VCCIO von IC1&lt;br /&gt;
&lt;br /&gt;
===Steckverbindungen und Stiftleisten===&lt;br /&gt;
&lt;br /&gt;
====Motoren====&lt;br /&gt;
[[Bild:RP6v2_Motorstecker.JPG|thumb]]&lt;br /&gt;
&lt;br /&gt;
Beim RP6v2 sind die beiden Motorkabel mit 2-poligen Winkelsteckern RM 7,5mm an das Mainboard angeschlossen. &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;
&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;
====Encoder====&lt;br /&gt;
[[Bild:RP6v2_Encoderstecker.JPG|thumb]]&lt;br /&gt;
&lt;br /&gt;
Beim RP6v2 sind die Encoder mit einer JST XH Stiftleiste gewinkelt, 6-polig, RM 2,5mm ([http://www.conrad.de/ce/de/product/740271/Stiftleiste-gewinkelt-RM-25-mm-Serie-XH-Rastermass-25-mm-Pole-6-Nennstrom-3-A-S6B-XH-A-LFSN-JST-Inhalt-1-St 740271]) an das Mainboard angeschlossen.&lt;br /&gt;
&lt;br /&gt;
Auch die 3-polige Verbindung zu den beiden Encoder-Platinen (JST XH Stiftleiste gewinkelt, 3-polig, RM 2,5mm ([http://www.conrad.de/ce/de/product/740174/Stiftleiste-gewinkelt-RM-25-mm-Serie-XH-Rastermass-25-mm-Pole-3-Nennstrom-3-A-S3B-XH-A-LFSN-JST-Inhalt-1-St 740174])) ist steckbar.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====LIO1/LIO2====&lt;br /&gt;
[[Bild:RP6v2_LIO12.JPG|thumb]]&lt;br /&gt;
&lt;br /&gt;
Beim RP6 waren die Anschlüsse der Status-LEDs SL1,2 und SL4,5 ([[RP6#IO1..IO4|IO1..IO4]]) einzeln auf dem Mainboard zu kontaktieren.&lt;br /&gt;
&lt;br /&gt;
Beim RP6v2 gibt es zwei 4-polige Stiftleisten (LIO1, LIO2). Sie führen an den Pins 1 und 2 +5V und GND.&lt;br /&gt;
&lt;br /&gt;
An den Pins 3 und 4 finden sich die Anschlüsse von IO2, IO1 (LIO1) bzw. IO4, IO5 (LIO2).&lt;br /&gt;
&lt;br /&gt;
Bitte beachten: '''Der Bestückungsaufdruck IO4, IO5 des RP6v2 bezeichnet die selben Anschlüsse, wie beim RP6 IO3, IO4!'''&lt;br /&gt;
&lt;br /&gt;
Es handelt sich in beiden Fällen um die Anschlüsse der Status-LEDs SL4 (PB7) und SL5 (PB1).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====ADC0/ADC1====&lt;br /&gt;
[[Bild:RP6v2_ADC01.JPG|thumb]]&lt;br /&gt;
&lt;br /&gt;
Beim RP6 waren die 3-poligen Anschlüsse von ADC0 und ADC1 ([[RP6#Analoge_Sensoren_an_ADC0.2F1|Analoge Sensoren an ADC0/1]]) nicht mit Stiftleisten bestückt.&lt;br /&gt;
&lt;br /&gt;
Dies ist jetzt beim RP6v2 der Fall,- zusätzlich ist auch C26 (SP2 A1: C26) bestückt.&lt;br /&gt;
&lt;br /&gt;
Damit können analoge Sensoren direkt angeschlossen werden.&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;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====I2C/+UB/+5V====&lt;br /&gt;
[[Bild:RP6v2_I2CUB5V.JPG|thumb]]&lt;br /&gt;
&lt;br /&gt;
Die beim RP6 vorhandene 5-polige I2C-Schnittstelle ([[RP6#I2C-Schnittstelle|I2C-Schnittstelle]]) findet sich (jetzt mit Stiftleiste bestückt) genau so auch beim RP6v2.&lt;br /&gt;
&lt;br /&gt;
Bitte beachten: '''Die Anordnung der Pins auf dem Mainboard ist beim RP6v2 umgekehrt wie beim RP6!'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beim RP6 gab es (nicht mit Stiftleisten bestückte) Anschlüsse für VDD und +UB ([[RP6#VDD.2FGND.2F.2BUB_Anschlu.C3.9F|VDD/GND/+UB Anschluß]]).&lt;br /&gt;
&lt;br /&gt;
Beim RP6v2 gibt es jetzt drei Stiftleisten für +UB, +5V (VDD) und GND:&lt;br /&gt;
* Eine 3-polige Stiftleiste mit GND, +UB, GND&lt;br /&gt;
* Zwei 4-polige Stiftleisten jeweils mit GND, +5V, +5V, GND&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;
====EXT====&lt;br /&gt;
[[Bild:RP6v2_EXT.JPG|thumb]]&lt;br /&gt;
&lt;br /&gt;
Beim RP6 war keine Stiftleiste für den 8-poligen EXT Anschluß bestückt.&lt;br /&gt;
&lt;br /&gt;
Beim RP6v2 ist jetzt an dieser Stelle eine JST XH Stiftleiste gerade, 8-polig, RM 2,5mm ([http://www.conrad.de/ce/de/product/740105/Stiftleiste-gerade-RM-25-mm-Serie-XH-Rastermass-25-mm-Pole-8-Nennstrom-3-A-B8B-XH-A-LFSN-JST-Inhalt-1-St 740105]) vorhanden, auf die auch Steckbuchsen (RM 2,54) gesteckt werden können.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beschreibung des EXT Anschlusses: [[RP6#EXT_Anschlu.C3.9F|EXT Anschluß]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Erweiterungs-Module==&lt;br /&gt;
Über die Erweiterungs-Module informiert der Abschnitt [[RP6#Erweiterungs-Module|Erweiterungs-Module]] im RP6 Artikel.&lt;br /&gt;
&lt;br /&gt;
Darüber hinaus sind bei [http://www.conrad.de/ce/ CONRAD] für den RP6v2 erhältlich:&lt;br /&gt;
* RP6v2 M256 WiFi Zusatzplatine ([http://www.conrad.de/ce/de/product/191609/Arexx-RP6-V2-Control-M256-WiFi-Kit-RP6v2-M256-WIFI 191609])&lt;br /&gt;
* RP6 Sensor Board ([http://www.conrad.de/ce/de/product/1082384/Arexx-RP6-Sensor-Board-RP6-JM03-61 1082384])&lt;br /&gt;
&lt;br /&gt;
===RP6v2 M256 WiFi Platine===&lt;br /&gt;
Die RP6v2 M256 WiFi Zusatzplatine ([http://www.conrad.de/ce/de/product/191609/Arexx-RP6-V2-Control-M256-WiFi-Kit-RP6v2-M256-WIFI 191609]) wurde am 17.03.2012 von [http://www.roboternetz.de/community/members/120-SlyD SlyD] angekündigt (siehe Weblink!).&lt;br /&gt;
&lt;br /&gt;
Aktuell (Ende März 2018) ist die RP6v2 M256 WiFi Zusatzplatine bei CONRAD ausverkauft. &lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6v2_M256_WIFI.JPG|Die RP6v2 M256 WiFi]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Beschreibung====&lt;br /&gt;
Laut Ankündigung bietet die RP6v2 M256 WiFi:&lt;br /&gt;
* Atmel ATmega2560 Mikrocontroller&lt;br /&gt;
** 256kB Flash ROM&lt;br /&gt;
** 8kB SRAM&lt;br /&gt;
** 4kB EEPROM&lt;br /&gt;
** 16MHz Taktfrequenz&lt;br /&gt;
** 6 Hardware Timer und 86 I/O Ports&lt;br /&gt;
** Bis zu 16 A/D Wandler Kanäle (10 Bit Auflösung)&lt;br /&gt;
** 12 16 Bit Hardware PWMs&lt;br /&gt;
** 2 USART/SPI Ports&lt;br /&gt;
* Energieeffizientes 802.11g WLAN Modul&lt;br /&gt;
** Typ: Roving Networks RN-171&lt;br /&gt;
** Telemetriedaten übertragen&lt;br /&gt;
** Roboter vom PC aus fernsteuern&lt;br /&gt;
** Neue Programme drahtlos per WLAN in den Mikrocontroller laden&lt;br /&gt;
** Bootloader nachträglich erweitern&lt;br /&gt;
** Einstellung des WLAN Moduls über das RP6 USB Interface mit dem RobotLoader 2.x&lt;br /&gt;
** Änderung der Einstellungen über eine Netzwerkverbindung oder mit dem eigenen Mikrocontrollerprogramm&lt;br /&gt;
** Eigener Prozessor (entlastet den ATmega)&lt;br /&gt;
** Funktioniert mit jedem Standard WLAN Accesspoint/Router&lt;br /&gt;
** Kann als transparente serielle Schnittstelle arbeiten&lt;br /&gt;
** Kann vom PC aus per TCP/IP angesprochen werden&lt;br /&gt;
** 10cm 2.4GHz Antenne mit RP-SMA Anschluß&lt;br /&gt;
* Sonstige Ausstattung&lt;br /&gt;
** 8 Bit Display Port&lt;br /&gt;
** I2C Bus&lt;br /&gt;
** microSD Kartenslot&lt;br /&gt;
** 7 Status LEDs&lt;br /&gt;
** 2 Eingabetaster&lt;br /&gt;
** ISP Anschluß&lt;br /&gt;
** 4 WLAN ADC Kanäle&lt;br /&gt;
** AREF 3,3 und 5V&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6v2_M256_WIFI_Q2_m.JPG|thumb]]&lt;br /&gt;
&lt;br /&gt;
Ab Mitte Juli 2012 trafen die ersten kostenlosen RP6v2 M256 WiFi Platinen bei den Testern ein, die sich vorher dafür im Roboternetz RP6 Forum beworben hatten. Es handelte sich um Vorserien-Modelle, die sich dadurch auszeichneten, dass die Lötpads für Q2 (SP2 C6/C7: Q2) vertauscht waren. Der MOSFET war daher manuell &amp;quot;verdreht&amp;quot; aufgelötet, siehe nebenstehende Abbildung.&lt;br /&gt;
&lt;br /&gt;
Bei den Serien-Modellen wurde dies korrigiert.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Technische Daten====&lt;br /&gt;
{|  {{Blauetabelle}} &lt;br /&gt;
|'''Mikrocontroller:'''&lt;br /&gt;
|AVR ATmega2560&lt;br /&gt;
|-&lt;br /&gt;
|'''Speicher:'''&lt;br /&gt;
|256 kB [[Flash]]-Speicher&amp;lt;br/&amp;gt;&lt;br /&gt;
8 kB SRAM&amp;lt;br/&amp;gt; &lt;br /&gt;
4 kB [[EEPROM]]&amp;lt;br/&amp;gt;&lt;br /&gt;
? GB microSD Speicherkarte&lt;br /&gt;
|-&lt;br /&gt;
|'''Programmierung:'''&lt;br /&gt;
|Über [[Bootloader]], belegt ca. 8 kB des Flash-Speichers&amp;lt;br/&amp;gt;&lt;br /&gt;
Drahtlos über WLAN&lt;br /&gt;
|-&lt;br /&gt;
|'''Vorhandene Sensoren:'''&lt;br /&gt;
|2 Eingabetaster&amp;lt;br/&amp;gt;&lt;br /&gt;
4 WLAN ADC Kanäle&amp;lt;br/&amp;gt;&lt;br /&gt;
60 GP I/O Ports, davon bis 16 AD-Wandler (10-bit)&amp;lt;br/&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|'''Vorhandene Aktoren:'''&lt;br /&gt;
|7 Status LEDs&amp;lt;br/&amp;gt;&lt;br /&gt;
1 LC-Display-Port&amp;lt;br/&amp;gt;&lt;br /&gt;
802.11g WLAN Modul&amp;lt;br/&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|'''Abmessungen:'''&lt;br /&gt;
|(L &amp;amp;times; B &amp;amp;times; H) 112 &amp;amp;times; 90 &amp;amp;times; 42 mm (ohne Antenne)&lt;br /&gt;
|-&lt;br /&gt;
|'''Ausführung:'''&lt;br /&gt;
|Fertig aufgebautes Erweiterungsmodul&lt;br /&gt;
|-&lt;br /&gt;
|'''Stromversorgung:'''&lt;br /&gt;
|6 AA NiMH Akkus (über die RP6v2 Base)&lt;br /&gt;
|-&lt;br /&gt;
|'''Hersteller:'''&lt;br /&gt;
|Arexx Niederlande&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====WLAN Modul RN-171====&lt;br /&gt;
Das auf der RP6v2 M256 WiFi eingesetzte WLAN Modul ist das [http://www.microchip.com/wwwproducts/en/RN171 RN-171] ursprünglich entwickelt von Roving Networks. Vor einigen Jahren wurde die Firma Roving Networks von [http://www.microchip.com MicroChip Technology] übernommen.&lt;br /&gt;
&lt;br /&gt;
Inzwischen (2017) wird das RN-171 zwar noch hergestellt, für neue Hardware Designs aber nicht mehr empfohlen.&lt;br /&gt;
&lt;br /&gt;
Die letzte Firmware Version trägt die Nummer 4.81.&lt;br /&gt;
&lt;br /&gt;
Für die Nutzung des RN-171 auf der RP6v2 M256 WiFi wird sowohl vonseiten des Hardware Designs der Platine, als auch vonseiten der Software davon ausgegangen, dass das RN-171 auch den &amp;quot;Ad-Hoc Modus&amp;quot; beherrscht. Dies ist der Fall bis zur Firmware Version 2.38.3. Höhere Versionen beherrschen diesen Modus nicht mehr.&lt;br /&gt;
&lt;br /&gt;
''Somit ist die Firmware 2.38.3 die höchste Version, die für das RN-171 auf der RP6v2 M256 WiFi nutzbar ist!''&lt;br /&gt;
&lt;br /&gt;
Diese Firmware Version (Datei: wifly7-2383.img) findet ihr in der ZIP in diesem [http://www.roboternetz.de/community/threads/64251-RP6M256-WLAN-Modul-RN-171-Firmware-Update?p=594781&amp;amp;viewfull=1#post594781 Post] im Roboternetz RP6 Forum. Seht euch vor einem eventuellen Firmware Update unbedingt den ganzen [http://www.roboternetz.de/community/threads/64251-RP6M256-WLAN-Modul-RN-171-Firmware-Update Thread] auch wegen der enthaltenen Warnhinweise an.&lt;br /&gt;
&lt;br /&gt;
====Umbau-Optionen====&lt;br /&gt;
Für die RP6v2 M256 WiFi gibt es keine Umbau-Optionen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===RP6 Sensor Board===&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_Sensor_Board.jpg|Das RP6 Sensor Board]]&lt;br /&gt;
&lt;br /&gt;
'''Die Beschreibung des RP6 Sensor Boards wurde ausgelagert in einen eigenen [[RP6_Sensor_Board_und_Xtra_Module#RP6_Sensor_Board_2|Artikel]]!'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Zubehör und Ersatzteile==&lt;br /&gt;
Über die Zubehör- und Ersatzteile informiert der Abschnitt [[RP6#Zubehör und Ersatzteile|Zubehör und Ersatzteile]] im RP6 Artikel.&lt;br /&gt;
&lt;br /&gt;
Darüber hinaus sind bei [http://www.conrad.de/ce/ CONRAD] für den RP6v2 erhältlich:&lt;br /&gt;
* Arexx RP6v2 Drehgeber-Satz RP6-ENCv2 ([http://www.conrad.de/ce/de/product/191625/RP6-DREHGEBER-SATZ 191625] AUSVERKAUFT!)&lt;br /&gt;
* Arexx RP6 USB-Interface RP6V2-TRANS ([http://www.conrad.de/ce/de/product/191638/Arexx-RP6-USB-Interface-RP6V2-TRANS 191638] AUSVERKAUFT!)&lt;br /&gt;
* Arexx RP6 Xtra Module&lt;br /&gt;
&lt;br /&gt;
===RP6v2 Drehgeber-Satz RP6-ENCv2===&lt;br /&gt;
Die RP6v2 [http://www.rn-wissen.de/index.php/RP6v2#Encoder Drehgeber-Sensoren] (AREXX RP6-ENCv2) sind als Ersatzteil für den RP6v2 (191584) erhältlich und jetzt seit Mai 2020 bei CONRAD ausverkauft. Sie können auch in den [[RP6|RP6]] (191524) und in das RP5/RP6-Chassis ([http://www.conrad.de/ce/de/product/191152/Arexx-Fahrgestell-Robby-RP5RP6-Roboter 191152]) eingebaut werden und sind Bestandteil des [[RP6v2#Arexx_RP6-Xtra_Robotersystem|Arexx RP6-Xtra Robotersystems]].&lt;br /&gt;
&lt;br /&gt;
===RP6 USB-Interface RP6V2-TRANS===&lt;br /&gt;
Das RP6 USB-Interface (AREXX RP6V2-TRANS) kann zur Kommunikation mit verschiedenen Robotern und Erweiterungsmodulen eingesetzt werden. Es lassen sich mit dem RobotLoader neue Programme in den Mikrocontroller laden, und es wird ein virtueller serieller Port zur Kommunikation bereitgestellt. Auf dem Modul befindet sich zusätzlich ein Anschluss für APC220 Funkmodule (z.B. aus [http://www.conrad.de/ce/de/product/191668/Arexx-Wireless-Kit-ARX-APC220 diesem] Set, AUSVERKAUFT!) und ein 3,3 V Spannungsregler. Das USB-Interface RP6V2-TRANS kann als Ersatz für das mit dem RP6 oder RP6v2 gelieferte USB-Interface dienen und ist Bestandteil des [[RP6v2#Arexx_RP6-Xtra_Robotersystem|Arexx RP6-Xtra Robotersystems]]. Seit Ende 2021 ist das USB-Interface bei CONRAD ausverkauft.&lt;br /&gt;
&lt;br /&gt;
===RP6 Xtra Module===&lt;br /&gt;
'''Die Beschreibung der RP6 Xtra Module wurde ausgelagert in einen eigenen [[RP6_Sensor_Board_und_Xtra_Module#RP6_Xtra_Module_2|Artikel]]!'''&lt;br /&gt;
&lt;br /&gt;
===Arexx RP6-Xtra Robotersystem===&lt;br /&gt;
Unter der Bezeichnung '''Arexx RP6-Xtra Robotersystem''' bzw. '''Arexx Roboter Bausatz RP6-S''' ([https://www.conrad.de/de/arexx-rp6-xtra-robotersystem-1395738.html 1395738]) ist ab Januar 2016 ein Set bestehend aus dem [[RP6|RP6]] ([https://www.conrad.de/de/rp6-robotersystem-191524.html 191524]), einer [[RP6#Experimentierplatine|Experimentierplatine]] ([https://www.conrad.de/de/arexx-rp6-experimentierplatine-191537.html 191537]), einem [[RP6v2#RP6v2_Drehgeber-Satz_RP6-ENCv2|RP6v2 Drehgeber-Satz]] ([https://www.conrad.de/de/arexx-rp6-v2-drehgeber-sensoren-rp6-encv2-191625.html 191625]) und einem [[RP6v2#RP6_USB-Interface_RP6V2-TRANS|RP6 USB-Interface]] ([https://www.conrad.de/de/arexx-rp6-usb-interface-rp6v2-trans-191638.html 191638]) lieferbar.&lt;br /&gt;
&lt;br /&gt;
Die RP6v2 Drehgeber müssen selbst montiert werden. Durch dieses Set entsteht aus dem &amp;quot;alten RP6&amp;quot; ein Robotersystem, das in seiner Funktion identisch mit dem RP6v2 ist.&lt;br /&gt;
&lt;br /&gt;
Seit dem 1. Quartal 2018 ist das Arexx RP6-Xtra Robotersystem bei CONRAD ausverkauft.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Programmierung==&lt;br /&gt;
===RobotLoader===&lt;br /&gt;
Der RobotLoader ist die Weiterentwicklung des RP6Loaders. Es gibt ihn und den USB Interface Treiber [http://www.arexx.com/rp6/html/de/software.htm hier].&lt;br /&gt;
Über die Funktionen des RP6Loaders (siehe [[RP6_-_Programmierung#RP6Loader|hier]]!) hinaus kann der RobotLoader ab Version 2.0 Folgendes:&lt;br /&gt;
* WiFi Loader (Programme über WiFi hochladen und starten, Programmspeicher löschen)&lt;br /&gt;
* WiFi Terminal (Zeichen über WiFi senden/empfangen)&lt;br /&gt;
* Abdocken der Fenster des (seriellen) Terminals und des WiFi Terminals&lt;br /&gt;
* Konfiguration des WiFi Moduls über die serielle Schnittstelle&lt;br /&gt;
* Nach WiFi Geräten suchen&lt;br /&gt;
* Ab Version 2.3 über Kommandozeile steuerbar&lt;br /&gt;
&lt;br /&gt;
'''Befehlszeilen Optionen'''&lt;br /&gt;
&amp;lt;pre&amp;gt;################################################################&lt;br /&gt;
RobotLoader - Commandline Options&lt;br /&gt;
-c | -command : Enable Commandline Mode&lt;br /&gt;
-h | -help : Show this help message&lt;br /&gt;
-port=&amp;lt;PORT&amp;gt; : specify which port to use&lt;br /&gt;
               Windows with JD2XX: USB0, USB1, ...&lt;br /&gt;
               Windows with RXTX: COM0, COM1, ...&lt;br /&gt;
               Linux with RXTX: /dev/ttyUSB0, /dev/ttyUSB1, ...&lt;br /&gt;
-e : Erase Memory&lt;br /&gt;
-hex=&amp;lt;FILE&amp;gt; : Upload &amp;lt;FILE&amp;gt;, you must specify the complete path!&lt;br /&gt;
-s : Start Program (after upload)&lt;br /&gt;
-id : Get Infos from connected Board&lt;br /&gt;
###############################################################&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Loader Versionen====&lt;br /&gt;
Hier eine Tabelle der (mir) bekannten RobotLoader Versionen für die RP6v2 Base, CONTROL M32 und ab Version 2.0 auch für die M256 WiFi:&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |ZIP-Datum&lt;br /&gt;
 |Version&lt;br /&gt;
 |Bemerkungen&lt;br /&gt;
 |Examples&lt;br /&gt;
 |-&lt;br /&gt;
 |12.07.2010&lt;br /&gt;
 |[http://www.arexx.com/rp6/downloads/RobotLoader_20100712.zip 1.5h]&lt;br /&gt;
 |Auch für die RP6 Base, für Roboterarme und Caterpillar&lt;br /&gt;
 |ab 16.10.2007&lt;br /&gt;
 |-&lt;br /&gt;
 |16.06.2011&lt;br /&gt;
 |1.6b&lt;br /&gt;
 |Version auf der AREXX Wild Thumper CD-ROM!&lt;br /&gt;
 |&lt;br /&gt;
 |-&lt;br /&gt;
 |23.02.2012&lt;br /&gt;
 |[http://www.arexx.com/rp6/downloads/RobotLoader_20120223.zip 2.0 BETA]&lt;br /&gt;
 |Testversion! Ab v2.0 auch für die RP6v2 M256 WiFi Platine&lt;br /&gt;
 |&lt;br /&gt;
 |-&lt;br /&gt;
 |16.03.2012&lt;br /&gt;
 |2.1c&lt;br /&gt;
 |Version auf der AREXX Wireless kits CD-ROM 2012!&lt;br /&gt;
 |&lt;br /&gt;
 |-&lt;br /&gt;
 |05.06.2012&lt;br /&gt;
 |[http://www.arexx.com/rp6/downloads/RobotLoader_20120605.zip 2.3a]&lt;br /&gt;
 |Testversion! Siehe auch [http://www.roboternetz.de/community/threads/58168-RobotLoader-2-3a hier]!&lt;br /&gt;
 |&lt;br /&gt;
 |-&lt;br /&gt;
 |18.06.2012&lt;br /&gt;
 |[http://www.arexx.com/rp6/downloads/RobotLoader_20120618.zip 2.3b]&lt;br /&gt;
 |Testversion! Siehe auch [http://www.roboternetz.de/community/threads/58168-RobotLoader-2-3a hier]!&lt;br /&gt;
 |&lt;br /&gt;
 |-&lt;br /&gt;
 |17.07.2012&lt;br /&gt;
 |[http://www.arexx.com/rp6/downloads/RobotLoader_20120717.zip 2.3c]&lt;br /&gt;
 |Über Kommandozeile nutzbar, siehe auch [http://www.roboternetz.de/community/threads/58168-RobotLoader-2-3a hier]!&lt;br /&gt;
 |ab 16.07.2012&lt;br /&gt;
 |-&lt;br /&gt;
 |24.09.2012&lt;br /&gt;
 |[http://www.arexx.com/rp6/downloads/RobotLoader_20120924.zip 2.4a]&lt;br /&gt;
 |Mit WLAN Firmware v. 2.32, siehe auch [http://www.roboternetz.de/community/threads/59336-RobotLoader-2-4a hier]!&lt;br /&gt;
 |&lt;br /&gt;
 |-&lt;br /&gt;
 |10.04.2013&lt;br /&gt;
 |[http://www.arexx.com/rp6/downloads/RobotLoader_20130410.zip 2.5a]&lt;br /&gt;
 |Mit WLAN Firmware v. 2.36, siehe auch [http://www.roboternetz.de/community/threads/61977-M256-WIFI-Manchmal-nicht-ansprechbar?p=578766&amp;amp;viewfull=1#post578766 hier]!&lt;br /&gt;
 |&lt;br /&gt;
 |-&lt;br /&gt;
|}&lt;br /&gt;
'''Hinweise:'''&lt;br /&gt;
* Ältere Versionen des RP6Loaders bis Version 1.4 findet ihr [[RP6_-_Programmierung#RP6Loader|hier]].&lt;br /&gt;
* Von JM3 Engineering wurde auch ein eigenes Programm [[RP6_Sensor_Board_und_Xtra_Module#Robot-Tool|&amp;quot;'''JM3 Robot-Tool'''&amp;quot;]] veröffentlicht, das im RP6-System (RP6(v2) Base, CONTROL M32, M256 WiFi) anstelle des RobotLoaders verwendet werden kann.&lt;br /&gt;
&lt;br /&gt;
====Projekte====&lt;br /&gt;
* Der RobotLoader 2.3a und [http://www.rn-wissen.de/index.php/LunaAVR LunaAVR] im [http://www.roboternetz.de/community/threads/58168-RobotLoader-2-3a?p=551535&amp;amp;viewfull=1#post551535 Roboternetz RP6 Forum] und im [http://forum.myluna.de/viewtopic.php?f=3&amp;amp;t=24#p94 LunaAVR Forum]&lt;br /&gt;
&lt;br /&gt;
===RP6v2===&lt;br /&gt;
'''Der RP6v2 ([http://www.conrad.de/ce/de/product/191584/RP6-V2-ROBOTERSYSTEM/ 191584]) ist softwarekompatibel zum RP6.'''&lt;br /&gt;
&lt;br /&gt;
Zur Programmierung des [[RP6]] und des RP6v2 gibt es einen eigenen Artikel: [[RP6 - Programmierung]]&lt;br /&gt;
&lt;br /&gt;
===RP6v2 M256 WiFi Platine===&lt;br /&gt;
&lt;br /&gt;
====Dokumentation====&lt;br /&gt;
Die Dokumentation (Anleitung der RP6v2 M256 WiFi und des WiFi-Moduls RN-171 WiFly) befindet sich [http://www.arexx.com/rp6/html/de/soft_doc_rp6m256.htm hier].&lt;br /&gt;
&lt;br /&gt;
=====Manuals=====&lt;br /&gt;
=====Schematics=====&lt;br /&gt;
=====Datasheets=====&lt;br /&gt;
&lt;br /&gt;
====Demo-Programmme====&lt;br /&gt;
Die RP6v2 M256 WiFi Demo Programme sind [http://www.arexx.com/rp6/html/de/soft_doc_rp6m256.htm hier] zu finden.&lt;br /&gt;
&lt;br /&gt;
=====Bug-Report=====&lt;br /&gt;
In [http://www.roboternetz.de/community/threads/64362-Programmstart-mit-Hindernissen diesem Thread] des Roboternetz-Forums geht es um eine Fehlfunktion der Programme ''Example_09_Move'' und ''Example_10_Move2'' für die RP6v2 M256 WiFi. Diese Demos werden nicht korrekt ausgeführt, wenn sie über WLAN gestartet werden. Sie funktionieren jedoch normal, wenn sie mit dem START/STOP-Button der RP6v2 Base gestartet werden.&lt;br /&gt;
&lt;br /&gt;
Dieses Fehlverhalten der beiden Demos (aus [http://www.arexx.com/rp6/downloads/RP6Examples_20120725f.zip Version 1.8 der RP6 Examples vom 25.07.2012]) kann durch Einfügen der Zeilen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	I2CTWI_transmitByte(0, 0);&lt;br /&gt;
	mSleep(200);&lt;br /&gt;
	I2CTWI_transmitByte(0, 0);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
... in ''Example_09_Move'' ab Zeile 129 und in ''Example_10_Move2'' ab Zeile 699 abgestellt werden.&lt;br /&gt;
&lt;br /&gt;
====Library====&lt;br /&gt;
Die Library für die RP6v2 M256 WiFi besteht aus folgenden 21 Dateien:&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |Library&lt;br /&gt;
 |Datei&lt;br /&gt;
 |Funktion&lt;br /&gt;
 |-&lt;br /&gt;
 |RP6M256&lt;br /&gt;
 |RP6M256.h&lt;br /&gt;
 |RP6M256 Hardware-Konfiguration&lt;br /&gt;
 |-&lt;br /&gt;
 |RP6M256&lt;br /&gt;
 |RP6M256Lib.h&lt;br /&gt;
 |RP6M256 Library Header&lt;br /&gt;
 |-&lt;br /&gt;
 |RP6M256&lt;br /&gt;
 |RP6M256Lib.c&lt;br /&gt;
 |RP6M256 Library&lt;br /&gt;
 |-&lt;br /&gt;
 |RP6M256uart&lt;br /&gt;
 |RP6M256uart.h&lt;br /&gt;
 |RS232 Funktionen Header&lt;br /&gt;
 |-&lt;br /&gt;
 |RP6M256uart&lt;br /&gt;
 |RP6M256uart.c&lt;br /&gt;
 |RS232 Funktionen&lt;br /&gt;
 |-&lt;br /&gt;
 |RP6M256_I2CMaster&lt;br /&gt;
 |RP6M256_I2CMasterLib.h&lt;br /&gt;
 |I2C Master Library Header&lt;br /&gt;
 |-&lt;br /&gt;
 |RP6M256_I2CMaster&lt;br /&gt;
 |RP6M256_I2CMasterLib.c&lt;br /&gt;
 |I2C Master Library&lt;br /&gt;
 |-&lt;br /&gt;
 |RP6M256_WIFI&lt;br /&gt;
 |RP6M256_WIFIlib.h&lt;br /&gt;
 |WIFI Library Header&lt;br /&gt;
 |-&lt;br /&gt;
 |RP6M256_WIFI&lt;br /&gt;
 |RP6M256_WIFIlib.c&lt;br /&gt;
 |WIFI Library&lt;br /&gt;
 |-&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |-&lt;br /&gt;
 |SDC&lt;br /&gt;
 |byteordering.h&lt;br /&gt;
 |Byte-order handling header&lt;br /&gt;
 |-&lt;br /&gt;
 |SDC&lt;br /&gt;
 |byteordering.c&lt;br /&gt;
 |Byte-order handling implementation&lt;br /&gt;
 |-&lt;br /&gt;
 |SDC&lt;br /&gt;
 |fat_config.h&lt;br /&gt;
 |FAT configuration&lt;br /&gt;
 |-&lt;br /&gt;
 |SDC&lt;br /&gt;
 |fat.h&lt;br /&gt;
 |FAT header&lt;br /&gt;
 |-&lt;br /&gt;
 |SDC&lt;br /&gt;
 |fat.c&lt;br /&gt;
 |FAT implementation&lt;br /&gt;
 |-&lt;br /&gt;
 |SDC&lt;br /&gt;
 |partition_config.h&lt;br /&gt;
 |Partition configuration&lt;br /&gt;
 |-&lt;br /&gt;
 |SDC&lt;br /&gt;
 |partition.h&lt;br /&gt;
 |Partition table header&lt;br /&gt;
 |-&lt;br /&gt;
 |SDC&lt;br /&gt;
 |partition.c&lt;br /&gt;
 |Partition table implementation&lt;br /&gt;
 |-&lt;br /&gt;
 |SDC&lt;br /&gt;
 |sd-reader_config.h&lt;br /&gt;
 |Common sd-reader configuration (all modules)&lt;br /&gt;
 |-&lt;br /&gt;
 |SDC&lt;br /&gt;
 |sd_raw_config.h&lt;br /&gt;
 |MMC/SD support configuration&lt;br /&gt;
 |-&lt;br /&gt;
 |SDC&lt;br /&gt;
 |sd_raw.h&lt;br /&gt;
 |MMC/SD/SDHC raw access header&lt;br /&gt;
 |-&lt;br /&gt;
 |SDC&lt;br /&gt;
 |sd_raw.c&lt;br /&gt;
 |MMC/SD/SDHC raw access implementation&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=====Versionen=====&lt;br /&gt;
Hier eine Tabelle der (mir) bekannten Library Versionen der RP6v2 M256 WiFi:&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |ZIP-Datum&lt;br /&gt;
 |VERSION_&lt;br /&gt;
 |RP6M256Library&lt;br /&gt;
 |RP6LIB_VERSION&lt;br /&gt;
 |RP6M256.h&lt;br /&gt;
 |RP6M256Lib&lt;br /&gt;
 |WifiLib&lt;br /&gt;
 |UartLib&lt;br /&gt;
 |I2CMasterLib&lt;br /&gt;
 |SDCLib **&lt;br /&gt;
 |-&lt;br /&gt;
 |24.02.2012&lt;br /&gt;
 |1.7&lt;br /&gt;
 |1.0_24.02.12&lt;br /&gt;
 |16&lt;br /&gt;
 |1.0_24.02.12&lt;br /&gt;
 |1.0_24.02.12&lt;br /&gt;
 |1.0_24.02.12&lt;br /&gt;
 |1.0_24.02.12&lt;br /&gt;
 |(1.0_24.02.12)&lt;br /&gt;
 |?&lt;br /&gt;
 |-&lt;br /&gt;
 |16.07.2012&lt;br /&gt;
 |[http://www.arexx.com/rp6/downloads/RP6Examples_20120716.zip 1.7] *&lt;br /&gt;
 |1.1_16.07.12&lt;br /&gt;
 |16&lt;br /&gt;
 |1.1_16.07.12&lt;br /&gt;
 |1.1_16.07.12&lt;br /&gt;
 |1.1_16.07.12&lt;br /&gt;
 |1.1_16.07.12&lt;br /&gt;
 |(1.0_24.02.12)&lt;br /&gt;
 |(2006-2011)&lt;br /&gt;
 |-&lt;br /&gt;
 |25.07.2012&lt;br /&gt;
 |[http://www.arexx.com/rp6/downloads/RP6Examples_20120725.zip 1.8]&lt;br /&gt;
 |1.1_16.07.12&lt;br /&gt;
 |16&lt;br /&gt;
 |1.1_16.07.12&lt;br /&gt;
 |1.1_16.07.12&lt;br /&gt;
 |1.1_16.07.12&lt;br /&gt;
 |1.1_16.07.12&lt;br /&gt;
 |(1.0_24.02.12)&lt;br /&gt;
 |(2006-2011)&lt;br /&gt;
 |-&lt;br /&gt;
 |25.07.2012 ²&lt;br /&gt;
 |[http://www.arexx.com/rp6/downloads/RP6Examples_20120725f.zip 1.8]&lt;br /&gt;
 |1.1_16.07.12&lt;br /&gt;
 |16&lt;br /&gt;
 |1.1_16.07.12&lt;br /&gt;
 |1.1_16.07.12&lt;br /&gt;
 |1.1_16.07.12&lt;br /&gt;
 |1.1_16.07.12&lt;br /&gt;
 |(1.0_24.02.12)&lt;br /&gt;
 |(2006-2011)&lt;br /&gt;
|}&lt;br /&gt;
'''Zu *:''' Ab der Version 1.7 sind auch die Libraries und Examples der RP6v2 Base und CONTROL M32 enthalten! Ältere Versionen dieser Libraries und Examples bis Version 1.5 findet ihr [[RP6_-_Programmierung#Versionen|hier]]!&lt;br /&gt;
&lt;br /&gt;
'''Zu **:''' Die SDC Library ist eine Open Source Bibliothek für den Zugriff auf SD-Karten. Sie steht unter der GNU General Public License version 2. Geschrieben wurde sie von Roland Riegel; sein [http://www.roland-riegel.de/sd-reader/index.html Projekt] könnt ihr im Internet verfolgen. Eventuelle Updates werden dort auch veröffentlicht.&lt;br /&gt;
Die Projektseiten sind auch im Verzeichnis ...\RP6Lib\RP6control_M256_WIFI\sdc\doc\html\ der RP6Examples zu finden. Ihr könnt in dem Verzeichnis die Datei &amp;quot;index.html&amp;quot; starten, um sie anzuzeigen.&lt;br /&gt;
&lt;br /&gt;
'''Zu ²:''' Die Datei heißt RP6Examples_20120725'''f'''.zip. Mir ist nicht bekannt, ob ein Unterschied zur RP6Examples_20120725.zip besteht.&lt;br /&gt;
&lt;br /&gt;
In der 1. Spalte findet ihr das Datum der RP6Examples.zip Datei, in der die Library enthalten ist. Die 2. Spalte nennt die Version, die im Dateinamen der VERSION_x.x.txt Datei als x.x vorkommt. In der 3. Spalte steht die Versionsangabe der RP6M256Library laut Angabe in der VERSION_x.x.txt Datei.&lt;br /&gt;
&lt;br /&gt;
In der 4. Spalte gebe ich den Wert der Konstante RP6LIB_VERSION an. Es gibt sie ab den RP6v2 Base und CONTROL M32 Examples vom 16.10.2007. In den Spalten 5 bis 10 führe ich nacheinander die Versionsnummern und ggf. das in der Datei genannte Datum der Header-Datei/Library an: RP6M256.h, RP6M256Lib, WifiLib, UartLib, I2CMasterLib, SDCLib.&lt;br /&gt;
&lt;br /&gt;
=====RP6M256=====&lt;br /&gt;
======Bug-Report======&lt;br /&gt;
======Konfiguration======&lt;br /&gt;
======Port-Verwendung======&lt;br /&gt;
Die Verwendung der Ports des RP6v2 M256 WiFi Microcontrollers wird festgelegt in der Header-Datei &amp;quot;RP6M256.h&amp;quot;. In dieser Datei wird auch noch Folgendes aufgeführt:&lt;br /&gt;
* Quarzfrequenz (F_CPU) &lt;br /&gt;
* True/false Definition &lt;br /&gt;
* Verschiedene Macros &lt;br /&gt;
* Baudraten und Baudraten-Tabelle &lt;br /&gt;
&lt;br /&gt;
Hier eine Tabelle mit den Port-Definitionen für die RP6v2 M256 WiFi:&lt;br /&gt;
 Erklärung der Spalten:&lt;br /&gt;
 Port        -&amp;gt; Atmel Portpin Bezeichnung&lt;br /&gt;
 Name        -&amp;gt; Atmel Funktionsbezeichnung&lt;br /&gt;
 In/Out      -&amp;gt; Eingang (In) oder Ausgang (Out)&lt;br /&gt;
 Pullup      -&amp;gt; Falls Eingang: Pullup ein- (1) oder ausgeschaltet (0)&lt;br /&gt;
 Wert        -&amp;gt; Falls Ausgang: Logikpegel high (1) oder low (0)&lt;br /&gt;
 Funktion    -&amp;gt; Schnittstellenfunktion&lt;br /&gt;
 Bezeichnung -&amp;gt; Portpin Bezeichnung der Library&lt;br /&gt;
 Stecker     -&amp;gt; Portpin verfügbar an STECKER: Pin&lt;br /&gt;
 Anmerkungen -&amp;gt; Kommentare (ADC_xx: ADC-Kanal Bezeichnung)&lt;br /&gt;
&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |Port&lt;br /&gt;
 |Name&lt;br /&gt;
 |In/Out&lt;br /&gt;
 |Pullup&lt;br /&gt;
 |Wert&lt;br /&gt;
 |Funktion&lt;br /&gt;
 |Bezeichnung&lt;br /&gt;
 |Stecker&lt;br /&gt;
 |Anmerkungen&lt;br /&gt;
 |-&lt;br /&gt;
 |PA0&lt;br /&gt;
 |AD0&lt;br /&gt;
 |Out&lt;br /&gt;
 |&lt;br /&gt;
 |0&lt;br /&gt;
 |&lt;br /&gt;
 |DISP_D0&lt;br /&gt;
 |DISPIO: 7&lt;br /&gt;
 |Display D0&lt;br /&gt;
 |-&lt;br /&gt;
 |PA1&lt;br /&gt;
 |AD1&lt;br /&gt;
 |Out&lt;br /&gt;
 |&lt;br /&gt;
 |0&lt;br /&gt;
 |&lt;br /&gt;
 |DISP_D1&lt;br /&gt;
 |DISPIO: 8&lt;br /&gt;
 |Display D1 &lt;br /&gt;
 |-&lt;br /&gt;
 |PA2&lt;br /&gt;
 |AD2&lt;br /&gt;
 |Out&lt;br /&gt;
 |&lt;br /&gt;
 |0&lt;br /&gt;
 |&lt;br /&gt;
 |DISP_D2&lt;br /&gt;
 |DISPIO: 9&lt;br /&gt;
 |Display D2 &lt;br /&gt;
 |-&lt;br /&gt;
 |PA3&lt;br /&gt;
 |AD3&lt;br /&gt;
 |Out&lt;br /&gt;
 |&lt;br /&gt;
 |0&lt;br /&gt;
 |&lt;br /&gt;
 |DISP_D3&lt;br /&gt;
 |DISPIO: 10&lt;br /&gt;
 |Display D3&lt;br /&gt;
 |-&lt;br /&gt;
 |PA4&lt;br /&gt;
 |AD4&lt;br /&gt;
 |Out&lt;br /&gt;
 |&lt;br /&gt;
 |0&lt;br /&gt;
 |&lt;br /&gt;
 |DISP_D4&lt;br /&gt;
 |DISPIO: 11&lt;br /&gt;
 |Display D4&lt;br /&gt;
 |-&lt;br /&gt;
 |PA5&lt;br /&gt;
 |AD5&lt;br /&gt;
 |Out&lt;br /&gt;
 |&lt;br /&gt;
 |0&lt;br /&gt;
 |&lt;br /&gt;
 |DISP_D5&lt;br /&gt;
 |DISPIO: 12&lt;br /&gt;
 |Display D5&lt;br /&gt;
 |-&lt;br /&gt;
 |PA6&lt;br /&gt;
 |AD6&lt;br /&gt;
 |Out&lt;br /&gt;
 |&lt;br /&gt;
 |0&lt;br /&gt;
 |&lt;br /&gt;
 |DISP_D6&lt;br /&gt;
 |DISPIO: 13&lt;br /&gt;
 |Display D6&lt;br /&gt;
 |-&lt;br /&gt;
 |PA7&lt;br /&gt;
 |AD7&lt;br /&gt;
 |Out&lt;br /&gt;
 |&lt;br /&gt;
 |0&lt;br /&gt;
 |&lt;br /&gt;
 |DISP_D7&lt;br /&gt;
 |DISPIO: 14&lt;br /&gt;
 |Display D7&lt;br /&gt;
 |-&lt;br /&gt;
 |PB0&lt;br /&gt;
 |SS/PCI0&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |SPI_SS *&lt;br /&gt;
 |&lt;br /&gt;
 |SDC Output DAT3 / CS&lt;br /&gt;
 |-&lt;br /&gt;
 |PB1&lt;br /&gt;
 |SCK/PCI1&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |ISP&lt;br /&gt;
 |SPI_SCK *&lt;br /&gt;
 |ISP: 3&lt;br /&gt;
 |SDC Output CLK&lt;br /&gt;
 |-&lt;br /&gt;
 |PB2&lt;br /&gt;
 |MOSI/PCI2&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |ISP&lt;br /&gt;
 |SPI_MOSI *&lt;br /&gt;
 |ISP: 4&lt;br /&gt;
 |SDC Output CMD / DI&lt;br /&gt;
 |-&lt;br /&gt;
 |PB3&lt;br /&gt;
 |MISO/PCI3&lt;br /&gt;
 |In&lt;br /&gt;
 |0&lt;br /&gt;
 |&lt;br /&gt;
 |ISP&lt;br /&gt;
 |SPI_MISO ***&lt;br /&gt;
 |ISP: 1&lt;br /&gt;
 |SDC Input DAT0 / DO&lt;br /&gt;
 |-&lt;br /&gt;
 |PB4&lt;br /&gt;
 |OC2A/PCI4&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |OC2A_PI4&lt;br /&gt;
 |PWM23: 5&lt;br /&gt;
 |frei&lt;br /&gt;
 |-&lt;br /&gt;
 |PB5&lt;br /&gt;
 |OC1A/PCI5&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |OC1A_PI5&lt;br /&gt;
 |PWM01: 7&lt;br /&gt;
 |frei&lt;br /&gt;
 |-&lt;br /&gt;
 |PB6&lt;br /&gt;
 |OC1B/PCI6&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |OC1B_PI6&lt;br /&gt;
 |PWM01: 9&lt;br /&gt;
 |frei&lt;br /&gt;
 |-&lt;br /&gt;
 |PB7&lt;br /&gt;
 |OC0A/OC1C/PCI7&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |OC0A_OCM_PI7&lt;br /&gt;
 |PWM01: 4&lt;br /&gt;
 |frei&lt;br /&gt;
 |-&lt;br /&gt;
 |PC0&lt;br /&gt;
 |A8&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_PC0&lt;br /&gt;
 |PC01: 2&lt;br /&gt;
 |XMEM A8, frei&lt;br /&gt;
 |-&lt;br /&gt;
 |PC1&lt;br /&gt;
 |A9&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_PC1&lt;br /&gt;
 |PC01: 1&lt;br /&gt;
 |XMEM A9, frei&lt;br /&gt;
 |-&lt;br /&gt;
 |PC2&lt;br /&gt;
 |A10&lt;br /&gt;
 |Out&lt;br /&gt;
 |&lt;br /&gt;
 |0&lt;br /&gt;
 |&lt;br /&gt;
 |SLED1&lt;br /&gt;
 |&lt;br /&gt;
 |Status LED SL1&lt;br /&gt;
 |-&lt;br /&gt;
 |PC3&lt;br /&gt;
 |A11&lt;br /&gt;
 |Out&lt;br /&gt;
 |&lt;br /&gt;
 |0&lt;br /&gt;
 |&lt;br /&gt;
 |SLED2&lt;br /&gt;
 |&lt;br /&gt;
 |Status LED SL2&lt;br /&gt;
 |-&lt;br /&gt;
 |PC4&lt;br /&gt;
 |A12&lt;br /&gt;
 |Out&lt;br /&gt;
 |&lt;br /&gt;
 |0&lt;br /&gt;
 |&lt;br /&gt;
 |SLED3&lt;br /&gt;
 |&lt;br /&gt;
 |Status LED SL3&lt;br /&gt;
 |-&lt;br /&gt;
 |PC5&lt;br /&gt;
 |A13&lt;br /&gt;
 |Out&lt;br /&gt;
 |&lt;br /&gt;
 |0&lt;br /&gt;
 |&lt;br /&gt;
 |SLED4&lt;br /&gt;
 |&lt;br /&gt;
 |Status LED SL4&lt;br /&gt;
 |-&lt;br /&gt;
 |PC6&lt;br /&gt;
 |A14&lt;br /&gt;
 |Out&lt;br /&gt;
 |&lt;br /&gt;
 |0&lt;br /&gt;
 |&lt;br /&gt;
 |WLAN_GPIO14_OUT *&lt;br /&gt;
 |&lt;br /&gt;
 |WLAN Output GPIO14&lt;br /&gt;
 |-&lt;br /&gt;
 |PC7&lt;br /&gt;
 |A15&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |WLAN_GPIO8_IN **&lt;br /&gt;
 |&lt;br /&gt;
 |WLAN Input GPIO8&lt;br /&gt;
 |-&lt;br /&gt;
 |PD0&lt;br /&gt;
 |SCL/INT0&lt;br /&gt;
 |In ²&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |I2C-Bus&lt;br /&gt;
 |SCL&lt;br /&gt;
 |XBUS: 10&lt;br /&gt;
 |XBUS SCL&lt;br /&gt;
 |-&lt;br /&gt;
 |PD1&lt;br /&gt;
 |SDA/INT1&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |I2C-Bus&lt;br /&gt;
 |SDA&lt;br /&gt;
 |XBUS: 12&lt;br /&gt;
 |XBUS SDA&lt;br /&gt;
 |-&lt;br /&gt;
 |PD2&lt;br /&gt;
 |RXD1/INT2&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |UART1&lt;br /&gt;
 |RXD1&lt;br /&gt;
 |USPI15: 8&lt;br /&gt;
 |USART1 RX, frei&lt;br /&gt;
 |-&lt;br /&gt;
 |PD3&lt;br /&gt;
 |TXD1/INT3&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |UART1&lt;br /&gt;
 |TXD1&lt;br /&gt;
 |USPI15: 6&lt;br /&gt;
 |USART1 TX, frei&lt;br /&gt;
 |-&lt;br /&gt;
 |PD4&lt;br /&gt;
 |ICP1&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_PD4_ICP1&lt;br /&gt;
 |PWM01: 1&lt;br /&gt;
 |frei&lt;br /&gt;
 |-&lt;br /&gt;
 |PD5&lt;br /&gt;
 |XCK1&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_PD5_XCK1&lt;br /&gt;
 |USPI15: 4&lt;br /&gt;
 |frei&lt;br /&gt;
 |-&lt;br /&gt;
 |PD6&lt;br /&gt;
 |T1&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_PD6_T1&lt;br /&gt;
 |PWM01: 3&lt;br /&gt;
 |frei&lt;br /&gt;
 |-&lt;br /&gt;
 |PD7&lt;br /&gt;
 |T0&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_PD7_T2&lt;br /&gt;
 |PWM01: 6&lt;br /&gt;
 |frei&lt;br /&gt;
 |-&lt;br /&gt;
 |PE0&lt;br /&gt;
 |RXD0/PCI8&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |UART0&lt;br /&gt;
 |RXD0&lt;br /&gt;
 |PROGU: 2&lt;br /&gt;
 |USART RX&lt;br /&gt;
 |-&lt;br /&gt;
 |PE1&lt;br /&gt;
 |TXD0&lt;br /&gt;
 |Out&lt;br /&gt;
 |&lt;br /&gt;
 |0&lt;br /&gt;
 |UART0&lt;br /&gt;
 |TXD0&lt;br /&gt;
 |PROGU: 3&lt;br /&gt;
 |USART TX&lt;br /&gt;
 |-&lt;br /&gt;
 |PE2&lt;br /&gt;
 |XCK0/AIN0&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_PE2_XCK0_AIN0&lt;br /&gt;
 |ADCIO2: 8&lt;br /&gt;
 |frei&lt;br /&gt;
 |-&lt;br /&gt;
 |PE3&lt;br /&gt;
 |OC3A/AIN1&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_PE3_OC3A_AIN1&lt;br /&gt;
 |ADCIO2: 4&lt;br /&gt;
 |frei&lt;br /&gt;
 |-&lt;br /&gt;
 |PE4&lt;br /&gt;
 |OC3B/INT4&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_PE4_OC3B_I4&lt;br /&gt;
 |PWM23: 9&lt;br /&gt;
 |frei&lt;br /&gt;
 |-&lt;br /&gt;
 |PE5&lt;br /&gt;
 |OC3C/INT5&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_PE5_OC3C_I5&lt;br /&gt;
 |PWM23: 4&lt;br /&gt;
 |frei&lt;br /&gt;
 |-&lt;br /&gt;
 |PE6&lt;br /&gt;
 |T3/INT6&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_PE6_T3_I6&lt;br /&gt;
 |PWM23: 3&lt;br /&gt;
 |frei&lt;br /&gt;
 |-&lt;br /&gt;
 |PE7&lt;br /&gt;
 |CLKO/ICP3/INT7&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_PE7_ICP3_I7&lt;br /&gt;
 |PWM23: 1&lt;br /&gt;
 |frei&lt;br /&gt;
 |-&lt;br /&gt;
 |PF0&lt;br /&gt;
 |ADC0&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_ADC0&lt;br /&gt;
 |ADCIO1: 3&lt;br /&gt;
 |ADC_0 (frei)&lt;br /&gt;
 |-&lt;br /&gt;
 |PF1&lt;br /&gt;
 |ADC1&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_ADC1&lt;br /&gt;
 |ADCIO1: 1&lt;br /&gt;
 |ADC_1 (frei)&lt;br /&gt;
 |-&lt;br /&gt;
 |PF2&lt;br /&gt;
 |ADC2&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_ADC2&lt;br /&gt;
 |ADCIO1: 5&lt;br /&gt;
 |ADC_2 (frei)&lt;br /&gt;
 |-&lt;br /&gt;
 |PF3&lt;br /&gt;
 |ADC3&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_ADC3&lt;br /&gt;
 |ADCIO1: 7&lt;br /&gt;
 |ADC_3 (frei)&lt;br /&gt;
 |-&lt;br /&gt;
 |PF4&lt;br /&gt;
 |ADC4/TCK&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |JTAG&lt;br /&gt;
 |IO_ADC4&lt;br /&gt;
 |ADCIO1: 9&lt;br /&gt;
 |ADC_4 (frei)&lt;br /&gt;
 |-&lt;br /&gt;
 |PF5&lt;br /&gt;
 |ADC5/TMS&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |JTAG&lt;br /&gt;
 |IO_ADC5&lt;br /&gt;
 |ADCIO1: 11&lt;br /&gt;
 |ADC_5 (frei)&lt;br /&gt;
 |-&lt;br /&gt;
 |PF6&lt;br /&gt;
 |ADC6/TDO&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |JTAG&lt;br /&gt;
 |IO_ADC6&lt;br /&gt;
 |ADCIO1: 12&lt;br /&gt;
 |ADC_6 (frei)&lt;br /&gt;
 |-&lt;br /&gt;
 |PF7&lt;br /&gt;
 |ADC7/TDI&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |JTAG&lt;br /&gt;
 |IO_ADC7&lt;br /&gt;
 |ADCIO1: 13&lt;br /&gt;
 |ADC_7 (frei)&lt;br /&gt;
 |-&lt;br /&gt;
 |PG0&lt;br /&gt;
 |WR&lt;br /&gt;
 |Out&lt;br /&gt;
 |&lt;br /&gt;
 |0&lt;br /&gt;
 |&lt;br /&gt;
 |DISP_WR&lt;br /&gt;
 |DISPIO: 5&lt;br /&gt;
 |Display WR&lt;br /&gt;
 |-&lt;br /&gt;
 |PG1&lt;br /&gt;
 |RD&lt;br /&gt;
 |Out&lt;br /&gt;
 |&lt;br /&gt;
 |0&lt;br /&gt;
 |&lt;br /&gt;
 |DISP_EN_RD&lt;br /&gt;
 |DISPIO: 6&lt;br /&gt;
 |Display RD&lt;br /&gt;
 |-&lt;br /&gt;
 |PG2&lt;br /&gt;
 |ALE&lt;br /&gt;
 |Out&lt;br /&gt;
 |&lt;br /&gt;
 |0&lt;br /&gt;
 |&lt;br /&gt;
 |DISP_RS_ALE&lt;br /&gt;
 |DISPIO: 4&lt;br /&gt;
 |Display ALE&lt;br /&gt;
 |-&lt;br /&gt;
 |PG3&lt;br /&gt;
 |TOSC2&lt;br /&gt;
 |In&lt;br /&gt;
 |1 &amp;quot;&amp;quot;&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |BUTTON_SW2&lt;br /&gt;
 |&lt;br /&gt;
 |Taster SW2&lt;br /&gt;
 |-&lt;br /&gt;
 |PG4&lt;br /&gt;
 |TOSC1&lt;br /&gt;
 |In&lt;br /&gt;
 |1 &amp;quot;&amp;quot;&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |BUTTON_SW1&lt;br /&gt;
 |&lt;br /&gt;
 |Taster SW1&lt;br /&gt;
 |-&lt;br /&gt;
 |PG5&lt;br /&gt;
 |OC0B&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_OC0B&lt;br /&gt;
 |PWM01: 5&lt;br /&gt;
 |frei&lt;br /&gt;
 |-&lt;br /&gt;
 |PH0&lt;br /&gt;
 |RXD2&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |UART2&lt;br /&gt;
 |RXD2&lt;br /&gt;
 |USPI24: 8&lt;br /&gt;
 |USART2 RX, frei&lt;br /&gt;
 |-&lt;br /&gt;
 |PH1&lt;br /&gt;
 |TXD2&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |UART2&lt;br /&gt;
 |TXD2&lt;br /&gt;
 |USPI24: 6&lt;br /&gt;
 |USART2 TX, frei&lt;br /&gt;
 |-&lt;br /&gt;
 |PH2&lt;br /&gt;
 |XCK2&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_PH2_XCK2&lt;br /&gt;
 |USPI24: 4&lt;br /&gt;
 |frei&lt;br /&gt;
 |-&lt;br /&gt;
 |PH3&lt;br /&gt;
 |OC4A&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_PH3_OC4A&lt;br /&gt;
 |USPI24: 9&lt;br /&gt;
 |frei&lt;br /&gt;
 |-&lt;br /&gt;
 |PH4&lt;br /&gt;
 |OC4B&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_PH4_OC4B&lt;br /&gt;
 |USPI24: 7&lt;br /&gt;
 |frei&lt;br /&gt;
 |-&lt;br /&gt;
 |PH5&lt;br /&gt;
 |OC4C&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_PH5_OC4C&lt;br /&gt;
 |USPI24: 5&lt;br /&gt;
 |frei&lt;br /&gt;
 |-&lt;br /&gt;
 |PH6&lt;br /&gt;
 |OC2B&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_PH6_OC2B&lt;br /&gt;
 |PWM23: 7&lt;br /&gt;
 |frei&lt;br /&gt;
 |-&lt;br /&gt;
 |PH7&lt;br /&gt;
 |T4&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_PH7_T4&lt;br /&gt;
 |USPI24: 3&lt;br /&gt;
 |frei&lt;br /&gt;
 |-&lt;br /&gt;
 |PJ0&lt;br /&gt;
 |RXD3/PCI9&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |UART3&lt;br /&gt;
 |WLAN_RXD3 **&lt;br /&gt;
 |&lt;br /&gt;
 |WLAN USART RX&lt;br /&gt;
 |-&lt;br /&gt;
 |PJ1&lt;br /&gt;
 |TXD3/PCI10&lt;br /&gt;
 |Out&lt;br /&gt;
 |&lt;br /&gt;
 |0&lt;br /&gt;
 |UART3&lt;br /&gt;
 |WLAN_TXD3 *&lt;br /&gt;
 |&lt;br /&gt;
 |WLAN USART TX&lt;br /&gt;
 |-&lt;br /&gt;
 |PJ2&lt;br /&gt;
 |XCK3/PCI11&lt;br /&gt;
 |Out&lt;br /&gt;
 |&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |WLAN_RTS *&lt;br /&gt;
 |&lt;br /&gt;
 |WLAN Output RTS&lt;br /&gt;
 |-&lt;br /&gt;
 |PJ3&lt;br /&gt;
 |PCI12&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |INT1_PI12&lt;br /&gt;
 |XBUS: 8&lt;br /&gt;
 |XBUS INT1&lt;br /&gt;
 |-&lt;br /&gt;
 |PJ4&lt;br /&gt;
 |PCI13&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |INTU_PI13&lt;br /&gt;
 |XBUS: 7&lt;br /&gt;
 |XBUS INTU&lt;br /&gt;
 |-&lt;br /&gt;
 |PJ5&lt;br /&gt;
 |PCI14&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |INT3_PI14&lt;br /&gt;
 |XBUS: 9&lt;br /&gt;
 |XBUS INT3&lt;br /&gt;
 |-&lt;br /&gt;
 |PJ6&lt;br /&gt;
 |PCI15&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |INT2_PI15&lt;br /&gt;
 |XBUS: 11&lt;br /&gt;
 |XBUS INT2&lt;br /&gt;
 |-&lt;br /&gt;
 |PJ7&lt;br /&gt;
 |&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |WLAN_CTS **&lt;br /&gt;
 |&lt;br /&gt;
 |WLAN Input CTS&lt;br /&gt;
 |-&lt;br /&gt;
 |PK0&lt;br /&gt;
 |ADC8/PCI16&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_ADC8_PI16&lt;br /&gt;
 |ADCIO2: 1&lt;br /&gt;
 |ADC_8 (frei)&lt;br /&gt;
 |-&lt;br /&gt;
 |PK1&lt;br /&gt;
 |ADC9/PCI17&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_ADC9_PI17&lt;br /&gt;
 |ADCIO2: 3&lt;br /&gt;
 |ADC_9 (frei)&lt;br /&gt;
 |-&lt;br /&gt;
 |PK2&lt;br /&gt;
 |ADC10/PCI18&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_ADC10_PI18&lt;br /&gt;
 |ADCIO2: 5&lt;br /&gt;
 |ADC_10 (frei)&lt;br /&gt;
 |-&lt;br /&gt;
 |PK3&lt;br /&gt;
 |ADC11/PCI19&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_ADC11_PI19&lt;br /&gt;
 |ADCIO2: 7&lt;br /&gt;
 |ADC_11 (frei)&lt;br /&gt;
 |-&lt;br /&gt;
 |PK4&lt;br /&gt;
 |ADC12/PCI20&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_ADC12_PI20&lt;br /&gt;
 |ADCIO2: 9&lt;br /&gt;
 |ADC_12 (frei)&lt;br /&gt;
 |-&lt;br /&gt;
 |PK5&lt;br /&gt;
 |ADC13/PCI21&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_ADC13_PI21&lt;br /&gt;
 |PWM01: 8&lt;br /&gt;
 |ADC_13 (frei)&lt;br /&gt;
 |-&lt;br /&gt;
 |PK6&lt;br /&gt;
 |ADC14/PCI22&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_ADC14_PI22&lt;br /&gt;
 |PWM23: 8&lt;br /&gt;
 |ADC_14 (frei)&lt;br /&gt;
 |-&lt;br /&gt;
 |PK7&lt;br /&gt;
 |ADC15/PCI23&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_ADC15_PI23&lt;br /&gt;
 |PWM23: 6&lt;br /&gt;
 |ADC_15 (frei)&lt;br /&gt;
 |-&lt;br /&gt;
 |PL0&lt;br /&gt;
 |ICP4&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_PL0_ICP4&lt;br /&gt;
 |USPI24: 1&lt;br /&gt;
 |frei&lt;br /&gt;
 |-&lt;br /&gt;
 |PL1&lt;br /&gt;
 |ICP5&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_PL1_ICP5&lt;br /&gt;
 |USPI15: 1&lt;br /&gt;
 |frei&lt;br /&gt;
 |-&lt;br /&gt;
 |PL2&lt;br /&gt;
 |T5&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_PL2_T5&lt;br /&gt;
 |USPI15: 3&lt;br /&gt;
 |frei&lt;br /&gt;
 |-&lt;br /&gt;
 |PL3&lt;br /&gt;
 |OC5A&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_PL3_OC5A&lt;br /&gt;
 |USPI15: 5&lt;br /&gt;
 |frei&lt;br /&gt;
 |-&lt;br /&gt;
 |PL4&lt;br /&gt;
 |OC5B&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_PL4_OC5B&lt;br /&gt;
 |USPI15: 9&lt;br /&gt;
 |frei&lt;br /&gt;
 |-&lt;br /&gt;
 |PL5&lt;br /&gt;
 |OC5C&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_PL5_OC5C&lt;br /&gt;
 |USPI15: 7&lt;br /&gt;
 |frei&lt;br /&gt;
 |-&lt;br /&gt;
 |PL6&lt;br /&gt;
 |&lt;br /&gt;
 |Out&lt;br /&gt;
 |³&lt;br /&gt;
 |0&lt;br /&gt;
 |&lt;br /&gt;
 |WLAN_WAKE&lt;br /&gt;
 |&lt;br /&gt;
 |WLAN Output WAKE&lt;br /&gt;
 |-&lt;br /&gt;
 |PL7&lt;br /&gt;
 |&lt;br /&gt;
 |Out&lt;br /&gt;
 |²&lt;br /&gt;
 |0&lt;br /&gt;
 |&lt;br /&gt;
 |WLAN_RESET&lt;br /&gt;
 |&lt;br /&gt;
 |WLAN Output RESET&lt;br /&gt;
 |-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
 Zeichen:&lt;br /&gt;
 *    Verbunden mit einem Eingang des I2C-Pegelwandlers NC7WZ16&lt;br /&gt;
 **   Verbunden mit einem Ausgang des I2C-Pegelwandlers NC7WZ16&lt;br /&gt;
 ***  Verbunden mit einem Ausgang des I2C-Pegelwandlers NC7WZ16&lt;br /&gt;
      über Widerstand 680 Ohm (R7)&lt;br /&gt;
 &lt;br /&gt;
 ²    Verbunden mit Pulldown 10 kOhm (R22) und MOSFET Gate (Q2)&lt;br /&gt;
 ³    Verbunden mit Spannungsteiler 68 / 100 kOhm (R21 / R23)&lt;br /&gt;
 &amp;quot;&amp;quot;   Verbunden mit Pullup-Widerstand 68 kOhm (und Taster nach GND)&lt;br /&gt;
 &lt;br /&gt;
 Kürzel (Spalte Name):&lt;br /&gt;
 PCIx     PCINTx&lt;br /&gt;
 &lt;br /&gt;
 Abkürzungen der IO-Stecker (Spalte Stecker):&lt;br /&gt;
 PWM01    IO_PWM/T0/T1&lt;br /&gt;
 PWM23    IO_PWM/T2/T3&lt;br /&gt;
 USPI15   UART_SPI1/T5&lt;br /&gt;
 USPI24   UART_SPI2/T4&lt;br /&gt;
 ADCIO1   ADC_IO1&lt;br /&gt;
 ADCIO2   ADC_IO2/CMP&lt;br /&gt;
 DISPIO   DISPLAY/IO&lt;br /&gt;
 PC01     PC0/1&lt;br /&gt;
 PROGU    PROG_UART&lt;br /&gt;
&lt;br /&gt;
======Timer-Nutzung======&lt;br /&gt;
&lt;br /&gt;
=====RP6M256uart=====&lt;br /&gt;
=====RP6M256_I2CMaster=====&lt;br /&gt;
=====RP6M256_WIFI=====&lt;br /&gt;
=====SDC=====&lt;br /&gt;
&lt;br /&gt;
====Projekte====&lt;br /&gt;
* Library:&lt;br /&gt;
** [http://www.roboternetz.de/community/threads/58744-RP6-M256-WIFI-Clock-Library RP6 M256 WIFI: Clock Library]&lt;br /&gt;
** [http://www.roboternetz.de/community/threads/58848-RP6-M256-WIFI-DCF77-Library RP6 M256 WIFI: DCF77 Library]&lt;br /&gt;
** [http://www.roboternetz.de/community/threads/66003-Peter-Fleury-s-I2C-Master-Library-f%C3%BCr-RP6 Peter Fleury's I2C Master Library für RP6]&lt;br /&gt;
** [http://www.roboternetz.de/community/threads/66586-RP6v2-Base-CONTROL-M32-M256-WiFi-100%C2%B5s-Stopwatches-Library Library für acht 100µs Stopwatches]&lt;br /&gt;
* Fernbedienung mit dem Browser (Demo):&lt;br /&gt;
** [http://www.roboternetz.de/community/threads/58162-Diskussion-zum-RP6-M256-WIFI-Modul?p=555102&amp;amp;viewfull=1#post555102 LED-Ansteuerung mit dem Browser]&lt;br /&gt;
** [http://www.roboternetz.de/community/threads/58162-Diskussion-zum-RP6-M256-WIFI-Modul?p=555651&amp;amp;viewfull=1#post555651 LEDs setzen und Daten der Browseranforderung anzeigen]&lt;br /&gt;
* I2C-Master für RP6Control M32 und RP6v2 Base (Demos, Library):&lt;br /&gt;
** [http://www.rn-wissen.de/index.php/RP6Control_M32:_I2C-Slave RP6Control M32 I2C-Slave]&lt;br /&gt;
* MultiIO Projekt (Demos, Library):&lt;br /&gt;
** [[RP6 Multi IO Projekt - Software#RP6_M256_WIFI|RP6 Multi IO Projekt - Software RP6 M256 WIFI]]&lt;br /&gt;
* ArduIO Projekt (Demos, Library):&lt;br /&gt;
** [http://rn-wissen.de/wiki/index.php/RP6_ArduIO_-_Software ArduIO Projekt - Software]&lt;br /&gt;
* Fernbedienung mit einer Android App (Demo):&lt;br /&gt;
** [http://www.roboternetz.de/community/threads/65626-RP6-WIFI-und-Wireless-IMU-%28f%C3%BCr-Android%29 RP6 WIFI und Wireless IMU (für Android)]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===RP6 Sensor Board===&lt;br /&gt;
&lt;br /&gt;
'''Die Beschreibung zur Programmierung des RP6 Sensor Boards wurde ausgelagert in einen eigenen [[RP6_Sensor_Board_und_Xtra_Module#RP6_Sensor_Board_3|Artikel]]!'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Erfahrungsberichte==&lt;br /&gt;
&lt;br /&gt;
...in Arbeit...(kann aber gerne ergänzt werden)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Siehe auch==&lt;br /&gt;
* [[RP6]]&lt;br /&gt;
* [[RP6 - Programmierung]]&lt;br /&gt;
* [[RP6 Sensor Board und Xtra Module]]&lt;br /&gt;
* [[RP6 Kamera - Mitmach-Projekt]]&lt;br /&gt;
* [[RP6v2 I2C-Portexpander]]&lt;br /&gt;
* [[RP6v2 USB-RS232-Adapter]]&lt;br /&gt;
* [[RP6v2 Orientierung]]&lt;br /&gt;
* [[RP6 Multi IO Projekt]]&lt;br /&gt;
* [[RP6 Multi IO Projekt - Software]]&lt;br /&gt;
* [[RP6 ArduIO]]&lt;br /&gt;
* [[RP6 ArduIO - Software]]&lt;br /&gt;
* [[Induktive_Ladestation_f%C3%BCr_den_RP6|Induktive Ladestation für den RP6]]&lt;br /&gt;
* [[IR-bake_f%C3%BCr_den_RP6|IR-bake für den RP6]]&lt;br /&gt;
* [[CCRP5]]&lt;br /&gt;
* [[Wild Thumper]]&lt;br /&gt;
* [[Wild Thumper - Programmierung]]&lt;br /&gt;
* [[Yeti]]&lt;br /&gt;
* [[Asuro]]&lt;br /&gt;
* [[C't-Bot]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Weblinks==&lt;br /&gt;
'''Siehe auch die Weblinks im [http://www.rn-wissen.de/index.php/RP6#Weblinks RP6 Artikel]!'''&lt;br /&gt;
&lt;br /&gt;
* Ankündigung des RP6v2 im [http://www.roboternetz.de/community/threads/56964-NEWS-RP6v2-die-neue-Version-2-des-RP6-Robot-Systems RoboterNETZ] und im [http://www.arexx.com/forum/viewtopic.php?f=19&amp;amp;t=1778 AREXX Support Forum]&lt;br /&gt;
* Ankündigung der RP6v2 M256 WiFi und der Testaktion im [http://www.arexx.com/forum/viewtopic.php?f=19&amp;amp;t=1797 AREXX Support Forum]&lt;br /&gt;
* Beginn der &amp;quot;Testaktion: Kostenlose RP6v2-M256-WIFI Module!&amp;quot; im [http://www.roboternetz.de/community/threads/58161-Kostenlose-RP6-M256-WIFI-Module-für-Testanwender! Roboternetz RP6 Forum]&lt;br /&gt;
* Ende der &amp;quot;Testaktion: Kostenlose RP6v2-M256-WIFI Module!&amp;quot; nach Abstimmung im [http://www.roboternetz.de/community/threads/58389-Wählt-Gewinner-der-RP6v2-M256-WIFI-Module Roboternetz RP6 Forum]&lt;br /&gt;
* Newsartikel zur RP6v2 M256 WiFi im [http://www.roboternetz.de/community/threads/58160-Funk-Erweiterungsmodul-für-den-RP6-und-RP6v2-Gratis-für-Tester! RoboterNETZ]&lt;br /&gt;
* Diskussions-Thread zur RP6v2 M256 WiFi im [http://www.roboternetz.de/community/threads/58162-Diskussion-zum-RP6-M256-WIFI-Modul Roboternetz RP6 Forum]&lt;br /&gt;
* Diskussions-Thread zur RP6v2 M256 WiFi [http://www.roboternetz.de/community/threads/59739-Probleme-mit-M256-WIFI-1-2 mit &amp;quot;altem&amp;quot; Bootloader V1.2]&lt;br /&gt;
&lt;br /&gt;
* [http://www.arexx.com/rp6/downloads/RP6M256_WIFI_BOOTLOADER.zip RP6M256_WIFI_BOOTLOADER]&lt;br /&gt;
* [http://arexx.com/rp6/downloads/RP6M256_baudrate_test.zip RP6v2 M256 WiFi Baudraten Test]&lt;br /&gt;
* [http://www.arexx.com/rp6/downloads/rp6m256_wlan_config_de.txt RP6v2 M256 WiFi Liste mit möglichen Problemlösungen]&lt;br /&gt;
* Kleinserie: [http://www.roboternetz.de/community/threads/59797-Kleinserie-hardware-für-die-M256-WIFI Hardware für die RP6v2 M256 WiFi ('''RP6 Multi IO Projekt''')]&lt;br /&gt;
* Kleinserie: [http://www.roboternetz.de/community/threads/65296-I-O-ADC-und-DAC-Erweiterung-f%C3%BCr-RP6-3-3V-und-5V%21 I/O-, ADC- und DAC Erweiterung für RP6??? 3,3V und 5V!? ('''RP6 ArduIO Projekt''')]&lt;br /&gt;
* JM3 Engeneering: [http://www.jm3-engineering.com/rp6.htm RP6 Roboter Erweiterung]&lt;br /&gt;
* Ankündigung einer Sensorerweiterungsplatine für die RP6v2 M256 WiFi im [http://www.roboternetz.de/community/threads/63595-Neue-Hardware-f%C3%BCr-RP6%28v2%29?p=590129&amp;amp;viewfull=1#post590129 Roboternetz RP6 Forum]&lt;br /&gt;
* Erfahrungsbericht zur Sensorerweiterungsplatine im [http://www.arexx.com/forum/viewtopic.php?f=19&amp;amp;t=2498 AREXX Support Forum] und im [http://www.roboternetz.de/community/threads/64414-RP6-Sensor-Board-Erster-Eindruck Roboternetz RP6 Forum]&lt;br /&gt;
&lt;br /&gt;
* [http://www.rn-wissen.de/index.php/RP6_mit_AVR_Studio RP6 mit AVR Studio]&lt;br /&gt;
&lt;br /&gt;
* [http://www.arexx.com/rp6 AREXX RP6 Startseite]&lt;br /&gt;
* [http://www.arexx.com/forum/viewforum.php?f=19 AREXX Support Forum]&lt;br /&gt;
&lt;br /&gt;
* [http://www.conrad.de/ce/de/product/191584/RP6-V2-ROBOTERSYSTEM RP6v2 bei CONRAD]&lt;br /&gt;
* [http://www.conrad.de/ce/de/product/191550/RP6-MEGA32-ERWEITERUNGSSATZ RP6 CONTROL M32 bei CONRAD]&lt;br /&gt;
* [http://www.conrad.de/ce/de/product/191563/RP6-CC-PRO-MEGA128-ERWEITERUNGSSATZ RP6 CCPRO M128 bei CONRAD]&lt;br /&gt;
* [http://www.conrad.de/ce/de/product/191609/Arexx-RP6-V2-Control-M256-WiFi-Kit-RP6v2-M256-WIFI RP6v2 M256 WiFi bei CONRAD]&lt;br /&gt;
* [http://www.conrad.de/ce/de/product/1082384/Arexx-RP6-Sensor-Board-RP6-JM03-61 RP6 Sensor Board bei CONRAD]&lt;br /&gt;
&lt;br /&gt;
* [http://www.microchip.com/wwwproducts/Devices.aspx?dDocName=en558370 WiFi-Modul RN-171] der RP6v2 M256 WiFi&lt;br /&gt;
* [http://www.arexx.com/rp6/downloads/RP6_M256_WIFI_MANUAL_DE_20120711.zip 1. Bedienungsanleitung] der RP6v2 M256 WiFi&lt;br /&gt;
&lt;br /&gt;
* [http://www.roboternetz.de/phpBB2/viewforum.php?f=49 Roboternetz RP6 Forum]&lt;br /&gt;
* &amp;quot;Geburt&amp;quot; des Wiki im RN-Forum: [http://www.roboternetz.de/community/threads/32793-RP6-Wiki-Artikel RP6-Wiki-Artikel]&lt;br /&gt;
* Roboter RoboPalm RP6: [http://www.ionix.de/doku.php/rp6/start Link]&lt;br /&gt;
&lt;br /&gt;
* [http://www.youtube.com/results?search_query=rp6 RP6 Videos]&lt;br /&gt;
* [http://de-de.facebook.com/pages/Robby-RP6/155118711202285 facebook]&lt;br /&gt;
* Abkündigung des RP6v2 im [https://www.roboternetz.de/community/threads/72730-Ende-des-RP6-Robotersystems-nach-fast-11-1-2-Jahren RoboterNETZ] &lt;br /&gt;
'''Siehe auch die Weblinks im [http://www.rn-wissen.de/index.php/RP6_Sensor_Board_und_Xtra_Module#Weblinks RP6 Sensor Board und Xtra Module Artikel]!'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Kategorie:Robotikeinstieg]]	 &lt;br /&gt;
[[Kategorie:Praxis]]&lt;br /&gt;
&lt;br /&gt;
==Autoren==&lt;br /&gt;
--[http://www.roboternetz.de/community/members/1972-Dirk Dirk] 11:30, 31. Mär 2022 (CET)&lt;/div&gt;</summary>
		<author><name>Dirk NO2</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=RP6_Sensor_Board_und_Xtra_Module&amp;diff=28581</id>
		<title>RP6 Sensor Board und Xtra Module</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=RP6_Sensor_Board_und_Xtra_Module&amp;diff=28581"/>
				<updated>2022-03-31T09:28:36Z</updated>
		
		<summary type="html">&lt;p&gt;Dirk NO2: /* Autoren */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Bild:RP6_Sensor_Board.jpg|Das RP6 Sensor Board|right|500px]]&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_Xtra_module.JPG|RP6 Xtra module|right|500px]]&lt;br /&gt;
==Was bisher geschah==&lt;br /&gt;
'''Siehe auch &amp;quot;Was bisher geschah&amp;quot; im [http://www.rn-wissen.de/index.php/RP6v2#Was_bisher_geschah RP6v2] und im [http://www.rn-wissen.de/index.php/RP6#Was_bisher_geschah RP6] Artikel!'''&lt;br /&gt;
&lt;br /&gt;
Mit, 27. Nov 2013 - Ankündigung einer Sensorerweiterungsplatine, die an die RP6v2-M256-WIFI angeschlossen werden kann&amp;lt;br/&amp;gt;&lt;br /&gt;
Sam, 22. Feb 2014 - Auslieferungsbeginn des RP6 Sensor Boards, des I2C GPS Empfängers, des 3D Accelerometer Moduls und des Gyro Moduls&amp;lt;br/&amp;gt;&lt;br /&gt;
Mon, 17. Mär 2014 - Das RP6 Sensor Board ist &amp;quot;nicht lieferbar&amp;quot;, neuer Liefertermin angekündigt für den 12.06.2014 (!?)&amp;lt;br/&amp;gt;&lt;br /&gt;
Die, 25. Mär 2014 - Das RP6 Sensor Board ist wieder &amp;quot;sofort lieferbar&amp;quot;&amp;lt;br/&amp;gt;&lt;br /&gt;
August 2014 - Ein neues Xtra Modul wird von JM3 Engineering angekündigt: Das &amp;quot;Wetterstations Sensor Modul&amp;quot;&amp;lt;br/&amp;gt;&lt;br /&gt;
November 2014 - Das &amp;quot;Wetterstations Sensor Modul&amp;quot; ist bei [http://www.jm3-engineering.com/sensors.htm JM3 Engineering] als &amp;quot;BHT Modul&amp;quot; abgebildet und ein Manual verfügbar&amp;lt;br/&amp;gt;&lt;br /&gt;
Don, 22. Jan 2015 - Auslieferungsbeginn des BHT Moduls&amp;lt;br/&amp;gt;&lt;br /&gt;
Son, 18. Dez 2016 - Laut JM3 Engineering wird das 3D Accelerometer DIL Modul nicht mehr produziert, ist aber weiterhin erhältlich&amp;lt;br/&amp;gt;&lt;br /&gt;
Oktober 2017 - Das RP6 Sensor Board und der I2C GPS Empfänger sind bei CONRAD ausverkauft&amp;lt;br/&amp;gt;&lt;br /&gt;
April 2019 - Das Gyro Modul und das BHT Modul sind bei CONRAD ausverkauft&amp;lt;br/&amp;gt;&lt;br /&gt;
Mai 2020 - Die Experimentierplatine, das Backlight-Display, der Graustufen-Boden-Sensor, der Drehgeber-Satz RP6-ENCv3 und das 3D Accelerometer Modul sind bei CONRAD ausverkauft&amp;lt;br/&amp;gt;&lt;br /&gt;
Ende 2021 - Die RP6 CONTROL M32 Platine, die Ersatzräder, die Ersatzraupen und das RP6 USB-Interface RP6v2-TRANS sind bei CONRAD ausverkauft&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Allgemein==&lt;br /&gt;
Dieser Artikel beschreibt die Grundlagen und Programmierung des RP6 Sensor Boards und der RP6 Xtra Module. Dieses Erweiterungs-Modul und die Xtra Module sind Teile des RP6-Systems, das in den RN-Wissen-Artikeln [[RP6]], [[RP6v2]] und [[RP6_-_Programmierung|RP6 - Programmierung]] ausführlich beschrieben wird. Ausgegliedert aus den &amp;quot;Haupt-Artikeln&amp;quot; habe ich diese Module, da sie m.E. zu einer neuen &amp;quot;Ära&amp;quot; des RP6-Systems gehören:&lt;br /&gt;
&lt;br /&gt;
Sie wurden nicht mehr von '''[http://www.roboternetz.de/community/members/120-SlyD SlyD] (Dominik S. Herwald)''' in Zusammenarbeit mit '''[http://www.arexx.com/ AREXX]''' entwickelt, sondern ab 2013 von '''[http://jm3-engineering.com/ JM3 Engineering] (Dipl.-Ing. Jürgen Maisel)'''. Ab Februar 2014 waren dann das '''RP6 Sensor Board RP6-JM03-61''' ([http://www.conrad.de/ce/de/product/1082384/Arexx-RP6-Sensor-Board-RP6-JM03-61 1082384]) und die drei RP6 Xtra Module '''I2C GPS Empfänger JM3-GPS''' ([http://www.conrad.de/ce/de/product/1082385/Arexx-IC-GPS-Empfaenger-JM3-GPS 1082385]), '''Gyro Modul JM3-GYRO''' ([http://www.conrad.de/ce/de/product/1082386/Arexx-Gyro-Modul-JM3-GYRO 1082386]) und '''3D Accelerometer Modul JM3-3DA''' ([http://www.conrad.de/ce/de/product/1082387/Arexx-3D-Accelerometer-Modul-JM3-3DA 1082387]) bei CONRAD lieferbar. Einen ersten Eindruck vom Sensor Board kann man im RoboterNetz und AREXX Support Forum bekommen,- siehe unter [[RP6_Sensor_Board_und_Xtra_Module#Weblinks|Weblinks]]!&lt;br /&gt;
&lt;br /&gt;
===RP6 Sensor Board===&lt;br /&gt;
Das [[RP6_Sensor_Board_und_Xtra_Module#RP6_Sensor_Board_2|RP6 Sensor Board]] gehört zu den &amp;quot;Erweiterungs-Modulen&amp;quot; des RP6-Systems. '''Andere &amp;quot;Erweiterungs-Module&amp;quot; werden im [[RP6v2#Erweiterungs-Module|RP6v2]] und im [[RP6#Erweiterungs-Module|RP6]] Artikel beschrieben!'''&lt;br /&gt;
&lt;br /&gt;
Das ''RP6 Sensor Board'' ist das erste &amp;quot;Erweiterungs-Modul&amp;quot;, das nicht über einen eigenen Microprozessor verfügt,- es ist also ein ''passives Modul'', das von einem Microprozessor-System (z.B. RP6v2, M32, M128, M256 Wifi) angesteuert werden muss. Es ist ebenfalls das erste Modul, das nicht mehr über die rautenförmige Einbuchtung an der Vorderkante verfügt, sondern komplett rechteckig ist. Damit passt es (montiert auf den Standard-Abstandbolzen) nur auf den vorderen Platinenstapel 1 des RP6.&lt;br /&gt;
&lt;br /&gt;
===RP6 Xtra Module===&lt;br /&gt;
Die [[RP6_Sensor_Board_und_Xtra_Module#RP6_Xtra_Module_2|RP6 Xtra Module]] gehören zu den &amp;quot;Zubehör- und Ersatzteilen&amp;quot; des RP6-Systems. '''Über die weiteren &amp;quot;Zubehör- und Ersatzteile&amp;quot; zum RP6 informiert der entsprechende Abschnitt im [[RP6v2#Zubeh.C3.B6r_und_Ersatzteile|RP6v2]] und im [[RP6#Zubehör und Ersatzteile|RP6]] Artikel!'''&lt;br /&gt;
&lt;br /&gt;
Die ''RP6 Xtra Module'' unterscheiden sich von den weiteren &amp;quot;Zubehör- und Ersatzteilen&amp;quot; dadurch, dass sie selbstständige Sensor-Platinen sind, die ideal zum RP6-System passen, aber auch mit anderen Microcontroller-Plattformen nutzbar sind.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==RP6 Sensor Board==&lt;br /&gt;
Das RP6 Sensor Board RP6-JM03-61 ([http://www.conrad.de/ce/de/product/1082384/Arexx-RP6-Sensor-Board-RP6-JM03-61 1082384]) wurde am 27.11.2013 von [http://www.roboternetz.de/community/members/120-SlyD SlyD] angekündigt (siehe Weblink!).&lt;br /&gt;
&lt;br /&gt;
Aktuell (Oktober 2017) ist das RP6 Sensor Board bei CONRAD ausverkauft.&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_Sensor_Board.jpg|Das RP6 Sensor Board]]&lt;br /&gt;
&lt;br /&gt;
===Beschreibung===&lt;br /&gt;
(Laut Online-Katalog der Firma CONRAD!)&lt;br /&gt;
&lt;br /&gt;
''&amp;quot;Das RP6 Sensor Board erweitert die Möglichkeiten aller RP6 Roboter um wesentliche Sensorsignale für Robotik-Anwendungen wie zum Beispiel Dreharten (Yaw-Gyro), Kipp- und Neigewinkel, Kompassrichtung oder aber auch Zeit und Datum.&lt;br /&gt;
Sie können einfach mit zusätzlichen Sharp Sensoren Abstände genau messen, z.B. für autonome Fahrrouten oder falls der Sensor nach unten gerichtet ist, kann er Treppenstufen oder ähnliches entdecken. Außerdem gibt es die Möglichkeit z.B. die Sharp Sensoren ein- bzw. auszuschalten um Strom zu sparen. Zusätzlich können bis zu 8 Servos angesteuert werden um z.B. einen Roboterarm zu bewegen, der auch mechanisch einfach zu montieren ist. Um die Möglichkeiten des RP6 Sensor Boards komplett ausnutzen zu können, wird ein RP6V2 und RP6Wifi Control Board empfohlen. Die ermöglicht den Roboter über Wifi fernzusteuern oder Sensordaten auf dem Kommandozentrum (PC) z.B Kompassdaten, Temperatur oder Kipp- und Neigewinkel anzeigen zu lassen.&amp;quot;''&lt;br /&gt;
&lt;br /&gt;
'''Ausstattung'''&lt;br /&gt;
* Magnetometer- und Accelerometer für Kompassfunktion&lt;br /&gt;
* Gyro Sensor (Yaw)&lt;br /&gt;
* Sharp-Sensor Schnittstelle&lt;br /&gt;
* LED Scheinwerfer&lt;br /&gt;
* LED Treiber mit Smart Funktionen&lt;br /&gt;
* I²C Bus mit max. 400 kHz Übertragungsrate; Hot Swap I²C-Bus Buffer&lt;br /&gt;
* Taster mit LED&lt;br /&gt;
* Echtzeit-Uhr RTC&lt;br /&gt;
* Backupbatterie (Aufladung während des Betriebs)&lt;br /&gt;
* Expansion Port z.B. für GPS-I²C Bus Modul&lt;br /&gt;
* 8 Servo-Ausgänge mit eigenem Schaltregler&lt;br /&gt;
* 8 PWM Ausgänge&lt;br /&gt;
* 5 LED Ausgänge und 2 Digital-I/O Ausgänge.&lt;br /&gt;
&lt;br /&gt;
'''Lieferumfang'''&lt;br /&gt;
* RP6 Sensor Board&lt;br /&gt;
* Montage-Kit&lt;br /&gt;
* Kabel&lt;br /&gt;
* Anleitung und CD mit Dokumentation.&lt;br /&gt;
&lt;br /&gt;
====Blockschaltbild====&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_Sensor_Board_BSP.png|RP6 Sensor Board Blockschaltbild]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Technische Daten===&lt;br /&gt;
{|  {{Blauetabelle}} &lt;br /&gt;
|'''Mikrocontroller:'''&lt;br /&gt;
|kein&lt;br /&gt;
|-&lt;br /&gt;
|'''Speicher:'''&lt;br /&gt;
|kein&amp;lt;br/&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|'''Programmierung:'''&lt;br /&gt;
|C++ (GCC, u.a.) über externes µC-System&lt;br /&gt;
|-&lt;br /&gt;
|'''Vorhandene Sensoren:'''&lt;br /&gt;
|Temperatur, 3D Magnetfeld (Kompass), 3D Beschleunigung, Yaw-Gyro&amp;lt;br/&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|'''Vorhandene Aktoren:'''&lt;br /&gt;
|LED Controller (2 LEDs on board, 5 freie LED Ports), Status LED,&amp;lt;br/&amp;gt;Button, Servo (PWM) Controller für 8 Servos und 8 PWM-Kanäle,&amp;lt;br/&amp;gt;Real Time Clock (RTC), 2 freie I/O Ports&lt;br /&gt;
|-&lt;br /&gt;
|'''Abmessungen:'''&lt;br /&gt;
|(L &amp;amp;times; B &amp;amp;times; H) 112 &amp;amp;times; 90 &amp;amp;times; 19 mm&amp;lt;br/&amp;gt;(B + 5 mm durch Scheinwerfer vorn)&lt;br /&gt;
|-&lt;br /&gt;
|'''Ausführung:'''&lt;br /&gt;
|Fertig aufgebautes Erweiterungsmodul&lt;br /&gt;
|-&lt;br /&gt;
|'''Stromversorgung:'''&lt;br /&gt;
|6 AA NiMH Akkus (über die RP6v2 Base)&amp;lt;br/&amp;gt;und optionaler Zusatzakku 7,2..10 V für Servo Power&lt;br /&gt;
|-&lt;br /&gt;
|'''Hersteller:'''&lt;br /&gt;
|Arexx Niederlande&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Umbau-Optionen===&lt;br /&gt;
Hier soll beschrieben werden, welche Umbau-Optionen es für das RP6 Sensor Board gibt. Im Text gibt es Verweise auf den Schaltplan des RP6 Sensor Boards (RP6_Sensor_Board_Rev2_Schema.pdf) in der Form: (SP2: Bauteil). Dies bedeutet, dass man das Bauteil auf Blatt 2 des Schaltplans finden kann. Beispielhaft sind im folgenden Text Bestell-Nummern der Firma [http://www.conrad.de/ce/ CONRAD] genannt. Natürlich kann man die Teile auch bei anderen Versendern beziehen.&lt;br /&gt;
&lt;br /&gt;
====USRBUS- und XBUS-Wannenstecker====&lt;br /&gt;
Der zweite Wannenstecker für den XBUS (SP3: K14) und USRBUS (SP3: K16) kann nachbestückt werden.&lt;br /&gt;
Man braucht dazu: &lt;br /&gt;
* 2 Wannenstecker 2x7-polig gerade RM 2,54mm (CONRAD [http://www.conrad.de/ce/de/product/741687/Stiftleiste-Print-Montage-gerade-Rastermass-254-mm-Pole-2-x-7-10120556-BKL-Electronic-Inhalt-1-St 741687])&lt;br /&gt;
Die Wannenstecker lötet man auf die eingezeichneten Positionen.&lt;br /&gt;
&lt;br /&gt;
'''USRBUS-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''USRBUS''' || '''Sensor Board-Funktion''' || '''Verwendung''' || '''I/O'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Y1 || &amp;quot;ADC0&amp;quot; || SHARP vorn || I&lt;br /&gt;
|-&lt;br /&gt;
| 2 || Y2 || &amp;quot;ADC1&amp;quot; || Yaw-Gyro || I&lt;br /&gt;
|-&lt;br /&gt;
| 3 || Y3 || PWR || Power für&amp;lt;br/&amp;gt;SHARPs, CAM_IF,&amp;lt;br/&amp;gt;I2C-MODULE || O&lt;br /&gt;
|-&lt;br /&gt;
| 4 || Y4 || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 5 || Y5 || &amp;quot;ADC4&amp;quot; || SHARP hinten ||I&lt;br /&gt;
|-&lt;br /&gt;
| 6..14 || Y6..Y14 || || keine ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
'''XBUS-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''XBUS''' || '''M256-Port''' ||'''M256-Funktion''' || '''Sensor Board-Funktion''' || '''Jumper''' || '''Verwendung''' || '''I/O'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || GND || || GND || GND || || ||&lt;br /&gt;
|-&lt;br /&gt;
| 2 || GND || || GND || GND || || ||&lt;br /&gt;
|-&lt;br /&gt;
| 3 || VDD || || VDD|| VDD_1 || || VDD +5V ||&lt;br /&gt;
|-&lt;br /&gt;
| 4 || +UB || || +UB || VSS_1 || || CAM_IF Power ||&lt;br /&gt;
|-&lt;br /&gt;
| 5 || VDD || || VDD || VDD_1 || || VDD +5V ||&lt;br /&gt;
|-&lt;br /&gt;
| 6 || +UB || || +UB || VSS_1 || || CAM_IF Power ||&lt;br /&gt;
|-&lt;br /&gt;
| 7 || INTU || PJ4 || PCINT13 || INTU || || keine || I&lt;br /&gt;
|-&lt;br /&gt;
| 8 || INT1 || PJ3 || PCINT12 || INT1 || 3 || LSM303DLHC: INT1 || I&lt;br /&gt;
|-&lt;br /&gt;
| 9 || INT3 || PJ5 || PCINT14 || INT3 || 2&amp;lt;br/&amp;gt;5 || DS1339: SQW/INT_N&amp;lt;br/&amp;gt;LSM303DLHC: INT2 || I&amp;lt;br/&amp;gt;I&lt;br /&gt;
|-&lt;br /&gt;
| 10 || SCL || PD0 || SCL || SCL_M || || I2C-Bus || O&lt;br /&gt;
|-&lt;br /&gt;
| 11 || INT2 || PJ6 || PCINT15 || INT2 || 4 || MAX7311: INT_N || I&lt;br /&gt;
|-&lt;br /&gt;
| 12 || SDA || PD1 || SDA || SDA_M || || I2C-Bus || I/O&lt;br /&gt;
|-&lt;br /&gt;
| 13 || MRESET || || MRESET || MRESET || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 14 || GND || || GND || GND || || ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====I/O-Patchfield_1====&lt;br /&gt;
Dieses 2x 5-polige &amp;quot;Patchfield_1&amp;quot; (SP3: K8), beschriftet mit &amp;quot;I/O&amp;quot; liegt neben dem Wannenstecker I/O und weist dieselbe Belegung auf. Möchte man auf dem Sensor Board Verbindungen über den Wannenstecker I/O zu einer angeschlossenen Microprozessor-Platine herstellen, dann kann man auf das &amp;quot;Patchfield_1&amp;quot; eine Stiftleiste löten.&lt;br /&gt;
Man braucht dazu: &lt;br /&gt;
* 2-reihige Stiftleiste RM 2,54mm (z.B. 2x40-polig [http://www.conrad.de/ce/de/product/741306/Doppelreihige-Stiftleiste-RM-254-gerade-Pole-2-x-40-10120173-BKL-Electronic-Inhalt-1-St 741306]) &lt;br /&gt;
Man trennt von der 2-reihigen Stiftleiste 2x5 Kontakte ab und lötet sie auf die Lötpunkte &amp;quot;I/O&amp;quot;. Zuvor muss man u.U. Lötzinnreste aus den Lötpunkten mit Entlötlitze bzw. Entlötsaugpumpe entfernen.&lt;br /&gt;
&lt;br /&gt;
'''Stecker I/O an M256 IO_PWM/T0/T1:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''M256-Port''' ||'''M256-Funktion''' || '''Sensor Board-Funktion''' || '''Verwendung''' || '''I/O'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || PD4 || ICP1 || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 2 || || GND || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 3 || PD6 || T1 || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 4 || PB7 || OC0A || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 5 || PG5 || OC0B || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 6 || PD7 || T0 || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 7 || PB5 || OC1A || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 8 || PK5 || ADC13 || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 9 || PB6 || OC1B || &amp;quot;PD5&amp;quot; || I2C Bus Buffer Enable || O&lt;br /&gt;
|-&lt;br /&gt;
| 10 || || VDD || || keine ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====ADC-Patchfield_2====&lt;br /&gt;
Dieses 2x 5-polige &amp;quot;Patchfield_2&amp;quot; (SP3: K9), beschriftet mit &amp;quot;ADC&amp;quot; liegt neben dem Wannenstecker ADC und weist dieselbe Belegung auf. Möchte man auf dem Sensor Board Verbindungen über den Wannenstecker ADC zu einer angeschlossenen Microprozessor-Platine herstellen, dann kann man auf das &amp;quot;Patchfield_2&amp;quot; eine Stiftleiste löten.&lt;br /&gt;
Man braucht dazu: &lt;br /&gt;
* 2-reihige Stiftleiste RM 2,54mm (z.B. 2x40-polig [http://www.conrad.de/ce/de/product/741306/Doppelreihige-Stiftleiste-RM-254-gerade-Pole-2-x-40-10120173-BKL-Electronic-Inhalt-1-St 741306]) &lt;br /&gt;
Man trennt von der 2-reihigen Stiftleiste 2x5 Kontakte ab und lötet sie auf die Lötpunkte &amp;quot;ADC&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
'''Stecker ADC an M256 ADC_IO2/CMP:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''M256-Port''' ||'''M256-Funktion''' || '''Sensor Board-Funktion''' || '''Jumper''' || '''Verwendung''' || '''I/O'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || PK0 || ADC8 || || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 2 || || GND || || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 3 || PK1 || ADC9 || &amp;quot;ADC4&amp;quot; || 6 || SHARP hinten || I&lt;br /&gt;
|-&lt;br /&gt;
| 4 || PE3 || OC3A/AIN1 || || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 5 || PK2 || ADC10 || || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 6 || || GND || || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 7 || PK3 || ADC11 || || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 8 || PE2 || XCK0/AIN0 || || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 9 || PK4 || ADC12 || || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 10 || || VDD || || || keine ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Anschluss-Optionen===&lt;br /&gt;
Hier soll beschrieben werden, welche Anschluss-Optionen es für das RP6 Sensor Board gibt. In erster Linie geht es dabei um die Belegung der vorhandenen Stecker bzw. Stiftleisten.&lt;br /&gt;
&lt;br /&gt;
Allgemein kann man Anschlüsse an Stiftleisten mit entsprechenden Steckbuchsen erreichen. Solche Steckbuchsen sind z.B. bei ELV erhältlich:&lt;br /&gt;
* Steckbuchse, 2-polig, RM 2,54mm ([http://www.elv.de/steckbuchse-2-polig.html ELV 68-016635])&lt;br /&gt;
* Steckbuchse, 3-polig, RM 2,54mm ([http://www.elv.de/steckbuchse-3-polig.html ELV 68-022503])&lt;br /&gt;
* Steckbuchse, 5-polig, RM 2,54mm ([http://www.elv.de/steckbuchse-5-polig.html ELV 68-023073])&lt;br /&gt;
Die Crimpkontakte dieser Steckbuchse werden an Litzen angequetscht (oder angelötet) und zum entsprechenden Sensor bzw. Aktor geführt. &lt;br /&gt;
&lt;br /&gt;
====I2C-MODULE====&lt;br /&gt;
Der I2C-MODULE Anschluss (SP1: M1) auf dem Sensor Board besteht aus einer 9-poligen Präzisions-Buchsenleiste RM 2,54mm (z.B. [http://www.conrad.de/ce/de/product/741360/Praezisions-Buchsenleiste-RM-254-gerade-Pole-1-x-20-10120832-BKL-Electronic-Inhalt-1-St 741360]). Wenn man eigene I2C-Module hier anschliessen will, braucht man zur Kontaktierung:&lt;br /&gt;
* Präzisions-Stiftleiste, 9-polig, RM 2,54mm (z.B. [http://www.conrad.de/ce/de/product/741307/Praezisions-Stiftleiste-RM-254-gerade-Pole-1-x-20-10120536-BKL-Electronic-Inhalt-1-St 741307])&lt;br /&gt;
&lt;br /&gt;
'''I2C-MODULE-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''Sensor Board&amp;lt;br/&amp;gt;-Funktion (M1)''' || '''Verwendung''' || '''I/O''' |||| [[RP6_Sensor_Board_und_Xtra_Module#I2C_GPS_Empf.C3.A4nger_JM3-GPS|'''I2C GPS Empfänger]]&amp;lt;br/&amp;gt;-Funktion (K1)''' ||&lt;br /&gt;
[[RP6_Sensor_Board_und_Xtra_Module#BHT_Modul_JM3-BHT31|'''BHT Modul]]&amp;lt;br/&amp;gt;-Funktion (K1)'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || VCC || +5V || |||| VCC_1 || VDD&lt;br /&gt;
|-&lt;br /&gt;
| 2 || SCLOUT || Buffered I2C-Bus || O |||| SCL/SCK || SCL&lt;br /&gt;
|-&lt;br /&gt;
| 3 || SDAOUT || Buffered I2C-Bus || I/O |||| SDA/MOSI || SDA&lt;br /&gt;
|-&lt;br /&gt;
| 4 || NC || keine || |||| ||&lt;br /&gt;
|-&lt;br /&gt;
| 5 || I/O1 || Status LED || O |||| ||&lt;br /&gt;
|-&lt;br /&gt;
| 6 || I/O2 || Taster || I |||| ||&lt;br /&gt;
|-&lt;br /&gt;
| 7 || NC || keine || |||| ||&lt;br /&gt;
|-&lt;br /&gt;
| 8 || GND || GND (geschaltet!) || |||| GND || GND&lt;br /&gt;
|-&lt;br /&gt;
| 9 || GND || GND (geschaltet!) || |||| GND || GND&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====CAM_IF====&lt;br /&gt;
Der CAM_IF Anschluss (SP1: K28) ist eine 2x 3-polige Stiftleiste mit der folgenden Belegung:&lt;br /&gt;
&lt;br /&gt;
'''CAM_IF-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''Sensor Board&amp;lt;br/&amp;gt;-Funktion (K28)''' || '''Verwendung''' || '''I/O'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || GND || GND (geschaltet!) ||&lt;br /&gt;
|-&lt;br /&gt;
| 2 || VSS_1 || +7,2..10V (RP6: +UB) ||&lt;br /&gt;
|-&lt;br /&gt;
| 3 || SCLOUT || Buffered I2C-Bus || O&lt;br /&gt;
|-&lt;br /&gt;
| 4 || SDAOUT || Buffered I2C-Bus || I/O&lt;br /&gt;
|-&lt;br /&gt;
| 5 || SCL_M || I2C-Bus || O&lt;br /&gt;
|-&lt;br /&gt;
| 6 || SDA_M || I2C-Bus || I/O&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====IO_EXT====&lt;br /&gt;
Der IO_EXT Anschluss (SP1: K19) ist eine 2x 2-polige Stiftleiste mit der folgenden Belegung:&lt;br /&gt;
&lt;br /&gt;
'''IO_EXT-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''Sensor Board&amp;lt;br/&amp;gt;-Funktion (K19)''' || '''Verwendung''' || '''I/O'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || MAX7311: I/O1.2 || freier I/O Port || I/O&lt;br /&gt;
|-&lt;br /&gt;
| 2 || GND || ||&lt;br /&gt;
|-&lt;br /&gt;
| 3 || MAX7311: I/O1.1 || freier I/O Port || I/O&lt;br /&gt;
|-&lt;br /&gt;
| 4 || GND || ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====PWM_OUT====&lt;br /&gt;
Der PWM_OUT Anschluss (SP5: K12) ist eine 2x 4-polige Stiftleiste mit der folgenden Belegung:&lt;br /&gt;
&lt;br /&gt;
'''PWM_OUT-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''Sensor Board&amp;lt;br/&amp;gt;-Funktion (K12)''' || '''Verwendung''' || '''I/O'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || PCA9685: PWM0 || freier PWM Port || O&lt;br /&gt;
|-&lt;br /&gt;
| 2 || PCA9685: PWM1 || freier PWM Port || O&lt;br /&gt;
|-&lt;br /&gt;
| 3 || PCA9685: PWM2 || freier PWM Port || O&lt;br /&gt;
|-&lt;br /&gt;
| 4 || PCA9685: PWM3 || freier PWM Port || O&lt;br /&gt;
|-&lt;br /&gt;
| 5 || PCA9685: PWM4 || freier PWM Port || O&lt;br /&gt;
|-&lt;br /&gt;
| 6 || PCA9685: PWM5 || freier PWM Port || O&lt;br /&gt;
|-&lt;br /&gt;
| 7 || PCA9685: PWM6 || freier PWM Port || O&lt;br /&gt;
|-&lt;br /&gt;
| 8 || PCA9685: PWM7 || freier PWM Port || O&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====TP1====&lt;br /&gt;
Am Testpunkt TP1 (SP4: TP1) kann man das Signal SQW/INT_N der RTC (DS1339) prüfen/messen.&lt;br /&gt;
&lt;br /&gt;
====LEDs====&lt;br /&gt;
=====Rücklichter=====&lt;br /&gt;
Der Rücklichter Anschluss (SP1: K10) ist eine 2-polige Stiftleiste mit der folgenden Belegung:&lt;br /&gt;
&lt;br /&gt;
'''Rücklichter-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''Sensor Board&amp;lt;br/&amp;gt;-Funktion (K10)''' || '''Verwendung''' || '''I/O'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || TCA6507: P3 || Rücklicht rechts || O&lt;br /&gt;
|-&lt;br /&gt;
| 2 || TCA6507: P4 || Rücklicht links || O&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=====Display-Hintergrundbeleuchtung=====&lt;br /&gt;
Der Display-Hintergrundbeleuchtung Anschluss (SP1: K7) ist eine 2-polige Stiftleiste mit der folgenden Belegung:&lt;br /&gt;
&lt;br /&gt;
'''Display-Hintergrundbeleuchtung-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''Sensor Board&amp;lt;br/&amp;gt;-Funktion (K7)''' || '''Verwendung''' || '''I/O'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || TCA6507: P0 || Display-Hintergrundbeleuchtung || O&lt;br /&gt;
|-&lt;br /&gt;
| 2 || VDD_1 || +5V ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=====Freie Ausgänge=====&lt;br /&gt;
Der freie Ausgang 1 Anschluss (SP1: K4) ist eine 2-polige Stiftleiste mit der folgenden Belegung:&lt;br /&gt;
&lt;br /&gt;
'''Freier Ausgang 1-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''Sensor Board&amp;lt;br/&amp;gt;-Funktion (K4)''' || '''Verwendung''' || '''I/O'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || TCA6507: P1 || freier LED Port || O&lt;br /&gt;
|-&lt;br /&gt;
| 2 || VDD_1 || +5V ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Der freie Ausgang 2 Anschluss (SP1: K2) ist eine 2-polige Stiftleiste mit der folgenden Belegung:&lt;br /&gt;
&lt;br /&gt;
'''Freier Ausgang 2-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''Sensor Board&amp;lt;br/&amp;gt;-Funktion (K2)''' || '''Verwendung''' || '''I/O'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || TCA6507: P2 || freier LED Port || O&lt;br /&gt;
|-&lt;br /&gt;
| 2 || VDD_1 || +5V ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====SHARP Sensoren====&lt;br /&gt;
Das RP6 Sensor Board verfügt über zwei Stecker SHARP_F (SP1: K5) und SHARP_R (SP1: K3) zum Anschluß von analogen SHARP Infrarot-Distanz-Sensoren. Folgende SHARP Sensoren sind anschließbar:&lt;br /&gt;
* 1. SHARP Distanz-Sensor GP2Y0A41SK0F ([http://www.conrad.de/ce/de/product/504596/Distanz-Sensor-GP2Y0A41SK0F-Sharp-GP2Y0A41SK0F-Messbereiche-Erfassungsbereich-4-30-cm-5-VDC 504596]), Messbereich 4..30cm&lt;br /&gt;
* 2. SHARP Distanz-Sensor GP2Y0A21YK0F ([http://www.conrad.de/ce/de/product/504591/Distanz-Sensor-GP2Y0A21YK0F-Sharp-GP2Y0A21YK0F-Messbereiche-Erfassungsbereich-10-80-cm-5-VDC 504591]), Messbereich 10..80cm&lt;br /&gt;
* 3. SHARP Distanz-Sensor GP2Y0A02YK ([http://www.conrad.de/ce/de/product/185364/Distanz-Sensor-GP-2-Y0A-02-YK-Sharp-GP-2-Y0A-02-YK-Messbereiche-Erfassungsbereich-20-150-cm-5-VDC 185364]), Messbereich 20..150cm&lt;br /&gt;
* 4. SHARP Distanz-Sensor GP2Y0A710K0F ([http://www.conrad.de/ce/de/product/504597/Distanz-Sensor-GP2Y0A710K0F-Sharp-GP2Y0A710K0F-Messbereiche-Erfassungsbereich-100-550-cm-5-VDC 504597]), Messbereich 100..550cm&lt;br /&gt;
''Die Auswahl der geeigneten SHARP Sensoren hängt von der gewünschten Funktion ab: Zur Erkundung großer Räume eignet sich insbesondere der Typ 4 mit einer hohen Reichweite von 5,5m. Er ist aber ungeeignet, die Distanz von Objekten zu erkennen, die sich näher als 1m vor dem Sensor befinden. Ein guter Kompromiss zwischen Nahbereichsmessung und &amp;quot;Fernsicht&amp;quot; sind die Typen 2 (10..80cm) und 3 (20..150cm). Will man den Distanz-Sensor vor allem zur Vermeidung eins Sturzes von einer Treppe (Tiefenerkennung) oder nur zur Erkennung von Hindernissen direkt vor dem Roboter (Kollisionserkennung) benutzen, dann eignet sich insbesondere für den vorderen Sensor (SHARP_F) der Typ 1, da er im Nahbereich von 4 bis 30cm messen kann.''&lt;br /&gt;
&lt;br /&gt;
Für die Verbindung zwischen den beiden 3-poligen JST XH Steckern (K3, 5) auf dem Sensor Board und den SHARP-Sensoren braucht man auf der Sensor Board Seite folgende Stecker-/buchsenteile:&lt;br /&gt;
* 2x JST XH Gehäuse, 3-polig, RM 2,5mm ([http://www.conrad.de/ce/de/product/740583/Gehaeuse-RM-25-mm-Serie-XH-Rastermass-25-mm-Pole-3-Nennstrom-3-A-XHP-3-JST-Inhalt-1-St 740583])&lt;br /&gt;
* 6x JST XH Crimpkontakt f. RM 2,5mm ([http://www.conrad.de/ce/de/product/741112/Crimpkontakt-fuer-RM-25-mm-Serie-XH-Rastermass-25-mm-BXH-001T-P06-JST-Inhalt-1-St 741112])&lt;br /&gt;
Die Crimpkontakte dieser Steckbuchse werden an die meist 3-adrige Litze des Sensors angequetscht (oder angelötet). Zur Belegung des Sensor Anschlusses siehe das jeweilige Datenblatt!&lt;br /&gt;
&lt;br /&gt;
=====Vorn=====&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_Sensor_Board_SHARP_F.JPG|RP6 Sensor Board SHARP Sensor vorn|thumb]]&lt;br /&gt;
&lt;br /&gt;
Der vordere SHARP Sensor kann auch mechanisch am Sensor Board befestigt werden. Dazu gibt es an der Vorderkante der Platine zwei Befestigungslöcher.&lt;br /&gt;
&lt;br /&gt;
Das Bild rechts zeigt den SHARP Distanzsensor GP2Y0A02YK montiert vorn auf dem Sensor Board mit zwei M3 Gelenkbolzen ([http://www.conrad.de/ce/de/product/521043/Gelenkbolzen-1-x-Aussengewinde1-x-Innengewinde-Messing-vernickelt-Schluesselweite-55-mm/ 521043]) und passenden Schrauben/Muttern.&lt;br /&gt;
&lt;br /&gt;
'''Vorn-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''RP6v2-Port''' ||'''RP6v2-Funktion''' || '''Sensor Board&amp;lt;br/&amp;gt;-Funktion (K5)''' || '''Verwendung''' || '''I/O''' |||| '''SHARP Sensor&amp;lt;br/&amp;gt;-Funktion''' &lt;br /&gt;
|-&lt;br /&gt;
| 1 || PA0 || ADC0 || &amp;quot;ADC0&amp;quot; || SHARP vorn || I |||| Vo&lt;br /&gt;
|-&lt;br /&gt;
| 2 || || || VDD_1 || +5V || |||| Vcc&lt;br /&gt;
|-&lt;br /&gt;
| 3 || || || GND || GND (geschaltet!) || |||| GND&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=====Hinten=====&lt;br /&gt;
Der hintere SHARP Sensor kann z.B. an der Rückseite des RP6v2 Fahrgestells befestigt werden.&lt;br /&gt;
&lt;br /&gt;
'''Hinten-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''M256-Port''' ||'''M256-Funktion''' || '''Sensor Board&amp;lt;br/&amp;gt;-Funktion (K3)''' || '''Verwendung''' || '''I/O''' |||| '''SHARP Sensor&amp;lt;br/&amp;gt;-Funktion''' &lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| 1 || PK1 || ADC9 || &amp;quot;ADC4&amp;quot; || SHARP hinten || I |||| Vo&lt;br /&gt;
|-&lt;br /&gt;
| 2 || || || VDD_1 || +5V || |||| Vcc&lt;br /&gt;
|-&lt;br /&gt;
| 3 || || || GND || GND (geschaltet!) || |||| GND&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Servos====&lt;br /&gt;
=====Power=====&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_Sensor_Board_Servo-PWR.jpg|RP6 Sensor Board Servo-PWR Stecker|thumb]]&lt;br /&gt;
&lt;br /&gt;
An den SERVO_PWR Stecker (SP5: K1) muss ein Akku zur Stromversorgung der mit dem Sensor Board verbundenen Servos angeschlossen werden. Der Stecker hat folgende Belegung:&lt;br /&gt;
 &lt;br /&gt;
'''SERVO_PWR-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''Sensor Board&amp;lt;br/&amp;gt;-Funktion (K1)''' || '''Verwendung'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || GND_POWER || Servo Power GND&lt;br /&gt;
|-&lt;br /&gt;
| 2 || VSS_POWER || Servo Power Eingang +7,2..10V&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Der Akku zur Versorgung der Servos muss eine Nennspannung von 7,2..10V aufweisen. Der Schaltregler auf dem Sensor Board kann bei einer 5,0V Servo-Spannung Ströme bis 3,0A (Spitzen bis 5,0A) liefern. '''Die Polung des Akkus darf am Stecker SERVO_PWR nicht vertauscht werden.''' Siehe den oberen Teil der nebenstehenden Abbildung! Ratsam ist es, eine Sicherung 3,15A in die Plusleitung zwischen Akku und SERVO_PWR Stecker zu legen.&lt;br /&gt;
&lt;br /&gt;
Für die Verbindung zwischen dem 2-poligen JST XH Stecker (SERVO_PWR, K1) auf dem Sensor Board und dem Akku braucht man auf der Sensor Board Seite folgende Stecker-/buchsenteile:&lt;br /&gt;
* JST XH Gehäuse, 2-polig, RM 2,5mm ([http://www.conrad.de/ce/de/product/740549/Gehaeuse-RM-25-mm-Serie-XH-Rastermass-25-mm-Pole-2-Nennstrom-3-A-XHP-2-JST-Inhalt-1-St 740549])&lt;br /&gt;
* 2x JST XH Crimpkontakt f. RM 2,5mm ([http://www.conrad.de/ce/de/product/741112/Crimpkontakt-fuer-RM-25-mm-Serie-XH-Rastermass-25-mm-BXH-001T-P06-JST-Inhalt-1-St 741112])&lt;br /&gt;
Die Crimpkontakte dieser Steckbuchse werden an die 2-adrige Litze zum Akku angequetscht (oder angelötet).&lt;br /&gt;
&lt;br /&gt;
Wenn man keinen separaten Akku zur Versorgung der Servos nehmen will, kann man auch +UB der RP6v2 Base dafür nutzen. An +UB liegt die Akkuspannung der Base (Nennspannung 7,2V) über eine Sicherung F1 3,15A (RP6v2) bzw. 2,5A (RP6) auf dem Mainboard an. +UB kann man z.B. am [[RP6#EXT_Anschlu.C3.9F|EXT Anschluß der Base]] entnehmen. Die nebenstehende Abbildung zeigt im unteren Teil, an welchen Pins man dort +UB kontaktieren kann!&lt;br /&gt;
&lt;br /&gt;
Dabei ist zu beachten, dass die Sicherung F1 auf dem RP6(v2) Mainboard den nutzbaren Strom für die Servos deutlich begrenzt: Durch diese Sicherung fließt ja nicht nur der Servo-Strom, sondern auch der Strom für den RP6 und alle darauf montierten Zusatzplatinen. Wenn der RP6 also herumfährt und z.B. noch die IRCOMM-Sendedioden nutzt, bleibt kaum noch Stromreserve für die Servos auf dem Sensor Board übrig.&lt;br /&gt;
'''Das bedeutet: Man sollte unbedingt einen separaten Akku für die Servos auf dem Sensor Board benutzen!'''&lt;br /&gt;
&lt;br /&gt;
======SERVO_PWR-EXT Verbindung======&lt;br /&gt;
Für die Verbindung zwischen dem 2-poligen JST XH Stecker (SERVO_PWR, K1) auf dem Sensor Board und dem 8-poligen JST XH Stecker (EXT) auf dem RP6v2 Mainboard braucht man folgende Stecker-/buchsenteile:&lt;br /&gt;
* JST XH Gehäuse, 2-polig, RM 2,5mm ([http://www.conrad.de/ce/de/product/740549/Gehaeuse-RM-25-mm-Serie-XH-Rastermass-25-mm-Pole-2-Nennstrom-3-A-XHP-2-JST-Inhalt-1-St 740549])&lt;br /&gt;
* JST XH Gehäuse, 8-polig, RM 2,5mm ([http://www.conrad.de/ce/de/product/740928/Gehaeuse-RM-25-mm-Serie-XH-Rastermass-25-mm-Pole-8-Nennstrom-3-A-XHP-8-JST-Inhalt-1-St 740928])&lt;br /&gt;
* 10x JST XH Crimpkontakt f. RM 2,5mm ([http://www.conrad.de/ce/de/product/741112/Crimpkontakt-fuer-RM-25-mm-Serie-XH-Rastermass-25-mm-BXH-001T-P06-JST-Inhalt-1-St 741112])&lt;br /&gt;
Mit einer 2-adrigen Litze, die beidseits mit den Crimpkontakten verquetscht (oder verlötet) wird, verbindet man dann den SERVO_PWR Stecker mit dem EXT Stecker, wie in der Abbildung oben gezeigt. ''Achtung: Plus (+) und Minus (-) nicht vertauschen!''&lt;br /&gt;
 Ein passendes Kabel soll zukünftig (*) mitgeliefert werden.&lt;br /&gt;
&lt;br /&gt;
Auf dem RP6 Mainboard ist der 8-polige EXT Stecker noch nicht bestückt. Wenn man ihn nachrüsten will, muss man noch bestellen:&lt;br /&gt;
* JST XH Stiftleiste gerade, 8-polig, RM 2,5mm ([http://www.conrad.de/ce/de/product/740105/Stiftleiste-gerade-RM-25-mm-Serie-XH-Rastermass-25-mm-Pole-8-Nennstrom-3-A-B8B-XH-A-LFSN-JST-Inhalt-1-St 740105])&lt;br /&gt;
Die Stiftleiste wird auf das RP6 Mainboard gelötet, dabei weisen die beiden Einkerbungen an einer Längsseite der Stiftleiste nach hinten zum Rand des Mainboards.&lt;br /&gt;
 Auch diese Stiftleiste soll zukünftig (*) zum Lieferumfang gehören.&lt;br /&gt;
'''Zu *)''' Meinem RP6 Sensor Board (bestellt am 1.3.2014) lag das konfektionierte Kabel und die Stiftleiste noch nicht bei!&lt;br /&gt;
&lt;br /&gt;
=====Stecker=====&lt;br /&gt;
An die acht 3-poligen Stiftleisten SERVO_1 bis SERVO_8 (SP5: K6, 11, 29..34) können Servos angeschlossen werden. Direkt aufstecken kann man Servo-Steckbuchsen mit der Belegung von CONRAD, Graupner/JR und Robbe/Futaba (Versorgungsspannung Plus am mittleren Pin). Auf der Sensor Board Platine kann man den Pin 3 (Servo Power GND) der 3-poligen Stiftleisten daran erkennen, dass er näher zum rechten Platinenrand (Seite mit dem XBUS Stecker) angeordnet ist als der zugehörige Pin 1 (Servo Signal).&lt;br /&gt;
&lt;br /&gt;
Wenn Servos mit nicht passender Steckbuchse angeschlossen werden sollen, dann braucht man auf der Sensor Board Seite folgende Stecker-/buchsenteile für jedes Servo:&lt;br /&gt;
* Steckbuchse, 3-polig, RM 2,54mm ([http://www.elv.de/steckbuchse-3-polig.html ELV 68-022503])&lt;br /&gt;
Die Crimpkontakte dieser Steckbuchse werden an die 3-adrige Litze des Servos angequetscht (oder angelötet). &lt;br /&gt;
&lt;br /&gt;
'''SERVO_1..8-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''Sensor Board&amp;lt;br/&amp;gt;-Funktion (K6,11,29..34)''' || '''Verwendung''' || '''I/O''' |||| '''Servo-&amp;lt;br/&amp;gt;Kabelfarben'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || PCA9685: PWM15..8 || Servo Signal || O |||| Weiß, Orange&lt;br /&gt;
|-&lt;br /&gt;
| 2 || Servo_PWR || Servo Power +5V (geschaltet!) || |||| Rot&lt;br /&gt;
|-&lt;br /&gt;
| 3 || GND_POWER || Servo Power GND || |||| Schwarz, Braun&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Roboterarm RA2-HOBBY====&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_Sensor_Board_RA2-MINI.JPG|RP6 Sensor Board mit Roboterarm RA2-MINI|thumb]]&lt;br /&gt;
&lt;br /&gt;
In der Anleitung zum RP6 Sensor Board ist der Arexx Roboterarm RA2-HOBBY bzw. RA2-MINI [http://www.conrad.de/ce/de/product/191534/Arexx-Mini-Roboterarm-RA2-MINI (191534)] abgebildet. Er ist dort ohne Grundgestell und Controller-Platine auf dem Sensor Board befestigt.&lt;br /&gt;
Das Sensor Board eignet sich sehr gut zur Ansteuerung der 6 Servos des Roboterarms.&lt;br /&gt;
&lt;br /&gt;
Zur Montage des RA2-MINI auf dem Sensor Board geht man so vor:&lt;br /&gt;
* Lösen der 4 Rundkopfschrauben M3x6, die die Servobodenplatte mit den Abstandbolzen M3x30 auf der Controller-Platine verbinden (siehe Anleitung zum RA2-MINI, Seite 19!)&lt;br /&gt;
* Lösen der Servobodenplatte vom Bodenservo (siehe Anleitung zum RA2-MINI, Seite 8!)&lt;br /&gt;
* Bohren der Befestigungslöcher in die Servobodenplatte:&lt;br /&gt;
** Rechts-Links Lochabstand 4,75cm, Vorn-Hinten Lochabstand 4,1cm&lt;br /&gt;
** Ungefähre Lage der Löcher siehe Abbildung in der Anleitung zum Sensor Board, Seite 4!&lt;br /&gt;
** Markierung der Bohrlöcher auf der Rückseite der Servobodenplatte:&lt;br /&gt;
*** 1. Mit einer Hilfslinie die Hinterkante des Servoausschnitts (das ist die kürzere Kante, die näher am Rand der Bodenplatte liegt!) nach beiden Seiten verlängern&lt;br /&gt;
*** 2. Eine 2. Hilfslinie parallel zur ersten im Abstand von 1,4cm zur Mitte der Servobodenplatte hin einzeichnen&lt;br /&gt;
*** 3. Auf dieser Linie jetzt die beiden hinteren Bohrlöcher symmetrisch im Abstand von 4,75cm markieren&lt;br /&gt;
*** 4. Für die vorderen Bohrlöcher eine 3. Hilfslinie im Abstand von 4,1cm parallel zur 2. Linie einzeichnen&lt;br /&gt;
*** 5. Auf dieser Linie die beiden vorderen Bohrlöcher symmetrisch im Abstand von 4,75cm markieren&lt;br /&gt;
*** 6. Kontrolle: Die 4 markierten Bohrlochpositionen bilden ein Rechteck mit 4,1cm seitlicher und 4,75cm vorderer/hinterer Kantenlänge&lt;br /&gt;
** Bohren der 4 Löcher (D = 3,2mm) in die Servobodenplatte&lt;br /&gt;
* Befestigen des Bodenservos auf der Servobodenplatte (siehe Anleitung zum RA2-MINI, Seite 8!)&lt;br /&gt;
* Anbringen des Roboterarms auf dem Sensor Board mit 4 Abstandbolzen M3 (L = 30..50mm) und passenden Schrauben/Muttern&lt;br /&gt;
&lt;br /&gt;
Die Servo-Steckbuchsen werden dann ''in der selben Reihenfolge (S1..S6) wie vorher auf der Controller-Platine des Roboterarms'' auf die Stiftleisten SERVO_1 bis SERVO_6 des Sensor Boards gesteckt.&lt;br /&gt;
'''Man sollte unbedingt einen separaten Akku für die Servos auf dem Sensor Board benutzen!'''&lt;br /&gt;
&lt;br /&gt;
====Grafik-Display====&lt;br /&gt;
Ob es mal ein Grafik-Display für das RP6 Sensor Board geben wird, ist ''pure Spekulation''. Allerdings gibt es zwei Hinweise darauf, dass eine solche Hardware-Ergänzung kommen könnte:&lt;br /&gt;
* 1. Der vorbereitete Anschluss für eine [[RP6_Sensor_Board_und_Xtra_Module#Display-Hintergrundbeleuchtung|Display-Hintergrundbeleuchtung]]&lt;br /&gt;
* 2. Die 4 Befestigungslöcher in der Mitte des Sensor Boards&lt;br /&gt;
Wir werden sehen ...&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==RP6 Xtra Module==&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_Xtra_module.JPG|RP6 Xtra module|right|500px]]&lt;br /&gt;
&lt;br /&gt;
Von den '''AREXX RP6 Xtra Modulen''' sind bei [http://www.conrad.de/ce/ CONRAD] für den RP6v2 erhältlich:&lt;br /&gt;
* Arexx [[RP6_Sensor_Board_und_Xtra_Module#I2C_GPS_Empf.C3.A4nger_JM3-GPS|I2C GPS Empfänger JM3-GPS]] ([http://www.conrad.de/ce/de/product/1082385/Arexx-IC-GPS-Empfaenger-JM3-GPS 1082385] AUSVERKAUFT!)&lt;br /&gt;
* Arexx [[RP6_Sensor_Board_und_Xtra_Module#Gyro_Modul_JM3-GYRO|Gyro Modul JM3-GYRO]] ([http://www.conrad.de/ce/de/product/1082386/Arexx-Gyro-Modul-JM3-GYRO 1082386] AUSVERKAUFT!)&lt;br /&gt;
* Arexx [[RP6_Sensor_Board_und_Xtra_Module#3D_Accelerometer_Modul_JM3-3DA|3D Accelerometer Modul JM3-3DA]] ([http://www.conrad.de/ce/de/product/1082387/Arexx-3D-Accelerometer-Modul-JM3-3DA 1082387] AUSVERKAUFT!)&lt;br /&gt;
* Arexx [[RP6_Sensor_Board_und_Xtra_Module#BHT_Modul_JM3-BHT31|BHT Modul JM3-BHT31]] ([http://www.conrad.de/ce/de/product/1302995/Arexx-Asuro-xTend-BHT-JM3-BHT31 1302995] AUSVERKAUFT!)&lt;br /&gt;
&lt;br /&gt;
===I2C GPS Empfänger JM3-GPS===&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_I2C_GPS_Empfänger.JPG|RP6 I2C GPS Empfänger|thumb]]&lt;br /&gt;
&lt;br /&gt;
(Laut Online-Katalog der Firma CONRAD!)&lt;br /&gt;
&lt;br /&gt;
''&amp;quot;Universelles GPS-I²C-Bus Modul für RP6 Roboter. Der GPS Empfänger stellt die NMEA-0183 Datensätze GGA, RMC, GSA und VTG in den veschiedenen Registern zur Verfügung. Damit ist eine einfache Weiterverarbeitung möglich.&amp;quot;''&lt;br /&gt;
&lt;br /&gt;
Aktuell (Oktober 2017) ist der I2C GPS Empfänger bei CONRAD ausverkauft.&lt;br /&gt;
&lt;br /&gt;
====Beschreibung====&lt;br /&gt;
Der I2C GPS Empfänger ist eine kleine (38 x 23 mm) Zusatzplatine (RP6 Xtra Modul), die direkt auf das [[RP6_Sensor_Board_und_Xtra_Module#RP6_Sensor_Board_2|RP6 Sensor Board]] aufgesteckt werden kann. Sie kann aber auch überall eingesetzt werden, wo eine stabilisierte 5V Versorgungsspannung und ein 5V-I2C-Bus bis 400 kHz zur Verfügung steht.&lt;br /&gt;
&lt;br /&gt;
Die Platine ist bestückt mit dem &amp;quot;Fastrax GPS antenna module&amp;quot; [https://www.u-blox.com/de/positioning-antennas/gnss-antenna-modules/uc530.html UC530]. Als Backup-Batterie dient eine wieder aufladbare Lithium-Batterie ([http://www.farnell.com/datasheets/321180.pdf MS621FE]). Zur Kommunikation zwischen dem UC530 und dem I2C-Bus ist ein [http://www.atmel.com/Images/Atmel-8303-8-bit-AVR-Microcontroller-tinyAVR-ATtiny1634_Datasheet.pdf ATtiny1634] an Bord, der auch die Auswertung des [http://de.wikipedia.org/wiki/NMEA_0183 NMEA Protokolls] übernimmt. Die 3,3 V Versorgungsspannung wird auf der Platine durch einen Spannungsregler ([http://www.mouser.com/ds/2/405/lm3480-316799.pdf LM3480IM3-3.3]) erzeugt. Über den I2C-Bus können folgende Daten der NMEA-0183 Datensätze GGA, RMC, GSA und VTG auf einfache Weise gelesen werden:&lt;br /&gt;
&lt;br /&gt;
* Geograf. Breite&lt;br /&gt;
* Geograf. Länge&lt;br /&gt;
* GPS Status&lt;br /&gt;
* HDOP&lt;br /&gt;
* Satellitenzahl&lt;br /&gt;
* Kurs&lt;br /&gt;
* Geschwindigkeit&lt;br /&gt;
* Höhe&lt;br /&gt;
* UTC-Zeit&lt;br /&gt;
* Datum&lt;br /&gt;
* PDOP&lt;br /&gt;
* VDOP&lt;br /&gt;
* Satellit 1..12&lt;br /&gt;
&lt;br /&gt;
Der ATtiny1634 ist natürlich vorprogrammiert, kann aber über eine vorbereitete 6-polige ISP-Schnittstelle auf der Platine auch umprogrammiert werden.&lt;br /&gt;
&lt;br /&gt;
'''Lieferumfang'''&lt;br /&gt;
* I2C GPS Empfänger&lt;br /&gt;
* CD mit Anleitung und Software-Beispielen.&lt;br /&gt;
&lt;br /&gt;
====Technische Daten====&lt;br /&gt;
* Versorgungsspannung: 5,0 V +/- 5%&lt;br /&gt;
* Stromverbrauch: &amp;lt;= 20 mA (typ.)&lt;br /&gt;
* I2C-Bus Geschwindigkeit: &amp;lt;= 400 kHz&lt;br /&gt;
* GPS Antenne: eingebaut&lt;br /&gt;
* Backup Batterie: Lithium, im Betrieb wieder aufladbar&lt;br /&gt;
* Temperatur Bereich: -10 bis 65 °C&lt;br /&gt;
* Form Faktor: 38 x 23 mm&lt;br /&gt;
* Gewicht: ca. 6 g&lt;br /&gt;
* Empfänger Spezifikationen (UC530):&lt;br /&gt;
** Empfänger: GPS L1 C/A-Code, SPS&lt;br /&gt;
** Kanäle: 66/22 (Suche/Track)&lt;br /&gt;
** Tracking Empfindlichkeit: -165 dBm typ.&lt;br /&gt;
** Navigations Empfindlichkeit: -148 dbm typ (Kaltstart)&lt;br /&gt;
** Update Rate: 1 Sek.&lt;br /&gt;
** Positions Genauigkeit:&lt;br /&gt;
*** 3,0m (67%) typ. horizontal&lt;br /&gt;
*** 5,0m (67%) typ. vertikal&lt;br /&gt;
*** 0,02 m/s (50%) typ. Geschwindigkeit&lt;br /&gt;
** Zeit bis zum ersten Fix: typ. 31 Sek.&lt;br /&gt;
** Protokoll: NMEA-0183 Rev. 3.01&lt;br /&gt;
&lt;br /&gt;
====Anschluss-Schema====&lt;br /&gt;
Belegung des 9-poligen Anschluss-Steckers (K1) siehe in [[RP6_Sensor_Board_und_Xtra_Module#I2C-MODULE|dieser]] Tabelle!&lt;br /&gt;
&lt;br /&gt;
====Umbau-Optionen====&lt;br /&gt;
Wenn man den ATtiny1634 selbst programmieren will, muss man Stiftleisten auf die Platine löten.&lt;br /&gt;
&lt;br /&gt;
Man braucht dazu: &lt;br /&gt;
* 2-reihige Stiftleiste RM 2,54mm (z.B. 2x40-polig 741306) &lt;br /&gt;
&lt;br /&gt;
Man trennt von der 2-reihigen Stiftleiste 2x3 Kontakte ab und lötet sie auf die Punkte &amp;quot;ISP6&amp;quot;.&lt;br /&gt;
Mit einem ISP-Programmer kann dann eine neue Firmware geflasht werden. Die aktuelle Firmware des ATtiny1634 (Version 1.2) wird als .HEX mitgeliefert, leider ohne Source-Code.&lt;br /&gt;
&lt;br /&gt;
Vorsicht: Dabei kann der Prozessor im schlimmsten Fall nicht mehr ansprechbar sein oder der GPS Empfänger UC530 beschädigt werden. Man sollte diesen Umbau und die ISP-Programmierung nur machen, wenn man genau weiß, was man macht! &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Gyro Modul JM3-GYRO===&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_Gyro_Modul.JPG|RP6 Gyro Modul|right|200px]]&lt;br /&gt;
&lt;br /&gt;
(Laut Online-Katalog der Firma CONRAD!)&lt;br /&gt;
&lt;br /&gt;
''&amp;quot;Das universelle Gyro-Sensor Modul für RP6, RP6 V2, RP6 ATMEGA32 und das RP6 V2 Control M256 Wifi-Kit ist ideal zur Erkennung der Blockierung des Roboters in seiner Drehbewegung, sowie der Stabilisierung der Geradeausfahrt.&amp;quot;''&lt;br /&gt;
&lt;br /&gt;
Aktuell (April 2019) ist das Gyro Modul bei CONRAD ausverkauft. &lt;br /&gt;
&lt;br /&gt;
====Beschreibung====&lt;br /&gt;
Das Gyro Modul ist eine kleine (19 x 17 mm) Zusatzplatine (RP6 Xtra Modul), die im RP6-System genutzt werden kann. Es gibt zwar keinen direkt passenden &amp;quot;Steckplatz&amp;quot; auf einer der Microcontroller-Plattformen (RP6v2, M32, M128, M256 Wifi), jedoch ist der Anschluß einfach:&lt;br /&gt;
Benötigt werden +5V und GND, sowie ein freier ADC-Kanal, der bis 5V messen kann. Damit kann das Gyro Modul sehr universell eingesetzt werden. Es misst die Drehrate um die Z-Achse (Hochachse oder Yaw).&lt;br /&gt;
&lt;br /&gt;
Die Platine ist bestückt mit dem analogen Gyro-Sensor [http://www.st.com/web/en/resource/technical/document/datasheet/CD00254111.pdf LY330ALH], dessen Ausgangsspannung durch zwei OP-Amps ([http://www.ti.com.cn/cn/lit/ds/symlink/lm321.pdf LM321], [http://www.produktinfo.conrad.com/datenblaetter/00000-24999/001072615-da-01-en-IC_AMP_PREC_LMP7731MF_NOPB_SOT_23_5_TID.pdf LMP7731MF]) in Ruhe bei 2,5 V liegt. Höhere Ausgangsspannungen (bis 5 V) bedeuten eine Drehgeschwindigkeit nach LINKS, niedrigere (bis 0 V) eine Drehgeschwindigkeit nach RECHTS. Die 3,3 V Versorgungsspannung des LY330ALH wird auf der Platine durch einen Spannungsregler ([http://www.mouser.com/ds/2/405/lm3480-316799.pdf LM3480IM3-3.3]) erzeugt.&lt;br /&gt;
&lt;br /&gt;
'''Lieferumfang'''&lt;br /&gt;
* Gyro Modul&lt;br /&gt;
* CD mit Anleitung und Software-Beispielen.&lt;br /&gt;
&lt;br /&gt;
====Technische Daten====&lt;br /&gt;
&lt;br /&gt;
* VDD: 5,0 V +/- 5%&lt;br /&gt;
* Vout(0): 2,5 V +/- 2% (ohne Bewegung)&lt;br /&gt;
* Vout: Vout(0) + 10mV / dps +/- 2%&lt;br /&gt;
* Messbereich: ca. 200 dps max.&lt;br /&gt;
&lt;br /&gt;
====Anschluss-Schema====&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_Gyro_Modul_SP.JPG|RP6 Gyro Modul - Anschluss-Schema]]&lt;br /&gt;
&lt;br /&gt;
====Umbau-Optionen====&lt;br /&gt;
Am Gyro Modul gibt es nichts umzubauen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===3D Accelerometer Modul JM3-3DA===&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_3D_Accelerometer_Modul.JPG|RP6 3D Accelerometer Modul|right|105px]]&lt;br /&gt;
&lt;br /&gt;
(Laut Online-Katalog der Firma CONRAD!)&lt;br /&gt;
&lt;br /&gt;
''&amp;quot;Universeller 3-Achsen Beschleunigungssensor für RP6, RP6 V2, RP6 ATMEGA32 und das RP6 V2 Control M256 WIFI-Kit. Ideal zur Winkelmessung (Neigung-, Kipp-Winkel) und vieles mehr.&amp;quot;''&lt;br /&gt;
&lt;br /&gt;
Seit Mai 2020 ist das 3D Accelerometer Modul bei CONRAD ausverkauft.&lt;br /&gt;
&lt;br /&gt;
====Beschreibung====&lt;br /&gt;
&lt;br /&gt;
Das 3D Accelerometer Modul ist eine kleine (15 x 10 mm) Zusatzplatine (RP6 Xtra Modul), die direkt auf den EEPROM-Sockel (IC5) der Zusatzplatine [[RP6#RP6_CONTROL_M32_Platine|RP6 CONTROL M32]] gesteckt und über den SPI-Bus angesteuert werden kann. Das Accelerometer Modul kann aber auch mit allen Microcontroller-Plattformen betrieben werden, die eine stabilisierte 5V-Versorgungsspannung und einen SPI- oder I2C-Bus bieten.&lt;br /&gt;
&lt;br /&gt;
Die Platine ist bestückt mit dem 3D Beschleunigungs-Sensor [http://www.farnell.com/datasheets/1691680.pdf LIS302DLH]. Die 3,3 V Versorgungsspannung des LIS302DLH wird auf der Platine durch einen Spannungsregler ([http://www.mouser.com/ds/2/405/lm3480-316799.pdf LM3480IM3-3.3]) erzeugt.&lt;br /&gt;
&lt;br /&gt;
'''Lieferumfang'''&lt;br /&gt;
* 3D Accelerometer Modul&lt;br /&gt;
* CD mit Anleitung und Software-Beispielen.&lt;br /&gt;
&lt;br /&gt;
====Technische Daten====&lt;br /&gt;
&lt;br /&gt;
* VDD: 5,0 V +/- 5%&lt;br /&gt;
* Messbereiche: +-2 g, +-4 g, +-8 g&lt;br /&gt;
* Datenausgabe: 16 Bit&lt;br /&gt;
* Schnittstellen: I2C, SPI&lt;br /&gt;
&lt;br /&gt;
====Anschluss-Schema====&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_3D_Accelerometer_Modul_SP.JPG|RP6 3D Accelerometer Modul - Anschluss-Schema|350px]]&lt;br /&gt;
&lt;br /&gt;
====Umbau-Optionen====&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_3D_Accelerometer_Modul_M32.JPG|RP6 3D Accelerometer Modul auf der M32|right|500px]]&lt;br /&gt;
&lt;br /&gt;
'''Will man das Modul auf der M32 einsetzen, muss man auf dem 3D Accelerometer Modul die Widerstände R2 und R3 (falls vorhanden!) auslöten (siehe Anleitung zum Modul, Seiten 4/5!)''' und einen IC-Sockel an Position IC5 und einen Kondensator an Position C19 auf der M32 einlöten, siehe [[RP6#Zweites_SPI-EEPROM|hier]]!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die Abbildung rechts zeigt das 3D Accelerometer Modul auf der M32.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===BHT Modul JM3-BHT31===&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_BHT_Modul.PNG|RP6 BHT Modul|right|203px]]&lt;br /&gt;
&lt;br /&gt;
Dieses [http://jm3-engineering.com/sensors.htm BHT Modul] zur Messung von Luftdruck, Luftfeuchte und Temperatur war für das Ende des 3. Quartals 2014 angekündigt und ist nun ab dem 22.01.2015 lieferbar.&lt;br /&gt;
&lt;br /&gt;
(Laut Online-Katalog der Firma CONRAD!)&lt;br /&gt;
&lt;br /&gt;
''&amp;quot;Ein Luftdruck-, rel. Luftfeuchtigkeits- und Temperatursensor Modul für vielfältige Anwendungen. Es kann direkt in den Asuro Expansion-Port auf dem Asuro xTend Bord eingesteckt werden. Das Asuro Modul kann mit den anderen erhältlichen Modulen (Kompass/Gyro und RTC kombiniert werden (Stack-up)). Außerdem kann es auch auf dem RP6 Sensor Bord in dem I2C Modulsteckplatz verwendet werden. Das Sensor Modul verwendet den hochauflösenden Drucksensor-Chip MS5607-02BA und den Luftfeuchtigkeitssensor HTU21D von MEAS Switzerland mit I2C Bus Interface. Der barometrische Drucksensor ist für Höhenmesser und Variometer optimiert und hat eine Auflösung von 20cm. Der relative Luftfeuchtigkeits- und Temperatursensor bietet zuverlässige und genaue Daten, welche sich auch besonders für Wetterstations-Informationen eignen.&amp;quot;''&lt;br /&gt;
&lt;br /&gt;
Aktuell (April 2019) ist das BHT Modul bei CONRAD ausverkauft. &lt;br /&gt;
&lt;br /&gt;
====Beschreibung====&lt;br /&gt;
Das BHT Modul ist eine kleine (24 x 14 mm) Zusatzplatine (ASURO xTend bzw. RP6 Xtra Modul), die direkt auf das [[RP6_Sensor_Board_und_Xtra_Module#RP6_Sensor_Board_2|RP6 Sensor Board]] aufgesteckt werden kann. Sie kann auch auf dem [http://www.conrad.de/ce/de/product/1302085/Arexx-Asuro-xTend-Board-JM3-AXT3 Arexx Asuro xTend Board] und überall eingesetzt werden, wo eine stabilisierte 5V Versorgungsspannung und ein I2C-Bus bis 400 kHz zur Verfügung steht.&lt;br /&gt;
&lt;br /&gt;
Die Platine ist bestückt mit dem barometrischen Drucksensor [http://www.parallax.com/sites/default/files/downloads/29124-MS5607-02BA03-Datasheet.pdf MS5607-02BA] und dem relativen Luftfeuchtigkeits- und Temperatursensor [http://www.meas-spec.com/downloads/HTU21D.pdf HTU21D]. Die 3,0 V Versorgungsspannung der Sensoren wird auf der Platine durch einen Spannungsregler ([http://www.farnell.com/datasheets/78902.pdf LP2980AIM5-3.0]) erzeugt. &lt;br /&gt;
&lt;br /&gt;
'''Lieferumfang'''&lt;br /&gt;
* BHT Modul&lt;br /&gt;
* CD mit Dokumentation&lt;br /&gt;
&lt;br /&gt;
====Technische Daten====&lt;br /&gt;
&lt;br /&gt;
* Nennspannung: 3,3 V (?)&lt;br /&gt;
* Nennstrom: 0,2 mA (typ.) &amp;lt; 1,5mA peaktyp.&lt;br /&gt;
* I2C Bus Geschwindigkeit: 400kHz max.&lt;br /&gt;
* Sensor Modul mit MS5607-02BA und HTU21D&lt;br /&gt;
* Hohe Auflösung des Sensorelements - Höhe: 20cm /- rel. Luftfeuchtigkeit: 0,04%&lt;br /&gt;
* Schneller AD-Wandler&lt;br /&gt;
* Digitaler Drucksensor (24 bit ΔΣ ADC)&lt;br /&gt;
* Luftdruckbereich: 10 bis 1200 mbar&lt;br /&gt;
* Exzellente Langzeitstabilität&lt;br /&gt;
* Unmittelbare Desaturierung&lt;br /&gt;
* Kalibrierung in der Fabrik&lt;br /&gt;
&lt;br /&gt;
====Anschluss-Schema====&lt;br /&gt;
Belegung des 9-poligen Anschluss-Steckers (K1) siehe in [[RP6_Sensor_Board_und_Xtra_Module#I2C-MODULE|dieser]] Tabelle!&lt;br /&gt;
&lt;br /&gt;
====Umbau-Optionen====&lt;br /&gt;
&lt;br /&gt;
===Xtra Module auf einer Experimentierplatine===&lt;br /&gt;
&lt;br /&gt;
Die drei bis jetzt (09/2014) erhältlichen [[RP6_Sensor_Board_und_Xtra_Module#RP6_Xtra_Module_2|Xtra Module]], die die Navigation eines Roboters ermöglichen, können problemlos im RP6-System genutzt werden,- zwei davon sogar in Form des direkten Aufsteckens auf eine der Zusatz-Platinen: Für den [[RP6_Sensor_Board_und_Xtra_Module#I2C_GPS_Empf.C3.A4nger_JM3-GPS|I2C GPS Empfänger]] gibt es einen Steckplatz auf dem [[RP6_Sensor_Board_und_Xtra_Module#RP6_Sensor_Board_2|RP6 Sensor Board]], das [[RP6_Sensor_Board_und_Xtra_Module#3D_Accelerometer_Modul_JM3-3DA|3D Accelerometer Modul]] kann auf der [[RP6#RP6_CONTROL_M32_Platine|RP6 CONTROL M32]] aufgesteckt werden.&lt;br /&gt;
&lt;br /&gt;
Natürlich können die Xtra Module auch allein (&amp;quot;stand-alone&amp;quot;) ohne RP6 Sensor Board oder RP6 CONTROL M32 betrieben werden. Dazu kann man sie z.B. auf einer [[RP6#Experimentierplatine|Experimentierplatine]] aufbauen. &lt;br /&gt;
&lt;br /&gt;
Das soll hier mit einer kurzen Aufbauanleitung demonstriert werden.&lt;br /&gt;
&lt;br /&gt;
====Schaltplan====&lt;br /&gt;
&lt;br /&gt;
Aber zunächst der Schaltplan:&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6v2_Xtra_Module_SP.jpg|RP6 Experimentierplatine für Xtra Module - Schaltplan]]&lt;br /&gt;
&lt;br /&gt;
Man erkennt die drei XTra Module, die (bis auf das Gyro Modul) an den I2C-Bus am XBUS Stecker des RP6 angeschlossen sind. Das [[RP6_Sensor_Board_und_Xtra_Module#Gyro_Modul_JM3-GYRO|Gyro Modul JM3-GYRO]] wird nicht über I2C angesteuert, sondern liefert an seinem Pin OUT ein analoges Ausgangssignal, das mit einem ADC Eingang (0..5V) gemessen werden kann.&lt;br /&gt;
&lt;br /&gt;
Der Jumper (Steckbrücke) JP1 dient zum Einstellen der I2C-Adresse des 3D Accelerometer Moduls (0x30, 0x32).&lt;br /&gt;
Mit JP2/3 wird die [[RP6_Sensor_Board_und_Xtra_Module#Optionale_Ansteuerung|Betriebsart des Gyro Moduls]] festgelegt.&lt;br /&gt;
Die Jumper JP4 bis JP9 dienen zur Verteilung von INT1, INT2 des 3D Accelerometer Moduls und des OUT Signals des Gyro Moduls auf die INT-Anschlüsse INT1..3, INTU des XBUS. Wenn man die Interrupts des 3D Accelerometer Moduls nicht nutzen will, kann man die Jumper JP4 bis JP8 auch weglassen. Mit JP9 wird das analoge Signal des Gyro Moduls an INT1 des XBUS gelegt. Dies ist nur dann sinnvoll, wenn man die Platine mit der RP6v2 Base betreibt, weil hier an INT1 ein ADC Eingang (ADC4) liegt. Bei allen anderen Plattformen des RP6-Systems (M32, CCPRO M128, M256 WiFi) muss JP9 offen bleiben.&lt;br /&gt;
&lt;br /&gt;
Mit dieser Schaltung kann man also den Beschleunigungssensor (3D Accelerometer) und den GPS Empfänger über I2C auslesen. Der Gyro wird entweder mit ADC4 der RP6v2 Base (JP9 geschlossen!) ausgewertet oder durch einen anderen ADC Eingang. Dazu kann man das Ausgangssignal des Gyros an Pin 3 der Stiftleiste ST1 abnehmen. Von dort kann es z.B. zu ADC0 oder ADC1 der RP6v2 Base oder der RP6 CONTROL M32 geführt werden oder zu einem beliebigen ADC Eingang der CCPRO M128 oder der M256 WiFi. Die Stiftleiste ST1 liegt direkt neben dem USRBUS, so dass die Verbindung auch über den USRBUS hergestellt werden kann. Dazu verbindet man Pin 3 von ST1 mit einem Pin (Y1..Y14) des USRBUS.&lt;br /&gt;
&lt;br /&gt;
====Bestückungsplan====&lt;br /&gt;
&lt;br /&gt;
So kann z.B. der Bestückungsplan mit Leiterbahnführung auf der Experimentierplatine (Exp) aussehen:&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6v2_Xtra_Module.jpg|RP6 Experimentierplatine für Xtra Module]]&lt;br /&gt;
&lt;br /&gt;
Was braucht man allgemein für den Aufbau einer Schaltung auf der Exp:&lt;br /&gt;
* Seitenschneider, Schere, Zange&lt;br /&gt;
* Lötkolben 25..30 Watt, Lötzinn&lt;br /&gt;
* Plastik 70 Schutzlack (CONRAD 813621)&lt;br /&gt;
* Isolierter Schaltdraht YV 0,20 mm² (CONRAD 606065)&lt;br /&gt;
* Versilberter CU-Draht 0,6 mm (CONRAD 605581)&lt;br /&gt;
&lt;br /&gt;
Mit dem versilberten CU-Draht stellt man auf der Unterseite (= Lötseite) der Exp Verbindungen zwischen den Bauteilen her; mit dem isolierten Schaltdraht werden Drahtbrücken auf der Oberseite (= Bestückungsseite) der Exp eingesetzt. Die Lage der Xtra Module und der Verbindungen kann man im Bestückungsplan (s.o.!) erkennen, Drahtbrücken sind rot hervorgehoben.&lt;br /&gt;
&lt;br /&gt;
Zusätzlich zu den RP6 Xtra Modulen braucht man folgende Bauteile (Bestell-Nummern von CONRAD):&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| Anzahl || Bestell-Nr. || Bauteil-Bezeichnung || Verwendung&lt;br /&gt;
|-&lt;br /&gt;
| 1 || [http://www.conrad.de/ce/de/product/191537/Arexx-RP6-Experimentierplatine?queryFromSuggest=true 191537] || RP6 Experimentierplatine || &lt;br /&gt;
|-&lt;br /&gt;
| 1 || [http://www.conrad.de/ce/de/product/189600/Praezisions-IC-Fassung-MPE-Garry-MP-083-STG-BU-Pole-8-Rastermass-762-mm-Material-Kontaktfeder-025-Gold-ueber-Nickel 189600] || Präzisions-IC-Fassung (8 Pole) || Stecksockel für Accelerometer Modul&lt;br /&gt;
|-&lt;br /&gt;
| 1 || [http://www.conrad.de/ce/de/product/741360/Praezisions-Buchsenleiste-RM-254-gerade-Pole-1-x-20-10120832-BKL-Electronic-Inhalt-1-St 741360] || Präzisions-Buchsenleiste RM 2,54mm (9 Pole) || Stecksockel für GPS Empfänger&lt;br /&gt;
|-&lt;br /&gt;
| 1 || [http://www.conrad.de/ce/de/product/741307/Praezisions-Stiftleiste-RM-254-gerade-Pole-1-x-20-10120536-BKL-Electronic-Inhalt-1-St 741307] || Präzisions-Stiftleiste RM 2,54mm (2 x 4 Pole) || Stecksockel für Gyro Modul&lt;br /&gt;
|-&lt;br /&gt;
| 1 || [http://www.conrad.de/ce/de/product/741119/Stiftleiste-RM-254-gerade-Pole-1-x-36-10120182-BKL-Electronic-Inhalt-1-St 741119] || 1-reihige Stiftleiste RM 2,54mm (ges. 36-polig) || JP1, ST1&lt;br /&gt;
|-&lt;br /&gt;
| 1 || [http://www.conrad.de/ce/de/product/741186/Doppelreihige-Stiftleiste-RM-254-gerade-Pole-2-x-8-10120514-BKL-Electronic-Inhalt-1-St 741186] || 2-reihige Stiftleiste RM 2,54mm (ges. 8-polig) || JP2..9&lt;br /&gt;
|-&lt;br /&gt;
| 1 || [http://www.conrad.de/ce/de/product/742902/Codier-Adressierbruecken-Set-Rastermass-25254-mm-10120906-BKL-Electronic-Inhalt-1-Set 742902] || Sechs Codierbrücken (aus Set) || Steckbrücken&lt;br /&gt;
|-&lt;br /&gt;
| 2 || [http://www.conrad.de/ce/de/product/453099/Keramik-Kondensator-01-F-50-V-20-B-x-H-508-mm-x-508-mm-1-St 453099] || Keramik Kondensator 100 nF || Blockkondensatoren C2, C3&lt;br /&gt;
|-&lt;br /&gt;
| 1 || [http://www.conrad.de/ce/de/product/421986/Elektrolyt-Kondensator-radial-bedrahtet-25-mm-10-F-50-V-20--x-H-5-mm-x-11-mm-Panasonic-EEUFC1H100LH-1-St 421986] || Elektrolyt Kondensator 10 uF/50 V || Spannungsstabilisierung C1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Viel Erfolg beim Aufbau!&lt;br /&gt;
&lt;br /&gt;
 Natürlich muss man nicht alle drei Sensoren aufbauen!&lt;br /&gt;
 Man kann einfach den/die Sensor/en weglassen, den/die man nicht nutzen will!&lt;br /&gt;
&lt;br /&gt;
Noch ein Wort zur Programmierung des 3D Accelerometer Moduls: Es wird auf dieser Exp über den I2C Bus angesteuert. Damit kann man die [[RP6_Sensor_Board_und_Xtra_Module#RP6_CONTROL_M32:_ACCSENS_Library|nachfolgende Library]] für dieses Modul hier NICHT benutzen!&lt;br /&gt;
&lt;br /&gt;
====Magnetfeldsensor====&lt;br /&gt;
&lt;br /&gt;
Wenn man die oben beschriebene Experimentierplatine aufgebaut hat, hat man für die Navigation eines mobilen Roboters (wie des RP6v2) schon drei benötigte Sensoren zur Verfügung: einen GPS Empfänger, einen 3D-Beschleunigungssensor und einen 1D-Gyrosensor.&lt;br /&gt;
&lt;br /&gt;
Was fehlt, ist z.B. ein '''Magnetfeldsensor (Kompass-Sensor)''', mit dem der Roboter die Himmelsrichtung feststellen kann. Einen Magnetfeldsensor gibt es (noch) nicht als Xtra Modul.&lt;br /&gt;
&lt;br /&gt;
Auf der beschriebenen Experimentierplatine ist durchaus noch Platz (z.B. in der rechten oberen Ecke) für einen Magnetfeldsensor. Geeignet ist z.B. das 2D-Kompassmodul HDMM01 ([http://www.pollin.de/shop/dt/NTM4OTgxOTk-/Bausaetze_Module/Module/Kompassmodul_HDMM01.html Pollin 94-810 164] NICHT MEHR LIEFERBAR!).&lt;br /&gt;
&lt;br /&gt;
Hier ist der um den Magnetfeldsensor erweiterte Schaltplan:&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6v2_Xtra_Module_HDMM01_SP.jpg|RP6 Experimentierplatine für Xtra Module und HDMM01 - Schaltplan]]&lt;br /&gt;
&lt;br /&gt;
Das kleine Kompassmodul dürfte doch noch einfach auf der Experimentierplatine unterzubringen sein, oder?&lt;br /&gt;
&lt;br /&gt;
Zur Programmierung des Magnetfeldsensors HDMM01 gibt es [[RP6v2_Orientierung#Kompassmodul_HDMM01_2|HIER]] Anregungen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Programmierung==&lt;br /&gt;
In diesem Abschnitt geht es um die Programmierung der Sensoren und Aktoren auf dem [[RP6_Sensor_Board_und_Xtra_Module#RP6_Sensor_Board_3|RP6 Sensor Board]] und auf den [[RP6_Sensor_Board_und_Xtra_Module#RP6_Xtra_Module_3|Xtra Modulen]]. Die hier veröffentlichte Software baut NICHT auf die mitgelieferten C++ Software-Beispiele auf der ''&amp;quot;RP6 Robot System Xtra Modules CD-ROM&amp;quot;'' auf, sondern basiert auf Eigenentwicklungen in GCC.&lt;br /&gt;
&lt;br /&gt;
===RP6 Sensor Board===&lt;br /&gt;
Das RP6 Sensor Board RP6-JM03-61 verfügt nicht über einen eigenen Microprozessor. Daher geht es hier eigentlich nicht um die Programmierung des Sensor Boards, sondern um die Programmierung der Microcontroller-Plattform, an die das Sensor Board angeschlossen ist. In der Regel wird das die RP6 M256 WiFi Zusatzplatine sein, aber auch die RP6v2 Base steuert (als I2C-Slave) in der vorgesehenen Konfiguration gewisse Funktionen des Sensor Boards an.&lt;br /&gt;
Prinzipiell kann das Sensor Board aber auch an der RP6 CONTROL M32 (''passende Library auf Anfrage beim Autor!'') oder der RP6 CCPRO M128 Zusatzplatine betrieben werden.&lt;br /&gt;
&lt;br /&gt;
====Dokumentation====&lt;br /&gt;
Die Dokumentation zum RP6 Sensor Board befindet sich auf der mitgelieferten ''&amp;quot;RP6 Robot System Xtra Modules CD-ROM&amp;quot;''.&lt;br /&gt;
&lt;br /&gt;
=====Manuals=====&lt;br /&gt;
Das Handbuch in der aktuellen Version kann [http://www.jm3-engineering.com/download/doc/ManualRP6SensorBoard_de.pdf hier] oder [http://www.produktinfo.conrad.com/datenblaetter/00000-24999/001082384-an-01-de-RP6_SENSOR_BOARD.pdf da] eingesehen werden.&lt;br /&gt;
 ACHTUNG: Das Manual enthielt in der Version 1.11 noch teils irreführende&lt;br /&gt;
          Beschreibungen, die in der aktuellen Version 1.20 vom 20.04.2014&lt;br /&gt;
          korrigiert wurden!&lt;br /&gt;
&lt;br /&gt;
====Robot-Tool====&lt;br /&gt;
[[Bild:JM3 Robot-Tool.PNG|JM3 Robot-Tool|thumb]]&lt;br /&gt;
&lt;br /&gt;
Von JM3 Engineering wurde auch ein eigenes Programm &amp;quot;'''JM3 Robot-Tool'''&amp;quot; veröffentlicht, das im RP6-System (RP6(v2) Base, CONTROL M32, M256 WiFi) anstelle des [[RP6v2#RobotLoader|RobotLoaders]] verwendet werden kann.&lt;br /&gt;
&lt;br /&gt;
Vom Robot-Tool gibt es auch eine Kommandozeilen-Version &amp;quot;'''Multiloader'''&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Befehlszeilen Optionen'''&lt;br /&gt;
 Multi Loader v1.0.1&lt;br /&gt;
 &lt;br /&gt;
 Usage:&lt;br /&gt;
 multiloader [filename] [port/hostname] [device] [-l]&lt;br /&gt;
  -l forces RP6 low speed mode.&lt;br /&gt;
 &lt;br /&gt;
 Valid devices:&lt;br /&gt;
  - Asuro&lt;br /&gt;
  - AsuroCtrl&lt;br /&gt;
  - RP6Base&lt;br /&gt;
  - RP6CtrlM32&lt;br /&gt;
  - RobotArm&lt;br /&gt;
  - RP6Wifi&lt;br /&gt;
 Attention: Device names are case-sensitive&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 Multi Loader v2.0.0&lt;br /&gt;
 &lt;br /&gt;
 Usage: multiloader [load/conf] [...]&lt;br /&gt;
 &lt;br /&gt;
         load    Load .hex file into robot.&lt;br /&gt;
                 arguments: [filename] [port/host] [device] [interface] [-l]&lt;br /&gt;
 &lt;br /&gt;
                 [interface] specifies programming interface type.&lt;br /&gt;
                 Valid interface types are UART and TCP.&lt;br /&gt;
                 -l forces RP6 low speed mode.&lt;br /&gt;
 &lt;br /&gt;
                 Valid devices:  [interfaces]&lt;br /&gt;
                 - Asuro     UART&lt;br /&gt;
                 - AsuroXT   UART&lt;br /&gt;
                 - Marvin    UART&lt;br /&gt;
                 - MarvinFW  UART&lt;br /&gt;
                 - RP6       UART&lt;br /&gt;
                 - RP6M32    UART&lt;br /&gt;
                 - RP6Wifi   TCP&lt;br /&gt;
                 - RobotArm  UART&lt;br /&gt;
 &lt;br /&gt;
                 Attention: Device names are case-sensitive&lt;br /&gt;
 &lt;br /&gt;
=====Versionen=====&lt;br /&gt;
Hier eine Tabelle der (mir) bekannten Robot-Tool Versionen:&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |rowspan=2|ZIP-Datum&lt;br /&gt;
 |colspan=2|Robot-Tool:&lt;br /&gt;
 |colspan=2|Multiloader:&lt;br /&gt;
 |rowspan=2|Bemerkungen&lt;br /&gt;
 |-&lt;br /&gt;
 |Windows&lt;br /&gt;
 |Linux&lt;br /&gt;
 |Windows&lt;br /&gt;
 |Linux&lt;br /&gt;
 |-&lt;br /&gt;
 |25.10.2014&lt;br /&gt;
 |1.0.1-1&lt;br /&gt;
 |1.0.1-1&lt;br /&gt;
 |1.0.1-1&lt;br /&gt;
 |1.0.1-1&lt;br /&gt;
 |Erste veröffentlichte Version!&lt;br /&gt;
 |-&lt;br /&gt;
 |30.01.2017&lt;br /&gt;
 |[http://www.jm3-engineering.com/download/robottool-v2.0-win32.7z 2.0]&lt;br /&gt;
 |[http://www.jm3-engineering.com/download/robottool-v2.0-linux.tar.xz 2.0]&lt;br /&gt;
 |2.0&lt;br /&gt;
 |2.0&lt;br /&gt;
 |auch für [http://www.jm3-engineering.com/download/robottool-v2.0-osx.tar.gz Mac OSX]!&lt;br /&gt;
 |-&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
'''Hinweise:'''&lt;br /&gt;
* 1. Falls die Links in der Tabelle auf die Seite &amp;quot;Neuigkeiten&amp;quot; von JM3-Engineering führen, kann man dort auf die Seite &amp;quot;Software Downloads&amp;quot; wechseln und die Dateien im Absatz &amp;quot;JM3 Robot-Tool V2.0&amp;quot; herunterladen.&lt;br /&gt;
* 2. Ab Version 2.0 ist der Multiloader in der ZIP des Robot-Tools enthalten.&lt;br /&gt;
&lt;br /&gt;
====AVR-GCC und Visual Studio====&lt;br /&gt;
Die Demo-Programme zum RP6 Sensor Board wurden mit [https://www.microsoft.com/de-de/download/details.aspx?id=5555&amp;amp;fa43d42b-25b5-4a42-fe9b-1634f450f5ee=True Microsoft Visual C++ 2010] und [http://www.jm3-engineering.com/download/avr-gcc-4.8.1-win32.7z AVR-GCC] erstellt.&lt;br /&gt;
&lt;br /&gt;
Eine Anleitung zur Installation unter Windows befindet sich [http://www.jm3-engineering.com/download/doc/avr-gcc-vs_de.pdf hier].&lt;br /&gt;
&lt;br /&gt;
====Demo-Programmme====&lt;br /&gt;
Demo-Programme und eine &amp;quot;Library&amp;quot; zum RP6 Sensor Board befinden sich auf der mitgelieferten ''&amp;quot;RP6 Robot System Xtra Modules CD-ROM&amp;quot;''. Sie können auch in der aktuellen Version im Download Bereich von [http://www.jm3-engineering.com/downloads.htm JM3 Engineering] herunter geladen werden:&lt;br /&gt;
* [http://www.jm3-engineering.com/download/RP6SensorBoardDemo_1.1-1.7z RP6 Sensor Board Demo Programm und Library]&lt;br /&gt;
* [http://www.jm3-engineering.com/download/RP6SensorBoardDemo_noVC_1.1-1.7z RP6 Sensor Board Demo Programm und Library (ohne Visual Studio Projekt Dateien)]&lt;br /&gt;
* [http://www.jm3-engineering.com/download/RP6-RC_1.0-1.7z Remote Control Software]&lt;br /&gt;
'''Hinweis:'''&lt;br /&gt;
Falls die o.g. Links auf die Seite &amp;quot;Neuigkeiten&amp;quot; von JM3-Engineering führen, kann man dort auf die Seite &amp;quot;Software Downloads&amp;quot; wechseln und die Dateien im Absatz &amp;quot;RP6 Sensor Board Library und Demo-Programm&amp;quot; herunterladen.&lt;br /&gt;
&lt;br /&gt;
====Library====&lt;br /&gt;
Eine &amp;quot;Library&amp;quot; zum RP6 Sensor Board, bestehend aus einigen Einzel-Dateien mit jeweils eigenen Versions-Nummern, befindet sich auf der mitgelieferten ''&amp;quot;RP6 Robot System Xtra Modules CD-ROM&amp;quot;''. Sie ist in der aktuellen Version auch in den Demo-Programmen enthalten ([[RP6_Sensor_Board_und_Xtra_Module#Demo-Programmme|s.o.!]]).&lt;br /&gt;
&lt;br /&gt;
=====Versionen=====&lt;br /&gt;
Hier eine Tabelle der (mir) bekannten Library Versionen für das RP6 Sensor Board:&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |ZIP-Datum *&lt;br /&gt;
 |Version&lt;br /&gt;
 |RP6SensorBoardDemo&lt;br /&gt;
 |RP6-RC&lt;br /&gt;
 |RP6M256_I2CMasterLib&lt;br /&gt;
 |RP6M256Lib&lt;br /&gt;
 |RP6I2CmasterTWI&lt;br /&gt;
 |-&lt;br /&gt;
 |09.12.2013&lt;br /&gt;
 |1.0&lt;br /&gt;
 |1.0&lt;br /&gt;
 |1.0&lt;br /&gt;
 |(1.0_24.02.12) ²&lt;br /&gt;
 |1.1_16.07.12 ²&lt;br /&gt;
 |1.1_04.09.12 ³&lt;br /&gt;
 |-&lt;br /&gt;
 |27.12.2014&lt;br /&gt;
 |1.1&lt;br /&gt;
 |1.1-1&lt;br /&gt;
 |1.0-1&lt;br /&gt;
 |Modified 02.11.14 ³&lt;br /&gt;
 |1.1.1_25.10.14 ³&lt;br /&gt;
 |1.1_04.09.12 ³&lt;br /&gt;
 |-&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
'''Zu *:''' Alternativ: Datum der Verzeichnisse (z.B. auf der ''&amp;quot;RP6 Robot System Xtra Modules CD-ROM&amp;quot;'')!&lt;br /&gt;
&lt;br /&gt;
'''Zu ²:''' Neueste Original Version der [http://rn-wissen.de/wiki/index.php/RP6v2#Versionen RP6 Library]!&lt;br /&gt;
&lt;br /&gt;
'''Zu ³:''' Modifiziert von [http://www.jm3-engineering.com/ JM3 Engineering]!&lt;br /&gt;
&lt;br /&gt;
=====Modifizierte RP6 Libraries=====&lt;br /&gt;
Von [http://www.jm3-engineering.com/ JM3 Engineering] wurden bis jetzt drei [http://rn-wissen.de/wiki/index.php/RP6v2#Versionen RP6 &amp;quot;Original&amp;quot;-Libraries] leicht modifiziert, um sie für die eigenen Programme für das RP6 Sensor Board optimal nutzen zu können.&lt;br /&gt;
In diesem Abschnitt soll kurz erwähnt werden, WAS verändert wurde.&lt;br /&gt;
 &lt;br /&gt;
======RP6M256_I2CMasterLib======&lt;br /&gt;
Die RP6M256_I2CMasterLib wurde von JM3 Engineering ab der Software Version 1.1 für das RP6 Sensor Board verändert, um sie in einer eigenen Bibliothek bestehend aus mehreren Modulen nutzen zu können. Folgendes wurde angepasst:&lt;br /&gt;
* Neue typedef unions:&lt;br /&gt;
** u_interrupt_status&lt;br /&gt;
** u_status&lt;br /&gt;
** u_drive_status&lt;br /&gt;
** u_statusLEDs&lt;br /&gt;
&lt;br /&gt;
Die modifizierte RP6M256_I2CMasterLib vom 2.11.2014 ist kompatibel zur Original-Version vom 24.02.2012.&lt;br /&gt;
&lt;br /&gt;
======RP6M256Lib======&lt;br /&gt;
Eine modifizierte Version 1.1.1 der RP6M256Lib mit Datum vom 25.10.2014 wurde von JM3 Engineering im November 2014 zusammen mit der Software Version 1.1 für das RP6 Sensor Board veröffentlicht. Sie ist kompatibel zur Version 1.1 der RP6M256Lib vom 16.07.2012 und enthält folgende Änderung:&lt;br /&gt;
* In der Datei RP6M256.h wird die Variable &amp;quot;timer&amp;quot; korrekt als &amp;quot;''extern'' volatile uint16_t timer&amp;quot; deklariert.&lt;br /&gt;
&lt;br /&gt;
======RP6I2CmasterTWI======&lt;br /&gt;
Eine erweiterte I2C Master-Library (Version 1.1) gibt es mit Datum vom 04.09.2012, veröffentlicht ab Februar 2014 von JM3 Engineering für das RP6 Sensor Board und die Xtra Module. Sie ist abwärts-kompatibel zur I2C Master-Library in der Version 1.0 vom 16.05.2007 und bietet lediglich folgende Erweiterung: &lt;br /&gt;
* Neue Funktion I2CTWI_readWordRegisters() zum Lesen von 16 Bit Registern&lt;br /&gt;
&lt;br /&gt;
====RP6 M256 WiFi: Sensor Board Library====&lt;br /&gt;
Die nachfolgende RP6M256_Sensor_BoardLib (Eigenentwicklung in GCC) dient zur Ansteuerung des Sensor Boards durch die RP6M256 WiFi.&lt;br /&gt;
&lt;br /&gt;
=====Configuration Header=====&lt;br /&gt;
Vor dem Kompilieren der Library muss eine Anpassung des Configuration Headers an die eigenen Hardware-Voraussetzungen erfolgen.&lt;br /&gt;
Dazu gibt es im Configuration Header eine Definition:&lt;br /&gt;
* USE_PD5 -&amp;gt; Die Sensor Board Funktion &amp;quot;PD5&amp;quot; steuert den TCA4311A Enable Pin (EN).&lt;br /&gt;
Im nachfolgenden Listing ist die Definition USE_PD5 NICHT aktiv (d.h. der TCA4311A Enable Pin (EN) wird vom MAX7311 I/O 1.0 Pin angesteuert!). Dies muss an die eigene Hardware angepaßt werden. Wenn &amp;quot;PD5&amp;quot; den TCA4311A Enable Pin (EN) steuern soll, muss die Zeile mit &amp;quot;USE_PD5&amp;quot; &amp;quot;aktiviert&amp;quot; werden. Dazu entfernt man &amp;quot;//&amp;quot; am Zeilenanfang:&lt;br /&gt;
 #define USE_PD5&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Bevor man Beschleunigungs-, Magnetfeldsensor und Gyroskop nutzen kann, muss man sie kalibrieren:&lt;br /&gt;
&lt;br /&gt;
* '''Accelerometer:'''&lt;br /&gt;
** Die X-Achse wird kalibriert, indem man den RP6 mit der rechten Seite nach unten hält und den Maximalwert in MAX_X_A einträgt. Dann neigt man ihn auf seine linke Seite und trägt den negativen Maximalwert in MIN_X_A ein.&lt;br /&gt;
** Die Y-Achse wird kalibriert, indem man den RP6 mit der Vorderseite nach oben hält und den Maximalwert in MAX_Y_A einträgt. Dann kippt man die Vorderseite nach unten und trägt den negativen Maximalwert in MIN_Y_A ein.&lt;br /&gt;
** Die Z-Achse wird kalibriert, indem man den RP6 normal waagerecht hält und den Maximalwert in MAX_Z_A einträgt. Dann dreht man den RP6 &amp;quot;auf den Kopf&amp;quot; und trägt den negativen Maximalwert in MIN_Z_A ein.&lt;br /&gt;
** Sollten die angezeigten Pitch- und Roll-Werte nach der Kalibrierung der Achsen und genau waagerecht stehendem Sensor bzw. RP6 vom Nullwert deutlich abweichen, kann man sie mithilfe der Definitionen OFFSET_PITCH_A und OFFSET_ROLL_A &amp;quot;nullen&amp;quot;. Die Einheit dieser Definitionen ist °.&lt;br /&gt;
 ''HINWEIS: Die internen Berechnungen werden durch diese Offset-Korrektur&lt;br /&gt;
 NICHT beeinflußt. Die Offset-Werte können also nicht dazu benutzt werden,&lt;br /&gt;
 eine Achsenabweichung zwischen Sensor und RP6 zu kompensieren!''&lt;br /&gt;
* '''Magnetometer:'''&lt;br /&gt;
** Zur Kalibrierung des Magnetfeldsensors stellt man den RP6 auf eine waagerechte Fläche. Es dürfen keine Elektrogeräte, Metallteile und stromführende Leitungen in der Nähe sein, die das Magnetfeld verändern können.&lt;br /&gt;
** Zunächst ist es möglich, die sogenannten &amp;quot;hard iron&amp;quot; Effekte auszugleichen. Dies sind feste Magnetfeldabweichungen, die durch das &amp;quot;Gerät&amp;quot; (in unserem Fall also durch den kompletten RP6) verursacht werden, in oder auf dem der Sensor angebracht ist. Mit den Definitionen OFFSET_X_M, OFFSET_Y_M und OFFSET_Z_M können diese Effekte ausgeglichen werden. Diese Kalibrierung wird hier aktuell (noch) nicht beschrieben, so dass man die Werte für diese Definitionen zunächst bei 0 belassen sollte.&lt;br /&gt;
** Die X-Achse und Y-Achse wird kalibriert, indem man den RP6 langsam mehrfach um die eigene (Z-)Achse dreht und die Maximalwerte in MAX_X_M und MAX_Y_M einträgt. Die negativen Maximalwerte trägt man in MIN_X_M und MIN_Y_M ein.&lt;br /&gt;
** Die Z-Achse wird kalibriert, indem man den RP6 auf die rechte oder linke Seite legt, ihn dann langsam mehrfach auf der Stelle (um seine Y-Achse) dreht und den Maximalwert in MAX_Z_M und den negativen Maximalwert in MIN_Z_M einträgt.&lt;br /&gt;
** Mit der Definition DECLINATION_M kann man zur Verbesserung der Genauigkeit der Richtungsangaben den magnetischen Deklinationswert [°] (d.h. die magnetische Missweisung) am aktuellen Standort festlegen. [http://www.ngdc.noaa.gov/geomag-web/#declination Hier] befindet sich ein &amp;quot;Deklinations-Rechner&amp;quot;, mit dem man den Deklinationswert für den eigenen Standort ermitteln kann. &lt;br /&gt;
** Wenn man den Temperaturwert des LSM303DLHC nutzen will, muss man die Definition GET_TEMP_M aktivieren (Standard!). Den Temperaturwert kann man noch eichen, indem man die Definition OFFSET_TEMP_M anpasst. Die Einheit von OFFSET_TEMP_M ist °C.&lt;br /&gt;
* '''Gyroskop:'''&lt;br /&gt;
** In Ruhelage des RP6 wird ein ADC-Wert von ca. 511 angezeigt, wenn die Definition ADCVAL_ZERORATE_LEVEL im Configuration Header (RP6M256_Sensor_Board.h) vor der ersten Kompilierung zunächst auf 0 gesetzt wurde. Die Kalibrierung des Gyroskops ist abgeschlossen, nachdem man den in Ruhelage angezeigten ADC-Wert als ADCVAL_ZERORATE_LEVEL eingetragen hat.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''HINWEISE ZUR KALIBRIERUNG:'''&lt;br /&gt;
* Das Demo-Programm ist nicht sehr gut geeignet, um die Kalibrierungen durchzuführen.&lt;br /&gt;
* Man sollte mit einem eigenen kurzen ''Kalibrierungs-Programm'' nur die Rohwerte der jeweiligen X-, Y- und Z-Achse z.B. zweimal pro Sekunde ausgeben.&lt;br /&gt;
* Die Rohwerte sind in Variablen x_axis..., y_axis..., z_axis... enthalten. Da die Rohwerte in den Funktionen normalizeLSM303DLHC_A() bzw. normalizeLSM303DLHC_M() ggf. verändert werden, müssen die Rohwerte VOR Durchlaufen dieser Funktionen ausgegeben werden.&lt;br /&gt;
* '''Ohne eine sorgfältige Kalibrierung wird die Kompass-Funktion (insbesondere die neigungskompensierte Ausgabe der Himmelsrichtung) nicht funktionieren!'''&lt;br /&gt;
* Nach dem Eintragen der Kalibrierungs-Werte in den Configuration Header (RP6M256_Sensor_Board.h) muss die ''Demo'' neu kompiliert werden. Vorher sollten die Compiler-Hilfsdateien der Sensor Board-Library (Dateiendungen .st und .o) im Programmverzeichnis gelöscht werden.&lt;br /&gt;
* Getestet wird das Ergebnis der Kalibrierung, indem die Ausgabewerte (Temperatur, Pitch, Roll, Heading, Neigungs-kompensiertes Heading) der ''Demo'' überprüft werden. Dazu kann man Vergleichswerte (Thermometer, Winkelmesser für Pitch, Roll und externer Kompass für Heading) heranziehen.&lt;br /&gt;
* Wenn die Ausgabewerte nicht den Erwartungen entsprechen, muss die Kalibrierung wiederholt werden.&lt;br /&gt;
* Eine Kalibrierung der Sensoren ist nur zuverlässig, solange die Position des jeweiligen Sensors und seine komplette Hardware-Umgebung (also der RP6 mit allen seinen Teilen!) nicht verändert wird. Gibt es trotzdem Veränderungen, z.B. durch weitere Aufbauten auf dem RP6, müssen diese Sensoren neu kalibriert werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Datei: RP6M256_Sensor_Board.h&lt;br /&gt;
&amp;lt;pre&amp;gt;/* ****************************************************************************&lt;br /&gt;
 *                           _______________________&lt;br /&gt;
 *                           \| RP6  ROBOT SYSTEM |/&lt;br /&gt;
 *                            \_-_-_-_-_-_-_-_-_-_/           &amp;gt;&amp;gt;&amp;gt; RP6 M256 WIFI&lt;br /&gt;
 * ----------------------------------------------------------------------------&lt;br /&gt;
 * ----------------------------- [c]2014 - Dirk -------------------------------&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * File: RP6M256_Sensor_Board.h&lt;br /&gt;
 * Version: 1.1&lt;br /&gt;
 * Target: RP6 M256 WIFI - ATMEGA2560 @16.00MHz&lt;br /&gt;
 * Author(s): Dirk&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Description:&lt;br /&gt;
 * Configuration header file for new RP6 Sensor Board library.&lt;br /&gt;
 * The RP6 Sensor Board (CONRAD 1082384) is connected to the RP6M256 with the&lt;br /&gt;
 * two plugs:&lt;br /&gt;
 *   Sensor Board &amp;lt;---&amp;gt; RP6M256&lt;br /&gt;
 *   --------------------------------&lt;br /&gt;
 *   I/O (K17)    &amp;lt;---&amp;gt; IO_PWM/T0/T1&lt;br /&gt;
 *   ADC (K18)    &amp;lt;---&amp;gt; ADC_IO2/CMP&lt;br /&gt;
 * The RP6 Sensor Board function &amp;quot;PD5&amp;quot; (IC6: EN) is now connected to RP6M256&lt;br /&gt;
 * OC1B (PB6) and the RP6 Sensor Board function &amp;quot;ADC4&amp;quot; (SHARP_R) to RP6M256&lt;br /&gt;
 * ADC9 (PK1).&lt;br /&gt;
 * On the RP6 Sensor Board the functions &amp;quot;ADC0&amp;quot;, &amp;quot;ADC1&amp;quot;, &amp;quot;PWR&amp;quot; and &amp;quot;ADC4&amp;quot; are&lt;br /&gt;
 * connected to the USRBUS. The USRBUS may be wired on the RP6 mainboard like&lt;br /&gt;
 * this:&lt;br /&gt;
 *   Function : Sensor Board - USRBUS: * &amp;lt;---&amp;gt; RP6 Mainboard&lt;br /&gt;
 *   --------------------------------------------------------&lt;br /&gt;
 *   SHARP_F  : &amp;quot;ADC0&amp;quot;       - Pin 1     &amp;lt;---&amp;gt; ADC0: Pin 3&lt;br /&gt;
 *   GYRO     : &amp;quot;ADC1&amp;quot;       - Pin 2     &amp;lt;---&amp;gt; ADC1: Pin 3&lt;br /&gt;
 *   PWRON ²  : &amp;quot;PWR&amp;quot;        - Pin 3     &amp;lt;---&amp;gt; PWR&lt;br /&gt;
 *   SHARP_R  : &amp;quot;ADC4&amp;quot;       - Pin 5     &amp;lt;---&amp;gt; Not connected!&lt;br /&gt;
 * At *) It is also possible not to use the USRBUS, but to connect the RP6&lt;br /&gt;
 *       Sensor Board directly to the RP6 mainboard with 3 single cables.&lt;br /&gt;
 * At ²) See RP6 manual &amp;quot;4.6.8. Stromsparfunktionen&amp;quot;! &lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
#ifndef RP6M256_SENSOR_BOARD_H&lt;br /&gt;
#define RP6M256_SENSOR_BOARD_H&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// RP6 Sensor Board hardwired components:&lt;br /&gt;
// - I2C I/O Port Expander (MAX7311)&lt;br /&gt;
// - I2C Real Time Clock (RTC DS1339)&lt;br /&gt;
// - I2C Temperature Sensor (LM75B)&lt;br /&gt;
// - I2C Servo Controller (PCA9685)&lt;br /&gt;
// - I2C LED Driver (TCA6507)&lt;br /&gt;
// - I2C 3D Magnetometer &amp;amp; Accelerometer (LSM303DLHC)&lt;br /&gt;
// - Analog Yaw-Rate Gyroscope (LY330ALH)&lt;br /&gt;
// - Hot Swappable 2-Wire Bus Buffer (TCA4311A)&lt;br /&gt;
// - Button&lt;br /&gt;
// - Status LED&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C I/O Port Expander (MAX7311):&lt;br /&gt;
#define I2C_SENSOR_PORTEXP_ADR			0x40	// Default&lt;br /&gt;
&lt;br /&gt;
// Interrupt I/O portpin definitions (RP6M256):&lt;br /&gt;
#define IO_SENSOR_INT1_IN				INT1_PI12 // PCINT12 PJ3  XBUS Pin 8&lt;br /&gt;
#define IO_SENSOR_INT1_DDR				DDRJ&lt;br /&gt;
#define IO_SENSOR_INT1_PIN				PINJ&lt;br /&gt;
#define IO_SENSOR_INT1_PORT				PORTJ&lt;br /&gt;
#define IO_SENSOR_INT2_IN				INT2_PI15 // PCINT15 PJ6  XBUS Pin 11&lt;br /&gt;
#define IO_SENSOR_INT2_DDR				DDRJ&lt;br /&gt;
#define IO_SENSOR_INT2_PIN				PINJ&lt;br /&gt;
#define IO_SENSOR_INT2_PORT				PORTJ&lt;br /&gt;
#define IO_SENSOR_INT3_IN				INT3_PI14 // PCINT14 PJ5  XBUS Pin 9&lt;br /&gt;
#define IO_SENSOR_INT3_DDR				DDRJ&lt;br /&gt;
#define IO_SENSOR_INT3_PIN				PINJ&lt;br /&gt;
#define IO_SENSOR_INT3_PORT				PORTJ&lt;br /&gt;
#define IO_SENSOR_INTU_IN				INTU_PI13 // PCINT13 PJ4  XBUS Pin 7&lt;br /&gt;
#define IO_SENSOR_INTU_DDR				DDRJ&lt;br /&gt;
#define IO_SENSOR_INTU_PIN				PINJ&lt;br /&gt;
#define IO_SENSOR_INTU_PORT				PORTJ&lt;br /&gt;
&lt;br /&gt;
// I/O PORT pin numbers:&lt;br /&gt;
#define PIN7							7&lt;br /&gt;
#define PIN6							6&lt;br /&gt;
#define PIN5							5&lt;br /&gt;
#define PIN4							4&lt;br /&gt;
#define PIN3							3&lt;br /&gt;
#define PIN2							2&lt;br /&gt;
#define PIN1							1&lt;br /&gt;
#define PIN0							0&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Real Time Clock (RTC DS1339):&lt;br /&gt;
#define I2C_SENSOR_RTC_ADR				0xd0	// Default&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Temperature Sensor (LM75B):&lt;br /&gt;
#define I2C_SENSOR_TEMP_ADR				0x90	// Default&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Servo Controller (PCA9685):&lt;br /&gt;
#define I2C_SENSOR_SERVO_ADR			0x88	// Default&lt;br /&gt;
&lt;br /&gt;
// Servo and PWM channels:&lt;br /&gt;
#define CH_SERVO_1						16		// At K6: 1  &amp;quot;SERVO_1&amp;quot;&lt;br /&gt;
#define CH_SERVO_2						15		// At K11: 1 &amp;quot;SERVO_2&amp;quot;&lt;br /&gt;
#define CH_SERVO_3						13		// At K29: 1 &amp;quot;SERVO_3&amp;quot;&lt;br /&gt;
#define CH_SERVO_4						14		// At K30: 1 &amp;quot;SERVO_4&amp;quot;&lt;br /&gt;
#define CH_SERVO_5						11		// At K31: 1 &amp;quot;SERVO_5&amp;quot;&lt;br /&gt;
#define CH_SERVO_6						12		// At K32: 1 &amp;quot;SERVO_6&amp;quot;&lt;br /&gt;
#define CH_SERVO_7						9		// At K33: 1 &amp;quot;SERVO_7&amp;quot;&lt;br /&gt;
#define CH_SERVO_8						10		// At K34: 1 &amp;quot;SERVO_8&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#define CH_PWM_OUT_1					1		// At K12: 1 &amp;quot;PWM_OUT&amp;quot;&lt;br /&gt;
#define CH_PWM_OUT_2					2		// At K12: 2&lt;br /&gt;
#define CH_PWM_OUT_3					3		// At K12: 3&lt;br /&gt;
#define CH_PWM_OUT_4					4		// At K12: 4&lt;br /&gt;
#define CH_PWM_OUT_5					5		// At K12: 5&lt;br /&gt;
#define CH_PWM_OUT_6					6		// At K12: 6&lt;br /&gt;
#define CH_PWM_OUT_7					7		// At K12: 7&lt;br /&gt;
#define CH_PWM_OUT_8					8		// At K12: 8&lt;br /&gt;
&lt;br /&gt;
// Servo left touch (LT), right touch (RT), middle position (MP) constants:&lt;br /&gt;
// (Hints: - Servo impulse length [ms] = Servo position value / 204.8&lt;br /&gt;
//           (Formula only valid for a PWM of 50 Hz!)&lt;br /&gt;
//         - Min. servo impulse (0,7 ms) = Servo position 143&lt;br /&gt;
//         - Mid. servo impulse (1,5 ms) = Servo position 307&lt;br /&gt;
//         - Max. servo impulse (2,3 ms) = Servo position 471&lt;br /&gt;
//         - !!! You should NOT use servo position values &amp;lt; 143 or &amp;gt; 471 !!!)&lt;br /&gt;
#define SERVO1_LT						205		// Servo impulse ~1ms&lt;br /&gt;
#define SERVO1_RT						410		// Servo impulse ~2ms&lt;br /&gt;
#define SERVO1_MP						((SERVO1_RT - SERVO1_LT) / 2 + SERVO1_LT)&lt;br /&gt;
#define SERVO2_LT						205&lt;br /&gt;
#define SERVO2_RT						410&lt;br /&gt;
#define SERVO2_MP						((SERVO2_RT - SERVO2_LT) / 2 + SERVO2_LT)&lt;br /&gt;
#define SERVO3_LT						205&lt;br /&gt;
#define SERVO3_RT						410&lt;br /&gt;
#define SERVO3_MP						((SERVO3_RT - SERVO3_LT) / 2 + SERVO3_LT)&lt;br /&gt;
#define SERVO4_LT						205&lt;br /&gt;
#define SERVO4_RT						410&lt;br /&gt;
#define SERVO4_MP						((SERVO4_RT - SERVO4_LT) / 2 + SERVO4_LT)&lt;br /&gt;
#define SERVO5_LT						205&lt;br /&gt;
#define SERVO5_RT						410&lt;br /&gt;
#define SERVO5_MP						((SERVO5_RT - SERVO5_LT) / 2 + SERVO5_LT)&lt;br /&gt;
#define SERVO6_LT						205&lt;br /&gt;
#define SERVO6_RT						410&lt;br /&gt;
#define SERVO6_MP						((SERVO6_RT - SERVO6_LT) / 2 + SERVO6_LT)&lt;br /&gt;
#define SERVO7_LT						205&lt;br /&gt;
#define SERVO7_RT						410&lt;br /&gt;
#define SERVO7_MP						((SERVO7_RT - SERVO7_LT) / 2 + SERVO7_LT)&lt;br /&gt;
#define SERVO8_LT						205&lt;br /&gt;
#define SERVO8_RT						410&lt;br /&gt;
#define SERVO8_MP						((SERVO8_RT - SERVO8_LT) / 2 + SERVO8_LT)&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C LED Driver (TCA6507):&lt;br /&gt;
#define I2C_SENSOR_LEDDRIVER_ADR		0x8a	// Default&lt;br /&gt;
&lt;br /&gt;
// LED numbers:&lt;br /&gt;
#define SB_LED0							0		// At K7&lt;br /&gt;
#define DISPLAY_BACKLIGHT				0		// Display background light&lt;br /&gt;
#define SB_LED1							1		// At K4&lt;br /&gt;
#define SB_LED2							2		// At K2&lt;br /&gt;
#define SB_LED3							3		// At K10: 1&lt;br /&gt;
#define BACKLIGHT_R						3		// Right backlight&lt;br /&gt;
#define SB_LED4							4		// At K10: 2&lt;br /&gt;
#define BACKLIGHT_L						4		// Left backlight&lt;br /&gt;
#define SB_LED5							5		// White LED (D3)&lt;br /&gt;
#define HEADLIGHT_R						5		// Right headlight&lt;br /&gt;
#define SB_LED6							6		// White LED (D1)&lt;br /&gt;
#define HEADLIGHT_L						6		// Left headlight&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C 3D Magnetometer &amp;amp; Accelerometer (LSM303DLHC):&lt;br /&gt;
&lt;br /&gt;
// LSM303DLHC accelerometer:&lt;br /&gt;
#define I2C_SENSOR_LSM303DLHC_A_ADR 	0x32	// Default&lt;br /&gt;
&lt;br /&gt;
// LSM303DLHC accelerometer calibration data:&lt;br /&gt;
#define MAX_X_A						1037		// Max. X-axis value&lt;br /&gt;
#define MIN_X_A						-1030		// Min. X-axis value&lt;br /&gt;
#define MAX_Y_A						1030		// Max. Y-axis value&lt;br /&gt;
#define MIN_Y_A						-1019		// Min. Y-axis value&lt;br /&gt;
#define MAX_Z_A						1062		// Max. Z-axis value&lt;br /&gt;
#define MIN_Z_A						-1056		// Min. Z-axis value&lt;br /&gt;
#define OFFSET_PITCH_A				0.0			// Offset Pitch [°]&lt;br /&gt;
#define OFFSET_ROLL_A				0.0			// Offset Roll [°]&lt;br /&gt;
&lt;br /&gt;
// LSM303DLHC magnetometer:&lt;br /&gt;
#define I2C_SENSOR_LSM303DLHC_M_ADR		0x3c	// Default&lt;br /&gt;
&lt;br /&gt;
// LSM303DLHC magnetometer calibration data:&lt;br /&gt;
#define MAX_X_M						-111.0		// Max. X-axis value&lt;br /&gt;
#define MIN_X_M						-634.0		// Min. X-axis value&lt;br /&gt;
#define OFFSET_X_M					0			// Hard iron X-axis offset&lt;br /&gt;
#define MAX_Y_M						297.0		// Max. Y-axis value&lt;br /&gt;
#define MIN_Y_M						-215.0		// Min. Y-axis value&lt;br /&gt;
#define OFFSET_Y_M					0			// Hard iron Y-axis offset&lt;br /&gt;
#define MAX_Z_M						183.0		// Max. Z-axis value&lt;br /&gt;
#define MIN_Z_M						-214.0		// Min. Z-axis value&lt;br /&gt;
#define OFFSET_Z_M					0			// Hard iron Z-axis offset&lt;br /&gt;
#define DECLINATION_M				0.0			// E at local position [°]&lt;br /&gt;
&lt;br /&gt;
// LSM303DLHC temperature sensor definitions:&lt;br /&gt;
#define GET_TEMP_M								// Enable temperature sensor&lt;br /&gt;
#define OFFSET_TEMP_M				0.0			// Temperature offset [°C]&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Analog Yaw-Rate Gyroscope (LY330ALH):&lt;br /&gt;
&lt;br /&gt;
// LY330ALH gyroscope:&lt;br /&gt;
#define ADC_SENSOR_LY330ALH				ADC_1	// At USRBUS: 2 (RP6BASE)&lt;br /&gt;
&lt;br /&gt;
// LY330ALH gyroscope calibration data:&lt;br /&gt;
// (Higher values [505..1023] mean an angular velocity while rotating LEFT&lt;br /&gt;
//  and lower values [503..0] while rotating RIGHT!)&lt;br /&gt;
#define ADCVAL_MINRATE					0		// Min. rate value&lt;br /&gt;
#define ADCVAL_ZERORATE_LEVEL			504		// Zero rate level&lt;br /&gt;
#define ADCVAL_MAXRATE					1023	// Max. rate value&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Hot Swappable 2-Wire Bus Buffer (TCA4311A):&lt;br /&gt;
&lt;br /&gt;
// Define USE_PD5, if you want to control the TCA4311A enable pin (EN) with&lt;br /&gt;
// the RP6 Sensor Board function &amp;quot;PD5&amp;quot;. If USE_PD5 is NOT defined (default),&lt;br /&gt;
// the TCA4311A EN pin is controlled by the MAX7311 I/O 1.0 pin.&lt;br /&gt;
// ---------------&lt;br /&gt;
//#define USE_PD5&lt;br /&gt;
// ---------------&lt;br /&gt;
&lt;br /&gt;
#define IO_SENSOR_TCA4311A_EN_IN		OC1B_PI6 // At I/O: 9 (RP6M256)&lt;br /&gt;
#define IO_SENSOR_TCA4311A_EN_DDR		DDRB&lt;br /&gt;
#define IO_SENSOR_TCA4311A_EN_PIN		PINB&lt;br /&gt;
#define IO_SENSOR_TCA4311A_EN_PORT		PORTB&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Button:&lt;br /&gt;
&lt;br /&gt;
// (Button is connected to I/O 1.7 of the MAX7311!)&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Status LED:&lt;br /&gt;
&lt;br /&gt;
// (Status LED is connected to I/O 1.6 of the MAX7311!)&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Other ADC channel definitions:&lt;br /&gt;
&lt;br /&gt;
// (Depending on connections on the RP6 Sensor Board!)&lt;br /&gt;
#define ADC_SENSOR_SHARP_F				ADC_0	// At USRBUS: 1 (RP6BASE)&lt;br /&gt;
#define ADC_SENSOR_SHARP_R				ADC_9	// At ADC: 3    (RP6M256)&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
/******************************************************************************&lt;br /&gt;
 * Additional info&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Changelog:&lt;br /&gt;
 * &lt;br /&gt;
 *  ---&amp;gt; changes are documented in the file &amp;quot;RP6M256_Sensor_BoardLib.c&amp;quot;&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=====Library Header=====&lt;br /&gt;
Datei: RP6M256_Sensor_BoardLib.h&lt;br /&gt;
&amp;lt;pre&amp;gt;/* ****************************************************************************&lt;br /&gt;
 *                           _______________________&lt;br /&gt;
 *                           \| RP6  ROBOT SYSTEM |/&lt;br /&gt;
 *                            \_-_-_-_-_-_-_-_-_-_/           &amp;gt;&amp;gt;&amp;gt; RP6 M256 WIFI&lt;br /&gt;
 * ----------------------------------------------------------------------------&lt;br /&gt;
 * ----------------------------- [c]2014 - Dirk -------------------------------&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * File: RP6M256_Sensor_BoardLib.h&lt;br /&gt;
 * Version: 1.1&lt;br /&gt;
 * Target: RP6 M256 WIFI - ATMEGA2560 @16.00MHz&lt;br /&gt;
 * Author(s): Dirk&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Description:&lt;br /&gt;
 * Header file for new RP6 Sensor Board library.&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
#ifndef RP6M256_SENSOR_BOARDLIB_H&lt;br /&gt;
#define RP6M256_SENSOR_BOARDLIB_H&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// RP6 Sensor Board hardwired components:&lt;br /&gt;
// - I2C I/O Port Expander (MAX7311)&lt;br /&gt;
// - I2C Real Time Clock (RTC DS1339)&lt;br /&gt;
// - I2C Temperature Sensor (LM75B)&lt;br /&gt;
// - I2C Servo Controller (PCA9685)&lt;br /&gt;
// - I2C LED Driver (TCA6507)&lt;br /&gt;
// - I2C 3D Magnetometer &amp;amp; Accelerometer (LSM303DLHC)&lt;br /&gt;
// - Analog Yaw-Rate Gyroscope (LY330ALH)&lt;br /&gt;
// - Hot Swappable 2-Wire Bus Buffer (TCA4311A)&lt;br /&gt;
// - Button&lt;br /&gt;
// - Status LED&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Includes:&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6M256Lib.h&amp;quot;&lt;br /&gt;
#include &amp;quot;RP6I2CmasterTWI.h&amp;quot;&lt;br /&gt;
#include &amp;quot;RP6M256_Sensor_Board.h&amp;quot;&lt;br /&gt;
#include &amp;lt;math.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// RP6M256_I2CMasterLib definitions:&lt;br /&gt;
&lt;br /&gt;
#ifndef I2C_RP6_BASE_ADR&lt;br /&gt;
	#define I2C_RP6_BASE_ADR			10&lt;br /&gt;
#endif&lt;br /&gt;
#ifndef I2C_REG_ADC_ADC0_L&lt;br /&gt;
	#define I2C_REG_ADC_ADC0_L			23&lt;br /&gt;
#endif&lt;br /&gt;
#ifndef I2C_REG_ADC_ADC1_L&lt;br /&gt;
	#define I2C_REG_ADC_ADC1_L			25&lt;br /&gt;
#endif&lt;br /&gt;
#ifndef CMD_POWER_OFF&lt;br /&gt;
	#define CMD_POWER_OFF				0&lt;br /&gt;
#endif&lt;br /&gt;
#ifndef CMD_POWER_ON&lt;br /&gt;
	#define CMD_POWER_ON				1&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C I/O Port Expander (MAX7311):&lt;br /&gt;
&lt;br /&gt;
// Registers:&lt;br /&gt;
#define MAX7311_INPUT_PORT1				0&lt;br /&gt;
#define MAX7311_INPUT_PORT2				1&lt;br /&gt;
#define MAX7311_OUTPUT_PORT1			2&lt;br /&gt;
#define MAX7311_OUTPUT_PORT2			3&lt;br /&gt;
#define MAX7311_PORT1_POL_INV			4&lt;br /&gt;
#define MAX7311_PORT2_POL_INV			5&lt;br /&gt;
#define MAX7311_PORT1_CONFIG			6&lt;br /&gt;
#define MAX7311_PORT2_CONFIG			7&lt;br /&gt;
#define MAX7311_TIMEOUT					8&lt;br /&gt;
&lt;br /&gt;
// Port 1 configuration register bitmasks:&lt;br /&gt;
#define ST_GYRO							(1 &amp;lt;&amp;lt; PIN7)	// I/O 0.7 (Output)&lt;br /&gt;
#define PD_GYRO							(1 &amp;lt;&amp;lt; PIN6)	// I/O 0.6 (Output)&lt;br /&gt;
#define PWR_CAM_IF						(1 &amp;lt;&amp;lt; PIN5)	// I/O 0.5 (Output)&lt;br /&gt;
#define EN_LEDDRIV						(1 &amp;lt;&amp;lt; PIN4)	// I/O 0.4 (Output)&lt;br /&gt;
#define RDY_BUSBUFF						(1 &amp;lt;&amp;lt; PIN3)	// I/O 0.3 (Input)&lt;br /&gt;
#define PWR_SHARP_R						(1 &amp;lt;&amp;lt; PIN2)	// I/O 0.2 (Output)&lt;br /&gt;
#define PWR_SHARP_F						(1 &amp;lt;&amp;lt; PIN1)	// I/O 0.1 (Output)&lt;br /&gt;
#define PWR_I2C							(1 &amp;lt;&amp;lt; PIN0)	// I/O 0.0 (Output)&lt;br /&gt;
&lt;br /&gt;
// Port 2 configuration register bitmasks:&lt;br /&gt;
#define IO2_I2C							(1 &amp;lt;&amp;lt; PIN7)	// I/O 1.7 (Input)&lt;br /&gt;
#define IO1_I2C							(1 &amp;lt;&amp;lt; PIN6)	// I/O 1.6 (Output)&lt;br /&gt;
#define DRDY_MAGACC						(1 &amp;lt;&amp;lt; PIN5)	// I/O 1.5 (Input)&lt;br /&gt;
#define PWR_SERVO						(1 &amp;lt;&amp;lt; PIN4)	// I/O 1.4 (Output)&lt;br /&gt;
#define OEN_SERVO						(1 &amp;lt;&amp;lt; PIN3)	// I/O 1.3 (Output)&lt;br /&gt;
#define IO_K19_1						(1 &amp;lt;&amp;lt; PIN2)	// I/O 1.2 (Input)&lt;br /&gt;
#define IO_K19_3						(1 &amp;lt;&amp;lt; PIN1)	// I/O 1.1 (Input)&lt;br /&gt;
#define EN_BUSBUFF						(1 &amp;lt;&amp;lt; PIN0)	// I/O 1.0 (Output)&lt;br /&gt;
&lt;br /&gt;
// Port 1 &amp;amp; 2 register 16-bit bitmasks:&lt;br /&gt;
// (CONFIG: 1 = Input, 0 = Output)&lt;br /&gt;
#define MAX7311_CONFIG_DEFAULT			0b1010011000001000&lt;br /&gt;
#define MAX7311_CONFIG_USE_PD5			0b1010011100001000&lt;br /&gt;
// (OUTPUT: 1 = High/True, 0 = Low/False)&lt;br /&gt;
#define MAX7311_OUTPUT_DEFAULT			0b0100000100010000&lt;br /&gt;
#define MAX7311_OUTPUT_FULLPOWER		0b0001000100110111&lt;br /&gt;
#define MAX7311_OUTPUT_SHUTDOWN			0b0100100011000000&lt;br /&gt;
&lt;br /&gt;
// Safe configuration:&lt;br /&gt;
// (Ensures if activated, that I/Os 0.3, 1.5 and 1.7 cannot be configured&lt;br /&gt;
//  as output with the function MAX7311_write_cfg(). This may protect the&lt;br /&gt;
//  RP6 Sensor Board from hardware damage.)&lt;br /&gt;
// -------------------&lt;br /&gt;
#define SAFE_CONFIG&lt;br /&gt;
// -------------------&lt;br /&gt;
&lt;br /&gt;
typedef union {&lt;br /&gt;
 	uint8_t byte;&lt;br /&gt;
	struct {&lt;br /&gt;
		unsigned int1   :1;				// INT1  XBUS Pin 8&lt;br /&gt;
		unsigned int2   :1;				// INT2  XBUS Pin 11&lt;br /&gt;
		unsigned int3   :1;				// INT3  XBUS Pin 9&lt;br /&gt;
		unsigned intu   :1;				// INTU  XBUS Pin 7&lt;br /&gt;
		unsigned unused :4;&lt;br /&gt;
	};&lt;br /&gt;
	struct {&lt;br /&gt;
		unsigned magacc1     :1;		// INT1: LSM303DLHC INT1&lt;br /&gt;
		unsigned portexp     :1;		// INT2: MAX7311 INT_N&lt;br /&gt;
		unsigned magacc2_rtc :1;		// INT3: LSM303DLHC INT2&lt;br /&gt;
		unsigned noname      :5;		//       OR DS1339 SQW/INT_N&lt;br /&gt;
	};&lt;br /&gt;
} interrupt_RP6SBstatus_t;&lt;br /&gt;
extern interrupt_RP6SBstatus_t interrupt_RP6SBstatus;&lt;br /&gt;
&lt;br /&gt;
typedef union {&lt;br /&gt;
	uint16_t word;&lt;br /&gt;
	struct {&lt;br /&gt;
		unsigned pwr_i2c     :1;		// I/O 0.0 (Output)&lt;br /&gt;
		unsigned pwr_sharp_f :1;		// I/O 0.1 (Output)&lt;br /&gt;
		unsigned pwr_sharp_r :1;		// I/O 0.2 (Output)&lt;br /&gt;
		unsigned rdy_busbuff :1;		// I/O 0.3 (Input)&lt;br /&gt;
		unsigned en_leddriv  :1;		// I/O 0.4 (Output)&lt;br /&gt;
		unsigned pwr_cam_if  :1;		// I/O 0.5 (Output)&lt;br /&gt;
		unsigned pd_gyro     :1;		// I/O 0.6 (Output)&lt;br /&gt;
		unsigned st_gyro     :1;		// I/O 0.7 (Output)&lt;br /&gt;
		unsigned en_busbuff  :1;		// I/O 1.0 (Output)&lt;br /&gt;
		unsigned io_k19_3    :1;		// I/O 1.1 (Input)&lt;br /&gt;
		unsigned io_k19_1    :1;		// I/O 1.2 (Input)&lt;br /&gt;
		unsigned oen_servo   :1;		// I/O 1.3 (Output)&lt;br /&gt;
		unsigned pwr_servo   :1;		// I/O 1.4 (Output)&lt;br /&gt;
		unsigned drdy_magacc :1;		// I/O 1.5 (Input)&lt;br /&gt;
		unsigned io1_i2c     :1;		// I/O 1.6 (Output)&lt;br /&gt;
		unsigned io2_i2c     :1;		// I/O 1.7 (Input)&lt;br /&gt;
	};&lt;br /&gt;
} max7311IOs_t;&lt;br /&gt;
extern max7311IOs_t inport;&lt;br /&gt;
extern max7311IOs_t outport;&lt;br /&gt;
extern uint8_t readyBusbuff;&lt;br /&gt;
extern uint8_t pressedButton;&lt;br /&gt;
&lt;br /&gt;
void MAX7311_write_cfg(uint16_t);&lt;br /&gt;
void task_checkINTs(void);&lt;br /&gt;
void task_RP6SensorBoard(void);&lt;br /&gt;
void MAX7311_update(void);&lt;br /&gt;
void MAX7311_write(uint16_t);&lt;br /&gt;
void MAX7311_init(void);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Real Time Clock (RTC DS1339):&lt;br /&gt;
&lt;br /&gt;
// Registers:&lt;br /&gt;
#define DS1339_SECONDS					0&lt;br /&gt;
#define DS1339_MINUTES					1&lt;br /&gt;
#define DS1339_HOURS					2&lt;br /&gt;
#define DS1339_DAY						3&lt;br /&gt;
#define DS1339_DATE						4&lt;br /&gt;
#define DS1339_MONTH_CENTURY			5&lt;br /&gt;
#define DS1339_YEAR						6&lt;br /&gt;
#define DS1339_ALARM1_SECONDS			7&lt;br /&gt;
#define DS1339_ALARM1_MINUTES			8&lt;br /&gt;
#define DS1339_ALARM1_HOURS				9&lt;br /&gt;
#define DS1339_ALARM1_DAY_DATE			10&lt;br /&gt;
#define DS1339_ALARM2_MINUTES			11&lt;br /&gt;
#define DS1339_ALARM2_HOURS				12&lt;br /&gt;
#define DS1339_ALARM2_DAY_DATE			13&lt;br /&gt;
#define DS1339_CONTROL					14&lt;br /&gt;
#define DS1339_STATUS					15&lt;br /&gt;
#define DS1339_TRICKLE_CHARGER			16&lt;br /&gt;
&lt;br /&gt;
// Control register bitmasks:&lt;br /&gt;
#define DS1339_CONTROL_DEFAULT			0		// Power on default&lt;br /&gt;
#define DS1339_CONTROL_A1IE				1&lt;br /&gt;
#define DS1339_CONTROL_A2IE				2&lt;br /&gt;
#define DS1339_CONTROL_INTCN			4&lt;br /&gt;
#define DS1339_CONTROL_RS1				8&lt;br /&gt;
#define DS1339_CONTROL_RS2				16&lt;br /&gt;
#define DS1339_CONTROL_BBSQI			32&lt;br /&gt;
#define DS1339_CONTROL_EOSC				128&lt;br /&gt;
&lt;br /&gt;
// Trickle Charger register bitmasks:&lt;br /&gt;
#define DS1339_TRICKLE_CHARGER_DEFAULT	0b10101010 // One diode, 2k resistor&lt;br /&gt;
#define DS1339_TRICKLE_CHARGER_ROUT0	1&lt;br /&gt;
#define DS1339_TRICKLE_CHARGER_ROUT1	2&lt;br /&gt;
#define DS1339_TRICKLE_CHARGER_DS0		4&lt;br /&gt;
#define DS1339_TRICKLE_CHARGER_DS1		8&lt;br /&gt;
#define DS1339_TRICKLE_CHARGER_TCS0		16&lt;br /&gt;
#define DS1339_TRICKLE_CHARGER_TCS1		32&lt;br /&gt;
#define DS1339_TRICKLE_CHARGER_TCS2		64&lt;br /&gt;
#define DS1339_TRICKLE_CHARGER_TCS3		128&lt;br /&gt;
&lt;br /&gt;
enum RTCWEEKDAYS {&lt;br /&gt;
	R_MO = 1, R_TU, R_WE, R_TH, R_FR, R_SA, R_SU&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
typedef struct {&lt;br /&gt;
	uint16_t         year;				// Year&lt;br /&gt;
	uint8_t          month;				// Month   [1..12]&lt;br /&gt;
	enum RTCWEEKDAYS weekday;			// Weekday [1..7 = R_MO..R_SU]&lt;br /&gt;
	uint8_t          day;				// Day     [1..31]&lt;br /&gt;
} rtcdate_t;&lt;br /&gt;
rtcdate_t rtc_date;&lt;br /&gt;
&lt;br /&gt;
typedef struct {&lt;br /&gt;
	uint8_t dst;						// Daylight-saving-time (time zone)&lt;br /&gt;
	uint8_t hour;						// Hour    [0..23]&lt;br /&gt;
	uint8_t minute;						// Minute  [0..59]&lt;br /&gt;
	uint8_t second;						// Second  [0..59]&lt;br /&gt;
} rtctime_t;&lt;br /&gt;
rtctime_t rtc_time;&lt;br /&gt;
&lt;br /&gt;
uint8_t BCD2DEC(uint8_t);&lt;br /&gt;
uint8_t DEC2BCD(uint8_t);&lt;br /&gt;
void DS1339_write_cfg(uint8_t);&lt;br /&gt;
void DS1339_init(void);&lt;br /&gt;
#define CALC_DST						// Time zone will be calculated&lt;br /&gt;
void DS1339_read(void);&lt;br /&gt;
void DS1339_write(void);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Temperature Sensor (LM75B):&lt;br /&gt;
&lt;br /&gt;
// Registers:&lt;br /&gt;
#define LM75B_TEMP						0&lt;br /&gt;
#define LM75B_CONF						1&lt;br /&gt;
#define LM75B_THYST						2&lt;br /&gt;
#define LM75B_TOS						3&lt;br /&gt;
&lt;br /&gt;
// Conf register bitmasks:&lt;br /&gt;
#define LM75B_CONF_DEFAULT				0		// Power on default&lt;br /&gt;
#define LM75B_CONF_SHUTDOWN				1&lt;br /&gt;
#define LM75B_CONF_OS_COMP_INT			2&lt;br /&gt;
#define LM75B_CONF_OS_POL				4&lt;br /&gt;
#define LM75B_CONF_OS_F_QUE0			8&lt;br /&gt;
#define LM75B_CONF_OS_F_QUE1			16&lt;br /&gt;
&lt;br /&gt;
extern double temperature;&lt;br /&gt;
&lt;br /&gt;
void LM75B_write_cfg(uint8_t);&lt;br /&gt;
#define LM75B_shutdown() {LM75B_write_cfg(LM75B_CONF_SHUTDOWN);}&lt;br /&gt;
#define LM75B_init() {LM75B_write_cfg(LM75B_CONF_DEFAULT);}&lt;br /&gt;
extern uint8_t temperature_low;&lt;br /&gt;
extern uint8_t temperature_high;&lt;br /&gt;
#define getTemperatureHigh() (temperature_high)&lt;br /&gt;
#define getTemperatureLow() (temperature_low)&lt;br /&gt;
void LM75B_read(void);&lt;br /&gt;
double LM75B_calculate(void);&lt;br /&gt;
double LM75B_measure(void);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Servo Controller (PCA9685):&lt;br /&gt;
&lt;br /&gt;
// Registers:&lt;br /&gt;
#define PCA9685_MODE1					0&lt;br /&gt;
#define PCA9685_MODE2					1&lt;br /&gt;
#define PCA9685_SUBADR1					2&lt;br /&gt;
#define PCA9685_SUBADR2					3&lt;br /&gt;
#define PCA9685_SUBADR3					4&lt;br /&gt;
#define PCA9685_ALLCALLADR				5&lt;br /&gt;
#define PCA9685_LED0_ON_L				6&lt;br /&gt;
#define PCA9685_LED0_ON_H				7&lt;br /&gt;
#define PCA9685_LED0_OFF_L				8&lt;br /&gt;
#define PCA9685_LED0_OFF_H				9&lt;br /&gt;
#define PCA9685_LED1_ON_L				10&lt;br /&gt;
#define PCA9685_LED1_ON_H				11&lt;br /&gt;
#define PCA9685_LED1_OFF_L				12&lt;br /&gt;
#define PCA9685_LED1_OFF_H				13&lt;br /&gt;
#define PCA9685_LED2_ON_L				14&lt;br /&gt;
#define PCA9685_LED2_ON_H				15&lt;br /&gt;
#define PCA9685_LED2_OFF_L				16&lt;br /&gt;
#define PCA9685_LED2_OFF_H				17&lt;br /&gt;
#define PCA9685_LED3_ON_L				18&lt;br /&gt;
#define PCA9685_LED3_ON_H				19&lt;br /&gt;
#define PCA9685_LED3_OFF_L				20&lt;br /&gt;
#define PCA9685_LED3_OFF_H				21&lt;br /&gt;
#define PCA9685_LED4_ON_L				22&lt;br /&gt;
#define PCA9685_LED4_ON_H				23&lt;br /&gt;
#define PCA9685_LED4_OFF_L				24&lt;br /&gt;
#define PCA9685_LED4_OFF_H				25&lt;br /&gt;
#define PCA9685_LED5_ON_L				26&lt;br /&gt;
#define PCA9685_LED5_ON_H				27&lt;br /&gt;
#define PCA9685_LED5_OFF_L				28&lt;br /&gt;
#define PCA9685_LED5_OFF_H				29&lt;br /&gt;
#define PCA9685_LED6_ON_L				30&lt;br /&gt;
#define PCA9685_LED6_ON_H				31&lt;br /&gt;
#define PCA9685_LED6_OFF_L				32&lt;br /&gt;
#define PCA9685_LED6_OFF_H				33&lt;br /&gt;
#define PCA9685_LED7_ON_L				34&lt;br /&gt;
#define PCA9685_LED7_ON_H				35&lt;br /&gt;
#define PCA9685_LED7_OFF_L				36&lt;br /&gt;
#define PCA9685_LED7_OFF_H				37&lt;br /&gt;
#define PCA9685_LED8_ON_L				38&lt;br /&gt;
#define PCA9685_LED8_ON_H				39&lt;br /&gt;
#define PCA9685_LED8_OFF_L				40&lt;br /&gt;
#define PCA9685_LED8_OFF_H				41&lt;br /&gt;
#define PCA9685_LED9_ON_L				42&lt;br /&gt;
#define PCA9685_LED9_ON_H				43&lt;br /&gt;
#define PCA9685_LED9_OFF_L				44&lt;br /&gt;
#define PCA9685_LED9_OFF_H				45&lt;br /&gt;
#define PCA9685_LED10_ON_L				46&lt;br /&gt;
#define PCA9685_LED10_ON_H				47&lt;br /&gt;
#define PCA9685_LED10_OFF_L				48&lt;br /&gt;
#define PCA9685_LED10_OFF_H				49&lt;br /&gt;
#define PCA9685_LED11_ON_L				50&lt;br /&gt;
#define PCA9685_LED11_ON_H				51&lt;br /&gt;
#define PCA9685_LED11_OFF_L				52&lt;br /&gt;
#define PCA9685_LED11_OFF_H				53&lt;br /&gt;
#define PCA9685_LED12_ON_L				54&lt;br /&gt;
#define PCA9685_LED12_ON_H				55&lt;br /&gt;
#define PCA9685_LED12_OFF_L				56&lt;br /&gt;
#define PCA9685_LED12_OFF_H				57&lt;br /&gt;
#define PCA9685_LED13_ON_L				58&lt;br /&gt;
#define PCA9685_LED13_ON_H				59&lt;br /&gt;
#define PCA9685_LED13_OFF_L				60&lt;br /&gt;
#define PCA9685_LED13_OFF_H				61&lt;br /&gt;
#define PCA9685_LED14_ON_L				62&lt;br /&gt;
#define PCA9685_LED14_ON_H				63&lt;br /&gt;
#define PCA9685_LED14_OFF_L				64&lt;br /&gt;
#define PCA9685_LED14_OFF_H				65&lt;br /&gt;
#define PCA9685_LED15_ON_L				66&lt;br /&gt;
#define PCA9685_LED15_ON_H				67&lt;br /&gt;
#define PCA9685_LED15_OFF_L				68&lt;br /&gt;
#define PCA9685_LED15_OFF_H				69&lt;br /&gt;
#define PCA9685_ALL_LED_ON_L			250&lt;br /&gt;
#define PCA9685_ALL_LED_ON_H			251&lt;br /&gt;
#define PCA9685_ALL_LED_OFF_L			252&lt;br /&gt;
#define PCA9685_ALL_LED_OFF_H			253&lt;br /&gt;
#define PCA9685_PRE_SCALE				254&lt;br /&gt;
#define PCA9685_TESTMODE				255&lt;br /&gt;
&lt;br /&gt;
// Mode1 register bitmasks:&lt;br /&gt;
#define PCA9685_MODE1_ALLCALL			1&lt;br /&gt;
#define PCA9685_MODE1_SUB3				2&lt;br /&gt;
#define PCA9685_MODE1_SUB2				4&lt;br /&gt;
#define PCA9685_MODE1_SUB1				8&lt;br /&gt;
#define PCA9685_MODE1_SLEEP				16&lt;br /&gt;
#define PCA9685_MODE1_AI				32&lt;br /&gt;
#define PCA9685_MODE1_EXTCLK			64&lt;br /&gt;
#define PCA9685_MODE1_RESTART			128&lt;br /&gt;
&lt;br /&gt;
// Mode2 register bitmasks:&lt;br /&gt;
#define PCA9685_MODE2_OUTNE01_DEFAULT	0&lt;br /&gt;
#define PCA9685_MODE2_OUTDRV			4&lt;br /&gt;
#define PCA9685_MODE2_OCH				8&lt;br /&gt;
#define PCA9685_MODE2_INVRT				16&lt;br /&gt;
&lt;br /&gt;
#define F_PCA9685						25000000.0	// Int. Clock: 25 MHz&lt;br /&gt;
&lt;br /&gt;
void PCA9685_init(uint16_t);&lt;br /&gt;
#define initServo(__FREQ__) {PCA9685_init(__FREQ__);}&lt;br /&gt;
uint8_t servo(uint8_t);&lt;br /&gt;
void PCA9685_set(uint8_t, uint16_t);&lt;br /&gt;
#define setServo(__SERVO__,__POS__) {PCA9685_set(servo(__SERVO__),__POS__);}&lt;br /&gt;
void PCA9685_shutdown(void);&lt;br /&gt;
void PCA9685_restart(void);&lt;br /&gt;
void setServoPower(uint8_t);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C LED Driver (TCA6507):&lt;br /&gt;
&lt;br /&gt;
// Registers:&lt;br /&gt;
#define TCA6507_SELECT0				0&lt;br /&gt;
#define TCA6507_SELECT1				1&lt;br /&gt;
#define TCA6507_SELECT2				2&lt;br /&gt;
#define TCA6507_FADEON_TIME			3&lt;br /&gt;
#define TCA6507_FULLYON_TIME		4&lt;br /&gt;
#define TCA6507_FADEOFF_TIME		5&lt;br /&gt;
#define TCA6507_1ST_FULLYOFF_TIME	6&lt;br /&gt;
#define TCA6507_2ND_FULLYOFF_TIME	7&lt;br /&gt;
#define TCA6507_MAXIMUM_INTENSITY	8&lt;br /&gt;
#define TCA6507_MASTER_INTENSITY	9&lt;br /&gt;
#define TCA6507_INITIALIZATION		10&lt;br /&gt;
&lt;br /&gt;
// Output states:&lt;br /&gt;
#define STATE_OFF					0&lt;br /&gt;
#define STATE_PWM0					2&lt;br /&gt;
#define STATE_PWM1					3&lt;br /&gt;
#define STATE_ON					4&lt;br /&gt;
#define STATE_MINT					5&lt;br /&gt;
#define STATE_BLINK0				6&lt;br /&gt;
#define STATE_BLINK1				7&lt;br /&gt;
&lt;br /&gt;
extern uint8_t select[3];&lt;br /&gt;
&lt;br /&gt;
void TCA6507_write_cfg(uint8_t, uint8_t);&lt;br /&gt;
void TCA6507_update(void);&lt;br /&gt;
void TCA6507_set(uint8_t, uint8_t);&lt;br /&gt;
#define setLED(__LED__,__STATE__) {TCA6507_set(__LED__,__STATE__);}&lt;br /&gt;
void TCA6507_shutdown(void);&lt;br /&gt;
void TCA6507_restart(void);&lt;br /&gt;
void TCA6507_init(void);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C 3D Magnetometer &amp;amp; Accelerometer (LSM303DLHC):&lt;br /&gt;
&lt;br /&gt;
// LSM303DLHC accelerometer internal registers:&lt;br /&gt;
#define CTRL_REG1_A					0x20&lt;br /&gt;
#define CTRL_REG2_A					0x21&lt;br /&gt;
#define CTRL_REG3_A					0x22&lt;br /&gt;
#define CTRL_REG4_A					0x23&lt;br /&gt;
#define CTRL_REG5_A					0x24&lt;br /&gt;
#define CTRL_REG6_A					0x25&lt;br /&gt;
#define REFERENCE_A					0x26&lt;br /&gt;
#define STATUS_REG_A				0x27&lt;br /&gt;
#define OUT_X_L_A					0x28&lt;br /&gt;
#define OUT_X_H_A					0x29&lt;br /&gt;
#define OUT_Y_L_A					0x2a&lt;br /&gt;
#define OUT_Y_H_A					0x2b&lt;br /&gt;
#define OUT_Z_L_A					0x2c&lt;br /&gt;
#define OUT_Z_H_A					0x2d&lt;br /&gt;
#define FIFO_CTRL_REG_A				0x2e&lt;br /&gt;
#define FIFO_SRC_REG_A				0x2f&lt;br /&gt;
#define INT1_CFG_A					0x30&lt;br /&gt;
#define INT1_SOURCE_A				0x31&lt;br /&gt;
#define INT1_THS_A					0x32&lt;br /&gt;
#define INT1_DURATION_A				0x33&lt;br /&gt;
#define INT2_CFG_A					0x34&lt;br /&gt;
#define INT2_SOURCE_A				0x35&lt;br /&gt;
#define INT2_THS_A					0x36&lt;br /&gt;
#define INT2_DURATION_A				0x37&lt;br /&gt;
#define CLICK_CFG_A					0x38&lt;br /&gt;
#define CLICK_SRC_A					0x39&lt;br /&gt;
#define CLICK_THS_A					0x3a&lt;br /&gt;
#define TIME_LIMIT_A				0x3b&lt;br /&gt;
#define TIME_LATENCY_A				0x3c&lt;br /&gt;
#define TIME_WINDOW_A				0x3d&lt;br /&gt;
&lt;br /&gt;
// LSM303DLHC accelerometer register settings:&lt;br /&gt;
#define CTRL_REG1_A_10HZ			0b00100111	// 10Hz &amp;amp; all axes enable&lt;br /&gt;
#define CTRL_REG1_A_50HZ			0b01000111	// 50Hz &amp;amp; all axes enable&lt;br /&gt;
#define CTRL_REG4_A_DEFAULT			0b00000000	// Default (Normal mode)&lt;br /&gt;
#define CTRL_REG4_A_HR				0b00001000	// HR output mode&lt;br /&gt;
&lt;br /&gt;
// LSM303DLHC magnetometer internal registers:&lt;br /&gt;
#define CRA_REG_M					0x00&lt;br /&gt;
#define CRB_REG_M					0x01&lt;br /&gt;
#define MR_REG_M					0x02&lt;br /&gt;
#define OUT_X_H_M					0x03&lt;br /&gt;
#define OUT_X_L_M					0x04&lt;br /&gt;
#define OUT_Z_H_M					0x05&lt;br /&gt;
#define OUT_Z_L_M					0x06&lt;br /&gt;
#define OUT_Y_H_M					0x07&lt;br /&gt;
#define OUT_Y_L_M					0x08&lt;br /&gt;
#define SR_REG_MG					0x09&lt;br /&gt;
#define IRA_REG_M					0x0a&lt;br /&gt;
#define IRB_REG_M					0x0b&lt;br /&gt;
#define IRC_REG_M					0x0c&lt;br /&gt;
#define TEMP_OUT_H_M				0x31&lt;br /&gt;
#define TEMP_OUT_L_M				0x32&lt;br /&gt;
&lt;br /&gt;
// LSM303DLHC magnetometer register settings:&lt;br /&gt;
#define CRA_REG_M_15HZ				0b00010000	// Default (Data rate 15Hz)&lt;br /&gt;
#define CRA_REG_M_15HZ_T_EN			0b10010000	// 15Hz &amp;amp; temperature enable&lt;br /&gt;
#define CRB_REG_M_13GAUSS			0b00100000	// Gain +-1.3Gauss&lt;br /&gt;
#define MR_REG_M_CCM				0b00000000	// Continuous-conversion mode&lt;br /&gt;
#define MR_REG_M_SCM				0b00000001	// Single-conversion mode&lt;br /&gt;
#define MR_REG_M_SLEEP				0b00000011	// Default (Sleep-mode)&lt;br /&gt;
&lt;br /&gt;
extern int16_t x_axisa, y_axisa, z_axisa;&lt;br /&gt;
extern double pitch, roll;&lt;br /&gt;
extern double xa, ya, za;&lt;br /&gt;
extern double the, phi;&lt;br /&gt;
&lt;br /&gt;
extern int16_t x_axism, y_axism, z_axism;&lt;br /&gt;
extern int16_t headingm;&lt;br /&gt;
extern double xm, ym, zm;&lt;br /&gt;
#ifdef GET_TEMP_M&lt;br /&gt;
extern int16_t temperaturem;&lt;br /&gt;
extern double temperature_mag;&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
extern int16_t headingtc;&lt;br /&gt;
&lt;br /&gt;
void LSM303DLHC_A_init(void);&lt;br /&gt;
void readLSM303DLHC_A(void);&lt;br /&gt;
void normalizeLSM303DLHC_A(void);&lt;br /&gt;
void positionLSM303DLHC_A(void);&lt;br /&gt;
&lt;br /&gt;
void LSM303DLHC_M_init(void);&lt;br /&gt;
void readLSM303DLHC_M(void);&lt;br /&gt;
void normalizeLSM303DLHC_M(void);&lt;br /&gt;
int16_t headingLSM303DLHC_M(void);&lt;br /&gt;
&lt;br /&gt;
int16_t headingLSM303DLHC_TC(void);&lt;br /&gt;
&lt;br /&gt;
void LSM303DLHC_init(void);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Analog Yaw-Rate Gyroscope (LY330ALH):&lt;br /&gt;
&lt;br /&gt;
#define LY330ALH_MODE_NORMAL		0			// Power on default&lt;br /&gt;
#define LY330ALH_MODE_SLEEP			1&lt;br /&gt;
#define LY330ALH_MODE_SELFTEST		2&lt;br /&gt;
#define LY330ALH_MODE_POWERDOWN		3			// Shutdown mode&lt;br /&gt;
&lt;br /&gt;
extern int16_t z_axisg;&lt;br /&gt;
&lt;br /&gt;
void LY330ALH_set_mode(uint8_t);&lt;br /&gt;
uint16_t getRP6Base_ADC1(void);&lt;br /&gt;
int16_t LY330ALH_measure(void);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Hot Swappable 2-Wire Bus Buffer (TCA4311A):&lt;br /&gt;
&lt;br /&gt;
//extern uint8_t readyBusbuff;			// See &amp;quot;I2C I/O Port Expander&amp;quot; section&lt;br /&gt;
extern uint8_t errorBusbuff;&lt;br /&gt;
&lt;br /&gt;
#define getReadyBusbuff() (readyBusbuff)&lt;br /&gt;
uint8_t readReadyBusbuff(void);&lt;br /&gt;
void TCA4311A_shutdown(void);&lt;br /&gt;
void TCA4311A_reconnect(void);&lt;br /&gt;
void setRP6Base_PWR(uint8_t);&lt;br /&gt;
void setI2CModulePower(uint8_t);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Button:&lt;br /&gt;
&lt;br /&gt;
//extern uint8_t pressedButton;			// See &amp;quot;I2C I/O Port Expander&amp;quot; section&lt;br /&gt;
&lt;br /&gt;
#define getPressedButton() (pressedButton)&lt;br /&gt;
uint8_t readButton(void);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Status LED:&lt;br /&gt;
&lt;br /&gt;
void setStatusLED(uint8_t);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// RP6 Sensor Board initialisation and shutdown:&lt;br /&gt;
&lt;br /&gt;
void sensor_board_init(void);&lt;br /&gt;
void sensor_board_shutdown(void);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
/******************************************************************************&lt;br /&gt;
 * Additional info&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Changelog:&lt;br /&gt;
 * &lt;br /&gt;
 *  ---&amp;gt; changes are documented in the file &amp;quot;RP6M256_Sensor_BoardLib.c&amp;quot;&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=====Library Source=====&lt;br /&gt;
Datei: RP6M256_Sensor_BoardLib.c&lt;br /&gt;
&amp;lt;pre&amp;gt;/* ****************************************************************************&lt;br /&gt;
 *                           _______________________&lt;br /&gt;
 *                           \| RP6  ROBOT SYSTEM |/&lt;br /&gt;
 *                            \_-_-_-_-_-_-_-_-_-_/           &amp;gt;&amp;gt;&amp;gt; RP6 M256 WIFI&lt;br /&gt;
 * ----------------------------------------------------------------------------&lt;br /&gt;
 * ----------------------------- [c]2014 - Dirk -------------------------------&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * File: RP6M256_Sensor_BoardLib.c&lt;br /&gt;
 * Version: 1.1&lt;br /&gt;
 * Target: RP6 M256 WIFI - ATMEGA2560 @16.00MHz&lt;br /&gt;
 *         and a RP6 Sensor Board (CONRAD 1082384)&lt;br /&gt;
 * Author(s): Dirk&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Description:&lt;br /&gt;
 * This is our new Library that contains basic routines and functions for&lt;br /&gt;
 * accessing the hardwired components of the RP6 Sensor Board (CONRAD 1082384).&lt;br /&gt;
 * This library assumes the RP6 Sensor Board Revision 2.0 (04.07.13).&lt;br /&gt;
 *&lt;br /&gt;
 * There are more sensors and actors, that may be connected to the RP6 Sensor&lt;br /&gt;
 * Board: Many I2C components including a GPS module (CONRAD 1082385), servo&lt;br /&gt;
 *        motors, SHARP IR distance sensors, LEDs, a camera ...&lt;br /&gt;
 * This library doesn't contain functions for these sensors/actors, because&lt;br /&gt;
 * they are not HARDWIRED to the RP6 Sensor Board and may be connected&lt;br /&gt;
 * OPTIONALLY.&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// RP6 Sensor Board hardwired components:&lt;br /&gt;
// - I2C I/O Port Expander (MAX7311)&lt;br /&gt;
// - I2C Real Time Clock (RTC DS1339)&lt;br /&gt;
// - I2C Temperature Sensor (LM75B)&lt;br /&gt;
// - I2C Servo Controller (PCA9685)&lt;br /&gt;
// - I2C LED Driver (TCA6507)&lt;br /&gt;
// - I2C 3D Magnetometer &amp;amp; Accelerometer (LSM303DLHC)&lt;br /&gt;
// - Analog Yaw-Rate Gyroscope (LY330ALH)&lt;br /&gt;
// - Hot Swappable 2-Wire Bus Buffer (TCA4311A)&lt;br /&gt;
// - Button&lt;br /&gt;
// - Status LED&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Includes:&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6M256_Sensor_BoardLib.h&amp;quot; 		&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Variables:&lt;br /&gt;
&lt;br /&gt;
uint8_t registerBuf[13]; &lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C I/O Port Expander (MAX7311):&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Sends the configuration word to a MAX7311.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: config -&amp;gt; Config word for control&lt;br /&gt;
 *                  registers&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void MAX7311_write_cfg(uint16_t config)&lt;br /&gt;
{&lt;br /&gt;
#ifdef SAFE_CONFIG&lt;br /&gt;
	config |= 0b1010000000001000;&lt;br /&gt;
#endif&lt;br /&gt;
	I2CTWI_transmit3Bytes(I2C_SENSOR_PORTEXP_ADR, MAX7311_PORT1_CONFIG, config, (config&amp;gt;&amp;gt;8));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
interrupt_RP6SBstatus_t interrupt_RP6SBstatus;&lt;br /&gt;
&lt;br /&gt;
/** &lt;br /&gt;
 * This function checks all interrupt pins on&lt;br /&gt;
 * the XBUS (INT1..3, INTU).&lt;br /&gt;
 * This function must be called VERY frequently&lt;br /&gt;
 * out of the main loop.&lt;br /&gt;
 * Bigger delays result in slower reaction to&lt;br /&gt;
 * interrupt requests of the RP6 Sensor Board.&lt;br /&gt;
 * Interrupt function table:&lt;br /&gt;
 *   Int. : Function 1      IRQ  Function 2       IRQ&lt;br /&gt;
 *   -------------------------------------------------&lt;br /&gt;
 *   INT1 : LSM303DLHC INT1  H&lt;br /&gt;
 *   INT2 : MAX7311   INT_N  L&lt;br /&gt;
 *   INT3 : LSM303DLHC INT2  H   DS1339 SQW/INT_N  L&lt;br /&gt;
 *   INTU : not used&lt;br /&gt;
 * You can see in the &amp;quot;IRQ&amp;quot; column, which level&lt;br /&gt;
 * (H/L) means an ACTIVE INTERRUPT signal.&lt;br /&gt;
 * The interrupt pin levels (H=true/L=false) are&lt;br /&gt;
 * read into the global interrupt_RP6SBstatus&lt;br /&gt;
 * variable.&lt;br /&gt;
 *&lt;br /&gt;
 * Hints: - This function checks the interrupt&lt;br /&gt;
 *          signals by polling. This is NOT the&lt;br /&gt;
 *          best way to do this job. You will&lt;br /&gt;
 *          have to write your own task, if you&lt;br /&gt;
 *          want to use the Pin Change Interrupt&lt;br /&gt;
 *          function of the ATmega2560&lt;br /&gt;
 *          microcontroller.&lt;br /&gt;
 *        - You cannot use both interrupt sources&lt;br /&gt;
 *          for INT3! So you should not use INT2&lt;br /&gt;
 *          of the LSM303DLHC together with the&lt;br /&gt;
 *          alarm function of the DS1339 (RTC)!&lt;br /&gt;
 *        - Every interrupt signal of the Sensor&lt;br /&gt;
 *          Board may be cut off from the XBUS&lt;br /&gt;
 *          by opening a jumper (Jx):&lt;br /&gt;
 *          INT1 -&amp;gt; J3 (LSM303DLHC INT1)&lt;br /&gt;
 *          INT2 -&amp;gt; J4 (MAX7311 INT_N)&lt;br /&gt;
 *          INT3 -&amp;gt; J2 (DS1339 SQW/INT_N)&lt;br /&gt;
 *          INT3 -&amp;gt; J5 (LSM303DLHC INT2)&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *&lt;br /&gt;
 *   if (!interrupt_RP6SBstatus.portexp)&lt;br /&gt;
 *        writeString_P(&amp;quot;==&amp;gt; MAX7311 INT_N!!!&amp;quot;);&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void task_checkINTs(void)&lt;br /&gt;
{&lt;br /&gt;
	if(IO_SENSOR_INT1_PIN &amp;amp; IO_SENSOR_INT1_IN)	// XBUS INT1 -&amp;gt; PJ3 (PCINT12)&lt;br /&gt;
		interrupt_RP6SBstatus.int1 = true;&lt;br /&gt;
	else&lt;br /&gt;
		interrupt_RP6SBstatus.int1 = false;&lt;br /&gt;
	if(IO_SENSOR_INT2_PIN &amp;amp; IO_SENSOR_INT2_IN)	// XBUS INT2 -&amp;gt; PJ6 (PCINT15)&lt;br /&gt;
		interrupt_RP6SBstatus.int2 = true;&lt;br /&gt;
	else&lt;br /&gt;
		interrupt_RP6SBstatus.int2 = false;&lt;br /&gt;
	if(IO_SENSOR_INT3_PIN &amp;amp; IO_SENSOR_INT3_IN)	// XBUS INT3 -&amp;gt; PJ5 (PCINT14)&lt;br /&gt;
		interrupt_RP6SBstatus.int3 = true;&lt;br /&gt;
	else&lt;br /&gt;
		interrupt_RP6SBstatus.int3 = false;&lt;br /&gt;
//	if(IO_SENSOR_INTU_PIN &amp;amp; IO_SENSOR_INTU_IN)	// XBUS INTU -&amp;gt; PJ4 (PCINT13)&lt;br /&gt;
//		interrupt_RP6SBstatus.intu = true;&lt;br /&gt;
//	else&lt;br /&gt;
//		interrupt_RP6SBstatus.intu = false;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
max7311IOs_t inport;&lt;br /&gt;
uint8_t readyBusbuff;&lt;br /&gt;
uint8_t pressedButton;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function checks all I/O ports (I/O 0.0..1.7)&lt;br /&gt;
 * of the MAX7311 sequentially!&lt;br /&gt;
 * You must call this function frequently out of&lt;br /&gt;
 * the main loop.&lt;br /&gt;
 * The I/O port values (true/false) are read into&lt;br /&gt;
 * the global inport variable.&lt;br /&gt;
 * The global variables readyBusbuff (2-Wire Bus&lt;br /&gt;
 * Buffer: Enable) and pressedButton (Button S1:&lt;br /&gt;
 * Pressed) contain actual values (true/false)&lt;br /&gt;
 * after execution of this task.&lt;br /&gt;
 *&lt;br /&gt;
 * Examples:&lt;br /&gt;
 *&lt;br /&gt;
 *   if (inport.rdy_busbuff)&lt;br /&gt;
 *        writeString_P(&amp;quot;I/O 0.3: High&amp;quot;);&lt;br /&gt;
 *   else writeString_P(&amp;quot;I/O 0.3: Low&amp;quot;);&lt;br /&gt;
 *   if (!inport.drdy_magacc)&lt;br /&gt;
 *        writeString_P(&amp;quot;I/O 1.5: Low&amp;quot;);&lt;br /&gt;
 *   if (pressedButton)&lt;br /&gt;
 *        writeString_P(&amp;quot;Button pressed!&amp;quot;);&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void task_RP6SensorBoard(void)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmitByte(I2C_SENSOR_PORTEXP_ADR, MAX7311_INPUT_PORT1);&lt;br /&gt;
	I2CTWI_readBytes(I2C_SENSOR_PORTEXP_ADR, registerBuf, 2);&lt;br /&gt;
	inport.word = (registerBuf[1] &amp;lt;&amp;lt; 8) + registerBuf[0];&lt;br /&gt;
	readyBusbuff = inport.rdy_busbuff;&lt;br /&gt;
	pressedButton = inport.io2_i2c;&lt;br /&gt;
	pressedButton = !pressedButton;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
max7311IOs_t outport;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Updates the I/O ports with current value from&lt;br /&gt;
 * the global outport variable!&lt;br /&gt;
 * If one or more port pins were configured as&lt;br /&gt;
 * output before, they will be set (high) or&lt;br /&gt;
 * cleared (low).&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *&lt;br /&gt;
 *   outport.word = 0b0000000000001001;&lt;br /&gt;
 *   MAX7311_update();&lt;br /&gt;
 *   // This clears all I/O ports and sets&lt;br /&gt;
 *   // the ports I/O 0.0 and I/O 0.3!&lt;br /&gt;
 *&lt;br /&gt;
 *   // Other possibility:&lt;br /&gt;
 *   outport.pwr_sharp_f = true;&lt;br /&gt;
 *   MAX7311_update();&lt;br /&gt;
 *   // This sets I/O 0.1 and does not&lt;br /&gt;
 *   // affect any other I/O port!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void MAX7311_update(void)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmit3Bytes(I2C_SENSOR_PORTEXP_ADR, MAX7311_OUTPUT_PORT1, outport.word, (outport.word&amp;gt;&amp;gt;8));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Writes the 16-bit data to a MAX7311.&lt;br /&gt;
 * The data are output with those I/O ports that&lt;br /&gt;
 * were configured as output before.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: data -&amp;gt; Data word&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void MAX7311_write(uint16_t data)&lt;br /&gt;
{&lt;br /&gt;
	outport.word = data;&lt;br /&gt;
	MAX7311_update();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Initializes the I/O Port Expander after power&lt;br /&gt;
 * on.&lt;br /&gt;
 *&lt;br /&gt;
 * Hint: If USE_PD5 is defined in the&lt;br /&gt;
 *       configuration header file, this&lt;br /&gt;
 *       function uses the RP6M256 portpin,&lt;br /&gt;
 *       that is connected to plug I/O: Pin 9&lt;br /&gt;
 *       instead of MAX7311 I/O 1.0!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void MAX7311_init(void)&lt;br /&gt;
{&lt;br /&gt;
#ifdef USE_PD5&lt;br /&gt;
	MAX7311_write_cfg(MAX7311_CONFIG_USE_PD5);&lt;br /&gt;
	IO_SENSOR_TCA4311A_EN_DDR |= IO_SENSOR_TCA4311A_EN_IN;		// Output&lt;br /&gt;
	IO_SENSOR_TCA4311A_EN_PORT |= IO_SENSOR_TCA4311A_EN_IN;		// High&lt;br /&gt;
#else&lt;br /&gt;
	MAX7311_write_cfg(MAX7311_CONFIG_DEFAULT);&lt;br /&gt;
#endif&lt;br /&gt;
	MAX7311_write(MAX7311_OUTPUT_DEFAULT);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Real Time Clock (RTC DS1339):&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function converts a BCD to a DEC value.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
uint8_t BCD2DEC(uint8_t bcd)&lt;br /&gt;
{&lt;br /&gt;
	return ((bcd &amp;gt;&amp;gt; 4) * 10 + (bcd &amp;amp; 0x0f));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function converts a DEC to a BCD value.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
uint8_t DEC2BCD(uint8_t dec)&lt;br /&gt;
{uint8_t units = dec % 10;&lt;br /&gt;
	if (dec /= 10) {&lt;br /&gt;
		return (units + (DEC2BCD(dec) &amp;lt;&amp;lt; 4));&lt;br /&gt;
	}&lt;br /&gt;
	else {&lt;br /&gt;
		return units;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Sends the configuration byte to a DS1339.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: Config byte for control register&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void DS1339_write_cfg(uint8_t config)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_RTC_ADR, DS1339_CONTROL, config);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Initializes the DS1339 Trickle Charger&lt;br /&gt;
 * function to the default for the RP6 Sensor&lt;br /&gt;
 * Board: One diode and 2kOhm resistor.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void DS1339_init(void)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_RTC_ADR, DS1339_TRICKLE_CHARGER, DS1339_TRICKLE_CHARGER_DEFAULT);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Reads all data registers of the Real Time Clock (RTC).&lt;br /&gt;
 * They are stored in the time &amp;amp; date variables defined in&lt;br /&gt;
 * the library header.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void DS1339_read(void)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmitByte(I2C_SENSOR_RTC_ADR, DS1339_SECONDS);&lt;br /&gt;
	I2CTWI_readBytes(I2C_SENSOR_RTC_ADR, registerBuf, 7);&lt;br /&gt;
	rtc_time.second = BCD2DEC(registerBuf[0]);&lt;br /&gt;
	rtc_time.minute = BCD2DEC(registerBuf[1]);&lt;br /&gt;
	rtc_time.hour = BCD2DEC(registerBuf[2] &amp;amp; 0x3f);&lt;br /&gt;
	rtc_date.weekday = (registerBuf[3] &amp;amp; 0x07);&lt;br /&gt;
	rtc_date.day = BCD2DEC(registerBuf[4]);&lt;br /&gt;
	rtc_date.month = BCD2DEC(registerBuf[5] &amp;amp; 0x7f);&lt;br /&gt;
	if(registerBuf[5] &amp;amp; 0x80) rtc_date.year = 100;&lt;br /&gt;
	else rtc_date.year = 0;&lt;br /&gt;
	rtc_date.year += BCD2DEC(registerBuf[6]);&lt;br /&gt;
	rtc_date.year += 2000;&lt;br /&gt;
	rtc_time.dst = 0;&lt;br /&gt;
#ifdef CALC_DST&lt;br /&gt;
	// Calculate MESZ (DST):&lt;br /&gt;
	uint8_t wday = rtc_date.weekday;			// Weekday [1..7 = R_MO..R_SU]&lt;br /&gt;
	if(wday == 7) wday = 0;&lt;br /&gt;
	if(rtc_date.month &amp;lt; 3 || rtc_date.month &amp;gt; 10) {&lt;br /&gt;
		return;&lt;br /&gt;
	}&lt;br /&gt;
	if((rtc_date.day - wday &amp;gt;= 25)&lt;br /&gt;
	 &amp;amp;&amp;amp; (wday || rtc_time.hour &amp;gt;= 2)) {&lt;br /&gt;
		if(rtc_date.month == 10)&lt;br /&gt;
			return;&lt;br /&gt;
	}&lt;br /&gt;
	else {&lt;br /&gt;
		if(rtc_date.month == 3) {&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	rtc_time.dst = 1;&lt;br /&gt;
#endif&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Writes the time &amp;amp; date infos in the variables defined in&lt;br /&gt;
 * the library header to the Real Time Clock (RTC).&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void DS1339_write(void)&lt;br /&gt;
{&lt;br /&gt;
	registerBuf[0] = DS1339_SECONDS;&lt;br /&gt;
	registerBuf[1] = DEC2BCD(rtc_time.second);&lt;br /&gt;
	registerBuf[2] = DEC2BCD(rtc_time.minute);&lt;br /&gt;
	registerBuf[3] = DEC2BCD(rtc_time.hour);&lt;br /&gt;
	registerBuf[4] = rtc_date.weekday;&lt;br /&gt;
	registerBuf[5] = DEC2BCD(rtc_date.day);&lt;br /&gt;
	registerBuf[6] = DEC2BCD(rtc_date.month);&lt;br /&gt;
	registerBuf[7] = DEC2BCD(rtc_date.year - 2000);&lt;br /&gt;
	I2CTWI_transmitBytes(I2C_SENSOR_RTC_ADR, &amp;amp;registerBuf[0], 8);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Temperature Sensor (LM75B):&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Sends the configuration byte to a LM75B.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: Config byte for Conf register&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void LM75B_write_cfg(uint8_t config)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_TEMP_ADR, LM75B_CONF, config);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
uint8_t temperature_low;&lt;br /&gt;
uint8_t temperature_high;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Reads the two data registers of the temperature&lt;br /&gt;
 * sensor's Temp register.&lt;br /&gt;
 * They are stored in the variables temperature_low&lt;br /&gt;
 * and _high.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void LM75B_read(void)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmitByte(I2C_SENSOR_TEMP_ADR, LM75B_TEMP);&lt;br /&gt;
	I2CTWI_readBytes(I2C_SENSOR_TEMP_ADR, registerBuf, 2);&lt;br /&gt;
	temperature_high = registerBuf[0];&lt;br /&gt;
	temperature_low = registerBuf[1];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
double temperature;						// Temperature [°C]&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Calculates and returns the temperature value&lt;br /&gt;
 * by using the data read from the LM75B with&lt;br /&gt;
 * the function LM75B_read(). The sensor is&lt;br /&gt;
 * designed for 11 bit measurement and 0.125°C&lt;br /&gt;
 * resolution.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
double LM75B_calculate(void)&lt;br /&gt;
{&lt;br /&gt;
	int16_t tempraw = 0;&lt;br /&gt;
	double temp;&lt;br /&gt;
&lt;br /&gt;
	tempraw = (getTemperatureHigh() &amp;lt;&amp;lt; 8) | getTemperatureLow();&lt;br /&gt;
	tempraw &amp;gt;&amp;gt;= 5;&lt;br /&gt;
	if (tempraw &amp;amp; 1024)							// Calculate temperature&lt;br /&gt;
		tempraw = (tempraw &amp;amp; 1023) - 1024;&lt;br /&gt;
	else&lt;br /&gt;
		tempraw = tempraw &amp;amp; 1023;&lt;br /&gt;
	temp = tempraw * 0.125;&lt;br /&gt;
	return temp;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Performs a 11 bit measurement and returns the&lt;br /&gt;
 * temperature [°C]. The sensor has a measuring&lt;br /&gt;
 * cycle of 100ms. So it makes no sense calling&lt;br /&gt;
 * this function at a frequency above 10Hz.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
double LM75B_measure(void)&lt;br /&gt;
{&lt;br /&gt;
//	LM75B_init();&lt;br /&gt;
	LM75B_read();								// Read data&lt;br /&gt;
	return (LM75B_calculate());					// Calculate value&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Servo Controller (PCA9685):&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Call this once before using the servo function.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: PWM frequency [40..1000 Hz]&lt;br /&gt;
 *&lt;br /&gt;
 * Hints: - Default servo frequency is 50 Hz!&lt;br /&gt;
 *        - The servo power is NOT switched on by&lt;br /&gt;
 *          this function!&lt;br /&gt;
 *&lt;br /&gt;
 * There is also a macro initServo(freq), which&lt;br /&gt;
 * does exactly the same as this function.&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *   initServo(50);&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void PCA9685_init(uint16_t freq)&lt;br /&gt;
{&lt;br /&gt;
	outport.oen_servo = false;					// I/O 1.3: Low&lt;br /&gt;
	MAX7311_update();&lt;br /&gt;
	if ((freq &amp;lt; 40) || (freq &amp;gt; 1000)) freq = 50;&lt;br /&gt;
	I2CTWI_transmitByte(I2C_SENSOR_SERVO_ADR, PCA9685_MODE2);&lt;br /&gt;
	uint8_t last_mode = I2CTWI_readByte(I2C_SENSOR_SERVO_ADR);&lt;br /&gt;
	last_mode &amp;amp;= ~PCA9685_MODE2_INVRT;			// Clear INVRT bit&lt;br /&gt;
	last_mode |= PCA9685_MODE2_OUTDRV;			// Set OUTDRV bit&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_SERVO_ADR, PCA9685_MODE2, last_mode);&lt;br /&gt;
	I2CTWI_transmitByte(I2C_SENSOR_SERVO_ADR, PCA9685_MODE1);&lt;br /&gt;
	last_mode = I2CTWI_readByte(I2C_SENSOR_SERVO_ADR);&lt;br /&gt;
	last_mode |= PCA9685_MODE1_AI;				// Set AI bit&lt;br /&gt;
	uint8_t mode1 = last_mode;&lt;br /&gt;
	mode1 |= PCA9685_MODE1_SLEEP;				// Set SLEEP bit&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_SERVO_ADR, PCA9685_MODE1, mode1);&lt;br /&gt;
	uint8_t prescale = (uint8_t) (F_PCA9685 / 4096 / freq - 0.5);&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_SERVO_ADR, PCA9685_PRE_SCALE, prescale);&lt;br /&gt;
	last_mode &amp;amp;= ~PCA9685_MODE1_SLEEP;			// Clear SLEEP bit&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_SERVO_ADR, PCA9685_MODE1, last_mode);&lt;br /&gt;
	mSleep(1);&lt;br /&gt;
	last_mode |= PCA9685_MODE1_RESTART;			// Clear RESTART bit&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_SERVO_ADR, PCA9685_MODE1, last_mode);&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_SERVO_ADR, PCA9685_LED8_ON_H, 0x10);&lt;br /&gt;
	return;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/** &lt;br /&gt;
 * Returns the channel belonging to a servo number.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: number -&amp;gt; Servo number [1..8]&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
uint8_t servo(uint8_t number)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t channel;&lt;br /&gt;
&lt;br /&gt;
	switch (number) {&lt;br /&gt;
		case 1 :&lt;br /&gt;
			channel = CH_SERVO_1; break;&lt;br /&gt;
		case 2 :&lt;br /&gt;
			channel = CH_SERVO_2; break;&lt;br /&gt;
		case 3 :&lt;br /&gt;
			channel = CH_SERVO_3; break;&lt;br /&gt;
		case 4 :&lt;br /&gt;
			channel = CH_SERVO_4; break;&lt;br /&gt;
		case 5 :&lt;br /&gt;
			channel = CH_SERVO_5; break;&lt;br /&gt;
		case 6 :&lt;br /&gt;
			channel = CH_SERVO_6; break;&lt;br /&gt;
		case 7 :&lt;br /&gt;
			channel = CH_SERVO_7; break;&lt;br /&gt;
		case 8 :&lt;br /&gt;
			channel = CH_SERVO_8; break;&lt;br /&gt;
		default : channel = CH_SERVO_1;&lt;br /&gt;
	}&lt;br /&gt;
	return channel;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This is the servo position set function.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: channel -&amp;gt; Channel number [1..16]&lt;br /&gt;
 *        pos     -&amp;gt; Servo position [SERVOx_LT..SERVOx_RT]&lt;br /&gt;
 *&lt;br /&gt;
 * Hints: - A servo position of 205 means 1 ms servo impulse,&lt;br /&gt;
 *          a position of 410 means a 2 ms servo impulse!&lt;br /&gt;
 *          You may calculate the servo impulse length by:&lt;br /&gt;
 *          ==&amp;gt; Impulse [ms] = servo position / 204.8 &amp;lt;==&lt;br /&gt;
 *          (Formula only valid for a PWM of 50 Hz!)&lt;br /&gt;
 *&lt;br /&gt;
 * There is also a macro setServo(servo, pos), which&lt;br /&gt;
 * does nearly the same as this function, but the first&lt;br /&gt;
 * parameter is the servo and NOT the channel number.&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *   setServo(2,300);&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void PCA9685_set(uint8_t channel, uint16_t pos)&lt;br /&gt;
{&lt;br /&gt;
	if ((channel == 0) || (channel &amp;gt; 16))&lt;br /&gt;
		return;&lt;br /&gt;
	uint8_t reg = channel * 4 + 4;				// Register LEDx_OFF_L&lt;br /&gt;
	I2CTWI_transmit3Bytes(I2C_SENSOR_SERVO_ADR, reg, (pos &amp;amp; 0x00ff), (pos &amp;gt;&amp;gt; 8));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * If the servos are not moving for a while, the&lt;br /&gt;
 * servo function can be stopped with this&lt;br /&gt;
 * function (PCA9685 set to sleep mode).&lt;br /&gt;
 *&lt;br /&gt;
 * Hint: The servo power is NOT switched off by&lt;br /&gt;
 *       this function!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void PCA9685_shutdown(void)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_SERVO_ADR, PCA9685_ALL_LED_OFF_H, 0x10);&lt;br /&gt;
	I2CTWI_transmitByte(I2C_SENSOR_SERVO_ADR, PCA9685_MODE1);&lt;br /&gt;
	uint8_t mode1 = I2CTWI_readByte(I2C_SENSOR_SERVO_ADR);&lt;br /&gt;
	mode1 |= PCA9685_MODE1_SLEEP;				// Set SLEEP bit&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_SERVO_ADR, PCA9685_MODE1, mode1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * If the servo function was stopped with the&lt;br /&gt;
 * function PCA9685_shutdown() before, it can be&lt;br /&gt;
 * (re)started again with this function.&lt;br /&gt;
 *&lt;br /&gt;
 * Hint: The servo power is NOT switched on by&lt;br /&gt;
 *       this function!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void PCA9685_restart(void)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmitByte(I2C_SENSOR_SERVO_ADR, PCA9685_MODE1);&lt;br /&gt;
	uint8_t mode1 = I2CTWI_readByte(I2C_SENSOR_SERVO_ADR);&lt;br /&gt;
	if (mode1 &amp;amp; PCA9685_MODE1_RESTART) {		// RESTART bit set?&lt;br /&gt;
		mode1 &amp;amp;= ~PCA9685_MODE1_SLEEP;			// Clear SLEEP bit&lt;br /&gt;
		I2CTWI_transmit2Bytes(I2C_SENSOR_SERVO_ADR, PCA9685_MODE1, mode1);&lt;br /&gt;
		mSleep(1);&lt;br /&gt;
		mode1 |= PCA9685_MODE1_RESTART;			// Clear RESTART bit&lt;br /&gt;
		I2CTWI_transmit2Bytes(I2C_SENSOR_SERVO_ADR, PCA9685_MODE1, mode1);&lt;br /&gt;
		I2CTWI_transmit2Bytes(I2C_SENSOR_SERVO_ADR, PCA9685_ALL_LED_OFF_H, 0);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/** &lt;br /&gt;
 * With this function you can switch the servo&lt;br /&gt;
 * power on or off.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: pwr -&amp;gt; 0 (false) = servo power off&lt;br /&gt;
 *               &amp;gt;0 (true) = servo power on&lt;br /&gt;
 *&lt;br /&gt;
 * Hints: - If connected servos are not used, you&lt;br /&gt;
 *          should always switch the servo power off&lt;br /&gt;
 *          (default) to save energy!&lt;br /&gt;
 *        - The PCA9685 is NOT restarted or put into&lt;br /&gt;
 *          shutdown mode by this function!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void setServoPower(uint8_t pwr)&lt;br /&gt;
{&lt;br /&gt;
	if(pwr &amp;gt; 0)&lt;br /&gt;
		outport.pwr_servo = true;				// I/O 1.4: High&lt;br /&gt;
	else&lt;br /&gt;
		outport.pwr_servo = false;				// I/O 1.4: Low&lt;br /&gt;
	MAX7311_update();&lt;br /&gt;
}	&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C LED Driver (TCA6507):&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Sends the configuration byte to TCA6507's&lt;br /&gt;
 * internal registers.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: reg    -&amp;gt; Register address [0..10]&lt;br /&gt;
 *        config -&amp;gt; Config byte for internal&lt;br /&gt;
 *                  registers&lt;br /&gt;
 *&lt;br /&gt;
 * Hints: - With this function you can write to&lt;br /&gt;
 *          all internal registers of the LED&lt;br /&gt;
 *          driver, see &amp;quot;Registers:&amp;quot; in the&lt;br /&gt;
 *          library header file!&lt;br /&gt;
 *        - Mainly you will use this function&lt;br /&gt;
 *          for setting time (regs 3..7) and&lt;br /&gt;
 *          intensity (regs 8, 9) values.&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *   TCA6507_write_cfg(TCA6507_MAXIMUM_INTENSITY,0x77);&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void TCA6507_write_cfg(uint8_t reg, uint8_t config)&lt;br /&gt;
{&lt;br /&gt;
	if(reg &amp;gt; 10) reg = 0;&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_LEDDRIVER_ADR, reg, config);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
uint8_t select[3];&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Updates the LED driver select registers (0..2)&lt;br /&gt;
 * with the global select array!&lt;br /&gt;
 *&lt;br /&gt;
 * Hint: - Also have a look at Table 4 in the&lt;br /&gt;
 *         TCA6507 datasheet!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void TCA6507_update(void)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmit4Bytes(I2C_SENSOR_LEDDRIVER_ADR, (TCA6507_SELECT0 | 0x10), select[0], select[1], select[2]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This is the LED state set function.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: led   -&amp;gt; LED number [0..6]&lt;br /&gt;
 *        state -&amp;gt; LED state  [0..7]&lt;br /&gt;
 *&lt;br /&gt;
 * Hints: - Possible driver states [0..7] see&lt;br /&gt;
 *          &amp;quot;Output states:&amp;quot; in the library&lt;br /&gt;
 *          header file!&lt;br /&gt;
 *        - Also have a look at Table 4 in the&lt;br /&gt;
 *          TCA6507 datasheet!&lt;br /&gt;
 *&lt;br /&gt;
 * There is also a macro setLED(led, state), which&lt;br /&gt;
 * does exactly the same as this function.&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *   setLED(1,4);&lt;br /&gt;
 *   // Switches LED1 ON&lt;br /&gt;
 *   // ... OR ...&lt;br /&gt;
 *   setLED(SB_LED1,STATE_ON);&lt;br /&gt;
 *   // does the same.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void TCA6507_set(uint8_t led, uint8_t state)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t i, mask;&lt;br /&gt;
&lt;br /&gt;
	if(led &amp;gt; 6) led = 0;&lt;br /&gt;
	led = 1 &amp;lt;&amp;lt; led;&lt;br /&gt;
	mask = 1;&lt;br /&gt;
	for(i = 0; i &amp;lt; 3; i++) {&lt;br /&gt;
		select[i] &amp;amp;= ~led;&lt;br /&gt;
		if(state &amp;amp; mask)&lt;br /&gt;
			select[i] |= led;&lt;br /&gt;
		mask &amp;lt;&amp;lt;= 1;&lt;br /&gt;
	}&lt;br /&gt;
	TCA6507_update();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * If the LEDs are not needed for a while, the&lt;br /&gt;
 * LED driver can be stopped with this function&lt;br /&gt;
 * (TCA6507 set to shutdown mode).&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void TCA6507_shutdown(void)&lt;br /&gt;
{&lt;br /&gt;
	outport.en_leddriv = false;					// I/O 0.4: Low&lt;br /&gt;
	MAX7311_update();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * If the LED driver was stopped with the&lt;br /&gt;
 * function TCA6507_shutdown() before, it can be&lt;br /&gt;
 * (re)started again with this function.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void TCA6507_restart(void)&lt;br /&gt;
{&lt;br /&gt;
	outport.en_leddriv = true;					// I/O 0.4: High&lt;br /&gt;
	MAX7311_update();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Initializes the LED driver after power on by&lt;br /&gt;
 * switching all LEDs off.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void TCA6507_init(void)&lt;br /&gt;
{&lt;br /&gt;
	select[0] = 0;&lt;br /&gt;
	select[1] = 0;&lt;br /&gt;
	select[2] = 0;&lt;br /&gt;
	TCA6507_update();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C 3D Magnetometer &amp;amp; Accelerometer (LSM303DLHC):&lt;br /&gt;
&lt;br /&gt;
// --------------------------------------------&lt;br /&gt;
// LSM303DLHC accelerometer functions:&lt;br /&gt;
int16_t x_axisa, y_axisa, z_axisa;&lt;br /&gt;
double pitch, roll;&lt;br /&gt;
double xa, ya, za;&lt;br /&gt;
double the, phi;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Call this once before using the 3D-Accelerometer.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void LSM303DLHC_A_init(void)&lt;br /&gt;
{&lt;br /&gt;
	// Set normal power mode, 10 Hz data rate, all axes enabled:&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_LSM303DLHC_A_ADR, CTRL_REG1_A, CTRL_REG1_A_10HZ);&lt;br /&gt;
	mSleep(10);&lt;br /&gt;
	// Set HD mode:&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_LSM303DLHC_A_ADR, CTRL_REG4_A, CTRL_REG4_A_HR);&lt;br /&gt;
	mSleep(10);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function reads the X-axis, Y-axis and Z-axis values&lt;br /&gt;
 * from the LSM303DLHC accelerometer and stores them in the&lt;br /&gt;
 * global variables x_axisa, y_axisa and z_axisa.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void readLSM303DLHC_A(void)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t readBuf[6];&lt;br /&gt;
&lt;br /&gt;
	I2CTWI_transmitByte(I2C_SENSOR_LSM303DLHC_A_ADR, (OUT_X_L_A | 0x80));&lt;br /&gt;
	I2CTWI_readBytes(I2C_SENSOR_LSM303DLHC_A_ADR, readBuf, 6); // Read  X-/Y-/Z-axis&lt;br /&gt;
	// xb = y:&lt;br /&gt;
	x_axisa = ((readBuf[OUT_Y_H_A - OUT_X_L_A] &amp;lt;&amp;lt; 8) + readBuf[OUT_Y_L_A - OUT_X_L_A]) / 16;&lt;br /&gt;
	// yb = x:&lt;br /&gt;
	y_axisa = ((readBuf[OUT_X_H_A - OUT_X_L_A] &amp;lt;&amp;lt; 8) + readBuf[OUT_X_L_A - OUT_X_L_A]) / 16;&lt;br /&gt;
	// zb = z:&lt;br /&gt;
	z_axisa = ((readBuf[OUT_Z_H_A - OUT_X_L_A] &amp;lt;&amp;lt; 8) + readBuf[OUT_Z_L_A - OUT_X_L_A]) / 16;&lt;br /&gt;
	mSleep(10);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function limits and normalizes the x-axisa,&lt;br /&gt;
 * y-axisa and z-axisa values read from the LSM303DLHC&lt;br /&gt;
 * accelerometer with the function readLSM303DLHC_A() and&lt;br /&gt;
 * stores them in the global double variables xa, ya and&lt;br /&gt;
 * za.&lt;br /&gt;
 * It also calculates the position in space in form of the&lt;br /&gt;
 * tilt angles (the = pitch, phi = roll) and stores them&lt;br /&gt;
 * in the global double variables the and phi.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void normalizeLSM303DLHC_A(void)&lt;br /&gt;
{&lt;br /&gt;
	// Limit raw values:&lt;br /&gt;
	if (x_axisa &amp;lt; MIN_X_A) x_axisa = MIN_X_A;&lt;br /&gt;
	if (x_axisa &amp;gt; MAX_X_A) x_axisa = MAX_X_A;&lt;br /&gt;
	if (y_axisa &amp;lt; MIN_Y_A) y_axisa = MIN_Y_A;&lt;br /&gt;
	if (y_axisa &amp;gt; MAX_Y_A) y_axisa = MAX_Y_A;&lt;br /&gt;
	if (z_axisa &amp;lt; MIN_Z_A) z_axisa = MIN_Z_A;&lt;br /&gt;
	if (z_axisa &amp;gt; MAX_Z_A) z_axisa = MAX_Z_A;&lt;br /&gt;
	xa = (double) x_axisa / 1000.0;&lt;br /&gt;
	ya = (double) y_axisa / 1000.0;&lt;br /&gt;
	za = (double) z_axisa / 1000.0;&lt;br /&gt;
	// Calculate Pitch and Roll:&lt;br /&gt;
	phi = asin(xa);								// Calculate the and phi&lt;br /&gt;
	the = asin(ya / cos(the));					//  from the raw values&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function calculates the position in space by&lt;br /&gt;
 * using the the and phi values (see function&lt;br /&gt;
 * normalizeLSM303DLHC_A()!). It stores the position&lt;br /&gt;
 * in the global double variables pitch and roll. &lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void positionLSM303DLHC_A(void)&lt;br /&gt;
{&lt;br /&gt;
	pitch = the * 180 / M_PI + OFFSET_PITCH_A;&lt;br /&gt;
	roll = phi * 180 / M_PI + OFFSET_ROLL_A;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// LSM303DLHC magnetometer functions:&lt;br /&gt;
int16_t x_axism, y_axism, z_axism;&lt;br /&gt;
int16_t headingm;&lt;br /&gt;
double xm, ym, zm;&lt;br /&gt;
#ifdef GET_TEMP_M&lt;br /&gt;
int16_t temperaturem;&lt;br /&gt;
double temperature_mag;&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
int16_t headingtc;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Call this once before using the 3D-Compass.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void LSM303DLHC_M_init(void)&lt;br /&gt;
{&lt;br /&gt;
#ifdef GET_TEMP_M&lt;br /&gt;
	// Set Data output rate to 15Hz, enable temperature sensor:&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_LSM303DLHC_M_ADR, CRA_REG_M, CRA_REG_M_15HZ_T_EN);&lt;br /&gt;
#else&lt;br /&gt;
	// Set Data output rate to 15Hz:&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_LSM303DLHC_M_ADR, CRA_REG_M, CRA_REG_M_15HZ);&lt;br /&gt;
#endif&lt;br /&gt;
	mSleep(10);&lt;br /&gt;
	// Set Gain to +-1.3Gauss:&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_LSM303DLHC_M_ADR, CRB_REG_M, CRB_REG_M_13GAUSS);&lt;br /&gt;
	mSleep(10);&lt;br /&gt;
	// Set Continuous-conversion mode:&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_LSM303DLHC_M_ADR, MR_REG_M, MR_REG_M_CCM);&lt;br /&gt;
	mSleep(10);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function reads the X-axis, Y-axis, Z-axis and&lt;br /&gt;
 * temperature values from the LSM303DLHC magnetometer&lt;br /&gt;
 * and stores them in the global variables x_axism,&lt;br /&gt;
 * y_axism, z_axism and temperaturem.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void readLSM303DLHC_M(void)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t readBuf[6];&lt;br /&gt;
&lt;br /&gt;
	I2CTWI_transmitByte(I2C_SENSOR_LSM303DLHC_M_ADR, OUT_X_H_M);&lt;br /&gt;
	I2CTWI_readBytes(I2C_SENSOR_LSM303DLHC_M_ADR, readBuf, 6); // Read  X-/Y-/Z-axis&lt;br /&gt;
	// xb = x:&lt;br /&gt;
	x_axism = (readBuf[OUT_X_H_M - OUT_X_H_M] &amp;lt;&amp;lt; 8) + readBuf[OUT_X_L_M - OUT_X_H_M];&lt;br /&gt;
	// yb = y:&lt;br /&gt;
	y_axism = (readBuf[OUT_Y_H_M - OUT_X_H_M] &amp;lt;&amp;lt; 8) + readBuf[OUT_Y_L_M - OUT_X_H_M];&lt;br /&gt;
	// zb = z:&lt;br /&gt;
	z_axism = (readBuf[OUT_Z_H_M - OUT_X_H_M] &amp;lt;&amp;lt; 8) + readBuf[OUT_Z_L_M - OUT_X_H_M];&lt;br /&gt;
	mSleep(10);&lt;br /&gt;
#ifdef GET_TEMP_M&lt;br /&gt;
	// Read temperature raw value:&lt;br /&gt;
	I2CTWI_transmitByte(I2C_SENSOR_LSM303DLHC_M_ADR, TEMP_OUT_H_M);&lt;br /&gt;
	readBuf[0] = I2CTWI_readByte(I2C_SENSOR_LSM303DLHC_M_ADR);&lt;br /&gt;
	I2CTWI_transmitByte(I2C_SENSOR_LSM303DLHC_M_ADR, TEMP_OUT_L_M);&lt;br /&gt;
	readBuf[1] = I2CTWI_readByte(I2C_SENSOR_LSM303DLHC_M_ADR);&lt;br /&gt;
	temperaturem = (readBuf[0] &amp;lt;&amp;lt; 8) | readBuf[1];&lt;br /&gt;
	temperaturem &amp;gt;&amp;gt;= 4;&lt;br /&gt;
	if (temperaturem &amp;amp; 2048)					// Calculate temperature&lt;br /&gt;
		temperaturem = (temperaturem &amp;amp; 2047) - 2048;&lt;br /&gt;
	else&lt;br /&gt;
		temperaturem = temperaturem &amp;amp; 2047;&lt;br /&gt;
	mSleep(10);&lt;br /&gt;
#endif&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function compensates hard iron effects and&lt;br /&gt;
 * scales the x-axism, y-axism and z-axism values read&lt;br /&gt;
 * from the LSM303DLHC magnetometer with the function&lt;br /&gt;
 * readLSM303DLHC_M() and stores them in the global&lt;br /&gt;
 * double variables xm, ym and zm.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void normalizeLSM303DLHC_M(void)&lt;br /&gt;
{&lt;br /&gt;
	// Add hard iron offsets:&lt;br /&gt;
	x_axism += OFFSET_X_M;&lt;br /&gt;
	y_axism += OFFSET_Y_M;&lt;br /&gt;
	z_axism += OFFSET_Z_M;&lt;br /&gt;
	// Scale raw values:&lt;br /&gt;
	xm = (x_axism - MIN_X_M) / (MAX_X_M - MIN_X_M) * 2 - 1;&lt;br /&gt;
	ym = (y_axism - MIN_Y_M) / (MAX_Y_M - MIN_Y_M) * 2 - 1;&lt;br /&gt;
	zm = (z_axism - MIN_Z_M) / (MAX_Z_M - MIN_Z_M) * 2 - 1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function calculates the heading by using the&lt;br /&gt;
 * normalized sensor values xm and ym (see function&lt;br /&gt;
 * normalizeLSM303DLHC_M()!). The heading is a value&lt;br /&gt;
 * from 0° to 359°. If the robot's front (and the&lt;br /&gt;
 * RP6 Sensor Board's front edge with the two&lt;br /&gt;
 * headlights) points to ...&lt;br /&gt;
 *   north -&amp;gt; heading is 0°,&lt;br /&gt;
 *   east  -&amp;gt; heading is 90°,&lt;br /&gt;
 *   south -&amp;gt; heading is 180°,&lt;br /&gt;
 *   west  -&amp;gt; heading is 270°.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
int16_t headingLSM303DLHC_M(void)&lt;br /&gt;
{&lt;br /&gt;
	double hdg = atan2(ym, xm) * 180 / M_PI + DECLINATION_M;&lt;br /&gt;
	if(hdg &amp;lt; 0.0) hdg += 360.0;&lt;br /&gt;
	return ((int16_t) hdg);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// --------------------------------------------&lt;br /&gt;
/**&lt;br /&gt;
 * This function calculates the TILT COMPENSATED&lt;br /&gt;
 * heading by using accelerometer (the, phi) AND&lt;br /&gt;
 * magnetometer (xm, ym, zm) data. The heading is a&lt;br /&gt;
 * value from 0° to 359°. If the robot's front (and&lt;br /&gt;
 * the RP6 Sensor Board's front edge with the two&lt;br /&gt;
 * headlights) points to ...&lt;br /&gt;
 *   north -&amp;gt; heading is 0°,&lt;br /&gt;
 *   east  -&amp;gt; heading is 90°,&lt;br /&gt;
 *   south -&amp;gt; heading is 180°,&lt;br /&gt;
 *   west  -&amp;gt; heading is 270°.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
int16_t headingLSM303DLHC_TC(void)&lt;br /&gt;
{&lt;br /&gt;
	double hdgtc, xh, yh;&lt;br /&gt;
&lt;br /&gt;
	xh = xm * cos(the) + zm * sin(the);&lt;br /&gt;
	yh = xm * sin(phi) * sin(the) + ym * cos(phi) - zm * sin(phi) * cos(the);&lt;br /&gt;
//	zh = -xm * cos(phi) * sin(the) + ym * sin(phi) + zm * cos(phi) * cos(the);&lt;br /&gt;
	hdgtc = atan2(yh, xh) * 180 / M_PI + DECLINATION_M;&lt;br /&gt;
	if(hdgtc &amp;lt; 0.0) hdgtc += 360.0;&lt;br /&gt;
	return ((int16_t) hdgtc);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// --------------------------------------------&lt;br /&gt;
/**&lt;br /&gt;
 * Call this once before using the LSM303DLHC.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void LSM303DLHC_init(void)&lt;br /&gt;
{&lt;br /&gt;
	LSM303DLHC_A_init();						// Accelerometer init&lt;br /&gt;
	LSM303DLHC_M_init();						// Magnetometer init&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Analog Yaw-Rate Gyroscope (LY330ALH):&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Sets the LY330ALH mode of operation.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: mode -&amp;gt; Mode [0..3]&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void LY330ALH_set_mode(uint8_t mode)&lt;br /&gt;
{&lt;br /&gt;
	outport.pd_gyro = false;					// I/O 0.6: Low&lt;br /&gt;
	outport.st_gyro = false;					// I/O 0.7: Low&lt;br /&gt;
	if(mode &amp;amp; 1) outport.pd_gyro = true;&lt;br /&gt;
	if(mode &amp;amp; 2) outport.st_gyro = true;&lt;br /&gt;
	MAX7311_update();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Reads the ADC1 value from the RP6Base.&lt;br /&gt;
 *&lt;br /&gt;
 * Hints: - The RP6Base input ADC1 has to be&lt;br /&gt;
 *          connected to the USRBUS: Pin 2 on&lt;br /&gt;
 *          the RP6 mainboard!&lt;br /&gt;
 *        - The RP6Base_I2CSlave program has to&lt;br /&gt;
 *          be loaded into the RP6Base&lt;br /&gt;
 *          microcontroller!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
uint16_t getRP6Base_ADC1(void)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_readRegisters(I2C_RP6_BASE_ADR, I2C_REG_ADC_ADC1_L, registerBuf, 2);&lt;br /&gt;
	return (registerBuf[0] + (registerBuf[1] &amp;lt;&amp;lt; 8));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int16_t z_axisg;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Performs a LY330ALH gyroscope measurement and&lt;br /&gt;
 * returns the angular rate (velocity).&lt;br /&gt;
 * Positive values mean an angular rate while&lt;br /&gt;
 * rotating LEFT and negative values while&lt;br /&gt;
 * rotating RIGHT!&lt;br /&gt;
 * The global integer variable z_axisg also&lt;br /&gt;
 * contains the measurement result.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
int16_t LY330ALH_measure(void)&lt;br /&gt;
{&lt;br /&gt;
	z_axisg = getRP6Base_ADC1();				// Read raw data&lt;br /&gt;
	z_axisg -= ADCVAL_ZERORATE_LEVEL;			// Calculate value&lt;br /&gt;
	return (z_axisg);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Hot Swappable 2-Wire Bus Buffer (TCA4311A):&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Reads the TCA4311A Ready output. &lt;br /&gt;
 * The function returns the state (true/false).&lt;br /&gt;
 * The global variable readyBusbuff is also&lt;br /&gt;
 * filled with the Ready output state.&lt;br /&gt;
 *&lt;br /&gt;
 * Hint: You don't have to use this function,&lt;br /&gt;
 *       if the task task_RP6SensorBoard() is&lt;br /&gt;
 *       called frequently out of the main&lt;br /&gt;
 *       loop, because readyBusbuff will be&lt;br /&gt;
 *       updated by this task!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
uint8_t readReadyBusbuff(void)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmitByte(I2C_SENSOR_PORTEXP_ADR, MAX7311_INPUT_PORT1);&lt;br /&gt;
	readyBusbuff = I2CTWI_readByte(I2C_SENSOR_PORTEXP_ADR);&lt;br /&gt;
	readyBusbuff &amp;amp;= RDY_BUSBUFF;&lt;br /&gt;
	return readyBusbuff;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
uint8_t errorBusbuff;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * If the I2C bus for the I2C-MODULE (SCLOUT,&lt;br /&gt;
 * SDAOUT) is not used or shall be isolated from&lt;br /&gt;
 * the RP6 I2C bus, this can be done with this&lt;br /&gt;
 * function.&lt;br /&gt;
 *&lt;br /&gt;
 * Hints: - The I2C-MODULE power is NOT switched&lt;br /&gt;
 *          off by this function!&lt;br /&gt;
 *        - If USE_PD5 is defined in the&lt;br /&gt;
 *          configuration header file, this&lt;br /&gt;
 *          function uses the RP6M256 portpin,&lt;br /&gt;
 *          that is connected to plug I/O: Pin 9&lt;br /&gt;
 *          instead of MAX7311 I/O 1.0!&lt;br /&gt;
 *        - If the global variable errorBusbuff&lt;br /&gt;
 *          returns true, the bus buffer could&lt;br /&gt;
 *          not be switched to shutdown mode!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void TCA4311A_shutdown(void)&lt;br /&gt;
{&lt;br /&gt;
	// Wait until the I2C bus is idle:&lt;br /&gt;
	while(I2CTWI_isBusy() || TWI_operation != I2CTWI_NO_OPERATION) task_I2CTWI();&lt;br /&gt;
#ifdef USE_PD5&lt;br /&gt;
	IO_SENSOR_TCA4311A_EN_PORT &amp;amp;= ~IO_SENSOR_TCA4311A_EN_IN; // Low&lt;br /&gt;
#else&lt;br /&gt;
	outport.en_busbuff = false;					// I/O 1.0: Low&lt;br /&gt;
	MAX7311_update();&lt;br /&gt;
#endif&lt;br /&gt;
	errorBusbuff = readReadyBusbuff();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * If the I2C bus for the I2C-MODULE (SCLOUT,&lt;br /&gt;
 * SDAOUT) was isolated from the RP6 I2C bus with&lt;br /&gt;
 * the function TCA4311A_shutdown() before, it&lt;br /&gt;
 * can be connected again with this function.&lt;br /&gt;
 *&lt;br /&gt;
 * Hints: - The I2C-MODULE power is NOT switched&lt;br /&gt;
 *          on by this function!&lt;br /&gt;
 *        - If USE_PD5 is defined in the&lt;br /&gt;
 *          configuration header file, this&lt;br /&gt;
 *          function uses the RP6M256 portpin,&lt;br /&gt;
 *          that is connected to plug I/O: Pin 9&lt;br /&gt;
 *          instead of MAX7311 I/O 1.0!&lt;br /&gt;
 *        - If the global variable errorBusbuff&lt;br /&gt;
 *          returns true, the bus buffer could&lt;br /&gt;
 *          not be switched to normal operation!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void TCA4311A_reconnect(void)&lt;br /&gt;
{&lt;br /&gt;
	// Wait until the I2C bus is idle:&lt;br /&gt;
	while(I2CTWI_isBusy() || TWI_operation != I2CTWI_NO_OPERATION) task_I2CTWI();&lt;br /&gt;
#ifdef USE_PD5&lt;br /&gt;
	IO_SENSOR_TCA4311A_EN_PORT |= IO_SENSOR_TCA4311A_EN_IN; // High&lt;br /&gt;
#else&lt;br /&gt;
	outport.en_busbuff = true;					// I/O 1.0: High&lt;br /&gt;
	MAX7311_update();&lt;br /&gt;
#endif&lt;br /&gt;
	errorBusbuff = !readReadyBusbuff();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Sets/clears the RP6Base signal PWR.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: pwr -&amp;gt; 0 (false) = PWR off&lt;br /&gt;
 *               &amp;gt;0 (true) = PWR on&lt;br /&gt;
 *&lt;br /&gt;
 * Hints: - The RP6Base signal PWR has to be&lt;br /&gt;
 *          connected to the USRBUS: Pin 3 on&lt;br /&gt;
 *          the RP6 mainboard!&lt;br /&gt;
 *        - The RP6Base_I2CSlave program has to&lt;br /&gt;
 *          be loaded into the RP6Base&lt;br /&gt;
 *          microcontroller!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void setRP6Base_PWR(uint8_t pwr)&lt;br /&gt;
{&lt;br /&gt;
	if(pwr &amp;gt; 0)&lt;br /&gt;
		I2CTWI_transmit2Bytes(I2C_RP6_BASE_ADR, 0, CMD_POWER_ON);&lt;br /&gt;
	else&lt;br /&gt;
		I2CTWI_transmit2Bytes(I2C_RP6_BASE_ADR, 0, CMD_POWER_OFF);&lt;br /&gt;
	while(I2CTWI_isBusy() || TWI_operation != I2CTWI_NO_OPERATION) task_I2CTWI();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/** &lt;br /&gt;
 * With this function you can switch the I2C-&lt;br /&gt;
 * MODULE (plug M1) power on or off.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: pwr -&amp;gt; 0 (false) = I2C-MODULE power off&lt;br /&gt;
 *               &amp;gt;0 (true) = I2C-MODULE power on&lt;br /&gt;
 *&lt;br /&gt;
 * Hints: - If the I2C-MODULE plug is not used,&lt;br /&gt;
 *          you should always switch the&lt;br /&gt;
 *          I2C-MODULE power off (default)!&lt;br /&gt;
 *        - The TCA4311A is NOT switched to&lt;br /&gt;
 *          normal operation (default) or&lt;br /&gt;
 *          shutdown mode by this function!&lt;br /&gt;
 *        - The RP6Base signal PWR has to be&lt;br /&gt;
 *          connected to the USRBUS: Pin 3 on&lt;br /&gt;
 *          the RP6 mainboard!&lt;br /&gt;
 *        - The RP6Base_I2CSlave program has to&lt;br /&gt;
 *          be loaded into the RP6Base&lt;br /&gt;
 *          microcontroller!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void setI2CModulePower(uint8_t pwr)&lt;br /&gt;
{&lt;br /&gt;
	if(pwr &amp;gt; 0) {&lt;br /&gt;
		setRP6Base_PWR(1);						// RP6Base PWR on&lt;br /&gt;
		outport.pwr_i2c = true;					// I/O 0.0: High&lt;br /&gt;
	}&lt;br /&gt;
	else&lt;br /&gt;
		outport.pwr_i2c = false;				// I/O 0.0: Low&lt;br /&gt;
	MAX7311_update();&lt;br /&gt;
}	&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Button:&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Reads the MAX7311 I/O port 1.7. &lt;br /&gt;
 * The function returns true, if  button S1 is&lt;br /&gt;
 * pressed (I/O 1.7: Low!) and false, if it is&lt;br /&gt;
 * not pressed (I/O 1.7: High!).&lt;br /&gt;
 * The global variable pressedButton is also&lt;br /&gt;
 * filled with the I/O 1.7 output state.&lt;br /&gt;
 *&lt;br /&gt;
 * Hint: You don't have to use this function,&lt;br /&gt;
 *       if the task task_RP6SensorBoard() is&lt;br /&gt;
 *       called frequently out of the main&lt;br /&gt;
 *       loop, because pressedButton will be&lt;br /&gt;
 *       updated by this task!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
uint8_t readButton(void)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmitByte(I2C_SENSOR_PORTEXP_ADR, MAX7311_INPUT_PORT2);&lt;br /&gt;
	pressedButton = I2CTWI_readByte(I2C_SENSOR_PORTEXP_ADR);&lt;br /&gt;
	pressedButton &amp;amp;= IO2_I2C;&lt;br /&gt;
	pressedButton = !pressedButton;&lt;br /&gt;
	return pressedButton;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Status LED:&lt;br /&gt;
&lt;br /&gt;
/** &lt;br /&gt;
 * Sets the status LED (D2) of the RP6 Sensor&lt;br /&gt;
 * Board.&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *   setStatusLED(1);&lt;br /&gt;
 *   // This switches the status LED on!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void setStatusLED(uint8_t on)&lt;br /&gt;
{&lt;br /&gt;
	if(on &amp;gt; 0)&lt;br /&gt;
		outport.io1_i2c = false;				// I/O 1.6: Low&lt;br /&gt;
	else&lt;br /&gt;
		outport.io1_i2c = true;					// I/O 1.6: High&lt;br /&gt;
	MAX7311_update();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// RP6 Sensor Board initialisation and shutdown:&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * You MUST call this function at the beginning of a&lt;br /&gt;
 * main program, that uses the RP6 Sensor Board. &lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void sensor_board_init(void)&lt;br /&gt;
{&lt;br /&gt;
	// I/O Port Expander:&lt;br /&gt;
	MAX7311_init();&lt;br /&gt;
	// RTC:&lt;br /&gt;
	DS1339_init();&lt;br /&gt;
	// Temperature Sensor:&lt;br /&gt;
	LM75B_init();&lt;br /&gt;
	// Servo Controller:&lt;br /&gt;
	PCA9685_init(50);							// Init PWM 50 Hz&lt;br /&gt;
	// LED Driver:&lt;br /&gt;
	TCA6507_init();&lt;br /&gt;
	// 3D Magnetometer &amp;amp; Accelerometer:&lt;br /&gt;
	LSM303DLHC_init();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * If you don't use any function of the RP6&lt;br /&gt;
 * Sensor Board, you can put the board into&lt;br /&gt;
 * &amp;quot;SHUTDOWN MODE&amp;quot;. In this mode the electric&lt;br /&gt;
 * power consumption is very low to save energy.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void sensor_board_shutdown(void)&lt;br /&gt;
{&lt;br /&gt;
	// Servo Controller:&lt;br /&gt;
	PCA9685_shutdown();							// Shutdown PCA9685&lt;br /&gt;
	// Temperature Sensor:&lt;br /&gt;
	LM75B_shutdown();							// Shutdown LM75B&lt;br /&gt;
	// I/O Port Expander:&lt;br /&gt;
	MAX7311_write(MAX7311_OUTPUT_SHUTDOWN);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&lt;br /&gt;
/******************************************************************************&lt;br /&gt;
 * Additional info&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Changelog:&lt;br /&gt;
 * - v. 1.1 RP6M256_I2CMasterLib compatibility 16.09.2014 by Dirk&lt;br /&gt;
 * - v. 1.0 TCA4311A reconnect problem fixed 10.04.2014 by Dirk&lt;br /&gt;
 * - v. 0.9 Interrupt status functions added 09.04.2014 by Dirk&lt;br /&gt;
 * - v. 0.8 (initial release) 17.03.2014 by Dirk&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Erklärung&lt;br /&gt;
&lt;br /&gt;
=====Demo=====&lt;br /&gt;
makefile:&lt;br /&gt;
&amp;lt;pre&amp;gt;...&lt;br /&gt;
TARGET = RP6M256_Sensor_Board_01&lt;br /&gt;
...&lt;br /&gt;
SRC += $(RP6_LIB_PATH)/RP6common/RP6I2CmasterTWI.c&lt;br /&gt;
&lt;br /&gt;
SRC += $(RP6_LIB_PATH)/RP6control_M256_WIFI/RP6M256_Sensor_BoardLib.c&lt;br /&gt;
...&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Datei: RP6M256_Sensor_Board_01.c&lt;br /&gt;
&amp;lt;pre&amp;gt;/* &lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * RP6 ROBOT SYSTEM - RP6 CONTROL M256 Examples&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Example: RP6M256 Sensor Board&lt;br /&gt;
 * Author(s): Dirk&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Description:&lt;br /&gt;
 * In this example we show a first test for the RP6 Sensor Board.&lt;br /&gt;
 * &lt;br /&gt;
 * ############################################################################&lt;br /&gt;
 * The Robot does NOT move in this example! You can simply put it on a table&lt;br /&gt;
 * next to your PC and you should connect it to the PC via the USB Interface!&lt;br /&gt;
 * You should also connect to it via WIFI.&lt;br /&gt;
 * ############################################################################&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Includes:&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6M256Lib.h&amp;quot; 				// The RP6 M256 Library. &lt;br /&gt;
										// Always needs to be included!&lt;br /&gt;
#include &amp;quot;RP6I2CmasterTWI.h&amp;quot;			// Include the I2C-Bus Master Library&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Include our new &amp;quot;RP6M256 Sensor Board library&amp;quot;:&lt;br /&gt;
// (This is the library for accessing the RP6 Sensor Board!)&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6M256_Sensor_BoardLib.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Variables:&lt;br /&gt;
&lt;br /&gt;
char dir[3];&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Returns a 2 character string for the eighth&lt;br /&gt;
 * parts of the direction calculated from the&lt;br /&gt;
 * heading value.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: heading -&amp;gt; Heading value [0..359]&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void calculateDir(char *dir, uint16_t heading)&lt;br /&gt;
{&lt;br /&gt;
	dir[1] = ' ';&lt;br /&gt;
	dir[2] = '\0';&lt;br /&gt;
	if ((heading &amp;lt;= 22) || (heading &amp;gt;=338)) dir[0] = 'N';&lt;br /&gt;
	if ((heading &amp;gt;= 23) &amp;amp;&amp;amp; (heading &amp;lt;= 67)) {dir[0] = 'N'; dir[1] = 'E';} &lt;br /&gt;
	if ((heading &amp;gt;= 68) &amp;amp;&amp;amp; (heading &amp;lt;= 112)) dir[0] = 'E';&lt;br /&gt;
	if ((heading &amp;gt;= 113) &amp;amp;&amp;amp; (heading &amp;lt;= 157)) {dir[0] = 'S'; dir[1] = 'E';}&lt;br /&gt;
	if ((heading &amp;gt;= 158) &amp;amp;&amp;amp; (heading &amp;lt;= 202)) dir[0] = 'S';&lt;br /&gt;
	if ((heading &amp;gt;= 203) &amp;amp;&amp;amp; (heading &amp;lt;= 247)) {dir[0] = 'S'; dir[1] = 'W';}&lt;br /&gt;
	if ((heading &amp;gt;= 248) &amp;amp;&amp;amp; (heading &amp;lt;= 292)) dir[0] = 'W';&lt;br /&gt;
	if ((heading &amp;gt;= 293) &amp;amp;&amp;amp; (heading &amp;lt;= 337)) {dir[0] = 'N'; dir[1] = 'W';}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Write a floating point number to the WIFI.&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *&lt;br /&gt;
 *			// Write a floating point number to the WIFI (no exponent):&lt;br /&gt;
 *			writeDouble_WIFI(1234567.890, 11, 3);&lt;br /&gt;
 *&lt;br /&gt;
 * The value of prec (precision) defines the number of decimal places.&lt;br /&gt;
 * For 32 bit floating point variables (float, double ...) 6 is&lt;br /&gt;
 * the max. value for prec (7 relevant digits).&lt;br /&gt;
 * The value of width defines the overall number of characters in the&lt;br /&gt;
 * floating point number including the decimal point. The number of&lt;br /&gt;
 * pre-decimal positions is: (width - prec - 1).&lt;br /&gt;
 */&lt;br /&gt;
void writeDouble_WIFI(double number, uint8_t width, uint8_t prec)&lt;br /&gt;
{char buffer[width + 1];&lt;br /&gt;
	dtostrf(number, width, prec, &amp;amp;buffer[0]);&lt;br /&gt;
	writeString_WIFI(&amp;amp;buffer[0]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Write a floating point number to the LCD.&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *&lt;br /&gt;
 *			// Write a floating point number to the LCD (no exponent):&lt;br /&gt;
 *			writeDoubleLCD(1234567.890, 11, 3);&lt;br /&gt;
 *&lt;br /&gt;
 * The value of prec (precision) defines the number of decimal places.&lt;br /&gt;
 * For 32 bit floating point variables (float, double ...) 6 is&lt;br /&gt;
 * the max. value for prec (7 relevant digits).&lt;br /&gt;
 * The value of width defines the overall number of characters in the&lt;br /&gt;
 * floating point number including the decimal point. The number of&lt;br /&gt;
 * pre-decimal positions is: (width - prec - 1).&lt;br /&gt;
 */&lt;br /&gt;
void writeDoubleLCD(double number, uint8_t width, uint8_t prec)&lt;br /&gt;
{char buffer[width + 1];&lt;br /&gt;
	dtostrf(number, width, prec, &amp;amp;buffer[0]);&lt;br /&gt;
	writeStringLCD(&amp;amp;buffer[0]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Error handler&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function gets called automatically if there was an I2C Error like&lt;br /&gt;
 * the slave sent a &amp;quot;not acknowledge&amp;quot; (NACK, error codes e.g. 0x20 or 0x30).&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void I2C_transmissionError(uint8_t errorState)&lt;br /&gt;
{&lt;br /&gt;
	writeString_P_WIFI(&amp;quot;\nI2C ERROR - TWI STATE: 0x&amp;quot;);&lt;br /&gt;
	writeInteger_WIFI(errorState, HEX);&lt;br /&gt;
	writeChar_WIFI('\n');&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Main function - The program starts here:&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
	initRP6M256();    // Always call this first! The Processor will not work&lt;br /&gt;
					  // correctly otherwise. &lt;br /&gt;
&lt;br /&gt;
	initLCD(); // Initialize the LC-Display (LCD)&lt;br /&gt;
			   // Always call this before using the LCD!&lt;br /&gt;
&lt;br /&gt;
	setLEDs(0b1111);&lt;br /&gt;
	mSleep(500);&lt;br /&gt;
	setLEDs(0b0000);&lt;br /&gt;
&lt;br /&gt;
	writeString_P_WIFI(&amp;quot;\n\nRP6 Sensor Board Selftest 1!\n&amp;quot;); &lt;br /&gt;
&lt;br /&gt;
	// IMPORTANT:&lt;br /&gt;
	I2CTWI_initMaster(100); // Initialize the TWI Module for Master operation&lt;br /&gt;
							// with 100kHz SCL Frequency&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	// Register the event handler:&lt;br /&gt;
	I2CTWI_setTransmissionErrorHandler(I2C_transmissionError);&lt;br /&gt;
&lt;br /&gt;
	setLEDs(0b1111);&lt;br /&gt;
&lt;br /&gt;
	// Write a text message to the LCD:&lt;br /&gt;
	showScreenLCD(&amp;quot;################&amp;quot;, &amp;quot;################&amp;quot;);&lt;br /&gt;
	mSleep(1500);&lt;br /&gt;
	showScreenLCD(&amp;quot;RP6v2-M256-WIFI &amp;quot;, &amp;quot;Example Program&amp;quot;);&lt;br /&gt;
	mSleep(2500); &lt;br /&gt;
	showScreenLCD(&amp;quot;RP6 Sensor Board&amp;quot;, &amp;quot;   Selftest 1&amp;quot;);&lt;br /&gt;
	mSleep(2500);&lt;br /&gt;
	clearLCD();&lt;br /&gt;
&lt;br /&gt;
	setLEDs(0b0000);&lt;br /&gt;
&lt;br /&gt;
	// ---------------------------------------&lt;br /&gt;
&lt;br /&gt;
	uint8_t onoff = 0;&lt;br /&gt;
	uint16_t servopos = SERVO1_LT;&lt;br /&gt;
	int16_t rate;&lt;br /&gt;
&lt;br /&gt;
	startStopwatch1();&lt;br /&gt;
	startStopwatch2();&lt;br /&gt;
&lt;br /&gt;
	// IMPORTANT:&lt;br /&gt;
	sensor_board_init();						// RP6 Sensor Board init!!!&lt;br /&gt;
	setServoPower(1);							// Servo power ON!&lt;br /&gt;
/*&lt;br /&gt;
	// ----------------------------------------------&lt;br /&gt;
	// Set RTC once (battery empty or not existing:&lt;br /&gt;
	rtc_time.second = 0;&lt;br /&gt;
	rtc_time.minute = 15;&lt;br /&gt;
	rtc_time.hour = 20;				// 20:15&lt;br /&gt;
	rtc_date.weekday = R_SU;&lt;br /&gt;
	rtc_date.day = 20;&lt;br /&gt;
	rtc_date.month = 4;&lt;br /&gt;
	rtc_date.year = 2014;			// Su, 20.4.2014&lt;br /&gt;
	DS1339_write();&lt;br /&gt;
	// Remove this, if RTC is set and running!!!&lt;br /&gt;
	// ----------------------------------------------&lt;br /&gt;
*/&lt;br /&gt;
	while(true) &lt;br /&gt;
	{&lt;br /&gt;
		if(getStopwatch1() &amp;gt; 1000) // 1s&lt;br /&gt;
		{&lt;br /&gt;
			if (onoff) onoff = 0;&lt;br /&gt;
			else onoff = 1;&lt;br /&gt;
&lt;br /&gt;
			// Interrupt status:&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nInterrupt Status:      &amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(interrupt_RP6SBstatus.byte, BIN, 8);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			// Inport status:&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;Inport Status: &amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(inport.word, BIN, 16);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			// Temperature sensor test:&lt;br /&gt;
			temperature = LM75B_measure();		// Measure&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;Temperature: &amp;quot;);&lt;br /&gt;
			writeDouble_WIFI(temperature, 7, 3);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;°\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			// LED driver test:&lt;br /&gt;
			if (onoff) {&lt;br /&gt;
				setLED(HEADLIGHT_R, STATE_ON);&lt;br /&gt;
				setLED(HEADLIGHT_L, STATE_OFF);&lt;br /&gt;
			}&lt;br /&gt;
			else {&lt;br /&gt;
				setLED(HEADLIGHT_L, STATE_ON);&lt;br /&gt;
				setLED(HEADLIGHT_R, STATE_OFF);&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			// Servo controller test (SERVO_1):&lt;br /&gt;
			setServo(1, servopos);&lt;br /&gt;
			servopos += 10;&lt;br /&gt;
			if (servopos &amp;gt; SERVO1_RT) servopos = SERVO1_LT;&lt;br /&gt;
&lt;br /&gt;
			// RTC test:&lt;br /&gt;
			DS1339_read();&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;RTC: &amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(rtc_time.hour, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;:&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(rtc_time.minute, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;:&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(rtc_time.second, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;  &amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(rtc_date.day, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;.&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(rtc_date.month, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;.&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(rtc_date.year, DEC, 4);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			// 3D Magnetometer &amp;amp; Accelerometer test:&lt;br /&gt;
			//  LSM303DLHC accelerometer:&lt;br /&gt;
			task_I2CTWI();&lt;br /&gt;
			readLSM303DLHC_A();					// Get sensor values&lt;br /&gt;
			task_I2CTWI();&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\n3D-Acceleration SENSOR -&amp;gt;\n&amp;quot;);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;X-axis: &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(x_axisa, DEC);&lt;br /&gt;
			writeChar_WIFI('\n');&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;Y-axis: &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(y_axisa, DEC);&lt;br /&gt;
			writeChar_WIFI('\n');&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;Z-axis: &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(z_axisa, DEC);&lt;br /&gt;
			writeChar_WIFI('\n');&lt;br /&gt;
			normalizeLSM303DLHC_A();			// Normalize data&lt;br /&gt;
			positionLSM303DLHC_A();				// Calculate position&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;POSITION: \n&amp;quot;);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;  Pitch [°]: &amp;quot;);&lt;br /&gt;
			writeDouble_WIFI(pitch, 6, 1);&lt;br /&gt;
			writeChar_WIFI('\n');&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;  Roll [°]:  &amp;quot;);&lt;br /&gt;
			writeDouble_WIFI(roll, 6, 1);&lt;br /&gt;
			writeChar_WIFI('\n');&lt;br /&gt;
&lt;br /&gt;
			//  LSM303DLHC magnetometer:&lt;br /&gt;
			task_I2CTWI();&lt;br /&gt;
			readLSM303DLHC_M();					// Get sensor values&lt;br /&gt;
			task_I2CTWI();&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\n3D-Compass SENSOR -&amp;gt;\n&amp;quot;);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;X-axis: &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(x_axism, DEC);&lt;br /&gt;
			writeChar_WIFI('\n');&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;Y-axis: &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(y_axism, DEC);&lt;br /&gt;
			writeChar_WIFI('\n');&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;Z-axis: &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(z_axism, DEC);&lt;br /&gt;
			writeChar_WIFI('\n');&lt;br /&gt;
			normalizeLSM303DLHC_M();			// Normalize data&lt;br /&gt;
			headingm = headingLSM303DLHC_M();	// Calculate heading&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;                 Heading [°]: &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(headingm, DEC);&lt;br /&gt;
			calculateDir(dir, headingm);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;  Direction: &amp;quot;);&lt;br /&gt;
			writeString_WIFI(dir);&lt;br /&gt;
			writeChar_WIFI('\n');&lt;br /&gt;
			headingtc = headingLSM303DLHC_TC();	// Calculate TILT COMPENSATED&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;TILT COMPENSATED heading [°]: &amp;quot;); // heading&lt;br /&gt;
			writeInteger_WIFI(headingtc, DEC);&lt;br /&gt;
			calculateDir(dir, headingtc);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;  Direction: &amp;quot;);&lt;br /&gt;
			writeString_WIFI(dir);&lt;br /&gt;
			writeChar_WIFI('\n');&lt;br /&gt;
#ifdef GET_TEMP_M&lt;br /&gt;
			temperature_mag = (double) temperaturem / 8.0 + OFFSET_TEMP_M;&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;Temperature [°]: &amp;quot;);&lt;br /&gt;
			writeDouble_WIFI(temperature_mag, 7, 2);&lt;br /&gt;
			writeChar_WIFI('\n');&lt;br /&gt;
#endif&lt;br /&gt;
			// Yaw-Rate Gyroscope test:&lt;br /&gt;
			rate = LY330ALH_measure();&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\n1D-Gyro SENSOR -&amp;gt;\n&amp;quot;);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;Z-axis: &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(rate, DEC);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			// RP6 Sensor Board shutdown (button &amp;amp; status LED test):&lt;br /&gt;
			if (pressedButton) {&lt;br /&gt;
				setStatusLED(1);&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;\nPress button again for RP6 Sensor Board SHUTDOWN!\n&amp;quot;);&lt;br /&gt;
				mSleep(2000);&lt;br /&gt;
				do {&lt;br /&gt;
					if(getStopwatch2() &amp;gt; 200) { // 0.2s&lt;br /&gt;
						if (onoff) onoff = 0;&lt;br /&gt;
						else onoff = 1;&lt;br /&gt;
						if (onoff) setStatusLED(1);&lt;br /&gt;
						else setStatusLED(0);&lt;br /&gt;
						setStopwatch2(0);&lt;br /&gt;
					}&lt;br /&gt;
					mSleep(1);&lt;br /&gt;
					task_I2CTWI();&lt;br /&gt;
				} while (!readButton());&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;\n\n\n\n\nPlease wait for RP6 Sensor Board SHUTDOWN...\n&amp;quot;);&lt;br /&gt;
				sensor_board_shutdown();&lt;br /&gt;
				mSleep(3000);&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;\n\n\nThe RP6 Sensor Board now is in SHUTDOWN MODE!!!\n&amp;quot;);&lt;br /&gt;
				mSleep(1000);&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;\nRESET the M256 microcontroller now...\n\n&amp;quot;);&lt;br /&gt;
				while(true) {};&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			setStopwatch1(0);&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		task_checkINTs();						// Read interrupt signals&lt;br /&gt;
		task_RP6SensorBoard();					// RP6 Sensor Board task&lt;br /&gt;
&lt;br /&gt;
		task_I2CTWI();&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Erklärung&lt;br /&gt;
&lt;br /&gt;
====Projekte====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===RP6 Xtra Module===&lt;br /&gt;
Die Dokumentation zu den RP6 Xtra Modulen befindet sich auf der mitgelieferten ''&amp;quot;RP6 Robot System Xtra Modules CD-ROM&amp;quot;''. Auf der CD-ROM sind auch Software-Beispiele zu finden.&lt;br /&gt;
&lt;br /&gt;
Die hier veröffentlichte Software zu den Xtra Modulen ist eine Eigenentwicklung in GCC:&lt;br /&gt;
* Arexx [[RP6_Sensor_Board_und_Xtra_Module#I2C_GPS_Empf.C3.A4nger_JM3-GPS_2|I2C GPS Empfänger JM3-GPS]]&lt;br /&gt;
* Arexx [[RP6_Sensor_Board_und_Xtra_Module#Gyro_Modul_JM3-GYRO_2|Gyro Modul JM3-GYRO]]&lt;br /&gt;
* Arexx [[RP6_Sensor_Board_und_Xtra_Module#3D_Accelerometer_Modul_JM3-3DA_2|3D Accelerometer Modul JM3-3DA]]&lt;br /&gt;
* Arexx [[RP6_Sensor_Board_und_Xtra_Module#BHT_Modul_JM3-BHT31_2|BHT Modul JM3-BHT31]]&lt;br /&gt;
&lt;br /&gt;
====I2C GPS Empfänger JM3-GPS====&lt;br /&gt;
=====Dokumentation=====&lt;br /&gt;
Die Dokumentation zum I2C GPS Empfänger befindet sich auf der mitgelieferten ''&amp;quot;RP6 Robot System Xtra Modules CD-ROM&amp;quot;''.&lt;br /&gt;
&lt;br /&gt;
======Manuals======&lt;br /&gt;
Das Handbuch in der aktuellen Version kann [http://www.jm3-engineering.com/download/doc/ManualGPSModule_de.pdf hier] eingesehen werden.&lt;br /&gt;
&lt;br /&gt;
=====Demo-Programme=====&lt;br /&gt;
Ein Demo-Programm zum I2C GPS Empfänger befindet sich integriert in die RP6 Sensor Board Demo auf der mitgelieferten ''&amp;quot;RP6 Robot System Xtra Modules CD-ROM&amp;quot;''. Diese Demo kann auch in der aktuellen Version im Download Bereich von [http://www.jm3-engineering.com/downloads.htm JM3 Engineering] herunter geladen werden.&lt;br /&gt;
&lt;br /&gt;
=====RP6M256 WiFi: I2C_GPS Library=====&lt;br /&gt;
Die nachfolgende RP6M256_I2C_GPSLib (Eigenentwicklung in GCC) dient zur Ansteuerung des I2C GPS Empfängers durch die RP6M256 WiFi.&lt;br /&gt;
 &lt;br /&gt;
======Libary Header======&lt;br /&gt;
Datei: RP6M256_I2C_GPSLib.h&lt;br /&gt;
&amp;lt;pre&amp;gt;/* ****************************************************************************&lt;br /&gt;
 *                           _______________________&lt;br /&gt;
 *                           \| RP6  ROBOT SYSTEM |/&lt;br /&gt;
 *                            \_-_-_-_-_-_-_-_-_-_/           &amp;gt;&amp;gt;&amp;gt; RP6 M256 WIFI&lt;br /&gt;
 * ----------------------------------------------------------------------------&lt;br /&gt;
 * ----------------------------- [c]2014 - Dirk -------------------------------&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * File: RP6M256_I2C_GPSLib.h&lt;br /&gt;
 * Version: 1.0&lt;br /&gt;
 * Target: RP6 M256 WIFI - ATMEGA2560 @16.00MHz&lt;br /&gt;
 * Author(s): Dirk&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Description:&lt;br /&gt;
 * Header file for new RP6 I2C GPS Receiver library.&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
#ifndef RP6M256_I2C_GPSLIB_H&lt;br /&gt;
#define RP6M256_I2C_GPSLIB_H&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// RP6 Sensor Board:&lt;br /&gt;
&lt;br /&gt;
// If you want to use the RP6 I2C GPS Receiver on the RP6 Sensor Board, you&lt;br /&gt;
// have to define SENSOR_BOARD (default)!&lt;br /&gt;
// If SENSOR_BOARD is NOT defined, this library assumes that the RP6 I2C GPS&lt;br /&gt;
// Receiver is used stand-alone.&lt;br /&gt;
// ------------------&lt;br /&gt;
#define SENSOR_BOARD&lt;br /&gt;
// ------------------&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Includes:&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6M256Lib.h&amp;quot;&lt;br /&gt;
#include &amp;quot;RP6I2CmasterTWI.h&amp;quot;&lt;br /&gt;
#ifdef SENSOR_BOARD&lt;br /&gt;
	#include &amp;quot;RP6M256_Sensor_BoardLib.h&amp;quot;&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// RP6 I2C GPS Receiver:&lt;br /&gt;
#define I2C_GPS_RECEIVER_ADR			0xc8	// Default&lt;br /&gt;
//#define I2C_GPS_RECEIVER_ADR			0xca&lt;br /&gt;
//#define I2C_GPS_RECEIVER_ADR			0xcc&lt;br /&gt;
//#define I2C_GPS_RECEIVER_ADR			0xce&lt;br /&gt;
//#define I2C_GPS_RECEIVER_ADR			0xd0	// DO NOT USE on Sensor Board!&lt;br /&gt;
//#define I2C_GPS_RECEIVER_ADR			0xd2&lt;br /&gt;
//#define I2C_GPS_RECEIVER_ADR			0xd4&lt;br /&gt;
//#define I2C_GPS_RECEIVER_ADR			0xd6&lt;br /&gt;
//#define I2C_GPS_RECEIVER_ADR			0xd8&lt;br /&gt;
//#define I2C_GPS_RECEIVER_ADR			0xda&lt;br /&gt;
//#define I2C_GPS_RECEIVER_ADR			0xdc&lt;br /&gt;
//#define I2C_GPS_RECEIVER_ADR			0xde&lt;br /&gt;
&lt;br /&gt;
// Read registers:&lt;br /&gt;
#define WHO_AM_I						0x20	// I2C address [0xc8..0xde]&lt;br /&gt;
#define LAT_DEG							0x21	// Degrees&lt;br /&gt;
#define LAT_MIN							0x22	// Minutes&lt;br /&gt;
#define LAT_MIN_D_L						0x23	// Minutes decimal part low&lt;br /&gt;
#define LAT_MIN_D_H						0x24	// Minutes decimal part high&lt;br /&gt;
#define LON_DEG							0x25	// Degrees&lt;br /&gt;
#define LON_MIN							0x26	// Minutes&lt;br /&gt;
#define LON_MIN_D_L						0x27	// Minutes decimal part low&lt;br /&gt;
#define LON_MIN_D_H						0x28	// Minutes decimal part high&lt;br /&gt;
#define STATUS							0x29	// Status flags&lt;br /&gt;
#define FIX_IND							0x2a	// FIX_IND&lt;br /&gt;
#define HDOP							0x2b	// HDOP&lt;br /&gt;
#define HDOP_D							0x2c	// HDOP_D&lt;br /&gt;
#define SAT_N							0x2d	// Number of satellites&lt;br /&gt;
#define COURSE_T_L						0x2e	// True heading low byte&lt;br /&gt;
#define COURSE_T_H						0x2f	// True heading high byte&lt;br /&gt;
#define COURSE_T_D						0x30	// Decimal part of course&lt;br /&gt;
#define SPEED_L							0x31	// Speed low byte&lt;br /&gt;
#define SPEED_H							0x32	// Speed high byte&lt;br /&gt;
#define SPEED_D							0x33	// Speed decimal part&lt;br /&gt;
#define ALT_L							0x34	// Altitude low byte&lt;br /&gt;
#define ALT_H							0x35	// Altitude high byte&lt;br /&gt;
#define ALT_DIF_L						0x36	// Differ. WGS-84 MSL low byte&lt;br /&gt;
#define ALT_DIF_H						0x37	// Differ. WGS-84 MSL high byte&lt;br /&gt;
#define UTC_H							0x38	// UTC hour&lt;br /&gt;
#define UTC_MIN							0x39	// UTC minute&lt;br /&gt;
#define UTC_S							0x3a	// UTC second&lt;br /&gt;
#define DAY								0x3b	// Day&lt;br /&gt;
#define YEAR_L							0x3c	// Year low byte&lt;br /&gt;
#define YEAR_H							0x3d	// Year high byte&lt;br /&gt;
#define MONTH							0x3e	// Month&lt;br /&gt;
#define PDOP							0x3f	// PDOP&lt;br /&gt;
#define PDOP_D							0x40	// PDOP_D&lt;br /&gt;
#define VDOP							0x41	// VDOP&lt;br /&gt;
#define VDOP_D							0x42	// VDOP_D&lt;br /&gt;
#define SAT_1							0x43	// SAT # 1&lt;br /&gt;
#define SAT_2							0x44	// SAT # 2&lt;br /&gt;
#define SAT_3							0x45	// SAT # 3&lt;br /&gt;
#define SAT_4							0x46	// SAT # 4&lt;br /&gt;
#define SAT_5							0x47	// SAT # 5&lt;br /&gt;
#define SAT_6							0x48	// SAT # 6&lt;br /&gt;
#define SAT_7							0x49	// SAT # 7&lt;br /&gt;
#define SAT_8							0x4a	// SAT # 8&lt;br /&gt;
#define SAT_9							0x4b	// SAT # 9&lt;br /&gt;
#define SAT_A							0x4c	// SAT # 10&lt;br /&gt;
#define SAT_B							0x4d	// SAT # 11&lt;br /&gt;
#define SAT_C							0x4e	// SAT # 12&lt;br /&gt;
#define SW_VERSION						0x4f	// SW_Version&lt;br /&gt;
#define HEARTBEAT						0x50	// Heartbeat&lt;br /&gt;
&lt;br /&gt;
// Status and Fix_Ind register bitmasks:&lt;br /&gt;
#define STATUS_NS						0b00000001&lt;br /&gt;
#define STATUS_EW						0b00000010&lt;br /&gt;
#define STATUS_SPU						0b00000100&lt;br /&gt;
#define STATUS_AUTON					0b00001000&lt;br /&gt;
#define FIX_IND_UI_FIX					0b10000000&lt;br /&gt;
&lt;br /&gt;
// Write registers:&lt;br /&gt;
#define INIT_CFG						0x90	// INIT CFG&lt;br /&gt;
#define SET_FIX_TIME					0x91	// Pos_Fix_Time&lt;br /&gt;
#define STBY							0x92	// STBY&lt;br /&gt;
#define FAC_RES							0x93	// Factory Reset&lt;br /&gt;
#define EN_JAM							0x94	// Jamming Remover&lt;br /&gt;
#define TEST_MODE						0x96	// Test Mode&lt;br /&gt;
&lt;br /&gt;
// Write register values (commands):&lt;br /&gt;
#define INIT_CFG_HOT_START				1		// Hot Start&lt;br /&gt;
#define INIT_CFG_WARM_START				2		// Warm Start init data loaded&lt;br /&gt;
#define INIT_CFG_WARM_START_EPH_CLR		3		// Warm Start Ephemeris cleared&lt;br /&gt;
#define INIT_CFG_COLD_START				4		// Cold Start&lt;br /&gt;
#define SET_FIX_TIME_1S					1		// Pos Fix Time 1 second&lt;br /&gt;
#define SET_FIX_TIME_2S					2		// Pos Fix Time 2 seconds&lt;br /&gt;
#define STBY_ENTER						1		// Standby (cleared after write)&lt;br /&gt;
#define FAC_RES_ENTER					1		// Factory Reset&lt;br /&gt;
#define EN_JAM_DISABLE					0		// Jamming Remover disable&lt;br /&gt;
#define EN_JAM_ENABLE					1		// Jamming Remover enable&lt;br /&gt;
#define TEST_MODE_INACTIVE				0		// Test Mode inactive&lt;br /&gt;
#define TEST_MODE_ACTIVE				0x15	// Test Mode active&lt;br /&gt;
&lt;br /&gt;
// Data structure (starts at LAT_DEG):&lt;br /&gt;
#define DATA_STRUCT						LAT_DEG	// Start&lt;br /&gt;
// All data from LAT_DEG to HEARTBEAT (48 bytes):&lt;br /&gt;
#define DATA_LENGTH						(HEARTBEAT - LAT_DEG + 1)&lt;br /&gt;
// Basic data from LAT_DEG to SAT_N (13 bytes):&lt;br /&gt;
#define DATA_BASIC						(SAT_N - LAT_DEG + 1)&lt;br /&gt;
&lt;br /&gt;
typedef union {&lt;br /&gt;
 	uint8_t byte;&lt;br /&gt;
	struct {&lt;br /&gt;
		unsigned ns    :1;				// 1: North 0: South&lt;br /&gt;
		unsigned ew    :1;				// 1: East 0: West&lt;br /&gt;
		unsigned spu   :1;				// 1: km/h 0: kn&lt;br /&gt;
		unsigned auton :1;				// 1: Data not valid 0: Autonomous&lt;br /&gt;
		unsigned fix0  :1;&lt;br /&gt;
		unsigned fix1  :1;&lt;br /&gt;
		unsigned stat0 :1;				// Invalid&lt;br /&gt;
		unsigned stat1 :1;				// GPS Com Error&lt;br /&gt;
	};&lt;br /&gt;
	struct {&lt;br /&gt;
		unsigned ns    :1;				// 1: North 0: South&lt;br /&gt;
		unsigned ew    :1;				// 1: East 0: West&lt;br /&gt;
		unsigned spu   :1;				// 1: km/h 0: kn&lt;br /&gt;
		unsigned auton :1;				// 1: Data not valid 0: Autonomous&lt;br /&gt;
		unsigned fix   :2;&lt;br /&gt;
		unsigned stat  :2;				// 00 -&amp;gt; Valid&lt;br /&gt;
										// 01 -&amp;gt; Invalid&lt;br /&gt;
										// 10 -&amp;gt; GPS Com Error&lt;br /&gt;
										// 11 -&amp;gt; n. def.&lt;br /&gt;
	};&lt;br /&gt;
} status_t;&lt;br /&gt;
&lt;br /&gt;
typedef union {&lt;br /&gt;
 	uint8_t byte;&lt;br /&gt;
	struct {							// Fix indicator:&lt;br /&gt;
		unsigned fix_0  :1;				//  1: GPS fix          2: DGPS fix&lt;br /&gt;
		unsigned fix_1  :1;				//  3: PPS fix          4: RTK&lt;br /&gt;
		unsigned fix_2  :1;				//  5: Float RTK        6: Dead reck.&lt;br /&gt;
		unsigned fix_3  :1;				//  7: Manual inp. mode 8: Simul. mode&lt;br /&gt;
		unsigned unused :3;&lt;br /&gt;
		unsigned ui_fix :1;				// HW signal from UC530&lt;br /&gt;
	};&lt;br /&gt;
	struct {&lt;br /&gt;
		unsigned fix    :4;				// See above &amp;quot;Fix indicator&amp;quot;!&lt;br /&gt;
		unsigned unused :3;&lt;br /&gt;
		unsigned ui_fix :1;				// HW signal from UC530&lt;br /&gt;
	};&lt;br /&gt;
} fix_ind_t;&lt;br /&gt;
&lt;br /&gt;
typedef union {&lt;br /&gt;
	struct {&lt;br /&gt;
		uint8_t   latDeg;&lt;br /&gt;
		uint8_t   latMin;&lt;br /&gt;
		uint16_t  latMinDec;&lt;br /&gt;
		uint8_t   lonDeg;&lt;br /&gt;
		uint8_t   lonMin;&lt;br /&gt;
		uint16_t  lonMinDec;&lt;br /&gt;
		status_t  status;&lt;br /&gt;
		fix_ind_t fixInd;&lt;br /&gt;
		uint8_t   hdop;&lt;br /&gt;
		uint8_t   hdopDec;&lt;br /&gt;
		uint8_t   satCount;&lt;br /&gt;
		uint16_t  course;&lt;br /&gt;
		uint8_t   courseDec;&lt;br /&gt;
		uint16_t  speed;&lt;br /&gt;
		uint8_t   speedDec;&lt;br /&gt;
		uint16_t  altitude;&lt;br /&gt;
		uint16_t  altDif;&lt;br /&gt;
		uint8_t   utcHour;&lt;br /&gt;
		uint8_t   utcMinute;&lt;br /&gt;
		uint8_t   utcSec;&lt;br /&gt;
		uint8_t   day;&lt;br /&gt;
		uint16_t  year;&lt;br /&gt;
		uint8_t   month;&lt;br /&gt;
		uint8_t   pdop;&lt;br /&gt;
		uint8_t   pdopDec;&lt;br /&gt;
		uint8_t   vdop;&lt;br /&gt;
		uint8_t   vdopDec;&lt;br /&gt;
		uint8_t   sat[12];&lt;br /&gt;
		uint8_t   swVersion;&lt;br /&gt;
		uint8_t   heartbeat;&lt;br /&gt;
	};&lt;br /&gt;
} gpsdata_t;&lt;br /&gt;
extern gpsdata_t gpsdata;&lt;br /&gt;
&lt;br /&gt;
void I2C_GPS_reset(void);&lt;br /&gt;
void I2C_GPS_write_cmd(uint8_t, uint8_t);&lt;br /&gt;
uint8_t I2C_GPS_read_reg(uint8_t);&lt;br /&gt;
void I2C_GPS_read(uint8_t);&lt;br /&gt;
void I2C_GPS_init(void);&lt;br /&gt;
void I2C_GPS_new_addr(uint8_t);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
/******************************************************************************&lt;br /&gt;
 * Additional info&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Changelog:&lt;br /&gt;
 * &lt;br /&gt;
 *  ---&amp;gt; changes are documented in the file &amp;quot;RP6M256_I2C_GPSLib.c&amp;quot;&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
======Libary Source======&lt;br /&gt;
Datei: RP6M256_I2C_GPSLib.c&lt;br /&gt;
&amp;lt;pre&amp;gt;/* ****************************************************************************&lt;br /&gt;
 *                           _______________________&lt;br /&gt;
 *                           \| RP6  ROBOT SYSTEM |/&lt;br /&gt;
 *                            \_-_-_-_-_-_-_-_-_-_/           &amp;gt;&amp;gt;&amp;gt; RP6 M256 WIFI&lt;br /&gt;
 * ----------------------------------------------------------------------------&lt;br /&gt;
 * ----------------------------- [c]2014 - Dirk -------------------------------&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * File: RP6M256_I2C_GPSLib.c&lt;br /&gt;
 * Version: 1.0&lt;br /&gt;
 * Target: RP6 M256 WIFI - ATMEGA2560 @16.00MHz&lt;br /&gt;
 *         and a RP6 I2C GPS Receiver (CONRAD 1082385)&lt;br /&gt;
 *         optionally on a RP6 Sensor Board (CONRAD 1082384)&lt;br /&gt;
 * Author(s): Dirk&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Description:&lt;br /&gt;
 * &lt;br /&gt;
 * This is our new Library that contains basic routines and functions for&lt;br /&gt;
 * accessing the RP6 I2C GPS Receiver JM3-GPS (CONRAD 1082385).&lt;br /&gt;
 * The library assumes the I2C GPS Receiver software (firmware) v1.2.&lt;br /&gt;
 * If the I2C GPS Receiver is located on the RP6 Sensor Board (CONRAD 1082384)&lt;br /&gt;
 * and connected to the I2C-MODULE plug M1, the RP6M256_Sensor_BoardLib has to&lt;br /&gt;
 * be included!&lt;br /&gt;
 * &lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Includes:&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6M256_I2C_GPSLib.h&amp;quot; 		&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Variables:&lt;br /&gt;
&lt;br /&gt;
uint8_t gpsdataBuf[DATA_LENGTH + 1]; &lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Software reset for the I2C GPS Receiver.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void I2C_GPS_reset(void)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_GPS_RECEIVER_ADR, 0, 0x06);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Writes a command cmd to a register reg of the&lt;br /&gt;
 * I2C GPS Receiver.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: reg -&amp;gt; Write register [0x90..0x96]&lt;br /&gt;
 *        cmd -&amp;gt; Command&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void I2C_GPS_write_cmd(uint8_t reg, uint8_t cmd)&lt;br /&gt;
{&lt;br /&gt;
	if((reg &amp;lt; INIT_CFG) || (reg &amp;gt; TEST_MODE)) return;&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_GPS_RECEIVER_ADR, reg, cmd);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Reads a single register reg from the I2C GPS&lt;br /&gt;
 * Receiver.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: reg -&amp;gt; Read register [0x20..0x50]&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
uint8_t I2C_GPS_read_reg(uint8_t reg)&lt;br /&gt;
{&lt;br /&gt;
	if((reg &amp;lt; WHO_AM_I) || (reg &amp;gt; HEARTBEAT)) reg = WHO_AM_I;&lt;br /&gt;
	I2CTWI_transmitByte(I2C_GPS_RECEIVER_ADR, reg);&lt;br /&gt;
	return (I2CTWI_readByte(I2C_GPS_RECEIVER_ADR));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
gpsdata_t gpsdata;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Reads the GPS data from the I2C GPS Receiver.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: length -&amp;gt; Number of data bytes [1..48]&lt;br /&gt;
 *&lt;br /&gt;
 * Hint: If length = DATA_BASIC, only basic GPS&lt;br /&gt;
 *       data are read. If length = DATA_LENGTH,&lt;br /&gt;
 *       ALL GPS data are read.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void I2C_GPS_read(uint8_t length)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t i;&lt;br /&gt;
&lt;br /&gt;
	if(length &amp;gt; DATA_LENGTH) length = DATA_LENGTH;&lt;br /&gt;
	I2CTWI_readRegisters(I2C_GPS_RECEIVER_ADR, DATA_STRUCT, gpsdataBuf, length);&lt;br /&gt;
	for(i = length; i &amp;lt; DATA_LENGTH; i++) {&lt;br /&gt;
		gpsdataBuf[i] = 0;&lt;br /&gt;
	}&lt;br /&gt;
	gpsdata.latDeg = gpsdataBuf[0];&lt;br /&gt;
	gpsdata.latMin = gpsdataBuf[1];&lt;br /&gt;
	gpsdata.latMinDec = gpsdataBuf[2] + (gpsdataBuf[3] &amp;lt;&amp;lt; 8);&lt;br /&gt;
	gpsdata.lonDeg = gpsdataBuf[4];&lt;br /&gt;
	gpsdata.lonMin = gpsdataBuf[5];&lt;br /&gt;
	gpsdata.lonMinDec = gpsdataBuf[6] + (gpsdataBuf[7] &amp;lt;&amp;lt; 8);&lt;br /&gt;
	gpsdata.status.byte = gpsdataBuf[8];&lt;br /&gt;
	gpsdata.fixInd.byte = gpsdataBuf[9];&lt;br /&gt;
	gpsdata.hdop = gpsdataBuf[10];&lt;br /&gt;
	gpsdata.hdopDec = gpsdataBuf[11];&lt;br /&gt;
	gpsdata.satCount = gpsdataBuf[12];&lt;br /&gt;
	if(length == DATA_BASIC) return;&lt;br /&gt;
	gpsdata.course = gpsdataBuf[13] + (gpsdataBuf[14] &amp;lt;&amp;lt; 8);&lt;br /&gt;
	gpsdata.courseDec = gpsdataBuf[15];&lt;br /&gt;
	gpsdata.speed = gpsdataBuf[16] + (gpsdataBuf[17] &amp;lt;&amp;lt; 8);&lt;br /&gt;
	gpsdata.speedDec = gpsdataBuf[18];&lt;br /&gt;
	gpsdata.altitude = gpsdataBuf[19] + (gpsdataBuf[20] &amp;lt;&amp;lt; 8);&lt;br /&gt;
	gpsdata.altDif = gpsdataBuf[21] + (gpsdataBuf[22] &amp;lt;&amp;lt; 8);&lt;br /&gt;
	gpsdata.utcHour = gpsdataBuf[23];&lt;br /&gt;
	gpsdata.utcMinute = gpsdataBuf[24];&lt;br /&gt;
	gpsdata.utcSec = gpsdataBuf[25];&lt;br /&gt;
	gpsdata.day = gpsdataBuf[26];&lt;br /&gt;
	gpsdata.year = gpsdataBuf[27] + (gpsdataBuf[28] * 100);&lt;br /&gt;
	gpsdata.month = gpsdataBuf[29];&lt;br /&gt;
	gpsdata.pdop = gpsdataBuf[30];&lt;br /&gt;
	gpsdata.pdopDec = gpsdataBuf[31];&lt;br /&gt;
	gpsdata.vdop = gpsdataBuf[32];&lt;br /&gt;
	gpsdata.vdopDec = gpsdataBuf[33];&lt;br /&gt;
	for(i = 34; i &amp;lt; 46; i++) {&lt;br /&gt;
		gpsdata.sat[i - 34] = gpsdataBuf[i];&lt;br /&gt;
	}&lt;br /&gt;
	gpsdata.swVersion = gpsdataBuf[46];&lt;br /&gt;
	gpsdata.heartbeat = gpsdataBuf[47];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * You MUST call this function at the beginning of a&lt;br /&gt;
 * main program, that uses the RP6 I2C GPS Receiver. &lt;br /&gt;
 * If SENSOR_BOARD is defined, the I2C-MODULE power&lt;br /&gt;
 * will be switched on with the function&lt;br /&gt;
 * setI2CModulePower() defined in the&lt;br /&gt;
 * RP6M256_Sensor_BoardLib, which will be included&lt;br /&gt;
 * then.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void I2C_GPS_init(void)&lt;br /&gt;
{&lt;br /&gt;
#ifdef SENSOR_BOARD&lt;br /&gt;
	// I2C-MODULE (plug M1) power on: &lt;br /&gt;
	setI2CModulePower(1);&lt;br /&gt;
#endif&lt;br /&gt;
	// Other init procedures here!&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Writes a new I2C address to the I2C GPS Receiver.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: addr -&amp;gt; New I2C address [0xc8..0xde]&lt;br /&gt;
 *&lt;br /&gt;
 * Hints: - Default I2C address is 0xc8.&lt;br /&gt;
 *        - You may choose a new I2C address in&lt;br /&gt;
 *          the range 0xc8..0xde.&lt;br /&gt;
 *        - After writing a new address you have&lt;br /&gt;
 *          to switch the I2C GPS Receiver off&lt;br /&gt;
 *          and on again.&lt;br /&gt;
 *        - Definition I2C_GPS_RECEIVER_ADR must&lt;br /&gt;
 *          be adapted to the new I2C address!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void I2C_GPS_new_addr(uint8_t addr)&lt;br /&gt;
{&lt;br /&gt;
	if((addr &amp;lt; 0xc8) || (addr &amp;gt; 0xde)) return;&lt;br /&gt;
	addr &amp;amp;= 0xfe;								// Clear R/W bit&lt;br /&gt;
	I2CTWI_transmit3Bytes(I2C_GPS_RECEIVER_ADR, 0, 0x04, addr);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&lt;br /&gt;
/******************************************************************************&lt;br /&gt;
 * Additional info&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Changelog:&lt;br /&gt;
 * - v. 1.0 (initial release) 21.04.2014 by Dirk&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Erklärung&lt;br /&gt;
&lt;br /&gt;
======Demo======&lt;br /&gt;
makefile:&lt;br /&gt;
&amp;lt;pre&amp;gt;...&lt;br /&gt;
TARGET = RP6M256_Sensor_Board_02&lt;br /&gt;
...&lt;br /&gt;
SRC += $(RP6_LIB_PATH)/RP6common/RP6I2CmasterTWI.c&lt;br /&gt;
&lt;br /&gt;
SRC += $(RP6_LIB_PATH)/RP6control_M256_WIFI/RP6M256_Sensor_BoardLib.c&lt;br /&gt;
SRC += $(RP6_LIB_PATH)/RP6control_M256_WIFI/RP6M256_I2C_GPSLib.c&lt;br /&gt;
...&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Datei: RP6M256_Sensor_Board_02.c&lt;br /&gt;
&amp;lt;pre&amp;gt;/* &lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * RP6 ROBOT SYSTEM - RP6 CONTROL M256 Examples&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Example: RP6M256 Sensor Board&lt;br /&gt;
 * Author(s): Dirk&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Description:&lt;br /&gt;
 * In this example we show a second test for the RP6 Sensor Board.&lt;br /&gt;
 * &lt;br /&gt;
 * ############################################################################&lt;br /&gt;
 * The Robot does NOT move in this example! You can simply put it on a table&lt;br /&gt;
 * next to your PC and you should connect it to the PC via the USB Interface!&lt;br /&gt;
 * You should also connect to it via WIFI.&lt;br /&gt;
 * ############################################################################&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Includes:&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6M256Lib.h&amp;quot; 				// The RP6 M256 Library. &lt;br /&gt;
										// Always needs to be included!&lt;br /&gt;
#include &amp;quot;RP6I2CmasterTWI.h&amp;quot;			// Include the I2C-Bus Master Library&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Include our new &amp;quot;RP6M256 I2C GPS Receiver library&amp;quot;:&lt;br /&gt;
// (This is the library for accessing the RP6 I2C GPS Receiver!)&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6M256_I2C_GPSLib.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Write a floating point number to the WIFI.&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *&lt;br /&gt;
 *			// Write a floating point number to the WIFI (no exponent):&lt;br /&gt;
 *			writeDouble_WIFI(1234567.890, 11, 3);&lt;br /&gt;
 *&lt;br /&gt;
 * The value of prec (precision) defines the number of decimal places.&lt;br /&gt;
 * For 32 bit floating point variables (float, double ...) 6 is&lt;br /&gt;
 * the max. value for prec (7 relevant digits).&lt;br /&gt;
 * The value of width defines the overall number of characters in the&lt;br /&gt;
 * floating point number including the decimal point. The number of&lt;br /&gt;
 * pre-decimal positions is: (width - prec - 1).&lt;br /&gt;
 */&lt;br /&gt;
void writeDouble_WIFI(double number, uint8_t width, uint8_t prec)&lt;br /&gt;
{char buffer[width + 1];&lt;br /&gt;
	dtostrf(number, width, prec, &amp;amp;buffer[0]);&lt;br /&gt;
	writeString_WIFI(&amp;amp;buffer[0]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Write a floating point number to the LCD.&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *&lt;br /&gt;
 *			// Write a floating point number to the LCD (no exponent):&lt;br /&gt;
 *			writeDoubleLCD(1234567.890, 11, 3);&lt;br /&gt;
 *&lt;br /&gt;
 * The value of prec (precision) defines the number of decimal places.&lt;br /&gt;
 * For 32 bit floating point variables (float, double ...) 6 is&lt;br /&gt;
 * the max. value for prec (7 relevant digits).&lt;br /&gt;
 * The value of width defines the overall number of characters in the&lt;br /&gt;
 * floating point number including the decimal point. The number of&lt;br /&gt;
 * pre-decimal positions is: (width - prec - 1).&lt;br /&gt;
 */&lt;br /&gt;
void writeDoubleLCD(double number, uint8_t width, uint8_t prec)&lt;br /&gt;
{char buffer[width + 1];&lt;br /&gt;
	dtostrf(number, width, prec, &amp;amp;buffer[0]);&lt;br /&gt;
	writeStringLCD(&amp;amp;buffer[0]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Error handler&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function gets called automatically if there was an I2C Error like&lt;br /&gt;
 * the slave sent a &amp;quot;not acknowledge&amp;quot; (NACK, error codes e.g. 0x20 or 0x30).&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void I2C_transmissionError(uint8_t errorState)&lt;br /&gt;
{&lt;br /&gt;
	writeString_P_WIFI(&amp;quot;\nI2C ERROR - TWI STATE: 0x&amp;quot;);&lt;br /&gt;
	writeInteger_WIFI(errorState, HEX);&lt;br /&gt;
	writeChar_WIFI('\n');&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Main function - The program starts here:&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
	initRP6M256();    // Always call this first! The Processor will not work&lt;br /&gt;
					  // correctly otherwise. &lt;br /&gt;
&lt;br /&gt;
	initLCD(); // Initialize the LC-Display (LCD)&lt;br /&gt;
			   // Always call this before using the LCD!&lt;br /&gt;
&lt;br /&gt;
	setLEDs(0b1111);&lt;br /&gt;
	mSleep(500);&lt;br /&gt;
	setLEDs(0b0000);&lt;br /&gt;
&lt;br /&gt;
	writeString_P_WIFI(&amp;quot;\n\nRP6 Sensor Board Selftest 2!\n&amp;quot;); &lt;br /&gt;
&lt;br /&gt;
	// IMPORTANT:&lt;br /&gt;
	I2CTWI_initMaster(100); // Initialize the TWI Module for Master operation&lt;br /&gt;
							// with 100kHz SCL Frequency&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	// Register the event handler:&lt;br /&gt;
	I2CTWI_setTransmissionErrorHandler(I2C_transmissionError);&lt;br /&gt;
&lt;br /&gt;
	setLEDs(0b1111);&lt;br /&gt;
&lt;br /&gt;
	// Write a text message to the LCD:&lt;br /&gt;
	showScreenLCD(&amp;quot;################&amp;quot;, &amp;quot;################&amp;quot;);&lt;br /&gt;
	mSleep(1500);&lt;br /&gt;
	showScreenLCD(&amp;quot;RP6v2-M256-WIFI &amp;quot;, &amp;quot;Example Program&amp;quot;);&lt;br /&gt;
	mSleep(2500); &lt;br /&gt;
	showScreenLCD(&amp;quot;RP6 Sensor Board&amp;quot;, &amp;quot;   Selftest 2&amp;quot;);&lt;br /&gt;
	mSleep(2500);&lt;br /&gt;
	clearLCD();&lt;br /&gt;
&lt;br /&gt;
	setLEDs(0b0000);&lt;br /&gt;
&lt;br /&gt;
	// ---------------------------------------&lt;br /&gt;
&lt;br /&gt;
	uint8_t onoff = 0;&lt;br /&gt;
	uint8_t i;&lt;br /&gt;
&lt;br /&gt;
	startStopwatch1();&lt;br /&gt;
	startStopwatch2();&lt;br /&gt;
&lt;br /&gt;
	// IMPORTANT:&lt;br /&gt;
	sensor_board_init();						// RP6 Sensor Board init!!!&lt;br /&gt;
	I2C_GPS_init();								// RP6 I2C GPS Receiver init&lt;br /&gt;
&lt;br /&gt;
	while(true) &lt;br /&gt;
	{&lt;br /&gt;
		if(getStopwatch1() &amp;gt; 1000) // 1s&lt;br /&gt;
		{&lt;br /&gt;
			if (onoff) onoff = 0;&lt;br /&gt;
			else onoff = 1;&lt;br /&gt;
&lt;br /&gt;
			// Show GPS data:&lt;br /&gt;
			I2C_GPS_read(DATA_LENGTH);			// Read data&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nLAT_DEG:     &amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.latDeg, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;° &amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.latMin, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;.&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.latMinDec, DEC, 4);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;' &amp;quot;);&lt;br /&gt;
			if(gpsdata.status.ns)&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;N&amp;quot;);&lt;br /&gt;
			else&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;S&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nLON_DEG:    &amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.lonDeg, DEC, 3);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;° &amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.lonMin, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;.&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.lonMinDec, DEC, 4);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;' &amp;quot;);&lt;br /&gt;
			if(gpsdata.status.ew)&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;E&amp;quot;);&lt;br /&gt;
			else&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;W&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nSTATUS:     &amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.status.byte, BIN, 8);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nFIX_IND:    &amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.fixInd.byte, BIN, 8);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nHDOP:       &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(gpsdata.hdop, DEC);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;.&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.hdopDec, DEC, 2);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nSAT_N:      &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(gpsdata.satCount, DEC);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nCOURSE_T:   &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(gpsdata.course, DEC);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;.&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.courseDec, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;°&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nSPEED:      &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(gpsdata.speed, DEC);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;.&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.speedDec, DEC, 2);&lt;br /&gt;
			if(gpsdata.status.spu)&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;km/h&amp;quot;);&lt;br /&gt;
			else&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;kn&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nALT:        &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(gpsdata.altitude, DEC);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;m\nALT_DIF:    &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(gpsdata.altDif, DEC);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;m\nUTC:        &amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.utcHour, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;:&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.utcMinute, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;:&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.utcSec, DEC, 2);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nDATE:       &amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.day, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;.&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.month, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;.&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.year, DEC, 4);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nPDOP:       &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(gpsdata.pdop, DEC);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;.&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.pdopDec, DEC, 2);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nVDOP:       &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(gpsdata.vdop, DEC);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;.&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.vdopDec, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			for(i = 0; i &amp;lt; gpsdata.satCount; i++) {&lt;br /&gt;
				if(i == 8) writeString_P_WIFI(&amp;quot;\n&amp;quot;);&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;  SAT_&amp;quot;);&lt;br /&gt;
				writeIntegerLength_WIFI(i + 1, HEX, 1);&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;: &amp;quot;);&lt;br /&gt;
				writeInteger_WIFI(gpsdata.sat[i], DEC);&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nSW_VERSION: &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(gpsdata.swVersion, DEC);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nHEARTBEAT:  &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(gpsdata.heartbeat, DEC);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			// RP6 Sensor Board shutdown (button &amp;amp; status LED test):&lt;br /&gt;
			if (pressedButton) {&lt;br /&gt;
				setStatusLED(1);&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;\nPress button again for RP6 Sensor Board SHUTDOWN!\n&amp;quot;);&lt;br /&gt;
				mSleep(2000);&lt;br /&gt;
				do {&lt;br /&gt;
					if(getStopwatch2() &amp;gt; 200) { // 0.2s&lt;br /&gt;
						if (onoff) onoff = 0;&lt;br /&gt;
						else onoff = 1;&lt;br /&gt;
						if (onoff) setStatusLED(1);&lt;br /&gt;
						else setStatusLED(0);&lt;br /&gt;
						setStopwatch2(0);&lt;br /&gt;
					}&lt;br /&gt;
					mSleep(1);&lt;br /&gt;
					task_I2CTWI();&lt;br /&gt;
				} while (!readButton());&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;\n\n\n\n\nPlease wait for RP6 Sensor Board SHUTDOWN...\n&amp;quot;);&lt;br /&gt;
				sensor_board_shutdown();&lt;br /&gt;
				mSleep(3000);&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;\n\n\nThe RP6 Sensor Board now is in SHUTDOWN MODE!!!\n&amp;quot;);&lt;br /&gt;
				mSleep(1000);&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;\nRESET the M256 microcontroller now...\n\n&amp;quot;);&lt;br /&gt;
				while(true) {};&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			setStopwatch1(0);&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		task_RP6SensorBoard();					// RP6 Sensor Board task&lt;br /&gt;
&lt;br /&gt;
		task_I2CTWI();&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Erklärung&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Gyro Modul JM3-GYRO====&lt;br /&gt;
=====Dokumentation=====&lt;br /&gt;
Die Dokumentation zum Gyro Modul befindet sich auf der mitgelieferten ''&amp;quot;RP6 Robot System Xtra Modules CD-ROM&amp;quot;''.&lt;br /&gt;
&lt;br /&gt;
======Manuals======&lt;br /&gt;
Das Handbuch in der aktuellen Version kann [http://www.jm3-engineering.com/download/doc/ManualGyroModule_de.pdf hier] eingesehen werden.&lt;br /&gt;
&lt;br /&gt;
=====Demo-Programme=====&lt;br /&gt;
Ein Demo-Programm zum Gyro Modul befindet sich integriert in die RP6 Sensor Board Demo auf der mitgelieferten ''&amp;quot;RP6 Robot System Xtra Modules CD-ROM&amp;quot;''. Diese Demo kann auch in der aktuellen Version im Download Bereich von [http://www.jm3-engineering.com/downloads.htm JM3 Engineering] herunter geladen werden.&lt;br /&gt;
&lt;br /&gt;
=====Analoge Auswertung=====&lt;br /&gt;
Am Pin ''OUT'' des Gyro Moduls (siehe [http://www.rn-wissen.de/index.php/RP6_Sensor_Board_und_Xtra_Module#Anschluss-Schema_2 Anschluss-Schema]!) liegt die Ausgangsspannung des Sensors (0..5V) an. Sie kann mit einem ADC-Eingang eines Microcontrollers gemessen werden.&lt;br /&gt;
Syntax mit den Libraries der RP6Base, M32 oder M256 WiFi (ADC Kanal 0):&lt;br /&gt;
 uint16_t result = readADC(0);&lt;br /&gt;
In der C-Control-Pro Umgebung der M128 sieht das z.B. in CompactC so aus (ADC Kanal 0):&lt;br /&gt;
 word result;&lt;br /&gt;
 ADC_Set(ADC_VREF_VCC, 0);&lt;br /&gt;
 ...&lt;br /&gt;
 result = ADC_Read();&lt;br /&gt;
Das Ergebnis ''result'' kann noch zur Weiterverarbeitung angepasst werden:&lt;br /&gt;
 #define ADCVAL_ZERORATE_LEVEL			511		// Zero rate Level&lt;br /&gt;
 ...&lt;br /&gt;
 int16_t z_axisg = result - ADCVAL_ZERORATE_LEVEL;&lt;br /&gt;
Dadurch zeigt ''z_axisg'' Null an, wenn keine Rotation anliegt und wird positiv, wenn nach LINKS gedreht wird und negativ bei RECHTS-Drehung. Die Definition ADCVAL_ZERORATE_LEVEL muss natürlich an den eigenen Sensor-Nullwert angepasst werden.&lt;br /&gt;
&lt;br /&gt;
Aus dem Absolutwert von ''z_axisg'' kann man die Drehrate (Drehgeschwindigkeit) auch bestimmen:&lt;br /&gt;
&lt;br /&gt;
In den [[RP6_Sensor_Board_und_Xtra_Module#Technische_Daten_3|Technischen Daten]] ist die Empfindlichkeit des Sensors mit '''10mV/dps''' (0,01V pro Grad und Sekunde) angegeben. Damit errechnet sich die Drehrate als:&lt;br /&gt;
 Drehrate [dps] = abs(z_axisg) * (5 / 1024 / 0.01) = abs(z_axisg) * 0.48828125&lt;br /&gt;
&lt;br /&gt;
=====Optionale Ansteuerung=====&lt;br /&gt;
Im [[RP6_Sensor_Board_und_Xtra_Module#Anschluss-Schema_2|Anschluss-Schema]] ist erkennbar, dass es noch 2 Steuerleitungen ''SLEEP/PD'' und ''ST'' gibt. Mit diesen Anschlüssen kann die Betriebsart des Gyro Moduls festgelegt werden, siehe nachfolgende Tabelle:&lt;br /&gt;
{|  {{Blauetabelle}} &lt;br /&gt;
|Betriebsart&lt;br /&gt;
|ST&lt;br /&gt;
|SLEEP/PD&lt;br /&gt;
|Stromverbrauch&lt;br /&gt;
|-&lt;br /&gt;
|Normal&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|4,2mA&lt;br /&gt;
|-&lt;br /&gt;
|Sleep&lt;br /&gt;
|0&lt;br /&gt;
|1&lt;br /&gt;
|2,2mA&lt;br /&gt;
|-&lt;br /&gt;
|Self-test&lt;br /&gt;
|1&lt;br /&gt;
|0&lt;br /&gt;
|4,2mA&lt;br /&gt;
|-&lt;br /&gt;
|Power-down&lt;br /&gt;
|1&lt;br /&gt;
|1&lt;br /&gt;
|'''5µA'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
Will man zwischen den Betriebsarten per Software umschalten, muss man die beiden Steuerleitungen mit I/O Portpins des Microcontrollers verbinden, die als Ausgänge konfiguriert sind. Braucht man diese Funktion nicht, reicht es, ''ST'' und ''SLEEP/PD'' mit GND zu verbinden (Betriebsart &amp;quot;Normal&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====3D Accelerometer Modul JM3-3DA====&lt;br /&gt;
Das 3D Accelerometer Modul kann über den I2C- oder den SPI-Bus angesteuert werden. Wird das Modul auf der RP6 CONTROL M32 Platine betrieben (es sitzt also auf dem Sockel IC5 für das 2. SPI-EEPROM), dann erfolgt die Ansteuerung über den SPI-Bus. Die SPI-Grundfunktionen befinden sich in der RP6ControlLib, die daher eingebunden werden muss.&lt;br /&gt;
&lt;br /&gt;
=====Dokumentation=====&lt;br /&gt;
Die Dokumentation zum 3D Accelerometer Modul befindet sich auf der mitgelieferten ''&amp;quot;RP6 Robot System Xtra Modules CD-ROM&amp;quot;''.&lt;br /&gt;
&lt;br /&gt;
======Manuals======&lt;br /&gt;
Das Handbuch in der aktuellen Version kann [http://www.jm3-engineering.com/download/doc/Manual3DAccelerometer_de.pdf hier] eingesehen werden.&lt;br /&gt;
&lt;br /&gt;
=====Demo-Programme=====&lt;br /&gt;
Ein Demo-Programm zum 3D Accelerometer Modul befindet sich integriert in die RP6 Sensor Board Demo auf der mitgelieferten ''&amp;quot;RP6 Robot System Xtra Modules CD-ROM&amp;quot;''. Diese Demo kann auch in der aktuellen Version im Download Bereich von [http://www.jm3-engineering.com/downloads.htm JM3 Engineering] herunter geladen werden.&lt;br /&gt;
&lt;br /&gt;
=====RP6 CONTROL M32: ACCSENS Library=====&lt;br /&gt;
Die nachfolgende RP6ControlACCSENSLib (Eigenentwicklung in GCC) dient zur Ansteuerung des 3D Accelerometer Moduls durch die RP6 CONTROL M32.&lt;br /&gt;
&lt;br /&gt;
======Configuration Header======&lt;br /&gt;
Vor dem Kompilieren der Library muss eine Anpassung des Configuration Headers an die eigenen Hardware-Voraussetzungen erfolgen.&lt;br /&gt;
Dazu gibt es im Configuration Header eine Definition:&lt;br /&gt;
* EXP_STACK_1 -&amp;gt; Die RP6 CONTROL M32 sitzt auf dem vorderen Platinenstapel 1 des RP6&lt;br /&gt;
Im nachfolgenden Listing ist die Definition EXP_STACK_1 NICHT aktiv (d.h. die M32 sitzt auf dem hinteren Platinenstapel 2!). Dies muss an die eigene Hardware angepaßt werden. Wenn die RP6 CONTROL M32 auf dem vorderen Platinenstapel 1 des RP6 sitzt, muss die Zeile mit &amp;quot;EXP_STACK_1&amp;quot; &amp;quot;aktiviert&amp;quot; werden. Dazu entfernt man &amp;quot;//&amp;quot; am Zeilenanfang:&lt;br /&gt;
 #define EXP_STACK_1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Bevor man den Beschleunigungssensor nutzen kann, muss man ihn kalibrieren:&lt;br /&gt;
&lt;br /&gt;
'''Accelerometer:'''&lt;br /&gt;
* Die X-Achse wird kalibriert, indem man den RP6 mit der rechten Seite nach unten hält und den Maximalwert in MAX_X_A einträgt. Dann neigt man ihn auf seine linke Seite und trägt den negativen Maximalwert in MIN_X_A ein.&lt;br /&gt;
* Die Y-Achse wird kalibriert, indem man den RP6 mit der Vorderseite nach oben hält und den Maximalwert in MAX_Y_A einträgt. Dann kippt man die Vorderseite nach unten und trägt den negativen Maximalwert in MIN_Y_A ein.&lt;br /&gt;
* Die Z-Achse wird kalibriert, indem man den RP6 normal waagerecht hält und den Maximalwert in MAX_Z_A einträgt. Dann dreht man den RP6 &amp;quot;auf den Kopf&amp;quot; und trägt den negativen Maximalwert in MIN_Z_A ein.&lt;br /&gt;
* Sollten die angezeigten Pitch- und Roll-Werte nach der Kalibrierung der Achsen und genau waagerecht stehendem Sensor bzw. RP6 vom Nullwert deutlich abweichen, kann man sie mithilfe der Definitionen OFFSET_PITCH_A und OFFSET_ROLL_A &amp;quot;nullen&amp;quot;. Die Einheit dieser Definitionen ist °.&lt;br /&gt;
Nach dem Eintragen der Kalibrierungswerte muss das Programm neu kompiliert werden!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Datei: RP6ControlACCSENS.h&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;/* ****************************************************************************&lt;br /&gt;
 *                           _______________________&lt;br /&gt;
 *                           \| RP6  ROBOT SYSTEM |/&lt;br /&gt;
 *                            \_-_-_-_-_-_-_-_-_-_/             &amp;gt;&amp;gt;&amp;gt; RP6 CONTROL&lt;br /&gt;
 * ----------------------------------------------------------------------------&lt;br /&gt;
 * ----------------------------- [c]2014 - Dirk -------------------------------&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * File: RP6ControlACCSENS.h&lt;br /&gt;
 * Version: 1.0&lt;br /&gt;
 * Target: RP6 CONTROL - ATMEGA32 @16.00MHz&lt;br /&gt;
 * Author(s): Dirk&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Description:&lt;br /&gt;
 * Configuration header file for new ACCSENS library.&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * THE CHANGELOG CAN BE FOUND AT THE END OF THIS FILE!&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
#ifndef RP6CONTROLACCSENS_H&lt;br /&gt;
#define RP6CONTROLACCSENS_H&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Sensor position on the RP6 robot:&lt;br /&gt;
// (If EXP_STACK_1 is defined, the RP6 CONTROL M32 is located on the front&lt;br /&gt;
//  stack for addon boards on the RP6 robot. If EXP_STACK_1 is NOT defined&lt;br /&gt;
//  (default), the RP6 CONTROL M32 is mounted on the rear stack.)&lt;br /&gt;
// -------------------&lt;br /&gt;
//#define EXP_STACK_1&lt;br /&gt;
// -------------------&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// The following sensor is used:&lt;br /&gt;
// - 3D Accelerometer Modul (CONRAD 1082387-62) with LIS302DLH 3-axis&lt;br /&gt;
//   accelerometer&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// LIS302DLH accelerometer calibration data:&lt;br /&gt;
#define MAX_X_A						32767		// Max. X-axis value&lt;br /&gt;
#define MIN_X_A						-32768		// Min. X-axis value&lt;br /&gt;
#define MAX_Y_A						32767		// Max. Y-axis value&lt;br /&gt;
#define MIN_Y_A						-32768		// Min. Y-axis value&lt;br /&gt;
#define MAX_Z_A						32767		// Max. Z-axis value&lt;br /&gt;
#define MIN_Z_A						-32768		// Min. Z-axis value&lt;br /&gt;
#define OFFSET_PITCH_A				0.0			// Offset Pitch [°]&lt;br /&gt;
#define OFFSET_ROLL_A				0.0			// Offset Roll [°]&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
/******************************************************************************&lt;br /&gt;
 * Additional info&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Changelog:&lt;br /&gt;
 * &lt;br /&gt;
 *  ---&amp;gt; changes are documented in the file &amp;quot;RP6ControlACCSENSLib.c&amp;quot;&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
======Library Header======&lt;br /&gt;
Datei: RP6ControlACCSENSLib.h&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;/* ****************************************************************************&lt;br /&gt;
 *                           _______________________&lt;br /&gt;
 *                           \| RP6  ROBOT SYSTEM |/&lt;br /&gt;
 *                            \_-_-_-_-_-_-_-_-_-_/             &amp;gt;&amp;gt;&amp;gt; RP6 CONTROL&lt;br /&gt;
 * ----------------------------------------------------------------------------&lt;br /&gt;
 * ----------------------------- [c]2014 - Dirk -------------------------------&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * File: RP6ControlACCSENSLib.h&lt;br /&gt;
 * Version: 1.0&lt;br /&gt;
 * Target: RP6 CONTROL - ATMEGA32 @16.00MHz&lt;br /&gt;
 * Author(s): Dirk&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Description:&lt;br /&gt;
 * This is the RP6ControlACCSENSLib header file.&lt;br /&gt;
 * You have to include this file, if you want to use the library&lt;br /&gt;
 * RP6ControlACCSENSLib.c in your own projects.&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * THE CHANGELOG CAN BE FOUND AT THE END OF THIS FILE!&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
#ifndef RP6CONTROLACCSENSLIB_H&lt;br /&gt;
#define RP6CONTROLACCSENSLIB_H&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Includes:&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6ControlLib.h&amp;quot; 		// The RP6 Control Library (v. 1.1 or higher). &lt;br /&gt;
#include &amp;quot;RP6ControlACCSENS.h&amp;quot;&lt;br /&gt;
#include &amp;lt;math.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&lt;br /&gt;
#define ACC_CS							MEM_CS2&lt;br /&gt;
#define DEVICE_IDENTIFIER				0x32&lt;br /&gt;
&lt;br /&gt;
// Registers:&lt;br /&gt;
#define WHO_AM_I						0x0f&lt;br /&gt;
#define CTRL_REG1						0x20&lt;br /&gt;
#define CTRL_REG2						0x21&lt;br /&gt;
#define CTRL_REG3						0x22&lt;br /&gt;
#define CTRL_REG4						0x23&lt;br /&gt;
#define CTRL_REG5						0x24&lt;br /&gt;
#define HP_FILTER_RESET					0x25&lt;br /&gt;
#define REFERENCE						0x26&lt;br /&gt;
#define STATUS_REG						0x27&lt;br /&gt;
#define OUT_X_L							0x28&lt;br /&gt;
#define OUT_X_H							0x29&lt;br /&gt;
#define OUT_Y_L							0x2a&lt;br /&gt;
#define OUT_Y_H							0x2b&lt;br /&gt;
#define OUT_Z_L							0x2c&lt;br /&gt;
#define OUT_Z_H							0x2d&lt;br /&gt;
#define INT1_CFG						0x30&lt;br /&gt;
#define INT1_SOURCE						0x31&lt;br /&gt;
#define INT1_THS						0x32&lt;br /&gt;
#define INT1_DURATION					0x33&lt;br /&gt;
#define INT2_CFG						0x34&lt;br /&gt;
#define INT2_SOURCE						0x35&lt;br /&gt;
#define INT2_THS						0x36&lt;br /&gt;
#define INT2_DURATION					0x37&lt;br /&gt;
&lt;br /&gt;
// Control Register bitmasks:&lt;br /&gt;
#define CTRL_REG1_POWERDOWN				0b00000000&lt;br /&gt;
#define CTRL_REG1_3D_DEFAULT			0b00000111&lt;br /&gt;
#define CTRL_REG1_3D_LOPWR_10HZ			0b11000111&lt;br /&gt;
#define CTRL_REG2_DEFAULT				0b00000000&lt;br /&gt;
#define CTRL_REG3_DEFAULT				0b00000000&lt;br /&gt;
#define CTRL_REG4_DEFAULT				0b00000000&lt;br /&gt;
#define CTRL_REG4_BDU_2G				0b10000000&lt;br /&gt;
#define CTRL_REG4_BDU_2G_STSIGN			0b10001000&lt;br /&gt;
#define CTRL_REG4_BDU_BLE_2G			0b11000000&lt;br /&gt;
#define CTRL_REG4_BDU_BLE_2G_STSIGN		0b11001000&lt;br /&gt;
#define CTRL_REG5_DEFAULT				0b00000000&lt;br /&gt;
&lt;br /&gt;
// Read/write address bitmasks:&lt;br /&gt;
#define READ_MASK						0b10000000&lt;br /&gt;
#define READ_AUTOINC_MASK				0b11000000&lt;br /&gt;
#define WRITE_MASK						0b01111111&lt;br /&gt;
&lt;br /&gt;
extern int16_t x_axisa, y_axisa, z_axisa;&lt;br /&gt;
extern double pitch, roll;&lt;br /&gt;
extern double xa, ya, za;&lt;br /&gt;
extern double the, phi;&lt;br /&gt;
&lt;br /&gt;
uint8_t SPI_ACCSENS_readByte(uint8_t regAddr);&lt;br /&gt;
void SPI_ACCSENS_readBytes(uint8_t startAddr, uint8_t *buffer, uint8_t length);&lt;br /&gt;
void SPI_ACCSENS_writeByte(uint8_t regAddr, uint8_t data);&lt;br /&gt;
uint8_t SPI_ACCSENS_getStatus(void);&lt;br /&gt;
&lt;br /&gt;
void SPI_ACCSENS_init(void);&lt;br /&gt;
void SPI_ACCSENS_shutdown(void);&lt;br /&gt;
void SPI_ACCSENS_read(void);&lt;br /&gt;
void SPI_ACCSENS_normalize(void);&lt;br /&gt;
void SPI_ACCSENS_position(void);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
/******************************************************************************&lt;br /&gt;
 * Additional info&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Changelog:&lt;br /&gt;
 * &lt;br /&gt;
 *  ---&amp;gt; changes are documented in the file &amp;quot;RP6ControlACCSENSLib.c&amp;quot;&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
======Library Source======&lt;br /&gt;
Datei: RP6ControlACCSENSLib.c&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;/* ****************************************************************************&lt;br /&gt;
 *                           _______________________&lt;br /&gt;
 *                           \| RP6  ROBOT SYSTEM |/&lt;br /&gt;
 *                            \_-_-_-_-_-_-_-_-_-_/             &amp;gt;&amp;gt;&amp;gt; RP6 CONTROL&lt;br /&gt;
 * ----------------------------------------------------------------------------&lt;br /&gt;
 * ----------------------------- [c]2014 - Dirk -------------------------------&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * File: RP6ControlACCSENSLib.c&lt;br /&gt;
 * Version: 1.0&lt;br /&gt;
 * Target: RP6 CONTROL - ATMEGA32 @16.00MHz&lt;br /&gt;
 *         with optional LC-Display 16x2 chars (CONRAD 190911-62)&lt;br /&gt;
 *         and a 3D Accelerometer Modul (CONRAD 1082387-62) (IC5)&lt;br /&gt;
 * Author(s): Dirk&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Description:&lt;br /&gt;
 * This is my RP6 Control ACCSENS Library. This library may be used to access&lt;br /&gt;
 * the basic functions of the 3D Accelerometer Modul. This RP6 Xtra module may&lt;br /&gt;
 * be placed on the IC5 socket on the RP6 CONTROL M32 instead of a second&lt;br /&gt;
 * EEPROM.&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * THE CHANGELOG CAN BE FOUND AT THE END OF THIS FILE!&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
 &lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Includes:&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6ControlACCSENSLib.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// SPI functions:&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Reads a single register from the 3D Accelerometer&lt;br /&gt;
 * Modul (ACCSENS).&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
uint8_t SPI_ACCSENS_readByte(uint8_t regAddr)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t data;&lt;br /&gt;
	regAddr |= READ_MASK;						// Read byte&lt;br /&gt;
	PORTB &amp;amp;= ~ACC_CS;&lt;br /&gt;
	writeSPI(regAddr);&lt;br /&gt;
	data = readSPI();&lt;br /&gt;
	PORTB |= ACC_CS;&lt;br /&gt;
	return data;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Reads &amp;quot;length&amp;quot; bytes into the buffer &amp;quot;buffer&amp;quot;&lt;br /&gt;
 * from startAddr on. &lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void SPI_ACCSENS_readBytes(uint8_t startAddr, uint8_t *buffer, uint8_t length)&lt;br /&gt;
{&lt;br /&gt;
	startAddr |= READ_AUTOINC_MASK;				// Read byte, auto increment&lt;br /&gt;
	PORTB &amp;amp;= ~ACC_CS;&lt;br /&gt;
	writeSPI(startAddr);&lt;br /&gt;
	readBufferSPI(&amp;amp;buffer[0], length);&lt;br /&gt;
	PORTB |= ACC_CS;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Write a single data byte to the specified sensor&lt;br /&gt;
 * address.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void SPI_ACCSENS_writeByte(uint8_t regAddr, uint8_t data)&lt;br /&gt;
{&lt;br /&gt;
	PORTB &amp;amp;= ~ACC_CS;&lt;br /&gt;
	writeSPI(regAddr);&lt;br /&gt;
	writeSPI(data);&lt;br /&gt;
	PORTB |= ACC_CS;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Returns sensor status register - for checking if&lt;br /&gt;
 * sensor is busy. &lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
uint8_t SPI_ACCSENS_getStatus(void)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t status;&lt;br /&gt;
	PORTB &amp;amp;= ~ACC_CS;&lt;br /&gt;
	writeSPI(STATUS_REG);&lt;br /&gt;
	status = readSPI();&lt;br /&gt;
	PORTB |= ACC_CS;&lt;br /&gt;
	return status;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// 3D accelerometer functions:&lt;br /&gt;
&lt;br /&gt;
int16_t x_axisa, y_axisa, z_axisa;&lt;br /&gt;
double pitch, roll;&lt;br /&gt;
double xa, ya, za;&lt;br /&gt;
double the, phi;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Initializes the sensor. You must call this&lt;br /&gt;
 * function at the beginning of a program, that&lt;br /&gt;
 * uses the 3D Accelerometer Modul.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void SPI_ACCSENS_init(void)&lt;br /&gt;
{&lt;br /&gt;
	// All axes enable, low power, 10Hz output data rate:&lt;br /&gt;
	SPI_ACCSENS_writeByte(CTRL_REG1, CTRL_REG1_3D_LOPWR_10HZ);&lt;br /&gt;
	// No update while reading, +- 2g, self-test minus:&lt;br /&gt;
	SPI_ACCSENS_writeByte(CTRL_REG4, CTRL_REG4_BDU_2G_STSIGN);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Sets the LIS302DLH power-down mode. If you&lt;br /&gt;
 * do not need the sensor, you can save energy&lt;br /&gt;
 * by using the sensor power-down mode.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void SPI_ACCSENS_shutdown(void)&lt;br /&gt;
{&lt;br /&gt;
	// LIS302DLH in power-down mode:&lt;br /&gt;
	SPI_ACCSENS_writeByte(CTRL_REG1, CTRL_REG1_POWERDOWN);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function reads the X-axis, Y-axis and Z-axis&lt;br /&gt;
 * values from the LIS302DLH accelerometer and stores&lt;br /&gt;
 * them in the global variables x_axisa, y_axisa and&lt;br /&gt;
 * z_axisa.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void SPI_ACCSENS_read(void)&lt;br /&gt;
{&lt;br /&gt;
#ifndef EXP_STACK_1&lt;br /&gt;
	// Default sensor position (M32 located on the RP6 rear stack):&lt;br /&gt;
	// xb = -y:&lt;br /&gt;
	x_axisa = SPI_ACCSENS_readByte(OUT_Y_L) | (SPI_ACCSENS_readByte(OUT_Y_H) &amp;lt;&amp;lt; 8);&lt;br /&gt;
	x_axisa *= -1;&lt;br /&gt;
	// yb = -x:&lt;br /&gt;
	y_axisa = SPI_ACCSENS_readByte(OUT_X_L) | (SPI_ACCSENS_readByte(OUT_X_H) &amp;lt;&amp;lt; 8);&lt;br /&gt;
	y_axisa *= -1;&lt;br /&gt;
	// zb = z:&lt;br /&gt;
	z_axisa = SPI_ACCSENS_readByte(OUT_Z_L) | (SPI_ACCSENS_readByte(OUT_Z_H) &amp;lt;&amp;lt; 8);&lt;br /&gt;
#else&lt;br /&gt;
	// Other sensor position (M32 located on the RP6 front stack):&lt;br /&gt;
	// xb = y:&lt;br /&gt;
	x_axisa = SPI_ACCSENS_readByte(OUT_Y_L) | (SPI_ACCSENS_readByte(OUT_Y_H) &amp;lt;&amp;lt; 8);&lt;br /&gt;
	// yb = x:&lt;br /&gt;
	y_axisa = SPI_ACCSENS_readByte(OUT_X_L) | (SPI_ACCSENS_readByte(OUT_X_H) &amp;lt;&amp;lt; 8);&lt;br /&gt;
	// zb = z:&lt;br /&gt;
	z_axisa = SPI_ACCSENS_readByte(OUT_Z_L) | (SPI_ACCSENS_readByte(OUT_Z_H) &amp;lt;&amp;lt; 8);&lt;br /&gt;
#endif&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function limits and normalizes the x-axisa,&lt;br /&gt;
 * y-axisa and z-axisa values read from the LIS302DLH&lt;br /&gt;
 * accelerometer with the function SPI_ACCSENS_read() and&lt;br /&gt;
 * stores them in the global double variables xa, ya and&lt;br /&gt;
 * za.&lt;br /&gt;
 * It also calculates the position in space in form of the&lt;br /&gt;
 * tilt angles (the = pitch, phi = roll) and stores them&lt;br /&gt;
 * in the global double variables the and phi.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void SPI_ACCSENS_normalize(void)&lt;br /&gt;
{&lt;br /&gt;
	// Limit raw values:&lt;br /&gt;
	if (x_axisa &amp;lt; MIN_X_A) x_axisa = MIN_X_A;&lt;br /&gt;
	if (x_axisa &amp;gt; MAX_X_A) x_axisa = MAX_X_A;&lt;br /&gt;
	if (y_axisa &amp;lt; MIN_Y_A) y_axisa = MIN_Y_A;&lt;br /&gt;
	if (y_axisa &amp;gt; MAX_Y_A) y_axisa = MAX_Y_A;&lt;br /&gt;
	if (z_axisa &amp;lt; MIN_Z_A) z_axisa = MIN_Z_A;&lt;br /&gt;
	if (z_axisa &amp;gt; MAX_Z_A) z_axisa = MAX_Z_A;&lt;br /&gt;
	xa = (double) x_axisa / 10000.0;&lt;br /&gt;
	ya = (double) y_axisa / 10000.0;&lt;br /&gt;
	za = (double) z_axisa / 10000.0;&lt;br /&gt;
	// Calculate Pitch and Roll:&lt;br /&gt;
	phi = asin(xa);								// Calculate the and phi&lt;br /&gt;
	the = asin(ya / cos(the));					//  from the raw values&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function calculates the position in space by&lt;br /&gt;
 * using the the and phi values (see function&lt;br /&gt;
 * SPI_ACCSENS_normalize()!). It stores the position&lt;br /&gt;
 * in the global double variables pitch and roll. &lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void SPI_ACCSENS_position(void)&lt;br /&gt;
{&lt;br /&gt;
	pitch = the * 180 / M_PI + OFFSET_PITCH_A;&lt;br /&gt;
	roll = phi * 180 / M_PI + OFFSET_ROLL_A;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/******************************************************************************&lt;br /&gt;
 * Additional info&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Changelog:&lt;br /&gt;
 * - v. 1.0 (initial release) 04.04.2014 by Dirk&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Erklärung&lt;br /&gt;
&lt;br /&gt;
======Demo======&lt;br /&gt;
makefile:&lt;br /&gt;
&amp;lt;pre&amp;gt;...&lt;br /&gt;
TARGET = RP6Control_01_ACCSENS&lt;br /&gt;
...&lt;br /&gt;
SRC += $(RP6_LIB_PATH)/RP6control/RP6ControlLib.c&lt;br /&gt;
SRC += $(RP6_LIB_PATH)/RP6common/RP6uart.c&lt;br /&gt;
SRC += $(RP6_LIB_PATH)/RP6control/RP6ControlACCSENSLib.c&lt;br /&gt;
...&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Datei: RP6Control_01_ACCSENS.c&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;// Uncommented Version of RP6Control_01_ACCSENS.c&lt;br /&gt;
// written by Dirk&lt;br /&gt;
// ------------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6ControlACCSENSLib.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void writeDouble(double number, uint8_t width, uint8_t prec)&lt;br /&gt;
{char buffer[width + 1];&lt;br /&gt;
	dtostrf(number, width, prec, &amp;amp;buffer[0]);&lt;br /&gt;
	writeString(&amp;amp;buffer[0]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void writeDoubleLCD(double number, uint8_t width, uint8_t prec)&lt;br /&gt;
{char buffer[width + 1];&lt;br /&gt;
	dtostrf(number, width, prec, &amp;amp;buffer[0]);&lt;br /&gt;
	writeStringLCD(&amp;amp;buffer[0]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
	initRP6Control();&lt;br /&gt;
&lt;br /&gt;
	writeString_P(&amp;quot;\n\nRP6Control SPI ACCSENS Test Program!\n&amp;quot;); &lt;br /&gt;
	setLEDs(0b1111);&lt;br /&gt;
	mSleep(50);&lt;br /&gt;
	initLCD(); &lt;br /&gt;
	showScreenLCD(&amp;quot;################&amp;quot;, &amp;quot;################&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
	showScreenLCD(&amp;quot;  SPI ACCSENS&amp;quot;, &amp;quot;  Test Program&amp;quot;);&lt;br /&gt;
	mSleep(1000);&lt;br /&gt;
	setLEDs(0b0000);&lt;br /&gt;
&lt;br /&gt;
	SPI_ACCSENS_init();&lt;br /&gt;
&lt;br /&gt;
	uint8_t whoami = SPI_ACCSENS_readByte(WHO_AM_I);&lt;br /&gt;
	writeString_P(&amp;quot;\nWHO AM I: &amp;quot;);&lt;br /&gt;
	writeInteger(whoami, HEX);&lt;br /&gt;
	writeChar('\n');&lt;br /&gt;
	mSleep(2000);&lt;br /&gt;
	&lt;br /&gt;
	startStopwatch1();&lt;br /&gt;
&lt;br /&gt;
	while(true) &lt;br /&gt;
	{&lt;br /&gt;
		if(getStopwatch1() &amp;gt; 1000)&lt;br /&gt;
		{&lt;br /&gt;
			SPI_ACCSENS_read();&lt;br /&gt;
			writeString_P(&amp;quot;\n3D Accelerometer SENSOR -&amp;gt;\n&amp;quot;);&lt;br /&gt;
			writeString_P(&amp;quot;X-axis: &amp;quot;);&lt;br /&gt;
			writeInteger(x_axisa, DEC);&lt;br /&gt;
			writeChar('\n');&lt;br /&gt;
			writeString_P(&amp;quot;Y-axis: &amp;quot;);&lt;br /&gt;
			writeInteger(y_axisa, DEC);&lt;br /&gt;
			writeChar('\n');&lt;br /&gt;
			writeString_P(&amp;quot;Z-axis: &amp;quot;);&lt;br /&gt;
			writeInteger(z_axisa, DEC);&lt;br /&gt;
			writeChar('\n');&lt;br /&gt;
			SPI_ACCSENS_normalize();&lt;br /&gt;
			SPI_ACCSENS_position();&lt;br /&gt;
			writeString_P(&amp;quot;POSITION: \n&amp;quot;);&lt;br /&gt;
			writeString_P(&amp;quot;  Pitch [°]: &amp;quot;);&lt;br /&gt;
			writeDouble(pitch, 6, 1);&lt;br /&gt;
			writeChar('\n');&lt;br /&gt;
			writeString_P(&amp;quot;  Roll [°]:  &amp;quot;);&lt;br /&gt;
			writeDouble(roll, 6, 1);&lt;br /&gt;
			writeChar('\n');&lt;br /&gt;
			setCursorPosLCD(0, 0);&lt;br /&gt;
			writeStringLCD_P(&amp;quot;P&amp;quot;);&lt;br /&gt;
			writeDoubleLCD(pitch, 6, 1);&lt;br /&gt;
			writeStringLCD_P(&amp;quot; &amp;quot;);&lt;br /&gt;
			setCursorPosLCD(0, 8);&lt;br /&gt;
			writeStringLCD_P(&amp;quot;R&amp;quot;);&lt;br /&gt;
			writeDoubleLCD(roll, 6, 1);&lt;br /&gt;
			writeStringLCD_P(&amp;quot; &amp;quot;);&lt;br /&gt;
			setCursorPosLCD(1, 0);&lt;br /&gt;
			writeStringLCD_P(&amp;quot;X&amp;quot;);&lt;br /&gt;
			writeIntegerLCD(x_axisa, DEC);&lt;br /&gt;
			writeStringLCD_P(&amp;quot;   &amp;quot;);&lt;br /&gt;
			setCursorPosLCD(1, 5);&lt;br /&gt;
			writeStringLCD_P(&amp;quot;Y&amp;quot;);&lt;br /&gt;
			writeIntegerLCD(y_axisa, DEC);&lt;br /&gt;
			writeStringLCD_P(&amp;quot;   &amp;quot;);&lt;br /&gt;
			setCursorPosLCD(1, 10);&lt;br /&gt;
			writeStringLCD_P(&amp;quot;Z&amp;quot;);&lt;br /&gt;
			writeIntegerLCD(z_axisa, DEC);&lt;br /&gt;
			writeStringLCD_P(&amp;quot;    &amp;quot;);&lt;br /&gt;
			mSleep(2000);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Erklärung&lt;br /&gt;
&lt;br /&gt;
====BHT Modul JM3-BHT31====&lt;br /&gt;
Dieses Modul zur Messung von Luftdruck, Luftfeuchte und Temperatur ist seit dem 22.01.2015 lieferbar.&lt;br /&gt;
&lt;br /&gt;
=====Dokumentation=====&lt;br /&gt;
Die Dokumentation zum BHT Modul befindet sich auf der mitgelieferten ''&amp;quot;ASURO xTend-On CD-ROM&amp;quot;''.&lt;br /&gt;
&lt;br /&gt;
======Manuals======&lt;br /&gt;
Das Handbuch in der aktuellen Version kann [http://www.jm3-engineering.com/download/doc/ManualAsuroBHT_de.pdf hier] eingesehen werden.&lt;br /&gt;
&lt;br /&gt;
=====Demo-Programme=====&lt;br /&gt;
Ein Demo-Programm zum BHT Modul befindet sich integriert in die RP6 Sensor Board Demo auf der ''&amp;quot;RP6 Robot System Xtra Modules CD-ROM&amp;quot;''. Diese Demo kann auch in der aktuellen Version im Download Bereich von [http://www.jm3-engineering.com/downloads.htm JM3 Engineering] herunter geladen werden.&lt;br /&gt;
&lt;br /&gt;
=====RP6M256 WiFi: I2C_BHT Library=====&lt;br /&gt;
Die nachfolgende RP6M256_I2C_BHTLib (Eigenentwicklung in GCC) dient zur Ansteuerung des I2C BHT Moduls durch die RP6M256 WiFi.&lt;br /&gt;
&lt;br /&gt;
======Library Header======&lt;br /&gt;
Datei: RP6M256_I2C_BHTLib.h&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;/* ****************************************************************************&lt;br /&gt;
 *                           _______________________&lt;br /&gt;
 *                           \| RP6  ROBOT SYSTEM |/&lt;br /&gt;
 *                            \_-_-_-_-_-_-_-_-_-_/           &amp;gt;&amp;gt;&amp;gt; RP6 M256 WIFI&lt;br /&gt;
 * ----------------------------------------------------------------------------&lt;br /&gt;
 * ----------------------------- [c]2015 - Dirk -------------------------------&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * File: RP6M256_I2C_BHTLib.h&lt;br /&gt;
 * Version: 0.9&lt;br /&gt;
 * Target: RP6 M256 WIFI - ATMEGA2560 @16.00MHz&lt;br /&gt;
 * Author(s): Dirk&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Description:&lt;br /&gt;
 * Header file for new RP6 BHT Module library.&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
#ifndef RP6M256_I2C_BHTLIB_H&lt;br /&gt;
#define RP6M256_I2C_BHTLIB_H&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// RP6 BHT Module components:&lt;br /&gt;
// - I2C Barometric Pressure Sensor (MS5607-02BA)&lt;br /&gt;
// - I2C Relative Humidity Sensor (HTU21D)&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// RP6 Sensor Board:&lt;br /&gt;
&lt;br /&gt;
// If you want to use the RP6 BHT Module on the RP6 Sensor Board, you&lt;br /&gt;
// have to define SENSOR_BOARD (default)!&lt;br /&gt;
// If SENSOR_BOARD is NOT defined, this library assumes that the RP6 BHT&lt;br /&gt;
// Module is used stand-alone.&lt;br /&gt;
// ------------------&lt;br /&gt;
#define SENSOR_BOARD&lt;br /&gt;
// ------------------&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Includes:&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6M256Lib.h&amp;quot;&lt;br /&gt;
#include &amp;quot;RP6I2CmasterTWI.h&amp;quot;&lt;br /&gt;
#ifdef SENSOR_BOARD&lt;br /&gt;
	#include &amp;quot;RP6M256_Sensor_BoardLib.h&amp;quot;&lt;br /&gt;
#endif&lt;br /&gt;
#include &amp;lt;math.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Barometric Pressure Sensor (MS5607-02BA):&lt;br /&gt;
#define I2C_BHT_B_ADR					0xee	// Default&lt;br /&gt;
&lt;br /&gt;
// Weather station's data:&lt;br /&gt;
#define ALTITUDE			156			// Weather station's altitude [m]&lt;br /&gt;
//#define ALTITUDE			110			// 2nd altitude: Location 2 [m]&lt;br /&gt;
&lt;br /&gt;
// Temperature default data:&lt;br /&gt;
#define TEMP_ZERO			273.15		// 273.15 K = 0 °C&lt;br /&gt;
#define TA_DEFAULT			15.0		// Outside temp. default [°C]&lt;br /&gt;
#define TI_DEFAULT			21.0		// Inside temp. default [°C]&lt;br /&gt;
&lt;br /&gt;
// Commands:&lt;br /&gt;
#define MS5607_CMD_RESET				0x1e	// ADC reset command&lt;br /&gt;
#define MS5607_CMD_ADC_READ				0x00	// ADC read command&lt;br /&gt;
#define MS5607_CMD_ADC_CONV				0x40	// ADC conversion command&lt;br /&gt;
#define MS5607_CMD_ADC_D1				0x00	// ADC D1 conversion&lt;br /&gt;
#define MS5607_CMD_ADC_D2				0x10	// ADC D2 conversion&lt;br /&gt;
#define MS5607_CMD_ADC_256				0x00	// ADC OSR=256&lt;br /&gt;
#define MS5607_CMD_ADC_512				0x02	// ADC OSR=512&lt;br /&gt;
#define MS5607_CMD_ADC_1024				0x04	// ADC OSR=1024&lt;br /&gt;
#define MS5607_CMD_ADC_2048				0x06	// ADC OSR=2048&lt;br /&gt;
#define MS5607_CMD_ADC_4096				0x08	// ADC OSR=4096&lt;br /&gt;
#define MS5607_CMD_PROM_RD				0xa0	// Prom read command&lt;br /&gt;
&lt;br /&gt;
extern uint32_t D1;		// ADC value of the pressure conversion&lt;br /&gt;
extern uint32_t D2;		// ADC value of the temperature conversion&lt;br /&gt;
extern uint16_t C[8];	// calibration coefficients&lt;br /&gt;
extern double P;		// compensated pressure value&lt;br /&gt;
extern double P0;		// compensated pressure value at sea level (0 m)&lt;br /&gt;
extern double T;		// compensated temperature value&lt;br /&gt;
extern double dT;		// difference between actual and measured temperature&lt;br /&gt;
extern double OFF;		// offset at actual temperature&lt;br /&gt;
extern double SENS;		// sensitivity at actual temperature&lt;br /&gt;
extern uint8_t n_crc;	// crc value of the prom&lt;br /&gt;
&lt;br /&gt;
void I2C_BHT_B_reset(void);&lt;br /&gt;
uint32_t I2C_BHT_B_cmd_adc(uint8_t cmd);&lt;br /&gt;
uint16_t I2C_BHT_B_cmd_prom(uint8_t coef_num);&lt;br /&gt;
uint8_t I2C_BHT_B_crc4(uint16_t n_prom[]);&lt;br /&gt;
void I2C_BHT_B_read(void);&lt;br /&gt;
void I2C_BHT_B_init(void);&lt;br /&gt;
double reduceAirPressure(double pa, double ta);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Relative Humidity Sensor (HTU21D):&lt;br /&gt;
#define I2C_BHT_HT_ADR					0x80	// Default&lt;br /&gt;
&lt;br /&gt;
// Commands:&lt;br /&gt;
#define HTU21D_TRIG_T_MEASUREMENT_HM    0xe3	// Trig. temp meas. hold master&lt;br /&gt;
#define HTU21D_TRIG_RH_MEASUREMENT_HM   0xe5	// Trig. humidity meas. hold master&lt;br /&gt;
#define HTU21D_TRIG_T_MEASUREMENT_POLL  0xf3	// Trig. temp meas. no hold master&lt;br /&gt;
#define HTU21D_TRIG_RH_MEASUREMENT_POLL 0xf5	// Trig. humidity meas. no hold master&lt;br /&gt;
#define HTU21D_USER_REG_W               0xe6	// Writing user register&lt;br /&gt;
#define HTU21D_USER_REG_R               0xe7	// Reading user register&lt;br /&gt;
#define HTU21D_SOFT_RESET               0xfe	// Soft reset&lt;br /&gt;
&lt;br /&gt;
// Resolutions:&lt;br /&gt;
#define HTU21D_RES_12_14BIT             0x00	// RH=12bit, T=14bit&lt;br /&gt;
#define HTU21D_RES_8_12BIT              0x01	// RH= 8bit, T=12bit&lt;br /&gt;
#define HTU21D_RES_10_13BIT             0x80	// RH=10bit, T=13bit&lt;br /&gt;
#define HTU21D_RES_11_11BIT             0x81	// RH=11bit, T=11bit&lt;br /&gt;
&lt;br /&gt;
// User register bitmasks:&lt;br /&gt;
#define HTU21D_RES_MASK                 0x81	// Mask for res. bits (7, 0)&lt;br /&gt;
#define HTU21D_EOB_ON                   0x40	// End of battery&lt;br /&gt;
#define HTU21D_EOB_MASK                 0x40	// Mask for EOB bit(6)&lt;br /&gt;
#define HTU21D_HEATER_ON                0x04	// Heater on&lt;br /&gt;
#define HTU21D_HEATER_OFF               0x00	// Heater off&lt;br /&gt;
#define HTU21D_HEATER_MASK              0x04	// Mask for Heater bit (2)&lt;br /&gt;
&lt;br /&gt;
extern uint16_t rawHumidity;	// raw humidity value&lt;br /&gt;
extern uint16_t rawTemperature;	// raw temperature value&lt;br /&gt;
extern double H;				// relative humidity value [%]&lt;br /&gt;
extern double HT;				// temperature value [°C]&lt;br /&gt;
extern uint8_t resolution;		// sensor resolution [0..3]&lt;br /&gt;
extern uint8_t ht_crc;			// message crc value&lt;br /&gt;
&lt;br /&gt;
void I2C_BHT_HT_reset(void);&lt;br /&gt;
uint8_t I2C_BHT_HT_crc8(uint16_t message, uint8_t checksum);&lt;br /&gt;
double I2C_BHT_HT_readHumidity(void);&lt;br /&gt;
double I2C_BHT_HT_readTemperature(void);&lt;br /&gt;
void I2C_BHT_HT_setResolution(uint8_t resBits);&lt;br /&gt;
void I2C_BHT_HT_init(void);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// RP6 BHT Module initialisation:&lt;br /&gt;
&lt;br /&gt;
void I2C_BHT_init(void);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
/******************************************************************************&lt;br /&gt;
 * Additional info&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Changelog:&lt;br /&gt;
 * &lt;br /&gt;
 *  ---&amp;gt; changes are documented in the file &amp;quot;RP6M256_I2C_BHTLib.c&amp;quot;&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
======Library Source======&lt;br /&gt;
Datei: RP6M256_I2C_BHTLib.c&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;/* ****************************************************************************&lt;br /&gt;
 *                           _______________________&lt;br /&gt;
 *                           \| RP6  ROBOT SYSTEM |/&lt;br /&gt;
 *                            \_-_-_-_-_-_-_-_-_-_/           &amp;gt;&amp;gt;&amp;gt; RP6 M256 WIFI&lt;br /&gt;
 * ----------------------------------------------------------------------------&lt;br /&gt;
 * ----------------------------- [c]2015 - Dirk -------------------------------&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * File: RP6M256_I2C_BHTLib.c&lt;br /&gt;
 * Version: 0.9&lt;br /&gt;
 * Target: RP6 M256 WIFI - ATMEGA2560 @16.00MHz&lt;br /&gt;
 *         and a RP6 BHT Module (CONRAD 1302995)&lt;br /&gt;
 *         optionally on a RP6 Sensor Board (CONRAD 1082384)&lt;br /&gt;
 * Author(s): Dirk&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Description:&lt;br /&gt;
 * &lt;br /&gt;
 * This is our new Library that contains basic routines and functions for&lt;br /&gt;
 * accessing the RP6 BHT Module JM3-BHT31 (CONRAD 1302995).&lt;br /&gt;
 * If the RP6 BHT Module is located on the RP6 Sensor Board (CONRAD 1082384)&lt;br /&gt;
 * and connected to the I2C-MODULE plug M1, the RP6M256_Sensor_BoardLib has to&lt;br /&gt;
 * be included!&lt;br /&gt;
 * &lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// RP6 BHT Module components:&lt;br /&gt;
// - I2C Barometric Pressure Sensor (MS5607-02BA)&lt;br /&gt;
// - I2C Relative Humidity Sensor (HTU21D)&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Includes:&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6M256_I2C_BHTLib.h&amp;quot; 		&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Variables:&lt;br /&gt;
&lt;br /&gt;
uint8_t bhtdataBuf[4]; &lt;br /&gt;
uint8_t i;&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Barometric Pressure Sensor (MS5607-02BA):&lt;br /&gt;
// (Following the C-code example published 2011 by MEAS in AN520!)&lt;br /&gt;
&lt;br /&gt;
uint32_t D1;			// ADC value of the pressure conversion&lt;br /&gt;
uint32_t D2;			// ADC value of the temperature conversion&lt;br /&gt;
uint16_t C[8];			// calibration coefficients&lt;br /&gt;
double P;				// compensated pressure value&lt;br /&gt;
double P0;				// compensated pressure value at sea level (0 m)&lt;br /&gt;
double T;				// compensated temperature value&lt;br /&gt;
double dT;				// difference between actual and measured temperature&lt;br /&gt;
double OFF;				// offset at actual temperature&lt;br /&gt;
double SENS;			// sensitivity at actual temperature&lt;br /&gt;
uint8_t n_crc;			// crc value of the prom&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Reset sequence for the Pressure Sensor.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void I2C_BHT_B_reset(void)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmitByte(I2C_BHT_B_ADR, MS5607_CMD_RESET);&lt;br /&gt;
	mSleep(3);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Reads and returns pressure or temperature ADC&lt;br /&gt;
 * values measured with the chosen resolution.&lt;br /&gt;
 * This function is BLOCKING during the conversion&lt;br /&gt;
 * time (up to 10 ms).&lt;br /&gt;
 *&lt;br /&gt;
 * Input: cmd -&amp;gt; MS5607_CMD_ADC_D1   = Read pressure ADC value&lt;br /&gt;
 *               MS5607_CMD_ADC_D2   = Read temperature ADC value&lt;br /&gt;
 *               ... plus ...&lt;br /&gt;
 *               MS5607_CMD_ADC_256  = Resolution 0.130 hPa / 0.012 °C&lt;br /&gt;
 *               MS5607_CMD_ADC_512  = Resolution 0.084 hPa / 0.008 °C&lt;br /&gt;
 *               MS5607_CMD_ADC_1024 = Resolution 0.054 hPa / 0.005 °C&lt;br /&gt;
 *               MS5607_CMD_ADC_2048 = Resolution 0.036 hPa / 0.003 °C&lt;br /&gt;
 *               MS5607_CMD_ADC_4096 = Resolution 0.024 hPa / 0.002 °C&lt;br /&gt;
 *&lt;br /&gt;
 * Examples:&lt;br /&gt;
 *   D1 = I2C_BHT_B_cmd_adc(MS5607_CMD_ADC_D1 + MS5607_CMD_ADC_4096);&lt;br /&gt;
 *   // This returns the pressure ADC value (D1) with a 0.024 hPa&lt;br /&gt;
 *   // resolution!&lt;br /&gt;
 *   D2 = I2C_BHT_B_cmd_adc(MS5607_CMD_ADC_D2 + MS5607_CMD_ADC_4096);&lt;br /&gt;
 *   // This returns the temperature ADC value (D2) with a 0.002 °C&lt;br /&gt;
 *   // resolution!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
uint32_t I2C_BHT_B_cmd_adc(uint8_t cmd)&lt;br /&gt;
{&lt;br /&gt;
	uint32_t temp = 0;&lt;br /&gt;
&lt;br /&gt;
	I2CTWI_transmitByte(I2C_BHT_B_ADR, (MS5607_CMD_ADC_CONV + cmd));&lt;br /&gt;
	switch (cmd &amp;amp; 0x0f) {&lt;br /&gt;
		case MS5607_CMD_ADC_256  : mSleep(1); break;&lt;br /&gt;
		case MS5607_CMD_ADC_512  : mSleep(2); break;&lt;br /&gt;
		case MS5607_CMD_ADC_1024 : mSleep(3); break;&lt;br /&gt;
		case MS5607_CMD_ADC_2048 : mSleep(5); break;&lt;br /&gt;
		case MS5607_CMD_ADC_4096 : mSleep(10);&lt;br /&gt;
	}&lt;br /&gt;
	I2CTWI_transmitByte(I2C_BHT_B_ADR, MS5607_CMD_ADC_READ);&lt;br /&gt;
	I2CTWI_readBytes(I2C_BHT_B_ADR, bhtdataBuf, 3);&lt;br /&gt;
	temp = bhtdataBuf[0];						// MSB&lt;br /&gt;
	temp &amp;lt;&amp;lt;= 8;&lt;br /&gt;
	temp |= bhtdataBuf[1];&lt;br /&gt;
	temp &amp;lt;&amp;lt;= 8;&lt;br /&gt;
	temp |= bhtdataBuf[2];						// LSB&lt;br /&gt;
	return temp;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Reads and returns the calibration coefficient&lt;br /&gt;
 * (16 bit) with the number coef_num from the&lt;br /&gt;
 * Pressure Sensor's PROM.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: coef_num -&amp;gt; Calibration coefficient&lt;br /&gt;
 *                    number [0..7]&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
uint16_t I2C_BHT_B_cmd_prom(uint8_t coef_num)&lt;br /&gt;
{&lt;br /&gt;
	uint16_t rC = 0;&lt;br /&gt;
&lt;br /&gt;
	I2CTWI_transmitByte(I2C_BHT_B_ADR, (MS5607_CMD_PROM_RD + coef_num * 2));&lt;br /&gt;
	I2CTWI_readBytes(I2C_BHT_B_ADR, bhtdataBuf, 2);&lt;br /&gt;
	rC = bhtdataBuf[0];							// MSB&lt;br /&gt;
	rC &amp;lt;&amp;lt;= 8;&lt;br /&gt;
	rC |= bhtdataBuf[1];						// LSB&lt;br /&gt;
	return rC;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Calculates and returns the Pressure Sensor's&lt;br /&gt;
 * PROM CRC-4 value (8 bit).&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
uint8_t I2C_BHT_B_crc4(uint16_t n_prom[])&lt;br /&gt;
{&lt;br /&gt;
	uint16_t n_rem;&lt;br /&gt;
	uint16_t crc_read;&lt;br /&gt;
	uint8_t n_bit;&lt;br /&gt;
&lt;br /&gt;
	n_rem = 0x00;&lt;br /&gt;
	crc_read = n_prom[7];&lt;br /&gt;
	n_prom[7] = (0xff00 &amp;amp; (n_prom[7]));&lt;br /&gt;
	for (i = 0; i &amp;lt; 16; i++)&lt;br /&gt;
	{&lt;br /&gt;
		if (i % 2 == 1) n_rem ^= (uint8_t) ((n_prom[i &amp;gt;&amp;gt; 1]) &amp;amp; 0x00ff);&lt;br /&gt;
		else n_rem ^= (uint8_t) (n_prom[i &amp;gt;&amp;gt; 1] &amp;gt;&amp;gt; 8);&lt;br /&gt;
		for (n_bit = 8; n_bit &amp;gt; 0; n_bit--)&lt;br /&gt;
		{&lt;br /&gt;
			if (n_rem &amp;amp; 0x8000) n_rem = (n_rem &amp;lt;&amp;lt; 1) ^ 0x3000;&lt;br /&gt;
			else n_rem = n_rem &amp;lt;&amp;lt; 1;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	n_rem = (0x000f &amp;amp; (n_rem &amp;gt;&amp;gt; 12));&lt;br /&gt;
	n_prom[7] = crc_read;&lt;br /&gt;
	return (n_rem ^ 0x0);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Reads and calculates the pressure and&lt;br /&gt;
 * temperature values with the MS5607 1st order&lt;br /&gt;
 * algorithm.&lt;br /&gt;
 * The 2 values are stored in the global floating&lt;br /&gt;
 * point variables P and T:&lt;br /&gt;
 *   P -&amp;gt; Pressure value [hPa]&lt;br /&gt;
 *   T -&amp;gt; Temperature value [°C]&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void I2C_BHT_B_read(void)&lt;br /&gt;
{&lt;br /&gt;
	D2 = I2C_BHT_B_cmd_adc(MS5607_CMD_ADC_D2 + MS5607_CMD_ADC_4096); // Read D2&lt;br /&gt;
	D1 = I2C_BHT_B_cmd_adc(MS5607_CMD_ADC_D1 + MS5607_CMD_ADC_4096); // Read D1&lt;br /&gt;
&lt;br /&gt;
	// Calculate 1st order pressure and temperature (MS5607 1st order algorithm)&lt;br /&gt;
	dT = D2 - C[5] * pow(2, 8);&lt;br /&gt;
	OFF = C[2] * pow(2, 17) + dT * C[4] / pow(2, 6);&lt;br /&gt;
	SENS = C[1] * pow(2, 16) + dT * C[3] / pow(2, 7);&lt;br /&gt;
&lt;br /&gt;
	T = (2000 + (dT * C[6]) / pow(2, 23)) / 100;&lt;br /&gt;
	P = (((D1 * SENS) / pow(2, 21) - OFF) / pow(2, 15)) / 100;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * You MUST call this function at the beginning of a&lt;br /&gt;
 * main program, that uses the Pressure Sensor. &lt;br /&gt;
 * If SENSOR_BOARD is defined, the I2C-MODULE power&lt;br /&gt;
 * will be switched on with the function&lt;br /&gt;
 * setI2CModulePower() defined in the&lt;br /&gt;
 * RP6M256_Sensor_BoardLib, which will be included&lt;br /&gt;
 * then.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void I2C_BHT_B_init(void)&lt;br /&gt;
{&lt;br /&gt;
#ifdef SENSOR_BOARD&lt;br /&gt;
	// I2C-MODULE (plug M1) power on: &lt;br /&gt;
	setI2CModulePower(1);&lt;br /&gt;
#endif&lt;br /&gt;
	D1 = 0;										// Clear pressure ADC value&lt;br /&gt;
	D2 = 0;										// Clear temperature ADC value&lt;br /&gt;
	I2C_BHT_B_reset();							// Reset the Pressure Sensor&lt;br /&gt;
	for (i = 0; i &amp;lt; 8; i++) {C[i] = I2C_BHT_B_cmd_prom(i);} // Read PROM&lt;br /&gt;
	n_crc = I2C_BHT_B_crc4(C);					// Calculate PROM CRC&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Calculates and returns the relative air pressure&lt;br /&gt;
 * [hPa] at sea level (0 m).&lt;br /&gt;
 *&lt;br /&gt;
 * Input:  pa        -&amp;gt; Absolute air pressure [hPa] at ALTITUDE&lt;br /&gt;
 *         ta        -&amp;gt; OUTSIDE temperature [°C] at ALTITUDE&lt;br /&gt;
 *         ALTITUDE  -&amp;gt; Weather station's altitude [m]&lt;br /&gt;
 *         TEMP_ZERO -&amp;gt; 273.15 K&lt;br /&gt;
 * Output: p0        -&amp;gt; Relative air pressure [hPa] at sea level (0 m)&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
double reduceAirPressure(double pa, double ta)&lt;br /&gt;
{double p0;&lt;br /&gt;
	p0 = pa * (pow ((TEMP_ZERO + ta) / (TEMP_ZERO + ta + 0.0065 * ALTITUDE), -5.255));&lt;br /&gt;
	return p0;									// P0 [hPa]&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Relative Humidity Sensor (HTU21D):&lt;br /&gt;
// (Following a library published 2011 by MEAS France!)&lt;br /&gt;
&lt;br /&gt;
uint16_t rawHumidity;		// raw humidity value&lt;br /&gt;
uint16_t rawTemperature;	// raw temperature value&lt;br /&gt;
double H;					// relative humidity value [%]&lt;br /&gt;
double HT;					// temperature value [°C]&lt;br /&gt;
uint8_t resolution;			// sensor resolution [0..3]&lt;br /&gt;
uint8_t ht_crc;				// message crc value&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Soft reset for the Humidity Sensor.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void I2C_BHT_HT_reset(void)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmitByte(I2C_BHT_HT_ADR, HTU21D_SOFT_RESET);&lt;br /&gt;
	mSleep(15);&lt;br /&gt;
	resolution = 0;								// Default: RH 12, T 14 bit&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Reads the Humidity Sensor's user register.&lt;br /&gt;
 *&lt;br /&gt;
 * Hint: The user register bits are described on&lt;br /&gt;
 *       page 13 of the HTU21D datasheet!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
uint8_t read_user_register(void)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t userRegister;&lt;br /&gt;
  &lt;br /&gt;
	I2CTWI_transmitByte(I2C_BHT_HT_ADR, HTU21D_USER_REG_R);&lt;br /&gt;
	userRegister = I2CTWI_readByte(I2C_BHT_HT_ADR);&lt;br /&gt;
	return userRegister;  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Sets the Humidity Sensor's resolution to one&lt;br /&gt;
 * of four steps. The step number [0..3] is stored&lt;br /&gt;
 * in the global variable resolution:&lt;br /&gt;
 *   Step  RH   T&lt;br /&gt;
 *    0:   12  14 bit&lt;br /&gt;
 *    1:    8  12 bit&lt;br /&gt;
 *    2:   10  13 bit&lt;br /&gt;
 *    3:   11  11 bit&lt;br /&gt;
 *                                      RH   T&lt;br /&gt;
 * Input:  resBits -&amp;gt; 0b00000000   (0): 12  14 bit&lt;br /&gt;
 *                 -&amp;gt; 0b00000001   (1):  8  12 bit&lt;br /&gt;
 *                 -&amp;gt; 0b10000000 (128): 10  13 bit&lt;br /&gt;
 *                 -&amp;gt; 0b10000001 (129): 11  11 bit&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void I2C_BHT_HT_setResolution(uint8_t resBits)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t userRegister;&lt;br /&gt;
&lt;br /&gt;
	userRegister = read_user_register();&lt;br /&gt;
	userRegister &amp;amp;= 0b01111110;&lt;br /&gt;
	resBits &amp;amp;= 0b10000001;&lt;br /&gt;
	resolution = (resBits &amp;gt;&amp;gt; 6) | (resBits &amp;amp; 1); // Step 0..3&lt;br /&gt;
	userRegister |= resBits;&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_BHT_HT_ADR, HTU21D_USER_REG_W, userRegister);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#define SHIFTED_DIVISOR                 0x988000&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Calculates the Humidity Sensor's message CRC-8&lt;br /&gt;
 * value (8 bit) and returns 0 (false), if the&lt;br /&gt;
 * message transmission is good.&lt;br /&gt;
 *&lt;br /&gt;
 * Input:  message         -&amp;gt; Message from&lt;br /&gt;
 *                            Humidity Sensor&lt;br /&gt;
 *         checksum        -&amp;gt; Checksum from&lt;br /&gt;
 *                            Humidity Sensor&lt;br /&gt;
 *         SHIFTED_DIVISOR -&amp;gt; 0x0131 polynomial&lt;br /&gt;
 *                            shifted to farthest&lt;br /&gt;
 *                            left of three bytes&lt;br /&gt;
 * Output: remainder       -&amp;gt; 0  = Transmission good&lt;br /&gt;
 *                         -&amp;gt; &amp;gt;0 = Transm. corrupted&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
uint8_t I2C_BHT_HT_crc8(uint16_t message, uint8_t checksum)&lt;br /&gt;
{&lt;br /&gt;
	uint32_t remainder, divisor;&lt;br /&gt;
&lt;br /&gt;
	remainder = (uint32_t) message &amp;lt;&amp;lt; 8;&lt;br /&gt;
	remainder |= checksum;&lt;br /&gt;
	divisor = (uint32_t) SHIFTED_DIVISOR;&lt;br /&gt;
	for (i = 0; i &amp;lt; 16; i++)&lt;br /&gt;
	{&lt;br /&gt;
		if (remainder &amp;amp; (uint32_t) 1 &amp;lt;&amp;lt; (23 - i))&lt;br /&gt;
			remainder ^= divisor;&lt;br /&gt;
		divisor &amp;gt;&amp;gt;= 1;&lt;br /&gt;
	}&lt;br /&gt;
	return (uint8_t) remainder;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Calculates and returns the humidity value.&lt;br /&gt;
 * This function is BLOCKING during the conversion&lt;br /&gt;
 * time (up to 17 ms depending on resolution).&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
double I2C_BHT_HT_readHumidity(void)&lt;br /&gt;
{&lt;br /&gt;
	uint32_t temp = 0;&lt;br /&gt;
&lt;br /&gt;
	I2CTWI_transmitByte(I2C_BHT_HT_ADR, HTU21D_TRIG_RH_MEASUREMENT_POLL);&lt;br /&gt;
	switch (resolution) {&lt;br /&gt;
		case 1 : mSleep(4); break;				// RH 8 bit&lt;br /&gt;
		case 2 : mSleep(6); break;				// RH 10 bit&lt;br /&gt;
		case 3 : mSleep(9); break;				// RH 11 bit&lt;br /&gt;
		case 0 : mSleep(17);					// RH 12 bit&lt;br /&gt;
	}&lt;br /&gt;
	I2CTWI_readBytes(I2C_BHT_HT_ADR, bhtdataBuf, 3);&lt;br /&gt;
	temp = bhtdataBuf[0];						// MSB&lt;br /&gt;
	temp &amp;lt;&amp;lt;= 8;&lt;br /&gt;
	temp |= bhtdataBuf[1];						// LSB&lt;br /&gt;
	temp &amp;lt;&amp;lt;= 8;&lt;br /&gt;
	temp |= bhtdataBuf[2];						// Checksum&lt;br /&gt;
	rawHumidity = temp &amp;gt;&amp;gt; 8;&lt;br /&gt;
	ht_crc = (uint8_t) temp;&lt;br /&gt;
	rawHumidity &amp;amp;= 0xfffc;&lt;br /&gt;
	double tempRH = rawHumidity / (double) 65536;&lt;br /&gt;
	double rh = -6 + (125 * tempRH);&lt;br /&gt;
	return rh;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Calculates and returns the temperature value.&lt;br /&gt;
 * This function is BLOCKING during the conversion&lt;br /&gt;
 * time (up to 51 ms depending on resolution).&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
double I2C_BHT_HT_readTemperature(void)&lt;br /&gt;
{&lt;br /&gt;
	uint32_t temp = 0;&lt;br /&gt;
&lt;br /&gt;
	I2CTWI_transmitByte(I2C_BHT_HT_ADR, HTU21D_TRIG_T_MEASUREMENT_POLL);&lt;br /&gt;
	switch (resolution) {&lt;br /&gt;
		case 3 : mSleep(8); break;				// T 11 bit&lt;br /&gt;
		case 1 : mSleep(14); break;				// T 12 bit&lt;br /&gt;
		case 2 : mSleep(26); break;				// T 13 bit&lt;br /&gt;
		case 0 : mSleep(51);					// T 14 bit&lt;br /&gt;
	}&lt;br /&gt;
	I2CTWI_readBytes(I2C_BHT_HT_ADR, bhtdataBuf, 3);&lt;br /&gt;
	temp = bhtdataBuf[0];						// MSB&lt;br /&gt;
	temp &amp;lt;&amp;lt;= 8;&lt;br /&gt;
	temp |= bhtdataBuf[1];						// LSB&lt;br /&gt;
	temp &amp;lt;&amp;lt;= 8;&lt;br /&gt;
	temp |= bhtdataBuf[2];						// Checksum&lt;br /&gt;
	rawTemperature = temp &amp;gt;&amp;gt; 8;&lt;br /&gt;
	ht_crc = (uint8_t) temp;&lt;br /&gt;
	rawTemperature &amp;amp;= 0xfffc;&lt;br /&gt;
	double tempTemperature = rawTemperature / (double) 65536;&lt;br /&gt;
	double realTemperature = -46.85 + (175.72 * tempTemperature);&lt;br /&gt;
	return realTemperature;  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * You MUST call this function at the beginning of a&lt;br /&gt;
 * main program, that uses the Humidity Sensor. &lt;br /&gt;
 * If SENSOR_BOARD is defined, the I2C-MODULE power&lt;br /&gt;
 * will be switched on with the function&lt;br /&gt;
 * setI2CModulePower() defined in the&lt;br /&gt;
 * RP6M256_Sensor_BoardLib, which will be included&lt;br /&gt;
 * then.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void I2C_BHT_HT_init(void)&lt;br /&gt;
{&lt;br /&gt;
#ifdef SENSOR_BOARD&lt;br /&gt;
	// I2C-MODULE (plug M1) power on: &lt;br /&gt;
	setI2CModulePower(1);&lt;br /&gt;
#endif&lt;br /&gt;
	I2C_BHT_HT_reset();							// Reset the Humidity Sensor&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// RP6 BHT Module initialisation:&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * You MUST call this function at the beginning of a&lt;br /&gt;
 * main program, that uses the RP6 BHT Module. &lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void I2C_BHT_init(void)&lt;br /&gt;
{&lt;br /&gt;
	// I2C Barometric Pressure Sensor:&lt;br /&gt;
	I2C_BHT_B_init();&lt;br /&gt;
	// I2C Relative Humidity Sensor:&lt;br /&gt;
	I2C_BHT_HT_init();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&lt;br /&gt;
/******************************************************************************&lt;br /&gt;
 * Additional info&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Changelog:&lt;br /&gt;
 * - v. 0.9 (initial release) 20.03.2015 by Dirk&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
======Demo======&lt;br /&gt;
makefile:&lt;br /&gt;
&amp;lt;pre&amp;gt;...&lt;br /&gt;
TARGET = RP6M256_Sensor_Board_03&lt;br /&gt;
...&lt;br /&gt;
SRC += $(RP6_LIB_PATH)/RP6common/RP6I2CmasterTWI.c&lt;br /&gt;
&lt;br /&gt;
SRC += $(RP6_LIB_PATH)/RP6control_M256_WIFI/RP6M256_Sensor_BoardLib.c&lt;br /&gt;
SRC += $(RP6_LIB_PATH)/RP6control_M256_WIFI/RP6M256_I2C_BHTLib.c&lt;br /&gt;
...&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Datei: RP6M256_Sensor_Board_03.c&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;/* &lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * RP6 ROBOT SYSTEM - RP6 CONTROL M256 Examples&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Example: RP6M256 Sensor Board&lt;br /&gt;
 * Author(s): Dirk&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Description:&lt;br /&gt;
 * In this example we show a third test for the RP6 Sensor Board.&lt;br /&gt;
 * &lt;br /&gt;
 * ############################################################################&lt;br /&gt;
 * The Robot does NOT move in this example! You can simply put it on a table&lt;br /&gt;
 * next to your PC and you should connect it to the PC via the USB Interface!&lt;br /&gt;
 * You should also connect to it via WIFI.&lt;br /&gt;
 * ############################################################################&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Includes:&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6M256Lib.h&amp;quot; 				// The RP6 M256 Library. &lt;br /&gt;
										// Always needs to be included!&lt;br /&gt;
#include &amp;quot;RP6I2CmasterTWI.h&amp;quot;			// Include the I2C-Bus Master Library&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Include our new &amp;quot;RP6M256 I2C BHT Module library&amp;quot;:&lt;br /&gt;
// (This is the library for accessing the RP6 BHT Module!)&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6M256_I2C_BHTLib.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Write a floating point number to the WIFI.&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *&lt;br /&gt;
 *			// Write a floating point number to the WIFI (no exponent):&lt;br /&gt;
 *			writeDouble_WIFI(1234567.890, 11, 3);&lt;br /&gt;
 *&lt;br /&gt;
 * The value of prec (precision) defines the number of decimal places.&lt;br /&gt;
 * For 32 bit floating point variables (float, double ...) 6 is&lt;br /&gt;
 * the max. value for prec (7 relevant digits).&lt;br /&gt;
 * The value of width defines the overall number of characters in the&lt;br /&gt;
 * floating point number including the decimal point. The number of&lt;br /&gt;
 * pre-decimal positions is: (width - prec - 1).&lt;br /&gt;
 */&lt;br /&gt;
void writeDouble_WIFI(double number, uint8_t width, uint8_t prec)&lt;br /&gt;
{char buffer[width + 1];&lt;br /&gt;
	dtostrf(number, width, prec, &amp;amp;buffer[0]);&lt;br /&gt;
	writeString_WIFI(&amp;amp;buffer[0]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Write a floating point number to the LCD.&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *&lt;br /&gt;
 *			// Write a floating point number to the LCD (no exponent):&lt;br /&gt;
 *			writeDoubleLCD(1234567.890, 11, 3);&lt;br /&gt;
 *&lt;br /&gt;
 * The value of prec (precision) defines the number of decimal places.&lt;br /&gt;
 * For 32 bit floating point variables (float, double ...) 6 is&lt;br /&gt;
 * the max. value for prec (7 relevant digits).&lt;br /&gt;
 * The value of width defines the overall number of characters in the&lt;br /&gt;
 * floating point number including the decimal point. The number of&lt;br /&gt;
 * pre-decimal positions is: (width - prec - 1).&lt;br /&gt;
 */&lt;br /&gt;
void writeDoubleLCD(double number, uint8_t width, uint8_t prec)&lt;br /&gt;
{char buffer[width + 1];&lt;br /&gt;
	dtostrf(number, width, prec, &amp;amp;buffer[0]);&lt;br /&gt;
	writeStringLCD(&amp;amp;buffer[0]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Error handler&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function gets called automatically if there was an I2C Error like&lt;br /&gt;
 * the slave sent a &amp;quot;not acknowledge&amp;quot; (NACK, error codes e.g. 0x20 or 0x30).&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void I2C_transmissionError(uint8_t errorState)&lt;br /&gt;
{&lt;br /&gt;
	writeString_P_WIFI(&amp;quot;\nI2C ERROR - TWI STATE: 0x&amp;quot;);&lt;br /&gt;
	writeInteger_WIFI(errorState, HEX);&lt;br /&gt;
	writeChar_WIFI('\n');&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Main function - The program starts here:&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
	initRP6M256();    // Always call this first! The Processor will not work&lt;br /&gt;
					  // correctly otherwise. &lt;br /&gt;
&lt;br /&gt;
	initLCD(); // Initialize the LC-Display (LCD)&lt;br /&gt;
			   // Always call this before using the LCD!&lt;br /&gt;
&lt;br /&gt;
	setLEDs(0b1111);&lt;br /&gt;
	mSleep(500);&lt;br /&gt;
	setLEDs(0b0000);&lt;br /&gt;
&lt;br /&gt;
	writeString_P_WIFI(&amp;quot;\n\nRP6 Sensor Board Selftest 3!\n&amp;quot;); &lt;br /&gt;
&lt;br /&gt;
	// IMPORTANT:&lt;br /&gt;
	I2CTWI_initMaster(100); // Initialize the TWI Module for Master operation&lt;br /&gt;
							// with 100kHz SCL Frequency&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	// Register the event handler:&lt;br /&gt;
	I2CTWI_setTransmissionErrorHandler(I2C_transmissionError);&lt;br /&gt;
&lt;br /&gt;
	setLEDs(0b1111);&lt;br /&gt;
&lt;br /&gt;
	// Write a text message to the LCD:&lt;br /&gt;
	showScreenLCD(&amp;quot;################&amp;quot;, &amp;quot;################&amp;quot;);&lt;br /&gt;
	mSleep(1500);&lt;br /&gt;
	showScreenLCD(&amp;quot;RP6v2-M256-WIFI &amp;quot;, &amp;quot;Example Program&amp;quot;);&lt;br /&gt;
	mSleep(2500); &lt;br /&gt;
	showScreenLCD(&amp;quot;RP6 Sensor Board&amp;quot;, &amp;quot;   Selftest 3&amp;quot;);&lt;br /&gt;
	mSleep(2500);&lt;br /&gt;
	clearLCD();&lt;br /&gt;
&lt;br /&gt;
	setLEDs(0b0000);&lt;br /&gt;
&lt;br /&gt;
	// ---------------------------------------&lt;br /&gt;
&lt;br /&gt;
	uint8_t onoff = 0;&lt;br /&gt;
&lt;br /&gt;
	startStopwatch1();&lt;br /&gt;
	startStopwatch2();&lt;br /&gt;
&lt;br /&gt;
	// IMPORTANT:&lt;br /&gt;
	sensor_board_init();						// RP6 Sensor Board init!!!&lt;br /&gt;
	mSleep(200);&lt;br /&gt;
	I2C_BHT_init();								// RP6 BHT Module init&lt;br /&gt;
&lt;br /&gt;
	while(true) &lt;br /&gt;
	{&lt;br /&gt;
		if(getStopwatch1() &amp;gt; 1000) // 1s&lt;br /&gt;
		{&lt;br /&gt;
//			if (onoff) onoff = 0;&lt;br /&gt;
//			else onoff = 1;&lt;br /&gt;
&lt;br /&gt;
			// Show Pressure Sensor data:&lt;br /&gt;
			I2C_BHT_B_read();					// Read data&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nLuftdruck:   &amp;quot;);&lt;br /&gt;
			writeDouble_WIFI(P, 7, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot; hPa am Messort (ALTITUDE m)\n&amp;quot;);&lt;br /&gt;
			// Calculate pressure at sea level at TA_DEFAULT (15 °C):&lt;br /&gt;
			P0 = reduceAirPressure(P, TA_DEFAULT);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;Luftdruck:   &amp;quot;);&lt;br /&gt;
			writeDouble_WIFI(P0, 7, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot; hPa in Meereshöhe (0 m, 15 C)\n&amp;quot;);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;Temperatur:  &amp;quot;);&lt;br /&gt;
			writeDouble_WIFI(T, 7, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot; C\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			// Show Humidity Sensor data:&lt;br /&gt;
			H = I2C_BHT_HT_readHumidity();		// Read data&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nLuftfeuchte: &amp;quot;);&lt;br /&gt;
			writeDouble_WIFI(H, 7, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot; % RH\n&amp;quot;);&lt;br /&gt;
			HT = I2C_BHT_HT_readTemperature();	// Read data&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;Temperatur:  &amp;quot;);&lt;br /&gt;
			writeDouble_WIFI(HT, 7, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot; C\n\n\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			// RP6 Sensor Board shutdown (button &amp;amp; status LED test):&lt;br /&gt;
			if (pressedButton) {&lt;br /&gt;
				setStatusLED(1);&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;\nPress button again for RP6 Sensor Board SHUTDOWN!\n&amp;quot;);&lt;br /&gt;
				mSleep(2000);&lt;br /&gt;
				do {&lt;br /&gt;
					if(getStopwatch2() &amp;gt; 200) { // 0.2s&lt;br /&gt;
						if (onoff) onoff = 0;&lt;br /&gt;
						else onoff = 1;&lt;br /&gt;
						if (onoff) setStatusLED(1);&lt;br /&gt;
						else setStatusLED(0);&lt;br /&gt;
						setStopwatch2(0);&lt;br /&gt;
					}&lt;br /&gt;
					mSleep(1);&lt;br /&gt;
					task_I2CTWI();&lt;br /&gt;
				} while (!readButton());&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;\n\n\n\n\nPlease wait for RP6 Sensor Board SHUTDOWN...\n&amp;quot;);&lt;br /&gt;
				sensor_board_shutdown();&lt;br /&gt;
				mSleep(3000);&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;\n\n\nThe RP6 Sensor Board now is in SHUTDOWN MODE!!!\n&amp;quot;);&lt;br /&gt;
				mSleep(1000);&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;\nRESET the M256 microcontroller now...\n\n&amp;quot;);&lt;br /&gt;
				while(true) {};&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			setStopwatch1(0);&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		task_RP6SensorBoard();					// RP6 Sensor Board task&lt;br /&gt;
&lt;br /&gt;
		task_I2CTWI();&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Erklärung&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Erfahrungsberichte==&lt;br /&gt;
&lt;br /&gt;
...in Arbeit...(kann aber gerne ergänzt werden)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Siehe auch==&lt;br /&gt;
* [[RP6v2]]&lt;br /&gt;
* [[RP6]]&lt;br /&gt;
* [[RP6 - Programmierung]]&lt;br /&gt;
* [[RP6 Kamera - Mitmach-Projekt]]&lt;br /&gt;
* [[RP6v2 I2C-Portexpander]]&lt;br /&gt;
* [[RP6v2 USB-RS232-Adapter]]&lt;br /&gt;
* [[RP6v2 Orientierung]]&lt;br /&gt;
* [[RP6 Multi IO Projekt]]&lt;br /&gt;
* [[RP6 Multi IO Projekt - Software]]&lt;br /&gt;
* [[RP6 ArduIO]]&lt;br /&gt;
* [[RP6 ArduIO - Software]]&lt;br /&gt;
* [[Induktive_Ladestation_f%C3%BCr_den_RP6|Induktive Ladestation für den RP6]]&lt;br /&gt;
* [[IR-bake_f%C3%BCr_den_RP6|IR-bake für den RP6]]&lt;br /&gt;
* [[CCRP5]]&lt;br /&gt;
* [[Wild Thumper]]&lt;br /&gt;
* [[Wild Thumper - Programmierung]]&lt;br /&gt;
* [[Yeti]]&lt;br /&gt;
* [[Asuro]]&lt;br /&gt;
* [[C't-Bot]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Weblinks==&lt;br /&gt;
'''Siehe auch die Weblinks im [http://www.rn-wissen.de/index.php/RP6v2#Weblinks RP6v2] und im [http://www.rn-wissen.de/index.php/RP6#Weblinks RP6] Artikel!'''&lt;br /&gt;
&lt;br /&gt;
* [http://www.conrad.de/ce/de/product/1082384/Arexx-RP6-Sensor-Board-RP6-JM03-61 RP6 Sensor Board bei CONRAD]&lt;br /&gt;
* JM3 Engineering:&lt;br /&gt;
** [http://www.jm3-engineering.com/rp6.htm RP6 Roboter Erweiterung]&lt;br /&gt;
** [http://www.jm3-engineering.com/sensors.htm Sensor Module]&lt;br /&gt;
** [http://www.jm3-engineering.com/downloads.htm Software Downloads]&lt;br /&gt;
* Ankündigung einer Sensorerweiterungsplatine für die RP6v2 M256 WiFi im [http://www.roboternetz.de/community/threads/63595-Neue-Hardware-f%C3%BCr-RP6%28v2%29?p=590129&amp;amp;viewfull=1#post590129 Roboternetz RP6 Forum]&lt;br /&gt;
* Erfahrungsbericht zum Sensor Board im [http://www.arexx.com/forum/viewtopic.php?f=19&amp;amp;t=2498 AREXX Support Forum] und im [http://www.roboternetz.de/community/threads/64414-RP6-Sensor-Board-Erster-Eindruck Roboternetz RP6 Forum]&lt;br /&gt;
* Erfahrungsbericht zum I2C GPS Empfänger im [http://www.arexx.com/forum/viewtopic.php?f=19&amp;amp;t=2509 AREXX Support Forum]&lt;br /&gt;
* Erfahrungsbericht zum I2C BHT Modul im [http://www.arexx.com/forum/viewtopic.php?f=19&amp;amp;t=2646 AREXX Support Forum]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Kategorie:Robotikeinstieg]]	 &lt;br /&gt;
[[Kategorie:Praxis]]&lt;br /&gt;
&lt;br /&gt;
==Autoren==&lt;br /&gt;
--[http://www.roboternetz.de/community/members/1972-Dirk Dirk] 11:28, 31. Mär 2022 (CET)&lt;/div&gt;</summary>
		<author><name>Dirk NO2</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=RP6_Sensor_Board_und_Xtra_Module&amp;diff=28580</id>
		<title>RP6 Sensor Board und Xtra Module</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=RP6_Sensor_Board_und_Xtra_Module&amp;diff=28580"/>
				<updated>2022-03-31T09:24:58Z</updated>
		
		<summary type="html">&lt;p&gt;Dirk NO2: /* Was bisher geschah */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Bild:RP6_Sensor_Board.jpg|Das RP6 Sensor Board|right|500px]]&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_Xtra_module.JPG|RP6 Xtra module|right|500px]]&lt;br /&gt;
==Was bisher geschah==&lt;br /&gt;
'''Siehe auch &amp;quot;Was bisher geschah&amp;quot; im [http://www.rn-wissen.de/index.php/RP6v2#Was_bisher_geschah RP6v2] und im [http://www.rn-wissen.de/index.php/RP6#Was_bisher_geschah RP6] Artikel!'''&lt;br /&gt;
&lt;br /&gt;
Mit, 27. Nov 2013 - Ankündigung einer Sensorerweiterungsplatine, die an die RP6v2-M256-WIFI angeschlossen werden kann&amp;lt;br/&amp;gt;&lt;br /&gt;
Sam, 22. Feb 2014 - Auslieferungsbeginn des RP6 Sensor Boards, des I2C GPS Empfängers, des 3D Accelerometer Moduls und des Gyro Moduls&amp;lt;br/&amp;gt;&lt;br /&gt;
Mon, 17. Mär 2014 - Das RP6 Sensor Board ist &amp;quot;nicht lieferbar&amp;quot;, neuer Liefertermin angekündigt für den 12.06.2014 (!?)&amp;lt;br/&amp;gt;&lt;br /&gt;
Die, 25. Mär 2014 - Das RP6 Sensor Board ist wieder &amp;quot;sofort lieferbar&amp;quot;&amp;lt;br/&amp;gt;&lt;br /&gt;
August 2014 - Ein neues Xtra Modul wird von JM3 Engineering angekündigt: Das &amp;quot;Wetterstations Sensor Modul&amp;quot;&amp;lt;br/&amp;gt;&lt;br /&gt;
November 2014 - Das &amp;quot;Wetterstations Sensor Modul&amp;quot; ist bei [http://www.jm3-engineering.com/sensors.htm JM3 Engineering] als &amp;quot;BHT Modul&amp;quot; abgebildet und ein Manual verfügbar&amp;lt;br/&amp;gt;&lt;br /&gt;
Don, 22. Jan 2015 - Auslieferungsbeginn des BHT Moduls&amp;lt;br/&amp;gt;&lt;br /&gt;
Son, 18. Dez 2016 - Laut JM3 Engineering wird das 3D Accelerometer DIL Modul nicht mehr produziert, ist aber weiterhin erhältlich&amp;lt;br/&amp;gt;&lt;br /&gt;
Oktober 2017 - Das RP6 Sensor Board und der I2C GPS Empfänger sind bei CONRAD ausverkauft&amp;lt;br/&amp;gt;&lt;br /&gt;
April 2019 - Das Gyro Modul und das BHT Modul sind bei CONRAD ausverkauft&amp;lt;br/&amp;gt;&lt;br /&gt;
Mai 2020 - Die Experimentierplatine, das Backlight-Display, der Graustufen-Boden-Sensor, der Drehgeber-Satz RP6-ENCv3 und das 3D Accelerometer Modul sind bei CONRAD ausverkauft&amp;lt;br/&amp;gt;&lt;br /&gt;
Ende 2021 - Die RP6 CONTROL M32 Platine, die Ersatzräder, die Ersatzraupen und das RP6 USB-Interface RP6v2-TRANS sind bei CONRAD ausverkauft&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Allgemein==&lt;br /&gt;
Dieser Artikel beschreibt die Grundlagen und Programmierung des RP6 Sensor Boards und der RP6 Xtra Module. Dieses Erweiterungs-Modul und die Xtra Module sind Teile des RP6-Systems, das in den RN-Wissen-Artikeln [[RP6]], [[RP6v2]] und [[RP6_-_Programmierung|RP6 - Programmierung]] ausführlich beschrieben wird. Ausgegliedert aus den &amp;quot;Haupt-Artikeln&amp;quot; habe ich diese Module, da sie m.E. zu einer neuen &amp;quot;Ära&amp;quot; des RP6-Systems gehören:&lt;br /&gt;
&lt;br /&gt;
Sie wurden nicht mehr von '''[http://www.roboternetz.de/community/members/120-SlyD SlyD] (Dominik S. Herwald)''' in Zusammenarbeit mit '''[http://www.arexx.com/ AREXX]''' entwickelt, sondern ab 2013 von '''[http://jm3-engineering.com/ JM3 Engineering] (Dipl.-Ing. Jürgen Maisel)'''. Ab Februar 2014 waren dann das '''RP6 Sensor Board RP6-JM03-61''' ([http://www.conrad.de/ce/de/product/1082384/Arexx-RP6-Sensor-Board-RP6-JM03-61 1082384]) und die drei RP6 Xtra Module '''I2C GPS Empfänger JM3-GPS''' ([http://www.conrad.de/ce/de/product/1082385/Arexx-IC-GPS-Empfaenger-JM3-GPS 1082385]), '''Gyro Modul JM3-GYRO''' ([http://www.conrad.de/ce/de/product/1082386/Arexx-Gyro-Modul-JM3-GYRO 1082386]) und '''3D Accelerometer Modul JM3-3DA''' ([http://www.conrad.de/ce/de/product/1082387/Arexx-3D-Accelerometer-Modul-JM3-3DA 1082387]) bei CONRAD lieferbar. Einen ersten Eindruck vom Sensor Board kann man im RoboterNetz und AREXX Support Forum bekommen,- siehe unter [[RP6_Sensor_Board_und_Xtra_Module#Weblinks|Weblinks]]!&lt;br /&gt;
&lt;br /&gt;
===RP6 Sensor Board===&lt;br /&gt;
Das [[RP6_Sensor_Board_und_Xtra_Module#RP6_Sensor_Board_2|RP6 Sensor Board]] gehört zu den &amp;quot;Erweiterungs-Modulen&amp;quot; des RP6-Systems. '''Andere &amp;quot;Erweiterungs-Module&amp;quot; werden im [[RP6v2#Erweiterungs-Module|RP6v2]] und im [[RP6#Erweiterungs-Module|RP6]] Artikel beschrieben!'''&lt;br /&gt;
&lt;br /&gt;
Das ''RP6 Sensor Board'' ist das erste &amp;quot;Erweiterungs-Modul&amp;quot;, das nicht über einen eigenen Microprozessor verfügt,- es ist also ein ''passives Modul'', das von einem Microprozessor-System (z.B. RP6v2, M32, M128, M256 Wifi) angesteuert werden muss. Es ist ebenfalls das erste Modul, das nicht mehr über die rautenförmige Einbuchtung an der Vorderkante verfügt, sondern komplett rechteckig ist. Damit passt es (montiert auf den Standard-Abstandbolzen) nur auf den vorderen Platinenstapel 1 des RP6.&lt;br /&gt;
&lt;br /&gt;
===RP6 Xtra Module===&lt;br /&gt;
Die [[RP6_Sensor_Board_und_Xtra_Module#RP6_Xtra_Module_2|RP6 Xtra Module]] gehören zu den &amp;quot;Zubehör- und Ersatzteilen&amp;quot; des RP6-Systems. '''Über die weiteren &amp;quot;Zubehör- und Ersatzteile&amp;quot; zum RP6 informiert der entsprechende Abschnitt im [[RP6v2#Zubeh.C3.B6r_und_Ersatzteile|RP6v2]] und im [[RP6#Zubehör und Ersatzteile|RP6]] Artikel!'''&lt;br /&gt;
&lt;br /&gt;
Die ''RP6 Xtra Module'' unterscheiden sich von den weiteren &amp;quot;Zubehör- und Ersatzteilen&amp;quot; dadurch, dass sie selbstständige Sensor-Platinen sind, die ideal zum RP6-System passen, aber auch mit anderen Microcontroller-Plattformen nutzbar sind.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==RP6 Sensor Board==&lt;br /&gt;
Das RP6 Sensor Board RP6-JM03-61 ([http://www.conrad.de/ce/de/product/1082384/Arexx-RP6-Sensor-Board-RP6-JM03-61 1082384]) wurde am 27.11.2013 von [http://www.roboternetz.de/community/members/120-SlyD SlyD] angekündigt (siehe Weblink!).&lt;br /&gt;
&lt;br /&gt;
Aktuell (Oktober 2017) ist das RP6 Sensor Board bei CONRAD ausverkauft.&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_Sensor_Board.jpg|Das RP6 Sensor Board]]&lt;br /&gt;
&lt;br /&gt;
===Beschreibung===&lt;br /&gt;
(Laut Online-Katalog der Firma CONRAD!)&lt;br /&gt;
&lt;br /&gt;
''&amp;quot;Das RP6 Sensor Board erweitert die Möglichkeiten aller RP6 Roboter um wesentliche Sensorsignale für Robotik-Anwendungen wie zum Beispiel Dreharten (Yaw-Gyro), Kipp- und Neigewinkel, Kompassrichtung oder aber auch Zeit und Datum.&lt;br /&gt;
Sie können einfach mit zusätzlichen Sharp Sensoren Abstände genau messen, z.B. für autonome Fahrrouten oder falls der Sensor nach unten gerichtet ist, kann er Treppenstufen oder ähnliches entdecken. Außerdem gibt es die Möglichkeit z.B. die Sharp Sensoren ein- bzw. auszuschalten um Strom zu sparen. Zusätzlich können bis zu 8 Servos angesteuert werden um z.B. einen Roboterarm zu bewegen, der auch mechanisch einfach zu montieren ist. Um die Möglichkeiten des RP6 Sensor Boards komplett ausnutzen zu können, wird ein RP6V2 und RP6Wifi Control Board empfohlen. Die ermöglicht den Roboter über Wifi fernzusteuern oder Sensordaten auf dem Kommandozentrum (PC) z.B Kompassdaten, Temperatur oder Kipp- und Neigewinkel anzeigen zu lassen.&amp;quot;''&lt;br /&gt;
&lt;br /&gt;
'''Ausstattung'''&lt;br /&gt;
* Magnetometer- und Accelerometer für Kompassfunktion&lt;br /&gt;
* Gyro Sensor (Yaw)&lt;br /&gt;
* Sharp-Sensor Schnittstelle&lt;br /&gt;
* LED Scheinwerfer&lt;br /&gt;
* LED Treiber mit Smart Funktionen&lt;br /&gt;
* I²C Bus mit max. 400 kHz Übertragungsrate; Hot Swap I²C-Bus Buffer&lt;br /&gt;
* Taster mit LED&lt;br /&gt;
* Echtzeit-Uhr RTC&lt;br /&gt;
* Backupbatterie (Aufladung während des Betriebs)&lt;br /&gt;
* Expansion Port z.B. für GPS-I²C Bus Modul&lt;br /&gt;
* 8 Servo-Ausgänge mit eigenem Schaltregler&lt;br /&gt;
* 8 PWM Ausgänge&lt;br /&gt;
* 5 LED Ausgänge und 2 Digital-I/O Ausgänge.&lt;br /&gt;
&lt;br /&gt;
'''Lieferumfang'''&lt;br /&gt;
* RP6 Sensor Board&lt;br /&gt;
* Montage-Kit&lt;br /&gt;
* Kabel&lt;br /&gt;
* Anleitung und CD mit Dokumentation.&lt;br /&gt;
&lt;br /&gt;
====Blockschaltbild====&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_Sensor_Board_BSP.png|RP6 Sensor Board Blockschaltbild]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Technische Daten===&lt;br /&gt;
{|  {{Blauetabelle}} &lt;br /&gt;
|'''Mikrocontroller:'''&lt;br /&gt;
|kein&lt;br /&gt;
|-&lt;br /&gt;
|'''Speicher:'''&lt;br /&gt;
|kein&amp;lt;br/&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|'''Programmierung:'''&lt;br /&gt;
|C++ (GCC, u.a.) über externes µC-System&lt;br /&gt;
|-&lt;br /&gt;
|'''Vorhandene Sensoren:'''&lt;br /&gt;
|Temperatur, 3D Magnetfeld (Kompass), 3D Beschleunigung, Yaw-Gyro&amp;lt;br/&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|'''Vorhandene Aktoren:'''&lt;br /&gt;
|LED Controller (2 LEDs on board, 5 freie LED Ports), Status LED,&amp;lt;br/&amp;gt;Button, Servo (PWM) Controller für 8 Servos und 8 PWM-Kanäle,&amp;lt;br/&amp;gt;Real Time Clock (RTC), 2 freie I/O Ports&lt;br /&gt;
|-&lt;br /&gt;
|'''Abmessungen:'''&lt;br /&gt;
|(L &amp;amp;times; B &amp;amp;times; H) 112 &amp;amp;times; 90 &amp;amp;times; 19 mm&amp;lt;br/&amp;gt;(B + 5 mm durch Scheinwerfer vorn)&lt;br /&gt;
|-&lt;br /&gt;
|'''Ausführung:'''&lt;br /&gt;
|Fertig aufgebautes Erweiterungsmodul&lt;br /&gt;
|-&lt;br /&gt;
|'''Stromversorgung:'''&lt;br /&gt;
|6 AA NiMH Akkus (über die RP6v2 Base)&amp;lt;br/&amp;gt;und optionaler Zusatzakku 7,2..10 V für Servo Power&lt;br /&gt;
|-&lt;br /&gt;
|'''Hersteller:'''&lt;br /&gt;
|Arexx Niederlande&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Umbau-Optionen===&lt;br /&gt;
Hier soll beschrieben werden, welche Umbau-Optionen es für das RP6 Sensor Board gibt. Im Text gibt es Verweise auf den Schaltplan des RP6 Sensor Boards (RP6_Sensor_Board_Rev2_Schema.pdf) in der Form: (SP2: Bauteil). Dies bedeutet, dass man das Bauteil auf Blatt 2 des Schaltplans finden kann. Beispielhaft sind im folgenden Text Bestell-Nummern der Firma [http://www.conrad.de/ce/ CONRAD] genannt. Natürlich kann man die Teile auch bei anderen Versendern beziehen.&lt;br /&gt;
&lt;br /&gt;
====USRBUS- und XBUS-Wannenstecker====&lt;br /&gt;
Der zweite Wannenstecker für den XBUS (SP3: K14) und USRBUS (SP3: K16) kann nachbestückt werden.&lt;br /&gt;
Man braucht dazu: &lt;br /&gt;
* 2 Wannenstecker 2x7-polig gerade RM 2,54mm (CONRAD [http://www.conrad.de/ce/de/product/741687/Stiftleiste-Print-Montage-gerade-Rastermass-254-mm-Pole-2-x-7-10120556-BKL-Electronic-Inhalt-1-St 741687])&lt;br /&gt;
Die Wannenstecker lötet man auf die eingezeichneten Positionen.&lt;br /&gt;
&lt;br /&gt;
'''USRBUS-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''USRBUS''' || '''Sensor Board-Funktion''' || '''Verwendung''' || '''I/O'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Y1 || &amp;quot;ADC0&amp;quot; || SHARP vorn || I&lt;br /&gt;
|-&lt;br /&gt;
| 2 || Y2 || &amp;quot;ADC1&amp;quot; || Yaw-Gyro || I&lt;br /&gt;
|-&lt;br /&gt;
| 3 || Y3 || PWR || Power für&amp;lt;br/&amp;gt;SHARPs, CAM_IF,&amp;lt;br/&amp;gt;I2C-MODULE || O&lt;br /&gt;
|-&lt;br /&gt;
| 4 || Y4 || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 5 || Y5 || &amp;quot;ADC4&amp;quot; || SHARP hinten ||I&lt;br /&gt;
|-&lt;br /&gt;
| 6..14 || Y6..Y14 || || keine ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
'''XBUS-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''XBUS''' || '''M256-Port''' ||'''M256-Funktion''' || '''Sensor Board-Funktion''' || '''Jumper''' || '''Verwendung''' || '''I/O'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || GND || || GND || GND || || ||&lt;br /&gt;
|-&lt;br /&gt;
| 2 || GND || || GND || GND || || ||&lt;br /&gt;
|-&lt;br /&gt;
| 3 || VDD || || VDD|| VDD_1 || || VDD +5V ||&lt;br /&gt;
|-&lt;br /&gt;
| 4 || +UB || || +UB || VSS_1 || || CAM_IF Power ||&lt;br /&gt;
|-&lt;br /&gt;
| 5 || VDD || || VDD || VDD_1 || || VDD +5V ||&lt;br /&gt;
|-&lt;br /&gt;
| 6 || +UB || || +UB || VSS_1 || || CAM_IF Power ||&lt;br /&gt;
|-&lt;br /&gt;
| 7 || INTU || PJ4 || PCINT13 || INTU || || keine || I&lt;br /&gt;
|-&lt;br /&gt;
| 8 || INT1 || PJ3 || PCINT12 || INT1 || 3 || LSM303DLHC: INT1 || I&lt;br /&gt;
|-&lt;br /&gt;
| 9 || INT3 || PJ5 || PCINT14 || INT3 || 2&amp;lt;br/&amp;gt;5 || DS1339: SQW/INT_N&amp;lt;br/&amp;gt;LSM303DLHC: INT2 || I&amp;lt;br/&amp;gt;I&lt;br /&gt;
|-&lt;br /&gt;
| 10 || SCL || PD0 || SCL || SCL_M || || I2C-Bus || O&lt;br /&gt;
|-&lt;br /&gt;
| 11 || INT2 || PJ6 || PCINT15 || INT2 || 4 || MAX7311: INT_N || I&lt;br /&gt;
|-&lt;br /&gt;
| 12 || SDA || PD1 || SDA || SDA_M || || I2C-Bus || I/O&lt;br /&gt;
|-&lt;br /&gt;
| 13 || MRESET || || MRESET || MRESET || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 14 || GND || || GND || GND || || ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====I/O-Patchfield_1====&lt;br /&gt;
Dieses 2x 5-polige &amp;quot;Patchfield_1&amp;quot; (SP3: K8), beschriftet mit &amp;quot;I/O&amp;quot; liegt neben dem Wannenstecker I/O und weist dieselbe Belegung auf. Möchte man auf dem Sensor Board Verbindungen über den Wannenstecker I/O zu einer angeschlossenen Microprozessor-Platine herstellen, dann kann man auf das &amp;quot;Patchfield_1&amp;quot; eine Stiftleiste löten.&lt;br /&gt;
Man braucht dazu: &lt;br /&gt;
* 2-reihige Stiftleiste RM 2,54mm (z.B. 2x40-polig [http://www.conrad.de/ce/de/product/741306/Doppelreihige-Stiftleiste-RM-254-gerade-Pole-2-x-40-10120173-BKL-Electronic-Inhalt-1-St 741306]) &lt;br /&gt;
Man trennt von der 2-reihigen Stiftleiste 2x5 Kontakte ab und lötet sie auf die Lötpunkte &amp;quot;I/O&amp;quot;. Zuvor muss man u.U. Lötzinnreste aus den Lötpunkten mit Entlötlitze bzw. Entlötsaugpumpe entfernen.&lt;br /&gt;
&lt;br /&gt;
'''Stecker I/O an M256 IO_PWM/T0/T1:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''M256-Port''' ||'''M256-Funktion''' || '''Sensor Board-Funktion''' || '''Verwendung''' || '''I/O'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || PD4 || ICP1 || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 2 || || GND || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 3 || PD6 || T1 || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 4 || PB7 || OC0A || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 5 || PG5 || OC0B || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 6 || PD7 || T0 || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 7 || PB5 || OC1A || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 8 || PK5 || ADC13 || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 9 || PB6 || OC1B || &amp;quot;PD5&amp;quot; || I2C Bus Buffer Enable || O&lt;br /&gt;
|-&lt;br /&gt;
| 10 || || VDD || || keine ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====ADC-Patchfield_2====&lt;br /&gt;
Dieses 2x 5-polige &amp;quot;Patchfield_2&amp;quot; (SP3: K9), beschriftet mit &amp;quot;ADC&amp;quot; liegt neben dem Wannenstecker ADC und weist dieselbe Belegung auf. Möchte man auf dem Sensor Board Verbindungen über den Wannenstecker ADC zu einer angeschlossenen Microprozessor-Platine herstellen, dann kann man auf das &amp;quot;Patchfield_2&amp;quot; eine Stiftleiste löten.&lt;br /&gt;
Man braucht dazu: &lt;br /&gt;
* 2-reihige Stiftleiste RM 2,54mm (z.B. 2x40-polig [http://www.conrad.de/ce/de/product/741306/Doppelreihige-Stiftleiste-RM-254-gerade-Pole-2-x-40-10120173-BKL-Electronic-Inhalt-1-St 741306]) &lt;br /&gt;
Man trennt von der 2-reihigen Stiftleiste 2x5 Kontakte ab und lötet sie auf die Lötpunkte &amp;quot;ADC&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
'''Stecker ADC an M256 ADC_IO2/CMP:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''M256-Port''' ||'''M256-Funktion''' || '''Sensor Board-Funktion''' || '''Jumper''' || '''Verwendung''' || '''I/O'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || PK0 || ADC8 || || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 2 || || GND || || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 3 || PK1 || ADC9 || &amp;quot;ADC4&amp;quot; || 6 || SHARP hinten || I&lt;br /&gt;
|-&lt;br /&gt;
| 4 || PE3 || OC3A/AIN1 || || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 5 || PK2 || ADC10 || || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 6 || || GND || || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 7 || PK3 || ADC11 || || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 8 || PE2 || XCK0/AIN0 || || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 9 || PK4 || ADC12 || || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 10 || || VDD || || || keine ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Anschluss-Optionen===&lt;br /&gt;
Hier soll beschrieben werden, welche Anschluss-Optionen es für das RP6 Sensor Board gibt. In erster Linie geht es dabei um die Belegung der vorhandenen Stecker bzw. Stiftleisten.&lt;br /&gt;
&lt;br /&gt;
Allgemein kann man Anschlüsse an Stiftleisten mit entsprechenden Steckbuchsen erreichen. Solche Steckbuchsen sind z.B. bei ELV erhältlich:&lt;br /&gt;
* Steckbuchse, 2-polig, RM 2,54mm ([http://www.elv.de/steckbuchse-2-polig.html ELV 68-016635])&lt;br /&gt;
* Steckbuchse, 3-polig, RM 2,54mm ([http://www.elv.de/steckbuchse-3-polig.html ELV 68-022503])&lt;br /&gt;
* Steckbuchse, 5-polig, RM 2,54mm ([http://www.elv.de/steckbuchse-5-polig.html ELV 68-023073])&lt;br /&gt;
Die Crimpkontakte dieser Steckbuchse werden an Litzen angequetscht (oder angelötet) und zum entsprechenden Sensor bzw. Aktor geführt. &lt;br /&gt;
&lt;br /&gt;
====I2C-MODULE====&lt;br /&gt;
Der I2C-MODULE Anschluss (SP1: M1) auf dem Sensor Board besteht aus einer 9-poligen Präzisions-Buchsenleiste RM 2,54mm (z.B. [http://www.conrad.de/ce/de/product/741360/Praezisions-Buchsenleiste-RM-254-gerade-Pole-1-x-20-10120832-BKL-Electronic-Inhalt-1-St 741360]). Wenn man eigene I2C-Module hier anschliessen will, braucht man zur Kontaktierung:&lt;br /&gt;
* Präzisions-Stiftleiste, 9-polig, RM 2,54mm (z.B. [http://www.conrad.de/ce/de/product/741307/Praezisions-Stiftleiste-RM-254-gerade-Pole-1-x-20-10120536-BKL-Electronic-Inhalt-1-St 741307])&lt;br /&gt;
&lt;br /&gt;
'''I2C-MODULE-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''Sensor Board&amp;lt;br/&amp;gt;-Funktion (M1)''' || '''Verwendung''' || '''I/O''' |||| [[RP6_Sensor_Board_und_Xtra_Module#I2C_GPS_Empf.C3.A4nger_JM3-GPS|'''I2C GPS Empfänger]]&amp;lt;br/&amp;gt;-Funktion (K1)''' ||&lt;br /&gt;
[[RP6_Sensor_Board_und_Xtra_Module#BHT_Modul_JM3-BHT31|'''BHT Modul]]&amp;lt;br/&amp;gt;-Funktion (K1)'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || VCC || +5V || |||| VCC_1 || VDD&lt;br /&gt;
|-&lt;br /&gt;
| 2 || SCLOUT || Buffered I2C-Bus || O |||| SCL/SCK || SCL&lt;br /&gt;
|-&lt;br /&gt;
| 3 || SDAOUT || Buffered I2C-Bus || I/O |||| SDA/MOSI || SDA&lt;br /&gt;
|-&lt;br /&gt;
| 4 || NC || keine || |||| ||&lt;br /&gt;
|-&lt;br /&gt;
| 5 || I/O1 || Status LED || O |||| ||&lt;br /&gt;
|-&lt;br /&gt;
| 6 || I/O2 || Taster || I |||| ||&lt;br /&gt;
|-&lt;br /&gt;
| 7 || NC || keine || |||| ||&lt;br /&gt;
|-&lt;br /&gt;
| 8 || GND || GND (geschaltet!) || |||| GND || GND&lt;br /&gt;
|-&lt;br /&gt;
| 9 || GND || GND (geschaltet!) || |||| GND || GND&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====CAM_IF====&lt;br /&gt;
Der CAM_IF Anschluss (SP1: K28) ist eine 2x 3-polige Stiftleiste mit der folgenden Belegung:&lt;br /&gt;
&lt;br /&gt;
'''CAM_IF-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''Sensor Board&amp;lt;br/&amp;gt;-Funktion (K28)''' || '''Verwendung''' || '''I/O'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || GND || GND (geschaltet!) ||&lt;br /&gt;
|-&lt;br /&gt;
| 2 || VSS_1 || +7,2..10V (RP6: +UB) ||&lt;br /&gt;
|-&lt;br /&gt;
| 3 || SCLOUT || Buffered I2C-Bus || O&lt;br /&gt;
|-&lt;br /&gt;
| 4 || SDAOUT || Buffered I2C-Bus || I/O&lt;br /&gt;
|-&lt;br /&gt;
| 5 || SCL_M || I2C-Bus || O&lt;br /&gt;
|-&lt;br /&gt;
| 6 || SDA_M || I2C-Bus || I/O&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====IO_EXT====&lt;br /&gt;
Der IO_EXT Anschluss (SP1: K19) ist eine 2x 2-polige Stiftleiste mit der folgenden Belegung:&lt;br /&gt;
&lt;br /&gt;
'''IO_EXT-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''Sensor Board&amp;lt;br/&amp;gt;-Funktion (K19)''' || '''Verwendung''' || '''I/O'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || MAX7311: I/O1.2 || freier I/O Port || I/O&lt;br /&gt;
|-&lt;br /&gt;
| 2 || GND || ||&lt;br /&gt;
|-&lt;br /&gt;
| 3 || MAX7311: I/O1.1 || freier I/O Port || I/O&lt;br /&gt;
|-&lt;br /&gt;
| 4 || GND || ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====PWM_OUT====&lt;br /&gt;
Der PWM_OUT Anschluss (SP5: K12) ist eine 2x 4-polige Stiftleiste mit der folgenden Belegung:&lt;br /&gt;
&lt;br /&gt;
'''PWM_OUT-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''Sensor Board&amp;lt;br/&amp;gt;-Funktion (K12)''' || '''Verwendung''' || '''I/O'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || PCA9685: PWM0 || freier PWM Port || O&lt;br /&gt;
|-&lt;br /&gt;
| 2 || PCA9685: PWM1 || freier PWM Port || O&lt;br /&gt;
|-&lt;br /&gt;
| 3 || PCA9685: PWM2 || freier PWM Port || O&lt;br /&gt;
|-&lt;br /&gt;
| 4 || PCA9685: PWM3 || freier PWM Port || O&lt;br /&gt;
|-&lt;br /&gt;
| 5 || PCA9685: PWM4 || freier PWM Port || O&lt;br /&gt;
|-&lt;br /&gt;
| 6 || PCA9685: PWM5 || freier PWM Port || O&lt;br /&gt;
|-&lt;br /&gt;
| 7 || PCA9685: PWM6 || freier PWM Port || O&lt;br /&gt;
|-&lt;br /&gt;
| 8 || PCA9685: PWM7 || freier PWM Port || O&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====TP1====&lt;br /&gt;
Am Testpunkt TP1 (SP4: TP1) kann man das Signal SQW/INT_N der RTC (DS1339) prüfen/messen.&lt;br /&gt;
&lt;br /&gt;
====LEDs====&lt;br /&gt;
=====Rücklichter=====&lt;br /&gt;
Der Rücklichter Anschluss (SP1: K10) ist eine 2-polige Stiftleiste mit der folgenden Belegung:&lt;br /&gt;
&lt;br /&gt;
'''Rücklichter-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''Sensor Board&amp;lt;br/&amp;gt;-Funktion (K10)''' || '''Verwendung''' || '''I/O'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || TCA6507: P3 || Rücklicht rechts || O&lt;br /&gt;
|-&lt;br /&gt;
| 2 || TCA6507: P4 || Rücklicht links || O&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=====Display-Hintergrundbeleuchtung=====&lt;br /&gt;
Der Display-Hintergrundbeleuchtung Anschluss (SP1: K7) ist eine 2-polige Stiftleiste mit der folgenden Belegung:&lt;br /&gt;
&lt;br /&gt;
'''Display-Hintergrundbeleuchtung-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''Sensor Board&amp;lt;br/&amp;gt;-Funktion (K7)''' || '''Verwendung''' || '''I/O'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || TCA6507: P0 || Display-Hintergrundbeleuchtung || O&lt;br /&gt;
|-&lt;br /&gt;
| 2 || VDD_1 || +5V ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=====Freie Ausgänge=====&lt;br /&gt;
Der freie Ausgang 1 Anschluss (SP1: K4) ist eine 2-polige Stiftleiste mit der folgenden Belegung:&lt;br /&gt;
&lt;br /&gt;
'''Freier Ausgang 1-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''Sensor Board&amp;lt;br/&amp;gt;-Funktion (K4)''' || '''Verwendung''' || '''I/O'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || TCA6507: P1 || freier LED Port || O&lt;br /&gt;
|-&lt;br /&gt;
| 2 || VDD_1 || +5V ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Der freie Ausgang 2 Anschluss (SP1: K2) ist eine 2-polige Stiftleiste mit der folgenden Belegung:&lt;br /&gt;
&lt;br /&gt;
'''Freier Ausgang 2-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''Sensor Board&amp;lt;br/&amp;gt;-Funktion (K2)''' || '''Verwendung''' || '''I/O'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || TCA6507: P2 || freier LED Port || O&lt;br /&gt;
|-&lt;br /&gt;
| 2 || VDD_1 || +5V ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====SHARP Sensoren====&lt;br /&gt;
Das RP6 Sensor Board verfügt über zwei Stecker SHARP_F (SP1: K5) und SHARP_R (SP1: K3) zum Anschluß von analogen SHARP Infrarot-Distanz-Sensoren. Folgende SHARP Sensoren sind anschließbar:&lt;br /&gt;
* 1. SHARP Distanz-Sensor GP2Y0A41SK0F ([http://www.conrad.de/ce/de/product/504596/Distanz-Sensor-GP2Y0A41SK0F-Sharp-GP2Y0A41SK0F-Messbereiche-Erfassungsbereich-4-30-cm-5-VDC 504596]), Messbereich 4..30cm&lt;br /&gt;
* 2. SHARP Distanz-Sensor GP2Y0A21YK0F ([http://www.conrad.de/ce/de/product/504591/Distanz-Sensor-GP2Y0A21YK0F-Sharp-GP2Y0A21YK0F-Messbereiche-Erfassungsbereich-10-80-cm-5-VDC 504591]), Messbereich 10..80cm&lt;br /&gt;
* 3. SHARP Distanz-Sensor GP2Y0A02YK ([http://www.conrad.de/ce/de/product/185364/Distanz-Sensor-GP-2-Y0A-02-YK-Sharp-GP-2-Y0A-02-YK-Messbereiche-Erfassungsbereich-20-150-cm-5-VDC 185364]), Messbereich 20..150cm&lt;br /&gt;
* 4. SHARP Distanz-Sensor GP2Y0A710K0F ([http://www.conrad.de/ce/de/product/504597/Distanz-Sensor-GP2Y0A710K0F-Sharp-GP2Y0A710K0F-Messbereiche-Erfassungsbereich-100-550-cm-5-VDC 504597]), Messbereich 100..550cm&lt;br /&gt;
''Die Auswahl der geeigneten SHARP Sensoren hängt von der gewünschten Funktion ab: Zur Erkundung großer Räume eignet sich insbesondere der Typ 4 mit einer hohen Reichweite von 5,5m. Er ist aber ungeeignet, die Distanz von Objekten zu erkennen, die sich näher als 1m vor dem Sensor befinden. Ein guter Kompromiss zwischen Nahbereichsmessung und &amp;quot;Fernsicht&amp;quot; sind die Typen 2 (10..80cm) und 3 (20..150cm). Will man den Distanz-Sensor vor allem zur Vermeidung eins Sturzes von einer Treppe (Tiefenerkennung) oder nur zur Erkennung von Hindernissen direkt vor dem Roboter (Kollisionserkennung) benutzen, dann eignet sich insbesondere für den vorderen Sensor (SHARP_F) der Typ 1, da er im Nahbereich von 4 bis 30cm messen kann.''&lt;br /&gt;
&lt;br /&gt;
Für die Verbindung zwischen den beiden 3-poligen JST XH Steckern (K3, 5) auf dem Sensor Board und den SHARP-Sensoren braucht man auf der Sensor Board Seite folgende Stecker-/buchsenteile:&lt;br /&gt;
* 2x JST XH Gehäuse, 3-polig, RM 2,5mm ([http://www.conrad.de/ce/de/product/740583/Gehaeuse-RM-25-mm-Serie-XH-Rastermass-25-mm-Pole-3-Nennstrom-3-A-XHP-3-JST-Inhalt-1-St 740583])&lt;br /&gt;
* 6x JST XH Crimpkontakt f. RM 2,5mm ([http://www.conrad.de/ce/de/product/741112/Crimpkontakt-fuer-RM-25-mm-Serie-XH-Rastermass-25-mm-BXH-001T-P06-JST-Inhalt-1-St 741112])&lt;br /&gt;
Die Crimpkontakte dieser Steckbuchse werden an die meist 3-adrige Litze des Sensors angequetscht (oder angelötet). Zur Belegung des Sensor Anschlusses siehe das jeweilige Datenblatt!&lt;br /&gt;
&lt;br /&gt;
=====Vorn=====&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_Sensor_Board_SHARP_F.JPG|RP6 Sensor Board SHARP Sensor vorn|thumb]]&lt;br /&gt;
&lt;br /&gt;
Der vordere SHARP Sensor kann auch mechanisch am Sensor Board befestigt werden. Dazu gibt es an der Vorderkante der Platine zwei Befestigungslöcher.&lt;br /&gt;
&lt;br /&gt;
Das Bild rechts zeigt den SHARP Distanzsensor GP2Y0A02YK montiert vorn auf dem Sensor Board mit zwei M3 Gelenkbolzen ([http://www.conrad.de/ce/de/product/521043/Gelenkbolzen-1-x-Aussengewinde1-x-Innengewinde-Messing-vernickelt-Schluesselweite-55-mm/ 521043]) und passenden Schrauben/Muttern.&lt;br /&gt;
&lt;br /&gt;
'''Vorn-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''RP6v2-Port''' ||'''RP6v2-Funktion''' || '''Sensor Board&amp;lt;br/&amp;gt;-Funktion (K5)''' || '''Verwendung''' || '''I/O''' |||| '''SHARP Sensor&amp;lt;br/&amp;gt;-Funktion''' &lt;br /&gt;
|-&lt;br /&gt;
| 1 || PA0 || ADC0 || &amp;quot;ADC0&amp;quot; || SHARP vorn || I |||| Vo&lt;br /&gt;
|-&lt;br /&gt;
| 2 || || || VDD_1 || +5V || |||| Vcc&lt;br /&gt;
|-&lt;br /&gt;
| 3 || || || GND || GND (geschaltet!) || |||| GND&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=====Hinten=====&lt;br /&gt;
Der hintere SHARP Sensor kann z.B. an der Rückseite des RP6v2 Fahrgestells befestigt werden.&lt;br /&gt;
&lt;br /&gt;
'''Hinten-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''M256-Port''' ||'''M256-Funktion''' || '''Sensor Board&amp;lt;br/&amp;gt;-Funktion (K3)''' || '''Verwendung''' || '''I/O''' |||| '''SHARP Sensor&amp;lt;br/&amp;gt;-Funktion''' &lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| 1 || PK1 || ADC9 || &amp;quot;ADC4&amp;quot; || SHARP hinten || I |||| Vo&lt;br /&gt;
|-&lt;br /&gt;
| 2 || || || VDD_1 || +5V || |||| Vcc&lt;br /&gt;
|-&lt;br /&gt;
| 3 || || || GND || GND (geschaltet!) || |||| GND&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Servos====&lt;br /&gt;
=====Power=====&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_Sensor_Board_Servo-PWR.jpg|RP6 Sensor Board Servo-PWR Stecker|thumb]]&lt;br /&gt;
&lt;br /&gt;
An den SERVO_PWR Stecker (SP5: K1) muss ein Akku zur Stromversorgung der mit dem Sensor Board verbundenen Servos angeschlossen werden. Der Stecker hat folgende Belegung:&lt;br /&gt;
 &lt;br /&gt;
'''SERVO_PWR-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''Sensor Board&amp;lt;br/&amp;gt;-Funktion (K1)''' || '''Verwendung'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || GND_POWER || Servo Power GND&lt;br /&gt;
|-&lt;br /&gt;
| 2 || VSS_POWER || Servo Power Eingang +7,2..10V&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Der Akku zur Versorgung der Servos muss eine Nennspannung von 7,2..10V aufweisen. Der Schaltregler auf dem Sensor Board kann bei einer 5,0V Servo-Spannung Ströme bis 3,0A (Spitzen bis 5,0A) liefern. '''Die Polung des Akkus darf am Stecker SERVO_PWR nicht vertauscht werden.''' Siehe den oberen Teil der nebenstehenden Abbildung! Ratsam ist es, eine Sicherung 3,15A in die Plusleitung zwischen Akku und SERVO_PWR Stecker zu legen.&lt;br /&gt;
&lt;br /&gt;
Für die Verbindung zwischen dem 2-poligen JST XH Stecker (SERVO_PWR, K1) auf dem Sensor Board und dem Akku braucht man auf der Sensor Board Seite folgende Stecker-/buchsenteile:&lt;br /&gt;
* JST XH Gehäuse, 2-polig, RM 2,5mm ([http://www.conrad.de/ce/de/product/740549/Gehaeuse-RM-25-mm-Serie-XH-Rastermass-25-mm-Pole-2-Nennstrom-3-A-XHP-2-JST-Inhalt-1-St 740549])&lt;br /&gt;
* 2x JST XH Crimpkontakt f. RM 2,5mm ([http://www.conrad.de/ce/de/product/741112/Crimpkontakt-fuer-RM-25-mm-Serie-XH-Rastermass-25-mm-BXH-001T-P06-JST-Inhalt-1-St 741112])&lt;br /&gt;
Die Crimpkontakte dieser Steckbuchse werden an die 2-adrige Litze zum Akku angequetscht (oder angelötet).&lt;br /&gt;
&lt;br /&gt;
Wenn man keinen separaten Akku zur Versorgung der Servos nehmen will, kann man auch +UB der RP6v2 Base dafür nutzen. An +UB liegt die Akkuspannung der Base (Nennspannung 7,2V) über eine Sicherung F1 3,15A (RP6v2) bzw. 2,5A (RP6) auf dem Mainboard an. +UB kann man z.B. am [[RP6#EXT_Anschlu.C3.9F|EXT Anschluß der Base]] entnehmen. Die nebenstehende Abbildung zeigt im unteren Teil, an welchen Pins man dort +UB kontaktieren kann!&lt;br /&gt;
&lt;br /&gt;
Dabei ist zu beachten, dass die Sicherung F1 auf dem RP6(v2) Mainboard den nutzbaren Strom für die Servos deutlich begrenzt: Durch diese Sicherung fließt ja nicht nur der Servo-Strom, sondern auch der Strom für den RP6 und alle darauf montierten Zusatzplatinen. Wenn der RP6 also herumfährt und z.B. noch die IRCOMM-Sendedioden nutzt, bleibt kaum noch Stromreserve für die Servos auf dem Sensor Board übrig.&lt;br /&gt;
'''Das bedeutet: Man sollte unbedingt einen separaten Akku für die Servos auf dem Sensor Board benutzen!'''&lt;br /&gt;
&lt;br /&gt;
======SERVO_PWR-EXT Verbindung======&lt;br /&gt;
Für die Verbindung zwischen dem 2-poligen JST XH Stecker (SERVO_PWR, K1) auf dem Sensor Board und dem 8-poligen JST XH Stecker (EXT) auf dem RP6v2 Mainboard braucht man folgende Stecker-/buchsenteile:&lt;br /&gt;
* JST XH Gehäuse, 2-polig, RM 2,5mm ([http://www.conrad.de/ce/de/product/740549/Gehaeuse-RM-25-mm-Serie-XH-Rastermass-25-mm-Pole-2-Nennstrom-3-A-XHP-2-JST-Inhalt-1-St 740549])&lt;br /&gt;
* JST XH Gehäuse, 8-polig, RM 2,5mm ([http://www.conrad.de/ce/de/product/740928/Gehaeuse-RM-25-mm-Serie-XH-Rastermass-25-mm-Pole-8-Nennstrom-3-A-XHP-8-JST-Inhalt-1-St 740928])&lt;br /&gt;
* 10x JST XH Crimpkontakt f. RM 2,5mm ([http://www.conrad.de/ce/de/product/741112/Crimpkontakt-fuer-RM-25-mm-Serie-XH-Rastermass-25-mm-BXH-001T-P06-JST-Inhalt-1-St 741112])&lt;br /&gt;
Mit einer 2-adrigen Litze, die beidseits mit den Crimpkontakten verquetscht (oder verlötet) wird, verbindet man dann den SERVO_PWR Stecker mit dem EXT Stecker, wie in der Abbildung oben gezeigt. ''Achtung: Plus (+) und Minus (-) nicht vertauschen!''&lt;br /&gt;
 Ein passendes Kabel soll zukünftig (*) mitgeliefert werden.&lt;br /&gt;
&lt;br /&gt;
Auf dem RP6 Mainboard ist der 8-polige EXT Stecker noch nicht bestückt. Wenn man ihn nachrüsten will, muss man noch bestellen:&lt;br /&gt;
* JST XH Stiftleiste gerade, 8-polig, RM 2,5mm ([http://www.conrad.de/ce/de/product/740105/Stiftleiste-gerade-RM-25-mm-Serie-XH-Rastermass-25-mm-Pole-8-Nennstrom-3-A-B8B-XH-A-LFSN-JST-Inhalt-1-St 740105])&lt;br /&gt;
Die Stiftleiste wird auf das RP6 Mainboard gelötet, dabei weisen die beiden Einkerbungen an einer Längsseite der Stiftleiste nach hinten zum Rand des Mainboards.&lt;br /&gt;
 Auch diese Stiftleiste soll zukünftig (*) zum Lieferumfang gehören.&lt;br /&gt;
'''Zu *)''' Meinem RP6 Sensor Board (bestellt am 1.3.2014) lag das konfektionierte Kabel und die Stiftleiste noch nicht bei!&lt;br /&gt;
&lt;br /&gt;
=====Stecker=====&lt;br /&gt;
An die acht 3-poligen Stiftleisten SERVO_1 bis SERVO_8 (SP5: K6, 11, 29..34) können Servos angeschlossen werden. Direkt aufstecken kann man Servo-Steckbuchsen mit der Belegung von CONRAD, Graupner/JR und Robbe/Futaba (Versorgungsspannung Plus am mittleren Pin). Auf der Sensor Board Platine kann man den Pin 3 (Servo Power GND) der 3-poligen Stiftleisten daran erkennen, dass er näher zum rechten Platinenrand (Seite mit dem XBUS Stecker) angeordnet ist als der zugehörige Pin 1 (Servo Signal).&lt;br /&gt;
&lt;br /&gt;
Wenn Servos mit nicht passender Steckbuchse angeschlossen werden sollen, dann braucht man auf der Sensor Board Seite folgende Stecker-/buchsenteile für jedes Servo:&lt;br /&gt;
* Steckbuchse, 3-polig, RM 2,54mm ([http://www.elv.de/steckbuchse-3-polig.html ELV 68-022503])&lt;br /&gt;
Die Crimpkontakte dieser Steckbuchse werden an die 3-adrige Litze des Servos angequetscht (oder angelötet). &lt;br /&gt;
&lt;br /&gt;
'''SERVO_1..8-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''Sensor Board&amp;lt;br/&amp;gt;-Funktion (K6,11,29..34)''' || '''Verwendung''' || '''I/O''' |||| '''Servo-&amp;lt;br/&amp;gt;Kabelfarben'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || PCA9685: PWM15..8 || Servo Signal || O |||| Weiß, Orange&lt;br /&gt;
|-&lt;br /&gt;
| 2 || Servo_PWR || Servo Power +5V (geschaltet!) || |||| Rot&lt;br /&gt;
|-&lt;br /&gt;
| 3 || GND_POWER || Servo Power GND || |||| Schwarz, Braun&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Roboterarm RA2-HOBBY====&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_Sensor_Board_RA2-MINI.JPG|RP6 Sensor Board mit Roboterarm RA2-MINI|thumb]]&lt;br /&gt;
&lt;br /&gt;
In der Anleitung zum RP6 Sensor Board ist der Arexx Roboterarm RA2-HOBBY bzw. RA2-MINI [http://www.conrad.de/ce/de/product/191534/Arexx-Mini-Roboterarm-RA2-MINI (191534)] abgebildet. Er ist dort ohne Grundgestell und Controller-Platine auf dem Sensor Board befestigt.&lt;br /&gt;
Das Sensor Board eignet sich sehr gut zur Ansteuerung der 6 Servos des Roboterarms.&lt;br /&gt;
&lt;br /&gt;
Zur Montage des RA2-MINI auf dem Sensor Board geht man so vor:&lt;br /&gt;
* Lösen der 4 Rundkopfschrauben M3x6, die die Servobodenplatte mit den Abstandbolzen M3x30 auf der Controller-Platine verbinden (siehe Anleitung zum RA2-MINI, Seite 19!)&lt;br /&gt;
* Lösen der Servobodenplatte vom Bodenservo (siehe Anleitung zum RA2-MINI, Seite 8!)&lt;br /&gt;
* Bohren der Befestigungslöcher in die Servobodenplatte:&lt;br /&gt;
** Rechts-Links Lochabstand 4,75cm, Vorn-Hinten Lochabstand 4,1cm&lt;br /&gt;
** Ungefähre Lage der Löcher siehe Abbildung in der Anleitung zum Sensor Board, Seite 4!&lt;br /&gt;
** Markierung der Bohrlöcher auf der Rückseite der Servobodenplatte:&lt;br /&gt;
*** 1. Mit einer Hilfslinie die Hinterkante des Servoausschnitts (das ist die kürzere Kante, die näher am Rand der Bodenplatte liegt!) nach beiden Seiten verlängern&lt;br /&gt;
*** 2. Eine 2. Hilfslinie parallel zur ersten im Abstand von 1,4cm zur Mitte der Servobodenplatte hin einzeichnen&lt;br /&gt;
*** 3. Auf dieser Linie jetzt die beiden hinteren Bohrlöcher symmetrisch im Abstand von 4,75cm markieren&lt;br /&gt;
*** 4. Für die vorderen Bohrlöcher eine 3. Hilfslinie im Abstand von 4,1cm parallel zur 2. Linie einzeichnen&lt;br /&gt;
*** 5. Auf dieser Linie die beiden vorderen Bohrlöcher symmetrisch im Abstand von 4,75cm markieren&lt;br /&gt;
*** 6. Kontrolle: Die 4 markierten Bohrlochpositionen bilden ein Rechteck mit 4,1cm seitlicher und 4,75cm vorderer/hinterer Kantenlänge&lt;br /&gt;
** Bohren der 4 Löcher (D = 3,2mm) in die Servobodenplatte&lt;br /&gt;
* Befestigen des Bodenservos auf der Servobodenplatte (siehe Anleitung zum RA2-MINI, Seite 8!)&lt;br /&gt;
* Anbringen des Roboterarms auf dem Sensor Board mit 4 Abstandbolzen M3 (L = 30..50mm) und passenden Schrauben/Muttern&lt;br /&gt;
&lt;br /&gt;
Die Servo-Steckbuchsen werden dann ''in der selben Reihenfolge (S1..S6) wie vorher auf der Controller-Platine des Roboterarms'' auf die Stiftleisten SERVO_1 bis SERVO_6 des Sensor Boards gesteckt.&lt;br /&gt;
'''Man sollte unbedingt einen separaten Akku für die Servos auf dem Sensor Board benutzen!'''&lt;br /&gt;
&lt;br /&gt;
====Grafik-Display====&lt;br /&gt;
Ob es mal ein Grafik-Display für das RP6 Sensor Board geben wird, ist ''pure Spekulation''. Allerdings gibt es zwei Hinweise darauf, dass eine solche Hardware-Ergänzung kommen könnte:&lt;br /&gt;
* 1. Der vorbereitete Anschluss für eine [[RP6_Sensor_Board_und_Xtra_Module#Display-Hintergrundbeleuchtung|Display-Hintergrundbeleuchtung]]&lt;br /&gt;
* 2. Die 4 Befestigungslöcher in der Mitte des Sensor Boards&lt;br /&gt;
Wir werden sehen ...&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==RP6 Xtra Module==&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_Xtra_module.JPG|RP6 Xtra module|right|500px]]&lt;br /&gt;
&lt;br /&gt;
Von den '''AREXX RP6 Xtra Modulen''' sind bei [http://www.conrad.de/ce/ CONRAD] für den RP6v2 erhältlich:&lt;br /&gt;
* Arexx [[RP6_Sensor_Board_und_Xtra_Module#I2C_GPS_Empf.C3.A4nger_JM3-GPS|I2C GPS Empfänger JM3-GPS]] ([http://www.conrad.de/ce/de/product/1082385/Arexx-IC-GPS-Empfaenger-JM3-GPS 1082385] AUSVERKAUFT!)&lt;br /&gt;
* Arexx [[RP6_Sensor_Board_und_Xtra_Module#Gyro_Modul_JM3-GYRO|Gyro Modul JM3-GYRO]] ([http://www.conrad.de/ce/de/product/1082386/Arexx-Gyro-Modul-JM3-GYRO 1082386] AUSVERKAUFT!)&lt;br /&gt;
* Arexx [[RP6_Sensor_Board_und_Xtra_Module#3D_Accelerometer_Modul_JM3-3DA|3D Accelerometer Modul JM3-3DA]] ([http://www.conrad.de/ce/de/product/1082387/Arexx-3D-Accelerometer-Modul-JM3-3DA 1082387] AUSVERKAUFT!)&lt;br /&gt;
* Arexx [[RP6_Sensor_Board_und_Xtra_Module#BHT_Modul_JM3-BHT31|BHT Modul JM3-BHT31]] ([http://www.conrad.de/ce/de/product/1302995/Arexx-Asuro-xTend-BHT-JM3-BHT31 1302995] AUSVERKAUFT!)&lt;br /&gt;
&lt;br /&gt;
===I2C GPS Empfänger JM3-GPS===&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_I2C_GPS_Empfänger.JPG|RP6 I2C GPS Empfänger|thumb]]&lt;br /&gt;
&lt;br /&gt;
(Laut Online-Katalog der Firma CONRAD!)&lt;br /&gt;
&lt;br /&gt;
''&amp;quot;Universelles GPS-I²C-Bus Modul für RP6 Roboter. Der GPS Empfänger stellt die NMEA-0183 Datensätze GGA, RMC, GSA und VTG in den veschiedenen Registern zur Verfügung. Damit ist eine einfache Weiterverarbeitung möglich.&amp;quot;''&lt;br /&gt;
&lt;br /&gt;
Aktuell (Oktober 2017) ist der I2C GPS Empfänger bei CONRAD ausverkauft.&lt;br /&gt;
&lt;br /&gt;
====Beschreibung====&lt;br /&gt;
Der I2C GPS Empfänger ist eine kleine (38 x 23 mm) Zusatzplatine (RP6 Xtra Modul), die direkt auf das [[RP6_Sensor_Board_und_Xtra_Module#RP6_Sensor_Board_2|RP6 Sensor Board]] aufgesteckt werden kann. Sie kann aber auch überall eingesetzt werden, wo eine stabilisierte 5V Versorgungsspannung und ein 5V-I2C-Bus bis 400 kHz zur Verfügung steht.&lt;br /&gt;
&lt;br /&gt;
Die Platine ist bestückt mit dem &amp;quot;Fastrax GPS antenna module&amp;quot; [https://www.u-blox.com/de/positioning-antennas/gnss-antenna-modules/uc530.html UC530]. Als Backup-Batterie dient eine wieder aufladbare Lithium-Batterie ([http://www.farnell.com/datasheets/321180.pdf MS621FE]). Zur Kommunikation zwischen dem UC530 und dem I2C-Bus ist ein [http://www.atmel.com/Images/Atmel-8303-8-bit-AVR-Microcontroller-tinyAVR-ATtiny1634_Datasheet.pdf ATtiny1634] an Bord, der auch die Auswertung des [http://de.wikipedia.org/wiki/NMEA_0183 NMEA Protokolls] übernimmt. Die 3,3 V Versorgungsspannung wird auf der Platine durch einen Spannungsregler ([http://www.mouser.com/ds/2/405/lm3480-316799.pdf LM3480IM3-3.3]) erzeugt. Über den I2C-Bus können folgende Daten der NMEA-0183 Datensätze GGA, RMC, GSA und VTG auf einfache Weise gelesen werden:&lt;br /&gt;
&lt;br /&gt;
* Geograf. Breite&lt;br /&gt;
* Geograf. Länge&lt;br /&gt;
* GPS Status&lt;br /&gt;
* HDOP&lt;br /&gt;
* Satellitenzahl&lt;br /&gt;
* Kurs&lt;br /&gt;
* Geschwindigkeit&lt;br /&gt;
* Höhe&lt;br /&gt;
* UTC-Zeit&lt;br /&gt;
* Datum&lt;br /&gt;
* PDOP&lt;br /&gt;
* VDOP&lt;br /&gt;
* Satellit 1..12&lt;br /&gt;
&lt;br /&gt;
Der ATtiny1634 ist natürlich vorprogrammiert, kann aber über eine vorbereitete 6-polige ISP-Schnittstelle auf der Platine auch umprogrammiert werden.&lt;br /&gt;
&lt;br /&gt;
'''Lieferumfang'''&lt;br /&gt;
* I2C GPS Empfänger&lt;br /&gt;
* CD mit Anleitung und Software-Beispielen.&lt;br /&gt;
&lt;br /&gt;
====Technische Daten====&lt;br /&gt;
* Versorgungsspannung: 5,0 V +/- 5%&lt;br /&gt;
* Stromverbrauch: &amp;lt;= 20 mA (typ.)&lt;br /&gt;
* I2C-Bus Geschwindigkeit: &amp;lt;= 400 kHz&lt;br /&gt;
* GPS Antenne: eingebaut&lt;br /&gt;
* Backup Batterie: Lithium, im Betrieb wieder aufladbar&lt;br /&gt;
* Temperatur Bereich: -10 bis 65 °C&lt;br /&gt;
* Form Faktor: 38 x 23 mm&lt;br /&gt;
* Gewicht: ca. 6 g&lt;br /&gt;
* Empfänger Spezifikationen (UC530):&lt;br /&gt;
** Empfänger: GPS L1 C/A-Code, SPS&lt;br /&gt;
** Kanäle: 66/22 (Suche/Track)&lt;br /&gt;
** Tracking Empfindlichkeit: -165 dBm typ.&lt;br /&gt;
** Navigations Empfindlichkeit: -148 dbm typ (Kaltstart)&lt;br /&gt;
** Update Rate: 1 Sek.&lt;br /&gt;
** Positions Genauigkeit:&lt;br /&gt;
*** 3,0m (67%) typ. horizontal&lt;br /&gt;
*** 5,0m (67%) typ. vertikal&lt;br /&gt;
*** 0,02 m/s (50%) typ. Geschwindigkeit&lt;br /&gt;
** Zeit bis zum ersten Fix: typ. 31 Sek.&lt;br /&gt;
** Protokoll: NMEA-0183 Rev. 3.01&lt;br /&gt;
&lt;br /&gt;
====Anschluss-Schema====&lt;br /&gt;
Belegung des 9-poligen Anschluss-Steckers (K1) siehe in [[RP6_Sensor_Board_und_Xtra_Module#I2C-MODULE|dieser]] Tabelle!&lt;br /&gt;
&lt;br /&gt;
====Umbau-Optionen====&lt;br /&gt;
Wenn man den ATtiny1634 selbst programmieren will, muss man Stiftleisten auf die Platine löten.&lt;br /&gt;
&lt;br /&gt;
Man braucht dazu: &lt;br /&gt;
* 2-reihige Stiftleiste RM 2,54mm (z.B. 2x40-polig 741306) &lt;br /&gt;
&lt;br /&gt;
Man trennt von der 2-reihigen Stiftleiste 2x3 Kontakte ab und lötet sie auf die Punkte &amp;quot;ISP6&amp;quot;.&lt;br /&gt;
Mit einem ISP-Programmer kann dann eine neue Firmware geflasht werden. Die aktuelle Firmware des ATtiny1634 (Version 1.2) wird als .HEX mitgeliefert, leider ohne Source-Code.&lt;br /&gt;
&lt;br /&gt;
Vorsicht: Dabei kann der Prozessor im schlimmsten Fall nicht mehr ansprechbar sein oder der GPS Empfänger UC530 beschädigt werden. Man sollte diesen Umbau und die ISP-Programmierung nur machen, wenn man genau weiß, was man macht! &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Gyro Modul JM3-GYRO===&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_Gyro_Modul.JPG|RP6 Gyro Modul|right|200px]]&lt;br /&gt;
&lt;br /&gt;
(Laut Online-Katalog der Firma CONRAD!)&lt;br /&gt;
&lt;br /&gt;
''&amp;quot;Das universelle Gyro-Sensor Modul für RP6, RP6 V2, RP6 ATMEGA32 und das RP6 V2 Control M256 Wifi-Kit ist ideal zur Erkennung der Blockierung des Roboters in seiner Drehbewegung, sowie der Stabilisierung der Geradeausfahrt.&amp;quot;''&lt;br /&gt;
&lt;br /&gt;
Aktuell (April 2019) ist das Gyro Modul bei CONRAD ausverkauft. &lt;br /&gt;
&lt;br /&gt;
====Beschreibung====&lt;br /&gt;
Das Gyro Modul ist eine kleine (19 x 17 mm) Zusatzplatine (RP6 Xtra Modul), die im RP6-System genutzt werden kann. Es gibt zwar keinen direkt passenden &amp;quot;Steckplatz&amp;quot; auf einer der Microcontroller-Plattformen (RP6v2, M32, M128, M256 Wifi), jedoch ist der Anschluß einfach:&lt;br /&gt;
Benötigt werden +5V und GND, sowie ein freier ADC-Kanal, der bis 5V messen kann. Damit kann das Gyro Modul sehr universell eingesetzt werden. Es misst die Drehrate um die Z-Achse (Hochachse oder Yaw).&lt;br /&gt;
&lt;br /&gt;
Die Platine ist bestückt mit dem analogen Gyro-Sensor [http://www.st.com/web/en/resource/technical/document/datasheet/CD00254111.pdf LY330ALH], dessen Ausgangsspannung durch zwei OP-Amps ([http://www.ti.com.cn/cn/lit/ds/symlink/lm321.pdf LM321], [http://www.produktinfo.conrad.com/datenblaetter/00000-24999/001072615-da-01-en-IC_AMP_PREC_LMP7731MF_NOPB_SOT_23_5_TID.pdf LMP7731MF]) in Ruhe bei 2,5 V liegt. Höhere Ausgangsspannungen (bis 5 V) bedeuten eine Drehgeschwindigkeit nach LINKS, niedrigere (bis 0 V) eine Drehgeschwindigkeit nach RECHTS. Die 3,3 V Versorgungsspannung des LY330ALH wird auf der Platine durch einen Spannungsregler ([http://www.mouser.com/ds/2/405/lm3480-316799.pdf LM3480IM3-3.3]) erzeugt.&lt;br /&gt;
&lt;br /&gt;
'''Lieferumfang'''&lt;br /&gt;
* Gyro Modul&lt;br /&gt;
* CD mit Anleitung und Software-Beispielen.&lt;br /&gt;
&lt;br /&gt;
====Technische Daten====&lt;br /&gt;
&lt;br /&gt;
* VDD: 5,0 V +/- 5%&lt;br /&gt;
* Vout(0): 2,5 V +/- 2% (ohne Bewegung)&lt;br /&gt;
* Vout: Vout(0) + 10mV / dps +/- 2%&lt;br /&gt;
* Messbereich: ca. 200 dps max.&lt;br /&gt;
&lt;br /&gt;
====Anschluss-Schema====&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_Gyro_Modul_SP.JPG|RP6 Gyro Modul - Anschluss-Schema]]&lt;br /&gt;
&lt;br /&gt;
====Umbau-Optionen====&lt;br /&gt;
Am Gyro Modul gibt es nichts umzubauen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===3D Accelerometer Modul JM3-3DA===&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_3D_Accelerometer_Modul.JPG|RP6 3D Accelerometer Modul|right|105px]]&lt;br /&gt;
&lt;br /&gt;
(Laut Online-Katalog der Firma CONRAD!)&lt;br /&gt;
&lt;br /&gt;
''&amp;quot;Universeller 3-Achsen Beschleunigungssensor für RP6, RP6 V2, RP6 ATMEGA32 und das RP6 V2 Control M256 WIFI-Kit. Ideal zur Winkelmessung (Neigung-, Kipp-Winkel) und vieles mehr.&amp;quot;''&lt;br /&gt;
&lt;br /&gt;
Seit Mai 2020 ist das 3D Accelerometer Modul bei CONRAD ausverkauft.&lt;br /&gt;
&lt;br /&gt;
====Beschreibung====&lt;br /&gt;
&lt;br /&gt;
Das 3D Accelerometer Modul ist eine kleine (15 x 10 mm) Zusatzplatine (RP6 Xtra Modul), die direkt auf den EEPROM-Sockel (IC5) der Zusatzplatine [[RP6#RP6_CONTROL_M32_Platine|RP6 CONTROL M32]] gesteckt und über den SPI-Bus angesteuert werden kann. Das Accelerometer Modul kann aber auch mit allen Microcontroller-Plattformen betrieben werden, die eine stabilisierte 5V-Versorgungsspannung und einen SPI- oder I2C-Bus bieten.&lt;br /&gt;
&lt;br /&gt;
Die Platine ist bestückt mit dem 3D Beschleunigungs-Sensor [http://www.farnell.com/datasheets/1691680.pdf LIS302DLH]. Die 3,3 V Versorgungsspannung des LIS302DLH wird auf der Platine durch einen Spannungsregler ([http://www.mouser.com/ds/2/405/lm3480-316799.pdf LM3480IM3-3.3]) erzeugt.&lt;br /&gt;
&lt;br /&gt;
'''Lieferumfang'''&lt;br /&gt;
* 3D Accelerometer Modul&lt;br /&gt;
* CD mit Anleitung und Software-Beispielen.&lt;br /&gt;
&lt;br /&gt;
====Technische Daten====&lt;br /&gt;
&lt;br /&gt;
* VDD: 5,0 V +/- 5%&lt;br /&gt;
* Messbereiche: +-2 g, +-4 g, +-8 g&lt;br /&gt;
* Datenausgabe: 16 Bit&lt;br /&gt;
* Schnittstellen: I2C, SPI&lt;br /&gt;
&lt;br /&gt;
====Anschluss-Schema====&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_3D_Accelerometer_Modul_SP.JPG|RP6 3D Accelerometer Modul - Anschluss-Schema|350px]]&lt;br /&gt;
&lt;br /&gt;
====Umbau-Optionen====&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_3D_Accelerometer_Modul_M32.JPG|RP6 3D Accelerometer Modul auf der M32|right|500px]]&lt;br /&gt;
&lt;br /&gt;
'''Will man das Modul auf der M32 einsetzen, muss man auf dem 3D Accelerometer Modul die Widerstände R2 und R3 (falls vorhanden!) auslöten (siehe Anleitung zum Modul, Seiten 4/5!)''' und einen IC-Sockel an Position IC5 und einen Kondensator an Position C19 auf der M32 einlöten, siehe [[RP6#Zweites_SPI-EEPROM|hier]]!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die Abbildung rechts zeigt das 3D Accelerometer Modul auf der M32.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===BHT Modul JM3-BHT31===&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_BHT_Modul.PNG|RP6 BHT Modul|right|203px]]&lt;br /&gt;
&lt;br /&gt;
Dieses [http://jm3-engineering.com/sensors.htm BHT Modul] zur Messung von Luftdruck, Luftfeuchte und Temperatur war für das Ende des 3. Quartals 2014 angekündigt und ist nun ab dem 22.01.2015 lieferbar.&lt;br /&gt;
&lt;br /&gt;
(Laut Online-Katalog der Firma CONRAD!)&lt;br /&gt;
&lt;br /&gt;
''&amp;quot;Ein Luftdruck-, rel. Luftfeuchtigkeits- und Temperatursensor Modul für vielfältige Anwendungen. Es kann direkt in den Asuro Expansion-Port auf dem Asuro xTend Bord eingesteckt werden. Das Asuro Modul kann mit den anderen erhältlichen Modulen (Kompass/Gyro und RTC kombiniert werden (Stack-up)). Außerdem kann es auch auf dem RP6 Sensor Bord in dem I2C Modulsteckplatz verwendet werden. Das Sensor Modul verwendet den hochauflösenden Drucksensor-Chip MS5607-02BA und den Luftfeuchtigkeitssensor HTU21D von MEAS Switzerland mit I2C Bus Interface. Der barometrische Drucksensor ist für Höhenmesser und Variometer optimiert und hat eine Auflösung von 20cm. Der relative Luftfeuchtigkeits- und Temperatursensor bietet zuverlässige und genaue Daten, welche sich auch besonders für Wetterstations-Informationen eignen.&amp;quot;''&lt;br /&gt;
&lt;br /&gt;
Aktuell (April 2019) ist das BHT Modul bei CONRAD ausverkauft. &lt;br /&gt;
&lt;br /&gt;
====Beschreibung====&lt;br /&gt;
Das BHT Modul ist eine kleine (24 x 14 mm) Zusatzplatine (ASURO xTend bzw. RP6 Xtra Modul), die direkt auf das [[RP6_Sensor_Board_und_Xtra_Module#RP6_Sensor_Board_2|RP6 Sensor Board]] aufgesteckt werden kann. Sie kann auch auf dem [http://www.conrad.de/ce/de/product/1302085/Arexx-Asuro-xTend-Board-JM3-AXT3 Arexx Asuro xTend Board] und überall eingesetzt werden, wo eine stabilisierte 5V Versorgungsspannung und ein I2C-Bus bis 400 kHz zur Verfügung steht.&lt;br /&gt;
&lt;br /&gt;
Die Platine ist bestückt mit dem barometrischen Drucksensor [http://www.parallax.com/sites/default/files/downloads/29124-MS5607-02BA03-Datasheet.pdf MS5607-02BA] und dem relativen Luftfeuchtigkeits- und Temperatursensor [http://www.meas-spec.com/downloads/HTU21D.pdf HTU21D]. Die 3,0 V Versorgungsspannung der Sensoren wird auf der Platine durch einen Spannungsregler ([http://www.farnell.com/datasheets/78902.pdf LP2980AIM5-3.0]) erzeugt. &lt;br /&gt;
&lt;br /&gt;
'''Lieferumfang'''&lt;br /&gt;
* BHT Modul&lt;br /&gt;
* CD mit Dokumentation&lt;br /&gt;
&lt;br /&gt;
====Technische Daten====&lt;br /&gt;
&lt;br /&gt;
* Nennspannung: 3,3 V (?)&lt;br /&gt;
* Nennstrom: 0,2 mA (typ.) &amp;lt; 1,5mA peaktyp.&lt;br /&gt;
* I2C Bus Geschwindigkeit: 400kHz max.&lt;br /&gt;
* Sensor Modul mit MS5607-02BA und HTU21D&lt;br /&gt;
* Hohe Auflösung des Sensorelements - Höhe: 20cm /- rel. Luftfeuchtigkeit: 0,04%&lt;br /&gt;
* Schneller AD-Wandler&lt;br /&gt;
* Digitaler Drucksensor (24 bit ΔΣ ADC)&lt;br /&gt;
* Luftdruckbereich: 10 bis 1200 mbar&lt;br /&gt;
* Exzellente Langzeitstabilität&lt;br /&gt;
* Unmittelbare Desaturierung&lt;br /&gt;
* Kalibrierung in der Fabrik&lt;br /&gt;
&lt;br /&gt;
====Anschluss-Schema====&lt;br /&gt;
Belegung des 9-poligen Anschluss-Steckers (K1) siehe in [[RP6_Sensor_Board_und_Xtra_Module#I2C-MODULE|dieser]] Tabelle!&lt;br /&gt;
&lt;br /&gt;
====Umbau-Optionen====&lt;br /&gt;
&lt;br /&gt;
===Xtra Module auf einer Experimentierplatine===&lt;br /&gt;
&lt;br /&gt;
Die drei bis jetzt (09/2014) erhältlichen [[RP6_Sensor_Board_und_Xtra_Module#RP6_Xtra_Module_2|Xtra Module]], die die Navigation eines Roboters ermöglichen, können problemlos im RP6-System genutzt werden,- zwei davon sogar in Form des direkten Aufsteckens auf eine der Zusatz-Platinen: Für den [[RP6_Sensor_Board_und_Xtra_Module#I2C_GPS_Empf.C3.A4nger_JM3-GPS|I2C GPS Empfänger]] gibt es einen Steckplatz auf dem [[RP6_Sensor_Board_und_Xtra_Module#RP6_Sensor_Board_2|RP6 Sensor Board]], das [[RP6_Sensor_Board_und_Xtra_Module#3D_Accelerometer_Modul_JM3-3DA|3D Accelerometer Modul]] kann auf der [[RP6#RP6_CONTROL_M32_Platine|RP6 CONTROL M32]] aufgesteckt werden.&lt;br /&gt;
&lt;br /&gt;
Natürlich können die Xtra Module auch allein (&amp;quot;stand-alone&amp;quot;) ohne RP6 Sensor Board oder RP6 CONTROL M32 betrieben werden. Dazu kann man sie z.B. auf einer [[RP6#Experimentierplatine|Experimentierplatine]] aufbauen. &lt;br /&gt;
&lt;br /&gt;
Das soll hier mit einer kurzen Aufbauanleitung demonstriert werden.&lt;br /&gt;
&lt;br /&gt;
====Schaltplan====&lt;br /&gt;
&lt;br /&gt;
Aber zunächst der Schaltplan:&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6v2_Xtra_Module_SP.jpg|RP6 Experimentierplatine für Xtra Module - Schaltplan]]&lt;br /&gt;
&lt;br /&gt;
Man erkennt die drei XTra Module, die (bis auf das Gyro Modul) an den I2C-Bus am XBUS Stecker des RP6 angeschlossen sind. Das [[RP6_Sensor_Board_und_Xtra_Module#Gyro_Modul_JM3-GYRO|Gyro Modul JM3-GYRO]] wird nicht über I2C angesteuert, sondern liefert an seinem Pin OUT ein analoges Ausgangssignal, das mit einem ADC Eingang (0..5V) gemessen werden kann.&lt;br /&gt;
&lt;br /&gt;
Der Jumper (Steckbrücke) JP1 dient zum Einstellen der I2C-Adresse des 3D Accelerometer Moduls (0x30, 0x32).&lt;br /&gt;
Mit JP2/3 wird die [[RP6_Sensor_Board_und_Xtra_Module#Optionale_Ansteuerung|Betriebsart des Gyro Moduls]] festgelegt.&lt;br /&gt;
Die Jumper JP4 bis JP9 dienen zur Verteilung von INT1, INT2 des 3D Accelerometer Moduls und des OUT Signals des Gyro Moduls auf die INT-Anschlüsse INT1..3, INTU des XBUS. Wenn man die Interrupts des 3D Accelerometer Moduls nicht nutzen will, kann man die Jumper JP4 bis JP8 auch weglassen. Mit JP9 wird das analoge Signal des Gyro Moduls an INT1 des XBUS gelegt. Dies ist nur dann sinnvoll, wenn man die Platine mit der RP6v2 Base betreibt, weil hier an INT1 ein ADC Eingang (ADC4) liegt. Bei allen anderen Plattformen des RP6-Systems (M32, CCPRO M128, M256 WiFi) muss JP9 offen bleiben.&lt;br /&gt;
&lt;br /&gt;
Mit dieser Schaltung kann man also den Beschleunigungssensor (3D Accelerometer) und den GPS Empfänger über I2C auslesen. Der Gyro wird entweder mit ADC4 der RP6v2 Base (JP9 geschlossen!) ausgewertet oder durch einen anderen ADC Eingang. Dazu kann man das Ausgangssignal des Gyros an Pin 3 der Stiftleiste ST1 abnehmen. Von dort kann es z.B. zu ADC0 oder ADC1 der RP6v2 Base oder der RP6 CONTROL M32 geführt werden oder zu einem beliebigen ADC Eingang der CCPRO M128 oder der M256 WiFi. Die Stiftleiste ST1 liegt direkt neben dem USRBUS, so dass die Verbindung auch über den USRBUS hergestellt werden kann. Dazu verbindet man Pin 3 von ST1 mit einem Pin (Y1..Y14) des USRBUS.&lt;br /&gt;
&lt;br /&gt;
====Bestückungsplan====&lt;br /&gt;
&lt;br /&gt;
So kann z.B. der Bestückungsplan mit Leiterbahnführung auf der Experimentierplatine (Exp) aussehen:&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6v2_Xtra_Module.jpg|RP6 Experimentierplatine für Xtra Module]]&lt;br /&gt;
&lt;br /&gt;
Was braucht man allgemein für den Aufbau einer Schaltung auf der Exp:&lt;br /&gt;
* Seitenschneider, Schere, Zange&lt;br /&gt;
* Lötkolben 25..30 Watt, Lötzinn&lt;br /&gt;
* Plastik 70 Schutzlack (CONRAD 813621)&lt;br /&gt;
* Isolierter Schaltdraht YV 0,20 mm² (CONRAD 606065)&lt;br /&gt;
* Versilberter CU-Draht 0,6 mm (CONRAD 605581)&lt;br /&gt;
&lt;br /&gt;
Mit dem versilberten CU-Draht stellt man auf der Unterseite (= Lötseite) der Exp Verbindungen zwischen den Bauteilen her; mit dem isolierten Schaltdraht werden Drahtbrücken auf der Oberseite (= Bestückungsseite) der Exp eingesetzt. Die Lage der Xtra Module und der Verbindungen kann man im Bestückungsplan (s.o.!) erkennen, Drahtbrücken sind rot hervorgehoben.&lt;br /&gt;
&lt;br /&gt;
Zusätzlich zu den RP6 Xtra Modulen braucht man folgende Bauteile (Bestell-Nummern von CONRAD):&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| Anzahl || Bestell-Nr. || Bauteil-Bezeichnung || Verwendung&lt;br /&gt;
|-&lt;br /&gt;
| 1 || [http://www.conrad.de/ce/de/product/191537/Arexx-RP6-Experimentierplatine?queryFromSuggest=true 191537] || RP6 Experimentierplatine || &lt;br /&gt;
|-&lt;br /&gt;
| 1 || [http://www.conrad.de/ce/de/product/189600/Praezisions-IC-Fassung-MPE-Garry-MP-083-STG-BU-Pole-8-Rastermass-762-mm-Material-Kontaktfeder-025-Gold-ueber-Nickel 189600] || Präzisions-IC-Fassung (8 Pole) || Stecksockel für Accelerometer Modul&lt;br /&gt;
|-&lt;br /&gt;
| 1 || [http://www.conrad.de/ce/de/product/741360/Praezisions-Buchsenleiste-RM-254-gerade-Pole-1-x-20-10120832-BKL-Electronic-Inhalt-1-St 741360] || Präzisions-Buchsenleiste RM 2,54mm (9 Pole) || Stecksockel für GPS Empfänger&lt;br /&gt;
|-&lt;br /&gt;
| 1 || [http://www.conrad.de/ce/de/product/741307/Praezisions-Stiftleiste-RM-254-gerade-Pole-1-x-20-10120536-BKL-Electronic-Inhalt-1-St 741307] || Präzisions-Stiftleiste RM 2,54mm (2 x 4 Pole) || Stecksockel für Gyro Modul&lt;br /&gt;
|-&lt;br /&gt;
| 1 || [http://www.conrad.de/ce/de/product/741119/Stiftleiste-RM-254-gerade-Pole-1-x-36-10120182-BKL-Electronic-Inhalt-1-St 741119] || 1-reihige Stiftleiste RM 2,54mm (ges. 36-polig) || JP1, ST1&lt;br /&gt;
|-&lt;br /&gt;
| 1 || [http://www.conrad.de/ce/de/product/741186/Doppelreihige-Stiftleiste-RM-254-gerade-Pole-2-x-8-10120514-BKL-Electronic-Inhalt-1-St 741186] || 2-reihige Stiftleiste RM 2,54mm (ges. 8-polig) || JP2..9&lt;br /&gt;
|-&lt;br /&gt;
| 1 || [http://www.conrad.de/ce/de/product/742902/Codier-Adressierbruecken-Set-Rastermass-25254-mm-10120906-BKL-Electronic-Inhalt-1-Set 742902] || Sechs Codierbrücken (aus Set) || Steckbrücken&lt;br /&gt;
|-&lt;br /&gt;
| 2 || [http://www.conrad.de/ce/de/product/453099/Keramik-Kondensator-01-F-50-V-20-B-x-H-508-mm-x-508-mm-1-St 453099] || Keramik Kondensator 100 nF || Blockkondensatoren C2, C3&lt;br /&gt;
|-&lt;br /&gt;
| 1 || [http://www.conrad.de/ce/de/product/421986/Elektrolyt-Kondensator-radial-bedrahtet-25-mm-10-F-50-V-20--x-H-5-mm-x-11-mm-Panasonic-EEUFC1H100LH-1-St 421986] || Elektrolyt Kondensator 10 uF/50 V || Spannungsstabilisierung C1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Viel Erfolg beim Aufbau!&lt;br /&gt;
&lt;br /&gt;
 Natürlich muss man nicht alle drei Sensoren aufbauen!&lt;br /&gt;
 Man kann einfach den/die Sensor/en weglassen, den/die man nicht nutzen will!&lt;br /&gt;
&lt;br /&gt;
Noch ein Wort zur Programmierung des 3D Accelerometer Moduls: Es wird auf dieser Exp über den I2C Bus angesteuert. Damit kann man die [[RP6_Sensor_Board_und_Xtra_Module#RP6_CONTROL_M32:_ACCSENS_Library|nachfolgende Library]] für dieses Modul hier NICHT benutzen!&lt;br /&gt;
&lt;br /&gt;
====Magnetfeldsensor====&lt;br /&gt;
&lt;br /&gt;
Wenn man die oben beschriebene Experimentierplatine aufgebaut hat, hat man für die Navigation eines mobilen Roboters (wie des RP6v2) schon drei benötigte Sensoren zur Verfügung: einen GPS Empfänger, einen 3D-Beschleunigungssensor und einen 1D-Gyrosensor.&lt;br /&gt;
&lt;br /&gt;
Was fehlt, ist z.B. ein '''Magnetfeldsensor (Kompass-Sensor)''', mit dem der Roboter die Himmelsrichtung feststellen kann. Einen Magnetfeldsensor gibt es (noch) nicht als Xtra Modul.&lt;br /&gt;
&lt;br /&gt;
Auf der beschriebenen Experimentierplatine ist durchaus noch Platz (z.B. in der rechten oberen Ecke) für einen Magnetfeldsensor. Geeignet ist z.B. das 2D-Kompassmodul HDMM01 ([http://www.pollin.de/shop/dt/NTM4OTgxOTk-/Bausaetze_Module/Module/Kompassmodul_HDMM01.html Pollin 94-810 164] NICHT MEHR LIEFERBAR!).&lt;br /&gt;
&lt;br /&gt;
Hier ist der um den Magnetfeldsensor erweiterte Schaltplan:&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6v2_Xtra_Module_HDMM01_SP.jpg|RP6 Experimentierplatine für Xtra Module und HDMM01 - Schaltplan]]&lt;br /&gt;
&lt;br /&gt;
Das kleine Kompassmodul dürfte doch noch einfach auf der Experimentierplatine unterzubringen sein, oder?&lt;br /&gt;
&lt;br /&gt;
Zur Programmierung des Magnetfeldsensors HDMM01 gibt es [[RP6v2_Orientierung#Kompassmodul_HDMM01_2|HIER]] Anregungen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Programmierung==&lt;br /&gt;
In diesem Abschnitt geht es um die Programmierung der Sensoren und Aktoren auf dem [[RP6_Sensor_Board_und_Xtra_Module#RP6_Sensor_Board_3|RP6 Sensor Board]] und auf den [[RP6_Sensor_Board_und_Xtra_Module#RP6_Xtra_Module_3|Xtra Modulen]]. Die hier veröffentlichte Software baut NICHT auf die mitgelieferten C++ Software-Beispiele auf der ''&amp;quot;RP6 Robot System Xtra Modules CD-ROM&amp;quot;'' auf, sondern basiert auf Eigenentwicklungen in GCC.&lt;br /&gt;
&lt;br /&gt;
===RP6 Sensor Board===&lt;br /&gt;
Das RP6 Sensor Board RP6-JM03-61 verfügt nicht über einen eigenen Microprozessor. Daher geht es hier eigentlich nicht um die Programmierung des Sensor Boards, sondern um die Programmierung der Microcontroller-Plattform, an die das Sensor Board angeschlossen ist. In der Regel wird das die RP6 M256 WiFi Zusatzplatine sein, aber auch die RP6v2 Base steuert (als I2C-Slave) in der vorgesehenen Konfiguration gewisse Funktionen des Sensor Boards an.&lt;br /&gt;
Prinzipiell kann das Sensor Board aber auch an der RP6 CONTROL M32 (''passende Library auf Anfrage beim Autor!'') oder der RP6 CCPRO M128 Zusatzplatine betrieben werden.&lt;br /&gt;
&lt;br /&gt;
====Dokumentation====&lt;br /&gt;
Die Dokumentation zum RP6 Sensor Board befindet sich auf der mitgelieferten ''&amp;quot;RP6 Robot System Xtra Modules CD-ROM&amp;quot;''.&lt;br /&gt;
&lt;br /&gt;
=====Manuals=====&lt;br /&gt;
Das Handbuch in der aktuellen Version kann [http://www.jm3-engineering.com/download/doc/ManualRP6SensorBoard_de.pdf hier] oder [http://www.produktinfo.conrad.com/datenblaetter/00000-24999/001082384-an-01-de-RP6_SENSOR_BOARD.pdf da] eingesehen werden.&lt;br /&gt;
 ACHTUNG: Das Manual enthielt in der Version 1.11 noch teils irreführende&lt;br /&gt;
          Beschreibungen, die in der aktuellen Version 1.20 vom 20.04.2014&lt;br /&gt;
          korrigiert wurden!&lt;br /&gt;
&lt;br /&gt;
====Robot-Tool====&lt;br /&gt;
[[Bild:JM3 Robot-Tool.PNG|JM3 Robot-Tool|thumb]]&lt;br /&gt;
&lt;br /&gt;
Von JM3 Engineering wurde auch ein eigenes Programm &amp;quot;'''JM3 Robot-Tool'''&amp;quot; veröffentlicht, das im RP6-System (RP6(v2) Base, CONTROL M32, M256 WiFi) anstelle des [[RP6v2#RobotLoader|RobotLoaders]] verwendet werden kann.&lt;br /&gt;
&lt;br /&gt;
Vom Robot-Tool gibt es auch eine Kommandozeilen-Version &amp;quot;'''Multiloader'''&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Befehlszeilen Optionen'''&lt;br /&gt;
 Multi Loader v1.0.1&lt;br /&gt;
 &lt;br /&gt;
 Usage:&lt;br /&gt;
 multiloader [filename] [port/hostname] [device] [-l]&lt;br /&gt;
  -l forces RP6 low speed mode.&lt;br /&gt;
 &lt;br /&gt;
 Valid devices:&lt;br /&gt;
  - Asuro&lt;br /&gt;
  - AsuroCtrl&lt;br /&gt;
  - RP6Base&lt;br /&gt;
  - RP6CtrlM32&lt;br /&gt;
  - RobotArm&lt;br /&gt;
  - RP6Wifi&lt;br /&gt;
 Attention: Device names are case-sensitive&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 Multi Loader v2.0.0&lt;br /&gt;
 &lt;br /&gt;
 Usage: multiloader [load/conf] [...]&lt;br /&gt;
 &lt;br /&gt;
         load    Load .hex file into robot.&lt;br /&gt;
                 arguments: [filename] [port/host] [device] [interface] [-l]&lt;br /&gt;
 &lt;br /&gt;
                 [interface] specifies programming interface type.&lt;br /&gt;
                 Valid interface types are UART and TCP.&lt;br /&gt;
                 -l forces RP6 low speed mode.&lt;br /&gt;
 &lt;br /&gt;
                 Valid devices:  [interfaces]&lt;br /&gt;
                 - Asuro     UART&lt;br /&gt;
                 - AsuroXT   UART&lt;br /&gt;
                 - Marvin    UART&lt;br /&gt;
                 - MarvinFW  UART&lt;br /&gt;
                 - RP6       UART&lt;br /&gt;
                 - RP6M32    UART&lt;br /&gt;
                 - RP6Wifi   TCP&lt;br /&gt;
                 - RobotArm  UART&lt;br /&gt;
 &lt;br /&gt;
                 Attention: Device names are case-sensitive&lt;br /&gt;
 &lt;br /&gt;
=====Versionen=====&lt;br /&gt;
Hier eine Tabelle der (mir) bekannten Robot-Tool Versionen:&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |rowspan=2|ZIP-Datum&lt;br /&gt;
 |colspan=2|Robot-Tool:&lt;br /&gt;
 |colspan=2|Multiloader:&lt;br /&gt;
 |rowspan=2|Bemerkungen&lt;br /&gt;
 |-&lt;br /&gt;
 |Windows&lt;br /&gt;
 |Linux&lt;br /&gt;
 |Windows&lt;br /&gt;
 |Linux&lt;br /&gt;
 |-&lt;br /&gt;
 |25.10.2014&lt;br /&gt;
 |1.0.1-1&lt;br /&gt;
 |1.0.1-1&lt;br /&gt;
 |1.0.1-1&lt;br /&gt;
 |1.0.1-1&lt;br /&gt;
 |Erste veröffentlichte Version!&lt;br /&gt;
 |-&lt;br /&gt;
 |30.01.2017&lt;br /&gt;
 |[http://www.jm3-engineering.com/download/robottool-v2.0-win32.7z 2.0]&lt;br /&gt;
 |[http://www.jm3-engineering.com/download/robottool-v2.0-linux.tar.xz 2.0]&lt;br /&gt;
 |2.0&lt;br /&gt;
 |2.0&lt;br /&gt;
 |auch für [http://www.jm3-engineering.com/download/robottool-v2.0-osx.tar.gz Mac OSX]!&lt;br /&gt;
 |-&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
'''Hinweise:'''&lt;br /&gt;
* 1. Falls die Links in der Tabelle auf die Seite &amp;quot;Neuigkeiten&amp;quot; von JM3-Engineering führen, kann man dort auf die Seite &amp;quot;Software Downloads&amp;quot; wechseln und die Dateien im Absatz &amp;quot;JM3 Robot-Tool V2.0&amp;quot; herunterladen.&lt;br /&gt;
* 2. Ab Version 2.0 ist der Multiloader in der ZIP des Robot-Tools enthalten.&lt;br /&gt;
&lt;br /&gt;
====AVR-GCC und Visual Studio====&lt;br /&gt;
Die Demo-Programme zum RP6 Sensor Board wurden mit [https://www.microsoft.com/de-de/download/details.aspx?id=5555&amp;amp;fa43d42b-25b5-4a42-fe9b-1634f450f5ee=True Microsoft Visual C++ 2010] und [http://www.jm3-engineering.com/download/avr-gcc-4.8.1-win32.7z AVR-GCC] erstellt.&lt;br /&gt;
&lt;br /&gt;
Eine Anleitung zur Installation unter Windows befindet sich [http://www.jm3-engineering.com/download/doc/avr-gcc-vs_de.pdf hier].&lt;br /&gt;
&lt;br /&gt;
====Demo-Programmme====&lt;br /&gt;
Demo-Programme und eine &amp;quot;Library&amp;quot; zum RP6 Sensor Board befinden sich auf der mitgelieferten ''&amp;quot;RP6 Robot System Xtra Modules CD-ROM&amp;quot;''. Sie können auch in der aktuellen Version im Download Bereich von [http://www.jm3-engineering.com/downloads.htm JM3 Engineering] herunter geladen werden:&lt;br /&gt;
* [http://www.jm3-engineering.com/download/RP6SensorBoardDemo_1.1-1.7z RP6 Sensor Board Demo Programm und Library]&lt;br /&gt;
* [http://www.jm3-engineering.com/download/RP6SensorBoardDemo_noVC_1.1-1.7z RP6 Sensor Board Demo Programm und Library (ohne Visual Studio Projekt Dateien)]&lt;br /&gt;
* [http://www.jm3-engineering.com/download/RP6-RC_1.0-1.7z Remote Control Software]&lt;br /&gt;
'''Hinweis:'''&lt;br /&gt;
Falls die o.g. Links auf die Seite &amp;quot;Neuigkeiten&amp;quot; von JM3-Engineering führen, kann man dort auf die Seite &amp;quot;Software Downloads&amp;quot; wechseln und die Dateien im Absatz &amp;quot;RP6 Sensor Board Library und Demo-Programm&amp;quot; herunterladen.&lt;br /&gt;
&lt;br /&gt;
====Library====&lt;br /&gt;
Eine &amp;quot;Library&amp;quot; zum RP6 Sensor Board, bestehend aus einigen Einzel-Dateien mit jeweils eigenen Versions-Nummern, befindet sich auf der mitgelieferten ''&amp;quot;RP6 Robot System Xtra Modules CD-ROM&amp;quot;''. Sie ist in der aktuellen Version auch in den Demo-Programmen enthalten ([[RP6_Sensor_Board_und_Xtra_Module#Demo-Programmme|s.o.!]]).&lt;br /&gt;
&lt;br /&gt;
=====Versionen=====&lt;br /&gt;
Hier eine Tabelle der (mir) bekannten Library Versionen für das RP6 Sensor Board:&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |ZIP-Datum *&lt;br /&gt;
 |Version&lt;br /&gt;
 |RP6SensorBoardDemo&lt;br /&gt;
 |RP6-RC&lt;br /&gt;
 |RP6M256_I2CMasterLib&lt;br /&gt;
 |RP6M256Lib&lt;br /&gt;
 |RP6I2CmasterTWI&lt;br /&gt;
 |-&lt;br /&gt;
 |09.12.2013&lt;br /&gt;
 |1.0&lt;br /&gt;
 |1.0&lt;br /&gt;
 |1.0&lt;br /&gt;
 |(1.0_24.02.12) ²&lt;br /&gt;
 |1.1_16.07.12 ²&lt;br /&gt;
 |1.1_04.09.12 ³&lt;br /&gt;
 |-&lt;br /&gt;
 |27.12.2014&lt;br /&gt;
 |1.1&lt;br /&gt;
 |1.1-1&lt;br /&gt;
 |1.0-1&lt;br /&gt;
 |Modified 02.11.14 ³&lt;br /&gt;
 |1.1.1_25.10.14 ³&lt;br /&gt;
 |1.1_04.09.12 ³&lt;br /&gt;
 |-&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
'''Zu *:''' Alternativ: Datum der Verzeichnisse (z.B. auf der ''&amp;quot;RP6 Robot System Xtra Modules CD-ROM&amp;quot;'')!&lt;br /&gt;
&lt;br /&gt;
'''Zu ²:''' Neueste Original Version der [http://rn-wissen.de/wiki/index.php/RP6v2#Versionen RP6 Library]!&lt;br /&gt;
&lt;br /&gt;
'''Zu ³:''' Modifiziert von [http://www.jm3-engineering.com/ JM3 Engineering]!&lt;br /&gt;
&lt;br /&gt;
=====Modifizierte RP6 Libraries=====&lt;br /&gt;
Von [http://www.jm3-engineering.com/ JM3 Engineering] wurden bis jetzt drei [http://rn-wissen.de/wiki/index.php/RP6v2#Versionen RP6 &amp;quot;Original&amp;quot;-Libraries] leicht modifiziert, um sie für die eigenen Programme für das RP6 Sensor Board optimal nutzen zu können.&lt;br /&gt;
In diesem Abschnitt soll kurz erwähnt werden, WAS verändert wurde.&lt;br /&gt;
 &lt;br /&gt;
======RP6M256_I2CMasterLib======&lt;br /&gt;
Die RP6M256_I2CMasterLib wurde von JM3 Engineering ab der Software Version 1.1 für das RP6 Sensor Board verändert, um sie in einer eigenen Bibliothek bestehend aus mehreren Modulen nutzen zu können. Folgendes wurde angepasst:&lt;br /&gt;
* Neue typedef unions:&lt;br /&gt;
** u_interrupt_status&lt;br /&gt;
** u_status&lt;br /&gt;
** u_drive_status&lt;br /&gt;
** u_statusLEDs&lt;br /&gt;
&lt;br /&gt;
Die modifizierte RP6M256_I2CMasterLib vom 2.11.2014 ist kompatibel zur Original-Version vom 24.02.2012.&lt;br /&gt;
&lt;br /&gt;
======RP6M256Lib======&lt;br /&gt;
Eine modifizierte Version 1.1.1 der RP6M256Lib mit Datum vom 25.10.2014 wurde von JM3 Engineering im November 2014 zusammen mit der Software Version 1.1 für das RP6 Sensor Board veröffentlicht. Sie ist kompatibel zur Version 1.1 der RP6M256Lib vom 16.07.2012 und enthält folgende Änderung:&lt;br /&gt;
* In der Datei RP6M256.h wird die Variable &amp;quot;timer&amp;quot; korrekt als &amp;quot;''extern'' volatile uint16_t timer&amp;quot; deklariert.&lt;br /&gt;
&lt;br /&gt;
======RP6I2CmasterTWI======&lt;br /&gt;
Eine erweiterte I2C Master-Library (Version 1.1) gibt es mit Datum vom 04.09.2012, veröffentlicht ab Februar 2014 von JM3 Engineering für das RP6 Sensor Board und die Xtra Module. Sie ist abwärts-kompatibel zur I2C Master-Library in der Version 1.0 vom 16.05.2007 und bietet lediglich folgende Erweiterung: &lt;br /&gt;
* Neue Funktion I2CTWI_readWordRegisters() zum Lesen von 16 Bit Registern&lt;br /&gt;
&lt;br /&gt;
====RP6 M256 WiFi: Sensor Board Library====&lt;br /&gt;
Die nachfolgende RP6M256_Sensor_BoardLib (Eigenentwicklung in GCC) dient zur Ansteuerung des Sensor Boards durch die RP6M256 WiFi.&lt;br /&gt;
&lt;br /&gt;
=====Configuration Header=====&lt;br /&gt;
Vor dem Kompilieren der Library muss eine Anpassung des Configuration Headers an die eigenen Hardware-Voraussetzungen erfolgen.&lt;br /&gt;
Dazu gibt es im Configuration Header eine Definition:&lt;br /&gt;
* USE_PD5 -&amp;gt; Die Sensor Board Funktion &amp;quot;PD5&amp;quot; steuert den TCA4311A Enable Pin (EN).&lt;br /&gt;
Im nachfolgenden Listing ist die Definition USE_PD5 NICHT aktiv (d.h. der TCA4311A Enable Pin (EN) wird vom MAX7311 I/O 1.0 Pin angesteuert!). Dies muss an die eigene Hardware angepaßt werden. Wenn &amp;quot;PD5&amp;quot; den TCA4311A Enable Pin (EN) steuern soll, muss die Zeile mit &amp;quot;USE_PD5&amp;quot; &amp;quot;aktiviert&amp;quot; werden. Dazu entfernt man &amp;quot;//&amp;quot; am Zeilenanfang:&lt;br /&gt;
 #define USE_PD5&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Bevor man Beschleunigungs-, Magnetfeldsensor und Gyroskop nutzen kann, muss man sie kalibrieren:&lt;br /&gt;
&lt;br /&gt;
* '''Accelerometer:'''&lt;br /&gt;
** Die X-Achse wird kalibriert, indem man den RP6 mit der rechten Seite nach unten hält und den Maximalwert in MAX_X_A einträgt. Dann neigt man ihn auf seine linke Seite und trägt den negativen Maximalwert in MIN_X_A ein.&lt;br /&gt;
** Die Y-Achse wird kalibriert, indem man den RP6 mit der Vorderseite nach oben hält und den Maximalwert in MAX_Y_A einträgt. Dann kippt man die Vorderseite nach unten und trägt den negativen Maximalwert in MIN_Y_A ein.&lt;br /&gt;
** Die Z-Achse wird kalibriert, indem man den RP6 normal waagerecht hält und den Maximalwert in MAX_Z_A einträgt. Dann dreht man den RP6 &amp;quot;auf den Kopf&amp;quot; und trägt den negativen Maximalwert in MIN_Z_A ein.&lt;br /&gt;
** Sollten die angezeigten Pitch- und Roll-Werte nach der Kalibrierung der Achsen und genau waagerecht stehendem Sensor bzw. RP6 vom Nullwert deutlich abweichen, kann man sie mithilfe der Definitionen OFFSET_PITCH_A und OFFSET_ROLL_A &amp;quot;nullen&amp;quot;. Die Einheit dieser Definitionen ist °.&lt;br /&gt;
 ''HINWEIS: Die internen Berechnungen werden durch diese Offset-Korrektur&lt;br /&gt;
 NICHT beeinflußt. Die Offset-Werte können also nicht dazu benutzt werden,&lt;br /&gt;
 eine Achsenabweichung zwischen Sensor und RP6 zu kompensieren!''&lt;br /&gt;
* '''Magnetometer:'''&lt;br /&gt;
** Zur Kalibrierung des Magnetfeldsensors stellt man den RP6 auf eine waagerechte Fläche. Es dürfen keine Elektrogeräte, Metallteile und stromführende Leitungen in der Nähe sein, die das Magnetfeld verändern können.&lt;br /&gt;
** Zunächst ist es möglich, die sogenannten &amp;quot;hard iron&amp;quot; Effekte auszugleichen. Dies sind feste Magnetfeldabweichungen, die durch das &amp;quot;Gerät&amp;quot; (in unserem Fall also durch den kompletten RP6) verursacht werden, in oder auf dem der Sensor angebracht ist. Mit den Definitionen OFFSET_X_M, OFFSET_Y_M und OFFSET_Z_M können diese Effekte ausgeglichen werden. Diese Kalibrierung wird hier aktuell (noch) nicht beschrieben, so dass man die Werte für diese Definitionen zunächst bei 0 belassen sollte.&lt;br /&gt;
** Die X-Achse und Y-Achse wird kalibriert, indem man den RP6 langsam mehrfach um die eigene (Z-)Achse dreht und die Maximalwerte in MAX_X_M und MAX_Y_M einträgt. Die negativen Maximalwerte trägt man in MIN_X_M und MIN_Y_M ein.&lt;br /&gt;
** Die Z-Achse wird kalibriert, indem man den RP6 auf die rechte oder linke Seite legt, ihn dann langsam mehrfach auf der Stelle (um seine Y-Achse) dreht und den Maximalwert in MAX_Z_M und den negativen Maximalwert in MIN_Z_M einträgt.&lt;br /&gt;
** Mit der Definition DECLINATION_M kann man zur Verbesserung der Genauigkeit der Richtungsangaben den magnetischen Deklinationswert [°] (d.h. die magnetische Missweisung) am aktuellen Standort festlegen. [http://www.ngdc.noaa.gov/geomag-web/#declination Hier] befindet sich ein &amp;quot;Deklinations-Rechner&amp;quot;, mit dem man den Deklinationswert für den eigenen Standort ermitteln kann. &lt;br /&gt;
** Wenn man den Temperaturwert des LSM303DLHC nutzen will, muss man die Definition GET_TEMP_M aktivieren (Standard!). Den Temperaturwert kann man noch eichen, indem man die Definition OFFSET_TEMP_M anpasst. Die Einheit von OFFSET_TEMP_M ist °C.&lt;br /&gt;
* '''Gyroskop:'''&lt;br /&gt;
** In Ruhelage des RP6 wird ein ADC-Wert von ca. 511 angezeigt, wenn die Definition ADCVAL_ZERORATE_LEVEL im Configuration Header (RP6M256_Sensor_Board.h) vor der ersten Kompilierung zunächst auf 0 gesetzt wurde. Die Kalibrierung des Gyroskops ist abgeschlossen, nachdem man den in Ruhelage angezeigten ADC-Wert als ADCVAL_ZERORATE_LEVEL eingetragen hat.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''HINWEISE ZUR KALIBRIERUNG:'''&lt;br /&gt;
* Das Demo-Programm ist nicht sehr gut geeignet, um die Kalibrierungen durchzuführen.&lt;br /&gt;
* Man sollte mit einem eigenen kurzen ''Kalibrierungs-Programm'' nur die Rohwerte der jeweiligen X-, Y- und Z-Achse z.B. zweimal pro Sekunde ausgeben.&lt;br /&gt;
* Die Rohwerte sind in Variablen x_axis..., y_axis..., z_axis... enthalten. Da die Rohwerte in den Funktionen normalizeLSM303DLHC_A() bzw. normalizeLSM303DLHC_M() ggf. verändert werden, müssen die Rohwerte VOR Durchlaufen dieser Funktionen ausgegeben werden.&lt;br /&gt;
* '''Ohne eine sorgfältige Kalibrierung wird die Kompass-Funktion (insbesondere die neigungskompensierte Ausgabe der Himmelsrichtung) nicht funktionieren!'''&lt;br /&gt;
* Nach dem Eintragen der Kalibrierungs-Werte in den Configuration Header (RP6M256_Sensor_Board.h) muss die ''Demo'' neu kompiliert werden. Vorher sollten die Compiler-Hilfsdateien der Sensor Board-Library (Dateiendungen .st und .o) im Programmverzeichnis gelöscht werden.&lt;br /&gt;
* Getestet wird das Ergebnis der Kalibrierung, indem die Ausgabewerte (Temperatur, Pitch, Roll, Heading, Neigungs-kompensiertes Heading) der ''Demo'' überprüft werden. Dazu kann man Vergleichswerte (Thermometer, Winkelmesser für Pitch, Roll und externer Kompass für Heading) heranziehen.&lt;br /&gt;
* Wenn die Ausgabewerte nicht den Erwartungen entsprechen, muss die Kalibrierung wiederholt werden.&lt;br /&gt;
* Eine Kalibrierung der Sensoren ist nur zuverlässig, solange die Position des jeweiligen Sensors und seine komplette Hardware-Umgebung (also der RP6 mit allen seinen Teilen!) nicht verändert wird. Gibt es trotzdem Veränderungen, z.B. durch weitere Aufbauten auf dem RP6, müssen diese Sensoren neu kalibriert werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Datei: RP6M256_Sensor_Board.h&lt;br /&gt;
&amp;lt;pre&amp;gt;/* ****************************************************************************&lt;br /&gt;
 *                           _______________________&lt;br /&gt;
 *                           \| RP6  ROBOT SYSTEM |/&lt;br /&gt;
 *                            \_-_-_-_-_-_-_-_-_-_/           &amp;gt;&amp;gt;&amp;gt; RP6 M256 WIFI&lt;br /&gt;
 * ----------------------------------------------------------------------------&lt;br /&gt;
 * ----------------------------- [c]2014 - Dirk -------------------------------&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * File: RP6M256_Sensor_Board.h&lt;br /&gt;
 * Version: 1.1&lt;br /&gt;
 * Target: RP6 M256 WIFI - ATMEGA2560 @16.00MHz&lt;br /&gt;
 * Author(s): Dirk&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Description:&lt;br /&gt;
 * Configuration header file for new RP6 Sensor Board library.&lt;br /&gt;
 * The RP6 Sensor Board (CONRAD 1082384) is connected to the RP6M256 with the&lt;br /&gt;
 * two plugs:&lt;br /&gt;
 *   Sensor Board &amp;lt;---&amp;gt; RP6M256&lt;br /&gt;
 *   --------------------------------&lt;br /&gt;
 *   I/O (K17)    &amp;lt;---&amp;gt; IO_PWM/T0/T1&lt;br /&gt;
 *   ADC (K18)    &amp;lt;---&amp;gt; ADC_IO2/CMP&lt;br /&gt;
 * The RP6 Sensor Board function &amp;quot;PD5&amp;quot; (IC6: EN) is now connected to RP6M256&lt;br /&gt;
 * OC1B (PB6) and the RP6 Sensor Board function &amp;quot;ADC4&amp;quot; (SHARP_R) to RP6M256&lt;br /&gt;
 * ADC9 (PK1).&lt;br /&gt;
 * On the RP6 Sensor Board the functions &amp;quot;ADC0&amp;quot;, &amp;quot;ADC1&amp;quot;, &amp;quot;PWR&amp;quot; and &amp;quot;ADC4&amp;quot; are&lt;br /&gt;
 * connected to the USRBUS. The USRBUS may be wired on the RP6 mainboard like&lt;br /&gt;
 * this:&lt;br /&gt;
 *   Function : Sensor Board - USRBUS: * &amp;lt;---&amp;gt; RP6 Mainboard&lt;br /&gt;
 *   --------------------------------------------------------&lt;br /&gt;
 *   SHARP_F  : &amp;quot;ADC0&amp;quot;       - Pin 1     &amp;lt;---&amp;gt; ADC0: Pin 3&lt;br /&gt;
 *   GYRO     : &amp;quot;ADC1&amp;quot;       - Pin 2     &amp;lt;---&amp;gt; ADC1: Pin 3&lt;br /&gt;
 *   PWRON ²  : &amp;quot;PWR&amp;quot;        - Pin 3     &amp;lt;---&amp;gt; PWR&lt;br /&gt;
 *   SHARP_R  : &amp;quot;ADC4&amp;quot;       - Pin 5     &amp;lt;---&amp;gt; Not connected!&lt;br /&gt;
 * At *) It is also possible not to use the USRBUS, but to connect the RP6&lt;br /&gt;
 *       Sensor Board directly to the RP6 mainboard with 3 single cables.&lt;br /&gt;
 * At ²) See RP6 manual &amp;quot;4.6.8. Stromsparfunktionen&amp;quot;! &lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
#ifndef RP6M256_SENSOR_BOARD_H&lt;br /&gt;
#define RP6M256_SENSOR_BOARD_H&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// RP6 Sensor Board hardwired components:&lt;br /&gt;
// - I2C I/O Port Expander (MAX7311)&lt;br /&gt;
// - I2C Real Time Clock (RTC DS1339)&lt;br /&gt;
// - I2C Temperature Sensor (LM75B)&lt;br /&gt;
// - I2C Servo Controller (PCA9685)&lt;br /&gt;
// - I2C LED Driver (TCA6507)&lt;br /&gt;
// - I2C 3D Magnetometer &amp;amp; Accelerometer (LSM303DLHC)&lt;br /&gt;
// - Analog Yaw-Rate Gyroscope (LY330ALH)&lt;br /&gt;
// - Hot Swappable 2-Wire Bus Buffer (TCA4311A)&lt;br /&gt;
// - Button&lt;br /&gt;
// - Status LED&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C I/O Port Expander (MAX7311):&lt;br /&gt;
#define I2C_SENSOR_PORTEXP_ADR			0x40	// Default&lt;br /&gt;
&lt;br /&gt;
// Interrupt I/O portpin definitions (RP6M256):&lt;br /&gt;
#define IO_SENSOR_INT1_IN				INT1_PI12 // PCINT12 PJ3  XBUS Pin 8&lt;br /&gt;
#define IO_SENSOR_INT1_DDR				DDRJ&lt;br /&gt;
#define IO_SENSOR_INT1_PIN				PINJ&lt;br /&gt;
#define IO_SENSOR_INT1_PORT				PORTJ&lt;br /&gt;
#define IO_SENSOR_INT2_IN				INT2_PI15 // PCINT15 PJ6  XBUS Pin 11&lt;br /&gt;
#define IO_SENSOR_INT2_DDR				DDRJ&lt;br /&gt;
#define IO_SENSOR_INT2_PIN				PINJ&lt;br /&gt;
#define IO_SENSOR_INT2_PORT				PORTJ&lt;br /&gt;
#define IO_SENSOR_INT3_IN				INT3_PI14 // PCINT14 PJ5  XBUS Pin 9&lt;br /&gt;
#define IO_SENSOR_INT3_DDR				DDRJ&lt;br /&gt;
#define IO_SENSOR_INT3_PIN				PINJ&lt;br /&gt;
#define IO_SENSOR_INT3_PORT				PORTJ&lt;br /&gt;
#define IO_SENSOR_INTU_IN				INTU_PI13 // PCINT13 PJ4  XBUS Pin 7&lt;br /&gt;
#define IO_SENSOR_INTU_DDR				DDRJ&lt;br /&gt;
#define IO_SENSOR_INTU_PIN				PINJ&lt;br /&gt;
#define IO_SENSOR_INTU_PORT				PORTJ&lt;br /&gt;
&lt;br /&gt;
// I/O PORT pin numbers:&lt;br /&gt;
#define PIN7							7&lt;br /&gt;
#define PIN6							6&lt;br /&gt;
#define PIN5							5&lt;br /&gt;
#define PIN4							4&lt;br /&gt;
#define PIN3							3&lt;br /&gt;
#define PIN2							2&lt;br /&gt;
#define PIN1							1&lt;br /&gt;
#define PIN0							0&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Real Time Clock (RTC DS1339):&lt;br /&gt;
#define I2C_SENSOR_RTC_ADR				0xd0	// Default&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Temperature Sensor (LM75B):&lt;br /&gt;
#define I2C_SENSOR_TEMP_ADR				0x90	// Default&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Servo Controller (PCA9685):&lt;br /&gt;
#define I2C_SENSOR_SERVO_ADR			0x88	// Default&lt;br /&gt;
&lt;br /&gt;
// Servo and PWM channels:&lt;br /&gt;
#define CH_SERVO_1						16		// At K6: 1  &amp;quot;SERVO_1&amp;quot;&lt;br /&gt;
#define CH_SERVO_2						15		// At K11: 1 &amp;quot;SERVO_2&amp;quot;&lt;br /&gt;
#define CH_SERVO_3						13		// At K29: 1 &amp;quot;SERVO_3&amp;quot;&lt;br /&gt;
#define CH_SERVO_4						14		// At K30: 1 &amp;quot;SERVO_4&amp;quot;&lt;br /&gt;
#define CH_SERVO_5						11		// At K31: 1 &amp;quot;SERVO_5&amp;quot;&lt;br /&gt;
#define CH_SERVO_6						12		// At K32: 1 &amp;quot;SERVO_6&amp;quot;&lt;br /&gt;
#define CH_SERVO_7						9		// At K33: 1 &amp;quot;SERVO_7&amp;quot;&lt;br /&gt;
#define CH_SERVO_8						10		// At K34: 1 &amp;quot;SERVO_8&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#define CH_PWM_OUT_1					1		// At K12: 1 &amp;quot;PWM_OUT&amp;quot;&lt;br /&gt;
#define CH_PWM_OUT_2					2		// At K12: 2&lt;br /&gt;
#define CH_PWM_OUT_3					3		// At K12: 3&lt;br /&gt;
#define CH_PWM_OUT_4					4		// At K12: 4&lt;br /&gt;
#define CH_PWM_OUT_5					5		// At K12: 5&lt;br /&gt;
#define CH_PWM_OUT_6					6		// At K12: 6&lt;br /&gt;
#define CH_PWM_OUT_7					7		// At K12: 7&lt;br /&gt;
#define CH_PWM_OUT_8					8		// At K12: 8&lt;br /&gt;
&lt;br /&gt;
// Servo left touch (LT), right touch (RT), middle position (MP) constants:&lt;br /&gt;
// (Hints: - Servo impulse length [ms] = Servo position value / 204.8&lt;br /&gt;
//           (Formula only valid for a PWM of 50 Hz!)&lt;br /&gt;
//         - Min. servo impulse (0,7 ms) = Servo position 143&lt;br /&gt;
//         - Mid. servo impulse (1,5 ms) = Servo position 307&lt;br /&gt;
//         - Max. servo impulse (2,3 ms) = Servo position 471&lt;br /&gt;
//         - !!! You should NOT use servo position values &amp;lt; 143 or &amp;gt; 471 !!!)&lt;br /&gt;
#define SERVO1_LT						205		// Servo impulse ~1ms&lt;br /&gt;
#define SERVO1_RT						410		// Servo impulse ~2ms&lt;br /&gt;
#define SERVO1_MP						((SERVO1_RT - SERVO1_LT) / 2 + SERVO1_LT)&lt;br /&gt;
#define SERVO2_LT						205&lt;br /&gt;
#define SERVO2_RT						410&lt;br /&gt;
#define SERVO2_MP						((SERVO2_RT - SERVO2_LT) / 2 + SERVO2_LT)&lt;br /&gt;
#define SERVO3_LT						205&lt;br /&gt;
#define SERVO3_RT						410&lt;br /&gt;
#define SERVO3_MP						((SERVO3_RT - SERVO3_LT) / 2 + SERVO3_LT)&lt;br /&gt;
#define SERVO4_LT						205&lt;br /&gt;
#define SERVO4_RT						410&lt;br /&gt;
#define SERVO4_MP						((SERVO4_RT - SERVO4_LT) / 2 + SERVO4_LT)&lt;br /&gt;
#define SERVO5_LT						205&lt;br /&gt;
#define SERVO5_RT						410&lt;br /&gt;
#define SERVO5_MP						((SERVO5_RT - SERVO5_LT) / 2 + SERVO5_LT)&lt;br /&gt;
#define SERVO6_LT						205&lt;br /&gt;
#define SERVO6_RT						410&lt;br /&gt;
#define SERVO6_MP						((SERVO6_RT - SERVO6_LT) / 2 + SERVO6_LT)&lt;br /&gt;
#define SERVO7_LT						205&lt;br /&gt;
#define SERVO7_RT						410&lt;br /&gt;
#define SERVO7_MP						((SERVO7_RT - SERVO7_LT) / 2 + SERVO7_LT)&lt;br /&gt;
#define SERVO8_LT						205&lt;br /&gt;
#define SERVO8_RT						410&lt;br /&gt;
#define SERVO8_MP						((SERVO8_RT - SERVO8_LT) / 2 + SERVO8_LT)&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C LED Driver (TCA6507):&lt;br /&gt;
#define I2C_SENSOR_LEDDRIVER_ADR		0x8a	// Default&lt;br /&gt;
&lt;br /&gt;
// LED numbers:&lt;br /&gt;
#define SB_LED0							0		// At K7&lt;br /&gt;
#define DISPLAY_BACKLIGHT				0		// Display background light&lt;br /&gt;
#define SB_LED1							1		// At K4&lt;br /&gt;
#define SB_LED2							2		// At K2&lt;br /&gt;
#define SB_LED3							3		// At K10: 1&lt;br /&gt;
#define BACKLIGHT_R						3		// Right backlight&lt;br /&gt;
#define SB_LED4							4		// At K10: 2&lt;br /&gt;
#define BACKLIGHT_L						4		// Left backlight&lt;br /&gt;
#define SB_LED5							5		// White LED (D3)&lt;br /&gt;
#define HEADLIGHT_R						5		// Right headlight&lt;br /&gt;
#define SB_LED6							6		// White LED (D1)&lt;br /&gt;
#define HEADLIGHT_L						6		// Left headlight&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C 3D Magnetometer &amp;amp; Accelerometer (LSM303DLHC):&lt;br /&gt;
&lt;br /&gt;
// LSM303DLHC accelerometer:&lt;br /&gt;
#define I2C_SENSOR_LSM303DLHC_A_ADR 	0x32	// Default&lt;br /&gt;
&lt;br /&gt;
// LSM303DLHC accelerometer calibration data:&lt;br /&gt;
#define MAX_X_A						1037		// Max. X-axis value&lt;br /&gt;
#define MIN_X_A						-1030		// Min. X-axis value&lt;br /&gt;
#define MAX_Y_A						1030		// Max. Y-axis value&lt;br /&gt;
#define MIN_Y_A						-1019		// Min. Y-axis value&lt;br /&gt;
#define MAX_Z_A						1062		// Max. Z-axis value&lt;br /&gt;
#define MIN_Z_A						-1056		// Min. Z-axis value&lt;br /&gt;
#define OFFSET_PITCH_A				0.0			// Offset Pitch [°]&lt;br /&gt;
#define OFFSET_ROLL_A				0.0			// Offset Roll [°]&lt;br /&gt;
&lt;br /&gt;
// LSM303DLHC magnetometer:&lt;br /&gt;
#define I2C_SENSOR_LSM303DLHC_M_ADR		0x3c	// Default&lt;br /&gt;
&lt;br /&gt;
// LSM303DLHC magnetometer calibration data:&lt;br /&gt;
#define MAX_X_M						-111.0		// Max. X-axis value&lt;br /&gt;
#define MIN_X_M						-634.0		// Min. X-axis value&lt;br /&gt;
#define OFFSET_X_M					0			// Hard iron X-axis offset&lt;br /&gt;
#define MAX_Y_M						297.0		// Max. Y-axis value&lt;br /&gt;
#define MIN_Y_M						-215.0		// Min. Y-axis value&lt;br /&gt;
#define OFFSET_Y_M					0			// Hard iron Y-axis offset&lt;br /&gt;
#define MAX_Z_M						183.0		// Max. Z-axis value&lt;br /&gt;
#define MIN_Z_M						-214.0		// Min. Z-axis value&lt;br /&gt;
#define OFFSET_Z_M					0			// Hard iron Z-axis offset&lt;br /&gt;
#define DECLINATION_M				0.0			// E at local position [°]&lt;br /&gt;
&lt;br /&gt;
// LSM303DLHC temperature sensor definitions:&lt;br /&gt;
#define GET_TEMP_M								// Enable temperature sensor&lt;br /&gt;
#define OFFSET_TEMP_M				0.0			// Temperature offset [°C]&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Analog Yaw-Rate Gyroscope (LY330ALH):&lt;br /&gt;
&lt;br /&gt;
// LY330ALH gyroscope:&lt;br /&gt;
#define ADC_SENSOR_LY330ALH				ADC_1	// At USRBUS: 2 (RP6BASE)&lt;br /&gt;
&lt;br /&gt;
// LY330ALH gyroscope calibration data:&lt;br /&gt;
// (Higher values [505..1023] mean an angular velocity while rotating LEFT&lt;br /&gt;
//  and lower values [503..0] while rotating RIGHT!)&lt;br /&gt;
#define ADCVAL_MINRATE					0		// Min. rate value&lt;br /&gt;
#define ADCVAL_ZERORATE_LEVEL			504		// Zero rate level&lt;br /&gt;
#define ADCVAL_MAXRATE					1023	// Max. rate value&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Hot Swappable 2-Wire Bus Buffer (TCA4311A):&lt;br /&gt;
&lt;br /&gt;
// Define USE_PD5, if you want to control the TCA4311A enable pin (EN) with&lt;br /&gt;
// the RP6 Sensor Board function &amp;quot;PD5&amp;quot;. If USE_PD5 is NOT defined (default),&lt;br /&gt;
// the TCA4311A EN pin is controlled by the MAX7311 I/O 1.0 pin.&lt;br /&gt;
// ---------------&lt;br /&gt;
//#define USE_PD5&lt;br /&gt;
// ---------------&lt;br /&gt;
&lt;br /&gt;
#define IO_SENSOR_TCA4311A_EN_IN		OC1B_PI6 // At I/O: 9 (RP6M256)&lt;br /&gt;
#define IO_SENSOR_TCA4311A_EN_DDR		DDRB&lt;br /&gt;
#define IO_SENSOR_TCA4311A_EN_PIN		PINB&lt;br /&gt;
#define IO_SENSOR_TCA4311A_EN_PORT		PORTB&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Button:&lt;br /&gt;
&lt;br /&gt;
// (Button is connected to I/O 1.7 of the MAX7311!)&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Status LED:&lt;br /&gt;
&lt;br /&gt;
// (Status LED is connected to I/O 1.6 of the MAX7311!)&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Other ADC channel definitions:&lt;br /&gt;
&lt;br /&gt;
// (Depending on connections on the RP6 Sensor Board!)&lt;br /&gt;
#define ADC_SENSOR_SHARP_F				ADC_0	// At USRBUS: 1 (RP6BASE)&lt;br /&gt;
#define ADC_SENSOR_SHARP_R				ADC_9	// At ADC: 3    (RP6M256)&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
/******************************************************************************&lt;br /&gt;
 * Additional info&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Changelog:&lt;br /&gt;
 * &lt;br /&gt;
 *  ---&amp;gt; changes are documented in the file &amp;quot;RP6M256_Sensor_BoardLib.c&amp;quot;&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=====Library Header=====&lt;br /&gt;
Datei: RP6M256_Sensor_BoardLib.h&lt;br /&gt;
&amp;lt;pre&amp;gt;/* ****************************************************************************&lt;br /&gt;
 *                           _______________________&lt;br /&gt;
 *                           \| RP6  ROBOT SYSTEM |/&lt;br /&gt;
 *                            \_-_-_-_-_-_-_-_-_-_/           &amp;gt;&amp;gt;&amp;gt; RP6 M256 WIFI&lt;br /&gt;
 * ----------------------------------------------------------------------------&lt;br /&gt;
 * ----------------------------- [c]2014 - Dirk -------------------------------&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * File: RP6M256_Sensor_BoardLib.h&lt;br /&gt;
 * Version: 1.1&lt;br /&gt;
 * Target: RP6 M256 WIFI - ATMEGA2560 @16.00MHz&lt;br /&gt;
 * Author(s): Dirk&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Description:&lt;br /&gt;
 * Header file for new RP6 Sensor Board library.&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
#ifndef RP6M256_SENSOR_BOARDLIB_H&lt;br /&gt;
#define RP6M256_SENSOR_BOARDLIB_H&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// RP6 Sensor Board hardwired components:&lt;br /&gt;
// - I2C I/O Port Expander (MAX7311)&lt;br /&gt;
// - I2C Real Time Clock (RTC DS1339)&lt;br /&gt;
// - I2C Temperature Sensor (LM75B)&lt;br /&gt;
// - I2C Servo Controller (PCA9685)&lt;br /&gt;
// - I2C LED Driver (TCA6507)&lt;br /&gt;
// - I2C 3D Magnetometer &amp;amp; Accelerometer (LSM303DLHC)&lt;br /&gt;
// - Analog Yaw-Rate Gyroscope (LY330ALH)&lt;br /&gt;
// - Hot Swappable 2-Wire Bus Buffer (TCA4311A)&lt;br /&gt;
// - Button&lt;br /&gt;
// - Status LED&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Includes:&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6M256Lib.h&amp;quot;&lt;br /&gt;
#include &amp;quot;RP6I2CmasterTWI.h&amp;quot;&lt;br /&gt;
#include &amp;quot;RP6M256_Sensor_Board.h&amp;quot;&lt;br /&gt;
#include &amp;lt;math.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// RP6M256_I2CMasterLib definitions:&lt;br /&gt;
&lt;br /&gt;
#ifndef I2C_RP6_BASE_ADR&lt;br /&gt;
	#define I2C_RP6_BASE_ADR			10&lt;br /&gt;
#endif&lt;br /&gt;
#ifndef I2C_REG_ADC_ADC0_L&lt;br /&gt;
	#define I2C_REG_ADC_ADC0_L			23&lt;br /&gt;
#endif&lt;br /&gt;
#ifndef I2C_REG_ADC_ADC1_L&lt;br /&gt;
	#define I2C_REG_ADC_ADC1_L			25&lt;br /&gt;
#endif&lt;br /&gt;
#ifndef CMD_POWER_OFF&lt;br /&gt;
	#define CMD_POWER_OFF				0&lt;br /&gt;
#endif&lt;br /&gt;
#ifndef CMD_POWER_ON&lt;br /&gt;
	#define CMD_POWER_ON				1&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C I/O Port Expander (MAX7311):&lt;br /&gt;
&lt;br /&gt;
// Registers:&lt;br /&gt;
#define MAX7311_INPUT_PORT1				0&lt;br /&gt;
#define MAX7311_INPUT_PORT2				1&lt;br /&gt;
#define MAX7311_OUTPUT_PORT1			2&lt;br /&gt;
#define MAX7311_OUTPUT_PORT2			3&lt;br /&gt;
#define MAX7311_PORT1_POL_INV			4&lt;br /&gt;
#define MAX7311_PORT2_POL_INV			5&lt;br /&gt;
#define MAX7311_PORT1_CONFIG			6&lt;br /&gt;
#define MAX7311_PORT2_CONFIG			7&lt;br /&gt;
#define MAX7311_TIMEOUT					8&lt;br /&gt;
&lt;br /&gt;
// Port 1 configuration register bitmasks:&lt;br /&gt;
#define ST_GYRO							(1 &amp;lt;&amp;lt; PIN7)	// I/O 0.7 (Output)&lt;br /&gt;
#define PD_GYRO							(1 &amp;lt;&amp;lt; PIN6)	// I/O 0.6 (Output)&lt;br /&gt;
#define PWR_CAM_IF						(1 &amp;lt;&amp;lt; PIN5)	// I/O 0.5 (Output)&lt;br /&gt;
#define EN_LEDDRIV						(1 &amp;lt;&amp;lt; PIN4)	// I/O 0.4 (Output)&lt;br /&gt;
#define RDY_BUSBUFF						(1 &amp;lt;&amp;lt; PIN3)	// I/O 0.3 (Input)&lt;br /&gt;
#define PWR_SHARP_R						(1 &amp;lt;&amp;lt; PIN2)	// I/O 0.2 (Output)&lt;br /&gt;
#define PWR_SHARP_F						(1 &amp;lt;&amp;lt; PIN1)	// I/O 0.1 (Output)&lt;br /&gt;
#define PWR_I2C							(1 &amp;lt;&amp;lt; PIN0)	// I/O 0.0 (Output)&lt;br /&gt;
&lt;br /&gt;
// Port 2 configuration register bitmasks:&lt;br /&gt;
#define IO2_I2C							(1 &amp;lt;&amp;lt; PIN7)	// I/O 1.7 (Input)&lt;br /&gt;
#define IO1_I2C							(1 &amp;lt;&amp;lt; PIN6)	// I/O 1.6 (Output)&lt;br /&gt;
#define DRDY_MAGACC						(1 &amp;lt;&amp;lt; PIN5)	// I/O 1.5 (Input)&lt;br /&gt;
#define PWR_SERVO						(1 &amp;lt;&amp;lt; PIN4)	// I/O 1.4 (Output)&lt;br /&gt;
#define OEN_SERVO						(1 &amp;lt;&amp;lt; PIN3)	// I/O 1.3 (Output)&lt;br /&gt;
#define IO_K19_1						(1 &amp;lt;&amp;lt; PIN2)	// I/O 1.2 (Input)&lt;br /&gt;
#define IO_K19_3						(1 &amp;lt;&amp;lt; PIN1)	// I/O 1.1 (Input)&lt;br /&gt;
#define EN_BUSBUFF						(1 &amp;lt;&amp;lt; PIN0)	// I/O 1.0 (Output)&lt;br /&gt;
&lt;br /&gt;
// Port 1 &amp;amp; 2 register 16-bit bitmasks:&lt;br /&gt;
// (CONFIG: 1 = Input, 0 = Output)&lt;br /&gt;
#define MAX7311_CONFIG_DEFAULT			0b1010011000001000&lt;br /&gt;
#define MAX7311_CONFIG_USE_PD5			0b1010011100001000&lt;br /&gt;
// (OUTPUT: 1 = High/True, 0 = Low/False)&lt;br /&gt;
#define MAX7311_OUTPUT_DEFAULT			0b0100000100010000&lt;br /&gt;
#define MAX7311_OUTPUT_FULLPOWER		0b0001000100110111&lt;br /&gt;
#define MAX7311_OUTPUT_SHUTDOWN			0b0100100011000000&lt;br /&gt;
&lt;br /&gt;
// Safe configuration:&lt;br /&gt;
// (Ensures if activated, that I/Os 0.3, 1.5 and 1.7 cannot be configured&lt;br /&gt;
//  as output with the function MAX7311_write_cfg(). This may protect the&lt;br /&gt;
//  RP6 Sensor Board from hardware damage.)&lt;br /&gt;
// -------------------&lt;br /&gt;
#define SAFE_CONFIG&lt;br /&gt;
// -------------------&lt;br /&gt;
&lt;br /&gt;
typedef union {&lt;br /&gt;
 	uint8_t byte;&lt;br /&gt;
	struct {&lt;br /&gt;
		unsigned int1   :1;				// INT1  XBUS Pin 8&lt;br /&gt;
		unsigned int2   :1;				// INT2  XBUS Pin 11&lt;br /&gt;
		unsigned int3   :1;				// INT3  XBUS Pin 9&lt;br /&gt;
		unsigned intu   :1;				// INTU  XBUS Pin 7&lt;br /&gt;
		unsigned unused :4;&lt;br /&gt;
	};&lt;br /&gt;
	struct {&lt;br /&gt;
		unsigned magacc1     :1;		// INT1: LSM303DLHC INT1&lt;br /&gt;
		unsigned portexp     :1;		// INT2: MAX7311 INT_N&lt;br /&gt;
		unsigned magacc2_rtc :1;		// INT3: LSM303DLHC INT2&lt;br /&gt;
		unsigned noname      :5;		//       OR DS1339 SQW/INT_N&lt;br /&gt;
	};&lt;br /&gt;
} interrupt_RP6SBstatus_t;&lt;br /&gt;
extern interrupt_RP6SBstatus_t interrupt_RP6SBstatus;&lt;br /&gt;
&lt;br /&gt;
typedef union {&lt;br /&gt;
	uint16_t word;&lt;br /&gt;
	struct {&lt;br /&gt;
		unsigned pwr_i2c     :1;		// I/O 0.0 (Output)&lt;br /&gt;
		unsigned pwr_sharp_f :1;		// I/O 0.1 (Output)&lt;br /&gt;
		unsigned pwr_sharp_r :1;		// I/O 0.2 (Output)&lt;br /&gt;
		unsigned rdy_busbuff :1;		// I/O 0.3 (Input)&lt;br /&gt;
		unsigned en_leddriv  :1;		// I/O 0.4 (Output)&lt;br /&gt;
		unsigned pwr_cam_if  :1;		// I/O 0.5 (Output)&lt;br /&gt;
		unsigned pd_gyro     :1;		// I/O 0.6 (Output)&lt;br /&gt;
		unsigned st_gyro     :1;		// I/O 0.7 (Output)&lt;br /&gt;
		unsigned en_busbuff  :1;		// I/O 1.0 (Output)&lt;br /&gt;
		unsigned io_k19_3    :1;		// I/O 1.1 (Input)&lt;br /&gt;
		unsigned io_k19_1    :1;		// I/O 1.2 (Input)&lt;br /&gt;
		unsigned oen_servo   :1;		// I/O 1.3 (Output)&lt;br /&gt;
		unsigned pwr_servo   :1;		// I/O 1.4 (Output)&lt;br /&gt;
		unsigned drdy_magacc :1;		// I/O 1.5 (Input)&lt;br /&gt;
		unsigned io1_i2c     :1;		// I/O 1.6 (Output)&lt;br /&gt;
		unsigned io2_i2c     :1;		// I/O 1.7 (Input)&lt;br /&gt;
	};&lt;br /&gt;
} max7311IOs_t;&lt;br /&gt;
extern max7311IOs_t inport;&lt;br /&gt;
extern max7311IOs_t outport;&lt;br /&gt;
extern uint8_t readyBusbuff;&lt;br /&gt;
extern uint8_t pressedButton;&lt;br /&gt;
&lt;br /&gt;
void MAX7311_write_cfg(uint16_t);&lt;br /&gt;
void task_checkINTs(void);&lt;br /&gt;
void task_RP6SensorBoard(void);&lt;br /&gt;
void MAX7311_update(void);&lt;br /&gt;
void MAX7311_write(uint16_t);&lt;br /&gt;
void MAX7311_init(void);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Real Time Clock (RTC DS1339):&lt;br /&gt;
&lt;br /&gt;
// Registers:&lt;br /&gt;
#define DS1339_SECONDS					0&lt;br /&gt;
#define DS1339_MINUTES					1&lt;br /&gt;
#define DS1339_HOURS					2&lt;br /&gt;
#define DS1339_DAY						3&lt;br /&gt;
#define DS1339_DATE						4&lt;br /&gt;
#define DS1339_MONTH_CENTURY			5&lt;br /&gt;
#define DS1339_YEAR						6&lt;br /&gt;
#define DS1339_ALARM1_SECONDS			7&lt;br /&gt;
#define DS1339_ALARM1_MINUTES			8&lt;br /&gt;
#define DS1339_ALARM1_HOURS				9&lt;br /&gt;
#define DS1339_ALARM1_DAY_DATE			10&lt;br /&gt;
#define DS1339_ALARM2_MINUTES			11&lt;br /&gt;
#define DS1339_ALARM2_HOURS				12&lt;br /&gt;
#define DS1339_ALARM2_DAY_DATE			13&lt;br /&gt;
#define DS1339_CONTROL					14&lt;br /&gt;
#define DS1339_STATUS					15&lt;br /&gt;
#define DS1339_TRICKLE_CHARGER			16&lt;br /&gt;
&lt;br /&gt;
// Control register bitmasks:&lt;br /&gt;
#define DS1339_CONTROL_DEFAULT			0		// Power on default&lt;br /&gt;
#define DS1339_CONTROL_A1IE				1&lt;br /&gt;
#define DS1339_CONTROL_A2IE				2&lt;br /&gt;
#define DS1339_CONTROL_INTCN			4&lt;br /&gt;
#define DS1339_CONTROL_RS1				8&lt;br /&gt;
#define DS1339_CONTROL_RS2				16&lt;br /&gt;
#define DS1339_CONTROL_BBSQI			32&lt;br /&gt;
#define DS1339_CONTROL_EOSC				128&lt;br /&gt;
&lt;br /&gt;
// Trickle Charger register bitmasks:&lt;br /&gt;
#define DS1339_TRICKLE_CHARGER_DEFAULT	0b10101010 // One diode, 2k resistor&lt;br /&gt;
#define DS1339_TRICKLE_CHARGER_ROUT0	1&lt;br /&gt;
#define DS1339_TRICKLE_CHARGER_ROUT1	2&lt;br /&gt;
#define DS1339_TRICKLE_CHARGER_DS0		4&lt;br /&gt;
#define DS1339_TRICKLE_CHARGER_DS1		8&lt;br /&gt;
#define DS1339_TRICKLE_CHARGER_TCS0		16&lt;br /&gt;
#define DS1339_TRICKLE_CHARGER_TCS1		32&lt;br /&gt;
#define DS1339_TRICKLE_CHARGER_TCS2		64&lt;br /&gt;
#define DS1339_TRICKLE_CHARGER_TCS3		128&lt;br /&gt;
&lt;br /&gt;
enum RTCWEEKDAYS {&lt;br /&gt;
	R_MO = 1, R_TU, R_WE, R_TH, R_FR, R_SA, R_SU&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
typedef struct {&lt;br /&gt;
	uint16_t         year;				// Year&lt;br /&gt;
	uint8_t          month;				// Month   [1..12]&lt;br /&gt;
	enum RTCWEEKDAYS weekday;			// Weekday [1..7 = R_MO..R_SU]&lt;br /&gt;
	uint8_t          day;				// Day     [1..31]&lt;br /&gt;
} rtcdate_t;&lt;br /&gt;
rtcdate_t rtc_date;&lt;br /&gt;
&lt;br /&gt;
typedef struct {&lt;br /&gt;
	uint8_t dst;						// Daylight-saving-time (time zone)&lt;br /&gt;
	uint8_t hour;						// Hour    [0..23]&lt;br /&gt;
	uint8_t minute;						// Minute  [0..59]&lt;br /&gt;
	uint8_t second;						// Second  [0..59]&lt;br /&gt;
} rtctime_t;&lt;br /&gt;
rtctime_t rtc_time;&lt;br /&gt;
&lt;br /&gt;
uint8_t BCD2DEC(uint8_t);&lt;br /&gt;
uint8_t DEC2BCD(uint8_t);&lt;br /&gt;
void DS1339_write_cfg(uint8_t);&lt;br /&gt;
void DS1339_init(void);&lt;br /&gt;
#define CALC_DST						// Time zone will be calculated&lt;br /&gt;
void DS1339_read(void);&lt;br /&gt;
void DS1339_write(void);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Temperature Sensor (LM75B):&lt;br /&gt;
&lt;br /&gt;
// Registers:&lt;br /&gt;
#define LM75B_TEMP						0&lt;br /&gt;
#define LM75B_CONF						1&lt;br /&gt;
#define LM75B_THYST						2&lt;br /&gt;
#define LM75B_TOS						3&lt;br /&gt;
&lt;br /&gt;
// Conf register bitmasks:&lt;br /&gt;
#define LM75B_CONF_DEFAULT				0		// Power on default&lt;br /&gt;
#define LM75B_CONF_SHUTDOWN				1&lt;br /&gt;
#define LM75B_CONF_OS_COMP_INT			2&lt;br /&gt;
#define LM75B_CONF_OS_POL				4&lt;br /&gt;
#define LM75B_CONF_OS_F_QUE0			8&lt;br /&gt;
#define LM75B_CONF_OS_F_QUE1			16&lt;br /&gt;
&lt;br /&gt;
extern double temperature;&lt;br /&gt;
&lt;br /&gt;
void LM75B_write_cfg(uint8_t);&lt;br /&gt;
#define LM75B_shutdown() {LM75B_write_cfg(LM75B_CONF_SHUTDOWN);}&lt;br /&gt;
#define LM75B_init() {LM75B_write_cfg(LM75B_CONF_DEFAULT);}&lt;br /&gt;
extern uint8_t temperature_low;&lt;br /&gt;
extern uint8_t temperature_high;&lt;br /&gt;
#define getTemperatureHigh() (temperature_high)&lt;br /&gt;
#define getTemperatureLow() (temperature_low)&lt;br /&gt;
void LM75B_read(void);&lt;br /&gt;
double LM75B_calculate(void);&lt;br /&gt;
double LM75B_measure(void);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Servo Controller (PCA9685):&lt;br /&gt;
&lt;br /&gt;
// Registers:&lt;br /&gt;
#define PCA9685_MODE1					0&lt;br /&gt;
#define PCA9685_MODE2					1&lt;br /&gt;
#define PCA9685_SUBADR1					2&lt;br /&gt;
#define PCA9685_SUBADR2					3&lt;br /&gt;
#define PCA9685_SUBADR3					4&lt;br /&gt;
#define PCA9685_ALLCALLADR				5&lt;br /&gt;
#define PCA9685_LED0_ON_L				6&lt;br /&gt;
#define PCA9685_LED0_ON_H				7&lt;br /&gt;
#define PCA9685_LED0_OFF_L				8&lt;br /&gt;
#define PCA9685_LED0_OFF_H				9&lt;br /&gt;
#define PCA9685_LED1_ON_L				10&lt;br /&gt;
#define PCA9685_LED1_ON_H				11&lt;br /&gt;
#define PCA9685_LED1_OFF_L				12&lt;br /&gt;
#define PCA9685_LED1_OFF_H				13&lt;br /&gt;
#define PCA9685_LED2_ON_L				14&lt;br /&gt;
#define PCA9685_LED2_ON_H				15&lt;br /&gt;
#define PCA9685_LED2_OFF_L				16&lt;br /&gt;
#define PCA9685_LED2_OFF_H				17&lt;br /&gt;
#define PCA9685_LED3_ON_L				18&lt;br /&gt;
#define PCA9685_LED3_ON_H				19&lt;br /&gt;
#define PCA9685_LED3_OFF_L				20&lt;br /&gt;
#define PCA9685_LED3_OFF_H				21&lt;br /&gt;
#define PCA9685_LED4_ON_L				22&lt;br /&gt;
#define PCA9685_LED4_ON_H				23&lt;br /&gt;
#define PCA9685_LED4_OFF_L				24&lt;br /&gt;
#define PCA9685_LED4_OFF_H				25&lt;br /&gt;
#define PCA9685_LED5_ON_L				26&lt;br /&gt;
#define PCA9685_LED5_ON_H				27&lt;br /&gt;
#define PCA9685_LED5_OFF_L				28&lt;br /&gt;
#define PCA9685_LED5_OFF_H				29&lt;br /&gt;
#define PCA9685_LED6_ON_L				30&lt;br /&gt;
#define PCA9685_LED6_ON_H				31&lt;br /&gt;
#define PCA9685_LED6_OFF_L				32&lt;br /&gt;
#define PCA9685_LED6_OFF_H				33&lt;br /&gt;
#define PCA9685_LED7_ON_L				34&lt;br /&gt;
#define PCA9685_LED7_ON_H				35&lt;br /&gt;
#define PCA9685_LED7_OFF_L				36&lt;br /&gt;
#define PCA9685_LED7_OFF_H				37&lt;br /&gt;
#define PCA9685_LED8_ON_L				38&lt;br /&gt;
#define PCA9685_LED8_ON_H				39&lt;br /&gt;
#define PCA9685_LED8_OFF_L				40&lt;br /&gt;
#define PCA9685_LED8_OFF_H				41&lt;br /&gt;
#define PCA9685_LED9_ON_L				42&lt;br /&gt;
#define PCA9685_LED9_ON_H				43&lt;br /&gt;
#define PCA9685_LED9_OFF_L				44&lt;br /&gt;
#define PCA9685_LED9_OFF_H				45&lt;br /&gt;
#define PCA9685_LED10_ON_L				46&lt;br /&gt;
#define PCA9685_LED10_ON_H				47&lt;br /&gt;
#define PCA9685_LED10_OFF_L				48&lt;br /&gt;
#define PCA9685_LED10_OFF_H				49&lt;br /&gt;
#define PCA9685_LED11_ON_L				50&lt;br /&gt;
#define PCA9685_LED11_ON_H				51&lt;br /&gt;
#define PCA9685_LED11_OFF_L				52&lt;br /&gt;
#define PCA9685_LED11_OFF_H				53&lt;br /&gt;
#define PCA9685_LED12_ON_L				54&lt;br /&gt;
#define PCA9685_LED12_ON_H				55&lt;br /&gt;
#define PCA9685_LED12_OFF_L				56&lt;br /&gt;
#define PCA9685_LED12_OFF_H				57&lt;br /&gt;
#define PCA9685_LED13_ON_L				58&lt;br /&gt;
#define PCA9685_LED13_ON_H				59&lt;br /&gt;
#define PCA9685_LED13_OFF_L				60&lt;br /&gt;
#define PCA9685_LED13_OFF_H				61&lt;br /&gt;
#define PCA9685_LED14_ON_L				62&lt;br /&gt;
#define PCA9685_LED14_ON_H				63&lt;br /&gt;
#define PCA9685_LED14_OFF_L				64&lt;br /&gt;
#define PCA9685_LED14_OFF_H				65&lt;br /&gt;
#define PCA9685_LED15_ON_L				66&lt;br /&gt;
#define PCA9685_LED15_ON_H				67&lt;br /&gt;
#define PCA9685_LED15_OFF_L				68&lt;br /&gt;
#define PCA9685_LED15_OFF_H				69&lt;br /&gt;
#define PCA9685_ALL_LED_ON_L			250&lt;br /&gt;
#define PCA9685_ALL_LED_ON_H			251&lt;br /&gt;
#define PCA9685_ALL_LED_OFF_L			252&lt;br /&gt;
#define PCA9685_ALL_LED_OFF_H			253&lt;br /&gt;
#define PCA9685_PRE_SCALE				254&lt;br /&gt;
#define PCA9685_TESTMODE				255&lt;br /&gt;
&lt;br /&gt;
// Mode1 register bitmasks:&lt;br /&gt;
#define PCA9685_MODE1_ALLCALL			1&lt;br /&gt;
#define PCA9685_MODE1_SUB3				2&lt;br /&gt;
#define PCA9685_MODE1_SUB2				4&lt;br /&gt;
#define PCA9685_MODE1_SUB1				8&lt;br /&gt;
#define PCA9685_MODE1_SLEEP				16&lt;br /&gt;
#define PCA9685_MODE1_AI				32&lt;br /&gt;
#define PCA9685_MODE1_EXTCLK			64&lt;br /&gt;
#define PCA9685_MODE1_RESTART			128&lt;br /&gt;
&lt;br /&gt;
// Mode2 register bitmasks:&lt;br /&gt;
#define PCA9685_MODE2_OUTNE01_DEFAULT	0&lt;br /&gt;
#define PCA9685_MODE2_OUTDRV			4&lt;br /&gt;
#define PCA9685_MODE2_OCH				8&lt;br /&gt;
#define PCA9685_MODE2_INVRT				16&lt;br /&gt;
&lt;br /&gt;
#define F_PCA9685						25000000.0	// Int. Clock: 25 MHz&lt;br /&gt;
&lt;br /&gt;
void PCA9685_init(uint16_t);&lt;br /&gt;
#define initServo(__FREQ__) {PCA9685_init(__FREQ__);}&lt;br /&gt;
uint8_t servo(uint8_t);&lt;br /&gt;
void PCA9685_set(uint8_t, uint16_t);&lt;br /&gt;
#define setServo(__SERVO__,__POS__) {PCA9685_set(servo(__SERVO__),__POS__);}&lt;br /&gt;
void PCA9685_shutdown(void);&lt;br /&gt;
void PCA9685_restart(void);&lt;br /&gt;
void setServoPower(uint8_t);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C LED Driver (TCA6507):&lt;br /&gt;
&lt;br /&gt;
// Registers:&lt;br /&gt;
#define TCA6507_SELECT0				0&lt;br /&gt;
#define TCA6507_SELECT1				1&lt;br /&gt;
#define TCA6507_SELECT2				2&lt;br /&gt;
#define TCA6507_FADEON_TIME			3&lt;br /&gt;
#define TCA6507_FULLYON_TIME		4&lt;br /&gt;
#define TCA6507_FADEOFF_TIME		5&lt;br /&gt;
#define TCA6507_1ST_FULLYOFF_TIME	6&lt;br /&gt;
#define TCA6507_2ND_FULLYOFF_TIME	7&lt;br /&gt;
#define TCA6507_MAXIMUM_INTENSITY	8&lt;br /&gt;
#define TCA6507_MASTER_INTENSITY	9&lt;br /&gt;
#define TCA6507_INITIALIZATION		10&lt;br /&gt;
&lt;br /&gt;
// Output states:&lt;br /&gt;
#define STATE_OFF					0&lt;br /&gt;
#define STATE_PWM0					2&lt;br /&gt;
#define STATE_PWM1					3&lt;br /&gt;
#define STATE_ON					4&lt;br /&gt;
#define STATE_MINT					5&lt;br /&gt;
#define STATE_BLINK0				6&lt;br /&gt;
#define STATE_BLINK1				7&lt;br /&gt;
&lt;br /&gt;
extern uint8_t select[3];&lt;br /&gt;
&lt;br /&gt;
void TCA6507_write_cfg(uint8_t, uint8_t);&lt;br /&gt;
void TCA6507_update(void);&lt;br /&gt;
void TCA6507_set(uint8_t, uint8_t);&lt;br /&gt;
#define setLED(__LED__,__STATE__) {TCA6507_set(__LED__,__STATE__);}&lt;br /&gt;
void TCA6507_shutdown(void);&lt;br /&gt;
void TCA6507_restart(void);&lt;br /&gt;
void TCA6507_init(void);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C 3D Magnetometer &amp;amp; Accelerometer (LSM303DLHC):&lt;br /&gt;
&lt;br /&gt;
// LSM303DLHC accelerometer internal registers:&lt;br /&gt;
#define CTRL_REG1_A					0x20&lt;br /&gt;
#define CTRL_REG2_A					0x21&lt;br /&gt;
#define CTRL_REG3_A					0x22&lt;br /&gt;
#define CTRL_REG4_A					0x23&lt;br /&gt;
#define CTRL_REG5_A					0x24&lt;br /&gt;
#define CTRL_REG6_A					0x25&lt;br /&gt;
#define REFERENCE_A					0x26&lt;br /&gt;
#define STATUS_REG_A				0x27&lt;br /&gt;
#define OUT_X_L_A					0x28&lt;br /&gt;
#define OUT_X_H_A					0x29&lt;br /&gt;
#define OUT_Y_L_A					0x2a&lt;br /&gt;
#define OUT_Y_H_A					0x2b&lt;br /&gt;
#define OUT_Z_L_A					0x2c&lt;br /&gt;
#define OUT_Z_H_A					0x2d&lt;br /&gt;
#define FIFO_CTRL_REG_A				0x2e&lt;br /&gt;
#define FIFO_SRC_REG_A				0x2f&lt;br /&gt;
#define INT1_CFG_A					0x30&lt;br /&gt;
#define INT1_SOURCE_A				0x31&lt;br /&gt;
#define INT1_THS_A					0x32&lt;br /&gt;
#define INT1_DURATION_A				0x33&lt;br /&gt;
#define INT2_CFG_A					0x34&lt;br /&gt;
#define INT2_SOURCE_A				0x35&lt;br /&gt;
#define INT2_THS_A					0x36&lt;br /&gt;
#define INT2_DURATION_A				0x37&lt;br /&gt;
#define CLICK_CFG_A					0x38&lt;br /&gt;
#define CLICK_SRC_A					0x39&lt;br /&gt;
#define CLICK_THS_A					0x3a&lt;br /&gt;
#define TIME_LIMIT_A				0x3b&lt;br /&gt;
#define TIME_LATENCY_A				0x3c&lt;br /&gt;
#define TIME_WINDOW_A				0x3d&lt;br /&gt;
&lt;br /&gt;
// LSM303DLHC accelerometer register settings:&lt;br /&gt;
#define CTRL_REG1_A_10HZ			0b00100111	// 10Hz &amp;amp; all axes enable&lt;br /&gt;
#define CTRL_REG1_A_50HZ			0b01000111	// 50Hz &amp;amp; all axes enable&lt;br /&gt;
#define CTRL_REG4_A_DEFAULT			0b00000000	// Default (Normal mode)&lt;br /&gt;
#define CTRL_REG4_A_HR				0b00001000	// HR output mode&lt;br /&gt;
&lt;br /&gt;
// LSM303DLHC magnetometer internal registers:&lt;br /&gt;
#define CRA_REG_M					0x00&lt;br /&gt;
#define CRB_REG_M					0x01&lt;br /&gt;
#define MR_REG_M					0x02&lt;br /&gt;
#define OUT_X_H_M					0x03&lt;br /&gt;
#define OUT_X_L_M					0x04&lt;br /&gt;
#define OUT_Z_H_M					0x05&lt;br /&gt;
#define OUT_Z_L_M					0x06&lt;br /&gt;
#define OUT_Y_H_M					0x07&lt;br /&gt;
#define OUT_Y_L_M					0x08&lt;br /&gt;
#define SR_REG_MG					0x09&lt;br /&gt;
#define IRA_REG_M					0x0a&lt;br /&gt;
#define IRB_REG_M					0x0b&lt;br /&gt;
#define IRC_REG_M					0x0c&lt;br /&gt;
#define TEMP_OUT_H_M				0x31&lt;br /&gt;
#define TEMP_OUT_L_M				0x32&lt;br /&gt;
&lt;br /&gt;
// LSM303DLHC magnetometer register settings:&lt;br /&gt;
#define CRA_REG_M_15HZ				0b00010000	// Default (Data rate 15Hz)&lt;br /&gt;
#define CRA_REG_M_15HZ_T_EN			0b10010000	// 15Hz &amp;amp; temperature enable&lt;br /&gt;
#define CRB_REG_M_13GAUSS			0b00100000	// Gain +-1.3Gauss&lt;br /&gt;
#define MR_REG_M_CCM				0b00000000	// Continuous-conversion mode&lt;br /&gt;
#define MR_REG_M_SCM				0b00000001	// Single-conversion mode&lt;br /&gt;
#define MR_REG_M_SLEEP				0b00000011	// Default (Sleep-mode)&lt;br /&gt;
&lt;br /&gt;
extern int16_t x_axisa, y_axisa, z_axisa;&lt;br /&gt;
extern double pitch, roll;&lt;br /&gt;
extern double xa, ya, za;&lt;br /&gt;
extern double the, phi;&lt;br /&gt;
&lt;br /&gt;
extern int16_t x_axism, y_axism, z_axism;&lt;br /&gt;
extern int16_t headingm;&lt;br /&gt;
extern double xm, ym, zm;&lt;br /&gt;
#ifdef GET_TEMP_M&lt;br /&gt;
extern int16_t temperaturem;&lt;br /&gt;
extern double temperature_mag;&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
extern int16_t headingtc;&lt;br /&gt;
&lt;br /&gt;
void LSM303DLHC_A_init(void);&lt;br /&gt;
void readLSM303DLHC_A(void);&lt;br /&gt;
void normalizeLSM303DLHC_A(void);&lt;br /&gt;
void positionLSM303DLHC_A(void);&lt;br /&gt;
&lt;br /&gt;
void LSM303DLHC_M_init(void);&lt;br /&gt;
void readLSM303DLHC_M(void);&lt;br /&gt;
void normalizeLSM303DLHC_M(void);&lt;br /&gt;
int16_t headingLSM303DLHC_M(void);&lt;br /&gt;
&lt;br /&gt;
int16_t headingLSM303DLHC_TC(void);&lt;br /&gt;
&lt;br /&gt;
void LSM303DLHC_init(void);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Analog Yaw-Rate Gyroscope (LY330ALH):&lt;br /&gt;
&lt;br /&gt;
#define LY330ALH_MODE_NORMAL		0			// Power on default&lt;br /&gt;
#define LY330ALH_MODE_SLEEP			1&lt;br /&gt;
#define LY330ALH_MODE_SELFTEST		2&lt;br /&gt;
#define LY330ALH_MODE_POWERDOWN		3			// Shutdown mode&lt;br /&gt;
&lt;br /&gt;
extern int16_t z_axisg;&lt;br /&gt;
&lt;br /&gt;
void LY330ALH_set_mode(uint8_t);&lt;br /&gt;
uint16_t getRP6Base_ADC1(void);&lt;br /&gt;
int16_t LY330ALH_measure(void);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Hot Swappable 2-Wire Bus Buffer (TCA4311A):&lt;br /&gt;
&lt;br /&gt;
//extern uint8_t readyBusbuff;			// See &amp;quot;I2C I/O Port Expander&amp;quot; section&lt;br /&gt;
extern uint8_t errorBusbuff;&lt;br /&gt;
&lt;br /&gt;
#define getReadyBusbuff() (readyBusbuff)&lt;br /&gt;
uint8_t readReadyBusbuff(void);&lt;br /&gt;
void TCA4311A_shutdown(void);&lt;br /&gt;
void TCA4311A_reconnect(void);&lt;br /&gt;
void setRP6Base_PWR(uint8_t);&lt;br /&gt;
void setI2CModulePower(uint8_t);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Button:&lt;br /&gt;
&lt;br /&gt;
//extern uint8_t pressedButton;			// See &amp;quot;I2C I/O Port Expander&amp;quot; section&lt;br /&gt;
&lt;br /&gt;
#define getPressedButton() (pressedButton)&lt;br /&gt;
uint8_t readButton(void);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Status LED:&lt;br /&gt;
&lt;br /&gt;
void setStatusLED(uint8_t);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// RP6 Sensor Board initialisation and shutdown:&lt;br /&gt;
&lt;br /&gt;
void sensor_board_init(void);&lt;br /&gt;
void sensor_board_shutdown(void);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
/******************************************************************************&lt;br /&gt;
 * Additional info&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Changelog:&lt;br /&gt;
 * &lt;br /&gt;
 *  ---&amp;gt; changes are documented in the file &amp;quot;RP6M256_Sensor_BoardLib.c&amp;quot;&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=====Library Source=====&lt;br /&gt;
Datei: RP6M256_Sensor_BoardLib.c&lt;br /&gt;
&amp;lt;pre&amp;gt;/* ****************************************************************************&lt;br /&gt;
 *                           _______________________&lt;br /&gt;
 *                           \| RP6  ROBOT SYSTEM |/&lt;br /&gt;
 *                            \_-_-_-_-_-_-_-_-_-_/           &amp;gt;&amp;gt;&amp;gt; RP6 M256 WIFI&lt;br /&gt;
 * ----------------------------------------------------------------------------&lt;br /&gt;
 * ----------------------------- [c]2014 - Dirk -------------------------------&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * File: RP6M256_Sensor_BoardLib.c&lt;br /&gt;
 * Version: 1.1&lt;br /&gt;
 * Target: RP6 M256 WIFI - ATMEGA2560 @16.00MHz&lt;br /&gt;
 *         and a RP6 Sensor Board (CONRAD 1082384)&lt;br /&gt;
 * Author(s): Dirk&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Description:&lt;br /&gt;
 * This is our new Library that contains basic routines and functions for&lt;br /&gt;
 * accessing the hardwired components of the RP6 Sensor Board (CONRAD 1082384).&lt;br /&gt;
 * This library assumes the RP6 Sensor Board Revision 2.0 (04.07.13).&lt;br /&gt;
 *&lt;br /&gt;
 * There are more sensors and actors, that may be connected to the RP6 Sensor&lt;br /&gt;
 * Board: Many I2C components including a GPS module (CONRAD 1082385), servo&lt;br /&gt;
 *        motors, SHARP IR distance sensors, LEDs, a camera ...&lt;br /&gt;
 * This library doesn't contain functions for these sensors/actors, because&lt;br /&gt;
 * they are not HARDWIRED to the RP6 Sensor Board and may be connected&lt;br /&gt;
 * OPTIONALLY.&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// RP6 Sensor Board hardwired components:&lt;br /&gt;
// - I2C I/O Port Expander (MAX7311)&lt;br /&gt;
// - I2C Real Time Clock (RTC DS1339)&lt;br /&gt;
// - I2C Temperature Sensor (LM75B)&lt;br /&gt;
// - I2C Servo Controller (PCA9685)&lt;br /&gt;
// - I2C LED Driver (TCA6507)&lt;br /&gt;
// - I2C 3D Magnetometer &amp;amp; Accelerometer (LSM303DLHC)&lt;br /&gt;
// - Analog Yaw-Rate Gyroscope (LY330ALH)&lt;br /&gt;
// - Hot Swappable 2-Wire Bus Buffer (TCA4311A)&lt;br /&gt;
// - Button&lt;br /&gt;
// - Status LED&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Includes:&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6M256_Sensor_BoardLib.h&amp;quot; 		&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Variables:&lt;br /&gt;
&lt;br /&gt;
uint8_t registerBuf[13]; &lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C I/O Port Expander (MAX7311):&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Sends the configuration word to a MAX7311.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: config -&amp;gt; Config word for control&lt;br /&gt;
 *                  registers&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void MAX7311_write_cfg(uint16_t config)&lt;br /&gt;
{&lt;br /&gt;
#ifdef SAFE_CONFIG&lt;br /&gt;
	config |= 0b1010000000001000;&lt;br /&gt;
#endif&lt;br /&gt;
	I2CTWI_transmit3Bytes(I2C_SENSOR_PORTEXP_ADR, MAX7311_PORT1_CONFIG, config, (config&amp;gt;&amp;gt;8));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
interrupt_RP6SBstatus_t interrupt_RP6SBstatus;&lt;br /&gt;
&lt;br /&gt;
/** &lt;br /&gt;
 * This function checks all interrupt pins on&lt;br /&gt;
 * the XBUS (INT1..3, INTU).&lt;br /&gt;
 * This function must be called VERY frequently&lt;br /&gt;
 * out of the main loop.&lt;br /&gt;
 * Bigger delays result in slower reaction to&lt;br /&gt;
 * interrupt requests of the RP6 Sensor Board.&lt;br /&gt;
 * Interrupt function table:&lt;br /&gt;
 *   Int. : Function 1      IRQ  Function 2       IRQ&lt;br /&gt;
 *   -------------------------------------------------&lt;br /&gt;
 *   INT1 : LSM303DLHC INT1  H&lt;br /&gt;
 *   INT2 : MAX7311   INT_N  L&lt;br /&gt;
 *   INT3 : LSM303DLHC INT2  H   DS1339 SQW/INT_N  L&lt;br /&gt;
 *   INTU : not used&lt;br /&gt;
 * You can see in the &amp;quot;IRQ&amp;quot; column, which level&lt;br /&gt;
 * (H/L) means an ACTIVE INTERRUPT signal.&lt;br /&gt;
 * The interrupt pin levels (H=true/L=false) are&lt;br /&gt;
 * read into the global interrupt_RP6SBstatus&lt;br /&gt;
 * variable.&lt;br /&gt;
 *&lt;br /&gt;
 * Hints: - This function checks the interrupt&lt;br /&gt;
 *          signals by polling. This is NOT the&lt;br /&gt;
 *          best way to do this job. You will&lt;br /&gt;
 *          have to write your own task, if you&lt;br /&gt;
 *          want to use the Pin Change Interrupt&lt;br /&gt;
 *          function of the ATmega2560&lt;br /&gt;
 *          microcontroller.&lt;br /&gt;
 *        - You cannot use both interrupt sources&lt;br /&gt;
 *          for INT3! So you should not use INT2&lt;br /&gt;
 *          of the LSM303DLHC together with the&lt;br /&gt;
 *          alarm function of the DS1339 (RTC)!&lt;br /&gt;
 *        - Every interrupt signal of the Sensor&lt;br /&gt;
 *          Board may be cut off from the XBUS&lt;br /&gt;
 *          by opening a jumper (Jx):&lt;br /&gt;
 *          INT1 -&amp;gt; J3 (LSM303DLHC INT1)&lt;br /&gt;
 *          INT2 -&amp;gt; J4 (MAX7311 INT_N)&lt;br /&gt;
 *          INT3 -&amp;gt; J2 (DS1339 SQW/INT_N)&lt;br /&gt;
 *          INT3 -&amp;gt; J5 (LSM303DLHC INT2)&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *&lt;br /&gt;
 *   if (!interrupt_RP6SBstatus.portexp)&lt;br /&gt;
 *        writeString_P(&amp;quot;==&amp;gt; MAX7311 INT_N!!!&amp;quot;);&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void task_checkINTs(void)&lt;br /&gt;
{&lt;br /&gt;
	if(IO_SENSOR_INT1_PIN &amp;amp; IO_SENSOR_INT1_IN)	// XBUS INT1 -&amp;gt; PJ3 (PCINT12)&lt;br /&gt;
		interrupt_RP6SBstatus.int1 = true;&lt;br /&gt;
	else&lt;br /&gt;
		interrupt_RP6SBstatus.int1 = false;&lt;br /&gt;
	if(IO_SENSOR_INT2_PIN &amp;amp; IO_SENSOR_INT2_IN)	// XBUS INT2 -&amp;gt; PJ6 (PCINT15)&lt;br /&gt;
		interrupt_RP6SBstatus.int2 = true;&lt;br /&gt;
	else&lt;br /&gt;
		interrupt_RP6SBstatus.int2 = false;&lt;br /&gt;
	if(IO_SENSOR_INT3_PIN &amp;amp; IO_SENSOR_INT3_IN)	// XBUS INT3 -&amp;gt; PJ5 (PCINT14)&lt;br /&gt;
		interrupt_RP6SBstatus.int3 = true;&lt;br /&gt;
	else&lt;br /&gt;
		interrupt_RP6SBstatus.int3 = false;&lt;br /&gt;
//	if(IO_SENSOR_INTU_PIN &amp;amp; IO_SENSOR_INTU_IN)	// XBUS INTU -&amp;gt; PJ4 (PCINT13)&lt;br /&gt;
//		interrupt_RP6SBstatus.intu = true;&lt;br /&gt;
//	else&lt;br /&gt;
//		interrupt_RP6SBstatus.intu = false;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
max7311IOs_t inport;&lt;br /&gt;
uint8_t readyBusbuff;&lt;br /&gt;
uint8_t pressedButton;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function checks all I/O ports (I/O 0.0..1.7)&lt;br /&gt;
 * of the MAX7311 sequentially!&lt;br /&gt;
 * You must call this function frequently out of&lt;br /&gt;
 * the main loop.&lt;br /&gt;
 * The I/O port values (true/false) are read into&lt;br /&gt;
 * the global inport variable.&lt;br /&gt;
 * The global variables readyBusbuff (2-Wire Bus&lt;br /&gt;
 * Buffer: Enable) and pressedButton (Button S1:&lt;br /&gt;
 * Pressed) contain actual values (true/false)&lt;br /&gt;
 * after execution of this task.&lt;br /&gt;
 *&lt;br /&gt;
 * Examples:&lt;br /&gt;
 *&lt;br /&gt;
 *   if (inport.rdy_busbuff)&lt;br /&gt;
 *        writeString_P(&amp;quot;I/O 0.3: High&amp;quot;);&lt;br /&gt;
 *   else writeString_P(&amp;quot;I/O 0.3: Low&amp;quot;);&lt;br /&gt;
 *   if (!inport.drdy_magacc)&lt;br /&gt;
 *        writeString_P(&amp;quot;I/O 1.5: Low&amp;quot;);&lt;br /&gt;
 *   if (pressedButton)&lt;br /&gt;
 *        writeString_P(&amp;quot;Button pressed!&amp;quot;);&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void task_RP6SensorBoard(void)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmitByte(I2C_SENSOR_PORTEXP_ADR, MAX7311_INPUT_PORT1);&lt;br /&gt;
	I2CTWI_readBytes(I2C_SENSOR_PORTEXP_ADR, registerBuf, 2);&lt;br /&gt;
	inport.word = (registerBuf[1] &amp;lt;&amp;lt; 8) + registerBuf[0];&lt;br /&gt;
	readyBusbuff = inport.rdy_busbuff;&lt;br /&gt;
	pressedButton = inport.io2_i2c;&lt;br /&gt;
	pressedButton = !pressedButton;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
max7311IOs_t outport;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Updates the I/O ports with current value from&lt;br /&gt;
 * the global outport variable!&lt;br /&gt;
 * If one or more port pins were configured as&lt;br /&gt;
 * output before, they will be set (high) or&lt;br /&gt;
 * cleared (low).&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *&lt;br /&gt;
 *   outport.word = 0b0000000000001001;&lt;br /&gt;
 *   MAX7311_update();&lt;br /&gt;
 *   // This clears all I/O ports and sets&lt;br /&gt;
 *   // the ports I/O 0.0 and I/O 0.3!&lt;br /&gt;
 *&lt;br /&gt;
 *   // Other possibility:&lt;br /&gt;
 *   outport.pwr_sharp_f = true;&lt;br /&gt;
 *   MAX7311_update();&lt;br /&gt;
 *   // This sets I/O 0.1 and does not&lt;br /&gt;
 *   // affect any other I/O port!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void MAX7311_update(void)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmit3Bytes(I2C_SENSOR_PORTEXP_ADR, MAX7311_OUTPUT_PORT1, outport.word, (outport.word&amp;gt;&amp;gt;8));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Writes the 16-bit data to a MAX7311.&lt;br /&gt;
 * The data are output with those I/O ports that&lt;br /&gt;
 * were configured as output before.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: data -&amp;gt; Data word&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void MAX7311_write(uint16_t data)&lt;br /&gt;
{&lt;br /&gt;
	outport.word = data;&lt;br /&gt;
	MAX7311_update();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Initializes the I/O Port Expander after power&lt;br /&gt;
 * on.&lt;br /&gt;
 *&lt;br /&gt;
 * Hint: If USE_PD5 is defined in the&lt;br /&gt;
 *       configuration header file, this&lt;br /&gt;
 *       function uses the RP6M256 portpin,&lt;br /&gt;
 *       that is connected to plug I/O: Pin 9&lt;br /&gt;
 *       instead of MAX7311 I/O 1.0!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void MAX7311_init(void)&lt;br /&gt;
{&lt;br /&gt;
#ifdef USE_PD5&lt;br /&gt;
	MAX7311_write_cfg(MAX7311_CONFIG_USE_PD5);&lt;br /&gt;
	IO_SENSOR_TCA4311A_EN_DDR |= IO_SENSOR_TCA4311A_EN_IN;		// Output&lt;br /&gt;
	IO_SENSOR_TCA4311A_EN_PORT |= IO_SENSOR_TCA4311A_EN_IN;		// High&lt;br /&gt;
#else&lt;br /&gt;
	MAX7311_write_cfg(MAX7311_CONFIG_DEFAULT);&lt;br /&gt;
#endif&lt;br /&gt;
	MAX7311_write(MAX7311_OUTPUT_DEFAULT);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Real Time Clock (RTC DS1339):&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function converts a BCD to a DEC value.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
uint8_t BCD2DEC(uint8_t bcd)&lt;br /&gt;
{&lt;br /&gt;
	return ((bcd &amp;gt;&amp;gt; 4) * 10 + (bcd &amp;amp; 0x0f));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function converts a DEC to a BCD value.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
uint8_t DEC2BCD(uint8_t dec)&lt;br /&gt;
{uint8_t units = dec % 10;&lt;br /&gt;
	if (dec /= 10) {&lt;br /&gt;
		return (units + (DEC2BCD(dec) &amp;lt;&amp;lt; 4));&lt;br /&gt;
	}&lt;br /&gt;
	else {&lt;br /&gt;
		return units;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Sends the configuration byte to a DS1339.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: Config byte for control register&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void DS1339_write_cfg(uint8_t config)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_RTC_ADR, DS1339_CONTROL, config);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Initializes the DS1339 Trickle Charger&lt;br /&gt;
 * function to the default for the RP6 Sensor&lt;br /&gt;
 * Board: One diode and 2kOhm resistor.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void DS1339_init(void)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_RTC_ADR, DS1339_TRICKLE_CHARGER, DS1339_TRICKLE_CHARGER_DEFAULT);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Reads all data registers of the Real Time Clock (RTC).&lt;br /&gt;
 * They are stored in the time &amp;amp; date variables defined in&lt;br /&gt;
 * the library header.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void DS1339_read(void)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmitByte(I2C_SENSOR_RTC_ADR, DS1339_SECONDS);&lt;br /&gt;
	I2CTWI_readBytes(I2C_SENSOR_RTC_ADR, registerBuf, 7);&lt;br /&gt;
	rtc_time.second = BCD2DEC(registerBuf[0]);&lt;br /&gt;
	rtc_time.minute = BCD2DEC(registerBuf[1]);&lt;br /&gt;
	rtc_time.hour = BCD2DEC(registerBuf[2] &amp;amp; 0x3f);&lt;br /&gt;
	rtc_date.weekday = (registerBuf[3] &amp;amp; 0x07);&lt;br /&gt;
	rtc_date.day = BCD2DEC(registerBuf[4]);&lt;br /&gt;
	rtc_date.month = BCD2DEC(registerBuf[5] &amp;amp; 0x7f);&lt;br /&gt;
	if(registerBuf[5] &amp;amp; 0x80) rtc_date.year = 100;&lt;br /&gt;
	else rtc_date.year = 0;&lt;br /&gt;
	rtc_date.year += BCD2DEC(registerBuf[6]);&lt;br /&gt;
	rtc_date.year += 2000;&lt;br /&gt;
	rtc_time.dst = 0;&lt;br /&gt;
#ifdef CALC_DST&lt;br /&gt;
	// Calculate MESZ (DST):&lt;br /&gt;
	uint8_t wday = rtc_date.weekday;			// Weekday [1..7 = R_MO..R_SU]&lt;br /&gt;
	if(wday == 7) wday = 0;&lt;br /&gt;
	if(rtc_date.month &amp;lt; 3 || rtc_date.month &amp;gt; 10) {&lt;br /&gt;
		return;&lt;br /&gt;
	}&lt;br /&gt;
	if((rtc_date.day - wday &amp;gt;= 25)&lt;br /&gt;
	 &amp;amp;&amp;amp; (wday || rtc_time.hour &amp;gt;= 2)) {&lt;br /&gt;
		if(rtc_date.month == 10)&lt;br /&gt;
			return;&lt;br /&gt;
	}&lt;br /&gt;
	else {&lt;br /&gt;
		if(rtc_date.month == 3) {&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	rtc_time.dst = 1;&lt;br /&gt;
#endif&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Writes the time &amp;amp; date infos in the variables defined in&lt;br /&gt;
 * the library header to the Real Time Clock (RTC).&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void DS1339_write(void)&lt;br /&gt;
{&lt;br /&gt;
	registerBuf[0] = DS1339_SECONDS;&lt;br /&gt;
	registerBuf[1] = DEC2BCD(rtc_time.second);&lt;br /&gt;
	registerBuf[2] = DEC2BCD(rtc_time.minute);&lt;br /&gt;
	registerBuf[3] = DEC2BCD(rtc_time.hour);&lt;br /&gt;
	registerBuf[4] = rtc_date.weekday;&lt;br /&gt;
	registerBuf[5] = DEC2BCD(rtc_date.day);&lt;br /&gt;
	registerBuf[6] = DEC2BCD(rtc_date.month);&lt;br /&gt;
	registerBuf[7] = DEC2BCD(rtc_date.year - 2000);&lt;br /&gt;
	I2CTWI_transmitBytes(I2C_SENSOR_RTC_ADR, &amp;amp;registerBuf[0], 8);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Temperature Sensor (LM75B):&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Sends the configuration byte to a LM75B.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: Config byte for Conf register&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void LM75B_write_cfg(uint8_t config)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_TEMP_ADR, LM75B_CONF, config);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
uint8_t temperature_low;&lt;br /&gt;
uint8_t temperature_high;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Reads the two data registers of the temperature&lt;br /&gt;
 * sensor's Temp register.&lt;br /&gt;
 * They are stored in the variables temperature_low&lt;br /&gt;
 * and _high.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void LM75B_read(void)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmitByte(I2C_SENSOR_TEMP_ADR, LM75B_TEMP);&lt;br /&gt;
	I2CTWI_readBytes(I2C_SENSOR_TEMP_ADR, registerBuf, 2);&lt;br /&gt;
	temperature_high = registerBuf[0];&lt;br /&gt;
	temperature_low = registerBuf[1];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
double temperature;						// Temperature [°C]&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Calculates and returns the temperature value&lt;br /&gt;
 * by using the data read from the LM75B with&lt;br /&gt;
 * the function LM75B_read(). The sensor is&lt;br /&gt;
 * designed for 11 bit measurement and 0.125°C&lt;br /&gt;
 * resolution.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
double LM75B_calculate(void)&lt;br /&gt;
{&lt;br /&gt;
	int16_t tempraw = 0;&lt;br /&gt;
	double temp;&lt;br /&gt;
&lt;br /&gt;
	tempraw = (getTemperatureHigh() &amp;lt;&amp;lt; 8) | getTemperatureLow();&lt;br /&gt;
	tempraw &amp;gt;&amp;gt;= 5;&lt;br /&gt;
	if (tempraw &amp;amp; 1024)							// Calculate temperature&lt;br /&gt;
		tempraw = (tempraw &amp;amp; 1023) - 1024;&lt;br /&gt;
	else&lt;br /&gt;
		tempraw = tempraw &amp;amp; 1023;&lt;br /&gt;
	temp = tempraw * 0.125;&lt;br /&gt;
	return temp;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Performs a 11 bit measurement and returns the&lt;br /&gt;
 * temperature [°C]. The sensor has a measuring&lt;br /&gt;
 * cycle of 100ms. So it makes no sense calling&lt;br /&gt;
 * this function at a frequency above 10Hz.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
double LM75B_measure(void)&lt;br /&gt;
{&lt;br /&gt;
//	LM75B_init();&lt;br /&gt;
	LM75B_read();								// Read data&lt;br /&gt;
	return (LM75B_calculate());					// Calculate value&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Servo Controller (PCA9685):&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Call this once before using the servo function.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: PWM frequency [40..1000 Hz]&lt;br /&gt;
 *&lt;br /&gt;
 * Hints: - Default servo frequency is 50 Hz!&lt;br /&gt;
 *        - The servo power is NOT switched on by&lt;br /&gt;
 *          this function!&lt;br /&gt;
 *&lt;br /&gt;
 * There is also a macro initServo(freq), which&lt;br /&gt;
 * does exactly the same as this function.&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *   initServo(50);&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void PCA9685_init(uint16_t freq)&lt;br /&gt;
{&lt;br /&gt;
	outport.oen_servo = false;					// I/O 1.3: Low&lt;br /&gt;
	MAX7311_update();&lt;br /&gt;
	if ((freq &amp;lt; 40) || (freq &amp;gt; 1000)) freq = 50;&lt;br /&gt;
	I2CTWI_transmitByte(I2C_SENSOR_SERVO_ADR, PCA9685_MODE2);&lt;br /&gt;
	uint8_t last_mode = I2CTWI_readByte(I2C_SENSOR_SERVO_ADR);&lt;br /&gt;
	last_mode &amp;amp;= ~PCA9685_MODE2_INVRT;			// Clear INVRT bit&lt;br /&gt;
	last_mode |= PCA9685_MODE2_OUTDRV;			// Set OUTDRV bit&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_SERVO_ADR, PCA9685_MODE2, last_mode);&lt;br /&gt;
	I2CTWI_transmitByte(I2C_SENSOR_SERVO_ADR, PCA9685_MODE1);&lt;br /&gt;
	last_mode = I2CTWI_readByte(I2C_SENSOR_SERVO_ADR);&lt;br /&gt;
	last_mode |= PCA9685_MODE1_AI;				// Set AI bit&lt;br /&gt;
	uint8_t mode1 = last_mode;&lt;br /&gt;
	mode1 |= PCA9685_MODE1_SLEEP;				// Set SLEEP bit&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_SERVO_ADR, PCA9685_MODE1, mode1);&lt;br /&gt;
	uint8_t prescale = (uint8_t) (F_PCA9685 / 4096 / freq - 0.5);&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_SERVO_ADR, PCA9685_PRE_SCALE, prescale);&lt;br /&gt;
	last_mode &amp;amp;= ~PCA9685_MODE1_SLEEP;			// Clear SLEEP bit&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_SERVO_ADR, PCA9685_MODE1, last_mode);&lt;br /&gt;
	mSleep(1);&lt;br /&gt;
	last_mode |= PCA9685_MODE1_RESTART;			// Clear RESTART bit&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_SERVO_ADR, PCA9685_MODE1, last_mode);&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_SERVO_ADR, PCA9685_LED8_ON_H, 0x10);&lt;br /&gt;
	return;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/** &lt;br /&gt;
 * Returns the channel belonging to a servo number.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: number -&amp;gt; Servo number [1..8]&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
uint8_t servo(uint8_t number)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t channel;&lt;br /&gt;
&lt;br /&gt;
	switch (number) {&lt;br /&gt;
		case 1 :&lt;br /&gt;
			channel = CH_SERVO_1; break;&lt;br /&gt;
		case 2 :&lt;br /&gt;
			channel = CH_SERVO_2; break;&lt;br /&gt;
		case 3 :&lt;br /&gt;
			channel = CH_SERVO_3; break;&lt;br /&gt;
		case 4 :&lt;br /&gt;
			channel = CH_SERVO_4; break;&lt;br /&gt;
		case 5 :&lt;br /&gt;
			channel = CH_SERVO_5; break;&lt;br /&gt;
		case 6 :&lt;br /&gt;
			channel = CH_SERVO_6; break;&lt;br /&gt;
		case 7 :&lt;br /&gt;
			channel = CH_SERVO_7; break;&lt;br /&gt;
		case 8 :&lt;br /&gt;
			channel = CH_SERVO_8; break;&lt;br /&gt;
		default : channel = CH_SERVO_1;&lt;br /&gt;
	}&lt;br /&gt;
	return channel;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This is the servo position set function.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: channel -&amp;gt; Channel number [1..16]&lt;br /&gt;
 *        pos     -&amp;gt; Servo position [SERVOx_LT..SERVOx_RT]&lt;br /&gt;
 *&lt;br /&gt;
 * Hints: - A servo position of 205 means 1 ms servo impulse,&lt;br /&gt;
 *          a position of 410 means a 2 ms servo impulse!&lt;br /&gt;
 *          You may calculate the servo impulse length by:&lt;br /&gt;
 *          ==&amp;gt; Impulse [ms] = servo position / 204.8 &amp;lt;==&lt;br /&gt;
 *          (Formula only valid for a PWM of 50 Hz!)&lt;br /&gt;
 *&lt;br /&gt;
 * There is also a macro setServo(servo, pos), which&lt;br /&gt;
 * does nearly the same as this function, but the first&lt;br /&gt;
 * parameter is the servo and NOT the channel number.&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *   setServo(2,300);&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void PCA9685_set(uint8_t channel, uint16_t pos)&lt;br /&gt;
{&lt;br /&gt;
	if ((channel == 0) || (channel &amp;gt; 16))&lt;br /&gt;
		return;&lt;br /&gt;
	uint8_t reg = channel * 4 + 4;				// Register LEDx_OFF_L&lt;br /&gt;
	I2CTWI_transmit3Bytes(I2C_SENSOR_SERVO_ADR, reg, (pos &amp;amp; 0x00ff), (pos &amp;gt;&amp;gt; 8));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * If the servos are not moving for a while, the&lt;br /&gt;
 * servo function can be stopped with this&lt;br /&gt;
 * function (PCA9685 set to sleep mode).&lt;br /&gt;
 *&lt;br /&gt;
 * Hint: The servo power is NOT switched off by&lt;br /&gt;
 *       this function!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void PCA9685_shutdown(void)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_SERVO_ADR, PCA9685_ALL_LED_OFF_H, 0x10);&lt;br /&gt;
	I2CTWI_transmitByte(I2C_SENSOR_SERVO_ADR, PCA9685_MODE1);&lt;br /&gt;
	uint8_t mode1 = I2CTWI_readByte(I2C_SENSOR_SERVO_ADR);&lt;br /&gt;
	mode1 |= PCA9685_MODE1_SLEEP;				// Set SLEEP bit&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_SERVO_ADR, PCA9685_MODE1, mode1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * If the servo function was stopped with the&lt;br /&gt;
 * function PCA9685_shutdown() before, it can be&lt;br /&gt;
 * (re)started again with this function.&lt;br /&gt;
 *&lt;br /&gt;
 * Hint: The servo power is NOT switched on by&lt;br /&gt;
 *       this function!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void PCA9685_restart(void)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmitByte(I2C_SENSOR_SERVO_ADR, PCA9685_MODE1);&lt;br /&gt;
	uint8_t mode1 = I2CTWI_readByte(I2C_SENSOR_SERVO_ADR);&lt;br /&gt;
	if (mode1 &amp;amp; PCA9685_MODE1_RESTART) {		// RESTART bit set?&lt;br /&gt;
		mode1 &amp;amp;= ~PCA9685_MODE1_SLEEP;			// Clear SLEEP bit&lt;br /&gt;
		I2CTWI_transmit2Bytes(I2C_SENSOR_SERVO_ADR, PCA9685_MODE1, mode1);&lt;br /&gt;
		mSleep(1);&lt;br /&gt;
		mode1 |= PCA9685_MODE1_RESTART;			// Clear RESTART bit&lt;br /&gt;
		I2CTWI_transmit2Bytes(I2C_SENSOR_SERVO_ADR, PCA9685_MODE1, mode1);&lt;br /&gt;
		I2CTWI_transmit2Bytes(I2C_SENSOR_SERVO_ADR, PCA9685_ALL_LED_OFF_H, 0);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/** &lt;br /&gt;
 * With this function you can switch the servo&lt;br /&gt;
 * power on or off.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: pwr -&amp;gt; 0 (false) = servo power off&lt;br /&gt;
 *               &amp;gt;0 (true) = servo power on&lt;br /&gt;
 *&lt;br /&gt;
 * Hints: - If connected servos are not used, you&lt;br /&gt;
 *          should always switch the servo power off&lt;br /&gt;
 *          (default) to save energy!&lt;br /&gt;
 *        - The PCA9685 is NOT restarted or put into&lt;br /&gt;
 *          shutdown mode by this function!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void setServoPower(uint8_t pwr)&lt;br /&gt;
{&lt;br /&gt;
	if(pwr &amp;gt; 0)&lt;br /&gt;
		outport.pwr_servo = true;				// I/O 1.4: High&lt;br /&gt;
	else&lt;br /&gt;
		outport.pwr_servo = false;				// I/O 1.4: Low&lt;br /&gt;
	MAX7311_update();&lt;br /&gt;
}	&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C LED Driver (TCA6507):&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Sends the configuration byte to TCA6507's&lt;br /&gt;
 * internal registers.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: reg    -&amp;gt; Register address [0..10]&lt;br /&gt;
 *        config -&amp;gt; Config byte for internal&lt;br /&gt;
 *                  registers&lt;br /&gt;
 *&lt;br /&gt;
 * Hints: - With this function you can write to&lt;br /&gt;
 *          all internal registers of the LED&lt;br /&gt;
 *          driver, see &amp;quot;Registers:&amp;quot; in the&lt;br /&gt;
 *          library header file!&lt;br /&gt;
 *        - Mainly you will use this function&lt;br /&gt;
 *          for setting time (regs 3..7) and&lt;br /&gt;
 *          intensity (regs 8, 9) values.&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *   TCA6507_write_cfg(TCA6507_MAXIMUM_INTENSITY,0x77);&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void TCA6507_write_cfg(uint8_t reg, uint8_t config)&lt;br /&gt;
{&lt;br /&gt;
	if(reg &amp;gt; 10) reg = 0;&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_LEDDRIVER_ADR, reg, config);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
uint8_t select[3];&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Updates the LED driver select registers (0..2)&lt;br /&gt;
 * with the global select array!&lt;br /&gt;
 *&lt;br /&gt;
 * Hint: - Also have a look at Table 4 in the&lt;br /&gt;
 *         TCA6507 datasheet!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void TCA6507_update(void)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmit4Bytes(I2C_SENSOR_LEDDRIVER_ADR, (TCA6507_SELECT0 | 0x10), select[0], select[1], select[2]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This is the LED state set function.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: led   -&amp;gt; LED number [0..6]&lt;br /&gt;
 *        state -&amp;gt; LED state  [0..7]&lt;br /&gt;
 *&lt;br /&gt;
 * Hints: - Possible driver states [0..7] see&lt;br /&gt;
 *          &amp;quot;Output states:&amp;quot; in the library&lt;br /&gt;
 *          header file!&lt;br /&gt;
 *        - Also have a look at Table 4 in the&lt;br /&gt;
 *          TCA6507 datasheet!&lt;br /&gt;
 *&lt;br /&gt;
 * There is also a macro setLED(led, state), which&lt;br /&gt;
 * does exactly the same as this function.&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *   setLED(1,4);&lt;br /&gt;
 *   // Switches LED1 ON&lt;br /&gt;
 *   // ... OR ...&lt;br /&gt;
 *   setLED(SB_LED1,STATE_ON);&lt;br /&gt;
 *   // does the same.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void TCA6507_set(uint8_t led, uint8_t state)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t i, mask;&lt;br /&gt;
&lt;br /&gt;
	if(led &amp;gt; 6) led = 0;&lt;br /&gt;
	led = 1 &amp;lt;&amp;lt; led;&lt;br /&gt;
	mask = 1;&lt;br /&gt;
	for(i = 0; i &amp;lt; 3; i++) {&lt;br /&gt;
		select[i] &amp;amp;= ~led;&lt;br /&gt;
		if(state &amp;amp; mask)&lt;br /&gt;
			select[i] |= led;&lt;br /&gt;
		mask &amp;lt;&amp;lt;= 1;&lt;br /&gt;
	}&lt;br /&gt;
	TCA6507_update();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * If the LEDs are not needed for a while, the&lt;br /&gt;
 * LED driver can be stopped with this function&lt;br /&gt;
 * (TCA6507 set to shutdown mode).&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void TCA6507_shutdown(void)&lt;br /&gt;
{&lt;br /&gt;
	outport.en_leddriv = false;					// I/O 0.4: Low&lt;br /&gt;
	MAX7311_update();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * If the LED driver was stopped with the&lt;br /&gt;
 * function TCA6507_shutdown() before, it can be&lt;br /&gt;
 * (re)started again with this function.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void TCA6507_restart(void)&lt;br /&gt;
{&lt;br /&gt;
	outport.en_leddriv = true;					// I/O 0.4: High&lt;br /&gt;
	MAX7311_update();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Initializes the LED driver after power on by&lt;br /&gt;
 * switching all LEDs off.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void TCA6507_init(void)&lt;br /&gt;
{&lt;br /&gt;
	select[0] = 0;&lt;br /&gt;
	select[1] = 0;&lt;br /&gt;
	select[2] = 0;&lt;br /&gt;
	TCA6507_update();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C 3D Magnetometer &amp;amp; Accelerometer (LSM303DLHC):&lt;br /&gt;
&lt;br /&gt;
// --------------------------------------------&lt;br /&gt;
// LSM303DLHC accelerometer functions:&lt;br /&gt;
int16_t x_axisa, y_axisa, z_axisa;&lt;br /&gt;
double pitch, roll;&lt;br /&gt;
double xa, ya, za;&lt;br /&gt;
double the, phi;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Call this once before using the 3D-Accelerometer.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void LSM303DLHC_A_init(void)&lt;br /&gt;
{&lt;br /&gt;
	// Set normal power mode, 10 Hz data rate, all axes enabled:&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_LSM303DLHC_A_ADR, CTRL_REG1_A, CTRL_REG1_A_10HZ);&lt;br /&gt;
	mSleep(10);&lt;br /&gt;
	// Set HD mode:&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_LSM303DLHC_A_ADR, CTRL_REG4_A, CTRL_REG4_A_HR);&lt;br /&gt;
	mSleep(10);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function reads the X-axis, Y-axis and Z-axis values&lt;br /&gt;
 * from the LSM303DLHC accelerometer and stores them in the&lt;br /&gt;
 * global variables x_axisa, y_axisa and z_axisa.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void readLSM303DLHC_A(void)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t readBuf[6];&lt;br /&gt;
&lt;br /&gt;
	I2CTWI_transmitByte(I2C_SENSOR_LSM303DLHC_A_ADR, (OUT_X_L_A | 0x80));&lt;br /&gt;
	I2CTWI_readBytes(I2C_SENSOR_LSM303DLHC_A_ADR, readBuf, 6); // Read  X-/Y-/Z-axis&lt;br /&gt;
	// xb = y:&lt;br /&gt;
	x_axisa = ((readBuf[OUT_Y_H_A - OUT_X_L_A] &amp;lt;&amp;lt; 8) + readBuf[OUT_Y_L_A - OUT_X_L_A]) / 16;&lt;br /&gt;
	// yb = x:&lt;br /&gt;
	y_axisa = ((readBuf[OUT_X_H_A - OUT_X_L_A] &amp;lt;&amp;lt; 8) + readBuf[OUT_X_L_A - OUT_X_L_A]) / 16;&lt;br /&gt;
	// zb = z:&lt;br /&gt;
	z_axisa = ((readBuf[OUT_Z_H_A - OUT_X_L_A] &amp;lt;&amp;lt; 8) + readBuf[OUT_Z_L_A - OUT_X_L_A]) / 16;&lt;br /&gt;
	mSleep(10);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function limits and normalizes the x-axisa,&lt;br /&gt;
 * y-axisa and z-axisa values read from the LSM303DLHC&lt;br /&gt;
 * accelerometer with the function readLSM303DLHC_A() and&lt;br /&gt;
 * stores them in the global double variables xa, ya and&lt;br /&gt;
 * za.&lt;br /&gt;
 * It also calculates the position in space in form of the&lt;br /&gt;
 * tilt angles (the = pitch, phi = roll) and stores them&lt;br /&gt;
 * in the global double variables the and phi.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void normalizeLSM303DLHC_A(void)&lt;br /&gt;
{&lt;br /&gt;
	// Limit raw values:&lt;br /&gt;
	if (x_axisa &amp;lt; MIN_X_A) x_axisa = MIN_X_A;&lt;br /&gt;
	if (x_axisa &amp;gt; MAX_X_A) x_axisa = MAX_X_A;&lt;br /&gt;
	if (y_axisa &amp;lt; MIN_Y_A) y_axisa = MIN_Y_A;&lt;br /&gt;
	if (y_axisa &amp;gt; MAX_Y_A) y_axisa = MAX_Y_A;&lt;br /&gt;
	if (z_axisa &amp;lt; MIN_Z_A) z_axisa = MIN_Z_A;&lt;br /&gt;
	if (z_axisa &amp;gt; MAX_Z_A) z_axisa = MAX_Z_A;&lt;br /&gt;
	xa = (double) x_axisa / 1000.0;&lt;br /&gt;
	ya = (double) y_axisa / 1000.0;&lt;br /&gt;
	za = (double) z_axisa / 1000.0;&lt;br /&gt;
	// Calculate Pitch and Roll:&lt;br /&gt;
	phi = asin(xa);								// Calculate the and phi&lt;br /&gt;
	the = asin(ya / cos(the));					//  from the raw values&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function calculates the position in space by&lt;br /&gt;
 * using the the and phi values (see function&lt;br /&gt;
 * normalizeLSM303DLHC_A()!). It stores the position&lt;br /&gt;
 * in the global double variables pitch and roll. &lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void positionLSM303DLHC_A(void)&lt;br /&gt;
{&lt;br /&gt;
	pitch = the * 180 / M_PI + OFFSET_PITCH_A;&lt;br /&gt;
	roll = phi * 180 / M_PI + OFFSET_ROLL_A;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// LSM303DLHC magnetometer functions:&lt;br /&gt;
int16_t x_axism, y_axism, z_axism;&lt;br /&gt;
int16_t headingm;&lt;br /&gt;
double xm, ym, zm;&lt;br /&gt;
#ifdef GET_TEMP_M&lt;br /&gt;
int16_t temperaturem;&lt;br /&gt;
double temperature_mag;&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
int16_t headingtc;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Call this once before using the 3D-Compass.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void LSM303DLHC_M_init(void)&lt;br /&gt;
{&lt;br /&gt;
#ifdef GET_TEMP_M&lt;br /&gt;
	// Set Data output rate to 15Hz, enable temperature sensor:&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_LSM303DLHC_M_ADR, CRA_REG_M, CRA_REG_M_15HZ_T_EN);&lt;br /&gt;
#else&lt;br /&gt;
	// Set Data output rate to 15Hz:&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_LSM303DLHC_M_ADR, CRA_REG_M, CRA_REG_M_15HZ);&lt;br /&gt;
#endif&lt;br /&gt;
	mSleep(10);&lt;br /&gt;
	// Set Gain to +-1.3Gauss:&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_LSM303DLHC_M_ADR, CRB_REG_M, CRB_REG_M_13GAUSS);&lt;br /&gt;
	mSleep(10);&lt;br /&gt;
	// Set Continuous-conversion mode:&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_LSM303DLHC_M_ADR, MR_REG_M, MR_REG_M_CCM);&lt;br /&gt;
	mSleep(10);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function reads the X-axis, Y-axis, Z-axis and&lt;br /&gt;
 * temperature values from the LSM303DLHC magnetometer&lt;br /&gt;
 * and stores them in the global variables x_axism,&lt;br /&gt;
 * y_axism, z_axism and temperaturem.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void readLSM303DLHC_M(void)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t readBuf[6];&lt;br /&gt;
&lt;br /&gt;
	I2CTWI_transmitByte(I2C_SENSOR_LSM303DLHC_M_ADR, OUT_X_H_M);&lt;br /&gt;
	I2CTWI_readBytes(I2C_SENSOR_LSM303DLHC_M_ADR, readBuf, 6); // Read  X-/Y-/Z-axis&lt;br /&gt;
	// xb = x:&lt;br /&gt;
	x_axism = (readBuf[OUT_X_H_M - OUT_X_H_M] &amp;lt;&amp;lt; 8) + readBuf[OUT_X_L_M - OUT_X_H_M];&lt;br /&gt;
	// yb = y:&lt;br /&gt;
	y_axism = (readBuf[OUT_Y_H_M - OUT_X_H_M] &amp;lt;&amp;lt; 8) + readBuf[OUT_Y_L_M - OUT_X_H_M];&lt;br /&gt;
	// zb = z:&lt;br /&gt;
	z_axism = (readBuf[OUT_Z_H_M - OUT_X_H_M] &amp;lt;&amp;lt; 8) + readBuf[OUT_Z_L_M - OUT_X_H_M];&lt;br /&gt;
	mSleep(10);&lt;br /&gt;
#ifdef GET_TEMP_M&lt;br /&gt;
	// Read temperature raw value:&lt;br /&gt;
	I2CTWI_transmitByte(I2C_SENSOR_LSM303DLHC_M_ADR, TEMP_OUT_H_M);&lt;br /&gt;
	readBuf[0] = I2CTWI_readByte(I2C_SENSOR_LSM303DLHC_M_ADR);&lt;br /&gt;
	I2CTWI_transmitByte(I2C_SENSOR_LSM303DLHC_M_ADR, TEMP_OUT_L_M);&lt;br /&gt;
	readBuf[1] = I2CTWI_readByte(I2C_SENSOR_LSM303DLHC_M_ADR);&lt;br /&gt;
	temperaturem = (readBuf[0] &amp;lt;&amp;lt; 8) | readBuf[1];&lt;br /&gt;
	temperaturem &amp;gt;&amp;gt;= 4;&lt;br /&gt;
	if (temperaturem &amp;amp; 2048)					// Calculate temperature&lt;br /&gt;
		temperaturem = (temperaturem &amp;amp; 2047) - 2048;&lt;br /&gt;
	else&lt;br /&gt;
		temperaturem = temperaturem &amp;amp; 2047;&lt;br /&gt;
	mSleep(10);&lt;br /&gt;
#endif&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function compensates hard iron effects and&lt;br /&gt;
 * scales the x-axism, y-axism and z-axism values read&lt;br /&gt;
 * from the LSM303DLHC magnetometer with the function&lt;br /&gt;
 * readLSM303DLHC_M() and stores them in the global&lt;br /&gt;
 * double variables xm, ym and zm.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void normalizeLSM303DLHC_M(void)&lt;br /&gt;
{&lt;br /&gt;
	// Add hard iron offsets:&lt;br /&gt;
	x_axism += OFFSET_X_M;&lt;br /&gt;
	y_axism += OFFSET_Y_M;&lt;br /&gt;
	z_axism += OFFSET_Z_M;&lt;br /&gt;
	// Scale raw values:&lt;br /&gt;
	xm = (x_axism - MIN_X_M) / (MAX_X_M - MIN_X_M) * 2 - 1;&lt;br /&gt;
	ym = (y_axism - MIN_Y_M) / (MAX_Y_M - MIN_Y_M) * 2 - 1;&lt;br /&gt;
	zm = (z_axism - MIN_Z_M) / (MAX_Z_M - MIN_Z_M) * 2 - 1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function calculates the heading by using the&lt;br /&gt;
 * normalized sensor values xm and ym (see function&lt;br /&gt;
 * normalizeLSM303DLHC_M()!). The heading is a value&lt;br /&gt;
 * from 0° to 359°. If the robot's front (and the&lt;br /&gt;
 * RP6 Sensor Board's front edge with the two&lt;br /&gt;
 * headlights) points to ...&lt;br /&gt;
 *   north -&amp;gt; heading is 0°,&lt;br /&gt;
 *   east  -&amp;gt; heading is 90°,&lt;br /&gt;
 *   south -&amp;gt; heading is 180°,&lt;br /&gt;
 *   west  -&amp;gt; heading is 270°.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
int16_t headingLSM303DLHC_M(void)&lt;br /&gt;
{&lt;br /&gt;
	double hdg = atan2(ym, xm) * 180 / M_PI + DECLINATION_M;&lt;br /&gt;
	if(hdg &amp;lt; 0.0) hdg += 360.0;&lt;br /&gt;
	return ((int16_t) hdg);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// --------------------------------------------&lt;br /&gt;
/**&lt;br /&gt;
 * This function calculates the TILT COMPENSATED&lt;br /&gt;
 * heading by using accelerometer (the, phi) AND&lt;br /&gt;
 * magnetometer (xm, ym, zm) data. The heading is a&lt;br /&gt;
 * value from 0° to 359°. If the robot's front (and&lt;br /&gt;
 * the RP6 Sensor Board's front edge with the two&lt;br /&gt;
 * headlights) points to ...&lt;br /&gt;
 *   north -&amp;gt; heading is 0°,&lt;br /&gt;
 *   east  -&amp;gt; heading is 90°,&lt;br /&gt;
 *   south -&amp;gt; heading is 180°,&lt;br /&gt;
 *   west  -&amp;gt; heading is 270°.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
int16_t headingLSM303DLHC_TC(void)&lt;br /&gt;
{&lt;br /&gt;
	double hdgtc, xh, yh;&lt;br /&gt;
&lt;br /&gt;
	xh = xm * cos(the) + zm * sin(the);&lt;br /&gt;
	yh = xm * sin(phi) * sin(the) + ym * cos(phi) - zm * sin(phi) * cos(the);&lt;br /&gt;
//	zh = -xm * cos(phi) * sin(the) + ym * sin(phi) + zm * cos(phi) * cos(the);&lt;br /&gt;
	hdgtc = atan2(yh, xh) * 180 / M_PI + DECLINATION_M;&lt;br /&gt;
	if(hdgtc &amp;lt; 0.0) hdgtc += 360.0;&lt;br /&gt;
	return ((int16_t) hdgtc);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// --------------------------------------------&lt;br /&gt;
/**&lt;br /&gt;
 * Call this once before using the LSM303DLHC.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void LSM303DLHC_init(void)&lt;br /&gt;
{&lt;br /&gt;
	LSM303DLHC_A_init();						// Accelerometer init&lt;br /&gt;
	LSM303DLHC_M_init();						// Magnetometer init&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Analog Yaw-Rate Gyroscope (LY330ALH):&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Sets the LY330ALH mode of operation.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: mode -&amp;gt; Mode [0..3]&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void LY330ALH_set_mode(uint8_t mode)&lt;br /&gt;
{&lt;br /&gt;
	outport.pd_gyro = false;					// I/O 0.6: Low&lt;br /&gt;
	outport.st_gyro = false;					// I/O 0.7: Low&lt;br /&gt;
	if(mode &amp;amp; 1) outport.pd_gyro = true;&lt;br /&gt;
	if(mode &amp;amp; 2) outport.st_gyro = true;&lt;br /&gt;
	MAX7311_update();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Reads the ADC1 value from the RP6Base.&lt;br /&gt;
 *&lt;br /&gt;
 * Hints: - The RP6Base input ADC1 has to be&lt;br /&gt;
 *          connected to the USRBUS: Pin 2 on&lt;br /&gt;
 *          the RP6 mainboard!&lt;br /&gt;
 *        - The RP6Base_I2CSlave program has to&lt;br /&gt;
 *          be loaded into the RP6Base&lt;br /&gt;
 *          microcontroller!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
uint16_t getRP6Base_ADC1(void)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_readRegisters(I2C_RP6_BASE_ADR, I2C_REG_ADC_ADC1_L, registerBuf, 2);&lt;br /&gt;
	return (registerBuf[0] + (registerBuf[1] &amp;lt;&amp;lt; 8));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int16_t z_axisg;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Performs a LY330ALH gyroscope measurement and&lt;br /&gt;
 * returns the angular rate (velocity).&lt;br /&gt;
 * Positive values mean an angular rate while&lt;br /&gt;
 * rotating LEFT and negative values while&lt;br /&gt;
 * rotating RIGHT!&lt;br /&gt;
 * The global integer variable z_axisg also&lt;br /&gt;
 * contains the measurement result.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
int16_t LY330ALH_measure(void)&lt;br /&gt;
{&lt;br /&gt;
	z_axisg = getRP6Base_ADC1();				// Read raw data&lt;br /&gt;
	z_axisg -= ADCVAL_ZERORATE_LEVEL;			// Calculate value&lt;br /&gt;
	return (z_axisg);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Hot Swappable 2-Wire Bus Buffer (TCA4311A):&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Reads the TCA4311A Ready output. &lt;br /&gt;
 * The function returns the state (true/false).&lt;br /&gt;
 * The global variable readyBusbuff is also&lt;br /&gt;
 * filled with the Ready output state.&lt;br /&gt;
 *&lt;br /&gt;
 * Hint: You don't have to use this function,&lt;br /&gt;
 *       if the task task_RP6SensorBoard() is&lt;br /&gt;
 *       called frequently out of the main&lt;br /&gt;
 *       loop, because readyBusbuff will be&lt;br /&gt;
 *       updated by this task!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
uint8_t readReadyBusbuff(void)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmitByte(I2C_SENSOR_PORTEXP_ADR, MAX7311_INPUT_PORT1);&lt;br /&gt;
	readyBusbuff = I2CTWI_readByte(I2C_SENSOR_PORTEXP_ADR);&lt;br /&gt;
	readyBusbuff &amp;amp;= RDY_BUSBUFF;&lt;br /&gt;
	return readyBusbuff;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
uint8_t errorBusbuff;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * If the I2C bus for the I2C-MODULE (SCLOUT,&lt;br /&gt;
 * SDAOUT) is not used or shall be isolated from&lt;br /&gt;
 * the RP6 I2C bus, this can be done with this&lt;br /&gt;
 * function.&lt;br /&gt;
 *&lt;br /&gt;
 * Hints: - The I2C-MODULE power is NOT switched&lt;br /&gt;
 *          off by this function!&lt;br /&gt;
 *        - If USE_PD5 is defined in the&lt;br /&gt;
 *          configuration header file, this&lt;br /&gt;
 *          function uses the RP6M256 portpin,&lt;br /&gt;
 *          that is connected to plug I/O: Pin 9&lt;br /&gt;
 *          instead of MAX7311 I/O 1.0!&lt;br /&gt;
 *        - If the global variable errorBusbuff&lt;br /&gt;
 *          returns true, the bus buffer could&lt;br /&gt;
 *          not be switched to shutdown mode!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void TCA4311A_shutdown(void)&lt;br /&gt;
{&lt;br /&gt;
	// Wait until the I2C bus is idle:&lt;br /&gt;
	while(I2CTWI_isBusy() || TWI_operation != I2CTWI_NO_OPERATION) task_I2CTWI();&lt;br /&gt;
#ifdef USE_PD5&lt;br /&gt;
	IO_SENSOR_TCA4311A_EN_PORT &amp;amp;= ~IO_SENSOR_TCA4311A_EN_IN; // Low&lt;br /&gt;
#else&lt;br /&gt;
	outport.en_busbuff = false;					// I/O 1.0: Low&lt;br /&gt;
	MAX7311_update();&lt;br /&gt;
#endif&lt;br /&gt;
	errorBusbuff = readReadyBusbuff();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * If the I2C bus for the I2C-MODULE (SCLOUT,&lt;br /&gt;
 * SDAOUT) was isolated from the RP6 I2C bus with&lt;br /&gt;
 * the function TCA4311A_shutdown() before, it&lt;br /&gt;
 * can be connected again with this function.&lt;br /&gt;
 *&lt;br /&gt;
 * Hints: - The I2C-MODULE power is NOT switched&lt;br /&gt;
 *          on by this function!&lt;br /&gt;
 *        - If USE_PD5 is defined in the&lt;br /&gt;
 *          configuration header file, this&lt;br /&gt;
 *          function uses the RP6M256 portpin,&lt;br /&gt;
 *          that is connected to plug I/O: Pin 9&lt;br /&gt;
 *          instead of MAX7311 I/O 1.0!&lt;br /&gt;
 *        - If the global variable errorBusbuff&lt;br /&gt;
 *          returns true, the bus buffer could&lt;br /&gt;
 *          not be switched to normal operation!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void TCA4311A_reconnect(void)&lt;br /&gt;
{&lt;br /&gt;
	// Wait until the I2C bus is idle:&lt;br /&gt;
	while(I2CTWI_isBusy() || TWI_operation != I2CTWI_NO_OPERATION) task_I2CTWI();&lt;br /&gt;
#ifdef USE_PD5&lt;br /&gt;
	IO_SENSOR_TCA4311A_EN_PORT |= IO_SENSOR_TCA4311A_EN_IN; // High&lt;br /&gt;
#else&lt;br /&gt;
	outport.en_busbuff = true;					// I/O 1.0: High&lt;br /&gt;
	MAX7311_update();&lt;br /&gt;
#endif&lt;br /&gt;
	errorBusbuff = !readReadyBusbuff();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Sets/clears the RP6Base signal PWR.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: pwr -&amp;gt; 0 (false) = PWR off&lt;br /&gt;
 *               &amp;gt;0 (true) = PWR on&lt;br /&gt;
 *&lt;br /&gt;
 * Hints: - The RP6Base signal PWR has to be&lt;br /&gt;
 *          connected to the USRBUS: Pin 3 on&lt;br /&gt;
 *          the RP6 mainboard!&lt;br /&gt;
 *        - The RP6Base_I2CSlave program has to&lt;br /&gt;
 *          be loaded into the RP6Base&lt;br /&gt;
 *          microcontroller!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void setRP6Base_PWR(uint8_t pwr)&lt;br /&gt;
{&lt;br /&gt;
	if(pwr &amp;gt; 0)&lt;br /&gt;
		I2CTWI_transmit2Bytes(I2C_RP6_BASE_ADR, 0, CMD_POWER_ON);&lt;br /&gt;
	else&lt;br /&gt;
		I2CTWI_transmit2Bytes(I2C_RP6_BASE_ADR, 0, CMD_POWER_OFF);&lt;br /&gt;
	while(I2CTWI_isBusy() || TWI_operation != I2CTWI_NO_OPERATION) task_I2CTWI();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/** &lt;br /&gt;
 * With this function you can switch the I2C-&lt;br /&gt;
 * MODULE (plug M1) power on or off.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: pwr -&amp;gt; 0 (false) = I2C-MODULE power off&lt;br /&gt;
 *               &amp;gt;0 (true) = I2C-MODULE power on&lt;br /&gt;
 *&lt;br /&gt;
 * Hints: - If the I2C-MODULE plug is not used,&lt;br /&gt;
 *          you should always switch the&lt;br /&gt;
 *          I2C-MODULE power off (default)!&lt;br /&gt;
 *        - The TCA4311A is NOT switched to&lt;br /&gt;
 *          normal operation (default) or&lt;br /&gt;
 *          shutdown mode by this function!&lt;br /&gt;
 *        - The RP6Base signal PWR has to be&lt;br /&gt;
 *          connected to the USRBUS: Pin 3 on&lt;br /&gt;
 *          the RP6 mainboard!&lt;br /&gt;
 *        - The RP6Base_I2CSlave program has to&lt;br /&gt;
 *          be loaded into the RP6Base&lt;br /&gt;
 *          microcontroller!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void setI2CModulePower(uint8_t pwr)&lt;br /&gt;
{&lt;br /&gt;
	if(pwr &amp;gt; 0) {&lt;br /&gt;
		setRP6Base_PWR(1);						// RP6Base PWR on&lt;br /&gt;
		outport.pwr_i2c = true;					// I/O 0.0: High&lt;br /&gt;
	}&lt;br /&gt;
	else&lt;br /&gt;
		outport.pwr_i2c = false;				// I/O 0.0: Low&lt;br /&gt;
	MAX7311_update();&lt;br /&gt;
}	&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Button:&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Reads the MAX7311 I/O port 1.7. &lt;br /&gt;
 * The function returns true, if  button S1 is&lt;br /&gt;
 * pressed (I/O 1.7: Low!) and false, if it is&lt;br /&gt;
 * not pressed (I/O 1.7: High!).&lt;br /&gt;
 * The global variable pressedButton is also&lt;br /&gt;
 * filled with the I/O 1.7 output state.&lt;br /&gt;
 *&lt;br /&gt;
 * Hint: You don't have to use this function,&lt;br /&gt;
 *       if the task task_RP6SensorBoard() is&lt;br /&gt;
 *       called frequently out of the main&lt;br /&gt;
 *       loop, because pressedButton will be&lt;br /&gt;
 *       updated by this task!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
uint8_t readButton(void)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmitByte(I2C_SENSOR_PORTEXP_ADR, MAX7311_INPUT_PORT2);&lt;br /&gt;
	pressedButton = I2CTWI_readByte(I2C_SENSOR_PORTEXP_ADR);&lt;br /&gt;
	pressedButton &amp;amp;= IO2_I2C;&lt;br /&gt;
	pressedButton = !pressedButton;&lt;br /&gt;
	return pressedButton;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Status LED:&lt;br /&gt;
&lt;br /&gt;
/** &lt;br /&gt;
 * Sets the status LED (D2) of the RP6 Sensor&lt;br /&gt;
 * Board.&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *   setStatusLED(1);&lt;br /&gt;
 *   // This switches the status LED on!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void setStatusLED(uint8_t on)&lt;br /&gt;
{&lt;br /&gt;
	if(on &amp;gt; 0)&lt;br /&gt;
		outport.io1_i2c = false;				// I/O 1.6: Low&lt;br /&gt;
	else&lt;br /&gt;
		outport.io1_i2c = true;					// I/O 1.6: High&lt;br /&gt;
	MAX7311_update();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// RP6 Sensor Board initialisation and shutdown:&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * You MUST call this function at the beginning of a&lt;br /&gt;
 * main program, that uses the RP6 Sensor Board. &lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void sensor_board_init(void)&lt;br /&gt;
{&lt;br /&gt;
	// I/O Port Expander:&lt;br /&gt;
	MAX7311_init();&lt;br /&gt;
	// RTC:&lt;br /&gt;
	DS1339_init();&lt;br /&gt;
	// Temperature Sensor:&lt;br /&gt;
	LM75B_init();&lt;br /&gt;
	// Servo Controller:&lt;br /&gt;
	PCA9685_init(50);							// Init PWM 50 Hz&lt;br /&gt;
	// LED Driver:&lt;br /&gt;
	TCA6507_init();&lt;br /&gt;
	// 3D Magnetometer &amp;amp; Accelerometer:&lt;br /&gt;
	LSM303DLHC_init();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * If you don't use any function of the RP6&lt;br /&gt;
 * Sensor Board, you can put the board into&lt;br /&gt;
 * &amp;quot;SHUTDOWN MODE&amp;quot;. In this mode the electric&lt;br /&gt;
 * power consumption is very low to save energy.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void sensor_board_shutdown(void)&lt;br /&gt;
{&lt;br /&gt;
	// Servo Controller:&lt;br /&gt;
	PCA9685_shutdown();							// Shutdown PCA9685&lt;br /&gt;
	// Temperature Sensor:&lt;br /&gt;
	LM75B_shutdown();							// Shutdown LM75B&lt;br /&gt;
	// I/O Port Expander:&lt;br /&gt;
	MAX7311_write(MAX7311_OUTPUT_SHUTDOWN);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&lt;br /&gt;
/******************************************************************************&lt;br /&gt;
 * Additional info&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Changelog:&lt;br /&gt;
 * - v. 1.1 RP6M256_I2CMasterLib compatibility 16.09.2014 by Dirk&lt;br /&gt;
 * - v. 1.0 TCA4311A reconnect problem fixed 10.04.2014 by Dirk&lt;br /&gt;
 * - v. 0.9 Interrupt status functions added 09.04.2014 by Dirk&lt;br /&gt;
 * - v. 0.8 (initial release) 17.03.2014 by Dirk&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Erklärung&lt;br /&gt;
&lt;br /&gt;
=====Demo=====&lt;br /&gt;
makefile:&lt;br /&gt;
&amp;lt;pre&amp;gt;...&lt;br /&gt;
TARGET = RP6M256_Sensor_Board_01&lt;br /&gt;
...&lt;br /&gt;
SRC += $(RP6_LIB_PATH)/RP6common/RP6I2CmasterTWI.c&lt;br /&gt;
&lt;br /&gt;
SRC += $(RP6_LIB_PATH)/RP6control_M256_WIFI/RP6M256_Sensor_BoardLib.c&lt;br /&gt;
...&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Datei: RP6M256_Sensor_Board_01.c&lt;br /&gt;
&amp;lt;pre&amp;gt;/* &lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * RP6 ROBOT SYSTEM - RP6 CONTROL M256 Examples&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Example: RP6M256 Sensor Board&lt;br /&gt;
 * Author(s): Dirk&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Description:&lt;br /&gt;
 * In this example we show a first test for the RP6 Sensor Board.&lt;br /&gt;
 * &lt;br /&gt;
 * ############################################################################&lt;br /&gt;
 * The Robot does NOT move in this example! You can simply put it on a table&lt;br /&gt;
 * next to your PC and you should connect it to the PC via the USB Interface!&lt;br /&gt;
 * You should also connect to it via WIFI.&lt;br /&gt;
 * ############################################################################&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Includes:&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6M256Lib.h&amp;quot; 				// The RP6 M256 Library. &lt;br /&gt;
										// Always needs to be included!&lt;br /&gt;
#include &amp;quot;RP6I2CmasterTWI.h&amp;quot;			// Include the I2C-Bus Master Library&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Include our new &amp;quot;RP6M256 Sensor Board library&amp;quot;:&lt;br /&gt;
// (This is the library for accessing the RP6 Sensor Board!)&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6M256_Sensor_BoardLib.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Variables:&lt;br /&gt;
&lt;br /&gt;
char dir[3];&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Returns a 2 character string for the eighth&lt;br /&gt;
 * parts of the direction calculated from the&lt;br /&gt;
 * heading value.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: heading -&amp;gt; Heading value [0..359]&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void calculateDir(char *dir, uint16_t heading)&lt;br /&gt;
{&lt;br /&gt;
	dir[1] = ' ';&lt;br /&gt;
	dir[2] = '\0';&lt;br /&gt;
	if ((heading &amp;lt;= 22) || (heading &amp;gt;=338)) dir[0] = 'N';&lt;br /&gt;
	if ((heading &amp;gt;= 23) &amp;amp;&amp;amp; (heading &amp;lt;= 67)) {dir[0] = 'N'; dir[1] = 'E';} &lt;br /&gt;
	if ((heading &amp;gt;= 68) &amp;amp;&amp;amp; (heading &amp;lt;= 112)) dir[0] = 'E';&lt;br /&gt;
	if ((heading &amp;gt;= 113) &amp;amp;&amp;amp; (heading &amp;lt;= 157)) {dir[0] = 'S'; dir[1] = 'E';}&lt;br /&gt;
	if ((heading &amp;gt;= 158) &amp;amp;&amp;amp; (heading &amp;lt;= 202)) dir[0] = 'S';&lt;br /&gt;
	if ((heading &amp;gt;= 203) &amp;amp;&amp;amp; (heading &amp;lt;= 247)) {dir[0] = 'S'; dir[1] = 'W';}&lt;br /&gt;
	if ((heading &amp;gt;= 248) &amp;amp;&amp;amp; (heading &amp;lt;= 292)) dir[0] = 'W';&lt;br /&gt;
	if ((heading &amp;gt;= 293) &amp;amp;&amp;amp; (heading &amp;lt;= 337)) {dir[0] = 'N'; dir[1] = 'W';}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Write a floating point number to the WIFI.&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *&lt;br /&gt;
 *			// Write a floating point number to the WIFI (no exponent):&lt;br /&gt;
 *			writeDouble_WIFI(1234567.890, 11, 3);&lt;br /&gt;
 *&lt;br /&gt;
 * The value of prec (precision) defines the number of decimal places.&lt;br /&gt;
 * For 32 bit floating point variables (float, double ...) 6 is&lt;br /&gt;
 * the max. value for prec (7 relevant digits).&lt;br /&gt;
 * The value of width defines the overall number of characters in the&lt;br /&gt;
 * floating point number including the decimal point. The number of&lt;br /&gt;
 * pre-decimal positions is: (width - prec - 1).&lt;br /&gt;
 */&lt;br /&gt;
void writeDouble_WIFI(double number, uint8_t width, uint8_t prec)&lt;br /&gt;
{char buffer[width + 1];&lt;br /&gt;
	dtostrf(number, width, prec, &amp;amp;buffer[0]);&lt;br /&gt;
	writeString_WIFI(&amp;amp;buffer[0]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Write a floating point number to the LCD.&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *&lt;br /&gt;
 *			// Write a floating point number to the LCD (no exponent):&lt;br /&gt;
 *			writeDoubleLCD(1234567.890, 11, 3);&lt;br /&gt;
 *&lt;br /&gt;
 * The value of prec (precision) defines the number of decimal places.&lt;br /&gt;
 * For 32 bit floating point variables (float, double ...) 6 is&lt;br /&gt;
 * the max. value for prec (7 relevant digits).&lt;br /&gt;
 * The value of width defines the overall number of characters in the&lt;br /&gt;
 * floating point number including the decimal point. The number of&lt;br /&gt;
 * pre-decimal positions is: (width - prec - 1).&lt;br /&gt;
 */&lt;br /&gt;
void writeDoubleLCD(double number, uint8_t width, uint8_t prec)&lt;br /&gt;
{char buffer[width + 1];&lt;br /&gt;
	dtostrf(number, width, prec, &amp;amp;buffer[0]);&lt;br /&gt;
	writeStringLCD(&amp;amp;buffer[0]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Error handler&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function gets called automatically if there was an I2C Error like&lt;br /&gt;
 * the slave sent a &amp;quot;not acknowledge&amp;quot; (NACK, error codes e.g. 0x20 or 0x30).&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void I2C_transmissionError(uint8_t errorState)&lt;br /&gt;
{&lt;br /&gt;
	writeString_P_WIFI(&amp;quot;\nI2C ERROR - TWI STATE: 0x&amp;quot;);&lt;br /&gt;
	writeInteger_WIFI(errorState, HEX);&lt;br /&gt;
	writeChar_WIFI('\n');&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Main function - The program starts here:&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
	initRP6M256();    // Always call this first! The Processor will not work&lt;br /&gt;
					  // correctly otherwise. &lt;br /&gt;
&lt;br /&gt;
	initLCD(); // Initialize the LC-Display (LCD)&lt;br /&gt;
			   // Always call this before using the LCD!&lt;br /&gt;
&lt;br /&gt;
	setLEDs(0b1111);&lt;br /&gt;
	mSleep(500);&lt;br /&gt;
	setLEDs(0b0000);&lt;br /&gt;
&lt;br /&gt;
	writeString_P_WIFI(&amp;quot;\n\nRP6 Sensor Board Selftest 1!\n&amp;quot;); &lt;br /&gt;
&lt;br /&gt;
	// IMPORTANT:&lt;br /&gt;
	I2CTWI_initMaster(100); // Initialize the TWI Module for Master operation&lt;br /&gt;
							// with 100kHz SCL Frequency&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	// Register the event handler:&lt;br /&gt;
	I2CTWI_setTransmissionErrorHandler(I2C_transmissionError);&lt;br /&gt;
&lt;br /&gt;
	setLEDs(0b1111);&lt;br /&gt;
&lt;br /&gt;
	// Write a text message to the LCD:&lt;br /&gt;
	showScreenLCD(&amp;quot;################&amp;quot;, &amp;quot;################&amp;quot;);&lt;br /&gt;
	mSleep(1500);&lt;br /&gt;
	showScreenLCD(&amp;quot;RP6v2-M256-WIFI &amp;quot;, &amp;quot;Example Program&amp;quot;);&lt;br /&gt;
	mSleep(2500); &lt;br /&gt;
	showScreenLCD(&amp;quot;RP6 Sensor Board&amp;quot;, &amp;quot;   Selftest 1&amp;quot;);&lt;br /&gt;
	mSleep(2500);&lt;br /&gt;
	clearLCD();&lt;br /&gt;
&lt;br /&gt;
	setLEDs(0b0000);&lt;br /&gt;
&lt;br /&gt;
	// ---------------------------------------&lt;br /&gt;
&lt;br /&gt;
	uint8_t onoff = 0;&lt;br /&gt;
	uint16_t servopos = SERVO1_LT;&lt;br /&gt;
	int16_t rate;&lt;br /&gt;
&lt;br /&gt;
	startStopwatch1();&lt;br /&gt;
	startStopwatch2();&lt;br /&gt;
&lt;br /&gt;
	// IMPORTANT:&lt;br /&gt;
	sensor_board_init();						// RP6 Sensor Board init!!!&lt;br /&gt;
	setServoPower(1);							// Servo power ON!&lt;br /&gt;
/*&lt;br /&gt;
	// ----------------------------------------------&lt;br /&gt;
	// Set RTC once (battery empty or not existing:&lt;br /&gt;
	rtc_time.second = 0;&lt;br /&gt;
	rtc_time.minute = 15;&lt;br /&gt;
	rtc_time.hour = 20;				// 20:15&lt;br /&gt;
	rtc_date.weekday = R_SU;&lt;br /&gt;
	rtc_date.day = 20;&lt;br /&gt;
	rtc_date.month = 4;&lt;br /&gt;
	rtc_date.year = 2014;			// Su, 20.4.2014&lt;br /&gt;
	DS1339_write();&lt;br /&gt;
	// Remove this, if RTC is set and running!!!&lt;br /&gt;
	// ----------------------------------------------&lt;br /&gt;
*/&lt;br /&gt;
	while(true) &lt;br /&gt;
	{&lt;br /&gt;
		if(getStopwatch1() &amp;gt; 1000) // 1s&lt;br /&gt;
		{&lt;br /&gt;
			if (onoff) onoff = 0;&lt;br /&gt;
			else onoff = 1;&lt;br /&gt;
&lt;br /&gt;
			// Interrupt status:&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nInterrupt Status:      &amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(interrupt_RP6SBstatus.byte, BIN, 8);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			// Inport status:&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;Inport Status: &amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(inport.word, BIN, 16);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			// Temperature sensor test:&lt;br /&gt;
			temperature = LM75B_measure();		// Measure&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;Temperature: &amp;quot;);&lt;br /&gt;
			writeDouble_WIFI(temperature, 7, 3);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;°\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			// LED driver test:&lt;br /&gt;
			if (onoff) {&lt;br /&gt;
				setLED(HEADLIGHT_R, STATE_ON);&lt;br /&gt;
				setLED(HEADLIGHT_L, STATE_OFF);&lt;br /&gt;
			}&lt;br /&gt;
			else {&lt;br /&gt;
				setLED(HEADLIGHT_L, STATE_ON);&lt;br /&gt;
				setLED(HEADLIGHT_R, STATE_OFF);&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			// Servo controller test (SERVO_1):&lt;br /&gt;
			setServo(1, servopos);&lt;br /&gt;
			servopos += 10;&lt;br /&gt;
			if (servopos &amp;gt; SERVO1_RT) servopos = SERVO1_LT;&lt;br /&gt;
&lt;br /&gt;
			// RTC test:&lt;br /&gt;
			DS1339_read();&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;RTC: &amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(rtc_time.hour, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;:&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(rtc_time.minute, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;:&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(rtc_time.second, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;  &amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(rtc_date.day, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;.&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(rtc_date.month, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;.&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(rtc_date.year, DEC, 4);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			// 3D Magnetometer &amp;amp; Accelerometer test:&lt;br /&gt;
			//  LSM303DLHC accelerometer:&lt;br /&gt;
			task_I2CTWI();&lt;br /&gt;
			readLSM303DLHC_A();					// Get sensor values&lt;br /&gt;
			task_I2CTWI();&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\n3D-Acceleration SENSOR -&amp;gt;\n&amp;quot;);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;X-axis: &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(x_axisa, DEC);&lt;br /&gt;
			writeChar_WIFI('\n');&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;Y-axis: &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(y_axisa, DEC);&lt;br /&gt;
			writeChar_WIFI('\n');&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;Z-axis: &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(z_axisa, DEC);&lt;br /&gt;
			writeChar_WIFI('\n');&lt;br /&gt;
			normalizeLSM303DLHC_A();			// Normalize data&lt;br /&gt;
			positionLSM303DLHC_A();				// Calculate position&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;POSITION: \n&amp;quot;);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;  Pitch [°]: &amp;quot;);&lt;br /&gt;
			writeDouble_WIFI(pitch, 6, 1);&lt;br /&gt;
			writeChar_WIFI('\n');&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;  Roll [°]:  &amp;quot;);&lt;br /&gt;
			writeDouble_WIFI(roll, 6, 1);&lt;br /&gt;
			writeChar_WIFI('\n');&lt;br /&gt;
&lt;br /&gt;
			//  LSM303DLHC magnetometer:&lt;br /&gt;
			task_I2CTWI();&lt;br /&gt;
			readLSM303DLHC_M();					// Get sensor values&lt;br /&gt;
			task_I2CTWI();&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\n3D-Compass SENSOR -&amp;gt;\n&amp;quot;);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;X-axis: &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(x_axism, DEC);&lt;br /&gt;
			writeChar_WIFI('\n');&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;Y-axis: &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(y_axism, DEC);&lt;br /&gt;
			writeChar_WIFI('\n');&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;Z-axis: &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(z_axism, DEC);&lt;br /&gt;
			writeChar_WIFI('\n');&lt;br /&gt;
			normalizeLSM303DLHC_M();			// Normalize data&lt;br /&gt;
			headingm = headingLSM303DLHC_M();	// Calculate heading&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;                 Heading [°]: &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(headingm, DEC);&lt;br /&gt;
			calculateDir(dir, headingm);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;  Direction: &amp;quot;);&lt;br /&gt;
			writeString_WIFI(dir);&lt;br /&gt;
			writeChar_WIFI('\n');&lt;br /&gt;
			headingtc = headingLSM303DLHC_TC();	// Calculate TILT COMPENSATED&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;TILT COMPENSATED heading [°]: &amp;quot;); // heading&lt;br /&gt;
			writeInteger_WIFI(headingtc, DEC);&lt;br /&gt;
			calculateDir(dir, headingtc);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;  Direction: &amp;quot;);&lt;br /&gt;
			writeString_WIFI(dir);&lt;br /&gt;
			writeChar_WIFI('\n');&lt;br /&gt;
#ifdef GET_TEMP_M&lt;br /&gt;
			temperature_mag = (double) temperaturem / 8.0 + OFFSET_TEMP_M;&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;Temperature [°]: &amp;quot;);&lt;br /&gt;
			writeDouble_WIFI(temperature_mag, 7, 2);&lt;br /&gt;
			writeChar_WIFI('\n');&lt;br /&gt;
#endif&lt;br /&gt;
			// Yaw-Rate Gyroscope test:&lt;br /&gt;
			rate = LY330ALH_measure();&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\n1D-Gyro SENSOR -&amp;gt;\n&amp;quot;);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;Z-axis: &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(rate, DEC);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			// RP6 Sensor Board shutdown (button &amp;amp; status LED test):&lt;br /&gt;
			if (pressedButton) {&lt;br /&gt;
				setStatusLED(1);&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;\nPress button again for RP6 Sensor Board SHUTDOWN!\n&amp;quot;);&lt;br /&gt;
				mSleep(2000);&lt;br /&gt;
				do {&lt;br /&gt;
					if(getStopwatch2() &amp;gt; 200) { // 0.2s&lt;br /&gt;
						if (onoff) onoff = 0;&lt;br /&gt;
						else onoff = 1;&lt;br /&gt;
						if (onoff) setStatusLED(1);&lt;br /&gt;
						else setStatusLED(0);&lt;br /&gt;
						setStopwatch2(0);&lt;br /&gt;
					}&lt;br /&gt;
					mSleep(1);&lt;br /&gt;
					task_I2CTWI();&lt;br /&gt;
				} while (!readButton());&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;\n\n\n\n\nPlease wait for RP6 Sensor Board SHUTDOWN...\n&amp;quot;);&lt;br /&gt;
				sensor_board_shutdown();&lt;br /&gt;
				mSleep(3000);&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;\n\n\nThe RP6 Sensor Board now is in SHUTDOWN MODE!!!\n&amp;quot;);&lt;br /&gt;
				mSleep(1000);&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;\nRESET the M256 microcontroller now...\n\n&amp;quot;);&lt;br /&gt;
				while(true) {};&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			setStopwatch1(0);&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		task_checkINTs();						// Read interrupt signals&lt;br /&gt;
		task_RP6SensorBoard();					// RP6 Sensor Board task&lt;br /&gt;
&lt;br /&gt;
		task_I2CTWI();&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Erklärung&lt;br /&gt;
&lt;br /&gt;
====Projekte====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===RP6 Xtra Module===&lt;br /&gt;
Die Dokumentation zu den RP6 Xtra Modulen befindet sich auf der mitgelieferten ''&amp;quot;RP6 Robot System Xtra Modules CD-ROM&amp;quot;''. Auf der CD-ROM sind auch Software-Beispiele zu finden.&lt;br /&gt;
&lt;br /&gt;
Die hier veröffentlichte Software zu den Xtra Modulen ist eine Eigenentwicklung in GCC:&lt;br /&gt;
* Arexx [[RP6_Sensor_Board_und_Xtra_Module#I2C_GPS_Empf.C3.A4nger_JM3-GPS_2|I2C GPS Empfänger JM3-GPS]]&lt;br /&gt;
* Arexx [[RP6_Sensor_Board_und_Xtra_Module#Gyro_Modul_JM3-GYRO_2|Gyro Modul JM3-GYRO]]&lt;br /&gt;
* Arexx [[RP6_Sensor_Board_und_Xtra_Module#3D_Accelerometer_Modul_JM3-3DA_2|3D Accelerometer Modul JM3-3DA]]&lt;br /&gt;
* Arexx [[RP6_Sensor_Board_und_Xtra_Module#BHT_Modul_JM3-BHT31_2|BHT Modul JM3-BHT31]]&lt;br /&gt;
&lt;br /&gt;
====I2C GPS Empfänger JM3-GPS====&lt;br /&gt;
=====Dokumentation=====&lt;br /&gt;
Die Dokumentation zum I2C GPS Empfänger befindet sich auf der mitgelieferten ''&amp;quot;RP6 Robot System Xtra Modules CD-ROM&amp;quot;''.&lt;br /&gt;
&lt;br /&gt;
======Manuals======&lt;br /&gt;
Das Handbuch in der aktuellen Version kann [http://www.jm3-engineering.com/download/doc/ManualGPSModule_de.pdf hier] eingesehen werden.&lt;br /&gt;
&lt;br /&gt;
=====Demo-Programme=====&lt;br /&gt;
Ein Demo-Programm zum I2C GPS Empfänger befindet sich integriert in die RP6 Sensor Board Demo auf der mitgelieferten ''&amp;quot;RP6 Robot System Xtra Modules CD-ROM&amp;quot;''. Diese Demo kann auch in der aktuellen Version im Download Bereich von [http://www.jm3-engineering.com/downloads.htm JM3 Engineering] herunter geladen werden.&lt;br /&gt;
&lt;br /&gt;
=====RP6M256 WiFi: I2C_GPS Library=====&lt;br /&gt;
Die nachfolgende RP6M256_I2C_GPSLib (Eigenentwicklung in GCC) dient zur Ansteuerung des I2C GPS Empfängers durch die RP6M256 WiFi.&lt;br /&gt;
 &lt;br /&gt;
======Libary Header======&lt;br /&gt;
Datei: RP6M256_I2C_GPSLib.h&lt;br /&gt;
&amp;lt;pre&amp;gt;/* ****************************************************************************&lt;br /&gt;
 *                           _______________________&lt;br /&gt;
 *                           \| RP6  ROBOT SYSTEM |/&lt;br /&gt;
 *                            \_-_-_-_-_-_-_-_-_-_/           &amp;gt;&amp;gt;&amp;gt; RP6 M256 WIFI&lt;br /&gt;
 * ----------------------------------------------------------------------------&lt;br /&gt;
 * ----------------------------- [c]2014 - Dirk -------------------------------&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * File: RP6M256_I2C_GPSLib.h&lt;br /&gt;
 * Version: 1.0&lt;br /&gt;
 * Target: RP6 M256 WIFI - ATMEGA2560 @16.00MHz&lt;br /&gt;
 * Author(s): Dirk&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Description:&lt;br /&gt;
 * Header file for new RP6 I2C GPS Receiver library.&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
#ifndef RP6M256_I2C_GPSLIB_H&lt;br /&gt;
#define RP6M256_I2C_GPSLIB_H&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// RP6 Sensor Board:&lt;br /&gt;
&lt;br /&gt;
// If you want to use the RP6 I2C GPS Receiver on the RP6 Sensor Board, you&lt;br /&gt;
// have to define SENSOR_BOARD (default)!&lt;br /&gt;
// If SENSOR_BOARD is NOT defined, this library assumes that the RP6 I2C GPS&lt;br /&gt;
// Receiver is used stand-alone.&lt;br /&gt;
// ------------------&lt;br /&gt;
#define SENSOR_BOARD&lt;br /&gt;
// ------------------&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Includes:&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6M256Lib.h&amp;quot;&lt;br /&gt;
#include &amp;quot;RP6I2CmasterTWI.h&amp;quot;&lt;br /&gt;
#ifdef SENSOR_BOARD&lt;br /&gt;
	#include &amp;quot;RP6M256_Sensor_BoardLib.h&amp;quot;&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// RP6 I2C GPS Receiver:&lt;br /&gt;
#define I2C_GPS_RECEIVER_ADR			0xc8	// Default&lt;br /&gt;
//#define I2C_GPS_RECEIVER_ADR			0xca&lt;br /&gt;
//#define I2C_GPS_RECEIVER_ADR			0xcc&lt;br /&gt;
//#define I2C_GPS_RECEIVER_ADR			0xce&lt;br /&gt;
//#define I2C_GPS_RECEIVER_ADR			0xd0	// DO NOT USE on Sensor Board!&lt;br /&gt;
//#define I2C_GPS_RECEIVER_ADR			0xd2&lt;br /&gt;
//#define I2C_GPS_RECEIVER_ADR			0xd4&lt;br /&gt;
//#define I2C_GPS_RECEIVER_ADR			0xd6&lt;br /&gt;
//#define I2C_GPS_RECEIVER_ADR			0xd8&lt;br /&gt;
//#define I2C_GPS_RECEIVER_ADR			0xda&lt;br /&gt;
//#define I2C_GPS_RECEIVER_ADR			0xdc&lt;br /&gt;
//#define I2C_GPS_RECEIVER_ADR			0xde&lt;br /&gt;
&lt;br /&gt;
// Read registers:&lt;br /&gt;
#define WHO_AM_I						0x20	// I2C address [0xc8..0xde]&lt;br /&gt;
#define LAT_DEG							0x21	// Degrees&lt;br /&gt;
#define LAT_MIN							0x22	// Minutes&lt;br /&gt;
#define LAT_MIN_D_L						0x23	// Minutes decimal part low&lt;br /&gt;
#define LAT_MIN_D_H						0x24	// Minutes decimal part high&lt;br /&gt;
#define LON_DEG							0x25	// Degrees&lt;br /&gt;
#define LON_MIN							0x26	// Minutes&lt;br /&gt;
#define LON_MIN_D_L						0x27	// Minutes decimal part low&lt;br /&gt;
#define LON_MIN_D_H						0x28	// Minutes decimal part high&lt;br /&gt;
#define STATUS							0x29	// Status flags&lt;br /&gt;
#define FIX_IND							0x2a	// FIX_IND&lt;br /&gt;
#define HDOP							0x2b	// HDOP&lt;br /&gt;
#define HDOP_D							0x2c	// HDOP_D&lt;br /&gt;
#define SAT_N							0x2d	// Number of satellites&lt;br /&gt;
#define COURSE_T_L						0x2e	// True heading low byte&lt;br /&gt;
#define COURSE_T_H						0x2f	// True heading high byte&lt;br /&gt;
#define COURSE_T_D						0x30	// Decimal part of course&lt;br /&gt;
#define SPEED_L							0x31	// Speed low byte&lt;br /&gt;
#define SPEED_H							0x32	// Speed high byte&lt;br /&gt;
#define SPEED_D							0x33	// Speed decimal part&lt;br /&gt;
#define ALT_L							0x34	// Altitude low byte&lt;br /&gt;
#define ALT_H							0x35	// Altitude high byte&lt;br /&gt;
#define ALT_DIF_L						0x36	// Differ. WGS-84 MSL low byte&lt;br /&gt;
#define ALT_DIF_H						0x37	// Differ. WGS-84 MSL high byte&lt;br /&gt;
#define UTC_H							0x38	// UTC hour&lt;br /&gt;
#define UTC_MIN							0x39	// UTC minute&lt;br /&gt;
#define UTC_S							0x3a	// UTC second&lt;br /&gt;
#define DAY								0x3b	// Day&lt;br /&gt;
#define YEAR_L							0x3c	// Year low byte&lt;br /&gt;
#define YEAR_H							0x3d	// Year high byte&lt;br /&gt;
#define MONTH							0x3e	// Month&lt;br /&gt;
#define PDOP							0x3f	// PDOP&lt;br /&gt;
#define PDOP_D							0x40	// PDOP_D&lt;br /&gt;
#define VDOP							0x41	// VDOP&lt;br /&gt;
#define VDOP_D							0x42	// VDOP_D&lt;br /&gt;
#define SAT_1							0x43	// SAT # 1&lt;br /&gt;
#define SAT_2							0x44	// SAT # 2&lt;br /&gt;
#define SAT_3							0x45	// SAT # 3&lt;br /&gt;
#define SAT_4							0x46	// SAT # 4&lt;br /&gt;
#define SAT_5							0x47	// SAT # 5&lt;br /&gt;
#define SAT_6							0x48	// SAT # 6&lt;br /&gt;
#define SAT_7							0x49	// SAT # 7&lt;br /&gt;
#define SAT_8							0x4a	// SAT # 8&lt;br /&gt;
#define SAT_9							0x4b	// SAT # 9&lt;br /&gt;
#define SAT_A							0x4c	// SAT # 10&lt;br /&gt;
#define SAT_B							0x4d	// SAT # 11&lt;br /&gt;
#define SAT_C							0x4e	// SAT # 12&lt;br /&gt;
#define SW_VERSION						0x4f	// SW_Version&lt;br /&gt;
#define HEARTBEAT						0x50	// Heartbeat&lt;br /&gt;
&lt;br /&gt;
// Status and Fix_Ind register bitmasks:&lt;br /&gt;
#define STATUS_NS						0b00000001&lt;br /&gt;
#define STATUS_EW						0b00000010&lt;br /&gt;
#define STATUS_SPU						0b00000100&lt;br /&gt;
#define STATUS_AUTON					0b00001000&lt;br /&gt;
#define FIX_IND_UI_FIX					0b10000000&lt;br /&gt;
&lt;br /&gt;
// Write registers:&lt;br /&gt;
#define INIT_CFG						0x90	// INIT CFG&lt;br /&gt;
#define SET_FIX_TIME					0x91	// Pos_Fix_Time&lt;br /&gt;
#define STBY							0x92	// STBY&lt;br /&gt;
#define FAC_RES							0x93	// Factory Reset&lt;br /&gt;
#define EN_JAM							0x94	// Jamming Remover&lt;br /&gt;
#define TEST_MODE						0x96	// Test Mode&lt;br /&gt;
&lt;br /&gt;
// Write register values (commands):&lt;br /&gt;
#define INIT_CFG_HOT_START				1		// Hot Start&lt;br /&gt;
#define INIT_CFG_WARM_START				2		// Warm Start init data loaded&lt;br /&gt;
#define INIT_CFG_WARM_START_EPH_CLR		3		// Warm Start Ephemeris cleared&lt;br /&gt;
#define INIT_CFG_COLD_START				4		// Cold Start&lt;br /&gt;
#define SET_FIX_TIME_1S					1		// Pos Fix Time 1 second&lt;br /&gt;
#define SET_FIX_TIME_2S					2		// Pos Fix Time 2 seconds&lt;br /&gt;
#define STBY_ENTER						1		// Standby (cleared after write)&lt;br /&gt;
#define FAC_RES_ENTER					1		// Factory Reset&lt;br /&gt;
#define EN_JAM_DISABLE					0		// Jamming Remover disable&lt;br /&gt;
#define EN_JAM_ENABLE					1		// Jamming Remover enable&lt;br /&gt;
#define TEST_MODE_INACTIVE				0		// Test Mode inactive&lt;br /&gt;
#define TEST_MODE_ACTIVE				0x15	// Test Mode active&lt;br /&gt;
&lt;br /&gt;
// Data structure (starts at LAT_DEG):&lt;br /&gt;
#define DATA_STRUCT						LAT_DEG	// Start&lt;br /&gt;
// All data from LAT_DEG to HEARTBEAT (48 bytes):&lt;br /&gt;
#define DATA_LENGTH						(HEARTBEAT - LAT_DEG + 1)&lt;br /&gt;
// Basic data from LAT_DEG to SAT_N (13 bytes):&lt;br /&gt;
#define DATA_BASIC						(SAT_N - LAT_DEG + 1)&lt;br /&gt;
&lt;br /&gt;
typedef union {&lt;br /&gt;
 	uint8_t byte;&lt;br /&gt;
	struct {&lt;br /&gt;
		unsigned ns    :1;				// 1: North 0: South&lt;br /&gt;
		unsigned ew    :1;				// 1: East 0: West&lt;br /&gt;
		unsigned spu   :1;				// 1: km/h 0: kn&lt;br /&gt;
		unsigned auton :1;				// 1: Data not valid 0: Autonomous&lt;br /&gt;
		unsigned fix0  :1;&lt;br /&gt;
		unsigned fix1  :1;&lt;br /&gt;
		unsigned stat0 :1;				// Invalid&lt;br /&gt;
		unsigned stat1 :1;				// GPS Com Error&lt;br /&gt;
	};&lt;br /&gt;
	struct {&lt;br /&gt;
		unsigned ns    :1;				// 1: North 0: South&lt;br /&gt;
		unsigned ew    :1;				// 1: East 0: West&lt;br /&gt;
		unsigned spu   :1;				// 1: km/h 0: kn&lt;br /&gt;
		unsigned auton :1;				// 1: Data not valid 0: Autonomous&lt;br /&gt;
		unsigned fix   :2;&lt;br /&gt;
		unsigned stat  :2;				// 00 -&amp;gt; Valid&lt;br /&gt;
										// 01 -&amp;gt; Invalid&lt;br /&gt;
										// 10 -&amp;gt; GPS Com Error&lt;br /&gt;
										// 11 -&amp;gt; n. def.&lt;br /&gt;
	};&lt;br /&gt;
} status_t;&lt;br /&gt;
&lt;br /&gt;
typedef union {&lt;br /&gt;
 	uint8_t byte;&lt;br /&gt;
	struct {							// Fix indicator:&lt;br /&gt;
		unsigned fix_0  :1;				//  1: GPS fix          2: DGPS fix&lt;br /&gt;
		unsigned fix_1  :1;				//  3: PPS fix          4: RTK&lt;br /&gt;
		unsigned fix_2  :1;				//  5: Float RTK        6: Dead reck.&lt;br /&gt;
		unsigned fix_3  :1;				//  7: Manual inp. mode 8: Simul. mode&lt;br /&gt;
		unsigned unused :3;&lt;br /&gt;
		unsigned ui_fix :1;				// HW signal from UC530&lt;br /&gt;
	};&lt;br /&gt;
	struct {&lt;br /&gt;
		unsigned fix    :4;				// See above &amp;quot;Fix indicator&amp;quot;!&lt;br /&gt;
		unsigned unused :3;&lt;br /&gt;
		unsigned ui_fix :1;				// HW signal from UC530&lt;br /&gt;
	};&lt;br /&gt;
} fix_ind_t;&lt;br /&gt;
&lt;br /&gt;
typedef union {&lt;br /&gt;
	struct {&lt;br /&gt;
		uint8_t   latDeg;&lt;br /&gt;
		uint8_t   latMin;&lt;br /&gt;
		uint16_t  latMinDec;&lt;br /&gt;
		uint8_t   lonDeg;&lt;br /&gt;
		uint8_t   lonMin;&lt;br /&gt;
		uint16_t  lonMinDec;&lt;br /&gt;
		status_t  status;&lt;br /&gt;
		fix_ind_t fixInd;&lt;br /&gt;
		uint8_t   hdop;&lt;br /&gt;
		uint8_t   hdopDec;&lt;br /&gt;
		uint8_t   satCount;&lt;br /&gt;
		uint16_t  course;&lt;br /&gt;
		uint8_t   courseDec;&lt;br /&gt;
		uint16_t  speed;&lt;br /&gt;
		uint8_t   speedDec;&lt;br /&gt;
		uint16_t  altitude;&lt;br /&gt;
		uint16_t  altDif;&lt;br /&gt;
		uint8_t   utcHour;&lt;br /&gt;
		uint8_t   utcMinute;&lt;br /&gt;
		uint8_t   utcSec;&lt;br /&gt;
		uint8_t   day;&lt;br /&gt;
		uint16_t  year;&lt;br /&gt;
		uint8_t   month;&lt;br /&gt;
		uint8_t   pdop;&lt;br /&gt;
		uint8_t   pdopDec;&lt;br /&gt;
		uint8_t   vdop;&lt;br /&gt;
		uint8_t   vdopDec;&lt;br /&gt;
		uint8_t   sat[12];&lt;br /&gt;
		uint8_t   swVersion;&lt;br /&gt;
		uint8_t   heartbeat;&lt;br /&gt;
	};&lt;br /&gt;
} gpsdata_t;&lt;br /&gt;
extern gpsdata_t gpsdata;&lt;br /&gt;
&lt;br /&gt;
void I2C_GPS_reset(void);&lt;br /&gt;
void I2C_GPS_write_cmd(uint8_t, uint8_t);&lt;br /&gt;
uint8_t I2C_GPS_read_reg(uint8_t);&lt;br /&gt;
void I2C_GPS_read(uint8_t);&lt;br /&gt;
void I2C_GPS_init(void);&lt;br /&gt;
void I2C_GPS_new_addr(uint8_t);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
/******************************************************************************&lt;br /&gt;
 * Additional info&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Changelog:&lt;br /&gt;
 * &lt;br /&gt;
 *  ---&amp;gt; changes are documented in the file &amp;quot;RP6M256_I2C_GPSLib.c&amp;quot;&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
======Libary Source======&lt;br /&gt;
Datei: RP6M256_I2C_GPSLib.c&lt;br /&gt;
&amp;lt;pre&amp;gt;/* ****************************************************************************&lt;br /&gt;
 *                           _______________________&lt;br /&gt;
 *                           \| RP6  ROBOT SYSTEM |/&lt;br /&gt;
 *                            \_-_-_-_-_-_-_-_-_-_/           &amp;gt;&amp;gt;&amp;gt; RP6 M256 WIFI&lt;br /&gt;
 * ----------------------------------------------------------------------------&lt;br /&gt;
 * ----------------------------- [c]2014 - Dirk -------------------------------&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * File: RP6M256_I2C_GPSLib.c&lt;br /&gt;
 * Version: 1.0&lt;br /&gt;
 * Target: RP6 M256 WIFI - ATMEGA2560 @16.00MHz&lt;br /&gt;
 *         and a RP6 I2C GPS Receiver (CONRAD 1082385)&lt;br /&gt;
 *         optionally on a RP6 Sensor Board (CONRAD 1082384)&lt;br /&gt;
 * Author(s): Dirk&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Description:&lt;br /&gt;
 * &lt;br /&gt;
 * This is our new Library that contains basic routines and functions for&lt;br /&gt;
 * accessing the RP6 I2C GPS Receiver JM3-GPS (CONRAD 1082385).&lt;br /&gt;
 * The library assumes the I2C GPS Receiver software (firmware) v1.2.&lt;br /&gt;
 * If the I2C GPS Receiver is located on the RP6 Sensor Board (CONRAD 1082384)&lt;br /&gt;
 * and connected to the I2C-MODULE plug M1, the RP6M256_Sensor_BoardLib has to&lt;br /&gt;
 * be included!&lt;br /&gt;
 * &lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Includes:&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6M256_I2C_GPSLib.h&amp;quot; 		&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Variables:&lt;br /&gt;
&lt;br /&gt;
uint8_t gpsdataBuf[DATA_LENGTH + 1]; &lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Software reset for the I2C GPS Receiver.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void I2C_GPS_reset(void)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_GPS_RECEIVER_ADR, 0, 0x06);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Writes a command cmd to a register reg of the&lt;br /&gt;
 * I2C GPS Receiver.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: reg -&amp;gt; Write register [0x90..0x96]&lt;br /&gt;
 *        cmd -&amp;gt; Command&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void I2C_GPS_write_cmd(uint8_t reg, uint8_t cmd)&lt;br /&gt;
{&lt;br /&gt;
	if((reg &amp;lt; INIT_CFG) || (reg &amp;gt; TEST_MODE)) return;&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_GPS_RECEIVER_ADR, reg, cmd);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Reads a single register reg from the I2C GPS&lt;br /&gt;
 * Receiver.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: reg -&amp;gt; Read register [0x20..0x50]&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
uint8_t I2C_GPS_read_reg(uint8_t reg)&lt;br /&gt;
{&lt;br /&gt;
	if((reg &amp;lt; WHO_AM_I) || (reg &amp;gt; HEARTBEAT)) reg = WHO_AM_I;&lt;br /&gt;
	I2CTWI_transmitByte(I2C_GPS_RECEIVER_ADR, reg);&lt;br /&gt;
	return (I2CTWI_readByte(I2C_GPS_RECEIVER_ADR));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
gpsdata_t gpsdata;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Reads the GPS data from the I2C GPS Receiver.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: length -&amp;gt; Number of data bytes [1..48]&lt;br /&gt;
 *&lt;br /&gt;
 * Hint: If length = DATA_BASIC, only basic GPS&lt;br /&gt;
 *       data are read. If length = DATA_LENGTH,&lt;br /&gt;
 *       ALL GPS data are read.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void I2C_GPS_read(uint8_t length)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t i;&lt;br /&gt;
&lt;br /&gt;
	if(length &amp;gt; DATA_LENGTH) length = DATA_LENGTH;&lt;br /&gt;
	I2CTWI_readRegisters(I2C_GPS_RECEIVER_ADR, DATA_STRUCT, gpsdataBuf, length);&lt;br /&gt;
	for(i = length; i &amp;lt; DATA_LENGTH; i++) {&lt;br /&gt;
		gpsdataBuf[i] = 0;&lt;br /&gt;
	}&lt;br /&gt;
	gpsdata.latDeg = gpsdataBuf[0];&lt;br /&gt;
	gpsdata.latMin = gpsdataBuf[1];&lt;br /&gt;
	gpsdata.latMinDec = gpsdataBuf[2] + (gpsdataBuf[3] &amp;lt;&amp;lt; 8);&lt;br /&gt;
	gpsdata.lonDeg = gpsdataBuf[4];&lt;br /&gt;
	gpsdata.lonMin = gpsdataBuf[5];&lt;br /&gt;
	gpsdata.lonMinDec = gpsdataBuf[6] + (gpsdataBuf[7] &amp;lt;&amp;lt; 8);&lt;br /&gt;
	gpsdata.status.byte = gpsdataBuf[8];&lt;br /&gt;
	gpsdata.fixInd.byte = gpsdataBuf[9];&lt;br /&gt;
	gpsdata.hdop = gpsdataBuf[10];&lt;br /&gt;
	gpsdata.hdopDec = gpsdataBuf[11];&lt;br /&gt;
	gpsdata.satCount = gpsdataBuf[12];&lt;br /&gt;
	if(length == DATA_BASIC) return;&lt;br /&gt;
	gpsdata.course = gpsdataBuf[13] + (gpsdataBuf[14] &amp;lt;&amp;lt; 8);&lt;br /&gt;
	gpsdata.courseDec = gpsdataBuf[15];&lt;br /&gt;
	gpsdata.speed = gpsdataBuf[16] + (gpsdataBuf[17] &amp;lt;&amp;lt; 8);&lt;br /&gt;
	gpsdata.speedDec = gpsdataBuf[18];&lt;br /&gt;
	gpsdata.altitude = gpsdataBuf[19] + (gpsdataBuf[20] &amp;lt;&amp;lt; 8);&lt;br /&gt;
	gpsdata.altDif = gpsdataBuf[21] + (gpsdataBuf[22] &amp;lt;&amp;lt; 8);&lt;br /&gt;
	gpsdata.utcHour = gpsdataBuf[23];&lt;br /&gt;
	gpsdata.utcMinute = gpsdataBuf[24];&lt;br /&gt;
	gpsdata.utcSec = gpsdataBuf[25];&lt;br /&gt;
	gpsdata.day = gpsdataBuf[26];&lt;br /&gt;
	gpsdata.year = gpsdataBuf[27] + (gpsdataBuf[28] * 100);&lt;br /&gt;
	gpsdata.month = gpsdataBuf[29];&lt;br /&gt;
	gpsdata.pdop = gpsdataBuf[30];&lt;br /&gt;
	gpsdata.pdopDec = gpsdataBuf[31];&lt;br /&gt;
	gpsdata.vdop = gpsdataBuf[32];&lt;br /&gt;
	gpsdata.vdopDec = gpsdataBuf[33];&lt;br /&gt;
	for(i = 34; i &amp;lt; 46; i++) {&lt;br /&gt;
		gpsdata.sat[i - 34] = gpsdataBuf[i];&lt;br /&gt;
	}&lt;br /&gt;
	gpsdata.swVersion = gpsdataBuf[46];&lt;br /&gt;
	gpsdata.heartbeat = gpsdataBuf[47];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * You MUST call this function at the beginning of a&lt;br /&gt;
 * main program, that uses the RP6 I2C GPS Receiver. &lt;br /&gt;
 * If SENSOR_BOARD is defined, the I2C-MODULE power&lt;br /&gt;
 * will be switched on with the function&lt;br /&gt;
 * setI2CModulePower() defined in the&lt;br /&gt;
 * RP6M256_Sensor_BoardLib, which will be included&lt;br /&gt;
 * then.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void I2C_GPS_init(void)&lt;br /&gt;
{&lt;br /&gt;
#ifdef SENSOR_BOARD&lt;br /&gt;
	// I2C-MODULE (plug M1) power on: &lt;br /&gt;
	setI2CModulePower(1);&lt;br /&gt;
#endif&lt;br /&gt;
	// Other init procedures here!&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Writes a new I2C address to the I2C GPS Receiver.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: addr -&amp;gt; New I2C address [0xc8..0xde]&lt;br /&gt;
 *&lt;br /&gt;
 * Hints: - Default I2C address is 0xc8.&lt;br /&gt;
 *        - You may choose a new I2C address in&lt;br /&gt;
 *          the range 0xc8..0xde.&lt;br /&gt;
 *        - After writing a new address you have&lt;br /&gt;
 *          to switch the I2C GPS Receiver off&lt;br /&gt;
 *          and on again.&lt;br /&gt;
 *        - Definition I2C_GPS_RECEIVER_ADR must&lt;br /&gt;
 *          be adapted to the new I2C address!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void I2C_GPS_new_addr(uint8_t addr)&lt;br /&gt;
{&lt;br /&gt;
	if((addr &amp;lt; 0xc8) || (addr &amp;gt; 0xde)) return;&lt;br /&gt;
	addr &amp;amp;= 0xfe;								// Clear R/W bit&lt;br /&gt;
	I2CTWI_transmit3Bytes(I2C_GPS_RECEIVER_ADR, 0, 0x04, addr);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&lt;br /&gt;
/******************************************************************************&lt;br /&gt;
 * Additional info&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Changelog:&lt;br /&gt;
 * - v. 1.0 (initial release) 21.04.2014 by Dirk&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Erklärung&lt;br /&gt;
&lt;br /&gt;
======Demo======&lt;br /&gt;
makefile:&lt;br /&gt;
&amp;lt;pre&amp;gt;...&lt;br /&gt;
TARGET = RP6M256_Sensor_Board_02&lt;br /&gt;
...&lt;br /&gt;
SRC += $(RP6_LIB_PATH)/RP6common/RP6I2CmasterTWI.c&lt;br /&gt;
&lt;br /&gt;
SRC += $(RP6_LIB_PATH)/RP6control_M256_WIFI/RP6M256_Sensor_BoardLib.c&lt;br /&gt;
SRC += $(RP6_LIB_PATH)/RP6control_M256_WIFI/RP6M256_I2C_GPSLib.c&lt;br /&gt;
...&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Datei: RP6M256_Sensor_Board_02.c&lt;br /&gt;
&amp;lt;pre&amp;gt;/* &lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * RP6 ROBOT SYSTEM - RP6 CONTROL M256 Examples&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Example: RP6M256 Sensor Board&lt;br /&gt;
 * Author(s): Dirk&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Description:&lt;br /&gt;
 * In this example we show a second test for the RP6 Sensor Board.&lt;br /&gt;
 * &lt;br /&gt;
 * ############################################################################&lt;br /&gt;
 * The Robot does NOT move in this example! You can simply put it on a table&lt;br /&gt;
 * next to your PC and you should connect it to the PC via the USB Interface!&lt;br /&gt;
 * You should also connect to it via WIFI.&lt;br /&gt;
 * ############################################################################&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Includes:&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6M256Lib.h&amp;quot; 				// The RP6 M256 Library. &lt;br /&gt;
										// Always needs to be included!&lt;br /&gt;
#include &amp;quot;RP6I2CmasterTWI.h&amp;quot;			// Include the I2C-Bus Master Library&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Include our new &amp;quot;RP6M256 I2C GPS Receiver library&amp;quot;:&lt;br /&gt;
// (This is the library for accessing the RP6 I2C GPS Receiver!)&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6M256_I2C_GPSLib.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Write a floating point number to the WIFI.&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *&lt;br /&gt;
 *			// Write a floating point number to the WIFI (no exponent):&lt;br /&gt;
 *			writeDouble_WIFI(1234567.890, 11, 3);&lt;br /&gt;
 *&lt;br /&gt;
 * The value of prec (precision) defines the number of decimal places.&lt;br /&gt;
 * For 32 bit floating point variables (float, double ...) 6 is&lt;br /&gt;
 * the max. value for prec (7 relevant digits).&lt;br /&gt;
 * The value of width defines the overall number of characters in the&lt;br /&gt;
 * floating point number including the decimal point. The number of&lt;br /&gt;
 * pre-decimal positions is: (width - prec - 1).&lt;br /&gt;
 */&lt;br /&gt;
void writeDouble_WIFI(double number, uint8_t width, uint8_t prec)&lt;br /&gt;
{char buffer[width + 1];&lt;br /&gt;
	dtostrf(number, width, prec, &amp;amp;buffer[0]);&lt;br /&gt;
	writeString_WIFI(&amp;amp;buffer[0]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Write a floating point number to the LCD.&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *&lt;br /&gt;
 *			// Write a floating point number to the LCD (no exponent):&lt;br /&gt;
 *			writeDoubleLCD(1234567.890, 11, 3);&lt;br /&gt;
 *&lt;br /&gt;
 * The value of prec (precision) defines the number of decimal places.&lt;br /&gt;
 * For 32 bit floating point variables (float, double ...) 6 is&lt;br /&gt;
 * the max. value for prec (7 relevant digits).&lt;br /&gt;
 * The value of width defines the overall number of characters in the&lt;br /&gt;
 * floating point number including the decimal point. The number of&lt;br /&gt;
 * pre-decimal positions is: (width - prec - 1).&lt;br /&gt;
 */&lt;br /&gt;
void writeDoubleLCD(double number, uint8_t width, uint8_t prec)&lt;br /&gt;
{char buffer[width + 1];&lt;br /&gt;
	dtostrf(number, width, prec, &amp;amp;buffer[0]);&lt;br /&gt;
	writeStringLCD(&amp;amp;buffer[0]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Error handler&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function gets called automatically if there was an I2C Error like&lt;br /&gt;
 * the slave sent a &amp;quot;not acknowledge&amp;quot; (NACK, error codes e.g. 0x20 or 0x30).&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void I2C_transmissionError(uint8_t errorState)&lt;br /&gt;
{&lt;br /&gt;
	writeString_P_WIFI(&amp;quot;\nI2C ERROR - TWI STATE: 0x&amp;quot;);&lt;br /&gt;
	writeInteger_WIFI(errorState, HEX);&lt;br /&gt;
	writeChar_WIFI('\n');&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Main function - The program starts here:&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
	initRP6M256();    // Always call this first! The Processor will not work&lt;br /&gt;
					  // correctly otherwise. &lt;br /&gt;
&lt;br /&gt;
	initLCD(); // Initialize the LC-Display (LCD)&lt;br /&gt;
			   // Always call this before using the LCD!&lt;br /&gt;
&lt;br /&gt;
	setLEDs(0b1111);&lt;br /&gt;
	mSleep(500);&lt;br /&gt;
	setLEDs(0b0000);&lt;br /&gt;
&lt;br /&gt;
	writeString_P_WIFI(&amp;quot;\n\nRP6 Sensor Board Selftest 2!\n&amp;quot;); &lt;br /&gt;
&lt;br /&gt;
	// IMPORTANT:&lt;br /&gt;
	I2CTWI_initMaster(100); // Initialize the TWI Module for Master operation&lt;br /&gt;
							// with 100kHz SCL Frequency&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	// Register the event handler:&lt;br /&gt;
	I2CTWI_setTransmissionErrorHandler(I2C_transmissionError);&lt;br /&gt;
&lt;br /&gt;
	setLEDs(0b1111);&lt;br /&gt;
&lt;br /&gt;
	// Write a text message to the LCD:&lt;br /&gt;
	showScreenLCD(&amp;quot;################&amp;quot;, &amp;quot;################&amp;quot;);&lt;br /&gt;
	mSleep(1500);&lt;br /&gt;
	showScreenLCD(&amp;quot;RP6v2-M256-WIFI &amp;quot;, &amp;quot;Example Program&amp;quot;);&lt;br /&gt;
	mSleep(2500); &lt;br /&gt;
	showScreenLCD(&amp;quot;RP6 Sensor Board&amp;quot;, &amp;quot;   Selftest 2&amp;quot;);&lt;br /&gt;
	mSleep(2500);&lt;br /&gt;
	clearLCD();&lt;br /&gt;
&lt;br /&gt;
	setLEDs(0b0000);&lt;br /&gt;
&lt;br /&gt;
	// ---------------------------------------&lt;br /&gt;
&lt;br /&gt;
	uint8_t onoff = 0;&lt;br /&gt;
	uint8_t i;&lt;br /&gt;
&lt;br /&gt;
	startStopwatch1();&lt;br /&gt;
	startStopwatch2();&lt;br /&gt;
&lt;br /&gt;
	// IMPORTANT:&lt;br /&gt;
	sensor_board_init();						// RP6 Sensor Board init!!!&lt;br /&gt;
	I2C_GPS_init();								// RP6 I2C GPS Receiver init&lt;br /&gt;
&lt;br /&gt;
	while(true) &lt;br /&gt;
	{&lt;br /&gt;
		if(getStopwatch1() &amp;gt; 1000) // 1s&lt;br /&gt;
		{&lt;br /&gt;
			if (onoff) onoff = 0;&lt;br /&gt;
			else onoff = 1;&lt;br /&gt;
&lt;br /&gt;
			// Show GPS data:&lt;br /&gt;
			I2C_GPS_read(DATA_LENGTH);			// Read data&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nLAT_DEG:     &amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.latDeg, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;° &amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.latMin, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;.&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.latMinDec, DEC, 4);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;' &amp;quot;);&lt;br /&gt;
			if(gpsdata.status.ns)&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;N&amp;quot;);&lt;br /&gt;
			else&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;S&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nLON_DEG:    &amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.lonDeg, DEC, 3);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;° &amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.lonMin, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;.&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.lonMinDec, DEC, 4);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;' &amp;quot;);&lt;br /&gt;
			if(gpsdata.status.ew)&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;E&amp;quot;);&lt;br /&gt;
			else&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;W&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nSTATUS:     &amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.status.byte, BIN, 8);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nFIX_IND:    &amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.fixInd.byte, BIN, 8);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nHDOP:       &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(gpsdata.hdop, DEC);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;.&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.hdopDec, DEC, 2);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nSAT_N:      &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(gpsdata.satCount, DEC);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nCOURSE_T:   &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(gpsdata.course, DEC);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;.&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.courseDec, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;°&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nSPEED:      &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(gpsdata.speed, DEC);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;.&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.speedDec, DEC, 2);&lt;br /&gt;
			if(gpsdata.status.spu)&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;km/h&amp;quot;);&lt;br /&gt;
			else&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;kn&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nALT:        &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(gpsdata.altitude, DEC);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;m\nALT_DIF:    &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(gpsdata.altDif, DEC);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;m\nUTC:        &amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.utcHour, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;:&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.utcMinute, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;:&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.utcSec, DEC, 2);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nDATE:       &amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.day, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;.&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.month, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;.&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.year, DEC, 4);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nPDOP:       &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(gpsdata.pdop, DEC);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;.&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.pdopDec, DEC, 2);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nVDOP:       &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(gpsdata.vdop, DEC);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;.&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.vdopDec, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			for(i = 0; i &amp;lt; gpsdata.satCount; i++) {&lt;br /&gt;
				if(i == 8) writeString_P_WIFI(&amp;quot;\n&amp;quot;);&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;  SAT_&amp;quot;);&lt;br /&gt;
				writeIntegerLength_WIFI(i + 1, HEX, 1);&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;: &amp;quot;);&lt;br /&gt;
				writeInteger_WIFI(gpsdata.sat[i], DEC);&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nSW_VERSION: &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(gpsdata.swVersion, DEC);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nHEARTBEAT:  &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(gpsdata.heartbeat, DEC);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			// RP6 Sensor Board shutdown (button &amp;amp; status LED test):&lt;br /&gt;
			if (pressedButton) {&lt;br /&gt;
				setStatusLED(1);&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;\nPress button again for RP6 Sensor Board SHUTDOWN!\n&amp;quot;);&lt;br /&gt;
				mSleep(2000);&lt;br /&gt;
				do {&lt;br /&gt;
					if(getStopwatch2() &amp;gt; 200) { // 0.2s&lt;br /&gt;
						if (onoff) onoff = 0;&lt;br /&gt;
						else onoff = 1;&lt;br /&gt;
						if (onoff) setStatusLED(1);&lt;br /&gt;
						else setStatusLED(0);&lt;br /&gt;
						setStopwatch2(0);&lt;br /&gt;
					}&lt;br /&gt;
					mSleep(1);&lt;br /&gt;
					task_I2CTWI();&lt;br /&gt;
				} while (!readButton());&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;\n\n\n\n\nPlease wait for RP6 Sensor Board SHUTDOWN...\n&amp;quot;);&lt;br /&gt;
				sensor_board_shutdown();&lt;br /&gt;
				mSleep(3000);&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;\n\n\nThe RP6 Sensor Board now is in SHUTDOWN MODE!!!\n&amp;quot;);&lt;br /&gt;
				mSleep(1000);&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;\nRESET the M256 microcontroller now...\n\n&amp;quot;);&lt;br /&gt;
				while(true) {};&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			setStopwatch1(0);&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		task_RP6SensorBoard();					// RP6 Sensor Board task&lt;br /&gt;
&lt;br /&gt;
		task_I2CTWI();&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Erklärung&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Gyro Modul JM3-GYRO====&lt;br /&gt;
=====Dokumentation=====&lt;br /&gt;
Die Dokumentation zum Gyro Modul befindet sich auf der mitgelieferten ''&amp;quot;RP6 Robot System Xtra Modules CD-ROM&amp;quot;''.&lt;br /&gt;
&lt;br /&gt;
======Manuals======&lt;br /&gt;
Das Handbuch in der aktuellen Version kann [http://www.jm3-engineering.com/download/doc/ManualGyroModule_de.pdf hier] eingesehen werden.&lt;br /&gt;
&lt;br /&gt;
=====Demo-Programme=====&lt;br /&gt;
Ein Demo-Programm zum Gyro Modul befindet sich integriert in die RP6 Sensor Board Demo auf der mitgelieferten ''&amp;quot;RP6 Robot System Xtra Modules CD-ROM&amp;quot;''. Diese Demo kann auch in der aktuellen Version im Download Bereich von [http://www.jm3-engineering.com/downloads.htm JM3 Engineering] herunter geladen werden.&lt;br /&gt;
&lt;br /&gt;
=====Analoge Auswertung=====&lt;br /&gt;
Am Pin ''OUT'' des Gyro Moduls (siehe [http://www.rn-wissen.de/index.php/RP6_Sensor_Board_und_Xtra_Module#Anschluss-Schema_2 Anschluss-Schema]!) liegt die Ausgangsspannung des Sensors (0..5V) an. Sie kann mit einem ADC-Eingang eines Microcontrollers gemessen werden.&lt;br /&gt;
Syntax mit den Libraries der RP6Base, M32 oder M256 WiFi (ADC Kanal 0):&lt;br /&gt;
 uint16_t result = readADC(0);&lt;br /&gt;
In der C-Control-Pro Umgebung der M128 sieht das z.B. in CompactC so aus (ADC Kanal 0):&lt;br /&gt;
 word result;&lt;br /&gt;
 ADC_Set(ADC_VREF_VCC, 0);&lt;br /&gt;
 ...&lt;br /&gt;
 result = ADC_Read();&lt;br /&gt;
Das Ergebnis ''result'' kann noch zur Weiterverarbeitung angepasst werden:&lt;br /&gt;
 #define ADCVAL_ZERORATE_LEVEL			511		// Zero rate Level&lt;br /&gt;
 ...&lt;br /&gt;
 int16_t z_axisg = result - ADCVAL_ZERORATE_LEVEL;&lt;br /&gt;
Dadurch zeigt ''z_axisg'' Null an, wenn keine Rotation anliegt und wird positiv, wenn nach LINKS gedreht wird und negativ bei RECHTS-Drehung. Die Definition ADCVAL_ZERORATE_LEVEL muss natürlich an den eigenen Sensor-Nullwert angepasst werden.&lt;br /&gt;
&lt;br /&gt;
Aus dem Absolutwert von ''z_axisg'' kann man die Drehrate (Drehgeschwindigkeit) auch bestimmen:&lt;br /&gt;
&lt;br /&gt;
In den [[RP6_Sensor_Board_und_Xtra_Module#Technische_Daten_3|Technischen Daten]] ist die Empfindlichkeit des Sensors mit '''10mV/dps''' (0,01V pro Grad und Sekunde) angegeben. Damit errechnet sich die Drehrate als:&lt;br /&gt;
 Drehrate [dps] = abs(z_axisg) * (5 / 1024 / 0.01) = abs(z_axisg) * 0.48828125&lt;br /&gt;
&lt;br /&gt;
=====Optionale Ansteuerung=====&lt;br /&gt;
Im [[RP6_Sensor_Board_und_Xtra_Module#Anschluss-Schema_2|Anschluss-Schema]] ist erkennbar, dass es noch 2 Steuerleitungen ''SLEEP/PD'' und ''ST'' gibt. Mit diesen Anschlüssen kann die Betriebsart des Gyro Moduls festgelegt werden, siehe nachfolgende Tabelle:&lt;br /&gt;
{|  {{Blauetabelle}} &lt;br /&gt;
|Betriebsart&lt;br /&gt;
|ST&lt;br /&gt;
|SLEEP/PD&lt;br /&gt;
|Stromverbrauch&lt;br /&gt;
|-&lt;br /&gt;
|Normal&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|4,2mA&lt;br /&gt;
|-&lt;br /&gt;
|Sleep&lt;br /&gt;
|0&lt;br /&gt;
|1&lt;br /&gt;
|2,2mA&lt;br /&gt;
|-&lt;br /&gt;
|Self-test&lt;br /&gt;
|1&lt;br /&gt;
|0&lt;br /&gt;
|4,2mA&lt;br /&gt;
|-&lt;br /&gt;
|Power-down&lt;br /&gt;
|1&lt;br /&gt;
|1&lt;br /&gt;
|'''5µA'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
Will man zwischen den Betriebsarten per Software umschalten, muss man die beiden Steuerleitungen mit I/O Portpins des Microcontrollers verbinden, die als Ausgänge konfiguriert sind. Braucht man diese Funktion nicht, reicht es, ''ST'' und ''SLEEP/PD'' mit GND zu verbinden (Betriebsart &amp;quot;Normal&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====3D Accelerometer Modul JM3-3DA====&lt;br /&gt;
Das 3D Accelerometer Modul kann über den I2C- oder den SPI-Bus angesteuert werden. Wird das Modul auf der RP6 CONTROL M32 Platine betrieben (es sitzt also auf dem Sockel IC5 für das 2. SPI-EEPROM), dann erfolgt die Ansteuerung über den SPI-Bus. Die SPI-Grundfunktionen befinden sich in der RP6ControlLib, die daher eingebunden werden muss.&lt;br /&gt;
&lt;br /&gt;
=====Dokumentation=====&lt;br /&gt;
Die Dokumentation zum 3D Accelerometer Modul befindet sich auf der mitgelieferten ''&amp;quot;RP6 Robot System Xtra Modules CD-ROM&amp;quot;''.&lt;br /&gt;
&lt;br /&gt;
======Manuals======&lt;br /&gt;
Das Handbuch in der aktuellen Version kann [http://www.jm3-engineering.com/download/doc/Manual3DAccelerometer_de.pdf hier] eingesehen werden.&lt;br /&gt;
&lt;br /&gt;
=====Demo-Programme=====&lt;br /&gt;
Ein Demo-Programm zum 3D Accelerometer Modul befindet sich integriert in die RP6 Sensor Board Demo auf der mitgelieferten ''&amp;quot;RP6 Robot System Xtra Modules CD-ROM&amp;quot;''. Diese Demo kann auch in der aktuellen Version im Download Bereich von [http://www.jm3-engineering.com/downloads.htm JM3 Engineering] herunter geladen werden.&lt;br /&gt;
&lt;br /&gt;
=====RP6 CONTROL M32: ACCSENS Library=====&lt;br /&gt;
Die nachfolgende RP6ControlACCSENSLib (Eigenentwicklung in GCC) dient zur Ansteuerung des 3D Accelerometer Moduls durch die RP6 CONTROL M32.&lt;br /&gt;
&lt;br /&gt;
======Configuration Header======&lt;br /&gt;
Vor dem Kompilieren der Library muss eine Anpassung des Configuration Headers an die eigenen Hardware-Voraussetzungen erfolgen.&lt;br /&gt;
Dazu gibt es im Configuration Header eine Definition:&lt;br /&gt;
* EXP_STACK_1 -&amp;gt; Die RP6 CONTROL M32 sitzt auf dem vorderen Platinenstapel 1 des RP6&lt;br /&gt;
Im nachfolgenden Listing ist die Definition EXP_STACK_1 NICHT aktiv (d.h. die M32 sitzt auf dem hinteren Platinenstapel 2!). Dies muss an die eigene Hardware angepaßt werden. Wenn die RP6 CONTROL M32 auf dem vorderen Platinenstapel 1 des RP6 sitzt, muss die Zeile mit &amp;quot;EXP_STACK_1&amp;quot; &amp;quot;aktiviert&amp;quot; werden. Dazu entfernt man &amp;quot;//&amp;quot; am Zeilenanfang:&lt;br /&gt;
 #define EXP_STACK_1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Bevor man den Beschleunigungssensor nutzen kann, muss man ihn kalibrieren:&lt;br /&gt;
&lt;br /&gt;
'''Accelerometer:'''&lt;br /&gt;
* Die X-Achse wird kalibriert, indem man den RP6 mit der rechten Seite nach unten hält und den Maximalwert in MAX_X_A einträgt. Dann neigt man ihn auf seine linke Seite und trägt den negativen Maximalwert in MIN_X_A ein.&lt;br /&gt;
* Die Y-Achse wird kalibriert, indem man den RP6 mit der Vorderseite nach oben hält und den Maximalwert in MAX_Y_A einträgt. Dann kippt man die Vorderseite nach unten und trägt den negativen Maximalwert in MIN_Y_A ein.&lt;br /&gt;
* Die Z-Achse wird kalibriert, indem man den RP6 normal waagerecht hält und den Maximalwert in MAX_Z_A einträgt. Dann dreht man den RP6 &amp;quot;auf den Kopf&amp;quot; und trägt den negativen Maximalwert in MIN_Z_A ein.&lt;br /&gt;
* Sollten die angezeigten Pitch- und Roll-Werte nach der Kalibrierung der Achsen und genau waagerecht stehendem Sensor bzw. RP6 vom Nullwert deutlich abweichen, kann man sie mithilfe der Definitionen OFFSET_PITCH_A und OFFSET_ROLL_A &amp;quot;nullen&amp;quot;. Die Einheit dieser Definitionen ist °.&lt;br /&gt;
Nach dem Eintragen der Kalibrierungswerte muss das Programm neu kompiliert werden!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Datei: RP6ControlACCSENS.h&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;/* ****************************************************************************&lt;br /&gt;
 *                           _______________________&lt;br /&gt;
 *                           \| RP6  ROBOT SYSTEM |/&lt;br /&gt;
 *                            \_-_-_-_-_-_-_-_-_-_/             &amp;gt;&amp;gt;&amp;gt; RP6 CONTROL&lt;br /&gt;
 * ----------------------------------------------------------------------------&lt;br /&gt;
 * ----------------------------- [c]2014 - Dirk -------------------------------&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * File: RP6ControlACCSENS.h&lt;br /&gt;
 * Version: 1.0&lt;br /&gt;
 * Target: RP6 CONTROL - ATMEGA32 @16.00MHz&lt;br /&gt;
 * Author(s): Dirk&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Description:&lt;br /&gt;
 * Configuration header file for new ACCSENS library.&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * THE CHANGELOG CAN BE FOUND AT THE END OF THIS FILE!&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
#ifndef RP6CONTROLACCSENS_H&lt;br /&gt;
#define RP6CONTROLACCSENS_H&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Sensor position on the RP6 robot:&lt;br /&gt;
// (If EXP_STACK_1 is defined, the RP6 CONTROL M32 is located on the front&lt;br /&gt;
//  stack for addon boards on the RP6 robot. If EXP_STACK_1 is NOT defined&lt;br /&gt;
//  (default), the RP6 CONTROL M32 is mounted on the rear stack.)&lt;br /&gt;
// -------------------&lt;br /&gt;
//#define EXP_STACK_1&lt;br /&gt;
// -------------------&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// The following sensor is used:&lt;br /&gt;
// - 3D Accelerometer Modul (CONRAD 1082387-62) with LIS302DLH 3-axis&lt;br /&gt;
//   accelerometer&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// LIS302DLH accelerometer calibration data:&lt;br /&gt;
#define MAX_X_A						32767		// Max. X-axis value&lt;br /&gt;
#define MIN_X_A						-32768		// Min. X-axis value&lt;br /&gt;
#define MAX_Y_A						32767		// Max. Y-axis value&lt;br /&gt;
#define MIN_Y_A						-32768		// Min. Y-axis value&lt;br /&gt;
#define MAX_Z_A						32767		// Max. Z-axis value&lt;br /&gt;
#define MIN_Z_A						-32768		// Min. Z-axis value&lt;br /&gt;
#define OFFSET_PITCH_A				0.0			// Offset Pitch [°]&lt;br /&gt;
#define OFFSET_ROLL_A				0.0			// Offset Roll [°]&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
/******************************************************************************&lt;br /&gt;
 * Additional info&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Changelog:&lt;br /&gt;
 * &lt;br /&gt;
 *  ---&amp;gt; changes are documented in the file &amp;quot;RP6ControlACCSENSLib.c&amp;quot;&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
======Library Header======&lt;br /&gt;
Datei: RP6ControlACCSENSLib.h&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;/* ****************************************************************************&lt;br /&gt;
 *                           _______________________&lt;br /&gt;
 *                           \| RP6  ROBOT SYSTEM |/&lt;br /&gt;
 *                            \_-_-_-_-_-_-_-_-_-_/             &amp;gt;&amp;gt;&amp;gt; RP6 CONTROL&lt;br /&gt;
 * ----------------------------------------------------------------------------&lt;br /&gt;
 * ----------------------------- [c]2014 - Dirk -------------------------------&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * File: RP6ControlACCSENSLib.h&lt;br /&gt;
 * Version: 1.0&lt;br /&gt;
 * Target: RP6 CONTROL - ATMEGA32 @16.00MHz&lt;br /&gt;
 * Author(s): Dirk&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Description:&lt;br /&gt;
 * This is the RP6ControlACCSENSLib header file.&lt;br /&gt;
 * You have to include this file, if you want to use the library&lt;br /&gt;
 * RP6ControlACCSENSLib.c in your own projects.&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * THE CHANGELOG CAN BE FOUND AT THE END OF THIS FILE!&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
#ifndef RP6CONTROLACCSENSLIB_H&lt;br /&gt;
#define RP6CONTROLACCSENSLIB_H&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Includes:&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6ControlLib.h&amp;quot; 		// The RP6 Control Library (v. 1.1 or higher). &lt;br /&gt;
#include &amp;quot;RP6ControlACCSENS.h&amp;quot;&lt;br /&gt;
#include &amp;lt;math.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&lt;br /&gt;
#define ACC_CS							MEM_CS2&lt;br /&gt;
#define DEVICE_IDENTIFIER				0x32&lt;br /&gt;
&lt;br /&gt;
// Registers:&lt;br /&gt;
#define WHO_AM_I						0x0f&lt;br /&gt;
#define CTRL_REG1						0x20&lt;br /&gt;
#define CTRL_REG2						0x21&lt;br /&gt;
#define CTRL_REG3						0x22&lt;br /&gt;
#define CTRL_REG4						0x23&lt;br /&gt;
#define CTRL_REG5						0x24&lt;br /&gt;
#define HP_FILTER_RESET					0x25&lt;br /&gt;
#define REFERENCE						0x26&lt;br /&gt;
#define STATUS_REG						0x27&lt;br /&gt;
#define OUT_X_L							0x28&lt;br /&gt;
#define OUT_X_H							0x29&lt;br /&gt;
#define OUT_Y_L							0x2a&lt;br /&gt;
#define OUT_Y_H							0x2b&lt;br /&gt;
#define OUT_Z_L							0x2c&lt;br /&gt;
#define OUT_Z_H							0x2d&lt;br /&gt;
#define INT1_CFG						0x30&lt;br /&gt;
#define INT1_SOURCE						0x31&lt;br /&gt;
#define INT1_THS						0x32&lt;br /&gt;
#define INT1_DURATION					0x33&lt;br /&gt;
#define INT2_CFG						0x34&lt;br /&gt;
#define INT2_SOURCE						0x35&lt;br /&gt;
#define INT2_THS						0x36&lt;br /&gt;
#define INT2_DURATION					0x37&lt;br /&gt;
&lt;br /&gt;
// Control Register bitmasks:&lt;br /&gt;
#define CTRL_REG1_POWERDOWN				0b00000000&lt;br /&gt;
#define CTRL_REG1_3D_DEFAULT			0b00000111&lt;br /&gt;
#define CTRL_REG1_3D_LOPWR_10HZ			0b11000111&lt;br /&gt;
#define CTRL_REG2_DEFAULT				0b00000000&lt;br /&gt;
#define CTRL_REG3_DEFAULT				0b00000000&lt;br /&gt;
#define CTRL_REG4_DEFAULT				0b00000000&lt;br /&gt;
#define CTRL_REG4_BDU_2G				0b10000000&lt;br /&gt;
#define CTRL_REG4_BDU_2G_STSIGN			0b10001000&lt;br /&gt;
#define CTRL_REG4_BDU_BLE_2G			0b11000000&lt;br /&gt;
#define CTRL_REG4_BDU_BLE_2G_STSIGN		0b11001000&lt;br /&gt;
#define CTRL_REG5_DEFAULT				0b00000000&lt;br /&gt;
&lt;br /&gt;
// Read/write address bitmasks:&lt;br /&gt;
#define READ_MASK						0b10000000&lt;br /&gt;
#define READ_AUTOINC_MASK				0b11000000&lt;br /&gt;
#define WRITE_MASK						0b01111111&lt;br /&gt;
&lt;br /&gt;
extern int16_t x_axisa, y_axisa, z_axisa;&lt;br /&gt;
extern double pitch, roll;&lt;br /&gt;
extern double xa, ya, za;&lt;br /&gt;
extern double the, phi;&lt;br /&gt;
&lt;br /&gt;
uint8_t SPI_ACCSENS_readByte(uint8_t regAddr);&lt;br /&gt;
void SPI_ACCSENS_readBytes(uint8_t startAddr, uint8_t *buffer, uint8_t length);&lt;br /&gt;
void SPI_ACCSENS_writeByte(uint8_t regAddr, uint8_t data);&lt;br /&gt;
uint8_t SPI_ACCSENS_getStatus(void);&lt;br /&gt;
&lt;br /&gt;
void SPI_ACCSENS_init(void);&lt;br /&gt;
void SPI_ACCSENS_shutdown(void);&lt;br /&gt;
void SPI_ACCSENS_read(void);&lt;br /&gt;
void SPI_ACCSENS_normalize(void);&lt;br /&gt;
void SPI_ACCSENS_position(void);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
/******************************************************************************&lt;br /&gt;
 * Additional info&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Changelog:&lt;br /&gt;
 * &lt;br /&gt;
 *  ---&amp;gt; changes are documented in the file &amp;quot;RP6ControlACCSENSLib.c&amp;quot;&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
======Library Source======&lt;br /&gt;
Datei: RP6ControlACCSENSLib.c&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;/* ****************************************************************************&lt;br /&gt;
 *                           _______________________&lt;br /&gt;
 *                           \| RP6  ROBOT SYSTEM |/&lt;br /&gt;
 *                            \_-_-_-_-_-_-_-_-_-_/             &amp;gt;&amp;gt;&amp;gt; RP6 CONTROL&lt;br /&gt;
 * ----------------------------------------------------------------------------&lt;br /&gt;
 * ----------------------------- [c]2014 - Dirk -------------------------------&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * File: RP6ControlACCSENSLib.c&lt;br /&gt;
 * Version: 1.0&lt;br /&gt;
 * Target: RP6 CONTROL - ATMEGA32 @16.00MHz&lt;br /&gt;
 *         with optional LC-Display 16x2 chars (CONRAD 190911-62)&lt;br /&gt;
 *         and a 3D Accelerometer Modul (CONRAD 1082387-62) (IC5)&lt;br /&gt;
 * Author(s): Dirk&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Description:&lt;br /&gt;
 * This is my RP6 Control ACCSENS Library. This library may be used to access&lt;br /&gt;
 * the basic functions of the 3D Accelerometer Modul. This RP6 Xtra module may&lt;br /&gt;
 * be placed on the IC5 socket on the RP6 CONTROL M32 instead of a second&lt;br /&gt;
 * EEPROM.&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * THE CHANGELOG CAN BE FOUND AT THE END OF THIS FILE!&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
 &lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Includes:&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6ControlACCSENSLib.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// SPI functions:&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Reads a single register from the 3D Accelerometer&lt;br /&gt;
 * Modul (ACCSENS).&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
uint8_t SPI_ACCSENS_readByte(uint8_t regAddr)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t data;&lt;br /&gt;
	regAddr |= READ_MASK;						// Read byte&lt;br /&gt;
	PORTB &amp;amp;= ~ACC_CS;&lt;br /&gt;
	writeSPI(regAddr);&lt;br /&gt;
	data = readSPI();&lt;br /&gt;
	PORTB |= ACC_CS;&lt;br /&gt;
	return data;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Reads &amp;quot;length&amp;quot; bytes into the buffer &amp;quot;buffer&amp;quot;&lt;br /&gt;
 * from startAddr on. &lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void SPI_ACCSENS_readBytes(uint8_t startAddr, uint8_t *buffer, uint8_t length)&lt;br /&gt;
{&lt;br /&gt;
	startAddr |= READ_AUTOINC_MASK;				// Read byte, auto increment&lt;br /&gt;
	PORTB &amp;amp;= ~ACC_CS;&lt;br /&gt;
	writeSPI(startAddr);&lt;br /&gt;
	readBufferSPI(&amp;amp;buffer[0], length);&lt;br /&gt;
	PORTB |= ACC_CS;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Write a single data byte to the specified sensor&lt;br /&gt;
 * address.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void SPI_ACCSENS_writeByte(uint8_t regAddr, uint8_t data)&lt;br /&gt;
{&lt;br /&gt;
	PORTB &amp;amp;= ~ACC_CS;&lt;br /&gt;
	writeSPI(regAddr);&lt;br /&gt;
	writeSPI(data);&lt;br /&gt;
	PORTB |= ACC_CS;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Returns sensor status register - for checking if&lt;br /&gt;
 * sensor is busy. &lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
uint8_t SPI_ACCSENS_getStatus(void)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t status;&lt;br /&gt;
	PORTB &amp;amp;= ~ACC_CS;&lt;br /&gt;
	writeSPI(STATUS_REG);&lt;br /&gt;
	status = readSPI();&lt;br /&gt;
	PORTB |= ACC_CS;&lt;br /&gt;
	return status;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// 3D accelerometer functions:&lt;br /&gt;
&lt;br /&gt;
int16_t x_axisa, y_axisa, z_axisa;&lt;br /&gt;
double pitch, roll;&lt;br /&gt;
double xa, ya, za;&lt;br /&gt;
double the, phi;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Initializes the sensor. You must call this&lt;br /&gt;
 * function at the beginning of a program, that&lt;br /&gt;
 * uses the 3D Accelerometer Modul.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void SPI_ACCSENS_init(void)&lt;br /&gt;
{&lt;br /&gt;
	// All axes enable, low power, 10Hz output data rate:&lt;br /&gt;
	SPI_ACCSENS_writeByte(CTRL_REG1, CTRL_REG1_3D_LOPWR_10HZ);&lt;br /&gt;
	// No update while reading, +- 2g, self-test minus:&lt;br /&gt;
	SPI_ACCSENS_writeByte(CTRL_REG4, CTRL_REG4_BDU_2G_STSIGN);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Sets the LIS302DLH power-down mode. If you&lt;br /&gt;
 * do not need the sensor, you can save energy&lt;br /&gt;
 * by using the sensor power-down mode.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void SPI_ACCSENS_shutdown(void)&lt;br /&gt;
{&lt;br /&gt;
	// LIS302DLH in power-down mode:&lt;br /&gt;
	SPI_ACCSENS_writeByte(CTRL_REG1, CTRL_REG1_POWERDOWN);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function reads the X-axis, Y-axis and Z-axis&lt;br /&gt;
 * values from the LIS302DLH accelerometer and stores&lt;br /&gt;
 * them in the global variables x_axisa, y_axisa and&lt;br /&gt;
 * z_axisa.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void SPI_ACCSENS_read(void)&lt;br /&gt;
{&lt;br /&gt;
#ifndef EXP_STACK_1&lt;br /&gt;
	// Default sensor position (M32 located on the RP6 rear stack):&lt;br /&gt;
	// xb = -y:&lt;br /&gt;
	x_axisa = SPI_ACCSENS_readByte(OUT_Y_L) | (SPI_ACCSENS_readByte(OUT_Y_H) &amp;lt;&amp;lt; 8);&lt;br /&gt;
	x_axisa *= -1;&lt;br /&gt;
	// yb = -x:&lt;br /&gt;
	y_axisa = SPI_ACCSENS_readByte(OUT_X_L) | (SPI_ACCSENS_readByte(OUT_X_H) &amp;lt;&amp;lt; 8);&lt;br /&gt;
	y_axisa *= -1;&lt;br /&gt;
	// zb = z:&lt;br /&gt;
	z_axisa = SPI_ACCSENS_readByte(OUT_Z_L) | (SPI_ACCSENS_readByte(OUT_Z_H) &amp;lt;&amp;lt; 8);&lt;br /&gt;
#else&lt;br /&gt;
	// Other sensor position (M32 located on the RP6 front stack):&lt;br /&gt;
	// xb = y:&lt;br /&gt;
	x_axisa = SPI_ACCSENS_readByte(OUT_Y_L) | (SPI_ACCSENS_readByte(OUT_Y_H) &amp;lt;&amp;lt; 8);&lt;br /&gt;
	// yb = x:&lt;br /&gt;
	y_axisa = SPI_ACCSENS_readByte(OUT_X_L) | (SPI_ACCSENS_readByte(OUT_X_H) &amp;lt;&amp;lt; 8);&lt;br /&gt;
	// zb = z:&lt;br /&gt;
	z_axisa = SPI_ACCSENS_readByte(OUT_Z_L) | (SPI_ACCSENS_readByte(OUT_Z_H) &amp;lt;&amp;lt; 8);&lt;br /&gt;
#endif&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function limits and normalizes the x-axisa,&lt;br /&gt;
 * y-axisa and z-axisa values read from the LIS302DLH&lt;br /&gt;
 * accelerometer with the function SPI_ACCSENS_read() and&lt;br /&gt;
 * stores them in the global double variables xa, ya and&lt;br /&gt;
 * za.&lt;br /&gt;
 * It also calculates the position in space in form of the&lt;br /&gt;
 * tilt angles (the = pitch, phi = roll) and stores them&lt;br /&gt;
 * in the global double variables the and phi.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void SPI_ACCSENS_normalize(void)&lt;br /&gt;
{&lt;br /&gt;
	// Limit raw values:&lt;br /&gt;
	if (x_axisa &amp;lt; MIN_X_A) x_axisa = MIN_X_A;&lt;br /&gt;
	if (x_axisa &amp;gt; MAX_X_A) x_axisa = MAX_X_A;&lt;br /&gt;
	if (y_axisa &amp;lt; MIN_Y_A) y_axisa = MIN_Y_A;&lt;br /&gt;
	if (y_axisa &amp;gt; MAX_Y_A) y_axisa = MAX_Y_A;&lt;br /&gt;
	if (z_axisa &amp;lt; MIN_Z_A) z_axisa = MIN_Z_A;&lt;br /&gt;
	if (z_axisa &amp;gt; MAX_Z_A) z_axisa = MAX_Z_A;&lt;br /&gt;
	xa = (double) x_axisa / 10000.0;&lt;br /&gt;
	ya = (double) y_axisa / 10000.0;&lt;br /&gt;
	za = (double) z_axisa / 10000.0;&lt;br /&gt;
	// Calculate Pitch and Roll:&lt;br /&gt;
	phi = asin(xa);								// Calculate the and phi&lt;br /&gt;
	the = asin(ya / cos(the));					//  from the raw values&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function calculates the position in space by&lt;br /&gt;
 * using the the and phi values (see function&lt;br /&gt;
 * SPI_ACCSENS_normalize()!). It stores the position&lt;br /&gt;
 * in the global double variables pitch and roll. &lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void SPI_ACCSENS_position(void)&lt;br /&gt;
{&lt;br /&gt;
	pitch = the * 180 / M_PI + OFFSET_PITCH_A;&lt;br /&gt;
	roll = phi * 180 / M_PI + OFFSET_ROLL_A;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/******************************************************************************&lt;br /&gt;
 * Additional info&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Changelog:&lt;br /&gt;
 * - v. 1.0 (initial release) 04.04.2014 by Dirk&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Erklärung&lt;br /&gt;
&lt;br /&gt;
======Demo======&lt;br /&gt;
makefile:&lt;br /&gt;
&amp;lt;pre&amp;gt;...&lt;br /&gt;
TARGET = RP6Control_01_ACCSENS&lt;br /&gt;
...&lt;br /&gt;
SRC += $(RP6_LIB_PATH)/RP6control/RP6ControlLib.c&lt;br /&gt;
SRC += $(RP6_LIB_PATH)/RP6common/RP6uart.c&lt;br /&gt;
SRC += $(RP6_LIB_PATH)/RP6control/RP6ControlACCSENSLib.c&lt;br /&gt;
...&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Datei: RP6Control_01_ACCSENS.c&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;// Uncommented Version of RP6Control_01_ACCSENS.c&lt;br /&gt;
// written by Dirk&lt;br /&gt;
// ------------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6ControlACCSENSLib.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void writeDouble(double number, uint8_t width, uint8_t prec)&lt;br /&gt;
{char buffer[width + 1];&lt;br /&gt;
	dtostrf(number, width, prec, &amp;amp;buffer[0]);&lt;br /&gt;
	writeString(&amp;amp;buffer[0]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void writeDoubleLCD(double number, uint8_t width, uint8_t prec)&lt;br /&gt;
{char buffer[width + 1];&lt;br /&gt;
	dtostrf(number, width, prec, &amp;amp;buffer[0]);&lt;br /&gt;
	writeStringLCD(&amp;amp;buffer[0]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
	initRP6Control();&lt;br /&gt;
&lt;br /&gt;
	writeString_P(&amp;quot;\n\nRP6Control SPI ACCSENS Test Program!\n&amp;quot;); &lt;br /&gt;
	setLEDs(0b1111);&lt;br /&gt;
	mSleep(50);&lt;br /&gt;
	initLCD(); &lt;br /&gt;
	showScreenLCD(&amp;quot;################&amp;quot;, &amp;quot;################&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
	showScreenLCD(&amp;quot;  SPI ACCSENS&amp;quot;, &amp;quot;  Test Program&amp;quot;);&lt;br /&gt;
	mSleep(1000);&lt;br /&gt;
	setLEDs(0b0000);&lt;br /&gt;
&lt;br /&gt;
	SPI_ACCSENS_init();&lt;br /&gt;
&lt;br /&gt;
	uint8_t whoami = SPI_ACCSENS_readByte(WHO_AM_I);&lt;br /&gt;
	writeString_P(&amp;quot;\nWHO AM I: &amp;quot;);&lt;br /&gt;
	writeInteger(whoami, HEX);&lt;br /&gt;
	writeChar('\n');&lt;br /&gt;
	mSleep(2000);&lt;br /&gt;
	&lt;br /&gt;
	startStopwatch1();&lt;br /&gt;
&lt;br /&gt;
	while(true) &lt;br /&gt;
	{&lt;br /&gt;
		if(getStopwatch1() &amp;gt; 1000)&lt;br /&gt;
		{&lt;br /&gt;
			SPI_ACCSENS_read();&lt;br /&gt;
			writeString_P(&amp;quot;\n3D Accelerometer SENSOR -&amp;gt;\n&amp;quot;);&lt;br /&gt;
			writeString_P(&amp;quot;X-axis: &amp;quot;);&lt;br /&gt;
			writeInteger(x_axisa, DEC);&lt;br /&gt;
			writeChar('\n');&lt;br /&gt;
			writeString_P(&amp;quot;Y-axis: &amp;quot;);&lt;br /&gt;
			writeInteger(y_axisa, DEC);&lt;br /&gt;
			writeChar('\n');&lt;br /&gt;
			writeString_P(&amp;quot;Z-axis: &amp;quot;);&lt;br /&gt;
			writeInteger(z_axisa, DEC);&lt;br /&gt;
			writeChar('\n');&lt;br /&gt;
			SPI_ACCSENS_normalize();&lt;br /&gt;
			SPI_ACCSENS_position();&lt;br /&gt;
			writeString_P(&amp;quot;POSITION: \n&amp;quot;);&lt;br /&gt;
			writeString_P(&amp;quot;  Pitch [°]: &amp;quot;);&lt;br /&gt;
			writeDouble(pitch, 6, 1);&lt;br /&gt;
			writeChar('\n');&lt;br /&gt;
			writeString_P(&amp;quot;  Roll [°]:  &amp;quot;);&lt;br /&gt;
			writeDouble(roll, 6, 1);&lt;br /&gt;
			writeChar('\n');&lt;br /&gt;
			setCursorPosLCD(0, 0);&lt;br /&gt;
			writeStringLCD_P(&amp;quot;P&amp;quot;);&lt;br /&gt;
			writeDoubleLCD(pitch, 6, 1);&lt;br /&gt;
			writeStringLCD_P(&amp;quot; &amp;quot;);&lt;br /&gt;
			setCursorPosLCD(0, 8);&lt;br /&gt;
			writeStringLCD_P(&amp;quot;R&amp;quot;);&lt;br /&gt;
			writeDoubleLCD(roll, 6, 1);&lt;br /&gt;
			writeStringLCD_P(&amp;quot; &amp;quot;);&lt;br /&gt;
			setCursorPosLCD(1, 0);&lt;br /&gt;
			writeStringLCD_P(&amp;quot;X&amp;quot;);&lt;br /&gt;
			writeIntegerLCD(x_axisa, DEC);&lt;br /&gt;
			writeStringLCD_P(&amp;quot;   &amp;quot;);&lt;br /&gt;
			setCursorPosLCD(1, 5);&lt;br /&gt;
			writeStringLCD_P(&amp;quot;Y&amp;quot;);&lt;br /&gt;
			writeIntegerLCD(y_axisa, DEC);&lt;br /&gt;
			writeStringLCD_P(&amp;quot;   &amp;quot;);&lt;br /&gt;
			setCursorPosLCD(1, 10);&lt;br /&gt;
			writeStringLCD_P(&amp;quot;Z&amp;quot;);&lt;br /&gt;
			writeIntegerLCD(z_axisa, DEC);&lt;br /&gt;
			writeStringLCD_P(&amp;quot;    &amp;quot;);&lt;br /&gt;
			mSleep(2000);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Erklärung&lt;br /&gt;
&lt;br /&gt;
====BHT Modul JM3-BHT31====&lt;br /&gt;
Dieses Modul zur Messung von Luftdruck, Luftfeuchte und Temperatur ist seit dem 22.01.2015 lieferbar.&lt;br /&gt;
&lt;br /&gt;
=====Dokumentation=====&lt;br /&gt;
Die Dokumentation zum BHT Modul befindet sich auf der mitgelieferten ''&amp;quot;ASURO xTend-On CD-ROM&amp;quot;''.&lt;br /&gt;
&lt;br /&gt;
======Manuals======&lt;br /&gt;
Das Handbuch in der aktuellen Version kann [http://www.jm3-engineering.com/download/doc/ManualAsuroBHT_de.pdf hier] eingesehen werden.&lt;br /&gt;
&lt;br /&gt;
=====Demo-Programme=====&lt;br /&gt;
Ein Demo-Programm zum BHT Modul befindet sich integriert in die RP6 Sensor Board Demo auf der ''&amp;quot;RP6 Robot System Xtra Modules CD-ROM&amp;quot;''. Diese Demo kann auch in der aktuellen Version im Download Bereich von [http://www.jm3-engineering.com/downloads.htm JM3 Engineering] herunter geladen werden.&lt;br /&gt;
&lt;br /&gt;
=====RP6M256 WiFi: I2C_BHT Library=====&lt;br /&gt;
Die nachfolgende RP6M256_I2C_BHTLib (Eigenentwicklung in GCC) dient zur Ansteuerung des I2C BHT Moduls durch die RP6M256 WiFi.&lt;br /&gt;
&lt;br /&gt;
======Library Header======&lt;br /&gt;
Datei: RP6M256_I2C_BHTLib.h&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;/* ****************************************************************************&lt;br /&gt;
 *                           _______________________&lt;br /&gt;
 *                           \| RP6  ROBOT SYSTEM |/&lt;br /&gt;
 *                            \_-_-_-_-_-_-_-_-_-_/           &amp;gt;&amp;gt;&amp;gt; RP6 M256 WIFI&lt;br /&gt;
 * ----------------------------------------------------------------------------&lt;br /&gt;
 * ----------------------------- [c]2015 - Dirk -------------------------------&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * File: RP6M256_I2C_BHTLib.h&lt;br /&gt;
 * Version: 0.9&lt;br /&gt;
 * Target: RP6 M256 WIFI - ATMEGA2560 @16.00MHz&lt;br /&gt;
 * Author(s): Dirk&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Description:&lt;br /&gt;
 * Header file for new RP6 BHT Module library.&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
#ifndef RP6M256_I2C_BHTLIB_H&lt;br /&gt;
#define RP6M256_I2C_BHTLIB_H&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// RP6 BHT Module components:&lt;br /&gt;
// - I2C Barometric Pressure Sensor (MS5607-02BA)&lt;br /&gt;
// - I2C Relative Humidity Sensor (HTU21D)&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// RP6 Sensor Board:&lt;br /&gt;
&lt;br /&gt;
// If you want to use the RP6 BHT Module on the RP6 Sensor Board, you&lt;br /&gt;
// have to define SENSOR_BOARD (default)!&lt;br /&gt;
// If SENSOR_BOARD is NOT defined, this library assumes that the RP6 BHT&lt;br /&gt;
// Module is used stand-alone.&lt;br /&gt;
// ------------------&lt;br /&gt;
#define SENSOR_BOARD&lt;br /&gt;
// ------------------&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Includes:&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6M256Lib.h&amp;quot;&lt;br /&gt;
#include &amp;quot;RP6I2CmasterTWI.h&amp;quot;&lt;br /&gt;
#ifdef SENSOR_BOARD&lt;br /&gt;
	#include &amp;quot;RP6M256_Sensor_BoardLib.h&amp;quot;&lt;br /&gt;
#endif&lt;br /&gt;
#include &amp;lt;math.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Barometric Pressure Sensor (MS5607-02BA):&lt;br /&gt;
#define I2C_BHT_B_ADR					0xee	// Default&lt;br /&gt;
&lt;br /&gt;
// Weather station's data:&lt;br /&gt;
#define ALTITUDE			156			// Weather station's altitude [m]&lt;br /&gt;
//#define ALTITUDE			110			// 2nd altitude: Location 2 [m]&lt;br /&gt;
&lt;br /&gt;
// Temperature default data:&lt;br /&gt;
#define TEMP_ZERO			273.15		// 273.15 K = 0 °C&lt;br /&gt;
#define TA_DEFAULT			15.0		// Outside temp. default [°C]&lt;br /&gt;
#define TI_DEFAULT			21.0		// Inside temp. default [°C]&lt;br /&gt;
&lt;br /&gt;
// Commands:&lt;br /&gt;
#define MS5607_CMD_RESET				0x1e	// ADC reset command&lt;br /&gt;
#define MS5607_CMD_ADC_READ				0x00	// ADC read command&lt;br /&gt;
#define MS5607_CMD_ADC_CONV				0x40	// ADC conversion command&lt;br /&gt;
#define MS5607_CMD_ADC_D1				0x00	// ADC D1 conversion&lt;br /&gt;
#define MS5607_CMD_ADC_D2				0x10	// ADC D2 conversion&lt;br /&gt;
#define MS5607_CMD_ADC_256				0x00	// ADC OSR=256&lt;br /&gt;
#define MS5607_CMD_ADC_512				0x02	// ADC OSR=512&lt;br /&gt;
#define MS5607_CMD_ADC_1024				0x04	// ADC OSR=1024&lt;br /&gt;
#define MS5607_CMD_ADC_2048				0x06	// ADC OSR=2048&lt;br /&gt;
#define MS5607_CMD_ADC_4096				0x08	// ADC OSR=4096&lt;br /&gt;
#define MS5607_CMD_PROM_RD				0xa0	// Prom read command&lt;br /&gt;
&lt;br /&gt;
extern uint32_t D1;		// ADC value of the pressure conversion&lt;br /&gt;
extern uint32_t D2;		// ADC value of the temperature conversion&lt;br /&gt;
extern uint16_t C[8];	// calibration coefficients&lt;br /&gt;
extern double P;		// compensated pressure value&lt;br /&gt;
extern double P0;		// compensated pressure value at sea level (0 m)&lt;br /&gt;
extern double T;		// compensated temperature value&lt;br /&gt;
extern double dT;		// difference between actual and measured temperature&lt;br /&gt;
extern double OFF;		// offset at actual temperature&lt;br /&gt;
extern double SENS;		// sensitivity at actual temperature&lt;br /&gt;
extern uint8_t n_crc;	// crc value of the prom&lt;br /&gt;
&lt;br /&gt;
void I2C_BHT_B_reset(void);&lt;br /&gt;
uint32_t I2C_BHT_B_cmd_adc(uint8_t cmd);&lt;br /&gt;
uint16_t I2C_BHT_B_cmd_prom(uint8_t coef_num);&lt;br /&gt;
uint8_t I2C_BHT_B_crc4(uint16_t n_prom[]);&lt;br /&gt;
void I2C_BHT_B_read(void);&lt;br /&gt;
void I2C_BHT_B_init(void);&lt;br /&gt;
double reduceAirPressure(double pa, double ta);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Relative Humidity Sensor (HTU21D):&lt;br /&gt;
#define I2C_BHT_HT_ADR					0x80	// Default&lt;br /&gt;
&lt;br /&gt;
// Commands:&lt;br /&gt;
#define HTU21D_TRIG_T_MEASUREMENT_HM    0xe3	// Trig. temp meas. hold master&lt;br /&gt;
#define HTU21D_TRIG_RH_MEASUREMENT_HM   0xe5	// Trig. humidity meas. hold master&lt;br /&gt;
#define HTU21D_TRIG_T_MEASUREMENT_POLL  0xf3	// Trig. temp meas. no hold master&lt;br /&gt;
#define HTU21D_TRIG_RH_MEASUREMENT_POLL 0xf5	// Trig. humidity meas. no hold master&lt;br /&gt;
#define HTU21D_USER_REG_W               0xe6	// Writing user register&lt;br /&gt;
#define HTU21D_USER_REG_R               0xe7	// Reading user register&lt;br /&gt;
#define HTU21D_SOFT_RESET               0xfe	// Soft reset&lt;br /&gt;
&lt;br /&gt;
// Resolutions:&lt;br /&gt;
#define HTU21D_RES_12_14BIT             0x00	// RH=12bit, T=14bit&lt;br /&gt;
#define HTU21D_RES_8_12BIT              0x01	// RH= 8bit, T=12bit&lt;br /&gt;
#define HTU21D_RES_10_13BIT             0x80	// RH=10bit, T=13bit&lt;br /&gt;
#define HTU21D_RES_11_11BIT             0x81	// RH=11bit, T=11bit&lt;br /&gt;
&lt;br /&gt;
// User register bitmasks:&lt;br /&gt;
#define HTU21D_RES_MASK                 0x81	// Mask for res. bits (7, 0)&lt;br /&gt;
#define HTU21D_EOB_ON                   0x40	// End of battery&lt;br /&gt;
#define HTU21D_EOB_MASK                 0x40	// Mask for EOB bit(6)&lt;br /&gt;
#define HTU21D_HEATER_ON                0x04	// Heater on&lt;br /&gt;
#define HTU21D_HEATER_OFF               0x00	// Heater off&lt;br /&gt;
#define HTU21D_HEATER_MASK              0x04	// Mask for Heater bit (2)&lt;br /&gt;
&lt;br /&gt;
extern uint16_t rawHumidity;	// raw humidity value&lt;br /&gt;
extern uint16_t rawTemperature;	// raw temperature value&lt;br /&gt;
extern double H;				// relative humidity value [%]&lt;br /&gt;
extern double HT;				// temperature value [°C]&lt;br /&gt;
extern uint8_t resolution;		// sensor resolution [0..3]&lt;br /&gt;
extern uint8_t ht_crc;			// message crc value&lt;br /&gt;
&lt;br /&gt;
void I2C_BHT_HT_reset(void);&lt;br /&gt;
uint8_t I2C_BHT_HT_crc8(uint16_t message, uint8_t checksum);&lt;br /&gt;
double I2C_BHT_HT_readHumidity(void);&lt;br /&gt;
double I2C_BHT_HT_readTemperature(void);&lt;br /&gt;
void I2C_BHT_HT_setResolution(uint8_t resBits);&lt;br /&gt;
void I2C_BHT_HT_init(void);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// RP6 BHT Module initialisation:&lt;br /&gt;
&lt;br /&gt;
void I2C_BHT_init(void);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
/******************************************************************************&lt;br /&gt;
 * Additional info&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Changelog:&lt;br /&gt;
 * &lt;br /&gt;
 *  ---&amp;gt; changes are documented in the file &amp;quot;RP6M256_I2C_BHTLib.c&amp;quot;&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
======Library Source======&lt;br /&gt;
Datei: RP6M256_I2C_BHTLib.c&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;/* ****************************************************************************&lt;br /&gt;
 *                           _______________________&lt;br /&gt;
 *                           \| RP6  ROBOT SYSTEM |/&lt;br /&gt;
 *                            \_-_-_-_-_-_-_-_-_-_/           &amp;gt;&amp;gt;&amp;gt; RP6 M256 WIFI&lt;br /&gt;
 * ----------------------------------------------------------------------------&lt;br /&gt;
 * ----------------------------- [c]2015 - Dirk -------------------------------&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * File: RP6M256_I2C_BHTLib.c&lt;br /&gt;
 * Version: 0.9&lt;br /&gt;
 * Target: RP6 M256 WIFI - ATMEGA2560 @16.00MHz&lt;br /&gt;
 *         and a RP6 BHT Module (CONRAD 1302995)&lt;br /&gt;
 *         optionally on a RP6 Sensor Board (CONRAD 1082384)&lt;br /&gt;
 * Author(s): Dirk&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Description:&lt;br /&gt;
 * &lt;br /&gt;
 * This is our new Library that contains basic routines and functions for&lt;br /&gt;
 * accessing the RP6 BHT Module JM3-BHT31 (CONRAD 1302995).&lt;br /&gt;
 * If the RP6 BHT Module is located on the RP6 Sensor Board (CONRAD 1082384)&lt;br /&gt;
 * and connected to the I2C-MODULE plug M1, the RP6M256_Sensor_BoardLib has to&lt;br /&gt;
 * be included!&lt;br /&gt;
 * &lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// RP6 BHT Module components:&lt;br /&gt;
// - I2C Barometric Pressure Sensor (MS5607-02BA)&lt;br /&gt;
// - I2C Relative Humidity Sensor (HTU21D)&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Includes:&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6M256_I2C_BHTLib.h&amp;quot; 		&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Variables:&lt;br /&gt;
&lt;br /&gt;
uint8_t bhtdataBuf[4]; &lt;br /&gt;
uint8_t i;&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Barometric Pressure Sensor (MS5607-02BA):&lt;br /&gt;
// (Following the C-code example published 2011 by MEAS in AN520!)&lt;br /&gt;
&lt;br /&gt;
uint32_t D1;			// ADC value of the pressure conversion&lt;br /&gt;
uint32_t D2;			// ADC value of the temperature conversion&lt;br /&gt;
uint16_t C[8];			// calibration coefficients&lt;br /&gt;
double P;				// compensated pressure value&lt;br /&gt;
double P0;				// compensated pressure value at sea level (0 m)&lt;br /&gt;
double T;				// compensated temperature value&lt;br /&gt;
double dT;				// difference between actual and measured temperature&lt;br /&gt;
double OFF;				// offset at actual temperature&lt;br /&gt;
double SENS;			// sensitivity at actual temperature&lt;br /&gt;
uint8_t n_crc;			// crc value of the prom&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Reset sequence for the Pressure Sensor.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void I2C_BHT_B_reset(void)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmitByte(I2C_BHT_B_ADR, MS5607_CMD_RESET);&lt;br /&gt;
	mSleep(3);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Reads and returns pressure or temperature ADC&lt;br /&gt;
 * values measured with the chosen resolution.&lt;br /&gt;
 * This function is BLOCKING during the conversion&lt;br /&gt;
 * time (up to 10 ms).&lt;br /&gt;
 *&lt;br /&gt;
 * Input: cmd -&amp;gt; MS5607_CMD_ADC_D1   = Read pressure ADC value&lt;br /&gt;
 *               MS5607_CMD_ADC_D2   = Read temperature ADC value&lt;br /&gt;
 *               ... plus ...&lt;br /&gt;
 *               MS5607_CMD_ADC_256  = Resolution 0.130 hPa / 0.012 °C&lt;br /&gt;
 *               MS5607_CMD_ADC_512  = Resolution 0.084 hPa / 0.008 °C&lt;br /&gt;
 *               MS5607_CMD_ADC_1024 = Resolution 0.054 hPa / 0.005 °C&lt;br /&gt;
 *               MS5607_CMD_ADC_2048 = Resolution 0.036 hPa / 0.003 °C&lt;br /&gt;
 *               MS5607_CMD_ADC_4096 = Resolution 0.024 hPa / 0.002 °C&lt;br /&gt;
 *&lt;br /&gt;
 * Examples:&lt;br /&gt;
 *   D1 = I2C_BHT_B_cmd_adc(MS5607_CMD_ADC_D1 + MS5607_CMD_ADC_4096);&lt;br /&gt;
 *   // This returns the pressure ADC value (D1) with a 0.024 hPa&lt;br /&gt;
 *   // resolution!&lt;br /&gt;
 *   D2 = I2C_BHT_B_cmd_adc(MS5607_CMD_ADC_D2 + MS5607_CMD_ADC_4096);&lt;br /&gt;
 *   // This returns the temperature ADC value (D2) with a 0.002 °C&lt;br /&gt;
 *   // resolution!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
uint32_t I2C_BHT_B_cmd_adc(uint8_t cmd)&lt;br /&gt;
{&lt;br /&gt;
	uint32_t temp = 0;&lt;br /&gt;
&lt;br /&gt;
	I2CTWI_transmitByte(I2C_BHT_B_ADR, (MS5607_CMD_ADC_CONV + cmd));&lt;br /&gt;
	switch (cmd &amp;amp; 0x0f) {&lt;br /&gt;
		case MS5607_CMD_ADC_256  : mSleep(1); break;&lt;br /&gt;
		case MS5607_CMD_ADC_512  : mSleep(2); break;&lt;br /&gt;
		case MS5607_CMD_ADC_1024 : mSleep(3); break;&lt;br /&gt;
		case MS5607_CMD_ADC_2048 : mSleep(5); break;&lt;br /&gt;
		case MS5607_CMD_ADC_4096 : mSleep(10);&lt;br /&gt;
	}&lt;br /&gt;
	I2CTWI_transmitByte(I2C_BHT_B_ADR, MS5607_CMD_ADC_READ);&lt;br /&gt;
	I2CTWI_readBytes(I2C_BHT_B_ADR, bhtdataBuf, 3);&lt;br /&gt;
	temp = bhtdataBuf[0];						// MSB&lt;br /&gt;
	temp &amp;lt;&amp;lt;= 8;&lt;br /&gt;
	temp |= bhtdataBuf[1];&lt;br /&gt;
	temp &amp;lt;&amp;lt;= 8;&lt;br /&gt;
	temp |= bhtdataBuf[2];						// LSB&lt;br /&gt;
	return temp;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Reads and returns the calibration coefficient&lt;br /&gt;
 * (16 bit) with the number coef_num from the&lt;br /&gt;
 * Pressure Sensor's PROM.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: coef_num -&amp;gt; Calibration coefficient&lt;br /&gt;
 *                    number [0..7]&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
uint16_t I2C_BHT_B_cmd_prom(uint8_t coef_num)&lt;br /&gt;
{&lt;br /&gt;
	uint16_t rC = 0;&lt;br /&gt;
&lt;br /&gt;
	I2CTWI_transmitByte(I2C_BHT_B_ADR, (MS5607_CMD_PROM_RD + coef_num * 2));&lt;br /&gt;
	I2CTWI_readBytes(I2C_BHT_B_ADR, bhtdataBuf, 2);&lt;br /&gt;
	rC = bhtdataBuf[0];							// MSB&lt;br /&gt;
	rC &amp;lt;&amp;lt;= 8;&lt;br /&gt;
	rC |= bhtdataBuf[1];						// LSB&lt;br /&gt;
	return rC;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Calculates and returns the Pressure Sensor's&lt;br /&gt;
 * PROM CRC-4 value (8 bit).&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
uint8_t I2C_BHT_B_crc4(uint16_t n_prom[])&lt;br /&gt;
{&lt;br /&gt;
	uint16_t n_rem;&lt;br /&gt;
	uint16_t crc_read;&lt;br /&gt;
	uint8_t n_bit;&lt;br /&gt;
&lt;br /&gt;
	n_rem = 0x00;&lt;br /&gt;
	crc_read = n_prom[7];&lt;br /&gt;
	n_prom[7] = (0xff00 &amp;amp; (n_prom[7]));&lt;br /&gt;
	for (i = 0; i &amp;lt; 16; i++)&lt;br /&gt;
	{&lt;br /&gt;
		if (i % 2 == 1) n_rem ^= (uint8_t) ((n_prom[i &amp;gt;&amp;gt; 1]) &amp;amp; 0x00ff);&lt;br /&gt;
		else n_rem ^= (uint8_t) (n_prom[i &amp;gt;&amp;gt; 1] &amp;gt;&amp;gt; 8);&lt;br /&gt;
		for (n_bit = 8; n_bit &amp;gt; 0; n_bit--)&lt;br /&gt;
		{&lt;br /&gt;
			if (n_rem &amp;amp; 0x8000) n_rem = (n_rem &amp;lt;&amp;lt; 1) ^ 0x3000;&lt;br /&gt;
			else n_rem = n_rem &amp;lt;&amp;lt; 1;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	n_rem = (0x000f &amp;amp; (n_rem &amp;gt;&amp;gt; 12));&lt;br /&gt;
	n_prom[7] = crc_read;&lt;br /&gt;
	return (n_rem ^ 0x0);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Reads and calculates the pressure and&lt;br /&gt;
 * temperature values with the MS5607 1st order&lt;br /&gt;
 * algorithm.&lt;br /&gt;
 * The 2 values are stored in the global floating&lt;br /&gt;
 * point variables P and T:&lt;br /&gt;
 *   P -&amp;gt; Pressure value [hPa]&lt;br /&gt;
 *   T -&amp;gt; Temperature value [°C]&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void I2C_BHT_B_read(void)&lt;br /&gt;
{&lt;br /&gt;
	D2 = I2C_BHT_B_cmd_adc(MS5607_CMD_ADC_D2 + MS5607_CMD_ADC_4096); // Read D2&lt;br /&gt;
	D1 = I2C_BHT_B_cmd_adc(MS5607_CMD_ADC_D1 + MS5607_CMD_ADC_4096); // Read D1&lt;br /&gt;
&lt;br /&gt;
	// Calculate 1st order pressure and temperature (MS5607 1st order algorithm)&lt;br /&gt;
	dT = D2 - C[5] * pow(2, 8);&lt;br /&gt;
	OFF = C[2] * pow(2, 17) + dT * C[4] / pow(2, 6);&lt;br /&gt;
	SENS = C[1] * pow(2, 16) + dT * C[3] / pow(2, 7);&lt;br /&gt;
&lt;br /&gt;
	T = (2000 + (dT * C[6]) / pow(2, 23)) / 100;&lt;br /&gt;
	P = (((D1 * SENS) / pow(2, 21) - OFF) / pow(2, 15)) / 100;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * You MUST call this function at the beginning of a&lt;br /&gt;
 * main program, that uses the Pressure Sensor. &lt;br /&gt;
 * If SENSOR_BOARD is defined, the I2C-MODULE power&lt;br /&gt;
 * will be switched on with the function&lt;br /&gt;
 * setI2CModulePower() defined in the&lt;br /&gt;
 * RP6M256_Sensor_BoardLib, which will be included&lt;br /&gt;
 * then.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void I2C_BHT_B_init(void)&lt;br /&gt;
{&lt;br /&gt;
#ifdef SENSOR_BOARD&lt;br /&gt;
	// I2C-MODULE (plug M1) power on: &lt;br /&gt;
	setI2CModulePower(1);&lt;br /&gt;
#endif&lt;br /&gt;
	D1 = 0;										// Clear pressure ADC value&lt;br /&gt;
	D2 = 0;										// Clear temperature ADC value&lt;br /&gt;
	I2C_BHT_B_reset();							// Reset the Pressure Sensor&lt;br /&gt;
	for (i = 0; i &amp;lt; 8; i++) {C[i] = I2C_BHT_B_cmd_prom(i);} // Read PROM&lt;br /&gt;
	n_crc = I2C_BHT_B_crc4(C);					// Calculate PROM CRC&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Calculates and returns the relative air pressure&lt;br /&gt;
 * [hPa] at sea level (0 m).&lt;br /&gt;
 *&lt;br /&gt;
 * Input:  pa        -&amp;gt; Absolute air pressure [hPa] at ALTITUDE&lt;br /&gt;
 *         ta        -&amp;gt; OUTSIDE temperature [°C] at ALTITUDE&lt;br /&gt;
 *         ALTITUDE  -&amp;gt; Weather station's altitude [m]&lt;br /&gt;
 *         TEMP_ZERO -&amp;gt; 273.15 K&lt;br /&gt;
 * Output: p0        -&amp;gt; Relative air pressure [hPa] at sea level (0 m)&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
double reduceAirPressure(double pa, double ta)&lt;br /&gt;
{double p0;&lt;br /&gt;
	p0 = pa * (pow ((TEMP_ZERO + ta) / (TEMP_ZERO + ta + 0.0065 * ALTITUDE), -5.255));&lt;br /&gt;
	return p0;									// P0 [hPa]&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Relative Humidity Sensor (HTU21D):&lt;br /&gt;
// (Following a library published 2011 by MEAS France!)&lt;br /&gt;
&lt;br /&gt;
uint16_t rawHumidity;		// raw humidity value&lt;br /&gt;
uint16_t rawTemperature;	// raw temperature value&lt;br /&gt;
double H;					// relative humidity value [%]&lt;br /&gt;
double HT;					// temperature value [°C]&lt;br /&gt;
uint8_t resolution;			// sensor resolution [0..3]&lt;br /&gt;
uint8_t ht_crc;				// message crc value&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Soft reset for the Humidity Sensor.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void I2C_BHT_HT_reset(void)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmitByte(I2C_BHT_HT_ADR, HTU21D_SOFT_RESET);&lt;br /&gt;
	mSleep(15);&lt;br /&gt;
	resolution = 0;								// Default: RH 12, T 14 bit&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Reads the Humidity Sensor's user register.&lt;br /&gt;
 *&lt;br /&gt;
 * Hint: The user register bits are described on&lt;br /&gt;
 *       page 13 of the HTU21D datasheet!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
uint8_t read_user_register(void)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t userRegister;&lt;br /&gt;
  &lt;br /&gt;
	I2CTWI_transmitByte(I2C_BHT_HT_ADR, HTU21D_USER_REG_R);&lt;br /&gt;
	userRegister = I2CTWI_readByte(I2C_BHT_HT_ADR);&lt;br /&gt;
	return userRegister;  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Sets the Humidity Sensor's resolution to one&lt;br /&gt;
 * of four steps. The step number [0..3] is stored&lt;br /&gt;
 * in the global variable resolution:&lt;br /&gt;
 *   Step  RH   T&lt;br /&gt;
 *    0:   12  14 bit&lt;br /&gt;
 *    1:    8  12 bit&lt;br /&gt;
 *    2:   10  13 bit&lt;br /&gt;
 *    3:   11  11 bit&lt;br /&gt;
 *                                      RH   T&lt;br /&gt;
 * Input:  resBits -&amp;gt; 0b00000000   (0): 12  14 bit&lt;br /&gt;
 *                 -&amp;gt; 0b00000001   (1):  8  12 bit&lt;br /&gt;
 *                 -&amp;gt; 0b10000000 (128): 10  13 bit&lt;br /&gt;
 *                 -&amp;gt; 0b10000001 (129): 11  11 bit&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void I2C_BHT_HT_setResolution(uint8_t resBits)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t userRegister;&lt;br /&gt;
&lt;br /&gt;
	userRegister = read_user_register();&lt;br /&gt;
	userRegister &amp;amp;= 0b01111110;&lt;br /&gt;
	resBits &amp;amp;= 0b10000001;&lt;br /&gt;
	resolution = (resBits &amp;gt;&amp;gt; 6) | (resBits &amp;amp; 1); // Step 0..3&lt;br /&gt;
	userRegister |= resBits;&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_BHT_HT_ADR, HTU21D_USER_REG_W, userRegister);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#define SHIFTED_DIVISOR                 0x988000&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Calculates the Humidity Sensor's message CRC-8&lt;br /&gt;
 * value (8 bit) and returns 0 (false), if the&lt;br /&gt;
 * message transmission is good.&lt;br /&gt;
 *&lt;br /&gt;
 * Input:  message         -&amp;gt; Message from&lt;br /&gt;
 *                            Humidity Sensor&lt;br /&gt;
 *         checksum        -&amp;gt; Checksum from&lt;br /&gt;
 *                            Humidity Sensor&lt;br /&gt;
 *         SHIFTED_DIVISOR -&amp;gt; 0x0131 polynomial&lt;br /&gt;
 *                            shifted to farthest&lt;br /&gt;
 *                            left of three bytes&lt;br /&gt;
 * Output: remainder       -&amp;gt; 0  = Transmission good&lt;br /&gt;
 *                         -&amp;gt; &amp;gt;0 = Transm. corrupted&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
uint8_t I2C_BHT_HT_crc8(uint16_t message, uint8_t checksum)&lt;br /&gt;
{&lt;br /&gt;
	uint32_t remainder, divisor;&lt;br /&gt;
&lt;br /&gt;
	remainder = (uint32_t) message &amp;lt;&amp;lt; 8;&lt;br /&gt;
	remainder |= checksum;&lt;br /&gt;
	divisor = (uint32_t) SHIFTED_DIVISOR;&lt;br /&gt;
	for (i = 0; i &amp;lt; 16; i++)&lt;br /&gt;
	{&lt;br /&gt;
		if (remainder &amp;amp; (uint32_t) 1 &amp;lt;&amp;lt; (23 - i))&lt;br /&gt;
			remainder ^= divisor;&lt;br /&gt;
		divisor &amp;gt;&amp;gt;= 1;&lt;br /&gt;
	}&lt;br /&gt;
	return (uint8_t) remainder;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Calculates and returns the humidity value.&lt;br /&gt;
 * This function is BLOCKING during the conversion&lt;br /&gt;
 * time (up to 17 ms depending on resolution).&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
double I2C_BHT_HT_readHumidity(void)&lt;br /&gt;
{&lt;br /&gt;
	uint32_t temp = 0;&lt;br /&gt;
&lt;br /&gt;
	I2CTWI_transmitByte(I2C_BHT_HT_ADR, HTU21D_TRIG_RH_MEASUREMENT_POLL);&lt;br /&gt;
	switch (resolution) {&lt;br /&gt;
		case 1 : mSleep(4); break;				// RH 8 bit&lt;br /&gt;
		case 2 : mSleep(6); break;				// RH 10 bit&lt;br /&gt;
		case 3 : mSleep(9); break;				// RH 11 bit&lt;br /&gt;
		case 0 : mSleep(17);					// RH 12 bit&lt;br /&gt;
	}&lt;br /&gt;
	I2CTWI_readBytes(I2C_BHT_HT_ADR, bhtdataBuf, 3);&lt;br /&gt;
	temp = bhtdataBuf[0];						// MSB&lt;br /&gt;
	temp &amp;lt;&amp;lt;= 8;&lt;br /&gt;
	temp |= bhtdataBuf[1];						// LSB&lt;br /&gt;
	temp &amp;lt;&amp;lt;= 8;&lt;br /&gt;
	temp |= bhtdataBuf[2];						// Checksum&lt;br /&gt;
	rawHumidity = temp &amp;gt;&amp;gt; 8;&lt;br /&gt;
	ht_crc = (uint8_t) temp;&lt;br /&gt;
	rawHumidity &amp;amp;= 0xfffc;&lt;br /&gt;
	double tempRH = rawHumidity / (double) 65536;&lt;br /&gt;
	double rh = -6 + (125 * tempRH);&lt;br /&gt;
	return rh;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Calculates and returns the temperature value.&lt;br /&gt;
 * This function is BLOCKING during the conversion&lt;br /&gt;
 * time (up to 51 ms depending on resolution).&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
double I2C_BHT_HT_readTemperature(void)&lt;br /&gt;
{&lt;br /&gt;
	uint32_t temp = 0;&lt;br /&gt;
&lt;br /&gt;
	I2CTWI_transmitByte(I2C_BHT_HT_ADR, HTU21D_TRIG_T_MEASUREMENT_POLL);&lt;br /&gt;
	switch (resolution) {&lt;br /&gt;
		case 3 : mSleep(8); break;				// T 11 bit&lt;br /&gt;
		case 1 : mSleep(14); break;				// T 12 bit&lt;br /&gt;
		case 2 : mSleep(26); break;				// T 13 bit&lt;br /&gt;
		case 0 : mSleep(51);					// T 14 bit&lt;br /&gt;
	}&lt;br /&gt;
	I2CTWI_readBytes(I2C_BHT_HT_ADR, bhtdataBuf, 3);&lt;br /&gt;
	temp = bhtdataBuf[0];						// MSB&lt;br /&gt;
	temp &amp;lt;&amp;lt;= 8;&lt;br /&gt;
	temp |= bhtdataBuf[1];						// LSB&lt;br /&gt;
	temp &amp;lt;&amp;lt;= 8;&lt;br /&gt;
	temp |= bhtdataBuf[2];						// Checksum&lt;br /&gt;
	rawTemperature = temp &amp;gt;&amp;gt; 8;&lt;br /&gt;
	ht_crc = (uint8_t) temp;&lt;br /&gt;
	rawTemperature &amp;amp;= 0xfffc;&lt;br /&gt;
	double tempTemperature = rawTemperature / (double) 65536;&lt;br /&gt;
	double realTemperature = -46.85 + (175.72 * tempTemperature);&lt;br /&gt;
	return realTemperature;  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * You MUST call this function at the beginning of a&lt;br /&gt;
 * main program, that uses the Humidity Sensor. &lt;br /&gt;
 * If SENSOR_BOARD is defined, the I2C-MODULE power&lt;br /&gt;
 * will be switched on with the function&lt;br /&gt;
 * setI2CModulePower() defined in the&lt;br /&gt;
 * RP6M256_Sensor_BoardLib, which will be included&lt;br /&gt;
 * then.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void I2C_BHT_HT_init(void)&lt;br /&gt;
{&lt;br /&gt;
#ifdef SENSOR_BOARD&lt;br /&gt;
	// I2C-MODULE (plug M1) power on: &lt;br /&gt;
	setI2CModulePower(1);&lt;br /&gt;
#endif&lt;br /&gt;
	I2C_BHT_HT_reset();							// Reset the Humidity Sensor&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// RP6 BHT Module initialisation:&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * You MUST call this function at the beginning of a&lt;br /&gt;
 * main program, that uses the RP6 BHT Module. &lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void I2C_BHT_init(void)&lt;br /&gt;
{&lt;br /&gt;
	// I2C Barometric Pressure Sensor:&lt;br /&gt;
	I2C_BHT_B_init();&lt;br /&gt;
	// I2C Relative Humidity Sensor:&lt;br /&gt;
	I2C_BHT_HT_init();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&lt;br /&gt;
/******************************************************************************&lt;br /&gt;
 * Additional info&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Changelog:&lt;br /&gt;
 * - v. 0.9 (initial release) 20.03.2015 by Dirk&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
======Demo======&lt;br /&gt;
makefile:&lt;br /&gt;
&amp;lt;pre&amp;gt;...&lt;br /&gt;
TARGET = RP6M256_Sensor_Board_03&lt;br /&gt;
...&lt;br /&gt;
SRC += $(RP6_LIB_PATH)/RP6common/RP6I2CmasterTWI.c&lt;br /&gt;
&lt;br /&gt;
SRC += $(RP6_LIB_PATH)/RP6control_M256_WIFI/RP6M256_Sensor_BoardLib.c&lt;br /&gt;
SRC += $(RP6_LIB_PATH)/RP6control_M256_WIFI/RP6M256_I2C_BHTLib.c&lt;br /&gt;
...&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Datei: RP6M256_Sensor_Board_03.c&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;/* &lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * RP6 ROBOT SYSTEM - RP6 CONTROL M256 Examples&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Example: RP6M256 Sensor Board&lt;br /&gt;
 * Author(s): Dirk&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Description:&lt;br /&gt;
 * In this example we show a third test for the RP6 Sensor Board.&lt;br /&gt;
 * &lt;br /&gt;
 * ############################################################################&lt;br /&gt;
 * The Robot does NOT move in this example! You can simply put it on a table&lt;br /&gt;
 * next to your PC and you should connect it to the PC via the USB Interface!&lt;br /&gt;
 * You should also connect to it via WIFI.&lt;br /&gt;
 * ############################################################################&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Includes:&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6M256Lib.h&amp;quot; 				// The RP6 M256 Library. &lt;br /&gt;
										// Always needs to be included!&lt;br /&gt;
#include &amp;quot;RP6I2CmasterTWI.h&amp;quot;			// Include the I2C-Bus Master Library&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Include our new &amp;quot;RP6M256 I2C BHT Module library&amp;quot;:&lt;br /&gt;
// (This is the library for accessing the RP6 BHT Module!)&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6M256_I2C_BHTLib.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Write a floating point number to the WIFI.&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *&lt;br /&gt;
 *			// Write a floating point number to the WIFI (no exponent):&lt;br /&gt;
 *			writeDouble_WIFI(1234567.890, 11, 3);&lt;br /&gt;
 *&lt;br /&gt;
 * The value of prec (precision) defines the number of decimal places.&lt;br /&gt;
 * For 32 bit floating point variables (float, double ...) 6 is&lt;br /&gt;
 * the max. value for prec (7 relevant digits).&lt;br /&gt;
 * The value of width defines the overall number of characters in the&lt;br /&gt;
 * floating point number including the decimal point. The number of&lt;br /&gt;
 * pre-decimal positions is: (width - prec - 1).&lt;br /&gt;
 */&lt;br /&gt;
void writeDouble_WIFI(double number, uint8_t width, uint8_t prec)&lt;br /&gt;
{char buffer[width + 1];&lt;br /&gt;
	dtostrf(number, width, prec, &amp;amp;buffer[0]);&lt;br /&gt;
	writeString_WIFI(&amp;amp;buffer[0]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Write a floating point number to the LCD.&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *&lt;br /&gt;
 *			// Write a floating point number to the LCD (no exponent):&lt;br /&gt;
 *			writeDoubleLCD(1234567.890, 11, 3);&lt;br /&gt;
 *&lt;br /&gt;
 * The value of prec (precision) defines the number of decimal places.&lt;br /&gt;
 * For 32 bit floating point variables (float, double ...) 6 is&lt;br /&gt;
 * the max. value for prec (7 relevant digits).&lt;br /&gt;
 * The value of width defines the overall number of characters in the&lt;br /&gt;
 * floating point number including the decimal point. The number of&lt;br /&gt;
 * pre-decimal positions is: (width - prec - 1).&lt;br /&gt;
 */&lt;br /&gt;
void writeDoubleLCD(double number, uint8_t width, uint8_t prec)&lt;br /&gt;
{char buffer[width + 1];&lt;br /&gt;
	dtostrf(number, width, prec, &amp;amp;buffer[0]);&lt;br /&gt;
	writeStringLCD(&amp;amp;buffer[0]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Error handler&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function gets called automatically if there was an I2C Error like&lt;br /&gt;
 * the slave sent a &amp;quot;not acknowledge&amp;quot; (NACK, error codes e.g. 0x20 or 0x30).&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void I2C_transmissionError(uint8_t errorState)&lt;br /&gt;
{&lt;br /&gt;
	writeString_P_WIFI(&amp;quot;\nI2C ERROR - TWI STATE: 0x&amp;quot;);&lt;br /&gt;
	writeInteger_WIFI(errorState, HEX);&lt;br /&gt;
	writeChar_WIFI('\n');&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Main function - The program starts here:&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
	initRP6M256();    // Always call this first! The Processor will not work&lt;br /&gt;
					  // correctly otherwise. &lt;br /&gt;
&lt;br /&gt;
	initLCD(); // Initialize the LC-Display (LCD)&lt;br /&gt;
			   // Always call this before using the LCD!&lt;br /&gt;
&lt;br /&gt;
	setLEDs(0b1111);&lt;br /&gt;
	mSleep(500);&lt;br /&gt;
	setLEDs(0b0000);&lt;br /&gt;
&lt;br /&gt;
	writeString_P_WIFI(&amp;quot;\n\nRP6 Sensor Board Selftest 3!\n&amp;quot;); &lt;br /&gt;
&lt;br /&gt;
	// IMPORTANT:&lt;br /&gt;
	I2CTWI_initMaster(100); // Initialize the TWI Module for Master operation&lt;br /&gt;
							// with 100kHz SCL Frequency&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	// Register the event handler:&lt;br /&gt;
	I2CTWI_setTransmissionErrorHandler(I2C_transmissionError);&lt;br /&gt;
&lt;br /&gt;
	setLEDs(0b1111);&lt;br /&gt;
&lt;br /&gt;
	// Write a text message to the LCD:&lt;br /&gt;
	showScreenLCD(&amp;quot;################&amp;quot;, &amp;quot;################&amp;quot;);&lt;br /&gt;
	mSleep(1500);&lt;br /&gt;
	showScreenLCD(&amp;quot;RP6v2-M256-WIFI &amp;quot;, &amp;quot;Example Program&amp;quot;);&lt;br /&gt;
	mSleep(2500); &lt;br /&gt;
	showScreenLCD(&amp;quot;RP6 Sensor Board&amp;quot;, &amp;quot;   Selftest 3&amp;quot;);&lt;br /&gt;
	mSleep(2500);&lt;br /&gt;
	clearLCD();&lt;br /&gt;
&lt;br /&gt;
	setLEDs(0b0000);&lt;br /&gt;
&lt;br /&gt;
	// ---------------------------------------&lt;br /&gt;
&lt;br /&gt;
	uint8_t onoff = 0;&lt;br /&gt;
&lt;br /&gt;
	startStopwatch1();&lt;br /&gt;
	startStopwatch2();&lt;br /&gt;
&lt;br /&gt;
	// IMPORTANT:&lt;br /&gt;
	sensor_board_init();						// RP6 Sensor Board init!!!&lt;br /&gt;
	mSleep(200);&lt;br /&gt;
	I2C_BHT_init();								// RP6 BHT Module init&lt;br /&gt;
&lt;br /&gt;
	while(true) &lt;br /&gt;
	{&lt;br /&gt;
		if(getStopwatch1() &amp;gt; 1000) // 1s&lt;br /&gt;
		{&lt;br /&gt;
//			if (onoff) onoff = 0;&lt;br /&gt;
//			else onoff = 1;&lt;br /&gt;
&lt;br /&gt;
			// Show Pressure Sensor data:&lt;br /&gt;
			I2C_BHT_B_read();					// Read data&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nLuftdruck:   &amp;quot;);&lt;br /&gt;
			writeDouble_WIFI(P, 7, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot; hPa am Messort (ALTITUDE m)\n&amp;quot;);&lt;br /&gt;
			// Calculate pressure at sea level at TA_DEFAULT (15 °C):&lt;br /&gt;
			P0 = reduceAirPressure(P, TA_DEFAULT);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;Luftdruck:   &amp;quot;);&lt;br /&gt;
			writeDouble_WIFI(P0, 7, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot; hPa in Meereshöhe (0 m, 15 C)\n&amp;quot;);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;Temperatur:  &amp;quot;);&lt;br /&gt;
			writeDouble_WIFI(T, 7, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot; C\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			// Show Humidity Sensor data:&lt;br /&gt;
			H = I2C_BHT_HT_readHumidity();		// Read data&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nLuftfeuchte: &amp;quot;);&lt;br /&gt;
			writeDouble_WIFI(H, 7, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot; % RH\n&amp;quot;);&lt;br /&gt;
			HT = I2C_BHT_HT_readTemperature();	// Read data&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;Temperatur:  &amp;quot;);&lt;br /&gt;
			writeDouble_WIFI(HT, 7, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot; C\n\n\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			// RP6 Sensor Board shutdown (button &amp;amp; status LED test):&lt;br /&gt;
			if (pressedButton) {&lt;br /&gt;
				setStatusLED(1);&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;\nPress button again for RP6 Sensor Board SHUTDOWN!\n&amp;quot;);&lt;br /&gt;
				mSleep(2000);&lt;br /&gt;
				do {&lt;br /&gt;
					if(getStopwatch2() &amp;gt; 200) { // 0.2s&lt;br /&gt;
						if (onoff) onoff = 0;&lt;br /&gt;
						else onoff = 1;&lt;br /&gt;
						if (onoff) setStatusLED(1);&lt;br /&gt;
						else setStatusLED(0);&lt;br /&gt;
						setStopwatch2(0);&lt;br /&gt;
					}&lt;br /&gt;
					mSleep(1);&lt;br /&gt;
					task_I2CTWI();&lt;br /&gt;
				} while (!readButton());&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;\n\n\n\n\nPlease wait for RP6 Sensor Board SHUTDOWN...\n&amp;quot;);&lt;br /&gt;
				sensor_board_shutdown();&lt;br /&gt;
				mSleep(3000);&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;\n\n\nThe RP6 Sensor Board now is in SHUTDOWN MODE!!!\n&amp;quot;);&lt;br /&gt;
				mSleep(1000);&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;\nRESET the M256 microcontroller now...\n\n&amp;quot;);&lt;br /&gt;
				while(true) {};&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			setStopwatch1(0);&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		task_RP6SensorBoard();					// RP6 Sensor Board task&lt;br /&gt;
&lt;br /&gt;
		task_I2CTWI();&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Erklärung&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Erfahrungsberichte==&lt;br /&gt;
&lt;br /&gt;
...in Arbeit...(kann aber gerne ergänzt werden)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Siehe auch==&lt;br /&gt;
* [[RP6v2]]&lt;br /&gt;
* [[RP6]]&lt;br /&gt;
* [[RP6 - Programmierung]]&lt;br /&gt;
* [[RP6 Kamera - Mitmach-Projekt]]&lt;br /&gt;
* [[RP6v2 I2C-Portexpander]]&lt;br /&gt;
* [[RP6v2 USB-RS232-Adapter]]&lt;br /&gt;
* [[RP6v2 Orientierung]]&lt;br /&gt;
* [[RP6 Multi IO Projekt]]&lt;br /&gt;
* [[RP6 Multi IO Projekt - Software]]&lt;br /&gt;
* [[RP6 ArduIO]]&lt;br /&gt;
* [[RP6 ArduIO - Software]]&lt;br /&gt;
* [[Induktive_Ladestation_f%C3%BCr_den_RP6|Induktive Ladestation für den RP6]]&lt;br /&gt;
* [[IR-bake_f%C3%BCr_den_RP6|IR-bake für den RP6]]&lt;br /&gt;
* [[CCRP5]]&lt;br /&gt;
* [[Wild Thumper]]&lt;br /&gt;
* [[Wild Thumper - Programmierung]]&lt;br /&gt;
* [[Yeti]]&lt;br /&gt;
* [[Asuro]]&lt;br /&gt;
* [[C't-Bot]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Weblinks==&lt;br /&gt;
'''Siehe auch die Weblinks im [http://www.rn-wissen.de/index.php/RP6v2#Weblinks RP6v2] und im [http://www.rn-wissen.de/index.php/RP6#Weblinks RP6] Artikel!'''&lt;br /&gt;
&lt;br /&gt;
* [http://www.conrad.de/ce/de/product/1082384/Arexx-RP6-Sensor-Board-RP6-JM03-61 RP6 Sensor Board bei CONRAD]&lt;br /&gt;
* JM3 Engineering:&lt;br /&gt;
** [http://www.jm3-engineering.com/rp6.htm RP6 Roboter Erweiterung]&lt;br /&gt;
** [http://www.jm3-engineering.com/sensors.htm Sensor Module]&lt;br /&gt;
** [http://www.jm3-engineering.com/downloads.htm Software Downloads]&lt;br /&gt;
* Ankündigung einer Sensorerweiterungsplatine für die RP6v2 M256 WiFi im [http://www.roboternetz.de/community/threads/63595-Neue-Hardware-f%C3%BCr-RP6%28v2%29?p=590129&amp;amp;viewfull=1#post590129 Roboternetz RP6 Forum]&lt;br /&gt;
* Erfahrungsbericht zum Sensor Board im [http://www.arexx.com/forum/viewtopic.php?f=19&amp;amp;t=2498 AREXX Support Forum] und im [http://www.roboternetz.de/community/threads/64414-RP6-Sensor-Board-Erster-Eindruck Roboternetz RP6 Forum]&lt;br /&gt;
* Erfahrungsbericht zum I2C GPS Empfänger im [http://www.arexx.com/forum/viewtopic.php?f=19&amp;amp;t=2509 AREXX Support Forum]&lt;br /&gt;
* Erfahrungsbericht zum I2C BHT Modul im [http://www.arexx.com/forum/viewtopic.php?f=19&amp;amp;t=2646 AREXX Support Forum]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Kategorie:Robotikeinstieg]]	 &lt;br /&gt;
[[Kategorie:Praxis]]&lt;br /&gt;
&lt;br /&gt;
==Autoren==&lt;br /&gt;
--[http://www.roboternetz.de/community/members/1972-Dirk Dirk] 18:59, 1. Jun 2020 (CET)&lt;/div&gt;</summary>
		<author><name>Dirk NO2</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=RP6_Sensor_Board_und_Xtra_Module&amp;diff=28579</id>
		<title>RP6 Sensor Board und Xtra Module</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=RP6_Sensor_Board_und_Xtra_Module&amp;diff=28579"/>
				<updated>2022-03-31T09:23:48Z</updated>
		
		<summary type="html">&lt;p&gt;Dirk NO2: /* Was bisher geschah */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Bild:RP6_Sensor_Board.jpg|Das RP6 Sensor Board|right|500px]]&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_Xtra_module.JPG|RP6 Xtra module|right|500px]]&lt;br /&gt;
==Was bisher geschah==&lt;br /&gt;
'''Siehe auch &amp;quot;Was bisher geschah&amp;quot; im [http://www.rn-wissen.de/index.php/RP6v2#Was_bisher_geschah RP6v2] und im [http://www.rn-wissen.de/index.php/RP6#Was_bisher_geschah RP6] Artikel!'''&lt;br /&gt;
&lt;br /&gt;
Mit, 27. Nov 2013 - Ankündigung einer Sensorerweiterungsplatine, die an die RP6v2-M256-WIFI angeschlossen werden kann&amp;lt;br/&amp;gt;&lt;br /&gt;
Sam, 22. Feb 2014 - Auslieferungsbeginn des RP6 Sensor Boards, des I2C GPS Empfängers, des 3D Accelerometer Moduls und des Gyro Moduls&amp;lt;br/&amp;gt;&lt;br /&gt;
Mon, 17. Mär 2014 - Das RP6 Sensor Board ist &amp;quot;nicht lieferbar&amp;quot;, neuer Liefertermin angekündigt für den 12.06.2014 (!?)&amp;lt;br/&amp;gt;&lt;br /&gt;
Die, 25. Mär 2014 - Das RP6 Sensor Board ist wieder &amp;quot;sofort lieferbar&amp;quot;&amp;lt;br/&amp;gt;&lt;br /&gt;
August 2014 - Ein neues Xtra Modul wird von JM3 Engineering angekündigt: Das &amp;quot;Wetterstations Sensor Modul&amp;quot;&amp;lt;br/&amp;gt;&lt;br /&gt;
November 2014 - Das &amp;quot;Wetterstations Sensor Modul&amp;quot; ist bei [http://www.jm3-engineering.com/sensors.htm JM3 Engineering] als &amp;quot;BHT Modul&amp;quot; abgebildet und ein Manual verfügbar&amp;lt;br/&amp;gt;&lt;br /&gt;
Don, 22. Jan 2015 - Auslieferungsbeginn des BHT Moduls&amp;lt;br/&amp;gt;&lt;br /&gt;
Son, 18. Dez 2016 - Laut JM3 Engineering wird das 3D Accelerometer DIL Modul nicht mehr produziert, ist aber weiterhin erhältlich&amp;lt;br/&amp;gt;&lt;br /&gt;
Oktober 2017 - Das RP6 Sensor Board und der I2C GPS Empfänger sind bei CONRAD ausverkauft&amp;lt;br/&amp;gt;&lt;br /&gt;
April 2019 - Das Gyro Modul und das BHT Modul sind bei CONRAD ausverkauft&amp;lt;br/&amp;gt;&lt;br /&gt;
Mai 2020 - Die Experimentierplatine, das Backlight-Display, der Graustufen-Boden-Sensor, der Drehgeber-Satz RP6-ENCv3 und das 3D Accelerometer Modul sind bei CONRAD ausverkauft&amp;lt;br/&amp;gt;&lt;br /&gt;
Ende 2021 - Die RP6 CONTROL M32 Platine, die Ersatzräder, die Ersatzraupen und das RP6 USB-Interface RP6v2-TRANS sind bei CONRAD ausverkauft&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Allgemein==&lt;br /&gt;
Dieser Artikel beschreibt die Grundlagen und Programmierung des RP6 Sensor Boards und der RP6 Xtra Module. Dieses Erweiterungs-Modul und die Xtra Module sind Teile des RP6-Systems, das in den RN-Wissen-Artikeln [[RP6]], [[RP6v2]] und [[RP6_-_Programmierung|RP6 - Programmierung]] ausführlich beschrieben wird. Ausgegliedert aus den &amp;quot;Haupt-Artikeln&amp;quot; habe ich diese Module, da sie m.E. zu einer neuen &amp;quot;Ära&amp;quot; des RP6-Systems gehören:&lt;br /&gt;
&lt;br /&gt;
Sie wurden nicht mehr von '''[http://www.roboternetz.de/community/members/120-SlyD SlyD] (Dominik S. Herwald)''' in Zusammenarbeit mit '''[http://www.arexx.com/ AREXX]''' entwickelt, sondern ab 2013 von '''[http://jm3-engineering.com/ JM3 Engineering] (Dipl.-Ing. Jürgen Maisel)'''. Ab Februar 2014 waren dann das '''RP6 Sensor Board RP6-JM03-61''' ([http://www.conrad.de/ce/de/product/1082384/Arexx-RP6-Sensor-Board-RP6-JM03-61 1082384]) und die drei RP6 Xtra Module '''I2C GPS Empfänger JM3-GPS''' ([http://www.conrad.de/ce/de/product/1082385/Arexx-IC-GPS-Empfaenger-JM3-GPS 1082385]), '''Gyro Modul JM3-GYRO''' ([http://www.conrad.de/ce/de/product/1082386/Arexx-Gyro-Modul-JM3-GYRO 1082386]) und '''3D Accelerometer Modul JM3-3DA''' ([http://www.conrad.de/ce/de/product/1082387/Arexx-3D-Accelerometer-Modul-JM3-3DA 1082387]) bei CONRAD lieferbar. Einen ersten Eindruck vom Sensor Board kann man im RoboterNetz und AREXX Support Forum bekommen,- siehe unter [[RP6_Sensor_Board_und_Xtra_Module#Weblinks|Weblinks]]!&lt;br /&gt;
&lt;br /&gt;
===RP6 Sensor Board===&lt;br /&gt;
Das [[RP6_Sensor_Board_und_Xtra_Module#RP6_Sensor_Board_2|RP6 Sensor Board]] gehört zu den &amp;quot;Erweiterungs-Modulen&amp;quot; des RP6-Systems. '''Andere &amp;quot;Erweiterungs-Module&amp;quot; werden im [[RP6v2#Erweiterungs-Module|RP6v2]] und im [[RP6#Erweiterungs-Module|RP6]] Artikel beschrieben!'''&lt;br /&gt;
&lt;br /&gt;
Das ''RP6 Sensor Board'' ist das erste &amp;quot;Erweiterungs-Modul&amp;quot;, das nicht über einen eigenen Microprozessor verfügt,- es ist also ein ''passives Modul'', das von einem Microprozessor-System (z.B. RP6v2, M32, M128, M256 Wifi) angesteuert werden muss. Es ist ebenfalls das erste Modul, das nicht mehr über die rautenförmige Einbuchtung an der Vorderkante verfügt, sondern komplett rechteckig ist. Damit passt es (montiert auf den Standard-Abstandbolzen) nur auf den vorderen Platinenstapel 1 des RP6.&lt;br /&gt;
&lt;br /&gt;
===RP6 Xtra Module===&lt;br /&gt;
Die [[RP6_Sensor_Board_und_Xtra_Module#RP6_Xtra_Module_2|RP6 Xtra Module]] gehören zu den &amp;quot;Zubehör- und Ersatzteilen&amp;quot; des RP6-Systems. '''Über die weiteren &amp;quot;Zubehör- und Ersatzteile&amp;quot; zum RP6 informiert der entsprechende Abschnitt im [[RP6v2#Zubeh.C3.B6r_und_Ersatzteile|RP6v2]] und im [[RP6#Zubehör und Ersatzteile|RP6]] Artikel!'''&lt;br /&gt;
&lt;br /&gt;
Die ''RP6 Xtra Module'' unterscheiden sich von den weiteren &amp;quot;Zubehör- und Ersatzteilen&amp;quot; dadurch, dass sie selbstständige Sensor-Platinen sind, die ideal zum RP6-System passen, aber auch mit anderen Microcontroller-Plattformen nutzbar sind.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==RP6 Sensor Board==&lt;br /&gt;
Das RP6 Sensor Board RP6-JM03-61 ([http://www.conrad.de/ce/de/product/1082384/Arexx-RP6-Sensor-Board-RP6-JM03-61 1082384]) wurde am 27.11.2013 von [http://www.roboternetz.de/community/members/120-SlyD SlyD] angekündigt (siehe Weblink!).&lt;br /&gt;
&lt;br /&gt;
Aktuell (Oktober 2017) ist das RP6 Sensor Board bei CONRAD ausverkauft.&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_Sensor_Board.jpg|Das RP6 Sensor Board]]&lt;br /&gt;
&lt;br /&gt;
===Beschreibung===&lt;br /&gt;
(Laut Online-Katalog der Firma CONRAD!)&lt;br /&gt;
&lt;br /&gt;
''&amp;quot;Das RP6 Sensor Board erweitert die Möglichkeiten aller RP6 Roboter um wesentliche Sensorsignale für Robotik-Anwendungen wie zum Beispiel Dreharten (Yaw-Gyro), Kipp- und Neigewinkel, Kompassrichtung oder aber auch Zeit und Datum.&lt;br /&gt;
Sie können einfach mit zusätzlichen Sharp Sensoren Abstände genau messen, z.B. für autonome Fahrrouten oder falls der Sensor nach unten gerichtet ist, kann er Treppenstufen oder ähnliches entdecken. Außerdem gibt es die Möglichkeit z.B. die Sharp Sensoren ein- bzw. auszuschalten um Strom zu sparen. Zusätzlich können bis zu 8 Servos angesteuert werden um z.B. einen Roboterarm zu bewegen, der auch mechanisch einfach zu montieren ist. Um die Möglichkeiten des RP6 Sensor Boards komplett ausnutzen zu können, wird ein RP6V2 und RP6Wifi Control Board empfohlen. Die ermöglicht den Roboter über Wifi fernzusteuern oder Sensordaten auf dem Kommandozentrum (PC) z.B Kompassdaten, Temperatur oder Kipp- und Neigewinkel anzeigen zu lassen.&amp;quot;''&lt;br /&gt;
&lt;br /&gt;
'''Ausstattung'''&lt;br /&gt;
* Magnetometer- und Accelerometer für Kompassfunktion&lt;br /&gt;
* Gyro Sensor (Yaw)&lt;br /&gt;
* Sharp-Sensor Schnittstelle&lt;br /&gt;
* LED Scheinwerfer&lt;br /&gt;
* LED Treiber mit Smart Funktionen&lt;br /&gt;
* I²C Bus mit max. 400 kHz Übertragungsrate; Hot Swap I²C-Bus Buffer&lt;br /&gt;
* Taster mit LED&lt;br /&gt;
* Echtzeit-Uhr RTC&lt;br /&gt;
* Backupbatterie (Aufladung während des Betriebs)&lt;br /&gt;
* Expansion Port z.B. für GPS-I²C Bus Modul&lt;br /&gt;
* 8 Servo-Ausgänge mit eigenem Schaltregler&lt;br /&gt;
* 8 PWM Ausgänge&lt;br /&gt;
* 5 LED Ausgänge und 2 Digital-I/O Ausgänge.&lt;br /&gt;
&lt;br /&gt;
'''Lieferumfang'''&lt;br /&gt;
* RP6 Sensor Board&lt;br /&gt;
* Montage-Kit&lt;br /&gt;
* Kabel&lt;br /&gt;
* Anleitung und CD mit Dokumentation.&lt;br /&gt;
&lt;br /&gt;
====Blockschaltbild====&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_Sensor_Board_BSP.png|RP6 Sensor Board Blockschaltbild]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Technische Daten===&lt;br /&gt;
{|  {{Blauetabelle}} &lt;br /&gt;
|'''Mikrocontroller:'''&lt;br /&gt;
|kein&lt;br /&gt;
|-&lt;br /&gt;
|'''Speicher:'''&lt;br /&gt;
|kein&amp;lt;br/&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|'''Programmierung:'''&lt;br /&gt;
|C++ (GCC, u.a.) über externes µC-System&lt;br /&gt;
|-&lt;br /&gt;
|'''Vorhandene Sensoren:'''&lt;br /&gt;
|Temperatur, 3D Magnetfeld (Kompass), 3D Beschleunigung, Yaw-Gyro&amp;lt;br/&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|'''Vorhandene Aktoren:'''&lt;br /&gt;
|LED Controller (2 LEDs on board, 5 freie LED Ports), Status LED,&amp;lt;br/&amp;gt;Button, Servo (PWM) Controller für 8 Servos und 8 PWM-Kanäle,&amp;lt;br/&amp;gt;Real Time Clock (RTC), 2 freie I/O Ports&lt;br /&gt;
|-&lt;br /&gt;
|'''Abmessungen:'''&lt;br /&gt;
|(L &amp;amp;times; B &amp;amp;times; H) 112 &amp;amp;times; 90 &amp;amp;times; 19 mm&amp;lt;br/&amp;gt;(B + 5 mm durch Scheinwerfer vorn)&lt;br /&gt;
|-&lt;br /&gt;
|'''Ausführung:'''&lt;br /&gt;
|Fertig aufgebautes Erweiterungsmodul&lt;br /&gt;
|-&lt;br /&gt;
|'''Stromversorgung:'''&lt;br /&gt;
|6 AA NiMH Akkus (über die RP6v2 Base)&amp;lt;br/&amp;gt;und optionaler Zusatzakku 7,2..10 V für Servo Power&lt;br /&gt;
|-&lt;br /&gt;
|'''Hersteller:'''&lt;br /&gt;
|Arexx Niederlande&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Umbau-Optionen===&lt;br /&gt;
Hier soll beschrieben werden, welche Umbau-Optionen es für das RP6 Sensor Board gibt. Im Text gibt es Verweise auf den Schaltplan des RP6 Sensor Boards (RP6_Sensor_Board_Rev2_Schema.pdf) in der Form: (SP2: Bauteil). Dies bedeutet, dass man das Bauteil auf Blatt 2 des Schaltplans finden kann. Beispielhaft sind im folgenden Text Bestell-Nummern der Firma [http://www.conrad.de/ce/ CONRAD] genannt. Natürlich kann man die Teile auch bei anderen Versendern beziehen.&lt;br /&gt;
&lt;br /&gt;
====USRBUS- und XBUS-Wannenstecker====&lt;br /&gt;
Der zweite Wannenstecker für den XBUS (SP3: K14) und USRBUS (SP3: K16) kann nachbestückt werden.&lt;br /&gt;
Man braucht dazu: &lt;br /&gt;
* 2 Wannenstecker 2x7-polig gerade RM 2,54mm (CONRAD [http://www.conrad.de/ce/de/product/741687/Stiftleiste-Print-Montage-gerade-Rastermass-254-mm-Pole-2-x-7-10120556-BKL-Electronic-Inhalt-1-St 741687])&lt;br /&gt;
Die Wannenstecker lötet man auf die eingezeichneten Positionen.&lt;br /&gt;
&lt;br /&gt;
'''USRBUS-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''USRBUS''' || '''Sensor Board-Funktion''' || '''Verwendung''' || '''I/O'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Y1 || &amp;quot;ADC0&amp;quot; || SHARP vorn || I&lt;br /&gt;
|-&lt;br /&gt;
| 2 || Y2 || &amp;quot;ADC1&amp;quot; || Yaw-Gyro || I&lt;br /&gt;
|-&lt;br /&gt;
| 3 || Y3 || PWR || Power für&amp;lt;br/&amp;gt;SHARPs, CAM_IF,&amp;lt;br/&amp;gt;I2C-MODULE || O&lt;br /&gt;
|-&lt;br /&gt;
| 4 || Y4 || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 5 || Y5 || &amp;quot;ADC4&amp;quot; || SHARP hinten ||I&lt;br /&gt;
|-&lt;br /&gt;
| 6..14 || Y6..Y14 || || keine ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
'''XBUS-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''XBUS''' || '''M256-Port''' ||'''M256-Funktion''' || '''Sensor Board-Funktion''' || '''Jumper''' || '''Verwendung''' || '''I/O'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || GND || || GND || GND || || ||&lt;br /&gt;
|-&lt;br /&gt;
| 2 || GND || || GND || GND || || ||&lt;br /&gt;
|-&lt;br /&gt;
| 3 || VDD || || VDD|| VDD_1 || || VDD +5V ||&lt;br /&gt;
|-&lt;br /&gt;
| 4 || +UB || || +UB || VSS_1 || || CAM_IF Power ||&lt;br /&gt;
|-&lt;br /&gt;
| 5 || VDD || || VDD || VDD_1 || || VDD +5V ||&lt;br /&gt;
|-&lt;br /&gt;
| 6 || +UB || || +UB || VSS_1 || || CAM_IF Power ||&lt;br /&gt;
|-&lt;br /&gt;
| 7 || INTU || PJ4 || PCINT13 || INTU || || keine || I&lt;br /&gt;
|-&lt;br /&gt;
| 8 || INT1 || PJ3 || PCINT12 || INT1 || 3 || LSM303DLHC: INT1 || I&lt;br /&gt;
|-&lt;br /&gt;
| 9 || INT3 || PJ5 || PCINT14 || INT3 || 2&amp;lt;br/&amp;gt;5 || DS1339: SQW/INT_N&amp;lt;br/&amp;gt;LSM303DLHC: INT2 || I&amp;lt;br/&amp;gt;I&lt;br /&gt;
|-&lt;br /&gt;
| 10 || SCL || PD0 || SCL || SCL_M || || I2C-Bus || O&lt;br /&gt;
|-&lt;br /&gt;
| 11 || INT2 || PJ6 || PCINT15 || INT2 || 4 || MAX7311: INT_N || I&lt;br /&gt;
|-&lt;br /&gt;
| 12 || SDA || PD1 || SDA || SDA_M || || I2C-Bus || I/O&lt;br /&gt;
|-&lt;br /&gt;
| 13 || MRESET || || MRESET || MRESET || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 14 || GND || || GND || GND || || ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====I/O-Patchfield_1====&lt;br /&gt;
Dieses 2x 5-polige &amp;quot;Patchfield_1&amp;quot; (SP3: K8), beschriftet mit &amp;quot;I/O&amp;quot; liegt neben dem Wannenstecker I/O und weist dieselbe Belegung auf. Möchte man auf dem Sensor Board Verbindungen über den Wannenstecker I/O zu einer angeschlossenen Microprozessor-Platine herstellen, dann kann man auf das &amp;quot;Patchfield_1&amp;quot; eine Stiftleiste löten.&lt;br /&gt;
Man braucht dazu: &lt;br /&gt;
* 2-reihige Stiftleiste RM 2,54mm (z.B. 2x40-polig [http://www.conrad.de/ce/de/product/741306/Doppelreihige-Stiftleiste-RM-254-gerade-Pole-2-x-40-10120173-BKL-Electronic-Inhalt-1-St 741306]) &lt;br /&gt;
Man trennt von der 2-reihigen Stiftleiste 2x5 Kontakte ab und lötet sie auf die Lötpunkte &amp;quot;I/O&amp;quot;. Zuvor muss man u.U. Lötzinnreste aus den Lötpunkten mit Entlötlitze bzw. Entlötsaugpumpe entfernen.&lt;br /&gt;
&lt;br /&gt;
'''Stecker I/O an M256 IO_PWM/T0/T1:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''M256-Port''' ||'''M256-Funktion''' || '''Sensor Board-Funktion''' || '''Verwendung''' || '''I/O'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || PD4 || ICP1 || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 2 || || GND || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 3 || PD6 || T1 || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 4 || PB7 || OC0A || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 5 || PG5 || OC0B || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 6 || PD7 || T0 || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 7 || PB5 || OC1A || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 8 || PK5 || ADC13 || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 9 || PB6 || OC1B || &amp;quot;PD5&amp;quot; || I2C Bus Buffer Enable || O&lt;br /&gt;
|-&lt;br /&gt;
| 10 || || VDD || || keine ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====ADC-Patchfield_2====&lt;br /&gt;
Dieses 2x 5-polige &amp;quot;Patchfield_2&amp;quot; (SP3: K9), beschriftet mit &amp;quot;ADC&amp;quot; liegt neben dem Wannenstecker ADC und weist dieselbe Belegung auf. Möchte man auf dem Sensor Board Verbindungen über den Wannenstecker ADC zu einer angeschlossenen Microprozessor-Platine herstellen, dann kann man auf das &amp;quot;Patchfield_2&amp;quot; eine Stiftleiste löten.&lt;br /&gt;
Man braucht dazu: &lt;br /&gt;
* 2-reihige Stiftleiste RM 2,54mm (z.B. 2x40-polig [http://www.conrad.de/ce/de/product/741306/Doppelreihige-Stiftleiste-RM-254-gerade-Pole-2-x-40-10120173-BKL-Electronic-Inhalt-1-St 741306]) &lt;br /&gt;
Man trennt von der 2-reihigen Stiftleiste 2x5 Kontakte ab und lötet sie auf die Lötpunkte &amp;quot;ADC&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
'''Stecker ADC an M256 ADC_IO2/CMP:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''M256-Port''' ||'''M256-Funktion''' || '''Sensor Board-Funktion''' || '''Jumper''' || '''Verwendung''' || '''I/O'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || PK0 || ADC8 || || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 2 || || GND || || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 3 || PK1 || ADC9 || &amp;quot;ADC4&amp;quot; || 6 || SHARP hinten || I&lt;br /&gt;
|-&lt;br /&gt;
| 4 || PE3 || OC3A/AIN1 || || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 5 || PK2 || ADC10 || || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 6 || || GND || || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 7 || PK3 || ADC11 || || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 8 || PE2 || XCK0/AIN0 || || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 9 || PK4 || ADC12 || || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 10 || || VDD || || || keine ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Anschluss-Optionen===&lt;br /&gt;
Hier soll beschrieben werden, welche Anschluss-Optionen es für das RP6 Sensor Board gibt. In erster Linie geht es dabei um die Belegung der vorhandenen Stecker bzw. Stiftleisten.&lt;br /&gt;
&lt;br /&gt;
Allgemein kann man Anschlüsse an Stiftleisten mit entsprechenden Steckbuchsen erreichen. Solche Steckbuchsen sind z.B. bei ELV erhältlich:&lt;br /&gt;
* Steckbuchse, 2-polig, RM 2,54mm ([http://www.elv.de/steckbuchse-2-polig.html ELV 68-016635])&lt;br /&gt;
* Steckbuchse, 3-polig, RM 2,54mm ([http://www.elv.de/steckbuchse-3-polig.html ELV 68-022503])&lt;br /&gt;
* Steckbuchse, 5-polig, RM 2,54mm ([http://www.elv.de/steckbuchse-5-polig.html ELV 68-023073])&lt;br /&gt;
Die Crimpkontakte dieser Steckbuchse werden an Litzen angequetscht (oder angelötet) und zum entsprechenden Sensor bzw. Aktor geführt. &lt;br /&gt;
&lt;br /&gt;
====I2C-MODULE====&lt;br /&gt;
Der I2C-MODULE Anschluss (SP1: M1) auf dem Sensor Board besteht aus einer 9-poligen Präzisions-Buchsenleiste RM 2,54mm (z.B. [http://www.conrad.de/ce/de/product/741360/Praezisions-Buchsenleiste-RM-254-gerade-Pole-1-x-20-10120832-BKL-Electronic-Inhalt-1-St 741360]). Wenn man eigene I2C-Module hier anschliessen will, braucht man zur Kontaktierung:&lt;br /&gt;
* Präzisions-Stiftleiste, 9-polig, RM 2,54mm (z.B. [http://www.conrad.de/ce/de/product/741307/Praezisions-Stiftleiste-RM-254-gerade-Pole-1-x-20-10120536-BKL-Electronic-Inhalt-1-St 741307])&lt;br /&gt;
&lt;br /&gt;
'''I2C-MODULE-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''Sensor Board&amp;lt;br/&amp;gt;-Funktion (M1)''' || '''Verwendung''' || '''I/O''' |||| [[RP6_Sensor_Board_und_Xtra_Module#I2C_GPS_Empf.C3.A4nger_JM3-GPS|'''I2C GPS Empfänger]]&amp;lt;br/&amp;gt;-Funktion (K1)''' ||&lt;br /&gt;
[[RP6_Sensor_Board_und_Xtra_Module#BHT_Modul_JM3-BHT31|'''BHT Modul]]&amp;lt;br/&amp;gt;-Funktion (K1)'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || VCC || +5V || |||| VCC_1 || VDD&lt;br /&gt;
|-&lt;br /&gt;
| 2 || SCLOUT || Buffered I2C-Bus || O |||| SCL/SCK || SCL&lt;br /&gt;
|-&lt;br /&gt;
| 3 || SDAOUT || Buffered I2C-Bus || I/O |||| SDA/MOSI || SDA&lt;br /&gt;
|-&lt;br /&gt;
| 4 || NC || keine || |||| ||&lt;br /&gt;
|-&lt;br /&gt;
| 5 || I/O1 || Status LED || O |||| ||&lt;br /&gt;
|-&lt;br /&gt;
| 6 || I/O2 || Taster || I |||| ||&lt;br /&gt;
|-&lt;br /&gt;
| 7 || NC || keine || |||| ||&lt;br /&gt;
|-&lt;br /&gt;
| 8 || GND || GND (geschaltet!) || |||| GND || GND&lt;br /&gt;
|-&lt;br /&gt;
| 9 || GND || GND (geschaltet!) || |||| GND || GND&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====CAM_IF====&lt;br /&gt;
Der CAM_IF Anschluss (SP1: K28) ist eine 2x 3-polige Stiftleiste mit der folgenden Belegung:&lt;br /&gt;
&lt;br /&gt;
'''CAM_IF-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''Sensor Board&amp;lt;br/&amp;gt;-Funktion (K28)''' || '''Verwendung''' || '''I/O'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || GND || GND (geschaltet!) ||&lt;br /&gt;
|-&lt;br /&gt;
| 2 || VSS_1 || +7,2..10V (RP6: +UB) ||&lt;br /&gt;
|-&lt;br /&gt;
| 3 || SCLOUT || Buffered I2C-Bus || O&lt;br /&gt;
|-&lt;br /&gt;
| 4 || SDAOUT || Buffered I2C-Bus || I/O&lt;br /&gt;
|-&lt;br /&gt;
| 5 || SCL_M || I2C-Bus || O&lt;br /&gt;
|-&lt;br /&gt;
| 6 || SDA_M || I2C-Bus || I/O&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====IO_EXT====&lt;br /&gt;
Der IO_EXT Anschluss (SP1: K19) ist eine 2x 2-polige Stiftleiste mit der folgenden Belegung:&lt;br /&gt;
&lt;br /&gt;
'''IO_EXT-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''Sensor Board&amp;lt;br/&amp;gt;-Funktion (K19)''' || '''Verwendung''' || '''I/O'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || MAX7311: I/O1.2 || freier I/O Port || I/O&lt;br /&gt;
|-&lt;br /&gt;
| 2 || GND || ||&lt;br /&gt;
|-&lt;br /&gt;
| 3 || MAX7311: I/O1.1 || freier I/O Port || I/O&lt;br /&gt;
|-&lt;br /&gt;
| 4 || GND || ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====PWM_OUT====&lt;br /&gt;
Der PWM_OUT Anschluss (SP5: K12) ist eine 2x 4-polige Stiftleiste mit der folgenden Belegung:&lt;br /&gt;
&lt;br /&gt;
'''PWM_OUT-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''Sensor Board&amp;lt;br/&amp;gt;-Funktion (K12)''' || '''Verwendung''' || '''I/O'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || PCA9685: PWM0 || freier PWM Port || O&lt;br /&gt;
|-&lt;br /&gt;
| 2 || PCA9685: PWM1 || freier PWM Port || O&lt;br /&gt;
|-&lt;br /&gt;
| 3 || PCA9685: PWM2 || freier PWM Port || O&lt;br /&gt;
|-&lt;br /&gt;
| 4 || PCA9685: PWM3 || freier PWM Port || O&lt;br /&gt;
|-&lt;br /&gt;
| 5 || PCA9685: PWM4 || freier PWM Port || O&lt;br /&gt;
|-&lt;br /&gt;
| 6 || PCA9685: PWM5 || freier PWM Port || O&lt;br /&gt;
|-&lt;br /&gt;
| 7 || PCA9685: PWM6 || freier PWM Port || O&lt;br /&gt;
|-&lt;br /&gt;
| 8 || PCA9685: PWM7 || freier PWM Port || O&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====TP1====&lt;br /&gt;
Am Testpunkt TP1 (SP4: TP1) kann man das Signal SQW/INT_N der RTC (DS1339) prüfen/messen.&lt;br /&gt;
&lt;br /&gt;
====LEDs====&lt;br /&gt;
=====Rücklichter=====&lt;br /&gt;
Der Rücklichter Anschluss (SP1: K10) ist eine 2-polige Stiftleiste mit der folgenden Belegung:&lt;br /&gt;
&lt;br /&gt;
'''Rücklichter-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''Sensor Board&amp;lt;br/&amp;gt;-Funktion (K10)''' || '''Verwendung''' || '''I/O'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || TCA6507: P3 || Rücklicht rechts || O&lt;br /&gt;
|-&lt;br /&gt;
| 2 || TCA6507: P4 || Rücklicht links || O&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=====Display-Hintergrundbeleuchtung=====&lt;br /&gt;
Der Display-Hintergrundbeleuchtung Anschluss (SP1: K7) ist eine 2-polige Stiftleiste mit der folgenden Belegung:&lt;br /&gt;
&lt;br /&gt;
'''Display-Hintergrundbeleuchtung-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''Sensor Board&amp;lt;br/&amp;gt;-Funktion (K7)''' || '''Verwendung''' || '''I/O'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || TCA6507: P0 || Display-Hintergrundbeleuchtung || O&lt;br /&gt;
|-&lt;br /&gt;
| 2 || VDD_1 || +5V ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=====Freie Ausgänge=====&lt;br /&gt;
Der freie Ausgang 1 Anschluss (SP1: K4) ist eine 2-polige Stiftleiste mit der folgenden Belegung:&lt;br /&gt;
&lt;br /&gt;
'''Freier Ausgang 1-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''Sensor Board&amp;lt;br/&amp;gt;-Funktion (K4)''' || '''Verwendung''' || '''I/O'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || TCA6507: P1 || freier LED Port || O&lt;br /&gt;
|-&lt;br /&gt;
| 2 || VDD_1 || +5V ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Der freie Ausgang 2 Anschluss (SP1: K2) ist eine 2-polige Stiftleiste mit der folgenden Belegung:&lt;br /&gt;
&lt;br /&gt;
'''Freier Ausgang 2-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''Sensor Board&amp;lt;br/&amp;gt;-Funktion (K2)''' || '''Verwendung''' || '''I/O'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || TCA6507: P2 || freier LED Port || O&lt;br /&gt;
|-&lt;br /&gt;
| 2 || VDD_1 || +5V ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====SHARP Sensoren====&lt;br /&gt;
Das RP6 Sensor Board verfügt über zwei Stecker SHARP_F (SP1: K5) und SHARP_R (SP1: K3) zum Anschluß von analogen SHARP Infrarot-Distanz-Sensoren. Folgende SHARP Sensoren sind anschließbar:&lt;br /&gt;
* 1. SHARP Distanz-Sensor GP2Y0A41SK0F ([http://www.conrad.de/ce/de/product/504596/Distanz-Sensor-GP2Y0A41SK0F-Sharp-GP2Y0A41SK0F-Messbereiche-Erfassungsbereich-4-30-cm-5-VDC 504596]), Messbereich 4..30cm&lt;br /&gt;
* 2. SHARP Distanz-Sensor GP2Y0A21YK0F ([http://www.conrad.de/ce/de/product/504591/Distanz-Sensor-GP2Y0A21YK0F-Sharp-GP2Y0A21YK0F-Messbereiche-Erfassungsbereich-10-80-cm-5-VDC 504591]), Messbereich 10..80cm&lt;br /&gt;
* 3. SHARP Distanz-Sensor GP2Y0A02YK ([http://www.conrad.de/ce/de/product/185364/Distanz-Sensor-GP-2-Y0A-02-YK-Sharp-GP-2-Y0A-02-YK-Messbereiche-Erfassungsbereich-20-150-cm-5-VDC 185364]), Messbereich 20..150cm&lt;br /&gt;
* 4. SHARP Distanz-Sensor GP2Y0A710K0F ([http://www.conrad.de/ce/de/product/504597/Distanz-Sensor-GP2Y0A710K0F-Sharp-GP2Y0A710K0F-Messbereiche-Erfassungsbereich-100-550-cm-5-VDC 504597]), Messbereich 100..550cm&lt;br /&gt;
''Die Auswahl der geeigneten SHARP Sensoren hängt von der gewünschten Funktion ab: Zur Erkundung großer Räume eignet sich insbesondere der Typ 4 mit einer hohen Reichweite von 5,5m. Er ist aber ungeeignet, die Distanz von Objekten zu erkennen, die sich näher als 1m vor dem Sensor befinden. Ein guter Kompromiss zwischen Nahbereichsmessung und &amp;quot;Fernsicht&amp;quot; sind die Typen 2 (10..80cm) und 3 (20..150cm). Will man den Distanz-Sensor vor allem zur Vermeidung eins Sturzes von einer Treppe (Tiefenerkennung) oder nur zur Erkennung von Hindernissen direkt vor dem Roboter (Kollisionserkennung) benutzen, dann eignet sich insbesondere für den vorderen Sensor (SHARP_F) der Typ 1, da er im Nahbereich von 4 bis 30cm messen kann.''&lt;br /&gt;
&lt;br /&gt;
Für die Verbindung zwischen den beiden 3-poligen JST XH Steckern (K3, 5) auf dem Sensor Board und den SHARP-Sensoren braucht man auf der Sensor Board Seite folgende Stecker-/buchsenteile:&lt;br /&gt;
* 2x JST XH Gehäuse, 3-polig, RM 2,5mm ([http://www.conrad.de/ce/de/product/740583/Gehaeuse-RM-25-mm-Serie-XH-Rastermass-25-mm-Pole-3-Nennstrom-3-A-XHP-3-JST-Inhalt-1-St 740583])&lt;br /&gt;
* 6x JST XH Crimpkontakt f. RM 2,5mm ([http://www.conrad.de/ce/de/product/741112/Crimpkontakt-fuer-RM-25-mm-Serie-XH-Rastermass-25-mm-BXH-001T-P06-JST-Inhalt-1-St 741112])&lt;br /&gt;
Die Crimpkontakte dieser Steckbuchse werden an die meist 3-adrige Litze des Sensors angequetscht (oder angelötet). Zur Belegung des Sensor Anschlusses siehe das jeweilige Datenblatt!&lt;br /&gt;
&lt;br /&gt;
=====Vorn=====&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_Sensor_Board_SHARP_F.JPG|RP6 Sensor Board SHARP Sensor vorn|thumb]]&lt;br /&gt;
&lt;br /&gt;
Der vordere SHARP Sensor kann auch mechanisch am Sensor Board befestigt werden. Dazu gibt es an der Vorderkante der Platine zwei Befestigungslöcher.&lt;br /&gt;
&lt;br /&gt;
Das Bild rechts zeigt den SHARP Distanzsensor GP2Y0A02YK montiert vorn auf dem Sensor Board mit zwei M3 Gelenkbolzen ([http://www.conrad.de/ce/de/product/521043/Gelenkbolzen-1-x-Aussengewinde1-x-Innengewinde-Messing-vernickelt-Schluesselweite-55-mm/ 521043]) und passenden Schrauben/Muttern.&lt;br /&gt;
&lt;br /&gt;
'''Vorn-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''RP6v2-Port''' ||'''RP6v2-Funktion''' || '''Sensor Board&amp;lt;br/&amp;gt;-Funktion (K5)''' || '''Verwendung''' || '''I/O''' |||| '''SHARP Sensor&amp;lt;br/&amp;gt;-Funktion''' &lt;br /&gt;
|-&lt;br /&gt;
| 1 || PA0 || ADC0 || &amp;quot;ADC0&amp;quot; || SHARP vorn || I |||| Vo&lt;br /&gt;
|-&lt;br /&gt;
| 2 || || || VDD_1 || +5V || |||| Vcc&lt;br /&gt;
|-&lt;br /&gt;
| 3 || || || GND || GND (geschaltet!) || |||| GND&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=====Hinten=====&lt;br /&gt;
Der hintere SHARP Sensor kann z.B. an der Rückseite des RP6v2 Fahrgestells befestigt werden.&lt;br /&gt;
&lt;br /&gt;
'''Hinten-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''M256-Port''' ||'''M256-Funktion''' || '''Sensor Board&amp;lt;br/&amp;gt;-Funktion (K3)''' || '''Verwendung''' || '''I/O''' |||| '''SHARP Sensor&amp;lt;br/&amp;gt;-Funktion''' &lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| 1 || PK1 || ADC9 || &amp;quot;ADC4&amp;quot; || SHARP hinten || I |||| Vo&lt;br /&gt;
|-&lt;br /&gt;
| 2 || || || VDD_1 || +5V || |||| Vcc&lt;br /&gt;
|-&lt;br /&gt;
| 3 || || || GND || GND (geschaltet!) || |||| GND&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Servos====&lt;br /&gt;
=====Power=====&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_Sensor_Board_Servo-PWR.jpg|RP6 Sensor Board Servo-PWR Stecker|thumb]]&lt;br /&gt;
&lt;br /&gt;
An den SERVO_PWR Stecker (SP5: K1) muss ein Akku zur Stromversorgung der mit dem Sensor Board verbundenen Servos angeschlossen werden. Der Stecker hat folgende Belegung:&lt;br /&gt;
 &lt;br /&gt;
'''SERVO_PWR-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''Sensor Board&amp;lt;br/&amp;gt;-Funktion (K1)''' || '''Verwendung'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || GND_POWER || Servo Power GND&lt;br /&gt;
|-&lt;br /&gt;
| 2 || VSS_POWER || Servo Power Eingang +7,2..10V&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Der Akku zur Versorgung der Servos muss eine Nennspannung von 7,2..10V aufweisen. Der Schaltregler auf dem Sensor Board kann bei einer 5,0V Servo-Spannung Ströme bis 3,0A (Spitzen bis 5,0A) liefern. '''Die Polung des Akkus darf am Stecker SERVO_PWR nicht vertauscht werden.''' Siehe den oberen Teil der nebenstehenden Abbildung! Ratsam ist es, eine Sicherung 3,15A in die Plusleitung zwischen Akku und SERVO_PWR Stecker zu legen.&lt;br /&gt;
&lt;br /&gt;
Für die Verbindung zwischen dem 2-poligen JST XH Stecker (SERVO_PWR, K1) auf dem Sensor Board und dem Akku braucht man auf der Sensor Board Seite folgende Stecker-/buchsenteile:&lt;br /&gt;
* JST XH Gehäuse, 2-polig, RM 2,5mm ([http://www.conrad.de/ce/de/product/740549/Gehaeuse-RM-25-mm-Serie-XH-Rastermass-25-mm-Pole-2-Nennstrom-3-A-XHP-2-JST-Inhalt-1-St 740549])&lt;br /&gt;
* 2x JST XH Crimpkontakt f. RM 2,5mm ([http://www.conrad.de/ce/de/product/741112/Crimpkontakt-fuer-RM-25-mm-Serie-XH-Rastermass-25-mm-BXH-001T-P06-JST-Inhalt-1-St 741112])&lt;br /&gt;
Die Crimpkontakte dieser Steckbuchse werden an die 2-adrige Litze zum Akku angequetscht (oder angelötet).&lt;br /&gt;
&lt;br /&gt;
Wenn man keinen separaten Akku zur Versorgung der Servos nehmen will, kann man auch +UB der RP6v2 Base dafür nutzen. An +UB liegt die Akkuspannung der Base (Nennspannung 7,2V) über eine Sicherung F1 3,15A (RP6v2) bzw. 2,5A (RP6) auf dem Mainboard an. +UB kann man z.B. am [[RP6#EXT_Anschlu.C3.9F|EXT Anschluß der Base]] entnehmen. Die nebenstehende Abbildung zeigt im unteren Teil, an welchen Pins man dort +UB kontaktieren kann!&lt;br /&gt;
&lt;br /&gt;
Dabei ist zu beachten, dass die Sicherung F1 auf dem RP6(v2) Mainboard den nutzbaren Strom für die Servos deutlich begrenzt: Durch diese Sicherung fließt ja nicht nur der Servo-Strom, sondern auch der Strom für den RP6 und alle darauf montierten Zusatzplatinen. Wenn der RP6 also herumfährt und z.B. noch die IRCOMM-Sendedioden nutzt, bleibt kaum noch Stromreserve für die Servos auf dem Sensor Board übrig.&lt;br /&gt;
'''Das bedeutet: Man sollte unbedingt einen separaten Akku für die Servos auf dem Sensor Board benutzen!'''&lt;br /&gt;
&lt;br /&gt;
======SERVO_PWR-EXT Verbindung======&lt;br /&gt;
Für die Verbindung zwischen dem 2-poligen JST XH Stecker (SERVO_PWR, K1) auf dem Sensor Board und dem 8-poligen JST XH Stecker (EXT) auf dem RP6v2 Mainboard braucht man folgende Stecker-/buchsenteile:&lt;br /&gt;
* JST XH Gehäuse, 2-polig, RM 2,5mm ([http://www.conrad.de/ce/de/product/740549/Gehaeuse-RM-25-mm-Serie-XH-Rastermass-25-mm-Pole-2-Nennstrom-3-A-XHP-2-JST-Inhalt-1-St 740549])&lt;br /&gt;
* JST XH Gehäuse, 8-polig, RM 2,5mm ([http://www.conrad.de/ce/de/product/740928/Gehaeuse-RM-25-mm-Serie-XH-Rastermass-25-mm-Pole-8-Nennstrom-3-A-XHP-8-JST-Inhalt-1-St 740928])&lt;br /&gt;
* 10x JST XH Crimpkontakt f. RM 2,5mm ([http://www.conrad.de/ce/de/product/741112/Crimpkontakt-fuer-RM-25-mm-Serie-XH-Rastermass-25-mm-BXH-001T-P06-JST-Inhalt-1-St 741112])&lt;br /&gt;
Mit einer 2-adrigen Litze, die beidseits mit den Crimpkontakten verquetscht (oder verlötet) wird, verbindet man dann den SERVO_PWR Stecker mit dem EXT Stecker, wie in der Abbildung oben gezeigt. ''Achtung: Plus (+) und Minus (-) nicht vertauschen!''&lt;br /&gt;
 Ein passendes Kabel soll zukünftig (*) mitgeliefert werden.&lt;br /&gt;
&lt;br /&gt;
Auf dem RP6 Mainboard ist der 8-polige EXT Stecker noch nicht bestückt. Wenn man ihn nachrüsten will, muss man noch bestellen:&lt;br /&gt;
* JST XH Stiftleiste gerade, 8-polig, RM 2,5mm ([http://www.conrad.de/ce/de/product/740105/Stiftleiste-gerade-RM-25-mm-Serie-XH-Rastermass-25-mm-Pole-8-Nennstrom-3-A-B8B-XH-A-LFSN-JST-Inhalt-1-St 740105])&lt;br /&gt;
Die Stiftleiste wird auf das RP6 Mainboard gelötet, dabei weisen die beiden Einkerbungen an einer Längsseite der Stiftleiste nach hinten zum Rand des Mainboards.&lt;br /&gt;
 Auch diese Stiftleiste soll zukünftig (*) zum Lieferumfang gehören.&lt;br /&gt;
'''Zu *)''' Meinem RP6 Sensor Board (bestellt am 1.3.2014) lag das konfektionierte Kabel und die Stiftleiste noch nicht bei!&lt;br /&gt;
&lt;br /&gt;
=====Stecker=====&lt;br /&gt;
An die acht 3-poligen Stiftleisten SERVO_1 bis SERVO_8 (SP5: K6, 11, 29..34) können Servos angeschlossen werden. Direkt aufstecken kann man Servo-Steckbuchsen mit der Belegung von CONRAD, Graupner/JR und Robbe/Futaba (Versorgungsspannung Plus am mittleren Pin). Auf der Sensor Board Platine kann man den Pin 3 (Servo Power GND) der 3-poligen Stiftleisten daran erkennen, dass er näher zum rechten Platinenrand (Seite mit dem XBUS Stecker) angeordnet ist als der zugehörige Pin 1 (Servo Signal).&lt;br /&gt;
&lt;br /&gt;
Wenn Servos mit nicht passender Steckbuchse angeschlossen werden sollen, dann braucht man auf der Sensor Board Seite folgende Stecker-/buchsenteile für jedes Servo:&lt;br /&gt;
* Steckbuchse, 3-polig, RM 2,54mm ([http://www.elv.de/steckbuchse-3-polig.html ELV 68-022503])&lt;br /&gt;
Die Crimpkontakte dieser Steckbuchse werden an die 3-adrige Litze des Servos angequetscht (oder angelötet). &lt;br /&gt;
&lt;br /&gt;
'''SERVO_1..8-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''Sensor Board&amp;lt;br/&amp;gt;-Funktion (K6,11,29..34)''' || '''Verwendung''' || '''I/O''' |||| '''Servo-&amp;lt;br/&amp;gt;Kabelfarben'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || PCA9685: PWM15..8 || Servo Signal || O |||| Weiß, Orange&lt;br /&gt;
|-&lt;br /&gt;
| 2 || Servo_PWR || Servo Power +5V (geschaltet!) || |||| Rot&lt;br /&gt;
|-&lt;br /&gt;
| 3 || GND_POWER || Servo Power GND || |||| Schwarz, Braun&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Roboterarm RA2-HOBBY====&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_Sensor_Board_RA2-MINI.JPG|RP6 Sensor Board mit Roboterarm RA2-MINI|thumb]]&lt;br /&gt;
&lt;br /&gt;
In der Anleitung zum RP6 Sensor Board ist der Arexx Roboterarm RA2-HOBBY bzw. RA2-MINI [http://www.conrad.de/ce/de/product/191534/Arexx-Mini-Roboterarm-RA2-MINI (191534)] abgebildet. Er ist dort ohne Grundgestell und Controller-Platine auf dem Sensor Board befestigt.&lt;br /&gt;
Das Sensor Board eignet sich sehr gut zur Ansteuerung der 6 Servos des Roboterarms.&lt;br /&gt;
&lt;br /&gt;
Zur Montage des RA2-MINI auf dem Sensor Board geht man so vor:&lt;br /&gt;
* Lösen der 4 Rundkopfschrauben M3x6, die die Servobodenplatte mit den Abstandbolzen M3x30 auf der Controller-Platine verbinden (siehe Anleitung zum RA2-MINI, Seite 19!)&lt;br /&gt;
* Lösen der Servobodenplatte vom Bodenservo (siehe Anleitung zum RA2-MINI, Seite 8!)&lt;br /&gt;
* Bohren der Befestigungslöcher in die Servobodenplatte:&lt;br /&gt;
** Rechts-Links Lochabstand 4,75cm, Vorn-Hinten Lochabstand 4,1cm&lt;br /&gt;
** Ungefähre Lage der Löcher siehe Abbildung in der Anleitung zum Sensor Board, Seite 4!&lt;br /&gt;
** Markierung der Bohrlöcher auf der Rückseite der Servobodenplatte:&lt;br /&gt;
*** 1. Mit einer Hilfslinie die Hinterkante des Servoausschnitts (das ist die kürzere Kante, die näher am Rand der Bodenplatte liegt!) nach beiden Seiten verlängern&lt;br /&gt;
*** 2. Eine 2. Hilfslinie parallel zur ersten im Abstand von 1,4cm zur Mitte der Servobodenplatte hin einzeichnen&lt;br /&gt;
*** 3. Auf dieser Linie jetzt die beiden hinteren Bohrlöcher symmetrisch im Abstand von 4,75cm markieren&lt;br /&gt;
*** 4. Für die vorderen Bohrlöcher eine 3. Hilfslinie im Abstand von 4,1cm parallel zur 2. Linie einzeichnen&lt;br /&gt;
*** 5. Auf dieser Linie die beiden vorderen Bohrlöcher symmetrisch im Abstand von 4,75cm markieren&lt;br /&gt;
*** 6. Kontrolle: Die 4 markierten Bohrlochpositionen bilden ein Rechteck mit 4,1cm seitlicher und 4,75cm vorderer/hinterer Kantenlänge&lt;br /&gt;
** Bohren der 4 Löcher (D = 3,2mm) in die Servobodenplatte&lt;br /&gt;
* Befestigen des Bodenservos auf der Servobodenplatte (siehe Anleitung zum RA2-MINI, Seite 8!)&lt;br /&gt;
* Anbringen des Roboterarms auf dem Sensor Board mit 4 Abstandbolzen M3 (L = 30..50mm) und passenden Schrauben/Muttern&lt;br /&gt;
&lt;br /&gt;
Die Servo-Steckbuchsen werden dann ''in der selben Reihenfolge (S1..S6) wie vorher auf der Controller-Platine des Roboterarms'' auf die Stiftleisten SERVO_1 bis SERVO_6 des Sensor Boards gesteckt.&lt;br /&gt;
'''Man sollte unbedingt einen separaten Akku für die Servos auf dem Sensor Board benutzen!'''&lt;br /&gt;
&lt;br /&gt;
====Grafik-Display====&lt;br /&gt;
Ob es mal ein Grafik-Display für das RP6 Sensor Board geben wird, ist ''pure Spekulation''. Allerdings gibt es zwei Hinweise darauf, dass eine solche Hardware-Ergänzung kommen könnte:&lt;br /&gt;
* 1. Der vorbereitete Anschluss für eine [[RP6_Sensor_Board_und_Xtra_Module#Display-Hintergrundbeleuchtung|Display-Hintergrundbeleuchtung]]&lt;br /&gt;
* 2. Die 4 Befestigungslöcher in der Mitte des Sensor Boards&lt;br /&gt;
Wir werden sehen ...&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==RP6 Xtra Module==&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_Xtra_module.JPG|RP6 Xtra module|right|500px]]&lt;br /&gt;
&lt;br /&gt;
Von den '''AREXX RP6 Xtra Modulen''' sind bei [http://www.conrad.de/ce/ CONRAD] für den RP6v2 erhältlich:&lt;br /&gt;
* Arexx [[RP6_Sensor_Board_und_Xtra_Module#I2C_GPS_Empf.C3.A4nger_JM3-GPS|I2C GPS Empfänger JM3-GPS]] ([http://www.conrad.de/ce/de/product/1082385/Arexx-IC-GPS-Empfaenger-JM3-GPS 1082385] AUSVERKAUFT!)&lt;br /&gt;
* Arexx [[RP6_Sensor_Board_und_Xtra_Module#Gyro_Modul_JM3-GYRO|Gyro Modul JM3-GYRO]] ([http://www.conrad.de/ce/de/product/1082386/Arexx-Gyro-Modul-JM3-GYRO 1082386] AUSVERKAUFT!)&lt;br /&gt;
* Arexx [[RP6_Sensor_Board_und_Xtra_Module#3D_Accelerometer_Modul_JM3-3DA|3D Accelerometer Modul JM3-3DA]] ([http://www.conrad.de/ce/de/product/1082387/Arexx-3D-Accelerometer-Modul-JM3-3DA 1082387] AUSVERKAUFT!)&lt;br /&gt;
* Arexx [[RP6_Sensor_Board_und_Xtra_Module#BHT_Modul_JM3-BHT31|BHT Modul JM3-BHT31]] ([http://www.conrad.de/ce/de/product/1302995/Arexx-Asuro-xTend-BHT-JM3-BHT31 1302995] AUSVERKAUFT!)&lt;br /&gt;
&lt;br /&gt;
===I2C GPS Empfänger JM3-GPS===&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_I2C_GPS_Empfänger.JPG|RP6 I2C GPS Empfänger|thumb]]&lt;br /&gt;
&lt;br /&gt;
(Laut Online-Katalog der Firma CONRAD!)&lt;br /&gt;
&lt;br /&gt;
''&amp;quot;Universelles GPS-I²C-Bus Modul für RP6 Roboter. Der GPS Empfänger stellt die NMEA-0183 Datensätze GGA, RMC, GSA und VTG in den veschiedenen Registern zur Verfügung. Damit ist eine einfache Weiterverarbeitung möglich.&amp;quot;''&lt;br /&gt;
&lt;br /&gt;
Aktuell (Oktober 2017) ist der I2C GPS Empfänger bei CONRAD ausverkauft.&lt;br /&gt;
&lt;br /&gt;
====Beschreibung====&lt;br /&gt;
Der I2C GPS Empfänger ist eine kleine (38 x 23 mm) Zusatzplatine (RP6 Xtra Modul), die direkt auf das [[RP6_Sensor_Board_und_Xtra_Module#RP6_Sensor_Board_2|RP6 Sensor Board]] aufgesteckt werden kann. Sie kann aber auch überall eingesetzt werden, wo eine stabilisierte 5V Versorgungsspannung und ein 5V-I2C-Bus bis 400 kHz zur Verfügung steht.&lt;br /&gt;
&lt;br /&gt;
Die Platine ist bestückt mit dem &amp;quot;Fastrax GPS antenna module&amp;quot; [https://www.u-blox.com/de/positioning-antennas/gnss-antenna-modules/uc530.html UC530]. Als Backup-Batterie dient eine wieder aufladbare Lithium-Batterie ([http://www.farnell.com/datasheets/321180.pdf MS621FE]). Zur Kommunikation zwischen dem UC530 und dem I2C-Bus ist ein [http://www.atmel.com/Images/Atmel-8303-8-bit-AVR-Microcontroller-tinyAVR-ATtiny1634_Datasheet.pdf ATtiny1634] an Bord, der auch die Auswertung des [http://de.wikipedia.org/wiki/NMEA_0183 NMEA Protokolls] übernimmt. Die 3,3 V Versorgungsspannung wird auf der Platine durch einen Spannungsregler ([http://www.mouser.com/ds/2/405/lm3480-316799.pdf LM3480IM3-3.3]) erzeugt. Über den I2C-Bus können folgende Daten der NMEA-0183 Datensätze GGA, RMC, GSA und VTG auf einfache Weise gelesen werden:&lt;br /&gt;
&lt;br /&gt;
* Geograf. Breite&lt;br /&gt;
* Geograf. Länge&lt;br /&gt;
* GPS Status&lt;br /&gt;
* HDOP&lt;br /&gt;
* Satellitenzahl&lt;br /&gt;
* Kurs&lt;br /&gt;
* Geschwindigkeit&lt;br /&gt;
* Höhe&lt;br /&gt;
* UTC-Zeit&lt;br /&gt;
* Datum&lt;br /&gt;
* PDOP&lt;br /&gt;
* VDOP&lt;br /&gt;
* Satellit 1..12&lt;br /&gt;
&lt;br /&gt;
Der ATtiny1634 ist natürlich vorprogrammiert, kann aber über eine vorbereitete 6-polige ISP-Schnittstelle auf der Platine auch umprogrammiert werden.&lt;br /&gt;
&lt;br /&gt;
'''Lieferumfang'''&lt;br /&gt;
* I2C GPS Empfänger&lt;br /&gt;
* CD mit Anleitung und Software-Beispielen.&lt;br /&gt;
&lt;br /&gt;
====Technische Daten====&lt;br /&gt;
* Versorgungsspannung: 5,0 V +/- 5%&lt;br /&gt;
* Stromverbrauch: &amp;lt;= 20 mA (typ.)&lt;br /&gt;
* I2C-Bus Geschwindigkeit: &amp;lt;= 400 kHz&lt;br /&gt;
* GPS Antenne: eingebaut&lt;br /&gt;
* Backup Batterie: Lithium, im Betrieb wieder aufladbar&lt;br /&gt;
* Temperatur Bereich: -10 bis 65 °C&lt;br /&gt;
* Form Faktor: 38 x 23 mm&lt;br /&gt;
* Gewicht: ca. 6 g&lt;br /&gt;
* Empfänger Spezifikationen (UC530):&lt;br /&gt;
** Empfänger: GPS L1 C/A-Code, SPS&lt;br /&gt;
** Kanäle: 66/22 (Suche/Track)&lt;br /&gt;
** Tracking Empfindlichkeit: -165 dBm typ.&lt;br /&gt;
** Navigations Empfindlichkeit: -148 dbm typ (Kaltstart)&lt;br /&gt;
** Update Rate: 1 Sek.&lt;br /&gt;
** Positions Genauigkeit:&lt;br /&gt;
*** 3,0m (67%) typ. horizontal&lt;br /&gt;
*** 5,0m (67%) typ. vertikal&lt;br /&gt;
*** 0,02 m/s (50%) typ. Geschwindigkeit&lt;br /&gt;
** Zeit bis zum ersten Fix: typ. 31 Sek.&lt;br /&gt;
** Protokoll: NMEA-0183 Rev. 3.01&lt;br /&gt;
&lt;br /&gt;
====Anschluss-Schema====&lt;br /&gt;
Belegung des 9-poligen Anschluss-Steckers (K1) siehe in [[RP6_Sensor_Board_und_Xtra_Module#I2C-MODULE|dieser]] Tabelle!&lt;br /&gt;
&lt;br /&gt;
====Umbau-Optionen====&lt;br /&gt;
Wenn man den ATtiny1634 selbst programmieren will, muss man Stiftleisten auf die Platine löten.&lt;br /&gt;
&lt;br /&gt;
Man braucht dazu: &lt;br /&gt;
* 2-reihige Stiftleiste RM 2,54mm (z.B. 2x40-polig 741306) &lt;br /&gt;
&lt;br /&gt;
Man trennt von der 2-reihigen Stiftleiste 2x3 Kontakte ab und lötet sie auf die Punkte &amp;quot;ISP6&amp;quot;.&lt;br /&gt;
Mit einem ISP-Programmer kann dann eine neue Firmware geflasht werden. Die aktuelle Firmware des ATtiny1634 (Version 1.2) wird als .HEX mitgeliefert, leider ohne Source-Code.&lt;br /&gt;
&lt;br /&gt;
Vorsicht: Dabei kann der Prozessor im schlimmsten Fall nicht mehr ansprechbar sein oder der GPS Empfänger UC530 beschädigt werden. Man sollte diesen Umbau und die ISP-Programmierung nur machen, wenn man genau weiß, was man macht! &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Gyro Modul JM3-GYRO===&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_Gyro_Modul.JPG|RP6 Gyro Modul|right|200px]]&lt;br /&gt;
&lt;br /&gt;
(Laut Online-Katalog der Firma CONRAD!)&lt;br /&gt;
&lt;br /&gt;
''&amp;quot;Das universelle Gyro-Sensor Modul für RP6, RP6 V2, RP6 ATMEGA32 und das RP6 V2 Control M256 Wifi-Kit ist ideal zur Erkennung der Blockierung des Roboters in seiner Drehbewegung, sowie der Stabilisierung der Geradeausfahrt.&amp;quot;''&lt;br /&gt;
&lt;br /&gt;
Aktuell (April 2019) ist das Gyro Modul bei CONRAD ausverkauft. &lt;br /&gt;
&lt;br /&gt;
====Beschreibung====&lt;br /&gt;
Das Gyro Modul ist eine kleine (19 x 17 mm) Zusatzplatine (RP6 Xtra Modul), die im RP6-System genutzt werden kann. Es gibt zwar keinen direkt passenden &amp;quot;Steckplatz&amp;quot; auf einer der Microcontroller-Plattformen (RP6v2, M32, M128, M256 Wifi), jedoch ist der Anschluß einfach:&lt;br /&gt;
Benötigt werden +5V und GND, sowie ein freier ADC-Kanal, der bis 5V messen kann. Damit kann das Gyro Modul sehr universell eingesetzt werden. Es misst die Drehrate um die Z-Achse (Hochachse oder Yaw).&lt;br /&gt;
&lt;br /&gt;
Die Platine ist bestückt mit dem analogen Gyro-Sensor [http://www.st.com/web/en/resource/technical/document/datasheet/CD00254111.pdf LY330ALH], dessen Ausgangsspannung durch zwei OP-Amps ([http://www.ti.com.cn/cn/lit/ds/symlink/lm321.pdf LM321], [http://www.produktinfo.conrad.com/datenblaetter/00000-24999/001072615-da-01-en-IC_AMP_PREC_LMP7731MF_NOPB_SOT_23_5_TID.pdf LMP7731MF]) in Ruhe bei 2,5 V liegt. Höhere Ausgangsspannungen (bis 5 V) bedeuten eine Drehgeschwindigkeit nach LINKS, niedrigere (bis 0 V) eine Drehgeschwindigkeit nach RECHTS. Die 3,3 V Versorgungsspannung des LY330ALH wird auf der Platine durch einen Spannungsregler ([http://www.mouser.com/ds/2/405/lm3480-316799.pdf LM3480IM3-3.3]) erzeugt.&lt;br /&gt;
&lt;br /&gt;
'''Lieferumfang'''&lt;br /&gt;
* Gyro Modul&lt;br /&gt;
* CD mit Anleitung und Software-Beispielen.&lt;br /&gt;
&lt;br /&gt;
====Technische Daten====&lt;br /&gt;
&lt;br /&gt;
* VDD: 5,0 V +/- 5%&lt;br /&gt;
* Vout(0): 2,5 V +/- 2% (ohne Bewegung)&lt;br /&gt;
* Vout: Vout(0) + 10mV / dps +/- 2%&lt;br /&gt;
* Messbereich: ca. 200 dps max.&lt;br /&gt;
&lt;br /&gt;
====Anschluss-Schema====&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_Gyro_Modul_SP.JPG|RP6 Gyro Modul - Anschluss-Schema]]&lt;br /&gt;
&lt;br /&gt;
====Umbau-Optionen====&lt;br /&gt;
Am Gyro Modul gibt es nichts umzubauen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===3D Accelerometer Modul JM3-3DA===&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_3D_Accelerometer_Modul.JPG|RP6 3D Accelerometer Modul|right|105px]]&lt;br /&gt;
&lt;br /&gt;
(Laut Online-Katalog der Firma CONRAD!)&lt;br /&gt;
&lt;br /&gt;
''&amp;quot;Universeller 3-Achsen Beschleunigungssensor für RP6, RP6 V2, RP6 ATMEGA32 und das RP6 V2 Control M256 WIFI-Kit. Ideal zur Winkelmessung (Neigung-, Kipp-Winkel) und vieles mehr.&amp;quot;''&lt;br /&gt;
&lt;br /&gt;
Seit Mai 2020 ist das 3D Accelerometer Modul bei CONRAD ausverkauft.&lt;br /&gt;
&lt;br /&gt;
====Beschreibung====&lt;br /&gt;
&lt;br /&gt;
Das 3D Accelerometer Modul ist eine kleine (15 x 10 mm) Zusatzplatine (RP6 Xtra Modul), die direkt auf den EEPROM-Sockel (IC5) der Zusatzplatine [[RP6#RP6_CONTROL_M32_Platine|RP6 CONTROL M32]] gesteckt und über den SPI-Bus angesteuert werden kann. Das Accelerometer Modul kann aber auch mit allen Microcontroller-Plattformen betrieben werden, die eine stabilisierte 5V-Versorgungsspannung und einen SPI- oder I2C-Bus bieten.&lt;br /&gt;
&lt;br /&gt;
Die Platine ist bestückt mit dem 3D Beschleunigungs-Sensor [http://www.farnell.com/datasheets/1691680.pdf LIS302DLH]. Die 3,3 V Versorgungsspannung des LIS302DLH wird auf der Platine durch einen Spannungsregler ([http://www.mouser.com/ds/2/405/lm3480-316799.pdf LM3480IM3-3.3]) erzeugt.&lt;br /&gt;
&lt;br /&gt;
'''Lieferumfang'''&lt;br /&gt;
* 3D Accelerometer Modul&lt;br /&gt;
* CD mit Anleitung und Software-Beispielen.&lt;br /&gt;
&lt;br /&gt;
====Technische Daten====&lt;br /&gt;
&lt;br /&gt;
* VDD: 5,0 V +/- 5%&lt;br /&gt;
* Messbereiche: +-2 g, +-4 g, +-8 g&lt;br /&gt;
* Datenausgabe: 16 Bit&lt;br /&gt;
* Schnittstellen: I2C, SPI&lt;br /&gt;
&lt;br /&gt;
====Anschluss-Schema====&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_3D_Accelerometer_Modul_SP.JPG|RP6 3D Accelerometer Modul - Anschluss-Schema|350px]]&lt;br /&gt;
&lt;br /&gt;
====Umbau-Optionen====&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_3D_Accelerometer_Modul_M32.JPG|RP6 3D Accelerometer Modul auf der M32|right|500px]]&lt;br /&gt;
&lt;br /&gt;
'''Will man das Modul auf der M32 einsetzen, muss man auf dem 3D Accelerometer Modul die Widerstände R2 und R3 (falls vorhanden!) auslöten (siehe Anleitung zum Modul, Seiten 4/5!)''' und einen IC-Sockel an Position IC5 und einen Kondensator an Position C19 auf der M32 einlöten, siehe [[RP6#Zweites_SPI-EEPROM|hier]]!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die Abbildung rechts zeigt das 3D Accelerometer Modul auf der M32.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===BHT Modul JM3-BHT31===&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_BHT_Modul.PNG|RP6 BHT Modul|right|203px]]&lt;br /&gt;
&lt;br /&gt;
Dieses [http://jm3-engineering.com/sensors.htm BHT Modul] zur Messung von Luftdruck, Luftfeuchte und Temperatur war für das Ende des 3. Quartals 2014 angekündigt und ist nun ab dem 22.01.2015 lieferbar.&lt;br /&gt;
&lt;br /&gt;
(Laut Online-Katalog der Firma CONRAD!)&lt;br /&gt;
&lt;br /&gt;
''&amp;quot;Ein Luftdruck-, rel. Luftfeuchtigkeits- und Temperatursensor Modul für vielfältige Anwendungen. Es kann direkt in den Asuro Expansion-Port auf dem Asuro xTend Bord eingesteckt werden. Das Asuro Modul kann mit den anderen erhältlichen Modulen (Kompass/Gyro und RTC kombiniert werden (Stack-up)). Außerdem kann es auch auf dem RP6 Sensor Bord in dem I2C Modulsteckplatz verwendet werden. Das Sensor Modul verwendet den hochauflösenden Drucksensor-Chip MS5607-02BA und den Luftfeuchtigkeitssensor HTU21D von MEAS Switzerland mit I2C Bus Interface. Der barometrische Drucksensor ist für Höhenmesser und Variometer optimiert und hat eine Auflösung von 20cm. Der relative Luftfeuchtigkeits- und Temperatursensor bietet zuverlässige und genaue Daten, welche sich auch besonders für Wetterstations-Informationen eignen.&amp;quot;''&lt;br /&gt;
&lt;br /&gt;
Aktuell (April 2019) ist das BHT Modul bei CONRAD ausverkauft. &lt;br /&gt;
&lt;br /&gt;
====Beschreibung====&lt;br /&gt;
Das BHT Modul ist eine kleine (24 x 14 mm) Zusatzplatine (ASURO xTend bzw. RP6 Xtra Modul), die direkt auf das [[RP6_Sensor_Board_und_Xtra_Module#RP6_Sensor_Board_2|RP6 Sensor Board]] aufgesteckt werden kann. Sie kann auch auf dem [http://www.conrad.de/ce/de/product/1302085/Arexx-Asuro-xTend-Board-JM3-AXT3 Arexx Asuro xTend Board] und überall eingesetzt werden, wo eine stabilisierte 5V Versorgungsspannung und ein I2C-Bus bis 400 kHz zur Verfügung steht.&lt;br /&gt;
&lt;br /&gt;
Die Platine ist bestückt mit dem barometrischen Drucksensor [http://www.parallax.com/sites/default/files/downloads/29124-MS5607-02BA03-Datasheet.pdf MS5607-02BA] und dem relativen Luftfeuchtigkeits- und Temperatursensor [http://www.meas-spec.com/downloads/HTU21D.pdf HTU21D]. Die 3,0 V Versorgungsspannung der Sensoren wird auf der Platine durch einen Spannungsregler ([http://www.farnell.com/datasheets/78902.pdf LP2980AIM5-3.0]) erzeugt. &lt;br /&gt;
&lt;br /&gt;
'''Lieferumfang'''&lt;br /&gt;
* BHT Modul&lt;br /&gt;
* CD mit Dokumentation&lt;br /&gt;
&lt;br /&gt;
====Technische Daten====&lt;br /&gt;
&lt;br /&gt;
* Nennspannung: 3,3 V (?)&lt;br /&gt;
* Nennstrom: 0,2 mA (typ.) &amp;lt; 1,5mA peaktyp.&lt;br /&gt;
* I2C Bus Geschwindigkeit: 400kHz max.&lt;br /&gt;
* Sensor Modul mit MS5607-02BA und HTU21D&lt;br /&gt;
* Hohe Auflösung des Sensorelements - Höhe: 20cm /- rel. Luftfeuchtigkeit: 0,04%&lt;br /&gt;
* Schneller AD-Wandler&lt;br /&gt;
* Digitaler Drucksensor (24 bit ΔΣ ADC)&lt;br /&gt;
* Luftdruckbereich: 10 bis 1200 mbar&lt;br /&gt;
* Exzellente Langzeitstabilität&lt;br /&gt;
* Unmittelbare Desaturierung&lt;br /&gt;
* Kalibrierung in der Fabrik&lt;br /&gt;
&lt;br /&gt;
====Anschluss-Schema====&lt;br /&gt;
Belegung des 9-poligen Anschluss-Steckers (K1) siehe in [[RP6_Sensor_Board_und_Xtra_Module#I2C-MODULE|dieser]] Tabelle!&lt;br /&gt;
&lt;br /&gt;
====Umbau-Optionen====&lt;br /&gt;
&lt;br /&gt;
===Xtra Module auf einer Experimentierplatine===&lt;br /&gt;
&lt;br /&gt;
Die drei bis jetzt (09/2014) erhältlichen [[RP6_Sensor_Board_und_Xtra_Module#RP6_Xtra_Module_2|Xtra Module]], die die Navigation eines Roboters ermöglichen, können problemlos im RP6-System genutzt werden,- zwei davon sogar in Form des direkten Aufsteckens auf eine der Zusatz-Platinen: Für den [[RP6_Sensor_Board_und_Xtra_Module#I2C_GPS_Empf.C3.A4nger_JM3-GPS|I2C GPS Empfänger]] gibt es einen Steckplatz auf dem [[RP6_Sensor_Board_und_Xtra_Module#RP6_Sensor_Board_2|RP6 Sensor Board]], das [[RP6_Sensor_Board_und_Xtra_Module#3D_Accelerometer_Modul_JM3-3DA|3D Accelerometer Modul]] kann auf der [[RP6#RP6_CONTROL_M32_Platine|RP6 CONTROL M32]] aufgesteckt werden.&lt;br /&gt;
&lt;br /&gt;
Natürlich können die Xtra Module auch allein (&amp;quot;stand-alone&amp;quot;) ohne RP6 Sensor Board oder RP6 CONTROL M32 betrieben werden. Dazu kann man sie z.B. auf einer [[RP6#Experimentierplatine|Experimentierplatine]] aufbauen. &lt;br /&gt;
&lt;br /&gt;
Das soll hier mit einer kurzen Aufbauanleitung demonstriert werden.&lt;br /&gt;
&lt;br /&gt;
====Schaltplan====&lt;br /&gt;
&lt;br /&gt;
Aber zunächst der Schaltplan:&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6v2_Xtra_Module_SP.jpg|RP6 Experimentierplatine für Xtra Module - Schaltplan]]&lt;br /&gt;
&lt;br /&gt;
Man erkennt die drei XTra Module, die (bis auf das Gyro Modul) an den I2C-Bus am XBUS Stecker des RP6 angeschlossen sind. Das [[RP6_Sensor_Board_und_Xtra_Module#Gyro_Modul_JM3-GYRO|Gyro Modul JM3-GYRO]] wird nicht über I2C angesteuert, sondern liefert an seinem Pin OUT ein analoges Ausgangssignal, das mit einem ADC Eingang (0..5V) gemessen werden kann.&lt;br /&gt;
&lt;br /&gt;
Der Jumper (Steckbrücke) JP1 dient zum Einstellen der I2C-Adresse des 3D Accelerometer Moduls (0x30, 0x32).&lt;br /&gt;
Mit JP2/3 wird die [[RP6_Sensor_Board_und_Xtra_Module#Optionale_Ansteuerung|Betriebsart des Gyro Moduls]] festgelegt.&lt;br /&gt;
Die Jumper JP4 bis JP9 dienen zur Verteilung von INT1, INT2 des 3D Accelerometer Moduls und des OUT Signals des Gyro Moduls auf die INT-Anschlüsse INT1..3, INTU des XBUS. Wenn man die Interrupts des 3D Accelerometer Moduls nicht nutzen will, kann man die Jumper JP4 bis JP8 auch weglassen. Mit JP9 wird das analoge Signal des Gyro Moduls an INT1 des XBUS gelegt. Dies ist nur dann sinnvoll, wenn man die Platine mit der RP6v2 Base betreibt, weil hier an INT1 ein ADC Eingang (ADC4) liegt. Bei allen anderen Plattformen des RP6-Systems (M32, CCPRO M128, M256 WiFi) muss JP9 offen bleiben.&lt;br /&gt;
&lt;br /&gt;
Mit dieser Schaltung kann man also den Beschleunigungssensor (3D Accelerometer) und den GPS Empfänger über I2C auslesen. Der Gyro wird entweder mit ADC4 der RP6v2 Base (JP9 geschlossen!) ausgewertet oder durch einen anderen ADC Eingang. Dazu kann man das Ausgangssignal des Gyros an Pin 3 der Stiftleiste ST1 abnehmen. Von dort kann es z.B. zu ADC0 oder ADC1 der RP6v2 Base oder der RP6 CONTROL M32 geführt werden oder zu einem beliebigen ADC Eingang der CCPRO M128 oder der M256 WiFi. Die Stiftleiste ST1 liegt direkt neben dem USRBUS, so dass die Verbindung auch über den USRBUS hergestellt werden kann. Dazu verbindet man Pin 3 von ST1 mit einem Pin (Y1..Y14) des USRBUS.&lt;br /&gt;
&lt;br /&gt;
====Bestückungsplan====&lt;br /&gt;
&lt;br /&gt;
So kann z.B. der Bestückungsplan mit Leiterbahnführung auf der Experimentierplatine (Exp) aussehen:&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6v2_Xtra_Module.jpg|RP6 Experimentierplatine für Xtra Module]]&lt;br /&gt;
&lt;br /&gt;
Was braucht man allgemein für den Aufbau einer Schaltung auf der Exp:&lt;br /&gt;
* Seitenschneider, Schere, Zange&lt;br /&gt;
* Lötkolben 25..30 Watt, Lötzinn&lt;br /&gt;
* Plastik 70 Schutzlack (CONRAD 813621)&lt;br /&gt;
* Isolierter Schaltdraht YV 0,20 mm² (CONRAD 606065)&lt;br /&gt;
* Versilberter CU-Draht 0,6 mm (CONRAD 605581)&lt;br /&gt;
&lt;br /&gt;
Mit dem versilberten CU-Draht stellt man auf der Unterseite (= Lötseite) der Exp Verbindungen zwischen den Bauteilen her; mit dem isolierten Schaltdraht werden Drahtbrücken auf der Oberseite (= Bestückungsseite) der Exp eingesetzt. Die Lage der Xtra Module und der Verbindungen kann man im Bestückungsplan (s.o.!) erkennen, Drahtbrücken sind rot hervorgehoben.&lt;br /&gt;
&lt;br /&gt;
Zusätzlich zu den RP6 Xtra Modulen braucht man folgende Bauteile (Bestell-Nummern von CONRAD):&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| Anzahl || Bestell-Nr. || Bauteil-Bezeichnung || Verwendung&lt;br /&gt;
|-&lt;br /&gt;
| 1 || [http://www.conrad.de/ce/de/product/191537/Arexx-RP6-Experimentierplatine?queryFromSuggest=true 191537] || RP6 Experimentierplatine || &lt;br /&gt;
|-&lt;br /&gt;
| 1 || [http://www.conrad.de/ce/de/product/189600/Praezisions-IC-Fassung-MPE-Garry-MP-083-STG-BU-Pole-8-Rastermass-762-mm-Material-Kontaktfeder-025-Gold-ueber-Nickel 189600] || Präzisions-IC-Fassung (8 Pole) || Stecksockel für Accelerometer Modul&lt;br /&gt;
|-&lt;br /&gt;
| 1 || [http://www.conrad.de/ce/de/product/741360/Praezisions-Buchsenleiste-RM-254-gerade-Pole-1-x-20-10120832-BKL-Electronic-Inhalt-1-St 741360] || Präzisions-Buchsenleiste RM 2,54mm (9 Pole) || Stecksockel für GPS Empfänger&lt;br /&gt;
|-&lt;br /&gt;
| 1 || [http://www.conrad.de/ce/de/product/741307/Praezisions-Stiftleiste-RM-254-gerade-Pole-1-x-20-10120536-BKL-Electronic-Inhalt-1-St 741307] || Präzisions-Stiftleiste RM 2,54mm (2 x 4 Pole) || Stecksockel für Gyro Modul&lt;br /&gt;
|-&lt;br /&gt;
| 1 || [http://www.conrad.de/ce/de/product/741119/Stiftleiste-RM-254-gerade-Pole-1-x-36-10120182-BKL-Electronic-Inhalt-1-St 741119] || 1-reihige Stiftleiste RM 2,54mm (ges. 36-polig) || JP1, ST1&lt;br /&gt;
|-&lt;br /&gt;
| 1 || [http://www.conrad.de/ce/de/product/741186/Doppelreihige-Stiftleiste-RM-254-gerade-Pole-2-x-8-10120514-BKL-Electronic-Inhalt-1-St 741186] || 2-reihige Stiftleiste RM 2,54mm (ges. 8-polig) || JP2..9&lt;br /&gt;
|-&lt;br /&gt;
| 1 || [http://www.conrad.de/ce/de/product/742902/Codier-Adressierbruecken-Set-Rastermass-25254-mm-10120906-BKL-Electronic-Inhalt-1-Set 742902] || Sechs Codierbrücken (aus Set) || Steckbrücken&lt;br /&gt;
|-&lt;br /&gt;
| 2 || [http://www.conrad.de/ce/de/product/453099/Keramik-Kondensator-01-F-50-V-20-B-x-H-508-mm-x-508-mm-1-St 453099] || Keramik Kondensator 100 nF || Blockkondensatoren C2, C3&lt;br /&gt;
|-&lt;br /&gt;
| 1 || [http://www.conrad.de/ce/de/product/421986/Elektrolyt-Kondensator-radial-bedrahtet-25-mm-10-F-50-V-20--x-H-5-mm-x-11-mm-Panasonic-EEUFC1H100LH-1-St 421986] || Elektrolyt Kondensator 10 uF/50 V || Spannungsstabilisierung C1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Viel Erfolg beim Aufbau!&lt;br /&gt;
&lt;br /&gt;
 Natürlich muss man nicht alle drei Sensoren aufbauen!&lt;br /&gt;
 Man kann einfach den/die Sensor/en weglassen, den/die man nicht nutzen will!&lt;br /&gt;
&lt;br /&gt;
Noch ein Wort zur Programmierung des 3D Accelerometer Moduls: Es wird auf dieser Exp über den I2C Bus angesteuert. Damit kann man die [[RP6_Sensor_Board_und_Xtra_Module#RP6_CONTROL_M32:_ACCSENS_Library|nachfolgende Library]] für dieses Modul hier NICHT benutzen!&lt;br /&gt;
&lt;br /&gt;
====Magnetfeldsensor====&lt;br /&gt;
&lt;br /&gt;
Wenn man die oben beschriebene Experimentierplatine aufgebaut hat, hat man für die Navigation eines mobilen Roboters (wie des RP6v2) schon drei benötigte Sensoren zur Verfügung: einen GPS Empfänger, einen 3D-Beschleunigungssensor und einen 1D-Gyrosensor.&lt;br /&gt;
&lt;br /&gt;
Was fehlt, ist z.B. ein '''Magnetfeldsensor (Kompass-Sensor)''', mit dem der Roboter die Himmelsrichtung feststellen kann. Einen Magnetfeldsensor gibt es (noch) nicht als Xtra Modul.&lt;br /&gt;
&lt;br /&gt;
Auf der beschriebenen Experimentierplatine ist durchaus noch Platz (z.B. in der rechten oberen Ecke) für einen Magnetfeldsensor. Geeignet ist z.B. das 2D-Kompassmodul HDMM01 ([http://www.pollin.de/shop/dt/NTM4OTgxOTk-/Bausaetze_Module/Module/Kompassmodul_HDMM01.html Pollin 94-810 164] NICHT MEHR LIEFERBAR!).&lt;br /&gt;
&lt;br /&gt;
Hier ist der um den Magnetfeldsensor erweiterte Schaltplan:&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6v2_Xtra_Module_HDMM01_SP.jpg|RP6 Experimentierplatine für Xtra Module und HDMM01 - Schaltplan]]&lt;br /&gt;
&lt;br /&gt;
Das kleine Kompassmodul dürfte doch noch einfach auf der Experimentierplatine unterzubringen sein, oder?&lt;br /&gt;
&lt;br /&gt;
Zur Programmierung des Magnetfeldsensors HDMM01 gibt es [[RP6v2_Orientierung#Kompassmodul_HDMM01_2|HIER]] Anregungen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Programmierung==&lt;br /&gt;
In diesem Abschnitt geht es um die Programmierung der Sensoren und Aktoren auf dem [[RP6_Sensor_Board_und_Xtra_Module#RP6_Sensor_Board_3|RP6 Sensor Board]] und auf den [[RP6_Sensor_Board_und_Xtra_Module#RP6_Xtra_Module_3|Xtra Modulen]]. Die hier veröffentlichte Software baut NICHT auf die mitgelieferten C++ Software-Beispiele auf der ''&amp;quot;RP6 Robot System Xtra Modules CD-ROM&amp;quot;'' auf, sondern basiert auf Eigenentwicklungen in GCC.&lt;br /&gt;
&lt;br /&gt;
===RP6 Sensor Board===&lt;br /&gt;
Das RP6 Sensor Board RP6-JM03-61 verfügt nicht über einen eigenen Microprozessor. Daher geht es hier eigentlich nicht um die Programmierung des Sensor Boards, sondern um die Programmierung der Microcontroller-Plattform, an die das Sensor Board angeschlossen ist. In der Regel wird das die RP6 M256 WiFi Zusatzplatine sein, aber auch die RP6v2 Base steuert (als I2C-Slave) in der vorgesehenen Konfiguration gewisse Funktionen des Sensor Boards an.&lt;br /&gt;
Prinzipiell kann das Sensor Board aber auch an der RP6 CONTROL M32 (''passende Library auf Anfrage beim Autor!'') oder der RP6 CCPRO M128 Zusatzplatine betrieben werden.&lt;br /&gt;
&lt;br /&gt;
====Dokumentation====&lt;br /&gt;
Die Dokumentation zum RP6 Sensor Board befindet sich auf der mitgelieferten ''&amp;quot;RP6 Robot System Xtra Modules CD-ROM&amp;quot;''.&lt;br /&gt;
&lt;br /&gt;
=====Manuals=====&lt;br /&gt;
Das Handbuch in der aktuellen Version kann [http://www.jm3-engineering.com/download/doc/ManualRP6SensorBoard_de.pdf hier] oder [http://www.produktinfo.conrad.com/datenblaetter/00000-24999/001082384-an-01-de-RP6_SENSOR_BOARD.pdf da] eingesehen werden.&lt;br /&gt;
 ACHTUNG: Das Manual enthielt in der Version 1.11 noch teils irreführende&lt;br /&gt;
          Beschreibungen, die in der aktuellen Version 1.20 vom 20.04.2014&lt;br /&gt;
          korrigiert wurden!&lt;br /&gt;
&lt;br /&gt;
====Robot-Tool====&lt;br /&gt;
[[Bild:JM3 Robot-Tool.PNG|JM3 Robot-Tool|thumb]]&lt;br /&gt;
&lt;br /&gt;
Von JM3 Engineering wurde auch ein eigenes Programm &amp;quot;'''JM3 Robot-Tool'''&amp;quot; veröffentlicht, das im RP6-System (RP6(v2) Base, CONTROL M32, M256 WiFi) anstelle des [[RP6v2#RobotLoader|RobotLoaders]] verwendet werden kann.&lt;br /&gt;
&lt;br /&gt;
Vom Robot-Tool gibt es auch eine Kommandozeilen-Version &amp;quot;'''Multiloader'''&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Befehlszeilen Optionen'''&lt;br /&gt;
 Multi Loader v1.0.1&lt;br /&gt;
 &lt;br /&gt;
 Usage:&lt;br /&gt;
 multiloader [filename] [port/hostname] [device] [-l]&lt;br /&gt;
  -l forces RP6 low speed mode.&lt;br /&gt;
 &lt;br /&gt;
 Valid devices:&lt;br /&gt;
  - Asuro&lt;br /&gt;
  - AsuroCtrl&lt;br /&gt;
  - RP6Base&lt;br /&gt;
  - RP6CtrlM32&lt;br /&gt;
  - RobotArm&lt;br /&gt;
  - RP6Wifi&lt;br /&gt;
 Attention: Device names are case-sensitive&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 Multi Loader v2.0.0&lt;br /&gt;
 &lt;br /&gt;
 Usage: multiloader [load/conf] [...]&lt;br /&gt;
 &lt;br /&gt;
         load    Load .hex file into robot.&lt;br /&gt;
                 arguments: [filename] [port/host] [device] [interface] [-l]&lt;br /&gt;
 &lt;br /&gt;
                 [interface] specifies programming interface type.&lt;br /&gt;
                 Valid interface types are UART and TCP.&lt;br /&gt;
                 -l forces RP6 low speed mode.&lt;br /&gt;
 &lt;br /&gt;
                 Valid devices:  [interfaces]&lt;br /&gt;
                 - Asuro     UART&lt;br /&gt;
                 - AsuroXT   UART&lt;br /&gt;
                 - Marvin    UART&lt;br /&gt;
                 - MarvinFW  UART&lt;br /&gt;
                 - RP6       UART&lt;br /&gt;
                 - RP6M32    UART&lt;br /&gt;
                 - RP6Wifi   TCP&lt;br /&gt;
                 - RobotArm  UART&lt;br /&gt;
 &lt;br /&gt;
                 Attention: Device names are case-sensitive&lt;br /&gt;
 &lt;br /&gt;
=====Versionen=====&lt;br /&gt;
Hier eine Tabelle der (mir) bekannten Robot-Tool Versionen:&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |rowspan=2|ZIP-Datum&lt;br /&gt;
 |colspan=2|Robot-Tool:&lt;br /&gt;
 |colspan=2|Multiloader:&lt;br /&gt;
 |rowspan=2|Bemerkungen&lt;br /&gt;
 |-&lt;br /&gt;
 |Windows&lt;br /&gt;
 |Linux&lt;br /&gt;
 |Windows&lt;br /&gt;
 |Linux&lt;br /&gt;
 |-&lt;br /&gt;
 |25.10.2014&lt;br /&gt;
 |1.0.1-1&lt;br /&gt;
 |1.0.1-1&lt;br /&gt;
 |1.0.1-1&lt;br /&gt;
 |1.0.1-1&lt;br /&gt;
 |Erste veröffentlichte Version!&lt;br /&gt;
 |-&lt;br /&gt;
 |30.01.2017&lt;br /&gt;
 |[http://www.jm3-engineering.com/download/robottool-v2.0-win32.7z 2.0]&lt;br /&gt;
 |[http://www.jm3-engineering.com/download/robottool-v2.0-linux.tar.xz 2.0]&lt;br /&gt;
 |2.0&lt;br /&gt;
 |2.0&lt;br /&gt;
 |auch für [http://www.jm3-engineering.com/download/robottool-v2.0-osx.tar.gz Mac OSX]!&lt;br /&gt;
 |-&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
'''Hinweise:'''&lt;br /&gt;
* 1. Falls die Links in der Tabelle auf die Seite &amp;quot;Neuigkeiten&amp;quot; von JM3-Engineering führen, kann man dort auf die Seite &amp;quot;Software Downloads&amp;quot; wechseln und die Dateien im Absatz &amp;quot;JM3 Robot-Tool V2.0&amp;quot; herunterladen.&lt;br /&gt;
* 2. Ab Version 2.0 ist der Multiloader in der ZIP des Robot-Tools enthalten.&lt;br /&gt;
&lt;br /&gt;
====AVR-GCC und Visual Studio====&lt;br /&gt;
Die Demo-Programme zum RP6 Sensor Board wurden mit [https://www.microsoft.com/de-de/download/details.aspx?id=5555&amp;amp;fa43d42b-25b5-4a42-fe9b-1634f450f5ee=True Microsoft Visual C++ 2010] und [http://www.jm3-engineering.com/download/avr-gcc-4.8.1-win32.7z AVR-GCC] erstellt.&lt;br /&gt;
&lt;br /&gt;
Eine Anleitung zur Installation unter Windows befindet sich [http://www.jm3-engineering.com/download/doc/avr-gcc-vs_de.pdf hier].&lt;br /&gt;
&lt;br /&gt;
====Demo-Programmme====&lt;br /&gt;
Demo-Programme und eine &amp;quot;Library&amp;quot; zum RP6 Sensor Board befinden sich auf der mitgelieferten ''&amp;quot;RP6 Robot System Xtra Modules CD-ROM&amp;quot;''. Sie können auch in der aktuellen Version im Download Bereich von [http://www.jm3-engineering.com/downloads.htm JM3 Engineering] herunter geladen werden:&lt;br /&gt;
* [http://www.jm3-engineering.com/download/RP6SensorBoardDemo_1.1-1.7z RP6 Sensor Board Demo Programm und Library]&lt;br /&gt;
* [http://www.jm3-engineering.com/download/RP6SensorBoardDemo_noVC_1.1-1.7z RP6 Sensor Board Demo Programm und Library (ohne Visual Studio Projekt Dateien)]&lt;br /&gt;
* [http://www.jm3-engineering.com/download/RP6-RC_1.0-1.7z Remote Control Software]&lt;br /&gt;
'''Hinweis:'''&lt;br /&gt;
Falls die o.g. Links auf die Seite &amp;quot;Neuigkeiten&amp;quot; von JM3-Engineering führen, kann man dort auf die Seite &amp;quot;Software Downloads&amp;quot; wechseln und die Dateien im Absatz &amp;quot;RP6 Sensor Board Library und Demo-Programm&amp;quot; herunterladen.&lt;br /&gt;
&lt;br /&gt;
====Library====&lt;br /&gt;
Eine &amp;quot;Library&amp;quot; zum RP6 Sensor Board, bestehend aus einigen Einzel-Dateien mit jeweils eigenen Versions-Nummern, befindet sich auf der mitgelieferten ''&amp;quot;RP6 Robot System Xtra Modules CD-ROM&amp;quot;''. Sie ist in der aktuellen Version auch in den Demo-Programmen enthalten ([[RP6_Sensor_Board_und_Xtra_Module#Demo-Programmme|s.o.!]]).&lt;br /&gt;
&lt;br /&gt;
=====Versionen=====&lt;br /&gt;
Hier eine Tabelle der (mir) bekannten Library Versionen für das RP6 Sensor Board:&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |ZIP-Datum *&lt;br /&gt;
 |Version&lt;br /&gt;
 |RP6SensorBoardDemo&lt;br /&gt;
 |RP6-RC&lt;br /&gt;
 |RP6M256_I2CMasterLib&lt;br /&gt;
 |RP6M256Lib&lt;br /&gt;
 |RP6I2CmasterTWI&lt;br /&gt;
 |-&lt;br /&gt;
 |09.12.2013&lt;br /&gt;
 |1.0&lt;br /&gt;
 |1.0&lt;br /&gt;
 |1.0&lt;br /&gt;
 |(1.0_24.02.12) ²&lt;br /&gt;
 |1.1_16.07.12 ²&lt;br /&gt;
 |1.1_04.09.12 ³&lt;br /&gt;
 |-&lt;br /&gt;
 |27.12.2014&lt;br /&gt;
 |1.1&lt;br /&gt;
 |1.1-1&lt;br /&gt;
 |1.0-1&lt;br /&gt;
 |Modified 02.11.14 ³&lt;br /&gt;
 |1.1.1_25.10.14 ³&lt;br /&gt;
 |1.1_04.09.12 ³&lt;br /&gt;
 |-&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
'''Zu *:''' Alternativ: Datum der Verzeichnisse (z.B. auf der ''&amp;quot;RP6 Robot System Xtra Modules CD-ROM&amp;quot;'')!&lt;br /&gt;
&lt;br /&gt;
'''Zu ²:''' Neueste Original Version der [http://rn-wissen.de/wiki/index.php/RP6v2#Versionen RP6 Library]!&lt;br /&gt;
&lt;br /&gt;
'''Zu ³:''' Modifiziert von [http://www.jm3-engineering.com/ JM3 Engineering]!&lt;br /&gt;
&lt;br /&gt;
=====Modifizierte RP6 Libraries=====&lt;br /&gt;
Von [http://www.jm3-engineering.com/ JM3 Engineering] wurden bis jetzt drei [http://rn-wissen.de/wiki/index.php/RP6v2#Versionen RP6 &amp;quot;Original&amp;quot;-Libraries] leicht modifiziert, um sie für die eigenen Programme für das RP6 Sensor Board optimal nutzen zu können.&lt;br /&gt;
In diesem Abschnitt soll kurz erwähnt werden, WAS verändert wurde.&lt;br /&gt;
 &lt;br /&gt;
======RP6M256_I2CMasterLib======&lt;br /&gt;
Die RP6M256_I2CMasterLib wurde von JM3 Engineering ab der Software Version 1.1 für das RP6 Sensor Board verändert, um sie in einer eigenen Bibliothek bestehend aus mehreren Modulen nutzen zu können. Folgendes wurde angepasst:&lt;br /&gt;
* Neue typedef unions:&lt;br /&gt;
** u_interrupt_status&lt;br /&gt;
** u_status&lt;br /&gt;
** u_drive_status&lt;br /&gt;
** u_statusLEDs&lt;br /&gt;
&lt;br /&gt;
Die modifizierte RP6M256_I2CMasterLib vom 2.11.2014 ist kompatibel zur Original-Version vom 24.02.2012.&lt;br /&gt;
&lt;br /&gt;
======RP6M256Lib======&lt;br /&gt;
Eine modifizierte Version 1.1.1 der RP6M256Lib mit Datum vom 25.10.2014 wurde von JM3 Engineering im November 2014 zusammen mit der Software Version 1.1 für das RP6 Sensor Board veröffentlicht. Sie ist kompatibel zur Version 1.1 der RP6M256Lib vom 16.07.2012 und enthält folgende Änderung:&lt;br /&gt;
* In der Datei RP6M256.h wird die Variable &amp;quot;timer&amp;quot; korrekt als &amp;quot;''extern'' volatile uint16_t timer&amp;quot; deklariert.&lt;br /&gt;
&lt;br /&gt;
======RP6I2CmasterTWI======&lt;br /&gt;
Eine erweiterte I2C Master-Library (Version 1.1) gibt es mit Datum vom 04.09.2012, veröffentlicht ab Februar 2014 von JM3 Engineering für das RP6 Sensor Board und die Xtra Module. Sie ist abwärts-kompatibel zur I2C Master-Library in der Version 1.0 vom 16.05.2007 und bietet lediglich folgende Erweiterung: &lt;br /&gt;
* Neue Funktion I2CTWI_readWordRegisters() zum Lesen von 16 Bit Registern&lt;br /&gt;
&lt;br /&gt;
====RP6 M256 WiFi: Sensor Board Library====&lt;br /&gt;
Die nachfolgende RP6M256_Sensor_BoardLib (Eigenentwicklung in GCC) dient zur Ansteuerung des Sensor Boards durch die RP6M256 WiFi.&lt;br /&gt;
&lt;br /&gt;
=====Configuration Header=====&lt;br /&gt;
Vor dem Kompilieren der Library muss eine Anpassung des Configuration Headers an die eigenen Hardware-Voraussetzungen erfolgen.&lt;br /&gt;
Dazu gibt es im Configuration Header eine Definition:&lt;br /&gt;
* USE_PD5 -&amp;gt; Die Sensor Board Funktion &amp;quot;PD5&amp;quot; steuert den TCA4311A Enable Pin (EN).&lt;br /&gt;
Im nachfolgenden Listing ist die Definition USE_PD5 NICHT aktiv (d.h. der TCA4311A Enable Pin (EN) wird vom MAX7311 I/O 1.0 Pin angesteuert!). Dies muss an die eigene Hardware angepaßt werden. Wenn &amp;quot;PD5&amp;quot; den TCA4311A Enable Pin (EN) steuern soll, muss die Zeile mit &amp;quot;USE_PD5&amp;quot; &amp;quot;aktiviert&amp;quot; werden. Dazu entfernt man &amp;quot;//&amp;quot; am Zeilenanfang:&lt;br /&gt;
 #define USE_PD5&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Bevor man Beschleunigungs-, Magnetfeldsensor und Gyroskop nutzen kann, muss man sie kalibrieren:&lt;br /&gt;
&lt;br /&gt;
* '''Accelerometer:'''&lt;br /&gt;
** Die X-Achse wird kalibriert, indem man den RP6 mit der rechten Seite nach unten hält und den Maximalwert in MAX_X_A einträgt. Dann neigt man ihn auf seine linke Seite und trägt den negativen Maximalwert in MIN_X_A ein.&lt;br /&gt;
** Die Y-Achse wird kalibriert, indem man den RP6 mit der Vorderseite nach oben hält und den Maximalwert in MAX_Y_A einträgt. Dann kippt man die Vorderseite nach unten und trägt den negativen Maximalwert in MIN_Y_A ein.&lt;br /&gt;
** Die Z-Achse wird kalibriert, indem man den RP6 normal waagerecht hält und den Maximalwert in MAX_Z_A einträgt. Dann dreht man den RP6 &amp;quot;auf den Kopf&amp;quot; und trägt den negativen Maximalwert in MIN_Z_A ein.&lt;br /&gt;
** Sollten die angezeigten Pitch- und Roll-Werte nach der Kalibrierung der Achsen und genau waagerecht stehendem Sensor bzw. RP6 vom Nullwert deutlich abweichen, kann man sie mithilfe der Definitionen OFFSET_PITCH_A und OFFSET_ROLL_A &amp;quot;nullen&amp;quot;. Die Einheit dieser Definitionen ist °.&lt;br /&gt;
 ''HINWEIS: Die internen Berechnungen werden durch diese Offset-Korrektur&lt;br /&gt;
 NICHT beeinflußt. Die Offset-Werte können also nicht dazu benutzt werden,&lt;br /&gt;
 eine Achsenabweichung zwischen Sensor und RP6 zu kompensieren!''&lt;br /&gt;
* '''Magnetometer:'''&lt;br /&gt;
** Zur Kalibrierung des Magnetfeldsensors stellt man den RP6 auf eine waagerechte Fläche. Es dürfen keine Elektrogeräte, Metallteile und stromführende Leitungen in der Nähe sein, die das Magnetfeld verändern können.&lt;br /&gt;
** Zunächst ist es möglich, die sogenannten &amp;quot;hard iron&amp;quot; Effekte auszugleichen. Dies sind feste Magnetfeldabweichungen, die durch das &amp;quot;Gerät&amp;quot; (in unserem Fall also durch den kompletten RP6) verursacht werden, in oder auf dem der Sensor angebracht ist. Mit den Definitionen OFFSET_X_M, OFFSET_Y_M und OFFSET_Z_M können diese Effekte ausgeglichen werden. Diese Kalibrierung wird hier aktuell (noch) nicht beschrieben, so dass man die Werte für diese Definitionen zunächst bei 0 belassen sollte.&lt;br /&gt;
** Die X-Achse und Y-Achse wird kalibriert, indem man den RP6 langsam mehrfach um die eigene (Z-)Achse dreht und die Maximalwerte in MAX_X_M und MAX_Y_M einträgt. Die negativen Maximalwerte trägt man in MIN_X_M und MIN_Y_M ein.&lt;br /&gt;
** Die Z-Achse wird kalibriert, indem man den RP6 auf die rechte oder linke Seite legt, ihn dann langsam mehrfach auf der Stelle (um seine Y-Achse) dreht und den Maximalwert in MAX_Z_M und den negativen Maximalwert in MIN_Z_M einträgt.&lt;br /&gt;
** Mit der Definition DECLINATION_M kann man zur Verbesserung der Genauigkeit der Richtungsangaben den magnetischen Deklinationswert [°] (d.h. die magnetische Missweisung) am aktuellen Standort festlegen. [http://www.ngdc.noaa.gov/geomag-web/#declination Hier] befindet sich ein &amp;quot;Deklinations-Rechner&amp;quot;, mit dem man den Deklinationswert für den eigenen Standort ermitteln kann. &lt;br /&gt;
** Wenn man den Temperaturwert des LSM303DLHC nutzen will, muss man die Definition GET_TEMP_M aktivieren (Standard!). Den Temperaturwert kann man noch eichen, indem man die Definition OFFSET_TEMP_M anpasst. Die Einheit von OFFSET_TEMP_M ist °C.&lt;br /&gt;
* '''Gyroskop:'''&lt;br /&gt;
** In Ruhelage des RP6 wird ein ADC-Wert von ca. 511 angezeigt, wenn die Definition ADCVAL_ZERORATE_LEVEL im Configuration Header (RP6M256_Sensor_Board.h) vor der ersten Kompilierung zunächst auf 0 gesetzt wurde. Die Kalibrierung des Gyroskops ist abgeschlossen, nachdem man den in Ruhelage angezeigten ADC-Wert als ADCVAL_ZERORATE_LEVEL eingetragen hat.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''HINWEISE ZUR KALIBRIERUNG:'''&lt;br /&gt;
* Das Demo-Programm ist nicht sehr gut geeignet, um die Kalibrierungen durchzuführen.&lt;br /&gt;
* Man sollte mit einem eigenen kurzen ''Kalibrierungs-Programm'' nur die Rohwerte der jeweiligen X-, Y- und Z-Achse z.B. zweimal pro Sekunde ausgeben.&lt;br /&gt;
* Die Rohwerte sind in Variablen x_axis..., y_axis..., z_axis... enthalten. Da die Rohwerte in den Funktionen normalizeLSM303DLHC_A() bzw. normalizeLSM303DLHC_M() ggf. verändert werden, müssen die Rohwerte VOR Durchlaufen dieser Funktionen ausgegeben werden.&lt;br /&gt;
* '''Ohne eine sorgfältige Kalibrierung wird die Kompass-Funktion (insbesondere die neigungskompensierte Ausgabe der Himmelsrichtung) nicht funktionieren!'''&lt;br /&gt;
* Nach dem Eintragen der Kalibrierungs-Werte in den Configuration Header (RP6M256_Sensor_Board.h) muss die ''Demo'' neu kompiliert werden. Vorher sollten die Compiler-Hilfsdateien der Sensor Board-Library (Dateiendungen .st und .o) im Programmverzeichnis gelöscht werden.&lt;br /&gt;
* Getestet wird das Ergebnis der Kalibrierung, indem die Ausgabewerte (Temperatur, Pitch, Roll, Heading, Neigungs-kompensiertes Heading) der ''Demo'' überprüft werden. Dazu kann man Vergleichswerte (Thermometer, Winkelmesser für Pitch, Roll und externer Kompass für Heading) heranziehen.&lt;br /&gt;
* Wenn die Ausgabewerte nicht den Erwartungen entsprechen, muss die Kalibrierung wiederholt werden.&lt;br /&gt;
* Eine Kalibrierung der Sensoren ist nur zuverlässig, solange die Position des jeweiligen Sensors und seine komplette Hardware-Umgebung (also der RP6 mit allen seinen Teilen!) nicht verändert wird. Gibt es trotzdem Veränderungen, z.B. durch weitere Aufbauten auf dem RP6, müssen diese Sensoren neu kalibriert werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Datei: RP6M256_Sensor_Board.h&lt;br /&gt;
&amp;lt;pre&amp;gt;/* ****************************************************************************&lt;br /&gt;
 *                           _______________________&lt;br /&gt;
 *                           \| RP6  ROBOT SYSTEM |/&lt;br /&gt;
 *                            \_-_-_-_-_-_-_-_-_-_/           &amp;gt;&amp;gt;&amp;gt; RP6 M256 WIFI&lt;br /&gt;
 * ----------------------------------------------------------------------------&lt;br /&gt;
 * ----------------------------- [c]2014 - Dirk -------------------------------&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * File: RP6M256_Sensor_Board.h&lt;br /&gt;
 * Version: 1.1&lt;br /&gt;
 * Target: RP6 M256 WIFI - ATMEGA2560 @16.00MHz&lt;br /&gt;
 * Author(s): Dirk&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Description:&lt;br /&gt;
 * Configuration header file for new RP6 Sensor Board library.&lt;br /&gt;
 * The RP6 Sensor Board (CONRAD 1082384) is connected to the RP6M256 with the&lt;br /&gt;
 * two plugs:&lt;br /&gt;
 *   Sensor Board &amp;lt;---&amp;gt; RP6M256&lt;br /&gt;
 *   --------------------------------&lt;br /&gt;
 *   I/O (K17)    &amp;lt;---&amp;gt; IO_PWM/T0/T1&lt;br /&gt;
 *   ADC (K18)    &amp;lt;---&amp;gt; ADC_IO2/CMP&lt;br /&gt;
 * The RP6 Sensor Board function &amp;quot;PD5&amp;quot; (IC6: EN) is now connected to RP6M256&lt;br /&gt;
 * OC1B (PB6) and the RP6 Sensor Board function &amp;quot;ADC4&amp;quot; (SHARP_R) to RP6M256&lt;br /&gt;
 * ADC9 (PK1).&lt;br /&gt;
 * On the RP6 Sensor Board the functions &amp;quot;ADC0&amp;quot;, &amp;quot;ADC1&amp;quot;, &amp;quot;PWR&amp;quot; and &amp;quot;ADC4&amp;quot; are&lt;br /&gt;
 * connected to the USRBUS. The USRBUS may be wired on the RP6 mainboard like&lt;br /&gt;
 * this:&lt;br /&gt;
 *   Function : Sensor Board - USRBUS: * &amp;lt;---&amp;gt; RP6 Mainboard&lt;br /&gt;
 *   --------------------------------------------------------&lt;br /&gt;
 *   SHARP_F  : &amp;quot;ADC0&amp;quot;       - Pin 1     &amp;lt;---&amp;gt; ADC0: Pin 3&lt;br /&gt;
 *   GYRO     : &amp;quot;ADC1&amp;quot;       - Pin 2     &amp;lt;---&amp;gt; ADC1: Pin 3&lt;br /&gt;
 *   PWRON ²  : &amp;quot;PWR&amp;quot;        - Pin 3     &amp;lt;---&amp;gt; PWR&lt;br /&gt;
 *   SHARP_R  : &amp;quot;ADC4&amp;quot;       - Pin 5     &amp;lt;---&amp;gt; Not connected!&lt;br /&gt;
 * At *) It is also possible not to use the USRBUS, but to connect the RP6&lt;br /&gt;
 *       Sensor Board directly to the RP6 mainboard with 3 single cables.&lt;br /&gt;
 * At ²) See RP6 manual &amp;quot;4.6.8. Stromsparfunktionen&amp;quot;! &lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
#ifndef RP6M256_SENSOR_BOARD_H&lt;br /&gt;
#define RP6M256_SENSOR_BOARD_H&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// RP6 Sensor Board hardwired components:&lt;br /&gt;
// - I2C I/O Port Expander (MAX7311)&lt;br /&gt;
// - I2C Real Time Clock (RTC DS1339)&lt;br /&gt;
// - I2C Temperature Sensor (LM75B)&lt;br /&gt;
// - I2C Servo Controller (PCA9685)&lt;br /&gt;
// - I2C LED Driver (TCA6507)&lt;br /&gt;
// - I2C 3D Magnetometer &amp;amp; Accelerometer (LSM303DLHC)&lt;br /&gt;
// - Analog Yaw-Rate Gyroscope (LY330ALH)&lt;br /&gt;
// - Hot Swappable 2-Wire Bus Buffer (TCA4311A)&lt;br /&gt;
// - Button&lt;br /&gt;
// - Status LED&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C I/O Port Expander (MAX7311):&lt;br /&gt;
#define I2C_SENSOR_PORTEXP_ADR			0x40	// Default&lt;br /&gt;
&lt;br /&gt;
// Interrupt I/O portpin definitions (RP6M256):&lt;br /&gt;
#define IO_SENSOR_INT1_IN				INT1_PI12 // PCINT12 PJ3  XBUS Pin 8&lt;br /&gt;
#define IO_SENSOR_INT1_DDR				DDRJ&lt;br /&gt;
#define IO_SENSOR_INT1_PIN				PINJ&lt;br /&gt;
#define IO_SENSOR_INT1_PORT				PORTJ&lt;br /&gt;
#define IO_SENSOR_INT2_IN				INT2_PI15 // PCINT15 PJ6  XBUS Pin 11&lt;br /&gt;
#define IO_SENSOR_INT2_DDR				DDRJ&lt;br /&gt;
#define IO_SENSOR_INT2_PIN				PINJ&lt;br /&gt;
#define IO_SENSOR_INT2_PORT				PORTJ&lt;br /&gt;
#define IO_SENSOR_INT3_IN				INT3_PI14 // PCINT14 PJ5  XBUS Pin 9&lt;br /&gt;
#define IO_SENSOR_INT3_DDR				DDRJ&lt;br /&gt;
#define IO_SENSOR_INT3_PIN				PINJ&lt;br /&gt;
#define IO_SENSOR_INT3_PORT				PORTJ&lt;br /&gt;
#define IO_SENSOR_INTU_IN				INTU_PI13 // PCINT13 PJ4  XBUS Pin 7&lt;br /&gt;
#define IO_SENSOR_INTU_DDR				DDRJ&lt;br /&gt;
#define IO_SENSOR_INTU_PIN				PINJ&lt;br /&gt;
#define IO_SENSOR_INTU_PORT				PORTJ&lt;br /&gt;
&lt;br /&gt;
// I/O PORT pin numbers:&lt;br /&gt;
#define PIN7							7&lt;br /&gt;
#define PIN6							6&lt;br /&gt;
#define PIN5							5&lt;br /&gt;
#define PIN4							4&lt;br /&gt;
#define PIN3							3&lt;br /&gt;
#define PIN2							2&lt;br /&gt;
#define PIN1							1&lt;br /&gt;
#define PIN0							0&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Real Time Clock (RTC DS1339):&lt;br /&gt;
#define I2C_SENSOR_RTC_ADR				0xd0	// Default&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Temperature Sensor (LM75B):&lt;br /&gt;
#define I2C_SENSOR_TEMP_ADR				0x90	// Default&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Servo Controller (PCA9685):&lt;br /&gt;
#define I2C_SENSOR_SERVO_ADR			0x88	// Default&lt;br /&gt;
&lt;br /&gt;
// Servo and PWM channels:&lt;br /&gt;
#define CH_SERVO_1						16		// At K6: 1  &amp;quot;SERVO_1&amp;quot;&lt;br /&gt;
#define CH_SERVO_2						15		// At K11: 1 &amp;quot;SERVO_2&amp;quot;&lt;br /&gt;
#define CH_SERVO_3						13		// At K29: 1 &amp;quot;SERVO_3&amp;quot;&lt;br /&gt;
#define CH_SERVO_4						14		// At K30: 1 &amp;quot;SERVO_4&amp;quot;&lt;br /&gt;
#define CH_SERVO_5						11		// At K31: 1 &amp;quot;SERVO_5&amp;quot;&lt;br /&gt;
#define CH_SERVO_6						12		// At K32: 1 &amp;quot;SERVO_6&amp;quot;&lt;br /&gt;
#define CH_SERVO_7						9		// At K33: 1 &amp;quot;SERVO_7&amp;quot;&lt;br /&gt;
#define CH_SERVO_8						10		// At K34: 1 &amp;quot;SERVO_8&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#define CH_PWM_OUT_1					1		// At K12: 1 &amp;quot;PWM_OUT&amp;quot;&lt;br /&gt;
#define CH_PWM_OUT_2					2		// At K12: 2&lt;br /&gt;
#define CH_PWM_OUT_3					3		// At K12: 3&lt;br /&gt;
#define CH_PWM_OUT_4					4		// At K12: 4&lt;br /&gt;
#define CH_PWM_OUT_5					5		// At K12: 5&lt;br /&gt;
#define CH_PWM_OUT_6					6		// At K12: 6&lt;br /&gt;
#define CH_PWM_OUT_7					7		// At K12: 7&lt;br /&gt;
#define CH_PWM_OUT_8					8		// At K12: 8&lt;br /&gt;
&lt;br /&gt;
// Servo left touch (LT), right touch (RT), middle position (MP) constants:&lt;br /&gt;
// (Hints: - Servo impulse length [ms] = Servo position value / 204.8&lt;br /&gt;
//           (Formula only valid for a PWM of 50 Hz!)&lt;br /&gt;
//         - Min. servo impulse (0,7 ms) = Servo position 143&lt;br /&gt;
//         - Mid. servo impulse (1,5 ms) = Servo position 307&lt;br /&gt;
//         - Max. servo impulse (2,3 ms) = Servo position 471&lt;br /&gt;
//         - !!! You should NOT use servo position values &amp;lt; 143 or &amp;gt; 471 !!!)&lt;br /&gt;
#define SERVO1_LT						205		// Servo impulse ~1ms&lt;br /&gt;
#define SERVO1_RT						410		// Servo impulse ~2ms&lt;br /&gt;
#define SERVO1_MP						((SERVO1_RT - SERVO1_LT) / 2 + SERVO1_LT)&lt;br /&gt;
#define SERVO2_LT						205&lt;br /&gt;
#define SERVO2_RT						410&lt;br /&gt;
#define SERVO2_MP						((SERVO2_RT - SERVO2_LT) / 2 + SERVO2_LT)&lt;br /&gt;
#define SERVO3_LT						205&lt;br /&gt;
#define SERVO3_RT						410&lt;br /&gt;
#define SERVO3_MP						((SERVO3_RT - SERVO3_LT) / 2 + SERVO3_LT)&lt;br /&gt;
#define SERVO4_LT						205&lt;br /&gt;
#define SERVO4_RT						410&lt;br /&gt;
#define SERVO4_MP						((SERVO4_RT - SERVO4_LT) / 2 + SERVO4_LT)&lt;br /&gt;
#define SERVO5_LT						205&lt;br /&gt;
#define SERVO5_RT						410&lt;br /&gt;
#define SERVO5_MP						((SERVO5_RT - SERVO5_LT) / 2 + SERVO5_LT)&lt;br /&gt;
#define SERVO6_LT						205&lt;br /&gt;
#define SERVO6_RT						410&lt;br /&gt;
#define SERVO6_MP						((SERVO6_RT - SERVO6_LT) / 2 + SERVO6_LT)&lt;br /&gt;
#define SERVO7_LT						205&lt;br /&gt;
#define SERVO7_RT						410&lt;br /&gt;
#define SERVO7_MP						((SERVO7_RT - SERVO7_LT) / 2 + SERVO7_LT)&lt;br /&gt;
#define SERVO8_LT						205&lt;br /&gt;
#define SERVO8_RT						410&lt;br /&gt;
#define SERVO8_MP						((SERVO8_RT - SERVO8_LT) / 2 + SERVO8_LT)&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C LED Driver (TCA6507):&lt;br /&gt;
#define I2C_SENSOR_LEDDRIVER_ADR		0x8a	// Default&lt;br /&gt;
&lt;br /&gt;
// LED numbers:&lt;br /&gt;
#define SB_LED0							0		// At K7&lt;br /&gt;
#define DISPLAY_BACKLIGHT				0		// Display background light&lt;br /&gt;
#define SB_LED1							1		// At K4&lt;br /&gt;
#define SB_LED2							2		// At K2&lt;br /&gt;
#define SB_LED3							3		// At K10: 1&lt;br /&gt;
#define BACKLIGHT_R						3		// Right backlight&lt;br /&gt;
#define SB_LED4							4		// At K10: 2&lt;br /&gt;
#define BACKLIGHT_L						4		// Left backlight&lt;br /&gt;
#define SB_LED5							5		// White LED (D3)&lt;br /&gt;
#define HEADLIGHT_R						5		// Right headlight&lt;br /&gt;
#define SB_LED6							6		// White LED (D1)&lt;br /&gt;
#define HEADLIGHT_L						6		// Left headlight&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C 3D Magnetometer &amp;amp; Accelerometer (LSM303DLHC):&lt;br /&gt;
&lt;br /&gt;
// LSM303DLHC accelerometer:&lt;br /&gt;
#define I2C_SENSOR_LSM303DLHC_A_ADR 	0x32	// Default&lt;br /&gt;
&lt;br /&gt;
// LSM303DLHC accelerometer calibration data:&lt;br /&gt;
#define MAX_X_A						1037		// Max. X-axis value&lt;br /&gt;
#define MIN_X_A						-1030		// Min. X-axis value&lt;br /&gt;
#define MAX_Y_A						1030		// Max. Y-axis value&lt;br /&gt;
#define MIN_Y_A						-1019		// Min. Y-axis value&lt;br /&gt;
#define MAX_Z_A						1062		// Max. Z-axis value&lt;br /&gt;
#define MIN_Z_A						-1056		// Min. Z-axis value&lt;br /&gt;
#define OFFSET_PITCH_A				0.0			// Offset Pitch [°]&lt;br /&gt;
#define OFFSET_ROLL_A				0.0			// Offset Roll [°]&lt;br /&gt;
&lt;br /&gt;
// LSM303DLHC magnetometer:&lt;br /&gt;
#define I2C_SENSOR_LSM303DLHC_M_ADR		0x3c	// Default&lt;br /&gt;
&lt;br /&gt;
// LSM303DLHC magnetometer calibration data:&lt;br /&gt;
#define MAX_X_M						-111.0		// Max. X-axis value&lt;br /&gt;
#define MIN_X_M						-634.0		// Min. X-axis value&lt;br /&gt;
#define OFFSET_X_M					0			// Hard iron X-axis offset&lt;br /&gt;
#define MAX_Y_M						297.0		// Max. Y-axis value&lt;br /&gt;
#define MIN_Y_M						-215.0		// Min. Y-axis value&lt;br /&gt;
#define OFFSET_Y_M					0			// Hard iron Y-axis offset&lt;br /&gt;
#define MAX_Z_M						183.0		// Max. Z-axis value&lt;br /&gt;
#define MIN_Z_M						-214.0		// Min. Z-axis value&lt;br /&gt;
#define OFFSET_Z_M					0			// Hard iron Z-axis offset&lt;br /&gt;
#define DECLINATION_M				0.0			// E at local position [°]&lt;br /&gt;
&lt;br /&gt;
// LSM303DLHC temperature sensor definitions:&lt;br /&gt;
#define GET_TEMP_M								// Enable temperature sensor&lt;br /&gt;
#define OFFSET_TEMP_M				0.0			// Temperature offset [°C]&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Analog Yaw-Rate Gyroscope (LY330ALH):&lt;br /&gt;
&lt;br /&gt;
// LY330ALH gyroscope:&lt;br /&gt;
#define ADC_SENSOR_LY330ALH				ADC_1	// At USRBUS: 2 (RP6BASE)&lt;br /&gt;
&lt;br /&gt;
// LY330ALH gyroscope calibration data:&lt;br /&gt;
// (Higher values [505..1023] mean an angular velocity while rotating LEFT&lt;br /&gt;
//  and lower values [503..0] while rotating RIGHT!)&lt;br /&gt;
#define ADCVAL_MINRATE					0		// Min. rate value&lt;br /&gt;
#define ADCVAL_ZERORATE_LEVEL			504		// Zero rate level&lt;br /&gt;
#define ADCVAL_MAXRATE					1023	// Max. rate value&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Hot Swappable 2-Wire Bus Buffer (TCA4311A):&lt;br /&gt;
&lt;br /&gt;
// Define USE_PD5, if you want to control the TCA4311A enable pin (EN) with&lt;br /&gt;
// the RP6 Sensor Board function &amp;quot;PD5&amp;quot;. If USE_PD5 is NOT defined (default),&lt;br /&gt;
// the TCA4311A EN pin is controlled by the MAX7311 I/O 1.0 pin.&lt;br /&gt;
// ---------------&lt;br /&gt;
//#define USE_PD5&lt;br /&gt;
// ---------------&lt;br /&gt;
&lt;br /&gt;
#define IO_SENSOR_TCA4311A_EN_IN		OC1B_PI6 // At I/O: 9 (RP6M256)&lt;br /&gt;
#define IO_SENSOR_TCA4311A_EN_DDR		DDRB&lt;br /&gt;
#define IO_SENSOR_TCA4311A_EN_PIN		PINB&lt;br /&gt;
#define IO_SENSOR_TCA4311A_EN_PORT		PORTB&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Button:&lt;br /&gt;
&lt;br /&gt;
// (Button is connected to I/O 1.7 of the MAX7311!)&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Status LED:&lt;br /&gt;
&lt;br /&gt;
// (Status LED is connected to I/O 1.6 of the MAX7311!)&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Other ADC channel definitions:&lt;br /&gt;
&lt;br /&gt;
// (Depending on connections on the RP6 Sensor Board!)&lt;br /&gt;
#define ADC_SENSOR_SHARP_F				ADC_0	// At USRBUS: 1 (RP6BASE)&lt;br /&gt;
#define ADC_SENSOR_SHARP_R				ADC_9	// At ADC: 3    (RP6M256)&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
/******************************************************************************&lt;br /&gt;
 * Additional info&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Changelog:&lt;br /&gt;
 * &lt;br /&gt;
 *  ---&amp;gt; changes are documented in the file &amp;quot;RP6M256_Sensor_BoardLib.c&amp;quot;&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=====Library Header=====&lt;br /&gt;
Datei: RP6M256_Sensor_BoardLib.h&lt;br /&gt;
&amp;lt;pre&amp;gt;/* ****************************************************************************&lt;br /&gt;
 *                           _______________________&lt;br /&gt;
 *                           \| RP6  ROBOT SYSTEM |/&lt;br /&gt;
 *                            \_-_-_-_-_-_-_-_-_-_/           &amp;gt;&amp;gt;&amp;gt; RP6 M256 WIFI&lt;br /&gt;
 * ----------------------------------------------------------------------------&lt;br /&gt;
 * ----------------------------- [c]2014 - Dirk -------------------------------&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * File: RP6M256_Sensor_BoardLib.h&lt;br /&gt;
 * Version: 1.1&lt;br /&gt;
 * Target: RP6 M256 WIFI - ATMEGA2560 @16.00MHz&lt;br /&gt;
 * Author(s): Dirk&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Description:&lt;br /&gt;
 * Header file for new RP6 Sensor Board library.&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
#ifndef RP6M256_SENSOR_BOARDLIB_H&lt;br /&gt;
#define RP6M256_SENSOR_BOARDLIB_H&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// RP6 Sensor Board hardwired components:&lt;br /&gt;
// - I2C I/O Port Expander (MAX7311)&lt;br /&gt;
// - I2C Real Time Clock (RTC DS1339)&lt;br /&gt;
// - I2C Temperature Sensor (LM75B)&lt;br /&gt;
// - I2C Servo Controller (PCA9685)&lt;br /&gt;
// - I2C LED Driver (TCA6507)&lt;br /&gt;
// - I2C 3D Magnetometer &amp;amp; Accelerometer (LSM303DLHC)&lt;br /&gt;
// - Analog Yaw-Rate Gyroscope (LY330ALH)&lt;br /&gt;
// - Hot Swappable 2-Wire Bus Buffer (TCA4311A)&lt;br /&gt;
// - Button&lt;br /&gt;
// - Status LED&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Includes:&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6M256Lib.h&amp;quot;&lt;br /&gt;
#include &amp;quot;RP6I2CmasterTWI.h&amp;quot;&lt;br /&gt;
#include &amp;quot;RP6M256_Sensor_Board.h&amp;quot;&lt;br /&gt;
#include &amp;lt;math.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// RP6M256_I2CMasterLib definitions:&lt;br /&gt;
&lt;br /&gt;
#ifndef I2C_RP6_BASE_ADR&lt;br /&gt;
	#define I2C_RP6_BASE_ADR			10&lt;br /&gt;
#endif&lt;br /&gt;
#ifndef I2C_REG_ADC_ADC0_L&lt;br /&gt;
	#define I2C_REG_ADC_ADC0_L			23&lt;br /&gt;
#endif&lt;br /&gt;
#ifndef I2C_REG_ADC_ADC1_L&lt;br /&gt;
	#define I2C_REG_ADC_ADC1_L			25&lt;br /&gt;
#endif&lt;br /&gt;
#ifndef CMD_POWER_OFF&lt;br /&gt;
	#define CMD_POWER_OFF				0&lt;br /&gt;
#endif&lt;br /&gt;
#ifndef CMD_POWER_ON&lt;br /&gt;
	#define CMD_POWER_ON				1&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C I/O Port Expander (MAX7311):&lt;br /&gt;
&lt;br /&gt;
// Registers:&lt;br /&gt;
#define MAX7311_INPUT_PORT1				0&lt;br /&gt;
#define MAX7311_INPUT_PORT2				1&lt;br /&gt;
#define MAX7311_OUTPUT_PORT1			2&lt;br /&gt;
#define MAX7311_OUTPUT_PORT2			3&lt;br /&gt;
#define MAX7311_PORT1_POL_INV			4&lt;br /&gt;
#define MAX7311_PORT2_POL_INV			5&lt;br /&gt;
#define MAX7311_PORT1_CONFIG			6&lt;br /&gt;
#define MAX7311_PORT2_CONFIG			7&lt;br /&gt;
#define MAX7311_TIMEOUT					8&lt;br /&gt;
&lt;br /&gt;
// Port 1 configuration register bitmasks:&lt;br /&gt;
#define ST_GYRO							(1 &amp;lt;&amp;lt; PIN7)	// I/O 0.7 (Output)&lt;br /&gt;
#define PD_GYRO							(1 &amp;lt;&amp;lt; PIN6)	// I/O 0.6 (Output)&lt;br /&gt;
#define PWR_CAM_IF						(1 &amp;lt;&amp;lt; PIN5)	// I/O 0.5 (Output)&lt;br /&gt;
#define EN_LEDDRIV						(1 &amp;lt;&amp;lt; PIN4)	// I/O 0.4 (Output)&lt;br /&gt;
#define RDY_BUSBUFF						(1 &amp;lt;&amp;lt; PIN3)	// I/O 0.3 (Input)&lt;br /&gt;
#define PWR_SHARP_R						(1 &amp;lt;&amp;lt; PIN2)	// I/O 0.2 (Output)&lt;br /&gt;
#define PWR_SHARP_F						(1 &amp;lt;&amp;lt; PIN1)	// I/O 0.1 (Output)&lt;br /&gt;
#define PWR_I2C							(1 &amp;lt;&amp;lt; PIN0)	// I/O 0.0 (Output)&lt;br /&gt;
&lt;br /&gt;
// Port 2 configuration register bitmasks:&lt;br /&gt;
#define IO2_I2C							(1 &amp;lt;&amp;lt; PIN7)	// I/O 1.7 (Input)&lt;br /&gt;
#define IO1_I2C							(1 &amp;lt;&amp;lt; PIN6)	// I/O 1.6 (Output)&lt;br /&gt;
#define DRDY_MAGACC						(1 &amp;lt;&amp;lt; PIN5)	// I/O 1.5 (Input)&lt;br /&gt;
#define PWR_SERVO						(1 &amp;lt;&amp;lt; PIN4)	// I/O 1.4 (Output)&lt;br /&gt;
#define OEN_SERVO						(1 &amp;lt;&amp;lt; PIN3)	// I/O 1.3 (Output)&lt;br /&gt;
#define IO_K19_1						(1 &amp;lt;&amp;lt; PIN2)	// I/O 1.2 (Input)&lt;br /&gt;
#define IO_K19_3						(1 &amp;lt;&amp;lt; PIN1)	// I/O 1.1 (Input)&lt;br /&gt;
#define EN_BUSBUFF						(1 &amp;lt;&amp;lt; PIN0)	// I/O 1.0 (Output)&lt;br /&gt;
&lt;br /&gt;
// Port 1 &amp;amp; 2 register 16-bit bitmasks:&lt;br /&gt;
// (CONFIG: 1 = Input, 0 = Output)&lt;br /&gt;
#define MAX7311_CONFIG_DEFAULT			0b1010011000001000&lt;br /&gt;
#define MAX7311_CONFIG_USE_PD5			0b1010011100001000&lt;br /&gt;
// (OUTPUT: 1 = High/True, 0 = Low/False)&lt;br /&gt;
#define MAX7311_OUTPUT_DEFAULT			0b0100000100010000&lt;br /&gt;
#define MAX7311_OUTPUT_FULLPOWER		0b0001000100110111&lt;br /&gt;
#define MAX7311_OUTPUT_SHUTDOWN			0b0100100011000000&lt;br /&gt;
&lt;br /&gt;
// Safe configuration:&lt;br /&gt;
// (Ensures if activated, that I/Os 0.3, 1.5 and 1.7 cannot be configured&lt;br /&gt;
//  as output with the function MAX7311_write_cfg(). This may protect the&lt;br /&gt;
//  RP6 Sensor Board from hardware damage.)&lt;br /&gt;
// -------------------&lt;br /&gt;
#define SAFE_CONFIG&lt;br /&gt;
// -------------------&lt;br /&gt;
&lt;br /&gt;
typedef union {&lt;br /&gt;
 	uint8_t byte;&lt;br /&gt;
	struct {&lt;br /&gt;
		unsigned int1   :1;				// INT1  XBUS Pin 8&lt;br /&gt;
		unsigned int2   :1;				// INT2  XBUS Pin 11&lt;br /&gt;
		unsigned int3   :1;				// INT3  XBUS Pin 9&lt;br /&gt;
		unsigned intu   :1;				// INTU  XBUS Pin 7&lt;br /&gt;
		unsigned unused :4;&lt;br /&gt;
	};&lt;br /&gt;
	struct {&lt;br /&gt;
		unsigned magacc1     :1;		// INT1: LSM303DLHC INT1&lt;br /&gt;
		unsigned portexp     :1;		// INT2: MAX7311 INT_N&lt;br /&gt;
		unsigned magacc2_rtc :1;		// INT3: LSM303DLHC INT2&lt;br /&gt;
		unsigned noname      :5;		//       OR DS1339 SQW/INT_N&lt;br /&gt;
	};&lt;br /&gt;
} interrupt_RP6SBstatus_t;&lt;br /&gt;
extern interrupt_RP6SBstatus_t interrupt_RP6SBstatus;&lt;br /&gt;
&lt;br /&gt;
typedef union {&lt;br /&gt;
	uint16_t word;&lt;br /&gt;
	struct {&lt;br /&gt;
		unsigned pwr_i2c     :1;		// I/O 0.0 (Output)&lt;br /&gt;
		unsigned pwr_sharp_f :1;		// I/O 0.1 (Output)&lt;br /&gt;
		unsigned pwr_sharp_r :1;		// I/O 0.2 (Output)&lt;br /&gt;
		unsigned rdy_busbuff :1;		// I/O 0.3 (Input)&lt;br /&gt;
		unsigned en_leddriv  :1;		// I/O 0.4 (Output)&lt;br /&gt;
		unsigned pwr_cam_if  :1;		// I/O 0.5 (Output)&lt;br /&gt;
		unsigned pd_gyro     :1;		// I/O 0.6 (Output)&lt;br /&gt;
		unsigned st_gyro     :1;		// I/O 0.7 (Output)&lt;br /&gt;
		unsigned en_busbuff  :1;		// I/O 1.0 (Output)&lt;br /&gt;
		unsigned io_k19_3    :1;		// I/O 1.1 (Input)&lt;br /&gt;
		unsigned io_k19_1    :1;		// I/O 1.2 (Input)&lt;br /&gt;
		unsigned oen_servo   :1;		// I/O 1.3 (Output)&lt;br /&gt;
		unsigned pwr_servo   :1;		// I/O 1.4 (Output)&lt;br /&gt;
		unsigned drdy_magacc :1;		// I/O 1.5 (Input)&lt;br /&gt;
		unsigned io1_i2c     :1;		// I/O 1.6 (Output)&lt;br /&gt;
		unsigned io2_i2c     :1;		// I/O 1.7 (Input)&lt;br /&gt;
	};&lt;br /&gt;
} max7311IOs_t;&lt;br /&gt;
extern max7311IOs_t inport;&lt;br /&gt;
extern max7311IOs_t outport;&lt;br /&gt;
extern uint8_t readyBusbuff;&lt;br /&gt;
extern uint8_t pressedButton;&lt;br /&gt;
&lt;br /&gt;
void MAX7311_write_cfg(uint16_t);&lt;br /&gt;
void task_checkINTs(void);&lt;br /&gt;
void task_RP6SensorBoard(void);&lt;br /&gt;
void MAX7311_update(void);&lt;br /&gt;
void MAX7311_write(uint16_t);&lt;br /&gt;
void MAX7311_init(void);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Real Time Clock (RTC DS1339):&lt;br /&gt;
&lt;br /&gt;
// Registers:&lt;br /&gt;
#define DS1339_SECONDS					0&lt;br /&gt;
#define DS1339_MINUTES					1&lt;br /&gt;
#define DS1339_HOURS					2&lt;br /&gt;
#define DS1339_DAY						3&lt;br /&gt;
#define DS1339_DATE						4&lt;br /&gt;
#define DS1339_MONTH_CENTURY			5&lt;br /&gt;
#define DS1339_YEAR						6&lt;br /&gt;
#define DS1339_ALARM1_SECONDS			7&lt;br /&gt;
#define DS1339_ALARM1_MINUTES			8&lt;br /&gt;
#define DS1339_ALARM1_HOURS				9&lt;br /&gt;
#define DS1339_ALARM1_DAY_DATE			10&lt;br /&gt;
#define DS1339_ALARM2_MINUTES			11&lt;br /&gt;
#define DS1339_ALARM2_HOURS				12&lt;br /&gt;
#define DS1339_ALARM2_DAY_DATE			13&lt;br /&gt;
#define DS1339_CONTROL					14&lt;br /&gt;
#define DS1339_STATUS					15&lt;br /&gt;
#define DS1339_TRICKLE_CHARGER			16&lt;br /&gt;
&lt;br /&gt;
// Control register bitmasks:&lt;br /&gt;
#define DS1339_CONTROL_DEFAULT			0		// Power on default&lt;br /&gt;
#define DS1339_CONTROL_A1IE				1&lt;br /&gt;
#define DS1339_CONTROL_A2IE				2&lt;br /&gt;
#define DS1339_CONTROL_INTCN			4&lt;br /&gt;
#define DS1339_CONTROL_RS1				8&lt;br /&gt;
#define DS1339_CONTROL_RS2				16&lt;br /&gt;
#define DS1339_CONTROL_BBSQI			32&lt;br /&gt;
#define DS1339_CONTROL_EOSC				128&lt;br /&gt;
&lt;br /&gt;
// Trickle Charger register bitmasks:&lt;br /&gt;
#define DS1339_TRICKLE_CHARGER_DEFAULT	0b10101010 // One diode, 2k resistor&lt;br /&gt;
#define DS1339_TRICKLE_CHARGER_ROUT0	1&lt;br /&gt;
#define DS1339_TRICKLE_CHARGER_ROUT1	2&lt;br /&gt;
#define DS1339_TRICKLE_CHARGER_DS0		4&lt;br /&gt;
#define DS1339_TRICKLE_CHARGER_DS1		8&lt;br /&gt;
#define DS1339_TRICKLE_CHARGER_TCS0		16&lt;br /&gt;
#define DS1339_TRICKLE_CHARGER_TCS1		32&lt;br /&gt;
#define DS1339_TRICKLE_CHARGER_TCS2		64&lt;br /&gt;
#define DS1339_TRICKLE_CHARGER_TCS3		128&lt;br /&gt;
&lt;br /&gt;
enum RTCWEEKDAYS {&lt;br /&gt;
	R_MO = 1, R_TU, R_WE, R_TH, R_FR, R_SA, R_SU&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
typedef struct {&lt;br /&gt;
	uint16_t         year;				// Year&lt;br /&gt;
	uint8_t          month;				// Month   [1..12]&lt;br /&gt;
	enum RTCWEEKDAYS weekday;			// Weekday [1..7 = R_MO..R_SU]&lt;br /&gt;
	uint8_t          day;				// Day     [1..31]&lt;br /&gt;
} rtcdate_t;&lt;br /&gt;
rtcdate_t rtc_date;&lt;br /&gt;
&lt;br /&gt;
typedef struct {&lt;br /&gt;
	uint8_t dst;						// Daylight-saving-time (time zone)&lt;br /&gt;
	uint8_t hour;						// Hour    [0..23]&lt;br /&gt;
	uint8_t minute;						// Minute  [0..59]&lt;br /&gt;
	uint8_t second;						// Second  [0..59]&lt;br /&gt;
} rtctime_t;&lt;br /&gt;
rtctime_t rtc_time;&lt;br /&gt;
&lt;br /&gt;
uint8_t BCD2DEC(uint8_t);&lt;br /&gt;
uint8_t DEC2BCD(uint8_t);&lt;br /&gt;
void DS1339_write_cfg(uint8_t);&lt;br /&gt;
void DS1339_init(void);&lt;br /&gt;
#define CALC_DST						// Time zone will be calculated&lt;br /&gt;
void DS1339_read(void);&lt;br /&gt;
void DS1339_write(void);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Temperature Sensor (LM75B):&lt;br /&gt;
&lt;br /&gt;
// Registers:&lt;br /&gt;
#define LM75B_TEMP						0&lt;br /&gt;
#define LM75B_CONF						1&lt;br /&gt;
#define LM75B_THYST						2&lt;br /&gt;
#define LM75B_TOS						3&lt;br /&gt;
&lt;br /&gt;
// Conf register bitmasks:&lt;br /&gt;
#define LM75B_CONF_DEFAULT				0		// Power on default&lt;br /&gt;
#define LM75B_CONF_SHUTDOWN				1&lt;br /&gt;
#define LM75B_CONF_OS_COMP_INT			2&lt;br /&gt;
#define LM75B_CONF_OS_POL				4&lt;br /&gt;
#define LM75B_CONF_OS_F_QUE0			8&lt;br /&gt;
#define LM75B_CONF_OS_F_QUE1			16&lt;br /&gt;
&lt;br /&gt;
extern double temperature;&lt;br /&gt;
&lt;br /&gt;
void LM75B_write_cfg(uint8_t);&lt;br /&gt;
#define LM75B_shutdown() {LM75B_write_cfg(LM75B_CONF_SHUTDOWN);}&lt;br /&gt;
#define LM75B_init() {LM75B_write_cfg(LM75B_CONF_DEFAULT);}&lt;br /&gt;
extern uint8_t temperature_low;&lt;br /&gt;
extern uint8_t temperature_high;&lt;br /&gt;
#define getTemperatureHigh() (temperature_high)&lt;br /&gt;
#define getTemperatureLow() (temperature_low)&lt;br /&gt;
void LM75B_read(void);&lt;br /&gt;
double LM75B_calculate(void);&lt;br /&gt;
double LM75B_measure(void);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Servo Controller (PCA9685):&lt;br /&gt;
&lt;br /&gt;
// Registers:&lt;br /&gt;
#define PCA9685_MODE1					0&lt;br /&gt;
#define PCA9685_MODE2					1&lt;br /&gt;
#define PCA9685_SUBADR1					2&lt;br /&gt;
#define PCA9685_SUBADR2					3&lt;br /&gt;
#define PCA9685_SUBADR3					4&lt;br /&gt;
#define PCA9685_ALLCALLADR				5&lt;br /&gt;
#define PCA9685_LED0_ON_L				6&lt;br /&gt;
#define PCA9685_LED0_ON_H				7&lt;br /&gt;
#define PCA9685_LED0_OFF_L				8&lt;br /&gt;
#define PCA9685_LED0_OFF_H				9&lt;br /&gt;
#define PCA9685_LED1_ON_L				10&lt;br /&gt;
#define PCA9685_LED1_ON_H				11&lt;br /&gt;
#define PCA9685_LED1_OFF_L				12&lt;br /&gt;
#define PCA9685_LED1_OFF_H				13&lt;br /&gt;
#define PCA9685_LED2_ON_L				14&lt;br /&gt;
#define PCA9685_LED2_ON_H				15&lt;br /&gt;
#define PCA9685_LED2_OFF_L				16&lt;br /&gt;
#define PCA9685_LED2_OFF_H				17&lt;br /&gt;
#define PCA9685_LED3_ON_L				18&lt;br /&gt;
#define PCA9685_LED3_ON_H				19&lt;br /&gt;
#define PCA9685_LED3_OFF_L				20&lt;br /&gt;
#define PCA9685_LED3_OFF_H				21&lt;br /&gt;
#define PCA9685_LED4_ON_L				22&lt;br /&gt;
#define PCA9685_LED4_ON_H				23&lt;br /&gt;
#define PCA9685_LED4_OFF_L				24&lt;br /&gt;
#define PCA9685_LED4_OFF_H				25&lt;br /&gt;
#define PCA9685_LED5_ON_L				26&lt;br /&gt;
#define PCA9685_LED5_ON_H				27&lt;br /&gt;
#define PCA9685_LED5_OFF_L				28&lt;br /&gt;
#define PCA9685_LED5_OFF_H				29&lt;br /&gt;
#define PCA9685_LED6_ON_L				30&lt;br /&gt;
#define PCA9685_LED6_ON_H				31&lt;br /&gt;
#define PCA9685_LED6_OFF_L				32&lt;br /&gt;
#define PCA9685_LED6_OFF_H				33&lt;br /&gt;
#define PCA9685_LED7_ON_L				34&lt;br /&gt;
#define PCA9685_LED7_ON_H				35&lt;br /&gt;
#define PCA9685_LED7_OFF_L				36&lt;br /&gt;
#define PCA9685_LED7_OFF_H				37&lt;br /&gt;
#define PCA9685_LED8_ON_L				38&lt;br /&gt;
#define PCA9685_LED8_ON_H				39&lt;br /&gt;
#define PCA9685_LED8_OFF_L				40&lt;br /&gt;
#define PCA9685_LED8_OFF_H				41&lt;br /&gt;
#define PCA9685_LED9_ON_L				42&lt;br /&gt;
#define PCA9685_LED9_ON_H				43&lt;br /&gt;
#define PCA9685_LED9_OFF_L				44&lt;br /&gt;
#define PCA9685_LED9_OFF_H				45&lt;br /&gt;
#define PCA9685_LED10_ON_L				46&lt;br /&gt;
#define PCA9685_LED10_ON_H				47&lt;br /&gt;
#define PCA9685_LED10_OFF_L				48&lt;br /&gt;
#define PCA9685_LED10_OFF_H				49&lt;br /&gt;
#define PCA9685_LED11_ON_L				50&lt;br /&gt;
#define PCA9685_LED11_ON_H				51&lt;br /&gt;
#define PCA9685_LED11_OFF_L				52&lt;br /&gt;
#define PCA9685_LED11_OFF_H				53&lt;br /&gt;
#define PCA9685_LED12_ON_L				54&lt;br /&gt;
#define PCA9685_LED12_ON_H				55&lt;br /&gt;
#define PCA9685_LED12_OFF_L				56&lt;br /&gt;
#define PCA9685_LED12_OFF_H				57&lt;br /&gt;
#define PCA9685_LED13_ON_L				58&lt;br /&gt;
#define PCA9685_LED13_ON_H				59&lt;br /&gt;
#define PCA9685_LED13_OFF_L				60&lt;br /&gt;
#define PCA9685_LED13_OFF_H				61&lt;br /&gt;
#define PCA9685_LED14_ON_L				62&lt;br /&gt;
#define PCA9685_LED14_ON_H				63&lt;br /&gt;
#define PCA9685_LED14_OFF_L				64&lt;br /&gt;
#define PCA9685_LED14_OFF_H				65&lt;br /&gt;
#define PCA9685_LED15_ON_L				66&lt;br /&gt;
#define PCA9685_LED15_ON_H				67&lt;br /&gt;
#define PCA9685_LED15_OFF_L				68&lt;br /&gt;
#define PCA9685_LED15_OFF_H				69&lt;br /&gt;
#define PCA9685_ALL_LED_ON_L			250&lt;br /&gt;
#define PCA9685_ALL_LED_ON_H			251&lt;br /&gt;
#define PCA9685_ALL_LED_OFF_L			252&lt;br /&gt;
#define PCA9685_ALL_LED_OFF_H			253&lt;br /&gt;
#define PCA9685_PRE_SCALE				254&lt;br /&gt;
#define PCA9685_TESTMODE				255&lt;br /&gt;
&lt;br /&gt;
// Mode1 register bitmasks:&lt;br /&gt;
#define PCA9685_MODE1_ALLCALL			1&lt;br /&gt;
#define PCA9685_MODE1_SUB3				2&lt;br /&gt;
#define PCA9685_MODE1_SUB2				4&lt;br /&gt;
#define PCA9685_MODE1_SUB1				8&lt;br /&gt;
#define PCA9685_MODE1_SLEEP				16&lt;br /&gt;
#define PCA9685_MODE1_AI				32&lt;br /&gt;
#define PCA9685_MODE1_EXTCLK			64&lt;br /&gt;
#define PCA9685_MODE1_RESTART			128&lt;br /&gt;
&lt;br /&gt;
// Mode2 register bitmasks:&lt;br /&gt;
#define PCA9685_MODE2_OUTNE01_DEFAULT	0&lt;br /&gt;
#define PCA9685_MODE2_OUTDRV			4&lt;br /&gt;
#define PCA9685_MODE2_OCH				8&lt;br /&gt;
#define PCA9685_MODE2_INVRT				16&lt;br /&gt;
&lt;br /&gt;
#define F_PCA9685						25000000.0	// Int. Clock: 25 MHz&lt;br /&gt;
&lt;br /&gt;
void PCA9685_init(uint16_t);&lt;br /&gt;
#define initServo(__FREQ__) {PCA9685_init(__FREQ__);}&lt;br /&gt;
uint8_t servo(uint8_t);&lt;br /&gt;
void PCA9685_set(uint8_t, uint16_t);&lt;br /&gt;
#define setServo(__SERVO__,__POS__) {PCA9685_set(servo(__SERVO__),__POS__);}&lt;br /&gt;
void PCA9685_shutdown(void);&lt;br /&gt;
void PCA9685_restart(void);&lt;br /&gt;
void setServoPower(uint8_t);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C LED Driver (TCA6507):&lt;br /&gt;
&lt;br /&gt;
// Registers:&lt;br /&gt;
#define TCA6507_SELECT0				0&lt;br /&gt;
#define TCA6507_SELECT1				1&lt;br /&gt;
#define TCA6507_SELECT2				2&lt;br /&gt;
#define TCA6507_FADEON_TIME			3&lt;br /&gt;
#define TCA6507_FULLYON_TIME		4&lt;br /&gt;
#define TCA6507_FADEOFF_TIME		5&lt;br /&gt;
#define TCA6507_1ST_FULLYOFF_TIME	6&lt;br /&gt;
#define TCA6507_2ND_FULLYOFF_TIME	7&lt;br /&gt;
#define TCA6507_MAXIMUM_INTENSITY	8&lt;br /&gt;
#define TCA6507_MASTER_INTENSITY	9&lt;br /&gt;
#define TCA6507_INITIALIZATION		10&lt;br /&gt;
&lt;br /&gt;
// Output states:&lt;br /&gt;
#define STATE_OFF					0&lt;br /&gt;
#define STATE_PWM0					2&lt;br /&gt;
#define STATE_PWM1					3&lt;br /&gt;
#define STATE_ON					4&lt;br /&gt;
#define STATE_MINT					5&lt;br /&gt;
#define STATE_BLINK0				6&lt;br /&gt;
#define STATE_BLINK1				7&lt;br /&gt;
&lt;br /&gt;
extern uint8_t select[3];&lt;br /&gt;
&lt;br /&gt;
void TCA6507_write_cfg(uint8_t, uint8_t);&lt;br /&gt;
void TCA6507_update(void);&lt;br /&gt;
void TCA6507_set(uint8_t, uint8_t);&lt;br /&gt;
#define setLED(__LED__,__STATE__) {TCA6507_set(__LED__,__STATE__);}&lt;br /&gt;
void TCA6507_shutdown(void);&lt;br /&gt;
void TCA6507_restart(void);&lt;br /&gt;
void TCA6507_init(void);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C 3D Magnetometer &amp;amp; Accelerometer (LSM303DLHC):&lt;br /&gt;
&lt;br /&gt;
// LSM303DLHC accelerometer internal registers:&lt;br /&gt;
#define CTRL_REG1_A					0x20&lt;br /&gt;
#define CTRL_REG2_A					0x21&lt;br /&gt;
#define CTRL_REG3_A					0x22&lt;br /&gt;
#define CTRL_REG4_A					0x23&lt;br /&gt;
#define CTRL_REG5_A					0x24&lt;br /&gt;
#define CTRL_REG6_A					0x25&lt;br /&gt;
#define REFERENCE_A					0x26&lt;br /&gt;
#define STATUS_REG_A				0x27&lt;br /&gt;
#define OUT_X_L_A					0x28&lt;br /&gt;
#define OUT_X_H_A					0x29&lt;br /&gt;
#define OUT_Y_L_A					0x2a&lt;br /&gt;
#define OUT_Y_H_A					0x2b&lt;br /&gt;
#define OUT_Z_L_A					0x2c&lt;br /&gt;
#define OUT_Z_H_A					0x2d&lt;br /&gt;
#define FIFO_CTRL_REG_A				0x2e&lt;br /&gt;
#define FIFO_SRC_REG_A				0x2f&lt;br /&gt;
#define INT1_CFG_A					0x30&lt;br /&gt;
#define INT1_SOURCE_A				0x31&lt;br /&gt;
#define INT1_THS_A					0x32&lt;br /&gt;
#define INT1_DURATION_A				0x33&lt;br /&gt;
#define INT2_CFG_A					0x34&lt;br /&gt;
#define INT2_SOURCE_A				0x35&lt;br /&gt;
#define INT2_THS_A					0x36&lt;br /&gt;
#define INT2_DURATION_A				0x37&lt;br /&gt;
#define CLICK_CFG_A					0x38&lt;br /&gt;
#define CLICK_SRC_A					0x39&lt;br /&gt;
#define CLICK_THS_A					0x3a&lt;br /&gt;
#define TIME_LIMIT_A				0x3b&lt;br /&gt;
#define TIME_LATENCY_A				0x3c&lt;br /&gt;
#define TIME_WINDOW_A				0x3d&lt;br /&gt;
&lt;br /&gt;
// LSM303DLHC accelerometer register settings:&lt;br /&gt;
#define CTRL_REG1_A_10HZ			0b00100111	// 10Hz &amp;amp; all axes enable&lt;br /&gt;
#define CTRL_REG1_A_50HZ			0b01000111	// 50Hz &amp;amp; all axes enable&lt;br /&gt;
#define CTRL_REG4_A_DEFAULT			0b00000000	// Default (Normal mode)&lt;br /&gt;
#define CTRL_REG4_A_HR				0b00001000	// HR output mode&lt;br /&gt;
&lt;br /&gt;
// LSM303DLHC magnetometer internal registers:&lt;br /&gt;
#define CRA_REG_M					0x00&lt;br /&gt;
#define CRB_REG_M					0x01&lt;br /&gt;
#define MR_REG_M					0x02&lt;br /&gt;
#define OUT_X_H_M					0x03&lt;br /&gt;
#define OUT_X_L_M					0x04&lt;br /&gt;
#define OUT_Z_H_M					0x05&lt;br /&gt;
#define OUT_Z_L_M					0x06&lt;br /&gt;
#define OUT_Y_H_M					0x07&lt;br /&gt;
#define OUT_Y_L_M					0x08&lt;br /&gt;
#define SR_REG_MG					0x09&lt;br /&gt;
#define IRA_REG_M					0x0a&lt;br /&gt;
#define IRB_REG_M					0x0b&lt;br /&gt;
#define IRC_REG_M					0x0c&lt;br /&gt;
#define TEMP_OUT_H_M				0x31&lt;br /&gt;
#define TEMP_OUT_L_M				0x32&lt;br /&gt;
&lt;br /&gt;
// LSM303DLHC magnetometer register settings:&lt;br /&gt;
#define CRA_REG_M_15HZ				0b00010000	// Default (Data rate 15Hz)&lt;br /&gt;
#define CRA_REG_M_15HZ_T_EN			0b10010000	// 15Hz &amp;amp; temperature enable&lt;br /&gt;
#define CRB_REG_M_13GAUSS			0b00100000	// Gain +-1.3Gauss&lt;br /&gt;
#define MR_REG_M_CCM				0b00000000	// Continuous-conversion mode&lt;br /&gt;
#define MR_REG_M_SCM				0b00000001	// Single-conversion mode&lt;br /&gt;
#define MR_REG_M_SLEEP				0b00000011	// Default (Sleep-mode)&lt;br /&gt;
&lt;br /&gt;
extern int16_t x_axisa, y_axisa, z_axisa;&lt;br /&gt;
extern double pitch, roll;&lt;br /&gt;
extern double xa, ya, za;&lt;br /&gt;
extern double the, phi;&lt;br /&gt;
&lt;br /&gt;
extern int16_t x_axism, y_axism, z_axism;&lt;br /&gt;
extern int16_t headingm;&lt;br /&gt;
extern double xm, ym, zm;&lt;br /&gt;
#ifdef GET_TEMP_M&lt;br /&gt;
extern int16_t temperaturem;&lt;br /&gt;
extern double temperature_mag;&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
extern int16_t headingtc;&lt;br /&gt;
&lt;br /&gt;
void LSM303DLHC_A_init(void);&lt;br /&gt;
void readLSM303DLHC_A(void);&lt;br /&gt;
void normalizeLSM303DLHC_A(void);&lt;br /&gt;
void positionLSM303DLHC_A(void);&lt;br /&gt;
&lt;br /&gt;
void LSM303DLHC_M_init(void);&lt;br /&gt;
void readLSM303DLHC_M(void);&lt;br /&gt;
void normalizeLSM303DLHC_M(void);&lt;br /&gt;
int16_t headingLSM303DLHC_M(void);&lt;br /&gt;
&lt;br /&gt;
int16_t headingLSM303DLHC_TC(void);&lt;br /&gt;
&lt;br /&gt;
void LSM303DLHC_init(void);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Analog Yaw-Rate Gyroscope (LY330ALH):&lt;br /&gt;
&lt;br /&gt;
#define LY330ALH_MODE_NORMAL		0			// Power on default&lt;br /&gt;
#define LY330ALH_MODE_SLEEP			1&lt;br /&gt;
#define LY330ALH_MODE_SELFTEST		2&lt;br /&gt;
#define LY330ALH_MODE_POWERDOWN		3			// Shutdown mode&lt;br /&gt;
&lt;br /&gt;
extern int16_t z_axisg;&lt;br /&gt;
&lt;br /&gt;
void LY330ALH_set_mode(uint8_t);&lt;br /&gt;
uint16_t getRP6Base_ADC1(void);&lt;br /&gt;
int16_t LY330ALH_measure(void);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Hot Swappable 2-Wire Bus Buffer (TCA4311A):&lt;br /&gt;
&lt;br /&gt;
//extern uint8_t readyBusbuff;			// See &amp;quot;I2C I/O Port Expander&amp;quot; section&lt;br /&gt;
extern uint8_t errorBusbuff;&lt;br /&gt;
&lt;br /&gt;
#define getReadyBusbuff() (readyBusbuff)&lt;br /&gt;
uint8_t readReadyBusbuff(void);&lt;br /&gt;
void TCA4311A_shutdown(void);&lt;br /&gt;
void TCA4311A_reconnect(void);&lt;br /&gt;
void setRP6Base_PWR(uint8_t);&lt;br /&gt;
void setI2CModulePower(uint8_t);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Button:&lt;br /&gt;
&lt;br /&gt;
//extern uint8_t pressedButton;			// See &amp;quot;I2C I/O Port Expander&amp;quot; section&lt;br /&gt;
&lt;br /&gt;
#define getPressedButton() (pressedButton)&lt;br /&gt;
uint8_t readButton(void);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Status LED:&lt;br /&gt;
&lt;br /&gt;
void setStatusLED(uint8_t);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// RP6 Sensor Board initialisation and shutdown:&lt;br /&gt;
&lt;br /&gt;
void sensor_board_init(void);&lt;br /&gt;
void sensor_board_shutdown(void);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
/******************************************************************************&lt;br /&gt;
 * Additional info&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Changelog:&lt;br /&gt;
 * &lt;br /&gt;
 *  ---&amp;gt; changes are documented in the file &amp;quot;RP6M256_Sensor_BoardLib.c&amp;quot;&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=====Library Source=====&lt;br /&gt;
Datei: RP6M256_Sensor_BoardLib.c&lt;br /&gt;
&amp;lt;pre&amp;gt;/* ****************************************************************************&lt;br /&gt;
 *                           _______________________&lt;br /&gt;
 *                           \| RP6  ROBOT SYSTEM |/&lt;br /&gt;
 *                            \_-_-_-_-_-_-_-_-_-_/           &amp;gt;&amp;gt;&amp;gt; RP6 M256 WIFI&lt;br /&gt;
 * ----------------------------------------------------------------------------&lt;br /&gt;
 * ----------------------------- [c]2014 - Dirk -------------------------------&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * File: RP6M256_Sensor_BoardLib.c&lt;br /&gt;
 * Version: 1.1&lt;br /&gt;
 * Target: RP6 M256 WIFI - ATMEGA2560 @16.00MHz&lt;br /&gt;
 *         and a RP6 Sensor Board (CONRAD 1082384)&lt;br /&gt;
 * Author(s): Dirk&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Description:&lt;br /&gt;
 * This is our new Library that contains basic routines and functions for&lt;br /&gt;
 * accessing the hardwired components of the RP6 Sensor Board (CONRAD 1082384).&lt;br /&gt;
 * This library assumes the RP6 Sensor Board Revision 2.0 (04.07.13).&lt;br /&gt;
 *&lt;br /&gt;
 * There are more sensors and actors, that may be connected to the RP6 Sensor&lt;br /&gt;
 * Board: Many I2C components including a GPS module (CONRAD 1082385), servo&lt;br /&gt;
 *        motors, SHARP IR distance sensors, LEDs, a camera ...&lt;br /&gt;
 * This library doesn't contain functions for these sensors/actors, because&lt;br /&gt;
 * they are not HARDWIRED to the RP6 Sensor Board and may be connected&lt;br /&gt;
 * OPTIONALLY.&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// RP6 Sensor Board hardwired components:&lt;br /&gt;
// - I2C I/O Port Expander (MAX7311)&lt;br /&gt;
// - I2C Real Time Clock (RTC DS1339)&lt;br /&gt;
// - I2C Temperature Sensor (LM75B)&lt;br /&gt;
// - I2C Servo Controller (PCA9685)&lt;br /&gt;
// - I2C LED Driver (TCA6507)&lt;br /&gt;
// - I2C 3D Magnetometer &amp;amp; Accelerometer (LSM303DLHC)&lt;br /&gt;
// - Analog Yaw-Rate Gyroscope (LY330ALH)&lt;br /&gt;
// - Hot Swappable 2-Wire Bus Buffer (TCA4311A)&lt;br /&gt;
// - Button&lt;br /&gt;
// - Status LED&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Includes:&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6M256_Sensor_BoardLib.h&amp;quot; 		&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Variables:&lt;br /&gt;
&lt;br /&gt;
uint8_t registerBuf[13]; &lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C I/O Port Expander (MAX7311):&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Sends the configuration word to a MAX7311.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: config -&amp;gt; Config word for control&lt;br /&gt;
 *                  registers&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void MAX7311_write_cfg(uint16_t config)&lt;br /&gt;
{&lt;br /&gt;
#ifdef SAFE_CONFIG&lt;br /&gt;
	config |= 0b1010000000001000;&lt;br /&gt;
#endif&lt;br /&gt;
	I2CTWI_transmit3Bytes(I2C_SENSOR_PORTEXP_ADR, MAX7311_PORT1_CONFIG, config, (config&amp;gt;&amp;gt;8));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
interrupt_RP6SBstatus_t interrupt_RP6SBstatus;&lt;br /&gt;
&lt;br /&gt;
/** &lt;br /&gt;
 * This function checks all interrupt pins on&lt;br /&gt;
 * the XBUS (INT1..3, INTU).&lt;br /&gt;
 * This function must be called VERY frequently&lt;br /&gt;
 * out of the main loop.&lt;br /&gt;
 * Bigger delays result in slower reaction to&lt;br /&gt;
 * interrupt requests of the RP6 Sensor Board.&lt;br /&gt;
 * Interrupt function table:&lt;br /&gt;
 *   Int. : Function 1      IRQ  Function 2       IRQ&lt;br /&gt;
 *   -------------------------------------------------&lt;br /&gt;
 *   INT1 : LSM303DLHC INT1  H&lt;br /&gt;
 *   INT2 : MAX7311   INT_N  L&lt;br /&gt;
 *   INT3 : LSM303DLHC INT2  H   DS1339 SQW/INT_N  L&lt;br /&gt;
 *   INTU : not used&lt;br /&gt;
 * You can see in the &amp;quot;IRQ&amp;quot; column, which level&lt;br /&gt;
 * (H/L) means an ACTIVE INTERRUPT signal.&lt;br /&gt;
 * The interrupt pin levels (H=true/L=false) are&lt;br /&gt;
 * read into the global interrupt_RP6SBstatus&lt;br /&gt;
 * variable.&lt;br /&gt;
 *&lt;br /&gt;
 * Hints: - This function checks the interrupt&lt;br /&gt;
 *          signals by polling. This is NOT the&lt;br /&gt;
 *          best way to do this job. You will&lt;br /&gt;
 *          have to write your own task, if you&lt;br /&gt;
 *          want to use the Pin Change Interrupt&lt;br /&gt;
 *          function of the ATmega2560&lt;br /&gt;
 *          microcontroller.&lt;br /&gt;
 *        - You cannot use both interrupt sources&lt;br /&gt;
 *          for INT3! So you should not use INT2&lt;br /&gt;
 *          of the LSM303DLHC together with the&lt;br /&gt;
 *          alarm function of the DS1339 (RTC)!&lt;br /&gt;
 *        - Every interrupt signal of the Sensor&lt;br /&gt;
 *          Board may be cut off from the XBUS&lt;br /&gt;
 *          by opening a jumper (Jx):&lt;br /&gt;
 *          INT1 -&amp;gt; J3 (LSM303DLHC INT1)&lt;br /&gt;
 *          INT2 -&amp;gt; J4 (MAX7311 INT_N)&lt;br /&gt;
 *          INT3 -&amp;gt; J2 (DS1339 SQW/INT_N)&lt;br /&gt;
 *          INT3 -&amp;gt; J5 (LSM303DLHC INT2)&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *&lt;br /&gt;
 *   if (!interrupt_RP6SBstatus.portexp)&lt;br /&gt;
 *        writeString_P(&amp;quot;==&amp;gt; MAX7311 INT_N!!!&amp;quot;);&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void task_checkINTs(void)&lt;br /&gt;
{&lt;br /&gt;
	if(IO_SENSOR_INT1_PIN &amp;amp; IO_SENSOR_INT1_IN)	// XBUS INT1 -&amp;gt; PJ3 (PCINT12)&lt;br /&gt;
		interrupt_RP6SBstatus.int1 = true;&lt;br /&gt;
	else&lt;br /&gt;
		interrupt_RP6SBstatus.int1 = false;&lt;br /&gt;
	if(IO_SENSOR_INT2_PIN &amp;amp; IO_SENSOR_INT2_IN)	// XBUS INT2 -&amp;gt; PJ6 (PCINT15)&lt;br /&gt;
		interrupt_RP6SBstatus.int2 = true;&lt;br /&gt;
	else&lt;br /&gt;
		interrupt_RP6SBstatus.int2 = false;&lt;br /&gt;
	if(IO_SENSOR_INT3_PIN &amp;amp; IO_SENSOR_INT3_IN)	// XBUS INT3 -&amp;gt; PJ5 (PCINT14)&lt;br /&gt;
		interrupt_RP6SBstatus.int3 = true;&lt;br /&gt;
	else&lt;br /&gt;
		interrupt_RP6SBstatus.int3 = false;&lt;br /&gt;
//	if(IO_SENSOR_INTU_PIN &amp;amp; IO_SENSOR_INTU_IN)	// XBUS INTU -&amp;gt; PJ4 (PCINT13)&lt;br /&gt;
//		interrupt_RP6SBstatus.intu = true;&lt;br /&gt;
//	else&lt;br /&gt;
//		interrupt_RP6SBstatus.intu = false;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
max7311IOs_t inport;&lt;br /&gt;
uint8_t readyBusbuff;&lt;br /&gt;
uint8_t pressedButton;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function checks all I/O ports (I/O 0.0..1.7)&lt;br /&gt;
 * of the MAX7311 sequentially!&lt;br /&gt;
 * You must call this function frequently out of&lt;br /&gt;
 * the main loop.&lt;br /&gt;
 * The I/O port values (true/false) are read into&lt;br /&gt;
 * the global inport variable.&lt;br /&gt;
 * The global variables readyBusbuff (2-Wire Bus&lt;br /&gt;
 * Buffer: Enable) and pressedButton (Button S1:&lt;br /&gt;
 * Pressed) contain actual values (true/false)&lt;br /&gt;
 * after execution of this task.&lt;br /&gt;
 *&lt;br /&gt;
 * Examples:&lt;br /&gt;
 *&lt;br /&gt;
 *   if (inport.rdy_busbuff)&lt;br /&gt;
 *        writeString_P(&amp;quot;I/O 0.3: High&amp;quot;);&lt;br /&gt;
 *   else writeString_P(&amp;quot;I/O 0.3: Low&amp;quot;);&lt;br /&gt;
 *   if (!inport.drdy_magacc)&lt;br /&gt;
 *        writeString_P(&amp;quot;I/O 1.5: Low&amp;quot;);&lt;br /&gt;
 *   if (pressedButton)&lt;br /&gt;
 *        writeString_P(&amp;quot;Button pressed!&amp;quot;);&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void task_RP6SensorBoard(void)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmitByte(I2C_SENSOR_PORTEXP_ADR, MAX7311_INPUT_PORT1);&lt;br /&gt;
	I2CTWI_readBytes(I2C_SENSOR_PORTEXP_ADR, registerBuf, 2);&lt;br /&gt;
	inport.word = (registerBuf[1] &amp;lt;&amp;lt; 8) + registerBuf[0];&lt;br /&gt;
	readyBusbuff = inport.rdy_busbuff;&lt;br /&gt;
	pressedButton = inport.io2_i2c;&lt;br /&gt;
	pressedButton = !pressedButton;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
max7311IOs_t outport;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Updates the I/O ports with current value from&lt;br /&gt;
 * the global outport variable!&lt;br /&gt;
 * If one or more port pins were configured as&lt;br /&gt;
 * output before, they will be set (high) or&lt;br /&gt;
 * cleared (low).&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *&lt;br /&gt;
 *   outport.word = 0b0000000000001001;&lt;br /&gt;
 *   MAX7311_update();&lt;br /&gt;
 *   // This clears all I/O ports and sets&lt;br /&gt;
 *   // the ports I/O 0.0 and I/O 0.3!&lt;br /&gt;
 *&lt;br /&gt;
 *   // Other possibility:&lt;br /&gt;
 *   outport.pwr_sharp_f = true;&lt;br /&gt;
 *   MAX7311_update();&lt;br /&gt;
 *   // This sets I/O 0.1 and does not&lt;br /&gt;
 *   // affect any other I/O port!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void MAX7311_update(void)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmit3Bytes(I2C_SENSOR_PORTEXP_ADR, MAX7311_OUTPUT_PORT1, outport.word, (outport.word&amp;gt;&amp;gt;8));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Writes the 16-bit data to a MAX7311.&lt;br /&gt;
 * The data are output with those I/O ports that&lt;br /&gt;
 * were configured as output before.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: data -&amp;gt; Data word&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void MAX7311_write(uint16_t data)&lt;br /&gt;
{&lt;br /&gt;
	outport.word = data;&lt;br /&gt;
	MAX7311_update();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Initializes the I/O Port Expander after power&lt;br /&gt;
 * on.&lt;br /&gt;
 *&lt;br /&gt;
 * Hint: If USE_PD5 is defined in the&lt;br /&gt;
 *       configuration header file, this&lt;br /&gt;
 *       function uses the RP6M256 portpin,&lt;br /&gt;
 *       that is connected to plug I/O: Pin 9&lt;br /&gt;
 *       instead of MAX7311 I/O 1.0!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void MAX7311_init(void)&lt;br /&gt;
{&lt;br /&gt;
#ifdef USE_PD5&lt;br /&gt;
	MAX7311_write_cfg(MAX7311_CONFIG_USE_PD5);&lt;br /&gt;
	IO_SENSOR_TCA4311A_EN_DDR |= IO_SENSOR_TCA4311A_EN_IN;		// Output&lt;br /&gt;
	IO_SENSOR_TCA4311A_EN_PORT |= IO_SENSOR_TCA4311A_EN_IN;		// High&lt;br /&gt;
#else&lt;br /&gt;
	MAX7311_write_cfg(MAX7311_CONFIG_DEFAULT);&lt;br /&gt;
#endif&lt;br /&gt;
	MAX7311_write(MAX7311_OUTPUT_DEFAULT);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Real Time Clock (RTC DS1339):&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function converts a BCD to a DEC value.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
uint8_t BCD2DEC(uint8_t bcd)&lt;br /&gt;
{&lt;br /&gt;
	return ((bcd &amp;gt;&amp;gt; 4) * 10 + (bcd &amp;amp; 0x0f));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function converts a DEC to a BCD value.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
uint8_t DEC2BCD(uint8_t dec)&lt;br /&gt;
{uint8_t units = dec % 10;&lt;br /&gt;
	if (dec /= 10) {&lt;br /&gt;
		return (units + (DEC2BCD(dec) &amp;lt;&amp;lt; 4));&lt;br /&gt;
	}&lt;br /&gt;
	else {&lt;br /&gt;
		return units;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Sends the configuration byte to a DS1339.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: Config byte for control register&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void DS1339_write_cfg(uint8_t config)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_RTC_ADR, DS1339_CONTROL, config);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Initializes the DS1339 Trickle Charger&lt;br /&gt;
 * function to the default for the RP6 Sensor&lt;br /&gt;
 * Board: One diode and 2kOhm resistor.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void DS1339_init(void)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_RTC_ADR, DS1339_TRICKLE_CHARGER, DS1339_TRICKLE_CHARGER_DEFAULT);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Reads all data registers of the Real Time Clock (RTC).&lt;br /&gt;
 * They are stored in the time &amp;amp; date variables defined in&lt;br /&gt;
 * the library header.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void DS1339_read(void)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmitByte(I2C_SENSOR_RTC_ADR, DS1339_SECONDS);&lt;br /&gt;
	I2CTWI_readBytes(I2C_SENSOR_RTC_ADR, registerBuf, 7);&lt;br /&gt;
	rtc_time.second = BCD2DEC(registerBuf[0]);&lt;br /&gt;
	rtc_time.minute = BCD2DEC(registerBuf[1]);&lt;br /&gt;
	rtc_time.hour = BCD2DEC(registerBuf[2] &amp;amp; 0x3f);&lt;br /&gt;
	rtc_date.weekday = (registerBuf[3] &amp;amp; 0x07);&lt;br /&gt;
	rtc_date.day = BCD2DEC(registerBuf[4]);&lt;br /&gt;
	rtc_date.month = BCD2DEC(registerBuf[5] &amp;amp; 0x7f);&lt;br /&gt;
	if(registerBuf[5] &amp;amp; 0x80) rtc_date.year = 100;&lt;br /&gt;
	else rtc_date.year = 0;&lt;br /&gt;
	rtc_date.year += BCD2DEC(registerBuf[6]);&lt;br /&gt;
	rtc_date.year += 2000;&lt;br /&gt;
	rtc_time.dst = 0;&lt;br /&gt;
#ifdef CALC_DST&lt;br /&gt;
	// Calculate MESZ (DST):&lt;br /&gt;
	uint8_t wday = rtc_date.weekday;			// Weekday [1..7 = R_MO..R_SU]&lt;br /&gt;
	if(wday == 7) wday = 0;&lt;br /&gt;
	if(rtc_date.month &amp;lt; 3 || rtc_date.month &amp;gt; 10) {&lt;br /&gt;
		return;&lt;br /&gt;
	}&lt;br /&gt;
	if((rtc_date.day - wday &amp;gt;= 25)&lt;br /&gt;
	 &amp;amp;&amp;amp; (wday || rtc_time.hour &amp;gt;= 2)) {&lt;br /&gt;
		if(rtc_date.month == 10)&lt;br /&gt;
			return;&lt;br /&gt;
	}&lt;br /&gt;
	else {&lt;br /&gt;
		if(rtc_date.month == 3) {&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	rtc_time.dst = 1;&lt;br /&gt;
#endif&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Writes the time &amp;amp; date infos in the variables defined in&lt;br /&gt;
 * the library header to the Real Time Clock (RTC).&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void DS1339_write(void)&lt;br /&gt;
{&lt;br /&gt;
	registerBuf[0] = DS1339_SECONDS;&lt;br /&gt;
	registerBuf[1] = DEC2BCD(rtc_time.second);&lt;br /&gt;
	registerBuf[2] = DEC2BCD(rtc_time.minute);&lt;br /&gt;
	registerBuf[3] = DEC2BCD(rtc_time.hour);&lt;br /&gt;
	registerBuf[4] = rtc_date.weekday;&lt;br /&gt;
	registerBuf[5] = DEC2BCD(rtc_date.day);&lt;br /&gt;
	registerBuf[6] = DEC2BCD(rtc_date.month);&lt;br /&gt;
	registerBuf[7] = DEC2BCD(rtc_date.year - 2000);&lt;br /&gt;
	I2CTWI_transmitBytes(I2C_SENSOR_RTC_ADR, &amp;amp;registerBuf[0], 8);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Temperature Sensor (LM75B):&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Sends the configuration byte to a LM75B.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: Config byte for Conf register&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void LM75B_write_cfg(uint8_t config)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_TEMP_ADR, LM75B_CONF, config);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
uint8_t temperature_low;&lt;br /&gt;
uint8_t temperature_high;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Reads the two data registers of the temperature&lt;br /&gt;
 * sensor's Temp register.&lt;br /&gt;
 * They are stored in the variables temperature_low&lt;br /&gt;
 * and _high.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void LM75B_read(void)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmitByte(I2C_SENSOR_TEMP_ADR, LM75B_TEMP);&lt;br /&gt;
	I2CTWI_readBytes(I2C_SENSOR_TEMP_ADR, registerBuf, 2);&lt;br /&gt;
	temperature_high = registerBuf[0];&lt;br /&gt;
	temperature_low = registerBuf[1];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
double temperature;						// Temperature [°C]&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Calculates and returns the temperature value&lt;br /&gt;
 * by using the data read from the LM75B with&lt;br /&gt;
 * the function LM75B_read(). The sensor is&lt;br /&gt;
 * designed for 11 bit measurement and 0.125°C&lt;br /&gt;
 * resolution.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
double LM75B_calculate(void)&lt;br /&gt;
{&lt;br /&gt;
	int16_t tempraw = 0;&lt;br /&gt;
	double temp;&lt;br /&gt;
&lt;br /&gt;
	tempraw = (getTemperatureHigh() &amp;lt;&amp;lt; 8) | getTemperatureLow();&lt;br /&gt;
	tempraw &amp;gt;&amp;gt;= 5;&lt;br /&gt;
	if (tempraw &amp;amp; 1024)							// Calculate temperature&lt;br /&gt;
		tempraw = (tempraw &amp;amp; 1023) - 1024;&lt;br /&gt;
	else&lt;br /&gt;
		tempraw = tempraw &amp;amp; 1023;&lt;br /&gt;
	temp = tempraw * 0.125;&lt;br /&gt;
	return temp;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Performs a 11 bit measurement and returns the&lt;br /&gt;
 * temperature [°C]. The sensor has a measuring&lt;br /&gt;
 * cycle of 100ms. So it makes no sense calling&lt;br /&gt;
 * this function at a frequency above 10Hz.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
double LM75B_measure(void)&lt;br /&gt;
{&lt;br /&gt;
//	LM75B_init();&lt;br /&gt;
	LM75B_read();								// Read data&lt;br /&gt;
	return (LM75B_calculate());					// Calculate value&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Servo Controller (PCA9685):&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Call this once before using the servo function.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: PWM frequency [40..1000 Hz]&lt;br /&gt;
 *&lt;br /&gt;
 * Hints: - Default servo frequency is 50 Hz!&lt;br /&gt;
 *        - The servo power is NOT switched on by&lt;br /&gt;
 *          this function!&lt;br /&gt;
 *&lt;br /&gt;
 * There is also a macro initServo(freq), which&lt;br /&gt;
 * does exactly the same as this function.&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *   initServo(50);&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void PCA9685_init(uint16_t freq)&lt;br /&gt;
{&lt;br /&gt;
	outport.oen_servo = false;					// I/O 1.3: Low&lt;br /&gt;
	MAX7311_update();&lt;br /&gt;
	if ((freq &amp;lt; 40) || (freq &amp;gt; 1000)) freq = 50;&lt;br /&gt;
	I2CTWI_transmitByte(I2C_SENSOR_SERVO_ADR, PCA9685_MODE2);&lt;br /&gt;
	uint8_t last_mode = I2CTWI_readByte(I2C_SENSOR_SERVO_ADR);&lt;br /&gt;
	last_mode &amp;amp;= ~PCA9685_MODE2_INVRT;			// Clear INVRT bit&lt;br /&gt;
	last_mode |= PCA9685_MODE2_OUTDRV;			// Set OUTDRV bit&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_SERVO_ADR, PCA9685_MODE2, last_mode);&lt;br /&gt;
	I2CTWI_transmitByte(I2C_SENSOR_SERVO_ADR, PCA9685_MODE1);&lt;br /&gt;
	last_mode = I2CTWI_readByte(I2C_SENSOR_SERVO_ADR);&lt;br /&gt;
	last_mode |= PCA9685_MODE1_AI;				// Set AI bit&lt;br /&gt;
	uint8_t mode1 = last_mode;&lt;br /&gt;
	mode1 |= PCA9685_MODE1_SLEEP;				// Set SLEEP bit&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_SERVO_ADR, PCA9685_MODE1, mode1);&lt;br /&gt;
	uint8_t prescale = (uint8_t) (F_PCA9685 / 4096 / freq - 0.5);&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_SERVO_ADR, PCA9685_PRE_SCALE, prescale);&lt;br /&gt;
	last_mode &amp;amp;= ~PCA9685_MODE1_SLEEP;			// Clear SLEEP bit&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_SERVO_ADR, PCA9685_MODE1, last_mode);&lt;br /&gt;
	mSleep(1);&lt;br /&gt;
	last_mode |= PCA9685_MODE1_RESTART;			// Clear RESTART bit&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_SERVO_ADR, PCA9685_MODE1, last_mode);&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_SERVO_ADR, PCA9685_LED8_ON_H, 0x10);&lt;br /&gt;
	return;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/** &lt;br /&gt;
 * Returns the channel belonging to a servo number.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: number -&amp;gt; Servo number [1..8]&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
uint8_t servo(uint8_t number)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t channel;&lt;br /&gt;
&lt;br /&gt;
	switch (number) {&lt;br /&gt;
		case 1 :&lt;br /&gt;
			channel = CH_SERVO_1; break;&lt;br /&gt;
		case 2 :&lt;br /&gt;
			channel = CH_SERVO_2; break;&lt;br /&gt;
		case 3 :&lt;br /&gt;
			channel = CH_SERVO_3; break;&lt;br /&gt;
		case 4 :&lt;br /&gt;
			channel = CH_SERVO_4; break;&lt;br /&gt;
		case 5 :&lt;br /&gt;
			channel = CH_SERVO_5; break;&lt;br /&gt;
		case 6 :&lt;br /&gt;
			channel = CH_SERVO_6; break;&lt;br /&gt;
		case 7 :&lt;br /&gt;
			channel = CH_SERVO_7; break;&lt;br /&gt;
		case 8 :&lt;br /&gt;
			channel = CH_SERVO_8; break;&lt;br /&gt;
		default : channel = CH_SERVO_1;&lt;br /&gt;
	}&lt;br /&gt;
	return channel;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This is the servo position set function.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: channel -&amp;gt; Channel number [1..16]&lt;br /&gt;
 *        pos     -&amp;gt; Servo position [SERVOx_LT..SERVOx_RT]&lt;br /&gt;
 *&lt;br /&gt;
 * Hints: - A servo position of 205 means 1 ms servo impulse,&lt;br /&gt;
 *          a position of 410 means a 2 ms servo impulse!&lt;br /&gt;
 *          You may calculate the servo impulse length by:&lt;br /&gt;
 *          ==&amp;gt; Impulse [ms] = servo position / 204.8 &amp;lt;==&lt;br /&gt;
 *          (Formula only valid for a PWM of 50 Hz!)&lt;br /&gt;
 *&lt;br /&gt;
 * There is also a macro setServo(servo, pos), which&lt;br /&gt;
 * does nearly the same as this function, but the first&lt;br /&gt;
 * parameter is the servo and NOT the channel number.&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *   setServo(2,300);&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void PCA9685_set(uint8_t channel, uint16_t pos)&lt;br /&gt;
{&lt;br /&gt;
	if ((channel == 0) || (channel &amp;gt; 16))&lt;br /&gt;
		return;&lt;br /&gt;
	uint8_t reg = channel * 4 + 4;				// Register LEDx_OFF_L&lt;br /&gt;
	I2CTWI_transmit3Bytes(I2C_SENSOR_SERVO_ADR, reg, (pos &amp;amp; 0x00ff), (pos &amp;gt;&amp;gt; 8));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * If the servos are not moving for a while, the&lt;br /&gt;
 * servo function can be stopped with this&lt;br /&gt;
 * function (PCA9685 set to sleep mode).&lt;br /&gt;
 *&lt;br /&gt;
 * Hint: The servo power is NOT switched off by&lt;br /&gt;
 *       this function!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void PCA9685_shutdown(void)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_SERVO_ADR, PCA9685_ALL_LED_OFF_H, 0x10);&lt;br /&gt;
	I2CTWI_transmitByte(I2C_SENSOR_SERVO_ADR, PCA9685_MODE1);&lt;br /&gt;
	uint8_t mode1 = I2CTWI_readByte(I2C_SENSOR_SERVO_ADR);&lt;br /&gt;
	mode1 |= PCA9685_MODE1_SLEEP;				// Set SLEEP bit&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_SERVO_ADR, PCA9685_MODE1, mode1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * If the servo function was stopped with the&lt;br /&gt;
 * function PCA9685_shutdown() before, it can be&lt;br /&gt;
 * (re)started again with this function.&lt;br /&gt;
 *&lt;br /&gt;
 * Hint: The servo power is NOT switched on by&lt;br /&gt;
 *       this function!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void PCA9685_restart(void)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmitByte(I2C_SENSOR_SERVO_ADR, PCA9685_MODE1);&lt;br /&gt;
	uint8_t mode1 = I2CTWI_readByte(I2C_SENSOR_SERVO_ADR);&lt;br /&gt;
	if (mode1 &amp;amp; PCA9685_MODE1_RESTART) {		// RESTART bit set?&lt;br /&gt;
		mode1 &amp;amp;= ~PCA9685_MODE1_SLEEP;			// Clear SLEEP bit&lt;br /&gt;
		I2CTWI_transmit2Bytes(I2C_SENSOR_SERVO_ADR, PCA9685_MODE1, mode1);&lt;br /&gt;
		mSleep(1);&lt;br /&gt;
		mode1 |= PCA9685_MODE1_RESTART;			// Clear RESTART bit&lt;br /&gt;
		I2CTWI_transmit2Bytes(I2C_SENSOR_SERVO_ADR, PCA9685_MODE1, mode1);&lt;br /&gt;
		I2CTWI_transmit2Bytes(I2C_SENSOR_SERVO_ADR, PCA9685_ALL_LED_OFF_H, 0);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/** &lt;br /&gt;
 * With this function you can switch the servo&lt;br /&gt;
 * power on or off.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: pwr -&amp;gt; 0 (false) = servo power off&lt;br /&gt;
 *               &amp;gt;0 (true) = servo power on&lt;br /&gt;
 *&lt;br /&gt;
 * Hints: - If connected servos are not used, you&lt;br /&gt;
 *          should always switch the servo power off&lt;br /&gt;
 *          (default) to save energy!&lt;br /&gt;
 *        - The PCA9685 is NOT restarted or put into&lt;br /&gt;
 *          shutdown mode by this function!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void setServoPower(uint8_t pwr)&lt;br /&gt;
{&lt;br /&gt;
	if(pwr &amp;gt; 0)&lt;br /&gt;
		outport.pwr_servo = true;				// I/O 1.4: High&lt;br /&gt;
	else&lt;br /&gt;
		outport.pwr_servo = false;				// I/O 1.4: Low&lt;br /&gt;
	MAX7311_update();&lt;br /&gt;
}	&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C LED Driver (TCA6507):&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Sends the configuration byte to TCA6507's&lt;br /&gt;
 * internal registers.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: reg    -&amp;gt; Register address [0..10]&lt;br /&gt;
 *        config -&amp;gt; Config byte for internal&lt;br /&gt;
 *                  registers&lt;br /&gt;
 *&lt;br /&gt;
 * Hints: - With this function you can write to&lt;br /&gt;
 *          all internal registers of the LED&lt;br /&gt;
 *          driver, see &amp;quot;Registers:&amp;quot; in the&lt;br /&gt;
 *          library header file!&lt;br /&gt;
 *        - Mainly you will use this function&lt;br /&gt;
 *          for setting time (regs 3..7) and&lt;br /&gt;
 *          intensity (regs 8, 9) values.&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *   TCA6507_write_cfg(TCA6507_MAXIMUM_INTENSITY,0x77);&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void TCA6507_write_cfg(uint8_t reg, uint8_t config)&lt;br /&gt;
{&lt;br /&gt;
	if(reg &amp;gt; 10) reg = 0;&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_LEDDRIVER_ADR, reg, config);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
uint8_t select[3];&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Updates the LED driver select registers (0..2)&lt;br /&gt;
 * with the global select array!&lt;br /&gt;
 *&lt;br /&gt;
 * Hint: - Also have a look at Table 4 in the&lt;br /&gt;
 *         TCA6507 datasheet!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void TCA6507_update(void)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmit4Bytes(I2C_SENSOR_LEDDRIVER_ADR, (TCA6507_SELECT0 | 0x10), select[0], select[1], select[2]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This is the LED state set function.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: led   -&amp;gt; LED number [0..6]&lt;br /&gt;
 *        state -&amp;gt; LED state  [0..7]&lt;br /&gt;
 *&lt;br /&gt;
 * Hints: - Possible driver states [0..7] see&lt;br /&gt;
 *          &amp;quot;Output states:&amp;quot; in the library&lt;br /&gt;
 *          header file!&lt;br /&gt;
 *        - Also have a look at Table 4 in the&lt;br /&gt;
 *          TCA6507 datasheet!&lt;br /&gt;
 *&lt;br /&gt;
 * There is also a macro setLED(led, state), which&lt;br /&gt;
 * does exactly the same as this function.&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *   setLED(1,4);&lt;br /&gt;
 *   // Switches LED1 ON&lt;br /&gt;
 *   // ... OR ...&lt;br /&gt;
 *   setLED(SB_LED1,STATE_ON);&lt;br /&gt;
 *   // does the same.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void TCA6507_set(uint8_t led, uint8_t state)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t i, mask;&lt;br /&gt;
&lt;br /&gt;
	if(led &amp;gt; 6) led = 0;&lt;br /&gt;
	led = 1 &amp;lt;&amp;lt; led;&lt;br /&gt;
	mask = 1;&lt;br /&gt;
	for(i = 0; i &amp;lt; 3; i++) {&lt;br /&gt;
		select[i] &amp;amp;= ~led;&lt;br /&gt;
		if(state &amp;amp; mask)&lt;br /&gt;
			select[i] |= led;&lt;br /&gt;
		mask &amp;lt;&amp;lt;= 1;&lt;br /&gt;
	}&lt;br /&gt;
	TCA6507_update();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * If the LEDs are not needed for a while, the&lt;br /&gt;
 * LED driver can be stopped with this function&lt;br /&gt;
 * (TCA6507 set to shutdown mode).&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void TCA6507_shutdown(void)&lt;br /&gt;
{&lt;br /&gt;
	outport.en_leddriv = false;					// I/O 0.4: Low&lt;br /&gt;
	MAX7311_update();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * If the LED driver was stopped with the&lt;br /&gt;
 * function TCA6507_shutdown() before, it can be&lt;br /&gt;
 * (re)started again with this function.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void TCA6507_restart(void)&lt;br /&gt;
{&lt;br /&gt;
	outport.en_leddriv = true;					// I/O 0.4: High&lt;br /&gt;
	MAX7311_update();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Initializes the LED driver after power on by&lt;br /&gt;
 * switching all LEDs off.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void TCA6507_init(void)&lt;br /&gt;
{&lt;br /&gt;
	select[0] = 0;&lt;br /&gt;
	select[1] = 0;&lt;br /&gt;
	select[2] = 0;&lt;br /&gt;
	TCA6507_update();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C 3D Magnetometer &amp;amp; Accelerometer (LSM303DLHC):&lt;br /&gt;
&lt;br /&gt;
// --------------------------------------------&lt;br /&gt;
// LSM303DLHC accelerometer functions:&lt;br /&gt;
int16_t x_axisa, y_axisa, z_axisa;&lt;br /&gt;
double pitch, roll;&lt;br /&gt;
double xa, ya, za;&lt;br /&gt;
double the, phi;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Call this once before using the 3D-Accelerometer.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void LSM303DLHC_A_init(void)&lt;br /&gt;
{&lt;br /&gt;
	// Set normal power mode, 10 Hz data rate, all axes enabled:&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_LSM303DLHC_A_ADR, CTRL_REG1_A, CTRL_REG1_A_10HZ);&lt;br /&gt;
	mSleep(10);&lt;br /&gt;
	// Set HD mode:&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_LSM303DLHC_A_ADR, CTRL_REG4_A, CTRL_REG4_A_HR);&lt;br /&gt;
	mSleep(10);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function reads the X-axis, Y-axis and Z-axis values&lt;br /&gt;
 * from the LSM303DLHC accelerometer and stores them in the&lt;br /&gt;
 * global variables x_axisa, y_axisa and z_axisa.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void readLSM303DLHC_A(void)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t readBuf[6];&lt;br /&gt;
&lt;br /&gt;
	I2CTWI_transmitByte(I2C_SENSOR_LSM303DLHC_A_ADR, (OUT_X_L_A | 0x80));&lt;br /&gt;
	I2CTWI_readBytes(I2C_SENSOR_LSM303DLHC_A_ADR, readBuf, 6); // Read  X-/Y-/Z-axis&lt;br /&gt;
	// xb = y:&lt;br /&gt;
	x_axisa = ((readBuf[OUT_Y_H_A - OUT_X_L_A] &amp;lt;&amp;lt; 8) + readBuf[OUT_Y_L_A - OUT_X_L_A]) / 16;&lt;br /&gt;
	// yb = x:&lt;br /&gt;
	y_axisa = ((readBuf[OUT_X_H_A - OUT_X_L_A] &amp;lt;&amp;lt; 8) + readBuf[OUT_X_L_A - OUT_X_L_A]) / 16;&lt;br /&gt;
	// zb = z:&lt;br /&gt;
	z_axisa = ((readBuf[OUT_Z_H_A - OUT_X_L_A] &amp;lt;&amp;lt; 8) + readBuf[OUT_Z_L_A - OUT_X_L_A]) / 16;&lt;br /&gt;
	mSleep(10);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function limits and normalizes the x-axisa,&lt;br /&gt;
 * y-axisa and z-axisa values read from the LSM303DLHC&lt;br /&gt;
 * accelerometer with the function readLSM303DLHC_A() and&lt;br /&gt;
 * stores them in the global double variables xa, ya and&lt;br /&gt;
 * za.&lt;br /&gt;
 * It also calculates the position in space in form of the&lt;br /&gt;
 * tilt angles (the = pitch, phi = roll) and stores them&lt;br /&gt;
 * in the global double variables the and phi.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void normalizeLSM303DLHC_A(void)&lt;br /&gt;
{&lt;br /&gt;
	// Limit raw values:&lt;br /&gt;
	if (x_axisa &amp;lt; MIN_X_A) x_axisa = MIN_X_A;&lt;br /&gt;
	if (x_axisa &amp;gt; MAX_X_A) x_axisa = MAX_X_A;&lt;br /&gt;
	if (y_axisa &amp;lt; MIN_Y_A) y_axisa = MIN_Y_A;&lt;br /&gt;
	if (y_axisa &amp;gt; MAX_Y_A) y_axisa = MAX_Y_A;&lt;br /&gt;
	if (z_axisa &amp;lt; MIN_Z_A) z_axisa = MIN_Z_A;&lt;br /&gt;
	if (z_axisa &amp;gt; MAX_Z_A) z_axisa = MAX_Z_A;&lt;br /&gt;
	xa = (double) x_axisa / 1000.0;&lt;br /&gt;
	ya = (double) y_axisa / 1000.0;&lt;br /&gt;
	za = (double) z_axisa / 1000.0;&lt;br /&gt;
	// Calculate Pitch and Roll:&lt;br /&gt;
	phi = asin(xa);								// Calculate the and phi&lt;br /&gt;
	the = asin(ya / cos(the));					//  from the raw values&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function calculates the position in space by&lt;br /&gt;
 * using the the and phi values (see function&lt;br /&gt;
 * normalizeLSM303DLHC_A()!). It stores the position&lt;br /&gt;
 * in the global double variables pitch and roll. &lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void positionLSM303DLHC_A(void)&lt;br /&gt;
{&lt;br /&gt;
	pitch = the * 180 / M_PI + OFFSET_PITCH_A;&lt;br /&gt;
	roll = phi * 180 / M_PI + OFFSET_ROLL_A;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// LSM303DLHC magnetometer functions:&lt;br /&gt;
int16_t x_axism, y_axism, z_axism;&lt;br /&gt;
int16_t headingm;&lt;br /&gt;
double xm, ym, zm;&lt;br /&gt;
#ifdef GET_TEMP_M&lt;br /&gt;
int16_t temperaturem;&lt;br /&gt;
double temperature_mag;&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
int16_t headingtc;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Call this once before using the 3D-Compass.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void LSM303DLHC_M_init(void)&lt;br /&gt;
{&lt;br /&gt;
#ifdef GET_TEMP_M&lt;br /&gt;
	// Set Data output rate to 15Hz, enable temperature sensor:&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_LSM303DLHC_M_ADR, CRA_REG_M, CRA_REG_M_15HZ_T_EN);&lt;br /&gt;
#else&lt;br /&gt;
	// Set Data output rate to 15Hz:&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_LSM303DLHC_M_ADR, CRA_REG_M, CRA_REG_M_15HZ);&lt;br /&gt;
#endif&lt;br /&gt;
	mSleep(10);&lt;br /&gt;
	// Set Gain to +-1.3Gauss:&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_LSM303DLHC_M_ADR, CRB_REG_M, CRB_REG_M_13GAUSS);&lt;br /&gt;
	mSleep(10);&lt;br /&gt;
	// Set Continuous-conversion mode:&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_LSM303DLHC_M_ADR, MR_REG_M, MR_REG_M_CCM);&lt;br /&gt;
	mSleep(10);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function reads the X-axis, Y-axis, Z-axis and&lt;br /&gt;
 * temperature values from the LSM303DLHC magnetometer&lt;br /&gt;
 * and stores them in the global variables x_axism,&lt;br /&gt;
 * y_axism, z_axism and temperaturem.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void readLSM303DLHC_M(void)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t readBuf[6];&lt;br /&gt;
&lt;br /&gt;
	I2CTWI_transmitByte(I2C_SENSOR_LSM303DLHC_M_ADR, OUT_X_H_M);&lt;br /&gt;
	I2CTWI_readBytes(I2C_SENSOR_LSM303DLHC_M_ADR, readBuf, 6); // Read  X-/Y-/Z-axis&lt;br /&gt;
	// xb = x:&lt;br /&gt;
	x_axism = (readBuf[OUT_X_H_M - OUT_X_H_M] &amp;lt;&amp;lt; 8) + readBuf[OUT_X_L_M - OUT_X_H_M];&lt;br /&gt;
	// yb = y:&lt;br /&gt;
	y_axism = (readBuf[OUT_Y_H_M - OUT_X_H_M] &amp;lt;&amp;lt; 8) + readBuf[OUT_Y_L_M - OUT_X_H_M];&lt;br /&gt;
	// zb = z:&lt;br /&gt;
	z_axism = (readBuf[OUT_Z_H_M - OUT_X_H_M] &amp;lt;&amp;lt; 8) + readBuf[OUT_Z_L_M - OUT_X_H_M];&lt;br /&gt;
	mSleep(10);&lt;br /&gt;
#ifdef GET_TEMP_M&lt;br /&gt;
	// Read temperature raw value:&lt;br /&gt;
	I2CTWI_transmitByte(I2C_SENSOR_LSM303DLHC_M_ADR, TEMP_OUT_H_M);&lt;br /&gt;
	readBuf[0] = I2CTWI_readByte(I2C_SENSOR_LSM303DLHC_M_ADR);&lt;br /&gt;
	I2CTWI_transmitByte(I2C_SENSOR_LSM303DLHC_M_ADR, TEMP_OUT_L_M);&lt;br /&gt;
	readBuf[1] = I2CTWI_readByte(I2C_SENSOR_LSM303DLHC_M_ADR);&lt;br /&gt;
	temperaturem = (readBuf[0] &amp;lt;&amp;lt; 8) | readBuf[1];&lt;br /&gt;
	temperaturem &amp;gt;&amp;gt;= 4;&lt;br /&gt;
	if (temperaturem &amp;amp; 2048)					// Calculate temperature&lt;br /&gt;
		temperaturem = (temperaturem &amp;amp; 2047) - 2048;&lt;br /&gt;
	else&lt;br /&gt;
		temperaturem = temperaturem &amp;amp; 2047;&lt;br /&gt;
	mSleep(10);&lt;br /&gt;
#endif&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function compensates hard iron effects and&lt;br /&gt;
 * scales the x-axism, y-axism and z-axism values read&lt;br /&gt;
 * from the LSM303DLHC magnetometer with the function&lt;br /&gt;
 * readLSM303DLHC_M() and stores them in the global&lt;br /&gt;
 * double variables xm, ym and zm.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void normalizeLSM303DLHC_M(void)&lt;br /&gt;
{&lt;br /&gt;
	// Add hard iron offsets:&lt;br /&gt;
	x_axism += OFFSET_X_M;&lt;br /&gt;
	y_axism += OFFSET_Y_M;&lt;br /&gt;
	z_axism += OFFSET_Z_M;&lt;br /&gt;
	// Scale raw values:&lt;br /&gt;
	xm = (x_axism - MIN_X_M) / (MAX_X_M - MIN_X_M) * 2 - 1;&lt;br /&gt;
	ym = (y_axism - MIN_Y_M) / (MAX_Y_M - MIN_Y_M) * 2 - 1;&lt;br /&gt;
	zm = (z_axism - MIN_Z_M) / (MAX_Z_M - MIN_Z_M) * 2 - 1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function calculates the heading by using the&lt;br /&gt;
 * normalized sensor values xm and ym (see function&lt;br /&gt;
 * normalizeLSM303DLHC_M()!). The heading is a value&lt;br /&gt;
 * from 0° to 359°. If the robot's front (and the&lt;br /&gt;
 * RP6 Sensor Board's front edge with the two&lt;br /&gt;
 * headlights) points to ...&lt;br /&gt;
 *   north -&amp;gt; heading is 0°,&lt;br /&gt;
 *   east  -&amp;gt; heading is 90°,&lt;br /&gt;
 *   south -&amp;gt; heading is 180°,&lt;br /&gt;
 *   west  -&amp;gt; heading is 270°.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
int16_t headingLSM303DLHC_M(void)&lt;br /&gt;
{&lt;br /&gt;
	double hdg = atan2(ym, xm) * 180 / M_PI + DECLINATION_M;&lt;br /&gt;
	if(hdg &amp;lt; 0.0) hdg += 360.0;&lt;br /&gt;
	return ((int16_t) hdg);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// --------------------------------------------&lt;br /&gt;
/**&lt;br /&gt;
 * This function calculates the TILT COMPENSATED&lt;br /&gt;
 * heading by using accelerometer (the, phi) AND&lt;br /&gt;
 * magnetometer (xm, ym, zm) data. The heading is a&lt;br /&gt;
 * value from 0° to 359°. If the robot's front (and&lt;br /&gt;
 * the RP6 Sensor Board's front edge with the two&lt;br /&gt;
 * headlights) points to ...&lt;br /&gt;
 *   north -&amp;gt; heading is 0°,&lt;br /&gt;
 *   east  -&amp;gt; heading is 90°,&lt;br /&gt;
 *   south -&amp;gt; heading is 180°,&lt;br /&gt;
 *   west  -&amp;gt; heading is 270°.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
int16_t headingLSM303DLHC_TC(void)&lt;br /&gt;
{&lt;br /&gt;
	double hdgtc, xh, yh;&lt;br /&gt;
&lt;br /&gt;
	xh = xm * cos(the) + zm * sin(the);&lt;br /&gt;
	yh = xm * sin(phi) * sin(the) + ym * cos(phi) - zm * sin(phi) * cos(the);&lt;br /&gt;
//	zh = -xm * cos(phi) * sin(the) + ym * sin(phi) + zm * cos(phi) * cos(the);&lt;br /&gt;
	hdgtc = atan2(yh, xh) * 180 / M_PI + DECLINATION_M;&lt;br /&gt;
	if(hdgtc &amp;lt; 0.0) hdgtc += 360.0;&lt;br /&gt;
	return ((int16_t) hdgtc);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// --------------------------------------------&lt;br /&gt;
/**&lt;br /&gt;
 * Call this once before using the LSM303DLHC.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void LSM303DLHC_init(void)&lt;br /&gt;
{&lt;br /&gt;
	LSM303DLHC_A_init();						// Accelerometer init&lt;br /&gt;
	LSM303DLHC_M_init();						// Magnetometer init&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Analog Yaw-Rate Gyroscope (LY330ALH):&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Sets the LY330ALH mode of operation.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: mode -&amp;gt; Mode [0..3]&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void LY330ALH_set_mode(uint8_t mode)&lt;br /&gt;
{&lt;br /&gt;
	outport.pd_gyro = false;					// I/O 0.6: Low&lt;br /&gt;
	outport.st_gyro = false;					// I/O 0.7: Low&lt;br /&gt;
	if(mode &amp;amp; 1) outport.pd_gyro = true;&lt;br /&gt;
	if(mode &amp;amp; 2) outport.st_gyro = true;&lt;br /&gt;
	MAX7311_update();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Reads the ADC1 value from the RP6Base.&lt;br /&gt;
 *&lt;br /&gt;
 * Hints: - The RP6Base input ADC1 has to be&lt;br /&gt;
 *          connected to the USRBUS: Pin 2 on&lt;br /&gt;
 *          the RP6 mainboard!&lt;br /&gt;
 *        - The RP6Base_I2CSlave program has to&lt;br /&gt;
 *          be loaded into the RP6Base&lt;br /&gt;
 *          microcontroller!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
uint16_t getRP6Base_ADC1(void)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_readRegisters(I2C_RP6_BASE_ADR, I2C_REG_ADC_ADC1_L, registerBuf, 2);&lt;br /&gt;
	return (registerBuf[0] + (registerBuf[1] &amp;lt;&amp;lt; 8));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int16_t z_axisg;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Performs a LY330ALH gyroscope measurement and&lt;br /&gt;
 * returns the angular rate (velocity).&lt;br /&gt;
 * Positive values mean an angular rate while&lt;br /&gt;
 * rotating LEFT and negative values while&lt;br /&gt;
 * rotating RIGHT!&lt;br /&gt;
 * The global integer variable z_axisg also&lt;br /&gt;
 * contains the measurement result.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
int16_t LY330ALH_measure(void)&lt;br /&gt;
{&lt;br /&gt;
	z_axisg = getRP6Base_ADC1();				// Read raw data&lt;br /&gt;
	z_axisg -= ADCVAL_ZERORATE_LEVEL;			// Calculate value&lt;br /&gt;
	return (z_axisg);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Hot Swappable 2-Wire Bus Buffer (TCA4311A):&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Reads the TCA4311A Ready output. &lt;br /&gt;
 * The function returns the state (true/false).&lt;br /&gt;
 * The global variable readyBusbuff is also&lt;br /&gt;
 * filled with the Ready output state.&lt;br /&gt;
 *&lt;br /&gt;
 * Hint: You don't have to use this function,&lt;br /&gt;
 *       if the task task_RP6SensorBoard() is&lt;br /&gt;
 *       called frequently out of the main&lt;br /&gt;
 *       loop, because readyBusbuff will be&lt;br /&gt;
 *       updated by this task!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
uint8_t readReadyBusbuff(void)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmitByte(I2C_SENSOR_PORTEXP_ADR, MAX7311_INPUT_PORT1);&lt;br /&gt;
	readyBusbuff = I2CTWI_readByte(I2C_SENSOR_PORTEXP_ADR);&lt;br /&gt;
	readyBusbuff &amp;amp;= RDY_BUSBUFF;&lt;br /&gt;
	return readyBusbuff;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
uint8_t errorBusbuff;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * If the I2C bus for the I2C-MODULE (SCLOUT,&lt;br /&gt;
 * SDAOUT) is not used or shall be isolated from&lt;br /&gt;
 * the RP6 I2C bus, this can be done with this&lt;br /&gt;
 * function.&lt;br /&gt;
 *&lt;br /&gt;
 * Hints: - The I2C-MODULE power is NOT switched&lt;br /&gt;
 *          off by this function!&lt;br /&gt;
 *        - If USE_PD5 is defined in the&lt;br /&gt;
 *          configuration header file, this&lt;br /&gt;
 *          function uses the RP6M256 portpin,&lt;br /&gt;
 *          that is connected to plug I/O: Pin 9&lt;br /&gt;
 *          instead of MAX7311 I/O 1.0!&lt;br /&gt;
 *        - If the global variable errorBusbuff&lt;br /&gt;
 *          returns true, the bus buffer could&lt;br /&gt;
 *          not be switched to shutdown mode!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void TCA4311A_shutdown(void)&lt;br /&gt;
{&lt;br /&gt;
	// Wait until the I2C bus is idle:&lt;br /&gt;
	while(I2CTWI_isBusy() || TWI_operation != I2CTWI_NO_OPERATION) task_I2CTWI();&lt;br /&gt;
#ifdef USE_PD5&lt;br /&gt;
	IO_SENSOR_TCA4311A_EN_PORT &amp;amp;= ~IO_SENSOR_TCA4311A_EN_IN; // Low&lt;br /&gt;
#else&lt;br /&gt;
	outport.en_busbuff = false;					// I/O 1.0: Low&lt;br /&gt;
	MAX7311_update();&lt;br /&gt;
#endif&lt;br /&gt;
	errorBusbuff = readReadyBusbuff();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * If the I2C bus for the I2C-MODULE (SCLOUT,&lt;br /&gt;
 * SDAOUT) was isolated from the RP6 I2C bus with&lt;br /&gt;
 * the function TCA4311A_shutdown() before, it&lt;br /&gt;
 * can be connected again with this function.&lt;br /&gt;
 *&lt;br /&gt;
 * Hints: - The I2C-MODULE power is NOT switched&lt;br /&gt;
 *          on by this function!&lt;br /&gt;
 *        - If USE_PD5 is defined in the&lt;br /&gt;
 *          configuration header file, this&lt;br /&gt;
 *          function uses the RP6M256 portpin,&lt;br /&gt;
 *          that is connected to plug I/O: Pin 9&lt;br /&gt;
 *          instead of MAX7311 I/O 1.0!&lt;br /&gt;
 *        - If the global variable errorBusbuff&lt;br /&gt;
 *          returns true, the bus buffer could&lt;br /&gt;
 *          not be switched to normal operation!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void TCA4311A_reconnect(void)&lt;br /&gt;
{&lt;br /&gt;
	// Wait until the I2C bus is idle:&lt;br /&gt;
	while(I2CTWI_isBusy() || TWI_operation != I2CTWI_NO_OPERATION) task_I2CTWI();&lt;br /&gt;
#ifdef USE_PD5&lt;br /&gt;
	IO_SENSOR_TCA4311A_EN_PORT |= IO_SENSOR_TCA4311A_EN_IN; // High&lt;br /&gt;
#else&lt;br /&gt;
	outport.en_busbuff = true;					// I/O 1.0: High&lt;br /&gt;
	MAX7311_update();&lt;br /&gt;
#endif&lt;br /&gt;
	errorBusbuff = !readReadyBusbuff();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Sets/clears the RP6Base signal PWR.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: pwr -&amp;gt; 0 (false) = PWR off&lt;br /&gt;
 *               &amp;gt;0 (true) = PWR on&lt;br /&gt;
 *&lt;br /&gt;
 * Hints: - The RP6Base signal PWR has to be&lt;br /&gt;
 *          connected to the USRBUS: Pin 3 on&lt;br /&gt;
 *          the RP6 mainboard!&lt;br /&gt;
 *        - The RP6Base_I2CSlave program has to&lt;br /&gt;
 *          be loaded into the RP6Base&lt;br /&gt;
 *          microcontroller!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void setRP6Base_PWR(uint8_t pwr)&lt;br /&gt;
{&lt;br /&gt;
	if(pwr &amp;gt; 0)&lt;br /&gt;
		I2CTWI_transmit2Bytes(I2C_RP6_BASE_ADR, 0, CMD_POWER_ON);&lt;br /&gt;
	else&lt;br /&gt;
		I2CTWI_transmit2Bytes(I2C_RP6_BASE_ADR, 0, CMD_POWER_OFF);&lt;br /&gt;
	while(I2CTWI_isBusy() || TWI_operation != I2CTWI_NO_OPERATION) task_I2CTWI();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/** &lt;br /&gt;
 * With this function you can switch the I2C-&lt;br /&gt;
 * MODULE (plug M1) power on or off.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: pwr -&amp;gt; 0 (false) = I2C-MODULE power off&lt;br /&gt;
 *               &amp;gt;0 (true) = I2C-MODULE power on&lt;br /&gt;
 *&lt;br /&gt;
 * Hints: - If the I2C-MODULE plug is not used,&lt;br /&gt;
 *          you should always switch the&lt;br /&gt;
 *          I2C-MODULE power off (default)!&lt;br /&gt;
 *        - The TCA4311A is NOT switched to&lt;br /&gt;
 *          normal operation (default) or&lt;br /&gt;
 *          shutdown mode by this function!&lt;br /&gt;
 *        - The RP6Base signal PWR has to be&lt;br /&gt;
 *          connected to the USRBUS: Pin 3 on&lt;br /&gt;
 *          the RP6 mainboard!&lt;br /&gt;
 *        - The RP6Base_I2CSlave program has to&lt;br /&gt;
 *          be loaded into the RP6Base&lt;br /&gt;
 *          microcontroller!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void setI2CModulePower(uint8_t pwr)&lt;br /&gt;
{&lt;br /&gt;
	if(pwr &amp;gt; 0) {&lt;br /&gt;
		setRP6Base_PWR(1);						// RP6Base PWR on&lt;br /&gt;
		outport.pwr_i2c = true;					// I/O 0.0: High&lt;br /&gt;
	}&lt;br /&gt;
	else&lt;br /&gt;
		outport.pwr_i2c = false;				// I/O 0.0: Low&lt;br /&gt;
	MAX7311_update();&lt;br /&gt;
}	&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Button:&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Reads the MAX7311 I/O port 1.7. &lt;br /&gt;
 * The function returns true, if  button S1 is&lt;br /&gt;
 * pressed (I/O 1.7: Low!) and false, if it is&lt;br /&gt;
 * not pressed (I/O 1.7: High!).&lt;br /&gt;
 * The global variable pressedButton is also&lt;br /&gt;
 * filled with the I/O 1.7 output state.&lt;br /&gt;
 *&lt;br /&gt;
 * Hint: You don't have to use this function,&lt;br /&gt;
 *       if the task task_RP6SensorBoard() is&lt;br /&gt;
 *       called frequently out of the main&lt;br /&gt;
 *       loop, because pressedButton will be&lt;br /&gt;
 *       updated by this task!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
uint8_t readButton(void)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmitByte(I2C_SENSOR_PORTEXP_ADR, MAX7311_INPUT_PORT2);&lt;br /&gt;
	pressedButton = I2CTWI_readByte(I2C_SENSOR_PORTEXP_ADR);&lt;br /&gt;
	pressedButton &amp;amp;= IO2_I2C;&lt;br /&gt;
	pressedButton = !pressedButton;&lt;br /&gt;
	return pressedButton;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Status LED:&lt;br /&gt;
&lt;br /&gt;
/** &lt;br /&gt;
 * Sets the status LED (D2) of the RP6 Sensor&lt;br /&gt;
 * Board.&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *   setStatusLED(1);&lt;br /&gt;
 *   // This switches the status LED on!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void setStatusLED(uint8_t on)&lt;br /&gt;
{&lt;br /&gt;
	if(on &amp;gt; 0)&lt;br /&gt;
		outport.io1_i2c = false;				// I/O 1.6: Low&lt;br /&gt;
	else&lt;br /&gt;
		outport.io1_i2c = true;					// I/O 1.6: High&lt;br /&gt;
	MAX7311_update();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// RP6 Sensor Board initialisation and shutdown:&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * You MUST call this function at the beginning of a&lt;br /&gt;
 * main program, that uses the RP6 Sensor Board. &lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void sensor_board_init(void)&lt;br /&gt;
{&lt;br /&gt;
	// I/O Port Expander:&lt;br /&gt;
	MAX7311_init();&lt;br /&gt;
	// RTC:&lt;br /&gt;
	DS1339_init();&lt;br /&gt;
	// Temperature Sensor:&lt;br /&gt;
	LM75B_init();&lt;br /&gt;
	// Servo Controller:&lt;br /&gt;
	PCA9685_init(50);							// Init PWM 50 Hz&lt;br /&gt;
	// LED Driver:&lt;br /&gt;
	TCA6507_init();&lt;br /&gt;
	// 3D Magnetometer &amp;amp; Accelerometer:&lt;br /&gt;
	LSM303DLHC_init();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * If you don't use any function of the RP6&lt;br /&gt;
 * Sensor Board, you can put the board into&lt;br /&gt;
 * &amp;quot;SHUTDOWN MODE&amp;quot;. In this mode the electric&lt;br /&gt;
 * power consumption is very low to save energy.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void sensor_board_shutdown(void)&lt;br /&gt;
{&lt;br /&gt;
	// Servo Controller:&lt;br /&gt;
	PCA9685_shutdown();							// Shutdown PCA9685&lt;br /&gt;
	// Temperature Sensor:&lt;br /&gt;
	LM75B_shutdown();							// Shutdown LM75B&lt;br /&gt;
	// I/O Port Expander:&lt;br /&gt;
	MAX7311_write(MAX7311_OUTPUT_SHUTDOWN);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&lt;br /&gt;
/******************************************************************************&lt;br /&gt;
 * Additional info&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Changelog:&lt;br /&gt;
 * - v. 1.1 RP6M256_I2CMasterLib compatibility 16.09.2014 by Dirk&lt;br /&gt;
 * - v. 1.0 TCA4311A reconnect problem fixed 10.04.2014 by Dirk&lt;br /&gt;
 * - v. 0.9 Interrupt status functions added 09.04.2014 by Dirk&lt;br /&gt;
 * - v. 0.8 (initial release) 17.03.2014 by Dirk&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Erklärung&lt;br /&gt;
&lt;br /&gt;
=====Demo=====&lt;br /&gt;
makefile:&lt;br /&gt;
&amp;lt;pre&amp;gt;...&lt;br /&gt;
TARGET = RP6M256_Sensor_Board_01&lt;br /&gt;
...&lt;br /&gt;
SRC += $(RP6_LIB_PATH)/RP6common/RP6I2CmasterTWI.c&lt;br /&gt;
&lt;br /&gt;
SRC += $(RP6_LIB_PATH)/RP6control_M256_WIFI/RP6M256_Sensor_BoardLib.c&lt;br /&gt;
...&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Datei: RP6M256_Sensor_Board_01.c&lt;br /&gt;
&amp;lt;pre&amp;gt;/* &lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * RP6 ROBOT SYSTEM - RP6 CONTROL M256 Examples&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Example: RP6M256 Sensor Board&lt;br /&gt;
 * Author(s): Dirk&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Description:&lt;br /&gt;
 * In this example we show a first test for the RP6 Sensor Board.&lt;br /&gt;
 * &lt;br /&gt;
 * ############################################################################&lt;br /&gt;
 * The Robot does NOT move in this example! You can simply put it on a table&lt;br /&gt;
 * next to your PC and you should connect it to the PC via the USB Interface!&lt;br /&gt;
 * You should also connect to it via WIFI.&lt;br /&gt;
 * ############################################################################&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Includes:&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6M256Lib.h&amp;quot; 				// The RP6 M256 Library. &lt;br /&gt;
										// Always needs to be included!&lt;br /&gt;
#include &amp;quot;RP6I2CmasterTWI.h&amp;quot;			// Include the I2C-Bus Master Library&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Include our new &amp;quot;RP6M256 Sensor Board library&amp;quot;:&lt;br /&gt;
// (This is the library for accessing the RP6 Sensor Board!)&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6M256_Sensor_BoardLib.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Variables:&lt;br /&gt;
&lt;br /&gt;
char dir[3];&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Returns a 2 character string for the eighth&lt;br /&gt;
 * parts of the direction calculated from the&lt;br /&gt;
 * heading value.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: heading -&amp;gt; Heading value [0..359]&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void calculateDir(char *dir, uint16_t heading)&lt;br /&gt;
{&lt;br /&gt;
	dir[1] = ' ';&lt;br /&gt;
	dir[2] = '\0';&lt;br /&gt;
	if ((heading &amp;lt;= 22) || (heading &amp;gt;=338)) dir[0] = 'N';&lt;br /&gt;
	if ((heading &amp;gt;= 23) &amp;amp;&amp;amp; (heading &amp;lt;= 67)) {dir[0] = 'N'; dir[1] = 'E';} &lt;br /&gt;
	if ((heading &amp;gt;= 68) &amp;amp;&amp;amp; (heading &amp;lt;= 112)) dir[0] = 'E';&lt;br /&gt;
	if ((heading &amp;gt;= 113) &amp;amp;&amp;amp; (heading &amp;lt;= 157)) {dir[0] = 'S'; dir[1] = 'E';}&lt;br /&gt;
	if ((heading &amp;gt;= 158) &amp;amp;&amp;amp; (heading &amp;lt;= 202)) dir[0] = 'S';&lt;br /&gt;
	if ((heading &amp;gt;= 203) &amp;amp;&amp;amp; (heading &amp;lt;= 247)) {dir[0] = 'S'; dir[1] = 'W';}&lt;br /&gt;
	if ((heading &amp;gt;= 248) &amp;amp;&amp;amp; (heading &amp;lt;= 292)) dir[0] = 'W';&lt;br /&gt;
	if ((heading &amp;gt;= 293) &amp;amp;&amp;amp; (heading &amp;lt;= 337)) {dir[0] = 'N'; dir[1] = 'W';}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Write a floating point number to the WIFI.&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *&lt;br /&gt;
 *			// Write a floating point number to the WIFI (no exponent):&lt;br /&gt;
 *			writeDouble_WIFI(1234567.890, 11, 3);&lt;br /&gt;
 *&lt;br /&gt;
 * The value of prec (precision) defines the number of decimal places.&lt;br /&gt;
 * For 32 bit floating point variables (float, double ...) 6 is&lt;br /&gt;
 * the max. value for prec (7 relevant digits).&lt;br /&gt;
 * The value of width defines the overall number of characters in the&lt;br /&gt;
 * floating point number including the decimal point. The number of&lt;br /&gt;
 * pre-decimal positions is: (width - prec - 1).&lt;br /&gt;
 */&lt;br /&gt;
void writeDouble_WIFI(double number, uint8_t width, uint8_t prec)&lt;br /&gt;
{char buffer[width + 1];&lt;br /&gt;
	dtostrf(number, width, prec, &amp;amp;buffer[0]);&lt;br /&gt;
	writeString_WIFI(&amp;amp;buffer[0]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Write a floating point number to the LCD.&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *&lt;br /&gt;
 *			// Write a floating point number to the LCD (no exponent):&lt;br /&gt;
 *			writeDoubleLCD(1234567.890, 11, 3);&lt;br /&gt;
 *&lt;br /&gt;
 * The value of prec (precision) defines the number of decimal places.&lt;br /&gt;
 * For 32 bit floating point variables (float, double ...) 6 is&lt;br /&gt;
 * the max. value for prec (7 relevant digits).&lt;br /&gt;
 * The value of width defines the overall number of characters in the&lt;br /&gt;
 * floating point number including the decimal point. The number of&lt;br /&gt;
 * pre-decimal positions is: (width - prec - 1).&lt;br /&gt;
 */&lt;br /&gt;
void writeDoubleLCD(double number, uint8_t width, uint8_t prec)&lt;br /&gt;
{char buffer[width + 1];&lt;br /&gt;
	dtostrf(number, width, prec, &amp;amp;buffer[0]);&lt;br /&gt;
	writeStringLCD(&amp;amp;buffer[0]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Error handler&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function gets called automatically if there was an I2C Error like&lt;br /&gt;
 * the slave sent a &amp;quot;not acknowledge&amp;quot; (NACK, error codes e.g. 0x20 or 0x30).&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void I2C_transmissionError(uint8_t errorState)&lt;br /&gt;
{&lt;br /&gt;
	writeString_P_WIFI(&amp;quot;\nI2C ERROR - TWI STATE: 0x&amp;quot;);&lt;br /&gt;
	writeInteger_WIFI(errorState, HEX);&lt;br /&gt;
	writeChar_WIFI('\n');&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Main function - The program starts here:&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
	initRP6M256();    // Always call this first! The Processor will not work&lt;br /&gt;
					  // correctly otherwise. &lt;br /&gt;
&lt;br /&gt;
	initLCD(); // Initialize the LC-Display (LCD)&lt;br /&gt;
			   // Always call this before using the LCD!&lt;br /&gt;
&lt;br /&gt;
	setLEDs(0b1111);&lt;br /&gt;
	mSleep(500);&lt;br /&gt;
	setLEDs(0b0000);&lt;br /&gt;
&lt;br /&gt;
	writeString_P_WIFI(&amp;quot;\n\nRP6 Sensor Board Selftest 1!\n&amp;quot;); &lt;br /&gt;
&lt;br /&gt;
	// IMPORTANT:&lt;br /&gt;
	I2CTWI_initMaster(100); // Initialize the TWI Module for Master operation&lt;br /&gt;
							// with 100kHz SCL Frequency&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	// Register the event handler:&lt;br /&gt;
	I2CTWI_setTransmissionErrorHandler(I2C_transmissionError);&lt;br /&gt;
&lt;br /&gt;
	setLEDs(0b1111);&lt;br /&gt;
&lt;br /&gt;
	// Write a text message to the LCD:&lt;br /&gt;
	showScreenLCD(&amp;quot;################&amp;quot;, &amp;quot;################&amp;quot;);&lt;br /&gt;
	mSleep(1500);&lt;br /&gt;
	showScreenLCD(&amp;quot;RP6v2-M256-WIFI &amp;quot;, &amp;quot;Example Program&amp;quot;);&lt;br /&gt;
	mSleep(2500); &lt;br /&gt;
	showScreenLCD(&amp;quot;RP6 Sensor Board&amp;quot;, &amp;quot;   Selftest 1&amp;quot;);&lt;br /&gt;
	mSleep(2500);&lt;br /&gt;
	clearLCD();&lt;br /&gt;
&lt;br /&gt;
	setLEDs(0b0000);&lt;br /&gt;
&lt;br /&gt;
	// ---------------------------------------&lt;br /&gt;
&lt;br /&gt;
	uint8_t onoff = 0;&lt;br /&gt;
	uint16_t servopos = SERVO1_LT;&lt;br /&gt;
	int16_t rate;&lt;br /&gt;
&lt;br /&gt;
	startStopwatch1();&lt;br /&gt;
	startStopwatch2();&lt;br /&gt;
&lt;br /&gt;
	// IMPORTANT:&lt;br /&gt;
	sensor_board_init();						// RP6 Sensor Board init!!!&lt;br /&gt;
	setServoPower(1);							// Servo power ON!&lt;br /&gt;
/*&lt;br /&gt;
	// ----------------------------------------------&lt;br /&gt;
	// Set RTC once (battery empty or not existing:&lt;br /&gt;
	rtc_time.second = 0;&lt;br /&gt;
	rtc_time.minute = 15;&lt;br /&gt;
	rtc_time.hour = 20;				// 20:15&lt;br /&gt;
	rtc_date.weekday = R_SU;&lt;br /&gt;
	rtc_date.day = 20;&lt;br /&gt;
	rtc_date.month = 4;&lt;br /&gt;
	rtc_date.year = 2014;			// Su, 20.4.2014&lt;br /&gt;
	DS1339_write();&lt;br /&gt;
	// Remove this, if RTC is set and running!!!&lt;br /&gt;
	// ----------------------------------------------&lt;br /&gt;
*/&lt;br /&gt;
	while(true) &lt;br /&gt;
	{&lt;br /&gt;
		if(getStopwatch1() &amp;gt; 1000) // 1s&lt;br /&gt;
		{&lt;br /&gt;
			if (onoff) onoff = 0;&lt;br /&gt;
			else onoff = 1;&lt;br /&gt;
&lt;br /&gt;
			// Interrupt status:&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nInterrupt Status:      &amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(interrupt_RP6SBstatus.byte, BIN, 8);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			// Inport status:&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;Inport Status: &amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(inport.word, BIN, 16);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			// Temperature sensor test:&lt;br /&gt;
			temperature = LM75B_measure();		// Measure&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;Temperature: &amp;quot;);&lt;br /&gt;
			writeDouble_WIFI(temperature, 7, 3);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;°\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			// LED driver test:&lt;br /&gt;
			if (onoff) {&lt;br /&gt;
				setLED(HEADLIGHT_R, STATE_ON);&lt;br /&gt;
				setLED(HEADLIGHT_L, STATE_OFF);&lt;br /&gt;
			}&lt;br /&gt;
			else {&lt;br /&gt;
				setLED(HEADLIGHT_L, STATE_ON);&lt;br /&gt;
				setLED(HEADLIGHT_R, STATE_OFF);&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			// Servo controller test (SERVO_1):&lt;br /&gt;
			setServo(1, servopos);&lt;br /&gt;
			servopos += 10;&lt;br /&gt;
			if (servopos &amp;gt; SERVO1_RT) servopos = SERVO1_LT;&lt;br /&gt;
&lt;br /&gt;
			// RTC test:&lt;br /&gt;
			DS1339_read();&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;RTC: &amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(rtc_time.hour, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;:&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(rtc_time.minute, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;:&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(rtc_time.second, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;  &amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(rtc_date.day, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;.&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(rtc_date.month, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;.&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(rtc_date.year, DEC, 4);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			// 3D Magnetometer &amp;amp; Accelerometer test:&lt;br /&gt;
			//  LSM303DLHC accelerometer:&lt;br /&gt;
			task_I2CTWI();&lt;br /&gt;
			readLSM303DLHC_A();					// Get sensor values&lt;br /&gt;
			task_I2CTWI();&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\n3D-Acceleration SENSOR -&amp;gt;\n&amp;quot;);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;X-axis: &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(x_axisa, DEC);&lt;br /&gt;
			writeChar_WIFI('\n');&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;Y-axis: &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(y_axisa, DEC);&lt;br /&gt;
			writeChar_WIFI('\n');&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;Z-axis: &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(z_axisa, DEC);&lt;br /&gt;
			writeChar_WIFI('\n');&lt;br /&gt;
			normalizeLSM303DLHC_A();			// Normalize data&lt;br /&gt;
			positionLSM303DLHC_A();				// Calculate position&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;POSITION: \n&amp;quot;);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;  Pitch [°]: &amp;quot;);&lt;br /&gt;
			writeDouble_WIFI(pitch, 6, 1);&lt;br /&gt;
			writeChar_WIFI('\n');&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;  Roll [°]:  &amp;quot;);&lt;br /&gt;
			writeDouble_WIFI(roll, 6, 1);&lt;br /&gt;
			writeChar_WIFI('\n');&lt;br /&gt;
&lt;br /&gt;
			//  LSM303DLHC magnetometer:&lt;br /&gt;
			task_I2CTWI();&lt;br /&gt;
			readLSM303DLHC_M();					// Get sensor values&lt;br /&gt;
			task_I2CTWI();&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\n3D-Compass SENSOR -&amp;gt;\n&amp;quot;);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;X-axis: &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(x_axism, DEC);&lt;br /&gt;
			writeChar_WIFI('\n');&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;Y-axis: &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(y_axism, DEC);&lt;br /&gt;
			writeChar_WIFI('\n');&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;Z-axis: &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(z_axism, DEC);&lt;br /&gt;
			writeChar_WIFI('\n');&lt;br /&gt;
			normalizeLSM303DLHC_M();			// Normalize data&lt;br /&gt;
			headingm = headingLSM303DLHC_M();	// Calculate heading&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;                 Heading [°]: &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(headingm, DEC);&lt;br /&gt;
			calculateDir(dir, headingm);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;  Direction: &amp;quot;);&lt;br /&gt;
			writeString_WIFI(dir);&lt;br /&gt;
			writeChar_WIFI('\n');&lt;br /&gt;
			headingtc = headingLSM303DLHC_TC();	// Calculate TILT COMPENSATED&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;TILT COMPENSATED heading [°]: &amp;quot;); // heading&lt;br /&gt;
			writeInteger_WIFI(headingtc, DEC);&lt;br /&gt;
			calculateDir(dir, headingtc);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;  Direction: &amp;quot;);&lt;br /&gt;
			writeString_WIFI(dir);&lt;br /&gt;
			writeChar_WIFI('\n');&lt;br /&gt;
#ifdef GET_TEMP_M&lt;br /&gt;
			temperature_mag = (double) temperaturem / 8.0 + OFFSET_TEMP_M;&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;Temperature [°]: &amp;quot;);&lt;br /&gt;
			writeDouble_WIFI(temperature_mag, 7, 2);&lt;br /&gt;
			writeChar_WIFI('\n');&lt;br /&gt;
#endif&lt;br /&gt;
			// Yaw-Rate Gyroscope test:&lt;br /&gt;
			rate = LY330ALH_measure();&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\n1D-Gyro SENSOR -&amp;gt;\n&amp;quot;);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;Z-axis: &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(rate, DEC);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			// RP6 Sensor Board shutdown (button &amp;amp; status LED test):&lt;br /&gt;
			if (pressedButton) {&lt;br /&gt;
				setStatusLED(1);&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;\nPress button again for RP6 Sensor Board SHUTDOWN!\n&amp;quot;);&lt;br /&gt;
				mSleep(2000);&lt;br /&gt;
				do {&lt;br /&gt;
					if(getStopwatch2() &amp;gt; 200) { // 0.2s&lt;br /&gt;
						if (onoff) onoff = 0;&lt;br /&gt;
						else onoff = 1;&lt;br /&gt;
						if (onoff) setStatusLED(1);&lt;br /&gt;
						else setStatusLED(0);&lt;br /&gt;
						setStopwatch2(0);&lt;br /&gt;
					}&lt;br /&gt;
					mSleep(1);&lt;br /&gt;
					task_I2CTWI();&lt;br /&gt;
				} while (!readButton());&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;\n\n\n\n\nPlease wait for RP6 Sensor Board SHUTDOWN...\n&amp;quot;);&lt;br /&gt;
				sensor_board_shutdown();&lt;br /&gt;
				mSleep(3000);&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;\n\n\nThe RP6 Sensor Board now is in SHUTDOWN MODE!!!\n&amp;quot;);&lt;br /&gt;
				mSleep(1000);&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;\nRESET the M256 microcontroller now...\n\n&amp;quot;);&lt;br /&gt;
				while(true) {};&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			setStopwatch1(0);&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		task_checkINTs();						// Read interrupt signals&lt;br /&gt;
		task_RP6SensorBoard();					// RP6 Sensor Board task&lt;br /&gt;
&lt;br /&gt;
		task_I2CTWI();&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Erklärung&lt;br /&gt;
&lt;br /&gt;
====Projekte====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===RP6 Xtra Module===&lt;br /&gt;
Die Dokumentation zu den RP6 Xtra Modulen befindet sich auf der mitgelieferten ''&amp;quot;RP6 Robot System Xtra Modules CD-ROM&amp;quot;''. Auf der CD-ROM sind auch Software-Beispiele zu finden.&lt;br /&gt;
&lt;br /&gt;
Die hier veröffentlichte Software zu den Xtra Modulen ist eine Eigenentwicklung in GCC:&lt;br /&gt;
* Arexx [[RP6_Sensor_Board_und_Xtra_Module#I2C_GPS_Empf.C3.A4nger_JM3-GPS_2|I2C GPS Empfänger JM3-GPS]]&lt;br /&gt;
* Arexx [[RP6_Sensor_Board_und_Xtra_Module#Gyro_Modul_JM3-GYRO_2|Gyro Modul JM3-GYRO]]&lt;br /&gt;
* Arexx [[RP6_Sensor_Board_und_Xtra_Module#3D_Accelerometer_Modul_JM3-3DA_2|3D Accelerometer Modul JM3-3DA]]&lt;br /&gt;
* Arexx [[RP6_Sensor_Board_und_Xtra_Module#BHT_Modul_JM3-BHT31_2|BHT Modul JM3-BHT31]]&lt;br /&gt;
&lt;br /&gt;
====I2C GPS Empfänger JM3-GPS====&lt;br /&gt;
=====Dokumentation=====&lt;br /&gt;
Die Dokumentation zum I2C GPS Empfänger befindet sich auf der mitgelieferten ''&amp;quot;RP6 Robot System Xtra Modules CD-ROM&amp;quot;''.&lt;br /&gt;
&lt;br /&gt;
======Manuals======&lt;br /&gt;
Das Handbuch in der aktuellen Version kann [http://www.jm3-engineering.com/download/doc/ManualGPSModule_de.pdf hier] eingesehen werden.&lt;br /&gt;
&lt;br /&gt;
=====Demo-Programme=====&lt;br /&gt;
Ein Demo-Programm zum I2C GPS Empfänger befindet sich integriert in die RP6 Sensor Board Demo auf der mitgelieferten ''&amp;quot;RP6 Robot System Xtra Modules CD-ROM&amp;quot;''. Diese Demo kann auch in der aktuellen Version im Download Bereich von [http://www.jm3-engineering.com/downloads.htm JM3 Engineering] herunter geladen werden.&lt;br /&gt;
&lt;br /&gt;
=====RP6M256 WiFi: I2C_GPS Library=====&lt;br /&gt;
Die nachfolgende RP6M256_I2C_GPSLib (Eigenentwicklung in GCC) dient zur Ansteuerung des I2C GPS Empfängers durch die RP6M256 WiFi.&lt;br /&gt;
 &lt;br /&gt;
======Libary Header======&lt;br /&gt;
Datei: RP6M256_I2C_GPSLib.h&lt;br /&gt;
&amp;lt;pre&amp;gt;/* ****************************************************************************&lt;br /&gt;
 *                           _______________________&lt;br /&gt;
 *                           \| RP6  ROBOT SYSTEM |/&lt;br /&gt;
 *                            \_-_-_-_-_-_-_-_-_-_/           &amp;gt;&amp;gt;&amp;gt; RP6 M256 WIFI&lt;br /&gt;
 * ----------------------------------------------------------------------------&lt;br /&gt;
 * ----------------------------- [c]2014 - Dirk -------------------------------&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * File: RP6M256_I2C_GPSLib.h&lt;br /&gt;
 * Version: 1.0&lt;br /&gt;
 * Target: RP6 M256 WIFI - ATMEGA2560 @16.00MHz&lt;br /&gt;
 * Author(s): Dirk&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Description:&lt;br /&gt;
 * Header file for new RP6 I2C GPS Receiver library.&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
#ifndef RP6M256_I2C_GPSLIB_H&lt;br /&gt;
#define RP6M256_I2C_GPSLIB_H&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// RP6 Sensor Board:&lt;br /&gt;
&lt;br /&gt;
// If you want to use the RP6 I2C GPS Receiver on the RP6 Sensor Board, you&lt;br /&gt;
// have to define SENSOR_BOARD (default)!&lt;br /&gt;
// If SENSOR_BOARD is NOT defined, this library assumes that the RP6 I2C GPS&lt;br /&gt;
// Receiver is used stand-alone.&lt;br /&gt;
// ------------------&lt;br /&gt;
#define SENSOR_BOARD&lt;br /&gt;
// ------------------&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Includes:&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6M256Lib.h&amp;quot;&lt;br /&gt;
#include &amp;quot;RP6I2CmasterTWI.h&amp;quot;&lt;br /&gt;
#ifdef SENSOR_BOARD&lt;br /&gt;
	#include &amp;quot;RP6M256_Sensor_BoardLib.h&amp;quot;&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// RP6 I2C GPS Receiver:&lt;br /&gt;
#define I2C_GPS_RECEIVER_ADR			0xc8	// Default&lt;br /&gt;
//#define I2C_GPS_RECEIVER_ADR			0xca&lt;br /&gt;
//#define I2C_GPS_RECEIVER_ADR			0xcc&lt;br /&gt;
//#define I2C_GPS_RECEIVER_ADR			0xce&lt;br /&gt;
//#define I2C_GPS_RECEIVER_ADR			0xd0	// DO NOT USE on Sensor Board!&lt;br /&gt;
//#define I2C_GPS_RECEIVER_ADR			0xd2&lt;br /&gt;
//#define I2C_GPS_RECEIVER_ADR			0xd4&lt;br /&gt;
//#define I2C_GPS_RECEIVER_ADR			0xd6&lt;br /&gt;
//#define I2C_GPS_RECEIVER_ADR			0xd8&lt;br /&gt;
//#define I2C_GPS_RECEIVER_ADR			0xda&lt;br /&gt;
//#define I2C_GPS_RECEIVER_ADR			0xdc&lt;br /&gt;
//#define I2C_GPS_RECEIVER_ADR			0xde&lt;br /&gt;
&lt;br /&gt;
// Read registers:&lt;br /&gt;
#define WHO_AM_I						0x20	// I2C address [0xc8..0xde]&lt;br /&gt;
#define LAT_DEG							0x21	// Degrees&lt;br /&gt;
#define LAT_MIN							0x22	// Minutes&lt;br /&gt;
#define LAT_MIN_D_L						0x23	// Minutes decimal part low&lt;br /&gt;
#define LAT_MIN_D_H						0x24	// Minutes decimal part high&lt;br /&gt;
#define LON_DEG							0x25	// Degrees&lt;br /&gt;
#define LON_MIN							0x26	// Minutes&lt;br /&gt;
#define LON_MIN_D_L						0x27	// Minutes decimal part low&lt;br /&gt;
#define LON_MIN_D_H						0x28	// Minutes decimal part high&lt;br /&gt;
#define STATUS							0x29	// Status flags&lt;br /&gt;
#define FIX_IND							0x2a	// FIX_IND&lt;br /&gt;
#define HDOP							0x2b	// HDOP&lt;br /&gt;
#define HDOP_D							0x2c	// HDOP_D&lt;br /&gt;
#define SAT_N							0x2d	// Number of satellites&lt;br /&gt;
#define COURSE_T_L						0x2e	// True heading low byte&lt;br /&gt;
#define COURSE_T_H						0x2f	// True heading high byte&lt;br /&gt;
#define COURSE_T_D						0x30	// Decimal part of course&lt;br /&gt;
#define SPEED_L							0x31	// Speed low byte&lt;br /&gt;
#define SPEED_H							0x32	// Speed high byte&lt;br /&gt;
#define SPEED_D							0x33	// Speed decimal part&lt;br /&gt;
#define ALT_L							0x34	// Altitude low byte&lt;br /&gt;
#define ALT_H							0x35	// Altitude high byte&lt;br /&gt;
#define ALT_DIF_L						0x36	// Differ. WGS-84 MSL low byte&lt;br /&gt;
#define ALT_DIF_H						0x37	// Differ. WGS-84 MSL high byte&lt;br /&gt;
#define UTC_H							0x38	// UTC hour&lt;br /&gt;
#define UTC_MIN							0x39	// UTC minute&lt;br /&gt;
#define UTC_S							0x3a	// UTC second&lt;br /&gt;
#define DAY								0x3b	// Day&lt;br /&gt;
#define YEAR_L							0x3c	// Year low byte&lt;br /&gt;
#define YEAR_H							0x3d	// Year high byte&lt;br /&gt;
#define MONTH							0x3e	// Month&lt;br /&gt;
#define PDOP							0x3f	// PDOP&lt;br /&gt;
#define PDOP_D							0x40	// PDOP_D&lt;br /&gt;
#define VDOP							0x41	// VDOP&lt;br /&gt;
#define VDOP_D							0x42	// VDOP_D&lt;br /&gt;
#define SAT_1							0x43	// SAT # 1&lt;br /&gt;
#define SAT_2							0x44	// SAT # 2&lt;br /&gt;
#define SAT_3							0x45	// SAT # 3&lt;br /&gt;
#define SAT_4							0x46	// SAT # 4&lt;br /&gt;
#define SAT_5							0x47	// SAT # 5&lt;br /&gt;
#define SAT_6							0x48	// SAT # 6&lt;br /&gt;
#define SAT_7							0x49	// SAT # 7&lt;br /&gt;
#define SAT_8							0x4a	// SAT # 8&lt;br /&gt;
#define SAT_9							0x4b	// SAT # 9&lt;br /&gt;
#define SAT_A							0x4c	// SAT # 10&lt;br /&gt;
#define SAT_B							0x4d	// SAT # 11&lt;br /&gt;
#define SAT_C							0x4e	// SAT # 12&lt;br /&gt;
#define SW_VERSION						0x4f	// SW_Version&lt;br /&gt;
#define HEARTBEAT						0x50	// Heartbeat&lt;br /&gt;
&lt;br /&gt;
// Status and Fix_Ind register bitmasks:&lt;br /&gt;
#define STATUS_NS						0b00000001&lt;br /&gt;
#define STATUS_EW						0b00000010&lt;br /&gt;
#define STATUS_SPU						0b00000100&lt;br /&gt;
#define STATUS_AUTON					0b00001000&lt;br /&gt;
#define FIX_IND_UI_FIX					0b10000000&lt;br /&gt;
&lt;br /&gt;
// Write registers:&lt;br /&gt;
#define INIT_CFG						0x90	// INIT CFG&lt;br /&gt;
#define SET_FIX_TIME					0x91	// Pos_Fix_Time&lt;br /&gt;
#define STBY							0x92	// STBY&lt;br /&gt;
#define FAC_RES							0x93	// Factory Reset&lt;br /&gt;
#define EN_JAM							0x94	// Jamming Remover&lt;br /&gt;
#define TEST_MODE						0x96	// Test Mode&lt;br /&gt;
&lt;br /&gt;
// Write register values (commands):&lt;br /&gt;
#define INIT_CFG_HOT_START				1		// Hot Start&lt;br /&gt;
#define INIT_CFG_WARM_START				2		// Warm Start init data loaded&lt;br /&gt;
#define INIT_CFG_WARM_START_EPH_CLR		3		// Warm Start Ephemeris cleared&lt;br /&gt;
#define INIT_CFG_COLD_START				4		// Cold Start&lt;br /&gt;
#define SET_FIX_TIME_1S					1		// Pos Fix Time 1 second&lt;br /&gt;
#define SET_FIX_TIME_2S					2		// Pos Fix Time 2 seconds&lt;br /&gt;
#define STBY_ENTER						1		// Standby (cleared after write)&lt;br /&gt;
#define FAC_RES_ENTER					1		// Factory Reset&lt;br /&gt;
#define EN_JAM_DISABLE					0		// Jamming Remover disable&lt;br /&gt;
#define EN_JAM_ENABLE					1		// Jamming Remover enable&lt;br /&gt;
#define TEST_MODE_INACTIVE				0		// Test Mode inactive&lt;br /&gt;
#define TEST_MODE_ACTIVE				0x15	// Test Mode active&lt;br /&gt;
&lt;br /&gt;
// Data structure (starts at LAT_DEG):&lt;br /&gt;
#define DATA_STRUCT						LAT_DEG	// Start&lt;br /&gt;
// All data from LAT_DEG to HEARTBEAT (48 bytes):&lt;br /&gt;
#define DATA_LENGTH						(HEARTBEAT - LAT_DEG + 1)&lt;br /&gt;
// Basic data from LAT_DEG to SAT_N (13 bytes):&lt;br /&gt;
#define DATA_BASIC						(SAT_N - LAT_DEG + 1)&lt;br /&gt;
&lt;br /&gt;
typedef union {&lt;br /&gt;
 	uint8_t byte;&lt;br /&gt;
	struct {&lt;br /&gt;
		unsigned ns    :1;				// 1: North 0: South&lt;br /&gt;
		unsigned ew    :1;				// 1: East 0: West&lt;br /&gt;
		unsigned spu   :1;				// 1: km/h 0: kn&lt;br /&gt;
		unsigned auton :1;				// 1: Data not valid 0: Autonomous&lt;br /&gt;
		unsigned fix0  :1;&lt;br /&gt;
		unsigned fix1  :1;&lt;br /&gt;
		unsigned stat0 :1;				// Invalid&lt;br /&gt;
		unsigned stat1 :1;				// GPS Com Error&lt;br /&gt;
	};&lt;br /&gt;
	struct {&lt;br /&gt;
		unsigned ns    :1;				// 1: North 0: South&lt;br /&gt;
		unsigned ew    :1;				// 1: East 0: West&lt;br /&gt;
		unsigned spu   :1;				// 1: km/h 0: kn&lt;br /&gt;
		unsigned auton :1;				// 1: Data not valid 0: Autonomous&lt;br /&gt;
		unsigned fix   :2;&lt;br /&gt;
		unsigned stat  :2;				// 00 -&amp;gt; Valid&lt;br /&gt;
										// 01 -&amp;gt; Invalid&lt;br /&gt;
										// 10 -&amp;gt; GPS Com Error&lt;br /&gt;
										// 11 -&amp;gt; n. def.&lt;br /&gt;
	};&lt;br /&gt;
} status_t;&lt;br /&gt;
&lt;br /&gt;
typedef union {&lt;br /&gt;
 	uint8_t byte;&lt;br /&gt;
	struct {							// Fix indicator:&lt;br /&gt;
		unsigned fix_0  :1;				//  1: GPS fix          2: DGPS fix&lt;br /&gt;
		unsigned fix_1  :1;				//  3: PPS fix          4: RTK&lt;br /&gt;
		unsigned fix_2  :1;				//  5: Float RTK        6: Dead reck.&lt;br /&gt;
		unsigned fix_3  :1;				//  7: Manual inp. mode 8: Simul. mode&lt;br /&gt;
		unsigned unused :3;&lt;br /&gt;
		unsigned ui_fix :1;				// HW signal from UC530&lt;br /&gt;
	};&lt;br /&gt;
	struct {&lt;br /&gt;
		unsigned fix    :4;				// See above &amp;quot;Fix indicator&amp;quot;!&lt;br /&gt;
		unsigned unused :3;&lt;br /&gt;
		unsigned ui_fix :1;				// HW signal from UC530&lt;br /&gt;
	};&lt;br /&gt;
} fix_ind_t;&lt;br /&gt;
&lt;br /&gt;
typedef union {&lt;br /&gt;
	struct {&lt;br /&gt;
		uint8_t   latDeg;&lt;br /&gt;
		uint8_t   latMin;&lt;br /&gt;
		uint16_t  latMinDec;&lt;br /&gt;
		uint8_t   lonDeg;&lt;br /&gt;
		uint8_t   lonMin;&lt;br /&gt;
		uint16_t  lonMinDec;&lt;br /&gt;
		status_t  status;&lt;br /&gt;
		fix_ind_t fixInd;&lt;br /&gt;
		uint8_t   hdop;&lt;br /&gt;
		uint8_t   hdopDec;&lt;br /&gt;
		uint8_t   satCount;&lt;br /&gt;
		uint16_t  course;&lt;br /&gt;
		uint8_t   courseDec;&lt;br /&gt;
		uint16_t  speed;&lt;br /&gt;
		uint8_t   speedDec;&lt;br /&gt;
		uint16_t  altitude;&lt;br /&gt;
		uint16_t  altDif;&lt;br /&gt;
		uint8_t   utcHour;&lt;br /&gt;
		uint8_t   utcMinute;&lt;br /&gt;
		uint8_t   utcSec;&lt;br /&gt;
		uint8_t   day;&lt;br /&gt;
		uint16_t  year;&lt;br /&gt;
		uint8_t   month;&lt;br /&gt;
		uint8_t   pdop;&lt;br /&gt;
		uint8_t   pdopDec;&lt;br /&gt;
		uint8_t   vdop;&lt;br /&gt;
		uint8_t   vdopDec;&lt;br /&gt;
		uint8_t   sat[12];&lt;br /&gt;
		uint8_t   swVersion;&lt;br /&gt;
		uint8_t   heartbeat;&lt;br /&gt;
	};&lt;br /&gt;
} gpsdata_t;&lt;br /&gt;
extern gpsdata_t gpsdata;&lt;br /&gt;
&lt;br /&gt;
void I2C_GPS_reset(void);&lt;br /&gt;
void I2C_GPS_write_cmd(uint8_t, uint8_t);&lt;br /&gt;
uint8_t I2C_GPS_read_reg(uint8_t);&lt;br /&gt;
void I2C_GPS_read(uint8_t);&lt;br /&gt;
void I2C_GPS_init(void);&lt;br /&gt;
void I2C_GPS_new_addr(uint8_t);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
/******************************************************************************&lt;br /&gt;
 * Additional info&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Changelog:&lt;br /&gt;
 * &lt;br /&gt;
 *  ---&amp;gt; changes are documented in the file &amp;quot;RP6M256_I2C_GPSLib.c&amp;quot;&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
======Libary Source======&lt;br /&gt;
Datei: RP6M256_I2C_GPSLib.c&lt;br /&gt;
&amp;lt;pre&amp;gt;/* ****************************************************************************&lt;br /&gt;
 *                           _______________________&lt;br /&gt;
 *                           \| RP6  ROBOT SYSTEM |/&lt;br /&gt;
 *                            \_-_-_-_-_-_-_-_-_-_/           &amp;gt;&amp;gt;&amp;gt; RP6 M256 WIFI&lt;br /&gt;
 * ----------------------------------------------------------------------------&lt;br /&gt;
 * ----------------------------- [c]2014 - Dirk -------------------------------&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * File: RP6M256_I2C_GPSLib.c&lt;br /&gt;
 * Version: 1.0&lt;br /&gt;
 * Target: RP6 M256 WIFI - ATMEGA2560 @16.00MHz&lt;br /&gt;
 *         and a RP6 I2C GPS Receiver (CONRAD 1082385)&lt;br /&gt;
 *         optionally on a RP6 Sensor Board (CONRAD 1082384)&lt;br /&gt;
 * Author(s): Dirk&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Description:&lt;br /&gt;
 * &lt;br /&gt;
 * This is our new Library that contains basic routines and functions for&lt;br /&gt;
 * accessing the RP6 I2C GPS Receiver JM3-GPS (CONRAD 1082385).&lt;br /&gt;
 * The library assumes the I2C GPS Receiver software (firmware) v1.2.&lt;br /&gt;
 * If the I2C GPS Receiver is located on the RP6 Sensor Board (CONRAD 1082384)&lt;br /&gt;
 * and connected to the I2C-MODULE plug M1, the RP6M256_Sensor_BoardLib has to&lt;br /&gt;
 * be included!&lt;br /&gt;
 * &lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Includes:&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6M256_I2C_GPSLib.h&amp;quot; 		&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Variables:&lt;br /&gt;
&lt;br /&gt;
uint8_t gpsdataBuf[DATA_LENGTH + 1]; &lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Software reset for the I2C GPS Receiver.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void I2C_GPS_reset(void)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_GPS_RECEIVER_ADR, 0, 0x06);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Writes a command cmd to a register reg of the&lt;br /&gt;
 * I2C GPS Receiver.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: reg -&amp;gt; Write register [0x90..0x96]&lt;br /&gt;
 *        cmd -&amp;gt; Command&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void I2C_GPS_write_cmd(uint8_t reg, uint8_t cmd)&lt;br /&gt;
{&lt;br /&gt;
	if((reg &amp;lt; INIT_CFG) || (reg &amp;gt; TEST_MODE)) return;&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_GPS_RECEIVER_ADR, reg, cmd);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Reads a single register reg from the I2C GPS&lt;br /&gt;
 * Receiver.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: reg -&amp;gt; Read register [0x20..0x50]&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
uint8_t I2C_GPS_read_reg(uint8_t reg)&lt;br /&gt;
{&lt;br /&gt;
	if((reg &amp;lt; WHO_AM_I) || (reg &amp;gt; HEARTBEAT)) reg = WHO_AM_I;&lt;br /&gt;
	I2CTWI_transmitByte(I2C_GPS_RECEIVER_ADR, reg);&lt;br /&gt;
	return (I2CTWI_readByte(I2C_GPS_RECEIVER_ADR));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
gpsdata_t gpsdata;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Reads the GPS data from the I2C GPS Receiver.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: length -&amp;gt; Number of data bytes [1..48]&lt;br /&gt;
 *&lt;br /&gt;
 * Hint: If length = DATA_BASIC, only basic GPS&lt;br /&gt;
 *       data are read. If length = DATA_LENGTH,&lt;br /&gt;
 *       ALL GPS data are read.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void I2C_GPS_read(uint8_t length)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t i;&lt;br /&gt;
&lt;br /&gt;
	if(length &amp;gt; DATA_LENGTH) length = DATA_LENGTH;&lt;br /&gt;
	I2CTWI_readRegisters(I2C_GPS_RECEIVER_ADR, DATA_STRUCT, gpsdataBuf, length);&lt;br /&gt;
	for(i = length; i &amp;lt; DATA_LENGTH; i++) {&lt;br /&gt;
		gpsdataBuf[i] = 0;&lt;br /&gt;
	}&lt;br /&gt;
	gpsdata.latDeg = gpsdataBuf[0];&lt;br /&gt;
	gpsdata.latMin = gpsdataBuf[1];&lt;br /&gt;
	gpsdata.latMinDec = gpsdataBuf[2] + (gpsdataBuf[3] &amp;lt;&amp;lt; 8);&lt;br /&gt;
	gpsdata.lonDeg = gpsdataBuf[4];&lt;br /&gt;
	gpsdata.lonMin = gpsdataBuf[5];&lt;br /&gt;
	gpsdata.lonMinDec = gpsdataBuf[6] + (gpsdataBuf[7] &amp;lt;&amp;lt; 8);&lt;br /&gt;
	gpsdata.status.byte = gpsdataBuf[8];&lt;br /&gt;
	gpsdata.fixInd.byte = gpsdataBuf[9];&lt;br /&gt;
	gpsdata.hdop = gpsdataBuf[10];&lt;br /&gt;
	gpsdata.hdopDec = gpsdataBuf[11];&lt;br /&gt;
	gpsdata.satCount = gpsdataBuf[12];&lt;br /&gt;
	if(length == DATA_BASIC) return;&lt;br /&gt;
	gpsdata.course = gpsdataBuf[13] + (gpsdataBuf[14] &amp;lt;&amp;lt; 8);&lt;br /&gt;
	gpsdata.courseDec = gpsdataBuf[15];&lt;br /&gt;
	gpsdata.speed = gpsdataBuf[16] + (gpsdataBuf[17] &amp;lt;&amp;lt; 8);&lt;br /&gt;
	gpsdata.speedDec = gpsdataBuf[18];&lt;br /&gt;
	gpsdata.altitude = gpsdataBuf[19] + (gpsdataBuf[20] &amp;lt;&amp;lt; 8);&lt;br /&gt;
	gpsdata.altDif = gpsdataBuf[21] + (gpsdataBuf[22] &amp;lt;&amp;lt; 8);&lt;br /&gt;
	gpsdata.utcHour = gpsdataBuf[23];&lt;br /&gt;
	gpsdata.utcMinute = gpsdataBuf[24];&lt;br /&gt;
	gpsdata.utcSec = gpsdataBuf[25];&lt;br /&gt;
	gpsdata.day = gpsdataBuf[26];&lt;br /&gt;
	gpsdata.year = gpsdataBuf[27] + (gpsdataBuf[28] * 100);&lt;br /&gt;
	gpsdata.month = gpsdataBuf[29];&lt;br /&gt;
	gpsdata.pdop = gpsdataBuf[30];&lt;br /&gt;
	gpsdata.pdopDec = gpsdataBuf[31];&lt;br /&gt;
	gpsdata.vdop = gpsdataBuf[32];&lt;br /&gt;
	gpsdata.vdopDec = gpsdataBuf[33];&lt;br /&gt;
	for(i = 34; i &amp;lt; 46; i++) {&lt;br /&gt;
		gpsdata.sat[i - 34] = gpsdataBuf[i];&lt;br /&gt;
	}&lt;br /&gt;
	gpsdata.swVersion = gpsdataBuf[46];&lt;br /&gt;
	gpsdata.heartbeat = gpsdataBuf[47];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * You MUST call this function at the beginning of a&lt;br /&gt;
 * main program, that uses the RP6 I2C GPS Receiver. &lt;br /&gt;
 * If SENSOR_BOARD is defined, the I2C-MODULE power&lt;br /&gt;
 * will be switched on with the function&lt;br /&gt;
 * setI2CModulePower() defined in the&lt;br /&gt;
 * RP6M256_Sensor_BoardLib, which will be included&lt;br /&gt;
 * then.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void I2C_GPS_init(void)&lt;br /&gt;
{&lt;br /&gt;
#ifdef SENSOR_BOARD&lt;br /&gt;
	// I2C-MODULE (plug M1) power on: &lt;br /&gt;
	setI2CModulePower(1);&lt;br /&gt;
#endif&lt;br /&gt;
	// Other init procedures here!&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Writes a new I2C address to the I2C GPS Receiver.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: addr -&amp;gt; New I2C address [0xc8..0xde]&lt;br /&gt;
 *&lt;br /&gt;
 * Hints: - Default I2C address is 0xc8.&lt;br /&gt;
 *        - You may choose a new I2C address in&lt;br /&gt;
 *          the range 0xc8..0xde.&lt;br /&gt;
 *        - After writing a new address you have&lt;br /&gt;
 *          to switch the I2C GPS Receiver off&lt;br /&gt;
 *          and on again.&lt;br /&gt;
 *        - Definition I2C_GPS_RECEIVER_ADR must&lt;br /&gt;
 *          be adapted to the new I2C address!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void I2C_GPS_new_addr(uint8_t addr)&lt;br /&gt;
{&lt;br /&gt;
	if((addr &amp;lt; 0xc8) || (addr &amp;gt; 0xde)) return;&lt;br /&gt;
	addr &amp;amp;= 0xfe;								// Clear R/W bit&lt;br /&gt;
	I2CTWI_transmit3Bytes(I2C_GPS_RECEIVER_ADR, 0, 0x04, addr);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&lt;br /&gt;
/******************************************************************************&lt;br /&gt;
 * Additional info&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Changelog:&lt;br /&gt;
 * - v. 1.0 (initial release) 21.04.2014 by Dirk&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Erklärung&lt;br /&gt;
&lt;br /&gt;
======Demo======&lt;br /&gt;
makefile:&lt;br /&gt;
&amp;lt;pre&amp;gt;...&lt;br /&gt;
TARGET = RP6M256_Sensor_Board_02&lt;br /&gt;
...&lt;br /&gt;
SRC += $(RP6_LIB_PATH)/RP6common/RP6I2CmasterTWI.c&lt;br /&gt;
&lt;br /&gt;
SRC += $(RP6_LIB_PATH)/RP6control_M256_WIFI/RP6M256_Sensor_BoardLib.c&lt;br /&gt;
SRC += $(RP6_LIB_PATH)/RP6control_M256_WIFI/RP6M256_I2C_GPSLib.c&lt;br /&gt;
...&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Datei: RP6M256_Sensor_Board_02.c&lt;br /&gt;
&amp;lt;pre&amp;gt;/* &lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * RP6 ROBOT SYSTEM - RP6 CONTROL M256 Examples&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Example: RP6M256 Sensor Board&lt;br /&gt;
 * Author(s): Dirk&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Description:&lt;br /&gt;
 * In this example we show a second test for the RP6 Sensor Board.&lt;br /&gt;
 * &lt;br /&gt;
 * ############################################################################&lt;br /&gt;
 * The Robot does NOT move in this example! You can simply put it on a table&lt;br /&gt;
 * next to your PC and you should connect it to the PC via the USB Interface!&lt;br /&gt;
 * You should also connect to it via WIFI.&lt;br /&gt;
 * ############################################################################&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Includes:&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6M256Lib.h&amp;quot; 				// The RP6 M256 Library. &lt;br /&gt;
										// Always needs to be included!&lt;br /&gt;
#include &amp;quot;RP6I2CmasterTWI.h&amp;quot;			// Include the I2C-Bus Master Library&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Include our new &amp;quot;RP6M256 I2C GPS Receiver library&amp;quot;:&lt;br /&gt;
// (This is the library for accessing the RP6 I2C GPS Receiver!)&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6M256_I2C_GPSLib.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Write a floating point number to the WIFI.&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *&lt;br /&gt;
 *			// Write a floating point number to the WIFI (no exponent):&lt;br /&gt;
 *			writeDouble_WIFI(1234567.890, 11, 3);&lt;br /&gt;
 *&lt;br /&gt;
 * The value of prec (precision) defines the number of decimal places.&lt;br /&gt;
 * For 32 bit floating point variables (float, double ...) 6 is&lt;br /&gt;
 * the max. value for prec (7 relevant digits).&lt;br /&gt;
 * The value of width defines the overall number of characters in the&lt;br /&gt;
 * floating point number including the decimal point. The number of&lt;br /&gt;
 * pre-decimal positions is: (width - prec - 1).&lt;br /&gt;
 */&lt;br /&gt;
void writeDouble_WIFI(double number, uint8_t width, uint8_t prec)&lt;br /&gt;
{char buffer[width + 1];&lt;br /&gt;
	dtostrf(number, width, prec, &amp;amp;buffer[0]);&lt;br /&gt;
	writeString_WIFI(&amp;amp;buffer[0]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Write a floating point number to the LCD.&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *&lt;br /&gt;
 *			// Write a floating point number to the LCD (no exponent):&lt;br /&gt;
 *			writeDoubleLCD(1234567.890, 11, 3);&lt;br /&gt;
 *&lt;br /&gt;
 * The value of prec (precision) defines the number of decimal places.&lt;br /&gt;
 * For 32 bit floating point variables (float, double ...) 6 is&lt;br /&gt;
 * the max. value for prec (7 relevant digits).&lt;br /&gt;
 * The value of width defines the overall number of characters in the&lt;br /&gt;
 * floating point number including the decimal point. The number of&lt;br /&gt;
 * pre-decimal positions is: (width - prec - 1).&lt;br /&gt;
 */&lt;br /&gt;
void writeDoubleLCD(double number, uint8_t width, uint8_t prec)&lt;br /&gt;
{char buffer[width + 1];&lt;br /&gt;
	dtostrf(number, width, prec, &amp;amp;buffer[0]);&lt;br /&gt;
	writeStringLCD(&amp;amp;buffer[0]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Error handler&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function gets called automatically if there was an I2C Error like&lt;br /&gt;
 * the slave sent a &amp;quot;not acknowledge&amp;quot; (NACK, error codes e.g. 0x20 or 0x30).&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void I2C_transmissionError(uint8_t errorState)&lt;br /&gt;
{&lt;br /&gt;
	writeString_P_WIFI(&amp;quot;\nI2C ERROR - TWI STATE: 0x&amp;quot;);&lt;br /&gt;
	writeInteger_WIFI(errorState, HEX);&lt;br /&gt;
	writeChar_WIFI('\n');&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Main function - The program starts here:&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
	initRP6M256();    // Always call this first! The Processor will not work&lt;br /&gt;
					  // correctly otherwise. &lt;br /&gt;
&lt;br /&gt;
	initLCD(); // Initialize the LC-Display (LCD)&lt;br /&gt;
			   // Always call this before using the LCD!&lt;br /&gt;
&lt;br /&gt;
	setLEDs(0b1111);&lt;br /&gt;
	mSleep(500);&lt;br /&gt;
	setLEDs(0b0000);&lt;br /&gt;
&lt;br /&gt;
	writeString_P_WIFI(&amp;quot;\n\nRP6 Sensor Board Selftest 2!\n&amp;quot;); &lt;br /&gt;
&lt;br /&gt;
	// IMPORTANT:&lt;br /&gt;
	I2CTWI_initMaster(100); // Initialize the TWI Module for Master operation&lt;br /&gt;
							// with 100kHz SCL Frequency&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	// Register the event handler:&lt;br /&gt;
	I2CTWI_setTransmissionErrorHandler(I2C_transmissionError);&lt;br /&gt;
&lt;br /&gt;
	setLEDs(0b1111);&lt;br /&gt;
&lt;br /&gt;
	// Write a text message to the LCD:&lt;br /&gt;
	showScreenLCD(&amp;quot;################&amp;quot;, &amp;quot;################&amp;quot;);&lt;br /&gt;
	mSleep(1500);&lt;br /&gt;
	showScreenLCD(&amp;quot;RP6v2-M256-WIFI &amp;quot;, &amp;quot;Example Program&amp;quot;);&lt;br /&gt;
	mSleep(2500); &lt;br /&gt;
	showScreenLCD(&amp;quot;RP6 Sensor Board&amp;quot;, &amp;quot;   Selftest 2&amp;quot;);&lt;br /&gt;
	mSleep(2500);&lt;br /&gt;
	clearLCD();&lt;br /&gt;
&lt;br /&gt;
	setLEDs(0b0000);&lt;br /&gt;
&lt;br /&gt;
	// ---------------------------------------&lt;br /&gt;
&lt;br /&gt;
	uint8_t onoff = 0;&lt;br /&gt;
	uint8_t i;&lt;br /&gt;
&lt;br /&gt;
	startStopwatch1();&lt;br /&gt;
	startStopwatch2();&lt;br /&gt;
&lt;br /&gt;
	// IMPORTANT:&lt;br /&gt;
	sensor_board_init();						// RP6 Sensor Board init!!!&lt;br /&gt;
	I2C_GPS_init();								// RP6 I2C GPS Receiver init&lt;br /&gt;
&lt;br /&gt;
	while(true) &lt;br /&gt;
	{&lt;br /&gt;
		if(getStopwatch1() &amp;gt; 1000) // 1s&lt;br /&gt;
		{&lt;br /&gt;
			if (onoff) onoff = 0;&lt;br /&gt;
			else onoff = 1;&lt;br /&gt;
&lt;br /&gt;
			// Show GPS data:&lt;br /&gt;
			I2C_GPS_read(DATA_LENGTH);			// Read data&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nLAT_DEG:     &amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.latDeg, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;° &amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.latMin, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;.&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.latMinDec, DEC, 4);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;' &amp;quot;);&lt;br /&gt;
			if(gpsdata.status.ns)&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;N&amp;quot;);&lt;br /&gt;
			else&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;S&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nLON_DEG:    &amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.lonDeg, DEC, 3);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;° &amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.lonMin, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;.&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.lonMinDec, DEC, 4);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;' &amp;quot;);&lt;br /&gt;
			if(gpsdata.status.ew)&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;E&amp;quot;);&lt;br /&gt;
			else&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;W&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nSTATUS:     &amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.status.byte, BIN, 8);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nFIX_IND:    &amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.fixInd.byte, BIN, 8);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nHDOP:       &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(gpsdata.hdop, DEC);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;.&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.hdopDec, DEC, 2);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nSAT_N:      &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(gpsdata.satCount, DEC);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nCOURSE_T:   &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(gpsdata.course, DEC);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;.&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.courseDec, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;°&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nSPEED:      &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(gpsdata.speed, DEC);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;.&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.speedDec, DEC, 2);&lt;br /&gt;
			if(gpsdata.status.spu)&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;km/h&amp;quot;);&lt;br /&gt;
			else&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;kn&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nALT:        &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(gpsdata.altitude, DEC);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;m\nALT_DIF:    &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(gpsdata.altDif, DEC);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;m\nUTC:        &amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.utcHour, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;:&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.utcMinute, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;:&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.utcSec, DEC, 2);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nDATE:       &amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.day, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;.&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.month, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;.&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.year, DEC, 4);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nPDOP:       &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(gpsdata.pdop, DEC);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;.&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.pdopDec, DEC, 2);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nVDOP:       &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(gpsdata.vdop, DEC);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;.&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.vdopDec, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			for(i = 0; i &amp;lt; gpsdata.satCount; i++) {&lt;br /&gt;
				if(i == 8) writeString_P_WIFI(&amp;quot;\n&amp;quot;);&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;  SAT_&amp;quot;);&lt;br /&gt;
				writeIntegerLength_WIFI(i + 1, HEX, 1);&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;: &amp;quot;);&lt;br /&gt;
				writeInteger_WIFI(gpsdata.sat[i], DEC);&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nSW_VERSION: &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(gpsdata.swVersion, DEC);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nHEARTBEAT:  &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(gpsdata.heartbeat, DEC);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			// RP6 Sensor Board shutdown (button &amp;amp; status LED test):&lt;br /&gt;
			if (pressedButton) {&lt;br /&gt;
				setStatusLED(1);&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;\nPress button again for RP6 Sensor Board SHUTDOWN!\n&amp;quot;);&lt;br /&gt;
				mSleep(2000);&lt;br /&gt;
				do {&lt;br /&gt;
					if(getStopwatch2() &amp;gt; 200) { // 0.2s&lt;br /&gt;
						if (onoff) onoff = 0;&lt;br /&gt;
						else onoff = 1;&lt;br /&gt;
						if (onoff) setStatusLED(1);&lt;br /&gt;
						else setStatusLED(0);&lt;br /&gt;
						setStopwatch2(0);&lt;br /&gt;
					}&lt;br /&gt;
					mSleep(1);&lt;br /&gt;
					task_I2CTWI();&lt;br /&gt;
				} while (!readButton());&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;\n\n\n\n\nPlease wait for RP6 Sensor Board SHUTDOWN...\n&amp;quot;);&lt;br /&gt;
				sensor_board_shutdown();&lt;br /&gt;
				mSleep(3000);&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;\n\n\nThe RP6 Sensor Board now is in SHUTDOWN MODE!!!\n&amp;quot;);&lt;br /&gt;
				mSleep(1000);&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;\nRESET the M256 microcontroller now...\n\n&amp;quot;);&lt;br /&gt;
				while(true) {};&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			setStopwatch1(0);&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		task_RP6SensorBoard();					// RP6 Sensor Board task&lt;br /&gt;
&lt;br /&gt;
		task_I2CTWI();&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Erklärung&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Gyro Modul JM3-GYRO====&lt;br /&gt;
=====Dokumentation=====&lt;br /&gt;
Die Dokumentation zum Gyro Modul befindet sich auf der mitgelieferten ''&amp;quot;RP6 Robot System Xtra Modules CD-ROM&amp;quot;''.&lt;br /&gt;
&lt;br /&gt;
======Manuals======&lt;br /&gt;
Das Handbuch in der aktuellen Version kann [http://www.jm3-engineering.com/download/doc/ManualGyroModule_de.pdf hier] eingesehen werden.&lt;br /&gt;
&lt;br /&gt;
=====Demo-Programme=====&lt;br /&gt;
Ein Demo-Programm zum Gyro Modul befindet sich integriert in die RP6 Sensor Board Demo auf der mitgelieferten ''&amp;quot;RP6 Robot System Xtra Modules CD-ROM&amp;quot;''. Diese Demo kann auch in der aktuellen Version im Download Bereich von [http://www.jm3-engineering.com/downloads.htm JM3 Engineering] herunter geladen werden.&lt;br /&gt;
&lt;br /&gt;
=====Analoge Auswertung=====&lt;br /&gt;
Am Pin ''OUT'' des Gyro Moduls (siehe [http://www.rn-wissen.de/index.php/RP6_Sensor_Board_und_Xtra_Module#Anschluss-Schema_2 Anschluss-Schema]!) liegt die Ausgangsspannung des Sensors (0..5V) an. Sie kann mit einem ADC-Eingang eines Microcontrollers gemessen werden.&lt;br /&gt;
Syntax mit den Libraries der RP6Base, M32 oder M256 WiFi (ADC Kanal 0):&lt;br /&gt;
 uint16_t result = readADC(0);&lt;br /&gt;
In der C-Control-Pro Umgebung der M128 sieht das z.B. in CompactC so aus (ADC Kanal 0):&lt;br /&gt;
 word result;&lt;br /&gt;
 ADC_Set(ADC_VREF_VCC, 0);&lt;br /&gt;
 ...&lt;br /&gt;
 result = ADC_Read();&lt;br /&gt;
Das Ergebnis ''result'' kann noch zur Weiterverarbeitung angepasst werden:&lt;br /&gt;
 #define ADCVAL_ZERORATE_LEVEL			511		// Zero rate Level&lt;br /&gt;
 ...&lt;br /&gt;
 int16_t z_axisg = result - ADCVAL_ZERORATE_LEVEL;&lt;br /&gt;
Dadurch zeigt ''z_axisg'' Null an, wenn keine Rotation anliegt und wird positiv, wenn nach LINKS gedreht wird und negativ bei RECHTS-Drehung. Die Definition ADCVAL_ZERORATE_LEVEL muss natürlich an den eigenen Sensor-Nullwert angepasst werden.&lt;br /&gt;
&lt;br /&gt;
Aus dem Absolutwert von ''z_axisg'' kann man die Drehrate (Drehgeschwindigkeit) auch bestimmen:&lt;br /&gt;
&lt;br /&gt;
In den [[RP6_Sensor_Board_und_Xtra_Module#Technische_Daten_3|Technischen Daten]] ist die Empfindlichkeit des Sensors mit '''10mV/dps''' (0,01V pro Grad und Sekunde) angegeben. Damit errechnet sich die Drehrate als:&lt;br /&gt;
 Drehrate [dps] = abs(z_axisg) * (5 / 1024 / 0.01) = abs(z_axisg) * 0.48828125&lt;br /&gt;
&lt;br /&gt;
=====Optionale Ansteuerung=====&lt;br /&gt;
Im [[RP6_Sensor_Board_und_Xtra_Module#Anschluss-Schema_2|Anschluss-Schema]] ist erkennbar, dass es noch 2 Steuerleitungen ''SLEEP/PD'' und ''ST'' gibt. Mit diesen Anschlüssen kann die Betriebsart des Gyro Moduls festgelegt werden, siehe nachfolgende Tabelle:&lt;br /&gt;
{|  {{Blauetabelle}} &lt;br /&gt;
|Betriebsart&lt;br /&gt;
|ST&lt;br /&gt;
|SLEEP/PD&lt;br /&gt;
|Stromverbrauch&lt;br /&gt;
|-&lt;br /&gt;
|Normal&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|4,2mA&lt;br /&gt;
|-&lt;br /&gt;
|Sleep&lt;br /&gt;
|0&lt;br /&gt;
|1&lt;br /&gt;
|2,2mA&lt;br /&gt;
|-&lt;br /&gt;
|Self-test&lt;br /&gt;
|1&lt;br /&gt;
|0&lt;br /&gt;
|4,2mA&lt;br /&gt;
|-&lt;br /&gt;
|Power-down&lt;br /&gt;
|1&lt;br /&gt;
|1&lt;br /&gt;
|'''5µA'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
Will man zwischen den Betriebsarten per Software umschalten, muss man die beiden Steuerleitungen mit I/O Portpins des Microcontrollers verbinden, die als Ausgänge konfiguriert sind. Braucht man diese Funktion nicht, reicht es, ''ST'' und ''SLEEP/PD'' mit GND zu verbinden (Betriebsart &amp;quot;Normal&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====3D Accelerometer Modul JM3-3DA====&lt;br /&gt;
Das 3D Accelerometer Modul kann über den I2C- oder den SPI-Bus angesteuert werden. Wird das Modul auf der RP6 CONTROL M32 Platine betrieben (es sitzt also auf dem Sockel IC5 für das 2. SPI-EEPROM), dann erfolgt die Ansteuerung über den SPI-Bus. Die SPI-Grundfunktionen befinden sich in der RP6ControlLib, die daher eingebunden werden muss.&lt;br /&gt;
&lt;br /&gt;
=====Dokumentation=====&lt;br /&gt;
Die Dokumentation zum 3D Accelerometer Modul befindet sich auf der mitgelieferten ''&amp;quot;RP6 Robot System Xtra Modules CD-ROM&amp;quot;''.&lt;br /&gt;
&lt;br /&gt;
======Manuals======&lt;br /&gt;
Das Handbuch in der aktuellen Version kann [http://www.jm3-engineering.com/download/doc/Manual3DAccelerometer_de.pdf hier] eingesehen werden.&lt;br /&gt;
&lt;br /&gt;
=====Demo-Programme=====&lt;br /&gt;
Ein Demo-Programm zum 3D Accelerometer Modul befindet sich integriert in die RP6 Sensor Board Demo auf der mitgelieferten ''&amp;quot;RP6 Robot System Xtra Modules CD-ROM&amp;quot;''. Diese Demo kann auch in der aktuellen Version im Download Bereich von [http://www.jm3-engineering.com/downloads.htm JM3 Engineering] herunter geladen werden.&lt;br /&gt;
&lt;br /&gt;
=====RP6 CONTROL M32: ACCSENS Library=====&lt;br /&gt;
Die nachfolgende RP6ControlACCSENSLib (Eigenentwicklung in GCC) dient zur Ansteuerung des 3D Accelerometer Moduls durch die RP6 CONTROL M32.&lt;br /&gt;
&lt;br /&gt;
======Configuration Header======&lt;br /&gt;
Vor dem Kompilieren der Library muss eine Anpassung des Configuration Headers an die eigenen Hardware-Voraussetzungen erfolgen.&lt;br /&gt;
Dazu gibt es im Configuration Header eine Definition:&lt;br /&gt;
* EXP_STACK_1 -&amp;gt; Die RP6 CONTROL M32 sitzt auf dem vorderen Platinenstapel 1 des RP6&lt;br /&gt;
Im nachfolgenden Listing ist die Definition EXP_STACK_1 NICHT aktiv (d.h. die M32 sitzt auf dem hinteren Platinenstapel 2!). Dies muss an die eigene Hardware angepaßt werden. Wenn die RP6 CONTROL M32 auf dem vorderen Platinenstapel 1 des RP6 sitzt, muss die Zeile mit &amp;quot;EXP_STACK_1&amp;quot; &amp;quot;aktiviert&amp;quot; werden. Dazu entfernt man &amp;quot;//&amp;quot; am Zeilenanfang:&lt;br /&gt;
 #define EXP_STACK_1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Bevor man den Beschleunigungssensor nutzen kann, muss man ihn kalibrieren:&lt;br /&gt;
&lt;br /&gt;
'''Accelerometer:'''&lt;br /&gt;
* Die X-Achse wird kalibriert, indem man den RP6 mit der rechten Seite nach unten hält und den Maximalwert in MAX_X_A einträgt. Dann neigt man ihn auf seine linke Seite und trägt den negativen Maximalwert in MIN_X_A ein.&lt;br /&gt;
* Die Y-Achse wird kalibriert, indem man den RP6 mit der Vorderseite nach oben hält und den Maximalwert in MAX_Y_A einträgt. Dann kippt man die Vorderseite nach unten und trägt den negativen Maximalwert in MIN_Y_A ein.&lt;br /&gt;
* Die Z-Achse wird kalibriert, indem man den RP6 normal waagerecht hält und den Maximalwert in MAX_Z_A einträgt. Dann dreht man den RP6 &amp;quot;auf den Kopf&amp;quot; und trägt den negativen Maximalwert in MIN_Z_A ein.&lt;br /&gt;
* Sollten die angezeigten Pitch- und Roll-Werte nach der Kalibrierung der Achsen und genau waagerecht stehendem Sensor bzw. RP6 vom Nullwert deutlich abweichen, kann man sie mithilfe der Definitionen OFFSET_PITCH_A und OFFSET_ROLL_A &amp;quot;nullen&amp;quot;. Die Einheit dieser Definitionen ist °.&lt;br /&gt;
Nach dem Eintragen der Kalibrierungswerte muss das Programm neu kompiliert werden!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Datei: RP6ControlACCSENS.h&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;/* ****************************************************************************&lt;br /&gt;
 *                           _______________________&lt;br /&gt;
 *                           \| RP6  ROBOT SYSTEM |/&lt;br /&gt;
 *                            \_-_-_-_-_-_-_-_-_-_/             &amp;gt;&amp;gt;&amp;gt; RP6 CONTROL&lt;br /&gt;
 * ----------------------------------------------------------------------------&lt;br /&gt;
 * ----------------------------- [c]2014 - Dirk -------------------------------&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * File: RP6ControlACCSENS.h&lt;br /&gt;
 * Version: 1.0&lt;br /&gt;
 * Target: RP6 CONTROL - ATMEGA32 @16.00MHz&lt;br /&gt;
 * Author(s): Dirk&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Description:&lt;br /&gt;
 * Configuration header file for new ACCSENS library.&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * THE CHANGELOG CAN BE FOUND AT THE END OF THIS FILE!&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
#ifndef RP6CONTROLACCSENS_H&lt;br /&gt;
#define RP6CONTROLACCSENS_H&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Sensor position on the RP6 robot:&lt;br /&gt;
// (If EXP_STACK_1 is defined, the RP6 CONTROL M32 is located on the front&lt;br /&gt;
//  stack for addon boards on the RP6 robot. If EXP_STACK_1 is NOT defined&lt;br /&gt;
//  (default), the RP6 CONTROL M32 is mounted on the rear stack.)&lt;br /&gt;
// -------------------&lt;br /&gt;
//#define EXP_STACK_1&lt;br /&gt;
// -------------------&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// The following sensor is used:&lt;br /&gt;
// - 3D Accelerometer Modul (CONRAD 1082387-62) with LIS302DLH 3-axis&lt;br /&gt;
//   accelerometer&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// LIS302DLH accelerometer calibration data:&lt;br /&gt;
#define MAX_X_A						32767		// Max. X-axis value&lt;br /&gt;
#define MIN_X_A						-32768		// Min. X-axis value&lt;br /&gt;
#define MAX_Y_A						32767		// Max. Y-axis value&lt;br /&gt;
#define MIN_Y_A						-32768		// Min. Y-axis value&lt;br /&gt;
#define MAX_Z_A						32767		// Max. Z-axis value&lt;br /&gt;
#define MIN_Z_A						-32768		// Min. Z-axis value&lt;br /&gt;
#define OFFSET_PITCH_A				0.0			// Offset Pitch [°]&lt;br /&gt;
#define OFFSET_ROLL_A				0.0			// Offset Roll [°]&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
/******************************************************************************&lt;br /&gt;
 * Additional info&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Changelog:&lt;br /&gt;
 * &lt;br /&gt;
 *  ---&amp;gt; changes are documented in the file &amp;quot;RP6ControlACCSENSLib.c&amp;quot;&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
======Library Header======&lt;br /&gt;
Datei: RP6ControlACCSENSLib.h&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;/* ****************************************************************************&lt;br /&gt;
 *                           _______________________&lt;br /&gt;
 *                           \| RP6  ROBOT SYSTEM |/&lt;br /&gt;
 *                            \_-_-_-_-_-_-_-_-_-_/             &amp;gt;&amp;gt;&amp;gt; RP6 CONTROL&lt;br /&gt;
 * ----------------------------------------------------------------------------&lt;br /&gt;
 * ----------------------------- [c]2014 - Dirk -------------------------------&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * File: RP6ControlACCSENSLib.h&lt;br /&gt;
 * Version: 1.0&lt;br /&gt;
 * Target: RP6 CONTROL - ATMEGA32 @16.00MHz&lt;br /&gt;
 * Author(s): Dirk&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Description:&lt;br /&gt;
 * This is the RP6ControlACCSENSLib header file.&lt;br /&gt;
 * You have to include this file, if you want to use the library&lt;br /&gt;
 * RP6ControlACCSENSLib.c in your own projects.&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * THE CHANGELOG CAN BE FOUND AT THE END OF THIS FILE!&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
#ifndef RP6CONTROLACCSENSLIB_H&lt;br /&gt;
#define RP6CONTROLACCSENSLIB_H&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Includes:&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6ControlLib.h&amp;quot; 		// The RP6 Control Library (v. 1.1 or higher). &lt;br /&gt;
#include &amp;quot;RP6ControlACCSENS.h&amp;quot;&lt;br /&gt;
#include &amp;lt;math.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&lt;br /&gt;
#define ACC_CS							MEM_CS2&lt;br /&gt;
#define DEVICE_IDENTIFIER				0x32&lt;br /&gt;
&lt;br /&gt;
// Registers:&lt;br /&gt;
#define WHO_AM_I						0x0f&lt;br /&gt;
#define CTRL_REG1						0x20&lt;br /&gt;
#define CTRL_REG2						0x21&lt;br /&gt;
#define CTRL_REG3						0x22&lt;br /&gt;
#define CTRL_REG4						0x23&lt;br /&gt;
#define CTRL_REG5						0x24&lt;br /&gt;
#define HP_FILTER_RESET					0x25&lt;br /&gt;
#define REFERENCE						0x26&lt;br /&gt;
#define STATUS_REG						0x27&lt;br /&gt;
#define OUT_X_L							0x28&lt;br /&gt;
#define OUT_X_H							0x29&lt;br /&gt;
#define OUT_Y_L							0x2a&lt;br /&gt;
#define OUT_Y_H							0x2b&lt;br /&gt;
#define OUT_Z_L							0x2c&lt;br /&gt;
#define OUT_Z_H							0x2d&lt;br /&gt;
#define INT1_CFG						0x30&lt;br /&gt;
#define INT1_SOURCE						0x31&lt;br /&gt;
#define INT1_THS						0x32&lt;br /&gt;
#define INT1_DURATION					0x33&lt;br /&gt;
#define INT2_CFG						0x34&lt;br /&gt;
#define INT2_SOURCE						0x35&lt;br /&gt;
#define INT2_THS						0x36&lt;br /&gt;
#define INT2_DURATION					0x37&lt;br /&gt;
&lt;br /&gt;
// Control Register bitmasks:&lt;br /&gt;
#define CTRL_REG1_POWERDOWN				0b00000000&lt;br /&gt;
#define CTRL_REG1_3D_DEFAULT			0b00000111&lt;br /&gt;
#define CTRL_REG1_3D_LOPWR_10HZ			0b11000111&lt;br /&gt;
#define CTRL_REG2_DEFAULT				0b00000000&lt;br /&gt;
#define CTRL_REG3_DEFAULT				0b00000000&lt;br /&gt;
#define CTRL_REG4_DEFAULT				0b00000000&lt;br /&gt;
#define CTRL_REG4_BDU_2G				0b10000000&lt;br /&gt;
#define CTRL_REG4_BDU_2G_STSIGN			0b10001000&lt;br /&gt;
#define CTRL_REG4_BDU_BLE_2G			0b11000000&lt;br /&gt;
#define CTRL_REG4_BDU_BLE_2G_STSIGN		0b11001000&lt;br /&gt;
#define CTRL_REG5_DEFAULT				0b00000000&lt;br /&gt;
&lt;br /&gt;
// Read/write address bitmasks:&lt;br /&gt;
#define READ_MASK						0b10000000&lt;br /&gt;
#define READ_AUTOINC_MASK				0b11000000&lt;br /&gt;
#define WRITE_MASK						0b01111111&lt;br /&gt;
&lt;br /&gt;
extern int16_t x_axisa, y_axisa, z_axisa;&lt;br /&gt;
extern double pitch, roll;&lt;br /&gt;
extern double xa, ya, za;&lt;br /&gt;
extern double the, phi;&lt;br /&gt;
&lt;br /&gt;
uint8_t SPI_ACCSENS_readByte(uint8_t regAddr);&lt;br /&gt;
void SPI_ACCSENS_readBytes(uint8_t startAddr, uint8_t *buffer, uint8_t length);&lt;br /&gt;
void SPI_ACCSENS_writeByte(uint8_t regAddr, uint8_t data);&lt;br /&gt;
uint8_t SPI_ACCSENS_getStatus(void);&lt;br /&gt;
&lt;br /&gt;
void SPI_ACCSENS_init(void);&lt;br /&gt;
void SPI_ACCSENS_shutdown(void);&lt;br /&gt;
void SPI_ACCSENS_read(void);&lt;br /&gt;
void SPI_ACCSENS_normalize(void);&lt;br /&gt;
void SPI_ACCSENS_position(void);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
/******************************************************************************&lt;br /&gt;
 * Additional info&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Changelog:&lt;br /&gt;
 * &lt;br /&gt;
 *  ---&amp;gt; changes are documented in the file &amp;quot;RP6ControlACCSENSLib.c&amp;quot;&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
======Library Source======&lt;br /&gt;
Datei: RP6ControlACCSENSLib.c&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;/* ****************************************************************************&lt;br /&gt;
 *                           _______________________&lt;br /&gt;
 *                           \| RP6  ROBOT SYSTEM |/&lt;br /&gt;
 *                            \_-_-_-_-_-_-_-_-_-_/             &amp;gt;&amp;gt;&amp;gt; RP6 CONTROL&lt;br /&gt;
 * ----------------------------------------------------------------------------&lt;br /&gt;
 * ----------------------------- [c]2014 - Dirk -------------------------------&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * File: RP6ControlACCSENSLib.c&lt;br /&gt;
 * Version: 1.0&lt;br /&gt;
 * Target: RP6 CONTROL - ATMEGA32 @16.00MHz&lt;br /&gt;
 *         with optional LC-Display 16x2 chars (CONRAD 190911-62)&lt;br /&gt;
 *         and a 3D Accelerometer Modul (CONRAD 1082387-62) (IC5)&lt;br /&gt;
 * Author(s): Dirk&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Description:&lt;br /&gt;
 * This is my RP6 Control ACCSENS Library. This library may be used to access&lt;br /&gt;
 * the basic functions of the 3D Accelerometer Modul. This RP6 Xtra module may&lt;br /&gt;
 * be placed on the IC5 socket on the RP6 CONTROL M32 instead of a second&lt;br /&gt;
 * EEPROM.&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * THE CHANGELOG CAN BE FOUND AT THE END OF THIS FILE!&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
 &lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Includes:&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6ControlACCSENSLib.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// SPI functions:&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Reads a single register from the 3D Accelerometer&lt;br /&gt;
 * Modul (ACCSENS).&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
uint8_t SPI_ACCSENS_readByte(uint8_t regAddr)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t data;&lt;br /&gt;
	regAddr |= READ_MASK;						// Read byte&lt;br /&gt;
	PORTB &amp;amp;= ~ACC_CS;&lt;br /&gt;
	writeSPI(regAddr);&lt;br /&gt;
	data = readSPI();&lt;br /&gt;
	PORTB |= ACC_CS;&lt;br /&gt;
	return data;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Reads &amp;quot;length&amp;quot; bytes into the buffer &amp;quot;buffer&amp;quot;&lt;br /&gt;
 * from startAddr on. &lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void SPI_ACCSENS_readBytes(uint8_t startAddr, uint8_t *buffer, uint8_t length)&lt;br /&gt;
{&lt;br /&gt;
	startAddr |= READ_AUTOINC_MASK;				// Read byte, auto increment&lt;br /&gt;
	PORTB &amp;amp;= ~ACC_CS;&lt;br /&gt;
	writeSPI(startAddr);&lt;br /&gt;
	readBufferSPI(&amp;amp;buffer[0], length);&lt;br /&gt;
	PORTB |= ACC_CS;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Write a single data byte to the specified sensor&lt;br /&gt;
 * address.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void SPI_ACCSENS_writeByte(uint8_t regAddr, uint8_t data)&lt;br /&gt;
{&lt;br /&gt;
	PORTB &amp;amp;= ~ACC_CS;&lt;br /&gt;
	writeSPI(regAddr);&lt;br /&gt;
	writeSPI(data);&lt;br /&gt;
	PORTB |= ACC_CS;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Returns sensor status register - for checking if&lt;br /&gt;
 * sensor is busy. &lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
uint8_t SPI_ACCSENS_getStatus(void)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t status;&lt;br /&gt;
	PORTB &amp;amp;= ~ACC_CS;&lt;br /&gt;
	writeSPI(STATUS_REG);&lt;br /&gt;
	status = readSPI();&lt;br /&gt;
	PORTB |= ACC_CS;&lt;br /&gt;
	return status;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// 3D accelerometer functions:&lt;br /&gt;
&lt;br /&gt;
int16_t x_axisa, y_axisa, z_axisa;&lt;br /&gt;
double pitch, roll;&lt;br /&gt;
double xa, ya, za;&lt;br /&gt;
double the, phi;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Initializes the sensor. You must call this&lt;br /&gt;
 * function at the beginning of a program, that&lt;br /&gt;
 * uses the 3D Accelerometer Modul.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void SPI_ACCSENS_init(void)&lt;br /&gt;
{&lt;br /&gt;
	// All axes enable, low power, 10Hz output data rate:&lt;br /&gt;
	SPI_ACCSENS_writeByte(CTRL_REG1, CTRL_REG1_3D_LOPWR_10HZ);&lt;br /&gt;
	// No update while reading, +- 2g, self-test minus:&lt;br /&gt;
	SPI_ACCSENS_writeByte(CTRL_REG4, CTRL_REG4_BDU_2G_STSIGN);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Sets the LIS302DLH power-down mode. If you&lt;br /&gt;
 * do not need the sensor, you can save energy&lt;br /&gt;
 * by using the sensor power-down mode.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void SPI_ACCSENS_shutdown(void)&lt;br /&gt;
{&lt;br /&gt;
	// LIS302DLH in power-down mode:&lt;br /&gt;
	SPI_ACCSENS_writeByte(CTRL_REG1, CTRL_REG1_POWERDOWN);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function reads the X-axis, Y-axis and Z-axis&lt;br /&gt;
 * values from the LIS302DLH accelerometer and stores&lt;br /&gt;
 * them in the global variables x_axisa, y_axisa and&lt;br /&gt;
 * z_axisa.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void SPI_ACCSENS_read(void)&lt;br /&gt;
{&lt;br /&gt;
#ifndef EXP_STACK_1&lt;br /&gt;
	// Default sensor position (M32 located on the RP6 rear stack):&lt;br /&gt;
	// xb = -y:&lt;br /&gt;
	x_axisa = SPI_ACCSENS_readByte(OUT_Y_L) | (SPI_ACCSENS_readByte(OUT_Y_H) &amp;lt;&amp;lt; 8);&lt;br /&gt;
	x_axisa *= -1;&lt;br /&gt;
	// yb = -x:&lt;br /&gt;
	y_axisa = SPI_ACCSENS_readByte(OUT_X_L) | (SPI_ACCSENS_readByte(OUT_X_H) &amp;lt;&amp;lt; 8);&lt;br /&gt;
	y_axisa *= -1;&lt;br /&gt;
	// zb = z:&lt;br /&gt;
	z_axisa = SPI_ACCSENS_readByte(OUT_Z_L) | (SPI_ACCSENS_readByte(OUT_Z_H) &amp;lt;&amp;lt; 8);&lt;br /&gt;
#else&lt;br /&gt;
	// Other sensor position (M32 located on the RP6 front stack):&lt;br /&gt;
	// xb = y:&lt;br /&gt;
	x_axisa = SPI_ACCSENS_readByte(OUT_Y_L) | (SPI_ACCSENS_readByte(OUT_Y_H) &amp;lt;&amp;lt; 8);&lt;br /&gt;
	// yb = x:&lt;br /&gt;
	y_axisa = SPI_ACCSENS_readByte(OUT_X_L) | (SPI_ACCSENS_readByte(OUT_X_H) &amp;lt;&amp;lt; 8);&lt;br /&gt;
	// zb = z:&lt;br /&gt;
	z_axisa = SPI_ACCSENS_readByte(OUT_Z_L) | (SPI_ACCSENS_readByte(OUT_Z_H) &amp;lt;&amp;lt; 8);&lt;br /&gt;
#endif&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function limits and normalizes the x-axisa,&lt;br /&gt;
 * y-axisa and z-axisa values read from the LIS302DLH&lt;br /&gt;
 * accelerometer with the function SPI_ACCSENS_read() and&lt;br /&gt;
 * stores them in the global double variables xa, ya and&lt;br /&gt;
 * za.&lt;br /&gt;
 * It also calculates the position in space in form of the&lt;br /&gt;
 * tilt angles (the = pitch, phi = roll) and stores them&lt;br /&gt;
 * in the global double variables the and phi.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void SPI_ACCSENS_normalize(void)&lt;br /&gt;
{&lt;br /&gt;
	// Limit raw values:&lt;br /&gt;
	if (x_axisa &amp;lt; MIN_X_A) x_axisa = MIN_X_A;&lt;br /&gt;
	if (x_axisa &amp;gt; MAX_X_A) x_axisa = MAX_X_A;&lt;br /&gt;
	if (y_axisa &amp;lt; MIN_Y_A) y_axisa = MIN_Y_A;&lt;br /&gt;
	if (y_axisa &amp;gt; MAX_Y_A) y_axisa = MAX_Y_A;&lt;br /&gt;
	if (z_axisa &amp;lt; MIN_Z_A) z_axisa = MIN_Z_A;&lt;br /&gt;
	if (z_axisa &amp;gt; MAX_Z_A) z_axisa = MAX_Z_A;&lt;br /&gt;
	xa = (double) x_axisa / 10000.0;&lt;br /&gt;
	ya = (double) y_axisa / 10000.0;&lt;br /&gt;
	za = (double) z_axisa / 10000.0;&lt;br /&gt;
	// Calculate Pitch and Roll:&lt;br /&gt;
	phi = asin(xa);								// Calculate the and phi&lt;br /&gt;
	the = asin(ya / cos(the));					//  from the raw values&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function calculates the position in space by&lt;br /&gt;
 * using the the and phi values (see function&lt;br /&gt;
 * SPI_ACCSENS_normalize()!). It stores the position&lt;br /&gt;
 * in the global double variables pitch and roll. &lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void SPI_ACCSENS_position(void)&lt;br /&gt;
{&lt;br /&gt;
	pitch = the * 180 / M_PI + OFFSET_PITCH_A;&lt;br /&gt;
	roll = phi * 180 / M_PI + OFFSET_ROLL_A;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/******************************************************************************&lt;br /&gt;
 * Additional info&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Changelog:&lt;br /&gt;
 * - v. 1.0 (initial release) 04.04.2014 by Dirk&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Erklärung&lt;br /&gt;
&lt;br /&gt;
======Demo======&lt;br /&gt;
makefile:&lt;br /&gt;
&amp;lt;pre&amp;gt;...&lt;br /&gt;
TARGET = RP6Control_01_ACCSENS&lt;br /&gt;
...&lt;br /&gt;
SRC += $(RP6_LIB_PATH)/RP6control/RP6ControlLib.c&lt;br /&gt;
SRC += $(RP6_LIB_PATH)/RP6common/RP6uart.c&lt;br /&gt;
SRC += $(RP6_LIB_PATH)/RP6control/RP6ControlACCSENSLib.c&lt;br /&gt;
...&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Datei: RP6Control_01_ACCSENS.c&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;// Uncommented Version of RP6Control_01_ACCSENS.c&lt;br /&gt;
// written by Dirk&lt;br /&gt;
// ------------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6ControlACCSENSLib.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void writeDouble(double number, uint8_t width, uint8_t prec)&lt;br /&gt;
{char buffer[width + 1];&lt;br /&gt;
	dtostrf(number, width, prec, &amp;amp;buffer[0]);&lt;br /&gt;
	writeString(&amp;amp;buffer[0]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void writeDoubleLCD(double number, uint8_t width, uint8_t prec)&lt;br /&gt;
{char buffer[width + 1];&lt;br /&gt;
	dtostrf(number, width, prec, &amp;amp;buffer[0]);&lt;br /&gt;
	writeStringLCD(&amp;amp;buffer[0]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
	initRP6Control();&lt;br /&gt;
&lt;br /&gt;
	writeString_P(&amp;quot;\n\nRP6Control SPI ACCSENS Test Program!\n&amp;quot;); &lt;br /&gt;
	setLEDs(0b1111);&lt;br /&gt;
	mSleep(50);&lt;br /&gt;
	initLCD(); &lt;br /&gt;
	showScreenLCD(&amp;quot;################&amp;quot;, &amp;quot;################&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
	showScreenLCD(&amp;quot;  SPI ACCSENS&amp;quot;, &amp;quot;  Test Program&amp;quot;);&lt;br /&gt;
	mSleep(1000);&lt;br /&gt;
	setLEDs(0b0000);&lt;br /&gt;
&lt;br /&gt;
	SPI_ACCSENS_init();&lt;br /&gt;
&lt;br /&gt;
	uint8_t whoami = SPI_ACCSENS_readByte(WHO_AM_I);&lt;br /&gt;
	writeString_P(&amp;quot;\nWHO AM I: &amp;quot;);&lt;br /&gt;
	writeInteger(whoami, HEX);&lt;br /&gt;
	writeChar('\n');&lt;br /&gt;
	mSleep(2000);&lt;br /&gt;
	&lt;br /&gt;
	startStopwatch1();&lt;br /&gt;
&lt;br /&gt;
	while(true) &lt;br /&gt;
	{&lt;br /&gt;
		if(getStopwatch1() &amp;gt; 1000)&lt;br /&gt;
		{&lt;br /&gt;
			SPI_ACCSENS_read();&lt;br /&gt;
			writeString_P(&amp;quot;\n3D Accelerometer SENSOR -&amp;gt;\n&amp;quot;);&lt;br /&gt;
			writeString_P(&amp;quot;X-axis: &amp;quot;);&lt;br /&gt;
			writeInteger(x_axisa, DEC);&lt;br /&gt;
			writeChar('\n');&lt;br /&gt;
			writeString_P(&amp;quot;Y-axis: &amp;quot;);&lt;br /&gt;
			writeInteger(y_axisa, DEC);&lt;br /&gt;
			writeChar('\n');&lt;br /&gt;
			writeString_P(&amp;quot;Z-axis: &amp;quot;);&lt;br /&gt;
			writeInteger(z_axisa, DEC);&lt;br /&gt;
			writeChar('\n');&lt;br /&gt;
			SPI_ACCSENS_normalize();&lt;br /&gt;
			SPI_ACCSENS_position();&lt;br /&gt;
			writeString_P(&amp;quot;POSITION: \n&amp;quot;);&lt;br /&gt;
			writeString_P(&amp;quot;  Pitch [°]: &amp;quot;);&lt;br /&gt;
			writeDouble(pitch, 6, 1);&lt;br /&gt;
			writeChar('\n');&lt;br /&gt;
			writeString_P(&amp;quot;  Roll [°]:  &amp;quot;);&lt;br /&gt;
			writeDouble(roll, 6, 1);&lt;br /&gt;
			writeChar('\n');&lt;br /&gt;
			setCursorPosLCD(0, 0);&lt;br /&gt;
			writeStringLCD_P(&amp;quot;P&amp;quot;);&lt;br /&gt;
			writeDoubleLCD(pitch, 6, 1);&lt;br /&gt;
			writeStringLCD_P(&amp;quot; &amp;quot;);&lt;br /&gt;
			setCursorPosLCD(0, 8);&lt;br /&gt;
			writeStringLCD_P(&amp;quot;R&amp;quot;);&lt;br /&gt;
			writeDoubleLCD(roll, 6, 1);&lt;br /&gt;
			writeStringLCD_P(&amp;quot; &amp;quot;);&lt;br /&gt;
			setCursorPosLCD(1, 0);&lt;br /&gt;
			writeStringLCD_P(&amp;quot;X&amp;quot;);&lt;br /&gt;
			writeIntegerLCD(x_axisa, DEC);&lt;br /&gt;
			writeStringLCD_P(&amp;quot;   &amp;quot;);&lt;br /&gt;
			setCursorPosLCD(1, 5);&lt;br /&gt;
			writeStringLCD_P(&amp;quot;Y&amp;quot;);&lt;br /&gt;
			writeIntegerLCD(y_axisa, DEC);&lt;br /&gt;
			writeStringLCD_P(&amp;quot;   &amp;quot;);&lt;br /&gt;
			setCursorPosLCD(1, 10);&lt;br /&gt;
			writeStringLCD_P(&amp;quot;Z&amp;quot;);&lt;br /&gt;
			writeIntegerLCD(z_axisa, DEC);&lt;br /&gt;
			writeStringLCD_P(&amp;quot;    &amp;quot;);&lt;br /&gt;
			mSleep(2000);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Erklärung&lt;br /&gt;
&lt;br /&gt;
====BHT Modul JM3-BHT31====&lt;br /&gt;
Dieses Modul zur Messung von Luftdruck, Luftfeuchte und Temperatur ist seit dem 22.01.2015 lieferbar.&lt;br /&gt;
&lt;br /&gt;
=====Dokumentation=====&lt;br /&gt;
Die Dokumentation zum BHT Modul befindet sich auf der mitgelieferten ''&amp;quot;ASURO xTend-On CD-ROM&amp;quot;''.&lt;br /&gt;
&lt;br /&gt;
======Manuals======&lt;br /&gt;
Das Handbuch in der aktuellen Version kann [http://www.jm3-engineering.com/download/doc/ManualAsuroBHT_de.pdf hier] eingesehen werden.&lt;br /&gt;
&lt;br /&gt;
=====Demo-Programme=====&lt;br /&gt;
Ein Demo-Programm zum BHT Modul befindet sich integriert in die RP6 Sensor Board Demo auf der ''&amp;quot;RP6 Robot System Xtra Modules CD-ROM&amp;quot;''. Diese Demo kann auch in der aktuellen Version im Download Bereich von [http://www.jm3-engineering.com/downloads.htm JM3 Engineering] herunter geladen werden.&lt;br /&gt;
&lt;br /&gt;
=====RP6M256 WiFi: I2C_BHT Library=====&lt;br /&gt;
Die nachfolgende RP6M256_I2C_BHTLib (Eigenentwicklung in GCC) dient zur Ansteuerung des I2C BHT Moduls durch die RP6M256 WiFi.&lt;br /&gt;
&lt;br /&gt;
======Library Header======&lt;br /&gt;
Datei: RP6M256_I2C_BHTLib.h&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;/* ****************************************************************************&lt;br /&gt;
 *                           _______________________&lt;br /&gt;
 *                           \| RP6  ROBOT SYSTEM |/&lt;br /&gt;
 *                            \_-_-_-_-_-_-_-_-_-_/           &amp;gt;&amp;gt;&amp;gt; RP6 M256 WIFI&lt;br /&gt;
 * ----------------------------------------------------------------------------&lt;br /&gt;
 * ----------------------------- [c]2015 - Dirk -------------------------------&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * File: RP6M256_I2C_BHTLib.h&lt;br /&gt;
 * Version: 0.9&lt;br /&gt;
 * Target: RP6 M256 WIFI - ATMEGA2560 @16.00MHz&lt;br /&gt;
 * Author(s): Dirk&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Description:&lt;br /&gt;
 * Header file for new RP6 BHT Module library.&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
#ifndef RP6M256_I2C_BHTLIB_H&lt;br /&gt;
#define RP6M256_I2C_BHTLIB_H&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// RP6 BHT Module components:&lt;br /&gt;
// - I2C Barometric Pressure Sensor (MS5607-02BA)&lt;br /&gt;
// - I2C Relative Humidity Sensor (HTU21D)&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// RP6 Sensor Board:&lt;br /&gt;
&lt;br /&gt;
// If you want to use the RP6 BHT Module on the RP6 Sensor Board, you&lt;br /&gt;
// have to define SENSOR_BOARD (default)!&lt;br /&gt;
// If SENSOR_BOARD is NOT defined, this library assumes that the RP6 BHT&lt;br /&gt;
// Module is used stand-alone.&lt;br /&gt;
// ------------------&lt;br /&gt;
#define SENSOR_BOARD&lt;br /&gt;
// ------------------&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Includes:&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6M256Lib.h&amp;quot;&lt;br /&gt;
#include &amp;quot;RP6I2CmasterTWI.h&amp;quot;&lt;br /&gt;
#ifdef SENSOR_BOARD&lt;br /&gt;
	#include &amp;quot;RP6M256_Sensor_BoardLib.h&amp;quot;&lt;br /&gt;
#endif&lt;br /&gt;
#include &amp;lt;math.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Barometric Pressure Sensor (MS5607-02BA):&lt;br /&gt;
#define I2C_BHT_B_ADR					0xee	// Default&lt;br /&gt;
&lt;br /&gt;
// Weather station's data:&lt;br /&gt;
#define ALTITUDE			156			// Weather station's altitude [m]&lt;br /&gt;
//#define ALTITUDE			110			// 2nd altitude: Location 2 [m]&lt;br /&gt;
&lt;br /&gt;
// Temperature default data:&lt;br /&gt;
#define TEMP_ZERO			273.15		// 273.15 K = 0 °C&lt;br /&gt;
#define TA_DEFAULT			15.0		// Outside temp. default [°C]&lt;br /&gt;
#define TI_DEFAULT			21.0		// Inside temp. default [°C]&lt;br /&gt;
&lt;br /&gt;
// Commands:&lt;br /&gt;
#define MS5607_CMD_RESET				0x1e	// ADC reset command&lt;br /&gt;
#define MS5607_CMD_ADC_READ				0x00	// ADC read command&lt;br /&gt;
#define MS5607_CMD_ADC_CONV				0x40	// ADC conversion command&lt;br /&gt;
#define MS5607_CMD_ADC_D1				0x00	// ADC D1 conversion&lt;br /&gt;
#define MS5607_CMD_ADC_D2				0x10	// ADC D2 conversion&lt;br /&gt;
#define MS5607_CMD_ADC_256				0x00	// ADC OSR=256&lt;br /&gt;
#define MS5607_CMD_ADC_512				0x02	// ADC OSR=512&lt;br /&gt;
#define MS5607_CMD_ADC_1024				0x04	// ADC OSR=1024&lt;br /&gt;
#define MS5607_CMD_ADC_2048				0x06	// ADC OSR=2048&lt;br /&gt;
#define MS5607_CMD_ADC_4096				0x08	// ADC OSR=4096&lt;br /&gt;
#define MS5607_CMD_PROM_RD				0xa0	// Prom read command&lt;br /&gt;
&lt;br /&gt;
extern uint32_t D1;		// ADC value of the pressure conversion&lt;br /&gt;
extern uint32_t D2;		// ADC value of the temperature conversion&lt;br /&gt;
extern uint16_t C[8];	// calibration coefficients&lt;br /&gt;
extern double P;		// compensated pressure value&lt;br /&gt;
extern double P0;		// compensated pressure value at sea level (0 m)&lt;br /&gt;
extern double T;		// compensated temperature value&lt;br /&gt;
extern double dT;		// difference between actual and measured temperature&lt;br /&gt;
extern double OFF;		// offset at actual temperature&lt;br /&gt;
extern double SENS;		// sensitivity at actual temperature&lt;br /&gt;
extern uint8_t n_crc;	// crc value of the prom&lt;br /&gt;
&lt;br /&gt;
void I2C_BHT_B_reset(void);&lt;br /&gt;
uint32_t I2C_BHT_B_cmd_adc(uint8_t cmd);&lt;br /&gt;
uint16_t I2C_BHT_B_cmd_prom(uint8_t coef_num);&lt;br /&gt;
uint8_t I2C_BHT_B_crc4(uint16_t n_prom[]);&lt;br /&gt;
void I2C_BHT_B_read(void);&lt;br /&gt;
void I2C_BHT_B_init(void);&lt;br /&gt;
double reduceAirPressure(double pa, double ta);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Relative Humidity Sensor (HTU21D):&lt;br /&gt;
#define I2C_BHT_HT_ADR					0x80	// Default&lt;br /&gt;
&lt;br /&gt;
// Commands:&lt;br /&gt;
#define HTU21D_TRIG_T_MEASUREMENT_HM    0xe3	// Trig. temp meas. hold master&lt;br /&gt;
#define HTU21D_TRIG_RH_MEASUREMENT_HM   0xe5	// Trig. humidity meas. hold master&lt;br /&gt;
#define HTU21D_TRIG_T_MEASUREMENT_POLL  0xf3	// Trig. temp meas. no hold master&lt;br /&gt;
#define HTU21D_TRIG_RH_MEASUREMENT_POLL 0xf5	// Trig. humidity meas. no hold master&lt;br /&gt;
#define HTU21D_USER_REG_W               0xe6	// Writing user register&lt;br /&gt;
#define HTU21D_USER_REG_R               0xe7	// Reading user register&lt;br /&gt;
#define HTU21D_SOFT_RESET               0xfe	// Soft reset&lt;br /&gt;
&lt;br /&gt;
// Resolutions:&lt;br /&gt;
#define HTU21D_RES_12_14BIT             0x00	// RH=12bit, T=14bit&lt;br /&gt;
#define HTU21D_RES_8_12BIT              0x01	// RH= 8bit, T=12bit&lt;br /&gt;
#define HTU21D_RES_10_13BIT             0x80	// RH=10bit, T=13bit&lt;br /&gt;
#define HTU21D_RES_11_11BIT             0x81	// RH=11bit, T=11bit&lt;br /&gt;
&lt;br /&gt;
// User register bitmasks:&lt;br /&gt;
#define HTU21D_RES_MASK                 0x81	// Mask for res. bits (7, 0)&lt;br /&gt;
#define HTU21D_EOB_ON                   0x40	// End of battery&lt;br /&gt;
#define HTU21D_EOB_MASK                 0x40	// Mask for EOB bit(6)&lt;br /&gt;
#define HTU21D_HEATER_ON                0x04	// Heater on&lt;br /&gt;
#define HTU21D_HEATER_OFF               0x00	// Heater off&lt;br /&gt;
#define HTU21D_HEATER_MASK              0x04	// Mask for Heater bit (2)&lt;br /&gt;
&lt;br /&gt;
extern uint16_t rawHumidity;	// raw humidity value&lt;br /&gt;
extern uint16_t rawTemperature;	// raw temperature value&lt;br /&gt;
extern double H;				// relative humidity value [%]&lt;br /&gt;
extern double HT;				// temperature value [°C]&lt;br /&gt;
extern uint8_t resolution;		// sensor resolution [0..3]&lt;br /&gt;
extern uint8_t ht_crc;			// message crc value&lt;br /&gt;
&lt;br /&gt;
void I2C_BHT_HT_reset(void);&lt;br /&gt;
uint8_t I2C_BHT_HT_crc8(uint16_t message, uint8_t checksum);&lt;br /&gt;
double I2C_BHT_HT_readHumidity(void);&lt;br /&gt;
double I2C_BHT_HT_readTemperature(void);&lt;br /&gt;
void I2C_BHT_HT_setResolution(uint8_t resBits);&lt;br /&gt;
void I2C_BHT_HT_init(void);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// RP6 BHT Module initialisation:&lt;br /&gt;
&lt;br /&gt;
void I2C_BHT_init(void);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
/******************************************************************************&lt;br /&gt;
 * Additional info&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Changelog:&lt;br /&gt;
 * &lt;br /&gt;
 *  ---&amp;gt; changes are documented in the file &amp;quot;RP6M256_I2C_BHTLib.c&amp;quot;&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
======Library Source======&lt;br /&gt;
Datei: RP6M256_I2C_BHTLib.c&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;/* ****************************************************************************&lt;br /&gt;
 *                           _______________________&lt;br /&gt;
 *                           \| RP6  ROBOT SYSTEM |/&lt;br /&gt;
 *                            \_-_-_-_-_-_-_-_-_-_/           &amp;gt;&amp;gt;&amp;gt; RP6 M256 WIFI&lt;br /&gt;
 * ----------------------------------------------------------------------------&lt;br /&gt;
 * ----------------------------- [c]2015 - Dirk -------------------------------&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * File: RP6M256_I2C_BHTLib.c&lt;br /&gt;
 * Version: 0.9&lt;br /&gt;
 * Target: RP6 M256 WIFI - ATMEGA2560 @16.00MHz&lt;br /&gt;
 *         and a RP6 BHT Module (CONRAD 1302995)&lt;br /&gt;
 *         optionally on a RP6 Sensor Board (CONRAD 1082384)&lt;br /&gt;
 * Author(s): Dirk&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Description:&lt;br /&gt;
 * &lt;br /&gt;
 * This is our new Library that contains basic routines and functions for&lt;br /&gt;
 * accessing the RP6 BHT Module JM3-BHT31 (CONRAD 1302995).&lt;br /&gt;
 * If the RP6 BHT Module is located on the RP6 Sensor Board (CONRAD 1082384)&lt;br /&gt;
 * and connected to the I2C-MODULE plug M1, the RP6M256_Sensor_BoardLib has to&lt;br /&gt;
 * be included!&lt;br /&gt;
 * &lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// RP6 BHT Module components:&lt;br /&gt;
// - I2C Barometric Pressure Sensor (MS5607-02BA)&lt;br /&gt;
// - I2C Relative Humidity Sensor (HTU21D)&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Includes:&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6M256_I2C_BHTLib.h&amp;quot; 		&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Variables:&lt;br /&gt;
&lt;br /&gt;
uint8_t bhtdataBuf[4]; &lt;br /&gt;
uint8_t i;&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Barometric Pressure Sensor (MS5607-02BA):&lt;br /&gt;
// (Following the C-code example published 2011 by MEAS in AN520!)&lt;br /&gt;
&lt;br /&gt;
uint32_t D1;			// ADC value of the pressure conversion&lt;br /&gt;
uint32_t D2;			// ADC value of the temperature conversion&lt;br /&gt;
uint16_t C[8];			// calibration coefficients&lt;br /&gt;
double P;				// compensated pressure value&lt;br /&gt;
double P0;				// compensated pressure value at sea level (0 m)&lt;br /&gt;
double T;				// compensated temperature value&lt;br /&gt;
double dT;				// difference between actual and measured temperature&lt;br /&gt;
double OFF;				// offset at actual temperature&lt;br /&gt;
double SENS;			// sensitivity at actual temperature&lt;br /&gt;
uint8_t n_crc;			// crc value of the prom&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Reset sequence for the Pressure Sensor.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void I2C_BHT_B_reset(void)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmitByte(I2C_BHT_B_ADR, MS5607_CMD_RESET);&lt;br /&gt;
	mSleep(3);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Reads and returns pressure or temperature ADC&lt;br /&gt;
 * values measured with the chosen resolution.&lt;br /&gt;
 * This function is BLOCKING during the conversion&lt;br /&gt;
 * time (up to 10 ms).&lt;br /&gt;
 *&lt;br /&gt;
 * Input: cmd -&amp;gt; MS5607_CMD_ADC_D1   = Read pressure ADC value&lt;br /&gt;
 *               MS5607_CMD_ADC_D2   = Read temperature ADC value&lt;br /&gt;
 *               ... plus ...&lt;br /&gt;
 *               MS5607_CMD_ADC_256  = Resolution 0.130 hPa / 0.012 °C&lt;br /&gt;
 *               MS5607_CMD_ADC_512  = Resolution 0.084 hPa / 0.008 °C&lt;br /&gt;
 *               MS5607_CMD_ADC_1024 = Resolution 0.054 hPa / 0.005 °C&lt;br /&gt;
 *               MS5607_CMD_ADC_2048 = Resolution 0.036 hPa / 0.003 °C&lt;br /&gt;
 *               MS5607_CMD_ADC_4096 = Resolution 0.024 hPa / 0.002 °C&lt;br /&gt;
 *&lt;br /&gt;
 * Examples:&lt;br /&gt;
 *   D1 = I2C_BHT_B_cmd_adc(MS5607_CMD_ADC_D1 + MS5607_CMD_ADC_4096);&lt;br /&gt;
 *   // This returns the pressure ADC value (D1) with a 0.024 hPa&lt;br /&gt;
 *   // resolution!&lt;br /&gt;
 *   D2 = I2C_BHT_B_cmd_adc(MS5607_CMD_ADC_D2 + MS5607_CMD_ADC_4096);&lt;br /&gt;
 *   // This returns the temperature ADC value (D2) with a 0.002 °C&lt;br /&gt;
 *   // resolution!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
uint32_t I2C_BHT_B_cmd_adc(uint8_t cmd)&lt;br /&gt;
{&lt;br /&gt;
	uint32_t temp = 0;&lt;br /&gt;
&lt;br /&gt;
	I2CTWI_transmitByte(I2C_BHT_B_ADR, (MS5607_CMD_ADC_CONV + cmd));&lt;br /&gt;
	switch (cmd &amp;amp; 0x0f) {&lt;br /&gt;
		case MS5607_CMD_ADC_256  : mSleep(1); break;&lt;br /&gt;
		case MS5607_CMD_ADC_512  : mSleep(2); break;&lt;br /&gt;
		case MS5607_CMD_ADC_1024 : mSleep(3); break;&lt;br /&gt;
		case MS5607_CMD_ADC_2048 : mSleep(5); break;&lt;br /&gt;
		case MS5607_CMD_ADC_4096 : mSleep(10);&lt;br /&gt;
	}&lt;br /&gt;
	I2CTWI_transmitByte(I2C_BHT_B_ADR, MS5607_CMD_ADC_READ);&lt;br /&gt;
	I2CTWI_readBytes(I2C_BHT_B_ADR, bhtdataBuf, 3);&lt;br /&gt;
	temp = bhtdataBuf[0];						// MSB&lt;br /&gt;
	temp &amp;lt;&amp;lt;= 8;&lt;br /&gt;
	temp |= bhtdataBuf[1];&lt;br /&gt;
	temp &amp;lt;&amp;lt;= 8;&lt;br /&gt;
	temp |= bhtdataBuf[2];						// LSB&lt;br /&gt;
	return temp;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Reads and returns the calibration coefficient&lt;br /&gt;
 * (16 bit) with the number coef_num from the&lt;br /&gt;
 * Pressure Sensor's PROM.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: coef_num -&amp;gt; Calibration coefficient&lt;br /&gt;
 *                    number [0..7]&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
uint16_t I2C_BHT_B_cmd_prom(uint8_t coef_num)&lt;br /&gt;
{&lt;br /&gt;
	uint16_t rC = 0;&lt;br /&gt;
&lt;br /&gt;
	I2CTWI_transmitByte(I2C_BHT_B_ADR, (MS5607_CMD_PROM_RD + coef_num * 2));&lt;br /&gt;
	I2CTWI_readBytes(I2C_BHT_B_ADR, bhtdataBuf, 2);&lt;br /&gt;
	rC = bhtdataBuf[0];							// MSB&lt;br /&gt;
	rC &amp;lt;&amp;lt;= 8;&lt;br /&gt;
	rC |= bhtdataBuf[1];						// LSB&lt;br /&gt;
	return rC;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Calculates and returns the Pressure Sensor's&lt;br /&gt;
 * PROM CRC-4 value (8 bit).&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
uint8_t I2C_BHT_B_crc4(uint16_t n_prom[])&lt;br /&gt;
{&lt;br /&gt;
	uint16_t n_rem;&lt;br /&gt;
	uint16_t crc_read;&lt;br /&gt;
	uint8_t n_bit;&lt;br /&gt;
&lt;br /&gt;
	n_rem = 0x00;&lt;br /&gt;
	crc_read = n_prom[7];&lt;br /&gt;
	n_prom[7] = (0xff00 &amp;amp; (n_prom[7]));&lt;br /&gt;
	for (i = 0; i &amp;lt; 16; i++)&lt;br /&gt;
	{&lt;br /&gt;
		if (i % 2 == 1) n_rem ^= (uint8_t) ((n_prom[i &amp;gt;&amp;gt; 1]) &amp;amp; 0x00ff);&lt;br /&gt;
		else n_rem ^= (uint8_t) (n_prom[i &amp;gt;&amp;gt; 1] &amp;gt;&amp;gt; 8);&lt;br /&gt;
		for (n_bit = 8; n_bit &amp;gt; 0; n_bit--)&lt;br /&gt;
		{&lt;br /&gt;
			if (n_rem &amp;amp; 0x8000) n_rem = (n_rem &amp;lt;&amp;lt; 1) ^ 0x3000;&lt;br /&gt;
			else n_rem = n_rem &amp;lt;&amp;lt; 1;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	n_rem = (0x000f &amp;amp; (n_rem &amp;gt;&amp;gt; 12));&lt;br /&gt;
	n_prom[7] = crc_read;&lt;br /&gt;
	return (n_rem ^ 0x0);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Reads and calculates the pressure and&lt;br /&gt;
 * temperature values with the MS5607 1st order&lt;br /&gt;
 * algorithm.&lt;br /&gt;
 * The 2 values are stored in the global floating&lt;br /&gt;
 * point variables P and T:&lt;br /&gt;
 *   P -&amp;gt; Pressure value [hPa]&lt;br /&gt;
 *   T -&amp;gt; Temperature value [°C]&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void I2C_BHT_B_read(void)&lt;br /&gt;
{&lt;br /&gt;
	D2 = I2C_BHT_B_cmd_adc(MS5607_CMD_ADC_D2 + MS5607_CMD_ADC_4096); // Read D2&lt;br /&gt;
	D1 = I2C_BHT_B_cmd_adc(MS5607_CMD_ADC_D1 + MS5607_CMD_ADC_4096); // Read D1&lt;br /&gt;
&lt;br /&gt;
	// Calculate 1st order pressure and temperature (MS5607 1st order algorithm)&lt;br /&gt;
	dT = D2 - C[5] * pow(2, 8);&lt;br /&gt;
	OFF = C[2] * pow(2, 17) + dT * C[4] / pow(2, 6);&lt;br /&gt;
	SENS = C[1] * pow(2, 16) + dT * C[3] / pow(2, 7);&lt;br /&gt;
&lt;br /&gt;
	T = (2000 + (dT * C[6]) / pow(2, 23)) / 100;&lt;br /&gt;
	P = (((D1 * SENS) / pow(2, 21) - OFF) / pow(2, 15)) / 100;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * You MUST call this function at the beginning of a&lt;br /&gt;
 * main program, that uses the Pressure Sensor. &lt;br /&gt;
 * If SENSOR_BOARD is defined, the I2C-MODULE power&lt;br /&gt;
 * will be switched on with the function&lt;br /&gt;
 * setI2CModulePower() defined in the&lt;br /&gt;
 * RP6M256_Sensor_BoardLib, which will be included&lt;br /&gt;
 * then.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void I2C_BHT_B_init(void)&lt;br /&gt;
{&lt;br /&gt;
#ifdef SENSOR_BOARD&lt;br /&gt;
	// I2C-MODULE (plug M1) power on: &lt;br /&gt;
	setI2CModulePower(1);&lt;br /&gt;
#endif&lt;br /&gt;
	D1 = 0;										// Clear pressure ADC value&lt;br /&gt;
	D2 = 0;										// Clear temperature ADC value&lt;br /&gt;
	I2C_BHT_B_reset();							// Reset the Pressure Sensor&lt;br /&gt;
	for (i = 0; i &amp;lt; 8; i++) {C[i] = I2C_BHT_B_cmd_prom(i);} // Read PROM&lt;br /&gt;
	n_crc = I2C_BHT_B_crc4(C);					// Calculate PROM CRC&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Calculates and returns the relative air pressure&lt;br /&gt;
 * [hPa] at sea level (0 m).&lt;br /&gt;
 *&lt;br /&gt;
 * Input:  pa        -&amp;gt; Absolute air pressure [hPa] at ALTITUDE&lt;br /&gt;
 *         ta        -&amp;gt; OUTSIDE temperature [°C] at ALTITUDE&lt;br /&gt;
 *         ALTITUDE  -&amp;gt; Weather station's altitude [m]&lt;br /&gt;
 *         TEMP_ZERO -&amp;gt; 273.15 K&lt;br /&gt;
 * Output: p0        -&amp;gt; Relative air pressure [hPa] at sea level (0 m)&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
double reduceAirPressure(double pa, double ta)&lt;br /&gt;
{double p0;&lt;br /&gt;
	p0 = pa * (pow ((TEMP_ZERO + ta) / (TEMP_ZERO + ta + 0.0065 * ALTITUDE), -5.255));&lt;br /&gt;
	return p0;									// P0 [hPa]&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Relative Humidity Sensor (HTU21D):&lt;br /&gt;
// (Following a library published 2011 by MEAS France!)&lt;br /&gt;
&lt;br /&gt;
uint16_t rawHumidity;		// raw humidity value&lt;br /&gt;
uint16_t rawTemperature;	// raw temperature value&lt;br /&gt;
double H;					// relative humidity value [%]&lt;br /&gt;
double HT;					// temperature value [°C]&lt;br /&gt;
uint8_t resolution;			// sensor resolution [0..3]&lt;br /&gt;
uint8_t ht_crc;				// message crc value&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Soft reset for the Humidity Sensor.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void I2C_BHT_HT_reset(void)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmitByte(I2C_BHT_HT_ADR, HTU21D_SOFT_RESET);&lt;br /&gt;
	mSleep(15);&lt;br /&gt;
	resolution = 0;								// Default: RH 12, T 14 bit&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Reads the Humidity Sensor's user register.&lt;br /&gt;
 *&lt;br /&gt;
 * Hint: The user register bits are described on&lt;br /&gt;
 *       page 13 of the HTU21D datasheet!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
uint8_t read_user_register(void)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t userRegister;&lt;br /&gt;
  &lt;br /&gt;
	I2CTWI_transmitByte(I2C_BHT_HT_ADR, HTU21D_USER_REG_R);&lt;br /&gt;
	userRegister = I2CTWI_readByte(I2C_BHT_HT_ADR);&lt;br /&gt;
	return userRegister;  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Sets the Humidity Sensor's resolution to one&lt;br /&gt;
 * of four steps. The step number [0..3] is stored&lt;br /&gt;
 * in the global variable resolution:&lt;br /&gt;
 *   Step  RH   T&lt;br /&gt;
 *    0:   12  14 bit&lt;br /&gt;
 *    1:    8  12 bit&lt;br /&gt;
 *    2:   10  13 bit&lt;br /&gt;
 *    3:   11  11 bit&lt;br /&gt;
 *                                      RH   T&lt;br /&gt;
 * Input:  resBits -&amp;gt; 0b00000000   (0): 12  14 bit&lt;br /&gt;
 *                 -&amp;gt; 0b00000001   (1):  8  12 bit&lt;br /&gt;
 *                 -&amp;gt; 0b10000000 (128): 10  13 bit&lt;br /&gt;
 *                 -&amp;gt; 0b10000001 (129): 11  11 bit&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void I2C_BHT_HT_setResolution(uint8_t resBits)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t userRegister;&lt;br /&gt;
&lt;br /&gt;
	userRegister = read_user_register();&lt;br /&gt;
	userRegister &amp;amp;= 0b01111110;&lt;br /&gt;
	resBits &amp;amp;= 0b10000001;&lt;br /&gt;
	resolution = (resBits &amp;gt;&amp;gt; 6) | (resBits &amp;amp; 1); // Step 0..3&lt;br /&gt;
	userRegister |= resBits;&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_BHT_HT_ADR, HTU21D_USER_REG_W, userRegister);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#define SHIFTED_DIVISOR                 0x988000&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Calculates the Humidity Sensor's message CRC-8&lt;br /&gt;
 * value (8 bit) and returns 0 (false), if the&lt;br /&gt;
 * message transmission is good.&lt;br /&gt;
 *&lt;br /&gt;
 * Input:  message         -&amp;gt; Message from&lt;br /&gt;
 *                            Humidity Sensor&lt;br /&gt;
 *         checksum        -&amp;gt; Checksum from&lt;br /&gt;
 *                            Humidity Sensor&lt;br /&gt;
 *         SHIFTED_DIVISOR -&amp;gt; 0x0131 polynomial&lt;br /&gt;
 *                            shifted to farthest&lt;br /&gt;
 *                            left of three bytes&lt;br /&gt;
 * Output: remainder       -&amp;gt; 0  = Transmission good&lt;br /&gt;
 *                         -&amp;gt; &amp;gt;0 = Transm. corrupted&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
uint8_t I2C_BHT_HT_crc8(uint16_t message, uint8_t checksum)&lt;br /&gt;
{&lt;br /&gt;
	uint32_t remainder, divisor;&lt;br /&gt;
&lt;br /&gt;
	remainder = (uint32_t) message &amp;lt;&amp;lt; 8;&lt;br /&gt;
	remainder |= checksum;&lt;br /&gt;
	divisor = (uint32_t) SHIFTED_DIVISOR;&lt;br /&gt;
	for (i = 0; i &amp;lt; 16; i++)&lt;br /&gt;
	{&lt;br /&gt;
		if (remainder &amp;amp; (uint32_t) 1 &amp;lt;&amp;lt; (23 - i))&lt;br /&gt;
			remainder ^= divisor;&lt;br /&gt;
		divisor &amp;gt;&amp;gt;= 1;&lt;br /&gt;
	}&lt;br /&gt;
	return (uint8_t) remainder;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Calculates and returns the humidity value.&lt;br /&gt;
 * This function is BLOCKING during the conversion&lt;br /&gt;
 * time (up to 17 ms depending on resolution).&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
double I2C_BHT_HT_readHumidity(void)&lt;br /&gt;
{&lt;br /&gt;
	uint32_t temp = 0;&lt;br /&gt;
&lt;br /&gt;
	I2CTWI_transmitByte(I2C_BHT_HT_ADR, HTU21D_TRIG_RH_MEASUREMENT_POLL);&lt;br /&gt;
	switch (resolution) {&lt;br /&gt;
		case 1 : mSleep(4); break;				// RH 8 bit&lt;br /&gt;
		case 2 : mSleep(6); break;				// RH 10 bit&lt;br /&gt;
		case 3 : mSleep(9); break;				// RH 11 bit&lt;br /&gt;
		case 0 : mSleep(17);					// RH 12 bit&lt;br /&gt;
	}&lt;br /&gt;
	I2CTWI_readBytes(I2C_BHT_HT_ADR, bhtdataBuf, 3);&lt;br /&gt;
	temp = bhtdataBuf[0];						// MSB&lt;br /&gt;
	temp &amp;lt;&amp;lt;= 8;&lt;br /&gt;
	temp |= bhtdataBuf[1];						// LSB&lt;br /&gt;
	temp &amp;lt;&amp;lt;= 8;&lt;br /&gt;
	temp |= bhtdataBuf[2];						// Checksum&lt;br /&gt;
	rawHumidity = temp &amp;gt;&amp;gt; 8;&lt;br /&gt;
	ht_crc = (uint8_t) temp;&lt;br /&gt;
	rawHumidity &amp;amp;= 0xfffc;&lt;br /&gt;
	double tempRH = rawHumidity / (double) 65536;&lt;br /&gt;
	double rh = -6 + (125 * tempRH);&lt;br /&gt;
	return rh;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Calculates and returns the temperature value.&lt;br /&gt;
 * This function is BLOCKING during the conversion&lt;br /&gt;
 * time (up to 51 ms depending on resolution).&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
double I2C_BHT_HT_readTemperature(void)&lt;br /&gt;
{&lt;br /&gt;
	uint32_t temp = 0;&lt;br /&gt;
&lt;br /&gt;
	I2CTWI_transmitByte(I2C_BHT_HT_ADR, HTU21D_TRIG_T_MEASUREMENT_POLL);&lt;br /&gt;
	switch (resolution) {&lt;br /&gt;
		case 3 : mSleep(8); break;				// T 11 bit&lt;br /&gt;
		case 1 : mSleep(14); break;				// T 12 bit&lt;br /&gt;
		case 2 : mSleep(26); break;				// T 13 bit&lt;br /&gt;
		case 0 : mSleep(51);					// T 14 bit&lt;br /&gt;
	}&lt;br /&gt;
	I2CTWI_readBytes(I2C_BHT_HT_ADR, bhtdataBuf, 3);&lt;br /&gt;
	temp = bhtdataBuf[0];						// MSB&lt;br /&gt;
	temp &amp;lt;&amp;lt;= 8;&lt;br /&gt;
	temp |= bhtdataBuf[1];						// LSB&lt;br /&gt;
	temp &amp;lt;&amp;lt;= 8;&lt;br /&gt;
	temp |= bhtdataBuf[2];						// Checksum&lt;br /&gt;
	rawTemperature = temp &amp;gt;&amp;gt; 8;&lt;br /&gt;
	ht_crc = (uint8_t) temp;&lt;br /&gt;
	rawTemperature &amp;amp;= 0xfffc;&lt;br /&gt;
	double tempTemperature = rawTemperature / (double) 65536;&lt;br /&gt;
	double realTemperature = -46.85 + (175.72 * tempTemperature);&lt;br /&gt;
	return realTemperature;  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * You MUST call this function at the beginning of a&lt;br /&gt;
 * main program, that uses the Humidity Sensor. &lt;br /&gt;
 * If SENSOR_BOARD is defined, the I2C-MODULE power&lt;br /&gt;
 * will be switched on with the function&lt;br /&gt;
 * setI2CModulePower() defined in the&lt;br /&gt;
 * RP6M256_Sensor_BoardLib, which will be included&lt;br /&gt;
 * then.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void I2C_BHT_HT_init(void)&lt;br /&gt;
{&lt;br /&gt;
#ifdef SENSOR_BOARD&lt;br /&gt;
	// I2C-MODULE (plug M1) power on: &lt;br /&gt;
	setI2CModulePower(1);&lt;br /&gt;
#endif&lt;br /&gt;
	I2C_BHT_HT_reset();							// Reset the Humidity Sensor&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// RP6 BHT Module initialisation:&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * You MUST call this function at the beginning of a&lt;br /&gt;
 * main program, that uses the RP6 BHT Module. &lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void I2C_BHT_init(void)&lt;br /&gt;
{&lt;br /&gt;
	// I2C Barometric Pressure Sensor:&lt;br /&gt;
	I2C_BHT_B_init();&lt;br /&gt;
	// I2C Relative Humidity Sensor:&lt;br /&gt;
	I2C_BHT_HT_init();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&lt;br /&gt;
/******************************************************************************&lt;br /&gt;
 * Additional info&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Changelog:&lt;br /&gt;
 * - v. 0.9 (initial release) 20.03.2015 by Dirk&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
======Demo======&lt;br /&gt;
makefile:&lt;br /&gt;
&amp;lt;pre&amp;gt;...&lt;br /&gt;
TARGET = RP6M256_Sensor_Board_03&lt;br /&gt;
...&lt;br /&gt;
SRC += $(RP6_LIB_PATH)/RP6common/RP6I2CmasterTWI.c&lt;br /&gt;
&lt;br /&gt;
SRC += $(RP6_LIB_PATH)/RP6control_M256_WIFI/RP6M256_Sensor_BoardLib.c&lt;br /&gt;
SRC += $(RP6_LIB_PATH)/RP6control_M256_WIFI/RP6M256_I2C_BHTLib.c&lt;br /&gt;
...&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Datei: RP6M256_Sensor_Board_03.c&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;/* &lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * RP6 ROBOT SYSTEM - RP6 CONTROL M256 Examples&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Example: RP6M256 Sensor Board&lt;br /&gt;
 * Author(s): Dirk&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Description:&lt;br /&gt;
 * In this example we show a third test for the RP6 Sensor Board.&lt;br /&gt;
 * &lt;br /&gt;
 * ############################################################################&lt;br /&gt;
 * The Robot does NOT move in this example! You can simply put it on a table&lt;br /&gt;
 * next to your PC and you should connect it to the PC via the USB Interface!&lt;br /&gt;
 * You should also connect to it via WIFI.&lt;br /&gt;
 * ############################################################################&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Includes:&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6M256Lib.h&amp;quot; 				// The RP6 M256 Library. &lt;br /&gt;
										// Always needs to be included!&lt;br /&gt;
#include &amp;quot;RP6I2CmasterTWI.h&amp;quot;			// Include the I2C-Bus Master Library&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Include our new &amp;quot;RP6M256 I2C BHT Module library&amp;quot;:&lt;br /&gt;
// (This is the library for accessing the RP6 BHT Module!)&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6M256_I2C_BHTLib.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Write a floating point number to the WIFI.&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *&lt;br /&gt;
 *			// Write a floating point number to the WIFI (no exponent):&lt;br /&gt;
 *			writeDouble_WIFI(1234567.890, 11, 3);&lt;br /&gt;
 *&lt;br /&gt;
 * The value of prec (precision) defines the number of decimal places.&lt;br /&gt;
 * For 32 bit floating point variables (float, double ...) 6 is&lt;br /&gt;
 * the max. value for prec (7 relevant digits).&lt;br /&gt;
 * The value of width defines the overall number of characters in the&lt;br /&gt;
 * floating point number including the decimal point. The number of&lt;br /&gt;
 * pre-decimal positions is: (width - prec - 1).&lt;br /&gt;
 */&lt;br /&gt;
void writeDouble_WIFI(double number, uint8_t width, uint8_t prec)&lt;br /&gt;
{char buffer[width + 1];&lt;br /&gt;
	dtostrf(number, width, prec, &amp;amp;buffer[0]);&lt;br /&gt;
	writeString_WIFI(&amp;amp;buffer[0]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Write a floating point number to the LCD.&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *&lt;br /&gt;
 *			// Write a floating point number to the LCD (no exponent):&lt;br /&gt;
 *			writeDoubleLCD(1234567.890, 11, 3);&lt;br /&gt;
 *&lt;br /&gt;
 * The value of prec (precision) defines the number of decimal places.&lt;br /&gt;
 * For 32 bit floating point variables (float, double ...) 6 is&lt;br /&gt;
 * the max. value for prec (7 relevant digits).&lt;br /&gt;
 * The value of width defines the overall number of characters in the&lt;br /&gt;
 * floating point number including the decimal point. The number of&lt;br /&gt;
 * pre-decimal positions is: (width - prec - 1).&lt;br /&gt;
 */&lt;br /&gt;
void writeDoubleLCD(double number, uint8_t width, uint8_t prec)&lt;br /&gt;
{char buffer[width + 1];&lt;br /&gt;
	dtostrf(number, width, prec, &amp;amp;buffer[0]);&lt;br /&gt;
	writeStringLCD(&amp;amp;buffer[0]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Error handler&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function gets called automatically if there was an I2C Error like&lt;br /&gt;
 * the slave sent a &amp;quot;not acknowledge&amp;quot; (NACK, error codes e.g. 0x20 or 0x30).&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void I2C_transmissionError(uint8_t errorState)&lt;br /&gt;
{&lt;br /&gt;
	writeString_P_WIFI(&amp;quot;\nI2C ERROR - TWI STATE: 0x&amp;quot;);&lt;br /&gt;
	writeInteger_WIFI(errorState, HEX);&lt;br /&gt;
	writeChar_WIFI('\n');&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Main function - The program starts here:&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
	initRP6M256();    // Always call this first! The Processor will not work&lt;br /&gt;
					  // correctly otherwise. &lt;br /&gt;
&lt;br /&gt;
	initLCD(); // Initialize the LC-Display (LCD)&lt;br /&gt;
			   // Always call this before using the LCD!&lt;br /&gt;
&lt;br /&gt;
	setLEDs(0b1111);&lt;br /&gt;
	mSleep(500);&lt;br /&gt;
	setLEDs(0b0000);&lt;br /&gt;
&lt;br /&gt;
	writeString_P_WIFI(&amp;quot;\n\nRP6 Sensor Board Selftest 3!\n&amp;quot;); &lt;br /&gt;
&lt;br /&gt;
	// IMPORTANT:&lt;br /&gt;
	I2CTWI_initMaster(100); // Initialize the TWI Module for Master operation&lt;br /&gt;
							// with 100kHz SCL Frequency&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	// Register the event handler:&lt;br /&gt;
	I2CTWI_setTransmissionErrorHandler(I2C_transmissionError);&lt;br /&gt;
&lt;br /&gt;
	setLEDs(0b1111);&lt;br /&gt;
&lt;br /&gt;
	// Write a text message to the LCD:&lt;br /&gt;
	showScreenLCD(&amp;quot;################&amp;quot;, &amp;quot;################&amp;quot;);&lt;br /&gt;
	mSleep(1500);&lt;br /&gt;
	showScreenLCD(&amp;quot;RP6v2-M256-WIFI &amp;quot;, &amp;quot;Example Program&amp;quot;);&lt;br /&gt;
	mSleep(2500); &lt;br /&gt;
	showScreenLCD(&amp;quot;RP6 Sensor Board&amp;quot;, &amp;quot;   Selftest 3&amp;quot;);&lt;br /&gt;
	mSleep(2500);&lt;br /&gt;
	clearLCD();&lt;br /&gt;
&lt;br /&gt;
	setLEDs(0b0000);&lt;br /&gt;
&lt;br /&gt;
	// ---------------------------------------&lt;br /&gt;
&lt;br /&gt;
	uint8_t onoff = 0;&lt;br /&gt;
&lt;br /&gt;
	startStopwatch1();&lt;br /&gt;
	startStopwatch2();&lt;br /&gt;
&lt;br /&gt;
	// IMPORTANT:&lt;br /&gt;
	sensor_board_init();						// RP6 Sensor Board init!!!&lt;br /&gt;
	mSleep(200);&lt;br /&gt;
	I2C_BHT_init();								// RP6 BHT Module init&lt;br /&gt;
&lt;br /&gt;
	while(true) &lt;br /&gt;
	{&lt;br /&gt;
		if(getStopwatch1() &amp;gt; 1000) // 1s&lt;br /&gt;
		{&lt;br /&gt;
//			if (onoff) onoff = 0;&lt;br /&gt;
//			else onoff = 1;&lt;br /&gt;
&lt;br /&gt;
			// Show Pressure Sensor data:&lt;br /&gt;
			I2C_BHT_B_read();					// Read data&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nLuftdruck:   &amp;quot;);&lt;br /&gt;
			writeDouble_WIFI(P, 7, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot; hPa am Messort (ALTITUDE m)\n&amp;quot;);&lt;br /&gt;
			// Calculate pressure at sea level at TA_DEFAULT (15 °C):&lt;br /&gt;
			P0 = reduceAirPressure(P, TA_DEFAULT);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;Luftdruck:   &amp;quot;);&lt;br /&gt;
			writeDouble_WIFI(P0, 7, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot; hPa in Meereshöhe (0 m, 15 C)\n&amp;quot;);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;Temperatur:  &amp;quot;);&lt;br /&gt;
			writeDouble_WIFI(T, 7, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot; C\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			// Show Humidity Sensor data:&lt;br /&gt;
			H = I2C_BHT_HT_readHumidity();		// Read data&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nLuftfeuchte: &amp;quot;);&lt;br /&gt;
			writeDouble_WIFI(H, 7, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot; % RH\n&amp;quot;);&lt;br /&gt;
			HT = I2C_BHT_HT_readTemperature();	// Read data&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;Temperatur:  &amp;quot;);&lt;br /&gt;
			writeDouble_WIFI(HT, 7, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot; C\n\n\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			// RP6 Sensor Board shutdown (button &amp;amp; status LED test):&lt;br /&gt;
			if (pressedButton) {&lt;br /&gt;
				setStatusLED(1);&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;\nPress button again for RP6 Sensor Board SHUTDOWN!\n&amp;quot;);&lt;br /&gt;
				mSleep(2000);&lt;br /&gt;
				do {&lt;br /&gt;
					if(getStopwatch2() &amp;gt; 200) { // 0.2s&lt;br /&gt;
						if (onoff) onoff = 0;&lt;br /&gt;
						else onoff = 1;&lt;br /&gt;
						if (onoff) setStatusLED(1);&lt;br /&gt;
						else setStatusLED(0);&lt;br /&gt;
						setStopwatch2(0);&lt;br /&gt;
					}&lt;br /&gt;
					mSleep(1);&lt;br /&gt;
					task_I2CTWI();&lt;br /&gt;
				} while (!readButton());&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;\n\n\n\n\nPlease wait for RP6 Sensor Board SHUTDOWN...\n&amp;quot;);&lt;br /&gt;
				sensor_board_shutdown();&lt;br /&gt;
				mSleep(3000);&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;\n\n\nThe RP6 Sensor Board now is in SHUTDOWN MODE!!!\n&amp;quot;);&lt;br /&gt;
				mSleep(1000);&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;\nRESET the M256 microcontroller now...\n\n&amp;quot;);&lt;br /&gt;
				while(true) {};&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			setStopwatch1(0);&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		task_RP6SensorBoard();					// RP6 Sensor Board task&lt;br /&gt;
&lt;br /&gt;
		task_I2CTWI();&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Erklärung&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Erfahrungsberichte==&lt;br /&gt;
&lt;br /&gt;
...in Arbeit...(kann aber gerne ergänzt werden)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Siehe auch==&lt;br /&gt;
* [[RP6v2]]&lt;br /&gt;
* [[RP6]]&lt;br /&gt;
* [[RP6 - Programmierung]]&lt;br /&gt;
* [[RP6 Kamera - Mitmach-Projekt]]&lt;br /&gt;
* [[RP6v2 I2C-Portexpander]]&lt;br /&gt;
* [[RP6v2 USB-RS232-Adapter]]&lt;br /&gt;
* [[RP6v2 Orientierung]]&lt;br /&gt;
* [[RP6 Multi IO Projekt]]&lt;br /&gt;
* [[RP6 Multi IO Projekt - Software]]&lt;br /&gt;
* [[RP6 ArduIO]]&lt;br /&gt;
* [[RP6 ArduIO - Software]]&lt;br /&gt;
* [[Induktive_Ladestation_f%C3%BCr_den_RP6|Induktive Ladestation für den RP6]]&lt;br /&gt;
* [[IR-bake_f%C3%BCr_den_RP6|IR-bake für den RP6]]&lt;br /&gt;
* [[CCRP5]]&lt;br /&gt;
* [[Wild Thumper]]&lt;br /&gt;
* [[Wild Thumper - Programmierung]]&lt;br /&gt;
* [[Yeti]]&lt;br /&gt;
* [[Asuro]]&lt;br /&gt;
* [[C't-Bot]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Weblinks==&lt;br /&gt;
'''Siehe auch die Weblinks im [http://www.rn-wissen.de/index.php/RP6v2#Weblinks RP6v2] und im [http://www.rn-wissen.de/index.php/RP6#Weblinks RP6] Artikel!'''&lt;br /&gt;
&lt;br /&gt;
* [http://www.conrad.de/ce/de/product/1082384/Arexx-RP6-Sensor-Board-RP6-JM03-61 RP6 Sensor Board bei CONRAD]&lt;br /&gt;
* JM3 Engineering:&lt;br /&gt;
** [http://www.jm3-engineering.com/rp6.htm RP6 Roboter Erweiterung]&lt;br /&gt;
** [http://www.jm3-engineering.com/sensors.htm Sensor Module]&lt;br /&gt;
** [http://www.jm3-engineering.com/downloads.htm Software Downloads]&lt;br /&gt;
* Ankündigung einer Sensorerweiterungsplatine für die RP6v2 M256 WiFi im [http://www.roboternetz.de/community/threads/63595-Neue-Hardware-f%C3%BCr-RP6%28v2%29?p=590129&amp;amp;viewfull=1#post590129 Roboternetz RP6 Forum]&lt;br /&gt;
* Erfahrungsbericht zum Sensor Board im [http://www.arexx.com/forum/viewtopic.php?f=19&amp;amp;t=2498 AREXX Support Forum] und im [http://www.roboternetz.de/community/threads/64414-RP6-Sensor-Board-Erster-Eindruck Roboternetz RP6 Forum]&lt;br /&gt;
* Erfahrungsbericht zum I2C GPS Empfänger im [http://www.arexx.com/forum/viewtopic.php?f=19&amp;amp;t=2509 AREXX Support Forum]&lt;br /&gt;
* Erfahrungsbericht zum I2C BHT Modul im [http://www.arexx.com/forum/viewtopic.php?f=19&amp;amp;t=2646 AREXX Support Forum]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Kategorie:Robotikeinstieg]]	 &lt;br /&gt;
[[Kategorie:Praxis]]&lt;br /&gt;
&lt;br /&gt;
==Autoren==&lt;br /&gt;
--[http://www.roboternetz.de/community/members/1972-Dirk Dirk] 18:59, 1. Jun 2020 (CET)&lt;/div&gt;</summary>
		<author><name>Dirk NO2</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=RP6_Sensor_Board_und_Xtra_Module&amp;diff=28578</id>
		<title>RP6 Sensor Board und Xtra Module</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=RP6_Sensor_Board_und_Xtra_Module&amp;diff=28578"/>
				<updated>2022-03-31T09:19:30Z</updated>
		
		<summary type="html">&lt;p&gt;Dirk NO2: /* RP6 Xtra Module */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Bild:RP6_Sensor_Board.jpg|Das RP6 Sensor Board|right|500px]]&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_Xtra_module.JPG|RP6 Xtra module|right|500px]]&lt;br /&gt;
==Was bisher geschah==&lt;br /&gt;
'''Siehe auch &amp;quot;Was bisher geschah&amp;quot; im [http://www.rn-wissen.de/index.php/RP6v2#Was_bisher_geschah RP6v2] und im [http://www.rn-wissen.de/index.php/RP6#Was_bisher_geschah RP6] Artikel!'''&lt;br /&gt;
&lt;br /&gt;
Mit, 27. Nov 2013 - Ankündigung einer Sensorerweiterungsplatine, die an die RP6v2-M256-WIFI angeschlossen werden kann&amp;lt;br/&amp;gt;&lt;br /&gt;
Sam, 22. Feb 2014 - Auslieferungsbeginn des RP6 Sensor Boards, des I2C GPS Empfängers, des 3D Accelerometer Moduls und des Gyro Moduls&amp;lt;br/&amp;gt;&lt;br /&gt;
Mon, 17. Mär 2014 - Das RP6 Sensor Board ist &amp;quot;nicht lieferbar&amp;quot;, neuer Liefertermin angekündigt für den 12.06.2014 (!?)&amp;lt;br/&amp;gt;&lt;br /&gt;
Die, 25. Mär 2014 - Das RP6 Sensor Board ist wieder &amp;quot;sofort lieferbar&amp;quot;&amp;lt;br/&amp;gt;&lt;br /&gt;
August 2014 - Ein neues Xtra Modul wird von JM3 Engineering angekündigt: Das &amp;quot;Wetterstations Sensor Modul&amp;quot;&amp;lt;br/&amp;gt;&lt;br /&gt;
November 2014 - Das &amp;quot;Wetterstations Sensor Modul&amp;quot; ist bei [http://www.jm3-engineering.com/sensors.htm JM3 Engineering] als &amp;quot;BHT Modul&amp;quot; abgebildet und ein Manual verfügbar&amp;lt;br/&amp;gt;&lt;br /&gt;
Don, 22. Jan 2015 - Auslieferungsbeginn des BHT Moduls&amp;lt;br/&amp;gt;&lt;br /&gt;
Son, 18. Dez 2016 - Laut JM3 Engineering wird das 3D Accelerometer DIL Modul nicht mehr produziert, ist aber weiterhin erhältlich&amp;lt;br/&amp;gt;&lt;br /&gt;
Oktober 2017 - Das RP6 Sensor Board und der I2C GPS Empfänger sind bei CONRAD ausverkauft&amp;lt;br/&amp;gt;&lt;br /&gt;
April 2019 - Das Gyro Modul und das BHT Modul sind bei CONRAD ausverkauft&amp;lt;br/&amp;gt;&lt;br /&gt;
Mai 2020 - Die Experimentierplatine, das Backlight-Display, der Graustufen-Boden-Sensor, der Drehgeber-Satz RP6-ENCv3 und das 3D Accelerometer Modul sind bei CONRAD ausverkauft&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Allgemein==&lt;br /&gt;
Dieser Artikel beschreibt die Grundlagen und Programmierung des RP6 Sensor Boards und der RP6 Xtra Module. Dieses Erweiterungs-Modul und die Xtra Module sind Teile des RP6-Systems, das in den RN-Wissen-Artikeln [[RP6]], [[RP6v2]] und [[RP6_-_Programmierung|RP6 - Programmierung]] ausführlich beschrieben wird. Ausgegliedert aus den &amp;quot;Haupt-Artikeln&amp;quot; habe ich diese Module, da sie m.E. zu einer neuen &amp;quot;Ära&amp;quot; des RP6-Systems gehören:&lt;br /&gt;
&lt;br /&gt;
Sie wurden nicht mehr von '''[http://www.roboternetz.de/community/members/120-SlyD SlyD] (Dominik S. Herwald)''' in Zusammenarbeit mit '''[http://www.arexx.com/ AREXX]''' entwickelt, sondern ab 2013 von '''[http://jm3-engineering.com/ JM3 Engineering] (Dipl.-Ing. Jürgen Maisel)'''. Ab Februar 2014 waren dann das '''RP6 Sensor Board RP6-JM03-61''' ([http://www.conrad.de/ce/de/product/1082384/Arexx-RP6-Sensor-Board-RP6-JM03-61 1082384]) und die drei RP6 Xtra Module '''I2C GPS Empfänger JM3-GPS''' ([http://www.conrad.de/ce/de/product/1082385/Arexx-IC-GPS-Empfaenger-JM3-GPS 1082385]), '''Gyro Modul JM3-GYRO''' ([http://www.conrad.de/ce/de/product/1082386/Arexx-Gyro-Modul-JM3-GYRO 1082386]) und '''3D Accelerometer Modul JM3-3DA''' ([http://www.conrad.de/ce/de/product/1082387/Arexx-3D-Accelerometer-Modul-JM3-3DA 1082387]) bei CONRAD lieferbar. Einen ersten Eindruck vom Sensor Board kann man im RoboterNetz und AREXX Support Forum bekommen,- siehe unter [[RP6_Sensor_Board_und_Xtra_Module#Weblinks|Weblinks]]!&lt;br /&gt;
&lt;br /&gt;
===RP6 Sensor Board===&lt;br /&gt;
Das [[RP6_Sensor_Board_und_Xtra_Module#RP6_Sensor_Board_2|RP6 Sensor Board]] gehört zu den &amp;quot;Erweiterungs-Modulen&amp;quot; des RP6-Systems. '''Andere &amp;quot;Erweiterungs-Module&amp;quot; werden im [[RP6v2#Erweiterungs-Module|RP6v2]] und im [[RP6#Erweiterungs-Module|RP6]] Artikel beschrieben!'''&lt;br /&gt;
&lt;br /&gt;
Das ''RP6 Sensor Board'' ist das erste &amp;quot;Erweiterungs-Modul&amp;quot;, das nicht über einen eigenen Microprozessor verfügt,- es ist also ein ''passives Modul'', das von einem Microprozessor-System (z.B. RP6v2, M32, M128, M256 Wifi) angesteuert werden muss. Es ist ebenfalls das erste Modul, das nicht mehr über die rautenförmige Einbuchtung an der Vorderkante verfügt, sondern komplett rechteckig ist. Damit passt es (montiert auf den Standard-Abstandbolzen) nur auf den vorderen Platinenstapel 1 des RP6.&lt;br /&gt;
&lt;br /&gt;
===RP6 Xtra Module===&lt;br /&gt;
Die [[RP6_Sensor_Board_und_Xtra_Module#RP6_Xtra_Module_2|RP6 Xtra Module]] gehören zu den &amp;quot;Zubehör- und Ersatzteilen&amp;quot; des RP6-Systems. '''Über die weiteren &amp;quot;Zubehör- und Ersatzteile&amp;quot; zum RP6 informiert der entsprechende Abschnitt im [[RP6v2#Zubeh.C3.B6r_und_Ersatzteile|RP6v2]] und im [[RP6#Zubehör und Ersatzteile|RP6]] Artikel!'''&lt;br /&gt;
&lt;br /&gt;
Die ''RP6 Xtra Module'' unterscheiden sich von den weiteren &amp;quot;Zubehör- und Ersatzteilen&amp;quot; dadurch, dass sie selbstständige Sensor-Platinen sind, die ideal zum RP6-System passen, aber auch mit anderen Microcontroller-Plattformen nutzbar sind.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==RP6 Sensor Board==&lt;br /&gt;
Das RP6 Sensor Board RP6-JM03-61 ([http://www.conrad.de/ce/de/product/1082384/Arexx-RP6-Sensor-Board-RP6-JM03-61 1082384]) wurde am 27.11.2013 von [http://www.roboternetz.de/community/members/120-SlyD SlyD] angekündigt (siehe Weblink!).&lt;br /&gt;
&lt;br /&gt;
Aktuell (Oktober 2017) ist das RP6 Sensor Board bei CONRAD ausverkauft.&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_Sensor_Board.jpg|Das RP6 Sensor Board]]&lt;br /&gt;
&lt;br /&gt;
===Beschreibung===&lt;br /&gt;
(Laut Online-Katalog der Firma CONRAD!)&lt;br /&gt;
&lt;br /&gt;
''&amp;quot;Das RP6 Sensor Board erweitert die Möglichkeiten aller RP6 Roboter um wesentliche Sensorsignale für Robotik-Anwendungen wie zum Beispiel Dreharten (Yaw-Gyro), Kipp- und Neigewinkel, Kompassrichtung oder aber auch Zeit und Datum.&lt;br /&gt;
Sie können einfach mit zusätzlichen Sharp Sensoren Abstände genau messen, z.B. für autonome Fahrrouten oder falls der Sensor nach unten gerichtet ist, kann er Treppenstufen oder ähnliches entdecken. Außerdem gibt es die Möglichkeit z.B. die Sharp Sensoren ein- bzw. auszuschalten um Strom zu sparen. Zusätzlich können bis zu 8 Servos angesteuert werden um z.B. einen Roboterarm zu bewegen, der auch mechanisch einfach zu montieren ist. Um die Möglichkeiten des RP6 Sensor Boards komplett ausnutzen zu können, wird ein RP6V2 und RP6Wifi Control Board empfohlen. Die ermöglicht den Roboter über Wifi fernzusteuern oder Sensordaten auf dem Kommandozentrum (PC) z.B Kompassdaten, Temperatur oder Kipp- und Neigewinkel anzeigen zu lassen.&amp;quot;''&lt;br /&gt;
&lt;br /&gt;
'''Ausstattung'''&lt;br /&gt;
* Magnetometer- und Accelerometer für Kompassfunktion&lt;br /&gt;
* Gyro Sensor (Yaw)&lt;br /&gt;
* Sharp-Sensor Schnittstelle&lt;br /&gt;
* LED Scheinwerfer&lt;br /&gt;
* LED Treiber mit Smart Funktionen&lt;br /&gt;
* I²C Bus mit max. 400 kHz Übertragungsrate; Hot Swap I²C-Bus Buffer&lt;br /&gt;
* Taster mit LED&lt;br /&gt;
* Echtzeit-Uhr RTC&lt;br /&gt;
* Backupbatterie (Aufladung während des Betriebs)&lt;br /&gt;
* Expansion Port z.B. für GPS-I²C Bus Modul&lt;br /&gt;
* 8 Servo-Ausgänge mit eigenem Schaltregler&lt;br /&gt;
* 8 PWM Ausgänge&lt;br /&gt;
* 5 LED Ausgänge und 2 Digital-I/O Ausgänge.&lt;br /&gt;
&lt;br /&gt;
'''Lieferumfang'''&lt;br /&gt;
* RP6 Sensor Board&lt;br /&gt;
* Montage-Kit&lt;br /&gt;
* Kabel&lt;br /&gt;
* Anleitung und CD mit Dokumentation.&lt;br /&gt;
&lt;br /&gt;
====Blockschaltbild====&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_Sensor_Board_BSP.png|RP6 Sensor Board Blockschaltbild]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Technische Daten===&lt;br /&gt;
{|  {{Blauetabelle}} &lt;br /&gt;
|'''Mikrocontroller:'''&lt;br /&gt;
|kein&lt;br /&gt;
|-&lt;br /&gt;
|'''Speicher:'''&lt;br /&gt;
|kein&amp;lt;br/&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|'''Programmierung:'''&lt;br /&gt;
|C++ (GCC, u.a.) über externes µC-System&lt;br /&gt;
|-&lt;br /&gt;
|'''Vorhandene Sensoren:'''&lt;br /&gt;
|Temperatur, 3D Magnetfeld (Kompass), 3D Beschleunigung, Yaw-Gyro&amp;lt;br/&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|'''Vorhandene Aktoren:'''&lt;br /&gt;
|LED Controller (2 LEDs on board, 5 freie LED Ports), Status LED,&amp;lt;br/&amp;gt;Button, Servo (PWM) Controller für 8 Servos und 8 PWM-Kanäle,&amp;lt;br/&amp;gt;Real Time Clock (RTC), 2 freie I/O Ports&lt;br /&gt;
|-&lt;br /&gt;
|'''Abmessungen:'''&lt;br /&gt;
|(L &amp;amp;times; B &amp;amp;times; H) 112 &amp;amp;times; 90 &amp;amp;times; 19 mm&amp;lt;br/&amp;gt;(B + 5 mm durch Scheinwerfer vorn)&lt;br /&gt;
|-&lt;br /&gt;
|'''Ausführung:'''&lt;br /&gt;
|Fertig aufgebautes Erweiterungsmodul&lt;br /&gt;
|-&lt;br /&gt;
|'''Stromversorgung:'''&lt;br /&gt;
|6 AA NiMH Akkus (über die RP6v2 Base)&amp;lt;br/&amp;gt;und optionaler Zusatzakku 7,2..10 V für Servo Power&lt;br /&gt;
|-&lt;br /&gt;
|'''Hersteller:'''&lt;br /&gt;
|Arexx Niederlande&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Umbau-Optionen===&lt;br /&gt;
Hier soll beschrieben werden, welche Umbau-Optionen es für das RP6 Sensor Board gibt. Im Text gibt es Verweise auf den Schaltplan des RP6 Sensor Boards (RP6_Sensor_Board_Rev2_Schema.pdf) in der Form: (SP2: Bauteil). Dies bedeutet, dass man das Bauteil auf Blatt 2 des Schaltplans finden kann. Beispielhaft sind im folgenden Text Bestell-Nummern der Firma [http://www.conrad.de/ce/ CONRAD] genannt. Natürlich kann man die Teile auch bei anderen Versendern beziehen.&lt;br /&gt;
&lt;br /&gt;
====USRBUS- und XBUS-Wannenstecker====&lt;br /&gt;
Der zweite Wannenstecker für den XBUS (SP3: K14) und USRBUS (SP3: K16) kann nachbestückt werden.&lt;br /&gt;
Man braucht dazu: &lt;br /&gt;
* 2 Wannenstecker 2x7-polig gerade RM 2,54mm (CONRAD [http://www.conrad.de/ce/de/product/741687/Stiftleiste-Print-Montage-gerade-Rastermass-254-mm-Pole-2-x-7-10120556-BKL-Electronic-Inhalt-1-St 741687])&lt;br /&gt;
Die Wannenstecker lötet man auf die eingezeichneten Positionen.&lt;br /&gt;
&lt;br /&gt;
'''USRBUS-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''USRBUS''' || '''Sensor Board-Funktion''' || '''Verwendung''' || '''I/O'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Y1 || &amp;quot;ADC0&amp;quot; || SHARP vorn || I&lt;br /&gt;
|-&lt;br /&gt;
| 2 || Y2 || &amp;quot;ADC1&amp;quot; || Yaw-Gyro || I&lt;br /&gt;
|-&lt;br /&gt;
| 3 || Y3 || PWR || Power für&amp;lt;br/&amp;gt;SHARPs, CAM_IF,&amp;lt;br/&amp;gt;I2C-MODULE || O&lt;br /&gt;
|-&lt;br /&gt;
| 4 || Y4 || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 5 || Y5 || &amp;quot;ADC4&amp;quot; || SHARP hinten ||I&lt;br /&gt;
|-&lt;br /&gt;
| 6..14 || Y6..Y14 || || keine ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
'''XBUS-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''XBUS''' || '''M256-Port''' ||'''M256-Funktion''' || '''Sensor Board-Funktion''' || '''Jumper''' || '''Verwendung''' || '''I/O'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || GND || || GND || GND || || ||&lt;br /&gt;
|-&lt;br /&gt;
| 2 || GND || || GND || GND || || ||&lt;br /&gt;
|-&lt;br /&gt;
| 3 || VDD || || VDD|| VDD_1 || || VDD +5V ||&lt;br /&gt;
|-&lt;br /&gt;
| 4 || +UB || || +UB || VSS_1 || || CAM_IF Power ||&lt;br /&gt;
|-&lt;br /&gt;
| 5 || VDD || || VDD || VDD_1 || || VDD +5V ||&lt;br /&gt;
|-&lt;br /&gt;
| 6 || +UB || || +UB || VSS_1 || || CAM_IF Power ||&lt;br /&gt;
|-&lt;br /&gt;
| 7 || INTU || PJ4 || PCINT13 || INTU || || keine || I&lt;br /&gt;
|-&lt;br /&gt;
| 8 || INT1 || PJ3 || PCINT12 || INT1 || 3 || LSM303DLHC: INT1 || I&lt;br /&gt;
|-&lt;br /&gt;
| 9 || INT3 || PJ5 || PCINT14 || INT3 || 2&amp;lt;br/&amp;gt;5 || DS1339: SQW/INT_N&amp;lt;br/&amp;gt;LSM303DLHC: INT2 || I&amp;lt;br/&amp;gt;I&lt;br /&gt;
|-&lt;br /&gt;
| 10 || SCL || PD0 || SCL || SCL_M || || I2C-Bus || O&lt;br /&gt;
|-&lt;br /&gt;
| 11 || INT2 || PJ6 || PCINT15 || INT2 || 4 || MAX7311: INT_N || I&lt;br /&gt;
|-&lt;br /&gt;
| 12 || SDA || PD1 || SDA || SDA_M || || I2C-Bus || I/O&lt;br /&gt;
|-&lt;br /&gt;
| 13 || MRESET || || MRESET || MRESET || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 14 || GND || || GND || GND || || ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====I/O-Patchfield_1====&lt;br /&gt;
Dieses 2x 5-polige &amp;quot;Patchfield_1&amp;quot; (SP3: K8), beschriftet mit &amp;quot;I/O&amp;quot; liegt neben dem Wannenstecker I/O und weist dieselbe Belegung auf. Möchte man auf dem Sensor Board Verbindungen über den Wannenstecker I/O zu einer angeschlossenen Microprozessor-Platine herstellen, dann kann man auf das &amp;quot;Patchfield_1&amp;quot; eine Stiftleiste löten.&lt;br /&gt;
Man braucht dazu: &lt;br /&gt;
* 2-reihige Stiftleiste RM 2,54mm (z.B. 2x40-polig [http://www.conrad.de/ce/de/product/741306/Doppelreihige-Stiftleiste-RM-254-gerade-Pole-2-x-40-10120173-BKL-Electronic-Inhalt-1-St 741306]) &lt;br /&gt;
Man trennt von der 2-reihigen Stiftleiste 2x5 Kontakte ab und lötet sie auf die Lötpunkte &amp;quot;I/O&amp;quot;. Zuvor muss man u.U. Lötzinnreste aus den Lötpunkten mit Entlötlitze bzw. Entlötsaugpumpe entfernen.&lt;br /&gt;
&lt;br /&gt;
'''Stecker I/O an M256 IO_PWM/T0/T1:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''M256-Port''' ||'''M256-Funktion''' || '''Sensor Board-Funktion''' || '''Verwendung''' || '''I/O'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || PD4 || ICP1 || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 2 || || GND || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 3 || PD6 || T1 || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 4 || PB7 || OC0A || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 5 || PG5 || OC0B || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 6 || PD7 || T0 || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 7 || PB5 || OC1A || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 8 || PK5 || ADC13 || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 9 || PB6 || OC1B || &amp;quot;PD5&amp;quot; || I2C Bus Buffer Enable || O&lt;br /&gt;
|-&lt;br /&gt;
| 10 || || VDD || || keine ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====ADC-Patchfield_2====&lt;br /&gt;
Dieses 2x 5-polige &amp;quot;Patchfield_2&amp;quot; (SP3: K9), beschriftet mit &amp;quot;ADC&amp;quot; liegt neben dem Wannenstecker ADC und weist dieselbe Belegung auf. Möchte man auf dem Sensor Board Verbindungen über den Wannenstecker ADC zu einer angeschlossenen Microprozessor-Platine herstellen, dann kann man auf das &amp;quot;Patchfield_2&amp;quot; eine Stiftleiste löten.&lt;br /&gt;
Man braucht dazu: &lt;br /&gt;
* 2-reihige Stiftleiste RM 2,54mm (z.B. 2x40-polig [http://www.conrad.de/ce/de/product/741306/Doppelreihige-Stiftleiste-RM-254-gerade-Pole-2-x-40-10120173-BKL-Electronic-Inhalt-1-St 741306]) &lt;br /&gt;
Man trennt von der 2-reihigen Stiftleiste 2x5 Kontakte ab und lötet sie auf die Lötpunkte &amp;quot;ADC&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
'''Stecker ADC an M256 ADC_IO2/CMP:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''M256-Port''' ||'''M256-Funktion''' || '''Sensor Board-Funktion''' || '''Jumper''' || '''Verwendung''' || '''I/O'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || PK0 || ADC8 || || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 2 || || GND || || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 3 || PK1 || ADC9 || &amp;quot;ADC4&amp;quot; || 6 || SHARP hinten || I&lt;br /&gt;
|-&lt;br /&gt;
| 4 || PE3 || OC3A/AIN1 || || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 5 || PK2 || ADC10 || || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 6 || || GND || || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 7 || PK3 || ADC11 || || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 8 || PE2 || XCK0/AIN0 || || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 9 || PK4 || ADC12 || || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 10 || || VDD || || || keine ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Anschluss-Optionen===&lt;br /&gt;
Hier soll beschrieben werden, welche Anschluss-Optionen es für das RP6 Sensor Board gibt. In erster Linie geht es dabei um die Belegung der vorhandenen Stecker bzw. Stiftleisten.&lt;br /&gt;
&lt;br /&gt;
Allgemein kann man Anschlüsse an Stiftleisten mit entsprechenden Steckbuchsen erreichen. Solche Steckbuchsen sind z.B. bei ELV erhältlich:&lt;br /&gt;
* Steckbuchse, 2-polig, RM 2,54mm ([http://www.elv.de/steckbuchse-2-polig.html ELV 68-016635])&lt;br /&gt;
* Steckbuchse, 3-polig, RM 2,54mm ([http://www.elv.de/steckbuchse-3-polig.html ELV 68-022503])&lt;br /&gt;
* Steckbuchse, 5-polig, RM 2,54mm ([http://www.elv.de/steckbuchse-5-polig.html ELV 68-023073])&lt;br /&gt;
Die Crimpkontakte dieser Steckbuchse werden an Litzen angequetscht (oder angelötet) und zum entsprechenden Sensor bzw. Aktor geführt. &lt;br /&gt;
&lt;br /&gt;
====I2C-MODULE====&lt;br /&gt;
Der I2C-MODULE Anschluss (SP1: M1) auf dem Sensor Board besteht aus einer 9-poligen Präzisions-Buchsenleiste RM 2,54mm (z.B. [http://www.conrad.de/ce/de/product/741360/Praezisions-Buchsenleiste-RM-254-gerade-Pole-1-x-20-10120832-BKL-Electronic-Inhalt-1-St 741360]). Wenn man eigene I2C-Module hier anschliessen will, braucht man zur Kontaktierung:&lt;br /&gt;
* Präzisions-Stiftleiste, 9-polig, RM 2,54mm (z.B. [http://www.conrad.de/ce/de/product/741307/Praezisions-Stiftleiste-RM-254-gerade-Pole-1-x-20-10120536-BKL-Electronic-Inhalt-1-St 741307])&lt;br /&gt;
&lt;br /&gt;
'''I2C-MODULE-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''Sensor Board&amp;lt;br/&amp;gt;-Funktion (M1)''' || '''Verwendung''' || '''I/O''' |||| [[RP6_Sensor_Board_und_Xtra_Module#I2C_GPS_Empf.C3.A4nger_JM3-GPS|'''I2C GPS Empfänger]]&amp;lt;br/&amp;gt;-Funktion (K1)''' ||&lt;br /&gt;
[[RP6_Sensor_Board_und_Xtra_Module#BHT_Modul_JM3-BHT31|'''BHT Modul]]&amp;lt;br/&amp;gt;-Funktion (K1)'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || VCC || +5V || |||| VCC_1 || VDD&lt;br /&gt;
|-&lt;br /&gt;
| 2 || SCLOUT || Buffered I2C-Bus || O |||| SCL/SCK || SCL&lt;br /&gt;
|-&lt;br /&gt;
| 3 || SDAOUT || Buffered I2C-Bus || I/O |||| SDA/MOSI || SDA&lt;br /&gt;
|-&lt;br /&gt;
| 4 || NC || keine || |||| ||&lt;br /&gt;
|-&lt;br /&gt;
| 5 || I/O1 || Status LED || O |||| ||&lt;br /&gt;
|-&lt;br /&gt;
| 6 || I/O2 || Taster || I |||| ||&lt;br /&gt;
|-&lt;br /&gt;
| 7 || NC || keine || |||| ||&lt;br /&gt;
|-&lt;br /&gt;
| 8 || GND || GND (geschaltet!) || |||| GND || GND&lt;br /&gt;
|-&lt;br /&gt;
| 9 || GND || GND (geschaltet!) || |||| GND || GND&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====CAM_IF====&lt;br /&gt;
Der CAM_IF Anschluss (SP1: K28) ist eine 2x 3-polige Stiftleiste mit der folgenden Belegung:&lt;br /&gt;
&lt;br /&gt;
'''CAM_IF-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''Sensor Board&amp;lt;br/&amp;gt;-Funktion (K28)''' || '''Verwendung''' || '''I/O'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || GND || GND (geschaltet!) ||&lt;br /&gt;
|-&lt;br /&gt;
| 2 || VSS_1 || +7,2..10V (RP6: +UB) ||&lt;br /&gt;
|-&lt;br /&gt;
| 3 || SCLOUT || Buffered I2C-Bus || O&lt;br /&gt;
|-&lt;br /&gt;
| 4 || SDAOUT || Buffered I2C-Bus || I/O&lt;br /&gt;
|-&lt;br /&gt;
| 5 || SCL_M || I2C-Bus || O&lt;br /&gt;
|-&lt;br /&gt;
| 6 || SDA_M || I2C-Bus || I/O&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====IO_EXT====&lt;br /&gt;
Der IO_EXT Anschluss (SP1: K19) ist eine 2x 2-polige Stiftleiste mit der folgenden Belegung:&lt;br /&gt;
&lt;br /&gt;
'''IO_EXT-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''Sensor Board&amp;lt;br/&amp;gt;-Funktion (K19)''' || '''Verwendung''' || '''I/O'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || MAX7311: I/O1.2 || freier I/O Port || I/O&lt;br /&gt;
|-&lt;br /&gt;
| 2 || GND || ||&lt;br /&gt;
|-&lt;br /&gt;
| 3 || MAX7311: I/O1.1 || freier I/O Port || I/O&lt;br /&gt;
|-&lt;br /&gt;
| 4 || GND || ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====PWM_OUT====&lt;br /&gt;
Der PWM_OUT Anschluss (SP5: K12) ist eine 2x 4-polige Stiftleiste mit der folgenden Belegung:&lt;br /&gt;
&lt;br /&gt;
'''PWM_OUT-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''Sensor Board&amp;lt;br/&amp;gt;-Funktion (K12)''' || '''Verwendung''' || '''I/O'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || PCA9685: PWM0 || freier PWM Port || O&lt;br /&gt;
|-&lt;br /&gt;
| 2 || PCA9685: PWM1 || freier PWM Port || O&lt;br /&gt;
|-&lt;br /&gt;
| 3 || PCA9685: PWM2 || freier PWM Port || O&lt;br /&gt;
|-&lt;br /&gt;
| 4 || PCA9685: PWM3 || freier PWM Port || O&lt;br /&gt;
|-&lt;br /&gt;
| 5 || PCA9685: PWM4 || freier PWM Port || O&lt;br /&gt;
|-&lt;br /&gt;
| 6 || PCA9685: PWM5 || freier PWM Port || O&lt;br /&gt;
|-&lt;br /&gt;
| 7 || PCA9685: PWM6 || freier PWM Port || O&lt;br /&gt;
|-&lt;br /&gt;
| 8 || PCA9685: PWM7 || freier PWM Port || O&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====TP1====&lt;br /&gt;
Am Testpunkt TP1 (SP4: TP1) kann man das Signal SQW/INT_N der RTC (DS1339) prüfen/messen.&lt;br /&gt;
&lt;br /&gt;
====LEDs====&lt;br /&gt;
=====Rücklichter=====&lt;br /&gt;
Der Rücklichter Anschluss (SP1: K10) ist eine 2-polige Stiftleiste mit der folgenden Belegung:&lt;br /&gt;
&lt;br /&gt;
'''Rücklichter-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''Sensor Board&amp;lt;br/&amp;gt;-Funktion (K10)''' || '''Verwendung''' || '''I/O'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || TCA6507: P3 || Rücklicht rechts || O&lt;br /&gt;
|-&lt;br /&gt;
| 2 || TCA6507: P4 || Rücklicht links || O&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=====Display-Hintergrundbeleuchtung=====&lt;br /&gt;
Der Display-Hintergrundbeleuchtung Anschluss (SP1: K7) ist eine 2-polige Stiftleiste mit der folgenden Belegung:&lt;br /&gt;
&lt;br /&gt;
'''Display-Hintergrundbeleuchtung-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''Sensor Board&amp;lt;br/&amp;gt;-Funktion (K7)''' || '''Verwendung''' || '''I/O'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || TCA6507: P0 || Display-Hintergrundbeleuchtung || O&lt;br /&gt;
|-&lt;br /&gt;
| 2 || VDD_1 || +5V ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=====Freie Ausgänge=====&lt;br /&gt;
Der freie Ausgang 1 Anschluss (SP1: K4) ist eine 2-polige Stiftleiste mit der folgenden Belegung:&lt;br /&gt;
&lt;br /&gt;
'''Freier Ausgang 1-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''Sensor Board&amp;lt;br/&amp;gt;-Funktion (K4)''' || '''Verwendung''' || '''I/O'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || TCA6507: P1 || freier LED Port || O&lt;br /&gt;
|-&lt;br /&gt;
| 2 || VDD_1 || +5V ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Der freie Ausgang 2 Anschluss (SP1: K2) ist eine 2-polige Stiftleiste mit der folgenden Belegung:&lt;br /&gt;
&lt;br /&gt;
'''Freier Ausgang 2-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''Sensor Board&amp;lt;br/&amp;gt;-Funktion (K2)''' || '''Verwendung''' || '''I/O'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || TCA6507: P2 || freier LED Port || O&lt;br /&gt;
|-&lt;br /&gt;
| 2 || VDD_1 || +5V ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====SHARP Sensoren====&lt;br /&gt;
Das RP6 Sensor Board verfügt über zwei Stecker SHARP_F (SP1: K5) und SHARP_R (SP1: K3) zum Anschluß von analogen SHARP Infrarot-Distanz-Sensoren. Folgende SHARP Sensoren sind anschließbar:&lt;br /&gt;
* 1. SHARP Distanz-Sensor GP2Y0A41SK0F ([http://www.conrad.de/ce/de/product/504596/Distanz-Sensor-GP2Y0A41SK0F-Sharp-GP2Y0A41SK0F-Messbereiche-Erfassungsbereich-4-30-cm-5-VDC 504596]), Messbereich 4..30cm&lt;br /&gt;
* 2. SHARP Distanz-Sensor GP2Y0A21YK0F ([http://www.conrad.de/ce/de/product/504591/Distanz-Sensor-GP2Y0A21YK0F-Sharp-GP2Y0A21YK0F-Messbereiche-Erfassungsbereich-10-80-cm-5-VDC 504591]), Messbereich 10..80cm&lt;br /&gt;
* 3. SHARP Distanz-Sensor GP2Y0A02YK ([http://www.conrad.de/ce/de/product/185364/Distanz-Sensor-GP-2-Y0A-02-YK-Sharp-GP-2-Y0A-02-YK-Messbereiche-Erfassungsbereich-20-150-cm-5-VDC 185364]), Messbereich 20..150cm&lt;br /&gt;
* 4. SHARP Distanz-Sensor GP2Y0A710K0F ([http://www.conrad.de/ce/de/product/504597/Distanz-Sensor-GP2Y0A710K0F-Sharp-GP2Y0A710K0F-Messbereiche-Erfassungsbereich-100-550-cm-5-VDC 504597]), Messbereich 100..550cm&lt;br /&gt;
''Die Auswahl der geeigneten SHARP Sensoren hängt von der gewünschten Funktion ab: Zur Erkundung großer Räume eignet sich insbesondere der Typ 4 mit einer hohen Reichweite von 5,5m. Er ist aber ungeeignet, die Distanz von Objekten zu erkennen, die sich näher als 1m vor dem Sensor befinden. Ein guter Kompromiss zwischen Nahbereichsmessung und &amp;quot;Fernsicht&amp;quot; sind die Typen 2 (10..80cm) und 3 (20..150cm). Will man den Distanz-Sensor vor allem zur Vermeidung eins Sturzes von einer Treppe (Tiefenerkennung) oder nur zur Erkennung von Hindernissen direkt vor dem Roboter (Kollisionserkennung) benutzen, dann eignet sich insbesondere für den vorderen Sensor (SHARP_F) der Typ 1, da er im Nahbereich von 4 bis 30cm messen kann.''&lt;br /&gt;
&lt;br /&gt;
Für die Verbindung zwischen den beiden 3-poligen JST XH Steckern (K3, 5) auf dem Sensor Board und den SHARP-Sensoren braucht man auf der Sensor Board Seite folgende Stecker-/buchsenteile:&lt;br /&gt;
* 2x JST XH Gehäuse, 3-polig, RM 2,5mm ([http://www.conrad.de/ce/de/product/740583/Gehaeuse-RM-25-mm-Serie-XH-Rastermass-25-mm-Pole-3-Nennstrom-3-A-XHP-3-JST-Inhalt-1-St 740583])&lt;br /&gt;
* 6x JST XH Crimpkontakt f. RM 2,5mm ([http://www.conrad.de/ce/de/product/741112/Crimpkontakt-fuer-RM-25-mm-Serie-XH-Rastermass-25-mm-BXH-001T-P06-JST-Inhalt-1-St 741112])&lt;br /&gt;
Die Crimpkontakte dieser Steckbuchse werden an die meist 3-adrige Litze des Sensors angequetscht (oder angelötet). Zur Belegung des Sensor Anschlusses siehe das jeweilige Datenblatt!&lt;br /&gt;
&lt;br /&gt;
=====Vorn=====&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_Sensor_Board_SHARP_F.JPG|RP6 Sensor Board SHARP Sensor vorn|thumb]]&lt;br /&gt;
&lt;br /&gt;
Der vordere SHARP Sensor kann auch mechanisch am Sensor Board befestigt werden. Dazu gibt es an der Vorderkante der Platine zwei Befestigungslöcher.&lt;br /&gt;
&lt;br /&gt;
Das Bild rechts zeigt den SHARP Distanzsensor GP2Y0A02YK montiert vorn auf dem Sensor Board mit zwei M3 Gelenkbolzen ([http://www.conrad.de/ce/de/product/521043/Gelenkbolzen-1-x-Aussengewinde1-x-Innengewinde-Messing-vernickelt-Schluesselweite-55-mm/ 521043]) und passenden Schrauben/Muttern.&lt;br /&gt;
&lt;br /&gt;
'''Vorn-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''RP6v2-Port''' ||'''RP6v2-Funktion''' || '''Sensor Board&amp;lt;br/&amp;gt;-Funktion (K5)''' || '''Verwendung''' || '''I/O''' |||| '''SHARP Sensor&amp;lt;br/&amp;gt;-Funktion''' &lt;br /&gt;
|-&lt;br /&gt;
| 1 || PA0 || ADC0 || &amp;quot;ADC0&amp;quot; || SHARP vorn || I |||| Vo&lt;br /&gt;
|-&lt;br /&gt;
| 2 || || || VDD_1 || +5V || |||| Vcc&lt;br /&gt;
|-&lt;br /&gt;
| 3 || || || GND || GND (geschaltet!) || |||| GND&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=====Hinten=====&lt;br /&gt;
Der hintere SHARP Sensor kann z.B. an der Rückseite des RP6v2 Fahrgestells befestigt werden.&lt;br /&gt;
&lt;br /&gt;
'''Hinten-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''M256-Port''' ||'''M256-Funktion''' || '''Sensor Board&amp;lt;br/&amp;gt;-Funktion (K3)''' || '''Verwendung''' || '''I/O''' |||| '''SHARP Sensor&amp;lt;br/&amp;gt;-Funktion''' &lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| 1 || PK1 || ADC9 || &amp;quot;ADC4&amp;quot; || SHARP hinten || I |||| Vo&lt;br /&gt;
|-&lt;br /&gt;
| 2 || || || VDD_1 || +5V || |||| Vcc&lt;br /&gt;
|-&lt;br /&gt;
| 3 || || || GND || GND (geschaltet!) || |||| GND&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Servos====&lt;br /&gt;
=====Power=====&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_Sensor_Board_Servo-PWR.jpg|RP6 Sensor Board Servo-PWR Stecker|thumb]]&lt;br /&gt;
&lt;br /&gt;
An den SERVO_PWR Stecker (SP5: K1) muss ein Akku zur Stromversorgung der mit dem Sensor Board verbundenen Servos angeschlossen werden. Der Stecker hat folgende Belegung:&lt;br /&gt;
 &lt;br /&gt;
'''SERVO_PWR-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''Sensor Board&amp;lt;br/&amp;gt;-Funktion (K1)''' || '''Verwendung'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || GND_POWER || Servo Power GND&lt;br /&gt;
|-&lt;br /&gt;
| 2 || VSS_POWER || Servo Power Eingang +7,2..10V&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Der Akku zur Versorgung der Servos muss eine Nennspannung von 7,2..10V aufweisen. Der Schaltregler auf dem Sensor Board kann bei einer 5,0V Servo-Spannung Ströme bis 3,0A (Spitzen bis 5,0A) liefern. '''Die Polung des Akkus darf am Stecker SERVO_PWR nicht vertauscht werden.''' Siehe den oberen Teil der nebenstehenden Abbildung! Ratsam ist es, eine Sicherung 3,15A in die Plusleitung zwischen Akku und SERVO_PWR Stecker zu legen.&lt;br /&gt;
&lt;br /&gt;
Für die Verbindung zwischen dem 2-poligen JST XH Stecker (SERVO_PWR, K1) auf dem Sensor Board und dem Akku braucht man auf der Sensor Board Seite folgende Stecker-/buchsenteile:&lt;br /&gt;
* JST XH Gehäuse, 2-polig, RM 2,5mm ([http://www.conrad.de/ce/de/product/740549/Gehaeuse-RM-25-mm-Serie-XH-Rastermass-25-mm-Pole-2-Nennstrom-3-A-XHP-2-JST-Inhalt-1-St 740549])&lt;br /&gt;
* 2x JST XH Crimpkontakt f. RM 2,5mm ([http://www.conrad.de/ce/de/product/741112/Crimpkontakt-fuer-RM-25-mm-Serie-XH-Rastermass-25-mm-BXH-001T-P06-JST-Inhalt-1-St 741112])&lt;br /&gt;
Die Crimpkontakte dieser Steckbuchse werden an die 2-adrige Litze zum Akku angequetscht (oder angelötet).&lt;br /&gt;
&lt;br /&gt;
Wenn man keinen separaten Akku zur Versorgung der Servos nehmen will, kann man auch +UB der RP6v2 Base dafür nutzen. An +UB liegt die Akkuspannung der Base (Nennspannung 7,2V) über eine Sicherung F1 3,15A (RP6v2) bzw. 2,5A (RP6) auf dem Mainboard an. +UB kann man z.B. am [[RP6#EXT_Anschlu.C3.9F|EXT Anschluß der Base]] entnehmen. Die nebenstehende Abbildung zeigt im unteren Teil, an welchen Pins man dort +UB kontaktieren kann!&lt;br /&gt;
&lt;br /&gt;
Dabei ist zu beachten, dass die Sicherung F1 auf dem RP6(v2) Mainboard den nutzbaren Strom für die Servos deutlich begrenzt: Durch diese Sicherung fließt ja nicht nur der Servo-Strom, sondern auch der Strom für den RP6 und alle darauf montierten Zusatzplatinen. Wenn der RP6 also herumfährt und z.B. noch die IRCOMM-Sendedioden nutzt, bleibt kaum noch Stromreserve für die Servos auf dem Sensor Board übrig.&lt;br /&gt;
'''Das bedeutet: Man sollte unbedingt einen separaten Akku für die Servos auf dem Sensor Board benutzen!'''&lt;br /&gt;
&lt;br /&gt;
======SERVO_PWR-EXT Verbindung======&lt;br /&gt;
Für die Verbindung zwischen dem 2-poligen JST XH Stecker (SERVO_PWR, K1) auf dem Sensor Board und dem 8-poligen JST XH Stecker (EXT) auf dem RP6v2 Mainboard braucht man folgende Stecker-/buchsenteile:&lt;br /&gt;
* JST XH Gehäuse, 2-polig, RM 2,5mm ([http://www.conrad.de/ce/de/product/740549/Gehaeuse-RM-25-mm-Serie-XH-Rastermass-25-mm-Pole-2-Nennstrom-3-A-XHP-2-JST-Inhalt-1-St 740549])&lt;br /&gt;
* JST XH Gehäuse, 8-polig, RM 2,5mm ([http://www.conrad.de/ce/de/product/740928/Gehaeuse-RM-25-mm-Serie-XH-Rastermass-25-mm-Pole-8-Nennstrom-3-A-XHP-8-JST-Inhalt-1-St 740928])&lt;br /&gt;
* 10x JST XH Crimpkontakt f. RM 2,5mm ([http://www.conrad.de/ce/de/product/741112/Crimpkontakt-fuer-RM-25-mm-Serie-XH-Rastermass-25-mm-BXH-001T-P06-JST-Inhalt-1-St 741112])&lt;br /&gt;
Mit einer 2-adrigen Litze, die beidseits mit den Crimpkontakten verquetscht (oder verlötet) wird, verbindet man dann den SERVO_PWR Stecker mit dem EXT Stecker, wie in der Abbildung oben gezeigt. ''Achtung: Plus (+) und Minus (-) nicht vertauschen!''&lt;br /&gt;
 Ein passendes Kabel soll zukünftig (*) mitgeliefert werden.&lt;br /&gt;
&lt;br /&gt;
Auf dem RP6 Mainboard ist der 8-polige EXT Stecker noch nicht bestückt. Wenn man ihn nachrüsten will, muss man noch bestellen:&lt;br /&gt;
* JST XH Stiftleiste gerade, 8-polig, RM 2,5mm ([http://www.conrad.de/ce/de/product/740105/Stiftleiste-gerade-RM-25-mm-Serie-XH-Rastermass-25-mm-Pole-8-Nennstrom-3-A-B8B-XH-A-LFSN-JST-Inhalt-1-St 740105])&lt;br /&gt;
Die Stiftleiste wird auf das RP6 Mainboard gelötet, dabei weisen die beiden Einkerbungen an einer Längsseite der Stiftleiste nach hinten zum Rand des Mainboards.&lt;br /&gt;
 Auch diese Stiftleiste soll zukünftig (*) zum Lieferumfang gehören.&lt;br /&gt;
'''Zu *)''' Meinem RP6 Sensor Board (bestellt am 1.3.2014) lag das konfektionierte Kabel und die Stiftleiste noch nicht bei!&lt;br /&gt;
&lt;br /&gt;
=====Stecker=====&lt;br /&gt;
An die acht 3-poligen Stiftleisten SERVO_1 bis SERVO_8 (SP5: K6, 11, 29..34) können Servos angeschlossen werden. Direkt aufstecken kann man Servo-Steckbuchsen mit der Belegung von CONRAD, Graupner/JR und Robbe/Futaba (Versorgungsspannung Plus am mittleren Pin). Auf der Sensor Board Platine kann man den Pin 3 (Servo Power GND) der 3-poligen Stiftleisten daran erkennen, dass er näher zum rechten Platinenrand (Seite mit dem XBUS Stecker) angeordnet ist als der zugehörige Pin 1 (Servo Signal).&lt;br /&gt;
&lt;br /&gt;
Wenn Servos mit nicht passender Steckbuchse angeschlossen werden sollen, dann braucht man auf der Sensor Board Seite folgende Stecker-/buchsenteile für jedes Servo:&lt;br /&gt;
* Steckbuchse, 3-polig, RM 2,54mm ([http://www.elv.de/steckbuchse-3-polig.html ELV 68-022503])&lt;br /&gt;
Die Crimpkontakte dieser Steckbuchse werden an die 3-adrige Litze des Servos angequetscht (oder angelötet). &lt;br /&gt;
&lt;br /&gt;
'''SERVO_1..8-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''Sensor Board&amp;lt;br/&amp;gt;-Funktion (K6,11,29..34)''' || '''Verwendung''' || '''I/O''' |||| '''Servo-&amp;lt;br/&amp;gt;Kabelfarben'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || PCA9685: PWM15..8 || Servo Signal || O |||| Weiß, Orange&lt;br /&gt;
|-&lt;br /&gt;
| 2 || Servo_PWR || Servo Power +5V (geschaltet!) || |||| Rot&lt;br /&gt;
|-&lt;br /&gt;
| 3 || GND_POWER || Servo Power GND || |||| Schwarz, Braun&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Roboterarm RA2-HOBBY====&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_Sensor_Board_RA2-MINI.JPG|RP6 Sensor Board mit Roboterarm RA2-MINI|thumb]]&lt;br /&gt;
&lt;br /&gt;
In der Anleitung zum RP6 Sensor Board ist der Arexx Roboterarm RA2-HOBBY bzw. RA2-MINI [http://www.conrad.de/ce/de/product/191534/Arexx-Mini-Roboterarm-RA2-MINI (191534)] abgebildet. Er ist dort ohne Grundgestell und Controller-Platine auf dem Sensor Board befestigt.&lt;br /&gt;
Das Sensor Board eignet sich sehr gut zur Ansteuerung der 6 Servos des Roboterarms.&lt;br /&gt;
&lt;br /&gt;
Zur Montage des RA2-MINI auf dem Sensor Board geht man so vor:&lt;br /&gt;
* Lösen der 4 Rundkopfschrauben M3x6, die die Servobodenplatte mit den Abstandbolzen M3x30 auf der Controller-Platine verbinden (siehe Anleitung zum RA2-MINI, Seite 19!)&lt;br /&gt;
* Lösen der Servobodenplatte vom Bodenservo (siehe Anleitung zum RA2-MINI, Seite 8!)&lt;br /&gt;
* Bohren der Befestigungslöcher in die Servobodenplatte:&lt;br /&gt;
** Rechts-Links Lochabstand 4,75cm, Vorn-Hinten Lochabstand 4,1cm&lt;br /&gt;
** Ungefähre Lage der Löcher siehe Abbildung in der Anleitung zum Sensor Board, Seite 4!&lt;br /&gt;
** Markierung der Bohrlöcher auf der Rückseite der Servobodenplatte:&lt;br /&gt;
*** 1. Mit einer Hilfslinie die Hinterkante des Servoausschnitts (das ist die kürzere Kante, die näher am Rand der Bodenplatte liegt!) nach beiden Seiten verlängern&lt;br /&gt;
*** 2. Eine 2. Hilfslinie parallel zur ersten im Abstand von 1,4cm zur Mitte der Servobodenplatte hin einzeichnen&lt;br /&gt;
*** 3. Auf dieser Linie jetzt die beiden hinteren Bohrlöcher symmetrisch im Abstand von 4,75cm markieren&lt;br /&gt;
*** 4. Für die vorderen Bohrlöcher eine 3. Hilfslinie im Abstand von 4,1cm parallel zur 2. Linie einzeichnen&lt;br /&gt;
*** 5. Auf dieser Linie die beiden vorderen Bohrlöcher symmetrisch im Abstand von 4,75cm markieren&lt;br /&gt;
*** 6. Kontrolle: Die 4 markierten Bohrlochpositionen bilden ein Rechteck mit 4,1cm seitlicher und 4,75cm vorderer/hinterer Kantenlänge&lt;br /&gt;
** Bohren der 4 Löcher (D = 3,2mm) in die Servobodenplatte&lt;br /&gt;
* Befestigen des Bodenservos auf der Servobodenplatte (siehe Anleitung zum RA2-MINI, Seite 8!)&lt;br /&gt;
* Anbringen des Roboterarms auf dem Sensor Board mit 4 Abstandbolzen M3 (L = 30..50mm) und passenden Schrauben/Muttern&lt;br /&gt;
&lt;br /&gt;
Die Servo-Steckbuchsen werden dann ''in der selben Reihenfolge (S1..S6) wie vorher auf der Controller-Platine des Roboterarms'' auf die Stiftleisten SERVO_1 bis SERVO_6 des Sensor Boards gesteckt.&lt;br /&gt;
'''Man sollte unbedingt einen separaten Akku für die Servos auf dem Sensor Board benutzen!'''&lt;br /&gt;
&lt;br /&gt;
====Grafik-Display====&lt;br /&gt;
Ob es mal ein Grafik-Display für das RP6 Sensor Board geben wird, ist ''pure Spekulation''. Allerdings gibt es zwei Hinweise darauf, dass eine solche Hardware-Ergänzung kommen könnte:&lt;br /&gt;
* 1. Der vorbereitete Anschluss für eine [[RP6_Sensor_Board_und_Xtra_Module#Display-Hintergrundbeleuchtung|Display-Hintergrundbeleuchtung]]&lt;br /&gt;
* 2. Die 4 Befestigungslöcher in der Mitte des Sensor Boards&lt;br /&gt;
Wir werden sehen ...&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==RP6 Xtra Module==&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_Xtra_module.JPG|RP6 Xtra module|right|500px]]&lt;br /&gt;
&lt;br /&gt;
Von den '''AREXX RP6 Xtra Modulen''' sind bei [http://www.conrad.de/ce/ CONRAD] für den RP6v2 erhältlich:&lt;br /&gt;
* Arexx [[RP6_Sensor_Board_und_Xtra_Module#I2C_GPS_Empf.C3.A4nger_JM3-GPS|I2C GPS Empfänger JM3-GPS]] ([http://www.conrad.de/ce/de/product/1082385/Arexx-IC-GPS-Empfaenger-JM3-GPS 1082385] AUSVERKAUFT!)&lt;br /&gt;
* Arexx [[RP6_Sensor_Board_und_Xtra_Module#Gyro_Modul_JM3-GYRO|Gyro Modul JM3-GYRO]] ([http://www.conrad.de/ce/de/product/1082386/Arexx-Gyro-Modul-JM3-GYRO 1082386] AUSVERKAUFT!)&lt;br /&gt;
* Arexx [[RP6_Sensor_Board_und_Xtra_Module#3D_Accelerometer_Modul_JM3-3DA|3D Accelerometer Modul JM3-3DA]] ([http://www.conrad.de/ce/de/product/1082387/Arexx-3D-Accelerometer-Modul-JM3-3DA 1082387] AUSVERKAUFT!)&lt;br /&gt;
* Arexx [[RP6_Sensor_Board_und_Xtra_Module#BHT_Modul_JM3-BHT31|BHT Modul JM3-BHT31]] ([http://www.conrad.de/ce/de/product/1302995/Arexx-Asuro-xTend-BHT-JM3-BHT31 1302995] AUSVERKAUFT!)&lt;br /&gt;
&lt;br /&gt;
===I2C GPS Empfänger JM3-GPS===&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_I2C_GPS_Empfänger.JPG|RP6 I2C GPS Empfänger|thumb]]&lt;br /&gt;
&lt;br /&gt;
(Laut Online-Katalog der Firma CONRAD!)&lt;br /&gt;
&lt;br /&gt;
''&amp;quot;Universelles GPS-I²C-Bus Modul für RP6 Roboter. Der GPS Empfänger stellt die NMEA-0183 Datensätze GGA, RMC, GSA und VTG in den veschiedenen Registern zur Verfügung. Damit ist eine einfache Weiterverarbeitung möglich.&amp;quot;''&lt;br /&gt;
&lt;br /&gt;
Aktuell (Oktober 2017) ist der I2C GPS Empfänger bei CONRAD ausverkauft.&lt;br /&gt;
&lt;br /&gt;
====Beschreibung====&lt;br /&gt;
Der I2C GPS Empfänger ist eine kleine (38 x 23 mm) Zusatzplatine (RP6 Xtra Modul), die direkt auf das [[RP6_Sensor_Board_und_Xtra_Module#RP6_Sensor_Board_2|RP6 Sensor Board]] aufgesteckt werden kann. Sie kann aber auch überall eingesetzt werden, wo eine stabilisierte 5V Versorgungsspannung und ein 5V-I2C-Bus bis 400 kHz zur Verfügung steht.&lt;br /&gt;
&lt;br /&gt;
Die Platine ist bestückt mit dem &amp;quot;Fastrax GPS antenna module&amp;quot; [https://www.u-blox.com/de/positioning-antennas/gnss-antenna-modules/uc530.html UC530]. Als Backup-Batterie dient eine wieder aufladbare Lithium-Batterie ([http://www.farnell.com/datasheets/321180.pdf MS621FE]). Zur Kommunikation zwischen dem UC530 und dem I2C-Bus ist ein [http://www.atmel.com/Images/Atmel-8303-8-bit-AVR-Microcontroller-tinyAVR-ATtiny1634_Datasheet.pdf ATtiny1634] an Bord, der auch die Auswertung des [http://de.wikipedia.org/wiki/NMEA_0183 NMEA Protokolls] übernimmt. Die 3,3 V Versorgungsspannung wird auf der Platine durch einen Spannungsregler ([http://www.mouser.com/ds/2/405/lm3480-316799.pdf LM3480IM3-3.3]) erzeugt. Über den I2C-Bus können folgende Daten der NMEA-0183 Datensätze GGA, RMC, GSA und VTG auf einfache Weise gelesen werden:&lt;br /&gt;
&lt;br /&gt;
* Geograf. Breite&lt;br /&gt;
* Geograf. Länge&lt;br /&gt;
* GPS Status&lt;br /&gt;
* HDOP&lt;br /&gt;
* Satellitenzahl&lt;br /&gt;
* Kurs&lt;br /&gt;
* Geschwindigkeit&lt;br /&gt;
* Höhe&lt;br /&gt;
* UTC-Zeit&lt;br /&gt;
* Datum&lt;br /&gt;
* PDOP&lt;br /&gt;
* VDOP&lt;br /&gt;
* Satellit 1..12&lt;br /&gt;
&lt;br /&gt;
Der ATtiny1634 ist natürlich vorprogrammiert, kann aber über eine vorbereitete 6-polige ISP-Schnittstelle auf der Platine auch umprogrammiert werden.&lt;br /&gt;
&lt;br /&gt;
'''Lieferumfang'''&lt;br /&gt;
* I2C GPS Empfänger&lt;br /&gt;
* CD mit Anleitung und Software-Beispielen.&lt;br /&gt;
&lt;br /&gt;
====Technische Daten====&lt;br /&gt;
* Versorgungsspannung: 5,0 V +/- 5%&lt;br /&gt;
* Stromverbrauch: &amp;lt;= 20 mA (typ.)&lt;br /&gt;
* I2C-Bus Geschwindigkeit: &amp;lt;= 400 kHz&lt;br /&gt;
* GPS Antenne: eingebaut&lt;br /&gt;
* Backup Batterie: Lithium, im Betrieb wieder aufladbar&lt;br /&gt;
* Temperatur Bereich: -10 bis 65 °C&lt;br /&gt;
* Form Faktor: 38 x 23 mm&lt;br /&gt;
* Gewicht: ca. 6 g&lt;br /&gt;
* Empfänger Spezifikationen (UC530):&lt;br /&gt;
** Empfänger: GPS L1 C/A-Code, SPS&lt;br /&gt;
** Kanäle: 66/22 (Suche/Track)&lt;br /&gt;
** Tracking Empfindlichkeit: -165 dBm typ.&lt;br /&gt;
** Navigations Empfindlichkeit: -148 dbm typ (Kaltstart)&lt;br /&gt;
** Update Rate: 1 Sek.&lt;br /&gt;
** Positions Genauigkeit:&lt;br /&gt;
*** 3,0m (67%) typ. horizontal&lt;br /&gt;
*** 5,0m (67%) typ. vertikal&lt;br /&gt;
*** 0,02 m/s (50%) typ. Geschwindigkeit&lt;br /&gt;
** Zeit bis zum ersten Fix: typ. 31 Sek.&lt;br /&gt;
** Protokoll: NMEA-0183 Rev. 3.01&lt;br /&gt;
&lt;br /&gt;
====Anschluss-Schema====&lt;br /&gt;
Belegung des 9-poligen Anschluss-Steckers (K1) siehe in [[RP6_Sensor_Board_und_Xtra_Module#I2C-MODULE|dieser]] Tabelle!&lt;br /&gt;
&lt;br /&gt;
====Umbau-Optionen====&lt;br /&gt;
Wenn man den ATtiny1634 selbst programmieren will, muss man Stiftleisten auf die Platine löten.&lt;br /&gt;
&lt;br /&gt;
Man braucht dazu: &lt;br /&gt;
* 2-reihige Stiftleiste RM 2,54mm (z.B. 2x40-polig 741306) &lt;br /&gt;
&lt;br /&gt;
Man trennt von der 2-reihigen Stiftleiste 2x3 Kontakte ab und lötet sie auf die Punkte &amp;quot;ISP6&amp;quot;.&lt;br /&gt;
Mit einem ISP-Programmer kann dann eine neue Firmware geflasht werden. Die aktuelle Firmware des ATtiny1634 (Version 1.2) wird als .HEX mitgeliefert, leider ohne Source-Code.&lt;br /&gt;
&lt;br /&gt;
Vorsicht: Dabei kann der Prozessor im schlimmsten Fall nicht mehr ansprechbar sein oder der GPS Empfänger UC530 beschädigt werden. Man sollte diesen Umbau und die ISP-Programmierung nur machen, wenn man genau weiß, was man macht! &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Gyro Modul JM3-GYRO===&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_Gyro_Modul.JPG|RP6 Gyro Modul|right|200px]]&lt;br /&gt;
&lt;br /&gt;
(Laut Online-Katalog der Firma CONRAD!)&lt;br /&gt;
&lt;br /&gt;
''&amp;quot;Das universelle Gyro-Sensor Modul für RP6, RP6 V2, RP6 ATMEGA32 und das RP6 V2 Control M256 Wifi-Kit ist ideal zur Erkennung der Blockierung des Roboters in seiner Drehbewegung, sowie der Stabilisierung der Geradeausfahrt.&amp;quot;''&lt;br /&gt;
&lt;br /&gt;
Aktuell (April 2019) ist das Gyro Modul bei CONRAD ausverkauft. &lt;br /&gt;
&lt;br /&gt;
====Beschreibung====&lt;br /&gt;
Das Gyro Modul ist eine kleine (19 x 17 mm) Zusatzplatine (RP6 Xtra Modul), die im RP6-System genutzt werden kann. Es gibt zwar keinen direkt passenden &amp;quot;Steckplatz&amp;quot; auf einer der Microcontroller-Plattformen (RP6v2, M32, M128, M256 Wifi), jedoch ist der Anschluß einfach:&lt;br /&gt;
Benötigt werden +5V und GND, sowie ein freier ADC-Kanal, der bis 5V messen kann. Damit kann das Gyro Modul sehr universell eingesetzt werden. Es misst die Drehrate um die Z-Achse (Hochachse oder Yaw).&lt;br /&gt;
&lt;br /&gt;
Die Platine ist bestückt mit dem analogen Gyro-Sensor [http://www.st.com/web/en/resource/technical/document/datasheet/CD00254111.pdf LY330ALH], dessen Ausgangsspannung durch zwei OP-Amps ([http://www.ti.com.cn/cn/lit/ds/symlink/lm321.pdf LM321], [http://www.produktinfo.conrad.com/datenblaetter/00000-24999/001072615-da-01-en-IC_AMP_PREC_LMP7731MF_NOPB_SOT_23_5_TID.pdf LMP7731MF]) in Ruhe bei 2,5 V liegt. Höhere Ausgangsspannungen (bis 5 V) bedeuten eine Drehgeschwindigkeit nach LINKS, niedrigere (bis 0 V) eine Drehgeschwindigkeit nach RECHTS. Die 3,3 V Versorgungsspannung des LY330ALH wird auf der Platine durch einen Spannungsregler ([http://www.mouser.com/ds/2/405/lm3480-316799.pdf LM3480IM3-3.3]) erzeugt.&lt;br /&gt;
&lt;br /&gt;
'''Lieferumfang'''&lt;br /&gt;
* Gyro Modul&lt;br /&gt;
* CD mit Anleitung und Software-Beispielen.&lt;br /&gt;
&lt;br /&gt;
====Technische Daten====&lt;br /&gt;
&lt;br /&gt;
* VDD: 5,0 V +/- 5%&lt;br /&gt;
* Vout(0): 2,5 V +/- 2% (ohne Bewegung)&lt;br /&gt;
* Vout: Vout(0) + 10mV / dps +/- 2%&lt;br /&gt;
* Messbereich: ca. 200 dps max.&lt;br /&gt;
&lt;br /&gt;
====Anschluss-Schema====&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_Gyro_Modul_SP.JPG|RP6 Gyro Modul - Anschluss-Schema]]&lt;br /&gt;
&lt;br /&gt;
====Umbau-Optionen====&lt;br /&gt;
Am Gyro Modul gibt es nichts umzubauen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===3D Accelerometer Modul JM3-3DA===&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_3D_Accelerometer_Modul.JPG|RP6 3D Accelerometer Modul|right|105px]]&lt;br /&gt;
&lt;br /&gt;
(Laut Online-Katalog der Firma CONRAD!)&lt;br /&gt;
&lt;br /&gt;
''&amp;quot;Universeller 3-Achsen Beschleunigungssensor für RP6, RP6 V2, RP6 ATMEGA32 und das RP6 V2 Control M256 WIFI-Kit. Ideal zur Winkelmessung (Neigung-, Kipp-Winkel) und vieles mehr.&amp;quot;''&lt;br /&gt;
&lt;br /&gt;
Seit Mai 2020 ist das 3D Accelerometer Modul bei CONRAD ausverkauft.&lt;br /&gt;
&lt;br /&gt;
====Beschreibung====&lt;br /&gt;
&lt;br /&gt;
Das 3D Accelerometer Modul ist eine kleine (15 x 10 mm) Zusatzplatine (RP6 Xtra Modul), die direkt auf den EEPROM-Sockel (IC5) der Zusatzplatine [[RP6#RP6_CONTROL_M32_Platine|RP6 CONTROL M32]] gesteckt und über den SPI-Bus angesteuert werden kann. Das Accelerometer Modul kann aber auch mit allen Microcontroller-Plattformen betrieben werden, die eine stabilisierte 5V-Versorgungsspannung und einen SPI- oder I2C-Bus bieten.&lt;br /&gt;
&lt;br /&gt;
Die Platine ist bestückt mit dem 3D Beschleunigungs-Sensor [http://www.farnell.com/datasheets/1691680.pdf LIS302DLH]. Die 3,3 V Versorgungsspannung des LIS302DLH wird auf der Platine durch einen Spannungsregler ([http://www.mouser.com/ds/2/405/lm3480-316799.pdf LM3480IM3-3.3]) erzeugt.&lt;br /&gt;
&lt;br /&gt;
'''Lieferumfang'''&lt;br /&gt;
* 3D Accelerometer Modul&lt;br /&gt;
* CD mit Anleitung und Software-Beispielen.&lt;br /&gt;
&lt;br /&gt;
====Technische Daten====&lt;br /&gt;
&lt;br /&gt;
* VDD: 5,0 V +/- 5%&lt;br /&gt;
* Messbereiche: +-2 g, +-4 g, +-8 g&lt;br /&gt;
* Datenausgabe: 16 Bit&lt;br /&gt;
* Schnittstellen: I2C, SPI&lt;br /&gt;
&lt;br /&gt;
====Anschluss-Schema====&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_3D_Accelerometer_Modul_SP.JPG|RP6 3D Accelerometer Modul - Anschluss-Schema|350px]]&lt;br /&gt;
&lt;br /&gt;
====Umbau-Optionen====&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_3D_Accelerometer_Modul_M32.JPG|RP6 3D Accelerometer Modul auf der M32|right|500px]]&lt;br /&gt;
&lt;br /&gt;
'''Will man das Modul auf der M32 einsetzen, muss man auf dem 3D Accelerometer Modul die Widerstände R2 und R3 (falls vorhanden!) auslöten (siehe Anleitung zum Modul, Seiten 4/5!)''' und einen IC-Sockel an Position IC5 und einen Kondensator an Position C19 auf der M32 einlöten, siehe [[RP6#Zweites_SPI-EEPROM|hier]]!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die Abbildung rechts zeigt das 3D Accelerometer Modul auf der M32.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===BHT Modul JM3-BHT31===&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_BHT_Modul.PNG|RP6 BHT Modul|right|203px]]&lt;br /&gt;
&lt;br /&gt;
Dieses [http://jm3-engineering.com/sensors.htm BHT Modul] zur Messung von Luftdruck, Luftfeuchte und Temperatur war für das Ende des 3. Quartals 2014 angekündigt und ist nun ab dem 22.01.2015 lieferbar.&lt;br /&gt;
&lt;br /&gt;
(Laut Online-Katalog der Firma CONRAD!)&lt;br /&gt;
&lt;br /&gt;
''&amp;quot;Ein Luftdruck-, rel. Luftfeuchtigkeits- und Temperatursensor Modul für vielfältige Anwendungen. Es kann direkt in den Asuro Expansion-Port auf dem Asuro xTend Bord eingesteckt werden. Das Asuro Modul kann mit den anderen erhältlichen Modulen (Kompass/Gyro und RTC kombiniert werden (Stack-up)). Außerdem kann es auch auf dem RP6 Sensor Bord in dem I2C Modulsteckplatz verwendet werden. Das Sensor Modul verwendet den hochauflösenden Drucksensor-Chip MS5607-02BA und den Luftfeuchtigkeitssensor HTU21D von MEAS Switzerland mit I2C Bus Interface. Der barometrische Drucksensor ist für Höhenmesser und Variometer optimiert und hat eine Auflösung von 20cm. Der relative Luftfeuchtigkeits- und Temperatursensor bietet zuverlässige und genaue Daten, welche sich auch besonders für Wetterstations-Informationen eignen.&amp;quot;''&lt;br /&gt;
&lt;br /&gt;
Aktuell (April 2019) ist das BHT Modul bei CONRAD ausverkauft. &lt;br /&gt;
&lt;br /&gt;
====Beschreibung====&lt;br /&gt;
Das BHT Modul ist eine kleine (24 x 14 mm) Zusatzplatine (ASURO xTend bzw. RP6 Xtra Modul), die direkt auf das [[RP6_Sensor_Board_und_Xtra_Module#RP6_Sensor_Board_2|RP6 Sensor Board]] aufgesteckt werden kann. Sie kann auch auf dem [http://www.conrad.de/ce/de/product/1302085/Arexx-Asuro-xTend-Board-JM3-AXT3 Arexx Asuro xTend Board] und überall eingesetzt werden, wo eine stabilisierte 5V Versorgungsspannung und ein I2C-Bus bis 400 kHz zur Verfügung steht.&lt;br /&gt;
&lt;br /&gt;
Die Platine ist bestückt mit dem barometrischen Drucksensor [http://www.parallax.com/sites/default/files/downloads/29124-MS5607-02BA03-Datasheet.pdf MS5607-02BA] und dem relativen Luftfeuchtigkeits- und Temperatursensor [http://www.meas-spec.com/downloads/HTU21D.pdf HTU21D]. Die 3,0 V Versorgungsspannung der Sensoren wird auf der Platine durch einen Spannungsregler ([http://www.farnell.com/datasheets/78902.pdf LP2980AIM5-3.0]) erzeugt. &lt;br /&gt;
&lt;br /&gt;
'''Lieferumfang'''&lt;br /&gt;
* BHT Modul&lt;br /&gt;
* CD mit Dokumentation&lt;br /&gt;
&lt;br /&gt;
====Technische Daten====&lt;br /&gt;
&lt;br /&gt;
* Nennspannung: 3,3 V (?)&lt;br /&gt;
* Nennstrom: 0,2 mA (typ.) &amp;lt; 1,5mA peaktyp.&lt;br /&gt;
* I2C Bus Geschwindigkeit: 400kHz max.&lt;br /&gt;
* Sensor Modul mit MS5607-02BA und HTU21D&lt;br /&gt;
* Hohe Auflösung des Sensorelements - Höhe: 20cm /- rel. Luftfeuchtigkeit: 0,04%&lt;br /&gt;
* Schneller AD-Wandler&lt;br /&gt;
* Digitaler Drucksensor (24 bit ΔΣ ADC)&lt;br /&gt;
* Luftdruckbereich: 10 bis 1200 mbar&lt;br /&gt;
* Exzellente Langzeitstabilität&lt;br /&gt;
* Unmittelbare Desaturierung&lt;br /&gt;
* Kalibrierung in der Fabrik&lt;br /&gt;
&lt;br /&gt;
====Anschluss-Schema====&lt;br /&gt;
Belegung des 9-poligen Anschluss-Steckers (K1) siehe in [[RP6_Sensor_Board_und_Xtra_Module#I2C-MODULE|dieser]] Tabelle!&lt;br /&gt;
&lt;br /&gt;
====Umbau-Optionen====&lt;br /&gt;
&lt;br /&gt;
===Xtra Module auf einer Experimentierplatine===&lt;br /&gt;
&lt;br /&gt;
Die drei bis jetzt (09/2014) erhältlichen [[RP6_Sensor_Board_und_Xtra_Module#RP6_Xtra_Module_2|Xtra Module]], die die Navigation eines Roboters ermöglichen, können problemlos im RP6-System genutzt werden,- zwei davon sogar in Form des direkten Aufsteckens auf eine der Zusatz-Platinen: Für den [[RP6_Sensor_Board_und_Xtra_Module#I2C_GPS_Empf.C3.A4nger_JM3-GPS|I2C GPS Empfänger]] gibt es einen Steckplatz auf dem [[RP6_Sensor_Board_und_Xtra_Module#RP6_Sensor_Board_2|RP6 Sensor Board]], das [[RP6_Sensor_Board_und_Xtra_Module#3D_Accelerometer_Modul_JM3-3DA|3D Accelerometer Modul]] kann auf der [[RP6#RP6_CONTROL_M32_Platine|RP6 CONTROL M32]] aufgesteckt werden.&lt;br /&gt;
&lt;br /&gt;
Natürlich können die Xtra Module auch allein (&amp;quot;stand-alone&amp;quot;) ohne RP6 Sensor Board oder RP6 CONTROL M32 betrieben werden. Dazu kann man sie z.B. auf einer [[RP6#Experimentierplatine|Experimentierplatine]] aufbauen. &lt;br /&gt;
&lt;br /&gt;
Das soll hier mit einer kurzen Aufbauanleitung demonstriert werden.&lt;br /&gt;
&lt;br /&gt;
====Schaltplan====&lt;br /&gt;
&lt;br /&gt;
Aber zunächst der Schaltplan:&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6v2_Xtra_Module_SP.jpg|RP6 Experimentierplatine für Xtra Module - Schaltplan]]&lt;br /&gt;
&lt;br /&gt;
Man erkennt die drei XTra Module, die (bis auf das Gyro Modul) an den I2C-Bus am XBUS Stecker des RP6 angeschlossen sind. Das [[RP6_Sensor_Board_und_Xtra_Module#Gyro_Modul_JM3-GYRO|Gyro Modul JM3-GYRO]] wird nicht über I2C angesteuert, sondern liefert an seinem Pin OUT ein analoges Ausgangssignal, das mit einem ADC Eingang (0..5V) gemessen werden kann.&lt;br /&gt;
&lt;br /&gt;
Der Jumper (Steckbrücke) JP1 dient zum Einstellen der I2C-Adresse des 3D Accelerometer Moduls (0x30, 0x32).&lt;br /&gt;
Mit JP2/3 wird die [[RP6_Sensor_Board_und_Xtra_Module#Optionale_Ansteuerung|Betriebsart des Gyro Moduls]] festgelegt.&lt;br /&gt;
Die Jumper JP4 bis JP9 dienen zur Verteilung von INT1, INT2 des 3D Accelerometer Moduls und des OUT Signals des Gyro Moduls auf die INT-Anschlüsse INT1..3, INTU des XBUS. Wenn man die Interrupts des 3D Accelerometer Moduls nicht nutzen will, kann man die Jumper JP4 bis JP8 auch weglassen. Mit JP9 wird das analoge Signal des Gyro Moduls an INT1 des XBUS gelegt. Dies ist nur dann sinnvoll, wenn man die Platine mit der RP6v2 Base betreibt, weil hier an INT1 ein ADC Eingang (ADC4) liegt. Bei allen anderen Plattformen des RP6-Systems (M32, CCPRO M128, M256 WiFi) muss JP9 offen bleiben.&lt;br /&gt;
&lt;br /&gt;
Mit dieser Schaltung kann man also den Beschleunigungssensor (3D Accelerometer) und den GPS Empfänger über I2C auslesen. Der Gyro wird entweder mit ADC4 der RP6v2 Base (JP9 geschlossen!) ausgewertet oder durch einen anderen ADC Eingang. Dazu kann man das Ausgangssignal des Gyros an Pin 3 der Stiftleiste ST1 abnehmen. Von dort kann es z.B. zu ADC0 oder ADC1 der RP6v2 Base oder der RP6 CONTROL M32 geführt werden oder zu einem beliebigen ADC Eingang der CCPRO M128 oder der M256 WiFi. Die Stiftleiste ST1 liegt direkt neben dem USRBUS, so dass die Verbindung auch über den USRBUS hergestellt werden kann. Dazu verbindet man Pin 3 von ST1 mit einem Pin (Y1..Y14) des USRBUS.&lt;br /&gt;
&lt;br /&gt;
====Bestückungsplan====&lt;br /&gt;
&lt;br /&gt;
So kann z.B. der Bestückungsplan mit Leiterbahnführung auf der Experimentierplatine (Exp) aussehen:&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6v2_Xtra_Module.jpg|RP6 Experimentierplatine für Xtra Module]]&lt;br /&gt;
&lt;br /&gt;
Was braucht man allgemein für den Aufbau einer Schaltung auf der Exp:&lt;br /&gt;
* Seitenschneider, Schere, Zange&lt;br /&gt;
* Lötkolben 25..30 Watt, Lötzinn&lt;br /&gt;
* Plastik 70 Schutzlack (CONRAD 813621)&lt;br /&gt;
* Isolierter Schaltdraht YV 0,20 mm² (CONRAD 606065)&lt;br /&gt;
* Versilberter CU-Draht 0,6 mm (CONRAD 605581)&lt;br /&gt;
&lt;br /&gt;
Mit dem versilberten CU-Draht stellt man auf der Unterseite (= Lötseite) der Exp Verbindungen zwischen den Bauteilen her; mit dem isolierten Schaltdraht werden Drahtbrücken auf der Oberseite (= Bestückungsseite) der Exp eingesetzt. Die Lage der Xtra Module und der Verbindungen kann man im Bestückungsplan (s.o.!) erkennen, Drahtbrücken sind rot hervorgehoben.&lt;br /&gt;
&lt;br /&gt;
Zusätzlich zu den RP6 Xtra Modulen braucht man folgende Bauteile (Bestell-Nummern von CONRAD):&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| Anzahl || Bestell-Nr. || Bauteil-Bezeichnung || Verwendung&lt;br /&gt;
|-&lt;br /&gt;
| 1 || [http://www.conrad.de/ce/de/product/191537/Arexx-RP6-Experimentierplatine?queryFromSuggest=true 191537] || RP6 Experimentierplatine || &lt;br /&gt;
|-&lt;br /&gt;
| 1 || [http://www.conrad.de/ce/de/product/189600/Praezisions-IC-Fassung-MPE-Garry-MP-083-STG-BU-Pole-8-Rastermass-762-mm-Material-Kontaktfeder-025-Gold-ueber-Nickel 189600] || Präzisions-IC-Fassung (8 Pole) || Stecksockel für Accelerometer Modul&lt;br /&gt;
|-&lt;br /&gt;
| 1 || [http://www.conrad.de/ce/de/product/741360/Praezisions-Buchsenleiste-RM-254-gerade-Pole-1-x-20-10120832-BKL-Electronic-Inhalt-1-St 741360] || Präzisions-Buchsenleiste RM 2,54mm (9 Pole) || Stecksockel für GPS Empfänger&lt;br /&gt;
|-&lt;br /&gt;
| 1 || [http://www.conrad.de/ce/de/product/741307/Praezisions-Stiftleiste-RM-254-gerade-Pole-1-x-20-10120536-BKL-Electronic-Inhalt-1-St 741307] || Präzisions-Stiftleiste RM 2,54mm (2 x 4 Pole) || Stecksockel für Gyro Modul&lt;br /&gt;
|-&lt;br /&gt;
| 1 || [http://www.conrad.de/ce/de/product/741119/Stiftleiste-RM-254-gerade-Pole-1-x-36-10120182-BKL-Electronic-Inhalt-1-St 741119] || 1-reihige Stiftleiste RM 2,54mm (ges. 36-polig) || JP1, ST1&lt;br /&gt;
|-&lt;br /&gt;
| 1 || [http://www.conrad.de/ce/de/product/741186/Doppelreihige-Stiftleiste-RM-254-gerade-Pole-2-x-8-10120514-BKL-Electronic-Inhalt-1-St 741186] || 2-reihige Stiftleiste RM 2,54mm (ges. 8-polig) || JP2..9&lt;br /&gt;
|-&lt;br /&gt;
| 1 || [http://www.conrad.de/ce/de/product/742902/Codier-Adressierbruecken-Set-Rastermass-25254-mm-10120906-BKL-Electronic-Inhalt-1-Set 742902] || Sechs Codierbrücken (aus Set) || Steckbrücken&lt;br /&gt;
|-&lt;br /&gt;
| 2 || [http://www.conrad.de/ce/de/product/453099/Keramik-Kondensator-01-F-50-V-20-B-x-H-508-mm-x-508-mm-1-St 453099] || Keramik Kondensator 100 nF || Blockkondensatoren C2, C3&lt;br /&gt;
|-&lt;br /&gt;
| 1 || [http://www.conrad.de/ce/de/product/421986/Elektrolyt-Kondensator-radial-bedrahtet-25-mm-10-F-50-V-20--x-H-5-mm-x-11-mm-Panasonic-EEUFC1H100LH-1-St 421986] || Elektrolyt Kondensator 10 uF/50 V || Spannungsstabilisierung C1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Viel Erfolg beim Aufbau!&lt;br /&gt;
&lt;br /&gt;
 Natürlich muss man nicht alle drei Sensoren aufbauen!&lt;br /&gt;
 Man kann einfach den/die Sensor/en weglassen, den/die man nicht nutzen will!&lt;br /&gt;
&lt;br /&gt;
Noch ein Wort zur Programmierung des 3D Accelerometer Moduls: Es wird auf dieser Exp über den I2C Bus angesteuert. Damit kann man die [[RP6_Sensor_Board_und_Xtra_Module#RP6_CONTROL_M32:_ACCSENS_Library|nachfolgende Library]] für dieses Modul hier NICHT benutzen!&lt;br /&gt;
&lt;br /&gt;
====Magnetfeldsensor====&lt;br /&gt;
&lt;br /&gt;
Wenn man die oben beschriebene Experimentierplatine aufgebaut hat, hat man für die Navigation eines mobilen Roboters (wie des RP6v2) schon drei benötigte Sensoren zur Verfügung: einen GPS Empfänger, einen 3D-Beschleunigungssensor und einen 1D-Gyrosensor.&lt;br /&gt;
&lt;br /&gt;
Was fehlt, ist z.B. ein '''Magnetfeldsensor (Kompass-Sensor)''', mit dem der Roboter die Himmelsrichtung feststellen kann. Einen Magnetfeldsensor gibt es (noch) nicht als Xtra Modul.&lt;br /&gt;
&lt;br /&gt;
Auf der beschriebenen Experimentierplatine ist durchaus noch Platz (z.B. in der rechten oberen Ecke) für einen Magnetfeldsensor. Geeignet ist z.B. das 2D-Kompassmodul HDMM01 ([http://www.pollin.de/shop/dt/NTM4OTgxOTk-/Bausaetze_Module/Module/Kompassmodul_HDMM01.html Pollin 94-810 164] NICHT MEHR LIEFERBAR!).&lt;br /&gt;
&lt;br /&gt;
Hier ist der um den Magnetfeldsensor erweiterte Schaltplan:&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6v2_Xtra_Module_HDMM01_SP.jpg|RP6 Experimentierplatine für Xtra Module und HDMM01 - Schaltplan]]&lt;br /&gt;
&lt;br /&gt;
Das kleine Kompassmodul dürfte doch noch einfach auf der Experimentierplatine unterzubringen sein, oder?&lt;br /&gt;
&lt;br /&gt;
Zur Programmierung des Magnetfeldsensors HDMM01 gibt es [[RP6v2_Orientierung#Kompassmodul_HDMM01_2|HIER]] Anregungen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Programmierung==&lt;br /&gt;
In diesem Abschnitt geht es um die Programmierung der Sensoren und Aktoren auf dem [[RP6_Sensor_Board_und_Xtra_Module#RP6_Sensor_Board_3|RP6 Sensor Board]] und auf den [[RP6_Sensor_Board_und_Xtra_Module#RP6_Xtra_Module_3|Xtra Modulen]]. Die hier veröffentlichte Software baut NICHT auf die mitgelieferten C++ Software-Beispiele auf der ''&amp;quot;RP6 Robot System Xtra Modules CD-ROM&amp;quot;'' auf, sondern basiert auf Eigenentwicklungen in GCC.&lt;br /&gt;
&lt;br /&gt;
===RP6 Sensor Board===&lt;br /&gt;
Das RP6 Sensor Board RP6-JM03-61 verfügt nicht über einen eigenen Microprozessor. Daher geht es hier eigentlich nicht um die Programmierung des Sensor Boards, sondern um die Programmierung der Microcontroller-Plattform, an die das Sensor Board angeschlossen ist. In der Regel wird das die RP6 M256 WiFi Zusatzplatine sein, aber auch die RP6v2 Base steuert (als I2C-Slave) in der vorgesehenen Konfiguration gewisse Funktionen des Sensor Boards an.&lt;br /&gt;
Prinzipiell kann das Sensor Board aber auch an der RP6 CONTROL M32 (''passende Library auf Anfrage beim Autor!'') oder der RP6 CCPRO M128 Zusatzplatine betrieben werden.&lt;br /&gt;
&lt;br /&gt;
====Dokumentation====&lt;br /&gt;
Die Dokumentation zum RP6 Sensor Board befindet sich auf der mitgelieferten ''&amp;quot;RP6 Robot System Xtra Modules CD-ROM&amp;quot;''.&lt;br /&gt;
&lt;br /&gt;
=====Manuals=====&lt;br /&gt;
Das Handbuch in der aktuellen Version kann [http://www.jm3-engineering.com/download/doc/ManualRP6SensorBoard_de.pdf hier] oder [http://www.produktinfo.conrad.com/datenblaetter/00000-24999/001082384-an-01-de-RP6_SENSOR_BOARD.pdf da] eingesehen werden.&lt;br /&gt;
 ACHTUNG: Das Manual enthielt in der Version 1.11 noch teils irreführende&lt;br /&gt;
          Beschreibungen, die in der aktuellen Version 1.20 vom 20.04.2014&lt;br /&gt;
          korrigiert wurden!&lt;br /&gt;
&lt;br /&gt;
====Robot-Tool====&lt;br /&gt;
[[Bild:JM3 Robot-Tool.PNG|JM3 Robot-Tool|thumb]]&lt;br /&gt;
&lt;br /&gt;
Von JM3 Engineering wurde auch ein eigenes Programm &amp;quot;'''JM3 Robot-Tool'''&amp;quot; veröffentlicht, das im RP6-System (RP6(v2) Base, CONTROL M32, M256 WiFi) anstelle des [[RP6v2#RobotLoader|RobotLoaders]] verwendet werden kann.&lt;br /&gt;
&lt;br /&gt;
Vom Robot-Tool gibt es auch eine Kommandozeilen-Version &amp;quot;'''Multiloader'''&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Befehlszeilen Optionen'''&lt;br /&gt;
 Multi Loader v1.0.1&lt;br /&gt;
 &lt;br /&gt;
 Usage:&lt;br /&gt;
 multiloader [filename] [port/hostname] [device] [-l]&lt;br /&gt;
  -l forces RP6 low speed mode.&lt;br /&gt;
 &lt;br /&gt;
 Valid devices:&lt;br /&gt;
  - Asuro&lt;br /&gt;
  - AsuroCtrl&lt;br /&gt;
  - RP6Base&lt;br /&gt;
  - RP6CtrlM32&lt;br /&gt;
  - RobotArm&lt;br /&gt;
  - RP6Wifi&lt;br /&gt;
 Attention: Device names are case-sensitive&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 Multi Loader v2.0.0&lt;br /&gt;
 &lt;br /&gt;
 Usage: multiloader [load/conf] [...]&lt;br /&gt;
 &lt;br /&gt;
         load    Load .hex file into robot.&lt;br /&gt;
                 arguments: [filename] [port/host] [device] [interface] [-l]&lt;br /&gt;
 &lt;br /&gt;
                 [interface] specifies programming interface type.&lt;br /&gt;
                 Valid interface types are UART and TCP.&lt;br /&gt;
                 -l forces RP6 low speed mode.&lt;br /&gt;
 &lt;br /&gt;
                 Valid devices:  [interfaces]&lt;br /&gt;
                 - Asuro     UART&lt;br /&gt;
                 - AsuroXT   UART&lt;br /&gt;
                 - Marvin    UART&lt;br /&gt;
                 - MarvinFW  UART&lt;br /&gt;
                 - RP6       UART&lt;br /&gt;
                 - RP6M32    UART&lt;br /&gt;
                 - RP6Wifi   TCP&lt;br /&gt;
                 - RobotArm  UART&lt;br /&gt;
 &lt;br /&gt;
                 Attention: Device names are case-sensitive&lt;br /&gt;
 &lt;br /&gt;
=====Versionen=====&lt;br /&gt;
Hier eine Tabelle der (mir) bekannten Robot-Tool Versionen:&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |rowspan=2|ZIP-Datum&lt;br /&gt;
 |colspan=2|Robot-Tool:&lt;br /&gt;
 |colspan=2|Multiloader:&lt;br /&gt;
 |rowspan=2|Bemerkungen&lt;br /&gt;
 |-&lt;br /&gt;
 |Windows&lt;br /&gt;
 |Linux&lt;br /&gt;
 |Windows&lt;br /&gt;
 |Linux&lt;br /&gt;
 |-&lt;br /&gt;
 |25.10.2014&lt;br /&gt;
 |1.0.1-1&lt;br /&gt;
 |1.0.1-1&lt;br /&gt;
 |1.0.1-1&lt;br /&gt;
 |1.0.1-1&lt;br /&gt;
 |Erste veröffentlichte Version!&lt;br /&gt;
 |-&lt;br /&gt;
 |30.01.2017&lt;br /&gt;
 |[http://www.jm3-engineering.com/download/robottool-v2.0-win32.7z 2.0]&lt;br /&gt;
 |[http://www.jm3-engineering.com/download/robottool-v2.0-linux.tar.xz 2.0]&lt;br /&gt;
 |2.0&lt;br /&gt;
 |2.0&lt;br /&gt;
 |auch für [http://www.jm3-engineering.com/download/robottool-v2.0-osx.tar.gz Mac OSX]!&lt;br /&gt;
 |-&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
'''Hinweise:'''&lt;br /&gt;
* 1. Falls die Links in der Tabelle auf die Seite &amp;quot;Neuigkeiten&amp;quot; von JM3-Engineering führen, kann man dort auf die Seite &amp;quot;Software Downloads&amp;quot; wechseln und die Dateien im Absatz &amp;quot;JM3 Robot-Tool V2.0&amp;quot; herunterladen.&lt;br /&gt;
* 2. Ab Version 2.0 ist der Multiloader in der ZIP des Robot-Tools enthalten.&lt;br /&gt;
&lt;br /&gt;
====AVR-GCC und Visual Studio====&lt;br /&gt;
Die Demo-Programme zum RP6 Sensor Board wurden mit [https://www.microsoft.com/de-de/download/details.aspx?id=5555&amp;amp;fa43d42b-25b5-4a42-fe9b-1634f450f5ee=True Microsoft Visual C++ 2010] und [http://www.jm3-engineering.com/download/avr-gcc-4.8.1-win32.7z AVR-GCC] erstellt.&lt;br /&gt;
&lt;br /&gt;
Eine Anleitung zur Installation unter Windows befindet sich [http://www.jm3-engineering.com/download/doc/avr-gcc-vs_de.pdf hier].&lt;br /&gt;
&lt;br /&gt;
====Demo-Programmme====&lt;br /&gt;
Demo-Programme und eine &amp;quot;Library&amp;quot; zum RP6 Sensor Board befinden sich auf der mitgelieferten ''&amp;quot;RP6 Robot System Xtra Modules CD-ROM&amp;quot;''. Sie können auch in der aktuellen Version im Download Bereich von [http://www.jm3-engineering.com/downloads.htm JM3 Engineering] herunter geladen werden:&lt;br /&gt;
* [http://www.jm3-engineering.com/download/RP6SensorBoardDemo_1.1-1.7z RP6 Sensor Board Demo Programm und Library]&lt;br /&gt;
* [http://www.jm3-engineering.com/download/RP6SensorBoardDemo_noVC_1.1-1.7z RP6 Sensor Board Demo Programm und Library (ohne Visual Studio Projekt Dateien)]&lt;br /&gt;
* [http://www.jm3-engineering.com/download/RP6-RC_1.0-1.7z Remote Control Software]&lt;br /&gt;
'''Hinweis:'''&lt;br /&gt;
Falls die o.g. Links auf die Seite &amp;quot;Neuigkeiten&amp;quot; von JM3-Engineering führen, kann man dort auf die Seite &amp;quot;Software Downloads&amp;quot; wechseln und die Dateien im Absatz &amp;quot;RP6 Sensor Board Library und Demo-Programm&amp;quot; herunterladen.&lt;br /&gt;
&lt;br /&gt;
====Library====&lt;br /&gt;
Eine &amp;quot;Library&amp;quot; zum RP6 Sensor Board, bestehend aus einigen Einzel-Dateien mit jeweils eigenen Versions-Nummern, befindet sich auf der mitgelieferten ''&amp;quot;RP6 Robot System Xtra Modules CD-ROM&amp;quot;''. Sie ist in der aktuellen Version auch in den Demo-Programmen enthalten ([[RP6_Sensor_Board_und_Xtra_Module#Demo-Programmme|s.o.!]]).&lt;br /&gt;
&lt;br /&gt;
=====Versionen=====&lt;br /&gt;
Hier eine Tabelle der (mir) bekannten Library Versionen für das RP6 Sensor Board:&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |ZIP-Datum *&lt;br /&gt;
 |Version&lt;br /&gt;
 |RP6SensorBoardDemo&lt;br /&gt;
 |RP6-RC&lt;br /&gt;
 |RP6M256_I2CMasterLib&lt;br /&gt;
 |RP6M256Lib&lt;br /&gt;
 |RP6I2CmasterTWI&lt;br /&gt;
 |-&lt;br /&gt;
 |09.12.2013&lt;br /&gt;
 |1.0&lt;br /&gt;
 |1.0&lt;br /&gt;
 |1.0&lt;br /&gt;
 |(1.0_24.02.12) ²&lt;br /&gt;
 |1.1_16.07.12 ²&lt;br /&gt;
 |1.1_04.09.12 ³&lt;br /&gt;
 |-&lt;br /&gt;
 |27.12.2014&lt;br /&gt;
 |1.1&lt;br /&gt;
 |1.1-1&lt;br /&gt;
 |1.0-1&lt;br /&gt;
 |Modified 02.11.14 ³&lt;br /&gt;
 |1.1.1_25.10.14 ³&lt;br /&gt;
 |1.1_04.09.12 ³&lt;br /&gt;
 |-&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
'''Zu *:''' Alternativ: Datum der Verzeichnisse (z.B. auf der ''&amp;quot;RP6 Robot System Xtra Modules CD-ROM&amp;quot;'')!&lt;br /&gt;
&lt;br /&gt;
'''Zu ²:''' Neueste Original Version der [http://rn-wissen.de/wiki/index.php/RP6v2#Versionen RP6 Library]!&lt;br /&gt;
&lt;br /&gt;
'''Zu ³:''' Modifiziert von [http://www.jm3-engineering.com/ JM3 Engineering]!&lt;br /&gt;
&lt;br /&gt;
=====Modifizierte RP6 Libraries=====&lt;br /&gt;
Von [http://www.jm3-engineering.com/ JM3 Engineering] wurden bis jetzt drei [http://rn-wissen.de/wiki/index.php/RP6v2#Versionen RP6 &amp;quot;Original&amp;quot;-Libraries] leicht modifiziert, um sie für die eigenen Programme für das RP6 Sensor Board optimal nutzen zu können.&lt;br /&gt;
In diesem Abschnitt soll kurz erwähnt werden, WAS verändert wurde.&lt;br /&gt;
 &lt;br /&gt;
======RP6M256_I2CMasterLib======&lt;br /&gt;
Die RP6M256_I2CMasterLib wurde von JM3 Engineering ab der Software Version 1.1 für das RP6 Sensor Board verändert, um sie in einer eigenen Bibliothek bestehend aus mehreren Modulen nutzen zu können. Folgendes wurde angepasst:&lt;br /&gt;
* Neue typedef unions:&lt;br /&gt;
** u_interrupt_status&lt;br /&gt;
** u_status&lt;br /&gt;
** u_drive_status&lt;br /&gt;
** u_statusLEDs&lt;br /&gt;
&lt;br /&gt;
Die modifizierte RP6M256_I2CMasterLib vom 2.11.2014 ist kompatibel zur Original-Version vom 24.02.2012.&lt;br /&gt;
&lt;br /&gt;
======RP6M256Lib======&lt;br /&gt;
Eine modifizierte Version 1.1.1 der RP6M256Lib mit Datum vom 25.10.2014 wurde von JM3 Engineering im November 2014 zusammen mit der Software Version 1.1 für das RP6 Sensor Board veröffentlicht. Sie ist kompatibel zur Version 1.1 der RP6M256Lib vom 16.07.2012 und enthält folgende Änderung:&lt;br /&gt;
* In der Datei RP6M256.h wird die Variable &amp;quot;timer&amp;quot; korrekt als &amp;quot;''extern'' volatile uint16_t timer&amp;quot; deklariert.&lt;br /&gt;
&lt;br /&gt;
======RP6I2CmasterTWI======&lt;br /&gt;
Eine erweiterte I2C Master-Library (Version 1.1) gibt es mit Datum vom 04.09.2012, veröffentlicht ab Februar 2014 von JM3 Engineering für das RP6 Sensor Board und die Xtra Module. Sie ist abwärts-kompatibel zur I2C Master-Library in der Version 1.0 vom 16.05.2007 und bietet lediglich folgende Erweiterung: &lt;br /&gt;
* Neue Funktion I2CTWI_readWordRegisters() zum Lesen von 16 Bit Registern&lt;br /&gt;
&lt;br /&gt;
====RP6 M256 WiFi: Sensor Board Library====&lt;br /&gt;
Die nachfolgende RP6M256_Sensor_BoardLib (Eigenentwicklung in GCC) dient zur Ansteuerung des Sensor Boards durch die RP6M256 WiFi.&lt;br /&gt;
&lt;br /&gt;
=====Configuration Header=====&lt;br /&gt;
Vor dem Kompilieren der Library muss eine Anpassung des Configuration Headers an die eigenen Hardware-Voraussetzungen erfolgen.&lt;br /&gt;
Dazu gibt es im Configuration Header eine Definition:&lt;br /&gt;
* USE_PD5 -&amp;gt; Die Sensor Board Funktion &amp;quot;PD5&amp;quot; steuert den TCA4311A Enable Pin (EN).&lt;br /&gt;
Im nachfolgenden Listing ist die Definition USE_PD5 NICHT aktiv (d.h. der TCA4311A Enable Pin (EN) wird vom MAX7311 I/O 1.0 Pin angesteuert!). Dies muss an die eigene Hardware angepaßt werden. Wenn &amp;quot;PD5&amp;quot; den TCA4311A Enable Pin (EN) steuern soll, muss die Zeile mit &amp;quot;USE_PD5&amp;quot; &amp;quot;aktiviert&amp;quot; werden. Dazu entfernt man &amp;quot;//&amp;quot; am Zeilenanfang:&lt;br /&gt;
 #define USE_PD5&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Bevor man Beschleunigungs-, Magnetfeldsensor und Gyroskop nutzen kann, muss man sie kalibrieren:&lt;br /&gt;
&lt;br /&gt;
* '''Accelerometer:'''&lt;br /&gt;
** Die X-Achse wird kalibriert, indem man den RP6 mit der rechten Seite nach unten hält und den Maximalwert in MAX_X_A einträgt. Dann neigt man ihn auf seine linke Seite und trägt den negativen Maximalwert in MIN_X_A ein.&lt;br /&gt;
** Die Y-Achse wird kalibriert, indem man den RP6 mit der Vorderseite nach oben hält und den Maximalwert in MAX_Y_A einträgt. Dann kippt man die Vorderseite nach unten und trägt den negativen Maximalwert in MIN_Y_A ein.&lt;br /&gt;
** Die Z-Achse wird kalibriert, indem man den RP6 normal waagerecht hält und den Maximalwert in MAX_Z_A einträgt. Dann dreht man den RP6 &amp;quot;auf den Kopf&amp;quot; und trägt den negativen Maximalwert in MIN_Z_A ein.&lt;br /&gt;
** Sollten die angezeigten Pitch- und Roll-Werte nach der Kalibrierung der Achsen und genau waagerecht stehendem Sensor bzw. RP6 vom Nullwert deutlich abweichen, kann man sie mithilfe der Definitionen OFFSET_PITCH_A und OFFSET_ROLL_A &amp;quot;nullen&amp;quot;. Die Einheit dieser Definitionen ist °.&lt;br /&gt;
 ''HINWEIS: Die internen Berechnungen werden durch diese Offset-Korrektur&lt;br /&gt;
 NICHT beeinflußt. Die Offset-Werte können also nicht dazu benutzt werden,&lt;br /&gt;
 eine Achsenabweichung zwischen Sensor und RP6 zu kompensieren!''&lt;br /&gt;
* '''Magnetometer:'''&lt;br /&gt;
** Zur Kalibrierung des Magnetfeldsensors stellt man den RP6 auf eine waagerechte Fläche. Es dürfen keine Elektrogeräte, Metallteile und stromführende Leitungen in der Nähe sein, die das Magnetfeld verändern können.&lt;br /&gt;
** Zunächst ist es möglich, die sogenannten &amp;quot;hard iron&amp;quot; Effekte auszugleichen. Dies sind feste Magnetfeldabweichungen, die durch das &amp;quot;Gerät&amp;quot; (in unserem Fall also durch den kompletten RP6) verursacht werden, in oder auf dem der Sensor angebracht ist. Mit den Definitionen OFFSET_X_M, OFFSET_Y_M und OFFSET_Z_M können diese Effekte ausgeglichen werden. Diese Kalibrierung wird hier aktuell (noch) nicht beschrieben, so dass man die Werte für diese Definitionen zunächst bei 0 belassen sollte.&lt;br /&gt;
** Die X-Achse und Y-Achse wird kalibriert, indem man den RP6 langsam mehrfach um die eigene (Z-)Achse dreht und die Maximalwerte in MAX_X_M und MAX_Y_M einträgt. Die negativen Maximalwerte trägt man in MIN_X_M und MIN_Y_M ein.&lt;br /&gt;
** Die Z-Achse wird kalibriert, indem man den RP6 auf die rechte oder linke Seite legt, ihn dann langsam mehrfach auf der Stelle (um seine Y-Achse) dreht und den Maximalwert in MAX_Z_M und den negativen Maximalwert in MIN_Z_M einträgt.&lt;br /&gt;
** Mit der Definition DECLINATION_M kann man zur Verbesserung der Genauigkeit der Richtungsangaben den magnetischen Deklinationswert [°] (d.h. die magnetische Missweisung) am aktuellen Standort festlegen. [http://www.ngdc.noaa.gov/geomag-web/#declination Hier] befindet sich ein &amp;quot;Deklinations-Rechner&amp;quot;, mit dem man den Deklinationswert für den eigenen Standort ermitteln kann. &lt;br /&gt;
** Wenn man den Temperaturwert des LSM303DLHC nutzen will, muss man die Definition GET_TEMP_M aktivieren (Standard!). Den Temperaturwert kann man noch eichen, indem man die Definition OFFSET_TEMP_M anpasst. Die Einheit von OFFSET_TEMP_M ist °C.&lt;br /&gt;
* '''Gyroskop:'''&lt;br /&gt;
** In Ruhelage des RP6 wird ein ADC-Wert von ca. 511 angezeigt, wenn die Definition ADCVAL_ZERORATE_LEVEL im Configuration Header (RP6M256_Sensor_Board.h) vor der ersten Kompilierung zunächst auf 0 gesetzt wurde. Die Kalibrierung des Gyroskops ist abgeschlossen, nachdem man den in Ruhelage angezeigten ADC-Wert als ADCVAL_ZERORATE_LEVEL eingetragen hat.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''HINWEISE ZUR KALIBRIERUNG:'''&lt;br /&gt;
* Das Demo-Programm ist nicht sehr gut geeignet, um die Kalibrierungen durchzuführen.&lt;br /&gt;
* Man sollte mit einem eigenen kurzen ''Kalibrierungs-Programm'' nur die Rohwerte der jeweiligen X-, Y- und Z-Achse z.B. zweimal pro Sekunde ausgeben.&lt;br /&gt;
* Die Rohwerte sind in Variablen x_axis..., y_axis..., z_axis... enthalten. Da die Rohwerte in den Funktionen normalizeLSM303DLHC_A() bzw. normalizeLSM303DLHC_M() ggf. verändert werden, müssen die Rohwerte VOR Durchlaufen dieser Funktionen ausgegeben werden.&lt;br /&gt;
* '''Ohne eine sorgfältige Kalibrierung wird die Kompass-Funktion (insbesondere die neigungskompensierte Ausgabe der Himmelsrichtung) nicht funktionieren!'''&lt;br /&gt;
* Nach dem Eintragen der Kalibrierungs-Werte in den Configuration Header (RP6M256_Sensor_Board.h) muss die ''Demo'' neu kompiliert werden. Vorher sollten die Compiler-Hilfsdateien der Sensor Board-Library (Dateiendungen .st und .o) im Programmverzeichnis gelöscht werden.&lt;br /&gt;
* Getestet wird das Ergebnis der Kalibrierung, indem die Ausgabewerte (Temperatur, Pitch, Roll, Heading, Neigungs-kompensiertes Heading) der ''Demo'' überprüft werden. Dazu kann man Vergleichswerte (Thermometer, Winkelmesser für Pitch, Roll und externer Kompass für Heading) heranziehen.&lt;br /&gt;
* Wenn die Ausgabewerte nicht den Erwartungen entsprechen, muss die Kalibrierung wiederholt werden.&lt;br /&gt;
* Eine Kalibrierung der Sensoren ist nur zuverlässig, solange die Position des jeweiligen Sensors und seine komplette Hardware-Umgebung (also der RP6 mit allen seinen Teilen!) nicht verändert wird. Gibt es trotzdem Veränderungen, z.B. durch weitere Aufbauten auf dem RP6, müssen diese Sensoren neu kalibriert werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Datei: RP6M256_Sensor_Board.h&lt;br /&gt;
&amp;lt;pre&amp;gt;/* ****************************************************************************&lt;br /&gt;
 *                           _______________________&lt;br /&gt;
 *                           \| RP6  ROBOT SYSTEM |/&lt;br /&gt;
 *                            \_-_-_-_-_-_-_-_-_-_/           &amp;gt;&amp;gt;&amp;gt; RP6 M256 WIFI&lt;br /&gt;
 * ----------------------------------------------------------------------------&lt;br /&gt;
 * ----------------------------- [c]2014 - Dirk -------------------------------&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * File: RP6M256_Sensor_Board.h&lt;br /&gt;
 * Version: 1.1&lt;br /&gt;
 * Target: RP6 M256 WIFI - ATMEGA2560 @16.00MHz&lt;br /&gt;
 * Author(s): Dirk&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Description:&lt;br /&gt;
 * Configuration header file for new RP6 Sensor Board library.&lt;br /&gt;
 * The RP6 Sensor Board (CONRAD 1082384) is connected to the RP6M256 with the&lt;br /&gt;
 * two plugs:&lt;br /&gt;
 *   Sensor Board &amp;lt;---&amp;gt; RP6M256&lt;br /&gt;
 *   --------------------------------&lt;br /&gt;
 *   I/O (K17)    &amp;lt;---&amp;gt; IO_PWM/T0/T1&lt;br /&gt;
 *   ADC (K18)    &amp;lt;---&amp;gt; ADC_IO2/CMP&lt;br /&gt;
 * The RP6 Sensor Board function &amp;quot;PD5&amp;quot; (IC6: EN) is now connected to RP6M256&lt;br /&gt;
 * OC1B (PB6) and the RP6 Sensor Board function &amp;quot;ADC4&amp;quot; (SHARP_R) to RP6M256&lt;br /&gt;
 * ADC9 (PK1).&lt;br /&gt;
 * On the RP6 Sensor Board the functions &amp;quot;ADC0&amp;quot;, &amp;quot;ADC1&amp;quot;, &amp;quot;PWR&amp;quot; and &amp;quot;ADC4&amp;quot; are&lt;br /&gt;
 * connected to the USRBUS. The USRBUS may be wired on the RP6 mainboard like&lt;br /&gt;
 * this:&lt;br /&gt;
 *   Function : Sensor Board - USRBUS: * &amp;lt;---&amp;gt; RP6 Mainboard&lt;br /&gt;
 *   --------------------------------------------------------&lt;br /&gt;
 *   SHARP_F  : &amp;quot;ADC0&amp;quot;       - Pin 1     &amp;lt;---&amp;gt; ADC0: Pin 3&lt;br /&gt;
 *   GYRO     : &amp;quot;ADC1&amp;quot;       - Pin 2     &amp;lt;---&amp;gt; ADC1: Pin 3&lt;br /&gt;
 *   PWRON ²  : &amp;quot;PWR&amp;quot;        - Pin 3     &amp;lt;---&amp;gt; PWR&lt;br /&gt;
 *   SHARP_R  : &amp;quot;ADC4&amp;quot;       - Pin 5     &amp;lt;---&amp;gt; Not connected!&lt;br /&gt;
 * At *) It is also possible not to use the USRBUS, but to connect the RP6&lt;br /&gt;
 *       Sensor Board directly to the RP6 mainboard with 3 single cables.&lt;br /&gt;
 * At ²) See RP6 manual &amp;quot;4.6.8. Stromsparfunktionen&amp;quot;! &lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
#ifndef RP6M256_SENSOR_BOARD_H&lt;br /&gt;
#define RP6M256_SENSOR_BOARD_H&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// RP6 Sensor Board hardwired components:&lt;br /&gt;
// - I2C I/O Port Expander (MAX7311)&lt;br /&gt;
// - I2C Real Time Clock (RTC DS1339)&lt;br /&gt;
// - I2C Temperature Sensor (LM75B)&lt;br /&gt;
// - I2C Servo Controller (PCA9685)&lt;br /&gt;
// - I2C LED Driver (TCA6507)&lt;br /&gt;
// - I2C 3D Magnetometer &amp;amp; Accelerometer (LSM303DLHC)&lt;br /&gt;
// - Analog Yaw-Rate Gyroscope (LY330ALH)&lt;br /&gt;
// - Hot Swappable 2-Wire Bus Buffer (TCA4311A)&lt;br /&gt;
// - Button&lt;br /&gt;
// - Status LED&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C I/O Port Expander (MAX7311):&lt;br /&gt;
#define I2C_SENSOR_PORTEXP_ADR			0x40	// Default&lt;br /&gt;
&lt;br /&gt;
// Interrupt I/O portpin definitions (RP6M256):&lt;br /&gt;
#define IO_SENSOR_INT1_IN				INT1_PI12 // PCINT12 PJ3  XBUS Pin 8&lt;br /&gt;
#define IO_SENSOR_INT1_DDR				DDRJ&lt;br /&gt;
#define IO_SENSOR_INT1_PIN				PINJ&lt;br /&gt;
#define IO_SENSOR_INT1_PORT				PORTJ&lt;br /&gt;
#define IO_SENSOR_INT2_IN				INT2_PI15 // PCINT15 PJ6  XBUS Pin 11&lt;br /&gt;
#define IO_SENSOR_INT2_DDR				DDRJ&lt;br /&gt;
#define IO_SENSOR_INT2_PIN				PINJ&lt;br /&gt;
#define IO_SENSOR_INT2_PORT				PORTJ&lt;br /&gt;
#define IO_SENSOR_INT3_IN				INT3_PI14 // PCINT14 PJ5  XBUS Pin 9&lt;br /&gt;
#define IO_SENSOR_INT3_DDR				DDRJ&lt;br /&gt;
#define IO_SENSOR_INT3_PIN				PINJ&lt;br /&gt;
#define IO_SENSOR_INT3_PORT				PORTJ&lt;br /&gt;
#define IO_SENSOR_INTU_IN				INTU_PI13 // PCINT13 PJ4  XBUS Pin 7&lt;br /&gt;
#define IO_SENSOR_INTU_DDR				DDRJ&lt;br /&gt;
#define IO_SENSOR_INTU_PIN				PINJ&lt;br /&gt;
#define IO_SENSOR_INTU_PORT				PORTJ&lt;br /&gt;
&lt;br /&gt;
// I/O PORT pin numbers:&lt;br /&gt;
#define PIN7							7&lt;br /&gt;
#define PIN6							6&lt;br /&gt;
#define PIN5							5&lt;br /&gt;
#define PIN4							4&lt;br /&gt;
#define PIN3							3&lt;br /&gt;
#define PIN2							2&lt;br /&gt;
#define PIN1							1&lt;br /&gt;
#define PIN0							0&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Real Time Clock (RTC DS1339):&lt;br /&gt;
#define I2C_SENSOR_RTC_ADR				0xd0	// Default&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Temperature Sensor (LM75B):&lt;br /&gt;
#define I2C_SENSOR_TEMP_ADR				0x90	// Default&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Servo Controller (PCA9685):&lt;br /&gt;
#define I2C_SENSOR_SERVO_ADR			0x88	// Default&lt;br /&gt;
&lt;br /&gt;
// Servo and PWM channels:&lt;br /&gt;
#define CH_SERVO_1						16		// At K6: 1  &amp;quot;SERVO_1&amp;quot;&lt;br /&gt;
#define CH_SERVO_2						15		// At K11: 1 &amp;quot;SERVO_2&amp;quot;&lt;br /&gt;
#define CH_SERVO_3						13		// At K29: 1 &amp;quot;SERVO_3&amp;quot;&lt;br /&gt;
#define CH_SERVO_4						14		// At K30: 1 &amp;quot;SERVO_4&amp;quot;&lt;br /&gt;
#define CH_SERVO_5						11		// At K31: 1 &amp;quot;SERVO_5&amp;quot;&lt;br /&gt;
#define CH_SERVO_6						12		// At K32: 1 &amp;quot;SERVO_6&amp;quot;&lt;br /&gt;
#define CH_SERVO_7						9		// At K33: 1 &amp;quot;SERVO_7&amp;quot;&lt;br /&gt;
#define CH_SERVO_8						10		// At K34: 1 &amp;quot;SERVO_8&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#define CH_PWM_OUT_1					1		// At K12: 1 &amp;quot;PWM_OUT&amp;quot;&lt;br /&gt;
#define CH_PWM_OUT_2					2		// At K12: 2&lt;br /&gt;
#define CH_PWM_OUT_3					3		// At K12: 3&lt;br /&gt;
#define CH_PWM_OUT_4					4		// At K12: 4&lt;br /&gt;
#define CH_PWM_OUT_5					5		// At K12: 5&lt;br /&gt;
#define CH_PWM_OUT_6					6		// At K12: 6&lt;br /&gt;
#define CH_PWM_OUT_7					7		// At K12: 7&lt;br /&gt;
#define CH_PWM_OUT_8					8		// At K12: 8&lt;br /&gt;
&lt;br /&gt;
// Servo left touch (LT), right touch (RT), middle position (MP) constants:&lt;br /&gt;
// (Hints: - Servo impulse length [ms] = Servo position value / 204.8&lt;br /&gt;
//           (Formula only valid for a PWM of 50 Hz!)&lt;br /&gt;
//         - Min. servo impulse (0,7 ms) = Servo position 143&lt;br /&gt;
//         - Mid. servo impulse (1,5 ms) = Servo position 307&lt;br /&gt;
//         - Max. servo impulse (2,3 ms) = Servo position 471&lt;br /&gt;
//         - !!! You should NOT use servo position values &amp;lt; 143 or &amp;gt; 471 !!!)&lt;br /&gt;
#define SERVO1_LT						205		// Servo impulse ~1ms&lt;br /&gt;
#define SERVO1_RT						410		// Servo impulse ~2ms&lt;br /&gt;
#define SERVO1_MP						((SERVO1_RT - SERVO1_LT) / 2 + SERVO1_LT)&lt;br /&gt;
#define SERVO2_LT						205&lt;br /&gt;
#define SERVO2_RT						410&lt;br /&gt;
#define SERVO2_MP						((SERVO2_RT - SERVO2_LT) / 2 + SERVO2_LT)&lt;br /&gt;
#define SERVO3_LT						205&lt;br /&gt;
#define SERVO3_RT						410&lt;br /&gt;
#define SERVO3_MP						((SERVO3_RT - SERVO3_LT) / 2 + SERVO3_LT)&lt;br /&gt;
#define SERVO4_LT						205&lt;br /&gt;
#define SERVO4_RT						410&lt;br /&gt;
#define SERVO4_MP						((SERVO4_RT - SERVO4_LT) / 2 + SERVO4_LT)&lt;br /&gt;
#define SERVO5_LT						205&lt;br /&gt;
#define SERVO5_RT						410&lt;br /&gt;
#define SERVO5_MP						((SERVO5_RT - SERVO5_LT) / 2 + SERVO5_LT)&lt;br /&gt;
#define SERVO6_LT						205&lt;br /&gt;
#define SERVO6_RT						410&lt;br /&gt;
#define SERVO6_MP						((SERVO6_RT - SERVO6_LT) / 2 + SERVO6_LT)&lt;br /&gt;
#define SERVO7_LT						205&lt;br /&gt;
#define SERVO7_RT						410&lt;br /&gt;
#define SERVO7_MP						((SERVO7_RT - SERVO7_LT) / 2 + SERVO7_LT)&lt;br /&gt;
#define SERVO8_LT						205&lt;br /&gt;
#define SERVO8_RT						410&lt;br /&gt;
#define SERVO8_MP						((SERVO8_RT - SERVO8_LT) / 2 + SERVO8_LT)&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C LED Driver (TCA6507):&lt;br /&gt;
#define I2C_SENSOR_LEDDRIVER_ADR		0x8a	// Default&lt;br /&gt;
&lt;br /&gt;
// LED numbers:&lt;br /&gt;
#define SB_LED0							0		// At K7&lt;br /&gt;
#define DISPLAY_BACKLIGHT				0		// Display background light&lt;br /&gt;
#define SB_LED1							1		// At K4&lt;br /&gt;
#define SB_LED2							2		// At K2&lt;br /&gt;
#define SB_LED3							3		// At K10: 1&lt;br /&gt;
#define BACKLIGHT_R						3		// Right backlight&lt;br /&gt;
#define SB_LED4							4		// At K10: 2&lt;br /&gt;
#define BACKLIGHT_L						4		// Left backlight&lt;br /&gt;
#define SB_LED5							5		// White LED (D3)&lt;br /&gt;
#define HEADLIGHT_R						5		// Right headlight&lt;br /&gt;
#define SB_LED6							6		// White LED (D1)&lt;br /&gt;
#define HEADLIGHT_L						6		// Left headlight&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C 3D Magnetometer &amp;amp; Accelerometer (LSM303DLHC):&lt;br /&gt;
&lt;br /&gt;
// LSM303DLHC accelerometer:&lt;br /&gt;
#define I2C_SENSOR_LSM303DLHC_A_ADR 	0x32	// Default&lt;br /&gt;
&lt;br /&gt;
// LSM303DLHC accelerometer calibration data:&lt;br /&gt;
#define MAX_X_A						1037		// Max. X-axis value&lt;br /&gt;
#define MIN_X_A						-1030		// Min. X-axis value&lt;br /&gt;
#define MAX_Y_A						1030		// Max. Y-axis value&lt;br /&gt;
#define MIN_Y_A						-1019		// Min. Y-axis value&lt;br /&gt;
#define MAX_Z_A						1062		// Max. Z-axis value&lt;br /&gt;
#define MIN_Z_A						-1056		// Min. Z-axis value&lt;br /&gt;
#define OFFSET_PITCH_A				0.0			// Offset Pitch [°]&lt;br /&gt;
#define OFFSET_ROLL_A				0.0			// Offset Roll [°]&lt;br /&gt;
&lt;br /&gt;
// LSM303DLHC magnetometer:&lt;br /&gt;
#define I2C_SENSOR_LSM303DLHC_M_ADR		0x3c	// Default&lt;br /&gt;
&lt;br /&gt;
// LSM303DLHC magnetometer calibration data:&lt;br /&gt;
#define MAX_X_M						-111.0		// Max. X-axis value&lt;br /&gt;
#define MIN_X_M						-634.0		// Min. X-axis value&lt;br /&gt;
#define OFFSET_X_M					0			// Hard iron X-axis offset&lt;br /&gt;
#define MAX_Y_M						297.0		// Max. Y-axis value&lt;br /&gt;
#define MIN_Y_M						-215.0		// Min. Y-axis value&lt;br /&gt;
#define OFFSET_Y_M					0			// Hard iron Y-axis offset&lt;br /&gt;
#define MAX_Z_M						183.0		// Max. Z-axis value&lt;br /&gt;
#define MIN_Z_M						-214.0		// Min. Z-axis value&lt;br /&gt;
#define OFFSET_Z_M					0			// Hard iron Z-axis offset&lt;br /&gt;
#define DECLINATION_M				0.0			// E at local position [°]&lt;br /&gt;
&lt;br /&gt;
// LSM303DLHC temperature sensor definitions:&lt;br /&gt;
#define GET_TEMP_M								// Enable temperature sensor&lt;br /&gt;
#define OFFSET_TEMP_M				0.0			// Temperature offset [°C]&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Analog Yaw-Rate Gyroscope (LY330ALH):&lt;br /&gt;
&lt;br /&gt;
// LY330ALH gyroscope:&lt;br /&gt;
#define ADC_SENSOR_LY330ALH				ADC_1	// At USRBUS: 2 (RP6BASE)&lt;br /&gt;
&lt;br /&gt;
// LY330ALH gyroscope calibration data:&lt;br /&gt;
// (Higher values [505..1023] mean an angular velocity while rotating LEFT&lt;br /&gt;
//  and lower values [503..0] while rotating RIGHT!)&lt;br /&gt;
#define ADCVAL_MINRATE					0		// Min. rate value&lt;br /&gt;
#define ADCVAL_ZERORATE_LEVEL			504		// Zero rate level&lt;br /&gt;
#define ADCVAL_MAXRATE					1023	// Max. rate value&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Hot Swappable 2-Wire Bus Buffer (TCA4311A):&lt;br /&gt;
&lt;br /&gt;
// Define USE_PD5, if you want to control the TCA4311A enable pin (EN) with&lt;br /&gt;
// the RP6 Sensor Board function &amp;quot;PD5&amp;quot;. If USE_PD5 is NOT defined (default),&lt;br /&gt;
// the TCA4311A EN pin is controlled by the MAX7311 I/O 1.0 pin.&lt;br /&gt;
// ---------------&lt;br /&gt;
//#define USE_PD5&lt;br /&gt;
// ---------------&lt;br /&gt;
&lt;br /&gt;
#define IO_SENSOR_TCA4311A_EN_IN		OC1B_PI6 // At I/O: 9 (RP6M256)&lt;br /&gt;
#define IO_SENSOR_TCA4311A_EN_DDR		DDRB&lt;br /&gt;
#define IO_SENSOR_TCA4311A_EN_PIN		PINB&lt;br /&gt;
#define IO_SENSOR_TCA4311A_EN_PORT		PORTB&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Button:&lt;br /&gt;
&lt;br /&gt;
// (Button is connected to I/O 1.7 of the MAX7311!)&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Status LED:&lt;br /&gt;
&lt;br /&gt;
// (Status LED is connected to I/O 1.6 of the MAX7311!)&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Other ADC channel definitions:&lt;br /&gt;
&lt;br /&gt;
// (Depending on connections on the RP6 Sensor Board!)&lt;br /&gt;
#define ADC_SENSOR_SHARP_F				ADC_0	// At USRBUS: 1 (RP6BASE)&lt;br /&gt;
#define ADC_SENSOR_SHARP_R				ADC_9	// At ADC: 3    (RP6M256)&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
/******************************************************************************&lt;br /&gt;
 * Additional info&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Changelog:&lt;br /&gt;
 * &lt;br /&gt;
 *  ---&amp;gt; changes are documented in the file &amp;quot;RP6M256_Sensor_BoardLib.c&amp;quot;&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=====Library Header=====&lt;br /&gt;
Datei: RP6M256_Sensor_BoardLib.h&lt;br /&gt;
&amp;lt;pre&amp;gt;/* ****************************************************************************&lt;br /&gt;
 *                           _______________________&lt;br /&gt;
 *                           \| RP6  ROBOT SYSTEM |/&lt;br /&gt;
 *                            \_-_-_-_-_-_-_-_-_-_/           &amp;gt;&amp;gt;&amp;gt; RP6 M256 WIFI&lt;br /&gt;
 * ----------------------------------------------------------------------------&lt;br /&gt;
 * ----------------------------- [c]2014 - Dirk -------------------------------&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * File: RP6M256_Sensor_BoardLib.h&lt;br /&gt;
 * Version: 1.1&lt;br /&gt;
 * Target: RP6 M256 WIFI - ATMEGA2560 @16.00MHz&lt;br /&gt;
 * Author(s): Dirk&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Description:&lt;br /&gt;
 * Header file for new RP6 Sensor Board library.&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
#ifndef RP6M256_SENSOR_BOARDLIB_H&lt;br /&gt;
#define RP6M256_SENSOR_BOARDLIB_H&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// RP6 Sensor Board hardwired components:&lt;br /&gt;
// - I2C I/O Port Expander (MAX7311)&lt;br /&gt;
// - I2C Real Time Clock (RTC DS1339)&lt;br /&gt;
// - I2C Temperature Sensor (LM75B)&lt;br /&gt;
// - I2C Servo Controller (PCA9685)&lt;br /&gt;
// - I2C LED Driver (TCA6507)&lt;br /&gt;
// - I2C 3D Magnetometer &amp;amp; Accelerometer (LSM303DLHC)&lt;br /&gt;
// - Analog Yaw-Rate Gyroscope (LY330ALH)&lt;br /&gt;
// - Hot Swappable 2-Wire Bus Buffer (TCA4311A)&lt;br /&gt;
// - Button&lt;br /&gt;
// - Status LED&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Includes:&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6M256Lib.h&amp;quot;&lt;br /&gt;
#include &amp;quot;RP6I2CmasterTWI.h&amp;quot;&lt;br /&gt;
#include &amp;quot;RP6M256_Sensor_Board.h&amp;quot;&lt;br /&gt;
#include &amp;lt;math.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// RP6M256_I2CMasterLib definitions:&lt;br /&gt;
&lt;br /&gt;
#ifndef I2C_RP6_BASE_ADR&lt;br /&gt;
	#define I2C_RP6_BASE_ADR			10&lt;br /&gt;
#endif&lt;br /&gt;
#ifndef I2C_REG_ADC_ADC0_L&lt;br /&gt;
	#define I2C_REG_ADC_ADC0_L			23&lt;br /&gt;
#endif&lt;br /&gt;
#ifndef I2C_REG_ADC_ADC1_L&lt;br /&gt;
	#define I2C_REG_ADC_ADC1_L			25&lt;br /&gt;
#endif&lt;br /&gt;
#ifndef CMD_POWER_OFF&lt;br /&gt;
	#define CMD_POWER_OFF				0&lt;br /&gt;
#endif&lt;br /&gt;
#ifndef CMD_POWER_ON&lt;br /&gt;
	#define CMD_POWER_ON				1&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C I/O Port Expander (MAX7311):&lt;br /&gt;
&lt;br /&gt;
// Registers:&lt;br /&gt;
#define MAX7311_INPUT_PORT1				0&lt;br /&gt;
#define MAX7311_INPUT_PORT2				1&lt;br /&gt;
#define MAX7311_OUTPUT_PORT1			2&lt;br /&gt;
#define MAX7311_OUTPUT_PORT2			3&lt;br /&gt;
#define MAX7311_PORT1_POL_INV			4&lt;br /&gt;
#define MAX7311_PORT2_POL_INV			5&lt;br /&gt;
#define MAX7311_PORT1_CONFIG			6&lt;br /&gt;
#define MAX7311_PORT2_CONFIG			7&lt;br /&gt;
#define MAX7311_TIMEOUT					8&lt;br /&gt;
&lt;br /&gt;
// Port 1 configuration register bitmasks:&lt;br /&gt;
#define ST_GYRO							(1 &amp;lt;&amp;lt; PIN7)	// I/O 0.7 (Output)&lt;br /&gt;
#define PD_GYRO							(1 &amp;lt;&amp;lt; PIN6)	// I/O 0.6 (Output)&lt;br /&gt;
#define PWR_CAM_IF						(1 &amp;lt;&amp;lt; PIN5)	// I/O 0.5 (Output)&lt;br /&gt;
#define EN_LEDDRIV						(1 &amp;lt;&amp;lt; PIN4)	// I/O 0.4 (Output)&lt;br /&gt;
#define RDY_BUSBUFF						(1 &amp;lt;&amp;lt; PIN3)	// I/O 0.3 (Input)&lt;br /&gt;
#define PWR_SHARP_R						(1 &amp;lt;&amp;lt; PIN2)	// I/O 0.2 (Output)&lt;br /&gt;
#define PWR_SHARP_F						(1 &amp;lt;&amp;lt; PIN1)	// I/O 0.1 (Output)&lt;br /&gt;
#define PWR_I2C							(1 &amp;lt;&amp;lt; PIN0)	// I/O 0.0 (Output)&lt;br /&gt;
&lt;br /&gt;
// Port 2 configuration register bitmasks:&lt;br /&gt;
#define IO2_I2C							(1 &amp;lt;&amp;lt; PIN7)	// I/O 1.7 (Input)&lt;br /&gt;
#define IO1_I2C							(1 &amp;lt;&amp;lt; PIN6)	// I/O 1.6 (Output)&lt;br /&gt;
#define DRDY_MAGACC						(1 &amp;lt;&amp;lt; PIN5)	// I/O 1.5 (Input)&lt;br /&gt;
#define PWR_SERVO						(1 &amp;lt;&amp;lt; PIN4)	// I/O 1.4 (Output)&lt;br /&gt;
#define OEN_SERVO						(1 &amp;lt;&amp;lt; PIN3)	// I/O 1.3 (Output)&lt;br /&gt;
#define IO_K19_1						(1 &amp;lt;&amp;lt; PIN2)	// I/O 1.2 (Input)&lt;br /&gt;
#define IO_K19_3						(1 &amp;lt;&amp;lt; PIN1)	// I/O 1.1 (Input)&lt;br /&gt;
#define EN_BUSBUFF						(1 &amp;lt;&amp;lt; PIN0)	// I/O 1.0 (Output)&lt;br /&gt;
&lt;br /&gt;
// Port 1 &amp;amp; 2 register 16-bit bitmasks:&lt;br /&gt;
// (CONFIG: 1 = Input, 0 = Output)&lt;br /&gt;
#define MAX7311_CONFIG_DEFAULT			0b1010011000001000&lt;br /&gt;
#define MAX7311_CONFIG_USE_PD5			0b1010011100001000&lt;br /&gt;
// (OUTPUT: 1 = High/True, 0 = Low/False)&lt;br /&gt;
#define MAX7311_OUTPUT_DEFAULT			0b0100000100010000&lt;br /&gt;
#define MAX7311_OUTPUT_FULLPOWER		0b0001000100110111&lt;br /&gt;
#define MAX7311_OUTPUT_SHUTDOWN			0b0100100011000000&lt;br /&gt;
&lt;br /&gt;
// Safe configuration:&lt;br /&gt;
// (Ensures if activated, that I/Os 0.3, 1.5 and 1.7 cannot be configured&lt;br /&gt;
//  as output with the function MAX7311_write_cfg(). This may protect the&lt;br /&gt;
//  RP6 Sensor Board from hardware damage.)&lt;br /&gt;
// -------------------&lt;br /&gt;
#define SAFE_CONFIG&lt;br /&gt;
// -------------------&lt;br /&gt;
&lt;br /&gt;
typedef union {&lt;br /&gt;
 	uint8_t byte;&lt;br /&gt;
	struct {&lt;br /&gt;
		unsigned int1   :1;				// INT1  XBUS Pin 8&lt;br /&gt;
		unsigned int2   :1;				// INT2  XBUS Pin 11&lt;br /&gt;
		unsigned int3   :1;				// INT3  XBUS Pin 9&lt;br /&gt;
		unsigned intu   :1;				// INTU  XBUS Pin 7&lt;br /&gt;
		unsigned unused :4;&lt;br /&gt;
	};&lt;br /&gt;
	struct {&lt;br /&gt;
		unsigned magacc1     :1;		// INT1: LSM303DLHC INT1&lt;br /&gt;
		unsigned portexp     :1;		// INT2: MAX7311 INT_N&lt;br /&gt;
		unsigned magacc2_rtc :1;		// INT3: LSM303DLHC INT2&lt;br /&gt;
		unsigned noname      :5;		//       OR DS1339 SQW/INT_N&lt;br /&gt;
	};&lt;br /&gt;
} interrupt_RP6SBstatus_t;&lt;br /&gt;
extern interrupt_RP6SBstatus_t interrupt_RP6SBstatus;&lt;br /&gt;
&lt;br /&gt;
typedef union {&lt;br /&gt;
	uint16_t word;&lt;br /&gt;
	struct {&lt;br /&gt;
		unsigned pwr_i2c     :1;		// I/O 0.0 (Output)&lt;br /&gt;
		unsigned pwr_sharp_f :1;		// I/O 0.1 (Output)&lt;br /&gt;
		unsigned pwr_sharp_r :1;		// I/O 0.2 (Output)&lt;br /&gt;
		unsigned rdy_busbuff :1;		// I/O 0.3 (Input)&lt;br /&gt;
		unsigned en_leddriv  :1;		// I/O 0.4 (Output)&lt;br /&gt;
		unsigned pwr_cam_if  :1;		// I/O 0.5 (Output)&lt;br /&gt;
		unsigned pd_gyro     :1;		// I/O 0.6 (Output)&lt;br /&gt;
		unsigned st_gyro     :1;		// I/O 0.7 (Output)&lt;br /&gt;
		unsigned en_busbuff  :1;		// I/O 1.0 (Output)&lt;br /&gt;
		unsigned io_k19_3    :1;		// I/O 1.1 (Input)&lt;br /&gt;
		unsigned io_k19_1    :1;		// I/O 1.2 (Input)&lt;br /&gt;
		unsigned oen_servo   :1;		// I/O 1.3 (Output)&lt;br /&gt;
		unsigned pwr_servo   :1;		// I/O 1.4 (Output)&lt;br /&gt;
		unsigned drdy_magacc :1;		// I/O 1.5 (Input)&lt;br /&gt;
		unsigned io1_i2c     :1;		// I/O 1.6 (Output)&lt;br /&gt;
		unsigned io2_i2c     :1;		// I/O 1.7 (Input)&lt;br /&gt;
	};&lt;br /&gt;
} max7311IOs_t;&lt;br /&gt;
extern max7311IOs_t inport;&lt;br /&gt;
extern max7311IOs_t outport;&lt;br /&gt;
extern uint8_t readyBusbuff;&lt;br /&gt;
extern uint8_t pressedButton;&lt;br /&gt;
&lt;br /&gt;
void MAX7311_write_cfg(uint16_t);&lt;br /&gt;
void task_checkINTs(void);&lt;br /&gt;
void task_RP6SensorBoard(void);&lt;br /&gt;
void MAX7311_update(void);&lt;br /&gt;
void MAX7311_write(uint16_t);&lt;br /&gt;
void MAX7311_init(void);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Real Time Clock (RTC DS1339):&lt;br /&gt;
&lt;br /&gt;
// Registers:&lt;br /&gt;
#define DS1339_SECONDS					0&lt;br /&gt;
#define DS1339_MINUTES					1&lt;br /&gt;
#define DS1339_HOURS					2&lt;br /&gt;
#define DS1339_DAY						3&lt;br /&gt;
#define DS1339_DATE						4&lt;br /&gt;
#define DS1339_MONTH_CENTURY			5&lt;br /&gt;
#define DS1339_YEAR						6&lt;br /&gt;
#define DS1339_ALARM1_SECONDS			7&lt;br /&gt;
#define DS1339_ALARM1_MINUTES			8&lt;br /&gt;
#define DS1339_ALARM1_HOURS				9&lt;br /&gt;
#define DS1339_ALARM1_DAY_DATE			10&lt;br /&gt;
#define DS1339_ALARM2_MINUTES			11&lt;br /&gt;
#define DS1339_ALARM2_HOURS				12&lt;br /&gt;
#define DS1339_ALARM2_DAY_DATE			13&lt;br /&gt;
#define DS1339_CONTROL					14&lt;br /&gt;
#define DS1339_STATUS					15&lt;br /&gt;
#define DS1339_TRICKLE_CHARGER			16&lt;br /&gt;
&lt;br /&gt;
// Control register bitmasks:&lt;br /&gt;
#define DS1339_CONTROL_DEFAULT			0		// Power on default&lt;br /&gt;
#define DS1339_CONTROL_A1IE				1&lt;br /&gt;
#define DS1339_CONTROL_A2IE				2&lt;br /&gt;
#define DS1339_CONTROL_INTCN			4&lt;br /&gt;
#define DS1339_CONTROL_RS1				8&lt;br /&gt;
#define DS1339_CONTROL_RS2				16&lt;br /&gt;
#define DS1339_CONTROL_BBSQI			32&lt;br /&gt;
#define DS1339_CONTROL_EOSC				128&lt;br /&gt;
&lt;br /&gt;
// Trickle Charger register bitmasks:&lt;br /&gt;
#define DS1339_TRICKLE_CHARGER_DEFAULT	0b10101010 // One diode, 2k resistor&lt;br /&gt;
#define DS1339_TRICKLE_CHARGER_ROUT0	1&lt;br /&gt;
#define DS1339_TRICKLE_CHARGER_ROUT1	2&lt;br /&gt;
#define DS1339_TRICKLE_CHARGER_DS0		4&lt;br /&gt;
#define DS1339_TRICKLE_CHARGER_DS1		8&lt;br /&gt;
#define DS1339_TRICKLE_CHARGER_TCS0		16&lt;br /&gt;
#define DS1339_TRICKLE_CHARGER_TCS1		32&lt;br /&gt;
#define DS1339_TRICKLE_CHARGER_TCS2		64&lt;br /&gt;
#define DS1339_TRICKLE_CHARGER_TCS3		128&lt;br /&gt;
&lt;br /&gt;
enum RTCWEEKDAYS {&lt;br /&gt;
	R_MO = 1, R_TU, R_WE, R_TH, R_FR, R_SA, R_SU&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
typedef struct {&lt;br /&gt;
	uint16_t         year;				// Year&lt;br /&gt;
	uint8_t          month;				// Month   [1..12]&lt;br /&gt;
	enum RTCWEEKDAYS weekday;			// Weekday [1..7 = R_MO..R_SU]&lt;br /&gt;
	uint8_t          day;				// Day     [1..31]&lt;br /&gt;
} rtcdate_t;&lt;br /&gt;
rtcdate_t rtc_date;&lt;br /&gt;
&lt;br /&gt;
typedef struct {&lt;br /&gt;
	uint8_t dst;						// Daylight-saving-time (time zone)&lt;br /&gt;
	uint8_t hour;						// Hour    [0..23]&lt;br /&gt;
	uint8_t minute;						// Minute  [0..59]&lt;br /&gt;
	uint8_t second;						// Second  [0..59]&lt;br /&gt;
} rtctime_t;&lt;br /&gt;
rtctime_t rtc_time;&lt;br /&gt;
&lt;br /&gt;
uint8_t BCD2DEC(uint8_t);&lt;br /&gt;
uint8_t DEC2BCD(uint8_t);&lt;br /&gt;
void DS1339_write_cfg(uint8_t);&lt;br /&gt;
void DS1339_init(void);&lt;br /&gt;
#define CALC_DST						// Time zone will be calculated&lt;br /&gt;
void DS1339_read(void);&lt;br /&gt;
void DS1339_write(void);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Temperature Sensor (LM75B):&lt;br /&gt;
&lt;br /&gt;
// Registers:&lt;br /&gt;
#define LM75B_TEMP						0&lt;br /&gt;
#define LM75B_CONF						1&lt;br /&gt;
#define LM75B_THYST						2&lt;br /&gt;
#define LM75B_TOS						3&lt;br /&gt;
&lt;br /&gt;
// Conf register bitmasks:&lt;br /&gt;
#define LM75B_CONF_DEFAULT				0		// Power on default&lt;br /&gt;
#define LM75B_CONF_SHUTDOWN				1&lt;br /&gt;
#define LM75B_CONF_OS_COMP_INT			2&lt;br /&gt;
#define LM75B_CONF_OS_POL				4&lt;br /&gt;
#define LM75B_CONF_OS_F_QUE0			8&lt;br /&gt;
#define LM75B_CONF_OS_F_QUE1			16&lt;br /&gt;
&lt;br /&gt;
extern double temperature;&lt;br /&gt;
&lt;br /&gt;
void LM75B_write_cfg(uint8_t);&lt;br /&gt;
#define LM75B_shutdown() {LM75B_write_cfg(LM75B_CONF_SHUTDOWN);}&lt;br /&gt;
#define LM75B_init() {LM75B_write_cfg(LM75B_CONF_DEFAULT);}&lt;br /&gt;
extern uint8_t temperature_low;&lt;br /&gt;
extern uint8_t temperature_high;&lt;br /&gt;
#define getTemperatureHigh() (temperature_high)&lt;br /&gt;
#define getTemperatureLow() (temperature_low)&lt;br /&gt;
void LM75B_read(void);&lt;br /&gt;
double LM75B_calculate(void);&lt;br /&gt;
double LM75B_measure(void);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Servo Controller (PCA9685):&lt;br /&gt;
&lt;br /&gt;
// Registers:&lt;br /&gt;
#define PCA9685_MODE1					0&lt;br /&gt;
#define PCA9685_MODE2					1&lt;br /&gt;
#define PCA9685_SUBADR1					2&lt;br /&gt;
#define PCA9685_SUBADR2					3&lt;br /&gt;
#define PCA9685_SUBADR3					4&lt;br /&gt;
#define PCA9685_ALLCALLADR				5&lt;br /&gt;
#define PCA9685_LED0_ON_L				6&lt;br /&gt;
#define PCA9685_LED0_ON_H				7&lt;br /&gt;
#define PCA9685_LED0_OFF_L				8&lt;br /&gt;
#define PCA9685_LED0_OFF_H				9&lt;br /&gt;
#define PCA9685_LED1_ON_L				10&lt;br /&gt;
#define PCA9685_LED1_ON_H				11&lt;br /&gt;
#define PCA9685_LED1_OFF_L				12&lt;br /&gt;
#define PCA9685_LED1_OFF_H				13&lt;br /&gt;
#define PCA9685_LED2_ON_L				14&lt;br /&gt;
#define PCA9685_LED2_ON_H				15&lt;br /&gt;
#define PCA9685_LED2_OFF_L				16&lt;br /&gt;
#define PCA9685_LED2_OFF_H				17&lt;br /&gt;
#define PCA9685_LED3_ON_L				18&lt;br /&gt;
#define PCA9685_LED3_ON_H				19&lt;br /&gt;
#define PCA9685_LED3_OFF_L				20&lt;br /&gt;
#define PCA9685_LED3_OFF_H				21&lt;br /&gt;
#define PCA9685_LED4_ON_L				22&lt;br /&gt;
#define PCA9685_LED4_ON_H				23&lt;br /&gt;
#define PCA9685_LED4_OFF_L				24&lt;br /&gt;
#define PCA9685_LED4_OFF_H				25&lt;br /&gt;
#define PCA9685_LED5_ON_L				26&lt;br /&gt;
#define PCA9685_LED5_ON_H				27&lt;br /&gt;
#define PCA9685_LED5_OFF_L				28&lt;br /&gt;
#define PCA9685_LED5_OFF_H				29&lt;br /&gt;
#define PCA9685_LED6_ON_L				30&lt;br /&gt;
#define PCA9685_LED6_ON_H				31&lt;br /&gt;
#define PCA9685_LED6_OFF_L				32&lt;br /&gt;
#define PCA9685_LED6_OFF_H				33&lt;br /&gt;
#define PCA9685_LED7_ON_L				34&lt;br /&gt;
#define PCA9685_LED7_ON_H				35&lt;br /&gt;
#define PCA9685_LED7_OFF_L				36&lt;br /&gt;
#define PCA9685_LED7_OFF_H				37&lt;br /&gt;
#define PCA9685_LED8_ON_L				38&lt;br /&gt;
#define PCA9685_LED8_ON_H				39&lt;br /&gt;
#define PCA9685_LED8_OFF_L				40&lt;br /&gt;
#define PCA9685_LED8_OFF_H				41&lt;br /&gt;
#define PCA9685_LED9_ON_L				42&lt;br /&gt;
#define PCA9685_LED9_ON_H				43&lt;br /&gt;
#define PCA9685_LED9_OFF_L				44&lt;br /&gt;
#define PCA9685_LED9_OFF_H				45&lt;br /&gt;
#define PCA9685_LED10_ON_L				46&lt;br /&gt;
#define PCA9685_LED10_ON_H				47&lt;br /&gt;
#define PCA9685_LED10_OFF_L				48&lt;br /&gt;
#define PCA9685_LED10_OFF_H				49&lt;br /&gt;
#define PCA9685_LED11_ON_L				50&lt;br /&gt;
#define PCA9685_LED11_ON_H				51&lt;br /&gt;
#define PCA9685_LED11_OFF_L				52&lt;br /&gt;
#define PCA9685_LED11_OFF_H				53&lt;br /&gt;
#define PCA9685_LED12_ON_L				54&lt;br /&gt;
#define PCA9685_LED12_ON_H				55&lt;br /&gt;
#define PCA9685_LED12_OFF_L				56&lt;br /&gt;
#define PCA9685_LED12_OFF_H				57&lt;br /&gt;
#define PCA9685_LED13_ON_L				58&lt;br /&gt;
#define PCA9685_LED13_ON_H				59&lt;br /&gt;
#define PCA9685_LED13_OFF_L				60&lt;br /&gt;
#define PCA9685_LED13_OFF_H				61&lt;br /&gt;
#define PCA9685_LED14_ON_L				62&lt;br /&gt;
#define PCA9685_LED14_ON_H				63&lt;br /&gt;
#define PCA9685_LED14_OFF_L				64&lt;br /&gt;
#define PCA9685_LED14_OFF_H				65&lt;br /&gt;
#define PCA9685_LED15_ON_L				66&lt;br /&gt;
#define PCA9685_LED15_ON_H				67&lt;br /&gt;
#define PCA9685_LED15_OFF_L				68&lt;br /&gt;
#define PCA9685_LED15_OFF_H				69&lt;br /&gt;
#define PCA9685_ALL_LED_ON_L			250&lt;br /&gt;
#define PCA9685_ALL_LED_ON_H			251&lt;br /&gt;
#define PCA9685_ALL_LED_OFF_L			252&lt;br /&gt;
#define PCA9685_ALL_LED_OFF_H			253&lt;br /&gt;
#define PCA9685_PRE_SCALE				254&lt;br /&gt;
#define PCA9685_TESTMODE				255&lt;br /&gt;
&lt;br /&gt;
// Mode1 register bitmasks:&lt;br /&gt;
#define PCA9685_MODE1_ALLCALL			1&lt;br /&gt;
#define PCA9685_MODE1_SUB3				2&lt;br /&gt;
#define PCA9685_MODE1_SUB2				4&lt;br /&gt;
#define PCA9685_MODE1_SUB1				8&lt;br /&gt;
#define PCA9685_MODE1_SLEEP				16&lt;br /&gt;
#define PCA9685_MODE1_AI				32&lt;br /&gt;
#define PCA9685_MODE1_EXTCLK			64&lt;br /&gt;
#define PCA9685_MODE1_RESTART			128&lt;br /&gt;
&lt;br /&gt;
// Mode2 register bitmasks:&lt;br /&gt;
#define PCA9685_MODE2_OUTNE01_DEFAULT	0&lt;br /&gt;
#define PCA9685_MODE2_OUTDRV			4&lt;br /&gt;
#define PCA9685_MODE2_OCH				8&lt;br /&gt;
#define PCA9685_MODE2_INVRT				16&lt;br /&gt;
&lt;br /&gt;
#define F_PCA9685						25000000.0	// Int. Clock: 25 MHz&lt;br /&gt;
&lt;br /&gt;
void PCA9685_init(uint16_t);&lt;br /&gt;
#define initServo(__FREQ__) {PCA9685_init(__FREQ__);}&lt;br /&gt;
uint8_t servo(uint8_t);&lt;br /&gt;
void PCA9685_set(uint8_t, uint16_t);&lt;br /&gt;
#define setServo(__SERVO__,__POS__) {PCA9685_set(servo(__SERVO__),__POS__);}&lt;br /&gt;
void PCA9685_shutdown(void);&lt;br /&gt;
void PCA9685_restart(void);&lt;br /&gt;
void setServoPower(uint8_t);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C LED Driver (TCA6507):&lt;br /&gt;
&lt;br /&gt;
// Registers:&lt;br /&gt;
#define TCA6507_SELECT0				0&lt;br /&gt;
#define TCA6507_SELECT1				1&lt;br /&gt;
#define TCA6507_SELECT2				2&lt;br /&gt;
#define TCA6507_FADEON_TIME			3&lt;br /&gt;
#define TCA6507_FULLYON_TIME		4&lt;br /&gt;
#define TCA6507_FADEOFF_TIME		5&lt;br /&gt;
#define TCA6507_1ST_FULLYOFF_TIME	6&lt;br /&gt;
#define TCA6507_2ND_FULLYOFF_TIME	7&lt;br /&gt;
#define TCA6507_MAXIMUM_INTENSITY	8&lt;br /&gt;
#define TCA6507_MASTER_INTENSITY	9&lt;br /&gt;
#define TCA6507_INITIALIZATION		10&lt;br /&gt;
&lt;br /&gt;
// Output states:&lt;br /&gt;
#define STATE_OFF					0&lt;br /&gt;
#define STATE_PWM0					2&lt;br /&gt;
#define STATE_PWM1					3&lt;br /&gt;
#define STATE_ON					4&lt;br /&gt;
#define STATE_MINT					5&lt;br /&gt;
#define STATE_BLINK0				6&lt;br /&gt;
#define STATE_BLINK1				7&lt;br /&gt;
&lt;br /&gt;
extern uint8_t select[3];&lt;br /&gt;
&lt;br /&gt;
void TCA6507_write_cfg(uint8_t, uint8_t);&lt;br /&gt;
void TCA6507_update(void);&lt;br /&gt;
void TCA6507_set(uint8_t, uint8_t);&lt;br /&gt;
#define setLED(__LED__,__STATE__) {TCA6507_set(__LED__,__STATE__);}&lt;br /&gt;
void TCA6507_shutdown(void);&lt;br /&gt;
void TCA6507_restart(void);&lt;br /&gt;
void TCA6507_init(void);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C 3D Magnetometer &amp;amp; Accelerometer (LSM303DLHC):&lt;br /&gt;
&lt;br /&gt;
// LSM303DLHC accelerometer internal registers:&lt;br /&gt;
#define CTRL_REG1_A					0x20&lt;br /&gt;
#define CTRL_REG2_A					0x21&lt;br /&gt;
#define CTRL_REG3_A					0x22&lt;br /&gt;
#define CTRL_REG4_A					0x23&lt;br /&gt;
#define CTRL_REG5_A					0x24&lt;br /&gt;
#define CTRL_REG6_A					0x25&lt;br /&gt;
#define REFERENCE_A					0x26&lt;br /&gt;
#define STATUS_REG_A				0x27&lt;br /&gt;
#define OUT_X_L_A					0x28&lt;br /&gt;
#define OUT_X_H_A					0x29&lt;br /&gt;
#define OUT_Y_L_A					0x2a&lt;br /&gt;
#define OUT_Y_H_A					0x2b&lt;br /&gt;
#define OUT_Z_L_A					0x2c&lt;br /&gt;
#define OUT_Z_H_A					0x2d&lt;br /&gt;
#define FIFO_CTRL_REG_A				0x2e&lt;br /&gt;
#define FIFO_SRC_REG_A				0x2f&lt;br /&gt;
#define INT1_CFG_A					0x30&lt;br /&gt;
#define INT1_SOURCE_A				0x31&lt;br /&gt;
#define INT1_THS_A					0x32&lt;br /&gt;
#define INT1_DURATION_A				0x33&lt;br /&gt;
#define INT2_CFG_A					0x34&lt;br /&gt;
#define INT2_SOURCE_A				0x35&lt;br /&gt;
#define INT2_THS_A					0x36&lt;br /&gt;
#define INT2_DURATION_A				0x37&lt;br /&gt;
#define CLICK_CFG_A					0x38&lt;br /&gt;
#define CLICK_SRC_A					0x39&lt;br /&gt;
#define CLICK_THS_A					0x3a&lt;br /&gt;
#define TIME_LIMIT_A				0x3b&lt;br /&gt;
#define TIME_LATENCY_A				0x3c&lt;br /&gt;
#define TIME_WINDOW_A				0x3d&lt;br /&gt;
&lt;br /&gt;
// LSM303DLHC accelerometer register settings:&lt;br /&gt;
#define CTRL_REG1_A_10HZ			0b00100111	// 10Hz &amp;amp; all axes enable&lt;br /&gt;
#define CTRL_REG1_A_50HZ			0b01000111	// 50Hz &amp;amp; all axes enable&lt;br /&gt;
#define CTRL_REG4_A_DEFAULT			0b00000000	// Default (Normal mode)&lt;br /&gt;
#define CTRL_REG4_A_HR				0b00001000	// HR output mode&lt;br /&gt;
&lt;br /&gt;
// LSM303DLHC magnetometer internal registers:&lt;br /&gt;
#define CRA_REG_M					0x00&lt;br /&gt;
#define CRB_REG_M					0x01&lt;br /&gt;
#define MR_REG_M					0x02&lt;br /&gt;
#define OUT_X_H_M					0x03&lt;br /&gt;
#define OUT_X_L_M					0x04&lt;br /&gt;
#define OUT_Z_H_M					0x05&lt;br /&gt;
#define OUT_Z_L_M					0x06&lt;br /&gt;
#define OUT_Y_H_M					0x07&lt;br /&gt;
#define OUT_Y_L_M					0x08&lt;br /&gt;
#define SR_REG_MG					0x09&lt;br /&gt;
#define IRA_REG_M					0x0a&lt;br /&gt;
#define IRB_REG_M					0x0b&lt;br /&gt;
#define IRC_REG_M					0x0c&lt;br /&gt;
#define TEMP_OUT_H_M				0x31&lt;br /&gt;
#define TEMP_OUT_L_M				0x32&lt;br /&gt;
&lt;br /&gt;
// LSM303DLHC magnetometer register settings:&lt;br /&gt;
#define CRA_REG_M_15HZ				0b00010000	// Default (Data rate 15Hz)&lt;br /&gt;
#define CRA_REG_M_15HZ_T_EN			0b10010000	// 15Hz &amp;amp; temperature enable&lt;br /&gt;
#define CRB_REG_M_13GAUSS			0b00100000	// Gain +-1.3Gauss&lt;br /&gt;
#define MR_REG_M_CCM				0b00000000	// Continuous-conversion mode&lt;br /&gt;
#define MR_REG_M_SCM				0b00000001	// Single-conversion mode&lt;br /&gt;
#define MR_REG_M_SLEEP				0b00000011	// Default (Sleep-mode)&lt;br /&gt;
&lt;br /&gt;
extern int16_t x_axisa, y_axisa, z_axisa;&lt;br /&gt;
extern double pitch, roll;&lt;br /&gt;
extern double xa, ya, za;&lt;br /&gt;
extern double the, phi;&lt;br /&gt;
&lt;br /&gt;
extern int16_t x_axism, y_axism, z_axism;&lt;br /&gt;
extern int16_t headingm;&lt;br /&gt;
extern double xm, ym, zm;&lt;br /&gt;
#ifdef GET_TEMP_M&lt;br /&gt;
extern int16_t temperaturem;&lt;br /&gt;
extern double temperature_mag;&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
extern int16_t headingtc;&lt;br /&gt;
&lt;br /&gt;
void LSM303DLHC_A_init(void);&lt;br /&gt;
void readLSM303DLHC_A(void);&lt;br /&gt;
void normalizeLSM303DLHC_A(void);&lt;br /&gt;
void positionLSM303DLHC_A(void);&lt;br /&gt;
&lt;br /&gt;
void LSM303DLHC_M_init(void);&lt;br /&gt;
void readLSM303DLHC_M(void);&lt;br /&gt;
void normalizeLSM303DLHC_M(void);&lt;br /&gt;
int16_t headingLSM303DLHC_M(void);&lt;br /&gt;
&lt;br /&gt;
int16_t headingLSM303DLHC_TC(void);&lt;br /&gt;
&lt;br /&gt;
void LSM303DLHC_init(void);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Analog Yaw-Rate Gyroscope (LY330ALH):&lt;br /&gt;
&lt;br /&gt;
#define LY330ALH_MODE_NORMAL		0			// Power on default&lt;br /&gt;
#define LY330ALH_MODE_SLEEP			1&lt;br /&gt;
#define LY330ALH_MODE_SELFTEST		2&lt;br /&gt;
#define LY330ALH_MODE_POWERDOWN		3			// Shutdown mode&lt;br /&gt;
&lt;br /&gt;
extern int16_t z_axisg;&lt;br /&gt;
&lt;br /&gt;
void LY330ALH_set_mode(uint8_t);&lt;br /&gt;
uint16_t getRP6Base_ADC1(void);&lt;br /&gt;
int16_t LY330ALH_measure(void);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Hot Swappable 2-Wire Bus Buffer (TCA4311A):&lt;br /&gt;
&lt;br /&gt;
//extern uint8_t readyBusbuff;			// See &amp;quot;I2C I/O Port Expander&amp;quot; section&lt;br /&gt;
extern uint8_t errorBusbuff;&lt;br /&gt;
&lt;br /&gt;
#define getReadyBusbuff() (readyBusbuff)&lt;br /&gt;
uint8_t readReadyBusbuff(void);&lt;br /&gt;
void TCA4311A_shutdown(void);&lt;br /&gt;
void TCA4311A_reconnect(void);&lt;br /&gt;
void setRP6Base_PWR(uint8_t);&lt;br /&gt;
void setI2CModulePower(uint8_t);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Button:&lt;br /&gt;
&lt;br /&gt;
//extern uint8_t pressedButton;			// See &amp;quot;I2C I/O Port Expander&amp;quot; section&lt;br /&gt;
&lt;br /&gt;
#define getPressedButton() (pressedButton)&lt;br /&gt;
uint8_t readButton(void);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Status LED:&lt;br /&gt;
&lt;br /&gt;
void setStatusLED(uint8_t);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// RP6 Sensor Board initialisation and shutdown:&lt;br /&gt;
&lt;br /&gt;
void sensor_board_init(void);&lt;br /&gt;
void sensor_board_shutdown(void);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
/******************************************************************************&lt;br /&gt;
 * Additional info&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Changelog:&lt;br /&gt;
 * &lt;br /&gt;
 *  ---&amp;gt; changes are documented in the file &amp;quot;RP6M256_Sensor_BoardLib.c&amp;quot;&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=====Library Source=====&lt;br /&gt;
Datei: RP6M256_Sensor_BoardLib.c&lt;br /&gt;
&amp;lt;pre&amp;gt;/* ****************************************************************************&lt;br /&gt;
 *                           _______________________&lt;br /&gt;
 *                           \| RP6  ROBOT SYSTEM |/&lt;br /&gt;
 *                            \_-_-_-_-_-_-_-_-_-_/           &amp;gt;&amp;gt;&amp;gt; RP6 M256 WIFI&lt;br /&gt;
 * ----------------------------------------------------------------------------&lt;br /&gt;
 * ----------------------------- [c]2014 - Dirk -------------------------------&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * File: RP6M256_Sensor_BoardLib.c&lt;br /&gt;
 * Version: 1.1&lt;br /&gt;
 * Target: RP6 M256 WIFI - ATMEGA2560 @16.00MHz&lt;br /&gt;
 *         and a RP6 Sensor Board (CONRAD 1082384)&lt;br /&gt;
 * Author(s): Dirk&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Description:&lt;br /&gt;
 * This is our new Library that contains basic routines and functions for&lt;br /&gt;
 * accessing the hardwired components of the RP6 Sensor Board (CONRAD 1082384).&lt;br /&gt;
 * This library assumes the RP6 Sensor Board Revision 2.0 (04.07.13).&lt;br /&gt;
 *&lt;br /&gt;
 * There are more sensors and actors, that may be connected to the RP6 Sensor&lt;br /&gt;
 * Board: Many I2C components including a GPS module (CONRAD 1082385), servo&lt;br /&gt;
 *        motors, SHARP IR distance sensors, LEDs, a camera ...&lt;br /&gt;
 * This library doesn't contain functions for these sensors/actors, because&lt;br /&gt;
 * they are not HARDWIRED to the RP6 Sensor Board and may be connected&lt;br /&gt;
 * OPTIONALLY.&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// RP6 Sensor Board hardwired components:&lt;br /&gt;
// - I2C I/O Port Expander (MAX7311)&lt;br /&gt;
// - I2C Real Time Clock (RTC DS1339)&lt;br /&gt;
// - I2C Temperature Sensor (LM75B)&lt;br /&gt;
// - I2C Servo Controller (PCA9685)&lt;br /&gt;
// - I2C LED Driver (TCA6507)&lt;br /&gt;
// - I2C 3D Magnetometer &amp;amp; Accelerometer (LSM303DLHC)&lt;br /&gt;
// - Analog Yaw-Rate Gyroscope (LY330ALH)&lt;br /&gt;
// - Hot Swappable 2-Wire Bus Buffer (TCA4311A)&lt;br /&gt;
// - Button&lt;br /&gt;
// - Status LED&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Includes:&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6M256_Sensor_BoardLib.h&amp;quot; 		&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Variables:&lt;br /&gt;
&lt;br /&gt;
uint8_t registerBuf[13]; &lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C I/O Port Expander (MAX7311):&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Sends the configuration word to a MAX7311.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: config -&amp;gt; Config word for control&lt;br /&gt;
 *                  registers&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void MAX7311_write_cfg(uint16_t config)&lt;br /&gt;
{&lt;br /&gt;
#ifdef SAFE_CONFIG&lt;br /&gt;
	config |= 0b1010000000001000;&lt;br /&gt;
#endif&lt;br /&gt;
	I2CTWI_transmit3Bytes(I2C_SENSOR_PORTEXP_ADR, MAX7311_PORT1_CONFIG, config, (config&amp;gt;&amp;gt;8));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
interrupt_RP6SBstatus_t interrupt_RP6SBstatus;&lt;br /&gt;
&lt;br /&gt;
/** &lt;br /&gt;
 * This function checks all interrupt pins on&lt;br /&gt;
 * the XBUS (INT1..3, INTU).&lt;br /&gt;
 * This function must be called VERY frequently&lt;br /&gt;
 * out of the main loop.&lt;br /&gt;
 * Bigger delays result in slower reaction to&lt;br /&gt;
 * interrupt requests of the RP6 Sensor Board.&lt;br /&gt;
 * Interrupt function table:&lt;br /&gt;
 *   Int. : Function 1      IRQ  Function 2       IRQ&lt;br /&gt;
 *   -------------------------------------------------&lt;br /&gt;
 *   INT1 : LSM303DLHC INT1  H&lt;br /&gt;
 *   INT2 : MAX7311   INT_N  L&lt;br /&gt;
 *   INT3 : LSM303DLHC INT2  H   DS1339 SQW/INT_N  L&lt;br /&gt;
 *   INTU : not used&lt;br /&gt;
 * You can see in the &amp;quot;IRQ&amp;quot; column, which level&lt;br /&gt;
 * (H/L) means an ACTIVE INTERRUPT signal.&lt;br /&gt;
 * The interrupt pin levels (H=true/L=false) are&lt;br /&gt;
 * read into the global interrupt_RP6SBstatus&lt;br /&gt;
 * variable.&lt;br /&gt;
 *&lt;br /&gt;
 * Hints: - This function checks the interrupt&lt;br /&gt;
 *          signals by polling. This is NOT the&lt;br /&gt;
 *          best way to do this job. You will&lt;br /&gt;
 *          have to write your own task, if you&lt;br /&gt;
 *          want to use the Pin Change Interrupt&lt;br /&gt;
 *          function of the ATmega2560&lt;br /&gt;
 *          microcontroller.&lt;br /&gt;
 *        - You cannot use both interrupt sources&lt;br /&gt;
 *          for INT3! So you should not use INT2&lt;br /&gt;
 *          of the LSM303DLHC together with the&lt;br /&gt;
 *          alarm function of the DS1339 (RTC)!&lt;br /&gt;
 *        - Every interrupt signal of the Sensor&lt;br /&gt;
 *          Board may be cut off from the XBUS&lt;br /&gt;
 *          by opening a jumper (Jx):&lt;br /&gt;
 *          INT1 -&amp;gt; J3 (LSM303DLHC INT1)&lt;br /&gt;
 *          INT2 -&amp;gt; J4 (MAX7311 INT_N)&lt;br /&gt;
 *          INT3 -&amp;gt; J2 (DS1339 SQW/INT_N)&lt;br /&gt;
 *          INT3 -&amp;gt; J5 (LSM303DLHC INT2)&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *&lt;br /&gt;
 *   if (!interrupt_RP6SBstatus.portexp)&lt;br /&gt;
 *        writeString_P(&amp;quot;==&amp;gt; MAX7311 INT_N!!!&amp;quot;);&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void task_checkINTs(void)&lt;br /&gt;
{&lt;br /&gt;
	if(IO_SENSOR_INT1_PIN &amp;amp; IO_SENSOR_INT1_IN)	// XBUS INT1 -&amp;gt; PJ3 (PCINT12)&lt;br /&gt;
		interrupt_RP6SBstatus.int1 = true;&lt;br /&gt;
	else&lt;br /&gt;
		interrupt_RP6SBstatus.int1 = false;&lt;br /&gt;
	if(IO_SENSOR_INT2_PIN &amp;amp; IO_SENSOR_INT2_IN)	// XBUS INT2 -&amp;gt; PJ6 (PCINT15)&lt;br /&gt;
		interrupt_RP6SBstatus.int2 = true;&lt;br /&gt;
	else&lt;br /&gt;
		interrupt_RP6SBstatus.int2 = false;&lt;br /&gt;
	if(IO_SENSOR_INT3_PIN &amp;amp; IO_SENSOR_INT3_IN)	// XBUS INT3 -&amp;gt; PJ5 (PCINT14)&lt;br /&gt;
		interrupt_RP6SBstatus.int3 = true;&lt;br /&gt;
	else&lt;br /&gt;
		interrupt_RP6SBstatus.int3 = false;&lt;br /&gt;
//	if(IO_SENSOR_INTU_PIN &amp;amp; IO_SENSOR_INTU_IN)	// XBUS INTU -&amp;gt; PJ4 (PCINT13)&lt;br /&gt;
//		interrupt_RP6SBstatus.intu = true;&lt;br /&gt;
//	else&lt;br /&gt;
//		interrupt_RP6SBstatus.intu = false;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
max7311IOs_t inport;&lt;br /&gt;
uint8_t readyBusbuff;&lt;br /&gt;
uint8_t pressedButton;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function checks all I/O ports (I/O 0.0..1.7)&lt;br /&gt;
 * of the MAX7311 sequentially!&lt;br /&gt;
 * You must call this function frequently out of&lt;br /&gt;
 * the main loop.&lt;br /&gt;
 * The I/O port values (true/false) are read into&lt;br /&gt;
 * the global inport variable.&lt;br /&gt;
 * The global variables readyBusbuff (2-Wire Bus&lt;br /&gt;
 * Buffer: Enable) and pressedButton (Button S1:&lt;br /&gt;
 * Pressed) contain actual values (true/false)&lt;br /&gt;
 * after execution of this task.&lt;br /&gt;
 *&lt;br /&gt;
 * Examples:&lt;br /&gt;
 *&lt;br /&gt;
 *   if (inport.rdy_busbuff)&lt;br /&gt;
 *        writeString_P(&amp;quot;I/O 0.3: High&amp;quot;);&lt;br /&gt;
 *   else writeString_P(&amp;quot;I/O 0.3: Low&amp;quot;);&lt;br /&gt;
 *   if (!inport.drdy_magacc)&lt;br /&gt;
 *        writeString_P(&amp;quot;I/O 1.5: Low&amp;quot;);&lt;br /&gt;
 *   if (pressedButton)&lt;br /&gt;
 *        writeString_P(&amp;quot;Button pressed!&amp;quot;);&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void task_RP6SensorBoard(void)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmitByte(I2C_SENSOR_PORTEXP_ADR, MAX7311_INPUT_PORT1);&lt;br /&gt;
	I2CTWI_readBytes(I2C_SENSOR_PORTEXP_ADR, registerBuf, 2);&lt;br /&gt;
	inport.word = (registerBuf[1] &amp;lt;&amp;lt; 8) + registerBuf[0];&lt;br /&gt;
	readyBusbuff = inport.rdy_busbuff;&lt;br /&gt;
	pressedButton = inport.io2_i2c;&lt;br /&gt;
	pressedButton = !pressedButton;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
max7311IOs_t outport;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Updates the I/O ports with current value from&lt;br /&gt;
 * the global outport variable!&lt;br /&gt;
 * If one or more port pins were configured as&lt;br /&gt;
 * output before, they will be set (high) or&lt;br /&gt;
 * cleared (low).&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *&lt;br /&gt;
 *   outport.word = 0b0000000000001001;&lt;br /&gt;
 *   MAX7311_update();&lt;br /&gt;
 *   // This clears all I/O ports and sets&lt;br /&gt;
 *   // the ports I/O 0.0 and I/O 0.3!&lt;br /&gt;
 *&lt;br /&gt;
 *   // Other possibility:&lt;br /&gt;
 *   outport.pwr_sharp_f = true;&lt;br /&gt;
 *   MAX7311_update();&lt;br /&gt;
 *   // This sets I/O 0.1 and does not&lt;br /&gt;
 *   // affect any other I/O port!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void MAX7311_update(void)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmit3Bytes(I2C_SENSOR_PORTEXP_ADR, MAX7311_OUTPUT_PORT1, outport.word, (outport.word&amp;gt;&amp;gt;8));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Writes the 16-bit data to a MAX7311.&lt;br /&gt;
 * The data are output with those I/O ports that&lt;br /&gt;
 * were configured as output before.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: data -&amp;gt; Data word&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void MAX7311_write(uint16_t data)&lt;br /&gt;
{&lt;br /&gt;
	outport.word = data;&lt;br /&gt;
	MAX7311_update();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Initializes the I/O Port Expander after power&lt;br /&gt;
 * on.&lt;br /&gt;
 *&lt;br /&gt;
 * Hint: If USE_PD5 is defined in the&lt;br /&gt;
 *       configuration header file, this&lt;br /&gt;
 *       function uses the RP6M256 portpin,&lt;br /&gt;
 *       that is connected to plug I/O: Pin 9&lt;br /&gt;
 *       instead of MAX7311 I/O 1.0!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void MAX7311_init(void)&lt;br /&gt;
{&lt;br /&gt;
#ifdef USE_PD5&lt;br /&gt;
	MAX7311_write_cfg(MAX7311_CONFIG_USE_PD5);&lt;br /&gt;
	IO_SENSOR_TCA4311A_EN_DDR |= IO_SENSOR_TCA4311A_EN_IN;		// Output&lt;br /&gt;
	IO_SENSOR_TCA4311A_EN_PORT |= IO_SENSOR_TCA4311A_EN_IN;		// High&lt;br /&gt;
#else&lt;br /&gt;
	MAX7311_write_cfg(MAX7311_CONFIG_DEFAULT);&lt;br /&gt;
#endif&lt;br /&gt;
	MAX7311_write(MAX7311_OUTPUT_DEFAULT);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Real Time Clock (RTC DS1339):&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function converts a BCD to a DEC value.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
uint8_t BCD2DEC(uint8_t bcd)&lt;br /&gt;
{&lt;br /&gt;
	return ((bcd &amp;gt;&amp;gt; 4) * 10 + (bcd &amp;amp; 0x0f));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function converts a DEC to a BCD value.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
uint8_t DEC2BCD(uint8_t dec)&lt;br /&gt;
{uint8_t units = dec % 10;&lt;br /&gt;
	if (dec /= 10) {&lt;br /&gt;
		return (units + (DEC2BCD(dec) &amp;lt;&amp;lt; 4));&lt;br /&gt;
	}&lt;br /&gt;
	else {&lt;br /&gt;
		return units;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Sends the configuration byte to a DS1339.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: Config byte for control register&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void DS1339_write_cfg(uint8_t config)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_RTC_ADR, DS1339_CONTROL, config);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Initializes the DS1339 Trickle Charger&lt;br /&gt;
 * function to the default for the RP6 Sensor&lt;br /&gt;
 * Board: One diode and 2kOhm resistor.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void DS1339_init(void)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_RTC_ADR, DS1339_TRICKLE_CHARGER, DS1339_TRICKLE_CHARGER_DEFAULT);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Reads all data registers of the Real Time Clock (RTC).&lt;br /&gt;
 * They are stored in the time &amp;amp; date variables defined in&lt;br /&gt;
 * the library header.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void DS1339_read(void)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmitByte(I2C_SENSOR_RTC_ADR, DS1339_SECONDS);&lt;br /&gt;
	I2CTWI_readBytes(I2C_SENSOR_RTC_ADR, registerBuf, 7);&lt;br /&gt;
	rtc_time.second = BCD2DEC(registerBuf[0]);&lt;br /&gt;
	rtc_time.minute = BCD2DEC(registerBuf[1]);&lt;br /&gt;
	rtc_time.hour = BCD2DEC(registerBuf[2] &amp;amp; 0x3f);&lt;br /&gt;
	rtc_date.weekday = (registerBuf[3] &amp;amp; 0x07);&lt;br /&gt;
	rtc_date.day = BCD2DEC(registerBuf[4]);&lt;br /&gt;
	rtc_date.month = BCD2DEC(registerBuf[5] &amp;amp; 0x7f);&lt;br /&gt;
	if(registerBuf[5] &amp;amp; 0x80) rtc_date.year = 100;&lt;br /&gt;
	else rtc_date.year = 0;&lt;br /&gt;
	rtc_date.year += BCD2DEC(registerBuf[6]);&lt;br /&gt;
	rtc_date.year += 2000;&lt;br /&gt;
	rtc_time.dst = 0;&lt;br /&gt;
#ifdef CALC_DST&lt;br /&gt;
	// Calculate MESZ (DST):&lt;br /&gt;
	uint8_t wday = rtc_date.weekday;			// Weekday [1..7 = R_MO..R_SU]&lt;br /&gt;
	if(wday == 7) wday = 0;&lt;br /&gt;
	if(rtc_date.month &amp;lt; 3 || rtc_date.month &amp;gt; 10) {&lt;br /&gt;
		return;&lt;br /&gt;
	}&lt;br /&gt;
	if((rtc_date.day - wday &amp;gt;= 25)&lt;br /&gt;
	 &amp;amp;&amp;amp; (wday || rtc_time.hour &amp;gt;= 2)) {&lt;br /&gt;
		if(rtc_date.month == 10)&lt;br /&gt;
			return;&lt;br /&gt;
	}&lt;br /&gt;
	else {&lt;br /&gt;
		if(rtc_date.month == 3) {&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	rtc_time.dst = 1;&lt;br /&gt;
#endif&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Writes the time &amp;amp; date infos in the variables defined in&lt;br /&gt;
 * the library header to the Real Time Clock (RTC).&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void DS1339_write(void)&lt;br /&gt;
{&lt;br /&gt;
	registerBuf[0] = DS1339_SECONDS;&lt;br /&gt;
	registerBuf[1] = DEC2BCD(rtc_time.second);&lt;br /&gt;
	registerBuf[2] = DEC2BCD(rtc_time.minute);&lt;br /&gt;
	registerBuf[3] = DEC2BCD(rtc_time.hour);&lt;br /&gt;
	registerBuf[4] = rtc_date.weekday;&lt;br /&gt;
	registerBuf[5] = DEC2BCD(rtc_date.day);&lt;br /&gt;
	registerBuf[6] = DEC2BCD(rtc_date.month);&lt;br /&gt;
	registerBuf[7] = DEC2BCD(rtc_date.year - 2000);&lt;br /&gt;
	I2CTWI_transmitBytes(I2C_SENSOR_RTC_ADR, &amp;amp;registerBuf[0], 8);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Temperature Sensor (LM75B):&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Sends the configuration byte to a LM75B.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: Config byte for Conf register&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void LM75B_write_cfg(uint8_t config)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_TEMP_ADR, LM75B_CONF, config);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
uint8_t temperature_low;&lt;br /&gt;
uint8_t temperature_high;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Reads the two data registers of the temperature&lt;br /&gt;
 * sensor's Temp register.&lt;br /&gt;
 * They are stored in the variables temperature_low&lt;br /&gt;
 * and _high.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void LM75B_read(void)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmitByte(I2C_SENSOR_TEMP_ADR, LM75B_TEMP);&lt;br /&gt;
	I2CTWI_readBytes(I2C_SENSOR_TEMP_ADR, registerBuf, 2);&lt;br /&gt;
	temperature_high = registerBuf[0];&lt;br /&gt;
	temperature_low = registerBuf[1];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
double temperature;						// Temperature [°C]&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Calculates and returns the temperature value&lt;br /&gt;
 * by using the data read from the LM75B with&lt;br /&gt;
 * the function LM75B_read(). The sensor is&lt;br /&gt;
 * designed for 11 bit measurement and 0.125°C&lt;br /&gt;
 * resolution.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
double LM75B_calculate(void)&lt;br /&gt;
{&lt;br /&gt;
	int16_t tempraw = 0;&lt;br /&gt;
	double temp;&lt;br /&gt;
&lt;br /&gt;
	tempraw = (getTemperatureHigh() &amp;lt;&amp;lt; 8) | getTemperatureLow();&lt;br /&gt;
	tempraw &amp;gt;&amp;gt;= 5;&lt;br /&gt;
	if (tempraw &amp;amp; 1024)							// Calculate temperature&lt;br /&gt;
		tempraw = (tempraw &amp;amp; 1023) - 1024;&lt;br /&gt;
	else&lt;br /&gt;
		tempraw = tempraw &amp;amp; 1023;&lt;br /&gt;
	temp = tempraw * 0.125;&lt;br /&gt;
	return temp;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Performs a 11 bit measurement and returns the&lt;br /&gt;
 * temperature [°C]. The sensor has a measuring&lt;br /&gt;
 * cycle of 100ms. So it makes no sense calling&lt;br /&gt;
 * this function at a frequency above 10Hz.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
double LM75B_measure(void)&lt;br /&gt;
{&lt;br /&gt;
//	LM75B_init();&lt;br /&gt;
	LM75B_read();								// Read data&lt;br /&gt;
	return (LM75B_calculate());					// Calculate value&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Servo Controller (PCA9685):&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Call this once before using the servo function.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: PWM frequency [40..1000 Hz]&lt;br /&gt;
 *&lt;br /&gt;
 * Hints: - Default servo frequency is 50 Hz!&lt;br /&gt;
 *        - The servo power is NOT switched on by&lt;br /&gt;
 *          this function!&lt;br /&gt;
 *&lt;br /&gt;
 * There is also a macro initServo(freq), which&lt;br /&gt;
 * does exactly the same as this function.&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *   initServo(50);&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void PCA9685_init(uint16_t freq)&lt;br /&gt;
{&lt;br /&gt;
	outport.oen_servo = false;					// I/O 1.3: Low&lt;br /&gt;
	MAX7311_update();&lt;br /&gt;
	if ((freq &amp;lt; 40) || (freq &amp;gt; 1000)) freq = 50;&lt;br /&gt;
	I2CTWI_transmitByte(I2C_SENSOR_SERVO_ADR, PCA9685_MODE2);&lt;br /&gt;
	uint8_t last_mode = I2CTWI_readByte(I2C_SENSOR_SERVO_ADR);&lt;br /&gt;
	last_mode &amp;amp;= ~PCA9685_MODE2_INVRT;			// Clear INVRT bit&lt;br /&gt;
	last_mode |= PCA9685_MODE2_OUTDRV;			// Set OUTDRV bit&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_SERVO_ADR, PCA9685_MODE2, last_mode);&lt;br /&gt;
	I2CTWI_transmitByte(I2C_SENSOR_SERVO_ADR, PCA9685_MODE1);&lt;br /&gt;
	last_mode = I2CTWI_readByte(I2C_SENSOR_SERVO_ADR);&lt;br /&gt;
	last_mode |= PCA9685_MODE1_AI;				// Set AI bit&lt;br /&gt;
	uint8_t mode1 = last_mode;&lt;br /&gt;
	mode1 |= PCA9685_MODE1_SLEEP;				// Set SLEEP bit&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_SERVO_ADR, PCA9685_MODE1, mode1);&lt;br /&gt;
	uint8_t prescale = (uint8_t) (F_PCA9685 / 4096 / freq - 0.5);&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_SERVO_ADR, PCA9685_PRE_SCALE, prescale);&lt;br /&gt;
	last_mode &amp;amp;= ~PCA9685_MODE1_SLEEP;			// Clear SLEEP bit&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_SERVO_ADR, PCA9685_MODE1, last_mode);&lt;br /&gt;
	mSleep(1);&lt;br /&gt;
	last_mode |= PCA9685_MODE1_RESTART;			// Clear RESTART bit&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_SERVO_ADR, PCA9685_MODE1, last_mode);&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_SERVO_ADR, PCA9685_LED8_ON_H, 0x10);&lt;br /&gt;
	return;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/** &lt;br /&gt;
 * Returns the channel belonging to a servo number.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: number -&amp;gt; Servo number [1..8]&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
uint8_t servo(uint8_t number)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t channel;&lt;br /&gt;
&lt;br /&gt;
	switch (number) {&lt;br /&gt;
		case 1 :&lt;br /&gt;
			channel = CH_SERVO_1; break;&lt;br /&gt;
		case 2 :&lt;br /&gt;
			channel = CH_SERVO_2; break;&lt;br /&gt;
		case 3 :&lt;br /&gt;
			channel = CH_SERVO_3; break;&lt;br /&gt;
		case 4 :&lt;br /&gt;
			channel = CH_SERVO_4; break;&lt;br /&gt;
		case 5 :&lt;br /&gt;
			channel = CH_SERVO_5; break;&lt;br /&gt;
		case 6 :&lt;br /&gt;
			channel = CH_SERVO_6; break;&lt;br /&gt;
		case 7 :&lt;br /&gt;
			channel = CH_SERVO_7; break;&lt;br /&gt;
		case 8 :&lt;br /&gt;
			channel = CH_SERVO_8; break;&lt;br /&gt;
		default : channel = CH_SERVO_1;&lt;br /&gt;
	}&lt;br /&gt;
	return channel;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This is the servo position set function.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: channel -&amp;gt; Channel number [1..16]&lt;br /&gt;
 *        pos     -&amp;gt; Servo position [SERVOx_LT..SERVOx_RT]&lt;br /&gt;
 *&lt;br /&gt;
 * Hints: - A servo position of 205 means 1 ms servo impulse,&lt;br /&gt;
 *          a position of 410 means a 2 ms servo impulse!&lt;br /&gt;
 *          You may calculate the servo impulse length by:&lt;br /&gt;
 *          ==&amp;gt; Impulse [ms] = servo position / 204.8 &amp;lt;==&lt;br /&gt;
 *          (Formula only valid for a PWM of 50 Hz!)&lt;br /&gt;
 *&lt;br /&gt;
 * There is also a macro setServo(servo, pos), which&lt;br /&gt;
 * does nearly the same as this function, but the first&lt;br /&gt;
 * parameter is the servo and NOT the channel number.&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *   setServo(2,300);&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void PCA9685_set(uint8_t channel, uint16_t pos)&lt;br /&gt;
{&lt;br /&gt;
	if ((channel == 0) || (channel &amp;gt; 16))&lt;br /&gt;
		return;&lt;br /&gt;
	uint8_t reg = channel * 4 + 4;				// Register LEDx_OFF_L&lt;br /&gt;
	I2CTWI_transmit3Bytes(I2C_SENSOR_SERVO_ADR, reg, (pos &amp;amp; 0x00ff), (pos &amp;gt;&amp;gt; 8));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * If the servos are not moving for a while, the&lt;br /&gt;
 * servo function can be stopped with this&lt;br /&gt;
 * function (PCA9685 set to sleep mode).&lt;br /&gt;
 *&lt;br /&gt;
 * Hint: The servo power is NOT switched off by&lt;br /&gt;
 *       this function!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void PCA9685_shutdown(void)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_SERVO_ADR, PCA9685_ALL_LED_OFF_H, 0x10);&lt;br /&gt;
	I2CTWI_transmitByte(I2C_SENSOR_SERVO_ADR, PCA9685_MODE1);&lt;br /&gt;
	uint8_t mode1 = I2CTWI_readByte(I2C_SENSOR_SERVO_ADR);&lt;br /&gt;
	mode1 |= PCA9685_MODE1_SLEEP;				// Set SLEEP bit&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_SERVO_ADR, PCA9685_MODE1, mode1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * If the servo function was stopped with the&lt;br /&gt;
 * function PCA9685_shutdown() before, it can be&lt;br /&gt;
 * (re)started again with this function.&lt;br /&gt;
 *&lt;br /&gt;
 * Hint: The servo power is NOT switched on by&lt;br /&gt;
 *       this function!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void PCA9685_restart(void)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmitByte(I2C_SENSOR_SERVO_ADR, PCA9685_MODE1);&lt;br /&gt;
	uint8_t mode1 = I2CTWI_readByte(I2C_SENSOR_SERVO_ADR);&lt;br /&gt;
	if (mode1 &amp;amp; PCA9685_MODE1_RESTART) {		// RESTART bit set?&lt;br /&gt;
		mode1 &amp;amp;= ~PCA9685_MODE1_SLEEP;			// Clear SLEEP bit&lt;br /&gt;
		I2CTWI_transmit2Bytes(I2C_SENSOR_SERVO_ADR, PCA9685_MODE1, mode1);&lt;br /&gt;
		mSleep(1);&lt;br /&gt;
		mode1 |= PCA9685_MODE1_RESTART;			// Clear RESTART bit&lt;br /&gt;
		I2CTWI_transmit2Bytes(I2C_SENSOR_SERVO_ADR, PCA9685_MODE1, mode1);&lt;br /&gt;
		I2CTWI_transmit2Bytes(I2C_SENSOR_SERVO_ADR, PCA9685_ALL_LED_OFF_H, 0);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/** &lt;br /&gt;
 * With this function you can switch the servo&lt;br /&gt;
 * power on or off.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: pwr -&amp;gt; 0 (false) = servo power off&lt;br /&gt;
 *               &amp;gt;0 (true) = servo power on&lt;br /&gt;
 *&lt;br /&gt;
 * Hints: - If connected servos are not used, you&lt;br /&gt;
 *          should always switch the servo power off&lt;br /&gt;
 *          (default) to save energy!&lt;br /&gt;
 *        - The PCA9685 is NOT restarted or put into&lt;br /&gt;
 *          shutdown mode by this function!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void setServoPower(uint8_t pwr)&lt;br /&gt;
{&lt;br /&gt;
	if(pwr &amp;gt; 0)&lt;br /&gt;
		outport.pwr_servo = true;				// I/O 1.4: High&lt;br /&gt;
	else&lt;br /&gt;
		outport.pwr_servo = false;				// I/O 1.4: Low&lt;br /&gt;
	MAX7311_update();&lt;br /&gt;
}	&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C LED Driver (TCA6507):&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Sends the configuration byte to TCA6507's&lt;br /&gt;
 * internal registers.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: reg    -&amp;gt; Register address [0..10]&lt;br /&gt;
 *        config -&amp;gt; Config byte for internal&lt;br /&gt;
 *                  registers&lt;br /&gt;
 *&lt;br /&gt;
 * Hints: - With this function you can write to&lt;br /&gt;
 *          all internal registers of the LED&lt;br /&gt;
 *          driver, see &amp;quot;Registers:&amp;quot; in the&lt;br /&gt;
 *          library header file!&lt;br /&gt;
 *        - Mainly you will use this function&lt;br /&gt;
 *          for setting time (regs 3..7) and&lt;br /&gt;
 *          intensity (regs 8, 9) values.&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *   TCA6507_write_cfg(TCA6507_MAXIMUM_INTENSITY,0x77);&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void TCA6507_write_cfg(uint8_t reg, uint8_t config)&lt;br /&gt;
{&lt;br /&gt;
	if(reg &amp;gt; 10) reg = 0;&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_LEDDRIVER_ADR, reg, config);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
uint8_t select[3];&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Updates the LED driver select registers (0..2)&lt;br /&gt;
 * with the global select array!&lt;br /&gt;
 *&lt;br /&gt;
 * Hint: - Also have a look at Table 4 in the&lt;br /&gt;
 *         TCA6507 datasheet!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void TCA6507_update(void)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmit4Bytes(I2C_SENSOR_LEDDRIVER_ADR, (TCA6507_SELECT0 | 0x10), select[0], select[1], select[2]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This is the LED state set function.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: led   -&amp;gt; LED number [0..6]&lt;br /&gt;
 *        state -&amp;gt; LED state  [0..7]&lt;br /&gt;
 *&lt;br /&gt;
 * Hints: - Possible driver states [0..7] see&lt;br /&gt;
 *          &amp;quot;Output states:&amp;quot; in the library&lt;br /&gt;
 *          header file!&lt;br /&gt;
 *        - Also have a look at Table 4 in the&lt;br /&gt;
 *          TCA6507 datasheet!&lt;br /&gt;
 *&lt;br /&gt;
 * There is also a macro setLED(led, state), which&lt;br /&gt;
 * does exactly the same as this function.&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *   setLED(1,4);&lt;br /&gt;
 *   // Switches LED1 ON&lt;br /&gt;
 *   // ... OR ...&lt;br /&gt;
 *   setLED(SB_LED1,STATE_ON);&lt;br /&gt;
 *   // does the same.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void TCA6507_set(uint8_t led, uint8_t state)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t i, mask;&lt;br /&gt;
&lt;br /&gt;
	if(led &amp;gt; 6) led = 0;&lt;br /&gt;
	led = 1 &amp;lt;&amp;lt; led;&lt;br /&gt;
	mask = 1;&lt;br /&gt;
	for(i = 0; i &amp;lt; 3; i++) {&lt;br /&gt;
		select[i] &amp;amp;= ~led;&lt;br /&gt;
		if(state &amp;amp; mask)&lt;br /&gt;
			select[i] |= led;&lt;br /&gt;
		mask &amp;lt;&amp;lt;= 1;&lt;br /&gt;
	}&lt;br /&gt;
	TCA6507_update();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * If the LEDs are not needed for a while, the&lt;br /&gt;
 * LED driver can be stopped with this function&lt;br /&gt;
 * (TCA6507 set to shutdown mode).&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void TCA6507_shutdown(void)&lt;br /&gt;
{&lt;br /&gt;
	outport.en_leddriv = false;					// I/O 0.4: Low&lt;br /&gt;
	MAX7311_update();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * If the LED driver was stopped with the&lt;br /&gt;
 * function TCA6507_shutdown() before, it can be&lt;br /&gt;
 * (re)started again with this function.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void TCA6507_restart(void)&lt;br /&gt;
{&lt;br /&gt;
	outport.en_leddriv = true;					// I/O 0.4: High&lt;br /&gt;
	MAX7311_update();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Initializes the LED driver after power on by&lt;br /&gt;
 * switching all LEDs off.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void TCA6507_init(void)&lt;br /&gt;
{&lt;br /&gt;
	select[0] = 0;&lt;br /&gt;
	select[1] = 0;&lt;br /&gt;
	select[2] = 0;&lt;br /&gt;
	TCA6507_update();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C 3D Magnetometer &amp;amp; Accelerometer (LSM303DLHC):&lt;br /&gt;
&lt;br /&gt;
// --------------------------------------------&lt;br /&gt;
// LSM303DLHC accelerometer functions:&lt;br /&gt;
int16_t x_axisa, y_axisa, z_axisa;&lt;br /&gt;
double pitch, roll;&lt;br /&gt;
double xa, ya, za;&lt;br /&gt;
double the, phi;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Call this once before using the 3D-Accelerometer.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void LSM303DLHC_A_init(void)&lt;br /&gt;
{&lt;br /&gt;
	// Set normal power mode, 10 Hz data rate, all axes enabled:&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_LSM303DLHC_A_ADR, CTRL_REG1_A, CTRL_REG1_A_10HZ);&lt;br /&gt;
	mSleep(10);&lt;br /&gt;
	// Set HD mode:&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_LSM303DLHC_A_ADR, CTRL_REG4_A, CTRL_REG4_A_HR);&lt;br /&gt;
	mSleep(10);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function reads the X-axis, Y-axis and Z-axis values&lt;br /&gt;
 * from the LSM303DLHC accelerometer and stores them in the&lt;br /&gt;
 * global variables x_axisa, y_axisa and z_axisa.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void readLSM303DLHC_A(void)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t readBuf[6];&lt;br /&gt;
&lt;br /&gt;
	I2CTWI_transmitByte(I2C_SENSOR_LSM303DLHC_A_ADR, (OUT_X_L_A | 0x80));&lt;br /&gt;
	I2CTWI_readBytes(I2C_SENSOR_LSM303DLHC_A_ADR, readBuf, 6); // Read  X-/Y-/Z-axis&lt;br /&gt;
	// xb = y:&lt;br /&gt;
	x_axisa = ((readBuf[OUT_Y_H_A - OUT_X_L_A] &amp;lt;&amp;lt; 8) + readBuf[OUT_Y_L_A - OUT_X_L_A]) / 16;&lt;br /&gt;
	// yb = x:&lt;br /&gt;
	y_axisa = ((readBuf[OUT_X_H_A - OUT_X_L_A] &amp;lt;&amp;lt; 8) + readBuf[OUT_X_L_A - OUT_X_L_A]) / 16;&lt;br /&gt;
	// zb = z:&lt;br /&gt;
	z_axisa = ((readBuf[OUT_Z_H_A - OUT_X_L_A] &amp;lt;&amp;lt; 8) + readBuf[OUT_Z_L_A - OUT_X_L_A]) / 16;&lt;br /&gt;
	mSleep(10);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function limits and normalizes the x-axisa,&lt;br /&gt;
 * y-axisa and z-axisa values read from the LSM303DLHC&lt;br /&gt;
 * accelerometer with the function readLSM303DLHC_A() and&lt;br /&gt;
 * stores them in the global double variables xa, ya and&lt;br /&gt;
 * za.&lt;br /&gt;
 * It also calculates the position in space in form of the&lt;br /&gt;
 * tilt angles (the = pitch, phi = roll) and stores them&lt;br /&gt;
 * in the global double variables the and phi.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void normalizeLSM303DLHC_A(void)&lt;br /&gt;
{&lt;br /&gt;
	// Limit raw values:&lt;br /&gt;
	if (x_axisa &amp;lt; MIN_X_A) x_axisa = MIN_X_A;&lt;br /&gt;
	if (x_axisa &amp;gt; MAX_X_A) x_axisa = MAX_X_A;&lt;br /&gt;
	if (y_axisa &amp;lt; MIN_Y_A) y_axisa = MIN_Y_A;&lt;br /&gt;
	if (y_axisa &amp;gt; MAX_Y_A) y_axisa = MAX_Y_A;&lt;br /&gt;
	if (z_axisa &amp;lt; MIN_Z_A) z_axisa = MIN_Z_A;&lt;br /&gt;
	if (z_axisa &amp;gt; MAX_Z_A) z_axisa = MAX_Z_A;&lt;br /&gt;
	xa = (double) x_axisa / 1000.0;&lt;br /&gt;
	ya = (double) y_axisa / 1000.0;&lt;br /&gt;
	za = (double) z_axisa / 1000.0;&lt;br /&gt;
	// Calculate Pitch and Roll:&lt;br /&gt;
	phi = asin(xa);								// Calculate the and phi&lt;br /&gt;
	the = asin(ya / cos(the));					//  from the raw values&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function calculates the position in space by&lt;br /&gt;
 * using the the and phi values (see function&lt;br /&gt;
 * normalizeLSM303DLHC_A()!). It stores the position&lt;br /&gt;
 * in the global double variables pitch and roll. &lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void positionLSM303DLHC_A(void)&lt;br /&gt;
{&lt;br /&gt;
	pitch = the * 180 / M_PI + OFFSET_PITCH_A;&lt;br /&gt;
	roll = phi * 180 / M_PI + OFFSET_ROLL_A;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// LSM303DLHC magnetometer functions:&lt;br /&gt;
int16_t x_axism, y_axism, z_axism;&lt;br /&gt;
int16_t headingm;&lt;br /&gt;
double xm, ym, zm;&lt;br /&gt;
#ifdef GET_TEMP_M&lt;br /&gt;
int16_t temperaturem;&lt;br /&gt;
double temperature_mag;&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
int16_t headingtc;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Call this once before using the 3D-Compass.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void LSM303DLHC_M_init(void)&lt;br /&gt;
{&lt;br /&gt;
#ifdef GET_TEMP_M&lt;br /&gt;
	// Set Data output rate to 15Hz, enable temperature sensor:&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_LSM303DLHC_M_ADR, CRA_REG_M, CRA_REG_M_15HZ_T_EN);&lt;br /&gt;
#else&lt;br /&gt;
	// Set Data output rate to 15Hz:&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_LSM303DLHC_M_ADR, CRA_REG_M, CRA_REG_M_15HZ);&lt;br /&gt;
#endif&lt;br /&gt;
	mSleep(10);&lt;br /&gt;
	// Set Gain to +-1.3Gauss:&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_LSM303DLHC_M_ADR, CRB_REG_M, CRB_REG_M_13GAUSS);&lt;br /&gt;
	mSleep(10);&lt;br /&gt;
	// Set Continuous-conversion mode:&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_LSM303DLHC_M_ADR, MR_REG_M, MR_REG_M_CCM);&lt;br /&gt;
	mSleep(10);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function reads the X-axis, Y-axis, Z-axis and&lt;br /&gt;
 * temperature values from the LSM303DLHC magnetometer&lt;br /&gt;
 * and stores them in the global variables x_axism,&lt;br /&gt;
 * y_axism, z_axism and temperaturem.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void readLSM303DLHC_M(void)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t readBuf[6];&lt;br /&gt;
&lt;br /&gt;
	I2CTWI_transmitByte(I2C_SENSOR_LSM303DLHC_M_ADR, OUT_X_H_M);&lt;br /&gt;
	I2CTWI_readBytes(I2C_SENSOR_LSM303DLHC_M_ADR, readBuf, 6); // Read  X-/Y-/Z-axis&lt;br /&gt;
	// xb = x:&lt;br /&gt;
	x_axism = (readBuf[OUT_X_H_M - OUT_X_H_M] &amp;lt;&amp;lt; 8) + readBuf[OUT_X_L_M - OUT_X_H_M];&lt;br /&gt;
	// yb = y:&lt;br /&gt;
	y_axism = (readBuf[OUT_Y_H_M - OUT_X_H_M] &amp;lt;&amp;lt; 8) + readBuf[OUT_Y_L_M - OUT_X_H_M];&lt;br /&gt;
	// zb = z:&lt;br /&gt;
	z_axism = (readBuf[OUT_Z_H_M - OUT_X_H_M] &amp;lt;&amp;lt; 8) + readBuf[OUT_Z_L_M - OUT_X_H_M];&lt;br /&gt;
	mSleep(10);&lt;br /&gt;
#ifdef GET_TEMP_M&lt;br /&gt;
	// Read temperature raw value:&lt;br /&gt;
	I2CTWI_transmitByte(I2C_SENSOR_LSM303DLHC_M_ADR, TEMP_OUT_H_M);&lt;br /&gt;
	readBuf[0] = I2CTWI_readByte(I2C_SENSOR_LSM303DLHC_M_ADR);&lt;br /&gt;
	I2CTWI_transmitByte(I2C_SENSOR_LSM303DLHC_M_ADR, TEMP_OUT_L_M);&lt;br /&gt;
	readBuf[1] = I2CTWI_readByte(I2C_SENSOR_LSM303DLHC_M_ADR);&lt;br /&gt;
	temperaturem = (readBuf[0] &amp;lt;&amp;lt; 8) | readBuf[1];&lt;br /&gt;
	temperaturem &amp;gt;&amp;gt;= 4;&lt;br /&gt;
	if (temperaturem &amp;amp; 2048)					// Calculate temperature&lt;br /&gt;
		temperaturem = (temperaturem &amp;amp; 2047) - 2048;&lt;br /&gt;
	else&lt;br /&gt;
		temperaturem = temperaturem &amp;amp; 2047;&lt;br /&gt;
	mSleep(10);&lt;br /&gt;
#endif&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function compensates hard iron effects and&lt;br /&gt;
 * scales the x-axism, y-axism and z-axism values read&lt;br /&gt;
 * from the LSM303DLHC magnetometer with the function&lt;br /&gt;
 * readLSM303DLHC_M() and stores them in the global&lt;br /&gt;
 * double variables xm, ym and zm.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void normalizeLSM303DLHC_M(void)&lt;br /&gt;
{&lt;br /&gt;
	// Add hard iron offsets:&lt;br /&gt;
	x_axism += OFFSET_X_M;&lt;br /&gt;
	y_axism += OFFSET_Y_M;&lt;br /&gt;
	z_axism += OFFSET_Z_M;&lt;br /&gt;
	// Scale raw values:&lt;br /&gt;
	xm = (x_axism - MIN_X_M) / (MAX_X_M - MIN_X_M) * 2 - 1;&lt;br /&gt;
	ym = (y_axism - MIN_Y_M) / (MAX_Y_M - MIN_Y_M) * 2 - 1;&lt;br /&gt;
	zm = (z_axism - MIN_Z_M) / (MAX_Z_M - MIN_Z_M) * 2 - 1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function calculates the heading by using the&lt;br /&gt;
 * normalized sensor values xm and ym (see function&lt;br /&gt;
 * normalizeLSM303DLHC_M()!). The heading is a value&lt;br /&gt;
 * from 0° to 359°. If the robot's front (and the&lt;br /&gt;
 * RP6 Sensor Board's front edge with the two&lt;br /&gt;
 * headlights) points to ...&lt;br /&gt;
 *   north -&amp;gt; heading is 0°,&lt;br /&gt;
 *   east  -&amp;gt; heading is 90°,&lt;br /&gt;
 *   south -&amp;gt; heading is 180°,&lt;br /&gt;
 *   west  -&amp;gt; heading is 270°.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
int16_t headingLSM303DLHC_M(void)&lt;br /&gt;
{&lt;br /&gt;
	double hdg = atan2(ym, xm) * 180 / M_PI + DECLINATION_M;&lt;br /&gt;
	if(hdg &amp;lt; 0.0) hdg += 360.0;&lt;br /&gt;
	return ((int16_t) hdg);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// --------------------------------------------&lt;br /&gt;
/**&lt;br /&gt;
 * This function calculates the TILT COMPENSATED&lt;br /&gt;
 * heading by using accelerometer (the, phi) AND&lt;br /&gt;
 * magnetometer (xm, ym, zm) data. The heading is a&lt;br /&gt;
 * value from 0° to 359°. If the robot's front (and&lt;br /&gt;
 * the RP6 Sensor Board's front edge with the two&lt;br /&gt;
 * headlights) points to ...&lt;br /&gt;
 *   north -&amp;gt; heading is 0°,&lt;br /&gt;
 *   east  -&amp;gt; heading is 90°,&lt;br /&gt;
 *   south -&amp;gt; heading is 180°,&lt;br /&gt;
 *   west  -&amp;gt; heading is 270°.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
int16_t headingLSM303DLHC_TC(void)&lt;br /&gt;
{&lt;br /&gt;
	double hdgtc, xh, yh;&lt;br /&gt;
&lt;br /&gt;
	xh = xm * cos(the) + zm * sin(the);&lt;br /&gt;
	yh = xm * sin(phi) * sin(the) + ym * cos(phi) - zm * sin(phi) * cos(the);&lt;br /&gt;
//	zh = -xm * cos(phi) * sin(the) + ym * sin(phi) + zm * cos(phi) * cos(the);&lt;br /&gt;
	hdgtc = atan2(yh, xh) * 180 / M_PI + DECLINATION_M;&lt;br /&gt;
	if(hdgtc &amp;lt; 0.0) hdgtc += 360.0;&lt;br /&gt;
	return ((int16_t) hdgtc);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// --------------------------------------------&lt;br /&gt;
/**&lt;br /&gt;
 * Call this once before using the LSM303DLHC.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void LSM303DLHC_init(void)&lt;br /&gt;
{&lt;br /&gt;
	LSM303DLHC_A_init();						// Accelerometer init&lt;br /&gt;
	LSM303DLHC_M_init();						// Magnetometer init&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Analog Yaw-Rate Gyroscope (LY330ALH):&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Sets the LY330ALH mode of operation.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: mode -&amp;gt; Mode [0..3]&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void LY330ALH_set_mode(uint8_t mode)&lt;br /&gt;
{&lt;br /&gt;
	outport.pd_gyro = false;					// I/O 0.6: Low&lt;br /&gt;
	outport.st_gyro = false;					// I/O 0.7: Low&lt;br /&gt;
	if(mode &amp;amp; 1) outport.pd_gyro = true;&lt;br /&gt;
	if(mode &amp;amp; 2) outport.st_gyro = true;&lt;br /&gt;
	MAX7311_update();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Reads the ADC1 value from the RP6Base.&lt;br /&gt;
 *&lt;br /&gt;
 * Hints: - The RP6Base input ADC1 has to be&lt;br /&gt;
 *          connected to the USRBUS: Pin 2 on&lt;br /&gt;
 *          the RP6 mainboard!&lt;br /&gt;
 *        - The RP6Base_I2CSlave program has to&lt;br /&gt;
 *          be loaded into the RP6Base&lt;br /&gt;
 *          microcontroller!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
uint16_t getRP6Base_ADC1(void)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_readRegisters(I2C_RP6_BASE_ADR, I2C_REG_ADC_ADC1_L, registerBuf, 2);&lt;br /&gt;
	return (registerBuf[0] + (registerBuf[1] &amp;lt;&amp;lt; 8));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int16_t z_axisg;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Performs a LY330ALH gyroscope measurement and&lt;br /&gt;
 * returns the angular rate (velocity).&lt;br /&gt;
 * Positive values mean an angular rate while&lt;br /&gt;
 * rotating LEFT and negative values while&lt;br /&gt;
 * rotating RIGHT!&lt;br /&gt;
 * The global integer variable z_axisg also&lt;br /&gt;
 * contains the measurement result.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
int16_t LY330ALH_measure(void)&lt;br /&gt;
{&lt;br /&gt;
	z_axisg = getRP6Base_ADC1();				// Read raw data&lt;br /&gt;
	z_axisg -= ADCVAL_ZERORATE_LEVEL;			// Calculate value&lt;br /&gt;
	return (z_axisg);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Hot Swappable 2-Wire Bus Buffer (TCA4311A):&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Reads the TCA4311A Ready output. &lt;br /&gt;
 * The function returns the state (true/false).&lt;br /&gt;
 * The global variable readyBusbuff is also&lt;br /&gt;
 * filled with the Ready output state.&lt;br /&gt;
 *&lt;br /&gt;
 * Hint: You don't have to use this function,&lt;br /&gt;
 *       if the task task_RP6SensorBoard() is&lt;br /&gt;
 *       called frequently out of the main&lt;br /&gt;
 *       loop, because readyBusbuff will be&lt;br /&gt;
 *       updated by this task!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
uint8_t readReadyBusbuff(void)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmitByte(I2C_SENSOR_PORTEXP_ADR, MAX7311_INPUT_PORT1);&lt;br /&gt;
	readyBusbuff = I2CTWI_readByte(I2C_SENSOR_PORTEXP_ADR);&lt;br /&gt;
	readyBusbuff &amp;amp;= RDY_BUSBUFF;&lt;br /&gt;
	return readyBusbuff;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
uint8_t errorBusbuff;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * If the I2C bus for the I2C-MODULE (SCLOUT,&lt;br /&gt;
 * SDAOUT) is not used or shall be isolated from&lt;br /&gt;
 * the RP6 I2C bus, this can be done with this&lt;br /&gt;
 * function.&lt;br /&gt;
 *&lt;br /&gt;
 * Hints: - The I2C-MODULE power is NOT switched&lt;br /&gt;
 *          off by this function!&lt;br /&gt;
 *        - If USE_PD5 is defined in the&lt;br /&gt;
 *          configuration header file, this&lt;br /&gt;
 *          function uses the RP6M256 portpin,&lt;br /&gt;
 *          that is connected to plug I/O: Pin 9&lt;br /&gt;
 *          instead of MAX7311 I/O 1.0!&lt;br /&gt;
 *        - If the global variable errorBusbuff&lt;br /&gt;
 *          returns true, the bus buffer could&lt;br /&gt;
 *          not be switched to shutdown mode!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void TCA4311A_shutdown(void)&lt;br /&gt;
{&lt;br /&gt;
	// Wait until the I2C bus is idle:&lt;br /&gt;
	while(I2CTWI_isBusy() || TWI_operation != I2CTWI_NO_OPERATION) task_I2CTWI();&lt;br /&gt;
#ifdef USE_PD5&lt;br /&gt;
	IO_SENSOR_TCA4311A_EN_PORT &amp;amp;= ~IO_SENSOR_TCA4311A_EN_IN; // Low&lt;br /&gt;
#else&lt;br /&gt;
	outport.en_busbuff = false;					// I/O 1.0: Low&lt;br /&gt;
	MAX7311_update();&lt;br /&gt;
#endif&lt;br /&gt;
	errorBusbuff = readReadyBusbuff();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * If the I2C bus for the I2C-MODULE (SCLOUT,&lt;br /&gt;
 * SDAOUT) was isolated from the RP6 I2C bus with&lt;br /&gt;
 * the function TCA4311A_shutdown() before, it&lt;br /&gt;
 * can be connected again with this function.&lt;br /&gt;
 *&lt;br /&gt;
 * Hints: - The I2C-MODULE power is NOT switched&lt;br /&gt;
 *          on by this function!&lt;br /&gt;
 *        - If USE_PD5 is defined in the&lt;br /&gt;
 *          configuration header file, this&lt;br /&gt;
 *          function uses the RP6M256 portpin,&lt;br /&gt;
 *          that is connected to plug I/O: Pin 9&lt;br /&gt;
 *          instead of MAX7311 I/O 1.0!&lt;br /&gt;
 *        - If the global variable errorBusbuff&lt;br /&gt;
 *          returns true, the bus buffer could&lt;br /&gt;
 *          not be switched to normal operation!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void TCA4311A_reconnect(void)&lt;br /&gt;
{&lt;br /&gt;
	// Wait until the I2C bus is idle:&lt;br /&gt;
	while(I2CTWI_isBusy() || TWI_operation != I2CTWI_NO_OPERATION) task_I2CTWI();&lt;br /&gt;
#ifdef USE_PD5&lt;br /&gt;
	IO_SENSOR_TCA4311A_EN_PORT |= IO_SENSOR_TCA4311A_EN_IN; // High&lt;br /&gt;
#else&lt;br /&gt;
	outport.en_busbuff = true;					// I/O 1.0: High&lt;br /&gt;
	MAX7311_update();&lt;br /&gt;
#endif&lt;br /&gt;
	errorBusbuff = !readReadyBusbuff();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Sets/clears the RP6Base signal PWR.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: pwr -&amp;gt; 0 (false) = PWR off&lt;br /&gt;
 *               &amp;gt;0 (true) = PWR on&lt;br /&gt;
 *&lt;br /&gt;
 * Hints: - The RP6Base signal PWR has to be&lt;br /&gt;
 *          connected to the USRBUS: Pin 3 on&lt;br /&gt;
 *          the RP6 mainboard!&lt;br /&gt;
 *        - The RP6Base_I2CSlave program has to&lt;br /&gt;
 *          be loaded into the RP6Base&lt;br /&gt;
 *          microcontroller!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void setRP6Base_PWR(uint8_t pwr)&lt;br /&gt;
{&lt;br /&gt;
	if(pwr &amp;gt; 0)&lt;br /&gt;
		I2CTWI_transmit2Bytes(I2C_RP6_BASE_ADR, 0, CMD_POWER_ON);&lt;br /&gt;
	else&lt;br /&gt;
		I2CTWI_transmit2Bytes(I2C_RP6_BASE_ADR, 0, CMD_POWER_OFF);&lt;br /&gt;
	while(I2CTWI_isBusy() || TWI_operation != I2CTWI_NO_OPERATION) task_I2CTWI();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/** &lt;br /&gt;
 * With this function you can switch the I2C-&lt;br /&gt;
 * MODULE (plug M1) power on or off.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: pwr -&amp;gt; 0 (false) = I2C-MODULE power off&lt;br /&gt;
 *               &amp;gt;0 (true) = I2C-MODULE power on&lt;br /&gt;
 *&lt;br /&gt;
 * Hints: - If the I2C-MODULE plug is not used,&lt;br /&gt;
 *          you should always switch the&lt;br /&gt;
 *          I2C-MODULE power off (default)!&lt;br /&gt;
 *        - The TCA4311A is NOT switched to&lt;br /&gt;
 *          normal operation (default) or&lt;br /&gt;
 *          shutdown mode by this function!&lt;br /&gt;
 *        - The RP6Base signal PWR has to be&lt;br /&gt;
 *          connected to the USRBUS: Pin 3 on&lt;br /&gt;
 *          the RP6 mainboard!&lt;br /&gt;
 *        - The RP6Base_I2CSlave program has to&lt;br /&gt;
 *          be loaded into the RP6Base&lt;br /&gt;
 *          microcontroller!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void setI2CModulePower(uint8_t pwr)&lt;br /&gt;
{&lt;br /&gt;
	if(pwr &amp;gt; 0) {&lt;br /&gt;
		setRP6Base_PWR(1);						// RP6Base PWR on&lt;br /&gt;
		outport.pwr_i2c = true;					// I/O 0.0: High&lt;br /&gt;
	}&lt;br /&gt;
	else&lt;br /&gt;
		outport.pwr_i2c = false;				// I/O 0.0: Low&lt;br /&gt;
	MAX7311_update();&lt;br /&gt;
}	&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Button:&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Reads the MAX7311 I/O port 1.7. &lt;br /&gt;
 * The function returns true, if  button S1 is&lt;br /&gt;
 * pressed (I/O 1.7: Low!) and false, if it is&lt;br /&gt;
 * not pressed (I/O 1.7: High!).&lt;br /&gt;
 * The global variable pressedButton is also&lt;br /&gt;
 * filled with the I/O 1.7 output state.&lt;br /&gt;
 *&lt;br /&gt;
 * Hint: You don't have to use this function,&lt;br /&gt;
 *       if the task task_RP6SensorBoard() is&lt;br /&gt;
 *       called frequently out of the main&lt;br /&gt;
 *       loop, because pressedButton will be&lt;br /&gt;
 *       updated by this task!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
uint8_t readButton(void)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmitByte(I2C_SENSOR_PORTEXP_ADR, MAX7311_INPUT_PORT2);&lt;br /&gt;
	pressedButton = I2CTWI_readByte(I2C_SENSOR_PORTEXP_ADR);&lt;br /&gt;
	pressedButton &amp;amp;= IO2_I2C;&lt;br /&gt;
	pressedButton = !pressedButton;&lt;br /&gt;
	return pressedButton;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Status LED:&lt;br /&gt;
&lt;br /&gt;
/** &lt;br /&gt;
 * Sets the status LED (D2) of the RP6 Sensor&lt;br /&gt;
 * Board.&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *   setStatusLED(1);&lt;br /&gt;
 *   // This switches the status LED on!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void setStatusLED(uint8_t on)&lt;br /&gt;
{&lt;br /&gt;
	if(on &amp;gt; 0)&lt;br /&gt;
		outport.io1_i2c = false;				// I/O 1.6: Low&lt;br /&gt;
	else&lt;br /&gt;
		outport.io1_i2c = true;					// I/O 1.6: High&lt;br /&gt;
	MAX7311_update();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// RP6 Sensor Board initialisation and shutdown:&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * You MUST call this function at the beginning of a&lt;br /&gt;
 * main program, that uses the RP6 Sensor Board. &lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void sensor_board_init(void)&lt;br /&gt;
{&lt;br /&gt;
	// I/O Port Expander:&lt;br /&gt;
	MAX7311_init();&lt;br /&gt;
	// RTC:&lt;br /&gt;
	DS1339_init();&lt;br /&gt;
	// Temperature Sensor:&lt;br /&gt;
	LM75B_init();&lt;br /&gt;
	// Servo Controller:&lt;br /&gt;
	PCA9685_init(50);							// Init PWM 50 Hz&lt;br /&gt;
	// LED Driver:&lt;br /&gt;
	TCA6507_init();&lt;br /&gt;
	// 3D Magnetometer &amp;amp; Accelerometer:&lt;br /&gt;
	LSM303DLHC_init();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * If you don't use any function of the RP6&lt;br /&gt;
 * Sensor Board, you can put the board into&lt;br /&gt;
 * &amp;quot;SHUTDOWN MODE&amp;quot;. In this mode the electric&lt;br /&gt;
 * power consumption is very low to save energy.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void sensor_board_shutdown(void)&lt;br /&gt;
{&lt;br /&gt;
	// Servo Controller:&lt;br /&gt;
	PCA9685_shutdown();							// Shutdown PCA9685&lt;br /&gt;
	// Temperature Sensor:&lt;br /&gt;
	LM75B_shutdown();							// Shutdown LM75B&lt;br /&gt;
	// I/O Port Expander:&lt;br /&gt;
	MAX7311_write(MAX7311_OUTPUT_SHUTDOWN);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&lt;br /&gt;
/******************************************************************************&lt;br /&gt;
 * Additional info&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Changelog:&lt;br /&gt;
 * - v. 1.1 RP6M256_I2CMasterLib compatibility 16.09.2014 by Dirk&lt;br /&gt;
 * - v. 1.0 TCA4311A reconnect problem fixed 10.04.2014 by Dirk&lt;br /&gt;
 * - v. 0.9 Interrupt status functions added 09.04.2014 by Dirk&lt;br /&gt;
 * - v. 0.8 (initial release) 17.03.2014 by Dirk&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Erklärung&lt;br /&gt;
&lt;br /&gt;
=====Demo=====&lt;br /&gt;
makefile:&lt;br /&gt;
&amp;lt;pre&amp;gt;...&lt;br /&gt;
TARGET = RP6M256_Sensor_Board_01&lt;br /&gt;
...&lt;br /&gt;
SRC += $(RP6_LIB_PATH)/RP6common/RP6I2CmasterTWI.c&lt;br /&gt;
&lt;br /&gt;
SRC += $(RP6_LIB_PATH)/RP6control_M256_WIFI/RP6M256_Sensor_BoardLib.c&lt;br /&gt;
...&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Datei: RP6M256_Sensor_Board_01.c&lt;br /&gt;
&amp;lt;pre&amp;gt;/* &lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * RP6 ROBOT SYSTEM - RP6 CONTROL M256 Examples&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Example: RP6M256 Sensor Board&lt;br /&gt;
 * Author(s): Dirk&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Description:&lt;br /&gt;
 * In this example we show a first test for the RP6 Sensor Board.&lt;br /&gt;
 * &lt;br /&gt;
 * ############################################################################&lt;br /&gt;
 * The Robot does NOT move in this example! You can simply put it on a table&lt;br /&gt;
 * next to your PC and you should connect it to the PC via the USB Interface!&lt;br /&gt;
 * You should also connect to it via WIFI.&lt;br /&gt;
 * ############################################################################&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Includes:&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6M256Lib.h&amp;quot; 				// The RP6 M256 Library. &lt;br /&gt;
										// Always needs to be included!&lt;br /&gt;
#include &amp;quot;RP6I2CmasterTWI.h&amp;quot;			// Include the I2C-Bus Master Library&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Include our new &amp;quot;RP6M256 Sensor Board library&amp;quot;:&lt;br /&gt;
// (This is the library for accessing the RP6 Sensor Board!)&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6M256_Sensor_BoardLib.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Variables:&lt;br /&gt;
&lt;br /&gt;
char dir[3];&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Returns a 2 character string for the eighth&lt;br /&gt;
 * parts of the direction calculated from the&lt;br /&gt;
 * heading value.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: heading -&amp;gt; Heading value [0..359]&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void calculateDir(char *dir, uint16_t heading)&lt;br /&gt;
{&lt;br /&gt;
	dir[1] = ' ';&lt;br /&gt;
	dir[2] = '\0';&lt;br /&gt;
	if ((heading &amp;lt;= 22) || (heading &amp;gt;=338)) dir[0] = 'N';&lt;br /&gt;
	if ((heading &amp;gt;= 23) &amp;amp;&amp;amp; (heading &amp;lt;= 67)) {dir[0] = 'N'; dir[1] = 'E';} &lt;br /&gt;
	if ((heading &amp;gt;= 68) &amp;amp;&amp;amp; (heading &amp;lt;= 112)) dir[0] = 'E';&lt;br /&gt;
	if ((heading &amp;gt;= 113) &amp;amp;&amp;amp; (heading &amp;lt;= 157)) {dir[0] = 'S'; dir[1] = 'E';}&lt;br /&gt;
	if ((heading &amp;gt;= 158) &amp;amp;&amp;amp; (heading &amp;lt;= 202)) dir[0] = 'S';&lt;br /&gt;
	if ((heading &amp;gt;= 203) &amp;amp;&amp;amp; (heading &amp;lt;= 247)) {dir[0] = 'S'; dir[1] = 'W';}&lt;br /&gt;
	if ((heading &amp;gt;= 248) &amp;amp;&amp;amp; (heading &amp;lt;= 292)) dir[0] = 'W';&lt;br /&gt;
	if ((heading &amp;gt;= 293) &amp;amp;&amp;amp; (heading &amp;lt;= 337)) {dir[0] = 'N'; dir[1] = 'W';}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Write a floating point number to the WIFI.&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *&lt;br /&gt;
 *			// Write a floating point number to the WIFI (no exponent):&lt;br /&gt;
 *			writeDouble_WIFI(1234567.890, 11, 3);&lt;br /&gt;
 *&lt;br /&gt;
 * The value of prec (precision) defines the number of decimal places.&lt;br /&gt;
 * For 32 bit floating point variables (float, double ...) 6 is&lt;br /&gt;
 * the max. value for prec (7 relevant digits).&lt;br /&gt;
 * The value of width defines the overall number of characters in the&lt;br /&gt;
 * floating point number including the decimal point. The number of&lt;br /&gt;
 * pre-decimal positions is: (width - prec - 1).&lt;br /&gt;
 */&lt;br /&gt;
void writeDouble_WIFI(double number, uint8_t width, uint8_t prec)&lt;br /&gt;
{char buffer[width + 1];&lt;br /&gt;
	dtostrf(number, width, prec, &amp;amp;buffer[0]);&lt;br /&gt;
	writeString_WIFI(&amp;amp;buffer[0]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Write a floating point number to the LCD.&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *&lt;br /&gt;
 *			// Write a floating point number to the LCD (no exponent):&lt;br /&gt;
 *			writeDoubleLCD(1234567.890, 11, 3);&lt;br /&gt;
 *&lt;br /&gt;
 * The value of prec (precision) defines the number of decimal places.&lt;br /&gt;
 * For 32 bit floating point variables (float, double ...) 6 is&lt;br /&gt;
 * the max. value for prec (7 relevant digits).&lt;br /&gt;
 * The value of width defines the overall number of characters in the&lt;br /&gt;
 * floating point number including the decimal point. The number of&lt;br /&gt;
 * pre-decimal positions is: (width - prec - 1).&lt;br /&gt;
 */&lt;br /&gt;
void writeDoubleLCD(double number, uint8_t width, uint8_t prec)&lt;br /&gt;
{char buffer[width + 1];&lt;br /&gt;
	dtostrf(number, width, prec, &amp;amp;buffer[0]);&lt;br /&gt;
	writeStringLCD(&amp;amp;buffer[0]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Error handler&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function gets called automatically if there was an I2C Error like&lt;br /&gt;
 * the slave sent a &amp;quot;not acknowledge&amp;quot; (NACK, error codes e.g. 0x20 or 0x30).&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void I2C_transmissionError(uint8_t errorState)&lt;br /&gt;
{&lt;br /&gt;
	writeString_P_WIFI(&amp;quot;\nI2C ERROR - TWI STATE: 0x&amp;quot;);&lt;br /&gt;
	writeInteger_WIFI(errorState, HEX);&lt;br /&gt;
	writeChar_WIFI('\n');&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Main function - The program starts here:&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
	initRP6M256();    // Always call this first! The Processor will not work&lt;br /&gt;
					  // correctly otherwise. &lt;br /&gt;
&lt;br /&gt;
	initLCD(); // Initialize the LC-Display (LCD)&lt;br /&gt;
			   // Always call this before using the LCD!&lt;br /&gt;
&lt;br /&gt;
	setLEDs(0b1111);&lt;br /&gt;
	mSleep(500);&lt;br /&gt;
	setLEDs(0b0000);&lt;br /&gt;
&lt;br /&gt;
	writeString_P_WIFI(&amp;quot;\n\nRP6 Sensor Board Selftest 1!\n&amp;quot;); &lt;br /&gt;
&lt;br /&gt;
	// IMPORTANT:&lt;br /&gt;
	I2CTWI_initMaster(100); // Initialize the TWI Module for Master operation&lt;br /&gt;
							// with 100kHz SCL Frequency&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	// Register the event handler:&lt;br /&gt;
	I2CTWI_setTransmissionErrorHandler(I2C_transmissionError);&lt;br /&gt;
&lt;br /&gt;
	setLEDs(0b1111);&lt;br /&gt;
&lt;br /&gt;
	// Write a text message to the LCD:&lt;br /&gt;
	showScreenLCD(&amp;quot;################&amp;quot;, &amp;quot;################&amp;quot;);&lt;br /&gt;
	mSleep(1500);&lt;br /&gt;
	showScreenLCD(&amp;quot;RP6v2-M256-WIFI &amp;quot;, &amp;quot;Example Program&amp;quot;);&lt;br /&gt;
	mSleep(2500); &lt;br /&gt;
	showScreenLCD(&amp;quot;RP6 Sensor Board&amp;quot;, &amp;quot;   Selftest 1&amp;quot;);&lt;br /&gt;
	mSleep(2500);&lt;br /&gt;
	clearLCD();&lt;br /&gt;
&lt;br /&gt;
	setLEDs(0b0000);&lt;br /&gt;
&lt;br /&gt;
	// ---------------------------------------&lt;br /&gt;
&lt;br /&gt;
	uint8_t onoff = 0;&lt;br /&gt;
	uint16_t servopos = SERVO1_LT;&lt;br /&gt;
	int16_t rate;&lt;br /&gt;
&lt;br /&gt;
	startStopwatch1();&lt;br /&gt;
	startStopwatch2();&lt;br /&gt;
&lt;br /&gt;
	// IMPORTANT:&lt;br /&gt;
	sensor_board_init();						// RP6 Sensor Board init!!!&lt;br /&gt;
	setServoPower(1);							// Servo power ON!&lt;br /&gt;
/*&lt;br /&gt;
	// ----------------------------------------------&lt;br /&gt;
	// Set RTC once (battery empty or not existing:&lt;br /&gt;
	rtc_time.second = 0;&lt;br /&gt;
	rtc_time.minute = 15;&lt;br /&gt;
	rtc_time.hour = 20;				// 20:15&lt;br /&gt;
	rtc_date.weekday = R_SU;&lt;br /&gt;
	rtc_date.day = 20;&lt;br /&gt;
	rtc_date.month = 4;&lt;br /&gt;
	rtc_date.year = 2014;			// Su, 20.4.2014&lt;br /&gt;
	DS1339_write();&lt;br /&gt;
	// Remove this, if RTC is set and running!!!&lt;br /&gt;
	// ----------------------------------------------&lt;br /&gt;
*/&lt;br /&gt;
	while(true) &lt;br /&gt;
	{&lt;br /&gt;
		if(getStopwatch1() &amp;gt; 1000) // 1s&lt;br /&gt;
		{&lt;br /&gt;
			if (onoff) onoff = 0;&lt;br /&gt;
			else onoff = 1;&lt;br /&gt;
&lt;br /&gt;
			// Interrupt status:&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nInterrupt Status:      &amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(interrupt_RP6SBstatus.byte, BIN, 8);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			// Inport status:&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;Inport Status: &amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(inport.word, BIN, 16);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			// Temperature sensor test:&lt;br /&gt;
			temperature = LM75B_measure();		// Measure&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;Temperature: &amp;quot;);&lt;br /&gt;
			writeDouble_WIFI(temperature, 7, 3);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;°\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			// LED driver test:&lt;br /&gt;
			if (onoff) {&lt;br /&gt;
				setLED(HEADLIGHT_R, STATE_ON);&lt;br /&gt;
				setLED(HEADLIGHT_L, STATE_OFF);&lt;br /&gt;
			}&lt;br /&gt;
			else {&lt;br /&gt;
				setLED(HEADLIGHT_L, STATE_ON);&lt;br /&gt;
				setLED(HEADLIGHT_R, STATE_OFF);&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			// Servo controller test (SERVO_1):&lt;br /&gt;
			setServo(1, servopos);&lt;br /&gt;
			servopos += 10;&lt;br /&gt;
			if (servopos &amp;gt; SERVO1_RT) servopos = SERVO1_LT;&lt;br /&gt;
&lt;br /&gt;
			// RTC test:&lt;br /&gt;
			DS1339_read();&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;RTC: &amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(rtc_time.hour, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;:&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(rtc_time.minute, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;:&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(rtc_time.second, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;  &amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(rtc_date.day, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;.&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(rtc_date.month, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;.&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(rtc_date.year, DEC, 4);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			// 3D Magnetometer &amp;amp; Accelerometer test:&lt;br /&gt;
			//  LSM303DLHC accelerometer:&lt;br /&gt;
			task_I2CTWI();&lt;br /&gt;
			readLSM303DLHC_A();					// Get sensor values&lt;br /&gt;
			task_I2CTWI();&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\n3D-Acceleration SENSOR -&amp;gt;\n&amp;quot;);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;X-axis: &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(x_axisa, DEC);&lt;br /&gt;
			writeChar_WIFI('\n');&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;Y-axis: &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(y_axisa, DEC);&lt;br /&gt;
			writeChar_WIFI('\n');&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;Z-axis: &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(z_axisa, DEC);&lt;br /&gt;
			writeChar_WIFI('\n');&lt;br /&gt;
			normalizeLSM303DLHC_A();			// Normalize data&lt;br /&gt;
			positionLSM303DLHC_A();				// Calculate position&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;POSITION: \n&amp;quot;);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;  Pitch [°]: &amp;quot;);&lt;br /&gt;
			writeDouble_WIFI(pitch, 6, 1);&lt;br /&gt;
			writeChar_WIFI('\n');&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;  Roll [°]:  &amp;quot;);&lt;br /&gt;
			writeDouble_WIFI(roll, 6, 1);&lt;br /&gt;
			writeChar_WIFI('\n');&lt;br /&gt;
&lt;br /&gt;
			//  LSM303DLHC magnetometer:&lt;br /&gt;
			task_I2CTWI();&lt;br /&gt;
			readLSM303DLHC_M();					// Get sensor values&lt;br /&gt;
			task_I2CTWI();&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\n3D-Compass SENSOR -&amp;gt;\n&amp;quot;);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;X-axis: &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(x_axism, DEC);&lt;br /&gt;
			writeChar_WIFI('\n');&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;Y-axis: &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(y_axism, DEC);&lt;br /&gt;
			writeChar_WIFI('\n');&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;Z-axis: &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(z_axism, DEC);&lt;br /&gt;
			writeChar_WIFI('\n');&lt;br /&gt;
			normalizeLSM303DLHC_M();			// Normalize data&lt;br /&gt;
			headingm = headingLSM303DLHC_M();	// Calculate heading&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;                 Heading [°]: &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(headingm, DEC);&lt;br /&gt;
			calculateDir(dir, headingm);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;  Direction: &amp;quot;);&lt;br /&gt;
			writeString_WIFI(dir);&lt;br /&gt;
			writeChar_WIFI('\n');&lt;br /&gt;
			headingtc = headingLSM303DLHC_TC();	// Calculate TILT COMPENSATED&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;TILT COMPENSATED heading [°]: &amp;quot;); // heading&lt;br /&gt;
			writeInteger_WIFI(headingtc, DEC);&lt;br /&gt;
			calculateDir(dir, headingtc);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;  Direction: &amp;quot;);&lt;br /&gt;
			writeString_WIFI(dir);&lt;br /&gt;
			writeChar_WIFI('\n');&lt;br /&gt;
#ifdef GET_TEMP_M&lt;br /&gt;
			temperature_mag = (double) temperaturem / 8.0 + OFFSET_TEMP_M;&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;Temperature [°]: &amp;quot;);&lt;br /&gt;
			writeDouble_WIFI(temperature_mag, 7, 2);&lt;br /&gt;
			writeChar_WIFI('\n');&lt;br /&gt;
#endif&lt;br /&gt;
			// Yaw-Rate Gyroscope test:&lt;br /&gt;
			rate = LY330ALH_measure();&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\n1D-Gyro SENSOR -&amp;gt;\n&amp;quot;);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;Z-axis: &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(rate, DEC);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			// RP6 Sensor Board shutdown (button &amp;amp; status LED test):&lt;br /&gt;
			if (pressedButton) {&lt;br /&gt;
				setStatusLED(1);&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;\nPress button again for RP6 Sensor Board SHUTDOWN!\n&amp;quot;);&lt;br /&gt;
				mSleep(2000);&lt;br /&gt;
				do {&lt;br /&gt;
					if(getStopwatch2() &amp;gt; 200) { // 0.2s&lt;br /&gt;
						if (onoff) onoff = 0;&lt;br /&gt;
						else onoff = 1;&lt;br /&gt;
						if (onoff) setStatusLED(1);&lt;br /&gt;
						else setStatusLED(0);&lt;br /&gt;
						setStopwatch2(0);&lt;br /&gt;
					}&lt;br /&gt;
					mSleep(1);&lt;br /&gt;
					task_I2CTWI();&lt;br /&gt;
				} while (!readButton());&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;\n\n\n\n\nPlease wait for RP6 Sensor Board SHUTDOWN...\n&amp;quot;);&lt;br /&gt;
				sensor_board_shutdown();&lt;br /&gt;
				mSleep(3000);&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;\n\n\nThe RP6 Sensor Board now is in SHUTDOWN MODE!!!\n&amp;quot;);&lt;br /&gt;
				mSleep(1000);&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;\nRESET the M256 microcontroller now...\n\n&amp;quot;);&lt;br /&gt;
				while(true) {};&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			setStopwatch1(0);&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		task_checkINTs();						// Read interrupt signals&lt;br /&gt;
		task_RP6SensorBoard();					// RP6 Sensor Board task&lt;br /&gt;
&lt;br /&gt;
		task_I2CTWI();&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Erklärung&lt;br /&gt;
&lt;br /&gt;
====Projekte====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===RP6 Xtra Module===&lt;br /&gt;
Die Dokumentation zu den RP6 Xtra Modulen befindet sich auf der mitgelieferten ''&amp;quot;RP6 Robot System Xtra Modules CD-ROM&amp;quot;''. Auf der CD-ROM sind auch Software-Beispiele zu finden.&lt;br /&gt;
&lt;br /&gt;
Die hier veröffentlichte Software zu den Xtra Modulen ist eine Eigenentwicklung in GCC:&lt;br /&gt;
* Arexx [[RP6_Sensor_Board_und_Xtra_Module#I2C_GPS_Empf.C3.A4nger_JM3-GPS_2|I2C GPS Empfänger JM3-GPS]]&lt;br /&gt;
* Arexx [[RP6_Sensor_Board_und_Xtra_Module#Gyro_Modul_JM3-GYRO_2|Gyro Modul JM3-GYRO]]&lt;br /&gt;
* Arexx [[RP6_Sensor_Board_und_Xtra_Module#3D_Accelerometer_Modul_JM3-3DA_2|3D Accelerometer Modul JM3-3DA]]&lt;br /&gt;
* Arexx [[RP6_Sensor_Board_und_Xtra_Module#BHT_Modul_JM3-BHT31_2|BHT Modul JM3-BHT31]]&lt;br /&gt;
&lt;br /&gt;
====I2C GPS Empfänger JM3-GPS====&lt;br /&gt;
=====Dokumentation=====&lt;br /&gt;
Die Dokumentation zum I2C GPS Empfänger befindet sich auf der mitgelieferten ''&amp;quot;RP6 Robot System Xtra Modules CD-ROM&amp;quot;''.&lt;br /&gt;
&lt;br /&gt;
======Manuals======&lt;br /&gt;
Das Handbuch in der aktuellen Version kann [http://www.jm3-engineering.com/download/doc/ManualGPSModule_de.pdf hier] eingesehen werden.&lt;br /&gt;
&lt;br /&gt;
=====Demo-Programme=====&lt;br /&gt;
Ein Demo-Programm zum I2C GPS Empfänger befindet sich integriert in die RP6 Sensor Board Demo auf der mitgelieferten ''&amp;quot;RP6 Robot System Xtra Modules CD-ROM&amp;quot;''. Diese Demo kann auch in der aktuellen Version im Download Bereich von [http://www.jm3-engineering.com/downloads.htm JM3 Engineering] herunter geladen werden.&lt;br /&gt;
&lt;br /&gt;
=====RP6M256 WiFi: I2C_GPS Library=====&lt;br /&gt;
Die nachfolgende RP6M256_I2C_GPSLib (Eigenentwicklung in GCC) dient zur Ansteuerung des I2C GPS Empfängers durch die RP6M256 WiFi.&lt;br /&gt;
 &lt;br /&gt;
======Libary Header======&lt;br /&gt;
Datei: RP6M256_I2C_GPSLib.h&lt;br /&gt;
&amp;lt;pre&amp;gt;/* ****************************************************************************&lt;br /&gt;
 *                           _______________________&lt;br /&gt;
 *                           \| RP6  ROBOT SYSTEM |/&lt;br /&gt;
 *                            \_-_-_-_-_-_-_-_-_-_/           &amp;gt;&amp;gt;&amp;gt; RP6 M256 WIFI&lt;br /&gt;
 * ----------------------------------------------------------------------------&lt;br /&gt;
 * ----------------------------- [c]2014 - Dirk -------------------------------&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * File: RP6M256_I2C_GPSLib.h&lt;br /&gt;
 * Version: 1.0&lt;br /&gt;
 * Target: RP6 M256 WIFI - ATMEGA2560 @16.00MHz&lt;br /&gt;
 * Author(s): Dirk&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Description:&lt;br /&gt;
 * Header file for new RP6 I2C GPS Receiver library.&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
#ifndef RP6M256_I2C_GPSLIB_H&lt;br /&gt;
#define RP6M256_I2C_GPSLIB_H&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// RP6 Sensor Board:&lt;br /&gt;
&lt;br /&gt;
// If you want to use the RP6 I2C GPS Receiver on the RP6 Sensor Board, you&lt;br /&gt;
// have to define SENSOR_BOARD (default)!&lt;br /&gt;
// If SENSOR_BOARD is NOT defined, this library assumes that the RP6 I2C GPS&lt;br /&gt;
// Receiver is used stand-alone.&lt;br /&gt;
// ------------------&lt;br /&gt;
#define SENSOR_BOARD&lt;br /&gt;
// ------------------&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Includes:&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6M256Lib.h&amp;quot;&lt;br /&gt;
#include &amp;quot;RP6I2CmasterTWI.h&amp;quot;&lt;br /&gt;
#ifdef SENSOR_BOARD&lt;br /&gt;
	#include &amp;quot;RP6M256_Sensor_BoardLib.h&amp;quot;&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// RP6 I2C GPS Receiver:&lt;br /&gt;
#define I2C_GPS_RECEIVER_ADR			0xc8	// Default&lt;br /&gt;
//#define I2C_GPS_RECEIVER_ADR			0xca&lt;br /&gt;
//#define I2C_GPS_RECEIVER_ADR			0xcc&lt;br /&gt;
//#define I2C_GPS_RECEIVER_ADR			0xce&lt;br /&gt;
//#define I2C_GPS_RECEIVER_ADR			0xd0	// DO NOT USE on Sensor Board!&lt;br /&gt;
//#define I2C_GPS_RECEIVER_ADR			0xd2&lt;br /&gt;
//#define I2C_GPS_RECEIVER_ADR			0xd4&lt;br /&gt;
//#define I2C_GPS_RECEIVER_ADR			0xd6&lt;br /&gt;
//#define I2C_GPS_RECEIVER_ADR			0xd8&lt;br /&gt;
//#define I2C_GPS_RECEIVER_ADR			0xda&lt;br /&gt;
//#define I2C_GPS_RECEIVER_ADR			0xdc&lt;br /&gt;
//#define I2C_GPS_RECEIVER_ADR			0xde&lt;br /&gt;
&lt;br /&gt;
// Read registers:&lt;br /&gt;
#define WHO_AM_I						0x20	// I2C address [0xc8..0xde]&lt;br /&gt;
#define LAT_DEG							0x21	// Degrees&lt;br /&gt;
#define LAT_MIN							0x22	// Minutes&lt;br /&gt;
#define LAT_MIN_D_L						0x23	// Minutes decimal part low&lt;br /&gt;
#define LAT_MIN_D_H						0x24	// Minutes decimal part high&lt;br /&gt;
#define LON_DEG							0x25	// Degrees&lt;br /&gt;
#define LON_MIN							0x26	// Minutes&lt;br /&gt;
#define LON_MIN_D_L						0x27	// Minutes decimal part low&lt;br /&gt;
#define LON_MIN_D_H						0x28	// Minutes decimal part high&lt;br /&gt;
#define STATUS							0x29	// Status flags&lt;br /&gt;
#define FIX_IND							0x2a	// FIX_IND&lt;br /&gt;
#define HDOP							0x2b	// HDOP&lt;br /&gt;
#define HDOP_D							0x2c	// HDOP_D&lt;br /&gt;
#define SAT_N							0x2d	// Number of satellites&lt;br /&gt;
#define COURSE_T_L						0x2e	// True heading low byte&lt;br /&gt;
#define COURSE_T_H						0x2f	// True heading high byte&lt;br /&gt;
#define COURSE_T_D						0x30	// Decimal part of course&lt;br /&gt;
#define SPEED_L							0x31	// Speed low byte&lt;br /&gt;
#define SPEED_H							0x32	// Speed high byte&lt;br /&gt;
#define SPEED_D							0x33	// Speed decimal part&lt;br /&gt;
#define ALT_L							0x34	// Altitude low byte&lt;br /&gt;
#define ALT_H							0x35	// Altitude high byte&lt;br /&gt;
#define ALT_DIF_L						0x36	// Differ. WGS-84 MSL low byte&lt;br /&gt;
#define ALT_DIF_H						0x37	// Differ. WGS-84 MSL high byte&lt;br /&gt;
#define UTC_H							0x38	// UTC hour&lt;br /&gt;
#define UTC_MIN							0x39	// UTC minute&lt;br /&gt;
#define UTC_S							0x3a	// UTC second&lt;br /&gt;
#define DAY								0x3b	// Day&lt;br /&gt;
#define YEAR_L							0x3c	// Year low byte&lt;br /&gt;
#define YEAR_H							0x3d	// Year high byte&lt;br /&gt;
#define MONTH							0x3e	// Month&lt;br /&gt;
#define PDOP							0x3f	// PDOP&lt;br /&gt;
#define PDOP_D							0x40	// PDOP_D&lt;br /&gt;
#define VDOP							0x41	// VDOP&lt;br /&gt;
#define VDOP_D							0x42	// VDOP_D&lt;br /&gt;
#define SAT_1							0x43	// SAT # 1&lt;br /&gt;
#define SAT_2							0x44	// SAT # 2&lt;br /&gt;
#define SAT_3							0x45	// SAT # 3&lt;br /&gt;
#define SAT_4							0x46	// SAT # 4&lt;br /&gt;
#define SAT_5							0x47	// SAT # 5&lt;br /&gt;
#define SAT_6							0x48	// SAT # 6&lt;br /&gt;
#define SAT_7							0x49	// SAT # 7&lt;br /&gt;
#define SAT_8							0x4a	// SAT # 8&lt;br /&gt;
#define SAT_9							0x4b	// SAT # 9&lt;br /&gt;
#define SAT_A							0x4c	// SAT # 10&lt;br /&gt;
#define SAT_B							0x4d	// SAT # 11&lt;br /&gt;
#define SAT_C							0x4e	// SAT # 12&lt;br /&gt;
#define SW_VERSION						0x4f	// SW_Version&lt;br /&gt;
#define HEARTBEAT						0x50	// Heartbeat&lt;br /&gt;
&lt;br /&gt;
// Status and Fix_Ind register bitmasks:&lt;br /&gt;
#define STATUS_NS						0b00000001&lt;br /&gt;
#define STATUS_EW						0b00000010&lt;br /&gt;
#define STATUS_SPU						0b00000100&lt;br /&gt;
#define STATUS_AUTON					0b00001000&lt;br /&gt;
#define FIX_IND_UI_FIX					0b10000000&lt;br /&gt;
&lt;br /&gt;
// Write registers:&lt;br /&gt;
#define INIT_CFG						0x90	// INIT CFG&lt;br /&gt;
#define SET_FIX_TIME					0x91	// Pos_Fix_Time&lt;br /&gt;
#define STBY							0x92	// STBY&lt;br /&gt;
#define FAC_RES							0x93	// Factory Reset&lt;br /&gt;
#define EN_JAM							0x94	// Jamming Remover&lt;br /&gt;
#define TEST_MODE						0x96	// Test Mode&lt;br /&gt;
&lt;br /&gt;
// Write register values (commands):&lt;br /&gt;
#define INIT_CFG_HOT_START				1		// Hot Start&lt;br /&gt;
#define INIT_CFG_WARM_START				2		// Warm Start init data loaded&lt;br /&gt;
#define INIT_CFG_WARM_START_EPH_CLR		3		// Warm Start Ephemeris cleared&lt;br /&gt;
#define INIT_CFG_COLD_START				4		// Cold Start&lt;br /&gt;
#define SET_FIX_TIME_1S					1		// Pos Fix Time 1 second&lt;br /&gt;
#define SET_FIX_TIME_2S					2		// Pos Fix Time 2 seconds&lt;br /&gt;
#define STBY_ENTER						1		// Standby (cleared after write)&lt;br /&gt;
#define FAC_RES_ENTER					1		// Factory Reset&lt;br /&gt;
#define EN_JAM_DISABLE					0		// Jamming Remover disable&lt;br /&gt;
#define EN_JAM_ENABLE					1		// Jamming Remover enable&lt;br /&gt;
#define TEST_MODE_INACTIVE				0		// Test Mode inactive&lt;br /&gt;
#define TEST_MODE_ACTIVE				0x15	// Test Mode active&lt;br /&gt;
&lt;br /&gt;
// Data structure (starts at LAT_DEG):&lt;br /&gt;
#define DATA_STRUCT						LAT_DEG	// Start&lt;br /&gt;
// All data from LAT_DEG to HEARTBEAT (48 bytes):&lt;br /&gt;
#define DATA_LENGTH						(HEARTBEAT - LAT_DEG + 1)&lt;br /&gt;
// Basic data from LAT_DEG to SAT_N (13 bytes):&lt;br /&gt;
#define DATA_BASIC						(SAT_N - LAT_DEG + 1)&lt;br /&gt;
&lt;br /&gt;
typedef union {&lt;br /&gt;
 	uint8_t byte;&lt;br /&gt;
	struct {&lt;br /&gt;
		unsigned ns    :1;				// 1: North 0: South&lt;br /&gt;
		unsigned ew    :1;				// 1: East 0: West&lt;br /&gt;
		unsigned spu   :1;				// 1: km/h 0: kn&lt;br /&gt;
		unsigned auton :1;				// 1: Data not valid 0: Autonomous&lt;br /&gt;
		unsigned fix0  :1;&lt;br /&gt;
		unsigned fix1  :1;&lt;br /&gt;
		unsigned stat0 :1;				// Invalid&lt;br /&gt;
		unsigned stat1 :1;				// GPS Com Error&lt;br /&gt;
	};&lt;br /&gt;
	struct {&lt;br /&gt;
		unsigned ns    :1;				// 1: North 0: South&lt;br /&gt;
		unsigned ew    :1;				// 1: East 0: West&lt;br /&gt;
		unsigned spu   :1;				// 1: km/h 0: kn&lt;br /&gt;
		unsigned auton :1;				// 1: Data not valid 0: Autonomous&lt;br /&gt;
		unsigned fix   :2;&lt;br /&gt;
		unsigned stat  :2;				// 00 -&amp;gt; Valid&lt;br /&gt;
										// 01 -&amp;gt; Invalid&lt;br /&gt;
										// 10 -&amp;gt; GPS Com Error&lt;br /&gt;
										// 11 -&amp;gt; n. def.&lt;br /&gt;
	};&lt;br /&gt;
} status_t;&lt;br /&gt;
&lt;br /&gt;
typedef union {&lt;br /&gt;
 	uint8_t byte;&lt;br /&gt;
	struct {							// Fix indicator:&lt;br /&gt;
		unsigned fix_0  :1;				//  1: GPS fix          2: DGPS fix&lt;br /&gt;
		unsigned fix_1  :1;				//  3: PPS fix          4: RTK&lt;br /&gt;
		unsigned fix_2  :1;				//  5: Float RTK        6: Dead reck.&lt;br /&gt;
		unsigned fix_3  :1;				//  7: Manual inp. mode 8: Simul. mode&lt;br /&gt;
		unsigned unused :3;&lt;br /&gt;
		unsigned ui_fix :1;				// HW signal from UC530&lt;br /&gt;
	};&lt;br /&gt;
	struct {&lt;br /&gt;
		unsigned fix    :4;				// See above &amp;quot;Fix indicator&amp;quot;!&lt;br /&gt;
		unsigned unused :3;&lt;br /&gt;
		unsigned ui_fix :1;				// HW signal from UC530&lt;br /&gt;
	};&lt;br /&gt;
} fix_ind_t;&lt;br /&gt;
&lt;br /&gt;
typedef union {&lt;br /&gt;
	struct {&lt;br /&gt;
		uint8_t   latDeg;&lt;br /&gt;
		uint8_t   latMin;&lt;br /&gt;
		uint16_t  latMinDec;&lt;br /&gt;
		uint8_t   lonDeg;&lt;br /&gt;
		uint8_t   lonMin;&lt;br /&gt;
		uint16_t  lonMinDec;&lt;br /&gt;
		status_t  status;&lt;br /&gt;
		fix_ind_t fixInd;&lt;br /&gt;
		uint8_t   hdop;&lt;br /&gt;
		uint8_t   hdopDec;&lt;br /&gt;
		uint8_t   satCount;&lt;br /&gt;
		uint16_t  course;&lt;br /&gt;
		uint8_t   courseDec;&lt;br /&gt;
		uint16_t  speed;&lt;br /&gt;
		uint8_t   speedDec;&lt;br /&gt;
		uint16_t  altitude;&lt;br /&gt;
		uint16_t  altDif;&lt;br /&gt;
		uint8_t   utcHour;&lt;br /&gt;
		uint8_t   utcMinute;&lt;br /&gt;
		uint8_t   utcSec;&lt;br /&gt;
		uint8_t   day;&lt;br /&gt;
		uint16_t  year;&lt;br /&gt;
		uint8_t   month;&lt;br /&gt;
		uint8_t   pdop;&lt;br /&gt;
		uint8_t   pdopDec;&lt;br /&gt;
		uint8_t   vdop;&lt;br /&gt;
		uint8_t   vdopDec;&lt;br /&gt;
		uint8_t   sat[12];&lt;br /&gt;
		uint8_t   swVersion;&lt;br /&gt;
		uint8_t   heartbeat;&lt;br /&gt;
	};&lt;br /&gt;
} gpsdata_t;&lt;br /&gt;
extern gpsdata_t gpsdata;&lt;br /&gt;
&lt;br /&gt;
void I2C_GPS_reset(void);&lt;br /&gt;
void I2C_GPS_write_cmd(uint8_t, uint8_t);&lt;br /&gt;
uint8_t I2C_GPS_read_reg(uint8_t);&lt;br /&gt;
void I2C_GPS_read(uint8_t);&lt;br /&gt;
void I2C_GPS_init(void);&lt;br /&gt;
void I2C_GPS_new_addr(uint8_t);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
/******************************************************************************&lt;br /&gt;
 * Additional info&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Changelog:&lt;br /&gt;
 * &lt;br /&gt;
 *  ---&amp;gt; changes are documented in the file &amp;quot;RP6M256_I2C_GPSLib.c&amp;quot;&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
======Libary Source======&lt;br /&gt;
Datei: RP6M256_I2C_GPSLib.c&lt;br /&gt;
&amp;lt;pre&amp;gt;/* ****************************************************************************&lt;br /&gt;
 *                           _______________________&lt;br /&gt;
 *                           \| RP6  ROBOT SYSTEM |/&lt;br /&gt;
 *                            \_-_-_-_-_-_-_-_-_-_/           &amp;gt;&amp;gt;&amp;gt; RP6 M256 WIFI&lt;br /&gt;
 * ----------------------------------------------------------------------------&lt;br /&gt;
 * ----------------------------- [c]2014 - Dirk -------------------------------&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * File: RP6M256_I2C_GPSLib.c&lt;br /&gt;
 * Version: 1.0&lt;br /&gt;
 * Target: RP6 M256 WIFI - ATMEGA2560 @16.00MHz&lt;br /&gt;
 *         and a RP6 I2C GPS Receiver (CONRAD 1082385)&lt;br /&gt;
 *         optionally on a RP6 Sensor Board (CONRAD 1082384)&lt;br /&gt;
 * Author(s): Dirk&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Description:&lt;br /&gt;
 * &lt;br /&gt;
 * This is our new Library that contains basic routines and functions for&lt;br /&gt;
 * accessing the RP6 I2C GPS Receiver JM3-GPS (CONRAD 1082385).&lt;br /&gt;
 * The library assumes the I2C GPS Receiver software (firmware) v1.2.&lt;br /&gt;
 * If the I2C GPS Receiver is located on the RP6 Sensor Board (CONRAD 1082384)&lt;br /&gt;
 * and connected to the I2C-MODULE plug M1, the RP6M256_Sensor_BoardLib has to&lt;br /&gt;
 * be included!&lt;br /&gt;
 * &lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Includes:&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6M256_I2C_GPSLib.h&amp;quot; 		&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Variables:&lt;br /&gt;
&lt;br /&gt;
uint8_t gpsdataBuf[DATA_LENGTH + 1]; &lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Software reset for the I2C GPS Receiver.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void I2C_GPS_reset(void)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_GPS_RECEIVER_ADR, 0, 0x06);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Writes a command cmd to a register reg of the&lt;br /&gt;
 * I2C GPS Receiver.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: reg -&amp;gt; Write register [0x90..0x96]&lt;br /&gt;
 *        cmd -&amp;gt; Command&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void I2C_GPS_write_cmd(uint8_t reg, uint8_t cmd)&lt;br /&gt;
{&lt;br /&gt;
	if((reg &amp;lt; INIT_CFG) || (reg &amp;gt; TEST_MODE)) return;&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_GPS_RECEIVER_ADR, reg, cmd);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Reads a single register reg from the I2C GPS&lt;br /&gt;
 * Receiver.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: reg -&amp;gt; Read register [0x20..0x50]&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
uint8_t I2C_GPS_read_reg(uint8_t reg)&lt;br /&gt;
{&lt;br /&gt;
	if((reg &amp;lt; WHO_AM_I) || (reg &amp;gt; HEARTBEAT)) reg = WHO_AM_I;&lt;br /&gt;
	I2CTWI_transmitByte(I2C_GPS_RECEIVER_ADR, reg);&lt;br /&gt;
	return (I2CTWI_readByte(I2C_GPS_RECEIVER_ADR));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
gpsdata_t gpsdata;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Reads the GPS data from the I2C GPS Receiver.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: length -&amp;gt; Number of data bytes [1..48]&lt;br /&gt;
 *&lt;br /&gt;
 * Hint: If length = DATA_BASIC, only basic GPS&lt;br /&gt;
 *       data are read. If length = DATA_LENGTH,&lt;br /&gt;
 *       ALL GPS data are read.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void I2C_GPS_read(uint8_t length)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t i;&lt;br /&gt;
&lt;br /&gt;
	if(length &amp;gt; DATA_LENGTH) length = DATA_LENGTH;&lt;br /&gt;
	I2CTWI_readRegisters(I2C_GPS_RECEIVER_ADR, DATA_STRUCT, gpsdataBuf, length);&lt;br /&gt;
	for(i = length; i &amp;lt; DATA_LENGTH; i++) {&lt;br /&gt;
		gpsdataBuf[i] = 0;&lt;br /&gt;
	}&lt;br /&gt;
	gpsdata.latDeg = gpsdataBuf[0];&lt;br /&gt;
	gpsdata.latMin = gpsdataBuf[1];&lt;br /&gt;
	gpsdata.latMinDec = gpsdataBuf[2] + (gpsdataBuf[3] &amp;lt;&amp;lt; 8);&lt;br /&gt;
	gpsdata.lonDeg = gpsdataBuf[4];&lt;br /&gt;
	gpsdata.lonMin = gpsdataBuf[5];&lt;br /&gt;
	gpsdata.lonMinDec = gpsdataBuf[6] + (gpsdataBuf[7] &amp;lt;&amp;lt; 8);&lt;br /&gt;
	gpsdata.status.byte = gpsdataBuf[8];&lt;br /&gt;
	gpsdata.fixInd.byte = gpsdataBuf[9];&lt;br /&gt;
	gpsdata.hdop = gpsdataBuf[10];&lt;br /&gt;
	gpsdata.hdopDec = gpsdataBuf[11];&lt;br /&gt;
	gpsdata.satCount = gpsdataBuf[12];&lt;br /&gt;
	if(length == DATA_BASIC) return;&lt;br /&gt;
	gpsdata.course = gpsdataBuf[13] + (gpsdataBuf[14] &amp;lt;&amp;lt; 8);&lt;br /&gt;
	gpsdata.courseDec = gpsdataBuf[15];&lt;br /&gt;
	gpsdata.speed = gpsdataBuf[16] + (gpsdataBuf[17] &amp;lt;&amp;lt; 8);&lt;br /&gt;
	gpsdata.speedDec = gpsdataBuf[18];&lt;br /&gt;
	gpsdata.altitude = gpsdataBuf[19] + (gpsdataBuf[20] &amp;lt;&amp;lt; 8);&lt;br /&gt;
	gpsdata.altDif = gpsdataBuf[21] + (gpsdataBuf[22] &amp;lt;&amp;lt; 8);&lt;br /&gt;
	gpsdata.utcHour = gpsdataBuf[23];&lt;br /&gt;
	gpsdata.utcMinute = gpsdataBuf[24];&lt;br /&gt;
	gpsdata.utcSec = gpsdataBuf[25];&lt;br /&gt;
	gpsdata.day = gpsdataBuf[26];&lt;br /&gt;
	gpsdata.year = gpsdataBuf[27] + (gpsdataBuf[28] * 100);&lt;br /&gt;
	gpsdata.month = gpsdataBuf[29];&lt;br /&gt;
	gpsdata.pdop = gpsdataBuf[30];&lt;br /&gt;
	gpsdata.pdopDec = gpsdataBuf[31];&lt;br /&gt;
	gpsdata.vdop = gpsdataBuf[32];&lt;br /&gt;
	gpsdata.vdopDec = gpsdataBuf[33];&lt;br /&gt;
	for(i = 34; i &amp;lt; 46; i++) {&lt;br /&gt;
		gpsdata.sat[i - 34] = gpsdataBuf[i];&lt;br /&gt;
	}&lt;br /&gt;
	gpsdata.swVersion = gpsdataBuf[46];&lt;br /&gt;
	gpsdata.heartbeat = gpsdataBuf[47];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * You MUST call this function at the beginning of a&lt;br /&gt;
 * main program, that uses the RP6 I2C GPS Receiver. &lt;br /&gt;
 * If SENSOR_BOARD is defined, the I2C-MODULE power&lt;br /&gt;
 * will be switched on with the function&lt;br /&gt;
 * setI2CModulePower() defined in the&lt;br /&gt;
 * RP6M256_Sensor_BoardLib, which will be included&lt;br /&gt;
 * then.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void I2C_GPS_init(void)&lt;br /&gt;
{&lt;br /&gt;
#ifdef SENSOR_BOARD&lt;br /&gt;
	// I2C-MODULE (plug M1) power on: &lt;br /&gt;
	setI2CModulePower(1);&lt;br /&gt;
#endif&lt;br /&gt;
	// Other init procedures here!&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Writes a new I2C address to the I2C GPS Receiver.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: addr -&amp;gt; New I2C address [0xc8..0xde]&lt;br /&gt;
 *&lt;br /&gt;
 * Hints: - Default I2C address is 0xc8.&lt;br /&gt;
 *        - You may choose a new I2C address in&lt;br /&gt;
 *          the range 0xc8..0xde.&lt;br /&gt;
 *        - After writing a new address you have&lt;br /&gt;
 *          to switch the I2C GPS Receiver off&lt;br /&gt;
 *          and on again.&lt;br /&gt;
 *        - Definition I2C_GPS_RECEIVER_ADR must&lt;br /&gt;
 *          be adapted to the new I2C address!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void I2C_GPS_new_addr(uint8_t addr)&lt;br /&gt;
{&lt;br /&gt;
	if((addr &amp;lt; 0xc8) || (addr &amp;gt; 0xde)) return;&lt;br /&gt;
	addr &amp;amp;= 0xfe;								// Clear R/W bit&lt;br /&gt;
	I2CTWI_transmit3Bytes(I2C_GPS_RECEIVER_ADR, 0, 0x04, addr);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&lt;br /&gt;
/******************************************************************************&lt;br /&gt;
 * Additional info&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Changelog:&lt;br /&gt;
 * - v. 1.0 (initial release) 21.04.2014 by Dirk&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Erklärung&lt;br /&gt;
&lt;br /&gt;
======Demo======&lt;br /&gt;
makefile:&lt;br /&gt;
&amp;lt;pre&amp;gt;...&lt;br /&gt;
TARGET = RP6M256_Sensor_Board_02&lt;br /&gt;
...&lt;br /&gt;
SRC += $(RP6_LIB_PATH)/RP6common/RP6I2CmasterTWI.c&lt;br /&gt;
&lt;br /&gt;
SRC += $(RP6_LIB_PATH)/RP6control_M256_WIFI/RP6M256_Sensor_BoardLib.c&lt;br /&gt;
SRC += $(RP6_LIB_PATH)/RP6control_M256_WIFI/RP6M256_I2C_GPSLib.c&lt;br /&gt;
...&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Datei: RP6M256_Sensor_Board_02.c&lt;br /&gt;
&amp;lt;pre&amp;gt;/* &lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * RP6 ROBOT SYSTEM - RP6 CONTROL M256 Examples&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Example: RP6M256 Sensor Board&lt;br /&gt;
 * Author(s): Dirk&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Description:&lt;br /&gt;
 * In this example we show a second test for the RP6 Sensor Board.&lt;br /&gt;
 * &lt;br /&gt;
 * ############################################################################&lt;br /&gt;
 * The Robot does NOT move in this example! You can simply put it on a table&lt;br /&gt;
 * next to your PC and you should connect it to the PC via the USB Interface!&lt;br /&gt;
 * You should also connect to it via WIFI.&lt;br /&gt;
 * ############################################################################&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Includes:&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6M256Lib.h&amp;quot; 				// The RP6 M256 Library. &lt;br /&gt;
										// Always needs to be included!&lt;br /&gt;
#include &amp;quot;RP6I2CmasterTWI.h&amp;quot;			// Include the I2C-Bus Master Library&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Include our new &amp;quot;RP6M256 I2C GPS Receiver library&amp;quot;:&lt;br /&gt;
// (This is the library for accessing the RP6 I2C GPS Receiver!)&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6M256_I2C_GPSLib.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Write a floating point number to the WIFI.&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *&lt;br /&gt;
 *			// Write a floating point number to the WIFI (no exponent):&lt;br /&gt;
 *			writeDouble_WIFI(1234567.890, 11, 3);&lt;br /&gt;
 *&lt;br /&gt;
 * The value of prec (precision) defines the number of decimal places.&lt;br /&gt;
 * For 32 bit floating point variables (float, double ...) 6 is&lt;br /&gt;
 * the max. value for prec (7 relevant digits).&lt;br /&gt;
 * The value of width defines the overall number of characters in the&lt;br /&gt;
 * floating point number including the decimal point. The number of&lt;br /&gt;
 * pre-decimal positions is: (width - prec - 1).&lt;br /&gt;
 */&lt;br /&gt;
void writeDouble_WIFI(double number, uint8_t width, uint8_t prec)&lt;br /&gt;
{char buffer[width + 1];&lt;br /&gt;
	dtostrf(number, width, prec, &amp;amp;buffer[0]);&lt;br /&gt;
	writeString_WIFI(&amp;amp;buffer[0]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Write a floating point number to the LCD.&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *&lt;br /&gt;
 *			// Write a floating point number to the LCD (no exponent):&lt;br /&gt;
 *			writeDoubleLCD(1234567.890, 11, 3);&lt;br /&gt;
 *&lt;br /&gt;
 * The value of prec (precision) defines the number of decimal places.&lt;br /&gt;
 * For 32 bit floating point variables (float, double ...) 6 is&lt;br /&gt;
 * the max. value for prec (7 relevant digits).&lt;br /&gt;
 * The value of width defines the overall number of characters in the&lt;br /&gt;
 * floating point number including the decimal point. The number of&lt;br /&gt;
 * pre-decimal positions is: (width - prec - 1).&lt;br /&gt;
 */&lt;br /&gt;
void writeDoubleLCD(double number, uint8_t width, uint8_t prec)&lt;br /&gt;
{char buffer[width + 1];&lt;br /&gt;
	dtostrf(number, width, prec, &amp;amp;buffer[0]);&lt;br /&gt;
	writeStringLCD(&amp;amp;buffer[0]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Error handler&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function gets called automatically if there was an I2C Error like&lt;br /&gt;
 * the slave sent a &amp;quot;not acknowledge&amp;quot; (NACK, error codes e.g. 0x20 or 0x30).&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void I2C_transmissionError(uint8_t errorState)&lt;br /&gt;
{&lt;br /&gt;
	writeString_P_WIFI(&amp;quot;\nI2C ERROR - TWI STATE: 0x&amp;quot;);&lt;br /&gt;
	writeInteger_WIFI(errorState, HEX);&lt;br /&gt;
	writeChar_WIFI('\n');&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Main function - The program starts here:&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
	initRP6M256();    // Always call this first! The Processor will not work&lt;br /&gt;
					  // correctly otherwise. &lt;br /&gt;
&lt;br /&gt;
	initLCD(); // Initialize the LC-Display (LCD)&lt;br /&gt;
			   // Always call this before using the LCD!&lt;br /&gt;
&lt;br /&gt;
	setLEDs(0b1111);&lt;br /&gt;
	mSleep(500);&lt;br /&gt;
	setLEDs(0b0000);&lt;br /&gt;
&lt;br /&gt;
	writeString_P_WIFI(&amp;quot;\n\nRP6 Sensor Board Selftest 2!\n&amp;quot;); &lt;br /&gt;
&lt;br /&gt;
	// IMPORTANT:&lt;br /&gt;
	I2CTWI_initMaster(100); // Initialize the TWI Module for Master operation&lt;br /&gt;
							// with 100kHz SCL Frequency&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	// Register the event handler:&lt;br /&gt;
	I2CTWI_setTransmissionErrorHandler(I2C_transmissionError);&lt;br /&gt;
&lt;br /&gt;
	setLEDs(0b1111);&lt;br /&gt;
&lt;br /&gt;
	// Write a text message to the LCD:&lt;br /&gt;
	showScreenLCD(&amp;quot;################&amp;quot;, &amp;quot;################&amp;quot;);&lt;br /&gt;
	mSleep(1500);&lt;br /&gt;
	showScreenLCD(&amp;quot;RP6v2-M256-WIFI &amp;quot;, &amp;quot;Example Program&amp;quot;);&lt;br /&gt;
	mSleep(2500); &lt;br /&gt;
	showScreenLCD(&amp;quot;RP6 Sensor Board&amp;quot;, &amp;quot;   Selftest 2&amp;quot;);&lt;br /&gt;
	mSleep(2500);&lt;br /&gt;
	clearLCD();&lt;br /&gt;
&lt;br /&gt;
	setLEDs(0b0000);&lt;br /&gt;
&lt;br /&gt;
	// ---------------------------------------&lt;br /&gt;
&lt;br /&gt;
	uint8_t onoff = 0;&lt;br /&gt;
	uint8_t i;&lt;br /&gt;
&lt;br /&gt;
	startStopwatch1();&lt;br /&gt;
	startStopwatch2();&lt;br /&gt;
&lt;br /&gt;
	// IMPORTANT:&lt;br /&gt;
	sensor_board_init();						// RP6 Sensor Board init!!!&lt;br /&gt;
	I2C_GPS_init();								// RP6 I2C GPS Receiver init&lt;br /&gt;
&lt;br /&gt;
	while(true) &lt;br /&gt;
	{&lt;br /&gt;
		if(getStopwatch1() &amp;gt; 1000) // 1s&lt;br /&gt;
		{&lt;br /&gt;
			if (onoff) onoff = 0;&lt;br /&gt;
			else onoff = 1;&lt;br /&gt;
&lt;br /&gt;
			// Show GPS data:&lt;br /&gt;
			I2C_GPS_read(DATA_LENGTH);			// Read data&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nLAT_DEG:     &amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.latDeg, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;° &amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.latMin, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;.&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.latMinDec, DEC, 4);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;' &amp;quot;);&lt;br /&gt;
			if(gpsdata.status.ns)&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;N&amp;quot;);&lt;br /&gt;
			else&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;S&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nLON_DEG:    &amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.lonDeg, DEC, 3);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;° &amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.lonMin, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;.&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.lonMinDec, DEC, 4);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;' &amp;quot;);&lt;br /&gt;
			if(gpsdata.status.ew)&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;E&amp;quot;);&lt;br /&gt;
			else&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;W&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nSTATUS:     &amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.status.byte, BIN, 8);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nFIX_IND:    &amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.fixInd.byte, BIN, 8);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nHDOP:       &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(gpsdata.hdop, DEC);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;.&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.hdopDec, DEC, 2);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nSAT_N:      &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(gpsdata.satCount, DEC);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nCOURSE_T:   &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(gpsdata.course, DEC);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;.&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.courseDec, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;°&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nSPEED:      &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(gpsdata.speed, DEC);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;.&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.speedDec, DEC, 2);&lt;br /&gt;
			if(gpsdata.status.spu)&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;km/h&amp;quot;);&lt;br /&gt;
			else&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;kn&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nALT:        &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(gpsdata.altitude, DEC);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;m\nALT_DIF:    &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(gpsdata.altDif, DEC);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;m\nUTC:        &amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.utcHour, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;:&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.utcMinute, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;:&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.utcSec, DEC, 2);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nDATE:       &amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.day, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;.&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.month, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;.&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.year, DEC, 4);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nPDOP:       &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(gpsdata.pdop, DEC);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;.&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.pdopDec, DEC, 2);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nVDOP:       &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(gpsdata.vdop, DEC);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;.&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.vdopDec, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			for(i = 0; i &amp;lt; gpsdata.satCount; i++) {&lt;br /&gt;
				if(i == 8) writeString_P_WIFI(&amp;quot;\n&amp;quot;);&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;  SAT_&amp;quot;);&lt;br /&gt;
				writeIntegerLength_WIFI(i + 1, HEX, 1);&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;: &amp;quot;);&lt;br /&gt;
				writeInteger_WIFI(gpsdata.sat[i], DEC);&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nSW_VERSION: &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(gpsdata.swVersion, DEC);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nHEARTBEAT:  &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(gpsdata.heartbeat, DEC);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			// RP6 Sensor Board shutdown (button &amp;amp; status LED test):&lt;br /&gt;
			if (pressedButton) {&lt;br /&gt;
				setStatusLED(1);&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;\nPress button again for RP6 Sensor Board SHUTDOWN!\n&amp;quot;);&lt;br /&gt;
				mSleep(2000);&lt;br /&gt;
				do {&lt;br /&gt;
					if(getStopwatch2() &amp;gt; 200) { // 0.2s&lt;br /&gt;
						if (onoff) onoff = 0;&lt;br /&gt;
						else onoff = 1;&lt;br /&gt;
						if (onoff) setStatusLED(1);&lt;br /&gt;
						else setStatusLED(0);&lt;br /&gt;
						setStopwatch2(0);&lt;br /&gt;
					}&lt;br /&gt;
					mSleep(1);&lt;br /&gt;
					task_I2CTWI();&lt;br /&gt;
				} while (!readButton());&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;\n\n\n\n\nPlease wait for RP6 Sensor Board SHUTDOWN...\n&amp;quot;);&lt;br /&gt;
				sensor_board_shutdown();&lt;br /&gt;
				mSleep(3000);&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;\n\n\nThe RP6 Sensor Board now is in SHUTDOWN MODE!!!\n&amp;quot;);&lt;br /&gt;
				mSleep(1000);&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;\nRESET the M256 microcontroller now...\n\n&amp;quot;);&lt;br /&gt;
				while(true) {};&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			setStopwatch1(0);&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		task_RP6SensorBoard();					// RP6 Sensor Board task&lt;br /&gt;
&lt;br /&gt;
		task_I2CTWI();&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Erklärung&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Gyro Modul JM3-GYRO====&lt;br /&gt;
=====Dokumentation=====&lt;br /&gt;
Die Dokumentation zum Gyro Modul befindet sich auf der mitgelieferten ''&amp;quot;RP6 Robot System Xtra Modules CD-ROM&amp;quot;''.&lt;br /&gt;
&lt;br /&gt;
======Manuals======&lt;br /&gt;
Das Handbuch in der aktuellen Version kann [http://www.jm3-engineering.com/download/doc/ManualGyroModule_de.pdf hier] eingesehen werden.&lt;br /&gt;
&lt;br /&gt;
=====Demo-Programme=====&lt;br /&gt;
Ein Demo-Programm zum Gyro Modul befindet sich integriert in die RP6 Sensor Board Demo auf der mitgelieferten ''&amp;quot;RP6 Robot System Xtra Modules CD-ROM&amp;quot;''. Diese Demo kann auch in der aktuellen Version im Download Bereich von [http://www.jm3-engineering.com/downloads.htm JM3 Engineering] herunter geladen werden.&lt;br /&gt;
&lt;br /&gt;
=====Analoge Auswertung=====&lt;br /&gt;
Am Pin ''OUT'' des Gyro Moduls (siehe [http://www.rn-wissen.de/index.php/RP6_Sensor_Board_und_Xtra_Module#Anschluss-Schema_2 Anschluss-Schema]!) liegt die Ausgangsspannung des Sensors (0..5V) an. Sie kann mit einem ADC-Eingang eines Microcontrollers gemessen werden.&lt;br /&gt;
Syntax mit den Libraries der RP6Base, M32 oder M256 WiFi (ADC Kanal 0):&lt;br /&gt;
 uint16_t result = readADC(0);&lt;br /&gt;
In der C-Control-Pro Umgebung der M128 sieht das z.B. in CompactC so aus (ADC Kanal 0):&lt;br /&gt;
 word result;&lt;br /&gt;
 ADC_Set(ADC_VREF_VCC, 0);&lt;br /&gt;
 ...&lt;br /&gt;
 result = ADC_Read();&lt;br /&gt;
Das Ergebnis ''result'' kann noch zur Weiterverarbeitung angepasst werden:&lt;br /&gt;
 #define ADCVAL_ZERORATE_LEVEL			511		// Zero rate Level&lt;br /&gt;
 ...&lt;br /&gt;
 int16_t z_axisg = result - ADCVAL_ZERORATE_LEVEL;&lt;br /&gt;
Dadurch zeigt ''z_axisg'' Null an, wenn keine Rotation anliegt und wird positiv, wenn nach LINKS gedreht wird und negativ bei RECHTS-Drehung. Die Definition ADCVAL_ZERORATE_LEVEL muss natürlich an den eigenen Sensor-Nullwert angepasst werden.&lt;br /&gt;
&lt;br /&gt;
Aus dem Absolutwert von ''z_axisg'' kann man die Drehrate (Drehgeschwindigkeit) auch bestimmen:&lt;br /&gt;
&lt;br /&gt;
In den [[RP6_Sensor_Board_und_Xtra_Module#Technische_Daten_3|Technischen Daten]] ist die Empfindlichkeit des Sensors mit '''10mV/dps''' (0,01V pro Grad und Sekunde) angegeben. Damit errechnet sich die Drehrate als:&lt;br /&gt;
 Drehrate [dps] = abs(z_axisg) * (5 / 1024 / 0.01) = abs(z_axisg) * 0.48828125&lt;br /&gt;
&lt;br /&gt;
=====Optionale Ansteuerung=====&lt;br /&gt;
Im [[RP6_Sensor_Board_und_Xtra_Module#Anschluss-Schema_2|Anschluss-Schema]] ist erkennbar, dass es noch 2 Steuerleitungen ''SLEEP/PD'' und ''ST'' gibt. Mit diesen Anschlüssen kann die Betriebsart des Gyro Moduls festgelegt werden, siehe nachfolgende Tabelle:&lt;br /&gt;
{|  {{Blauetabelle}} &lt;br /&gt;
|Betriebsart&lt;br /&gt;
|ST&lt;br /&gt;
|SLEEP/PD&lt;br /&gt;
|Stromverbrauch&lt;br /&gt;
|-&lt;br /&gt;
|Normal&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|4,2mA&lt;br /&gt;
|-&lt;br /&gt;
|Sleep&lt;br /&gt;
|0&lt;br /&gt;
|1&lt;br /&gt;
|2,2mA&lt;br /&gt;
|-&lt;br /&gt;
|Self-test&lt;br /&gt;
|1&lt;br /&gt;
|0&lt;br /&gt;
|4,2mA&lt;br /&gt;
|-&lt;br /&gt;
|Power-down&lt;br /&gt;
|1&lt;br /&gt;
|1&lt;br /&gt;
|'''5µA'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
Will man zwischen den Betriebsarten per Software umschalten, muss man die beiden Steuerleitungen mit I/O Portpins des Microcontrollers verbinden, die als Ausgänge konfiguriert sind. Braucht man diese Funktion nicht, reicht es, ''ST'' und ''SLEEP/PD'' mit GND zu verbinden (Betriebsart &amp;quot;Normal&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====3D Accelerometer Modul JM3-3DA====&lt;br /&gt;
Das 3D Accelerometer Modul kann über den I2C- oder den SPI-Bus angesteuert werden. Wird das Modul auf der RP6 CONTROL M32 Platine betrieben (es sitzt also auf dem Sockel IC5 für das 2. SPI-EEPROM), dann erfolgt die Ansteuerung über den SPI-Bus. Die SPI-Grundfunktionen befinden sich in der RP6ControlLib, die daher eingebunden werden muss.&lt;br /&gt;
&lt;br /&gt;
=====Dokumentation=====&lt;br /&gt;
Die Dokumentation zum 3D Accelerometer Modul befindet sich auf der mitgelieferten ''&amp;quot;RP6 Robot System Xtra Modules CD-ROM&amp;quot;''.&lt;br /&gt;
&lt;br /&gt;
======Manuals======&lt;br /&gt;
Das Handbuch in der aktuellen Version kann [http://www.jm3-engineering.com/download/doc/Manual3DAccelerometer_de.pdf hier] eingesehen werden.&lt;br /&gt;
&lt;br /&gt;
=====Demo-Programme=====&lt;br /&gt;
Ein Demo-Programm zum 3D Accelerometer Modul befindet sich integriert in die RP6 Sensor Board Demo auf der mitgelieferten ''&amp;quot;RP6 Robot System Xtra Modules CD-ROM&amp;quot;''. Diese Demo kann auch in der aktuellen Version im Download Bereich von [http://www.jm3-engineering.com/downloads.htm JM3 Engineering] herunter geladen werden.&lt;br /&gt;
&lt;br /&gt;
=====RP6 CONTROL M32: ACCSENS Library=====&lt;br /&gt;
Die nachfolgende RP6ControlACCSENSLib (Eigenentwicklung in GCC) dient zur Ansteuerung des 3D Accelerometer Moduls durch die RP6 CONTROL M32.&lt;br /&gt;
&lt;br /&gt;
======Configuration Header======&lt;br /&gt;
Vor dem Kompilieren der Library muss eine Anpassung des Configuration Headers an die eigenen Hardware-Voraussetzungen erfolgen.&lt;br /&gt;
Dazu gibt es im Configuration Header eine Definition:&lt;br /&gt;
* EXP_STACK_1 -&amp;gt; Die RP6 CONTROL M32 sitzt auf dem vorderen Platinenstapel 1 des RP6&lt;br /&gt;
Im nachfolgenden Listing ist die Definition EXP_STACK_1 NICHT aktiv (d.h. die M32 sitzt auf dem hinteren Platinenstapel 2!). Dies muss an die eigene Hardware angepaßt werden. Wenn die RP6 CONTROL M32 auf dem vorderen Platinenstapel 1 des RP6 sitzt, muss die Zeile mit &amp;quot;EXP_STACK_1&amp;quot; &amp;quot;aktiviert&amp;quot; werden. Dazu entfernt man &amp;quot;//&amp;quot; am Zeilenanfang:&lt;br /&gt;
 #define EXP_STACK_1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Bevor man den Beschleunigungssensor nutzen kann, muss man ihn kalibrieren:&lt;br /&gt;
&lt;br /&gt;
'''Accelerometer:'''&lt;br /&gt;
* Die X-Achse wird kalibriert, indem man den RP6 mit der rechten Seite nach unten hält und den Maximalwert in MAX_X_A einträgt. Dann neigt man ihn auf seine linke Seite und trägt den negativen Maximalwert in MIN_X_A ein.&lt;br /&gt;
* Die Y-Achse wird kalibriert, indem man den RP6 mit der Vorderseite nach oben hält und den Maximalwert in MAX_Y_A einträgt. Dann kippt man die Vorderseite nach unten und trägt den negativen Maximalwert in MIN_Y_A ein.&lt;br /&gt;
* Die Z-Achse wird kalibriert, indem man den RP6 normal waagerecht hält und den Maximalwert in MAX_Z_A einträgt. Dann dreht man den RP6 &amp;quot;auf den Kopf&amp;quot; und trägt den negativen Maximalwert in MIN_Z_A ein.&lt;br /&gt;
* Sollten die angezeigten Pitch- und Roll-Werte nach der Kalibrierung der Achsen und genau waagerecht stehendem Sensor bzw. RP6 vom Nullwert deutlich abweichen, kann man sie mithilfe der Definitionen OFFSET_PITCH_A und OFFSET_ROLL_A &amp;quot;nullen&amp;quot;. Die Einheit dieser Definitionen ist °.&lt;br /&gt;
Nach dem Eintragen der Kalibrierungswerte muss das Programm neu kompiliert werden!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Datei: RP6ControlACCSENS.h&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;/* ****************************************************************************&lt;br /&gt;
 *                           _______________________&lt;br /&gt;
 *                           \| RP6  ROBOT SYSTEM |/&lt;br /&gt;
 *                            \_-_-_-_-_-_-_-_-_-_/             &amp;gt;&amp;gt;&amp;gt; RP6 CONTROL&lt;br /&gt;
 * ----------------------------------------------------------------------------&lt;br /&gt;
 * ----------------------------- [c]2014 - Dirk -------------------------------&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * File: RP6ControlACCSENS.h&lt;br /&gt;
 * Version: 1.0&lt;br /&gt;
 * Target: RP6 CONTROL - ATMEGA32 @16.00MHz&lt;br /&gt;
 * Author(s): Dirk&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Description:&lt;br /&gt;
 * Configuration header file for new ACCSENS library.&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * THE CHANGELOG CAN BE FOUND AT THE END OF THIS FILE!&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
#ifndef RP6CONTROLACCSENS_H&lt;br /&gt;
#define RP6CONTROLACCSENS_H&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Sensor position on the RP6 robot:&lt;br /&gt;
// (If EXP_STACK_1 is defined, the RP6 CONTROL M32 is located on the front&lt;br /&gt;
//  stack for addon boards on the RP6 robot. If EXP_STACK_1 is NOT defined&lt;br /&gt;
//  (default), the RP6 CONTROL M32 is mounted on the rear stack.)&lt;br /&gt;
// -------------------&lt;br /&gt;
//#define EXP_STACK_1&lt;br /&gt;
// -------------------&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// The following sensor is used:&lt;br /&gt;
// - 3D Accelerometer Modul (CONRAD 1082387-62) with LIS302DLH 3-axis&lt;br /&gt;
//   accelerometer&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// LIS302DLH accelerometer calibration data:&lt;br /&gt;
#define MAX_X_A						32767		// Max. X-axis value&lt;br /&gt;
#define MIN_X_A						-32768		// Min. X-axis value&lt;br /&gt;
#define MAX_Y_A						32767		// Max. Y-axis value&lt;br /&gt;
#define MIN_Y_A						-32768		// Min. Y-axis value&lt;br /&gt;
#define MAX_Z_A						32767		// Max. Z-axis value&lt;br /&gt;
#define MIN_Z_A						-32768		// Min. Z-axis value&lt;br /&gt;
#define OFFSET_PITCH_A				0.0			// Offset Pitch [°]&lt;br /&gt;
#define OFFSET_ROLL_A				0.0			// Offset Roll [°]&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
/******************************************************************************&lt;br /&gt;
 * Additional info&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Changelog:&lt;br /&gt;
 * &lt;br /&gt;
 *  ---&amp;gt; changes are documented in the file &amp;quot;RP6ControlACCSENSLib.c&amp;quot;&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
======Library Header======&lt;br /&gt;
Datei: RP6ControlACCSENSLib.h&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;/* ****************************************************************************&lt;br /&gt;
 *                           _______________________&lt;br /&gt;
 *                           \| RP6  ROBOT SYSTEM |/&lt;br /&gt;
 *                            \_-_-_-_-_-_-_-_-_-_/             &amp;gt;&amp;gt;&amp;gt; RP6 CONTROL&lt;br /&gt;
 * ----------------------------------------------------------------------------&lt;br /&gt;
 * ----------------------------- [c]2014 - Dirk -------------------------------&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * File: RP6ControlACCSENSLib.h&lt;br /&gt;
 * Version: 1.0&lt;br /&gt;
 * Target: RP6 CONTROL - ATMEGA32 @16.00MHz&lt;br /&gt;
 * Author(s): Dirk&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Description:&lt;br /&gt;
 * This is the RP6ControlACCSENSLib header file.&lt;br /&gt;
 * You have to include this file, if you want to use the library&lt;br /&gt;
 * RP6ControlACCSENSLib.c in your own projects.&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * THE CHANGELOG CAN BE FOUND AT THE END OF THIS FILE!&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
#ifndef RP6CONTROLACCSENSLIB_H&lt;br /&gt;
#define RP6CONTROLACCSENSLIB_H&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Includes:&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6ControlLib.h&amp;quot; 		// The RP6 Control Library (v. 1.1 or higher). &lt;br /&gt;
#include &amp;quot;RP6ControlACCSENS.h&amp;quot;&lt;br /&gt;
#include &amp;lt;math.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&lt;br /&gt;
#define ACC_CS							MEM_CS2&lt;br /&gt;
#define DEVICE_IDENTIFIER				0x32&lt;br /&gt;
&lt;br /&gt;
// Registers:&lt;br /&gt;
#define WHO_AM_I						0x0f&lt;br /&gt;
#define CTRL_REG1						0x20&lt;br /&gt;
#define CTRL_REG2						0x21&lt;br /&gt;
#define CTRL_REG3						0x22&lt;br /&gt;
#define CTRL_REG4						0x23&lt;br /&gt;
#define CTRL_REG5						0x24&lt;br /&gt;
#define HP_FILTER_RESET					0x25&lt;br /&gt;
#define REFERENCE						0x26&lt;br /&gt;
#define STATUS_REG						0x27&lt;br /&gt;
#define OUT_X_L							0x28&lt;br /&gt;
#define OUT_X_H							0x29&lt;br /&gt;
#define OUT_Y_L							0x2a&lt;br /&gt;
#define OUT_Y_H							0x2b&lt;br /&gt;
#define OUT_Z_L							0x2c&lt;br /&gt;
#define OUT_Z_H							0x2d&lt;br /&gt;
#define INT1_CFG						0x30&lt;br /&gt;
#define INT1_SOURCE						0x31&lt;br /&gt;
#define INT1_THS						0x32&lt;br /&gt;
#define INT1_DURATION					0x33&lt;br /&gt;
#define INT2_CFG						0x34&lt;br /&gt;
#define INT2_SOURCE						0x35&lt;br /&gt;
#define INT2_THS						0x36&lt;br /&gt;
#define INT2_DURATION					0x37&lt;br /&gt;
&lt;br /&gt;
// Control Register bitmasks:&lt;br /&gt;
#define CTRL_REG1_POWERDOWN				0b00000000&lt;br /&gt;
#define CTRL_REG1_3D_DEFAULT			0b00000111&lt;br /&gt;
#define CTRL_REG1_3D_LOPWR_10HZ			0b11000111&lt;br /&gt;
#define CTRL_REG2_DEFAULT				0b00000000&lt;br /&gt;
#define CTRL_REG3_DEFAULT				0b00000000&lt;br /&gt;
#define CTRL_REG4_DEFAULT				0b00000000&lt;br /&gt;
#define CTRL_REG4_BDU_2G				0b10000000&lt;br /&gt;
#define CTRL_REG4_BDU_2G_STSIGN			0b10001000&lt;br /&gt;
#define CTRL_REG4_BDU_BLE_2G			0b11000000&lt;br /&gt;
#define CTRL_REG4_BDU_BLE_2G_STSIGN		0b11001000&lt;br /&gt;
#define CTRL_REG5_DEFAULT				0b00000000&lt;br /&gt;
&lt;br /&gt;
// Read/write address bitmasks:&lt;br /&gt;
#define READ_MASK						0b10000000&lt;br /&gt;
#define READ_AUTOINC_MASK				0b11000000&lt;br /&gt;
#define WRITE_MASK						0b01111111&lt;br /&gt;
&lt;br /&gt;
extern int16_t x_axisa, y_axisa, z_axisa;&lt;br /&gt;
extern double pitch, roll;&lt;br /&gt;
extern double xa, ya, za;&lt;br /&gt;
extern double the, phi;&lt;br /&gt;
&lt;br /&gt;
uint8_t SPI_ACCSENS_readByte(uint8_t regAddr);&lt;br /&gt;
void SPI_ACCSENS_readBytes(uint8_t startAddr, uint8_t *buffer, uint8_t length);&lt;br /&gt;
void SPI_ACCSENS_writeByte(uint8_t regAddr, uint8_t data);&lt;br /&gt;
uint8_t SPI_ACCSENS_getStatus(void);&lt;br /&gt;
&lt;br /&gt;
void SPI_ACCSENS_init(void);&lt;br /&gt;
void SPI_ACCSENS_shutdown(void);&lt;br /&gt;
void SPI_ACCSENS_read(void);&lt;br /&gt;
void SPI_ACCSENS_normalize(void);&lt;br /&gt;
void SPI_ACCSENS_position(void);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
/******************************************************************************&lt;br /&gt;
 * Additional info&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Changelog:&lt;br /&gt;
 * &lt;br /&gt;
 *  ---&amp;gt; changes are documented in the file &amp;quot;RP6ControlACCSENSLib.c&amp;quot;&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
======Library Source======&lt;br /&gt;
Datei: RP6ControlACCSENSLib.c&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;/* ****************************************************************************&lt;br /&gt;
 *                           _______________________&lt;br /&gt;
 *                           \| RP6  ROBOT SYSTEM |/&lt;br /&gt;
 *                            \_-_-_-_-_-_-_-_-_-_/             &amp;gt;&amp;gt;&amp;gt; RP6 CONTROL&lt;br /&gt;
 * ----------------------------------------------------------------------------&lt;br /&gt;
 * ----------------------------- [c]2014 - Dirk -------------------------------&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * File: RP6ControlACCSENSLib.c&lt;br /&gt;
 * Version: 1.0&lt;br /&gt;
 * Target: RP6 CONTROL - ATMEGA32 @16.00MHz&lt;br /&gt;
 *         with optional LC-Display 16x2 chars (CONRAD 190911-62)&lt;br /&gt;
 *         and a 3D Accelerometer Modul (CONRAD 1082387-62) (IC5)&lt;br /&gt;
 * Author(s): Dirk&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Description:&lt;br /&gt;
 * This is my RP6 Control ACCSENS Library. This library may be used to access&lt;br /&gt;
 * the basic functions of the 3D Accelerometer Modul. This RP6 Xtra module may&lt;br /&gt;
 * be placed on the IC5 socket on the RP6 CONTROL M32 instead of a second&lt;br /&gt;
 * EEPROM.&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * THE CHANGELOG CAN BE FOUND AT THE END OF THIS FILE!&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
 &lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Includes:&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6ControlACCSENSLib.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// SPI functions:&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Reads a single register from the 3D Accelerometer&lt;br /&gt;
 * Modul (ACCSENS).&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
uint8_t SPI_ACCSENS_readByte(uint8_t regAddr)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t data;&lt;br /&gt;
	regAddr |= READ_MASK;						// Read byte&lt;br /&gt;
	PORTB &amp;amp;= ~ACC_CS;&lt;br /&gt;
	writeSPI(regAddr);&lt;br /&gt;
	data = readSPI();&lt;br /&gt;
	PORTB |= ACC_CS;&lt;br /&gt;
	return data;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Reads &amp;quot;length&amp;quot; bytes into the buffer &amp;quot;buffer&amp;quot;&lt;br /&gt;
 * from startAddr on. &lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void SPI_ACCSENS_readBytes(uint8_t startAddr, uint8_t *buffer, uint8_t length)&lt;br /&gt;
{&lt;br /&gt;
	startAddr |= READ_AUTOINC_MASK;				// Read byte, auto increment&lt;br /&gt;
	PORTB &amp;amp;= ~ACC_CS;&lt;br /&gt;
	writeSPI(startAddr);&lt;br /&gt;
	readBufferSPI(&amp;amp;buffer[0], length);&lt;br /&gt;
	PORTB |= ACC_CS;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Write a single data byte to the specified sensor&lt;br /&gt;
 * address.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void SPI_ACCSENS_writeByte(uint8_t regAddr, uint8_t data)&lt;br /&gt;
{&lt;br /&gt;
	PORTB &amp;amp;= ~ACC_CS;&lt;br /&gt;
	writeSPI(regAddr);&lt;br /&gt;
	writeSPI(data);&lt;br /&gt;
	PORTB |= ACC_CS;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Returns sensor status register - for checking if&lt;br /&gt;
 * sensor is busy. &lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
uint8_t SPI_ACCSENS_getStatus(void)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t status;&lt;br /&gt;
	PORTB &amp;amp;= ~ACC_CS;&lt;br /&gt;
	writeSPI(STATUS_REG);&lt;br /&gt;
	status = readSPI();&lt;br /&gt;
	PORTB |= ACC_CS;&lt;br /&gt;
	return status;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// 3D accelerometer functions:&lt;br /&gt;
&lt;br /&gt;
int16_t x_axisa, y_axisa, z_axisa;&lt;br /&gt;
double pitch, roll;&lt;br /&gt;
double xa, ya, za;&lt;br /&gt;
double the, phi;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Initializes the sensor. You must call this&lt;br /&gt;
 * function at the beginning of a program, that&lt;br /&gt;
 * uses the 3D Accelerometer Modul.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void SPI_ACCSENS_init(void)&lt;br /&gt;
{&lt;br /&gt;
	// All axes enable, low power, 10Hz output data rate:&lt;br /&gt;
	SPI_ACCSENS_writeByte(CTRL_REG1, CTRL_REG1_3D_LOPWR_10HZ);&lt;br /&gt;
	// No update while reading, +- 2g, self-test minus:&lt;br /&gt;
	SPI_ACCSENS_writeByte(CTRL_REG4, CTRL_REG4_BDU_2G_STSIGN);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Sets the LIS302DLH power-down mode. If you&lt;br /&gt;
 * do not need the sensor, you can save energy&lt;br /&gt;
 * by using the sensor power-down mode.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void SPI_ACCSENS_shutdown(void)&lt;br /&gt;
{&lt;br /&gt;
	// LIS302DLH in power-down mode:&lt;br /&gt;
	SPI_ACCSENS_writeByte(CTRL_REG1, CTRL_REG1_POWERDOWN);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function reads the X-axis, Y-axis and Z-axis&lt;br /&gt;
 * values from the LIS302DLH accelerometer and stores&lt;br /&gt;
 * them in the global variables x_axisa, y_axisa and&lt;br /&gt;
 * z_axisa.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void SPI_ACCSENS_read(void)&lt;br /&gt;
{&lt;br /&gt;
#ifndef EXP_STACK_1&lt;br /&gt;
	// Default sensor position (M32 located on the RP6 rear stack):&lt;br /&gt;
	// xb = -y:&lt;br /&gt;
	x_axisa = SPI_ACCSENS_readByte(OUT_Y_L) | (SPI_ACCSENS_readByte(OUT_Y_H) &amp;lt;&amp;lt; 8);&lt;br /&gt;
	x_axisa *= -1;&lt;br /&gt;
	// yb = -x:&lt;br /&gt;
	y_axisa = SPI_ACCSENS_readByte(OUT_X_L) | (SPI_ACCSENS_readByte(OUT_X_H) &amp;lt;&amp;lt; 8);&lt;br /&gt;
	y_axisa *= -1;&lt;br /&gt;
	// zb = z:&lt;br /&gt;
	z_axisa = SPI_ACCSENS_readByte(OUT_Z_L) | (SPI_ACCSENS_readByte(OUT_Z_H) &amp;lt;&amp;lt; 8);&lt;br /&gt;
#else&lt;br /&gt;
	// Other sensor position (M32 located on the RP6 front stack):&lt;br /&gt;
	// xb = y:&lt;br /&gt;
	x_axisa = SPI_ACCSENS_readByte(OUT_Y_L) | (SPI_ACCSENS_readByte(OUT_Y_H) &amp;lt;&amp;lt; 8);&lt;br /&gt;
	// yb = x:&lt;br /&gt;
	y_axisa = SPI_ACCSENS_readByte(OUT_X_L) | (SPI_ACCSENS_readByte(OUT_X_H) &amp;lt;&amp;lt; 8);&lt;br /&gt;
	// zb = z:&lt;br /&gt;
	z_axisa = SPI_ACCSENS_readByte(OUT_Z_L) | (SPI_ACCSENS_readByte(OUT_Z_H) &amp;lt;&amp;lt; 8);&lt;br /&gt;
#endif&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function limits and normalizes the x-axisa,&lt;br /&gt;
 * y-axisa and z-axisa values read from the LIS302DLH&lt;br /&gt;
 * accelerometer with the function SPI_ACCSENS_read() and&lt;br /&gt;
 * stores them in the global double variables xa, ya and&lt;br /&gt;
 * za.&lt;br /&gt;
 * It also calculates the position in space in form of the&lt;br /&gt;
 * tilt angles (the = pitch, phi = roll) and stores them&lt;br /&gt;
 * in the global double variables the and phi.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void SPI_ACCSENS_normalize(void)&lt;br /&gt;
{&lt;br /&gt;
	// Limit raw values:&lt;br /&gt;
	if (x_axisa &amp;lt; MIN_X_A) x_axisa = MIN_X_A;&lt;br /&gt;
	if (x_axisa &amp;gt; MAX_X_A) x_axisa = MAX_X_A;&lt;br /&gt;
	if (y_axisa &amp;lt; MIN_Y_A) y_axisa = MIN_Y_A;&lt;br /&gt;
	if (y_axisa &amp;gt; MAX_Y_A) y_axisa = MAX_Y_A;&lt;br /&gt;
	if (z_axisa &amp;lt; MIN_Z_A) z_axisa = MIN_Z_A;&lt;br /&gt;
	if (z_axisa &amp;gt; MAX_Z_A) z_axisa = MAX_Z_A;&lt;br /&gt;
	xa = (double) x_axisa / 10000.0;&lt;br /&gt;
	ya = (double) y_axisa / 10000.0;&lt;br /&gt;
	za = (double) z_axisa / 10000.0;&lt;br /&gt;
	// Calculate Pitch and Roll:&lt;br /&gt;
	phi = asin(xa);								// Calculate the and phi&lt;br /&gt;
	the = asin(ya / cos(the));					//  from the raw values&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function calculates the position in space by&lt;br /&gt;
 * using the the and phi values (see function&lt;br /&gt;
 * SPI_ACCSENS_normalize()!). It stores the position&lt;br /&gt;
 * in the global double variables pitch and roll. &lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void SPI_ACCSENS_position(void)&lt;br /&gt;
{&lt;br /&gt;
	pitch = the * 180 / M_PI + OFFSET_PITCH_A;&lt;br /&gt;
	roll = phi * 180 / M_PI + OFFSET_ROLL_A;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/******************************************************************************&lt;br /&gt;
 * Additional info&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Changelog:&lt;br /&gt;
 * - v. 1.0 (initial release) 04.04.2014 by Dirk&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Erklärung&lt;br /&gt;
&lt;br /&gt;
======Demo======&lt;br /&gt;
makefile:&lt;br /&gt;
&amp;lt;pre&amp;gt;...&lt;br /&gt;
TARGET = RP6Control_01_ACCSENS&lt;br /&gt;
...&lt;br /&gt;
SRC += $(RP6_LIB_PATH)/RP6control/RP6ControlLib.c&lt;br /&gt;
SRC += $(RP6_LIB_PATH)/RP6common/RP6uart.c&lt;br /&gt;
SRC += $(RP6_LIB_PATH)/RP6control/RP6ControlACCSENSLib.c&lt;br /&gt;
...&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Datei: RP6Control_01_ACCSENS.c&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;// Uncommented Version of RP6Control_01_ACCSENS.c&lt;br /&gt;
// written by Dirk&lt;br /&gt;
// ------------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6ControlACCSENSLib.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void writeDouble(double number, uint8_t width, uint8_t prec)&lt;br /&gt;
{char buffer[width + 1];&lt;br /&gt;
	dtostrf(number, width, prec, &amp;amp;buffer[0]);&lt;br /&gt;
	writeString(&amp;amp;buffer[0]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void writeDoubleLCD(double number, uint8_t width, uint8_t prec)&lt;br /&gt;
{char buffer[width + 1];&lt;br /&gt;
	dtostrf(number, width, prec, &amp;amp;buffer[0]);&lt;br /&gt;
	writeStringLCD(&amp;amp;buffer[0]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
	initRP6Control();&lt;br /&gt;
&lt;br /&gt;
	writeString_P(&amp;quot;\n\nRP6Control SPI ACCSENS Test Program!\n&amp;quot;); &lt;br /&gt;
	setLEDs(0b1111);&lt;br /&gt;
	mSleep(50);&lt;br /&gt;
	initLCD(); &lt;br /&gt;
	showScreenLCD(&amp;quot;################&amp;quot;, &amp;quot;################&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
	showScreenLCD(&amp;quot;  SPI ACCSENS&amp;quot;, &amp;quot;  Test Program&amp;quot;);&lt;br /&gt;
	mSleep(1000);&lt;br /&gt;
	setLEDs(0b0000);&lt;br /&gt;
&lt;br /&gt;
	SPI_ACCSENS_init();&lt;br /&gt;
&lt;br /&gt;
	uint8_t whoami = SPI_ACCSENS_readByte(WHO_AM_I);&lt;br /&gt;
	writeString_P(&amp;quot;\nWHO AM I: &amp;quot;);&lt;br /&gt;
	writeInteger(whoami, HEX);&lt;br /&gt;
	writeChar('\n');&lt;br /&gt;
	mSleep(2000);&lt;br /&gt;
	&lt;br /&gt;
	startStopwatch1();&lt;br /&gt;
&lt;br /&gt;
	while(true) &lt;br /&gt;
	{&lt;br /&gt;
		if(getStopwatch1() &amp;gt; 1000)&lt;br /&gt;
		{&lt;br /&gt;
			SPI_ACCSENS_read();&lt;br /&gt;
			writeString_P(&amp;quot;\n3D Accelerometer SENSOR -&amp;gt;\n&amp;quot;);&lt;br /&gt;
			writeString_P(&amp;quot;X-axis: &amp;quot;);&lt;br /&gt;
			writeInteger(x_axisa, DEC);&lt;br /&gt;
			writeChar('\n');&lt;br /&gt;
			writeString_P(&amp;quot;Y-axis: &amp;quot;);&lt;br /&gt;
			writeInteger(y_axisa, DEC);&lt;br /&gt;
			writeChar('\n');&lt;br /&gt;
			writeString_P(&amp;quot;Z-axis: &amp;quot;);&lt;br /&gt;
			writeInteger(z_axisa, DEC);&lt;br /&gt;
			writeChar('\n');&lt;br /&gt;
			SPI_ACCSENS_normalize();&lt;br /&gt;
			SPI_ACCSENS_position();&lt;br /&gt;
			writeString_P(&amp;quot;POSITION: \n&amp;quot;);&lt;br /&gt;
			writeString_P(&amp;quot;  Pitch [°]: &amp;quot;);&lt;br /&gt;
			writeDouble(pitch, 6, 1);&lt;br /&gt;
			writeChar('\n');&lt;br /&gt;
			writeString_P(&amp;quot;  Roll [°]:  &amp;quot;);&lt;br /&gt;
			writeDouble(roll, 6, 1);&lt;br /&gt;
			writeChar('\n');&lt;br /&gt;
			setCursorPosLCD(0, 0);&lt;br /&gt;
			writeStringLCD_P(&amp;quot;P&amp;quot;);&lt;br /&gt;
			writeDoubleLCD(pitch, 6, 1);&lt;br /&gt;
			writeStringLCD_P(&amp;quot; &amp;quot;);&lt;br /&gt;
			setCursorPosLCD(0, 8);&lt;br /&gt;
			writeStringLCD_P(&amp;quot;R&amp;quot;);&lt;br /&gt;
			writeDoubleLCD(roll, 6, 1);&lt;br /&gt;
			writeStringLCD_P(&amp;quot; &amp;quot;);&lt;br /&gt;
			setCursorPosLCD(1, 0);&lt;br /&gt;
			writeStringLCD_P(&amp;quot;X&amp;quot;);&lt;br /&gt;
			writeIntegerLCD(x_axisa, DEC);&lt;br /&gt;
			writeStringLCD_P(&amp;quot;   &amp;quot;);&lt;br /&gt;
			setCursorPosLCD(1, 5);&lt;br /&gt;
			writeStringLCD_P(&amp;quot;Y&amp;quot;);&lt;br /&gt;
			writeIntegerLCD(y_axisa, DEC);&lt;br /&gt;
			writeStringLCD_P(&amp;quot;   &amp;quot;);&lt;br /&gt;
			setCursorPosLCD(1, 10);&lt;br /&gt;
			writeStringLCD_P(&amp;quot;Z&amp;quot;);&lt;br /&gt;
			writeIntegerLCD(z_axisa, DEC);&lt;br /&gt;
			writeStringLCD_P(&amp;quot;    &amp;quot;);&lt;br /&gt;
			mSleep(2000);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Erklärung&lt;br /&gt;
&lt;br /&gt;
====BHT Modul JM3-BHT31====&lt;br /&gt;
Dieses Modul zur Messung von Luftdruck, Luftfeuchte und Temperatur ist seit dem 22.01.2015 lieferbar.&lt;br /&gt;
&lt;br /&gt;
=====Dokumentation=====&lt;br /&gt;
Die Dokumentation zum BHT Modul befindet sich auf der mitgelieferten ''&amp;quot;ASURO xTend-On CD-ROM&amp;quot;''.&lt;br /&gt;
&lt;br /&gt;
======Manuals======&lt;br /&gt;
Das Handbuch in der aktuellen Version kann [http://www.jm3-engineering.com/download/doc/ManualAsuroBHT_de.pdf hier] eingesehen werden.&lt;br /&gt;
&lt;br /&gt;
=====Demo-Programme=====&lt;br /&gt;
Ein Demo-Programm zum BHT Modul befindet sich integriert in die RP6 Sensor Board Demo auf der ''&amp;quot;RP6 Robot System Xtra Modules CD-ROM&amp;quot;''. Diese Demo kann auch in der aktuellen Version im Download Bereich von [http://www.jm3-engineering.com/downloads.htm JM3 Engineering] herunter geladen werden.&lt;br /&gt;
&lt;br /&gt;
=====RP6M256 WiFi: I2C_BHT Library=====&lt;br /&gt;
Die nachfolgende RP6M256_I2C_BHTLib (Eigenentwicklung in GCC) dient zur Ansteuerung des I2C BHT Moduls durch die RP6M256 WiFi.&lt;br /&gt;
&lt;br /&gt;
======Library Header======&lt;br /&gt;
Datei: RP6M256_I2C_BHTLib.h&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;/* ****************************************************************************&lt;br /&gt;
 *                           _______________________&lt;br /&gt;
 *                           \| RP6  ROBOT SYSTEM |/&lt;br /&gt;
 *                            \_-_-_-_-_-_-_-_-_-_/           &amp;gt;&amp;gt;&amp;gt; RP6 M256 WIFI&lt;br /&gt;
 * ----------------------------------------------------------------------------&lt;br /&gt;
 * ----------------------------- [c]2015 - Dirk -------------------------------&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * File: RP6M256_I2C_BHTLib.h&lt;br /&gt;
 * Version: 0.9&lt;br /&gt;
 * Target: RP6 M256 WIFI - ATMEGA2560 @16.00MHz&lt;br /&gt;
 * Author(s): Dirk&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Description:&lt;br /&gt;
 * Header file for new RP6 BHT Module library.&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
#ifndef RP6M256_I2C_BHTLIB_H&lt;br /&gt;
#define RP6M256_I2C_BHTLIB_H&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// RP6 BHT Module components:&lt;br /&gt;
// - I2C Barometric Pressure Sensor (MS5607-02BA)&lt;br /&gt;
// - I2C Relative Humidity Sensor (HTU21D)&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// RP6 Sensor Board:&lt;br /&gt;
&lt;br /&gt;
// If you want to use the RP6 BHT Module on the RP6 Sensor Board, you&lt;br /&gt;
// have to define SENSOR_BOARD (default)!&lt;br /&gt;
// If SENSOR_BOARD is NOT defined, this library assumes that the RP6 BHT&lt;br /&gt;
// Module is used stand-alone.&lt;br /&gt;
// ------------------&lt;br /&gt;
#define SENSOR_BOARD&lt;br /&gt;
// ------------------&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Includes:&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6M256Lib.h&amp;quot;&lt;br /&gt;
#include &amp;quot;RP6I2CmasterTWI.h&amp;quot;&lt;br /&gt;
#ifdef SENSOR_BOARD&lt;br /&gt;
	#include &amp;quot;RP6M256_Sensor_BoardLib.h&amp;quot;&lt;br /&gt;
#endif&lt;br /&gt;
#include &amp;lt;math.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Barometric Pressure Sensor (MS5607-02BA):&lt;br /&gt;
#define I2C_BHT_B_ADR					0xee	// Default&lt;br /&gt;
&lt;br /&gt;
// Weather station's data:&lt;br /&gt;
#define ALTITUDE			156			// Weather station's altitude [m]&lt;br /&gt;
//#define ALTITUDE			110			// 2nd altitude: Location 2 [m]&lt;br /&gt;
&lt;br /&gt;
// Temperature default data:&lt;br /&gt;
#define TEMP_ZERO			273.15		// 273.15 K = 0 °C&lt;br /&gt;
#define TA_DEFAULT			15.0		// Outside temp. default [°C]&lt;br /&gt;
#define TI_DEFAULT			21.0		// Inside temp. default [°C]&lt;br /&gt;
&lt;br /&gt;
// Commands:&lt;br /&gt;
#define MS5607_CMD_RESET				0x1e	// ADC reset command&lt;br /&gt;
#define MS5607_CMD_ADC_READ				0x00	// ADC read command&lt;br /&gt;
#define MS5607_CMD_ADC_CONV				0x40	// ADC conversion command&lt;br /&gt;
#define MS5607_CMD_ADC_D1				0x00	// ADC D1 conversion&lt;br /&gt;
#define MS5607_CMD_ADC_D2				0x10	// ADC D2 conversion&lt;br /&gt;
#define MS5607_CMD_ADC_256				0x00	// ADC OSR=256&lt;br /&gt;
#define MS5607_CMD_ADC_512				0x02	// ADC OSR=512&lt;br /&gt;
#define MS5607_CMD_ADC_1024				0x04	// ADC OSR=1024&lt;br /&gt;
#define MS5607_CMD_ADC_2048				0x06	// ADC OSR=2048&lt;br /&gt;
#define MS5607_CMD_ADC_4096				0x08	// ADC OSR=4096&lt;br /&gt;
#define MS5607_CMD_PROM_RD				0xa0	// Prom read command&lt;br /&gt;
&lt;br /&gt;
extern uint32_t D1;		// ADC value of the pressure conversion&lt;br /&gt;
extern uint32_t D2;		// ADC value of the temperature conversion&lt;br /&gt;
extern uint16_t C[8];	// calibration coefficients&lt;br /&gt;
extern double P;		// compensated pressure value&lt;br /&gt;
extern double P0;		// compensated pressure value at sea level (0 m)&lt;br /&gt;
extern double T;		// compensated temperature value&lt;br /&gt;
extern double dT;		// difference between actual and measured temperature&lt;br /&gt;
extern double OFF;		// offset at actual temperature&lt;br /&gt;
extern double SENS;		// sensitivity at actual temperature&lt;br /&gt;
extern uint8_t n_crc;	// crc value of the prom&lt;br /&gt;
&lt;br /&gt;
void I2C_BHT_B_reset(void);&lt;br /&gt;
uint32_t I2C_BHT_B_cmd_adc(uint8_t cmd);&lt;br /&gt;
uint16_t I2C_BHT_B_cmd_prom(uint8_t coef_num);&lt;br /&gt;
uint8_t I2C_BHT_B_crc4(uint16_t n_prom[]);&lt;br /&gt;
void I2C_BHT_B_read(void);&lt;br /&gt;
void I2C_BHT_B_init(void);&lt;br /&gt;
double reduceAirPressure(double pa, double ta);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Relative Humidity Sensor (HTU21D):&lt;br /&gt;
#define I2C_BHT_HT_ADR					0x80	// Default&lt;br /&gt;
&lt;br /&gt;
// Commands:&lt;br /&gt;
#define HTU21D_TRIG_T_MEASUREMENT_HM    0xe3	// Trig. temp meas. hold master&lt;br /&gt;
#define HTU21D_TRIG_RH_MEASUREMENT_HM   0xe5	// Trig. humidity meas. hold master&lt;br /&gt;
#define HTU21D_TRIG_T_MEASUREMENT_POLL  0xf3	// Trig. temp meas. no hold master&lt;br /&gt;
#define HTU21D_TRIG_RH_MEASUREMENT_POLL 0xf5	// Trig. humidity meas. no hold master&lt;br /&gt;
#define HTU21D_USER_REG_W               0xe6	// Writing user register&lt;br /&gt;
#define HTU21D_USER_REG_R               0xe7	// Reading user register&lt;br /&gt;
#define HTU21D_SOFT_RESET               0xfe	// Soft reset&lt;br /&gt;
&lt;br /&gt;
// Resolutions:&lt;br /&gt;
#define HTU21D_RES_12_14BIT             0x00	// RH=12bit, T=14bit&lt;br /&gt;
#define HTU21D_RES_8_12BIT              0x01	// RH= 8bit, T=12bit&lt;br /&gt;
#define HTU21D_RES_10_13BIT             0x80	// RH=10bit, T=13bit&lt;br /&gt;
#define HTU21D_RES_11_11BIT             0x81	// RH=11bit, T=11bit&lt;br /&gt;
&lt;br /&gt;
// User register bitmasks:&lt;br /&gt;
#define HTU21D_RES_MASK                 0x81	// Mask for res. bits (7, 0)&lt;br /&gt;
#define HTU21D_EOB_ON                   0x40	// End of battery&lt;br /&gt;
#define HTU21D_EOB_MASK                 0x40	// Mask for EOB bit(6)&lt;br /&gt;
#define HTU21D_HEATER_ON                0x04	// Heater on&lt;br /&gt;
#define HTU21D_HEATER_OFF               0x00	// Heater off&lt;br /&gt;
#define HTU21D_HEATER_MASK              0x04	// Mask for Heater bit (2)&lt;br /&gt;
&lt;br /&gt;
extern uint16_t rawHumidity;	// raw humidity value&lt;br /&gt;
extern uint16_t rawTemperature;	// raw temperature value&lt;br /&gt;
extern double H;				// relative humidity value [%]&lt;br /&gt;
extern double HT;				// temperature value [°C]&lt;br /&gt;
extern uint8_t resolution;		// sensor resolution [0..3]&lt;br /&gt;
extern uint8_t ht_crc;			// message crc value&lt;br /&gt;
&lt;br /&gt;
void I2C_BHT_HT_reset(void);&lt;br /&gt;
uint8_t I2C_BHT_HT_crc8(uint16_t message, uint8_t checksum);&lt;br /&gt;
double I2C_BHT_HT_readHumidity(void);&lt;br /&gt;
double I2C_BHT_HT_readTemperature(void);&lt;br /&gt;
void I2C_BHT_HT_setResolution(uint8_t resBits);&lt;br /&gt;
void I2C_BHT_HT_init(void);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// RP6 BHT Module initialisation:&lt;br /&gt;
&lt;br /&gt;
void I2C_BHT_init(void);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
/******************************************************************************&lt;br /&gt;
 * Additional info&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Changelog:&lt;br /&gt;
 * &lt;br /&gt;
 *  ---&amp;gt; changes are documented in the file &amp;quot;RP6M256_I2C_BHTLib.c&amp;quot;&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
======Library Source======&lt;br /&gt;
Datei: RP6M256_I2C_BHTLib.c&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;/* ****************************************************************************&lt;br /&gt;
 *                           _______________________&lt;br /&gt;
 *                           \| RP6  ROBOT SYSTEM |/&lt;br /&gt;
 *                            \_-_-_-_-_-_-_-_-_-_/           &amp;gt;&amp;gt;&amp;gt; RP6 M256 WIFI&lt;br /&gt;
 * ----------------------------------------------------------------------------&lt;br /&gt;
 * ----------------------------- [c]2015 - Dirk -------------------------------&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * File: RP6M256_I2C_BHTLib.c&lt;br /&gt;
 * Version: 0.9&lt;br /&gt;
 * Target: RP6 M256 WIFI - ATMEGA2560 @16.00MHz&lt;br /&gt;
 *         and a RP6 BHT Module (CONRAD 1302995)&lt;br /&gt;
 *         optionally on a RP6 Sensor Board (CONRAD 1082384)&lt;br /&gt;
 * Author(s): Dirk&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Description:&lt;br /&gt;
 * &lt;br /&gt;
 * This is our new Library that contains basic routines and functions for&lt;br /&gt;
 * accessing the RP6 BHT Module JM3-BHT31 (CONRAD 1302995).&lt;br /&gt;
 * If the RP6 BHT Module is located on the RP6 Sensor Board (CONRAD 1082384)&lt;br /&gt;
 * and connected to the I2C-MODULE plug M1, the RP6M256_Sensor_BoardLib has to&lt;br /&gt;
 * be included!&lt;br /&gt;
 * &lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// RP6 BHT Module components:&lt;br /&gt;
// - I2C Barometric Pressure Sensor (MS5607-02BA)&lt;br /&gt;
// - I2C Relative Humidity Sensor (HTU21D)&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Includes:&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6M256_I2C_BHTLib.h&amp;quot; 		&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Variables:&lt;br /&gt;
&lt;br /&gt;
uint8_t bhtdataBuf[4]; &lt;br /&gt;
uint8_t i;&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Barometric Pressure Sensor (MS5607-02BA):&lt;br /&gt;
// (Following the C-code example published 2011 by MEAS in AN520!)&lt;br /&gt;
&lt;br /&gt;
uint32_t D1;			// ADC value of the pressure conversion&lt;br /&gt;
uint32_t D2;			// ADC value of the temperature conversion&lt;br /&gt;
uint16_t C[8];			// calibration coefficients&lt;br /&gt;
double P;				// compensated pressure value&lt;br /&gt;
double P0;				// compensated pressure value at sea level (0 m)&lt;br /&gt;
double T;				// compensated temperature value&lt;br /&gt;
double dT;				// difference between actual and measured temperature&lt;br /&gt;
double OFF;				// offset at actual temperature&lt;br /&gt;
double SENS;			// sensitivity at actual temperature&lt;br /&gt;
uint8_t n_crc;			// crc value of the prom&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Reset sequence for the Pressure Sensor.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void I2C_BHT_B_reset(void)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmitByte(I2C_BHT_B_ADR, MS5607_CMD_RESET);&lt;br /&gt;
	mSleep(3);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Reads and returns pressure or temperature ADC&lt;br /&gt;
 * values measured with the chosen resolution.&lt;br /&gt;
 * This function is BLOCKING during the conversion&lt;br /&gt;
 * time (up to 10 ms).&lt;br /&gt;
 *&lt;br /&gt;
 * Input: cmd -&amp;gt; MS5607_CMD_ADC_D1   = Read pressure ADC value&lt;br /&gt;
 *               MS5607_CMD_ADC_D2   = Read temperature ADC value&lt;br /&gt;
 *               ... plus ...&lt;br /&gt;
 *               MS5607_CMD_ADC_256  = Resolution 0.130 hPa / 0.012 °C&lt;br /&gt;
 *               MS5607_CMD_ADC_512  = Resolution 0.084 hPa / 0.008 °C&lt;br /&gt;
 *               MS5607_CMD_ADC_1024 = Resolution 0.054 hPa / 0.005 °C&lt;br /&gt;
 *               MS5607_CMD_ADC_2048 = Resolution 0.036 hPa / 0.003 °C&lt;br /&gt;
 *               MS5607_CMD_ADC_4096 = Resolution 0.024 hPa / 0.002 °C&lt;br /&gt;
 *&lt;br /&gt;
 * Examples:&lt;br /&gt;
 *   D1 = I2C_BHT_B_cmd_adc(MS5607_CMD_ADC_D1 + MS5607_CMD_ADC_4096);&lt;br /&gt;
 *   // This returns the pressure ADC value (D1) with a 0.024 hPa&lt;br /&gt;
 *   // resolution!&lt;br /&gt;
 *   D2 = I2C_BHT_B_cmd_adc(MS5607_CMD_ADC_D2 + MS5607_CMD_ADC_4096);&lt;br /&gt;
 *   // This returns the temperature ADC value (D2) with a 0.002 °C&lt;br /&gt;
 *   // resolution!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
uint32_t I2C_BHT_B_cmd_adc(uint8_t cmd)&lt;br /&gt;
{&lt;br /&gt;
	uint32_t temp = 0;&lt;br /&gt;
&lt;br /&gt;
	I2CTWI_transmitByte(I2C_BHT_B_ADR, (MS5607_CMD_ADC_CONV + cmd));&lt;br /&gt;
	switch (cmd &amp;amp; 0x0f) {&lt;br /&gt;
		case MS5607_CMD_ADC_256  : mSleep(1); break;&lt;br /&gt;
		case MS5607_CMD_ADC_512  : mSleep(2); break;&lt;br /&gt;
		case MS5607_CMD_ADC_1024 : mSleep(3); break;&lt;br /&gt;
		case MS5607_CMD_ADC_2048 : mSleep(5); break;&lt;br /&gt;
		case MS5607_CMD_ADC_4096 : mSleep(10);&lt;br /&gt;
	}&lt;br /&gt;
	I2CTWI_transmitByte(I2C_BHT_B_ADR, MS5607_CMD_ADC_READ);&lt;br /&gt;
	I2CTWI_readBytes(I2C_BHT_B_ADR, bhtdataBuf, 3);&lt;br /&gt;
	temp = bhtdataBuf[0];						// MSB&lt;br /&gt;
	temp &amp;lt;&amp;lt;= 8;&lt;br /&gt;
	temp |= bhtdataBuf[1];&lt;br /&gt;
	temp &amp;lt;&amp;lt;= 8;&lt;br /&gt;
	temp |= bhtdataBuf[2];						// LSB&lt;br /&gt;
	return temp;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Reads and returns the calibration coefficient&lt;br /&gt;
 * (16 bit) with the number coef_num from the&lt;br /&gt;
 * Pressure Sensor's PROM.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: coef_num -&amp;gt; Calibration coefficient&lt;br /&gt;
 *                    number [0..7]&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
uint16_t I2C_BHT_B_cmd_prom(uint8_t coef_num)&lt;br /&gt;
{&lt;br /&gt;
	uint16_t rC = 0;&lt;br /&gt;
&lt;br /&gt;
	I2CTWI_transmitByte(I2C_BHT_B_ADR, (MS5607_CMD_PROM_RD + coef_num * 2));&lt;br /&gt;
	I2CTWI_readBytes(I2C_BHT_B_ADR, bhtdataBuf, 2);&lt;br /&gt;
	rC = bhtdataBuf[0];							// MSB&lt;br /&gt;
	rC &amp;lt;&amp;lt;= 8;&lt;br /&gt;
	rC |= bhtdataBuf[1];						// LSB&lt;br /&gt;
	return rC;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Calculates and returns the Pressure Sensor's&lt;br /&gt;
 * PROM CRC-4 value (8 bit).&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
uint8_t I2C_BHT_B_crc4(uint16_t n_prom[])&lt;br /&gt;
{&lt;br /&gt;
	uint16_t n_rem;&lt;br /&gt;
	uint16_t crc_read;&lt;br /&gt;
	uint8_t n_bit;&lt;br /&gt;
&lt;br /&gt;
	n_rem = 0x00;&lt;br /&gt;
	crc_read = n_prom[7];&lt;br /&gt;
	n_prom[7] = (0xff00 &amp;amp; (n_prom[7]));&lt;br /&gt;
	for (i = 0; i &amp;lt; 16; i++)&lt;br /&gt;
	{&lt;br /&gt;
		if (i % 2 == 1) n_rem ^= (uint8_t) ((n_prom[i &amp;gt;&amp;gt; 1]) &amp;amp; 0x00ff);&lt;br /&gt;
		else n_rem ^= (uint8_t) (n_prom[i &amp;gt;&amp;gt; 1] &amp;gt;&amp;gt; 8);&lt;br /&gt;
		for (n_bit = 8; n_bit &amp;gt; 0; n_bit--)&lt;br /&gt;
		{&lt;br /&gt;
			if (n_rem &amp;amp; 0x8000) n_rem = (n_rem &amp;lt;&amp;lt; 1) ^ 0x3000;&lt;br /&gt;
			else n_rem = n_rem &amp;lt;&amp;lt; 1;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	n_rem = (0x000f &amp;amp; (n_rem &amp;gt;&amp;gt; 12));&lt;br /&gt;
	n_prom[7] = crc_read;&lt;br /&gt;
	return (n_rem ^ 0x0);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Reads and calculates the pressure and&lt;br /&gt;
 * temperature values with the MS5607 1st order&lt;br /&gt;
 * algorithm.&lt;br /&gt;
 * The 2 values are stored in the global floating&lt;br /&gt;
 * point variables P and T:&lt;br /&gt;
 *   P -&amp;gt; Pressure value [hPa]&lt;br /&gt;
 *   T -&amp;gt; Temperature value [°C]&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void I2C_BHT_B_read(void)&lt;br /&gt;
{&lt;br /&gt;
	D2 = I2C_BHT_B_cmd_adc(MS5607_CMD_ADC_D2 + MS5607_CMD_ADC_4096); // Read D2&lt;br /&gt;
	D1 = I2C_BHT_B_cmd_adc(MS5607_CMD_ADC_D1 + MS5607_CMD_ADC_4096); // Read D1&lt;br /&gt;
&lt;br /&gt;
	// Calculate 1st order pressure and temperature (MS5607 1st order algorithm)&lt;br /&gt;
	dT = D2 - C[5] * pow(2, 8);&lt;br /&gt;
	OFF = C[2] * pow(2, 17) + dT * C[4] / pow(2, 6);&lt;br /&gt;
	SENS = C[1] * pow(2, 16) + dT * C[3] / pow(2, 7);&lt;br /&gt;
&lt;br /&gt;
	T = (2000 + (dT * C[6]) / pow(2, 23)) / 100;&lt;br /&gt;
	P = (((D1 * SENS) / pow(2, 21) - OFF) / pow(2, 15)) / 100;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * You MUST call this function at the beginning of a&lt;br /&gt;
 * main program, that uses the Pressure Sensor. &lt;br /&gt;
 * If SENSOR_BOARD is defined, the I2C-MODULE power&lt;br /&gt;
 * will be switched on with the function&lt;br /&gt;
 * setI2CModulePower() defined in the&lt;br /&gt;
 * RP6M256_Sensor_BoardLib, which will be included&lt;br /&gt;
 * then.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void I2C_BHT_B_init(void)&lt;br /&gt;
{&lt;br /&gt;
#ifdef SENSOR_BOARD&lt;br /&gt;
	// I2C-MODULE (plug M1) power on: &lt;br /&gt;
	setI2CModulePower(1);&lt;br /&gt;
#endif&lt;br /&gt;
	D1 = 0;										// Clear pressure ADC value&lt;br /&gt;
	D2 = 0;										// Clear temperature ADC value&lt;br /&gt;
	I2C_BHT_B_reset();							// Reset the Pressure Sensor&lt;br /&gt;
	for (i = 0; i &amp;lt; 8; i++) {C[i] = I2C_BHT_B_cmd_prom(i);} // Read PROM&lt;br /&gt;
	n_crc = I2C_BHT_B_crc4(C);					// Calculate PROM CRC&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Calculates and returns the relative air pressure&lt;br /&gt;
 * [hPa] at sea level (0 m).&lt;br /&gt;
 *&lt;br /&gt;
 * Input:  pa        -&amp;gt; Absolute air pressure [hPa] at ALTITUDE&lt;br /&gt;
 *         ta        -&amp;gt; OUTSIDE temperature [°C] at ALTITUDE&lt;br /&gt;
 *         ALTITUDE  -&amp;gt; Weather station's altitude [m]&lt;br /&gt;
 *         TEMP_ZERO -&amp;gt; 273.15 K&lt;br /&gt;
 * Output: p0        -&amp;gt; Relative air pressure [hPa] at sea level (0 m)&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
double reduceAirPressure(double pa, double ta)&lt;br /&gt;
{double p0;&lt;br /&gt;
	p0 = pa * (pow ((TEMP_ZERO + ta) / (TEMP_ZERO + ta + 0.0065 * ALTITUDE), -5.255));&lt;br /&gt;
	return p0;									// P0 [hPa]&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Relative Humidity Sensor (HTU21D):&lt;br /&gt;
// (Following a library published 2011 by MEAS France!)&lt;br /&gt;
&lt;br /&gt;
uint16_t rawHumidity;		// raw humidity value&lt;br /&gt;
uint16_t rawTemperature;	// raw temperature value&lt;br /&gt;
double H;					// relative humidity value [%]&lt;br /&gt;
double HT;					// temperature value [°C]&lt;br /&gt;
uint8_t resolution;			// sensor resolution [0..3]&lt;br /&gt;
uint8_t ht_crc;				// message crc value&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Soft reset for the Humidity Sensor.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void I2C_BHT_HT_reset(void)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmitByte(I2C_BHT_HT_ADR, HTU21D_SOFT_RESET);&lt;br /&gt;
	mSleep(15);&lt;br /&gt;
	resolution = 0;								// Default: RH 12, T 14 bit&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Reads the Humidity Sensor's user register.&lt;br /&gt;
 *&lt;br /&gt;
 * Hint: The user register bits are described on&lt;br /&gt;
 *       page 13 of the HTU21D datasheet!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
uint8_t read_user_register(void)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t userRegister;&lt;br /&gt;
  &lt;br /&gt;
	I2CTWI_transmitByte(I2C_BHT_HT_ADR, HTU21D_USER_REG_R);&lt;br /&gt;
	userRegister = I2CTWI_readByte(I2C_BHT_HT_ADR);&lt;br /&gt;
	return userRegister;  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Sets the Humidity Sensor's resolution to one&lt;br /&gt;
 * of four steps. The step number [0..3] is stored&lt;br /&gt;
 * in the global variable resolution:&lt;br /&gt;
 *   Step  RH   T&lt;br /&gt;
 *    0:   12  14 bit&lt;br /&gt;
 *    1:    8  12 bit&lt;br /&gt;
 *    2:   10  13 bit&lt;br /&gt;
 *    3:   11  11 bit&lt;br /&gt;
 *                                      RH   T&lt;br /&gt;
 * Input:  resBits -&amp;gt; 0b00000000   (0): 12  14 bit&lt;br /&gt;
 *                 -&amp;gt; 0b00000001   (1):  8  12 bit&lt;br /&gt;
 *                 -&amp;gt; 0b10000000 (128): 10  13 bit&lt;br /&gt;
 *                 -&amp;gt; 0b10000001 (129): 11  11 bit&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void I2C_BHT_HT_setResolution(uint8_t resBits)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t userRegister;&lt;br /&gt;
&lt;br /&gt;
	userRegister = read_user_register();&lt;br /&gt;
	userRegister &amp;amp;= 0b01111110;&lt;br /&gt;
	resBits &amp;amp;= 0b10000001;&lt;br /&gt;
	resolution = (resBits &amp;gt;&amp;gt; 6) | (resBits &amp;amp; 1); // Step 0..3&lt;br /&gt;
	userRegister |= resBits;&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_BHT_HT_ADR, HTU21D_USER_REG_W, userRegister);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#define SHIFTED_DIVISOR                 0x988000&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Calculates the Humidity Sensor's message CRC-8&lt;br /&gt;
 * value (8 bit) and returns 0 (false), if the&lt;br /&gt;
 * message transmission is good.&lt;br /&gt;
 *&lt;br /&gt;
 * Input:  message         -&amp;gt; Message from&lt;br /&gt;
 *                            Humidity Sensor&lt;br /&gt;
 *         checksum        -&amp;gt; Checksum from&lt;br /&gt;
 *                            Humidity Sensor&lt;br /&gt;
 *         SHIFTED_DIVISOR -&amp;gt; 0x0131 polynomial&lt;br /&gt;
 *                            shifted to farthest&lt;br /&gt;
 *                            left of three bytes&lt;br /&gt;
 * Output: remainder       -&amp;gt; 0  = Transmission good&lt;br /&gt;
 *                         -&amp;gt; &amp;gt;0 = Transm. corrupted&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
uint8_t I2C_BHT_HT_crc8(uint16_t message, uint8_t checksum)&lt;br /&gt;
{&lt;br /&gt;
	uint32_t remainder, divisor;&lt;br /&gt;
&lt;br /&gt;
	remainder = (uint32_t) message &amp;lt;&amp;lt; 8;&lt;br /&gt;
	remainder |= checksum;&lt;br /&gt;
	divisor = (uint32_t) SHIFTED_DIVISOR;&lt;br /&gt;
	for (i = 0; i &amp;lt; 16; i++)&lt;br /&gt;
	{&lt;br /&gt;
		if (remainder &amp;amp; (uint32_t) 1 &amp;lt;&amp;lt; (23 - i))&lt;br /&gt;
			remainder ^= divisor;&lt;br /&gt;
		divisor &amp;gt;&amp;gt;= 1;&lt;br /&gt;
	}&lt;br /&gt;
	return (uint8_t) remainder;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Calculates and returns the humidity value.&lt;br /&gt;
 * This function is BLOCKING during the conversion&lt;br /&gt;
 * time (up to 17 ms depending on resolution).&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
double I2C_BHT_HT_readHumidity(void)&lt;br /&gt;
{&lt;br /&gt;
	uint32_t temp = 0;&lt;br /&gt;
&lt;br /&gt;
	I2CTWI_transmitByte(I2C_BHT_HT_ADR, HTU21D_TRIG_RH_MEASUREMENT_POLL);&lt;br /&gt;
	switch (resolution) {&lt;br /&gt;
		case 1 : mSleep(4); break;				// RH 8 bit&lt;br /&gt;
		case 2 : mSleep(6); break;				// RH 10 bit&lt;br /&gt;
		case 3 : mSleep(9); break;				// RH 11 bit&lt;br /&gt;
		case 0 : mSleep(17);					// RH 12 bit&lt;br /&gt;
	}&lt;br /&gt;
	I2CTWI_readBytes(I2C_BHT_HT_ADR, bhtdataBuf, 3);&lt;br /&gt;
	temp = bhtdataBuf[0];						// MSB&lt;br /&gt;
	temp &amp;lt;&amp;lt;= 8;&lt;br /&gt;
	temp |= bhtdataBuf[1];						// LSB&lt;br /&gt;
	temp &amp;lt;&amp;lt;= 8;&lt;br /&gt;
	temp |= bhtdataBuf[2];						// Checksum&lt;br /&gt;
	rawHumidity = temp &amp;gt;&amp;gt; 8;&lt;br /&gt;
	ht_crc = (uint8_t) temp;&lt;br /&gt;
	rawHumidity &amp;amp;= 0xfffc;&lt;br /&gt;
	double tempRH = rawHumidity / (double) 65536;&lt;br /&gt;
	double rh = -6 + (125 * tempRH);&lt;br /&gt;
	return rh;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Calculates and returns the temperature value.&lt;br /&gt;
 * This function is BLOCKING during the conversion&lt;br /&gt;
 * time (up to 51 ms depending on resolution).&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
double I2C_BHT_HT_readTemperature(void)&lt;br /&gt;
{&lt;br /&gt;
	uint32_t temp = 0;&lt;br /&gt;
&lt;br /&gt;
	I2CTWI_transmitByte(I2C_BHT_HT_ADR, HTU21D_TRIG_T_MEASUREMENT_POLL);&lt;br /&gt;
	switch (resolution) {&lt;br /&gt;
		case 3 : mSleep(8); break;				// T 11 bit&lt;br /&gt;
		case 1 : mSleep(14); break;				// T 12 bit&lt;br /&gt;
		case 2 : mSleep(26); break;				// T 13 bit&lt;br /&gt;
		case 0 : mSleep(51);					// T 14 bit&lt;br /&gt;
	}&lt;br /&gt;
	I2CTWI_readBytes(I2C_BHT_HT_ADR, bhtdataBuf, 3);&lt;br /&gt;
	temp = bhtdataBuf[0];						// MSB&lt;br /&gt;
	temp &amp;lt;&amp;lt;= 8;&lt;br /&gt;
	temp |= bhtdataBuf[1];						// LSB&lt;br /&gt;
	temp &amp;lt;&amp;lt;= 8;&lt;br /&gt;
	temp |= bhtdataBuf[2];						// Checksum&lt;br /&gt;
	rawTemperature = temp &amp;gt;&amp;gt; 8;&lt;br /&gt;
	ht_crc = (uint8_t) temp;&lt;br /&gt;
	rawTemperature &amp;amp;= 0xfffc;&lt;br /&gt;
	double tempTemperature = rawTemperature / (double) 65536;&lt;br /&gt;
	double realTemperature = -46.85 + (175.72 * tempTemperature);&lt;br /&gt;
	return realTemperature;  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * You MUST call this function at the beginning of a&lt;br /&gt;
 * main program, that uses the Humidity Sensor. &lt;br /&gt;
 * If SENSOR_BOARD is defined, the I2C-MODULE power&lt;br /&gt;
 * will be switched on with the function&lt;br /&gt;
 * setI2CModulePower() defined in the&lt;br /&gt;
 * RP6M256_Sensor_BoardLib, which will be included&lt;br /&gt;
 * then.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void I2C_BHT_HT_init(void)&lt;br /&gt;
{&lt;br /&gt;
#ifdef SENSOR_BOARD&lt;br /&gt;
	// I2C-MODULE (plug M1) power on: &lt;br /&gt;
	setI2CModulePower(1);&lt;br /&gt;
#endif&lt;br /&gt;
	I2C_BHT_HT_reset();							// Reset the Humidity Sensor&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// RP6 BHT Module initialisation:&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * You MUST call this function at the beginning of a&lt;br /&gt;
 * main program, that uses the RP6 BHT Module. &lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void I2C_BHT_init(void)&lt;br /&gt;
{&lt;br /&gt;
	// I2C Barometric Pressure Sensor:&lt;br /&gt;
	I2C_BHT_B_init();&lt;br /&gt;
	// I2C Relative Humidity Sensor:&lt;br /&gt;
	I2C_BHT_HT_init();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&lt;br /&gt;
/******************************************************************************&lt;br /&gt;
 * Additional info&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Changelog:&lt;br /&gt;
 * - v. 0.9 (initial release) 20.03.2015 by Dirk&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
======Demo======&lt;br /&gt;
makefile:&lt;br /&gt;
&amp;lt;pre&amp;gt;...&lt;br /&gt;
TARGET = RP6M256_Sensor_Board_03&lt;br /&gt;
...&lt;br /&gt;
SRC += $(RP6_LIB_PATH)/RP6common/RP6I2CmasterTWI.c&lt;br /&gt;
&lt;br /&gt;
SRC += $(RP6_LIB_PATH)/RP6control_M256_WIFI/RP6M256_Sensor_BoardLib.c&lt;br /&gt;
SRC += $(RP6_LIB_PATH)/RP6control_M256_WIFI/RP6M256_I2C_BHTLib.c&lt;br /&gt;
...&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Datei: RP6M256_Sensor_Board_03.c&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;/* &lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * RP6 ROBOT SYSTEM - RP6 CONTROL M256 Examples&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Example: RP6M256 Sensor Board&lt;br /&gt;
 * Author(s): Dirk&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Description:&lt;br /&gt;
 * In this example we show a third test for the RP6 Sensor Board.&lt;br /&gt;
 * &lt;br /&gt;
 * ############################################################################&lt;br /&gt;
 * The Robot does NOT move in this example! You can simply put it on a table&lt;br /&gt;
 * next to your PC and you should connect it to the PC via the USB Interface!&lt;br /&gt;
 * You should also connect to it via WIFI.&lt;br /&gt;
 * ############################################################################&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Includes:&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6M256Lib.h&amp;quot; 				// The RP6 M256 Library. &lt;br /&gt;
										// Always needs to be included!&lt;br /&gt;
#include &amp;quot;RP6I2CmasterTWI.h&amp;quot;			// Include the I2C-Bus Master Library&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Include our new &amp;quot;RP6M256 I2C BHT Module library&amp;quot;:&lt;br /&gt;
// (This is the library for accessing the RP6 BHT Module!)&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6M256_I2C_BHTLib.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Write a floating point number to the WIFI.&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *&lt;br /&gt;
 *			// Write a floating point number to the WIFI (no exponent):&lt;br /&gt;
 *			writeDouble_WIFI(1234567.890, 11, 3);&lt;br /&gt;
 *&lt;br /&gt;
 * The value of prec (precision) defines the number of decimal places.&lt;br /&gt;
 * For 32 bit floating point variables (float, double ...) 6 is&lt;br /&gt;
 * the max. value for prec (7 relevant digits).&lt;br /&gt;
 * The value of width defines the overall number of characters in the&lt;br /&gt;
 * floating point number including the decimal point. The number of&lt;br /&gt;
 * pre-decimal positions is: (width - prec - 1).&lt;br /&gt;
 */&lt;br /&gt;
void writeDouble_WIFI(double number, uint8_t width, uint8_t prec)&lt;br /&gt;
{char buffer[width + 1];&lt;br /&gt;
	dtostrf(number, width, prec, &amp;amp;buffer[0]);&lt;br /&gt;
	writeString_WIFI(&amp;amp;buffer[0]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Write a floating point number to the LCD.&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *&lt;br /&gt;
 *			// Write a floating point number to the LCD (no exponent):&lt;br /&gt;
 *			writeDoubleLCD(1234567.890, 11, 3);&lt;br /&gt;
 *&lt;br /&gt;
 * The value of prec (precision) defines the number of decimal places.&lt;br /&gt;
 * For 32 bit floating point variables (float, double ...) 6 is&lt;br /&gt;
 * the max. value for prec (7 relevant digits).&lt;br /&gt;
 * The value of width defines the overall number of characters in the&lt;br /&gt;
 * floating point number including the decimal point. The number of&lt;br /&gt;
 * pre-decimal positions is: (width - prec - 1).&lt;br /&gt;
 */&lt;br /&gt;
void writeDoubleLCD(double number, uint8_t width, uint8_t prec)&lt;br /&gt;
{char buffer[width + 1];&lt;br /&gt;
	dtostrf(number, width, prec, &amp;amp;buffer[0]);&lt;br /&gt;
	writeStringLCD(&amp;amp;buffer[0]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Error handler&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function gets called automatically if there was an I2C Error like&lt;br /&gt;
 * the slave sent a &amp;quot;not acknowledge&amp;quot; (NACK, error codes e.g. 0x20 or 0x30).&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void I2C_transmissionError(uint8_t errorState)&lt;br /&gt;
{&lt;br /&gt;
	writeString_P_WIFI(&amp;quot;\nI2C ERROR - TWI STATE: 0x&amp;quot;);&lt;br /&gt;
	writeInteger_WIFI(errorState, HEX);&lt;br /&gt;
	writeChar_WIFI('\n');&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Main function - The program starts here:&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
	initRP6M256();    // Always call this first! The Processor will not work&lt;br /&gt;
					  // correctly otherwise. &lt;br /&gt;
&lt;br /&gt;
	initLCD(); // Initialize the LC-Display (LCD)&lt;br /&gt;
			   // Always call this before using the LCD!&lt;br /&gt;
&lt;br /&gt;
	setLEDs(0b1111);&lt;br /&gt;
	mSleep(500);&lt;br /&gt;
	setLEDs(0b0000);&lt;br /&gt;
&lt;br /&gt;
	writeString_P_WIFI(&amp;quot;\n\nRP6 Sensor Board Selftest 3!\n&amp;quot;); &lt;br /&gt;
&lt;br /&gt;
	// IMPORTANT:&lt;br /&gt;
	I2CTWI_initMaster(100); // Initialize the TWI Module for Master operation&lt;br /&gt;
							// with 100kHz SCL Frequency&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	// Register the event handler:&lt;br /&gt;
	I2CTWI_setTransmissionErrorHandler(I2C_transmissionError);&lt;br /&gt;
&lt;br /&gt;
	setLEDs(0b1111);&lt;br /&gt;
&lt;br /&gt;
	// Write a text message to the LCD:&lt;br /&gt;
	showScreenLCD(&amp;quot;################&amp;quot;, &amp;quot;################&amp;quot;);&lt;br /&gt;
	mSleep(1500);&lt;br /&gt;
	showScreenLCD(&amp;quot;RP6v2-M256-WIFI &amp;quot;, &amp;quot;Example Program&amp;quot;);&lt;br /&gt;
	mSleep(2500); &lt;br /&gt;
	showScreenLCD(&amp;quot;RP6 Sensor Board&amp;quot;, &amp;quot;   Selftest 3&amp;quot;);&lt;br /&gt;
	mSleep(2500);&lt;br /&gt;
	clearLCD();&lt;br /&gt;
&lt;br /&gt;
	setLEDs(0b0000);&lt;br /&gt;
&lt;br /&gt;
	// ---------------------------------------&lt;br /&gt;
&lt;br /&gt;
	uint8_t onoff = 0;&lt;br /&gt;
&lt;br /&gt;
	startStopwatch1();&lt;br /&gt;
	startStopwatch2();&lt;br /&gt;
&lt;br /&gt;
	// IMPORTANT:&lt;br /&gt;
	sensor_board_init();						// RP6 Sensor Board init!!!&lt;br /&gt;
	mSleep(200);&lt;br /&gt;
	I2C_BHT_init();								// RP6 BHT Module init&lt;br /&gt;
&lt;br /&gt;
	while(true) &lt;br /&gt;
	{&lt;br /&gt;
		if(getStopwatch1() &amp;gt; 1000) // 1s&lt;br /&gt;
		{&lt;br /&gt;
//			if (onoff) onoff = 0;&lt;br /&gt;
//			else onoff = 1;&lt;br /&gt;
&lt;br /&gt;
			// Show Pressure Sensor data:&lt;br /&gt;
			I2C_BHT_B_read();					// Read data&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nLuftdruck:   &amp;quot;);&lt;br /&gt;
			writeDouble_WIFI(P, 7, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot; hPa am Messort (ALTITUDE m)\n&amp;quot;);&lt;br /&gt;
			// Calculate pressure at sea level at TA_DEFAULT (15 °C):&lt;br /&gt;
			P0 = reduceAirPressure(P, TA_DEFAULT);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;Luftdruck:   &amp;quot;);&lt;br /&gt;
			writeDouble_WIFI(P0, 7, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot; hPa in Meereshöhe (0 m, 15 C)\n&amp;quot;);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;Temperatur:  &amp;quot;);&lt;br /&gt;
			writeDouble_WIFI(T, 7, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot; C\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			// Show Humidity Sensor data:&lt;br /&gt;
			H = I2C_BHT_HT_readHumidity();		// Read data&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nLuftfeuchte: &amp;quot;);&lt;br /&gt;
			writeDouble_WIFI(H, 7, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot; % RH\n&amp;quot;);&lt;br /&gt;
			HT = I2C_BHT_HT_readTemperature();	// Read data&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;Temperatur:  &amp;quot;);&lt;br /&gt;
			writeDouble_WIFI(HT, 7, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot; C\n\n\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			// RP6 Sensor Board shutdown (button &amp;amp; status LED test):&lt;br /&gt;
			if (pressedButton) {&lt;br /&gt;
				setStatusLED(1);&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;\nPress button again for RP6 Sensor Board SHUTDOWN!\n&amp;quot;);&lt;br /&gt;
				mSleep(2000);&lt;br /&gt;
				do {&lt;br /&gt;
					if(getStopwatch2() &amp;gt; 200) { // 0.2s&lt;br /&gt;
						if (onoff) onoff = 0;&lt;br /&gt;
						else onoff = 1;&lt;br /&gt;
						if (onoff) setStatusLED(1);&lt;br /&gt;
						else setStatusLED(0);&lt;br /&gt;
						setStopwatch2(0);&lt;br /&gt;
					}&lt;br /&gt;
					mSleep(1);&lt;br /&gt;
					task_I2CTWI();&lt;br /&gt;
				} while (!readButton());&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;\n\n\n\n\nPlease wait for RP6 Sensor Board SHUTDOWN...\n&amp;quot;);&lt;br /&gt;
				sensor_board_shutdown();&lt;br /&gt;
				mSleep(3000);&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;\n\n\nThe RP6 Sensor Board now is in SHUTDOWN MODE!!!\n&amp;quot;);&lt;br /&gt;
				mSleep(1000);&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;\nRESET the M256 microcontroller now...\n\n&amp;quot;);&lt;br /&gt;
				while(true) {};&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			setStopwatch1(0);&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		task_RP6SensorBoard();					// RP6 Sensor Board task&lt;br /&gt;
&lt;br /&gt;
		task_I2CTWI();&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Erklärung&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Erfahrungsberichte==&lt;br /&gt;
&lt;br /&gt;
...in Arbeit...(kann aber gerne ergänzt werden)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Siehe auch==&lt;br /&gt;
* [[RP6v2]]&lt;br /&gt;
* [[RP6]]&lt;br /&gt;
* [[RP6 - Programmierung]]&lt;br /&gt;
* [[RP6 Kamera - Mitmach-Projekt]]&lt;br /&gt;
* [[RP6v2 I2C-Portexpander]]&lt;br /&gt;
* [[RP6v2 USB-RS232-Adapter]]&lt;br /&gt;
* [[RP6v2 Orientierung]]&lt;br /&gt;
* [[RP6 Multi IO Projekt]]&lt;br /&gt;
* [[RP6 Multi IO Projekt - Software]]&lt;br /&gt;
* [[RP6 ArduIO]]&lt;br /&gt;
* [[RP6 ArduIO - Software]]&lt;br /&gt;
* [[Induktive_Ladestation_f%C3%BCr_den_RP6|Induktive Ladestation für den RP6]]&lt;br /&gt;
* [[IR-bake_f%C3%BCr_den_RP6|IR-bake für den RP6]]&lt;br /&gt;
* [[CCRP5]]&lt;br /&gt;
* [[Wild Thumper]]&lt;br /&gt;
* [[Wild Thumper - Programmierung]]&lt;br /&gt;
* [[Yeti]]&lt;br /&gt;
* [[Asuro]]&lt;br /&gt;
* [[C't-Bot]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Weblinks==&lt;br /&gt;
'''Siehe auch die Weblinks im [http://www.rn-wissen.de/index.php/RP6v2#Weblinks RP6v2] und im [http://www.rn-wissen.de/index.php/RP6#Weblinks RP6] Artikel!'''&lt;br /&gt;
&lt;br /&gt;
* [http://www.conrad.de/ce/de/product/1082384/Arexx-RP6-Sensor-Board-RP6-JM03-61 RP6 Sensor Board bei CONRAD]&lt;br /&gt;
* JM3 Engineering:&lt;br /&gt;
** [http://www.jm3-engineering.com/rp6.htm RP6 Roboter Erweiterung]&lt;br /&gt;
** [http://www.jm3-engineering.com/sensors.htm Sensor Module]&lt;br /&gt;
** [http://www.jm3-engineering.com/downloads.htm Software Downloads]&lt;br /&gt;
* Ankündigung einer Sensorerweiterungsplatine für die RP6v2 M256 WiFi im [http://www.roboternetz.de/community/threads/63595-Neue-Hardware-f%C3%BCr-RP6%28v2%29?p=590129&amp;amp;viewfull=1#post590129 Roboternetz RP6 Forum]&lt;br /&gt;
* Erfahrungsbericht zum Sensor Board im [http://www.arexx.com/forum/viewtopic.php?f=19&amp;amp;t=2498 AREXX Support Forum] und im [http://www.roboternetz.de/community/threads/64414-RP6-Sensor-Board-Erster-Eindruck Roboternetz RP6 Forum]&lt;br /&gt;
* Erfahrungsbericht zum I2C GPS Empfänger im [http://www.arexx.com/forum/viewtopic.php?f=19&amp;amp;t=2509 AREXX Support Forum]&lt;br /&gt;
* Erfahrungsbericht zum I2C BHT Modul im [http://www.arexx.com/forum/viewtopic.php?f=19&amp;amp;t=2646 AREXX Support Forum]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Kategorie:Robotikeinstieg]]	 &lt;br /&gt;
[[Kategorie:Praxis]]&lt;br /&gt;
&lt;br /&gt;
==Autoren==&lt;br /&gt;
--[http://www.roboternetz.de/community/members/1972-Dirk Dirk] 18:59, 1. Jun 2020 (CET)&lt;/div&gt;</summary>
		<author><name>Dirk NO2</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=RP6v2&amp;diff=28577</id>
		<title>RP6v2</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=RP6v2&amp;diff=28577"/>
				<updated>2022-03-31T09:16:17Z</updated>
		
		<summary type="html">&lt;p&gt;Dirk NO2: /* Zubehör und Ersatzteile */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Bild:rp6v2_2.jpg|RP6v2 Base Roboter|right|500px]]&lt;br /&gt;
==Was bisher geschah==&lt;br /&gt;
'''Siehe auch &amp;quot;Was bisher geschah&amp;quot; im [http://www.rn-wissen.de/index.php/RP6#Was_bisher_geschah RP6 Artikel]!'''&lt;br /&gt;
&lt;br /&gt;
Mon, 27. Feb 2012 - Ankündigung des '''RP6v2'''&amp;lt;br/&amp;gt;&lt;br /&gt;
Don, 08. Mär 2012 - Auslieferungsbeginn des RP6v2&amp;lt;br/&amp;gt;&lt;br /&gt;
Sam, 17. Mär 2012 - Ankündigung der '''[[RP6v2#RP6v2_M256_WiFi_Platine|RP6v2 M256 WiFi]]'''&amp;lt;br/&amp;gt;&lt;br /&gt;
Mon, 11. Jun 2012 - Beginn der &amp;quot;Testaktion: Kostenlose RP6v2-M256-WIFI Module!&amp;quot;&amp;lt;br/&amp;gt;&lt;br /&gt;
Die, 10. Jul 2012 - Ende der &amp;quot;Testaktion: Kostenlose RP6v2-M256-WIFI Module!&amp;quot; nach Abstimmung&amp;lt;br/&amp;gt;&lt;br /&gt;
Mit, 11. Jul 2012 - Veröffentlichung der RP6v2 M256 WiFi Bedienungsanleitung&amp;lt;br/&amp;gt;&lt;br /&gt;
Die, 17. Jul 2012 - Eintreffen der kostenlosen RP6v2 M256 WiFi bei den Testern&amp;lt;br/&amp;gt;&lt;br /&gt;
Mit, 25. Jul 2012 - Auslieferungsbeginn der RP6v2 M256 WiFi&amp;lt;br/&amp;gt;&lt;br /&gt;
Don, 01. Nov 2012 - Im Oktober 2012 Auslieferung einiger RP6v2 M256 WiFi mit &amp;quot;altem&amp;quot; Bootloader V1.2&amp;lt;br/&amp;gt;&lt;br /&gt;
Don, 11. Dez 2014 - Im 2. bis 4. Quartal 2014 Auslieferung einiger [http://www.arexx.com/forum/viewtopic.php?f=19&amp;amp;t=2618 USB Interfaces mit gefälschtem FTDI Chip]&amp;lt;br/&amp;gt;&lt;br /&gt;
Sam, 02. Jan 2016 - Unter der Bezeichnung '''[[RP6v2#Arexx_RP6-Xtra_Robotersystem|Arexx RP6-Xtra Robotersystem]]''' ist ein Set bestehend aus dem RP6, einer Experimentierplatine, einem RP6v2 Drehgeber-Satz und einem RP6 USB-Interface lieferbar&amp;lt;br/&amp;gt;&lt;br /&gt;
Mon, 12. Mär 2018 - Seit dem 1. Quartal 2018 ist das Arexx RP6-Xtra Robotersystem bei CONRAD ausverkauft&amp;lt;br/&amp;gt;&lt;br /&gt;
Sam, 31. Mär 2018 - Seit Ende März 2018 ist die RP6v2 M256 WiFi Zusatzpatine bei CONRAD ausverkauft&amp;lt;br/&amp;gt;&lt;br /&gt;
Mit, 12. Sep 2018 - Seit September 2018 ist das [[RP6#Displays|LC-Display]] bei CONRAD ausverkauft&amp;lt;br/&amp;gt;&lt;br /&gt;
Mit, 28. Nov 2018 - Seit November 2018 ist der RP6v2 bei CONRAD ausverkauft&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Siehe auch &amp;quot;Was bisher geschah&amp;quot; im [http://www.rn-wissen.de/index.php/RP6_Sensor_Board_und_Xtra_Module#Was_bisher_geschah RP6 Sensor Board und Xtra Module Artikel]!'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Allgemein==&lt;br /&gt;
Der RP6v2 ([http://www.conrad.de/ce/de/product/191584/RP6-V2-ROBOTERSYSTEM/ 191584]) wurde am 27.02.2012 von [http://www.roboternetz.de/community/members/120-SlyD SlyD] angekündigt (siehe Weblinks!). Er ist eine leicht verbesserte Version des [[RP6]]. Der RP6v2 ist softwarekompatibel zum RP6. '''Alle Erweiterungs-Module können auch mit dem RP6v2 eingesetzt werden.'''&lt;br /&gt;
&lt;br /&gt;
 '''Seit November 2018 ist der RP6v2 bei CONRAD ausverkauft.'''&lt;br /&gt;
 '''Damit endet die Ära des RP6 Robotersystems nun endgültig nach fast 11 1/2 Jahren.'''&lt;br /&gt;
&lt;br /&gt;
Dieser Artikel beschreibt die Grundlagen zum RP6v2, '''sofern sie vom RP6 abweichen''', und die Grundlagen und Programmierung seiner zukünftigen Erweiterungs-Module.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Eigenschaften==&lt;br /&gt;
Laut Ankündigung haben sich beim RP6v2 folgende Details gegenüber dem RP6 geändert:&lt;br /&gt;
* Neue Drehgeber&lt;br /&gt;
** Justierung dank neuer Sensortechnik üblicherweise nicht mehr erforderlich&lt;br /&gt;
** leicht zugängliches und deutlich größeres Potentiometer&lt;br /&gt;
** Potis nur noch zur Feinjustierung erforderlich&lt;br /&gt;
* Zusätzliche Steckverbinder (im RP6 schon seit 2010 verbaut)&lt;br /&gt;
** vom Mainboard zu den Drehgebern&lt;br /&gt;
** vom Mainboard zu den Motoren&lt;br /&gt;
* Neue Anschlüsse (Steckverbinder / Stiftleisten)&lt;br /&gt;
** 2 3-polige ADC Anschlüsse mit VDD/GND inkl. zusätzlichem Stützkondensator&lt;br /&gt;
** 2 4-polige VDD Anschlüsse (je 2x +5V und 2x GND)&lt;br /&gt;
** 1 3-poliger +UB Anschluß (1x +UB, 2x GND)&lt;br /&gt;
** 1 5-polige Stiftleiste für den I2C Bus und VDD/GND&lt;br /&gt;
** 1 8-poliger EXT Steckverbinder (JST-Wannenstecker)&lt;br /&gt;
** 2 4-polige Steckverbinder (LIO1/LIO2) für die I/O-Pins von 4 LEDs und VDD/GND&lt;br /&gt;
* Hauptsicherung&lt;br /&gt;
** von 2,5A auf 3,15A erhöht&lt;br /&gt;
* Motortreiber&lt;br /&gt;
** leistungsfähigere und robustere MOSFETs&lt;br /&gt;
* Experimentierplatine&lt;br /&gt;
** gehört nicht mehr zum Lieferumfang&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Technische Änderungen==&lt;br /&gt;
Der RP6v2 weist einige Detail-Änderungen gegenüber der Vorversion auf. '''Diese Änderungen sind für die Nutzung und Programmierung des RP6v2 weitgehend irrelevant.'''&lt;br /&gt;
&lt;br /&gt;
Fast alle passiven SMD-Bauteile sind jetzt in Bauform 0603 bestückt (Ausnahmen: R6 (SP2 C2: R6), Induktivitäten und größere Kondensatoren).&lt;br /&gt;
Im Text gibt es Verweise auf den Schaltplan des RP6v2 (RP6v2_MAINBOARD.pdf) in der Form: (SP2 B1: Bauteil). Dies bedeutet, dass man das Bauteil auf Blatt 2 des RP6v2-Schaltplans im Feld B1 finden kann.&lt;br /&gt;
&lt;br /&gt;
===Mainboard===&lt;br /&gt;
* C14 (SP2 A3: C14) -&amp;gt; Liegt jetzt an VDD (parallel u.a. zu C6..C10)&lt;br /&gt;
* C26 (SP2 A1: C26) -&amp;gt; Jetzt bestückt mit Elko 220uF/16V (laut SP: 470uF/16V!)&lt;br /&gt;
* C29 (SP2 E1: C29) -&amp;gt; Jetzt bestückt mit SMD Kondensator 10uF&lt;br /&gt;
* IO3/IO4 Bestückungsaufdruck geändert in IO4/IO5 (Stecker LIO2)&lt;br /&gt;
* UBAT Bestückungsaufdruck geändert in UBAT_SENSE&lt;br /&gt;
* F2.5A Bestückungsaufdruck geändert in F3.0A (Feinsicherung flink 3,0A)&lt;br /&gt;
* Trennstelle +UB Sensor (siehe Abschnitt 6.4.6 [[RP6#.2BUB_Sensor|+UB Sensor]] des RP6-Artikels!) existiert beim RP6v2 nicht mehr&lt;br /&gt;
* Als Motortreiber (SP3 BCD23: Q1..Q4) werden anstelle von IRF7309 (ID 3,0A; PD 1,4W) die leistungsfähigeren und ESD-geschützten Typen [http://media.digikey.com/pdf/Data%20Sheets/Rohm%20PDFs/SP8M3.pdf SP8M3] (ID 4,5A; PD 2W; Schutzdiode) verwendet&lt;br /&gt;
&lt;br /&gt;
===Encoderplatine===&lt;br /&gt;
Schaltung siehe Datei RP6v2_ENCODERS.pdf!&lt;br /&gt;
* Jetzt mit Operationsverstärker IC2 ([http://ww1.microchip.com/downloads/en/DeviceDoc/21733h.pdf MCP6001U]) anstelle eines Transistors&lt;br /&gt;
* Größeres Potentiometer R2 (200kOhm)&lt;br /&gt;
Die Encoder sind mittlerweile auch einzeln unter der Conrad-Bestellnummer '''[http://www.conrad.de/ce/de/product/191625/RP6-DREHGEBER-SATZ 191625-62]''' verfügbar.&lt;br /&gt;
&lt;br /&gt;
===USB-Interface===&lt;br /&gt;
Schaltung siehe Datei RP6v2_USB_INTERFACE.pdf!&lt;br /&gt;
* C2  -&amp;gt; Jetzt bestückt mit SMD Kondensator 10uF&lt;br /&gt;
* C5  -&amp;gt; Neuer Blockkondensator 100nF an VCCIO von IC1&lt;br /&gt;
&lt;br /&gt;
===Steckverbindungen und Stiftleisten===&lt;br /&gt;
&lt;br /&gt;
====Motoren====&lt;br /&gt;
[[Bild:RP6v2_Motorstecker.JPG|thumb]]&lt;br /&gt;
&lt;br /&gt;
Beim RP6v2 sind die beiden Motorkabel mit 2-poligen Winkelsteckern RM 7,5mm an das Mainboard angeschlossen. &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;
&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;
====Encoder====&lt;br /&gt;
[[Bild:RP6v2_Encoderstecker.JPG|thumb]]&lt;br /&gt;
&lt;br /&gt;
Beim RP6v2 sind die Encoder mit einer JST XH Stiftleiste gewinkelt, 6-polig, RM 2,5mm ([http://www.conrad.de/ce/de/product/740271/Stiftleiste-gewinkelt-RM-25-mm-Serie-XH-Rastermass-25-mm-Pole-6-Nennstrom-3-A-S6B-XH-A-LFSN-JST-Inhalt-1-St 740271]) an das Mainboard angeschlossen.&lt;br /&gt;
&lt;br /&gt;
Auch die 3-polige Verbindung zu den beiden Encoder-Platinen (JST XH Stiftleiste gewinkelt, 3-polig, RM 2,5mm ([http://www.conrad.de/ce/de/product/740174/Stiftleiste-gewinkelt-RM-25-mm-Serie-XH-Rastermass-25-mm-Pole-3-Nennstrom-3-A-S3B-XH-A-LFSN-JST-Inhalt-1-St 740174])) ist steckbar.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====LIO1/LIO2====&lt;br /&gt;
[[Bild:RP6v2_LIO12.JPG|thumb]]&lt;br /&gt;
&lt;br /&gt;
Beim RP6 waren die Anschlüsse der Status-LEDs SL1,2 und SL4,5 ([[RP6#IO1..IO4|IO1..IO4]]) einzeln auf dem Mainboard zu kontaktieren.&lt;br /&gt;
&lt;br /&gt;
Beim RP6v2 gibt es zwei 4-polige Stiftleisten (LIO1, LIO2). Sie führen an den Pins 1 und 2 +5V und GND.&lt;br /&gt;
&lt;br /&gt;
An den Pins 3 und 4 finden sich die Anschlüsse von IO2, IO1 (LIO1) bzw. IO4, IO5 (LIO2).&lt;br /&gt;
&lt;br /&gt;
Bitte beachten: '''Der Bestückungsaufdruck IO4, IO5 des RP6v2 bezeichnet die selben Anschlüsse, wie beim RP6 IO3, IO4!'''&lt;br /&gt;
&lt;br /&gt;
Es handelt sich in beiden Fällen um die Anschlüsse der Status-LEDs SL4 (PB7) und SL5 (PB1).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====ADC0/ADC1====&lt;br /&gt;
[[Bild:RP6v2_ADC01.JPG|thumb]]&lt;br /&gt;
&lt;br /&gt;
Beim RP6 waren die 3-poligen Anschlüsse von ADC0 und ADC1 ([[RP6#Analoge_Sensoren_an_ADC0.2F1|Analoge Sensoren an ADC0/1]]) nicht mit Stiftleisten bestückt.&lt;br /&gt;
&lt;br /&gt;
Dies ist jetzt beim RP6v2 der Fall,- zusätzlich ist auch C26 (SP2 A1: C26) bestückt.&lt;br /&gt;
&lt;br /&gt;
Damit können analoge Sensoren direkt angeschlossen werden.&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;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====I2C/+UB/+5V====&lt;br /&gt;
[[Bild:RP6v2_I2CUB5V.JPG|thumb]]&lt;br /&gt;
&lt;br /&gt;
Die beim RP6 vorhandene 5-polige I2C-Schnittstelle ([[RP6#I2C-Schnittstelle|I2C-Schnittstelle]]) findet sich (jetzt mit Stiftleiste bestückt) genau so auch beim RP6v2.&lt;br /&gt;
&lt;br /&gt;
Bitte beachten: '''Die Anordnung der Pins auf dem Mainboard ist beim RP6v2 umgekehrt wie beim RP6!'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beim RP6 gab es (nicht mit Stiftleisten bestückte) Anschlüsse für VDD und +UB ([[RP6#VDD.2FGND.2F.2BUB_Anschlu.C3.9F|VDD/GND/+UB Anschluß]]).&lt;br /&gt;
&lt;br /&gt;
Beim RP6v2 gibt es jetzt drei Stiftleisten für +UB, +5V (VDD) und GND:&lt;br /&gt;
* Eine 3-polige Stiftleiste mit GND, +UB, GND&lt;br /&gt;
* Zwei 4-polige Stiftleisten jeweils mit GND, +5V, +5V, GND&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;
====EXT====&lt;br /&gt;
[[Bild:RP6v2_EXT.JPG|thumb]]&lt;br /&gt;
&lt;br /&gt;
Beim RP6 war keine Stiftleiste für den 8-poligen EXT Anschluß bestückt.&lt;br /&gt;
&lt;br /&gt;
Beim RP6v2 ist jetzt an dieser Stelle eine JST XH Stiftleiste gerade, 8-polig, RM 2,5mm ([http://www.conrad.de/ce/de/product/740105/Stiftleiste-gerade-RM-25-mm-Serie-XH-Rastermass-25-mm-Pole-8-Nennstrom-3-A-B8B-XH-A-LFSN-JST-Inhalt-1-St 740105]) vorhanden, auf die auch Steckbuchsen (RM 2,54) gesteckt werden können.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beschreibung des EXT Anschlusses: [[RP6#EXT_Anschlu.C3.9F|EXT Anschluß]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Erweiterungs-Module==&lt;br /&gt;
Über die Erweiterungs-Module informiert der Abschnitt [[RP6#Erweiterungs-Module|Erweiterungs-Module]] im RP6 Artikel.&lt;br /&gt;
&lt;br /&gt;
Darüber hinaus sind bei [http://www.conrad.de/ce/ CONRAD] für den RP6v2 erhältlich:&lt;br /&gt;
* RP6v2 M256 WiFi Zusatzplatine ([http://www.conrad.de/ce/de/product/191609/Arexx-RP6-V2-Control-M256-WiFi-Kit-RP6v2-M256-WIFI 191609])&lt;br /&gt;
* RP6 Sensor Board ([http://www.conrad.de/ce/de/product/1082384/Arexx-RP6-Sensor-Board-RP6-JM03-61 1082384])&lt;br /&gt;
&lt;br /&gt;
===RP6v2 M256 WiFi Platine===&lt;br /&gt;
Die RP6v2 M256 WiFi Zusatzplatine ([http://www.conrad.de/ce/de/product/191609/Arexx-RP6-V2-Control-M256-WiFi-Kit-RP6v2-M256-WIFI 191609]) wurde am 17.03.2012 von [http://www.roboternetz.de/community/members/120-SlyD SlyD] angekündigt (siehe Weblink!).&lt;br /&gt;
&lt;br /&gt;
Aktuell (Ende März 2018) ist die RP6v2 M256 WiFi Zusatzplatine bei CONRAD ausverkauft. &lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6v2_M256_WIFI.JPG|Die RP6v2 M256 WiFi]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Beschreibung====&lt;br /&gt;
Laut Ankündigung bietet die RP6v2 M256 WiFi:&lt;br /&gt;
* Atmel ATmega2560 Mikrocontroller&lt;br /&gt;
** 256kB Flash ROM&lt;br /&gt;
** 8kB SRAM&lt;br /&gt;
** 4kB EEPROM&lt;br /&gt;
** 16MHz Taktfrequenz&lt;br /&gt;
** 6 Hardware Timer und 86 I/O Ports&lt;br /&gt;
** Bis zu 16 A/D Wandler Kanäle (10 Bit Auflösung)&lt;br /&gt;
** 12 16 Bit Hardware PWMs&lt;br /&gt;
** 2 USART/SPI Ports&lt;br /&gt;
* Energieeffizientes 802.11g WLAN Modul&lt;br /&gt;
** Typ: Roving Networks RN-171&lt;br /&gt;
** Telemetriedaten übertragen&lt;br /&gt;
** Roboter vom PC aus fernsteuern&lt;br /&gt;
** Neue Programme drahtlos per WLAN in den Mikrocontroller laden&lt;br /&gt;
** Bootloader nachträglich erweitern&lt;br /&gt;
** Einstellung des WLAN Moduls über das RP6 USB Interface mit dem RobotLoader 2.x&lt;br /&gt;
** Änderung der Einstellungen über eine Netzwerkverbindung oder mit dem eigenen Mikrocontrollerprogramm&lt;br /&gt;
** Eigener Prozessor (entlastet den ATmega)&lt;br /&gt;
** Funktioniert mit jedem Standard WLAN Accesspoint/Router&lt;br /&gt;
** Kann als transparente serielle Schnittstelle arbeiten&lt;br /&gt;
** Kann vom PC aus per TCP/IP angesprochen werden&lt;br /&gt;
** 10cm 2.4GHz Antenne mit RP-SMA Anschluß&lt;br /&gt;
* Sonstige Ausstattung&lt;br /&gt;
** 8 Bit Display Port&lt;br /&gt;
** I2C Bus&lt;br /&gt;
** microSD Kartenslot&lt;br /&gt;
** 7 Status LEDs&lt;br /&gt;
** 2 Eingabetaster&lt;br /&gt;
** ISP Anschluß&lt;br /&gt;
** 4 WLAN ADC Kanäle&lt;br /&gt;
** AREF 3,3 und 5V&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6v2_M256_WIFI_Q2_m.JPG|thumb]]&lt;br /&gt;
&lt;br /&gt;
Ab Mitte Juli 2012 trafen die ersten kostenlosen RP6v2 M256 WiFi Platinen bei den Testern ein, die sich vorher dafür im Roboternetz RP6 Forum beworben hatten. Es handelte sich um Vorserien-Modelle, die sich dadurch auszeichneten, dass die Lötpads für Q2 (SP2 C6/C7: Q2) vertauscht waren. Der MOSFET war daher manuell &amp;quot;verdreht&amp;quot; aufgelötet, siehe nebenstehende Abbildung.&lt;br /&gt;
&lt;br /&gt;
Bei den Serien-Modellen wurde dies korrigiert.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Technische Daten====&lt;br /&gt;
{|  {{Blauetabelle}} &lt;br /&gt;
|'''Mikrocontroller:'''&lt;br /&gt;
|AVR ATmega2560&lt;br /&gt;
|-&lt;br /&gt;
|'''Speicher:'''&lt;br /&gt;
|256 kB [[Flash]]-Speicher&amp;lt;br/&amp;gt;&lt;br /&gt;
8 kB SRAM&amp;lt;br/&amp;gt; &lt;br /&gt;
4 kB [[EEPROM]]&amp;lt;br/&amp;gt;&lt;br /&gt;
? GB microSD Speicherkarte&lt;br /&gt;
|-&lt;br /&gt;
|'''Programmierung:'''&lt;br /&gt;
|Über [[Bootloader]], belegt ca. 8 kB des Flash-Speichers&amp;lt;br/&amp;gt;&lt;br /&gt;
Drahtlos über WLAN&lt;br /&gt;
|-&lt;br /&gt;
|'''Vorhandene Sensoren:'''&lt;br /&gt;
|2 Eingabetaster&amp;lt;br/&amp;gt;&lt;br /&gt;
4 WLAN ADC Kanäle&amp;lt;br/&amp;gt;&lt;br /&gt;
60 GP I/O Ports, davon bis 16 AD-Wandler (10-bit)&amp;lt;br/&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|'''Vorhandene Aktoren:'''&lt;br /&gt;
|7 Status LEDs&amp;lt;br/&amp;gt;&lt;br /&gt;
1 LC-Display-Port&amp;lt;br/&amp;gt;&lt;br /&gt;
802.11g WLAN Modul&amp;lt;br/&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|'''Abmessungen:'''&lt;br /&gt;
|(L &amp;amp;times; B &amp;amp;times; H) 112 &amp;amp;times; 90 &amp;amp;times; 42 mm (ohne Antenne)&lt;br /&gt;
|-&lt;br /&gt;
|'''Ausführung:'''&lt;br /&gt;
|Fertig aufgebautes Erweiterungsmodul&lt;br /&gt;
|-&lt;br /&gt;
|'''Stromversorgung:'''&lt;br /&gt;
|6 AA NiMH Akkus (über die RP6v2 Base)&lt;br /&gt;
|-&lt;br /&gt;
|'''Hersteller:'''&lt;br /&gt;
|Arexx Niederlande&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====WLAN Modul RN-171====&lt;br /&gt;
Das auf der RP6v2 M256 WiFi eingesetzte WLAN Modul ist das [http://www.microchip.com/wwwproducts/en/RN171 RN-171] ursprünglich entwickelt von Roving Networks. Vor einigen Jahren wurde die Firma Roving Networks von [http://www.microchip.com MicroChip Technology] übernommen.&lt;br /&gt;
&lt;br /&gt;
Inzwischen (2017) wird das RN-171 zwar noch hergestellt, für neue Hardware Designs aber nicht mehr empfohlen.&lt;br /&gt;
&lt;br /&gt;
Die letzte Firmware Version trägt die Nummer 4.81.&lt;br /&gt;
&lt;br /&gt;
Für die Nutzung des RN-171 auf der RP6v2 M256 WiFi wird sowohl vonseiten des Hardware Designs der Platine, als auch vonseiten der Software davon ausgegangen, dass das RN-171 auch den &amp;quot;Ad-Hoc Modus&amp;quot; beherrscht. Dies ist der Fall bis zur Firmware Version 2.38.3. Höhere Versionen beherrschen diesen Modus nicht mehr.&lt;br /&gt;
&lt;br /&gt;
''Somit ist die Firmware 2.38.3 die höchste Version, die für das RN-171 auf der RP6v2 M256 WiFi nutzbar ist!''&lt;br /&gt;
&lt;br /&gt;
Diese Firmware Version (Datei: wifly7-2383.img) findet ihr in der ZIP in diesem [http://www.roboternetz.de/community/threads/64251-RP6M256-WLAN-Modul-RN-171-Firmware-Update?p=594781&amp;amp;viewfull=1#post594781 Post] im Roboternetz RP6 Forum. Seht euch vor einem eventuellen Firmware Update unbedingt den ganzen [http://www.roboternetz.de/community/threads/64251-RP6M256-WLAN-Modul-RN-171-Firmware-Update Thread] auch wegen der enthaltenen Warnhinweise an.&lt;br /&gt;
&lt;br /&gt;
====Umbau-Optionen====&lt;br /&gt;
Für die RP6v2 M256 WiFi gibt es keine Umbau-Optionen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===RP6 Sensor Board===&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_Sensor_Board.jpg|Das RP6 Sensor Board]]&lt;br /&gt;
&lt;br /&gt;
'''Die Beschreibung des RP6 Sensor Boards wurde ausgelagert in einen eigenen [[RP6_Sensor_Board_und_Xtra_Module#RP6_Sensor_Board_2|Artikel]]!'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Zubehör und Ersatzteile==&lt;br /&gt;
Über die Zubehör- und Ersatzteile informiert der Abschnitt [[RP6#Zubehör und Ersatzteile|Zubehör und Ersatzteile]] im RP6 Artikel.&lt;br /&gt;
&lt;br /&gt;
Darüber hinaus sind bei [http://www.conrad.de/ce/ CONRAD] für den RP6v2 erhältlich:&lt;br /&gt;
* Arexx RP6v2 Drehgeber-Satz RP6-ENCv2 ([http://www.conrad.de/ce/de/product/191625/RP6-DREHGEBER-SATZ 191625] AUSVERKAUFT!)&lt;br /&gt;
* Arexx RP6 USB-Interface RP6V2-TRANS ([http://www.conrad.de/ce/de/product/191638/Arexx-RP6-USB-Interface-RP6V2-TRANS 191638] AUSVERKAUFT!)&lt;br /&gt;
* Arexx RP6 Xtra Module&lt;br /&gt;
&lt;br /&gt;
===RP6v2 Drehgeber-Satz RP6-ENCv2===&lt;br /&gt;
Die RP6v2 [http://www.rn-wissen.de/index.php/RP6v2#Encoder Drehgeber-Sensoren] (AREXX RP6-ENCv2) sind als Ersatzteil für den RP6v2 (191584) erhältlich und jetzt seit Mai 2020 bei CONRAD ausverkauft. Sie können auch in den [[RP6|RP6]] (191524) und in das RP5/RP6-Chassis ([http://www.conrad.de/ce/de/product/191152/Arexx-Fahrgestell-Robby-RP5RP6-Roboter 191152]) eingebaut werden und sind Bestandteil des [[RP6v2#Arexx_RP6-Xtra_Robotersystem|Arexx RP6-Xtra Robotersystems]].&lt;br /&gt;
&lt;br /&gt;
===RP6 USB-Interface RP6V2-TRANS===&lt;br /&gt;
Das RP6 USB-Interface (AREXX RP6V2-TRANS) kann zur Kommunikation mit verschiedenen Robotern und Erweiterungsmodulen eingesetzt werden. Es lassen sich mit dem RobotLoader neue Programme in den Mikrocontroller laden, und es wird ein virtueller serieller Port zur Kommunikation bereitgestellt. Auf dem Modul befindet sich zusätzlich ein Anschluss für APC220 Funkmodule (z.B. aus [http://www.conrad.de/ce/de/product/191668/Arexx-Wireless-Kit-ARX-APC220 diesem] Set, AUSVERKAUFT!) und ein 3,3 V Spannungsregler. Das USB-Interface RP6V2-TRANS kann als Ersatz für das mit dem RP6 oder RP6v2 gelieferte USB-Interface dienen und ist Bestandteil des [[RP6v2#Arexx_RP6-Xtra_Robotersystem|Arexx RP6-Xtra Robotersystems]]. Seit Ende 2021 ist das USB-Interface bei CONRAD ausverkauft.&lt;br /&gt;
&lt;br /&gt;
===RP6 Xtra Module===&lt;br /&gt;
'''Die Beschreibung der RP6 Xtra Module wurde ausgelagert in einen eigenen [[RP6_Sensor_Board_und_Xtra_Module#RP6_Xtra_Module_2|Artikel]]!'''&lt;br /&gt;
&lt;br /&gt;
===Arexx RP6-Xtra Robotersystem===&lt;br /&gt;
Unter der Bezeichnung '''Arexx RP6-Xtra Robotersystem''' bzw. '''Arexx Roboter Bausatz RP6-S''' ([https://www.conrad.de/de/arexx-rp6-xtra-robotersystem-1395738.html 1395738]) ist ab Januar 2016 ein Set bestehend aus dem [[RP6|RP6]] ([https://www.conrad.de/de/rp6-robotersystem-191524.html 191524]), einer [[RP6#Experimentierplatine|Experimentierplatine]] ([https://www.conrad.de/de/arexx-rp6-experimentierplatine-191537.html 191537]), einem [[RP6v2#RP6v2_Drehgeber-Satz_RP6-ENCv2|RP6v2 Drehgeber-Satz]] ([https://www.conrad.de/de/arexx-rp6-v2-drehgeber-sensoren-rp6-encv2-191625.html 191625]) und einem [[RP6v2#RP6_USB-Interface_RP6V2-TRANS|RP6 USB-Interface]] ([https://www.conrad.de/de/arexx-rp6-usb-interface-rp6v2-trans-191638.html 191638]) lieferbar.&lt;br /&gt;
&lt;br /&gt;
Die RP6v2 Drehgeber müssen selbst montiert werden. Durch dieses Set entsteht aus dem &amp;quot;alten RP6&amp;quot; ein Robotersystem, das in seiner Funktion identisch mit dem RP6v2 ist.&lt;br /&gt;
&lt;br /&gt;
Seit dem 1. Quartal 2018 ist das Arexx RP6-Xtra Robotersystem bei CONRAD ausverkauft.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Programmierung==&lt;br /&gt;
===RobotLoader===&lt;br /&gt;
Der RobotLoader ist die Weiterentwicklung des RP6Loaders. Es gibt ihn und den USB Interface Treiber [http://www.arexx.com/rp6/html/de/software.htm hier].&lt;br /&gt;
Über die Funktionen des RP6Loaders (siehe [[RP6_-_Programmierung#RP6Loader|hier]]!) hinaus kann der RobotLoader ab Version 2.0 Folgendes:&lt;br /&gt;
* WiFi Loader (Programme über WiFi hochladen und starten, Programmspeicher löschen)&lt;br /&gt;
* WiFi Terminal (Zeichen über WiFi senden/empfangen)&lt;br /&gt;
* Abdocken der Fenster des (seriellen) Terminals und des WiFi Terminals&lt;br /&gt;
* Konfiguration des WiFi Moduls über die serielle Schnittstelle&lt;br /&gt;
* Nach WiFi Geräten suchen&lt;br /&gt;
* Ab Version 2.3 über Kommandozeile steuerbar&lt;br /&gt;
&lt;br /&gt;
'''Befehlszeilen Optionen'''&lt;br /&gt;
&amp;lt;pre&amp;gt;################################################################&lt;br /&gt;
RobotLoader - Commandline Options&lt;br /&gt;
-c | -command : Enable Commandline Mode&lt;br /&gt;
-h | -help : Show this help message&lt;br /&gt;
-port=&amp;lt;PORT&amp;gt; : specify which port to use&lt;br /&gt;
               Windows with JD2XX: USB0, USB1, ...&lt;br /&gt;
               Windows with RXTX: COM0, COM1, ...&lt;br /&gt;
               Linux with RXTX: /dev/ttyUSB0, /dev/ttyUSB1, ...&lt;br /&gt;
-e : Erase Memory&lt;br /&gt;
-hex=&amp;lt;FILE&amp;gt; : Upload &amp;lt;FILE&amp;gt;, you must specify the complete path!&lt;br /&gt;
-s : Start Program (after upload)&lt;br /&gt;
-id : Get Infos from connected Board&lt;br /&gt;
###############################################################&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Loader Versionen====&lt;br /&gt;
Hier eine Tabelle der (mir) bekannten RobotLoader Versionen für die RP6v2 Base, CONTROL M32 und ab Version 2.0 auch für die M256 WiFi:&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |ZIP-Datum&lt;br /&gt;
 |Version&lt;br /&gt;
 |Bemerkungen&lt;br /&gt;
 |Examples&lt;br /&gt;
 |-&lt;br /&gt;
 |12.07.2010&lt;br /&gt;
 |[http://www.arexx.com/rp6/downloads/RobotLoader_20100712.zip 1.5h]&lt;br /&gt;
 |Auch für die RP6 Base, für Roboterarme und Caterpillar&lt;br /&gt;
 |ab 16.10.2007&lt;br /&gt;
 |-&lt;br /&gt;
 |16.06.2011&lt;br /&gt;
 |1.6b&lt;br /&gt;
 |Version auf der AREXX Wild Thumper CD-ROM!&lt;br /&gt;
 |&lt;br /&gt;
 |-&lt;br /&gt;
 |23.02.2012&lt;br /&gt;
 |[http://www.arexx.com/rp6/downloads/RobotLoader_20120223.zip 2.0 BETA]&lt;br /&gt;
 |Testversion! Ab v2.0 auch für die RP6v2 M256 WiFi Platine&lt;br /&gt;
 |&lt;br /&gt;
 |-&lt;br /&gt;
 |16.03.2012&lt;br /&gt;
 |2.1c&lt;br /&gt;
 |Version auf der AREXX Wireless kits CD-ROM 2012!&lt;br /&gt;
 |&lt;br /&gt;
 |-&lt;br /&gt;
 |05.06.2012&lt;br /&gt;
 |[http://www.arexx.com/rp6/downloads/RobotLoader_20120605.zip 2.3a]&lt;br /&gt;
 |Testversion! Siehe auch [http://www.roboternetz.de/community/threads/58168-RobotLoader-2-3a hier]!&lt;br /&gt;
 |&lt;br /&gt;
 |-&lt;br /&gt;
 |18.06.2012&lt;br /&gt;
 |[http://www.arexx.com/rp6/downloads/RobotLoader_20120618.zip 2.3b]&lt;br /&gt;
 |Testversion! Siehe auch [http://www.roboternetz.de/community/threads/58168-RobotLoader-2-3a hier]!&lt;br /&gt;
 |&lt;br /&gt;
 |-&lt;br /&gt;
 |17.07.2012&lt;br /&gt;
 |[http://www.arexx.com/rp6/downloads/RobotLoader_20120717.zip 2.3c]&lt;br /&gt;
 |Über Kommandozeile nutzbar, siehe auch [http://www.roboternetz.de/community/threads/58168-RobotLoader-2-3a hier]!&lt;br /&gt;
 |ab 16.07.2012&lt;br /&gt;
 |-&lt;br /&gt;
 |24.09.2012&lt;br /&gt;
 |[http://www.arexx.com/rp6/downloads/RobotLoader_20120924.zip 2.4a]&lt;br /&gt;
 |Mit WLAN Firmware v. 2.32, siehe auch [http://www.roboternetz.de/community/threads/59336-RobotLoader-2-4a hier]!&lt;br /&gt;
 |&lt;br /&gt;
 |-&lt;br /&gt;
 |10.04.2013&lt;br /&gt;
 |[http://www.arexx.com/rp6/downloads/RobotLoader_20130410.zip 2.5a]&lt;br /&gt;
 |Mit WLAN Firmware v. 2.36, siehe auch [http://www.roboternetz.de/community/threads/61977-M256-WIFI-Manchmal-nicht-ansprechbar?p=578766&amp;amp;viewfull=1#post578766 hier]!&lt;br /&gt;
 |&lt;br /&gt;
 |-&lt;br /&gt;
|}&lt;br /&gt;
'''Hinweise:'''&lt;br /&gt;
* Ältere Versionen des RP6Loaders bis Version 1.4 findet ihr [[RP6_-_Programmierung#RP6Loader|hier]].&lt;br /&gt;
* Von JM3 Engineering wurde auch ein eigenes Programm [[RP6_Sensor_Board_und_Xtra_Module#Robot-Tool|&amp;quot;'''JM3 Robot-Tool'''&amp;quot;]] veröffentlicht, das im RP6-System (RP6(v2) Base, CONTROL M32, M256 WiFi) anstelle des RobotLoaders verwendet werden kann.&lt;br /&gt;
&lt;br /&gt;
====Projekte====&lt;br /&gt;
* Der RobotLoader 2.3a und [http://www.rn-wissen.de/index.php/LunaAVR LunaAVR] im [http://www.roboternetz.de/community/threads/58168-RobotLoader-2-3a?p=551535&amp;amp;viewfull=1#post551535 Roboternetz RP6 Forum] und im [http://forum.myluna.de/viewtopic.php?f=3&amp;amp;t=24#p94 LunaAVR Forum]&lt;br /&gt;
&lt;br /&gt;
===RP6v2===&lt;br /&gt;
'''Der RP6v2 ([http://www.conrad.de/ce/de/product/191584/RP6-V2-ROBOTERSYSTEM/ 191584]) ist softwarekompatibel zum RP6.'''&lt;br /&gt;
&lt;br /&gt;
Zur Programmierung des [[RP6]] und des RP6v2 gibt es einen eigenen Artikel: [[RP6 - Programmierung]]&lt;br /&gt;
&lt;br /&gt;
===RP6v2 M256 WiFi Platine===&lt;br /&gt;
&lt;br /&gt;
====Dokumentation====&lt;br /&gt;
Die Dokumentation (Anleitung der RP6v2 M256 WiFi und des WiFi-Moduls RN-171 WiFly) befindet sich [http://www.arexx.com/rp6/html/de/soft_doc_rp6m256.htm hier].&lt;br /&gt;
&lt;br /&gt;
=====Manuals=====&lt;br /&gt;
=====Schematics=====&lt;br /&gt;
=====Datasheets=====&lt;br /&gt;
&lt;br /&gt;
====Demo-Programmme====&lt;br /&gt;
Die RP6v2 M256 WiFi Demo Programme sind [http://www.arexx.com/rp6/html/de/soft_doc_rp6m256.htm hier] zu finden.&lt;br /&gt;
&lt;br /&gt;
=====Bug-Report=====&lt;br /&gt;
In [http://www.roboternetz.de/community/threads/64362-Programmstart-mit-Hindernissen diesem Thread] des Roboternetz-Forums geht es um eine Fehlfunktion der Programme ''Example_09_Move'' und ''Example_10_Move2'' für die RP6v2 M256 WiFi. Diese Demos werden nicht korrekt ausgeführt, wenn sie über WLAN gestartet werden. Sie funktionieren jedoch normal, wenn sie mit dem START/STOP-Button der RP6v2 Base gestartet werden.&lt;br /&gt;
&lt;br /&gt;
Dieses Fehlverhalten der beiden Demos (aus [http://www.arexx.com/rp6/downloads/RP6Examples_20120725f.zip Version 1.8 der RP6 Examples vom 25.07.2012]) kann durch Einfügen der Zeilen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	I2CTWI_transmitByte(0, 0);&lt;br /&gt;
	mSleep(200);&lt;br /&gt;
	I2CTWI_transmitByte(0, 0);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
... in ''Example_09_Move'' ab Zeile 129 und in ''Example_10_Move2'' ab Zeile 699 abgestellt werden.&lt;br /&gt;
&lt;br /&gt;
====Library====&lt;br /&gt;
Die Library für die RP6v2 M256 WiFi besteht aus folgenden 21 Dateien:&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |Library&lt;br /&gt;
 |Datei&lt;br /&gt;
 |Funktion&lt;br /&gt;
 |-&lt;br /&gt;
 |RP6M256&lt;br /&gt;
 |RP6M256.h&lt;br /&gt;
 |RP6M256 Hardware-Konfiguration&lt;br /&gt;
 |-&lt;br /&gt;
 |RP6M256&lt;br /&gt;
 |RP6M256Lib.h&lt;br /&gt;
 |RP6M256 Library Header&lt;br /&gt;
 |-&lt;br /&gt;
 |RP6M256&lt;br /&gt;
 |RP6M256Lib.c&lt;br /&gt;
 |RP6M256 Library&lt;br /&gt;
 |-&lt;br /&gt;
 |RP6M256uart&lt;br /&gt;
 |RP6M256uart.h&lt;br /&gt;
 |RS232 Funktionen Header&lt;br /&gt;
 |-&lt;br /&gt;
 |RP6M256uart&lt;br /&gt;
 |RP6M256uart.c&lt;br /&gt;
 |RS232 Funktionen&lt;br /&gt;
 |-&lt;br /&gt;
 |RP6M256_I2CMaster&lt;br /&gt;
 |RP6M256_I2CMasterLib.h&lt;br /&gt;
 |I2C Master Library Header&lt;br /&gt;
 |-&lt;br /&gt;
 |RP6M256_I2CMaster&lt;br /&gt;
 |RP6M256_I2CMasterLib.c&lt;br /&gt;
 |I2C Master Library&lt;br /&gt;
 |-&lt;br /&gt;
 |RP6M256_WIFI&lt;br /&gt;
 |RP6M256_WIFIlib.h&lt;br /&gt;
 |WIFI Library Header&lt;br /&gt;
 |-&lt;br /&gt;
 |RP6M256_WIFI&lt;br /&gt;
 |RP6M256_WIFIlib.c&lt;br /&gt;
 |WIFI Library&lt;br /&gt;
 |-&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |-&lt;br /&gt;
 |SDC&lt;br /&gt;
 |byteordering.h&lt;br /&gt;
 |Byte-order handling header&lt;br /&gt;
 |-&lt;br /&gt;
 |SDC&lt;br /&gt;
 |byteordering.c&lt;br /&gt;
 |Byte-order handling implementation&lt;br /&gt;
 |-&lt;br /&gt;
 |SDC&lt;br /&gt;
 |fat_config.h&lt;br /&gt;
 |FAT configuration&lt;br /&gt;
 |-&lt;br /&gt;
 |SDC&lt;br /&gt;
 |fat.h&lt;br /&gt;
 |FAT header&lt;br /&gt;
 |-&lt;br /&gt;
 |SDC&lt;br /&gt;
 |fat.c&lt;br /&gt;
 |FAT implementation&lt;br /&gt;
 |-&lt;br /&gt;
 |SDC&lt;br /&gt;
 |partition_config.h&lt;br /&gt;
 |Partition configuration&lt;br /&gt;
 |-&lt;br /&gt;
 |SDC&lt;br /&gt;
 |partition.h&lt;br /&gt;
 |Partition table header&lt;br /&gt;
 |-&lt;br /&gt;
 |SDC&lt;br /&gt;
 |partition.c&lt;br /&gt;
 |Partition table implementation&lt;br /&gt;
 |-&lt;br /&gt;
 |SDC&lt;br /&gt;
 |sd-reader_config.h&lt;br /&gt;
 |Common sd-reader configuration (all modules)&lt;br /&gt;
 |-&lt;br /&gt;
 |SDC&lt;br /&gt;
 |sd_raw_config.h&lt;br /&gt;
 |MMC/SD support configuration&lt;br /&gt;
 |-&lt;br /&gt;
 |SDC&lt;br /&gt;
 |sd_raw.h&lt;br /&gt;
 |MMC/SD/SDHC raw access header&lt;br /&gt;
 |-&lt;br /&gt;
 |SDC&lt;br /&gt;
 |sd_raw.c&lt;br /&gt;
 |MMC/SD/SDHC raw access implementation&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=====Versionen=====&lt;br /&gt;
Hier eine Tabelle der (mir) bekannten Library Versionen der RP6v2 M256 WiFi:&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |ZIP-Datum&lt;br /&gt;
 |VERSION_&lt;br /&gt;
 |RP6M256Library&lt;br /&gt;
 |RP6LIB_VERSION&lt;br /&gt;
 |RP6M256.h&lt;br /&gt;
 |RP6M256Lib&lt;br /&gt;
 |WifiLib&lt;br /&gt;
 |UartLib&lt;br /&gt;
 |I2CMasterLib&lt;br /&gt;
 |SDCLib **&lt;br /&gt;
 |-&lt;br /&gt;
 |24.02.2012&lt;br /&gt;
 |1.7&lt;br /&gt;
 |1.0_24.02.12&lt;br /&gt;
 |16&lt;br /&gt;
 |1.0_24.02.12&lt;br /&gt;
 |1.0_24.02.12&lt;br /&gt;
 |1.0_24.02.12&lt;br /&gt;
 |1.0_24.02.12&lt;br /&gt;
 |(1.0_24.02.12)&lt;br /&gt;
 |?&lt;br /&gt;
 |-&lt;br /&gt;
 |16.07.2012&lt;br /&gt;
 |[http://www.arexx.com/rp6/downloads/RP6Examples_20120716.zip 1.7] *&lt;br /&gt;
 |1.1_16.07.12&lt;br /&gt;
 |16&lt;br /&gt;
 |1.1_16.07.12&lt;br /&gt;
 |1.1_16.07.12&lt;br /&gt;
 |1.1_16.07.12&lt;br /&gt;
 |1.1_16.07.12&lt;br /&gt;
 |(1.0_24.02.12)&lt;br /&gt;
 |(2006-2011)&lt;br /&gt;
 |-&lt;br /&gt;
 |25.07.2012&lt;br /&gt;
 |[http://www.arexx.com/rp6/downloads/RP6Examples_20120725.zip 1.8]&lt;br /&gt;
 |1.1_16.07.12&lt;br /&gt;
 |16&lt;br /&gt;
 |1.1_16.07.12&lt;br /&gt;
 |1.1_16.07.12&lt;br /&gt;
 |1.1_16.07.12&lt;br /&gt;
 |1.1_16.07.12&lt;br /&gt;
 |(1.0_24.02.12)&lt;br /&gt;
 |(2006-2011)&lt;br /&gt;
 |-&lt;br /&gt;
 |25.07.2012 ²&lt;br /&gt;
 |[http://www.arexx.com/rp6/downloads/RP6Examples_20120725f.zip 1.8]&lt;br /&gt;
 |1.1_16.07.12&lt;br /&gt;
 |16&lt;br /&gt;
 |1.1_16.07.12&lt;br /&gt;
 |1.1_16.07.12&lt;br /&gt;
 |1.1_16.07.12&lt;br /&gt;
 |1.1_16.07.12&lt;br /&gt;
 |(1.0_24.02.12)&lt;br /&gt;
 |(2006-2011)&lt;br /&gt;
|}&lt;br /&gt;
'''Zu *:''' Ab der Version 1.7 sind auch die Libraries und Examples der RP6v2 Base und CONTROL M32 enthalten! Ältere Versionen dieser Libraries und Examples bis Version 1.5 findet ihr [[RP6_-_Programmierung#Versionen|hier]]!&lt;br /&gt;
&lt;br /&gt;
'''Zu **:''' Die SDC Library ist eine Open Source Bibliothek für den Zugriff auf SD-Karten. Sie steht unter der GNU General Public License version 2. Geschrieben wurde sie von Roland Riegel; sein [http://www.roland-riegel.de/sd-reader/index.html Projekt] könnt ihr im Internet verfolgen. Eventuelle Updates werden dort auch veröffentlicht.&lt;br /&gt;
Die Projektseiten sind auch im Verzeichnis ...\RP6Lib\RP6control_M256_WIFI\sdc\doc\html\ der RP6Examples zu finden. Ihr könnt in dem Verzeichnis die Datei &amp;quot;index.html&amp;quot; starten, um sie anzuzeigen.&lt;br /&gt;
&lt;br /&gt;
'''Zu ²:''' Die Datei heißt RP6Examples_20120725'''f'''.zip. Mir ist nicht bekannt, ob ein Unterschied zur RP6Examples_20120725.zip besteht.&lt;br /&gt;
&lt;br /&gt;
In der 1. Spalte findet ihr das Datum der RP6Examples.zip Datei, in der die Library enthalten ist. Die 2. Spalte nennt die Version, die im Dateinamen der VERSION_x.x.txt Datei als x.x vorkommt. In der 3. Spalte steht die Versionsangabe der RP6M256Library laut Angabe in der VERSION_x.x.txt Datei.&lt;br /&gt;
&lt;br /&gt;
In der 4. Spalte gebe ich den Wert der Konstante RP6LIB_VERSION an. Es gibt sie ab den RP6v2 Base und CONTROL M32 Examples vom 16.10.2007. In den Spalten 5 bis 10 führe ich nacheinander die Versionsnummern und ggf. das in der Datei genannte Datum der Header-Datei/Library an: RP6M256.h, RP6M256Lib, WifiLib, UartLib, I2CMasterLib, SDCLib.&lt;br /&gt;
&lt;br /&gt;
=====RP6M256=====&lt;br /&gt;
======Bug-Report======&lt;br /&gt;
======Konfiguration======&lt;br /&gt;
======Port-Verwendung======&lt;br /&gt;
Die Verwendung der Ports des RP6v2 M256 WiFi Microcontrollers wird festgelegt in der Header-Datei &amp;quot;RP6M256.h&amp;quot;. In dieser Datei wird auch noch Folgendes aufgeführt:&lt;br /&gt;
* Quarzfrequenz (F_CPU) &lt;br /&gt;
* True/false Definition &lt;br /&gt;
* Verschiedene Macros &lt;br /&gt;
* Baudraten und Baudraten-Tabelle &lt;br /&gt;
&lt;br /&gt;
Hier eine Tabelle mit den Port-Definitionen für die RP6v2 M256 WiFi:&lt;br /&gt;
 Erklärung der Spalten:&lt;br /&gt;
 Port        -&amp;gt; Atmel Portpin Bezeichnung&lt;br /&gt;
 Name        -&amp;gt; Atmel Funktionsbezeichnung&lt;br /&gt;
 In/Out      -&amp;gt; Eingang (In) oder Ausgang (Out)&lt;br /&gt;
 Pullup      -&amp;gt; Falls Eingang: Pullup ein- (1) oder ausgeschaltet (0)&lt;br /&gt;
 Wert        -&amp;gt; Falls Ausgang: Logikpegel high (1) oder low (0)&lt;br /&gt;
 Funktion    -&amp;gt; Schnittstellenfunktion&lt;br /&gt;
 Bezeichnung -&amp;gt; Portpin Bezeichnung der Library&lt;br /&gt;
 Stecker     -&amp;gt; Portpin verfügbar an STECKER: Pin&lt;br /&gt;
 Anmerkungen -&amp;gt; Kommentare (ADC_xx: ADC-Kanal Bezeichnung)&lt;br /&gt;
&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |Port&lt;br /&gt;
 |Name&lt;br /&gt;
 |In/Out&lt;br /&gt;
 |Pullup&lt;br /&gt;
 |Wert&lt;br /&gt;
 |Funktion&lt;br /&gt;
 |Bezeichnung&lt;br /&gt;
 |Stecker&lt;br /&gt;
 |Anmerkungen&lt;br /&gt;
 |-&lt;br /&gt;
 |PA0&lt;br /&gt;
 |AD0&lt;br /&gt;
 |Out&lt;br /&gt;
 |&lt;br /&gt;
 |0&lt;br /&gt;
 |&lt;br /&gt;
 |DISP_D0&lt;br /&gt;
 |DISPIO: 7&lt;br /&gt;
 |Display D0&lt;br /&gt;
 |-&lt;br /&gt;
 |PA1&lt;br /&gt;
 |AD1&lt;br /&gt;
 |Out&lt;br /&gt;
 |&lt;br /&gt;
 |0&lt;br /&gt;
 |&lt;br /&gt;
 |DISP_D1&lt;br /&gt;
 |DISPIO: 8&lt;br /&gt;
 |Display D1 &lt;br /&gt;
 |-&lt;br /&gt;
 |PA2&lt;br /&gt;
 |AD2&lt;br /&gt;
 |Out&lt;br /&gt;
 |&lt;br /&gt;
 |0&lt;br /&gt;
 |&lt;br /&gt;
 |DISP_D2&lt;br /&gt;
 |DISPIO: 9&lt;br /&gt;
 |Display D2 &lt;br /&gt;
 |-&lt;br /&gt;
 |PA3&lt;br /&gt;
 |AD3&lt;br /&gt;
 |Out&lt;br /&gt;
 |&lt;br /&gt;
 |0&lt;br /&gt;
 |&lt;br /&gt;
 |DISP_D3&lt;br /&gt;
 |DISPIO: 10&lt;br /&gt;
 |Display D3&lt;br /&gt;
 |-&lt;br /&gt;
 |PA4&lt;br /&gt;
 |AD4&lt;br /&gt;
 |Out&lt;br /&gt;
 |&lt;br /&gt;
 |0&lt;br /&gt;
 |&lt;br /&gt;
 |DISP_D4&lt;br /&gt;
 |DISPIO: 11&lt;br /&gt;
 |Display D4&lt;br /&gt;
 |-&lt;br /&gt;
 |PA5&lt;br /&gt;
 |AD5&lt;br /&gt;
 |Out&lt;br /&gt;
 |&lt;br /&gt;
 |0&lt;br /&gt;
 |&lt;br /&gt;
 |DISP_D5&lt;br /&gt;
 |DISPIO: 12&lt;br /&gt;
 |Display D5&lt;br /&gt;
 |-&lt;br /&gt;
 |PA6&lt;br /&gt;
 |AD6&lt;br /&gt;
 |Out&lt;br /&gt;
 |&lt;br /&gt;
 |0&lt;br /&gt;
 |&lt;br /&gt;
 |DISP_D6&lt;br /&gt;
 |DISPIO: 13&lt;br /&gt;
 |Display D6&lt;br /&gt;
 |-&lt;br /&gt;
 |PA7&lt;br /&gt;
 |AD7&lt;br /&gt;
 |Out&lt;br /&gt;
 |&lt;br /&gt;
 |0&lt;br /&gt;
 |&lt;br /&gt;
 |DISP_D7&lt;br /&gt;
 |DISPIO: 14&lt;br /&gt;
 |Display D7&lt;br /&gt;
 |-&lt;br /&gt;
 |PB0&lt;br /&gt;
 |SS/PCI0&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |SPI_SS *&lt;br /&gt;
 |&lt;br /&gt;
 |SDC Output DAT3 / CS&lt;br /&gt;
 |-&lt;br /&gt;
 |PB1&lt;br /&gt;
 |SCK/PCI1&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |ISP&lt;br /&gt;
 |SPI_SCK *&lt;br /&gt;
 |ISP: 3&lt;br /&gt;
 |SDC Output CLK&lt;br /&gt;
 |-&lt;br /&gt;
 |PB2&lt;br /&gt;
 |MOSI/PCI2&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |ISP&lt;br /&gt;
 |SPI_MOSI *&lt;br /&gt;
 |ISP: 4&lt;br /&gt;
 |SDC Output CMD / DI&lt;br /&gt;
 |-&lt;br /&gt;
 |PB3&lt;br /&gt;
 |MISO/PCI3&lt;br /&gt;
 |In&lt;br /&gt;
 |0&lt;br /&gt;
 |&lt;br /&gt;
 |ISP&lt;br /&gt;
 |SPI_MISO ***&lt;br /&gt;
 |ISP: 1&lt;br /&gt;
 |SDC Input DAT0 / DO&lt;br /&gt;
 |-&lt;br /&gt;
 |PB4&lt;br /&gt;
 |OC2A/PCI4&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |OC2A_PI4&lt;br /&gt;
 |PWM23: 5&lt;br /&gt;
 |frei&lt;br /&gt;
 |-&lt;br /&gt;
 |PB5&lt;br /&gt;
 |OC1A/PCI5&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |OC1A_PI5&lt;br /&gt;
 |PWM01: 7&lt;br /&gt;
 |frei&lt;br /&gt;
 |-&lt;br /&gt;
 |PB6&lt;br /&gt;
 |OC1B/PCI6&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |OC1B_PI6&lt;br /&gt;
 |PWM01: 9&lt;br /&gt;
 |frei&lt;br /&gt;
 |-&lt;br /&gt;
 |PB7&lt;br /&gt;
 |OC0A/OC1C/PCI7&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |OC0A_OCM_PI7&lt;br /&gt;
 |PWM01: 4&lt;br /&gt;
 |frei&lt;br /&gt;
 |-&lt;br /&gt;
 |PC0&lt;br /&gt;
 |A8&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_PC0&lt;br /&gt;
 |PC01: 2&lt;br /&gt;
 |XMEM A8, frei&lt;br /&gt;
 |-&lt;br /&gt;
 |PC1&lt;br /&gt;
 |A9&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_PC1&lt;br /&gt;
 |PC01: 1&lt;br /&gt;
 |XMEM A9, frei&lt;br /&gt;
 |-&lt;br /&gt;
 |PC2&lt;br /&gt;
 |A10&lt;br /&gt;
 |Out&lt;br /&gt;
 |&lt;br /&gt;
 |0&lt;br /&gt;
 |&lt;br /&gt;
 |SLED1&lt;br /&gt;
 |&lt;br /&gt;
 |Status LED SL1&lt;br /&gt;
 |-&lt;br /&gt;
 |PC3&lt;br /&gt;
 |A11&lt;br /&gt;
 |Out&lt;br /&gt;
 |&lt;br /&gt;
 |0&lt;br /&gt;
 |&lt;br /&gt;
 |SLED2&lt;br /&gt;
 |&lt;br /&gt;
 |Status LED SL2&lt;br /&gt;
 |-&lt;br /&gt;
 |PC4&lt;br /&gt;
 |A12&lt;br /&gt;
 |Out&lt;br /&gt;
 |&lt;br /&gt;
 |0&lt;br /&gt;
 |&lt;br /&gt;
 |SLED3&lt;br /&gt;
 |&lt;br /&gt;
 |Status LED SL3&lt;br /&gt;
 |-&lt;br /&gt;
 |PC5&lt;br /&gt;
 |A13&lt;br /&gt;
 |Out&lt;br /&gt;
 |&lt;br /&gt;
 |0&lt;br /&gt;
 |&lt;br /&gt;
 |SLED4&lt;br /&gt;
 |&lt;br /&gt;
 |Status LED SL4&lt;br /&gt;
 |-&lt;br /&gt;
 |PC6&lt;br /&gt;
 |A14&lt;br /&gt;
 |Out&lt;br /&gt;
 |&lt;br /&gt;
 |0&lt;br /&gt;
 |&lt;br /&gt;
 |WLAN_GPIO14_OUT *&lt;br /&gt;
 |&lt;br /&gt;
 |WLAN Output GPIO14&lt;br /&gt;
 |-&lt;br /&gt;
 |PC7&lt;br /&gt;
 |A15&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |WLAN_GPIO8_IN **&lt;br /&gt;
 |&lt;br /&gt;
 |WLAN Input GPIO8&lt;br /&gt;
 |-&lt;br /&gt;
 |PD0&lt;br /&gt;
 |SCL/INT0&lt;br /&gt;
 |In ²&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |I2C-Bus&lt;br /&gt;
 |SCL&lt;br /&gt;
 |XBUS: 10&lt;br /&gt;
 |XBUS SCL&lt;br /&gt;
 |-&lt;br /&gt;
 |PD1&lt;br /&gt;
 |SDA/INT1&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |I2C-Bus&lt;br /&gt;
 |SDA&lt;br /&gt;
 |XBUS: 12&lt;br /&gt;
 |XBUS SDA&lt;br /&gt;
 |-&lt;br /&gt;
 |PD2&lt;br /&gt;
 |RXD1/INT2&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |UART1&lt;br /&gt;
 |RXD1&lt;br /&gt;
 |USPI15: 8&lt;br /&gt;
 |USART1 RX, frei&lt;br /&gt;
 |-&lt;br /&gt;
 |PD3&lt;br /&gt;
 |TXD1/INT3&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |UART1&lt;br /&gt;
 |TXD1&lt;br /&gt;
 |USPI15: 6&lt;br /&gt;
 |USART1 TX, frei&lt;br /&gt;
 |-&lt;br /&gt;
 |PD4&lt;br /&gt;
 |ICP1&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_PD4_ICP1&lt;br /&gt;
 |PWM01: 1&lt;br /&gt;
 |frei&lt;br /&gt;
 |-&lt;br /&gt;
 |PD5&lt;br /&gt;
 |XCK1&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_PD5_XCK1&lt;br /&gt;
 |USPI15: 4&lt;br /&gt;
 |frei&lt;br /&gt;
 |-&lt;br /&gt;
 |PD6&lt;br /&gt;
 |T1&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_PD6_T1&lt;br /&gt;
 |PWM01: 3&lt;br /&gt;
 |frei&lt;br /&gt;
 |-&lt;br /&gt;
 |PD7&lt;br /&gt;
 |T0&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_PD7_T2&lt;br /&gt;
 |PWM01: 6&lt;br /&gt;
 |frei&lt;br /&gt;
 |-&lt;br /&gt;
 |PE0&lt;br /&gt;
 |RXD0/PCI8&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |UART0&lt;br /&gt;
 |RXD0&lt;br /&gt;
 |PROGU: 2&lt;br /&gt;
 |USART RX&lt;br /&gt;
 |-&lt;br /&gt;
 |PE1&lt;br /&gt;
 |TXD0&lt;br /&gt;
 |Out&lt;br /&gt;
 |&lt;br /&gt;
 |0&lt;br /&gt;
 |UART0&lt;br /&gt;
 |TXD0&lt;br /&gt;
 |PROGU: 3&lt;br /&gt;
 |USART TX&lt;br /&gt;
 |-&lt;br /&gt;
 |PE2&lt;br /&gt;
 |XCK0/AIN0&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_PE2_XCK0_AIN0&lt;br /&gt;
 |ADCIO2: 8&lt;br /&gt;
 |frei&lt;br /&gt;
 |-&lt;br /&gt;
 |PE3&lt;br /&gt;
 |OC3A/AIN1&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_PE3_OC3A_AIN1&lt;br /&gt;
 |ADCIO2: 4&lt;br /&gt;
 |frei&lt;br /&gt;
 |-&lt;br /&gt;
 |PE4&lt;br /&gt;
 |OC3B/INT4&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_PE4_OC3B_I4&lt;br /&gt;
 |PWM23: 9&lt;br /&gt;
 |frei&lt;br /&gt;
 |-&lt;br /&gt;
 |PE5&lt;br /&gt;
 |OC3C/INT5&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_PE5_OC3C_I5&lt;br /&gt;
 |PWM23: 4&lt;br /&gt;
 |frei&lt;br /&gt;
 |-&lt;br /&gt;
 |PE6&lt;br /&gt;
 |T3/INT6&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_PE6_T3_I6&lt;br /&gt;
 |PWM23: 3&lt;br /&gt;
 |frei&lt;br /&gt;
 |-&lt;br /&gt;
 |PE7&lt;br /&gt;
 |CLKO/ICP3/INT7&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_PE7_ICP3_I7&lt;br /&gt;
 |PWM23: 1&lt;br /&gt;
 |frei&lt;br /&gt;
 |-&lt;br /&gt;
 |PF0&lt;br /&gt;
 |ADC0&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_ADC0&lt;br /&gt;
 |ADCIO1: 3&lt;br /&gt;
 |ADC_0 (frei)&lt;br /&gt;
 |-&lt;br /&gt;
 |PF1&lt;br /&gt;
 |ADC1&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_ADC1&lt;br /&gt;
 |ADCIO1: 1&lt;br /&gt;
 |ADC_1 (frei)&lt;br /&gt;
 |-&lt;br /&gt;
 |PF2&lt;br /&gt;
 |ADC2&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_ADC2&lt;br /&gt;
 |ADCIO1: 5&lt;br /&gt;
 |ADC_2 (frei)&lt;br /&gt;
 |-&lt;br /&gt;
 |PF3&lt;br /&gt;
 |ADC3&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_ADC3&lt;br /&gt;
 |ADCIO1: 7&lt;br /&gt;
 |ADC_3 (frei)&lt;br /&gt;
 |-&lt;br /&gt;
 |PF4&lt;br /&gt;
 |ADC4/TCK&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |JTAG&lt;br /&gt;
 |IO_ADC4&lt;br /&gt;
 |ADCIO1: 9&lt;br /&gt;
 |ADC_4 (frei)&lt;br /&gt;
 |-&lt;br /&gt;
 |PF5&lt;br /&gt;
 |ADC5/TMS&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |JTAG&lt;br /&gt;
 |IO_ADC5&lt;br /&gt;
 |ADCIO1: 11&lt;br /&gt;
 |ADC_5 (frei)&lt;br /&gt;
 |-&lt;br /&gt;
 |PF6&lt;br /&gt;
 |ADC6/TDO&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |JTAG&lt;br /&gt;
 |IO_ADC6&lt;br /&gt;
 |ADCIO1: 12&lt;br /&gt;
 |ADC_6 (frei)&lt;br /&gt;
 |-&lt;br /&gt;
 |PF7&lt;br /&gt;
 |ADC7/TDI&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |JTAG&lt;br /&gt;
 |IO_ADC7&lt;br /&gt;
 |ADCIO1: 13&lt;br /&gt;
 |ADC_7 (frei)&lt;br /&gt;
 |-&lt;br /&gt;
 |PG0&lt;br /&gt;
 |WR&lt;br /&gt;
 |Out&lt;br /&gt;
 |&lt;br /&gt;
 |0&lt;br /&gt;
 |&lt;br /&gt;
 |DISP_WR&lt;br /&gt;
 |DISPIO: 5&lt;br /&gt;
 |Display WR&lt;br /&gt;
 |-&lt;br /&gt;
 |PG1&lt;br /&gt;
 |RD&lt;br /&gt;
 |Out&lt;br /&gt;
 |&lt;br /&gt;
 |0&lt;br /&gt;
 |&lt;br /&gt;
 |DISP_EN_RD&lt;br /&gt;
 |DISPIO: 6&lt;br /&gt;
 |Display RD&lt;br /&gt;
 |-&lt;br /&gt;
 |PG2&lt;br /&gt;
 |ALE&lt;br /&gt;
 |Out&lt;br /&gt;
 |&lt;br /&gt;
 |0&lt;br /&gt;
 |&lt;br /&gt;
 |DISP_RS_ALE&lt;br /&gt;
 |DISPIO: 4&lt;br /&gt;
 |Display ALE&lt;br /&gt;
 |-&lt;br /&gt;
 |PG3&lt;br /&gt;
 |TOSC2&lt;br /&gt;
 |In&lt;br /&gt;
 |1 &amp;quot;&amp;quot;&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |BUTTON_SW2&lt;br /&gt;
 |&lt;br /&gt;
 |Taster SW2&lt;br /&gt;
 |-&lt;br /&gt;
 |PG4&lt;br /&gt;
 |TOSC1&lt;br /&gt;
 |In&lt;br /&gt;
 |1 &amp;quot;&amp;quot;&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |BUTTON_SW1&lt;br /&gt;
 |&lt;br /&gt;
 |Taster SW1&lt;br /&gt;
 |-&lt;br /&gt;
 |PG5&lt;br /&gt;
 |OC0B&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_OC0B&lt;br /&gt;
 |PWM01: 5&lt;br /&gt;
 |frei&lt;br /&gt;
 |-&lt;br /&gt;
 |PH0&lt;br /&gt;
 |RXD2&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |UART2&lt;br /&gt;
 |RXD2&lt;br /&gt;
 |USPI24: 8&lt;br /&gt;
 |USART2 RX, frei&lt;br /&gt;
 |-&lt;br /&gt;
 |PH1&lt;br /&gt;
 |TXD2&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |UART2&lt;br /&gt;
 |TXD2&lt;br /&gt;
 |USPI24: 6&lt;br /&gt;
 |USART2 TX, frei&lt;br /&gt;
 |-&lt;br /&gt;
 |PH2&lt;br /&gt;
 |XCK2&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_PH2_XCK2&lt;br /&gt;
 |USPI24: 4&lt;br /&gt;
 |frei&lt;br /&gt;
 |-&lt;br /&gt;
 |PH3&lt;br /&gt;
 |OC4A&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_PH3_OC4A&lt;br /&gt;
 |USPI24: 9&lt;br /&gt;
 |frei&lt;br /&gt;
 |-&lt;br /&gt;
 |PH4&lt;br /&gt;
 |OC4B&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_PH4_OC4B&lt;br /&gt;
 |USPI24: 7&lt;br /&gt;
 |frei&lt;br /&gt;
 |-&lt;br /&gt;
 |PH5&lt;br /&gt;
 |OC4C&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_PH5_OC4C&lt;br /&gt;
 |USPI24: 5&lt;br /&gt;
 |frei&lt;br /&gt;
 |-&lt;br /&gt;
 |PH6&lt;br /&gt;
 |OC2B&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_PH6_OC2B&lt;br /&gt;
 |PWM23: 7&lt;br /&gt;
 |frei&lt;br /&gt;
 |-&lt;br /&gt;
 |PH7&lt;br /&gt;
 |T4&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_PH7_T4&lt;br /&gt;
 |USPI24: 3&lt;br /&gt;
 |frei&lt;br /&gt;
 |-&lt;br /&gt;
 |PJ0&lt;br /&gt;
 |RXD3/PCI9&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |UART3&lt;br /&gt;
 |WLAN_RXD3 **&lt;br /&gt;
 |&lt;br /&gt;
 |WLAN USART RX&lt;br /&gt;
 |-&lt;br /&gt;
 |PJ1&lt;br /&gt;
 |TXD3/PCI10&lt;br /&gt;
 |Out&lt;br /&gt;
 |&lt;br /&gt;
 |0&lt;br /&gt;
 |UART3&lt;br /&gt;
 |WLAN_TXD3 *&lt;br /&gt;
 |&lt;br /&gt;
 |WLAN USART TX&lt;br /&gt;
 |-&lt;br /&gt;
 |PJ2&lt;br /&gt;
 |XCK3/PCI11&lt;br /&gt;
 |Out&lt;br /&gt;
 |&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |WLAN_RTS *&lt;br /&gt;
 |&lt;br /&gt;
 |WLAN Output RTS&lt;br /&gt;
 |-&lt;br /&gt;
 |PJ3&lt;br /&gt;
 |PCI12&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |INT1_PI12&lt;br /&gt;
 |XBUS: 8&lt;br /&gt;
 |XBUS INT1&lt;br /&gt;
 |-&lt;br /&gt;
 |PJ4&lt;br /&gt;
 |PCI13&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |INTU_PI13&lt;br /&gt;
 |XBUS: 7&lt;br /&gt;
 |XBUS INTU&lt;br /&gt;
 |-&lt;br /&gt;
 |PJ5&lt;br /&gt;
 |PCI14&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |INT3_PI14&lt;br /&gt;
 |XBUS: 9&lt;br /&gt;
 |XBUS INT3&lt;br /&gt;
 |-&lt;br /&gt;
 |PJ6&lt;br /&gt;
 |PCI15&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |INT2_PI15&lt;br /&gt;
 |XBUS: 11&lt;br /&gt;
 |XBUS INT2&lt;br /&gt;
 |-&lt;br /&gt;
 |PJ7&lt;br /&gt;
 |&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |WLAN_CTS **&lt;br /&gt;
 |&lt;br /&gt;
 |WLAN Input CTS&lt;br /&gt;
 |-&lt;br /&gt;
 |PK0&lt;br /&gt;
 |ADC8/PCI16&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_ADC8_PI16&lt;br /&gt;
 |ADCIO2: 1&lt;br /&gt;
 |ADC_8 (frei)&lt;br /&gt;
 |-&lt;br /&gt;
 |PK1&lt;br /&gt;
 |ADC9/PCI17&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_ADC9_PI17&lt;br /&gt;
 |ADCIO2: 3&lt;br /&gt;
 |ADC_9 (frei)&lt;br /&gt;
 |-&lt;br /&gt;
 |PK2&lt;br /&gt;
 |ADC10/PCI18&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_ADC10_PI18&lt;br /&gt;
 |ADCIO2: 5&lt;br /&gt;
 |ADC_10 (frei)&lt;br /&gt;
 |-&lt;br /&gt;
 |PK3&lt;br /&gt;
 |ADC11/PCI19&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_ADC11_PI19&lt;br /&gt;
 |ADCIO2: 7&lt;br /&gt;
 |ADC_11 (frei)&lt;br /&gt;
 |-&lt;br /&gt;
 |PK4&lt;br /&gt;
 |ADC12/PCI20&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_ADC12_PI20&lt;br /&gt;
 |ADCIO2: 9&lt;br /&gt;
 |ADC_12 (frei)&lt;br /&gt;
 |-&lt;br /&gt;
 |PK5&lt;br /&gt;
 |ADC13/PCI21&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_ADC13_PI21&lt;br /&gt;
 |PWM01: 8&lt;br /&gt;
 |ADC_13 (frei)&lt;br /&gt;
 |-&lt;br /&gt;
 |PK6&lt;br /&gt;
 |ADC14/PCI22&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_ADC14_PI22&lt;br /&gt;
 |PWM23: 8&lt;br /&gt;
 |ADC_14 (frei)&lt;br /&gt;
 |-&lt;br /&gt;
 |PK7&lt;br /&gt;
 |ADC15/PCI23&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_ADC15_PI23&lt;br /&gt;
 |PWM23: 6&lt;br /&gt;
 |ADC_15 (frei)&lt;br /&gt;
 |-&lt;br /&gt;
 |PL0&lt;br /&gt;
 |ICP4&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_PL0_ICP4&lt;br /&gt;
 |USPI24: 1&lt;br /&gt;
 |frei&lt;br /&gt;
 |-&lt;br /&gt;
 |PL1&lt;br /&gt;
 |ICP5&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_PL1_ICP5&lt;br /&gt;
 |USPI15: 1&lt;br /&gt;
 |frei&lt;br /&gt;
 |-&lt;br /&gt;
 |PL2&lt;br /&gt;
 |T5&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_PL2_T5&lt;br /&gt;
 |USPI15: 3&lt;br /&gt;
 |frei&lt;br /&gt;
 |-&lt;br /&gt;
 |PL3&lt;br /&gt;
 |OC5A&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_PL3_OC5A&lt;br /&gt;
 |USPI15: 5&lt;br /&gt;
 |frei&lt;br /&gt;
 |-&lt;br /&gt;
 |PL4&lt;br /&gt;
 |OC5B&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_PL4_OC5B&lt;br /&gt;
 |USPI15: 9&lt;br /&gt;
 |frei&lt;br /&gt;
 |-&lt;br /&gt;
 |PL5&lt;br /&gt;
 |OC5C&lt;br /&gt;
 |In&lt;br /&gt;
 |1&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |IO_PL5_OC5C&lt;br /&gt;
 |USPI15: 7&lt;br /&gt;
 |frei&lt;br /&gt;
 |-&lt;br /&gt;
 |PL6&lt;br /&gt;
 |&lt;br /&gt;
 |Out&lt;br /&gt;
 |³&lt;br /&gt;
 |0&lt;br /&gt;
 |&lt;br /&gt;
 |WLAN_WAKE&lt;br /&gt;
 |&lt;br /&gt;
 |WLAN Output WAKE&lt;br /&gt;
 |-&lt;br /&gt;
 |PL7&lt;br /&gt;
 |&lt;br /&gt;
 |Out&lt;br /&gt;
 |²&lt;br /&gt;
 |0&lt;br /&gt;
 |&lt;br /&gt;
 |WLAN_RESET&lt;br /&gt;
 |&lt;br /&gt;
 |WLAN Output RESET&lt;br /&gt;
 |-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
 Zeichen:&lt;br /&gt;
 *    Verbunden mit einem Eingang des I2C-Pegelwandlers NC7WZ16&lt;br /&gt;
 **   Verbunden mit einem Ausgang des I2C-Pegelwandlers NC7WZ16&lt;br /&gt;
 ***  Verbunden mit einem Ausgang des I2C-Pegelwandlers NC7WZ16&lt;br /&gt;
      über Widerstand 680 Ohm (R7)&lt;br /&gt;
 &lt;br /&gt;
 ²    Verbunden mit Pulldown 10 kOhm (R22) und MOSFET Gate (Q2)&lt;br /&gt;
 ³    Verbunden mit Spannungsteiler 68 / 100 kOhm (R21 / R23)&lt;br /&gt;
 &amp;quot;&amp;quot;   Verbunden mit Pullup-Widerstand 68 kOhm (und Taster nach GND)&lt;br /&gt;
 &lt;br /&gt;
 Kürzel (Spalte Name):&lt;br /&gt;
 PCIx     PCINTx&lt;br /&gt;
 &lt;br /&gt;
 Abkürzungen der IO-Stecker (Spalte Stecker):&lt;br /&gt;
 PWM01    IO_PWM/T0/T1&lt;br /&gt;
 PWM23    IO_PWM/T2/T3&lt;br /&gt;
 USPI15   UART_SPI1/T5&lt;br /&gt;
 USPI24   UART_SPI2/T4&lt;br /&gt;
 ADCIO1   ADC_IO1&lt;br /&gt;
 ADCIO2   ADC_IO2/CMP&lt;br /&gt;
 DISPIO   DISPLAY/IO&lt;br /&gt;
 PC01     PC0/1&lt;br /&gt;
 PROGU    PROG_UART&lt;br /&gt;
&lt;br /&gt;
======Timer-Nutzung======&lt;br /&gt;
&lt;br /&gt;
=====RP6M256uart=====&lt;br /&gt;
=====RP6M256_I2CMaster=====&lt;br /&gt;
=====RP6M256_WIFI=====&lt;br /&gt;
=====SDC=====&lt;br /&gt;
&lt;br /&gt;
====Projekte====&lt;br /&gt;
* Library:&lt;br /&gt;
** [http://www.roboternetz.de/community/threads/58744-RP6-M256-WIFI-Clock-Library RP6 M256 WIFI: Clock Library]&lt;br /&gt;
** [http://www.roboternetz.de/community/threads/58848-RP6-M256-WIFI-DCF77-Library RP6 M256 WIFI: DCF77 Library]&lt;br /&gt;
** [http://www.roboternetz.de/community/threads/66003-Peter-Fleury-s-I2C-Master-Library-f%C3%BCr-RP6 Peter Fleury's I2C Master Library für RP6]&lt;br /&gt;
** [http://www.roboternetz.de/community/threads/66586-RP6v2-Base-CONTROL-M32-M256-WiFi-100%C2%B5s-Stopwatches-Library Library für acht 100µs Stopwatches]&lt;br /&gt;
* Fernbedienung mit dem Browser (Demo):&lt;br /&gt;
** [http://www.roboternetz.de/community/threads/58162-Diskussion-zum-RP6-M256-WIFI-Modul?p=555102&amp;amp;viewfull=1#post555102 LED-Ansteuerung mit dem Browser]&lt;br /&gt;
** [http://www.roboternetz.de/community/threads/58162-Diskussion-zum-RP6-M256-WIFI-Modul?p=555651&amp;amp;viewfull=1#post555651 LEDs setzen und Daten der Browseranforderung anzeigen]&lt;br /&gt;
* I2C-Master für RP6Control M32 und RP6v2 Base (Demos, Library):&lt;br /&gt;
** [http://www.rn-wissen.de/index.php/RP6Control_M32:_I2C-Slave RP6Control M32 I2C-Slave]&lt;br /&gt;
* MultiIO Projekt (Demos, Library):&lt;br /&gt;
** [[RP6 Multi IO Projekt - Software#RP6_M256_WIFI|RP6 Multi IO Projekt - Software RP6 M256 WIFI]]&lt;br /&gt;
* ArduIO Projekt (Demos, Library):&lt;br /&gt;
** [http://rn-wissen.de/wiki/index.php/RP6_ArduIO_-_Software ArduIO Projekt - Software]&lt;br /&gt;
* Fernbedienung mit einer Android App (Demo):&lt;br /&gt;
** [http://www.roboternetz.de/community/threads/65626-RP6-WIFI-und-Wireless-IMU-%28f%C3%BCr-Android%29 RP6 WIFI und Wireless IMU (für Android)]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===RP6 Sensor Board===&lt;br /&gt;
&lt;br /&gt;
'''Die Beschreibung zur Programmierung des RP6 Sensor Boards wurde ausgelagert in einen eigenen [[RP6_Sensor_Board_und_Xtra_Module#RP6_Sensor_Board_3|Artikel]]!'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Erfahrungsberichte==&lt;br /&gt;
&lt;br /&gt;
...in Arbeit...(kann aber gerne ergänzt werden)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Siehe auch==&lt;br /&gt;
* [[RP6]]&lt;br /&gt;
* [[RP6 - Programmierung]]&lt;br /&gt;
* [[RP6 Sensor Board und Xtra Module]]&lt;br /&gt;
* [[RP6 Kamera - Mitmach-Projekt]]&lt;br /&gt;
* [[RP6v2 I2C-Portexpander]]&lt;br /&gt;
* [[RP6v2 USB-RS232-Adapter]]&lt;br /&gt;
* [[RP6v2 Orientierung]]&lt;br /&gt;
* [[RP6 Multi IO Projekt]]&lt;br /&gt;
* [[RP6 Multi IO Projekt - Software]]&lt;br /&gt;
* [[RP6 ArduIO]]&lt;br /&gt;
* [[RP6 ArduIO - Software]]&lt;br /&gt;
* [[Induktive_Ladestation_f%C3%BCr_den_RP6|Induktive Ladestation für den RP6]]&lt;br /&gt;
* [[IR-bake_f%C3%BCr_den_RP6|IR-bake für den RP6]]&lt;br /&gt;
* [[CCRP5]]&lt;br /&gt;
* [[Wild Thumper]]&lt;br /&gt;
* [[Wild Thumper - Programmierung]]&lt;br /&gt;
* [[Yeti]]&lt;br /&gt;
* [[Asuro]]&lt;br /&gt;
* [[C't-Bot]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Weblinks==&lt;br /&gt;
'''Siehe auch die Weblinks im [http://www.rn-wissen.de/index.php/RP6#Weblinks RP6 Artikel]!'''&lt;br /&gt;
&lt;br /&gt;
* Ankündigung des RP6v2 im [http://www.roboternetz.de/community/threads/56964-NEWS-RP6v2-die-neue-Version-2-des-RP6-Robot-Systems RoboterNETZ] und im [http://www.arexx.com/forum/viewtopic.php?f=19&amp;amp;t=1778 AREXX Support Forum]&lt;br /&gt;
* Ankündigung der RP6v2 M256 WiFi und der Testaktion im [http://www.arexx.com/forum/viewtopic.php?f=19&amp;amp;t=1797 AREXX Support Forum]&lt;br /&gt;
* Beginn der &amp;quot;Testaktion: Kostenlose RP6v2-M256-WIFI Module!&amp;quot; im [http://www.roboternetz.de/community/threads/58161-Kostenlose-RP6-M256-WIFI-Module-für-Testanwender! Roboternetz RP6 Forum]&lt;br /&gt;
* Ende der &amp;quot;Testaktion: Kostenlose RP6v2-M256-WIFI Module!&amp;quot; nach Abstimmung im [http://www.roboternetz.de/community/threads/58389-Wählt-Gewinner-der-RP6v2-M256-WIFI-Module Roboternetz RP6 Forum]&lt;br /&gt;
* Newsartikel zur RP6v2 M256 WiFi im [http://www.roboternetz.de/community/threads/58160-Funk-Erweiterungsmodul-für-den-RP6-und-RP6v2-Gratis-für-Tester! RoboterNETZ]&lt;br /&gt;
* Diskussions-Thread zur RP6v2 M256 WiFi im [http://www.roboternetz.de/community/threads/58162-Diskussion-zum-RP6-M256-WIFI-Modul Roboternetz RP6 Forum]&lt;br /&gt;
* Diskussions-Thread zur RP6v2 M256 WiFi [http://www.roboternetz.de/community/threads/59739-Probleme-mit-M256-WIFI-1-2 mit &amp;quot;altem&amp;quot; Bootloader V1.2]&lt;br /&gt;
&lt;br /&gt;
* [http://www.arexx.com/rp6/downloads/RP6M256_WIFI_BOOTLOADER.zip RP6M256_WIFI_BOOTLOADER]&lt;br /&gt;
* [http://arexx.com/rp6/downloads/RP6M256_baudrate_test.zip RP6v2 M256 WiFi Baudraten Test]&lt;br /&gt;
* [http://www.arexx.com/rp6/downloads/rp6m256_wlan_config_de.txt RP6v2 M256 WiFi Liste mit möglichen Problemlösungen]&lt;br /&gt;
* Kleinserie: [http://www.roboternetz.de/community/threads/59797-Kleinserie-hardware-für-die-M256-WIFI Hardware für die RP6v2 M256 WiFi ('''RP6 Multi IO Projekt''')]&lt;br /&gt;
* Kleinserie: [http://www.roboternetz.de/community/threads/65296-I-O-ADC-und-DAC-Erweiterung-f%C3%BCr-RP6-3-3V-und-5V%21 I/O-, ADC- und DAC Erweiterung für RP6??? 3,3V und 5V!? ('''RP6 ArduIO Projekt''')]&lt;br /&gt;
* JM3 Engeneering: [http://www.jm3-engineering.com/rp6.htm RP6 Roboter Erweiterung]&lt;br /&gt;
* Ankündigung einer Sensorerweiterungsplatine für die RP6v2 M256 WiFi im [http://www.roboternetz.de/community/threads/63595-Neue-Hardware-f%C3%BCr-RP6%28v2%29?p=590129&amp;amp;viewfull=1#post590129 Roboternetz RP6 Forum]&lt;br /&gt;
* Erfahrungsbericht zur Sensorerweiterungsplatine im [http://www.arexx.com/forum/viewtopic.php?f=19&amp;amp;t=2498 AREXX Support Forum] und im [http://www.roboternetz.de/community/threads/64414-RP6-Sensor-Board-Erster-Eindruck Roboternetz RP6 Forum]&lt;br /&gt;
&lt;br /&gt;
* [http://www.rn-wissen.de/index.php/RP6_mit_AVR_Studio RP6 mit AVR Studio]&lt;br /&gt;
&lt;br /&gt;
* [http://www.arexx.com/rp6 AREXX RP6 Startseite]&lt;br /&gt;
* [http://www.arexx.com/forum/viewforum.php?f=19 AREXX Support Forum]&lt;br /&gt;
&lt;br /&gt;
* [http://www.conrad.de/ce/de/product/191584/RP6-V2-ROBOTERSYSTEM RP6v2 bei CONRAD]&lt;br /&gt;
* [http://www.conrad.de/ce/de/product/191550/RP6-MEGA32-ERWEITERUNGSSATZ RP6 CONTROL M32 bei CONRAD]&lt;br /&gt;
* [http://www.conrad.de/ce/de/product/191563/RP6-CC-PRO-MEGA128-ERWEITERUNGSSATZ RP6 CCPRO M128 bei CONRAD]&lt;br /&gt;
* [http://www.conrad.de/ce/de/product/191609/Arexx-RP6-V2-Control-M256-WiFi-Kit-RP6v2-M256-WIFI RP6v2 M256 WiFi bei CONRAD]&lt;br /&gt;
* [http://www.conrad.de/ce/de/product/1082384/Arexx-RP6-Sensor-Board-RP6-JM03-61 RP6 Sensor Board bei CONRAD]&lt;br /&gt;
&lt;br /&gt;
* [http://www.microchip.com/wwwproducts/Devices.aspx?dDocName=en558370 WiFi-Modul RN-171] der RP6v2 M256 WiFi&lt;br /&gt;
* [http://www.arexx.com/rp6/downloads/RP6_M256_WIFI_MANUAL_DE_20120711.zip 1. Bedienungsanleitung] der RP6v2 M256 WiFi&lt;br /&gt;
&lt;br /&gt;
* [http://www.roboternetz.de/phpBB2/viewforum.php?f=49 Roboternetz RP6 Forum]&lt;br /&gt;
* &amp;quot;Geburt&amp;quot; des Wiki im RN-Forum: [http://www.roboternetz.de/community/threads/32793-RP6-Wiki-Artikel RP6-Wiki-Artikel]&lt;br /&gt;
* Roboter RoboPalm RP6: [http://www.ionix.de/doku.php/rp6/start Link]&lt;br /&gt;
&lt;br /&gt;
* [http://www.youtube.com/results?search_query=rp6 RP6 Videos]&lt;br /&gt;
* [http://de-de.facebook.com/pages/Robby-RP6/155118711202285 facebook]&lt;br /&gt;
* Abkündigung des RP6v2 im [https://www.roboternetz.de/community/threads/72730-Ende-des-RP6-Robotersystems-nach-fast-11-1-2-Jahren RoboterNETZ] &lt;br /&gt;
'''Siehe auch die Weblinks im [http://www.rn-wissen.de/index.php/RP6_Sensor_Board_und_Xtra_Module#Weblinks RP6 Sensor Board und Xtra Module Artikel]!'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Kategorie:Robotikeinstieg]]	 &lt;br /&gt;
[[Kategorie:Praxis]]&lt;br /&gt;
&lt;br /&gt;
==Autoren==&lt;br /&gt;
--[http://www.roboternetz.de/community/members/1972-Dirk Dirk] 11:41, 16. Jun 2020 (CET)&lt;/div&gt;</summary>
		<author><name>Dirk NO2</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=RP6&amp;diff=28576</id>
		<title>RP6</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=RP6&amp;diff=28576"/>
				<updated>2022-03-31T09:08:52Z</updated>
		
		<summary type="html">&lt;p&gt;Dirk NO2: /* Graustufen-Boden-Sensor */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Bild:RP6_2.jpg|RP6 Base Roboter|right|500px]]&lt;br /&gt;
==Was bisher geschah==&lt;br /&gt;
Fre, 08. Jun 2007 - Ankündigung des RP6 und der RP6 CONTROL M32&amp;lt;br/&amp;gt;&lt;br /&gt;
Mon, 02. Jul 2007 23:00 - Benachrichtigung der Tester&amp;lt;br/&amp;gt;&lt;br /&gt;
Die, 03. Jul 2007 15:00 - Bereitstellung der Dokumentation&amp;lt;br/&amp;gt;&lt;br /&gt;
Don, 05. Jul 2007 14:30 - Bereitstellung der Schaltungsunterlagen&amp;lt;br/&amp;gt;&lt;br /&gt;
Son, 08. Jul 2007 16:00 - Nachricht über den Versand der RP6&amp;lt;br/&amp;gt;&lt;br /&gt;
Mon, 09. Jul 2007 00:15 - Bereitstellung der Library und der Beispielprogramme&amp;lt;br/&amp;gt;&lt;br /&gt;
Die, 10. Jul 2007 - Eintreffen der RP6 bei den Testern&amp;lt;br/&amp;gt;&lt;br /&gt;
Mon, 16. Jul 2007 - Auslieferungsbeginn des RP6&amp;lt;br/&amp;gt;&lt;br /&gt;
Fre, 24. Apr 2009 - Ankündigung der RP6 CCPRO M128 (Auslieferung schon ab Mitte April 2009)&amp;lt;br/&amp;gt;&lt;br /&gt;
Mon, 27. Feb 2012 - Ankündigung des RP6v2&amp;lt;br/&amp;gt;&lt;br /&gt;
Don, 08. Mär 2012 - Auslieferungsbeginn des RP6v2&amp;lt;br/&amp;gt;&lt;br /&gt;
Sam, 17. Mär 2012 - Ankündigung der RP6v2 M256 WiFi&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Siehe auch &amp;quot;Was bisher geschah&amp;quot; im [http://www.rn-wissen.de/index.php/RP6v2#Was_bisher_geschah RP6v2 Artikel]!'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Allgemein==  &lt;br /&gt;
[[Bild:DSC03448.JPG|thumb|RP6 mit Erweiterungsboard]] [[Bild:RP6_Lieferumfang.jpg|thumb|RP6 im Lieferumfang]]&lt;br /&gt;
Der von Arexx entwickelte RP6 ([http://www.conrad.de/ce/de/product/191524/C-Control-Robot-System-RP6-Robotersystem 191524]) ist ein autonomes Raupenfahrzeug, das nicht nur für Schüler und Studenten zum Einstieg in das Gebiet Robotik sondern auch für Fortgeschrittene Elektroniker und Bastler sehr gut geeignet ist, da das System für selbstentworfene Erweiterungen ausgelegt ist. Der RP6 wird von einem, unter Roboterentwicklern beliebten, AVR Microcontroller von Atmel gesteuert und hat Lichtsensoren in Form von zwei LDRs, 2 Bumper an der Stoßstange, 6 Status LEDs, Sensoren zur Überwachung der Akkuspannung, Drehgeber mit 625 CPR, ein Infrarot Sensor zur Hinderniserkennung und Kommunikation und Motorstromsensoren zur Verfügung. Zudem liegt dem Roboter eine umfangreiche Anleitung, inklusive einem kleinen C-Crashkurs, ein USB-Interface zum Anschluss an den PC und ein USB Kabel bei.&lt;br /&gt;
&lt;br /&gt;
In diesem Artikel geht es um die Grundlagen des RP6. Zur Programmierung des RP6 gibt es eine eigene Seite: [[RP6 - Programmierung]]&lt;br /&gt;
&lt;br /&gt;
==Technische Daten==&lt;br /&gt;
{|  {{Blauetabelle}} &lt;br /&gt;
|'''Mikrocontroller:'''&lt;br /&gt;
|AVR [[ATmega32]]&lt;br /&gt;
|-&lt;br /&gt;
|'''Speicher:'''&lt;br /&gt;
|32 kB [[Flash]]-Speicher, davon 1 kB bereits vom Bootloader belegt&amp;lt;br/&amp;gt;&lt;br /&gt;
2 kB RAM&amp;lt;br/&amp;gt; &lt;br /&gt;
1 kB [[EEPROM]]&lt;br /&gt;
|-&lt;br /&gt;
|'''Programmierung:'''&lt;br /&gt;
|Über AVR-[[Bootloader]], belegt ca. 1 kB des Flash-Speichers&lt;br /&gt;
|-&lt;br /&gt;
|'''Vorhandene Sensoren:'''&lt;br /&gt;
|2 [[Sensorarten#Helligkeit|Lichtsensoren (LDR)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
1 [[Sensorarten#Helligkeit|Infrarot (ACS - Anti Collision System)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
2 [[Sensorarten#Bumpers|Bumper]] &amp;lt;br/&amp;gt; &lt;br /&gt;
2 [[Sensorarten#Incremental-Geber|Drehgeber (Encoder)]]&lt;br /&gt;
|-&lt;br /&gt;
|'''Vorhandene Aktoren:'''&lt;br /&gt;
|2 Motoren&amp;lt;br/&amp;gt;&lt;br /&gt;
6 Status-LEDs&amp;lt;br/&amp;gt;&lt;br /&gt;
1 IR-Sender&amp;lt;br/&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|'''Abmessungen:'''&lt;br /&gt;
|(L &amp;amp;times; B &amp;amp;times; H) 172 &amp;amp;times; 128 &amp;amp;times; 50 mm&lt;br /&gt;
|-&lt;br /&gt;
|'''Ausführung:'''&lt;br /&gt;
|Fertig aufgebauter Roboter&lt;br /&gt;
|-&lt;br /&gt;
|'''Stromversorgung:'''&lt;br /&gt;
|6 AA NiMH Akkus&lt;br /&gt;
|-&lt;br /&gt;
|'''Hersteller:'''&lt;br /&gt;
|Arexx Niederlande&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Mechanik==&lt;br /&gt;
===Beschreibung===&lt;br /&gt;
&lt;br /&gt;
===Sensoren===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Encoder====&lt;br /&gt;
&lt;br /&gt;
Die Drehgeber sind an den Getrieben der Motoren zur Drehzahlmessung angebracht. Es handelt sich dabei um Reflexlichtschranken, die auf Codierscheiben mit je 18 weissen und 18 schwarzen Segmenten ausgerichtet sind, also insgesamt 36 Segmente. Diese Codierscheiben sind wiederum an je eines der Zahnräder der beiden Getriebe geklebt worden. Wenn es sich dreht, wandern die einzelnen Segmente an der Reflexlichtschranke vorbei. Die weissen Segmente reflektieren das Infrarotlicht, die schwarzen Segmente nur wenig. Jedes der zwei mittleren Stufenzahnräder des Getriebes hat 50 Zähne auf dem großen, und 12 auf dem kleineren Zahnrad. Die Codierscheiben befinden sich auf dem Zahnrad neben dem Motor, also rechnet man:&lt;br /&gt;
50/12 * 50/12 =17.13/36; 17.13/36 * 36=625&lt;br /&gt;
Daher haben die Encoderscheiben auch Ihre 36 Segmente, denn das gibt eine schöne runde Zahl ohne gebrochenen Anteil. Die Drehgeber erzeugen also 625 Flanken pro Radumdrehung wobei jede Flanke einem Segment entspricht. Bei einem Raddurchmesser von ca. 50mm inkl. Raupenkette, ergibt sich rein rechnerisch ein Radumfang von ca. 157mm was 0.2512mm pro Zählschritt der Drehgeber entspricht. Da sich die Raupenketten aber fast immer etwas in den Untergrund eindrücken (bzw. auch selbst eingedrückt werden) kann man aber von 0.25mm pro Zählschritt ausgehen – meist ist es sogar etwas weniger, z.B. nur 0.24 oder 0.23mm. Das muss man durch abfahren von Teststrecken ermitteln, wie es im Anhang grob beschrieben ist. Sehr genau ist das allerdings durch Radschlupf (bzw. hier müssten wir eigentlich von „Kettenschlupf“ sprechen) und ähnlichen Dingen nicht - vor allem beim Rotieren auf der Stelle. Beim normalen Geradeausfahren ist dieser Fehler klein, aber beim Rotieren kann er schnell sehr große Werte annehmen! Abweichungen muss man evtl. durch weitere Tests ermitteln und mit einkalkulieren. Das ist bei Raupenantrieben leider so – auch bei viel teureren und hochwertigeren Robotern. Dafür hat man aber den Vorteil, dass der Roboter mit Raupenantrieb recht geländegängig ist im Vergleich zu Robotern mit normalem Differentialantrieb mit zwei Antriebsrädern und Stützrad. Kleinere Hindernisse und Rampen kann er meist problemlos überwinden.&lt;br /&gt;
Dabei sind die Encoder sehr nützlich, denn man kann die Geschwindigkeit gut einregeln, egal wie der Untergrund und die Motorbelastung gerade aussieht. Bei gemessenen 50 Segmenten pro Sekunde liegt die Geschwindigkeit bei 1.25 cm/s, sofern wir von 0.25mm pro Zählschritt ausgehen. Etwa 50 Segmente pro Sekunde ist auch die geringste gerade noch regelbare Geschwindigkeit (das variiert aber etwas von Roboter zu Roboter). Bei 1200 Segmenten pro Sekunde wären es die maximal möglichen 30 cm/s (bei 0.25mm Auflösung, bei 0.23 sind es 27.6 cm/s). Standardmäßig begrenzt die Funktionsbibliothek das aber auf 1000 Flanken pro Sekunde. Die maximale Geschwindigkeit ist vom Ladezustand der Akkus abhängig – daher wären 30cm/s nicht besonders lange haltbar. Außerdem erhöht sich die Lebensdauer der Getriebe und Motoren je langsamer man fährt! Wenn der Roboter 4000 Segmente gezählt hat, ist er übrigens etwa einen Meter weit gefahren. Aber wie schon gesagt, gilt das natürlich nur für genau 0.25mm Auflösung. Ohne Kalibrierung hat man hier immer mehr oder weniger starke Abweichungen. Wem es nicht auf jeden mm ankommt, braucht nichts zu kalibrieren und kann einfach von 0.25mm oder besser 0.24mm ausgehen!&lt;br /&gt;
&lt;br /&gt;
====Stoßstangensensoren====&lt;br /&gt;
&lt;br /&gt;
Vorn am Roboter sind zwei Mikroschalter mit langem Schalthebel auf einer separaten&lt;br /&gt;
Platine untergebracht, die etwas vor der anderen Sensorplatine liegt. Dadurch werden&lt;br /&gt;
die IR LEDs auf der Sensorplatine geschützt und können nicht so leicht verbiegen&lt;br /&gt;
wenn der Roboter mal gegen ein Hindernis fährt. Die Stoßstange kann man auch abmontieren und z.B. gegen eine Schuss- oder Sammelvorrichtung für Bälle o.ä. ersetzen wenn man möchte.&lt;br /&gt;
&lt;br /&gt;
====Lichtsensoren====&lt;br /&gt;
&lt;br /&gt;
Vorne auf der kleinen Sensorplatine des Roboters sind zwei sog.&lt;br /&gt;
LDRs (=&amp;quot;Light Dependant Resistors&amp;quot; also lichtabhängige Widerstände)&lt;br /&gt;
platziert und nach links bzw. rechts ausgerichtet. Zwischen&lt;br /&gt;
den beiden Sensoren ist noch eine kleine schwarze&lt;br /&gt;
„Trennwand“ damit das Licht aus einer Richtung möglichst nur&lt;br /&gt;
einen der Sensoren erreicht. Sie bilden zusammen mit je einem&lt;br /&gt;
normalen Widerstand wie beim Batteriesensor einen Spannungsteiler – hier allerdings&lt;br /&gt;
um das Umgebungslicht zu messen.&lt;br /&gt;
&lt;br /&gt;
====Anti Collision System====&lt;br /&gt;
&lt;br /&gt;
Der aus Softwaresicht komplexeste Sensor des RP6 ist das ACS - das&lt;br /&gt;
„Anti Collision System“ (engl. für Anti Kollisions System)! Es besteht&lt;br /&gt;
aus einem IR Empfänger (s. Abb.) und zwei vorne auf der Sensorplatine&lt;br /&gt;
links und rechts angebrachten IR LEDs.&lt;br /&gt;
Da es je eine IR LED links und rechts gibt, kann das ACS grob unterscheiden ob sich&lt;br /&gt;
das Objekt links, rechts oder mittig vor dem Roboter befindet.&lt;br /&gt;
Man kann zusätzlich noch die Stromstärke mit der die beiden IR LEDs gepulst werden&lt;br /&gt;
in drei Stufen einstellen. Das ACS funktioniert aber auch in der höchsten Stufe nicht&lt;br /&gt;
mit allen Objekten immer zuverlässig, denn es kommt auf die Beschaffenheit der&lt;br /&gt;
Oberfläche des jeweiligen Objekts an! Ein schwarzes Objekt reflektiert das IR Licht natürlich&lt;br /&gt;
viel schlechter als ein weisses Objekt und ein kantiges und spiegelndes Objekt&lt;br /&gt;
könnte das IR Licht hauptsächlich in eine bestimme Richtung reflektieren. Die Reichweite&lt;br /&gt;
ist also immer vom jeweiligen Objekt abhängig! Das ist eine prinzipielle Schwäche&lt;br /&gt;
von so gut wie allen IR Sensoren (jedenfalls in dieser Preisklasse).&lt;br /&gt;
Trotzdem werden die meisten Hindernisse zuverlässig erkannt und können umfahren&lt;br /&gt;
werden. Falls das mal nicht klappt, gibt es noch die Stoßstange mit den Tastsensoren&lt;br /&gt;
und falls auch die nicht richtig getroffen werden, kann der Roboter noch mit den Motorstromsensoren&lt;br /&gt;
oder den Encodern erkennen, ob die Motoren blockieren (s.u.)!&lt;br /&gt;
Wem das nicht reicht, der könnte zusätzlich z.B. noch Ultraschallsensoren anbringen...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Erweiterungssystem===&lt;br /&gt;
Auf dem Mainboard sind 22 freie 3,2mm Löcher vorhanden (im Chassis weitere 16), auf denen die Erweiterungsmodule symmetrisch vorne und hinten gestapelt werden können. Weil der Stromverbrauch durch mehr Module steigt, ist es sinnvoll nur insgesamt 6-8 Module auf dem Roboter zu stapeln. Auf dem Mainboard selbst sind noch 6 kleine Erweiterungsflächen verfügbar (plus 2 sehr kleine auf der Bumperplatine).&lt;br /&gt;
&lt;br /&gt;
===Antrieb===&lt;br /&gt;
&lt;br /&gt;
Die 7,2 VDC Motoren sind im Chassis eingebaut und werden mithilfe der H-Brücken gesteuert. Die maximale Geschwindigkeit liegt bei 25cm/s, das kann je nach Akkuspannung aber variieren. Ohne Softwarebegrenzung sind sogar 30cm/s möglich, dadurch verringert sich aber die Lebensdauer der Motoren. Die maximale Steigung, die der RP6 bewältigen kann, ist 30%, ohne Bumperplatine 40%, das hängt aber auch vom Untergrund ab. Kleine Hindernisse wie Bücher und Stifte kann der RP6 problemlos überqueren. Die Achsen der Räder sind in selbstschmierenden Sinterlagern mit 4mm Durchmesser gelagert.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Elektromechanik==&lt;br /&gt;
===Beschreibung===&lt;br /&gt;
===Odometrie===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Elektronik==&lt;br /&gt;
[[Bild:RP6 Block.jpg|thumb|Blockdiagramm]]&lt;br /&gt;
===Beschreibung===&lt;br /&gt;
&lt;br /&gt;
===Sensoren (SENSORS)===&lt;br /&gt;
&lt;br /&gt;
Die meisten Sensoren über die der Roboter verfügt, haben wir ja schon in anderen Abschnitten kurz genannt, wollen diese nun aber etwas detaillierter betrachten.&lt;br /&gt;
In dem Blockdiagramm sind einige der Sensoren nicht in dem blauen Bereich &amp;quot;Sensors&amp;quot; zu sehen, weil sie besser in andere Bereiche passen. Trotzdem zählen natürlich auch die Drehgeber (= “Encoder“), Motorstromsensoren und der Batteriespannungssensor zu den Sensoren und werden darum in diesem Abschnitt beschrieben!&lt;br /&gt;
&lt;br /&gt;
====Batteriespannungs-Sensor (Voltage Sensor)====&lt;br /&gt;
&lt;br /&gt;
Dieser &amp;quot;Sensor&amp;quot; ist eigentlich nur ein einfacher Spannungsteiler aus zwei Widerständen. Wir gehen davon aus, dass die Batterien insgesamt maximal 10V liefern können. 6 NiMH Akkus werden immer unterhalb davon bleiben. Die Referenzspannung des ADC, also die Spannung mit der er die gemessene Spannung vergleicht, beträgt 5V. Da auch die Betriebsspannung 5V beträgt, darf diese nicht überschritten werden. Also müssen wir die zu messende Spannung um die Hälfte herabsetzen! Dies geschieht über einen Spannungsteiler aus zwei Widerständen, der die Spannung an den Messbereich des ADCs anpasst. Der ADC löst mit 10 Bit auf (Wertebereich 0 bis 1023), was eine Auflösung von 10V/1024=9.765625mV ergibt. Ein Messwert von 512 entspricht hier also 5V und 1023 wären ungefähr 10V! Diese Grenzwerte sollten aber normalerweise nie erreicht werden! Das ist nicht besonders genau, da die Widerstände keineswegs Präzisionswiderstände sind. Abweichungen von einigen Prozent nach oben und unten sind möglich. Auch die Referenzspannung von 5V ist nicht ganz genau und kann bei normaler Belastung etwas variieren. Das stört hier nicht, denn wir brauchen ohnehin nur einen ungefähren Wert um festzustellen ob die Batterien sich langsam dem Ende nähern. Wer die Spannung genau messen will, braucht ein Multimeter um den Messfehler zu ermitteln und diesen dann in Software auszugleichen. Wenn man mit Fehlern leben kann, kann man die Spannung dank des günstigen Umrechnungsverhältnisses sogar direkt aus den ADC Werten ungefähr abschätzen: 720 entsprechen dann grob 7.2V, 700 etwa 7V und 650 wären etwa 6.5V. Bei einem konstanten Wert unter 560 kann man davon ausgehen, dass die Akkus fast leer sind.&lt;br /&gt;
&lt;br /&gt;
====Motorstrom====&lt;br /&gt;
[[Bild:RP6_MSS.jpg|thumb]]&lt;br /&gt;
Es befinden sich zwei Leistungswiderstände in den beiden Motorstromkreisen. Aus dem Ohm'schen Gesetz U=RxI folgt, dass sich die Spannung die an einem bestimmten Widerstand abfällt, proportional zum Strom verhält, der diesen durchfließt!&lt;br /&gt;
Damit die Spannungsabfälle an den Widerständen nicht zu groß werden, müssen die Widerstände klein gewählt werden. In unserem Fall haben Sie einen Wert von 0.1 Ohm&lt;br /&gt;
Die abfallende Spannung ist also nur sehr klein (0.1V bei einem Strom von 1A) und muss verstärkt werden bevor sie mit dem ADC gemessen werden kann. Das erledigt jeweils ein sog. Operationsverstärker (OPV). In der Schaltung des RP6 wird je Motorkanal ein OPV verwendet. Der Messbereich geht etwa bis 1.8A. Bei 1.8A fallen etwa 0.18V am Widerstand ab und es ergibt sich am Ausgang des OPV eine Spannung von etwa 4V. Mehr kann der verwendete OPV bei 5V Betriebsspannung nicht ausgeben:&lt;br /&gt;
&lt;br /&gt;
I = U / ((1 + (100k / 4,7k)) * 0,1)&lt;br /&gt;
&lt;br /&gt;
Die Leistungswiderstände haben eine Toleranz von 10%, die Widerstände am OPV 5%, also ist das alles nur sehr ungenau (Ungenauigkeiten im Bereich von etwa 270mA sind möglich wenn man die Sensoren nicht kalibriert!). Wir brauchen allerdings auch nur den ungefähren Wert um festzustellen ob die Motoren stark oder wenig belastet werden. So kann der Roboter gut blockierte oder gar defekte Motoren bzw. Drehgeber erkennen! Die DC-Motoren benötigen mehr Strom je stärker sie belastet werden (Drehmoment) und somit steigt der Strom sehr stark an wenn die Motoren blockiert sind. Das wird von der Robotersoftware zur Notabschaltung verwendet: wenn die Motoren dauerhaft mit hohem Strom betrieben würden, könnten diese sehr heiß werden und dadurch Schaden nehmen! Und wenn die Encoder mal ausfallen sollten – aus welchem Grund auch immer – kann auch das damit erkannt werden. Man würde dann eine Drehzahl von 0 messen. Lässt man die Motoren aber auf voller Kraft laufen und der Strom bleibt trotzdem klein (also sind die Ketten nicht blockiert!), kann man genau daraus schließen, dass entweder die Encoder, oder die Motoren ausgefallen sind (oder Encoder und Motorstromsensoren nicht funktionieren... das passiert z.B. wenn man vergessen hat diese vorher per Software einzuschalten).&lt;br /&gt;
&lt;br /&gt;
====Encoder====&lt;br /&gt;
[[Bild:RP6_ENCODER.jpg|thumb]]&lt;br /&gt;
Ganz anders als die letztgenannten Sensoren funktionieren die Drehgeber, die an den Getrieben der Motoren zur Drehzahlmessung angebracht sind. Es handelt sich dabei um Reflexlichtschranken, die auf Codierscheiben mit je 18 weissen und 18 schwarzen Segmenten ausgerichtet sind, also insgesamt 36 Segmente (s. Abb). Diese Codierscheiben sind wiederum an je eines der Zahnräder der beiden Getriebe geklebt worden. Wenn es sich dreht, wandern die einzelnen Segmente an der Reflexlichtschranke vorbei. Die weissen Segmente reflektieren das Infrarotlicht, die schwarzen Segmente nur wenig. Die Drehgeber erzeugen so zwar auch wie die anderen Sensoren ein analoges Signal, aber es wird digital interpretiert. Zunächst wird das Signal verstärkt und anschließend über einen sog. Schmitt Trigger in ein Rechtecksignal umgewandelt. Die Flanken dieses Signals, also die Wechsel von 5 auf 0V und umgekehrt, lösen jeweils ein Interrupt Ereignis aus und diese werden dann von der Software gezählt. So kann die zurückgelegte Wegstrecke gemessen und zusammen mit einem Timer zur Zeitmessung die Drehzahl und damit auch die Geschwindigkeit ermittelt werden. Die Ermittlung der Drehzahl ist auch Hauptanwendung der Encoder – nur mit den Encodern kann man die Drehzahl auf den gewünschten Sollwert einregeln. Ohne Regelung wäre die Drehzahl nämlich von der Akkuspannung, Belastung der Motoren usw. abhängig. Die hohe Auflösung ermöglicht es dabei, auch niedrige Geschwindigkeiten noch relativ genau einzuregeln. Jedes der zwei mittleren Stufenzahnräder des Getriebes hat 50 Zähne auf dem großen, und 12 auf dem kleineren Zahnrad (s. Abb). Die Codierscheiben befinden sich auf dem Zahnrad neben dem Motor, also rechnet man:&lt;br /&gt;
&lt;br /&gt;
50/12 * 50/12 =17.13/36; 17.13/36 * 36=625&lt;br /&gt;
&lt;br /&gt;
Daher haben die Encoderscheiben auch Ihre 36 Segmente, denn das gibt eine schöne runde Zahl ohne gebrochenen Anteil. Die Drehgeber erzeugen also 625 Flanken pro Radumdrehung wobei jede Flanke einem Segment entspricht. Bei einem Raddurchmesser von ca. 50mm inkl. Raupenkette, ergibt sich rein rechnerisch ein Radumfang von ca. 157mm was 0.2512mm pro Zählschritt der Drehgeber entspricht. Da sich die Raupenketten aber fast immer etwas in den Untergrund eindrücken (bzw. auch selbst eingedrückt werden) kann man aber von 0.25mm pro Zählschritt ausgehen – meist ist es sogar etwas weniger, z.B. nur 0.24 oder 0.23mm. Das muss man durch abfahren von Teststrecken ermitteln, wie es im Anhang grob beschrieben ist. Sehr genau ist das allerdings durch Radschlupf (bzw. hier müssten wir eigentlich von „Kettenschlupf“ sprechen) und ähnlichen Dingen nicht - vor allem beim Rotieren auf der Stelle. Beim normalen Geradeausfahren ist dieser Fehler klein, aber beim Rotieren kann er schnell sehr große Werte annehmen! Abweichungen muss man evtl. durch weitere Tests ermitteln und mit einkalkulieren. Das ist bei Raupenantrieben leider so – auch bei viel teureren und hochwertigeren Robotern. Dafür hat man aber den Vorteil, dass der Roboter mit Raupenantrieb recht geländegängig ist im Vergleich zu Robotern mit normalem Differentialantrieb mit zwei Antriebsrädern und Stützrad. Kleinere Hindernisse und Rampen kann er meist problemlos überwinden.&lt;br /&gt;
Dabei sind die Encoder sehr nützlich, denn man kann die Geschwindigkeit gut einregeln, egal wie der Untergrund und die Motorbelastung gerade aussieht. Bei gemessenen 50 Segmenten pro Sekunde liegt die Geschwindigkeit bei 1.25 cm/s, sofern wir von 0.25mm pro Zählschritt ausgehen. Etwa 50 Segmente pro Sekunde ist auch die geringste gerade noch regelbare Geschwindigkeit (das variiert aber etwas von Roboter zu Roboter). Bei 1200 Segmenten pro Sekunde wären es die maximal möglichen 30 cm/s (bei 0.25mm Auflösung, bei 0.23 sind es 27.6 cm/s). Standardmäßig begrenzt die Funktionsbibliothek das aber auf 1000 Flanken pro Sekunde. Die maximale Geschwindigkeit ist vom Ladezustand der Akkus abhängig – daher wären 30cm/s nicht besonders lange haltbar. Außerdem erhöht sich die Lebensdauer der Getriebe und Motoren je langsamer man fährt!&lt;br /&gt;
&lt;br /&gt;
=====Encoder justieren=====&lt;br /&gt;
Damit der RP6 die Signale der Drehgeber richtig auswerten kann, muss man evtl. die Drehgeber einmalig justieren. Dies kann auch schon bei einem neu gekauften RP6 notwendig sein.&lt;br /&gt;
Eine genaue Anleitung dazu findet man [http://www.arexx.com/rp6/downloads/RP6_ENCODER_DE_20071219.zip hier]. Es gibt auch ein [http://www.arexx.com/rp6/downloads/rp6_encoder_video.zip Video], das die Drehgeber-Justierung zeigt.&lt;br /&gt;
&lt;br /&gt;
=====Encoder kalibrieren=====&lt;br /&gt;
Wenn der Roboter 4000 Segmente gezählt hat, ist er etwa einen Meter weit gefahren. Aber wie schon gesagt, gilt das natürlich nur für genau 0.25mm Auflösung. Ohne Kalibrierung hat man hier immer mehr oder weniger starke Abweichungen. Wem es nicht auf jeden mm ankommt, braucht nichts zu kalibrieren und kann einfach von 0.25mm oder besser 0.24mm ausgehen!&lt;br /&gt;
Optimal ist es, wenn man sich für Weg- und Winkelmessungen nicht auf die Encoder Daten stützen muss, sondern externe Systeme wie Infrarotbaken oder einen genauen elektronischen Kompass dazu zur Verfügung hat.&lt;br /&gt;
&lt;br /&gt;
Will man die Drehgeber des RP6 dennoch kalibrieren, kann man ihn z.B. mit diesem Testprogramm:&lt;br /&gt;
&amp;lt;pre&amp;gt;#include &amp;quot;RP6RobotBaseLib.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
	initRobotBase();&lt;br /&gt;
	powerON();&lt;br /&gt;
&lt;br /&gt;
	// Test: Go ahead 1m and stop!&lt;br /&gt;
	move (80, FWD, DIST_MM(1000), true);&lt;br /&gt;
	writeString_P(&amp;quot;LEFT RIGHT&amp;quot;);&lt;br /&gt;
 	writeString_P(&amp;quot;\n&amp;quot;);&lt;br /&gt;
 	writeInteger(mleft_dist, DEC);&lt;br /&gt;
	writeChar(' ');&lt;br /&gt;
 	writeInteger(mright_dist, DEC);&lt;br /&gt;
	writeString_P(&amp;quot;\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
	powerOFF();&lt;br /&gt;
&lt;br /&gt;
	return 0;&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
... 1m weit fahren lassen und dann messen, wie weit er tatsächlich gefahren ist. Das Programm gibt auf dem Terminal den Stand der Drehgeber aus. Teilt man dann die gemessene Fahrstrecke in mm durch den Wert der Drehgeber, erhält man die Auflösung. Diesen Wert kann man dann der Konstanten ENCODER_RESOLUTION in der RP6Config.h zuweisen. Nach &amp;quot;Make Clean&amp;quot;, einer Neukompilierung und erneuter Ausführung des Testprogramms müßte der RP6 jetzt genau 1m weit fahren. Das gilt zumindest für den Untergrund, auf dem die Kalibrierung durchgeführt wurde.&lt;br /&gt;
&lt;br /&gt;
====Stoßstangensensoren (Bumper)====&lt;br /&gt;
&lt;br /&gt;
Vorn am Roboter sind zwei Mikroschalter mit langem Schalthebel auf einer separaten&lt;br /&gt;
Platine untergebracht, die etwas vor der anderen Sensorplatine liegt. Dadurch werden&lt;br /&gt;
die IR LEDs auf der Sensorplatine geschützt und können nicht so leicht verbiegen&lt;br /&gt;
wenn der Roboter mal gegen ein Hindernis fährt. Mit den zwei Schaltern kann der Mikrocontroller&lt;br /&gt;
einen solchen Aufprall registrieren und dann beispielsweise zurücksetzen,&lt;br /&gt;
sich etwas drehen und weiterfahren. Die Schalter sind an zwei der Ports die schon mit&lt;br /&gt;
den LEDs verbunden sind angeschlossen und blockieren so keine anderen Ports des&lt;br /&gt;
Mikrocontrollers. Daher leuchten die LEDs auch immer wenn man einen der Schalter&lt;br /&gt;
drückt! Da dies normalerweise relativ selten passiert, stört das aber nicht weiter.&lt;br /&gt;
Die Stoßstange kann man auch abmontieren und z.B. gegen eine Schuss- oder Sammelvorrichtung&lt;br /&gt;
für Bälle o.ä. ersetzen wenn man möchte.&lt;br /&gt;
&lt;br /&gt;
====Lichtsensoren (LDRs)====&lt;br /&gt;
[[Bild:RP6_Licht.jpg|thumb]]&lt;br /&gt;
Vorne auf der kleinen Sensorplatine des Roboters sind zwei sog.&lt;br /&gt;
LDRs (=&amp;quot;Light Dependant Resistors&amp;quot; also lichtabhängige Widerstände)&lt;br /&gt;
platziert und nach links bzw. rechts ausgerichtet. Zwischen&lt;br /&gt;
den beiden Sensoren ist noch eine kleine schwarze&lt;br /&gt;
„Trennwand“ damit das Licht aus einer Richtung möglichst nur&lt;br /&gt;
einen der Sensoren erreicht. Sie bilden zusammen mit je einem&lt;br /&gt;
normalen Widerstand wie beim Batteriesensor einen Spannungsteiler – hier allerdings&lt;br /&gt;
um das Umgebungslicht zu messen. Die 5V Betriebsspannung wird auch geteilt, aber&lt;br /&gt;
hier ist einer der Widerstände variabel! Es wird also das Teilungsverhältnis je nach Intensität&lt;br /&gt;
des Lichteinfalls verändert und somit eine vom Lichteinfall abhängige Spannung&lt;br /&gt;
an einen der A/D Wandler Kanäle geleitet!&lt;br /&gt;
Über den Spannungsunterschied zwischen den beiden Sensoren kann man ermitteln in&lt;br /&gt;
welcher Richtung sich eine bzw. die hellste Lichtquelle vor dem Roboter befindet:&lt;br /&gt;
Links, Rechts oder in der Mitte. Mit einem entsprechenden Programm, kann man so z.B. eine starke Taschenlampe in&lt;br /&gt;
einem abgedunkelten Zimmer verfolgen, oder den Roboter die hellste Stelle in einem&lt;br /&gt;
Raum suchen lassen! Klappt z.B. sehr gut mit einem stärkeren Hand-Halogenscheinwerfer:&lt;br /&gt;
Wenn man damit auf den Boden leuchtet, kann der Roboter dem Lichtfleck auf&lt;br /&gt;
dem Boden folgen.&lt;br /&gt;
Das geht natürlich auch umgekehrt: Der Roboter könnte z.B. auch versuchen sich vor&lt;br /&gt;
hellem Licht zu verstecken...&lt;br /&gt;
Wenn man noch ein oder zwei LDRs hinten am Roboter anbringen würde, könnte man&lt;br /&gt;
das noch verfeinern und die Richtung in der sich Lichtquellen befinden besser bestimmen.&lt;br /&gt;
Der Roboter kann sonst nämlich oft nur schwer unterscheiden ob die Lichtquelle&lt;br /&gt;
vor oder hinter ihm liegt. Zwei der A/D Wandler Kanäle sind noch frei...&lt;br /&gt;
&lt;br /&gt;
====Anti Collision System (ACS)====&lt;br /&gt;
[[Bild:RP6 ACS.jpg|thumb|Das ACS]]&lt;br /&gt;
Der aus Softwaresicht komplexeste Sensor des RP6 ist das ACS - das „Anti Collision System“ (engl. für Anti Kollisions System)! Es besteht aus einem IR Empfänger (s. Abb.) und zwei vorne auf der Sensorplatine links und rechts angebrachten IR LEDs. Die IR LEDs werden direkt vom Mikrocontroller angesteuert. Die Ansteuerungsroutinen können beliebig verändert und verbessert werden! Beim Vorgängermodell war dafür noch ein eigener Controller nötig, dessen Programm aber nicht vom Anwender geändert werden konnte...&lt;br /&gt;
Mit den IR LEDs werden kurze, mit 36kHz modulierte Infrarot Impulse ausgesandt, auf die der darauf ausgelegte IR Empfänger reagiert. Werden die IR Impulse an einem Gegenstand vor dem Roboter reflektiert und vom IR Empfänger detektiert, kann der Mikrocontroller darauf reagieren und z.B. ein Ausweichmanöver einleiten. Damit das ACS nicht zu empfindlich bzw. auf eventuelle Störungen reagiert, wartet die Software bis eine bestimmte Anzahl von Impulsen in einer bestimmten Zeit empfangen worden ist. Es wird auch eine Synchronisation mit dem RC5 Empfang durchgeführt und auf die RC5 Signale von TV/Hifi Fernbedienungen wird so nicht reagiert. Bei anderen Codes kann das aber nicht garantiert werden und das ACS könnte dann Hindernisse erkennen, wo gar keine sind! Da es je eine IR LED links und rechts gibt, kann das ACS grob unterscheiden ob sich das Objekt links, rechts oder mittig vor dem Roboter befindet.&lt;br /&gt;
Man kann zusätzlich noch die Stromstärke mit der die beiden IR LEDs gepulst werden in drei Stufen einstellen. Das ACS funktioniert aber auch in der höchsten Stufe nicht mit allen Objekten immer zuverlässig, denn es kommt auf die Beschaffenheit der Oberfläche des jeweiligen Objekts an! Ein schwarzes Objekt reflektiert das IR Licht natürlich viel schlechter als ein weisses Objekt und ein kantiges und spiegelndes Objekt könnte das IR Licht hauptsächlich in eine bestimme Richtung reflektieren. Die Reichweite ist also immer vom jeweiligen Objekt abhängig! Das ist eine prinzipielle Schwäche von so gut wie allen IR Sensoren (jedenfalls in dieser Preisklasse).&lt;br /&gt;
Trotzdem werden die meisten Hindernisse zuverlässig erkannt und können umfahren werden. Falls das mal nicht klappt, gibt es noch die Stoßstange mit den Tastsensoren und falls auch die nicht richtig getroffen werden, kann der Roboter noch mit den Motorstromsensoren oder den Encodern erkennen, ob die Motoren blockieren (s.u.)!&lt;br /&gt;
Wem das nicht reicht, der könnte zusätzlich z.B. noch Ultraschallsensoren anbringen...&lt;br /&gt;
&lt;br /&gt;
====IR-Kommunikation (IRCOMM)====&lt;br /&gt;
Der RP6 kann über die IR-LEDs links und rechts über der Bumper-Platine Daten zu anderen IR-Empfängern senden.  Es ist z.B. möglich, dass mehrere Roboter ihre Sensorwerte untereinander vergleichen.&lt;br /&gt;
&lt;br /&gt;
====6 Status-LEDs====&lt;br /&gt;
Die Status-LEDs sind vorne links und rechts über den Lichtsensoren auf der Hauptplatine angebracht.&lt;br /&gt;
&lt;br /&gt;
Über die Status-LEDs können Sensorzustände, z.B. des ACS, der Bumper oder der Lichtsensoren, dargestellt werden.&lt;br /&gt;
&lt;br /&gt;
====IR-Sender====&lt;br /&gt;
Über den IR-Sender können Daten zu anderen Geräten übertragen werden.&lt;br /&gt;
&lt;br /&gt;
===Erweiterungssystem (EXPANSION SYSTEM)===&lt;br /&gt;
[[Bild:RP6_EXP.jpg|thumb]]&lt;br /&gt;
Eines der nützlichsten Features des RP6 ist das Erweiterungssystem.&lt;br /&gt;
Man kann den RP6 damit genau so weit ausbauen,&lt;br /&gt;
wie man es benötigt. Aus Kostengründen bietet das&lt;br /&gt;
Basissystem schließlich nur relativ wenig Sensoren. Es sind&lt;br /&gt;
zwar schon mehr als bei vielen anderen Robotern in dieser&lt;br /&gt;
Preisklasse, aber erst mit weiteren Sensoren macht ein Roboter&lt;br /&gt;
so richtig Spaß. Das ACS kann beispielsweise nur grob&lt;br /&gt;
erkennen ob sich ein Hindernis vor dem Roboter befindet.&lt;br /&gt;
Mit Ultraschallsensoren oder besseren zusätzlichen IR Sensoren,&lt;br /&gt;
könnte man aber die Distanz ermitteln und so beispielsweise&lt;br /&gt;
bessere Ausweichmanöver fahren!&lt;br /&gt;
&lt;br /&gt;
Neben Sensoren macht es auch sehr viel Sinn, zusätzliche Controller einzubauen um&lt;br /&gt;
die anfallenden Aufgaben aufteilen zu können. Beispielsweise die RP6 CONTROL M32&lt;br /&gt;
Platine mit einem weiteren MEGA32 Mikrocontroller oder die CCPRO M128.&lt;br /&gt;
&lt;br /&gt;
Das Erweiterungssystem muss natürlich in der Lage sein, viele Erweiterungsmodule&lt;br /&gt;
miteinander zu verbinden, dabei mit wenigen Signalleitungen&lt;br /&gt;
auskommen und eine ausreichend hohe Geschwindigkeit bieten.&lt;br /&gt;
&lt;br /&gt;
Siehe [[I2C]]&lt;br /&gt;
&lt;br /&gt;
===Steuerung (CONTROL SYSTEM)===&lt;br /&gt;
&lt;br /&gt;
====Hauptprozessor (ATMEGA32)====&lt;br /&gt;
[[Bild:RP6_MEGA32.jpg|thumb|Der MEGA32]]&lt;br /&gt;
Der Hauptprozessor ist der ATMEGA32 vom Atmel. Er hat 32KB Flash ROM und 2KB RAM. Der ATMEGA ist mit 8Mhz getaktet, kann also bis zu 8 Millionen Befehle pro Sekunde ausführen. Es sind 32 I/O-Pins  am Controller verfügbar. Die I/O-Pins gehören zu I/O-Ports mit jeweils 8 Pins. Davon gibt es 4: PORTA, PORTB, PORTC und PORTD. Der Controller kann die Ports entweder ein oder ausschalten (Output), oder erkennen, ob Spannung angelegt wurde oder nicht (Input). Es gibt mehrere Module, die verschiedene Aufgaben übernehmen:&lt;br /&gt;
* 3 Timer, einer davon erzeugt die PWM-Signale für die Motoren&lt;br /&gt;
* Die serielle Schnittstelle (UART)&lt;br /&gt;
* Das TWI (Two Wire Interface, also Zweidraht Schnittstelle)&lt;br /&gt;
* Ein ADC (Analog to Digital Converter) mit 8 Eingangskanälen, welche mit 10bit (0-1023) auflösen&lt;br /&gt;
* Drei externe Interrupt Eingänge&lt;br /&gt;
&lt;br /&gt;
Auserdem befindet sich im Microcontroller ein sog. Bootloader, welcher mit dem RP6 Loader kommuniziert und neue Programme in den Speicher lädt.&lt;br /&gt;
&lt;br /&gt;
===Antrieb (DRIVE SYSTEM)===&lt;br /&gt;
[[Bild:RP6_H-Brücke.jpg|thumb|Die H-Brücke]]&lt;br /&gt;
[[Bild:RP6_Tastverhältniss.jpg|thumb]]&lt;br /&gt;
Der Antrieb des RP6 besteht aus zwei Gleichstrom Motoren mit nachgeschaltetem Getriebe,&lt;br /&gt;
über das die beiden Raupenketten angetrieben werden.&lt;br /&gt;
Die Motoren genehmigen sich je nach Belastung&lt;br /&gt;
einen recht hohen Strom und können&lt;br /&gt;
natürlich nicht direkt vom Mikrocontroller&lt;br /&gt;
angesteuert werden. Dazu braucht man&lt;br /&gt;
Leistungstreiber in Form von je einer H-Brücke&lt;br /&gt;
pro Motor. Das grundlegende Prinzip&lt;br /&gt;
ist in der nebenstehenden Abbildung dargestellt.&lt;br /&gt;
Eine H-Brücke besteht aus vier&lt;br /&gt;
&amp;quot;Schaltern&amp;quot;, die in Form eines H's um einen&lt;br /&gt;
Motor angeordnet sind. Nehmen wir mal an,&lt;br /&gt;
zunächst seien alle Schalter aus. Schaltet&lt;br /&gt;
man dann S1 und S4 (Rot) an, liegt eine&lt;br /&gt;
Spannung am Motor an und er dreht sich&lt;br /&gt;
z.B. nach rechts. Schalten wir nun S1 und&lt;br /&gt;
S4 wieder aus und danach S2 und S3 (Grün)&lt;br /&gt;
an, wird die am Motor anliegende Spannung umgepolt und er dreht sich in die entgegen gesetzte&lt;br /&gt;
Richtung, also nach links! Man muss darauf achten, nicht gleichzeitig S1&lt;br /&gt;
und S2, oder S3 und S4 einzuschalten, sonst entstünde ein Kurzschluss und dadurch&lt;br /&gt;
könnten die &amp;quot;Schalter&amp;quot; zerstört werden!&lt;br /&gt;
Natürlich verwenden wir auf dem RP6 keine mechanischen Schalter, sondern sog.&lt;br /&gt;
MOSFETs. Diese schalten beim Anlegen einer genügend hohen Spannung am Eingang&lt;br /&gt;
durch. Die Schaltvorgänge können sehr schnell erfolgen, mehrere Kilohertz sind bei&lt;br /&gt;
unserer Anwendung möglich.&lt;br /&gt;
So kann man also schon mal die Drehrichtung einstellen. Und wie bekommt man den&lt;br /&gt;
Motor nun schneller bzw. langsamer? Ein Elektromotor dreht umso schneller, je höher&lt;br /&gt;
die angelegte Spannung ist. Die Drehzahl kann also über die Spannung eingestellt&lt;br /&gt;
werden - und genau dazu können wir die H-Brücke auch verwenden!&lt;br /&gt;
Die Abbildung verdeutlicht das Prinzip&lt;br /&gt;
nach dem wir vorgehen können.&lt;br /&gt;
Wir erzeugen&lt;br /&gt;
ein Rechtecksignal fester Frequenz,&lt;br /&gt;
bei dem wir das sog. Tastverhältnis&lt;br /&gt;
verändern. Mit &amp;quot;Tastverhältnis&amp;quot; ist das&lt;br /&gt;
Verhältnis von der eingeschalteten zur&lt;br /&gt;
ausgeschalteten Zeit des Signals gemeint.&lt;br /&gt;
Am Motor liegt dann effektiv eine niedrigere,&lt;br /&gt;
mittlere Gleichspannung an, die dem&lt;br /&gt;
Tastverhältnis entspricht. In der Grafik ist&lt;br /&gt;
dies durch eine rote Linie (Ug) und die roten&lt;br /&gt;
Flächen verdeutlicht. Wenn z.B. eine&lt;br /&gt;
Spannung von 7 Volt von den Akkus an&lt;br /&gt;
den Motortreibern anliegt, und diese mit&lt;br /&gt;
einem Tastverhältnis von 50% angesteuert werden, würde die mittlere Spannung in&lt;br /&gt;
etwa bei der Hälfte, also 3.5V liegen! Das stimmt real nicht ganz, aber so kann man&lt;br /&gt;
es sich schon gut und einfach vorstellen.&lt;br /&gt;
Das Antriebssystem ist dank der hohen Untersetzung (~ 1:72) relativ stark und so&lt;br /&gt;
kann der RP6 viel schwerere Lasten tragen als es z.B. der kleine Roboter ASURO&lt;br /&gt;
könnte. Allerdings steigt mit zunehmendem Gewicht natürlich auch der Energiebedarf&lt;br /&gt;
und die Akkus werden schneller leer sein ...&lt;br /&gt;
Im Vergleich mit einem ferngesteuerten Rennwagen o.ä. könnte man denken der RP6&lt;br /&gt;
sei langsam - stimmt auch - das ist jedoch absichtlich so! Der Roboter wird von einem&lt;br /&gt;
Mikrocontroller gesteuert und wenn der Programmierer einen Fehler bei der Programmierung&lt;br /&gt;
gemacht hat, wäre es ungünstig mit 10km/h vor die Wand zu prallen! Bei&lt;br /&gt;
dem eher gemächlichen Tempo des RP6 passiert aber nicht so schnell etwas und nebenbei&lt;br /&gt;
haben die Sensoren mehr Zeit die Umgebung auf Hindernisse zu untersuchen.&lt;br /&gt;
Und da wäre natürlich noch der Vorteil der höheren Belastbarkeit und der viel genaueren&lt;br /&gt;
Geschwindigkeitsregelung!&lt;br /&gt;
&lt;br /&gt;
===Stromversorgung (POWER SUPPLY)===&lt;br /&gt;
[[Bild:RP6_IC1.jpg|thumb]]&lt;br /&gt;
Natürlich benötigt ein Roboter Energie. Diese trägt der RP6 gespeichert in 6 Akkus mit&lt;br /&gt;
sich herum. Die Laufzeit ist durch die Kapazität der Akkus eingeschränkt, denn auch&lt;br /&gt;
wenn die Elektronik verhältnismäßig wenig Energie benötigt, schlucken die Motoren je&lt;br /&gt;
nach Belastung doch ziemlich viel.&lt;br /&gt;
&lt;br /&gt;
Damit die Akkus möglichst lange halten und der Roboter nicht ständig Pause machen&lt;br /&gt;
muss, sollte man ihm daher etwas größere Energiespeicher mit etwa 2500mAh gönnen.&lt;br /&gt;
Kleinere mit 2000mAh oder mehr funktionieren aber auch. Mit guten Akkus kann&lt;br /&gt;
man 3 bis 6 Stunden oder mehr Laufzeit erreichen, abhängig von der Betriebszeit der&lt;br /&gt;
Motoren, deren Belastung und Qualität der Akkus. Die 6 Akkus die notwendig sind,&lt;br /&gt;
haben insgesamt eine Nennspannung von 6x 1.2V = 7.2V. Im Blockdiagramm ist dies&lt;br /&gt;
mit &amp;quot;UB&amp;quot; (= &amp;quot;U-Battery&amp;quot;, U ist der Formelbuchstabe für Spannung) bezeichnet. „Nennspannung&amp;quot;,&lt;br /&gt;
weil sich die Spannung mit der Zeit stark verändert. Voll aufgeladen können&lt;br /&gt;
die Akkus im Leerlauf insgesamt bis zu 8.5V liefern! Diese Spannung sinkt während&lt;br /&gt;
der Entladung ab und schwankt auch je nach Belastung (Motoren an oder aus,&lt;br /&gt;
schnell langsam etc. - wie stark die Spannung schwankt, hängt auch von der Qualität&lt;br /&gt;
der verwendeten Akkus ab. Der Innenwiderstand ist hier die kritische Größe).&lt;br /&gt;
Das ist für Messungen von Sensorwerten und ähnlichem natürlich nicht ohne weiteres&lt;br /&gt;
brauchbar. Noch wichtiger ist jedoch, dass viele der verwendeten Komponenten wie&lt;br /&gt;
z.B. der Mikrocontroller nur auf 5V oder weniger Betriebsspannung ausgelegt sind und&lt;br /&gt;
bei so hohen Spannungen zerstört würden. Die Akku Spannung muss also auf einen&lt;br /&gt;
definierten Wert heruntergeregelt und stabilisiert werden!&lt;br /&gt;
Das übernimmt ein 5V Spannungsregler, der einen Strom von&lt;br /&gt;
maximal 1.5A liefern kann (s. Abb.). Bei 1.5A würde er jedoch&lt;br /&gt;
ziemlich viel Wärme abgeben. Es gibt daher eine große Kühlfläche&lt;br /&gt;
auf der Platine an die der Regler festgeschraubt ist. Über 1A&lt;br /&gt;
sollte der Regler trotz Kühlung besser nur kurzzeitig (also wenige&lt;br /&gt;
Sekunden) belastet werden, wenn man nicht noch einen zusätzlichen&lt;br /&gt;
großen Kühlköper draufschraubt.&lt;br /&gt;
&lt;br /&gt;
Es wird empfohlen, 800mA Dauerlast nicht zu überschreiten! Bei&lt;br /&gt;
so einer Belastung und zusammen mit den Motoren wären die&lt;br /&gt;
Akkus auch recht schnell leer. Im normalen Betrieb ohne ein Erweiterungsboard&lt;br /&gt;
nimmt der Roboter übrigens nicht mehr als 40mA auf (ausser wenn&lt;br /&gt;
das IRCOMM sendet), also überhaupt kein Problem für den Regler und man hat noch&lt;br /&gt;
genug Reserven für die Erweiterungsmodule, die meistens auch nicht mehr als 50mA&lt;br /&gt;
aufnehmen sofern keine Motoren, große LEDs o.ä. daran angeschlossen sind.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Umbau-Optionen==&lt;br /&gt;
Hier soll beschrieben werden, welche Umbau-Optionen es für die RP6 Base gibt. Im Text gibt es Verweise auf den Schaltplan des RP6 (RP6_MAINBOARD.PDF) in der Form: (SP2 B1: Bauteil). Dies bedeutet, dass man das Bauteil auf Blatt 2 des RP6-Schaltplans im Feld B1 finden kann. Beispielhaft sind im folgenden Text Bestell-Nummern der Firma [http://www.conrad.de/ce/ CONRAD] genannt. Natürlich kann man die Teile auch bei anderen Versendern beziehen.&lt;br /&gt;
&lt;br /&gt;
Bei den Materialangaben ist öfter die Rede von &amp;quot;Steckbuchsen mit Litze&amp;quot;. Diese Steckbuchsen mit angelöteter Litze können auf die ein- oder zweireihigen Stiftleisten aufgesteckt werden. Leider gibt es sie nicht (mehr) fertig konfektioniert bei CONRAD. Die einreihigen Steckbuchsen (RM 2,54mm) kann man aber z.B. bei [http://www.elv.de/output/controller.aspx ELV] bekommen: 2-polig (68-016635), 3-polig (68-022503) und 5-polig (68-023073). An sie muss man dann noch Litzen in der entsprechenden Länge selbst anlöten.&lt;br /&gt;
&lt;br /&gt;
===Elko für den IR-Empfänger===&lt;br /&gt;
[[Bild:RP6_C29_TSOP.JPG|thumb|RP6 C29 TSOP]]&lt;br /&gt;
Zur Spannungsstabilisierung kann ein Elko (C29; SP2 E1: C29*) am TSOP 34836 eingelötet werden.&lt;br /&gt;
&lt;br /&gt;
Normalerweise ist dieser Elko nicht erforderlich.&lt;br /&gt;
&lt;br /&gt;
Man braucht dazu:&lt;br /&gt;
* Einen Elektrolyt-Kondensator stehend 10 uF / 16V (C29); RM 2,5mm (445631)&lt;br /&gt;
&lt;br /&gt;
Der Elko kann auch eine geringere Kapazität als 10 uF haben (1 uF bis 4,7 uF reichen auch). Man lötet den Elko auf seinen Platz. Bitte auf die Polung achten: Der Minuspol zeigt nach vorn (in Fahrtrichtung des RP6).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Anschlüsse===&lt;br /&gt;
Hier wird aufgelistet, wo man auf dem RP6 Mainboard Anschlüsse nutzen kann, um sie z.B. zu weiteren Sensoren, zum USRBUS oder (weniger empfehlenswert!) direkt zu EPs oder Erweiterungsplatinen (M32, CCPRO M128) zu führen.&lt;br /&gt;
&lt;br /&gt;
====Analoge Sensoren an ADC0/1====&lt;br /&gt;
[[Bild:RP6_ADC01.JPG|thumb|RP6 ADC0/1]]&lt;br /&gt;
&lt;br /&gt;
Wenn man bis zu zwei analoge Sensoren (z.B. IR-Distanz-Mess-Sensoren Sharp GP2Y0A02YK 185364) direkt an den RP6 anschließen möchte, dann gibt es da zwei 3-polige Kontakte, beschriftet mit VDD/GND/ADCx (x = 0..1). Hier kann man 3-polige Stiftleisten auflöten, an die dann die Sensoren angeschlossen werden.&lt;br /&gt;
&lt;br /&gt;
Man braucht dazu:&lt;br /&gt;
* 1-reihige Stiftleiste RM 2,54mm (z.B. 36-polig 732478)&lt;br /&gt;
* Zwei Keramik-Vielschicht-Kondensatoren 100nF (C27, C28); RM 2,54mm (453099)&lt;br /&gt;
* ENTWEDER einen Elektrolyt-Kondensator stehend 220 uF / 16V (C26); RM 3,5mm (445903)&lt;br /&gt;
* ODER einen Elektrolyt-Kondensator stehend 470 uF / 16V (C26); RM 3,5mm (446211)&lt;br /&gt;
* Zwei 3-polige Steckbuchsen mit Litze zum Anschluß der Sensoren&lt;br /&gt;
&lt;br /&gt;
Man trennt nun von der 1-reihigen Stiftleiste zweimal 3 Kontakte ab und lötet sie auf die weiß umrahmten Kontakte (VDD/GND/ADCx; SP2 B1: ADC0, ADC1), anschließend C27, C28 (SP2 A1: C27*, C28*) auf ihre Plätze und zum Schluß den Elko 220 uF oder 470 uF (C26; SP2 A1: C26*). Der Elko ist nur bei Sensoren mit hohem Strombedarf notwendig, siehe dazu auch Anleitung des RP6, Seite 136! Beim Elko auf die Polung achten: Er muss so sitzen, dass er mit seinem Pluspol in Fahrtrichtung des RP6 (nach vorn) schaut.&lt;br /&gt;
&lt;br /&gt;
Die Sensoren lötet man an die Litzen der 3-poligen Steckbuchsen und steckt diese auf die neuen Kontakte.&lt;br /&gt;
&lt;br /&gt;
Da manche Sensoren einen höheren Stromverbrauch haben, kann man die Stromversorgung an den VDD-Pins der ADC0/1-Stecker abschaltbar machen oder eine separate +5V-Spannung einspeisen. Siehe dazu den Abschnitt &amp;quot;Trennstellen - Getrennte Stromversorgung für ADC0/1&amp;quot; weiter unten!&lt;br /&gt;
&lt;br /&gt;
====ISP (In System Programming)====&lt;br /&gt;
Der ATMEGA32 des RP6 wird standardmäßig über den PROG/UART Stecker programmiert. Dazu befindet sich im Prozessor ein Bootloader-Programm. Wenn man stattdessen oder zusätzlich die ISP-Programmierung mit einem dafür geeigneten ISP-Programmier-Adapter nutzen will, kann man den Adapter an einen (noch einzulötenden) Wannenstecker auf dem RP6 anschließen.&lt;br /&gt;
Vorher sind aber ein paar &amp;quot;Umbauarbeiten&amp;quot; erforderlich.&lt;br /&gt;
&lt;br /&gt;
Man braucht dazu:&lt;br /&gt;
* 1-reihige Stiftleiste RM 2,54mm (z.B. 36-polig 732478)&lt;br /&gt;
* Wannenstecker 2x5-polig gerade RM 2,54mm (z.B. [http://www.reichelt.de./ Reichelt] WSL 10G)&lt;br /&gt;
* Eine SMD-Diode LL 4148 (140902)&lt;br /&gt;
* Eine Codierbrücke (z.B. aus Set 742902)&lt;br /&gt;
&lt;br /&gt;
Zwischen dem XBUS-Stecker und C13 befinden sich 10 Lötpunkte für den ISP-Anschluß, auf die der Wannenstecker gelötet wird, und drei Lötpunkte (beschriftet mit ISP* - BOOTLOAD; SP2 A3: YR1..3), auf die eine 3-polige Stiftleiste gelötet werden muss.&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_ISP.JPG|RP6 ISP]]&lt;br /&gt;
&lt;br /&gt;
Vorher muss eine kurze Leiterbahn zwischen den Lötpunkten BOOTLOAD aufgetrennt werden. Die Leiterbahn befindet sich auf der Lötseite der Platine und muss mit einem scharfen Messer oder einem speziellen Leiterbahn-Unterbrecher zwischen den beiden Lötpunkten unterbrochen werden. Man sollte anschließend mit einem Widerstandsmeßgerät nachmessen: Es sollte keine Verbindung mehr zwischen den Lötpunkten bestehen.&lt;br /&gt;
Man trennt dann von der 1-reihigen Stiftleiste 3 Kontakte ab und lötet sie auf die beschriebenen drei Lötpunkte.&lt;br /&gt;
&lt;br /&gt;
Zum Schluss lötet man noch die Diode LL 4148 (SP2 B3: D11*) auf ihre Lötflächen zwischen R3 und C6. Die Kathode (Strich) der Diode kommt nach vorn (in Fahrtrichtung RP6, bzw. liegt rechts von R3). Wenn man jetzt eine Codierbrücke auf die mit &amp;quot;BOOTLOAD&amp;quot; beschrifteten Pins steckt, bleibt alles unverändert: Die Programmierung erfolgt weiter über den PROG/UART-Stecker mithilfe des Bootloaders im Prozessor.&lt;br /&gt;
Wird die Codierbrücke in Stellung &amp;quot;ISP*&amp;quot; umgesteckt, kann der Prozessor mit ISP programmiert werden.&lt;br /&gt;
&lt;br /&gt;
Vorsicht: Das Bootloader-Programm kann dabei zerstört werden! Es müssen zusätzlich Fusebits des ATMEGA32 verändert werden. Dabei kann der Prozessor im schlimmsten Fall nicht mehr ansprechbar sein. Man sollte diesen Umbau und die ISP-Programmierung nur machen, wenn man genau weiß, was man macht!&lt;br /&gt;
&lt;br /&gt;
Eine Kopie des Bootloaders und eine Kurzanleitung zum Einstellen der Fusebits gibt es hier:&lt;br /&gt;
[http://www.arexx.com/rp6/downloads/RP6BASE_BOOTLOADER.zip RP6_BOOTLOADER]&lt;br /&gt;
&lt;br /&gt;
====IO1..IO4====&lt;br /&gt;
[[Bild:RP6_IO1-4.JPG|thumb|RP6 IO1..IO4]]&lt;br /&gt;
Die Anschlüsse IO1 bis IO4 (SP2 E3: IO1..4) steuern bereits die Status-LEDs 1, 2, 4 und 5 an. Trotzdem kann man sie auch noch mit leichten Einschränkungen als I/O-Pins benutzen. Dazu lötet man zweimal 2 Pins einer 1-reihigen Stiftleiste RM 2,54mm (z.B. 36-polig 732478) auf die IO1/2 und IO3/4 Lötpunkte.&lt;br /&gt;
Hier eine Tabelle, die die Port-Pins zeigt, die IO1..IO4 zugeordnet sind:&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |IO&lt;br /&gt;
 |Status-LED&lt;br /&gt;
 |Port-Pin&lt;br /&gt;
 |-&lt;br /&gt;
 |1&lt;br /&gt;
 |SL1&lt;br /&gt;
 |PC4&lt;br /&gt;
 |-&lt;br /&gt;
 |2&lt;br /&gt;
 |SL2&lt;br /&gt;
 |PC5&lt;br /&gt;
 |-&lt;br /&gt;
 |3&lt;br /&gt;
 |SL4&lt;br /&gt;
 |PB7&lt;br /&gt;
 |-&lt;br /&gt;
 |4&lt;br /&gt;
 |SL5&lt;br /&gt;
 |PB1&lt;br /&gt;
 |-&lt;br /&gt;
|}&lt;br /&gt;
Wie können nun IO1..IO4 genutzt werden?&lt;br /&gt;
&lt;br /&gt;
Als ...&lt;br /&gt;
* Eingang, z.B. für zusätzliche Tastschalter/Bumper&lt;br /&gt;
* Ausgang, z.B. zur Ansteuerung von Treiberstufen, low-current LEDs, ...&lt;br /&gt;
&lt;br /&gt;
Wird ein Anschluß IOx als Eingang verwendet, muss ein Widerstand von 470 Ohm in Reihe mit dem Taster an VDD eingebaut werden, zusätzlich ein Pulldown-Widerstand 100 kOhm. Diese Beschaltung zeigen z.B. an SL6 die Widerstände R43 und R46 (SP2 E4: R43, R46).&lt;br /&gt;
&lt;br /&gt;
Als Ausgang geschaltet sollte an IOx kein hoher Strom entnommen werden: 10mA sind max. zu empfehlen!&lt;br /&gt;
&lt;br /&gt;
====USRBUS====&lt;br /&gt;
Die 14 Kontakte der beiden USRBUS-Stecker sind auf dem RP6 nirgendwo angeschlossen, sondern können über die Lötpunkte Y1..Y14 mit beliebigen Punkten auf dem Mainboard verbunden werden.&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_USRBUS.JPG|thumb|RP6 USRBUS]]&lt;br /&gt;
&lt;br /&gt;
Ich würde auf Y1..Y14 eine Stiftleiste löten, damit die USRBUS-Belegung geändert werden kann.&lt;br /&gt;
&lt;br /&gt;
Man braucht dazu:&lt;br /&gt;
* 2-reihige Stiftleiste RM 2,54mm (z.B. 2x36-polig 742007)&lt;br /&gt;
* Einige Steckbuchsen mit Litze&lt;br /&gt;
&lt;br /&gt;
Man trennt von der 2-reihigen Stiftleiste 2x7 Kontakte ab und lötet sie auf die Punkte Y1..Y14 (SP4 E34: Y1..14, Y1'..Y14') neben den beiden Wannensteckern USRBUS1 (vorn) und USRBUS2 (hinten). Wird der RP6 über Flachkabel mit einem USRBUS-Stecker auf einer RP6 Experimentierplatine (EP) und/oder mit einer Erweiterungsplatine (M32, CCPRO M128) verbunden, dann hat man mit allen mit dem USRBUS verbundenen Platinen eine direkte 14-polige Verbindung,- eben den &amp;quot;User Bus&amp;quot;. Den kann man dann nutzen, wie man will. Auf dem RP6 kann man mit Steckbuchsen die Pins Y1..Y14 mit anderen Pins verbinden.&lt;br /&gt;
&lt;br /&gt;
Beispiel: Verbindet man den Pin &amp;quot;ADC0&amp;quot; mit Y1 des USRBUS1, dann steht der Eingang ADC0 auf allen an den USRBUS1 angeschlossenen Platinen auf dem vorderen Platinenstapel an Y1 zur Verfügung. Man braucht also diesen Eingang nicht über ein eigenes Kabel auf eine EP zu führen, sondern kann dazu den USRBUS nehmen. Dadurch bleibt der Gesamtaufbau auf dem RP6 übersichtlich und komplett trennbar (man braucht nur die Stecker XBUS und USRBUS abzuziehen!).&lt;br /&gt;
&lt;br /&gt;
Wichtig:&lt;br /&gt;
* Man sollte gut dokumentieren, wie man den USRBUS am RP6 (vorn und hinten getrennt!), auf EPs und der M32/M128 benutzt! Sonst kann es bei einer anderen Anordnung von EPs zu USRBUS Konflikten/Kurzschlüssen kommen.&lt;br /&gt;
* Der USRBUS1- und der USRBUS2-Stecker sind auf dem RP6 NICHT miteinander verbunden.&lt;br /&gt;
&lt;br /&gt;
Einen Vorschlag für die Belegung des USRBUS1 (vorn) gibt es z.B. &lt;br /&gt;
[http://www.roboternetz.de/phpBB2/viewtopic.php?t=32549 hier] oder &lt;br /&gt;
[http://www.roboternetz.de/community/showthread.php/47102-Sensor-anschließen?p=453061&amp;amp;viewfull=1#post453061 da.]&lt;br /&gt;
&lt;br /&gt;
====Start/Stop Button====&lt;br /&gt;
[[Bild:RP6_ST.JPG|thumb|RP6 ST]]&lt;br /&gt;
Am mittleren Lochrasterfeld links finden sich zwei Lötpunkte ST1, ST2 (SP2 D2: ST1, ST2), an die weitere Start/Stop Taster (NO, normal offen) parallel zum Taster auf dem RP6 Mainboard angeschlossen werden können.&lt;br /&gt;
&lt;br /&gt;
Zum Anschluß kann man auch Stiftleisten auflöten. ST1, ST2 könnte man auch mit dem USRBUS1 verbinden, wenn man den RP6 z.B. von einer EP aus zurücksetzen möchte.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Serielle Schnittstelle====&lt;br /&gt;
[[Bild:RP6_RST.JPG|thumb|RP6 RST]]&lt;br /&gt;
Neben dem USRBUS1 Stecker befinden sich 5 Lötpunkte mit den Signalen RST, TX, RX, GND, VDD (SP4 AB5: YRX, YTX, YMRESET, YVDD). Hier kann z.B. eine 5-polige Stiftleiste aufgelötet werden, um einen Anschluß an die serielle Schnittstelle zu ermöglichen.&lt;br /&gt;
&lt;br /&gt;
Von diesen 5 Lötpunkten könnte z.B. auch [http://www.roboternetz.de/phpBB2/viewtopic.php?t=32549 so] eine Verbindung zum benachbarten USRBUS1 hergestellt werden, um die serielle Schnittstelle des RP6 auf EPs zu führen.&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;
&lt;br /&gt;
====I2C-Schnittstelle====&lt;br /&gt;
[[Bild:RP6_I2C.JPG|thumb|RP6 I2C]]&lt;br /&gt;
Neben dem XBUS2 Stecker finden sich 5 Lötpunkte mit den Signalen der I2C-Schnittstelle (SP4 D12: Stecker I2C). Dies sind: VDD (Pin 1), GND, SDA, SCL, INT1 (Pin 5). Hier kann z.B. eine 5-polige Stiftleiste aufgelötet werden, um einen Anschluß an die I2C-Schnittstelle zu ermöglichen.&lt;br /&gt;
&lt;br /&gt;
Von diesen 5 Lötpunkten könnte z.B. auch eine Verbindung zum USRBUS1 oder USRBUS2 hergestellt werden, um die I2C-Schnittstelle des RP6 auf EPs zu führen, allerdings hat man SCL, SDA, INT1 ja auch schon am XBUS zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Interrupt-Leitungen====&lt;br /&gt;
[[Bild:RP6_INTx.JPG|thumb|RP6 INTx]]&lt;br /&gt;
Die Interrupt-Leitungen INTU, INT1..3, MRESET (SP4 D34: MRESET, INT1..3, INTU) sind an 5 Lötpunkten neben dem XBUS1 Stecker zu kontaktieren. Hier kann natürlich auch eine 5-polige Stiftleiste aufgelötet werden. In der Regel wird man diese Anschlüsse nicht brauchen, weil sie schon auf dem XBUS zur Verfügung stehen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====VDD/GND/+UB Anschluß====&lt;br /&gt;
[[Bild:RP6_VDDGNDUB.JPG|thumb|RP6 VDD GND +UB]]&lt;br /&gt;
In der Nähe von C4 im hinteren Bereich des Mainboards finden sich Lötpunkte (SP4 E12: YVDDx, YGNDx; SP4 D2 YUBx), an denen man VDD, GND und +UB finden kann.&lt;br /&gt;
&lt;br /&gt;
Wenn man höhere Ströme an VDD (z.B. für Servos) oder +UB (z.B. für einen anderen IRCOMM-Sender oder einen DC-Motor) entnehmen möchte, empfehlen sich diese Lötpunkte, auf die man auch Stiftleisten löten kann.&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;
====EXT Anschluß====&lt;br /&gt;
[[Bild:RP6_EXT.jpg|thumb|RP6 EXT Anschluß]]&lt;br /&gt;
Am hinteren Rand der RP6 Hauptplatine gibt es eine Reihe von 8 Lötpunkten. Dies ist der EXT Anschluß (SP1 C23: Stecker EXT):&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |Pin&lt;br /&gt;
 |Name&lt;br /&gt;
 |Beschreibung&lt;br /&gt;
 |-&lt;br /&gt;
 |1&lt;br /&gt;
 |GND&lt;br /&gt;
 |RP6 und Akku Minuspol (GND)&lt;br /&gt;
 |-&lt;br /&gt;
 |2&lt;br /&gt;
 |CHRG&lt;br /&gt;
 |Anschluß (+) für ext. Ladegerät, identisch mit Pluspol der Ladebuchse (CHARGER, Pin 1). Ladung nur möglich, wenn S1 AUS ist!&lt;br /&gt;
 |-&lt;br /&gt;
 |3&lt;br /&gt;
 |CHRG&lt;br /&gt;
 |wie Pin 2!&lt;br /&gt;
 |-&lt;br /&gt;
 |4&lt;br /&gt;
 | +BAT&lt;br /&gt;
 |Akku Pluspol über Sicherung F1&lt;br /&gt;
 |-&lt;br /&gt;
 |5&lt;br /&gt;
 | +BAT&lt;br /&gt;
 |wie Pin 4!&lt;br /&gt;
 |-&lt;br /&gt;
 |6&lt;br /&gt;
 | +UB&lt;br /&gt;
 |RP6 +UB (+7,2V=, Bereich min. +5,5 bis max. +10V=)&lt;br /&gt;
 |-&lt;br /&gt;
 |7&lt;br /&gt;
 | +UB&lt;br /&gt;
 |wie Pin 6!&lt;br /&gt;
 |-&lt;br /&gt;
 |8&lt;br /&gt;
 |GND&lt;br /&gt;
 |wie Pin 1!&lt;br /&gt;
 |-&lt;br /&gt;
|}&lt;br /&gt;
Man kann hier eine JST XH Stiftleiste gerade, 8-polig, RM 2,5mm ([http://www.conrad.de/ce/de/product/740105/Stiftleiste-gerade-RM-25-mm-Serie-XH-Rastermass-25-mm-Pole-8-Nennstrom-3-A-B8B-XH-A-LFSN-JST-Inhalt-1-St 740105]) auflöten.&lt;br /&gt;
&lt;br /&gt;
Wozu kann man diesen Anschluß nutzen?&lt;br /&gt;
&lt;br /&gt;
Der wesentliche Sinn des EXT Anschlusses besteht darin, andere Arten der Stromversorgung und der Akkuladung zu ermöglichen. Normalerweise schaltet man den RP6 mit S1 an und aus. In Stellung AUS kann der Akku geladen werden, indem man ein Ladegerät an die CHARGER Buchse anschließt. Alternativ kann man das Ladegerät mit seinem Pluspol auch an CHRG (Pins 2, 3) anschließen. Siehe auch den Abschnitt &amp;quot;Trennstellen - EXT Anschluß: Andere Stromversorgung&amp;quot; weiter unten!&lt;br /&gt;
&lt;br /&gt;
An +BAT (Pins 4, 5) kann man direkt (ohne Unterbrechung durch S1) Strom aus dem Akku entnehmen. Die Grenze des Stroms bestimmt die Sicherung F1 (2,5A). Eine weitere Möglichkeit besteht darin, über diesen Anschluß den Akku auch mit einem geeigneten Ladegerät zu LADEN. Hierbei muss man aber darauf achten, dass S1 AUSgeschaltet ist, weil sonst der RP6 über +UB eine unzulässig hohe Spannung bekommen könnte. Wenn man den Akku mit 6 Mignonzellen im RP6 nicht nutzen will (der Akku-Halter bleibt leer!), sondern nur einen externen Akku, wäre der auch mit seinem Pluspol an +BAT über eine eigene Sicherung (2,5A träge) anzuschließen.&lt;br /&gt;
&lt;br /&gt;
+UB (+7,2V) ist die Versorgungsspannung des RP6 (kommt vom Akku-Pluspol über die Sicherung F1 und Schalter S1!). Mit +UB werden die H-Brücken (Motoransteuerung) direkt und die RP6 &amp;quot;Elektronik&amp;quot; über den 5V-Spannungswandler (IC1; SP1 D3: IC1) versorgt (= VDD). An +UB könnte man den RP6 direkt mit einer Spannung von +7,2V versorgen (Absicherung nicht vergessen!), dazu muss S1 AUSgeschaltet sein, damit es keine Konflikte mit dem eingebauten Akku gibt.&lt;br /&gt;
&lt;br /&gt;
Den EXT Anschluß kann man damit nutzen für:&lt;br /&gt;
* Externes Ladegerät&lt;br /&gt;
* Externen Akku&lt;br /&gt;
* Externe Stromversorgung ohne Akku&lt;br /&gt;
* Direkte Stromentnahme aus dem Akku&lt;br /&gt;
* Ergänzungsladung mit Solarzelle&lt;br /&gt;
* Autonome Akkuladung (Ladestation mit Kontakten, Induktionsladung ...)&lt;br /&gt;
* ...&lt;br /&gt;
&lt;br /&gt;
Man sollte gewisse Elektronik-Kenntnisse haben, wenn man die Spannungsversorgung des RP6 verändert. VOR irgendwelchen Veränderungen seht euch auch zuerst den Schaltplan des RP6 (SP1) genau an!&lt;br /&gt;
&lt;br /&gt;
===Mess-/Kontaktpunkte===&lt;br /&gt;
Hier geht es um Kontaktpunkte, an denen man z.B. den Logik-Pegel (High/Low) oder eine analoge Spannung messen kann. Natürlich kann man die Signale auch zur Weiterleitung auf eine EP kontaktieren, dies wird man aber normalerweise nicht brauchen.&lt;br /&gt;
&lt;br /&gt;
====UBAT====&lt;br /&gt;
[[Bild:RP6_UBAT.JPG|thumb|RP6 UBAT]]&lt;br /&gt;
In der Mitte des Mainboards befindet sich ein Kontaktpunkt UBAT (SP1 E1: YUBAT). Dies ist ADC7 des RP6 Microcontrollers.&lt;br /&gt;
&lt;br /&gt;
Man kann hier die analoge Spannung (gegen GND) messen, die vom +UB-Spannungssensor geliefert wird.&lt;br /&gt;
&lt;br /&gt;
Die Spannung ist:&lt;br /&gt;
 UBAT = +UB / 2&lt;br /&gt;
Da der Spannungsteiler (SP1 D12: R1, R2) des +UB-Spannungssensors nicht aus Präzisionswiderständen besteht, kann man für den eigenen RP6 einen Korrekturfaktor berechnen, wenn UBAT deutlich von +UB / 2 (+ UB z.B. gemessen am EXT Stecker, Pins 6 u. 7) abweicht. Damit kann man +UB sehr viel genauer bestimmen.&lt;br /&gt;
&lt;br /&gt;
====ACS====&lt;br /&gt;
[[Bild:RP6_ACS_TSOP.JPG|thumb|RP6 ACS TSOP]]&lt;br /&gt;
Hinter dem TSOP (IC3) befindet sich der Kontaktpunkt ACS (SP2 E1: ACS).&lt;br /&gt;
&lt;br /&gt;
Dies ist der Ausgang des TSOP bzw. Eingang PB2 des RP6 Microcontrollers. Man kann hier das Ausgangssignal des IR-Empfängers abnehmen, z.B. um es mit einem Oszilloskop sichtbar zu machen.&lt;br /&gt;
&lt;br /&gt;
Rechts neben dem TSOP kann man noch die 3 Kontaktpunkte ACS_R, ACS_P und ACS_L (SP2 E2: ACS_P, ACS_R, ACS_L) des ACS-IR-Senders finden.&lt;br /&gt;
&lt;br /&gt;
Folgende Tabelle zeigt die Verbindungen:&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |Kontakt&lt;br /&gt;
 |Microcontroller-Portpin&lt;br /&gt;
 |SP-Verbindung&lt;br /&gt;
 |ACS-IR-Sendediode&lt;br /&gt;
 |-&lt;br /&gt;
 |ACS_P&lt;br /&gt;
 |über R8: ACS_PWRH (PB3), über R9: ACS_PWR (PD6)&lt;br /&gt;
 |SP2: 3&lt;br /&gt;
 |Anoden D1, D2&lt;br /&gt;
 |-&lt;br /&gt;
 |ACS_R&lt;br /&gt;
 |ACS_R (PC7)&lt;br /&gt;
 |SP2: 2&lt;br /&gt;
 |Kathode D1&lt;br /&gt;
 |-&lt;br /&gt;
 |ACS_L&lt;br /&gt;
 |ACS_L/MISO (PB6)&lt;br /&gt;
 |SP1: 5&lt;br /&gt;
 |Kathode D2&lt;br /&gt;
 |-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====IRC====&lt;br /&gt;
[[Bild:RP6_IRC.JPG|thumb|RP6 IRC]] [[Bild:RP6_IRC3.JPG|thumb|RP6 IRC3]]&lt;br /&gt;
Im der Nähe von C13 befinden sich die Lötpunkte IRC, IRC+, IRC- und IRC3 (SP2 D2: YIRC; SP2 CD2: IRC+/-; SP2 C2: IRC3). Zusammen mit der Trennstelle IRC (siehe Abschnitt &amp;quot;Trennstellen - IRC&amp;quot; weiter unten!) kann man diese Kontaktstellen im Umfeld des IRCOMM-Sendedioden Treibers IRLML2502PBF (SP2 CD12: Q5) finden. Am Kontaktpunkt IRC findet sich der Eingang des Treibers bzw. Ausgang PD7 des RP6 Microcontrollers. IRC+, IRC- sind die Kontaktpunkte, an denen die IRCOMM-Sendedioden D3, D4 in Reihe auf der Sensorplatine angeschlossen sind (IRC+ = Anode). IRC3 ist verbunden mit dem Trennstellen-Lötpunkt IRC1 und liegt bei geschlossener Trennstelle IRC an +UB.&lt;br /&gt;
&lt;br /&gt;
Was läßt sich mit diesen Kontaktpunkten machen:&lt;br /&gt;
* Der IRCOMM-Sender ist der zweitgrößte Stromverbraucher des RP6 (nach dem Antrieb). An IRC3 kann daher eine eigene Stromversorgung für die IRCOMM-Sendedioden angeschlossen werden. Dazu muss die Trennstelle IRC zwischen ihren Lötpunkten IRC1, IRC2 aufgetrennt werden.&lt;br /&gt;
* An IRC+, IRC- könnten andere/weitere IRCOMM-Sendedioden angeschlossen werden (Anode an IRC+). Wenn der Vorwiderstand R6 (SP2 C2: R6) der Sendedioden dann nicht mehr paßt (bezügl. Leistung und/oder Widerstandswert), können neue leistungsfähigere IRCOMM-Sendedioden zwischen IRC3 und IRC- (Anode an IRC3) mit einem dafür geeigneten Vorwiderstand angebracht werden.&lt;br /&gt;
&lt;br /&gt;
====LS====&lt;br /&gt;
[[Bild:RP6_LS.JPG|thumb|RP6 LS]]&lt;br /&gt;
Die beiden Lötpunkte LS_L und LS_R (SP2 B12: LS_L, LS_R) neben R7 vorn auf dem Mainboard sind die Ausgänge der Helligkeitssensoren (links und rechts) bzw. die ADC-Eingänge ADC3 und ADC2 des RP6 Microcontrollers.&lt;br /&gt;
&lt;br /&gt;
Hier kann man die Spannungen messen, die den Helligkeitswerten entsprechen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====BP, S====&lt;br /&gt;
[[Bild:RP6_BP_S.JPG|thumb|RP6 BP S]]&lt;br /&gt;
Die Messpunkte BPL, BPR und der Kontaktpunkt S (SP2 E2: S; SP2 E3: BPR; SP2 E4: BPL) befinden sich am vorderen Platinenrand. BPL und BPR sind die Kontakte der Bumper. S ist eine nicht genutzte Verbindung zwischen dem Mainboard und der Sensorplatine, die über die Verbindung SP1, Pin 3, geführt wird (siehe folgende Tabelle!).&lt;br /&gt;
&lt;br /&gt;
Hier eine Tabelle mit der Belegung der 90°-Winkelverbindung SP1, SP2 zwischen dem RP6 Mainboard und der Sensorplatine: &lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |Pin&lt;br /&gt;
 |SP1&lt;br /&gt;
 |SP2&lt;br /&gt;
 |-&lt;br /&gt;
 |1&lt;br /&gt;
 |LS_L  --- Light Sensor Left&lt;br /&gt;
 |IRC-  --- IRCOMM-&lt;br /&gt;
 |-&lt;br /&gt;
 |2&lt;br /&gt;
 |BPL   --- Bumper Left&lt;br /&gt;
 |ACS_R --- ACS Right&lt;br /&gt;
 |-&lt;br /&gt;
 |3&lt;br /&gt;
 |S     --- Free for all&lt;br /&gt;
 |ACS_P --- ACS Power&lt;br /&gt;
 |-&lt;br /&gt;
 |4&lt;br /&gt;
 |GND&lt;br /&gt;
 |VDD&lt;br /&gt;
 |-&lt;br /&gt;
 |5&lt;br /&gt;
 |ACS_L --- ACS Left&lt;br /&gt;
 |BPR   --- Bumper Right&lt;br /&gt;
 |-&lt;br /&gt;
 |6&lt;br /&gt;
 |IRC+  --- IRCOMM+&lt;br /&gt;
 |LS_R  --- Light Sensor Right&lt;br /&gt;
 |-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====ENC====&lt;br /&gt;
[[Bild:RP6_ENC.JPG|thumb|RP6 ENC]]&lt;br /&gt;
Die beiden Messpunkte ENCL, ENCR (SP4 B12: ENCL, ENCR) sind die Ausgänge der Radencoder. ENCL ist verbunden mit PD2 (INT0), ENCR mit PD3 (INT1) des RP6 Microcontrollers.&lt;br /&gt;
&lt;br /&gt;
===Trennstellen===&lt;br /&gt;
An diesen Stellen können Leiterbahnen unterbrochen werden, um Funktionen zu deaktivieren oder anders zu nutzen.&lt;br /&gt;
&lt;br /&gt;
=====Getrennte Stromversorgung für ADC0/1=====&lt;br /&gt;
Wenn man für die analogen Sensoren an ADC0/1 (siehe Abschnitt &amp;quot;Anschlüsse - Analoge Sensoren an ADC0/1&amp;quot; weiter oben!) eine GETRENNTE Stromversorgung vorsehen will und/oder mit Codierbrücke (oder MOSFET) die Stromversorgung abschaltbar machen möchte, muss man erst Vorarbeit leisten.&lt;br /&gt;
[[Bild:RP6_SV.JPG|thumb|RP6 SV]]&lt;br /&gt;
&lt;br /&gt;
Man braucht dazu:&lt;br /&gt;
* 1-reihige Stiftleiste RM 2,54mm (z.B. 36-polig 732478)&lt;br /&gt;
* Evtl.: Eine Codierbrücke (z.B. aus Set 742902)&lt;br /&gt;
* Evtl.: Eine 1-polige Steckbuchse mit Litze zur ext. Stromversorgung&lt;br /&gt;
Es muss eine kurze Leiterbahn zwischen den Punkten &amp;quot;SV1&amp;quot; und &amp;quot;SV2&amp;quot; (SP2 A1: SV1, SV2; zwischen dem PROG/UART- und dem USRBUS1-Stecker) aufgetrennt werden. Die Leiterbahn befindet sich auf der Lötseite der Platine und muss mit einem scharfen Messer oder einem speziellen Leiterbahn-Unterbrecher zwischen den beiden Lötpunkten unterbrochen werden. Man sollte anschließend mit einem Widerstandsmeßgerät zwischen SV1 und SV2 nachmessen: Es sollte keine Verbindung mehr bestehen. Jetzt trennt man von der 1-reihigen Stiftleiste 2 Kontakte ab und lötet sie auf die Punkte SV1/SV2.&lt;br /&gt;
&lt;br /&gt;
Man kann hier zunächst eine Codierbrücke aufstecken. Damit versorgt der RP6 Akku die Sensoren mit 5V an den Pins VDD. Möchte man später eine getrennte 5V-Spannung anlegen, zieht man einfach die Codierbrücke ab und speist die externe 5V-Spannung (mit einer 1-poligen Steckbuchse) am Pin SV2 ein. Achtung: An Pin SV1 wird dann nichts angeschlossen!&lt;br /&gt;
&lt;br /&gt;
Anstelle der Codierbrücke kann man natürlich auch einen MOSFET anschließen, um die Sensoren per Software abschalten zu können.&lt;br /&gt;
&lt;br /&gt;
====ACS====&lt;br /&gt;
[[Bild:RP6_ACS_JP.JPG|thumb|RP6 ACS JP]]&lt;br /&gt;
Die Trennstelle ACS (SP2 E1: YIR1, YIR2; SP2 F1: YIR3) befindet sich neben C29*. Sie besteht aus 3 Lötpunkten, von denen die linken beiden (IRC1, IRC2) verbunden sind. Trennt man die Leiterbahn zwischen diesen Lötpunkten auf und verbindet stattdessen die rechten beiden Lötpunkte (IRC2, IRC3) mit etwas Lötzinn oder mit einem SMD Null Ohm Widerstand, dann ist der IR-Empfänger (TSOP, IC3) dauerhaft EINgeschaltet und kann nicht mehr über das Signal PWRON (PB4) geschaltet werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====IRC====&lt;br /&gt;
[[Bild:RP6_IRC_JP.JPG|thumb|RP6 IRC JP]]&lt;br /&gt;
Die Trennstelle IRC (SP2 C1: IRC1..2) ist eng verknüpft mit den Mess- und Kontaktpunkten des IRCOMM-Senders (siehe Abschnitt &amp;quot;Mess-/Kontaktpunkte - IRC&amp;quot; weiter oben!). Wenn man sie auftrennt, kann man den IRCOMM-Sender mit einer getrennten Stromversorgung anstelle von +UB des RP6 versehen. Dies ist sehr sinnvoll, wenn man diese Funktion häufig verwendet oder sogar noch leistungsfähigere IR-Sendedioden einbaut, denn der IRCOMM-Sender ist der zweitgrößte Stromfresser (nach dem Antrieb) auf dem RP6 (von Erweiterungsplatinen und EPs Marke Eigenbau einmal abgesehen!). Man kann hier natürlich auch eine 2-polige Stiftleiste einlöten, um die Verbindung zu +UB mit einer Codierbrücke trennbar zu machen. Eine getrennte Stromversorgung +7,2V (Bereich: +5,5 .. +10V) kann man an IRC1 einspeisen. IRC1 dieser Trennstelle ist mit dem Kontaktpunkt IRC3 (siehe Abschnitt &amp;quot;Mess-/Kontaktpunkte - IRC&amp;quot; weiter oben!) verbunden. &lt;br /&gt;
&lt;br /&gt;
====RP6 Antrieb====&lt;br /&gt;
Mit den folgenden Trennstellen kann man den RP6 Antrieb (H-Brücken und Motoren) fast komplett vom Rest des RP6 Mainboards abtrennen (es bleibt nur die 5V-Versorgung (VDD) von IC4, T1, T2 bestehen!). Damit ist es möglich, mit dem RP6 Mainboard einen ganz anderen Antrieb (also z.B. ein anderes Roboter-Chassis mit eigenen Motoren und H-Brücken) zu steuern. Umgekehrt könnte man den RP6 Antrieb auch deshalb abtrennen, um ihn durch ein anderes Prozessorsystem (z.B. auch eine M32!) anzusteuern. It's up to you!&lt;br /&gt;
&lt;br /&gt;
=====+UB Power=====&lt;br /&gt;
[[Bild:RP6_HB_Power.jpg|thumb|RP6 HB Power]]&lt;br /&gt;
Der RP6 Antrieb wird direkt aus dem Akku (über S1 und F1) mit 7,2V (+UB) versorgt. Diese Stromversorgung kann man komplett abtrennen. Die Trennstelle (SP3 E34: X) liegt unter der Sicherung F1 (siehe Abb. RP6 HB Power). Zwischen den beiden doppelten Lötflächen befinden sich auf der Lötseite (Unterseite) des Mainboards vier parallele Leiterbahnen, die aufgetrennt werden müssen. Der Pluspol einer externen Spannung zur Versorgung des RP6 Antriebs kann dann mit einer Kabelverbindung an den doppelten Lötflächen (mit einem &amp;quot;+&amp;quot; gekennzeichnet) direkt neben dem Leistungswiderstand (R27) angeschlossen werden. Eine Absicherung dieser Stromversorgung sollte man unbedingt vorsehen (2,5A träge)!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=====Stromsensoren=====&lt;br /&gt;
[[Bild:RP6_CS.JPG|thumb|RP6 CS]]&lt;br /&gt;
Um den Motorstrom der beiden Motoren des RP6 zu messen, wird ein Dual-Operationsverstärker (IC5 = 27M2C; SP3 B23/D23: IC5B/A) eingesetzt. Dieses IC wird über PWRON (PB4) mit Strom versorgt. Die Stromsensoren funktionieren also nicht, wenn PWRON Low-Pegel führt (Befehl powerOFF() der RP6 Library!). Auf dem RP6 Mainboard gibt es eine Trennstelle mit drei Lötflächen (SP3 E34: CS1, CS2, CS3). Sie befindet sich auf dem Mainboard neben C23. Möchte man IC5 nicht mehr über PWRON mit Strom versorgen, sondern über VDD (+5V), dann trennt man die Leiterbahn zwischen den linken beiden Lötpunkten (CS1, CS2) auf und verbindet die rechten beiden Lötpunkte (CS2, CS3) mit etwas Lötzinn oder einem SMD Null Ohm Widerstand. Danach sind die Stromsensoren immer eingeschaltet und können über PWRON nicht mehr geschaltet werden. Alternativ kann man an CS2 auch eine externe Versorgungsspannung (+5V) für IC5 einspeisen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=====DR/MR/ML/DL=====&lt;br /&gt;
[[Bild:RP6_DR_MR_ML_DL.JPG|thumb|RP6 DR MR ML DL]]&lt;br /&gt;
An diesen Trennstellen können die Eingänge der H-Brücke für die Geschwindigkeit (PWM) und Drehrichtung der Motoren von den Portpins des Microcontrollers abgetrennt werden.&lt;br /&gt;
Für den rechten Motor sind dies die Trennstellen MR1/2 und DR1/2 (SP3 A23: MR1/2, DR1/2), für den linken Motor ML1/2 und DL1/2 (SP3 F23: ML1/2, DL1/2).&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |Trennstelle&lt;br /&gt;
 |Portpin&lt;br /&gt;
 |Funktion H-Brücke&lt;br /&gt;
 |-&lt;br /&gt;
 |MR1/2&lt;br /&gt;
 |PD5 (OC1A)&lt;br /&gt;
 |PWM Motor rechts&lt;br /&gt;
 |-&lt;br /&gt;
 |DR1/2&lt;br /&gt;
 |PC3 (TMS)&lt;br /&gt;
 |Fahrtrichtung rechts&lt;br /&gt;
 |-&lt;br /&gt;
 |ML1/2&lt;br /&gt;
 |PD4 (OC1B)&lt;br /&gt;
 |PWM Motor links&lt;br /&gt;
 |-&lt;br /&gt;
 |DL1/2&lt;br /&gt;
 |PC2 (TCK)&lt;br /&gt;
 |Fahrtrichtung links&lt;br /&gt;
 |-&lt;br /&gt;
|}&lt;br /&gt;
Trennt man die Leiterbahn (auf der Lötseite des RP6 Mainboards) zwischen den Lötpunkten der Trennstellen auf, kann man die Eingänge der H-Brücke (Mx1, Dx1) z.B. mit einem anderen Microcontroller verbinden. Die Ausgänge (Portpins) des RP6 Microcontrollers (Mx2, Dx2) können dann anders genutzt werden. Natürlich kann man auf die Lötpunkte dieser Trennstellen auch Stiftleisten löten, um den Anschluß steckbar zu machen.&lt;br /&gt;
&lt;br /&gt;
=====MCR/MCL=====&lt;br /&gt;
[[Bild:RP6_MCR_MCL.JPG|thumb|RP6 MCR MCL]]&lt;br /&gt;
An diesen Trennstellen können die Motorstromsensoren von den ADC-Eingängen des Microcontrollers abgetrennt werden.&lt;br /&gt;
&lt;br /&gt;
Für den rechten Sensor ist dies die Trennstelle MCR1/2 (SP3 A1: MCR1, MCR2), für den linken Sensor MCL1/2 (SP3 E1: MCL1, MCL2).&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |Trennstelle&lt;br /&gt;
 |Portpin&lt;br /&gt;
 |Funktion H-Brücke&lt;br /&gt;
 |-&lt;br /&gt;
 |MCR1/2&lt;br /&gt;
 |PA5 (ADC5)&lt;br /&gt;
 |Motorstrom rechts&lt;br /&gt;
 |-&lt;br /&gt;
 |MCL1/2&lt;br /&gt;
 |PA6 (ADC6)&lt;br /&gt;
 |Motorstrom links&lt;br /&gt;
 |-&lt;br /&gt;
|}&lt;br /&gt;
Trennt man die Leiterbahn (auf der Lötseite des RP6 Mainboards) zwischen den Lötpunkten der Trennstellen auf, kann man die ADC-Eingänge (Portpins) des RP6 Microcontrollers (MCx1) anders nutzen und die Ausgänge der Motorstromsensoren (MCx2) z.B. mit ADC-Eingängen eines anderen Microcontrollers verbinden. Natürlich kann man auf die Lötpunkte dieser Trennstellen auch Stiftleisten löten, um den Anschluß steckbar zu machen.&lt;br /&gt;
&lt;br /&gt;
====PWRON-LED====&lt;br /&gt;
[[Bild:RP6_PWRON_L.JPG|thumb|RP6 PWRON L]]&lt;br /&gt;
Auf dem RP6 Mainboard gibt es eine gelbe LED, die anzeigt, ob PWRON High-Pegel hat. Mit einer Trennstelle neben dieser LED (SP2 D4: YL1, YL2) kann diese LED deaktiviert werden (z.B. um Strom zu sparen).&lt;br /&gt;
&lt;br /&gt;
Dazu trennt man die Leiterbahn zwischen den Lötpunkten auf. Soll die LED wieder aktiviert werden, verbindet man die Lötpunkte wieder mit etwas Lötzinn oder einem SMD Null Ohm Widerstand.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====+UB Sensor====&lt;br /&gt;
[[Bild:RP6_UB.JPG|thumb|RP6 UB]]&lt;br /&gt;
Die Versorgungsspannung +UB des RP6 wird mit dem +UB-Spannungssensor an PA7 (ADC7) gemessen. Will man diesen Spannungssensor mit seinem Eingangsspannungsteiler R1, R2 (SP1 D12: R1, R2) von +UB abtrennen (z.B. um ihn anders zu verwenden), gibt es eine Trennstelle UB1/2 (SP1 D2: UB1, UB2). Trennt man die Leiterbahn auf der Lötseite des RP6 Mainboards zwischen den Lötpunkten auf, kann +UB nicht mehr gemessen werden. Man kann dann den Lötpunkt UB2 mit einem anderen Messpunkt (z.B. mit +BAT) verbinden und dort die Spannung (0..10V) messen. Natürlich kann man auf die Lötpunkte dieser Trennstellen auch Stiftleisten löten, um den Anschluß steckbar zu machen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====EXT Anschluß: Andere Stromversorgung====&lt;br /&gt;
[[Bild:RP6_S1_CHRG.jpg|thumb|RP6 S1 CHRG]]&lt;br /&gt;
Wenn man für den RP6 eine andere Stromversorgung oder Ladeschaltung anschließen will, geht dies gut am EXT Anschluß (SP1 C23: Stecker EXT). Siehe auch den Abschnitt &amp;quot;Anschlüsse - EXT Anschluß&amp;quot; weiter oben! Dann muss der Schalter S1 dauerhaft AUSgeschaltet bleiben und die Verbindung zwischen S1 und CHRG des EXT Anschlusses (SP1 C3: X) unterbrochen werden. Diese Trennstelle befindet sich auf der Lötseite (Unterseite) des RP6 Mainboards etwas versteckt zwischen S1 (Pin 3) und der benachbarten Leiterbahn, die CHRG des EXT Anschlusses mit der Ladebuchse CHARGER (Pin 1 +) verbindet. Dort sind fünf kurze, parallele Leiterbahnen zu unterbrechen (siehe gelbe Markierung in der Abb. RP6 S1 CHRG!). Will man das nicht machen, darf man die Ladebuchse CHARGER auf jeden Fall nicht mehr nutzen!&lt;br /&gt;
&lt;br /&gt;
===Lochraster-Felder===&lt;br /&gt;
Auf diesen Feldern kann man eigene kleine Schaltungen aufbauen. An jedem der sechs Felder stehen VDD (+5V) und GND zur Verfügung (SP4 E12: YVDDx, YGNDx).&lt;br /&gt;
&lt;br /&gt;
Bitte beachten: Die Lochreihen oder -spalten, die mit einer eckigen Klammer &amp;quot;[&amp;quot; markiert sind, liegen auf der Lötseite (Unterseite) direkt auf dem Rahmen des Chassis! Hier können also keine Drähte von unten verlötet werden.&lt;br /&gt;
&lt;br /&gt;
====Vorn links====&lt;br /&gt;
Das kleine Lochrasterfeld vorn links kann z.B. für Beleuchtung (Blinker, Scheinwerfer links) oder auch für einen zusätzlichen Sensor genutzt werden.&lt;br /&gt;
Zur Verfügung steht eine 2-adrige Verbindung zum mittleren Lochrasterfeld links.&lt;br /&gt;
&lt;br /&gt;
In der Nähe dieses Lochrasterfeldes gibt es auch:&lt;br /&gt;
* IO3, IO4 (SP2 E3: IO3, IO4)&lt;br /&gt;
* ADC0 (SP2 B1: ADC0)&lt;br /&gt;
&lt;br /&gt;
====Mitte links====&lt;br /&gt;
[[Bild:RP6_Lochfeld_LM.JPG|thumb|RP6 Lochrasterfeld Mitte links]]&lt;br /&gt;
Das größere Lochrasterfeld Mitte links kann z.B. für eine kleinere Schaltung zur Ansteuerung der Beleuchtung/Sensoren auf den Lochrasterfeldern vorn und hinten links oder für andere Zwecke genutzt werden.&lt;br /&gt;
&lt;br /&gt;
Es stehen hier folgende Anschlüsse zur Verfügung:&lt;br /&gt;
* 2-adrige Verbindung zum Lochrasterfeld vorn links&lt;br /&gt;
* 2-adrige Verbindung zum Lochrasterfeld hinten links&lt;br /&gt;
* ST1/ST2 zum Anschluß weiterer Start/Stop Taster (SP2 D2: ST1/2)&lt;br /&gt;
* PWR (SP2 D2: YPWR1)&lt;br /&gt;
* I2C-Bus (SCL, SDA; SP4 C1: YSCL1, YSDA1)&lt;br /&gt;
* +UB (SP4 D2: YUB1)&lt;br /&gt;
In der Nähe dieses Lochrasterfeldes gibt es auch:&lt;br /&gt;
* Serielle Schnittstelle (RST, TX, RX; SP4 AB5: YRX, YTX, YMRESET, YVDD)&lt;br /&gt;
* USRBUS1 (vorn; SP4 E34: Y1'..Y14')&lt;br /&gt;
&lt;br /&gt;
=====Schaltungsvorschläge=====&lt;br /&gt;
Wie kann z.B. eine Schaltung für Beleuchtungseffekte oder Sensoren aussehen?&lt;br /&gt;
&lt;br /&gt;
Man könnte 8 zusätzliche Schaltkanäle mit dem I2C-Portexpander-IC PCF8574(A)P gewinnen. Dieses IC passt mit wenigen Zusatzteilen auf die mittlere Lochrasterfläche. Angesteuert wird es über den I2C-Bus. Mit den 8 Ausgängen lassen sich einige Beleuchtungseffekte erreichen, die dann über Software schaltbar sind.&lt;br /&gt;
&lt;br /&gt;
Alternativ kann man auch das IC PCF8591P z.B. für den Anschluß von analogen Sensoren verwenden. Auch dieser Baustein wird über I2C angesteuert. Beide ICs sind bei [http://www.reichelt.de./ Reichelt] erhältlich.&lt;br /&gt;
&lt;br /&gt;
Will man nicht den I2C-Bus benutzen, kann man als I/O-Ports IO1..IO4 oder als analoge Eingänge ADC0 und ADC1 verwenden. Auch SCL und SDA stehen als I/O-Ports zur Verfügung, wenn der I2C-Bus im ganzen System nicht verwendet werden soll.&lt;br /&gt;
&lt;br /&gt;
Wichtig für Zusatzschaltungen, die fest auf dem RP6 verlötet werden, sind zwei Aspekte:&lt;br /&gt;
* Wenn sie die Stromversorgung belasten, sollten sie (z.B. über einen Transistor oder MOSFET) abschaltbar sein. Dazu kann man auch das Signal PWR heranziehen, das auf beiden mittleren Lochrasterflächen zur Verfügung steht. Dann kann man mit dem Befehl &amp;quot;powerOFF()&amp;quot; der RP6 Library die Stromversorgung per Software abschalten.&lt;br /&gt;
* Wenn man auch anderweitig genutzte Portpins (SDA, SCL, IO1..IO4, ADC0/1) für die eigene Schaltung einsetzt, sollte man die Verbindung zu den Portpins mit einer abziehbaren Codierbrücke trennbar machen.&lt;br /&gt;
&lt;br /&gt;
====Hinten links====&lt;br /&gt;
Das kleine Lochrasterfeld hinten links kann z.B. für Beleuchtung (Blinker, Rücklicht links) oder auch für einen zusätzlichen Sensor genutzt werden.&lt;br /&gt;
Zur Verfügung steht eine 2-adrige Verbindung zum mittleren Lochrasterfeld links.&lt;br /&gt;
&lt;br /&gt;
In der Nähe dieses Lochrasterfeldes gibt es auch:&lt;br /&gt;
* EXT Anschluß (SP1 C23: Stecker EXT)&lt;br /&gt;
&lt;br /&gt;
====Vorn rechts====&lt;br /&gt;
Das kleine Lochrasterfeld vorn rechts kann z.B. für Beleuchtung (Blinker, Scheinwerfer rechts) oder auch für einen zusätzlichen Sensor genutzt werden.&lt;br /&gt;
Zur Verfügung steht eine 2-adrige Verbindung zum mittleren Lochrasterfeld rechts.&lt;br /&gt;
&lt;br /&gt;
In der Nähe dieses Lochrasterfeldes gibt es auch:&lt;br /&gt;
* IO1, IO2 (SP2 E3: IO1, IO2)&lt;br /&gt;
* ADC1 (SP2 B1: ADC1)&lt;br /&gt;
&lt;br /&gt;
====Mitte rechts====&lt;br /&gt;
Das größere Lochrasterfeld Mitte rechts kann z.B. für eine kleinere Schaltung zur Ansteuerung der Beleuchtung/Sensoren auf den Lochrasterfeldern vorn und hinten rechts oder für andere Zwecke genutzt werden.&lt;br /&gt;
&lt;br /&gt;
Es stehen hier folgende Anschlüsse zur Verfügung:&lt;br /&gt;
* 2-adrige Verbindung zum Lochrasterfeld vorn rechts&lt;br /&gt;
* 2-adrige Verbindung zum Lochrasterfeld hinten rechts&lt;br /&gt;
* PWR (SP2 D2: YPWR2)&lt;br /&gt;
* I2C-Bus (SCL, SDA; SP4 C1: YSCL2, YSDA2)&lt;br /&gt;
* +UB (SP4 D2: YUB2)&lt;br /&gt;
In der Nähe dieses Lochrasterfeldes gibt es auch:&lt;br /&gt;
* Interrupt-Anschluß (INTU, INT1..3, MRESET; SP4 D34: MRESET, INT1..3, INTU)&lt;br /&gt;
* USRBUS2 (hinten; SP4 E34: Y1..Y14)&lt;br /&gt;
&lt;br /&gt;
====Hinten rechts====&lt;br /&gt;
Das kleine Lochrasterfeld hinten rechts kann z.B. für Beleuchtung (Blinker, Rücklicht rechts) oder auch für einen zusätzlichen Sensor genutzt werden.&lt;br /&gt;
Zur Verfügung steht eine 2-adrige Verbindung zum mittleren Lochrasterfeld rechts.&lt;br /&gt;
&lt;br /&gt;
In der Nähe dieses Lochrasterfeldes gibt es auch:&lt;br /&gt;
* EXT Anschluß (SP1 C23: Stecker EXT)&lt;br /&gt;
* Akku-Anschluß (SP1 B3: BATTERY)&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Erweiterungen==&lt;br /&gt;
Auf / An den RP6 könnte man z.B. noch folgendes anbauen / erweitern:&lt;br /&gt;
&lt;br /&gt;
* Einen Greifarm&lt;br /&gt;
* Einen Ultraschallsensor&lt;br /&gt;
* Zwei Lichtsensoren hinten, um die hellste / dunkelste Stelle im Raum besser zu finden&lt;br /&gt;
* Einen digitalen Kompass&lt;br /&gt;
* uvm.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Erweiterungs-Module==&lt;br /&gt;
&lt;br /&gt;
Es sind von Arexx schon einige Erweiterungsmöglichkeiten auf dem Markt. Zum Ersten die Experimentierplatinen ([http://www.conrad.de/ce/de/product/191537/Arexx-RP6-Experimentierplatine 191537] AUSVERKAUFT!), die zum Erstellen von eigenen Schaltungen und Sensoren gedacht sind, und von denen eine schon im Lieferumfang des RP6 enthalten war, das Erweiterungsboard RP6 CONTROL M32 ([http://www.conrad.de/ce/de/product/191550/Arexx-RP6-ATMEGA32-Erweiterungssatz 191550] AUSVERKAUFT!) und die RP6 CCPRO M128 ([http://www.conrad.de/ce/de/product/191563/Arexx-RP6-CC-PRO-MEGA128-Erweiterungssatz 191563]).&lt;br /&gt;
&lt;br /&gt;
Die Boards kann man dann über den I2C Bus mit dem Mainboard kommunizieren lassen.  Es ist sehr sinnvoll, die Module symmetrisch hintereinander zu stapeln und nicht mehr als 6-8 Module zu verbauen, weil der Roboter sonst immer schwerer und langsamer wird. Basierend auf dem Master-Slave System könnte man so bis zu 127 Slaves anschließen. Zudem ist es ratsam, qualitativ hochwertige Akkus und ein Ladegerät mit passendem Stecker zu verwenden, da man ansonsten immer das Mainboard abschrauben müsste um an die Akkus heranzukommen. Für den Fall wurde extra eine Ladebuchse eingebaut.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Experimentierplatine ===&lt;br /&gt;
[[Bild:RP6_Exp.jpg|RP6 Experimentierplatine]]&lt;br /&gt;
&lt;br /&gt;
====Beschreibung====&lt;br /&gt;
Die Experimentier-Platine ist dazu gedacht, eigene Schaltungen auf dem RP6 zu realisieren, und ist seit Mai 2020 bei CONRAD ausverkauft. Sie wird über den I²C-Bus mit den anderen Erweiterungsmodulen verbunden. Ausserdem ist es sinnvoll, die (freien) I/O-Ports (ADC-Kanäle) der RP6 Base, des M32 Erweiterungsmoduls bzw. des CCPRO M128 Moduls über ein [http://www.reichelt.de/?;ACTION=3;LA=444;GROUP=C63;GROUPID=3328;ARTICLE=47637;START=0;SORT=artnr;OFFSET=16;SID=1580faBqwQAQ8AAGY-ZAM7cd511ee04a106a88a359faaac0071e2 10-Pol-Flachbandkabel] mit [http://www.reichelt.de/?ACTION=3;GROUP=C151;GROUPID=3231;ARTICLE=14571;SID=1580faBqwQAQ8AAGY-ZAM7cd511ee04a106a88a359faaac0071e2 Stecker] auf die Experimentierplatine zu führen, weil es übersichtlicher bleibt und keine Kabel lose herumhängen. Auf der Experimentierplatine kann man dann LEDs oder einen Temperatursensor an die I/O-Ports bzw. an die ADC-Kanäle anschießen.&lt;br /&gt;
&lt;br /&gt;
====Technische Daten====&lt;br /&gt;
{|  {{Blauetabelle}} &lt;br /&gt;
|'''Mikrocontroller:'''&lt;br /&gt;
|Keiner&lt;br /&gt;
|-&lt;br /&gt;
|'''Speicher:'''&lt;br /&gt;
|Keiner&amp;lt;br/&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|'''Programmierung:'''&lt;br /&gt;
|Kein Programmieradapter&lt;br /&gt;
|-&lt;br /&gt;
|'''Vorhandene Sensoren:'''&lt;br /&gt;
|Keine&amp;lt;br/&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|'''Vorhandene Aktoren:'''&lt;br /&gt;
|Keine&amp;lt;br/&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|'''Abmessungen:'''&lt;br /&gt;
|(L &amp;amp;times; B &amp;amp;times; H) 112 &amp;amp;times; 90 &amp;amp;times; 10 mm&lt;br /&gt;
|-&lt;br /&gt;
|'''Ausführung:'''&lt;br /&gt;
|Bausatz&lt;br /&gt;
|-&lt;br /&gt;
|'''Stromversorgung:'''&lt;br /&gt;
|6 AA NiMH Akkus (über die RP6 Base)&lt;br /&gt;
|-&lt;br /&gt;
|'''Hersteller:'''&lt;br /&gt;
|Arexx Niederlande&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Schaltungsideen ====&lt;br /&gt;
Auf der / den Experimentierplatinen könnte man z.B. folgendes realisieren:&lt;br /&gt;
&lt;br /&gt;
* eine Kameraschaltung (wie [http://www.rn-wissen.de/index.php/RP6_Kamera_-_Mitmach-Projekt hier] gezeigt)&lt;br /&gt;
* Scheinwerfer, Rücklichter, Blinker etc. (ABER immer mit Vorwiderstand!!!)&lt;br /&gt;
* ein LED-Lauflicht (über I/O-Expander, gibt´s beim [http://www.reichelt.de/?ACTION=3;ARTICLE=14527;PROVID=2402 Reichelt])&lt;br /&gt;
* mehr ADC-Kanäle (über ADC-Expander, einfach mal nach PCF8591 [http://www.google.de/search?q=PCF8591 googlen])&lt;br /&gt;
* eine Wetterstation mit Luftfeuchtemesser, Temperaturfühler und Lichtmesser ([http://www.roboternetz.de/phpBB2/viewtopic.php?t=52298 hier] gibt es eine Wetterstation uvm.)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== RP6 CONTROL M32 Platine ===&lt;br /&gt;
[[Bild:RP6Control_M32.jpg|RP6 CONTROL M32]]&lt;br /&gt;
&lt;br /&gt;
====Beschreibung====&lt;br /&gt;
Auf der M32 ([http://www.conrad.de/ce/de/product/191550/Arexx-RP6-ATMEGA32-Erweiterungssatz 191550]) lassen sich weitere LEDs, Sensoren oder ähnliches anschließen, außerdem steht ein weiterer ATMEGA32 zur Verfügung, welcher sich gut im Master Modus betreiben lässt. Es sind ein Mikrofonsensor, fünf Taster, vier Status-LEDs, ein Display-Port, ein Beeper, 6 freie ADC-Kanäle, 8 freie I/O-Ports, ein Programmieradapter, ein JTAG-Anschluss, eine ISP-Programmierschnittstelle sowie ein freier Steckplatz für ein EEPROM verfügbar.&lt;br /&gt;
&lt;br /&gt;
Seit Ende 2021 ist die M32 bei CONRAD ausverkauft!&lt;br /&gt;
&lt;br /&gt;
====Technische Daten====&lt;br /&gt;
{|  {{Blauetabelle}} &lt;br /&gt;
|'''Mikrocontroller:'''&lt;br /&gt;
|AVR [[ATmega32]]&lt;br /&gt;
|-&lt;br /&gt;
|'''Speicher:'''&lt;br /&gt;
|32 kB [[Flash]]-Speicher, davon 1 kB bereits vom Bootloader belegt&amp;lt;br/&amp;gt;&lt;br /&gt;
2 kB SRAM&amp;lt;br/&amp;gt; &lt;br /&gt;
1 kB [[EEPROM]]&lt;br /&gt;
|-&lt;br /&gt;
|'''Programmierung:'''&lt;br /&gt;
|Über AVR-[[Bootloader]], belegt ca. 1 kB des Flash-Speichers&lt;br /&gt;
|-&lt;br /&gt;
|'''Vorhandene Sensoren:'''&lt;br /&gt;
|1 Mikrofonsensor&amp;lt;br/&amp;gt;&lt;br /&gt;
5 Eingabetaster&amp;lt;br/&amp;gt;&lt;br /&gt;
14 I/O Ports, davon 6 ADC-Wandler&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|'''Vorhandene Aktoren:'''&lt;br /&gt;
|1 Beeper&amp;lt;br/&amp;gt;&lt;br /&gt;
4 Status-LEDs&amp;lt;br/&amp;gt;&lt;br /&gt;
1 LC-Display-Port&amp;lt;br/&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|'''Abmessungen:'''&lt;br /&gt;
|(L &amp;amp;times; B &amp;amp;times; H) 112 &amp;amp;times; 90 &amp;amp;times; 15 mm&lt;br /&gt;
|-&lt;br /&gt;
|'''Ausführung:'''&lt;br /&gt;
|Fertig aufgebautes Erweiterungsmodul&lt;br /&gt;
|-&lt;br /&gt;
|'''Stromversorgung:'''&lt;br /&gt;
|6 AA NiMH Akkus (über die RP6 Base)&lt;br /&gt;
|-&lt;br /&gt;
|'''Hersteller:'''&lt;br /&gt;
|Arexx Niederlande&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Umbau-Optionen ====&lt;br /&gt;
Dieser Absatz soll die Möglichkeiten der RP6 CONTROL M32 Platine (im Folgenden &amp;quot;M32&amp;quot; genannt) auflisten, die es gibt, um auf einfache Weise weitere Anschlüsse oder Verbindungen zu ermöglichen. Nicht beschrieben werden die Anschlußmöglichkeiten, die in Form der vorhandenen Wannenstecker sowieso gegeben sind (z.B. am LCD-, I/O- oder ADC-Stecker). Im Text gibt es Verweise auf den Schaltplan der M32 (RP6_CONTROL_M32.PDF) in der Form: (SP2 B1: Bauteil).  Dies bedeutet, dass man das Bauteil auf Blatt 2 des RP6-M32-Schaltplans im Feld B1 finden kann.&lt;br /&gt;
&lt;br /&gt;
Folgende Möglichkeiten zum Umbau/Ausbau sind vorgesehen:&lt;br /&gt;
* Zweites SPI-EEPROM (IC5)&lt;br /&gt;
* Zwei analoge Sensoren, evtl. mit getrennter Stromversorgung&lt;br /&gt;
* ISP (In System Programming)&lt;br /&gt;
* JTAG-Programmierung&lt;br /&gt;
* USRBUS&lt;br /&gt;
* IRQ-Zuweisung ändern&lt;br /&gt;
* ADC0 und ADC1 anders nutzen&lt;br /&gt;
* Schieberegister kaskadieren&lt;br /&gt;
Im folgenden Text soll beschrieben werden, wie man die weiteren Möglichkeiten nutzen kann. Es wird jeweils erwähnt, was man an Material braucht. Beispielhaft sind da Bestell-Nummern der Firma [http://www.conrad.de/ce/ CONRAD] genannt. Natürlich kann man die Teile auch bei anderen Versendern beziehen. Durch die Nennung der Bestell-Nummer ist das jeweilige Teil aber gut zu identifizieren. Man sollte Löten können und sich bewußt sein, dass ggf. ein Garantieanspruch nicht mehr besteht, wenn man an der Platine gelötet hat.&lt;br /&gt;
&lt;br /&gt;
Bei den Materialangaben ist öfter die Rede von &amp;quot;Steckbuchsen mit Litze&amp;quot;. Diese Steckbuchsen mit angelöteter Litze können auf die ein- oder zweireihigen Stiftleisten aufgesteckt werden. Leider gibt es sie nicht (mehr) fertig konfektioniert bei CONRAD. Die einreihigen Steckbuchsen (RM 2,54mm) kann man aber z.B. bei [http://www.elv.de/output/controller.aspx ELV] bekommen: 2-polig (68-016635), 3-polig (68-022503) und 5-polig (68-023073). An sie muss man dann noch Litzen in der entsprechenden Länge selbst anlöten.&lt;br /&gt;
&lt;br /&gt;
===== Zweites SPI-EEPROM =====&lt;br /&gt;
Es ist sehr einfach, ein zweites SPI-EEPROM (SP1 A1: IC5*) auf der M32 zu nutzen.&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_M32_IC5-Socket.JPG|thumb|Sockel des 2. SPI-EEPROMs]]&lt;br /&gt;
&lt;br /&gt;
Man braucht dazu:&lt;br /&gt;
* Einen IC-Sockel 8-pol DIP für IC5 ([http://www.conrad.de/ce/de/product/189600/IC-FASSUNG-PRAeZISION-8POLIG 189600])&lt;br /&gt;
* Einen Keramik-Vielschicht-Kondensator 100nF (C19); RM 2,54mm ([http://www.conrad.de/ce/de/product/453099/?insert=36&amp;amp;insertNoDeeplink&amp;amp;productname=KONDENSATOR-01-F-KDPU-254-MM 453099])&lt;br /&gt;
* Ein serielles SPI-EEPROM im PDIP8 Gehäuse (IC5)&lt;br /&gt;
Zuerst wird der IC-Sockel eingelötet (Kerbe beachten!), dann C19 (SP1 A1: C19*). Das war's.&lt;br /&gt;
&lt;br /&gt;
Leider gibt es das EEPROM nicht bei den gängigeren Versendern. Bekommen kann man es aber z.B. bei [http://de.farnell.com/jsp/home/homepage.jsp Farnell]. Dort hat das SPI-EEPROM mit 256 kbit die Bezeichnung 25LC256-I/P (1331398). Wenn man es noch größer mag: 25LC1024 (1331392) mit 1024 kbit. SPI-EEPROMs führt inzwischen auch [http://www.reichelt.de./ Reichelt].&lt;br /&gt;
&lt;br /&gt;
'''Programmierung:'''&lt;br /&gt;
&lt;br /&gt;
In die RP6ControlLib.h bitte einfügen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#define SPI_EEPROM2_PAGESIZE 64&lt;br /&gt;
&lt;br /&gt;
uint8_t SPI_EEPROM2_readByte(uint16_t memAddr);&lt;br /&gt;
void SPI_EEPROM2_writeByte(uint16_t memAddr, uint8_t data);&lt;br /&gt;
void SPI_EEPROM2_enableWrite(void);&lt;br /&gt;
void SPI_EEPROM2_disableWrite(void);&lt;br /&gt;
uint8_t SPI_EEPROM2_getStatus(void);&lt;br /&gt;
&lt;br /&gt;
void SPI_EEPROM2_writeBytes(uint16_t startAddr, uint8_t *buffer, uint8_t length);&lt;br /&gt;
void SPI_EEPROM2_readBytes(uint16_t startAddr, uint8_t *buffer, uint8_t length);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Die Konstante SPI_EEPROM2_PAGESIZE ist abhängig von der Art und Größe des EEPROMs. Für ein 256 kbit-EEPROM ist die Seitengröße (pagesize) in der Regel 64, für einen 512 kbit-Typ 128 und für einen 1024 kbit-Typ 256.&lt;br /&gt;
&lt;br /&gt;
In die RP6ControlLib.c bitte einfügen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Second external SPI EEPROM:&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Reads a single Byte from the 2nd external EEPROM.&lt;br /&gt;
 */&lt;br /&gt;
uint8_t SPI_EEPROM2_readByte(uint16_t memAddr)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t data;&lt;br /&gt;
	PORTB &amp;amp;= ~MEM_CS2;&lt;br /&gt;
	writeSPI(SPI_EEPROM_READ);&lt;br /&gt;
	writeWordSPI(memAddr);&lt;br /&gt;
	data = readSPI();&lt;br /&gt;
	PORTB |= MEM_CS2;&lt;br /&gt;
	return data;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Reads &amp;quot;length&amp;quot; Bytes into the Buffer &amp;quot;buffer&amp;quot; from startAdr on. &lt;br /&gt;
 * You can read the complete 2nd EEPROM into a buffer at once - if it is large enough. &lt;br /&gt;
 * (But you only have 2KB SRAM on a MEGA32 ;) )&lt;br /&gt;
 */&lt;br /&gt;
void SPI_EEPROM2_readBytes(uint16_t startAddr, uint8_t *buffer, uint8_t length)&lt;br /&gt;
{&lt;br /&gt;
	PORTB &amp;amp;= ~MEM_CS2;&lt;br /&gt;
	writeSPI(SPI_EEPROM_READ);&lt;br /&gt;
	writeWordSPI(startAddr);&lt;br /&gt;
	readBufferSPI(&amp;amp;buffer[0], length);&lt;br /&gt;
	PORTB |= MEM_CS2;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Enable Write Mode&lt;br /&gt;
 */&lt;br /&gt;
void SPI_EEPROM2_enableWrite(void)&lt;br /&gt;
{&lt;br /&gt;
	PORTB &amp;amp;= ~MEM_CS2;&lt;br /&gt;
	writeSPI(SPI_EEPROM_WREN);&lt;br /&gt;
	PORTB |= MEM_CS2;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Disable Write Mode&lt;br /&gt;
 */&lt;br /&gt;
void SPI_EEPROM2_disableWrite(void)&lt;br /&gt;
{&lt;br /&gt;
	PORTB &amp;amp;= ~MEM_CS2;&lt;br /&gt;
	writeSPI(SPI_EEPROM_WRDI);&lt;br /&gt;
	PORTB |= MEM_CS2;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Write a single data byte to the specified 2nd EEPROM address.&lt;br /&gt;
 */&lt;br /&gt;
void SPI_EEPROM2_writeByte(uint16_t memAddr, uint8_t data)&lt;br /&gt;
{&lt;br /&gt;
	while(SPI_EEPROM2_getStatus() &amp;amp; SPI_EEPROM_STAT_WIP);&lt;br /&gt;
	SPI_EEPROM2_enableWrite();&lt;br /&gt;
	PORTB &amp;amp;= ~MEM_CS2;&lt;br /&gt;
	writeSPI(SPI_EEPROM_WRITE);&lt;br /&gt;
	writeWordSPI(memAddr);&lt;br /&gt;
	writeSPI(data);&lt;br /&gt;
	PORTB |= MEM_CS2;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Write &amp;quot;length&amp;quot; Bytes from the Buffer to the 2nd EEPROM. &lt;br /&gt;
 * YOU CAN ONLY WRITE MAXIMAL [SPI_EEPROM2_PAGESIZE] BYTES AT ONCE!!!&lt;br /&gt;
 * This is the Pagesize!&lt;br /&gt;
 * You can NOT cross a page boundary!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void SPI_EEPROM2_writeBytes(uint16_t startAddr, uint8_t *buffer, uint8_t length)&lt;br /&gt;
{&lt;br /&gt;
	while(SPI_EEPROM2_getStatus() &amp;amp; SPI_EEPROM_STAT_WIP);&lt;br /&gt;
	SPI_EEPROM2_enableWrite();&lt;br /&gt;
	PORTB &amp;amp;= ~MEM_CS2;&lt;br /&gt;
	writeSPI(SPI_EEPROM_WRITE);&lt;br /&gt;
	writeWordSPI(startAddr);&lt;br /&gt;
	writeBufferSPI(&amp;amp;buffer[0], length);&lt;br /&gt;
	PORTB |= MEM_CS2;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Returns EEPROM Status register - for checking if 2nd EEPROM is buisy. &lt;br /&gt;
 * Writing takes about 5ms. &lt;br /&gt;
 */&lt;br /&gt;
uint8_t SPI_EEPROM2_getStatus(void)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t status;&lt;br /&gt;
	PORTB &amp;amp;= ~MEM_CS2;&lt;br /&gt;
	writeSPI(SPI_EEPROM_RDSR);&lt;br /&gt;
	status = readSPI();&lt;br /&gt;
	PORTB |= MEM_CS2;&lt;br /&gt;
	return status;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Hinweis zum 1024 kbit-EEPROM:&lt;br /&gt;
&lt;br /&gt;
Dieses EEPROM benötigt 24-Bit Adressen und muss daher etwas anders angesprochen werden als die &amp;quot;kleineren&amp;quot; Typen bis 512 kbit.&lt;br /&gt;
Die Funktion SPI_EEPROM2_readByte() sieht für ein 1024 kbit-EEPROM z.B. so aus:&lt;br /&gt;
&amp;lt;pre&amp;gt;uint8_t SPI_EEPROM2_readByte(uint32_t memAddr)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t data;&lt;br /&gt;
	PORTB &amp;amp;= ~MEM_CS2;&lt;br /&gt;
	writeSPI(SPI_EEPROM_READ);&lt;br /&gt;
	writeSPI((uint8_t)(memAddr &amp;gt;&amp;gt; 16));&lt;br /&gt;
	writeWordSPI((uint16_t)memAddr);&lt;br /&gt;
	data = readSPI();&lt;br /&gt;
	PORTB |= MEM_CS2;&lt;br /&gt;
	return data;&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
Alle weiteren Funktionen, die EEPROM-Adressen verwenden (SPI_EEPROM2_readBytes, SPI_EEPROM2_writeByte, SPI_EEPROM2_writeBytes), müssen genau so angepasst werden.&lt;br /&gt;
&lt;br /&gt;
===== Anschlüsse =====&lt;br /&gt;
Hier wird aufgelistet, wo man auf der M32 Platine Anschlüsse nutzen kann, um sie z.B. zu weiteren Sensoren, zum USRBUS oder (weniger empfehlenswert!) direkt zu EPs, zur RP6 Base oder zur CCPRO M128 zu führen. &lt;br /&gt;
&lt;br /&gt;
====== Analoge Sensoren an ADC2/3 ======&lt;br /&gt;
[[Bild:RP6_M32_ADC23.JPG|thumb|ADC2 ADC3]]&lt;br /&gt;
Wenn man bis zu zwei analoge Sensoren (z.B. IR-Distanz-Mess-Sensoren Sharp GP2Y0A02YK 185364) direkt an die M32 anschließen möchte, dann gibt es da zwei 3-polige Kontakte, beschriftet mit VDD/GND/ADCx (x = 2..3). Hier kann man 3-polige Stiftleisten auflöten, an die dann die Sensoren angeschlossen werden.&lt;br /&gt;
&lt;br /&gt;
Man braucht dazu:&lt;br /&gt;
* 1-reihige Stiftleiste RM 2,54mm (z.B. 36-polig 732478)&lt;br /&gt;
* Zwei Keramik-Vielschicht-Kondensatoren 100nF (C16, C17); RM 2,54mm (453099)&lt;br /&gt;
* Ein Elektrolyt-Kondensator stehend 470 uF / 16V (C18); RM 3,5mm (446211)&lt;br /&gt;
* Zwei 3-polige Steckbuchsen mit Litze zum Anschluß der Sensoren&lt;br /&gt;
Man trennt von der 1-reihigen Stiftleiste zweimal 3 Kontakte ab und lötet sie auf die weiß umrahmten Kontakte (VDD/GND/ADCx; SP2 C23: ADC2, YGND8, YVDD6, ADC3, YGND7, YVDD5), anschließend C16, C17 (SP2 C1: C16*, C17*) auf ihre Plätze und zum Schluß den Elko 470 uF (C18; SP2 B1: C18*). Beim Elko auf die Polung achten: Er muss genau so sitzen wie sein Nachbar C1 (Minuspol schaut zum Beeper SND).&lt;br /&gt;
&lt;br /&gt;
Die Sensoren lötet man an die Litzen der 3-poligen Steckbuchsen und steckt diese auf die neuen Kontakte.&lt;br /&gt;
&lt;br /&gt;
Da manche Sensoren einen höheren Stromverbrauch haben, kann man die Stromversorgung an den VDD-Pins der ADC2/3-Stecker abschaltbar machen oder eine separate +5V-Spannung einspeisen. Siehe dazu den Abschnitt &amp;quot;Trennstellen - Getrennte Stromversorgung für ADC2/3&amp;quot; weiter unten!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====== ISP (In System Programming) ======&lt;br /&gt;
Der ATMEGA32 der M32 wird standardmäßig über den PROG/UART Stecker programmiert. Dazu befindet sich im Prozessor ein Bootloader-Programm. Wenn man stattdessen oder zusätzlich die ISP-Programmierung mit einem dafür geeigneten ISP-Programmier-Adapter nutzen will, kann man den Adapter an den gewinkelten ISP-Stecker auf der M32 anschließen.&lt;br /&gt;
Vorher sind aber ein paar &amp;quot;Umbauarbeiten&amp;quot; erforderlich.&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_M32_ISP.JPG|thumb|ISP]]&lt;br /&gt;
&lt;br /&gt;
Man braucht dazu:&lt;br /&gt;
* 1-reihige Stiftleiste RM 2,54mm (z.B. 36-polig 732478)&lt;br /&gt;
* Einen SMD-Widerstand 10 kOhm (406376)&lt;br /&gt;
* Eine SMD-Diode LL 4148 (140902)&lt;br /&gt;
* Eine Codierbrücke (z.B. aus Set 742902)&lt;br /&gt;
&lt;br /&gt;
Der SMD-Widerstand wird auf seinen Platz (R1; SP1 A3: R1*) neben dem XBUS2-Stecker gelötet, danach die Diode LL 4148 (D2; SP1 B3: D2*). Die Kathode (Strich) der Diode zeigt in Richtung des Quarzes (X1). Zwischen R1 und C1 befinden sich drei Lötpunkte (beschriftet mit ISP/DEBUG - BOOTLOAD; SP1 A34: YRST1..3), auf die eine 3-polige Stiftleiste gelötet werden muss. Vorher muss eine kurze Leiterbahn zwischen den Lötpunkten BOOTLOAD aufgetrennt werden. Die Leiterbahn befindet sich auf der Lötseite der Platine und muss mit einem scharfen Messer oder einem speziellen Leiterbahn-Unterbrecher zwischen den beiden Lötpunkten unterbrochen werden. Man sollte anschließend mit einem Widerstandsmeßgerät nachmessen: Es sollte keine Verbindung mehr zwischen den Lötpunkten bestehen.&lt;br /&gt;
Man trennt dann von der 1-reihigen Stiftleiste 3 Kontakte ab und lötet sie auf die beschriebenen drei Lötpunkte.&lt;br /&gt;
&lt;br /&gt;
Wenn man jetzt eine Codierbrücke auf die mit &amp;quot;BOOTLOAD&amp;quot; beschrifteten Pins steckt, bleibt alles unverändert: Die Programmierung erfolgt weiter über den PROG/UART-Stecker mithilfe des Bootloaders im Prozessor. Wird die Codierbrücke in Stellung &amp;quot;ISP/DEBUG&amp;quot; umgesteckt, kann der Prozessor mit ISP programmiert werden.&lt;br /&gt;
&lt;br /&gt;
Vorsicht: Das Bootloader-Programm kann dabei zerstört werden! Es müssen zusätzlich Fusebits des ATMEGA32 verändert werden. &lt;br /&gt;
&lt;br /&gt;
Dabei kann der Prozessor im schlimmsten Fall nicht mehr ansprechbar sein. Man sollte diesen Umbau und die ISP-Programmierung nur machen, wenn man genau weiß, was man macht!&lt;br /&gt;
&lt;br /&gt;
Eine Kopie des Bootloaders und eine Kurzanleitung zum Einstellen der Fusebits gibt es hier: &lt;br /&gt;
[http://www.arexx.com/rp6/downloads/RP6_M32_BOOTLOADER.zip RP6_M32_BOOTLOADER]&lt;br /&gt;
&lt;br /&gt;
====== JTAG ======&lt;br /&gt;
[[Bild:RP6_M32_JTAG.JPG|thumb|JTAG]]&lt;br /&gt;
Die Programmierung und ein Debuggen sind auch mit der JTAG-Schnittstelle möglich. Das ist nur zu empfehlen, wenn man Erfahrungen mitbringt, oder der Prozessor der M32 durch eine ISP-Falschprogrammierung z.B. nicht mehr ansprechbar ist.&lt;br /&gt;
Um die JTAG-Schnittstelle nutzen zu können, muss der ISP-Umbau durchgeführt worden sein und die dort beschriebene Codierbrücke auf &amp;quot;ISP/DEBUG&amp;quot; gesteckt sein. Der JTAG-Programmer kann dann an die Lötpunkte &amp;quot;JTAG&amp;quot; zwischen ISP- und I/O-Stecker angeschlossen werden.&lt;br /&gt;
&lt;br /&gt;
Man braucht dazu:&lt;br /&gt;
* 2-reihige Stiftleiste RM 2,54mm (z.B. 2x36-polig 742007)&lt;br /&gt;
Man trennt von der 2-reihigen Stiftleiste 2x5 Kontakte ab und lötet sie auf die 10 JTAG-Lötpunkte (SP2 A12: YTDI, YTDO, YTMS, YTCK, YTRST, YVDD3/4, YGND3/4, YNC). Hier kann jetzt der JTAG-Programmer z.B. mit einem 10-poligen Flachkabel-Stecker angeschlossen werden. Um das JTAG-Interface des ATMEGA32 nutzen zu können, müssen Änderungen an den Fusebits vorgenommen werden.&lt;br /&gt;
&lt;br /&gt;
Vorsicht: Man sollte die JTAG-Programmierung und Fusebit-Manipulationen nur machen, wenn man genau weiß, was man macht!&lt;br /&gt;
&lt;br /&gt;
====== USRBUS ======&lt;br /&gt;
Die 14 Kontakte der beiden USRBUS-Stecker sind auf der M32 nirgendwo angeschlossen, sondern können über die Lötpunkte Y1..Y14 mit beliebigen Punkten auf der M32 verbunden werden.&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_M32_USRBUS.JPG|thumb|USRBUS]]&lt;br /&gt;
&lt;br /&gt;
Ich würde auf Y1..Y14 eine Stiftleiste löten, damit die USRBUS-Belegung geändert werden kann.&lt;br /&gt;
&lt;br /&gt;
Man braucht dazu:&lt;br /&gt;
* 2-reihige Stiftleiste RM 2,54mm (z.B. 2x36-polig 742007)&lt;br /&gt;
* Einige Steckbuchsen mit Litze&lt;br /&gt;
&lt;br /&gt;
Man trennt von der 2-reihigen Stiftleiste 2x7 Kontakte ab und lötet sie auf die Punkte Y1..Y14 (SP2 E3: Y1..Y14) neben dem Wannenstecker USRBUS2. Wird die M32 über Flachkabel mit einem USRBUS-Stecker auf einer RP6 Experimentierplatine (EP) und/oder mit dem RP6 selbst verbunden, dann hat man mit allen mit dem USRBUS verbundenen Platinen eine direkte 14-polige Verbindung,- eben den &amp;quot;User Bus&amp;quot;. Den kann man dann nutzen, wie man will. Auf der M32 kann man mit Steckbuchsen die Pins Y1..Y14 mit anderen Pins verbinden.&lt;br /&gt;
&lt;br /&gt;
Beispiel: Verbindet man den Pin &amp;quot;ADC2&amp;quot; mit Y1 des USRBUS, dann steht der Eingang ADC2 auf allen an den USRBUS angeschlossenen Platinen an Y1 zur Verfügung. Man braucht also diesen Eingang nicht über ein eigenes Kabel auf eine EP zu führen, sondern kann dazu den USRBUS nehmen. Dadurch bleibt der Gesamtaufbau auf dem RP6 übersichtlich und komplett trennbar (man braucht nur die Stecker XBUS und USRBUS abzuziehen!).&lt;br /&gt;
&lt;br /&gt;
Wichtig: Man sollte gut dokumentieren, wie man den USRBUS am RP6 (vorn und hinten getrennt!), auf EPs und der M32/M128 benutzt! Sonst kann es bei einer anderen Anordnung von EPs zu USRBUS Konflikten/Kurzschlüssen kommen.&lt;br /&gt;
&lt;br /&gt;
====== Schieberegister kaskadieren ======&lt;br /&gt;
[[Bild:RP6_M32_SPI.JPG|thumb|SPI]]&lt;br /&gt;
Auf der M32 wird ein 8-Bit Schieberegister-Baustein (IC3: 74HC4094D) dazu gebraucht, vier Status-LEDs (LED1..LED4) und ein LCD (am Stecker LCD) anzusteuern. Durch Schieberegister kann man Port-Pins gewinnen, wenn die Pins des Prozessors nicht ausreichen.&lt;br /&gt;
&lt;br /&gt;
Solche Schieberegister kann man &amp;quot;kaskadieren&amp;quot;, d.h. weitere identische Bausteine einbauen, die weitere Port-Pins zur Verfügung stellen. Wenn man zusätzliche 74HC4094 einsetzen will, wird man das am besten auf einer EP aufbauen. Die Anschlüsse für diese Schieberegister werden auf der M32 an einer 6-poligen Reihe von Lötpunkten (beschriftet mit MISO, STR, MOSI, SCK, QS, QS*; SP1 D3: YQS1/2, YMOSI, YSCK, YSTR, YMISO) links von IC3 zur Verfügung gestellt.&lt;br /&gt;
&lt;br /&gt;
Wenn man diese 6 Signalleitungen auf eine EP führen will, gibt es dafür zwei Möglichkeiten:&lt;br /&gt;
* a) Direkte 6-polige Kabelverbindung von den oben beschriebenen Lötpunkten zur EP&lt;br /&gt;
* b) Nutzung des USRBUS, um die 6 Signale zur EP zu führen&lt;br /&gt;
Wenn man im Abschnitt &amp;quot;[[RP6#USRBUS|USRBUS]]&amp;quot; den entsprechenden Umbau gemacht hat, würde ich b) empfehlen! Man könnte dafür eine 6-polige Stiftleiste auf die o.g. Lötpunkte auflöten und 1:1 z.B. mit den Pins Y4, Y6, Y8, Y10, Y12, Y14 des USRBUS verbinden. Dann kann man auf der EP weitere Schieberegister- und SPI-Bausteine (z.B. SPI-EEPROMs, [http://www.pollin.de/shop/dt/MDU5OTgxOTk-/Bausaetze_Module/Module/Funkmodul_RFM12_433_Sende_Empfangsmodul.html RFM12 Transceiver] o.ä.) aufbauen.&lt;br /&gt;
&lt;br /&gt;
Man braucht dazu:&lt;br /&gt;
* 1-reihige Stiftleiste RM 2,54mm (z.B. 36-polig 732478)&lt;br /&gt;
* Steckbuchsen mit Litze&lt;br /&gt;
Man trennt von der 1-reihigen Stiftleiste 6 Kontakte ab und lötet sie auf die beschriebenen sechs Lötpunkte auf der M32. Mit den Steckbuchsen mit Litze wird dann die Verbindung entweder direkt zur EP (Option a) oder über den USRBUS zur EP (Option b) hergestellt.&lt;br /&gt;
&lt;br /&gt;
====== VDD/GND/+UB Anschluß ======&lt;br /&gt;
[[Bild:RP6_M32_VDDGNDUB.JPG|thumb|RP6 M32 VDD GND +UB]]&lt;br /&gt;
VDD, GND und +UB (SP2 C3: YUB1, YGND1/2/5, YVDD1/2) kann man auf der M32 an diesen Lötpunkten abnehmen.&lt;br /&gt;
&lt;br /&gt;
Natürlich kann man hier auch Stiftleisten auflöten.&lt;br /&gt;
&lt;br /&gt;
Auf der anderen Platinenseite (zwischen dem USRBUS1 und ISP Stecker) befinden sich zusätzlich noch 2 weitere Lötpunkte, an denen man VDD und GND kontaktieren kann.&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;
&lt;br /&gt;
====== Serielle Schnittstelle ======&lt;br /&gt;
[[Bild:RP6_M32_RST.JPG|thumb|RP6 M32 RST]]&lt;br /&gt;
Neben dem PROG/UART Stecker befinden sich 5 Lötpunkte mit den Signalen RST, TX, RX, GND, VDD (SP2 BC3: YRX, YTX, YRST, YVDD, YGND). Hier kann z.B. eine 5-polige Stiftleiste aufgelötet werden, um einen Anschluß an die serielle Schnittstelle zu ermöglichen.&lt;br /&gt;
 &lt;br /&gt;
Von diesen 5 Lötpunkten könnte z.B. auch eine Verbindung zum USRBUS hergestellt werden, um die serielle Schnittstelle der M32 auf EPs zu führen.&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;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====== MEM_CS2 ======&lt;br /&gt;
[[Bild:RP6_M32_MEM_CS2.JPG|thumb|RP6 M32 MEM_CS2]]&lt;br /&gt;
MEM_CS2 (M32 Microcontroller Pin PB1) kann man am IC5-Sockel an Pin 1 (SP1 A1: IC5*, Pin 1) kontaktieren. Falls IC5 nicht eingesetzt werden soll, kann man hier durch Einstecken eines Kabels in Pin 1 des IC5-Sockels PB1 nutzen und z.B. zum USRBUS führen.&lt;br /&gt;
&lt;br /&gt;
===== Mess-/Kontaktpunkte =====&lt;br /&gt;
Hier geht es um Kontaktpunkte, an denen man z.B. den Logik-Pegel (High/Low) oder eine analoge Spannung messen kann. Natürlich kann man die Signale auch zur Weiterleitung auf eine EP kontaktieren, dies wird man aber normalerweise nicht brauchen.&lt;br /&gt;
&lt;br /&gt;
====== M-Signal ======&lt;br /&gt;
[[Bild:RP6_M32_M_SIGNAL.JPG|thumb|RP6 M32 M-Signal]]&lt;br /&gt;
An diesem Messpunkt (SP1 E3: YM_SIGNAL) neben D1 kann man die Ausgangsspannung des Mikrofon-Verstärkers IC4 (SP1 E3: IC4) messen oder z.B. mit einem Oszilloskop darstellen.&lt;br /&gt;
&lt;br /&gt;
===== Trennstellen =====&lt;br /&gt;
An diesen Stellen können Leiterbahnen unterbrochen werden, um Funktionen zu deaktivieren oder anders zu nutzen. &lt;br /&gt;
&lt;br /&gt;
====== Getrennte Stromversorgung für ADC2/3 ======&lt;br /&gt;
Wenn man für die analogen Sensoren an ADC2/3 (siehe Abschnitt &amp;quot;Anschlüsse - Analoge Sensoren an ADC2/3&amp;quot; weiter oben!) eine GETRENNTE Stromversorgung vorsehen will und/oder mit Codierbrücke (oder MOSFET) die Stromversorgung abschaltbar machen möchte, muss man erst Vorarbeit leisten.&lt;br /&gt;
[[Bild:RP6_M32_SV.jpg|thumb|RP6 M32 SV]]&lt;br /&gt;
&lt;br /&gt;
Man braucht dazu:&lt;br /&gt;
* 1-reihige Stiftleiste RM 2,54mm (z.B. 36-polig 732478)&lt;br /&gt;
* Evtl.: Eine Codierbrücke (z.B. aus Set 742902)&lt;br /&gt;
* Evtl.: Eine 1-polige Steckbuchse mit Litze zur ext. Stromversorgung&lt;br /&gt;
Es muss eine kurze Leiterbahn zwischen den Punkten &amp;quot;SV1&amp;quot; und &amp;quot;SV2&amp;quot; (SP2 B2: SV1, SV2) aufgetrennt werden. Die Leiterbahn befindet sich auf der Lötseite der Platine und muss mit einem scharfen Messer oder einem speziellen Leiterbahn-Unterbrecher zwischen den beiden Lötpunkten unterbrochen werden. Man sollte anschließend mit einem Widerstandsmeßgerät zwischen SV1 und SV2 nachmessen: Es sollte keine Verbindung mehr bestehen. Jetzt trennt man von der 1-reihigen Stiftleiste 2 Kontakte ab und lötet sie auf die Punkte SV1/SV2.&lt;br /&gt;
&lt;br /&gt;
Man kann hier zunächst eine Codierbrücke aufstecken. Damit versorgt der RP6 Akku die Sensoren mit 5V an den Pins VDD. Möchte man später eine getrennte 5V-Spannung anlegen, zieht man einfach die Codierbrücke ab und speist die externe 5V-Spannung (mit einer 1-poligen Steckbuchse) am Pin SV2 ein. Achtung: An Pin SV1 wird dann nichts angeschlossen!&lt;br /&gt;
&lt;br /&gt;
Anstelle der Codierbrücke kann man natürlich auch einen MOSFET anschließen, um die Sensoren per Software abschalten zu können.&lt;br /&gt;
&lt;br /&gt;
====== Interrupt-Zuordnung ändern ======&lt;br /&gt;
Am XBUS stehen vier Interrupt-Pins (genannt INT1..INT3, INTU) zur Verfügung. INT1 ist auf der RP6 Base mit PA4 verbunden, auf der M32 mit PD2 (Prozessor INT0), auf der M128 mit PE5 (Prozessor INT5) und auf der [[RP6v2#RP6v2_M256_WiFi_Platine|RP6 M256 WiFi]] mit PJ3 (Prozessor PCINT12). Diese Tabelle zeigt die Verbindung aller Interruptleitungen auf den Platinen (RP6 Base, M32, M128, M256 WiFi) über den XBUS:&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |XBUS Pin&lt;br /&gt;
 |XBUS INTx&lt;br /&gt;
 |RP6 Base Pin&lt;br /&gt;
 |RP6 Base INTx&lt;br /&gt;
 |RP6 M32 Pin&lt;br /&gt;
 |RP6 M32 INTx&lt;br /&gt;
 |RP6 M128 Pin&lt;br /&gt;
 |RP6 M128 INTx&lt;br /&gt;
 |RP6 M256 Pin&lt;br /&gt;
 |RP6 M256 INTx&lt;br /&gt;
 |-&lt;br /&gt;
 |8&lt;br /&gt;
 |INT1&lt;br /&gt;
 |PA4&lt;br /&gt;
 |kein&lt;br /&gt;
 |PD2&lt;br /&gt;
 |INT0&lt;br /&gt;
 |PE5&lt;br /&gt;
 |INT5&lt;br /&gt;
 |PJ3&lt;br /&gt;
 |PCINT12&lt;br /&gt;
 |-&lt;br /&gt;
 |11&lt;br /&gt;
 |INT2&lt;br /&gt;
 |n.c.&lt;br /&gt;
 |&lt;br /&gt;
 |PD3 *&lt;br /&gt;
 |INT1&lt;br /&gt;
 |n.c.&lt;br /&gt;
 |&lt;br /&gt;
 |PJ6&lt;br /&gt;
 |PCINT15&lt;br /&gt;
 |-&lt;br /&gt;
 |9&lt;br /&gt;
 |INT3&lt;br /&gt;
 |n.c.&lt;br /&gt;
 |&lt;br /&gt;
 |PB2 *&lt;br /&gt;
 |INT2&lt;br /&gt;
 |PE6&lt;br /&gt;
 |INT6&lt;br /&gt;
 |PJ5&lt;br /&gt;
 |PCINT14&lt;br /&gt;
 |-&lt;br /&gt;
 |7&lt;br /&gt;
 |INTU&lt;br /&gt;
 |n.c.&lt;br /&gt;
 |&lt;br /&gt;
 |n.c.    *&lt;br /&gt;
 |&lt;br /&gt;
 |n.c.&lt;br /&gt;
 |&lt;br /&gt;
 |PJ4&lt;br /&gt;
 |PCINT13&lt;br /&gt;
 |-&lt;br /&gt;
|}&lt;br /&gt;
'''Zu *:''' Standard-Belegung. Ggf. abhängig von der nachfolgend beschriebenen Interrupt-Zuordnung!&lt;br /&gt;
&lt;br /&gt;
Auf der M32 kann man die Interrupt-Zuordnung für INT2, INT3 und INTU durch drei Codierbrücken (beschriftet mit I2-INTU, INT3-I3, I2-INT2; SP2 A3: YINT2/3/U, YI2_1/2, YI3) ändern.&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_M32_INTx.JPG|thumb|INTx]]&lt;br /&gt;
&lt;br /&gt;
Man braucht dazu:&lt;br /&gt;
* 2-reihige Stiftleiste RM 2,54mm (z.B. 2x36-polig 742007)&lt;br /&gt;
* Drei Codierbrücken (z.B. aus Set 742902)&lt;br /&gt;
Vor dem Auflöten der Stiftleiste müssen zwei kurze Leiterbahnen zwischen zwei Lötpunkten aufgetrennt werden, und zwar zwischen den Lötpunkten INT3-I3 und I2-INT2. Die Leiterbahnen müssen mit einem scharfen Messer oder einem speziellen Leiterbahn-Unterbrecher zwischen den beiden Lötpunkten unterbrochen werden. Man sollte anschließend mit einem Widerstandsmeßgerät nachmessen: Es sollte keine Verbindung mehr zwischen INT3-I3 und I2-INT2 bestehen. Man trennt dann von der 2-reihigen Stiftleiste 2x3 Kontakte ab und lötet sie auf das weiß umrahmte Feld mit der o.g. Beschriftung.&lt;br /&gt;
&lt;br /&gt;
Hier kann man auf INT3-I3 und I2-INT2 je eine Codierbrücke aufstecken, wenn man die Standard-Belegung beibehalten will. Steckt man auf I2-INTU eine Codierbrücke, dann ist INTU des XBUS mit Pin PD3 (I2) der M32 verbunden.&lt;br /&gt;
&lt;br /&gt;
'''Hinweis:''' Man kann auf die 6-polige Stiftleiste auch Codierbrücken QUER zur eigentlichen (horizontalen) Richtung aufsetzen. Dadurch kann jede der 3 Interruptleitungen des XBUS (INT2, INT3, INTU) mit jedem der 2 Interrupt Pins der M32 (PD3, PB2) verbunden werden.&lt;br /&gt;
&lt;br /&gt;
Wenn man keine der Codierbrücken aufsteckt, sind die Pins PD3 (I2) und PB2 (I3) des M32-Prozessors nicht mehr mit dem XBUS verbunden und können anders verwendet werden. Auf der M32 kann man dann z.B. auch andere Verbindungen zum XBUS herstellen, indem man auf die Pins INT2, INT3 oder INTU Kabelverbindungen aufsteckt.&lt;br /&gt;
&lt;br /&gt;
====== ADC0 und ADC1 frei nutzen ======&lt;br /&gt;
Auf der M32 ist ADC0 fest mit dem Mikrofon (MIC) und ADC1 mit den Tastern T1..T5 (KEYPAD) verbunden. Wenn man diese ADC-Eingänge für andere Sensoren benötigt, kann man das Mikrofon und die Taster von den Eingängen abtrennen.&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_M32_MIC_KEY.JPG|thumb|MIC_KEYPAD]]&lt;br /&gt;
&lt;br /&gt;
Man braucht dazu:&lt;br /&gt;
* 1-reihige Stiftleiste RM 2,54mm (z.B. 36-polig 732478)&lt;br /&gt;
* Eine Codierbrücke (z.B. aus Set 742902)&lt;br /&gt;
&lt;br /&gt;
MIC/ADC0:&lt;br /&gt;
Es muss eine kurze Leiterbahn zwischen zwei Lötpunkten aufgetrennt werden, die sich zwischen R2 und C19 befinden (SP1 D4: YM1, YM2). Die Leiterbahn muss mit einem scharfen Messer oder einem speziellen Leiterbahn-Unterbrecher zwischen den beiden Lötpunkten unterbrochen werden. Man sollte anschließend mit einem Widerstandsmeßgerät nachmessen: Es sollte keine Verbindung mehr bestehen. Vorsicht: Nicht R2 beschädigen! Damit ist das Mikrofon auf der M32 ohne Funktion und ADC0 kann anders genutzt werden. ADC0 ist dann am oberen Lötpunkt zwischen R2 und C19 verfügbar, dort müßte eine Kabelverbindung angelötet werden.&lt;br /&gt;
Soll das Mikrofon später doch wieder an ADC0 angeschlossen werden, verbindet man die beiden Lötpunkte zwischen R2 und C19 einfach mit etwas Lötzinn oder mit einem SMD Null Ohm Widerstand.&lt;br /&gt;
&lt;br /&gt;
KEYPAD/ADC1:&lt;br /&gt;
Es muss eine kurze Leiterbahn zwischen zwei Lötpunkten aufgetrennt werden, die sich unterhalb von R15 befinden (SP1 D2: YKP1, YKP2). Die Leiterbahn befindet sich auf der Lötseite der Platine und muss mit einem scharfen Messer oder einem speziellen Leiterbahn-Unterbrecher zwischen den beiden Lötpunkten unterbrochen werden. Man sollte anschließend mit einem Widerstandsmeßgerät nachmessen: Es sollte keine Verbindung mehr bestehen. Jetzt trennt man von der 1-reihigen Stiftleiste 2 Kontakte ab und lötet sie auf die beiden Punkte unterhalb von R15. Hier kann man jetzt eine Codierbrücke aufstecken, wenn man die Taster weiter benutzen will. Wenn die Brücke abgezogen ist, sind die Taster ohne Funktion und ADC1 kann anders genutzt werden. ADC1 ist dann am linken Pin der 2-poligen Stiftleiste unterhalb von R15 verfügbar.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== RP6 CCPRO M128 Platine===&lt;br /&gt;
&lt;br /&gt;
[[Bild:CCPRO M128 k-1-.jpg|Das CCPRO M128]]&lt;br /&gt;
&lt;br /&gt;
====Beschreibung====&lt;br /&gt;
Die M128 (191563) ergänzt das RP6 Roboter System um einen leistungsfähigen ATMEGA 128 Prozessor.&lt;br /&gt;
Es sind ein I²C Temperatursensor; 19 I/O-Ports, davon 8 ADCs, 3 PWM (Servos) und 2 I/Os für einen UART; 1 Beeper; 5 Status-LEDs; 1 LC-Display-Port sowie ein freier Steckplatz für ein EEPROM verfügbar.&lt;br /&gt;
&lt;br /&gt;
====Technische Daten====&lt;br /&gt;
{|  {{Blauetabelle}} &lt;br /&gt;
|'''Mikrocontroller:'''&lt;br /&gt;
|Steckplatz für ein C-Control PRO MEGA128 Modul mit einem ATMEGA 128 ([https://www.conrad.de/de/p/c-control-prozessor-unit-mega-128-pro-198219.html 198219])&lt;br /&gt;
|-&lt;br /&gt;
|'''Speicher:'''&lt;br /&gt;
|128 kB [[Flash]]-Speicher, davon 4 kB bereits vom Bootloader belegt&amp;lt;br/&amp;gt;&lt;br /&gt;
4 kB SRAM intern&amp;lt;br/&amp;gt; &lt;br /&gt;
64 kB SRAM extern&amp;lt;br/&amp;gt;&lt;br /&gt;
4 kB [[EEPROM]]&lt;br /&gt;
|-&lt;br /&gt;
|'''Programmierung:'''&lt;br /&gt;
|Über CCPRO-IDE&lt;br /&gt;
|-&lt;br /&gt;
|'''Vorhandene Sensoren:'''&lt;br /&gt;
|1 12bit I²C Temperatursensor &amp;lt;br/&amp;gt;&lt;br /&gt;
19 I/O-Ports, davon 8 ADCs, 3 PWM (Servos) und 2 I/Os für eine weitere serielle Schnittstelle (UART)&lt;br /&gt;
|-&lt;br /&gt;
|'''Vorhandene Aktoren:'''&lt;br /&gt;
|1 Beeper&amp;lt;br/&amp;gt;&lt;br /&gt;
5 Status-LEDs&amp;lt;br/&amp;gt;&lt;br /&gt;
1 LC-Display-Port&amp;lt;br/&amp;gt;&lt;br /&gt;
1 Sockel für ein I²C-Bus EEPROM vom Typ 24(L)Cxxx&lt;br /&gt;
|-&lt;br /&gt;
|'''Abmessungen:'''&lt;br /&gt;
|(L &amp;amp;times; B &amp;amp;times; H) 112 &amp;amp;times; 90 &amp;amp;times; 21 mm&lt;br /&gt;
|-&lt;br /&gt;
|'''Ausführung:'''&lt;br /&gt;
|Fertig aufgebautes Erweiterungsmodul&lt;br /&gt;
|-&lt;br /&gt;
|'''Stromversorgung:'''&lt;br /&gt;
|6 AA NiMH Akkus (über die RP6 Base)&lt;br /&gt;
|-&lt;br /&gt;
|'''Hersteller:'''&lt;br /&gt;
|Arexx Niederlande&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Umbauoptionen====&lt;br /&gt;
Auf der CCPRO M128 ([http://www.conrad.de/ce/de/product/191563/Arexx-RP6-CC-PRO-MEGA128-Erweiterungssatz 191563]) kann leider nicht so viel umgebaut werden:&lt;br /&gt;
&lt;br /&gt;
* I2C-EEPROM&lt;br /&gt;
* Freie Nutzung von PORTA* und PORTC*&lt;br /&gt;
* USRBUS&lt;br /&gt;
* A16-/PD4-Nutzung&lt;br /&gt;
&lt;br /&gt;
Im Text gibt es Verweise auf den Schaltplan der CCPRO M128 (RP6_CCPRO_M128_Schematic.PDF) in der Form: (SP2 B1: Bauteil).  Dies bedeutet, dass man das Bauteil auf Blatt 2 des M128-Schaltplans im Feld B1 finden kann.&lt;br /&gt;
&lt;br /&gt;
Bei den Materialangaben ist öfter die Rede von &amp;quot;Steckbuchsen mit Litze&amp;quot;. Diese Steckbuchsen mit angelöteter Litze können auf die ein- oder zweireihigen Stiftleisten aufgesteckt werden. Leider gibt es sie nicht (mehr) fertig konfektioniert bei CONRAD. Die einreihigen Steckbuchsen (RM 2,54mm) kann man aber z.B. bei [http://www.elv.de/output/controller.aspx ELV] bekommen: 2-polig (68-016635), 3-polig (68-022503) und 5-polig (68-023073). An sie muss man dann noch Litzen in der entsprechenden Länge selbst anlöten.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=====I2C-EEPROM=====&lt;br /&gt;
Zum Einsetzen eines I2C-EEPROMS (IC6; SP2 C1: IC6) braucht man nichts umzubauen. Man kauft einfach ein passendes EEPROM des Typs 24(L)Cxxxx-P und setzt es auf seinen Sockel, Kerbe zum oberen Platinenrand.&lt;br /&gt;
&lt;br /&gt;
Mögliche Typen (erhältlich z.B. bei [http://www.digikey.de/ Digi-Key] oder bei [http://www.reichelt.de./ Reichelt]):&lt;br /&gt;
* AT24C128  (AT24C128-10PU-2.7-ND)&lt;br /&gt;
* AT24C256  (AT24C256-10PU-2.7-ND)&lt;br /&gt;
* AT24C512  (AT24C512-10PU-2.7-ND)&lt;br /&gt;
* AT24C1024 (AT24C1024-10PI-2.7-ND)&lt;br /&gt;
&lt;br /&gt;
=====Anschlüsse=====&lt;br /&gt;
Hier wird aufgelistet, wo man auf der M128 Platine Anschlüsse nutzen kann, um sie z.B. zu weiteren Sensoren, zum USRBUS oder (weniger empfehlenswert!) direkt zu EPs, zur RP6 Base oder zur M32 zu führen. &lt;br /&gt;
&lt;br /&gt;
======Freie Nutzung von PORTA* und PORTC*======&lt;br /&gt;
Um PORTA* und PORTC* frei nutzen zu können (für weitere I/O-Ports), muss man auf das externe SRAM verzichten, was nicht sehr ratsam ist. Mehr I/O-Ports kann man alternativ durch I/O Expander gewinnen. Falls man das SRAM trotzdem deaktivieren will, hier die Anleitung.&lt;br /&gt;
&lt;br /&gt;
Für den Umbau braucht man:&lt;br /&gt;
* Wannenstecker 2x5-polig gerade RM 2,54mm (z.B. [http://www.reichelt.de./ Reichelt] WSL 10G)&lt;br /&gt;
* 1-reihige Stiftleiste RM 2,54mm (z.B. 36-polig 732478)&lt;br /&gt;
* Eine Codierbrücke (z.B. aus Set 742902)&lt;br /&gt;
[[Bild:RP6_M128_PortA.JPG|thumb|PORTA*]]&lt;br /&gt;
&lt;br /&gt;
Für die Bestückung von PORTA* (SP2 AB2: Stecker PORTA*) lötet man den Wannenstecker hier (siehe Abb. PORTA*) auf.&lt;br /&gt;
[[Bild:RP6_M128_PortC.JPG|thumb|PORTC*]]&lt;br /&gt;
&lt;br /&gt;
Für die Bestückung von PORTC* (SP1 A2: PC0..7, YGND1) trennt man von der 1-reihigen Stiftleiste 9 Kontakte ab und lötet sie auf die PORTC*-Lötpunkte (siehe Abb. PORTC*).&lt;br /&gt;
&lt;br /&gt;
Dann muss noch der SRAM-Enable Jumper (SP1 EF1: Y27..29) bestückt werden:&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_M128_EN_SRAM.JPG|EN_SRAM]]&lt;br /&gt;
&lt;br /&gt;
Man trennt von der 1-reihigen Stiftleiste 3 Kontakte ab und lötet sie auf die abgebildeten Lötpunkte. Vorher muss eine Leiterbahn auf der Lötseite der Platine zwischen den ENABLE-Lötpunkten aufgetrennt werden.&lt;br /&gt;
Wenn das SRAM wie bisher genutzt werden soll, steckt man die Codierbrücke auf die Stellung &amp;quot;ENABLE&amp;quot;. Will man stattdessen Port A und Port C frei nutzen (und damit auf SRAM verzichten!), kommt die Codierbrücke auf &amp;quot;DISABLE&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
======USRBUS======&lt;br /&gt;
Auf die 14 Kontakte neben dem Wannenstecker USRBUS2 ist noch nichts gelötet.&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_M128_USRBUS.JPG|thumb|USRBUS]]&lt;br /&gt;
&lt;br /&gt;
Ich würde auf Y1..Y14 eine Stiftleiste löten, damit die USRBUS-Belegung geändert werden kann.&lt;br /&gt;
&lt;br /&gt;
Man braucht dazu:&lt;br /&gt;
* 2-reihige Stiftleiste RM 2,54mm (z.B. 2x36-polig 742007)&lt;br /&gt;
* Einige Steckbuchsen mit Litze&lt;br /&gt;
&lt;br /&gt;
Man trennt von der 2-reihigen Stiftleiste 2x7 Kontakte ab und lötet sie auf die Punkte Y1..Y14 (SP2 E234: Y1..Y14) neben dem Wannenstecker USRBUS2. Wird die M128 über Flachkabel mit einem USRBUS-Stecker auf einer RP6 Experimentierplatine (EP) und/oder mit dem RP6 selbst verbunden, dann hat man mit allen mit dem USRBUS verbundenen Platinen eine direkte 14-polige Verbindung,- eben den &amp;quot;User Bus&amp;quot;. Den kann man dann nutzen, wie man will. Auf der M128 kann man mit Steckbuchsen die Pins Y1..Y14 mit anderen Pins verbinden.&lt;br /&gt;
&lt;br /&gt;
Beispiel: Verbindet man den Pin &amp;quot;ADC4&amp;quot; mit Y1 des USRBUS, dann steht der Eingang ADC4 auf allen an den USRBUS angeschlossenen Platinen an Y1 zur Verfügung. Man braucht also diesen Eingang nicht über ein eigenes Kabel auf eine EP zu führen, sondern kann dazu den USRBUS nehmen. Dadurch bleibt der Gesamtaufbau auf dem RP6 übersichtlich und komplett trennbar (man braucht nur die Stecker XBUS und USRBUS abzuziehen!).&lt;br /&gt;
&lt;br /&gt;
Wichtig: Man sollte gut dokumentieren, wie man den USRBUS am RP6 (vorn und hinten getrennt!), auf EPs und der M128 benutzt! Sonst kann es bei einer anderen Anordnung von EPs zu USRBUS Konflikten/Kurzschlüssen kommen.&lt;br /&gt;
&lt;br /&gt;
======IC5 ALERT======&lt;br /&gt;
[[Bild:RP6_M128_IC5_ALERT.JPG|thumb|IC5 ALERT]]&lt;br /&gt;
Dieser Lötpunkt (SP2 C2: AL) neben IC5 ist der Anschluß ALERT (Pin 3) des I2C-Temperatursensors TCN75A (SP2 C2: IC5).&lt;br /&gt;
&lt;br /&gt;
Dies ist ein Open-Drain Ausgang, der ein Alarm-Signal ausgibt, wenn die Temperatur die eingestellten Grenzen über-/unterschreitet (siehe auch Datenblatt des Sensors (TCN75A.pdf), Abschnitt 5.3.4!). Wenn man ALERT auf einen Eingang des Microcontrollers führen will, muß man auch noch einen Pullup-Widerstand vorsehen oder den internen Pullup des uC-Eingangs aktivieren.&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;
======VDD/GND Anschluß======&lt;br /&gt;
[[Bild:RP6_M128_VDDGND.JPG|thumb|VDD GND]]&lt;br /&gt;
Auf der CCPRO M128 gibt es 2 Lötpunkte (SP1 E34: YVDD3, YGND4) zwischen R5 und C7 bzw. direkt neben der Codierbrücke (SP1 E3: YL9, YL10) zum Deaktivieren von LED5.&lt;br /&gt;
&lt;br /&gt;
Hier könnte man VDD und GND kontaktieren. VDD ist der Lötpunkt, der näher an R5 liegt.&lt;br /&gt;
&lt;br /&gt;
=====Trennstellen=====&lt;br /&gt;
An diesen Stellen können Leiterbahnen unterbrochen werden, um Funktionen zu deaktivieren oder anders zu nutzen. &lt;br /&gt;
&lt;br /&gt;
======A16-/PD4-Nutzung======&lt;br /&gt;
&lt;br /&gt;
[[Bild:v2RP6_M128_A16.JPG|thumb|A16/PD4]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Auf der CCPRO M128 gibt es ein 3-poliges Feld von Lötpunkten (SP2 AB1: PD4, A16, GND) unter dem CCPRO MEGA128 Modul (IC1). Standardmässig ist A16 des SRAM (IC3) hier auf GND gelegt. Damit kann man PD4 des Prozessors (ICP1) frei nutzen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Will man A16 des SRAM mit PD4 schaltbar machen, muss man eine Leiterbahn auf der Bestückungsseite zwischen den oberen zwei der drei Lötpunkte auftrennen und die anderen (unteren) beiden Lötpunkte mit etwas Lötzinn oder einem SMD Null Ohm Widerstand verbinden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der Sinn dieses Umbaus besteht darin, dass man danach anstelle von 64kB nun die vollen 128kB SRAM des IC3 adressieren kann. Man muss dann aber PD4 selbst schalten, da C-Control PRO ab Version 1.50 nur 64kB ext. SRAM ansteuern kann. Immerhin könnte man dann 2 Blöcke à je 64kB nutzen und mit PD4 zwischen beiden Blöcken umschalten.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ob CCPRO damit klar kommt: Wohl kaum! Ich würde daher diesen Umbau nicht durchführen.&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Zubehör und Ersatzteile ==&lt;br /&gt;
Von [http://www.conrad.de/ce/ CONRAD] gibt es z.B. &lt;br /&gt;
&lt;br /&gt;
* das LC- ([http://www.conrad.de/ce/de/product/190911/LC-DISPLAY-16-X-2-KONFEKTIONIERT 190911] AUSVERKAUFT!) oder Backlight-Display ([http://www.conrad.de/ce/de/product/191621/DISPLAY-RP5RP6-BLAU-MIT-BACKLIGHT 191621] AUSVERKAUFT!), welche an die M32, an die CCPRO M128 und an die M256 WiFi angeschlossen werden können,&lt;br /&gt;
* einen IR-Ball ([http://www.conrad.de/ce/de/product/191437/INFRAROT-BALL-FUeR-ROBOTER-FUssBALL 191437] AUSVERKAUFT!),&lt;br /&gt;
* einen Graustufen-Boden-Sensor ([http://www.conrad.de/ce/de/product/191599/GRAUSTUFEN-BODEN-SENSOR-FUeR-FUssBALLROBOT 191599] AUSVERKAUFT!),&lt;br /&gt;
* eine IR-Fernbedienung Promo 8 ([http://www.conrad.de/ce/de/product/340720/PROMO-8-UNIVERSALFERNBEDIENUNG 340720] AUSVERKAUFT!) oder Vivanco UR 89 ([http://www.conrad.de/ce/de/product/351013/VivancoUR-89-Fernbedienung-8-Geraete 351013] AUSVERKAUFT!),&lt;br /&gt;
* Ersatzräder ([http://www.conrad.de/ce/de/product/191307/ANTRIEBSRAD-RP5RP6 191307] AUSVERKAUFT!),&lt;br /&gt;
* Ersatzzahnräder ([http://www.conrad.de/ce/de/product/191346/SCHRAeG-ZAHNRAeDERSATZ-RP5RP6 191346]) und&lt;br /&gt;
* Ersatzraupen ([http://www.conrad.de/ce/de/product/191333/RAUPENSATZ-RP5RP6 191333] AUSVERKAUFT!).&lt;br /&gt;
&lt;br /&gt;
===Displays===&lt;br /&gt;
Die vorkonfektionierten Displays kann man zum Ausgeben von Texten, Sensordaten und kleinen Animationen benutzen. Sie können an die M32, an die CCPRO M128 und an die M256 WiFi angeschlossen werden.&lt;br /&gt;
&lt;br /&gt;
Diese 16x2 Zeichen Displays sind bisher lieferbar:&lt;br /&gt;
&lt;br /&gt;
* LC-Display ([http://www.conrad.de/ce/de/product/190911/LC-DISPLAY-16-X-2-KONFEKTIONIERT 190911])&lt;br /&gt;
* OLED-Display (197622)&lt;br /&gt;
* Backlight-Display AREXX RP-DSP88 ([http://www.conrad.de/ce/de/product/191621/DISPLAY-RP5RP6-BLAU-MIT-BACKLIGHT 191621])&lt;br /&gt;
&lt;br /&gt;
Das LCD ist seit September 2018 bei CONRAD ausverkauft; zeitweise (2007/08) gab es unter dieser Bestellnummer eine Version, die zu klein (66 x 37mm) war, um sie auf der M32, der CCPRO M128 oder der M256 WiFi zu montieren.&lt;br /&gt;
&lt;br /&gt;
Das OLED-Display ist aktuell (April 2012) nicht mehr lieferbar.&lt;br /&gt;
&lt;br /&gt;
Das zuletzt ausschließlich nur noch erhältliche blaufarbige Backlight-Display ist seit Mai 2020 bei CONRAD ausverkauft.&lt;br /&gt;
&lt;br /&gt;
Diese Displays können mit 4 M3-Abstandbolzen 25 mm ([http://www.conrad.de/ce/de/product/526665/Abstandsbolzen1-x-Aussengewinde1-x-InnengewindeMessing-vernickelt-Schluesselweite-55-mm Bestell-Nr. 526665]) und 4 Muttern M3 ([http://www.conrad.de/ce/de/product/815624/TOOLCRAFT-Sechskant-Muttern-DIN-934-934-Stahl-verzinkt-M3-100-St z.B. aus 815624]), sowie 4 Schrauben M3 ([http://www.conrad.de/ce/de/product/815322/TOOLCRAFT-Linsenkopfschrauben-mit-Kreuzschlitz-DIN-7985-7985-6-mm-Stahl-verzinkt-Guete-48-M3-100-St z.B. aus 815322]) auf der M32, der CCPRO M128 oder der M256 WiFi befestigt werden. Leider sind die Befestigungslöcher der Displays zu klein für ein M3-Gewinde, so dass man die Löcher sehr vorsichtig auf 3..3,2 mm erweitern muss.&lt;br /&gt;
&lt;br /&gt;
===IR-Ball===&lt;br /&gt;
Den IR-Ball (AREXX IRB-35, AUSVERKAUFT!) kann man benutzen, um mit dem RP6 Fußball oder Ähnliches zu spielen. Der Ball kann dann von den IR-Sensoren des RP6 erkannt und geortet werden.&lt;br /&gt;
&lt;br /&gt;
===Graustufen-Boden-Sensor===&lt;br /&gt;
Der Graustufen-Boden-Sensor (AREXX ARX-GS7) dient zur Orientierung eines Roboters auf einem Fußballfeld, das in bestimmten Grauabstufungen eingefärbt ist (CONRAD 191404  AUSVERKAUFT!). Dieser Fußballfeld-Aufkleber (AREXX ARX-FF008) ist auch bei [http://www.elv.de ELV] (Artikel-Nummer 68-101831) ausverkauft.&lt;br /&gt;
&lt;br /&gt;
===IR-Fernbedienung===&lt;br /&gt;
[[Bild:RP6_RC.jpg|thumb|2 RC5 Fernbedienungen]]&lt;br /&gt;
Mit einer Universal-IR-Fernbedienung, die den RC5-IR-Code senden kann, kann der RP6 wie ein ferngesteuertes &amp;quot;Auto&amp;quot; verwendet werden. Im Beispielprogramm &amp;quot;Example_08_TV_REMOTE&amp;quot; im Ordner der RP6-Base-Demos wird das noch genauer erläutert.&lt;br /&gt;
&lt;br /&gt;
===Ersatzräder===&lt;br /&gt;
Die Ersatzräder dienen als Ersatzteile für den RP6, RP6v2 und das RP5/RP6-Fahrgestell.&lt;br /&gt;
&lt;br /&gt;
===Ersatzzahnräder===&lt;br /&gt;
Die Ersatzzahnräder dienen als Ersatzteile für den RP6, RP6v2 und das RP5/RP6-Fahrgestell.&lt;br /&gt;
&lt;br /&gt;
===Ersatzraupen===&lt;br /&gt;
Die Ersatzraupen dienen als Ersatzteile für den RP6, RP6v2 und das RP5/RP6-Fahrgestell.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Programmierung==&lt;br /&gt;
Um diesen Grundlagenartikel zum RP6 nicht immer länger werden zu lassen, habe ich den Teil zur Programmierung des [[RP6_-_Programmierung#RP6_Base_und_CONTROL_M32|RP6]] und seiner Erweiterungsplatinen [[RP6_-_Programmierung#RP6_Base_und_CONTROL_M32|RP6 CONTROL M32]] und [[RP6_-_Programmierung#RP6_CCPRO_M128|RP6 CCPRO M128]] ausgelagert: [[RP6 - Programmierung]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==RP6v2==&lt;br /&gt;
Der neue [http://www.conrad.de/ce/de/product/191584/RP6-V2-ROBOTERSYSTEM RP6v2] ist weitgehend identisch mit dem RP6, so dass fast alle Angaben dieses Artikels auch für den RP6v2 zutreffen.&lt;br /&gt;
Für vom RP6 abweichende Details des RP6v2 und für dessen zukünftige Erweiterungsplatinen (z.B. das aktuell [http://www.arexx.com/forum/viewtopic.php?f=19&amp;amp;t=1797 hier] angekündigte Erweiterung-Modul [[RP6v2#RP6v2_M256_WiFi_Platine|RP6v2 M256 WiFi]]) gibt es einen eigenen Grundlagenartikel: [[RP6v2]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==RP6 Sensor Board und Xtra Module==&lt;br /&gt;
Einen eigenen Artikel gibt es auch für das [[RP6_Sensor_Board_und_Xtra_Module#RP6_Sensor_Board_2|RP6 Sensor Board]] und für die [[RP6_Sensor_Board_und_Xtra_Module#RP6_Xtra_Module_2|Xtra Module]]: [[RP6_Sensor_Board_und_Xtra_Module|RP6 Sensor Board und Xtra Module]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Erfahrungsberichte==&lt;br /&gt;
&lt;br /&gt;
...in Arbeit...(kann aber gerne ergänzt werden)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Siehe auch==&lt;br /&gt;
* [[RP6 - Programmierung]]&lt;br /&gt;
* [[RP6v2]]&lt;br /&gt;
* [[RP6_Sensor_Board_und_Xtra_Module]]&lt;br /&gt;
* [[RP6_Kamera_-_Mitmach-Projekt]]&lt;br /&gt;
* [[RP6v2_I2C-Portexpander]]&lt;br /&gt;
* [[RP6v2 USB-RS232-Adapter]]&lt;br /&gt;
* [[RP6v2 Orientierung]]&lt;br /&gt;
* [[RP6 Multi IO Projekt]]&lt;br /&gt;
* [[RP6 Multi IO Projekt - Software]]&lt;br /&gt;
* [[RP6 ArduIO]]&lt;br /&gt;
* [[RP6 ArduIO - Software]]&lt;br /&gt;
* [[Induktive_Ladestation_f%C3%BCr_den_RP6|Induktive Ladestation für den RP6]]&lt;br /&gt;
* [[IR-bake_f%C3%BCr_den_RP6|IR-bake für den RP6]]&lt;br /&gt;
* [[CCRP5]]&lt;br /&gt;
* [[Wild Thumper]]&lt;br /&gt;
* [[Wild Thumper - Programmierung]]&lt;br /&gt;
* [[Yeti]]&lt;br /&gt;
* [[Asuro]]&lt;br /&gt;
* [[C't-Bot]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Weblinks==&lt;br /&gt;
'''Siehe auch die Weblinks im [http://www.rn-wissen.de/index.php/RP6v2#Weblinks RP6v2 Artikel]!'''&lt;br /&gt;
&lt;br /&gt;
* [http://www.pcwelt.de/start/gaming_fun/gadgets/news/84558/ PC-Welt-Artikel]&lt;br /&gt;
&lt;br /&gt;
* Ankündigung des RP6 und der RP6 CONTROL M32 im [http://www.arexx.com/forum/viewtopic.php?t=370 AREXX Support Forum]&lt;br /&gt;
* Ankündigung der RP6 CCPRO M128 im [http://www.arexx.com/forum/viewtopic.php?f=19&amp;amp;t=834&amp;amp;start=0 AREXX Support Forum] und im [http://www.roboternetz.de/community/threads/42228-RP6-C-Control-PRO-MEGA128-Erweiterungsmodul-Website-online RoboterNETZ]&lt;br /&gt;
* Ankündigung des RP6v2 im [http://www.roboternetz.de/community/threads/56964-NEWS-RP6v2-die-neue-Version-2-des-RP6-Robot-Systems RoboterNETZ] und im [http://www.arexx.com/forum/viewtopic.php?f=19&amp;amp;t=1778 AREXX Support Forum]&lt;br /&gt;
* Ankündigung der RP6v2 M256 WiFi im [http://www.arexx.com/forum/viewtopic.php?f=19&amp;amp;t=1797 AREXX Support Forum]&lt;br /&gt;
* [http://www.arexx.com/rp6 AREXX RP6 Startseite]&lt;br /&gt;
* [http://www.arexx.com/forum/viewforum.php?f=19 AREXX Support Forum]&lt;br /&gt;
* [http://www.arexx.com/rp6/html/de/soft_doc_ccpro.htm AREXX CCPRO M128 Seite]&lt;br /&gt;
&lt;br /&gt;
* [http://www.conrad.de/ce/de/product/191524/RP6-ROBOTERSYSTEM RP6 bei CONRAD]&lt;br /&gt;
* [http://www.conrad.de/ce/de/product/191584/RP6-V2-ROBOTERSYSTEM RP6v2 bei CONRAD]&lt;br /&gt;
* [http://www.conrad.de/ce/de/product/191550/RP6-MEGA32-ERWEITERUNGSSATZ RP6 CONTROL M32 bei CONRAD]&lt;br /&gt;
* [http://www.conrad.de/ce/de/product/191563/RP6-CC-PRO-MEGA128-ERWEITERUNGSSATZ RP6 CCPRO M128 bei CONRAD]&lt;br /&gt;
* [http://www.c-control.de/c-control-pro/c-control-pro/startseite_c-control-pro.html C-Control PRO Startseite]&lt;br /&gt;
* [http://ccpro.cc2net.de/forum/ C-Control PRO Forum]&lt;br /&gt;
&lt;br /&gt;
* [http://www.roboternetz.de/phpBB2/viewforum.php?f=49 Roboternetz RP6 Forum]&lt;br /&gt;
* &amp;quot;Geburt&amp;quot; des Wiki im RN-Forum: [http://www.roboternetz.de/community/threads/32793-RP6-Wiki-Artikel RP6-Wiki-Artikel]&lt;br /&gt;
* Henkessoft: [http://www.henkessoft.de/Roboter/rp6.htm RP6]&lt;br /&gt;
* PIC-PROJEKTE Wiki: [http://pic-projekte.de/wiki/index.php?title=RP6  RP6]&lt;br /&gt;
* benhup.com: [http://www.benhup.com/?mf=eduntech&amp;amp;sf=rp6 Arexx RP6 Robot (with ATmega32 chip)]&lt;br /&gt;
* RP6 &amp;quot;Panzer&amp;quot;: [http://www.roboternetz.de/community/threads/57171-mein-(Heng-Long)-RP6 Heng-Long-RP6]&lt;br /&gt;
&lt;br /&gt;
* [http://www.youtube.com/results?search_query=rp6 RP6 Videos]&lt;br /&gt;
* [http://de-de.facebook.com/pages/Robby-RP6/155118711202285 facebook]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Robotikeinstieg]]	 &lt;br /&gt;
[[Kategorie:Praxis]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Autoren==&lt;br /&gt;
--[http://www.roboternetz.de/community/members/24729-sloti sloti] 22:23, 29. Dez 2007 (CET)&lt;br /&gt;
&lt;br /&gt;
--[http://www.roboternetz.de/community/members/44891-Tobias1 Tobias1] 18:30, 6. Apr 2010 (CET)&lt;br /&gt;
&lt;br /&gt;
--[http://www.roboternetz.de/community/members/1972-Dirk Dirk] 12:51, 23. Okt 2020 (CET)&lt;/div&gt;</summary>
		<author><name>Dirk NO2</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=RP6&amp;diff=28575</id>
		<title>RP6</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=RP6&amp;diff=28575"/>
				<updated>2022-03-31T09:04:44Z</updated>
		
		<summary type="html">&lt;p&gt;Dirk NO2: /* RP6 CCPRO M128 Platine */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Bild:RP6_2.jpg|RP6 Base Roboter|right|500px]]&lt;br /&gt;
==Was bisher geschah==&lt;br /&gt;
Fre, 08. Jun 2007 - Ankündigung des RP6 und der RP6 CONTROL M32&amp;lt;br/&amp;gt;&lt;br /&gt;
Mon, 02. Jul 2007 23:00 - Benachrichtigung der Tester&amp;lt;br/&amp;gt;&lt;br /&gt;
Die, 03. Jul 2007 15:00 - Bereitstellung der Dokumentation&amp;lt;br/&amp;gt;&lt;br /&gt;
Don, 05. Jul 2007 14:30 - Bereitstellung der Schaltungsunterlagen&amp;lt;br/&amp;gt;&lt;br /&gt;
Son, 08. Jul 2007 16:00 - Nachricht über den Versand der RP6&amp;lt;br/&amp;gt;&lt;br /&gt;
Mon, 09. Jul 2007 00:15 - Bereitstellung der Library und der Beispielprogramme&amp;lt;br/&amp;gt;&lt;br /&gt;
Die, 10. Jul 2007 - Eintreffen der RP6 bei den Testern&amp;lt;br/&amp;gt;&lt;br /&gt;
Mon, 16. Jul 2007 - Auslieferungsbeginn des RP6&amp;lt;br/&amp;gt;&lt;br /&gt;
Fre, 24. Apr 2009 - Ankündigung der RP6 CCPRO M128 (Auslieferung schon ab Mitte April 2009)&amp;lt;br/&amp;gt;&lt;br /&gt;
Mon, 27. Feb 2012 - Ankündigung des RP6v2&amp;lt;br/&amp;gt;&lt;br /&gt;
Don, 08. Mär 2012 - Auslieferungsbeginn des RP6v2&amp;lt;br/&amp;gt;&lt;br /&gt;
Sam, 17. Mär 2012 - Ankündigung der RP6v2 M256 WiFi&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Siehe auch &amp;quot;Was bisher geschah&amp;quot; im [http://www.rn-wissen.de/index.php/RP6v2#Was_bisher_geschah RP6v2 Artikel]!'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Allgemein==  &lt;br /&gt;
[[Bild:DSC03448.JPG|thumb|RP6 mit Erweiterungsboard]] [[Bild:RP6_Lieferumfang.jpg|thumb|RP6 im Lieferumfang]]&lt;br /&gt;
Der von Arexx entwickelte RP6 ([http://www.conrad.de/ce/de/product/191524/C-Control-Robot-System-RP6-Robotersystem 191524]) ist ein autonomes Raupenfahrzeug, das nicht nur für Schüler und Studenten zum Einstieg in das Gebiet Robotik sondern auch für Fortgeschrittene Elektroniker und Bastler sehr gut geeignet ist, da das System für selbstentworfene Erweiterungen ausgelegt ist. Der RP6 wird von einem, unter Roboterentwicklern beliebten, AVR Microcontroller von Atmel gesteuert und hat Lichtsensoren in Form von zwei LDRs, 2 Bumper an der Stoßstange, 6 Status LEDs, Sensoren zur Überwachung der Akkuspannung, Drehgeber mit 625 CPR, ein Infrarot Sensor zur Hinderniserkennung und Kommunikation und Motorstromsensoren zur Verfügung. Zudem liegt dem Roboter eine umfangreiche Anleitung, inklusive einem kleinen C-Crashkurs, ein USB-Interface zum Anschluss an den PC und ein USB Kabel bei.&lt;br /&gt;
&lt;br /&gt;
In diesem Artikel geht es um die Grundlagen des RP6. Zur Programmierung des RP6 gibt es eine eigene Seite: [[RP6 - Programmierung]]&lt;br /&gt;
&lt;br /&gt;
==Technische Daten==&lt;br /&gt;
{|  {{Blauetabelle}} &lt;br /&gt;
|'''Mikrocontroller:'''&lt;br /&gt;
|AVR [[ATmega32]]&lt;br /&gt;
|-&lt;br /&gt;
|'''Speicher:'''&lt;br /&gt;
|32 kB [[Flash]]-Speicher, davon 1 kB bereits vom Bootloader belegt&amp;lt;br/&amp;gt;&lt;br /&gt;
2 kB RAM&amp;lt;br/&amp;gt; &lt;br /&gt;
1 kB [[EEPROM]]&lt;br /&gt;
|-&lt;br /&gt;
|'''Programmierung:'''&lt;br /&gt;
|Über AVR-[[Bootloader]], belegt ca. 1 kB des Flash-Speichers&lt;br /&gt;
|-&lt;br /&gt;
|'''Vorhandene Sensoren:'''&lt;br /&gt;
|2 [[Sensorarten#Helligkeit|Lichtsensoren (LDR)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
1 [[Sensorarten#Helligkeit|Infrarot (ACS - Anti Collision System)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
2 [[Sensorarten#Bumpers|Bumper]] &amp;lt;br/&amp;gt; &lt;br /&gt;
2 [[Sensorarten#Incremental-Geber|Drehgeber (Encoder)]]&lt;br /&gt;
|-&lt;br /&gt;
|'''Vorhandene Aktoren:'''&lt;br /&gt;
|2 Motoren&amp;lt;br/&amp;gt;&lt;br /&gt;
6 Status-LEDs&amp;lt;br/&amp;gt;&lt;br /&gt;
1 IR-Sender&amp;lt;br/&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|'''Abmessungen:'''&lt;br /&gt;
|(L &amp;amp;times; B &amp;amp;times; H) 172 &amp;amp;times; 128 &amp;amp;times; 50 mm&lt;br /&gt;
|-&lt;br /&gt;
|'''Ausführung:'''&lt;br /&gt;
|Fertig aufgebauter Roboter&lt;br /&gt;
|-&lt;br /&gt;
|'''Stromversorgung:'''&lt;br /&gt;
|6 AA NiMH Akkus&lt;br /&gt;
|-&lt;br /&gt;
|'''Hersteller:'''&lt;br /&gt;
|Arexx Niederlande&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Mechanik==&lt;br /&gt;
===Beschreibung===&lt;br /&gt;
&lt;br /&gt;
===Sensoren===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Encoder====&lt;br /&gt;
&lt;br /&gt;
Die Drehgeber sind an den Getrieben der Motoren zur Drehzahlmessung angebracht. Es handelt sich dabei um Reflexlichtschranken, die auf Codierscheiben mit je 18 weissen und 18 schwarzen Segmenten ausgerichtet sind, also insgesamt 36 Segmente. Diese Codierscheiben sind wiederum an je eines der Zahnräder der beiden Getriebe geklebt worden. Wenn es sich dreht, wandern die einzelnen Segmente an der Reflexlichtschranke vorbei. Die weissen Segmente reflektieren das Infrarotlicht, die schwarzen Segmente nur wenig. Jedes der zwei mittleren Stufenzahnräder des Getriebes hat 50 Zähne auf dem großen, und 12 auf dem kleineren Zahnrad. Die Codierscheiben befinden sich auf dem Zahnrad neben dem Motor, also rechnet man:&lt;br /&gt;
50/12 * 50/12 =17.13/36; 17.13/36 * 36=625&lt;br /&gt;
Daher haben die Encoderscheiben auch Ihre 36 Segmente, denn das gibt eine schöne runde Zahl ohne gebrochenen Anteil. Die Drehgeber erzeugen also 625 Flanken pro Radumdrehung wobei jede Flanke einem Segment entspricht. Bei einem Raddurchmesser von ca. 50mm inkl. Raupenkette, ergibt sich rein rechnerisch ein Radumfang von ca. 157mm was 0.2512mm pro Zählschritt der Drehgeber entspricht. Da sich die Raupenketten aber fast immer etwas in den Untergrund eindrücken (bzw. auch selbst eingedrückt werden) kann man aber von 0.25mm pro Zählschritt ausgehen – meist ist es sogar etwas weniger, z.B. nur 0.24 oder 0.23mm. Das muss man durch abfahren von Teststrecken ermitteln, wie es im Anhang grob beschrieben ist. Sehr genau ist das allerdings durch Radschlupf (bzw. hier müssten wir eigentlich von „Kettenschlupf“ sprechen) und ähnlichen Dingen nicht - vor allem beim Rotieren auf der Stelle. Beim normalen Geradeausfahren ist dieser Fehler klein, aber beim Rotieren kann er schnell sehr große Werte annehmen! Abweichungen muss man evtl. durch weitere Tests ermitteln und mit einkalkulieren. Das ist bei Raupenantrieben leider so – auch bei viel teureren und hochwertigeren Robotern. Dafür hat man aber den Vorteil, dass der Roboter mit Raupenantrieb recht geländegängig ist im Vergleich zu Robotern mit normalem Differentialantrieb mit zwei Antriebsrädern und Stützrad. Kleinere Hindernisse und Rampen kann er meist problemlos überwinden.&lt;br /&gt;
Dabei sind die Encoder sehr nützlich, denn man kann die Geschwindigkeit gut einregeln, egal wie der Untergrund und die Motorbelastung gerade aussieht. Bei gemessenen 50 Segmenten pro Sekunde liegt die Geschwindigkeit bei 1.25 cm/s, sofern wir von 0.25mm pro Zählschritt ausgehen. Etwa 50 Segmente pro Sekunde ist auch die geringste gerade noch regelbare Geschwindigkeit (das variiert aber etwas von Roboter zu Roboter). Bei 1200 Segmenten pro Sekunde wären es die maximal möglichen 30 cm/s (bei 0.25mm Auflösung, bei 0.23 sind es 27.6 cm/s). Standardmäßig begrenzt die Funktionsbibliothek das aber auf 1000 Flanken pro Sekunde. Die maximale Geschwindigkeit ist vom Ladezustand der Akkus abhängig – daher wären 30cm/s nicht besonders lange haltbar. Außerdem erhöht sich die Lebensdauer der Getriebe und Motoren je langsamer man fährt! Wenn der Roboter 4000 Segmente gezählt hat, ist er übrigens etwa einen Meter weit gefahren. Aber wie schon gesagt, gilt das natürlich nur für genau 0.25mm Auflösung. Ohne Kalibrierung hat man hier immer mehr oder weniger starke Abweichungen. Wem es nicht auf jeden mm ankommt, braucht nichts zu kalibrieren und kann einfach von 0.25mm oder besser 0.24mm ausgehen!&lt;br /&gt;
&lt;br /&gt;
====Stoßstangensensoren====&lt;br /&gt;
&lt;br /&gt;
Vorn am Roboter sind zwei Mikroschalter mit langem Schalthebel auf einer separaten&lt;br /&gt;
Platine untergebracht, die etwas vor der anderen Sensorplatine liegt. Dadurch werden&lt;br /&gt;
die IR LEDs auf der Sensorplatine geschützt und können nicht so leicht verbiegen&lt;br /&gt;
wenn der Roboter mal gegen ein Hindernis fährt. Die Stoßstange kann man auch abmontieren und z.B. gegen eine Schuss- oder Sammelvorrichtung für Bälle o.ä. ersetzen wenn man möchte.&lt;br /&gt;
&lt;br /&gt;
====Lichtsensoren====&lt;br /&gt;
&lt;br /&gt;
Vorne auf der kleinen Sensorplatine des Roboters sind zwei sog.&lt;br /&gt;
LDRs (=&amp;quot;Light Dependant Resistors&amp;quot; also lichtabhängige Widerstände)&lt;br /&gt;
platziert und nach links bzw. rechts ausgerichtet. Zwischen&lt;br /&gt;
den beiden Sensoren ist noch eine kleine schwarze&lt;br /&gt;
„Trennwand“ damit das Licht aus einer Richtung möglichst nur&lt;br /&gt;
einen der Sensoren erreicht. Sie bilden zusammen mit je einem&lt;br /&gt;
normalen Widerstand wie beim Batteriesensor einen Spannungsteiler – hier allerdings&lt;br /&gt;
um das Umgebungslicht zu messen.&lt;br /&gt;
&lt;br /&gt;
====Anti Collision System====&lt;br /&gt;
&lt;br /&gt;
Der aus Softwaresicht komplexeste Sensor des RP6 ist das ACS - das&lt;br /&gt;
„Anti Collision System“ (engl. für Anti Kollisions System)! Es besteht&lt;br /&gt;
aus einem IR Empfänger (s. Abb.) und zwei vorne auf der Sensorplatine&lt;br /&gt;
links und rechts angebrachten IR LEDs.&lt;br /&gt;
Da es je eine IR LED links und rechts gibt, kann das ACS grob unterscheiden ob sich&lt;br /&gt;
das Objekt links, rechts oder mittig vor dem Roboter befindet.&lt;br /&gt;
Man kann zusätzlich noch die Stromstärke mit der die beiden IR LEDs gepulst werden&lt;br /&gt;
in drei Stufen einstellen. Das ACS funktioniert aber auch in der höchsten Stufe nicht&lt;br /&gt;
mit allen Objekten immer zuverlässig, denn es kommt auf die Beschaffenheit der&lt;br /&gt;
Oberfläche des jeweiligen Objekts an! Ein schwarzes Objekt reflektiert das IR Licht natürlich&lt;br /&gt;
viel schlechter als ein weisses Objekt und ein kantiges und spiegelndes Objekt&lt;br /&gt;
könnte das IR Licht hauptsächlich in eine bestimme Richtung reflektieren. Die Reichweite&lt;br /&gt;
ist also immer vom jeweiligen Objekt abhängig! Das ist eine prinzipielle Schwäche&lt;br /&gt;
von so gut wie allen IR Sensoren (jedenfalls in dieser Preisklasse).&lt;br /&gt;
Trotzdem werden die meisten Hindernisse zuverlässig erkannt und können umfahren&lt;br /&gt;
werden. Falls das mal nicht klappt, gibt es noch die Stoßstange mit den Tastsensoren&lt;br /&gt;
und falls auch die nicht richtig getroffen werden, kann der Roboter noch mit den Motorstromsensoren&lt;br /&gt;
oder den Encodern erkennen, ob die Motoren blockieren (s.u.)!&lt;br /&gt;
Wem das nicht reicht, der könnte zusätzlich z.B. noch Ultraschallsensoren anbringen...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Erweiterungssystem===&lt;br /&gt;
Auf dem Mainboard sind 22 freie 3,2mm Löcher vorhanden (im Chassis weitere 16), auf denen die Erweiterungsmodule symmetrisch vorne und hinten gestapelt werden können. Weil der Stromverbrauch durch mehr Module steigt, ist es sinnvoll nur insgesamt 6-8 Module auf dem Roboter zu stapeln. Auf dem Mainboard selbst sind noch 6 kleine Erweiterungsflächen verfügbar (plus 2 sehr kleine auf der Bumperplatine).&lt;br /&gt;
&lt;br /&gt;
===Antrieb===&lt;br /&gt;
&lt;br /&gt;
Die 7,2 VDC Motoren sind im Chassis eingebaut und werden mithilfe der H-Brücken gesteuert. Die maximale Geschwindigkeit liegt bei 25cm/s, das kann je nach Akkuspannung aber variieren. Ohne Softwarebegrenzung sind sogar 30cm/s möglich, dadurch verringert sich aber die Lebensdauer der Motoren. Die maximale Steigung, die der RP6 bewältigen kann, ist 30%, ohne Bumperplatine 40%, das hängt aber auch vom Untergrund ab. Kleine Hindernisse wie Bücher und Stifte kann der RP6 problemlos überqueren. Die Achsen der Räder sind in selbstschmierenden Sinterlagern mit 4mm Durchmesser gelagert.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Elektromechanik==&lt;br /&gt;
===Beschreibung===&lt;br /&gt;
===Odometrie===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Elektronik==&lt;br /&gt;
[[Bild:RP6 Block.jpg|thumb|Blockdiagramm]]&lt;br /&gt;
===Beschreibung===&lt;br /&gt;
&lt;br /&gt;
===Sensoren (SENSORS)===&lt;br /&gt;
&lt;br /&gt;
Die meisten Sensoren über die der Roboter verfügt, haben wir ja schon in anderen Abschnitten kurz genannt, wollen diese nun aber etwas detaillierter betrachten.&lt;br /&gt;
In dem Blockdiagramm sind einige der Sensoren nicht in dem blauen Bereich &amp;quot;Sensors&amp;quot; zu sehen, weil sie besser in andere Bereiche passen. Trotzdem zählen natürlich auch die Drehgeber (= “Encoder“), Motorstromsensoren und der Batteriespannungssensor zu den Sensoren und werden darum in diesem Abschnitt beschrieben!&lt;br /&gt;
&lt;br /&gt;
====Batteriespannungs-Sensor (Voltage Sensor)====&lt;br /&gt;
&lt;br /&gt;
Dieser &amp;quot;Sensor&amp;quot; ist eigentlich nur ein einfacher Spannungsteiler aus zwei Widerständen. Wir gehen davon aus, dass die Batterien insgesamt maximal 10V liefern können. 6 NiMH Akkus werden immer unterhalb davon bleiben. Die Referenzspannung des ADC, also die Spannung mit der er die gemessene Spannung vergleicht, beträgt 5V. Da auch die Betriebsspannung 5V beträgt, darf diese nicht überschritten werden. Also müssen wir die zu messende Spannung um die Hälfte herabsetzen! Dies geschieht über einen Spannungsteiler aus zwei Widerständen, der die Spannung an den Messbereich des ADCs anpasst. Der ADC löst mit 10 Bit auf (Wertebereich 0 bis 1023), was eine Auflösung von 10V/1024=9.765625mV ergibt. Ein Messwert von 512 entspricht hier also 5V und 1023 wären ungefähr 10V! Diese Grenzwerte sollten aber normalerweise nie erreicht werden! Das ist nicht besonders genau, da die Widerstände keineswegs Präzisionswiderstände sind. Abweichungen von einigen Prozent nach oben und unten sind möglich. Auch die Referenzspannung von 5V ist nicht ganz genau und kann bei normaler Belastung etwas variieren. Das stört hier nicht, denn wir brauchen ohnehin nur einen ungefähren Wert um festzustellen ob die Batterien sich langsam dem Ende nähern. Wer die Spannung genau messen will, braucht ein Multimeter um den Messfehler zu ermitteln und diesen dann in Software auszugleichen. Wenn man mit Fehlern leben kann, kann man die Spannung dank des günstigen Umrechnungsverhältnisses sogar direkt aus den ADC Werten ungefähr abschätzen: 720 entsprechen dann grob 7.2V, 700 etwa 7V und 650 wären etwa 6.5V. Bei einem konstanten Wert unter 560 kann man davon ausgehen, dass die Akkus fast leer sind.&lt;br /&gt;
&lt;br /&gt;
====Motorstrom====&lt;br /&gt;
[[Bild:RP6_MSS.jpg|thumb]]&lt;br /&gt;
Es befinden sich zwei Leistungswiderstände in den beiden Motorstromkreisen. Aus dem Ohm'schen Gesetz U=RxI folgt, dass sich die Spannung die an einem bestimmten Widerstand abfällt, proportional zum Strom verhält, der diesen durchfließt!&lt;br /&gt;
Damit die Spannungsabfälle an den Widerständen nicht zu groß werden, müssen die Widerstände klein gewählt werden. In unserem Fall haben Sie einen Wert von 0.1 Ohm&lt;br /&gt;
Die abfallende Spannung ist also nur sehr klein (0.1V bei einem Strom von 1A) und muss verstärkt werden bevor sie mit dem ADC gemessen werden kann. Das erledigt jeweils ein sog. Operationsverstärker (OPV). In der Schaltung des RP6 wird je Motorkanal ein OPV verwendet. Der Messbereich geht etwa bis 1.8A. Bei 1.8A fallen etwa 0.18V am Widerstand ab und es ergibt sich am Ausgang des OPV eine Spannung von etwa 4V. Mehr kann der verwendete OPV bei 5V Betriebsspannung nicht ausgeben:&lt;br /&gt;
&lt;br /&gt;
I = U / ((1 + (100k / 4,7k)) * 0,1)&lt;br /&gt;
&lt;br /&gt;
Die Leistungswiderstände haben eine Toleranz von 10%, die Widerstände am OPV 5%, also ist das alles nur sehr ungenau (Ungenauigkeiten im Bereich von etwa 270mA sind möglich wenn man die Sensoren nicht kalibriert!). Wir brauchen allerdings auch nur den ungefähren Wert um festzustellen ob die Motoren stark oder wenig belastet werden. So kann der Roboter gut blockierte oder gar defekte Motoren bzw. Drehgeber erkennen! Die DC-Motoren benötigen mehr Strom je stärker sie belastet werden (Drehmoment) und somit steigt der Strom sehr stark an wenn die Motoren blockiert sind. Das wird von der Robotersoftware zur Notabschaltung verwendet: wenn die Motoren dauerhaft mit hohem Strom betrieben würden, könnten diese sehr heiß werden und dadurch Schaden nehmen! Und wenn die Encoder mal ausfallen sollten – aus welchem Grund auch immer – kann auch das damit erkannt werden. Man würde dann eine Drehzahl von 0 messen. Lässt man die Motoren aber auf voller Kraft laufen und der Strom bleibt trotzdem klein (also sind die Ketten nicht blockiert!), kann man genau daraus schließen, dass entweder die Encoder, oder die Motoren ausgefallen sind (oder Encoder und Motorstromsensoren nicht funktionieren... das passiert z.B. wenn man vergessen hat diese vorher per Software einzuschalten).&lt;br /&gt;
&lt;br /&gt;
====Encoder====&lt;br /&gt;
[[Bild:RP6_ENCODER.jpg|thumb]]&lt;br /&gt;
Ganz anders als die letztgenannten Sensoren funktionieren die Drehgeber, die an den Getrieben der Motoren zur Drehzahlmessung angebracht sind. Es handelt sich dabei um Reflexlichtschranken, die auf Codierscheiben mit je 18 weissen und 18 schwarzen Segmenten ausgerichtet sind, also insgesamt 36 Segmente (s. Abb). Diese Codierscheiben sind wiederum an je eines der Zahnräder der beiden Getriebe geklebt worden. Wenn es sich dreht, wandern die einzelnen Segmente an der Reflexlichtschranke vorbei. Die weissen Segmente reflektieren das Infrarotlicht, die schwarzen Segmente nur wenig. Die Drehgeber erzeugen so zwar auch wie die anderen Sensoren ein analoges Signal, aber es wird digital interpretiert. Zunächst wird das Signal verstärkt und anschließend über einen sog. Schmitt Trigger in ein Rechtecksignal umgewandelt. Die Flanken dieses Signals, also die Wechsel von 5 auf 0V und umgekehrt, lösen jeweils ein Interrupt Ereignis aus und diese werden dann von der Software gezählt. So kann die zurückgelegte Wegstrecke gemessen und zusammen mit einem Timer zur Zeitmessung die Drehzahl und damit auch die Geschwindigkeit ermittelt werden. Die Ermittlung der Drehzahl ist auch Hauptanwendung der Encoder – nur mit den Encodern kann man die Drehzahl auf den gewünschten Sollwert einregeln. Ohne Regelung wäre die Drehzahl nämlich von der Akkuspannung, Belastung der Motoren usw. abhängig. Die hohe Auflösung ermöglicht es dabei, auch niedrige Geschwindigkeiten noch relativ genau einzuregeln. Jedes der zwei mittleren Stufenzahnräder des Getriebes hat 50 Zähne auf dem großen, und 12 auf dem kleineren Zahnrad (s. Abb). Die Codierscheiben befinden sich auf dem Zahnrad neben dem Motor, also rechnet man:&lt;br /&gt;
&lt;br /&gt;
50/12 * 50/12 =17.13/36; 17.13/36 * 36=625&lt;br /&gt;
&lt;br /&gt;
Daher haben die Encoderscheiben auch Ihre 36 Segmente, denn das gibt eine schöne runde Zahl ohne gebrochenen Anteil. Die Drehgeber erzeugen also 625 Flanken pro Radumdrehung wobei jede Flanke einem Segment entspricht. Bei einem Raddurchmesser von ca. 50mm inkl. Raupenkette, ergibt sich rein rechnerisch ein Radumfang von ca. 157mm was 0.2512mm pro Zählschritt der Drehgeber entspricht. Da sich die Raupenketten aber fast immer etwas in den Untergrund eindrücken (bzw. auch selbst eingedrückt werden) kann man aber von 0.25mm pro Zählschritt ausgehen – meist ist es sogar etwas weniger, z.B. nur 0.24 oder 0.23mm. Das muss man durch abfahren von Teststrecken ermitteln, wie es im Anhang grob beschrieben ist. Sehr genau ist das allerdings durch Radschlupf (bzw. hier müssten wir eigentlich von „Kettenschlupf“ sprechen) und ähnlichen Dingen nicht - vor allem beim Rotieren auf der Stelle. Beim normalen Geradeausfahren ist dieser Fehler klein, aber beim Rotieren kann er schnell sehr große Werte annehmen! Abweichungen muss man evtl. durch weitere Tests ermitteln und mit einkalkulieren. Das ist bei Raupenantrieben leider so – auch bei viel teureren und hochwertigeren Robotern. Dafür hat man aber den Vorteil, dass der Roboter mit Raupenantrieb recht geländegängig ist im Vergleich zu Robotern mit normalem Differentialantrieb mit zwei Antriebsrädern und Stützrad. Kleinere Hindernisse und Rampen kann er meist problemlos überwinden.&lt;br /&gt;
Dabei sind die Encoder sehr nützlich, denn man kann die Geschwindigkeit gut einregeln, egal wie der Untergrund und die Motorbelastung gerade aussieht. Bei gemessenen 50 Segmenten pro Sekunde liegt die Geschwindigkeit bei 1.25 cm/s, sofern wir von 0.25mm pro Zählschritt ausgehen. Etwa 50 Segmente pro Sekunde ist auch die geringste gerade noch regelbare Geschwindigkeit (das variiert aber etwas von Roboter zu Roboter). Bei 1200 Segmenten pro Sekunde wären es die maximal möglichen 30 cm/s (bei 0.25mm Auflösung, bei 0.23 sind es 27.6 cm/s). Standardmäßig begrenzt die Funktionsbibliothek das aber auf 1000 Flanken pro Sekunde. Die maximale Geschwindigkeit ist vom Ladezustand der Akkus abhängig – daher wären 30cm/s nicht besonders lange haltbar. Außerdem erhöht sich die Lebensdauer der Getriebe und Motoren je langsamer man fährt!&lt;br /&gt;
&lt;br /&gt;
=====Encoder justieren=====&lt;br /&gt;
Damit der RP6 die Signale der Drehgeber richtig auswerten kann, muss man evtl. die Drehgeber einmalig justieren. Dies kann auch schon bei einem neu gekauften RP6 notwendig sein.&lt;br /&gt;
Eine genaue Anleitung dazu findet man [http://www.arexx.com/rp6/downloads/RP6_ENCODER_DE_20071219.zip hier]. Es gibt auch ein [http://www.arexx.com/rp6/downloads/rp6_encoder_video.zip Video], das die Drehgeber-Justierung zeigt.&lt;br /&gt;
&lt;br /&gt;
=====Encoder kalibrieren=====&lt;br /&gt;
Wenn der Roboter 4000 Segmente gezählt hat, ist er etwa einen Meter weit gefahren. Aber wie schon gesagt, gilt das natürlich nur für genau 0.25mm Auflösung. Ohne Kalibrierung hat man hier immer mehr oder weniger starke Abweichungen. Wem es nicht auf jeden mm ankommt, braucht nichts zu kalibrieren und kann einfach von 0.25mm oder besser 0.24mm ausgehen!&lt;br /&gt;
Optimal ist es, wenn man sich für Weg- und Winkelmessungen nicht auf die Encoder Daten stützen muss, sondern externe Systeme wie Infrarotbaken oder einen genauen elektronischen Kompass dazu zur Verfügung hat.&lt;br /&gt;
&lt;br /&gt;
Will man die Drehgeber des RP6 dennoch kalibrieren, kann man ihn z.B. mit diesem Testprogramm:&lt;br /&gt;
&amp;lt;pre&amp;gt;#include &amp;quot;RP6RobotBaseLib.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
	initRobotBase();&lt;br /&gt;
	powerON();&lt;br /&gt;
&lt;br /&gt;
	// Test: Go ahead 1m and stop!&lt;br /&gt;
	move (80, FWD, DIST_MM(1000), true);&lt;br /&gt;
	writeString_P(&amp;quot;LEFT RIGHT&amp;quot;);&lt;br /&gt;
 	writeString_P(&amp;quot;\n&amp;quot;);&lt;br /&gt;
 	writeInteger(mleft_dist, DEC);&lt;br /&gt;
	writeChar(' ');&lt;br /&gt;
 	writeInteger(mright_dist, DEC);&lt;br /&gt;
	writeString_P(&amp;quot;\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
	powerOFF();&lt;br /&gt;
&lt;br /&gt;
	return 0;&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
... 1m weit fahren lassen und dann messen, wie weit er tatsächlich gefahren ist. Das Programm gibt auf dem Terminal den Stand der Drehgeber aus. Teilt man dann die gemessene Fahrstrecke in mm durch den Wert der Drehgeber, erhält man die Auflösung. Diesen Wert kann man dann der Konstanten ENCODER_RESOLUTION in der RP6Config.h zuweisen. Nach &amp;quot;Make Clean&amp;quot;, einer Neukompilierung und erneuter Ausführung des Testprogramms müßte der RP6 jetzt genau 1m weit fahren. Das gilt zumindest für den Untergrund, auf dem die Kalibrierung durchgeführt wurde.&lt;br /&gt;
&lt;br /&gt;
====Stoßstangensensoren (Bumper)====&lt;br /&gt;
&lt;br /&gt;
Vorn am Roboter sind zwei Mikroschalter mit langem Schalthebel auf einer separaten&lt;br /&gt;
Platine untergebracht, die etwas vor der anderen Sensorplatine liegt. Dadurch werden&lt;br /&gt;
die IR LEDs auf der Sensorplatine geschützt und können nicht so leicht verbiegen&lt;br /&gt;
wenn der Roboter mal gegen ein Hindernis fährt. Mit den zwei Schaltern kann der Mikrocontroller&lt;br /&gt;
einen solchen Aufprall registrieren und dann beispielsweise zurücksetzen,&lt;br /&gt;
sich etwas drehen und weiterfahren. Die Schalter sind an zwei der Ports die schon mit&lt;br /&gt;
den LEDs verbunden sind angeschlossen und blockieren so keine anderen Ports des&lt;br /&gt;
Mikrocontrollers. Daher leuchten die LEDs auch immer wenn man einen der Schalter&lt;br /&gt;
drückt! Da dies normalerweise relativ selten passiert, stört das aber nicht weiter.&lt;br /&gt;
Die Stoßstange kann man auch abmontieren und z.B. gegen eine Schuss- oder Sammelvorrichtung&lt;br /&gt;
für Bälle o.ä. ersetzen wenn man möchte.&lt;br /&gt;
&lt;br /&gt;
====Lichtsensoren (LDRs)====&lt;br /&gt;
[[Bild:RP6_Licht.jpg|thumb]]&lt;br /&gt;
Vorne auf der kleinen Sensorplatine des Roboters sind zwei sog.&lt;br /&gt;
LDRs (=&amp;quot;Light Dependant Resistors&amp;quot; also lichtabhängige Widerstände)&lt;br /&gt;
platziert und nach links bzw. rechts ausgerichtet. Zwischen&lt;br /&gt;
den beiden Sensoren ist noch eine kleine schwarze&lt;br /&gt;
„Trennwand“ damit das Licht aus einer Richtung möglichst nur&lt;br /&gt;
einen der Sensoren erreicht. Sie bilden zusammen mit je einem&lt;br /&gt;
normalen Widerstand wie beim Batteriesensor einen Spannungsteiler – hier allerdings&lt;br /&gt;
um das Umgebungslicht zu messen. Die 5V Betriebsspannung wird auch geteilt, aber&lt;br /&gt;
hier ist einer der Widerstände variabel! Es wird also das Teilungsverhältnis je nach Intensität&lt;br /&gt;
des Lichteinfalls verändert und somit eine vom Lichteinfall abhängige Spannung&lt;br /&gt;
an einen der A/D Wandler Kanäle geleitet!&lt;br /&gt;
Über den Spannungsunterschied zwischen den beiden Sensoren kann man ermitteln in&lt;br /&gt;
welcher Richtung sich eine bzw. die hellste Lichtquelle vor dem Roboter befindet:&lt;br /&gt;
Links, Rechts oder in der Mitte. Mit einem entsprechenden Programm, kann man so z.B. eine starke Taschenlampe in&lt;br /&gt;
einem abgedunkelten Zimmer verfolgen, oder den Roboter die hellste Stelle in einem&lt;br /&gt;
Raum suchen lassen! Klappt z.B. sehr gut mit einem stärkeren Hand-Halogenscheinwerfer:&lt;br /&gt;
Wenn man damit auf den Boden leuchtet, kann der Roboter dem Lichtfleck auf&lt;br /&gt;
dem Boden folgen.&lt;br /&gt;
Das geht natürlich auch umgekehrt: Der Roboter könnte z.B. auch versuchen sich vor&lt;br /&gt;
hellem Licht zu verstecken...&lt;br /&gt;
Wenn man noch ein oder zwei LDRs hinten am Roboter anbringen würde, könnte man&lt;br /&gt;
das noch verfeinern und die Richtung in der sich Lichtquellen befinden besser bestimmen.&lt;br /&gt;
Der Roboter kann sonst nämlich oft nur schwer unterscheiden ob die Lichtquelle&lt;br /&gt;
vor oder hinter ihm liegt. Zwei der A/D Wandler Kanäle sind noch frei...&lt;br /&gt;
&lt;br /&gt;
====Anti Collision System (ACS)====&lt;br /&gt;
[[Bild:RP6 ACS.jpg|thumb|Das ACS]]&lt;br /&gt;
Der aus Softwaresicht komplexeste Sensor des RP6 ist das ACS - das „Anti Collision System“ (engl. für Anti Kollisions System)! Es besteht aus einem IR Empfänger (s. Abb.) und zwei vorne auf der Sensorplatine links und rechts angebrachten IR LEDs. Die IR LEDs werden direkt vom Mikrocontroller angesteuert. Die Ansteuerungsroutinen können beliebig verändert und verbessert werden! Beim Vorgängermodell war dafür noch ein eigener Controller nötig, dessen Programm aber nicht vom Anwender geändert werden konnte...&lt;br /&gt;
Mit den IR LEDs werden kurze, mit 36kHz modulierte Infrarot Impulse ausgesandt, auf die der darauf ausgelegte IR Empfänger reagiert. Werden die IR Impulse an einem Gegenstand vor dem Roboter reflektiert und vom IR Empfänger detektiert, kann der Mikrocontroller darauf reagieren und z.B. ein Ausweichmanöver einleiten. Damit das ACS nicht zu empfindlich bzw. auf eventuelle Störungen reagiert, wartet die Software bis eine bestimmte Anzahl von Impulsen in einer bestimmten Zeit empfangen worden ist. Es wird auch eine Synchronisation mit dem RC5 Empfang durchgeführt und auf die RC5 Signale von TV/Hifi Fernbedienungen wird so nicht reagiert. Bei anderen Codes kann das aber nicht garantiert werden und das ACS könnte dann Hindernisse erkennen, wo gar keine sind! Da es je eine IR LED links und rechts gibt, kann das ACS grob unterscheiden ob sich das Objekt links, rechts oder mittig vor dem Roboter befindet.&lt;br /&gt;
Man kann zusätzlich noch die Stromstärke mit der die beiden IR LEDs gepulst werden in drei Stufen einstellen. Das ACS funktioniert aber auch in der höchsten Stufe nicht mit allen Objekten immer zuverlässig, denn es kommt auf die Beschaffenheit der Oberfläche des jeweiligen Objekts an! Ein schwarzes Objekt reflektiert das IR Licht natürlich viel schlechter als ein weisses Objekt und ein kantiges und spiegelndes Objekt könnte das IR Licht hauptsächlich in eine bestimme Richtung reflektieren. Die Reichweite ist also immer vom jeweiligen Objekt abhängig! Das ist eine prinzipielle Schwäche von so gut wie allen IR Sensoren (jedenfalls in dieser Preisklasse).&lt;br /&gt;
Trotzdem werden die meisten Hindernisse zuverlässig erkannt und können umfahren werden. Falls das mal nicht klappt, gibt es noch die Stoßstange mit den Tastsensoren und falls auch die nicht richtig getroffen werden, kann der Roboter noch mit den Motorstromsensoren oder den Encodern erkennen, ob die Motoren blockieren (s.u.)!&lt;br /&gt;
Wem das nicht reicht, der könnte zusätzlich z.B. noch Ultraschallsensoren anbringen...&lt;br /&gt;
&lt;br /&gt;
====IR-Kommunikation (IRCOMM)====&lt;br /&gt;
Der RP6 kann über die IR-LEDs links und rechts über der Bumper-Platine Daten zu anderen IR-Empfängern senden.  Es ist z.B. möglich, dass mehrere Roboter ihre Sensorwerte untereinander vergleichen.&lt;br /&gt;
&lt;br /&gt;
====6 Status-LEDs====&lt;br /&gt;
Die Status-LEDs sind vorne links und rechts über den Lichtsensoren auf der Hauptplatine angebracht.&lt;br /&gt;
&lt;br /&gt;
Über die Status-LEDs können Sensorzustände, z.B. des ACS, der Bumper oder der Lichtsensoren, dargestellt werden.&lt;br /&gt;
&lt;br /&gt;
====IR-Sender====&lt;br /&gt;
Über den IR-Sender können Daten zu anderen Geräten übertragen werden.&lt;br /&gt;
&lt;br /&gt;
===Erweiterungssystem (EXPANSION SYSTEM)===&lt;br /&gt;
[[Bild:RP6_EXP.jpg|thumb]]&lt;br /&gt;
Eines der nützlichsten Features des RP6 ist das Erweiterungssystem.&lt;br /&gt;
Man kann den RP6 damit genau so weit ausbauen,&lt;br /&gt;
wie man es benötigt. Aus Kostengründen bietet das&lt;br /&gt;
Basissystem schließlich nur relativ wenig Sensoren. Es sind&lt;br /&gt;
zwar schon mehr als bei vielen anderen Robotern in dieser&lt;br /&gt;
Preisklasse, aber erst mit weiteren Sensoren macht ein Roboter&lt;br /&gt;
so richtig Spaß. Das ACS kann beispielsweise nur grob&lt;br /&gt;
erkennen ob sich ein Hindernis vor dem Roboter befindet.&lt;br /&gt;
Mit Ultraschallsensoren oder besseren zusätzlichen IR Sensoren,&lt;br /&gt;
könnte man aber die Distanz ermitteln und so beispielsweise&lt;br /&gt;
bessere Ausweichmanöver fahren!&lt;br /&gt;
&lt;br /&gt;
Neben Sensoren macht es auch sehr viel Sinn, zusätzliche Controller einzubauen um&lt;br /&gt;
die anfallenden Aufgaben aufteilen zu können. Beispielsweise die RP6 CONTROL M32&lt;br /&gt;
Platine mit einem weiteren MEGA32 Mikrocontroller oder die CCPRO M128.&lt;br /&gt;
&lt;br /&gt;
Das Erweiterungssystem muss natürlich in der Lage sein, viele Erweiterungsmodule&lt;br /&gt;
miteinander zu verbinden, dabei mit wenigen Signalleitungen&lt;br /&gt;
auskommen und eine ausreichend hohe Geschwindigkeit bieten.&lt;br /&gt;
&lt;br /&gt;
Siehe [[I2C]]&lt;br /&gt;
&lt;br /&gt;
===Steuerung (CONTROL SYSTEM)===&lt;br /&gt;
&lt;br /&gt;
====Hauptprozessor (ATMEGA32)====&lt;br /&gt;
[[Bild:RP6_MEGA32.jpg|thumb|Der MEGA32]]&lt;br /&gt;
Der Hauptprozessor ist der ATMEGA32 vom Atmel. Er hat 32KB Flash ROM und 2KB RAM. Der ATMEGA ist mit 8Mhz getaktet, kann also bis zu 8 Millionen Befehle pro Sekunde ausführen. Es sind 32 I/O-Pins  am Controller verfügbar. Die I/O-Pins gehören zu I/O-Ports mit jeweils 8 Pins. Davon gibt es 4: PORTA, PORTB, PORTC und PORTD. Der Controller kann die Ports entweder ein oder ausschalten (Output), oder erkennen, ob Spannung angelegt wurde oder nicht (Input). Es gibt mehrere Module, die verschiedene Aufgaben übernehmen:&lt;br /&gt;
* 3 Timer, einer davon erzeugt die PWM-Signale für die Motoren&lt;br /&gt;
* Die serielle Schnittstelle (UART)&lt;br /&gt;
* Das TWI (Two Wire Interface, also Zweidraht Schnittstelle)&lt;br /&gt;
* Ein ADC (Analog to Digital Converter) mit 8 Eingangskanälen, welche mit 10bit (0-1023) auflösen&lt;br /&gt;
* Drei externe Interrupt Eingänge&lt;br /&gt;
&lt;br /&gt;
Auserdem befindet sich im Microcontroller ein sog. Bootloader, welcher mit dem RP6 Loader kommuniziert und neue Programme in den Speicher lädt.&lt;br /&gt;
&lt;br /&gt;
===Antrieb (DRIVE SYSTEM)===&lt;br /&gt;
[[Bild:RP6_H-Brücke.jpg|thumb|Die H-Brücke]]&lt;br /&gt;
[[Bild:RP6_Tastverhältniss.jpg|thumb]]&lt;br /&gt;
Der Antrieb des RP6 besteht aus zwei Gleichstrom Motoren mit nachgeschaltetem Getriebe,&lt;br /&gt;
über das die beiden Raupenketten angetrieben werden.&lt;br /&gt;
Die Motoren genehmigen sich je nach Belastung&lt;br /&gt;
einen recht hohen Strom und können&lt;br /&gt;
natürlich nicht direkt vom Mikrocontroller&lt;br /&gt;
angesteuert werden. Dazu braucht man&lt;br /&gt;
Leistungstreiber in Form von je einer H-Brücke&lt;br /&gt;
pro Motor. Das grundlegende Prinzip&lt;br /&gt;
ist in der nebenstehenden Abbildung dargestellt.&lt;br /&gt;
Eine H-Brücke besteht aus vier&lt;br /&gt;
&amp;quot;Schaltern&amp;quot;, die in Form eines H's um einen&lt;br /&gt;
Motor angeordnet sind. Nehmen wir mal an,&lt;br /&gt;
zunächst seien alle Schalter aus. Schaltet&lt;br /&gt;
man dann S1 und S4 (Rot) an, liegt eine&lt;br /&gt;
Spannung am Motor an und er dreht sich&lt;br /&gt;
z.B. nach rechts. Schalten wir nun S1 und&lt;br /&gt;
S4 wieder aus und danach S2 und S3 (Grün)&lt;br /&gt;
an, wird die am Motor anliegende Spannung umgepolt und er dreht sich in die entgegen gesetzte&lt;br /&gt;
Richtung, also nach links! Man muss darauf achten, nicht gleichzeitig S1&lt;br /&gt;
und S2, oder S3 und S4 einzuschalten, sonst entstünde ein Kurzschluss und dadurch&lt;br /&gt;
könnten die &amp;quot;Schalter&amp;quot; zerstört werden!&lt;br /&gt;
Natürlich verwenden wir auf dem RP6 keine mechanischen Schalter, sondern sog.&lt;br /&gt;
MOSFETs. Diese schalten beim Anlegen einer genügend hohen Spannung am Eingang&lt;br /&gt;
durch. Die Schaltvorgänge können sehr schnell erfolgen, mehrere Kilohertz sind bei&lt;br /&gt;
unserer Anwendung möglich.&lt;br /&gt;
So kann man also schon mal die Drehrichtung einstellen. Und wie bekommt man den&lt;br /&gt;
Motor nun schneller bzw. langsamer? Ein Elektromotor dreht umso schneller, je höher&lt;br /&gt;
die angelegte Spannung ist. Die Drehzahl kann also über die Spannung eingestellt&lt;br /&gt;
werden - und genau dazu können wir die H-Brücke auch verwenden!&lt;br /&gt;
Die Abbildung verdeutlicht das Prinzip&lt;br /&gt;
nach dem wir vorgehen können.&lt;br /&gt;
Wir erzeugen&lt;br /&gt;
ein Rechtecksignal fester Frequenz,&lt;br /&gt;
bei dem wir das sog. Tastverhältnis&lt;br /&gt;
verändern. Mit &amp;quot;Tastverhältnis&amp;quot; ist das&lt;br /&gt;
Verhältnis von der eingeschalteten zur&lt;br /&gt;
ausgeschalteten Zeit des Signals gemeint.&lt;br /&gt;
Am Motor liegt dann effektiv eine niedrigere,&lt;br /&gt;
mittlere Gleichspannung an, die dem&lt;br /&gt;
Tastverhältnis entspricht. In der Grafik ist&lt;br /&gt;
dies durch eine rote Linie (Ug) und die roten&lt;br /&gt;
Flächen verdeutlicht. Wenn z.B. eine&lt;br /&gt;
Spannung von 7 Volt von den Akkus an&lt;br /&gt;
den Motortreibern anliegt, und diese mit&lt;br /&gt;
einem Tastverhältnis von 50% angesteuert werden, würde die mittlere Spannung in&lt;br /&gt;
etwa bei der Hälfte, also 3.5V liegen! Das stimmt real nicht ganz, aber so kann man&lt;br /&gt;
es sich schon gut und einfach vorstellen.&lt;br /&gt;
Das Antriebssystem ist dank der hohen Untersetzung (~ 1:72) relativ stark und so&lt;br /&gt;
kann der RP6 viel schwerere Lasten tragen als es z.B. der kleine Roboter ASURO&lt;br /&gt;
könnte. Allerdings steigt mit zunehmendem Gewicht natürlich auch der Energiebedarf&lt;br /&gt;
und die Akkus werden schneller leer sein ...&lt;br /&gt;
Im Vergleich mit einem ferngesteuerten Rennwagen o.ä. könnte man denken der RP6&lt;br /&gt;
sei langsam - stimmt auch - das ist jedoch absichtlich so! Der Roboter wird von einem&lt;br /&gt;
Mikrocontroller gesteuert und wenn der Programmierer einen Fehler bei der Programmierung&lt;br /&gt;
gemacht hat, wäre es ungünstig mit 10km/h vor die Wand zu prallen! Bei&lt;br /&gt;
dem eher gemächlichen Tempo des RP6 passiert aber nicht so schnell etwas und nebenbei&lt;br /&gt;
haben die Sensoren mehr Zeit die Umgebung auf Hindernisse zu untersuchen.&lt;br /&gt;
Und da wäre natürlich noch der Vorteil der höheren Belastbarkeit und der viel genaueren&lt;br /&gt;
Geschwindigkeitsregelung!&lt;br /&gt;
&lt;br /&gt;
===Stromversorgung (POWER SUPPLY)===&lt;br /&gt;
[[Bild:RP6_IC1.jpg|thumb]]&lt;br /&gt;
Natürlich benötigt ein Roboter Energie. Diese trägt der RP6 gespeichert in 6 Akkus mit&lt;br /&gt;
sich herum. Die Laufzeit ist durch die Kapazität der Akkus eingeschränkt, denn auch&lt;br /&gt;
wenn die Elektronik verhältnismäßig wenig Energie benötigt, schlucken die Motoren je&lt;br /&gt;
nach Belastung doch ziemlich viel.&lt;br /&gt;
&lt;br /&gt;
Damit die Akkus möglichst lange halten und der Roboter nicht ständig Pause machen&lt;br /&gt;
muss, sollte man ihm daher etwas größere Energiespeicher mit etwa 2500mAh gönnen.&lt;br /&gt;
Kleinere mit 2000mAh oder mehr funktionieren aber auch. Mit guten Akkus kann&lt;br /&gt;
man 3 bis 6 Stunden oder mehr Laufzeit erreichen, abhängig von der Betriebszeit der&lt;br /&gt;
Motoren, deren Belastung und Qualität der Akkus. Die 6 Akkus die notwendig sind,&lt;br /&gt;
haben insgesamt eine Nennspannung von 6x 1.2V = 7.2V. Im Blockdiagramm ist dies&lt;br /&gt;
mit &amp;quot;UB&amp;quot; (= &amp;quot;U-Battery&amp;quot;, U ist der Formelbuchstabe für Spannung) bezeichnet. „Nennspannung&amp;quot;,&lt;br /&gt;
weil sich die Spannung mit der Zeit stark verändert. Voll aufgeladen können&lt;br /&gt;
die Akkus im Leerlauf insgesamt bis zu 8.5V liefern! Diese Spannung sinkt während&lt;br /&gt;
der Entladung ab und schwankt auch je nach Belastung (Motoren an oder aus,&lt;br /&gt;
schnell langsam etc. - wie stark die Spannung schwankt, hängt auch von der Qualität&lt;br /&gt;
der verwendeten Akkus ab. Der Innenwiderstand ist hier die kritische Größe).&lt;br /&gt;
Das ist für Messungen von Sensorwerten und ähnlichem natürlich nicht ohne weiteres&lt;br /&gt;
brauchbar. Noch wichtiger ist jedoch, dass viele der verwendeten Komponenten wie&lt;br /&gt;
z.B. der Mikrocontroller nur auf 5V oder weniger Betriebsspannung ausgelegt sind und&lt;br /&gt;
bei so hohen Spannungen zerstört würden. Die Akku Spannung muss also auf einen&lt;br /&gt;
definierten Wert heruntergeregelt und stabilisiert werden!&lt;br /&gt;
Das übernimmt ein 5V Spannungsregler, der einen Strom von&lt;br /&gt;
maximal 1.5A liefern kann (s. Abb.). Bei 1.5A würde er jedoch&lt;br /&gt;
ziemlich viel Wärme abgeben. Es gibt daher eine große Kühlfläche&lt;br /&gt;
auf der Platine an die der Regler festgeschraubt ist. Über 1A&lt;br /&gt;
sollte der Regler trotz Kühlung besser nur kurzzeitig (also wenige&lt;br /&gt;
Sekunden) belastet werden, wenn man nicht noch einen zusätzlichen&lt;br /&gt;
großen Kühlköper draufschraubt.&lt;br /&gt;
&lt;br /&gt;
Es wird empfohlen, 800mA Dauerlast nicht zu überschreiten! Bei&lt;br /&gt;
so einer Belastung und zusammen mit den Motoren wären die&lt;br /&gt;
Akkus auch recht schnell leer. Im normalen Betrieb ohne ein Erweiterungsboard&lt;br /&gt;
nimmt der Roboter übrigens nicht mehr als 40mA auf (ausser wenn&lt;br /&gt;
das IRCOMM sendet), also überhaupt kein Problem für den Regler und man hat noch&lt;br /&gt;
genug Reserven für die Erweiterungsmodule, die meistens auch nicht mehr als 50mA&lt;br /&gt;
aufnehmen sofern keine Motoren, große LEDs o.ä. daran angeschlossen sind.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Umbau-Optionen==&lt;br /&gt;
Hier soll beschrieben werden, welche Umbau-Optionen es für die RP6 Base gibt. Im Text gibt es Verweise auf den Schaltplan des RP6 (RP6_MAINBOARD.PDF) in der Form: (SP2 B1: Bauteil). Dies bedeutet, dass man das Bauteil auf Blatt 2 des RP6-Schaltplans im Feld B1 finden kann. Beispielhaft sind im folgenden Text Bestell-Nummern der Firma [http://www.conrad.de/ce/ CONRAD] genannt. Natürlich kann man die Teile auch bei anderen Versendern beziehen.&lt;br /&gt;
&lt;br /&gt;
Bei den Materialangaben ist öfter die Rede von &amp;quot;Steckbuchsen mit Litze&amp;quot;. Diese Steckbuchsen mit angelöteter Litze können auf die ein- oder zweireihigen Stiftleisten aufgesteckt werden. Leider gibt es sie nicht (mehr) fertig konfektioniert bei CONRAD. Die einreihigen Steckbuchsen (RM 2,54mm) kann man aber z.B. bei [http://www.elv.de/output/controller.aspx ELV] bekommen: 2-polig (68-016635), 3-polig (68-022503) und 5-polig (68-023073). An sie muss man dann noch Litzen in der entsprechenden Länge selbst anlöten.&lt;br /&gt;
&lt;br /&gt;
===Elko für den IR-Empfänger===&lt;br /&gt;
[[Bild:RP6_C29_TSOP.JPG|thumb|RP6 C29 TSOP]]&lt;br /&gt;
Zur Spannungsstabilisierung kann ein Elko (C29; SP2 E1: C29*) am TSOP 34836 eingelötet werden.&lt;br /&gt;
&lt;br /&gt;
Normalerweise ist dieser Elko nicht erforderlich.&lt;br /&gt;
&lt;br /&gt;
Man braucht dazu:&lt;br /&gt;
* Einen Elektrolyt-Kondensator stehend 10 uF / 16V (C29); RM 2,5mm (445631)&lt;br /&gt;
&lt;br /&gt;
Der Elko kann auch eine geringere Kapazität als 10 uF haben (1 uF bis 4,7 uF reichen auch). Man lötet den Elko auf seinen Platz. Bitte auf die Polung achten: Der Minuspol zeigt nach vorn (in Fahrtrichtung des RP6).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Anschlüsse===&lt;br /&gt;
Hier wird aufgelistet, wo man auf dem RP6 Mainboard Anschlüsse nutzen kann, um sie z.B. zu weiteren Sensoren, zum USRBUS oder (weniger empfehlenswert!) direkt zu EPs oder Erweiterungsplatinen (M32, CCPRO M128) zu führen.&lt;br /&gt;
&lt;br /&gt;
====Analoge Sensoren an ADC0/1====&lt;br /&gt;
[[Bild:RP6_ADC01.JPG|thumb|RP6 ADC0/1]]&lt;br /&gt;
&lt;br /&gt;
Wenn man bis zu zwei analoge Sensoren (z.B. IR-Distanz-Mess-Sensoren Sharp GP2Y0A02YK 185364) direkt an den RP6 anschließen möchte, dann gibt es da zwei 3-polige Kontakte, beschriftet mit VDD/GND/ADCx (x = 0..1). Hier kann man 3-polige Stiftleisten auflöten, an die dann die Sensoren angeschlossen werden.&lt;br /&gt;
&lt;br /&gt;
Man braucht dazu:&lt;br /&gt;
* 1-reihige Stiftleiste RM 2,54mm (z.B. 36-polig 732478)&lt;br /&gt;
* Zwei Keramik-Vielschicht-Kondensatoren 100nF (C27, C28); RM 2,54mm (453099)&lt;br /&gt;
* ENTWEDER einen Elektrolyt-Kondensator stehend 220 uF / 16V (C26); RM 3,5mm (445903)&lt;br /&gt;
* ODER einen Elektrolyt-Kondensator stehend 470 uF / 16V (C26); RM 3,5mm (446211)&lt;br /&gt;
* Zwei 3-polige Steckbuchsen mit Litze zum Anschluß der Sensoren&lt;br /&gt;
&lt;br /&gt;
Man trennt nun von der 1-reihigen Stiftleiste zweimal 3 Kontakte ab und lötet sie auf die weiß umrahmten Kontakte (VDD/GND/ADCx; SP2 B1: ADC0, ADC1), anschließend C27, C28 (SP2 A1: C27*, C28*) auf ihre Plätze und zum Schluß den Elko 220 uF oder 470 uF (C26; SP2 A1: C26*). Der Elko ist nur bei Sensoren mit hohem Strombedarf notwendig, siehe dazu auch Anleitung des RP6, Seite 136! Beim Elko auf die Polung achten: Er muss so sitzen, dass er mit seinem Pluspol in Fahrtrichtung des RP6 (nach vorn) schaut.&lt;br /&gt;
&lt;br /&gt;
Die Sensoren lötet man an die Litzen der 3-poligen Steckbuchsen und steckt diese auf die neuen Kontakte.&lt;br /&gt;
&lt;br /&gt;
Da manche Sensoren einen höheren Stromverbrauch haben, kann man die Stromversorgung an den VDD-Pins der ADC0/1-Stecker abschaltbar machen oder eine separate +5V-Spannung einspeisen. Siehe dazu den Abschnitt &amp;quot;Trennstellen - Getrennte Stromversorgung für ADC0/1&amp;quot; weiter unten!&lt;br /&gt;
&lt;br /&gt;
====ISP (In System Programming)====&lt;br /&gt;
Der ATMEGA32 des RP6 wird standardmäßig über den PROG/UART Stecker programmiert. Dazu befindet sich im Prozessor ein Bootloader-Programm. Wenn man stattdessen oder zusätzlich die ISP-Programmierung mit einem dafür geeigneten ISP-Programmier-Adapter nutzen will, kann man den Adapter an einen (noch einzulötenden) Wannenstecker auf dem RP6 anschließen.&lt;br /&gt;
Vorher sind aber ein paar &amp;quot;Umbauarbeiten&amp;quot; erforderlich.&lt;br /&gt;
&lt;br /&gt;
Man braucht dazu:&lt;br /&gt;
* 1-reihige Stiftleiste RM 2,54mm (z.B. 36-polig 732478)&lt;br /&gt;
* Wannenstecker 2x5-polig gerade RM 2,54mm (z.B. [http://www.reichelt.de./ Reichelt] WSL 10G)&lt;br /&gt;
* Eine SMD-Diode LL 4148 (140902)&lt;br /&gt;
* Eine Codierbrücke (z.B. aus Set 742902)&lt;br /&gt;
&lt;br /&gt;
Zwischen dem XBUS-Stecker und C13 befinden sich 10 Lötpunkte für den ISP-Anschluß, auf die der Wannenstecker gelötet wird, und drei Lötpunkte (beschriftet mit ISP* - BOOTLOAD; SP2 A3: YR1..3), auf die eine 3-polige Stiftleiste gelötet werden muss.&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_ISP.JPG|RP6 ISP]]&lt;br /&gt;
&lt;br /&gt;
Vorher muss eine kurze Leiterbahn zwischen den Lötpunkten BOOTLOAD aufgetrennt werden. Die Leiterbahn befindet sich auf der Lötseite der Platine und muss mit einem scharfen Messer oder einem speziellen Leiterbahn-Unterbrecher zwischen den beiden Lötpunkten unterbrochen werden. Man sollte anschließend mit einem Widerstandsmeßgerät nachmessen: Es sollte keine Verbindung mehr zwischen den Lötpunkten bestehen.&lt;br /&gt;
Man trennt dann von der 1-reihigen Stiftleiste 3 Kontakte ab und lötet sie auf die beschriebenen drei Lötpunkte.&lt;br /&gt;
&lt;br /&gt;
Zum Schluss lötet man noch die Diode LL 4148 (SP2 B3: D11*) auf ihre Lötflächen zwischen R3 und C6. Die Kathode (Strich) der Diode kommt nach vorn (in Fahrtrichtung RP6, bzw. liegt rechts von R3). Wenn man jetzt eine Codierbrücke auf die mit &amp;quot;BOOTLOAD&amp;quot; beschrifteten Pins steckt, bleibt alles unverändert: Die Programmierung erfolgt weiter über den PROG/UART-Stecker mithilfe des Bootloaders im Prozessor.&lt;br /&gt;
Wird die Codierbrücke in Stellung &amp;quot;ISP*&amp;quot; umgesteckt, kann der Prozessor mit ISP programmiert werden.&lt;br /&gt;
&lt;br /&gt;
Vorsicht: Das Bootloader-Programm kann dabei zerstört werden! Es müssen zusätzlich Fusebits des ATMEGA32 verändert werden. Dabei kann der Prozessor im schlimmsten Fall nicht mehr ansprechbar sein. Man sollte diesen Umbau und die ISP-Programmierung nur machen, wenn man genau weiß, was man macht!&lt;br /&gt;
&lt;br /&gt;
Eine Kopie des Bootloaders und eine Kurzanleitung zum Einstellen der Fusebits gibt es hier:&lt;br /&gt;
[http://www.arexx.com/rp6/downloads/RP6BASE_BOOTLOADER.zip RP6_BOOTLOADER]&lt;br /&gt;
&lt;br /&gt;
====IO1..IO4====&lt;br /&gt;
[[Bild:RP6_IO1-4.JPG|thumb|RP6 IO1..IO4]]&lt;br /&gt;
Die Anschlüsse IO1 bis IO4 (SP2 E3: IO1..4) steuern bereits die Status-LEDs 1, 2, 4 und 5 an. Trotzdem kann man sie auch noch mit leichten Einschränkungen als I/O-Pins benutzen. Dazu lötet man zweimal 2 Pins einer 1-reihigen Stiftleiste RM 2,54mm (z.B. 36-polig 732478) auf die IO1/2 und IO3/4 Lötpunkte.&lt;br /&gt;
Hier eine Tabelle, die die Port-Pins zeigt, die IO1..IO4 zugeordnet sind:&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |IO&lt;br /&gt;
 |Status-LED&lt;br /&gt;
 |Port-Pin&lt;br /&gt;
 |-&lt;br /&gt;
 |1&lt;br /&gt;
 |SL1&lt;br /&gt;
 |PC4&lt;br /&gt;
 |-&lt;br /&gt;
 |2&lt;br /&gt;
 |SL2&lt;br /&gt;
 |PC5&lt;br /&gt;
 |-&lt;br /&gt;
 |3&lt;br /&gt;
 |SL4&lt;br /&gt;
 |PB7&lt;br /&gt;
 |-&lt;br /&gt;
 |4&lt;br /&gt;
 |SL5&lt;br /&gt;
 |PB1&lt;br /&gt;
 |-&lt;br /&gt;
|}&lt;br /&gt;
Wie können nun IO1..IO4 genutzt werden?&lt;br /&gt;
&lt;br /&gt;
Als ...&lt;br /&gt;
* Eingang, z.B. für zusätzliche Tastschalter/Bumper&lt;br /&gt;
* Ausgang, z.B. zur Ansteuerung von Treiberstufen, low-current LEDs, ...&lt;br /&gt;
&lt;br /&gt;
Wird ein Anschluß IOx als Eingang verwendet, muss ein Widerstand von 470 Ohm in Reihe mit dem Taster an VDD eingebaut werden, zusätzlich ein Pulldown-Widerstand 100 kOhm. Diese Beschaltung zeigen z.B. an SL6 die Widerstände R43 und R46 (SP2 E4: R43, R46).&lt;br /&gt;
&lt;br /&gt;
Als Ausgang geschaltet sollte an IOx kein hoher Strom entnommen werden: 10mA sind max. zu empfehlen!&lt;br /&gt;
&lt;br /&gt;
====USRBUS====&lt;br /&gt;
Die 14 Kontakte der beiden USRBUS-Stecker sind auf dem RP6 nirgendwo angeschlossen, sondern können über die Lötpunkte Y1..Y14 mit beliebigen Punkten auf dem Mainboard verbunden werden.&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_USRBUS.JPG|thumb|RP6 USRBUS]]&lt;br /&gt;
&lt;br /&gt;
Ich würde auf Y1..Y14 eine Stiftleiste löten, damit die USRBUS-Belegung geändert werden kann.&lt;br /&gt;
&lt;br /&gt;
Man braucht dazu:&lt;br /&gt;
* 2-reihige Stiftleiste RM 2,54mm (z.B. 2x36-polig 742007)&lt;br /&gt;
* Einige Steckbuchsen mit Litze&lt;br /&gt;
&lt;br /&gt;
Man trennt von der 2-reihigen Stiftleiste 2x7 Kontakte ab und lötet sie auf die Punkte Y1..Y14 (SP4 E34: Y1..14, Y1'..Y14') neben den beiden Wannensteckern USRBUS1 (vorn) und USRBUS2 (hinten). Wird der RP6 über Flachkabel mit einem USRBUS-Stecker auf einer RP6 Experimentierplatine (EP) und/oder mit einer Erweiterungsplatine (M32, CCPRO M128) verbunden, dann hat man mit allen mit dem USRBUS verbundenen Platinen eine direkte 14-polige Verbindung,- eben den &amp;quot;User Bus&amp;quot;. Den kann man dann nutzen, wie man will. Auf dem RP6 kann man mit Steckbuchsen die Pins Y1..Y14 mit anderen Pins verbinden.&lt;br /&gt;
&lt;br /&gt;
Beispiel: Verbindet man den Pin &amp;quot;ADC0&amp;quot; mit Y1 des USRBUS1, dann steht der Eingang ADC0 auf allen an den USRBUS1 angeschlossenen Platinen auf dem vorderen Platinenstapel an Y1 zur Verfügung. Man braucht also diesen Eingang nicht über ein eigenes Kabel auf eine EP zu führen, sondern kann dazu den USRBUS nehmen. Dadurch bleibt der Gesamtaufbau auf dem RP6 übersichtlich und komplett trennbar (man braucht nur die Stecker XBUS und USRBUS abzuziehen!).&lt;br /&gt;
&lt;br /&gt;
Wichtig:&lt;br /&gt;
* Man sollte gut dokumentieren, wie man den USRBUS am RP6 (vorn und hinten getrennt!), auf EPs und der M32/M128 benutzt! Sonst kann es bei einer anderen Anordnung von EPs zu USRBUS Konflikten/Kurzschlüssen kommen.&lt;br /&gt;
* Der USRBUS1- und der USRBUS2-Stecker sind auf dem RP6 NICHT miteinander verbunden.&lt;br /&gt;
&lt;br /&gt;
Einen Vorschlag für die Belegung des USRBUS1 (vorn) gibt es z.B. &lt;br /&gt;
[http://www.roboternetz.de/phpBB2/viewtopic.php?t=32549 hier] oder &lt;br /&gt;
[http://www.roboternetz.de/community/showthread.php/47102-Sensor-anschließen?p=453061&amp;amp;viewfull=1#post453061 da.]&lt;br /&gt;
&lt;br /&gt;
====Start/Stop Button====&lt;br /&gt;
[[Bild:RP6_ST.JPG|thumb|RP6 ST]]&lt;br /&gt;
Am mittleren Lochrasterfeld links finden sich zwei Lötpunkte ST1, ST2 (SP2 D2: ST1, ST2), an die weitere Start/Stop Taster (NO, normal offen) parallel zum Taster auf dem RP6 Mainboard angeschlossen werden können.&lt;br /&gt;
&lt;br /&gt;
Zum Anschluß kann man auch Stiftleisten auflöten. ST1, ST2 könnte man auch mit dem USRBUS1 verbinden, wenn man den RP6 z.B. von einer EP aus zurücksetzen möchte.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Serielle Schnittstelle====&lt;br /&gt;
[[Bild:RP6_RST.JPG|thumb|RP6 RST]]&lt;br /&gt;
Neben dem USRBUS1 Stecker befinden sich 5 Lötpunkte mit den Signalen RST, TX, RX, GND, VDD (SP4 AB5: YRX, YTX, YMRESET, YVDD). Hier kann z.B. eine 5-polige Stiftleiste aufgelötet werden, um einen Anschluß an die serielle Schnittstelle zu ermöglichen.&lt;br /&gt;
&lt;br /&gt;
Von diesen 5 Lötpunkten könnte z.B. auch [http://www.roboternetz.de/phpBB2/viewtopic.php?t=32549 so] eine Verbindung zum benachbarten USRBUS1 hergestellt werden, um die serielle Schnittstelle des RP6 auf EPs zu führen.&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;
&lt;br /&gt;
====I2C-Schnittstelle====&lt;br /&gt;
[[Bild:RP6_I2C.JPG|thumb|RP6 I2C]]&lt;br /&gt;
Neben dem XBUS2 Stecker finden sich 5 Lötpunkte mit den Signalen der I2C-Schnittstelle (SP4 D12: Stecker I2C). Dies sind: VDD (Pin 1), GND, SDA, SCL, INT1 (Pin 5). Hier kann z.B. eine 5-polige Stiftleiste aufgelötet werden, um einen Anschluß an die I2C-Schnittstelle zu ermöglichen.&lt;br /&gt;
&lt;br /&gt;
Von diesen 5 Lötpunkten könnte z.B. auch eine Verbindung zum USRBUS1 oder USRBUS2 hergestellt werden, um die I2C-Schnittstelle des RP6 auf EPs zu führen, allerdings hat man SCL, SDA, INT1 ja auch schon am XBUS zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Interrupt-Leitungen====&lt;br /&gt;
[[Bild:RP6_INTx.JPG|thumb|RP6 INTx]]&lt;br /&gt;
Die Interrupt-Leitungen INTU, INT1..3, MRESET (SP4 D34: MRESET, INT1..3, INTU) sind an 5 Lötpunkten neben dem XBUS1 Stecker zu kontaktieren. Hier kann natürlich auch eine 5-polige Stiftleiste aufgelötet werden. In der Regel wird man diese Anschlüsse nicht brauchen, weil sie schon auf dem XBUS zur Verfügung stehen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====VDD/GND/+UB Anschluß====&lt;br /&gt;
[[Bild:RP6_VDDGNDUB.JPG|thumb|RP6 VDD GND +UB]]&lt;br /&gt;
In der Nähe von C4 im hinteren Bereich des Mainboards finden sich Lötpunkte (SP4 E12: YVDDx, YGNDx; SP4 D2 YUBx), an denen man VDD, GND und +UB finden kann.&lt;br /&gt;
&lt;br /&gt;
Wenn man höhere Ströme an VDD (z.B. für Servos) oder +UB (z.B. für einen anderen IRCOMM-Sender oder einen DC-Motor) entnehmen möchte, empfehlen sich diese Lötpunkte, auf die man auch Stiftleisten löten kann.&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;
====EXT Anschluß====&lt;br /&gt;
[[Bild:RP6_EXT.jpg|thumb|RP6 EXT Anschluß]]&lt;br /&gt;
Am hinteren Rand der RP6 Hauptplatine gibt es eine Reihe von 8 Lötpunkten. Dies ist der EXT Anschluß (SP1 C23: Stecker EXT):&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |Pin&lt;br /&gt;
 |Name&lt;br /&gt;
 |Beschreibung&lt;br /&gt;
 |-&lt;br /&gt;
 |1&lt;br /&gt;
 |GND&lt;br /&gt;
 |RP6 und Akku Minuspol (GND)&lt;br /&gt;
 |-&lt;br /&gt;
 |2&lt;br /&gt;
 |CHRG&lt;br /&gt;
 |Anschluß (+) für ext. Ladegerät, identisch mit Pluspol der Ladebuchse (CHARGER, Pin 1). Ladung nur möglich, wenn S1 AUS ist!&lt;br /&gt;
 |-&lt;br /&gt;
 |3&lt;br /&gt;
 |CHRG&lt;br /&gt;
 |wie Pin 2!&lt;br /&gt;
 |-&lt;br /&gt;
 |4&lt;br /&gt;
 | +BAT&lt;br /&gt;
 |Akku Pluspol über Sicherung F1&lt;br /&gt;
 |-&lt;br /&gt;
 |5&lt;br /&gt;
 | +BAT&lt;br /&gt;
 |wie Pin 4!&lt;br /&gt;
 |-&lt;br /&gt;
 |6&lt;br /&gt;
 | +UB&lt;br /&gt;
 |RP6 +UB (+7,2V=, Bereich min. +5,5 bis max. +10V=)&lt;br /&gt;
 |-&lt;br /&gt;
 |7&lt;br /&gt;
 | +UB&lt;br /&gt;
 |wie Pin 6!&lt;br /&gt;
 |-&lt;br /&gt;
 |8&lt;br /&gt;
 |GND&lt;br /&gt;
 |wie Pin 1!&lt;br /&gt;
 |-&lt;br /&gt;
|}&lt;br /&gt;
Man kann hier eine JST XH Stiftleiste gerade, 8-polig, RM 2,5mm ([http://www.conrad.de/ce/de/product/740105/Stiftleiste-gerade-RM-25-mm-Serie-XH-Rastermass-25-mm-Pole-8-Nennstrom-3-A-B8B-XH-A-LFSN-JST-Inhalt-1-St 740105]) auflöten.&lt;br /&gt;
&lt;br /&gt;
Wozu kann man diesen Anschluß nutzen?&lt;br /&gt;
&lt;br /&gt;
Der wesentliche Sinn des EXT Anschlusses besteht darin, andere Arten der Stromversorgung und der Akkuladung zu ermöglichen. Normalerweise schaltet man den RP6 mit S1 an und aus. In Stellung AUS kann der Akku geladen werden, indem man ein Ladegerät an die CHARGER Buchse anschließt. Alternativ kann man das Ladegerät mit seinem Pluspol auch an CHRG (Pins 2, 3) anschließen. Siehe auch den Abschnitt &amp;quot;Trennstellen - EXT Anschluß: Andere Stromversorgung&amp;quot; weiter unten!&lt;br /&gt;
&lt;br /&gt;
An +BAT (Pins 4, 5) kann man direkt (ohne Unterbrechung durch S1) Strom aus dem Akku entnehmen. Die Grenze des Stroms bestimmt die Sicherung F1 (2,5A). Eine weitere Möglichkeit besteht darin, über diesen Anschluß den Akku auch mit einem geeigneten Ladegerät zu LADEN. Hierbei muss man aber darauf achten, dass S1 AUSgeschaltet ist, weil sonst der RP6 über +UB eine unzulässig hohe Spannung bekommen könnte. Wenn man den Akku mit 6 Mignonzellen im RP6 nicht nutzen will (der Akku-Halter bleibt leer!), sondern nur einen externen Akku, wäre der auch mit seinem Pluspol an +BAT über eine eigene Sicherung (2,5A träge) anzuschließen.&lt;br /&gt;
&lt;br /&gt;
+UB (+7,2V) ist die Versorgungsspannung des RP6 (kommt vom Akku-Pluspol über die Sicherung F1 und Schalter S1!). Mit +UB werden die H-Brücken (Motoransteuerung) direkt und die RP6 &amp;quot;Elektronik&amp;quot; über den 5V-Spannungswandler (IC1; SP1 D3: IC1) versorgt (= VDD). An +UB könnte man den RP6 direkt mit einer Spannung von +7,2V versorgen (Absicherung nicht vergessen!), dazu muss S1 AUSgeschaltet sein, damit es keine Konflikte mit dem eingebauten Akku gibt.&lt;br /&gt;
&lt;br /&gt;
Den EXT Anschluß kann man damit nutzen für:&lt;br /&gt;
* Externes Ladegerät&lt;br /&gt;
* Externen Akku&lt;br /&gt;
* Externe Stromversorgung ohne Akku&lt;br /&gt;
* Direkte Stromentnahme aus dem Akku&lt;br /&gt;
* Ergänzungsladung mit Solarzelle&lt;br /&gt;
* Autonome Akkuladung (Ladestation mit Kontakten, Induktionsladung ...)&lt;br /&gt;
* ...&lt;br /&gt;
&lt;br /&gt;
Man sollte gewisse Elektronik-Kenntnisse haben, wenn man die Spannungsversorgung des RP6 verändert. VOR irgendwelchen Veränderungen seht euch auch zuerst den Schaltplan des RP6 (SP1) genau an!&lt;br /&gt;
&lt;br /&gt;
===Mess-/Kontaktpunkte===&lt;br /&gt;
Hier geht es um Kontaktpunkte, an denen man z.B. den Logik-Pegel (High/Low) oder eine analoge Spannung messen kann. Natürlich kann man die Signale auch zur Weiterleitung auf eine EP kontaktieren, dies wird man aber normalerweise nicht brauchen.&lt;br /&gt;
&lt;br /&gt;
====UBAT====&lt;br /&gt;
[[Bild:RP6_UBAT.JPG|thumb|RP6 UBAT]]&lt;br /&gt;
In der Mitte des Mainboards befindet sich ein Kontaktpunkt UBAT (SP1 E1: YUBAT). Dies ist ADC7 des RP6 Microcontrollers.&lt;br /&gt;
&lt;br /&gt;
Man kann hier die analoge Spannung (gegen GND) messen, die vom +UB-Spannungssensor geliefert wird.&lt;br /&gt;
&lt;br /&gt;
Die Spannung ist:&lt;br /&gt;
 UBAT = +UB / 2&lt;br /&gt;
Da der Spannungsteiler (SP1 D12: R1, R2) des +UB-Spannungssensors nicht aus Präzisionswiderständen besteht, kann man für den eigenen RP6 einen Korrekturfaktor berechnen, wenn UBAT deutlich von +UB / 2 (+ UB z.B. gemessen am EXT Stecker, Pins 6 u. 7) abweicht. Damit kann man +UB sehr viel genauer bestimmen.&lt;br /&gt;
&lt;br /&gt;
====ACS====&lt;br /&gt;
[[Bild:RP6_ACS_TSOP.JPG|thumb|RP6 ACS TSOP]]&lt;br /&gt;
Hinter dem TSOP (IC3) befindet sich der Kontaktpunkt ACS (SP2 E1: ACS).&lt;br /&gt;
&lt;br /&gt;
Dies ist der Ausgang des TSOP bzw. Eingang PB2 des RP6 Microcontrollers. Man kann hier das Ausgangssignal des IR-Empfängers abnehmen, z.B. um es mit einem Oszilloskop sichtbar zu machen.&lt;br /&gt;
&lt;br /&gt;
Rechts neben dem TSOP kann man noch die 3 Kontaktpunkte ACS_R, ACS_P und ACS_L (SP2 E2: ACS_P, ACS_R, ACS_L) des ACS-IR-Senders finden.&lt;br /&gt;
&lt;br /&gt;
Folgende Tabelle zeigt die Verbindungen:&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |Kontakt&lt;br /&gt;
 |Microcontroller-Portpin&lt;br /&gt;
 |SP-Verbindung&lt;br /&gt;
 |ACS-IR-Sendediode&lt;br /&gt;
 |-&lt;br /&gt;
 |ACS_P&lt;br /&gt;
 |über R8: ACS_PWRH (PB3), über R9: ACS_PWR (PD6)&lt;br /&gt;
 |SP2: 3&lt;br /&gt;
 |Anoden D1, D2&lt;br /&gt;
 |-&lt;br /&gt;
 |ACS_R&lt;br /&gt;
 |ACS_R (PC7)&lt;br /&gt;
 |SP2: 2&lt;br /&gt;
 |Kathode D1&lt;br /&gt;
 |-&lt;br /&gt;
 |ACS_L&lt;br /&gt;
 |ACS_L/MISO (PB6)&lt;br /&gt;
 |SP1: 5&lt;br /&gt;
 |Kathode D2&lt;br /&gt;
 |-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====IRC====&lt;br /&gt;
[[Bild:RP6_IRC.JPG|thumb|RP6 IRC]] [[Bild:RP6_IRC3.JPG|thumb|RP6 IRC3]]&lt;br /&gt;
Im der Nähe von C13 befinden sich die Lötpunkte IRC, IRC+, IRC- und IRC3 (SP2 D2: YIRC; SP2 CD2: IRC+/-; SP2 C2: IRC3). Zusammen mit der Trennstelle IRC (siehe Abschnitt &amp;quot;Trennstellen - IRC&amp;quot; weiter unten!) kann man diese Kontaktstellen im Umfeld des IRCOMM-Sendedioden Treibers IRLML2502PBF (SP2 CD12: Q5) finden. Am Kontaktpunkt IRC findet sich der Eingang des Treibers bzw. Ausgang PD7 des RP6 Microcontrollers. IRC+, IRC- sind die Kontaktpunkte, an denen die IRCOMM-Sendedioden D3, D4 in Reihe auf der Sensorplatine angeschlossen sind (IRC+ = Anode). IRC3 ist verbunden mit dem Trennstellen-Lötpunkt IRC1 und liegt bei geschlossener Trennstelle IRC an +UB.&lt;br /&gt;
&lt;br /&gt;
Was läßt sich mit diesen Kontaktpunkten machen:&lt;br /&gt;
* Der IRCOMM-Sender ist der zweitgrößte Stromverbraucher des RP6 (nach dem Antrieb). An IRC3 kann daher eine eigene Stromversorgung für die IRCOMM-Sendedioden angeschlossen werden. Dazu muss die Trennstelle IRC zwischen ihren Lötpunkten IRC1, IRC2 aufgetrennt werden.&lt;br /&gt;
* An IRC+, IRC- könnten andere/weitere IRCOMM-Sendedioden angeschlossen werden (Anode an IRC+). Wenn der Vorwiderstand R6 (SP2 C2: R6) der Sendedioden dann nicht mehr paßt (bezügl. Leistung und/oder Widerstandswert), können neue leistungsfähigere IRCOMM-Sendedioden zwischen IRC3 und IRC- (Anode an IRC3) mit einem dafür geeigneten Vorwiderstand angebracht werden.&lt;br /&gt;
&lt;br /&gt;
====LS====&lt;br /&gt;
[[Bild:RP6_LS.JPG|thumb|RP6 LS]]&lt;br /&gt;
Die beiden Lötpunkte LS_L und LS_R (SP2 B12: LS_L, LS_R) neben R7 vorn auf dem Mainboard sind die Ausgänge der Helligkeitssensoren (links und rechts) bzw. die ADC-Eingänge ADC3 und ADC2 des RP6 Microcontrollers.&lt;br /&gt;
&lt;br /&gt;
Hier kann man die Spannungen messen, die den Helligkeitswerten entsprechen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====BP, S====&lt;br /&gt;
[[Bild:RP6_BP_S.JPG|thumb|RP6 BP S]]&lt;br /&gt;
Die Messpunkte BPL, BPR und der Kontaktpunkt S (SP2 E2: S; SP2 E3: BPR; SP2 E4: BPL) befinden sich am vorderen Platinenrand. BPL und BPR sind die Kontakte der Bumper. S ist eine nicht genutzte Verbindung zwischen dem Mainboard und der Sensorplatine, die über die Verbindung SP1, Pin 3, geführt wird (siehe folgende Tabelle!).&lt;br /&gt;
&lt;br /&gt;
Hier eine Tabelle mit der Belegung der 90°-Winkelverbindung SP1, SP2 zwischen dem RP6 Mainboard und der Sensorplatine: &lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |Pin&lt;br /&gt;
 |SP1&lt;br /&gt;
 |SP2&lt;br /&gt;
 |-&lt;br /&gt;
 |1&lt;br /&gt;
 |LS_L  --- Light Sensor Left&lt;br /&gt;
 |IRC-  --- IRCOMM-&lt;br /&gt;
 |-&lt;br /&gt;
 |2&lt;br /&gt;
 |BPL   --- Bumper Left&lt;br /&gt;
 |ACS_R --- ACS Right&lt;br /&gt;
 |-&lt;br /&gt;
 |3&lt;br /&gt;
 |S     --- Free for all&lt;br /&gt;
 |ACS_P --- ACS Power&lt;br /&gt;
 |-&lt;br /&gt;
 |4&lt;br /&gt;
 |GND&lt;br /&gt;
 |VDD&lt;br /&gt;
 |-&lt;br /&gt;
 |5&lt;br /&gt;
 |ACS_L --- ACS Left&lt;br /&gt;
 |BPR   --- Bumper Right&lt;br /&gt;
 |-&lt;br /&gt;
 |6&lt;br /&gt;
 |IRC+  --- IRCOMM+&lt;br /&gt;
 |LS_R  --- Light Sensor Right&lt;br /&gt;
 |-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====ENC====&lt;br /&gt;
[[Bild:RP6_ENC.JPG|thumb|RP6 ENC]]&lt;br /&gt;
Die beiden Messpunkte ENCL, ENCR (SP4 B12: ENCL, ENCR) sind die Ausgänge der Radencoder. ENCL ist verbunden mit PD2 (INT0), ENCR mit PD3 (INT1) des RP6 Microcontrollers.&lt;br /&gt;
&lt;br /&gt;
===Trennstellen===&lt;br /&gt;
An diesen Stellen können Leiterbahnen unterbrochen werden, um Funktionen zu deaktivieren oder anders zu nutzen.&lt;br /&gt;
&lt;br /&gt;
=====Getrennte Stromversorgung für ADC0/1=====&lt;br /&gt;
Wenn man für die analogen Sensoren an ADC0/1 (siehe Abschnitt &amp;quot;Anschlüsse - Analoge Sensoren an ADC0/1&amp;quot; weiter oben!) eine GETRENNTE Stromversorgung vorsehen will und/oder mit Codierbrücke (oder MOSFET) die Stromversorgung abschaltbar machen möchte, muss man erst Vorarbeit leisten.&lt;br /&gt;
[[Bild:RP6_SV.JPG|thumb|RP6 SV]]&lt;br /&gt;
&lt;br /&gt;
Man braucht dazu:&lt;br /&gt;
* 1-reihige Stiftleiste RM 2,54mm (z.B. 36-polig 732478)&lt;br /&gt;
* Evtl.: Eine Codierbrücke (z.B. aus Set 742902)&lt;br /&gt;
* Evtl.: Eine 1-polige Steckbuchse mit Litze zur ext. Stromversorgung&lt;br /&gt;
Es muss eine kurze Leiterbahn zwischen den Punkten &amp;quot;SV1&amp;quot; und &amp;quot;SV2&amp;quot; (SP2 A1: SV1, SV2; zwischen dem PROG/UART- und dem USRBUS1-Stecker) aufgetrennt werden. Die Leiterbahn befindet sich auf der Lötseite der Platine und muss mit einem scharfen Messer oder einem speziellen Leiterbahn-Unterbrecher zwischen den beiden Lötpunkten unterbrochen werden. Man sollte anschließend mit einem Widerstandsmeßgerät zwischen SV1 und SV2 nachmessen: Es sollte keine Verbindung mehr bestehen. Jetzt trennt man von der 1-reihigen Stiftleiste 2 Kontakte ab und lötet sie auf die Punkte SV1/SV2.&lt;br /&gt;
&lt;br /&gt;
Man kann hier zunächst eine Codierbrücke aufstecken. Damit versorgt der RP6 Akku die Sensoren mit 5V an den Pins VDD. Möchte man später eine getrennte 5V-Spannung anlegen, zieht man einfach die Codierbrücke ab und speist die externe 5V-Spannung (mit einer 1-poligen Steckbuchse) am Pin SV2 ein. Achtung: An Pin SV1 wird dann nichts angeschlossen!&lt;br /&gt;
&lt;br /&gt;
Anstelle der Codierbrücke kann man natürlich auch einen MOSFET anschließen, um die Sensoren per Software abschalten zu können.&lt;br /&gt;
&lt;br /&gt;
====ACS====&lt;br /&gt;
[[Bild:RP6_ACS_JP.JPG|thumb|RP6 ACS JP]]&lt;br /&gt;
Die Trennstelle ACS (SP2 E1: YIR1, YIR2; SP2 F1: YIR3) befindet sich neben C29*. Sie besteht aus 3 Lötpunkten, von denen die linken beiden (IRC1, IRC2) verbunden sind. Trennt man die Leiterbahn zwischen diesen Lötpunkten auf und verbindet stattdessen die rechten beiden Lötpunkte (IRC2, IRC3) mit etwas Lötzinn oder mit einem SMD Null Ohm Widerstand, dann ist der IR-Empfänger (TSOP, IC3) dauerhaft EINgeschaltet und kann nicht mehr über das Signal PWRON (PB4) geschaltet werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====IRC====&lt;br /&gt;
[[Bild:RP6_IRC_JP.JPG|thumb|RP6 IRC JP]]&lt;br /&gt;
Die Trennstelle IRC (SP2 C1: IRC1..2) ist eng verknüpft mit den Mess- und Kontaktpunkten des IRCOMM-Senders (siehe Abschnitt &amp;quot;Mess-/Kontaktpunkte - IRC&amp;quot; weiter oben!). Wenn man sie auftrennt, kann man den IRCOMM-Sender mit einer getrennten Stromversorgung anstelle von +UB des RP6 versehen. Dies ist sehr sinnvoll, wenn man diese Funktion häufig verwendet oder sogar noch leistungsfähigere IR-Sendedioden einbaut, denn der IRCOMM-Sender ist der zweitgrößte Stromfresser (nach dem Antrieb) auf dem RP6 (von Erweiterungsplatinen und EPs Marke Eigenbau einmal abgesehen!). Man kann hier natürlich auch eine 2-polige Stiftleiste einlöten, um die Verbindung zu +UB mit einer Codierbrücke trennbar zu machen. Eine getrennte Stromversorgung +7,2V (Bereich: +5,5 .. +10V) kann man an IRC1 einspeisen. IRC1 dieser Trennstelle ist mit dem Kontaktpunkt IRC3 (siehe Abschnitt &amp;quot;Mess-/Kontaktpunkte - IRC&amp;quot; weiter oben!) verbunden. &lt;br /&gt;
&lt;br /&gt;
====RP6 Antrieb====&lt;br /&gt;
Mit den folgenden Trennstellen kann man den RP6 Antrieb (H-Brücken und Motoren) fast komplett vom Rest des RP6 Mainboards abtrennen (es bleibt nur die 5V-Versorgung (VDD) von IC4, T1, T2 bestehen!). Damit ist es möglich, mit dem RP6 Mainboard einen ganz anderen Antrieb (also z.B. ein anderes Roboter-Chassis mit eigenen Motoren und H-Brücken) zu steuern. Umgekehrt könnte man den RP6 Antrieb auch deshalb abtrennen, um ihn durch ein anderes Prozessorsystem (z.B. auch eine M32!) anzusteuern. It's up to you!&lt;br /&gt;
&lt;br /&gt;
=====+UB Power=====&lt;br /&gt;
[[Bild:RP6_HB_Power.jpg|thumb|RP6 HB Power]]&lt;br /&gt;
Der RP6 Antrieb wird direkt aus dem Akku (über S1 und F1) mit 7,2V (+UB) versorgt. Diese Stromversorgung kann man komplett abtrennen. Die Trennstelle (SP3 E34: X) liegt unter der Sicherung F1 (siehe Abb. RP6 HB Power). Zwischen den beiden doppelten Lötflächen befinden sich auf der Lötseite (Unterseite) des Mainboards vier parallele Leiterbahnen, die aufgetrennt werden müssen. Der Pluspol einer externen Spannung zur Versorgung des RP6 Antriebs kann dann mit einer Kabelverbindung an den doppelten Lötflächen (mit einem &amp;quot;+&amp;quot; gekennzeichnet) direkt neben dem Leistungswiderstand (R27) angeschlossen werden. Eine Absicherung dieser Stromversorgung sollte man unbedingt vorsehen (2,5A träge)!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=====Stromsensoren=====&lt;br /&gt;
[[Bild:RP6_CS.JPG|thumb|RP6 CS]]&lt;br /&gt;
Um den Motorstrom der beiden Motoren des RP6 zu messen, wird ein Dual-Operationsverstärker (IC5 = 27M2C; SP3 B23/D23: IC5B/A) eingesetzt. Dieses IC wird über PWRON (PB4) mit Strom versorgt. Die Stromsensoren funktionieren also nicht, wenn PWRON Low-Pegel führt (Befehl powerOFF() der RP6 Library!). Auf dem RP6 Mainboard gibt es eine Trennstelle mit drei Lötflächen (SP3 E34: CS1, CS2, CS3). Sie befindet sich auf dem Mainboard neben C23. Möchte man IC5 nicht mehr über PWRON mit Strom versorgen, sondern über VDD (+5V), dann trennt man die Leiterbahn zwischen den linken beiden Lötpunkten (CS1, CS2) auf und verbindet die rechten beiden Lötpunkte (CS2, CS3) mit etwas Lötzinn oder einem SMD Null Ohm Widerstand. Danach sind die Stromsensoren immer eingeschaltet und können über PWRON nicht mehr geschaltet werden. Alternativ kann man an CS2 auch eine externe Versorgungsspannung (+5V) für IC5 einspeisen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=====DR/MR/ML/DL=====&lt;br /&gt;
[[Bild:RP6_DR_MR_ML_DL.JPG|thumb|RP6 DR MR ML DL]]&lt;br /&gt;
An diesen Trennstellen können die Eingänge der H-Brücke für die Geschwindigkeit (PWM) und Drehrichtung der Motoren von den Portpins des Microcontrollers abgetrennt werden.&lt;br /&gt;
Für den rechten Motor sind dies die Trennstellen MR1/2 und DR1/2 (SP3 A23: MR1/2, DR1/2), für den linken Motor ML1/2 und DL1/2 (SP3 F23: ML1/2, DL1/2).&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |Trennstelle&lt;br /&gt;
 |Portpin&lt;br /&gt;
 |Funktion H-Brücke&lt;br /&gt;
 |-&lt;br /&gt;
 |MR1/2&lt;br /&gt;
 |PD5 (OC1A)&lt;br /&gt;
 |PWM Motor rechts&lt;br /&gt;
 |-&lt;br /&gt;
 |DR1/2&lt;br /&gt;
 |PC3 (TMS)&lt;br /&gt;
 |Fahrtrichtung rechts&lt;br /&gt;
 |-&lt;br /&gt;
 |ML1/2&lt;br /&gt;
 |PD4 (OC1B)&lt;br /&gt;
 |PWM Motor links&lt;br /&gt;
 |-&lt;br /&gt;
 |DL1/2&lt;br /&gt;
 |PC2 (TCK)&lt;br /&gt;
 |Fahrtrichtung links&lt;br /&gt;
 |-&lt;br /&gt;
|}&lt;br /&gt;
Trennt man die Leiterbahn (auf der Lötseite des RP6 Mainboards) zwischen den Lötpunkten der Trennstellen auf, kann man die Eingänge der H-Brücke (Mx1, Dx1) z.B. mit einem anderen Microcontroller verbinden. Die Ausgänge (Portpins) des RP6 Microcontrollers (Mx2, Dx2) können dann anders genutzt werden. Natürlich kann man auf die Lötpunkte dieser Trennstellen auch Stiftleisten löten, um den Anschluß steckbar zu machen.&lt;br /&gt;
&lt;br /&gt;
=====MCR/MCL=====&lt;br /&gt;
[[Bild:RP6_MCR_MCL.JPG|thumb|RP6 MCR MCL]]&lt;br /&gt;
An diesen Trennstellen können die Motorstromsensoren von den ADC-Eingängen des Microcontrollers abgetrennt werden.&lt;br /&gt;
&lt;br /&gt;
Für den rechten Sensor ist dies die Trennstelle MCR1/2 (SP3 A1: MCR1, MCR2), für den linken Sensor MCL1/2 (SP3 E1: MCL1, MCL2).&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |Trennstelle&lt;br /&gt;
 |Portpin&lt;br /&gt;
 |Funktion H-Brücke&lt;br /&gt;
 |-&lt;br /&gt;
 |MCR1/2&lt;br /&gt;
 |PA5 (ADC5)&lt;br /&gt;
 |Motorstrom rechts&lt;br /&gt;
 |-&lt;br /&gt;
 |MCL1/2&lt;br /&gt;
 |PA6 (ADC6)&lt;br /&gt;
 |Motorstrom links&lt;br /&gt;
 |-&lt;br /&gt;
|}&lt;br /&gt;
Trennt man die Leiterbahn (auf der Lötseite des RP6 Mainboards) zwischen den Lötpunkten der Trennstellen auf, kann man die ADC-Eingänge (Portpins) des RP6 Microcontrollers (MCx1) anders nutzen und die Ausgänge der Motorstromsensoren (MCx2) z.B. mit ADC-Eingängen eines anderen Microcontrollers verbinden. Natürlich kann man auf die Lötpunkte dieser Trennstellen auch Stiftleisten löten, um den Anschluß steckbar zu machen.&lt;br /&gt;
&lt;br /&gt;
====PWRON-LED====&lt;br /&gt;
[[Bild:RP6_PWRON_L.JPG|thumb|RP6 PWRON L]]&lt;br /&gt;
Auf dem RP6 Mainboard gibt es eine gelbe LED, die anzeigt, ob PWRON High-Pegel hat. Mit einer Trennstelle neben dieser LED (SP2 D4: YL1, YL2) kann diese LED deaktiviert werden (z.B. um Strom zu sparen).&lt;br /&gt;
&lt;br /&gt;
Dazu trennt man die Leiterbahn zwischen den Lötpunkten auf. Soll die LED wieder aktiviert werden, verbindet man die Lötpunkte wieder mit etwas Lötzinn oder einem SMD Null Ohm Widerstand.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====+UB Sensor====&lt;br /&gt;
[[Bild:RP6_UB.JPG|thumb|RP6 UB]]&lt;br /&gt;
Die Versorgungsspannung +UB des RP6 wird mit dem +UB-Spannungssensor an PA7 (ADC7) gemessen. Will man diesen Spannungssensor mit seinem Eingangsspannungsteiler R1, R2 (SP1 D12: R1, R2) von +UB abtrennen (z.B. um ihn anders zu verwenden), gibt es eine Trennstelle UB1/2 (SP1 D2: UB1, UB2). Trennt man die Leiterbahn auf der Lötseite des RP6 Mainboards zwischen den Lötpunkten auf, kann +UB nicht mehr gemessen werden. Man kann dann den Lötpunkt UB2 mit einem anderen Messpunkt (z.B. mit +BAT) verbinden und dort die Spannung (0..10V) messen. Natürlich kann man auf die Lötpunkte dieser Trennstellen auch Stiftleisten löten, um den Anschluß steckbar zu machen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====EXT Anschluß: Andere Stromversorgung====&lt;br /&gt;
[[Bild:RP6_S1_CHRG.jpg|thumb|RP6 S1 CHRG]]&lt;br /&gt;
Wenn man für den RP6 eine andere Stromversorgung oder Ladeschaltung anschließen will, geht dies gut am EXT Anschluß (SP1 C23: Stecker EXT). Siehe auch den Abschnitt &amp;quot;Anschlüsse - EXT Anschluß&amp;quot; weiter oben! Dann muss der Schalter S1 dauerhaft AUSgeschaltet bleiben und die Verbindung zwischen S1 und CHRG des EXT Anschlusses (SP1 C3: X) unterbrochen werden. Diese Trennstelle befindet sich auf der Lötseite (Unterseite) des RP6 Mainboards etwas versteckt zwischen S1 (Pin 3) und der benachbarten Leiterbahn, die CHRG des EXT Anschlusses mit der Ladebuchse CHARGER (Pin 1 +) verbindet. Dort sind fünf kurze, parallele Leiterbahnen zu unterbrechen (siehe gelbe Markierung in der Abb. RP6 S1 CHRG!). Will man das nicht machen, darf man die Ladebuchse CHARGER auf jeden Fall nicht mehr nutzen!&lt;br /&gt;
&lt;br /&gt;
===Lochraster-Felder===&lt;br /&gt;
Auf diesen Feldern kann man eigene kleine Schaltungen aufbauen. An jedem der sechs Felder stehen VDD (+5V) und GND zur Verfügung (SP4 E12: YVDDx, YGNDx).&lt;br /&gt;
&lt;br /&gt;
Bitte beachten: Die Lochreihen oder -spalten, die mit einer eckigen Klammer &amp;quot;[&amp;quot; markiert sind, liegen auf der Lötseite (Unterseite) direkt auf dem Rahmen des Chassis! Hier können also keine Drähte von unten verlötet werden.&lt;br /&gt;
&lt;br /&gt;
====Vorn links====&lt;br /&gt;
Das kleine Lochrasterfeld vorn links kann z.B. für Beleuchtung (Blinker, Scheinwerfer links) oder auch für einen zusätzlichen Sensor genutzt werden.&lt;br /&gt;
Zur Verfügung steht eine 2-adrige Verbindung zum mittleren Lochrasterfeld links.&lt;br /&gt;
&lt;br /&gt;
In der Nähe dieses Lochrasterfeldes gibt es auch:&lt;br /&gt;
* IO3, IO4 (SP2 E3: IO3, IO4)&lt;br /&gt;
* ADC0 (SP2 B1: ADC0)&lt;br /&gt;
&lt;br /&gt;
====Mitte links====&lt;br /&gt;
[[Bild:RP6_Lochfeld_LM.JPG|thumb|RP6 Lochrasterfeld Mitte links]]&lt;br /&gt;
Das größere Lochrasterfeld Mitte links kann z.B. für eine kleinere Schaltung zur Ansteuerung der Beleuchtung/Sensoren auf den Lochrasterfeldern vorn und hinten links oder für andere Zwecke genutzt werden.&lt;br /&gt;
&lt;br /&gt;
Es stehen hier folgende Anschlüsse zur Verfügung:&lt;br /&gt;
* 2-adrige Verbindung zum Lochrasterfeld vorn links&lt;br /&gt;
* 2-adrige Verbindung zum Lochrasterfeld hinten links&lt;br /&gt;
* ST1/ST2 zum Anschluß weiterer Start/Stop Taster (SP2 D2: ST1/2)&lt;br /&gt;
* PWR (SP2 D2: YPWR1)&lt;br /&gt;
* I2C-Bus (SCL, SDA; SP4 C1: YSCL1, YSDA1)&lt;br /&gt;
* +UB (SP4 D2: YUB1)&lt;br /&gt;
In der Nähe dieses Lochrasterfeldes gibt es auch:&lt;br /&gt;
* Serielle Schnittstelle (RST, TX, RX; SP4 AB5: YRX, YTX, YMRESET, YVDD)&lt;br /&gt;
* USRBUS1 (vorn; SP4 E34: Y1'..Y14')&lt;br /&gt;
&lt;br /&gt;
=====Schaltungsvorschläge=====&lt;br /&gt;
Wie kann z.B. eine Schaltung für Beleuchtungseffekte oder Sensoren aussehen?&lt;br /&gt;
&lt;br /&gt;
Man könnte 8 zusätzliche Schaltkanäle mit dem I2C-Portexpander-IC PCF8574(A)P gewinnen. Dieses IC passt mit wenigen Zusatzteilen auf die mittlere Lochrasterfläche. Angesteuert wird es über den I2C-Bus. Mit den 8 Ausgängen lassen sich einige Beleuchtungseffekte erreichen, die dann über Software schaltbar sind.&lt;br /&gt;
&lt;br /&gt;
Alternativ kann man auch das IC PCF8591P z.B. für den Anschluß von analogen Sensoren verwenden. Auch dieser Baustein wird über I2C angesteuert. Beide ICs sind bei [http://www.reichelt.de./ Reichelt] erhältlich.&lt;br /&gt;
&lt;br /&gt;
Will man nicht den I2C-Bus benutzen, kann man als I/O-Ports IO1..IO4 oder als analoge Eingänge ADC0 und ADC1 verwenden. Auch SCL und SDA stehen als I/O-Ports zur Verfügung, wenn der I2C-Bus im ganzen System nicht verwendet werden soll.&lt;br /&gt;
&lt;br /&gt;
Wichtig für Zusatzschaltungen, die fest auf dem RP6 verlötet werden, sind zwei Aspekte:&lt;br /&gt;
* Wenn sie die Stromversorgung belasten, sollten sie (z.B. über einen Transistor oder MOSFET) abschaltbar sein. Dazu kann man auch das Signal PWR heranziehen, das auf beiden mittleren Lochrasterflächen zur Verfügung steht. Dann kann man mit dem Befehl &amp;quot;powerOFF()&amp;quot; der RP6 Library die Stromversorgung per Software abschalten.&lt;br /&gt;
* Wenn man auch anderweitig genutzte Portpins (SDA, SCL, IO1..IO4, ADC0/1) für die eigene Schaltung einsetzt, sollte man die Verbindung zu den Portpins mit einer abziehbaren Codierbrücke trennbar machen.&lt;br /&gt;
&lt;br /&gt;
====Hinten links====&lt;br /&gt;
Das kleine Lochrasterfeld hinten links kann z.B. für Beleuchtung (Blinker, Rücklicht links) oder auch für einen zusätzlichen Sensor genutzt werden.&lt;br /&gt;
Zur Verfügung steht eine 2-adrige Verbindung zum mittleren Lochrasterfeld links.&lt;br /&gt;
&lt;br /&gt;
In der Nähe dieses Lochrasterfeldes gibt es auch:&lt;br /&gt;
* EXT Anschluß (SP1 C23: Stecker EXT)&lt;br /&gt;
&lt;br /&gt;
====Vorn rechts====&lt;br /&gt;
Das kleine Lochrasterfeld vorn rechts kann z.B. für Beleuchtung (Blinker, Scheinwerfer rechts) oder auch für einen zusätzlichen Sensor genutzt werden.&lt;br /&gt;
Zur Verfügung steht eine 2-adrige Verbindung zum mittleren Lochrasterfeld rechts.&lt;br /&gt;
&lt;br /&gt;
In der Nähe dieses Lochrasterfeldes gibt es auch:&lt;br /&gt;
* IO1, IO2 (SP2 E3: IO1, IO2)&lt;br /&gt;
* ADC1 (SP2 B1: ADC1)&lt;br /&gt;
&lt;br /&gt;
====Mitte rechts====&lt;br /&gt;
Das größere Lochrasterfeld Mitte rechts kann z.B. für eine kleinere Schaltung zur Ansteuerung der Beleuchtung/Sensoren auf den Lochrasterfeldern vorn und hinten rechts oder für andere Zwecke genutzt werden.&lt;br /&gt;
&lt;br /&gt;
Es stehen hier folgende Anschlüsse zur Verfügung:&lt;br /&gt;
* 2-adrige Verbindung zum Lochrasterfeld vorn rechts&lt;br /&gt;
* 2-adrige Verbindung zum Lochrasterfeld hinten rechts&lt;br /&gt;
* PWR (SP2 D2: YPWR2)&lt;br /&gt;
* I2C-Bus (SCL, SDA; SP4 C1: YSCL2, YSDA2)&lt;br /&gt;
* +UB (SP4 D2: YUB2)&lt;br /&gt;
In der Nähe dieses Lochrasterfeldes gibt es auch:&lt;br /&gt;
* Interrupt-Anschluß (INTU, INT1..3, MRESET; SP4 D34: MRESET, INT1..3, INTU)&lt;br /&gt;
* USRBUS2 (hinten; SP4 E34: Y1..Y14)&lt;br /&gt;
&lt;br /&gt;
====Hinten rechts====&lt;br /&gt;
Das kleine Lochrasterfeld hinten rechts kann z.B. für Beleuchtung (Blinker, Rücklicht rechts) oder auch für einen zusätzlichen Sensor genutzt werden.&lt;br /&gt;
Zur Verfügung steht eine 2-adrige Verbindung zum mittleren Lochrasterfeld rechts.&lt;br /&gt;
&lt;br /&gt;
In der Nähe dieses Lochrasterfeldes gibt es auch:&lt;br /&gt;
* EXT Anschluß (SP1 C23: Stecker EXT)&lt;br /&gt;
* Akku-Anschluß (SP1 B3: BATTERY)&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Erweiterungen==&lt;br /&gt;
Auf / An den RP6 könnte man z.B. noch folgendes anbauen / erweitern:&lt;br /&gt;
&lt;br /&gt;
* Einen Greifarm&lt;br /&gt;
* Einen Ultraschallsensor&lt;br /&gt;
* Zwei Lichtsensoren hinten, um die hellste / dunkelste Stelle im Raum besser zu finden&lt;br /&gt;
* Einen digitalen Kompass&lt;br /&gt;
* uvm.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Erweiterungs-Module==&lt;br /&gt;
&lt;br /&gt;
Es sind von Arexx schon einige Erweiterungsmöglichkeiten auf dem Markt. Zum Ersten die Experimentierplatinen ([http://www.conrad.de/ce/de/product/191537/Arexx-RP6-Experimentierplatine 191537] AUSVERKAUFT!), die zum Erstellen von eigenen Schaltungen und Sensoren gedacht sind, und von denen eine schon im Lieferumfang des RP6 enthalten war, das Erweiterungsboard RP6 CONTROL M32 ([http://www.conrad.de/ce/de/product/191550/Arexx-RP6-ATMEGA32-Erweiterungssatz 191550] AUSVERKAUFT!) und die RP6 CCPRO M128 ([http://www.conrad.de/ce/de/product/191563/Arexx-RP6-CC-PRO-MEGA128-Erweiterungssatz 191563]).&lt;br /&gt;
&lt;br /&gt;
Die Boards kann man dann über den I2C Bus mit dem Mainboard kommunizieren lassen.  Es ist sehr sinnvoll, die Module symmetrisch hintereinander zu stapeln und nicht mehr als 6-8 Module zu verbauen, weil der Roboter sonst immer schwerer und langsamer wird. Basierend auf dem Master-Slave System könnte man so bis zu 127 Slaves anschließen. Zudem ist es ratsam, qualitativ hochwertige Akkus und ein Ladegerät mit passendem Stecker zu verwenden, da man ansonsten immer das Mainboard abschrauben müsste um an die Akkus heranzukommen. Für den Fall wurde extra eine Ladebuchse eingebaut.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Experimentierplatine ===&lt;br /&gt;
[[Bild:RP6_Exp.jpg|RP6 Experimentierplatine]]&lt;br /&gt;
&lt;br /&gt;
====Beschreibung====&lt;br /&gt;
Die Experimentier-Platine ist dazu gedacht, eigene Schaltungen auf dem RP6 zu realisieren, und ist seit Mai 2020 bei CONRAD ausverkauft. Sie wird über den I²C-Bus mit den anderen Erweiterungsmodulen verbunden. Ausserdem ist es sinnvoll, die (freien) I/O-Ports (ADC-Kanäle) der RP6 Base, des M32 Erweiterungsmoduls bzw. des CCPRO M128 Moduls über ein [http://www.reichelt.de/?;ACTION=3;LA=444;GROUP=C63;GROUPID=3328;ARTICLE=47637;START=0;SORT=artnr;OFFSET=16;SID=1580faBqwQAQ8AAGY-ZAM7cd511ee04a106a88a359faaac0071e2 10-Pol-Flachbandkabel] mit [http://www.reichelt.de/?ACTION=3;GROUP=C151;GROUPID=3231;ARTICLE=14571;SID=1580faBqwQAQ8AAGY-ZAM7cd511ee04a106a88a359faaac0071e2 Stecker] auf die Experimentierplatine zu führen, weil es übersichtlicher bleibt und keine Kabel lose herumhängen. Auf der Experimentierplatine kann man dann LEDs oder einen Temperatursensor an die I/O-Ports bzw. an die ADC-Kanäle anschießen.&lt;br /&gt;
&lt;br /&gt;
====Technische Daten====&lt;br /&gt;
{|  {{Blauetabelle}} &lt;br /&gt;
|'''Mikrocontroller:'''&lt;br /&gt;
|Keiner&lt;br /&gt;
|-&lt;br /&gt;
|'''Speicher:'''&lt;br /&gt;
|Keiner&amp;lt;br/&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|'''Programmierung:'''&lt;br /&gt;
|Kein Programmieradapter&lt;br /&gt;
|-&lt;br /&gt;
|'''Vorhandene Sensoren:'''&lt;br /&gt;
|Keine&amp;lt;br/&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|'''Vorhandene Aktoren:'''&lt;br /&gt;
|Keine&amp;lt;br/&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|'''Abmessungen:'''&lt;br /&gt;
|(L &amp;amp;times; B &amp;amp;times; H) 112 &amp;amp;times; 90 &amp;amp;times; 10 mm&lt;br /&gt;
|-&lt;br /&gt;
|'''Ausführung:'''&lt;br /&gt;
|Bausatz&lt;br /&gt;
|-&lt;br /&gt;
|'''Stromversorgung:'''&lt;br /&gt;
|6 AA NiMH Akkus (über die RP6 Base)&lt;br /&gt;
|-&lt;br /&gt;
|'''Hersteller:'''&lt;br /&gt;
|Arexx Niederlande&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Schaltungsideen ====&lt;br /&gt;
Auf der / den Experimentierplatinen könnte man z.B. folgendes realisieren:&lt;br /&gt;
&lt;br /&gt;
* eine Kameraschaltung (wie [http://www.rn-wissen.de/index.php/RP6_Kamera_-_Mitmach-Projekt hier] gezeigt)&lt;br /&gt;
* Scheinwerfer, Rücklichter, Blinker etc. (ABER immer mit Vorwiderstand!!!)&lt;br /&gt;
* ein LED-Lauflicht (über I/O-Expander, gibt´s beim [http://www.reichelt.de/?ACTION=3;ARTICLE=14527;PROVID=2402 Reichelt])&lt;br /&gt;
* mehr ADC-Kanäle (über ADC-Expander, einfach mal nach PCF8591 [http://www.google.de/search?q=PCF8591 googlen])&lt;br /&gt;
* eine Wetterstation mit Luftfeuchtemesser, Temperaturfühler und Lichtmesser ([http://www.roboternetz.de/phpBB2/viewtopic.php?t=52298 hier] gibt es eine Wetterstation uvm.)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== RP6 CONTROL M32 Platine ===&lt;br /&gt;
[[Bild:RP6Control_M32.jpg|RP6 CONTROL M32]]&lt;br /&gt;
&lt;br /&gt;
====Beschreibung====&lt;br /&gt;
Auf der M32 ([http://www.conrad.de/ce/de/product/191550/Arexx-RP6-ATMEGA32-Erweiterungssatz 191550]) lassen sich weitere LEDs, Sensoren oder ähnliches anschließen, außerdem steht ein weiterer ATMEGA32 zur Verfügung, welcher sich gut im Master Modus betreiben lässt. Es sind ein Mikrofonsensor, fünf Taster, vier Status-LEDs, ein Display-Port, ein Beeper, 6 freie ADC-Kanäle, 8 freie I/O-Ports, ein Programmieradapter, ein JTAG-Anschluss, eine ISP-Programmierschnittstelle sowie ein freier Steckplatz für ein EEPROM verfügbar.&lt;br /&gt;
&lt;br /&gt;
Seit Ende 2021 ist die M32 bei CONRAD ausverkauft!&lt;br /&gt;
&lt;br /&gt;
====Technische Daten====&lt;br /&gt;
{|  {{Blauetabelle}} &lt;br /&gt;
|'''Mikrocontroller:'''&lt;br /&gt;
|AVR [[ATmega32]]&lt;br /&gt;
|-&lt;br /&gt;
|'''Speicher:'''&lt;br /&gt;
|32 kB [[Flash]]-Speicher, davon 1 kB bereits vom Bootloader belegt&amp;lt;br/&amp;gt;&lt;br /&gt;
2 kB SRAM&amp;lt;br/&amp;gt; &lt;br /&gt;
1 kB [[EEPROM]]&lt;br /&gt;
|-&lt;br /&gt;
|'''Programmierung:'''&lt;br /&gt;
|Über AVR-[[Bootloader]], belegt ca. 1 kB des Flash-Speichers&lt;br /&gt;
|-&lt;br /&gt;
|'''Vorhandene Sensoren:'''&lt;br /&gt;
|1 Mikrofonsensor&amp;lt;br/&amp;gt;&lt;br /&gt;
5 Eingabetaster&amp;lt;br/&amp;gt;&lt;br /&gt;
14 I/O Ports, davon 6 ADC-Wandler&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|'''Vorhandene Aktoren:'''&lt;br /&gt;
|1 Beeper&amp;lt;br/&amp;gt;&lt;br /&gt;
4 Status-LEDs&amp;lt;br/&amp;gt;&lt;br /&gt;
1 LC-Display-Port&amp;lt;br/&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|'''Abmessungen:'''&lt;br /&gt;
|(L &amp;amp;times; B &amp;amp;times; H) 112 &amp;amp;times; 90 &amp;amp;times; 15 mm&lt;br /&gt;
|-&lt;br /&gt;
|'''Ausführung:'''&lt;br /&gt;
|Fertig aufgebautes Erweiterungsmodul&lt;br /&gt;
|-&lt;br /&gt;
|'''Stromversorgung:'''&lt;br /&gt;
|6 AA NiMH Akkus (über die RP6 Base)&lt;br /&gt;
|-&lt;br /&gt;
|'''Hersteller:'''&lt;br /&gt;
|Arexx Niederlande&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Umbau-Optionen ====&lt;br /&gt;
Dieser Absatz soll die Möglichkeiten der RP6 CONTROL M32 Platine (im Folgenden &amp;quot;M32&amp;quot; genannt) auflisten, die es gibt, um auf einfache Weise weitere Anschlüsse oder Verbindungen zu ermöglichen. Nicht beschrieben werden die Anschlußmöglichkeiten, die in Form der vorhandenen Wannenstecker sowieso gegeben sind (z.B. am LCD-, I/O- oder ADC-Stecker). Im Text gibt es Verweise auf den Schaltplan der M32 (RP6_CONTROL_M32.PDF) in der Form: (SP2 B1: Bauteil).  Dies bedeutet, dass man das Bauteil auf Blatt 2 des RP6-M32-Schaltplans im Feld B1 finden kann.&lt;br /&gt;
&lt;br /&gt;
Folgende Möglichkeiten zum Umbau/Ausbau sind vorgesehen:&lt;br /&gt;
* Zweites SPI-EEPROM (IC5)&lt;br /&gt;
* Zwei analoge Sensoren, evtl. mit getrennter Stromversorgung&lt;br /&gt;
* ISP (In System Programming)&lt;br /&gt;
* JTAG-Programmierung&lt;br /&gt;
* USRBUS&lt;br /&gt;
* IRQ-Zuweisung ändern&lt;br /&gt;
* ADC0 und ADC1 anders nutzen&lt;br /&gt;
* Schieberegister kaskadieren&lt;br /&gt;
Im folgenden Text soll beschrieben werden, wie man die weiteren Möglichkeiten nutzen kann. Es wird jeweils erwähnt, was man an Material braucht. Beispielhaft sind da Bestell-Nummern der Firma [http://www.conrad.de/ce/ CONRAD] genannt. Natürlich kann man die Teile auch bei anderen Versendern beziehen. Durch die Nennung der Bestell-Nummer ist das jeweilige Teil aber gut zu identifizieren. Man sollte Löten können und sich bewußt sein, dass ggf. ein Garantieanspruch nicht mehr besteht, wenn man an der Platine gelötet hat.&lt;br /&gt;
&lt;br /&gt;
Bei den Materialangaben ist öfter die Rede von &amp;quot;Steckbuchsen mit Litze&amp;quot;. Diese Steckbuchsen mit angelöteter Litze können auf die ein- oder zweireihigen Stiftleisten aufgesteckt werden. Leider gibt es sie nicht (mehr) fertig konfektioniert bei CONRAD. Die einreihigen Steckbuchsen (RM 2,54mm) kann man aber z.B. bei [http://www.elv.de/output/controller.aspx ELV] bekommen: 2-polig (68-016635), 3-polig (68-022503) und 5-polig (68-023073). An sie muss man dann noch Litzen in der entsprechenden Länge selbst anlöten.&lt;br /&gt;
&lt;br /&gt;
===== Zweites SPI-EEPROM =====&lt;br /&gt;
Es ist sehr einfach, ein zweites SPI-EEPROM (SP1 A1: IC5*) auf der M32 zu nutzen.&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_M32_IC5-Socket.JPG|thumb|Sockel des 2. SPI-EEPROMs]]&lt;br /&gt;
&lt;br /&gt;
Man braucht dazu:&lt;br /&gt;
* Einen IC-Sockel 8-pol DIP für IC5 ([http://www.conrad.de/ce/de/product/189600/IC-FASSUNG-PRAeZISION-8POLIG 189600])&lt;br /&gt;
* Einen Keramik-Vielschicht-Kondensator 100nF (C19); RM 2,54mm ([http://www.conrad.de/ce/de/product/453099/?insert=36&amp;amp;insertNoDeeplink&amp;amp;productname=KONDENSATOR-01-F-KDPU-254-MM 453099])&lt;br /&gt;
* Ein serielles SPI-EEPROM im PDIP8 Gehäuse (IC5)&lt;br /&gt;
Zuerst wird der IC-Sockel eingelötet (Kerbe beachten!), dann C19 (SP1 A1: C19*). Das war's.&lt;br /&gt;
&lt;br /&gt;
Leider gibt es das EEPROM nicht bei den gängigeren Versendern. Bekommen kann man es aber z.B. bei [http://de.farnell.com/jsp/home/homepage.jsp Farnell]. Dort hat das SPI-EEPROM mit 256 kbit die Bezeichnung 25LC256-I/P (1331398). Wenn man es noch größer mag: 25LC1024 (1331392) mit 1024 kbit. SPI-EEPROMs führt inzwischen auch [http://www.reichelt.de./ Reichelt].&lt;br /&gt;
&lt;br /&gt;
'''Programmierung:'''&lt;br /&gt;
&lt;br /&gt;
In die RP6ControlLib.h bitte einfügen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#define SPI_EEPROM2_PAGESIZE 64&lt;br /&gt;
&lt;br /&gt;
uint8_t SPI_EEPROM2_readByte(uint16_t memAddr);&lt;br /&gt;
void SPI_EEPROM2_writeByte(uint16_t memAddr, uint8_t data);&lt;br /&gt;
void SPI_EEPROM2_enableWrite(void);&lt;br /&gt;
void SPI_EEPROM2_disableWrite(void);&lt;br /&gt;
uint8_t SPI_EEPROM2_getStatus(void);&lt;br /&gt;
&lt;br /&gt;
void SPI_EEPROM2_writeBytes(uint16_t startAddr, uint8_t *buffer, uint8_t length);&lt;br /&gt;
void SPI_EEPROM2_readBytes(uint16_t startAddr, uint8_t *buffer, uint8_t length);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Die Konstante SPI_EEPROM2_PAGESIZE ist abhängig von der Art und Größe des EEPROMs. Für ein 256 kbit-EEPROM ist die Seitengröße (pagesize) in der Regel 64, für einen 512 kbit-Typ 128 und für einen 1024 kbit-Typ 256.&lt;br /&gt;
&lt;br /&gt;
In die RP6ControlLib.c bitte einfügen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Second external SPI EEPROM:&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Reads a single Byte from the 2nd external EEPROM.&lt;br /&gt;
 */&lt;br /&gt;
uint8_t SPI_EEPROM2_readByte(uint16_t memAddr)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t data;&lt;br /&gt;
	PORTB &amp;amp;= ~MEM_CS2;&lt;br /&gt;
	writeSPI(SPI_EEPROM_READ);&lt;br /&gt;
	writeWordSPI(memAddr);&lt;br /&gt;
	data = readSPI();&lt;br /&gt;
	PORTB |= MEM_CS2;&lt;br /&gt;
	return data;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Reads &amp;quot;length&amp;quot; Bytes into the Buffer &amp;quot;buffer&amp;quot; from startAdr on. &lt;br /&gt;
 * You can read the complete 2nd EEPROM into a buffer at once - if it is large enough. &lt;br /&gt;
 * (But you only have 2KB SRAM on a MEGA32 ;) )&lt;br /&gt;
 */&lt;br /&gt;
void SPI_EEPROM2_readBytes(uint16_t startAddr, uint8_t *buffer, uint8_t length)&lt;br /&gt;
{&lt;br /&gt;
	PORTB &amp;amp;= ~MEM_CS2;&lt;br /&gt;
	writeSPI(SPI_EEPROM_READ);&lt;br /&gt;
	writeWordSPI(startAddr);&lt;br /&gt;
	readBufferSPI(&amp;amp;buffer[0], length);&lt;br /&gt;
	PORTB |= MEM_CS2;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Enable Write Mode&lt;br /&gt;
 */&lt;br /&gt;
void SPI_EEPROM2_enableWrite(void)&lt;br /&gt;
{&lt;br /&gt;
	PORTB &amp;amp;= ~MEM_CS2;&lt;br /&gt;
	writeSPI(SPI_EEPROM_WREN);&lt;br /&gt;
	PORTB |= MEM_CS2;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Disable Write Mode&lt;br /&gt;
 */&lt;br /&gt;
void SPI_EEPROM2_disableWrite(void)&lt;br /&gt;
{&lt;br /&gt;
	PORTB &amp;amp;= ~MEM_CS2;&lt;br /&gt;
	writeSPI(SPI_EEPROM_WRDI);&lt;br /&gt;
	PORTB |= MEM_CS2;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Write a single data byte to the specified 2nd EEPROM address.&lt;br /&gt;
 */&lt;br /&gt;
void SPI_EEPROM2_writeByte(uint16_t memAddr, uint8_t data)&lt;br /&gt;
{&lt;br /&gt;
	while(SPI_EEPROM2_getStatus() &amp;amp; SPI_EEPROM_STAT_WIP);&lt;br /&gt;
	SPI_EEPROM2_enableWrite();&lt;br /&gt;
	PORTB &amp;amp;= ~MEM_CS2;&lt;br /&gt;
	writeSPI(SPI_EEPROM_WRITE);&lt;br /&gt;
	writeWordSPI(memAddr);&lt;br /&gt;
	writeSPI(data);&lt;br /&gt;
	PORTB |= MEM_CS2;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Write &amp;quot;length&amp;quot; Bytes from the Buffer to the 2nd EEPROM. &lt;br /&gt;
 * YOU CAN ONLY WRITE MAXIMAL [SPI_EEPROM2_PAGESIZE] BYTES AT ONCE!!!&lt;br /&gt;
 * This is the Pagesize!&lt;br /&gt;
 * You can NOT cross a page boundary!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void SPI_EEPROM2_writeBytes(uint16_t startAddr, uint8_t *buffer, uint8_t length)&lt;br /&gt;
{&lt;br /&gt;
	while(SPI_EEPROM2_getStatus() &amp;amp; SPI_EEPROM_STAT_WIP);&lt;br /&gt;
	SPI_EEPROM2_enableWrite();&lt;br /&gt;
	PORTB &amp;amp;= ~MEM_CS2;&lt;br /&gt;
	writeSPI(SPI_EEPROM_WRITE);&lt;br /&gt;
	writeWordSPI(startAddr);&lt;br /&gt;
	writeBufferSPI(&amp;amp;buffer[0], length);&lt;br /&gt;
	PORTB |= MEM_CS2;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Returns EEPROM Status register - for checking if 2nd EEPROM is buisy. &lt;br /&gt;
 * Writing takes about 5ms. &lt;br /&gt;
 */&lt;br /&gt;
uint8_t SPI_EEPROM2_getStatus(void)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t status;&lt;br /&gt;
	PORTB &amp;amp;= ~MEM_CS2;&lt;br /&gt;
	writeSPI(SPI_EEPROM_RDSR);&lt;br /&gt;
	status = readSPI();&lt;br /&gt;
	PORTB |= MEM_CS2;&lt;br /&gt;
	return status;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Hinweis zum 1024 kbit-EEPROM:&lt;br /&gt;
&lt;br /&gt;
Dieses EEPROM benötigt 24-Bit Adressen und muss daher etwas anders angesprochen werden als die &amp;quot;kleineren&amp;quot; Typen bis 512 kbit.&lt;br /&gt;
Die Funktion SPI_EEPROM2_readByte() sieht für ein 1024 kbit-EEPROM z.B. so aus:&lt;br /&gt;
&amp;lt;pre&amp;gt;uint8_t SPI_EEPROM2_readByte(uint32_t memAddr)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t data;&lt;br /&gt;
	PORTB &amp;amp;= ~MEM_CS2;&lt;br /&gt;
	writeSPI(SPI_EEPROM_READ);&lt;br /&gt;
	writeSPI((uint8_t)(memAddr &amp;gt;&amp;gt; 16));&lt;br /&gt;
	writeWordSPI((uint16_t)memAddr);&lt;br /&gt;
	data = readSPI();&lt;br /&gt;
	PORTB |= MEM_CS2;&lt;br /&gt;
	return data;&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
Alle weiteren Funktionen, die EEPROM-Adressen verwenden (SPI_EEPROM2_readBytes, SPI_EEPROM2_writeByte, SPI_EEPROM2_writeBytes), müssen genau so angepasst werden.&lt;br /&gt;
&lt;br /&gt;
===== Anschlüsse =====&lt;br /&gt;
Hier wird aufgelistet, wo man auf der M32 Platine Anschlüsse nutzen kann, um sie z.B. zu weiteren Sensoren, zum USRBUS oder (weniger empfehlenswert!) direkt zu EPs, zur RP6 Base oder zur CCPRO M128 zu führen. &lt;br /&gt;
&lt;br /&gt;
====== Analoge Sensoren an ADC2/3 ======&lt;br /&gt;
[[Bild:RP6_M32_ADC23.JPG|thumb|ADC2 ADC3]]&lt;br /&gt;
Wenn man bis zu zwei analoge Sensoren (z.B. IR-Distanz-Mess-Sensoren Sharp GP2Y0A02YK 185364) direkt an die M32 anschließen möchte, dann gibt es da zwei 3-polige Kontakte, beschriftet mit VDD/GND/ADCx (x = 2..3). Hier kann man 3-polige Stiftleisten auflöten, an die dann die Sensoren angeschlossen werden.&lt;br /&gt;
&lt;br /&gt;
Man braucht dazu:&lt;br /&gt;
* 1-reihige Stiftleiste RM 2,54mm (z.B. 36-polig 732478)&lt;br /&gt;
* Zwei Keramik-Vielschicht-Kondensatoren 100nF (C16, C17); RM 2,54mm (453099)&lt;br /&gt;
* Ein Elektrolyt-Kondensator stehend 470 uF / 16V (C18); RM 3,5mm (446211)&lt;br /&gt;
* Zwei 3-polige Steckbuchsen mit Litze zum Anschluß der Sensoren&lt;br /&gt;
Man trennt von der 1-reihigen Stiftleiste zweimal 3 Kontakte ab und lötet sie auf die weiß umrahmten Kontakte (VDD/GND/ADCx; SP2 C23: ADC2, YGND8, YVDD6, ADC3, YGND7, YVDD5), anschließend C16, C17 (SP2 C1: C16*, C17*) auf ihre Plätze und zum Schluß den Elko 470 uF (C18; SP2 B1: C18*). Beim Elko auf die Polung achten: Er muss genau so sitzen wie sein Nachbar C1 (Minuspol schaut zum Beeper SND).&lt;br /&gt;
&lt;br /&gt;
Die Sensoren lötet man an die Litzen der 3-poligen Steckbuchsen und steckt diese auf die neuen Kontakte.&lt;br /&gt;
&lt;br /&gt;
Da manche Sensoren einen höheren Stromverbrauch haben, kann man die Stromversorgung an den VDD-Pins der ADC2/3-Stecker abschaltbar machen oder eine separate +5V-Spannung einspeisen. Siehe dazu den Abschnitt &amp;quot;Trennstellen - Getrennte Stromversorgung für ADC2/3&amp;quot; weiter unten!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====== ISP (In System Programming) ======&lt;br /&gt;
Der ATMEGA32 der M32 wird standardmäßig über den PROG/UART Stecker programmiert. Dazu befindet sich im Prozessor ein Bootloader-Programm. Wenn man stattdessen oder zusätzlich die ISP-Programmierung mit einem dafür geeigneten ISP-Programmier-Adapter nutzen will, kann man den Adapter an den gewinkelten ISP-Stecker auf der M32 anschließen.&lt;br /&gt;
Vorher sind aber ein paar &amp;quot;Umbauarbeiten&amp;quot; erforderlich.&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_M32_ISP.JPG|thumb|ISP]]&lt;br /&gt;
&lt;br /&gt;
Man braucht dazu:&lt;br /&gt;
* 1-reihige Stiftleiste RM 2,54mm (z.B. 36-polig 732478)&lt;br /&gt;
* Einen SMD-Widerstand 10 kOhm (406376)&lt;br /&gt;
* Eine SMD-Diode LL 4148 (140902)&lt;br /&gt;
* Eine Codierbrücke (z.B. aus Set 742902)&lt;br /&gt;
&lt;br /&gt;
Der SMD-Widerstand wird auf seinen Platz (R1; SP1 A3: R1*) neben dem XBUS2-Stecker gelötet, danach die Diode LL 4148 (D2; SP1 B3: D2*). Die Kathode (Strich) der Diode zeigt in Richtung des Quarzes (X1). Zwischen R1 und C1 befinden sich drei Lötpunkte (beschriftet mit ISP/DEBUG - BOOTLOAD; SP1 A34: YRST1..3), auf die eine 3-polige Stiftleiste gelötet werden muss. Vorher muss eine kurze Leiterbahn zwischen den Lötpunkten BOOTLOAD aufgetrennt werden. Die Leiterbahn befindet sich auf der Lötseite der Platine und muss mit einem scharfen Messer oder einem speziellen Leiterbahn-Unterbrecher zwischen den beiden Lötpunkten unterbrochen werden. Man sollte anschließend mit einem Widerstandsmeßgerät nachmessen: Es sollte keine Verbindung mehr zwischen den Lötpunkten bestehen.&lt;br /&gt;
Man trennt dann von der 1-reihigen Stiftleiste 3 Kontakte ab und lötet sie auf die beschriebenen drei Lötpunkte.&lt;br /&gt;
&lt;br /&gt;
Wenn man jetzt eine Codierbrücke auf die mit &amp;quot;BOOTLOAD&amp;quot; beschrifteten Pins steckt, bleibt alles unverändert: Die Programmierung erfolgt weiter über den PROG/UART-Stecker mithilfe des Bootloaders im Prozessor. Wird die Codierbrücke in Stellung &amp;quot;ISP/DEBUG&amp;quot; umgesteckt, kann der Prozessor mit ISP programmiert werden.&lt;br /&gt;
&lt;br /&gt;
Vorsicht: Das Bootloader-Programm kann dabei zerstört werden! Es müssen zusätzlich Fusebits des ATMEGA32 verändert werden. &lt;br /&gt;
&lt;br /&gt;
Dabei kann der Prozessor im schlimmsten Fall nicht mehr ansprechbar sein. Man sollte diesen Umbau und die ISP-Programmierung nur machen, wenn man genau weiß, was man macht!&lt;br /&gt;
&lt;br /&gt;
Eine Kopie des Bootloaders und eine Kurzanleitung zum Einstellen der Fusebits gibt es hier: &lt;br /&gt;
[http://www.arexx.com/rp6/downloads/RP6_M32_BOOTLOADER.zip RP6_M32_BOOTLOADER]&lt;br /&gt;
&lt;br /&gt;
====== JTAG ======&lt;br /&gt;
[[Bild:RP6_M32_JTAG.JPG|thumb|JTAG]]&lt;br /&gt;
Die Programmierung und ein Debuggen sind auch mit der JTAG-Schnittstelle möglich. Das ist nur zu empfehlen, wenn man Erfahrungen mitbringt, oder der Prozessor der M32 durch eine ISP-Falschprogrammierung z.B. nicht mehr ansprechbar ist.&lt;br /&gt;
Um die JTAG-Schnittstelle nutzen zu können, muss der ISP-Umbau durchgeführt worden sein und die dort beschriebene Codierbrücke auf &amp;quot;ISP/DEBUG&amp;quot; gesteckt sein. Der JTAG-Programmer kann dann an die Lötpunkte &amp;quot;JTAG&amp;quot; zwischen ISP- und I/O-Stecker angeschlossen werden.&lt;br /&gt;
&lt;br /&gt;
Man braucht dazu:&lt;br /&gt;
* 2-reihige Stiftleiste RM 2,54mm (z.B. 2x36-polig 742007)&lt;br /&gt;
Man trennt von der 2-reihigen Stiftleiste 2x5 Kontakte ab und lötet sie auf die 10 JTAG-Lötpunkte (SP2 A12: YTDI, YTDO, YTMS, YTCK, YTRST, YVDD3/4, YGND3/4, YNC). Hier kann jetzt der JTAG-Programmer z.B. mit einem 10-poligen Flachkabel-Stecker angeschlossen werden. Um das JTAG-Interface des ATMEGA32 nutzen zu können, müssen Änderungen an den Fusebits vorgenommen werden.&lt;br /&gt;
&lt;br /&gt;
Vorsicht: Man sollte die JTAG-Programmierung und Fusebit-Manipulationen nur machen, wenn man genau weiß, was man macht!&lt;br /&gt;
&lt;br /&gt;
====== USRBUS ======&lt;br /&gt;
Die 14 Kontakte der beiden USRBUS-Stecker sind auf der M32 nirgendwo angeschlossen, sondern können über die Lötpunkte Y1..Y14 mit beliebigen Punkten auf der M32 verbunden werden.&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_M32_USRBUS.JPG|thumb|USRBUS]]&lt;br /&gt;
&lt;br /&gt;
Ich würde auf Y1..Y14 eine Stiftleiste löten, damit die USRBUS-Belegung geändert werden kann.&lt;br /&gt;
&lt;br /&gt;
Man braucht dazu:&lt;br /&gt;
* 2-reihige Stiftleiste RM 2,54mm (z.B. 2x36-polig 742007)&lt;br /&gt;
* Einige Steckbuchsen mit Litze&lt;br /&gt;
&lt;br /&gt;
Man trennt von der 2-reihigen Stiftleiste 2x7 Kontakte ab und lötet sie auf die Punkte Y1..Y14 (SP2 E3: Y1..Y14) neben dem Wannenstecker USRBUS2. Wird die M32 über Flachkabel mit einem USRBUS-Stecker auf einer RP6 Experimentierplatine (EP) und/oder mit dem RP6 selbst verbunden, dann hat man mit allen mit dem USRBUS verbundenen Platinen eine direkte 14-polige Verbindung,- eben den &amp;quot;User Bus&amp;quot;. Den kann man dann nutzen, wie man will. Auf der M32 kann man mit Steckbuchsen die Pins Y1..Y14 mit anderen Pins verbinden.&lt;br /&gt;
&lt;br /&gt;
Beispiel: Verbindet man den Pin &amp;quot;ADC2&amp;quot; mit Y1 des USRBUS, dann steht der Eingang ADC2 auf allen an den USRBUS angeschlossenen Platinen an Y1 zur Verfügung. Man braucht also diesen Eingang nicht über ein eigenes Kabel auf eine EP zu führen, sondern kann dazu den USRBUS nehmen. Dadurch bleibt der Gesamtaufbau auf dem RP6 übersichtlich und komplett trennbar (man braucht nur die Stecker XBUS und USRBUS abzuziehen!).&lt;br /&gt;
&lt;br /&gt;
Wichtig: Man sollte gut dokumentieren, wie man den USRBUS am RP6 (vorn und hinten getrennt!), auf EPs und der M32/M128 benutzt! Sonst kann es bei einer anderen Anordnung von EPs zu USRBUS Konflikten/Kurzschlüssen kommen.&lt;br /&gt;
&lt;br /&gt;
====== Schieberegister kaskadieren ======&lt;br /&gt;
[[Bild:RP6_M32_SPI.JPG|thumb|SPI]]&lt;br /&gt;
Auf der M32 wird ein 8-Bit Schieberegister-Baustein (IC3: 74HC4094D) dazu gebraucht, vier Status-LEDs (LED1..LED4) und ein LCD (am Stecker LCD) anzusteuern. Durch Schieberegister kann man Port-Pins gewinnen, wenn die Pins des Prozessors nicht ausreichen.&lt;br /&gt;
&lt;br /&gt;
Solche Schieberegister kann man &amp;quot;kaskadieren&amp;quot;, d.h. weitere identische Bausteine einbauen, die weitere Port-Pins zur Verfügung stellen. Wenn man zusätzliche 74HC4094 einsetzen will, wird man das am besten auf einer EP aufbauen. Die Anschlüsse für diese Schieberegister werden auf der M32 an einer 6-poligen Reihe von Lötpunkten (beschriftet mit MISO, STR, MOSI, SCK, QS, QS*; SP1 D3: YQS1/2, YMOSI, YSCK, YSTR, YMISO) links von IC3 zur Verfügung gestellt.&lt;br /&gt;
&lt;br /&gt;
Wenn man diese 6 Signalleitungen auf eine EP führen will, gibt es dafür zwei Möglichkeiten:&lt;br /&gt;
* a) Direkte 6-polige Kabelverbindung von den oben beschriebenen Lötpunkten zur EP&lt;br /&gt;
* b) Nutzung des USRBUS, um die 6 Signale zur EP zu führen&lt;br /&gt;
Wenn man im Abschnitt &amp;quot;[[RP6#USRBUS|USRBUS]]&amp;quot; den entsprechenden Umbau gemacht hat, würde ich b) empfehlen! Man könnte dafür eine 6-polige Stiftleiste auf die o.g. Lötpunkte auflöten und 1:1 z.B. mit den Pins Y4, Y6, Y8, Y10, Y12, Y14 des USRBUS verbinden. Dann kann man auf der EP weitere Schieberegister- und SPI-Bausteine (z.B. SPI-EEPROMs, [http://www.pollin.de/shop/dt/MDU5OTgxOTk-/Bausaetze_Module/Module/Funkmodul_RFM12_433_Sende_Empfangsmodul.html RFM12 Transceiver] o.ä.) aufbauen.&lt;br /&gt;
&lt;br /&gt;
Man braucht dazu:&lt;br /&gt;
* 1-reihige Stiftleiste RM 2,54mm (z.B. 36-polig 732478)&lt;br /&gt;
* Steckbuchsen mit Litze&lt;br /&gt;
Man trennt von der 1-reihigen Stiftleiste 6 Kontakte ab und lötet sie auf die beschriebenen sechs Lötpunkte auf der M32. Mit den Steckbuchsen mit Litze wird dann die Verbindung entweder direkt zur EP (Option a) oder über den USRBUS zur EP (Option b) hergestellt.&lt;br /&gt;
&lt;br /&gt;
====== VDD/GND/+UB Anschluß ======&lt;br /&gt;
[[Bild:RP6_M32_VDDGNDUB.JPG|thumb|RP6 M32 VDD GND +UB]]&lt;br /&gt;
VDD, GND und +UB (SP2 C3: YUB1, YGND1/2/5, YVDD1/2) kann man auf der M32 an diesen Lötpunkten abnehmen.&lt;br /&gt;
&lt;br /&gt;
Natürlich kann man hier auch Stiftleisten auflöten.&lt;br /&gt;
&lt;br /&gt;
Auf der anderen Platinenseite (zwischen dem USRBUS1 und ISP Stecker) befinden sich zusätzlich noch 2 weitere Lötpunkte, an denen man VDD und GND kontaktieren kann.&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;
&lt;br /&gt;
====== Serielle Schnittstelle ======&lt;br /&gt;
[[Bild:RP6_M32_RST.JPG|thumb|RP6 M32 RST]]&lt;br /&gt;
Neben dem PROG/UART Stecker befinden sich 5 Lötpunkte mit den Signalen RST, TX, RX, GND, VDD (SP2 BC3: YRX, YTX, YRST, YVDD, YGND). Hier kann z.B. eine 5-polige Stiftleiste aufgelötet werden, um einen Anschluß an die serielle Schnittstelle zu ermöglichen.&lt;br /&gt;
 &lt;br /&gt;
Von diesen 5 Lötpunkten könnte z.B. auch eine Verbindung zum USRBUS hergestellt werden, um die serielle Schnittstelle der M32 auf EPs zu führen.&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;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====== MEM_CS2 ======&lt;br /&gt;
[[Bild:RP6_M32_MEM_CS2.JPG|thumb|RP6 M32 MEM_CS2]]&lt;br /&gt;
MEM_CS2 (M32 Microcontroller Pin PB1) kann man am IC5-Sockel an Pin 1 (SP1 A1: IC5*, Pin 1) kontaktieren. Falls IC5 nicht eingesetzt werden soll, kann man hier durch Einstecken eines Kabels in Pin 1 des IC5-Sockels PB1 nutzen und z.B. zum USRBUS führen.&lt;br /&gt;
&lt;br /&gt;
===== Mess-/Kontaktpunkte =====&lt;br /&gt;
Hier geht es um Kontaktpunkte, an denen man z.B. den Logik-Pegel (High/Low) oder eine analoge Spannung messen kann. Natürlich kann man die Signale auch zur Weiterleitung auf eine EP kontaktieren, dies wird man aber normalerweise nicht brauchen.&lt;br /&gt;
&lt;br /&gt;
====== M-Signal ======&lt;br /&gt;
[[Bild:RP6_M32_M_SIGNAL.JPG|thumb|RP6 M32 M-Signal]]&lt;br /&gt;
An diesem Messpunkt (SP1 E3: YM_SIGNAL) neben D1 kann man die Ausgangsspannung des Mikrofon-Verstärkers IC4 (SP1 E3: IC4) messen oder z.B. mit einem Oszilloskop darstellen.&lt;br /&gt;
&lt;br /&gt;
===== Trennstellen =====&lt;br /&gt;
An diesen Stellen können Leiterbahnen unterbrochen werden, um Funktionen zu deaktivieren oder anders zu nutzen. &lt;br /&gt;
&lt;br /&gt;
====== Getrennte Stromversorgung für ADC2/3 ======&lt;br /&gt;
Wenn man für die analogen Sensoren an ADC2/3 (siehe Abschnitt &amp;quot;Anschlüsse - Analoge Sensoren an ADC2/3&amp;quot; weiter oben!) eine GETRENNTE Stromversorgung vorsehen will und/oder mit Codierbrücke (oder MOSFET) die Stromversorgung abschaltbar machen möchte, muss man erst Vorarbeit leisten.&lt;br /&gt;
[[Bild:RP6_M32_SV.jpg|thumb|RP6 M32 SV]]&lt;br /&gt;
&lt;br /&gt;
Man braucht dazu:&lt;br /&gt;
* 1-reihige Stiftleiste RM 2,54mm (z.B. 36-polig 732478)&lt;br /&gt;
* Evtl.: Eine Codierbrücke (z.B. aus Set 742902)&lt;br /&gt;
* Evtl.: Eine 1-polige Steckbuchse mit Litze zur ext. Stromversorgung&lt;br /&gt;
Es muss eine kurze Leiterbahn zwischen den Punkten &amp;quot;SV1&amp;quot; und &amp;quot;SV2&amp;quot; (SP2 B2: SV1, SV2) aufgetrennt werden. Die Leiterbahn befindet sich auf der Lötseite der Platine und muss mit einem scharfen Messer oder einem speziellen Leiterbahn-Unterbrecher zwischen den beiden Lötpunkten unterbrochen werden. Man sollte anschließend mit einem Widerstandsmeßgerät zwischen SV1 und SV2 nachmessen: Es sollte keine Verbindung mehr bestehen. Jetzt trennt man von der 1-reihigen Stiftleiste 2 Kontakte ab und lötet sie auf die Punkte SV1/SV2.&lt;br /&gt;
&lt;br /&gt;
Man kann hier zunächst eine Codierbrücke aufstecken. Damit versorgt der RP6 Akku die Sensoren mit 5V an den Pins VDD. Möchte man später eine getrennte 5V-Spannung anlegen, zieht man einfach die Codierbrücke ab und speist die externe 5V-Spannung (mit einer 1-poligen Steckbuchse) am Pin SV2 ein. Achtung: An Pin SV1 wird dann nichts angeschlossen!&lt;br /&gt;
&lt;br /&gt;
Anstelle der Codierbrücke kann man natürlich auch einen MOSFET anschließen, um die Sensoren per Software abschalten zu können.&lt;br /&gt;
&lt;br /&gt;
====== Interrupt-Zuordnung ändern ======&lt;br /&gt;
Am XBUS stehen vier Interrupt-Pins (genannt INT1..INT3, INTU) zur Verfügung. INT1 ist auf der RP6 Base mit PA4 verbunden, auf der M32 mit PD2 (Prozessor INT0), auf der M128 mit PE5 (Prozessor INT5) und auf der [[RP6v2#RP6v2_M256_WiFi_Platine|RP6 M256 WiFi]] mit PJ3 (Prozessor PCINT12). Diese Tabelle zeigt die Verbindung aller Interruptleitungen auf den Platinen (RP6 Base, M32, M128, M256 WiFi) über den XBUS:&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |XBUS Pin&lt;br /&gt;
 |XBUS INTx&lt;br /&gt;
 |RP6 Base Pin&lt;br /&gt;
 |RP6 Base INTx&lt;br /&gt;
 |RP6 M32 Pin&lt;br /&gt;
 |RP6 M32 INTx&lt;br /&gt;
 |RP6 M128 Pin&lt;br /&gt;
 |RP6 M128 INTx&lt;br /&gt;
 |RP6 M256 Pin&lt;br /&gt;
 |RP6 M256 INTx&lt;br /&gt;
 |-&lt;br /&gt;
 |8&lt;br /&gt;
 |INT1&lt;br /&gt;
 |PA4&lt;br /&gt;
 |kein&lt;br /&gt;
 |PD2&lt;br /&gt;
 |INT0&lt;br /&gt;
 |PE5&lt;br /&gt;
 |INT5&lt;br /&gt;
 |PJ3&lt;br /&gt;
 |PCINT12&lt;br /&gt;
 |-&lt;br /&gt;
 |11&lt;br /&gt;
 |INT2&lt;br /&gt;
 |n.c.&lt;br /&gt;
 |&lt;br /&gt;
 |PD3 *&lt;br /&gt;
 |INT1&lt;br /&gt;
 |n.c.&lt;br /&gt;
 |&lt;br /&gt;
 |PJ6&lt;br /&gt;
 |PCINT15&lt;br /&gt;
 |-&lt;br /&gt;
 |9&lt;br /&gt;
 |INT3&lt;br /&gt;
 |n.c.&lt;br /&gt;
 |&lt;br /&gt;
 |PB2 *&lt;br /&gt;
 |INT2&lt;br /&gt;
 |PE6&lt;br /&gt;
 |INT6&lt;br /&gt;
 |PJ5&lt;br /&gt;
 |PCINT14&lt;br /&gt;
 |-&lt;br /&gt;
 |7&lt;br /&gt;
 |INTU&lt;br /&gt;
 |n.c.&lt;br /&gt;
 |&lt;br /&gt;
 |n.c.    *&lt;br /&gt;
 |&lt;br /&gt;
 |n.c.&lt;br /&gt;
 |&lt;br /&gt;
 |PJ4&lt;br /&gt;
 |PCINT13&lt;br /&gt;
 |-&lt;br /&gt;
|}&lt;br /&gt;
'''Zu *:''' Standard-Belegung. Ggf. abhängig von der nachfolgend beschriebenen Interrupt-Zuordnung!&lt;br /&gt;
&lt;br /&gt;
Auf der M32 kann man die Interrupt-Zuordnung für INT2, INT3 und INTU durch drei Codierbrücken (beschriftet mit I2-INTU, INT3-I3, I2-INT2; SP2 A3: YINT2/3/U, YI2_1/2, YI3) ändern.&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_M32_INTx.JPG|thumb|INTx]]&lt;br /&gt;
&lt;br /&gt;
Man braucht dazu:&lt;br /&gt;
* 2-reihige Stiftleiste RM 2,54mm (z.B. 2x36-polig 742007)&lt;br /&gt;
* Drei Codierbrücken (z.B. aus Set 742902)&lt;br /&gt;
Vor dem Auflöten der Stiftleiste müssen zwei kurze Leiterbahnen zwischen zwei Lötpunkten aufgetrennt werden, und zwar zwischen den Lötpunkten INT3-I3 und I2-INT2. Die Leiterbahnen müssen mit einem scharfen Messer oder einem speziellen Leiterbahn-Unterbrecher zwischen den beiden Lötpunkten unterbrochen werden. Man sollte anschließend mit einem Widerstandsmeßgerät nachmessen: Es sollte keine Verbindung mehr zwischen INT3-I3 und I2-INT2 bestehen. Man trennt dann von der 2-reihigen Stiftleiste 2x3 Kontakte ab und lötet sie auf das weiß umrahmte Feld mit der o.g. Beschriftung.&lt;br /&gt;
&lt;br /&gt;
Hier kann man auf INT3-I3 und I2-INT2 je eine Codierbrücke aufstecken, wenn man die Standard-Belegung beibehalten will. Steckt man auf I2-INTU eine Codierbrücke, dann ist INTU des XBUS mit Pin PD3 (I2) der M32 verbunden.&lt;br /&gt;
&lt;br /&gt;
'''Hinweis:''' Man kann auf die 6-polige Stiftleiste auch Codierbrücken QUER zur eigentlichen (horizontalen) Richtung aufsetzen. Dadurch kann jede der 3 Interruptleitungen des XBUS (INT2, INT3, INTU) mit jedem der 2 Interrupt Pins der M32 (PD3, PB2) verbunden werden.&lt;br /&gt;
&lt;br /&gt;
Wenn man keine der Codierbrücken aufsteckt, sind die Pins PD3 (I2) und PB2 (I3) des M32-Prozessors nicht mehr mit dem XBUS verbunden und können anders verwendet werden. Auf der M32 kann man dann z.B. auch andere Verbindungen zum XBUS herstellen, indem man auf die Pins INT2, INT3 oder INTU Kabelverbindungen aufsteckt.&lt;br /&gt;
&lt;br /&gt;
====== ADC0 und ADC1 frei nutzen ======&lt;br /&gt;
Auf der M32 ist ADC0 fest mit dem Mikrofon (MIC) und ADC1 mit den Tastern T1..T5 (KEYPAD) verbunden. Wenn man diese ADC-Eingänge für andere Sensoren benötigt, kann man das Mikrofon und die Taster von den Eingängen abtrennen.&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_M32_MIC_KEY.JPG|thumb|MIC_KEYPAD]]&lt;br /&gt;
&lt;br /&gt;
Man braucht dazu:&lt;br /&gt;
* 1-reihige Stiftleiste RM 2,54mm (z.B. 36-polig 732478)&lt;br /&gt;
* Eine Codierbrücke (z.B. aus Set 742902)&lt;br /&gt;
&lt;br /&gt;
MIC/ADC0:&lt;br /&gt;
Es muss eine kurze Leiterbahn zwischen zwei Lötpunkten aufgetrennt werden, die sich zwischen R2 und C19 befinden (SP1 D4: YM1, YM2). Die Leiterbahn muss mit einem scharfen Messer oder einem speziellen Leiterbahn-Unterbrecher zwischen den beiden Lötpunkten unterbrochen werden. Man sollte anschließend mit einem Widerstandsmeßgerät nachmessen: Es sollte keine Verbindung mehr bestehen. Vorsicht: Nicht R2 beschädigen! Damit ist das Mikrofon auf der M32 ohne Funktion und ADC0 kann anders genutzt werden. ADC0 ist dann am oberen Lötpunkt zwischen R2 und C19 verfügbar, dort müßte eine Kabelverbindung angelötet werden.&lt;br /&gt;
Soll das Mikrofon später doch wieder an ADC0 angeschlossen werden, verbindet man die beiden Lötpunkte zwischen R2 und C19 einfach mit etwas Lötzinn oder mit einem SMD Null Ohm Widerstand.&lt;br /&gt;
&lt;br /&gt;
KEYPAD/ADC1:&lt;br /&gt;
Es muss eine kurze Leiterbahn zwischen zwei Lötpunkten aufgetrennt werden, die sich unterhalb von R15 befinden (SP1 D2: YKP1, YKP2). Die Leiterbahn befindet sich auf der Lötseite der Platine und muss mit einem scharfen Messer oder einem speziellen Leiterbahn-Unterbrecher zwischen den beiden Lötpunkten unterbrochen werden. Man sollte anschließend mit einem Widerstandsmeßgerät nachmessen: Es sollte keine Verbindung mehr bestehen. Jetzt trennt man von der 1-reihigen Stiftleiste 2 Kontakte ab und lötet sie auf die beiden Punkte unterhalb von R15. Hier kann man jetzt eine Codierbrücke aufstecken, wenn man die Taster weiter benutzen will. Wenn die Brücke abgezogen ist, sind die Taster ohne Funktion und ADC1 kann anders genutzt werden. ADC1 ist dann am linken Pin der 2-poligen Stiftleiste unterhalb von R15 verfügbar.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== RP6 CCPRO M128 Platine===&lt;br /&gt;
&lt;br /&gt;
[[Bild:CCPRO M128 k-1-.jpg|Das CCPRO M128]]&lt;br /&gt;
&lt;br /&gt;
====Beschreibung====&lt;br /&gt;
Die M128 (191563) ergänzt das RP6 Roboter System um einen leistungsfähigen ATMEGA 128 Prozessor.&lt;br /&gt;
Es sind ein I²C Temperatursensor; 19 I/O-Ports, davon 8 ADCs, 3 PWM (Servos) und 2 I/Os für einen UART; 1 Beeper; 5 Status-LEDs; 1 LC-Display-Port sowie ein freier Steckplatz für ein EEPROM verfügbar.&lt;br /&gt;
&lt;br /&gt;
====Technische Daten====&lt;br /&gt;
{|  {{Blauetabelle}} &lt;br /&gt;
|'''Mikrocontroller:'''&lt;br /&gt;
|Steckplatz für ein C-Control PRO MEGA128 Modul mit einem ATMEGA 128 ([https://www.conrad.de/de/p/c-control-prozessor-unit-mega-128-pro-198219.html 198219])&lt;br /&gt;
|-&lt;br /&gt;
|'''Speicher:'''&lt;br /&gt;
|128 kB [[Flash]]-Speicher, davon 4 kB bereits vom Bootloader belegt&amp;lt;br/&amp;gt;&lt;br /&gt;
4 kB SRAM intern&amp;lt;br/&amp;gt; &lt;br /&gt;
64 kB SRAM extern&amp;lt;br/&amp;gt;&lt;br /&gt;
4 kB [[EEPROM]]&lt;br /&gt;
|-&lt;br /&gt;
|'''Programmierung:'''&lt;br /&gt;
|Über CCPRO-IDE&lt;br /&gt;
|-&lt;br /&gt;
|'''Vorhandene Sensoren:'''&lt;br /&gt;
|1 12bit I²C Temperatursensor &amp;lt;br/&amp;gt;&lt;br /&gt;
19 I/O-Ports, davon 8 ADCs, 3 PWM (Servos) und 2 I/Os für eine weitere serielle Schnittstelle (UART)&lt;br /&gt;
|-&lt;br /&gt;
|'''Vorhandene Aktoren:'''&lt;br /&gt;
|1 Beeper&amp;lt;br/&amp;gt;&lt;br /&gt;
5 Status-LEDs&amp;lt;br/&amp;gt;&lt;br /&gt;
1 LC-Display-Port&amp;lt;br/&amp;gt;&lt;br /&gt;
1 Sockel für ein I²C-Bus EEPROM vom Typ 24(L)Cxxx&lt;br /&gt;
|-&lt;br /&gt;
|'''Abmessungen:'''&lt;br /&gt;
|(L &amp;amp;times; B &amp;amp;times; H) 112 &amp;amp;times; 90 &amp;amp;times; 21 mm&lt;br /&gt;
|-&lt;br /&gt;
|'''Ausführung:'''&lt;br /&gt;
|Fertig aufgebautes Erweiterungsmodul&lt;br /&gt;
|-&lt;br /&gt;
|'''Stromversorgung:'''&lt;br /&gt;
|6 AA NiMH Akkus (über die RP6 Base)&lt;br /&gt;
|-&lt;br /&gt;
|'''Hersteller:'''&lt;br /&gt;
|Arexx Niederlande&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Umbauoptionen====&lt;br /&gt;
Auf der CCPRO M128 ([http://www.conrad.de/ce/de/product/191563/Arexx-RP6-CC-PRO-MEGA128-Erweiterungssatz 191563]) kann leider nicht so viel umgebaut werden:&lt;br /&gt;
&lt;br /&gt;
* I2C-EEPROM&lt;br /&gt;
* Freie Nutzung von PORTA* und PORTC*&lt;br /&gt;
* USRBUS&lt;br /&gt;
* A16-/PD4-Nutzung&lt;br /&gt;
&lt;br /&gt;
Im Text gibt es Verweise auf den Schaltplan der CCPRO M128 (RP6_CCPRO_M128_Schematic.PDF) in der Form: (SP2 B1: Bauteil).  Dies bedeutet, dass man das Bauteil auf Blatt 2 des M128-Schaltplans im Feld B1 finden kann.&lt;br /&gt;
&lt;br /&gt;
Bei den Materialangaben ist öfter die Rede von &amp;quot;Steckbuchsen mit Litze&amp;quot;. Diese Steckbuchsen mit angelöteter Litze können auf die ein- oder zweireihigen Stiftleisten aufgesteckt werden. Leider gibt es sie nicht (mehr) fertig konfektioniert bei CONRAD. Die einreihigen Steckbuchsen (RM 2,54mm) kann man aber z.B. bei [http://www.elv.de/output/controller.aspx ELV] bekommen: 2-polig (68-016635), 3-polig (68-022503) und 5-polig (68-023073). An sie muss man dann noch Litzen in der entsprechenden Länge selbst anlöten.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=====I2C-EEPROM=====&lt;br /&gt;
Zum Einsetzen eines I2C-EEPROMS (IC6; SP2 C1: IC6) braucht man nichts umzubauen. Man kauft einfach ein passendes EEPROM des Typs 24(L)Cxxxx-P und setzt es auf seinen Sockel, Kerbe zum oberen Platinenrand.&lt;br /&gt;
&lt;br /&gt;
Mögliche Typen (erhältlich z.B. bei [http://www.digikey.de/ Digi-Key] oder bei [http://www.reichelt.de./ Reichelt]):&lt;br /&gt;
* AT24C128  (AT24C128-10PU-2.7-ND)&lt;br /&gt;
* AT24C256  (AT24C256-10PU-2.7-ND)&lt;br /&gt;
* AT24C512  (AT24C512-10PU-2.7-ND)&lt;br /&gt;
* AT24C1024 (AT24C1024-10PI-2.7-ND)&lt;br /&gt;
&lt;br /&gt;
=====Anschlüsse=====&lt;br /&gt;
Hier wird aufgelistet, wo man auf der M128 Platine Anschlüsse nutzen kann, um sie z.B. zu weiteren Sensoren, zum USRBUS oder (weniger empfehlenswert!) direkt zu EPs, zur RP6 Base oder zur M32 zu führen. &lt;br /&gt;
&lt;br /&gt;
======Freie Nutzung von PORTA* und PORTC*======&lt;br /&gt;
Um PORTA* und PORTC* frei nutzen zu können (für weitere I/O-Ports), muss man auf das externe SRAM verzichten, was nicht sehr ratsam ist. Mehr I/O-Ports kann man alternativ durch I/O Expander gewinnen. Falls man das SRAM trotzdem deaktivieren will, hier die Anleitung.&lt;br /&gt;
&lt;br /&gt;
Für den Umbau braucht man:&lt;br /&gt;
* Wannenstecker 2x5-polig gerade RM 2,54mm (z.B. [http://www.reichelt.de./ Reichelt] WSL 10G)&lt;br /&gt;
* 1-reihige Stiftleiste RM 2,54mm (z.B. 36-polig 732478)&lt;br /&gt;
* Eine Codierbrücke (z.B. aus Set 742902)&lt;br /&gt;
[[Bild:RP6_M128_PortA.JPG|thumb|PORTA*]]&lt;br /&gt;
&lt;br /&gt;
Für die Bestückung von PORTA* (SP2 AB2: Stecker PORTA*) lötet man den Wannenstecker hier (siehe Abb. PORTA*) auf.&lt;br /&gt;
[[Bild:RP6_M128_PortC.JPG|thumb|PORTC*]]&lt;br /&gt;
&lt;br /&gt;
Für die Bestückung von PORTC* (SP1 A2: PC0..7, YGND1) trennt man von der 1-reihigen Stiftleiste 9 Kontakte ab und lötet sie auf die PORTC*-Lötpunkte (siehe Abb. PORTC*).&lt;br /&gt;
&lt;br /&gt;
Dann muss noch der SRAM-Enable Jumper (SP1 EF1: Y27..29) bestückt werden:&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_M128_EN_SRAM.JPG|EN_SRAM]]&lt;br /&gt;
&lt;br /&gt;
Man trennt von der 1-reihigen Stiftleiste 3 Kontakte ab und lötet sie auf die abgebildeten Lötpunkte. Vorher muss eine Leiterbahn auf der Lötseite der Platine zwischen den ENABLE-Lötpunkten aufgetrennt werden.&lt;br /&gt;
Wenn das SRAM wie bisher genutzt werden soll, steckt man die Codierbrücke auf die Stellung &amp;quot;ENABLE&amp;quot;. Will man stattdessen Port A und Port C frei nutzen (und damit auf SRAM verzichten!), kommt die Codierbrücke auf &amp;quot;DISABLE&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
======USRBUS======&lt;br /&gt;
Auf die 14 Kontakte neben dem Wannenstecker USRBUS2 ist noch nichts gelötet.&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_M128_USRBUS.JPG|thumb|USRBUS]]&lt;br /&gt;
&lt;br /&gt;
Ich würde auf Y1..Y14 eine Stiftleiste löten, damit die USRBUS-Belegung geändert werden kann.&lt;br /&gt;
&lt;br /&gt;
Man braucht dazu:&lt;br /&gt;
* 2-reihige Stiftleiste RM 2,54mm (z.B. 2x36-polig 742007)&lt;br /&gt;
* Einige Steckbuchsen mit Litze&lt;br /&gt;
&lt;br /&gt;
Man trennt von der 2-reihigen Stiftleiste 2x7 Kontakte ab und lötet sie auf die Punkte Y1..Y14 (SP2 E234: Y1..Y14) neben dem Wannenstecker USRBUS2. Wird die M128 über Flachkabel mit einem USRBUS-Stecker auf einer RP6 Experimentierplatine (EP) und/oder mit dem RP6 selbst verbunden, dann hat man mit allen mit dem USRBUS verbundenen Platinen eine direkte 14-polige Verbindung,- eben den &amp;quot;User Bus&amp;quot;. Den kann man dann nutzen, wie man will. Auf der M128 kann man mit Steckbuchsen die Pins Y1..Y14 mit anderen Pins verbinden.&lt;br /&gt;
&lt;br /&gt;
Beispiel: Verbindet man den Pin &amp;quot;ADC4&amp;quot; mit Y1 des USRBUS, dann steht der Eingang ADC4 auf allen an den USRBUS angeschlossenen Platinen an Y1 zur Verfügung. Man braucht also diesen Eingang nicht über ein eigenes Kabel auf eine EP zu führen, sondern kann dazu den USRBUS nehmen. Dadurch bleibt der Gesamtaufbau auf dem RP6 übersichtlich und komplett trennbar (man braucht nur die Stecker XBUS und USRBUS abzuziehen!).&lt;br /&gt;
&lt;br /&gt;
Wichtig: Man sollte gut dokumentieren, wie man den USRBUS am RP6 (vorn und hinten getrennt!), auf EPs und der M128 benutzt! Sonst kann es bei einer anderen Anordnung von EPs zu USRBUS Konflikten/Kurzschlüssen kommen.&lt;br /&gt;
&lt;br /&gt;
======IC5 ALERT======&lt;br /&gt;
[[Bild:RP6_M128_IC5_ALERT.JPG|thumb|IC5 ALERT]]&lt;br /&gt;
Dieser Lötpunkt (SP2 C2: AL) neben IC5 ist der Anschluß ALERT (Pin 3) des I2C-Temperatursensors TCN75A (SP2 C2: IC5).&lt;br /&gt;
&lt;br /&gt;
Dies ist ein Open-Drain Ausgang, der ein Alarm-Signal ausgibt, wenn die Temperatur die eingestellten Grenzen über-/unterschreitet (siehe auch Datenblatt des Sensors (TCN75A.pdf), Abschnitt 5.3.4!). Wenn man ALERT auf einen Eingang des Microcontrollers führen will, muß man auch noch einen Pullup-Widerstand vorsehen oder den internen Pullup des uC-Eingangs aktivieren.&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;
======VDD/GND Anschluß======&lt;br /&gt;
[[Bild:RP6_M128_VDDGND.JPG|thumb|VDD GND]]&lt;br /&gt;
Auf der CCPRO M128 gibt es 2 Lötpunkte (SP1 E34: YVDD3, YGND4) zwischen R5 und C7 bzw. direkt neben der Codierbrücke (SP1 E3: YL9, YL10) zum Deaktivieren von LED5.&lt;br /&gt;
&lt;br /&gt;
Hier könnte man VDD und GND kontaktieren. VDD ist der Lötpunkt, der näher an R5 liegt.&lt;br /&gt;
&lt;br /&gt;
=====Trennstellen=====&lt;br /&gt;
An diesen Stellen können Leiterbahnen unterbrochen werden, um Funktionen zu deaktivieren oder anders zu nutzen. &lt;br /&gt;
&lt;br /&gt;
======A16-/PD4-Nutzung======&lt;br /&gt;
&lt;br /&gt;
[[Bild:v2RP6_M128_A16.JPG|thumb|A16/PD4]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Auf der CCPRO M128 gibt es ein 3-poliges Feld von Lötpunkten (SP2 AB1: PD4, A16, GND) unter dem CCPRO MEGA128 Modul (IC1). Standardmässig ist A16 des SRAM (IC3) hier auf GND gelegt. Damit kann man PD4 des Prozessors (ICP1) frei nutzen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Will man A16 des SRAM mit PD4 schaltbar machen, muss man eine Leiterbahn auf der Bestückungsseite zwischen den oberen zwei der drei Lötpunkte auftrennen und die anderen (unteren) beiden Lötpunkte mit etwas Lötzinn oder einem SMD Null Ohm Widerstand verbinden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der Sinn dieses Umbaus besteht darin, dass man danach anstelle von 64kB nun die vollen 128kB SRAM des IC3 adressieren kann. Man muss dann aber PD4 selbst schalten, da C-Control PRO ab Version 1.50 nur 64kB ext. SRAM ansteuern kann. Immerhin könnte man dann 2 Blöcke à je 64kB nutzen und mit PD4 zwischen beiden Blöcken umschalten.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ob CCPRO damit klar kommt: Wohl kaum! Ich würde daher diesen Umbau nicht durchführen.&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Zubehör und Ersatzteile ==&lt;br /&gt;
Von [http://www.conrad.de/ce/ CONRAD] gibt es z.B. &lt;br /&gt;
&lt;br /&gt;
* das LC- ([http://www.conrad.de/ce/de/product/190911/LC-DISPLAY-16-X-2-KONFEKTIONIERT 190911] AUSVERKAUFT!) oder Backlight-Display ([http://www.conrad.de/ce/de/product/191621/DISPLAY-RP5RP6-BLAU-MIT-BACKLIGHT 191621] AUSVERKAUFT!), welche an die M32, an die CCPRO M128 und an die M256 WiFi angeschlossen werden können,&lt;br /&gt;
* einen IR-Ball ([http://www.conrad.de/ce/de/product/191437/INFRAROT-BALL-FUeR-ROBOTER-FUssBALL 191437] AUSVERKAUFT!),&lt;br /&gt;
* einen Graustufen-Boden-Sensor ([http://www.conrad.de/ce/de/product/191599/GRAUSTUFEN-BODEN-SENSOR-FUeR-FUssBALLROBOT 191599] AUSVERKAUFT!),&lt;br /&gt;
* eine IR-Fernbedienung Promo 8 ([http://www.conrad.de/ce/de/product/340720/PROMO-8-UNIVERSALFERNBEDIENUNG 340720] AUSVERKAUFT!) oder Vivanco UR 89 ([http://www.conrad.de/ce/de/product/351013/VivancoUR-89-Fernbedienung-8-Geraete 351013] AUSVERKAUFT!),&lt;br /&gt;
* Ersatzräder ([http://www.conrad.de/ce/de/product/191307/ANTRIEBSRAD-RP5RP6 191307] AUSVERKAUFT!),&lt;br /&gt;
* Ersatzzahnräder ([http://www.conrad.de/ce/de/product/191346/SCHRAeG-ZAHNRAeDERSATZ-RP5RP6 191346]) und&lt;br /&gt;
* Ersatzraupen ([http://www.conrad.de/ce/de/product/191333/RAUPENSATZ-RP5RP6 191333] AUSVERKAUFT!).&lt;br /&gt;
&lt;br /&gt;
===Displays===&lt;br /&gt;
Die vorkonfektionierten Displays kann man zum Ausgeben von Texten, Sensordaten und kleinen Animationen benutzen. Sie können an die M32, an die CCPRO M128 und an die M256 WiFi angeschlossen werden.&lt;br /&gt;
&lt;br /&gt;
Diese 16x2 Zeichen Displays sind bisher lieferbar:&lt;br /&gt;
&lt;br /&gt;
* LC-Display ([http://www.conrad.de/ce/de/product/190911/LC-DISPLAY-16-X-2-KONFEKTIONIERT 190911])&lt;br /&gt;
* OLED-Display (197622)&lt;br /&gt;
* Backlight-Display AREXX RP-DSP88 ([http://www.conrad.de/ce/de/product/191621/DISPLAY-RP5RP6-BLAU-MIT-BACKLIGHT 191621])&lt;br /&gt;
&lt;br /&gt;
Das LCD ist seit September 2018 bei CONRAD ausverkauft; zeitweise (2007/08) gab es unter dieser Bestellnummer eine Version, die zu klein (66 x 37mm) war, um sie auf der M32, der CCPRO M128 oder der M256 WiFi zu montieren.&lt;br /&gt;
&lt;br /&gt;
Das OLED-Display ist aktuell (April 2012) nicht mehr lieferbar.&lt;br /&gt;
&lt;br /&gt;
Das zuletzt ausschließlich nur noch erhältliche blaufarbige Backlight-Display ist seit Mai 2020 bei CONRAD ausverkauft.&lt;br /&gt;
&lt;br /&gt;
Diese Displays können mit 4 M3-Abstandbolzen 25 mm ([http://www.conrad.de/ce/de/product/526665/Abstandsbolzen1-x-Aussengewinde1-x-InnengewindeMessing-vernickelt-Schluesselweite-55-mm Bestell-Nr. 526665]) und 4 Muttern M3 ([http://www.conrad.de/ce/de/product/815624/TOOLCRAFT-Sechskant-Muttern-DIN-934-934-Stahl-verzinkt-M3-100-St z.B. aus 815624]), sowie 4 Schrauben M3 ([http://www.conrad.de/ce/de/product/815322/TOOLCRAFT-Linsenkopfschrauben-mit-Kreuzschlitz-DIN-7985-7985-6-mm-Stahl-verzinkt-Guete-48-M3-100-St z.B. aus 815322]) auf der M32, der CCPRO M128 oder der M256 WiFi befestigt werden. Leider sind die Befestigungslöcher der Displays zu klein für ein M3-Gewinde, so dass man die Löcher sehr vorsichtig auf 3..3,2 mm erweitern muss.&lt;br /&gt;
&lt;br /&gt;
===IR-Ball===&lt;br /&gt;
Den IR-Ball (AREXX IRB-35, AUSVERKAUFT!) kann man benutzen, um mit dem RP6 Fußball oder Ähnliches zu spielen. Der Ball kann dann von den IR-Sensoren des RP6 erkannt und geortet werden.&lt;br /&gt;
&lt;br /&gt;
===Graustufen-Boden-Sensor===&lt;br /&gt;
Der Graustufen-Boden-Sensor (AREXX ARX-GS7) dient zur Orientierung eines Roboters auf einem Fußballfeld, das in bestimmten Grauabstufungen eingefärbt ist (CONRAD 191404  AUSVERKAUFT!). Dieser Fußballfeld-Aufkleber (AREXX ARX-FF008) ist bei CONRAD und bei [http://www.elv.de ELV] (Artikel-Nummer 68-101831) ausverkauft.&lt;br /&gt;
&lt;br /&gt;
===IR-Fernbedienung===&lt;br /&gt;
[[Bild:RP6_RC.jpg|thumb|2 RC5 Fernbedienungen]]&lt;br /&gt;
Mit einer Universal-IR-Fernbedienung, die den RC5-IR-Code senden kann, kann der RP6 wie ein ferngesteuertes &amp;quot;Auto&amp;quot; verwendet werden. Im Beispielprogramm &amp;quot;Example_08_TV_REMOTE&amp;quot; im Ordner der RP6-Base-Demos wird das noch genauer erläutert.&lt;br /&gt;
&lt;br /&gt;
===Ersatzräder===&lt;br /&gt;
Die Ersatzräder dienen als Ersatzteile für den RP6, RP6v2 und das RP5/RP6-Fahrgestell.&lt;br /&gt;
&lt;br /&gt;
===Ersatzzahnräder===&lt;br /&gt;
Die Ersatzzahnräder dienen als Ersatzteile für den RP6, RP6v2 und das RP5/RP6-Fahrgestell.&lt;br /&gt;
&lt;br /&gt;
===Ersatzraupen===&lt;br /&gt;
Die Ersatzraupen dienen als Ersatzteile für den RP6, RP6v2 und das RP5/RP6-Fahrgestell.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Programmierung==&lt;br /&gt;
Um diesen Grundlagenartikel zum RP6 nicht immer länger werden zu lassen, habe ich den Teil zur Programmierung des [[RP6_-_Programmierung#RP6_Base_und_CONTROL_M32|RP6]] und seiner Erweiterungsplatinen [[RP6_-_Programmierung#RP6_Base_und_CONTROL_M32|RP6 CONTROL M32]] und [[RP6_-_Programmierung#RP6_CCPRO_M128|RP6 CCPRO M128]] ausgelagert: [[RP6 - Programmierung]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==RP6v2==&lt;br /&gt;
Der neue [http://www.conrad.de/ce/de/product/191584/RP6-V2-ROBOTERSYSTEM RP6v2] ist weitgehend identisch mit dem RP6, so dass fast alle Angaben dieses Artikels auch für den RP6v2 zutreffen.&lt;br /&gt;
Für vom RP6 abweichende Details des RP6v2 und für dessen zukünftige Erweiterungsplatinen (z.B. das aktuell [http://www.arexx.com/forum/viewtopic.php?f=19&amp;amp;t=1797 hier] angekündigte Erweiterung-Modul [[RP6v2#RP6v2_M256_WiFi_Platine|RP6v2 M256 WiFi]]) gibt es einen eigenen Grundlagenartikel: [[RP6v2]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==RP6 Sensor Board und Xtra Module==&lt;br /&gt;
Einen eigenen Artikel gibt es auch für das [[RP6_Sensor_Board_und_Xtra_Module#RP6_Sensor_Board_2|RP6 Sensor Board]] und für die [[RP6_Sensor_Board_und_Xtra_Module#RP6_Xtra_Module_2|Xtra Module]]: [[RP6_Sensor_Board_und_Xtra_Module|RP6 Sensor Board und Xtra Module]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Erfahrungsberichte==&lt;br /&gt;
&lt;br /&gt;
...in Arbeit...(kann aber gerne ergänzt werden)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Siehe auch==&lt;br /&gt;
* [[RP6 - Programmierung]]&lt;br /&gt;
* [[RP6v2]]&lt;br /&gt;
* [[RP6_Sensor_Board_und_Xtra_Module]]&lt;br /&gt;
* [[RP6_Kamera_-_Mitmach-Projekt]]&lt;br /&gt;
* [[RP6v2_I2C-Portexpander]]&lt;br /&gt;
* [[RP6v2 USB-RS232-Adapter]]&lt;br /&gt;
* [[RP6v2 Orientierung]]&lt;br /&gt;
* [[RP6 Multi IO Projekt]]&lt;br /&gt;
* [[RP6 Multi IO Projekt - Software]]&lt;br /&gt;
* [[RP6 ArduIO]]&lt;br /&gt;
* [[RP6 ArduIO - Software]]&lt;br /&gt;
* [[Induktive_Ladestation_f%C3%BCr_den_RP6|Induktive Ladestation für den RP6]]&lt;br /&gt;
* [[IR-bake_f%C3%BCr_den_RP6|IR-bake für den RP6]]&lt;br /&gt;
* [[CCRP5]]&lt;br /&gt;
* [[Wild Thumper]]&lt;br /&gt;
* [[Wild Thumper - Programmierung]]&lt;br /&gt;
* [[Yeti]]&lt;br /&gt;
* [[Asuro]]&lt;br /&gt;
* [[C't-Bot]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Weblinks==&lt;br /&gt;
'''Siehe auch die Weblinks im [http://www.rn-wissen.de/index.php/RP6v2#Weblinks RP6v2 Artikel]!'''&lt;br /&gt;
&lt;br /&gt;
* [http://www.pcwelt.de/start/gaming_fun/gadgets/news/84558/ PC-Welt-Artikel]&lt;br /&gt;
&lt;br /&gt;
* Ankündigung des RP6 und der RP6 CONTROL M32 im [http://www.arexx.com/forum/viewtopic.php?t=370 AREXX Support Forum]&lt;br /&gt;
* Ankündigung der RP6 CCPRO M128 im [http://www.arexx.com/forum/viewtopic.php?f=19&amp;amp;t=834&amp;amp;start=0 AREXX Support Forum] und im [http://www.roboternetz.de/community/threads/42228-RP6-C-Control-PRO-MEGA128-Erweiterungsmodul-Website-online RoboterNETZ]&lt;br /&gt;
* Ankündigung des RP6v2 im [http://www.roboternetz.de/community/threads/56964-NEWS-RP6v2-die-neue-Version-2-des-RP6-Robot-Systems RoboterNETZ] und im [http://www.arexx.com/forum/viewtopic.php?f=19&amp;amp;t=1778 AREXX Support Forum]&lt;br /&gt;
* Ankündigung der RP6v2 M256 WiFi im [http://www.arexx.com/forum/viewtopic.php?f=19&amp;amp;t=1797 AREXX Support Forum]&lt;br /&gt;
* [http://www.arexx.com/rp6 AREXX RP6 Startseite]&lt;br /&gt;
* [http://www.arexx.com/forum/viewforum.php?f=19 AREXX Support Forum]&lt;br /&gt;
* [http://www.arexx.com/rp6/html/de/soft_doc_ccpro.htm AREXX CCPRO M128 Seite]&lt;br /&gt;
&lt;br /&gt;
* [http://www.conrad.de/ce/de/product/191524/RP6-ROBOTERSYSTEM RP6 bei CONRAD]&lt;br /&gt;
* [http://www.conrad.de/ce/de/product/191584/RP6-V2-ROBOTERSYSTEM RP6v2 bei CONRAD]&lt;br /&gt;
* [http://www.conrad.de/ce/de/product/191550/RP6-MEGA32-ERWEITERUNGSSATZ RP6 CONTROL M32 bei CONRAD]&lt;br /&gt;
* [http://www.conrad.de/ce/de/product/191563/RP6-CC-PRO-MEGA128-ERWEITERUNGSSATZ RP6 CCPRO M128 bei CONRAD]&lt;br /&gt;
* [http://www.c-control.de/c-control-pro/c-control-pro/startseite_c-control-pro.html C-Control PRO Startseite]&lt;br /&gt;
* [http://ccpro.cc2net.de/forum/ C-Control PRO Forum]&lt;br /&gt;
&lt;br /&gt;
* [http://www.roboternetz.de/phpBB2/viewforum.php?f=49 Roboternetz RP6 Forum]&lt;br /&gt;
* &amp;quot;Geburt&amp;quot; des Wiki im RN-Forum: [http://www.roboternetz.de/community/threads/32793-RP6-Wiki-Artikel RP6-Wiki-Artikel]&lt;br /&gt;
* Henkessoft: [http://www.henkessoft.de/Roboter/rp6.htm RP6]&lt;br /&gt;
* PIC-PROJEKTE Wiki: [http://pic-projekte.de/wiki/index.php?title=RP6  RP6]&lt;br /&gt;
* benhup.com: [http://www.benhup.com/?mf=eduntech&amp;amp;sf=rp6 Arexx RP6 Robot (with ATmega32 chip)]&lt;br /&gt;
* RP6 &amp;quot;Panzer&amp;quot;: [http://www.roboternetz.de/community/threads/57171-mein-(Heng-Long)-RP6 Heng-Long-RP6]&lt;br /&gt;
&lt;br /&gt;
* [http://www.youtube.com/results?search_query=rp6 RP6 Videos]&lt;br /&gt;
* [http://de-de.facebook.com/pages/Robby-RP6/155118711202285 facebook]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Robotikeinstieg]]	 &lt;br /&gt;
[[Kategorie:Praxis]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Autoren==&lt;br /&gt;
--[http://www.roboternetz.de/community/members/24729-sloti sloti] 22:23, 29. Dez 2007 (CET)&lt;br /&gt;
&lt;br /&gt;
--[http://www.roboternetz.de/community/members/44891-Tobias1 Tobias1] 18:30, 6. Apr 2010 (CET)&lt;br /&gt;
&lt;br /&gt;
--[http://www.roboternetz.de/community/members/1972-Dirk Dirk] 12:51, 23. Okt 2020 (CET)&lt;/div&gt;</summary>
		<author><name>Dirk NO2</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=RP6&amp;diff=28574</id>
		<title>RP6</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=RP6&amp;diff=28574"/>
				<updated>2022-03-31T08:56:08Z</updated>
		
		<summary type="html">&lt;p&gt;Dirk NO2: /* Beschreibung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Bild:RP6_2.jpg|RP6 Base Roboter|right|500px]]&lt;br /&gt;
==Was bisher geschah==&lt;br /&gt;
Fre, 08. Jun 2007 - Ankündigung des RP6 und der RP6 CONTROL M32&amp;lt;br/&amp;gt;&lt;br /&gt;
Mon, 02. Jul 2007 23:00 - Benachrichtigung der Tester&amp;lt;br/&amp;gt;&lt;br /&gt;
Die, 03. Jul 2007 15:00 - Bereitstellung der Dokumentation&amp;lt;br/&amp;gt;&lt;br /&gt;
Don, 05. Jul 2007 14:30 - Bereitstellung der Schaltungsunterlagen&amp;lt;br/&amp;gt;&lt;br /&gt;
Son, 08. Jul 2007 16:00 - Nachricht über den Versand der RP6&amp;lt;br/&amp;gt;&lt;br /&gt;
Mon, 09. Jul 2007 00:15 - Bereitstellung der Library und der Beispielprogramme&amp;lt;br/&amp;gt;&lt;br /&gt;
Die, 10. Jul 2007 - Eintreffen der RP6 bei den Testern&amp;lt;br/&amp;gt;&lt;br /&gt;
Mon, 16. Jul 2007 - Auslieferungsbeginn des RP6&amp;lt;br/&amp;gt;&lt;br /&gt;
Fre, 24. Apr 2009 - Ankündigung der RP6 CCPRO M128 (Auslieferung schon ab Mitte April 2009)&amp;lt;br/&amp;gt;&lt;br /&gt;
Mon, 27. Feb 2012 - Ankündigung des RP6v2&amp;lt;br/&amp;gt;&lt;br /&gt;
Don, 08. Mär 2012 - Auslieferungsbeginn des RP6v2&amp;lt;br/&amp;gt;&lt;br /&gt;
Sam, 17. Mär 2012 - Ankündigung der RP6v2 M256 WiFi&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Siehe auch &amp;quot;Was bisher geschah&amp;quot; im [http://www.rn-wissen.de/index.php/RP6v2#Was_bisher_geschah RP6v2 Artikel]!'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Allgemein==  &lt;br /&gt;
[[Bild:DSC03448.JPG|thumb|RP6 mit Erweiterungsboard]] [[Bild:RP6_Lieferumfang.jpg|thumb|RP6 im Lieferumfang]]&lt;br /&gt;
Der von Arexx entwickelte RP6 ([http://www.conrad.de/ce/de/product/191524/C-Control-Robot-System-RP6-Robotersystem 191524]) ist ein autonomes Raupenfahrzeug, das nicht nur für Schüler und Studenten zum Einstieg in das Gebiet Robotik sondern auch für Fortgeschrittene Elektroniker und Bastler sehr gut geeignet ist, da das System für selbstentworfene Erweiterungen ausgelegt ist. Der RP6 wird von einem, unter Roboterentwicklern beliebten, AVR Microcontroller von Atmel gesteuert und hat Lichtsensoren in Form von zwei LDRs, 2 Bumper an der Stoßstange, 6 Status LEDs, Sensoren zur Überwachung der Akkuspannung, Drehgeber mit 625 CPR, ein Infrarot Sensor zur Hinderniserkennung und Kommunikation und Motorstromsensoren zur Verfügung. Zudem liegt dem Roboter eine umfangreiche Anleitung, inklusive einem kleinen C-Crashkurs, ein USB-Interface zum Anschluss an den PC und ein USB Kabel bei.&lt;br /&gt;
&lt;br /&gt;
In diesem Artikel geht es um die Grundlagen des RP6. Zur Programmierung des RP6 gibt es eine eigene Seite: [[RP6 - Programmierung]]&lt;br /&gt;
&lt;br /&gt;
==Technische Daten==&lt;br /&gt;
{|  {{Blauetabelle}} &lt;br /&gt;
|'''Mikrocontroller:'''&lt;br /&gt;
|AVR [[ATmega32]]&lt;br /&gt;
|-&lt;br /&gt;
|'''Speicher:'''&lt;br /&gt;
|32 kB [[Flash]]-Speicher, davon 1 kB bereits vom Bootloader belegt&amp;lt;br/&amp;gt;&lt;br /&gt;
2 kB RAM&amp;lt;br/&amp;gt; &lt;br /&gt;
1 kB [[EEPROM]]&lt;br /&gt;
|-&lt;br /&gt;
|'''Programmierung:'''&lt;br /&gt;
|Über AVR-[[Bootloader]], belegt ca. 1 kB des Flash-Speichers&lt;br /&gt;
|-&lt;br /&gt;
|'''Vorhandene Sensoren:'''&lt;br /&gt;
|2 [[Sensorarten#Helligkeit|Lichtsensoren (LDR)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
1 [[Sensorarten#Helligkeit|Infrarot (ACS - Anti Collision System)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
2 [[Sensorarten#Bumpers|Bumper]] &amp;lt;br/&amp;gt; &lt;br /&gt;
2 [[Sensorarten#Incremental-Geber|Drehgeber (Encoder)]]&lt;br /&gt;
|-&lt;br /&gt;
|'''Vorhandene Aktoren:'''&lt;br /&gt;
|2 Motoren&amp;lt;br/&amp;gt;&lt;br /&gt;
6 Status-LEDs&amp;lt;br/&amp;gt;&lt;br /&gt;
1 IR-Sender&amp;lt;br/&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|'''Abmessungen:'''&lt;br /&gt;
|(L &amp;amp;times; B &amp;amp;times; H) 172 &amp;amp;times; 128 &amp;amp;times; 50 mm&lt;br /&gt;
|-&lt;br /&gt;
|'''Ausführung:'''&lt;br /&gt;
|Fertig aufgebauter Roboter&lt;br /&gt;
|-&lt;br /&gt;
|'''Stromversorgung:'''&lt;br /&gt;
|6 AA NiMH Akkus&lt;br /&gt;
|-&lt;br /&gt;
|'''Hersteller:'''&lt;br /&gt;
|Arexx Niederlande&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Mechanik==&lt;br /&gt;
===Beschreibung===&lt;br /&gt;
&lt;br /&gt;
===Sensoren===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Encoder====&lt;br /&gt;
&lt;br /&gt;
Die Drehgeber sind an den Getrieben der Motoren zur Drehzahlmessung angebracht. Es handelt sich dabei um Reflexlichtschranken, die auf Codierscheiben mit je 18 weissen und 18 schwarzen Segmenten ausgerichtet sind, also insgesamt 36 Segmente. Diese Codierscheiben sind wiederum an je eines der Zahnräder der beiden Getriebe geklebt worden. Wenn es sich dreht, wandern die einzelnen Segmente an der Reflexlichtschranke vorbei. Die weissen Segmente reflektieren das Infrarotlicht, die schwarzen Segmente nur wenig. Jedes der zwei mittleren Stufenzahnräder des Getriebes hat 50 Zähne auf dem großen, und 12 auf dem kleineren Zahnrad. Die Codierscheiben befinden sich auf dem Zahnrad neben dem Motor, also rechnet man:&lt;br /&gt;
50/12 * 50/12 =17.13/36; 17.13/36 * 36=625&lt;br /&gt;
Daher haben die Encoderscheiben auch Ihre 36 Segmente, denn das gibt eine schöne runde Zahl ohne gebrochenen Anteil. Die Drehgeber erzeugen also 625 Flanken pro Radumdrehung wobei jede Flanke einem Segment entspricht. Bei einem Raddurchmesser von ca. 50mm inkl. Raupenkette, ergibt sich rein rechnerisch ein Radumfang von ca. 157mm was 0.2512mm pro Zählschritt der Drehgeber entspricht. Da sich die Raupenketten aber fast immer etwas in den Untergrund eindrücken (bzw. auch selbst eingedrückt werden) kann man aber von 0.25mm pro Zählschritt ausgehen – meist ist es sogar etwas weniger, z.B. nur 0.24 oder 0.23mm. Das muss man durch abfahren von Teststrecken ermitteln, wie es im Anhang grob beschrieben ist. Sehr genau ist das allerdings durch Radschlupf (bzw. hier müssten wir eigentlich von „Kettenschlupf“ sprechen) und ähnlichen Dingen nicht - vor allem beim Rotieren auf der Stelle. Beim normalen Geradeausfahren ist dieser Fehler klein, aber beim Rotieren kann er schnell sehr große Werte annehmen! Abweichungen muss man evtl. durch weitere Tests ermitteln und mit einkalkulieren. Das ist bei Raupenantrieben leider so – auch bei viel teureren und hochwertigeren Robotern. Dafür hat man aber den Vorteil, dass der Roboter mit Raupenantrieb recht geländegängig ist im Vergleich zu Robotern mit normalem Differentialantrieb mit zwei Antriebsrädern und Stützrad. Kleinere Hindernisse und Rampen kann er meist problemlos überwinden.&lt;br /&gt;
Dabei sind die Encoder sehr nützlich, denn man kann die Geschwindigkeit gut einregeln, egal wie der Untergrund und die Motorbelastung gerade aussieht. Bei gemessenen 50 Segmenten pro Sekunde liegt die Geschwindigkeit bei 1.25 cm/s, sofern wir von 0.25mm pro Zählschritt ausgehen. Etwa 50 Segmente pro Sekunde ist auch die geringste gerade noch regelbare Geschwindigkeit (das variiert aber etwas von Roboter zu Roboter). Bei 1200 Segmenten pro Sekunde wären es die maximal möglichen 30 cm/s (bei 0.25mm Auflösung, bei 0.23 sind es 27.6 cm/s). Standardmäßig begrenzt die Funktionsbibliothek das aber auf 1000 Flanken pro Sekunde. Die maximale Geschwindigkeit ist vom Ladezustand der Akkus abhängig – daher wären 30cm/s nicht besonders lange haltbar. Außerdem erhöht sich die Lebensdauer der Getriebe und Motoren je langsamer man fährt! Wenn der Roboter 4000 Segmente gezählt hat, ist er übrigens etwa einen Meter weit gefahren. Aber wie schon gesagt, gilt das natürlich nur für genau 0.25mm Auflösung. Ohne Kalibrierung hat man hier immer mehr oder weniger starke Abweichungen. Wem es nicht auf jeden mm ankommt, braucht nichts zu kalibrieren und kann einfach von 0.25mm oder besser 0.24mm ausgehen!&lt;br /&gt;
&lt;br /&gt;
====Stoßstangensensoren====&lt;br /&gt;
&lt;br /&gt;
Vorn am Roboter sind zwei Mikroschalter mit langem Schalthebel auf einer separaten&lt;br /&gt;
Platine untergebracht, die etwas vor der anderen Sensorplatine liegt. Dadurch werden&lt;br /&gt;
die IR LEDs auf der Sensorplatine geschützt und können nicht so leicht verbiegen&lt;br /&gt;
wenn der Roboter mal gegen ein Hindernis fährt. Die Stoßstange kann man auch abmontieren und z.B. gegen eine Schuss- oder Sammelvorrichtung für Bälle o.ä. ersetzen wenn man möchte.&lt;br /&gt;
&lt;br /&gt;
====Lichtsensoren====&lt;br /&gt;
&lt;br /&gt;
Vorne auf der kleinen Sensorplatine des Roboters sind zwei sog.&lt;br /&gt;
LDRs (=&amp;quot;Light Dependant Resistors&amp;quot; also lichtabhängige Widerstände)&lt;br /&gt;
platziert und nach links bzw. rechts ausgerichtet. Zwischen&lt;br /&gt;
den beiden Sensoren ist noch eine kleine schwarze&lt;br /&gt;
„Trennwand“ damit das Licht aus einer Richtung möglichst nur&lt;br /&gt;
einen der Sensoren erreicht. Sie bilden zusammen mit je einem&lt;br /&gt;
normalen Widerstand wie beim Batteriesensor einen Spannungsteiler – hier allerdings&lt;br /&gt;
um das Umgebungslicht zu messen.&lt;br /&gt;
&lt;br /&gt;
====Anti Collision System====&lt;br /&gt;
&lt;br /&gt;
Der aus Softwaresicht komplexeste Sensor des RP6 ist das ACS - das&lt;br /&gt;
„Anti Collision System“ (engl. für Anti Kollisions System)! Es besteht&lt;br /&gt;
aus einem IR Empfänger (s. Abb.) und zwei vorne auf der Sensorplatine&lt;br /&gt;
links und rechts angebrachten IR LEDs.&lt;br /&gt;
Da es je eine IR LED links und rechts gibt, kann das ACS grob unterscheiden ob sich&lt;br /&gt;
das Objekt links, rechts oder mittig vor dem Roboter befindet.&lt;br /&gt;
Man kann zusätzlich noch die Stromstärke mit der die beiden IR LEDs gepulst werden&lt;br /&gt;
in drei Stufen einstellen. Das ACS funktioniert aber auch in der höchsten Stufe nicht&lt;br /&gt;
mit allen Objekten immer zuverlässig, denn es kommt auf die Beschaffenheit der&lt;br /&gt;
Oberfläche des jeweiligen Objekts an! Ein schwarzes Objekt reflektiert das IR Licht natürlich&lt;br /&gt;
viel schlechter als ein weisses Objekt und ein kantiges und spiegelndes Objekt&lt;br /&gt;
könnte das IR Licht hauptsächlich in eine bestimme Richtung reflektieren. Die Reichweite&lt;br /&gt;
ist also immer vom jeweiligen Objekt abhängig! Das ist eine prinzipielle Schwäche&lt;br /&gt;
von so gut wie allen IR Sensoren (jedenfalls in dieser Preisklasse).&lt;br /&gt;
Trotzdem werden die meisten Hindernisse zuverlässig erkannt und können umfahren&lt;br /&gt;
werden. Falls das mal nicht klappt, gibt es noch die Stoßstange mit den Tastsensoren&lt;br /&gt;
und falls auch die nicht richtig getroffen werden, kann der Roboter noch mit den Motorstromsensoren&lt;br /&gt;
oder den Encodern erkennen, ob die Motoren blockieren (s.u.)!&lt;br /&gt;
Wem das nicht reicht, der könnte zusätzlich z.B. noch Ultraschallsensoren anbringen...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Erweiterungssystem===&lt;br /&gt;
Auf dem Mainboard sind 22 freie 3,2mm Löcher vorhanden (im Chassis weitere 16), auf denen die Erweiterungsmodule symmetrisch vorne und hinten gestapelt werden können. Weil der Stromverbrauch durch mehr Module steigt, ist es sinnvoll nur insgesamt 6-8 Module auf dem Roboter zu stapeln. Auf dem Mainboard selbst sind noch 6 kleine Erweiterungsflächen verfügbar (plus 2 sehr kleine auf der Bumperplatine).&lt;br /&gt;
&lt;br /&gt;
===Antrieb===&lt;br /&gt;
&lt;br /&gt;
Die 7,2 VDC Motoren sind im Chassis eingebaut und werden mithilfe der H-Brücken gesteuert. Die maximale Geschwindigkeit liegt bei 25cm/s, das kann je nach Akkuspannung aber variieren. Ohne Softwarebegrenzung sind sogar 30cm/s möglich, dadurch verringert sich aber die Lebensdauer der Motoren. Die maximale Steigung, die der RP6 bewältigen kann, ist 30%, ohne Bumperplatine 40%, das hängt aber auch vom Untergrund ab. Kleine Hindernisse wie Bücher und Stifte kann der RP6 problemlos überqueren. Die Achsen der Räder sind in selbstschmierenden Sinterlagern mit 4mm Durchmesser gelagert.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Elektromechanik==&lt;br /&gt;
===Beschreibung===&lt;br /&gt;
===Odometrie===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Elektronik==&lt;br /&gt;
[[Bild:RP6 Block.jpg|thumb|Blockdiagramm]]&lt;br /&gt;
===Beschreibung===&lt;br /&gt;
&lt;br /&gt;
===Sensoren (SENSORS)===&lt;br /&gt;
&lt;br /&gt;
Die meisten Sensoren über die der Roboter verfügt, haben wir ja schon in anderen Abschnitten kurz genannt, wollen diese nun aber etwas detaillierter betrachten.&lt;br /&gt;
In dem Blockdiagramm sind einige der Sensoren nicht in dem blauen Bereich &amp;quot;Sensors&amp;quot; zu sehen, weil sie besser in andere Bereiche passen. Trotzdem zählen natürlich auch die Drehgeber (= “Encoder“), Motorstromsensoren und der Batteriespannungssensor zu den Sensoren und werden darum in diesem Abschnitt beschrieben!&lt;br /&gt;
&lt;br /&gt;
====Batteriespannungs-Sensor (Voltage Sensor)====&lt;br /&gt;
&lt;br /&gt;
Dieser &amp;quot;Sensor&amp;quot; ist eigentlich nur ein einfacher Spannungsteiler aus zwei Widerständen. Wir gehen davon aus, dass die Batterien insgesamt maximal 10V liefern können. 6 NiMH Akkus werden immer unterhalb davon bleiben. Die Referenzspannung des ADC, also die Spannung mit der er die gemessene Spannung vergleicht, beträgt 5V. Da auch die Betriebsspannung 5V beträgt, darf diese nicht überschritten werden. Also müssen wir die zu messende Spannung um die Hälfte herabsetzen! Dies geschieht über einen Spannungsteiler aus zwei Widerständen, der die Spannung an den Messbereich des ADCs anpasst. Der ADC löst mit 10 Bit auf (Wertebereich 0 bis 1023), was eine Auflösung von 10V/1024=9.765625mV ergibt. Ein Messwert von 512 entspricht hier also 5V und 1023 wären ungefähr 10V! Diese Grenzwerte sollten aber normalerweise nie erreicht werden! Das ist nicht besonders genau, da die Widerstände keineswegs Präzisionswiderstände sind. Abweichungen von einigen Prozent nach oben und unten sind möglich. Auch die Referenzspannung von 5V ist nicht ganz genau und kann bei normaler Belastung etwas variieren. Das stört hier nicht, denn wir brauchen ohnehin nur einen ungefähren Wert um festzustellen ob die Batterien sich langsam dem Ende nähern. Wer die Spannung genau messen will, braucht ein Multimeter um den Messfehler zu ermitteln und diesen dann in Software auszugleichen. Wenn man mit Fehlern leben kann, kann man die Spannung dank des günstigen Umrechnungsverhältnisses sogar direkt aus den ADC Werten ungefähr abschätzen: 720 entsprechen dann grob 7.2V, 700 etwa 7V und 650 wären etwa 6.5V. Bei einem konstanten Wert unter 560 kann man davon ausgehen, dass die Akkus fast leer sind.&lt;br /&gt;
&lt;br /&gt;
====Motorstrom====&lt;br /&gt;
[[Bild:RP6_MSS.jpg|thumb]]&lt;br /&gt;
Es befinden sich zwei Leistungswiderstände in den beiden Motorstromkreisen. Aus dem Ohm'schen Gesetz U=RxI folgt, dass sich die Spannung die an einem bestimmten Widerstand abfällt, proportional zum Strom verhält, der diesen durchfließt!&lt;br /&gt;
Damit die Spannungsabfälle an den Widerständen nicht zu groß werden, müssen die Widerstände klein gewählt werden. In unserem Fall haben Sie einen Wert von 0.1 Ohm&lt;br /&gt;
Die abfallende Spannung ist also nur sehr klein (0.1V bei einem Strom von 1A) und muss verstärkt werden bevor sie mit dem ADC gemessen werden kann. Das erledigt jeweils ein sog. Operationsverstärker (OPV). In der Schaltung des RP6 wird je Motorkanal ein OPV verwendet. Der Messbereich geht etwa bis 1.8A. Bei 1.8A fallen etwa 0.18V am Widerstand ab und es ergibt sich am Ausgang des OPV eine Spannung von etwa 4V. Mehr kann der verwendete OPV bei 5V Betriebsspannung nicht ausgeben:&lt;br /&gt;
&lt;br /&gt;
I = U / ((1 + (100k / 4,7k)) * 0,1)&lt;br /&gt;
&lt;br /&gt;
Die Leistungswiderstände haben eine Toleranz von 10%, die Widerstände am OPV 5%, also ist das alles nur sehr ungenau (Ungenauigkeiten im Bereich von etwa 270mA sind möglich wenn man die Sensoren nicht kalibriert!). Wir brauchen allerdings auch nur den ungefähren Wert um festzustellen ob die Motoren stark oder wenig belastet werden. So kann der Roboter gut blockierte oder gar defekte Motoren bzw. Drehgeber erkennen! Die DC-Motoren benötigen mehr Strom je stärker sie belastet werden (Drehmoment) und somit steigt der Strom sehr stark an wenn die Motoren blockiert sind. Das wird von der Robotersoftware zur Notabschaltung verwendet: wenn die Motoren dauerhaft mit hohem Strom betrieben würden, könnten diese sehr heiß werden und dadurch Schaden nehmen! Und wenn die Encoder mal ausfallen sollten – aus welchem Grund auch immer – kann auch das damit erkannt werden. Man würde dann eine Drehzahl von 0 messen. Lässt man die Motoren aber auf voller Kraft laufen und der Strom bleibt trotzdem klein (also sind die Ketten nicht blockiert!), kann man genau daraus schließen, dass entweder die Encoder, oder die Motoren ausgefallen sind (oder Encoder und Motorstromsensoren nicht funktionieren... das passiert z.B. wenn man vergessen hat diese vorher per Software einzuschalten).&lt;br /&gt;
&lt;br /&gt;
====Encoder====&lt;br /&gt;
[[Bild:RP6_ENCODER.jpg|thumb]]&lt;br /&gt;
Ganz anders als die letztgenannten Sensoren funktionieren die Drehgeber, die an den Getrieben der Motoren zur Drehzahlmessung angebracht sind. Es handelt sich dabei um Reflexlichtschranken, die auf Codierscheiben mit je 18 weissen und 18 schwarzen Segmenten ausgerichtet sind, also insgesamt 36 Segmente (s. Abb). Diese Codierscheiben sind wiederum an je eines der Zahnräder der beiden Getriebe geklebt worden. Wenn es sich dreht, wandern die einzelnen Segmente an der Reflexlichtschranke vorbei. Die weissen Segmente reflektieren das Infrarotlicht, die schwarzen Segmente nur wenig. Die Drehgeber erzeugen so zwar auch wie die anderen Sensoren ein analoges Signal, aber es wird digital interpretiert. Zunächst wird das Signal verstärkt und anschließend über einen sog. Schmitt Trigger in ein Rechtecksignal umgewandelt. Die Flanken dieses Signals, also die Wechsel von 5 auf 0V und umgekehrt, lösen jeweils ein Interrupt Ereignis aus und diese werden dann von der Software gezählt. So kann die zurückgelegte Wegstrecke gemessen und zusammen mit einem Timer zur Zeitmessung die Drehzahl und damit auch die Geschwindigkeit ermittelt werden. Die Ermittlung der Drehzahl ist auch Hauptanwendung der Encoder – nur mit den Encodern kann man die Drehzahl auf den gewünschten Sollwert einregeln. Ohne Regelung wäre die Drehzahl nämlich von der Akkuspannung, Belastung der Motoren usw. abhängig. Die hohe Auflösung ermöglicht es dabei, auch niedrige Geschwindigkeiten noch relativ genau einzuregeln. Jedes der zwei mittleren Stufenzahnräder des Getriebes hat 50 Zähne auf dem großen, und 12 auf dem kleineren Zahnrad (s. Abb). Die Codierscheiben befinden sich auf dem Zahnrad neben dem Motor, also rechnet man:&lt;br /&gt;
&lt;br /&gt;
50/12 * 50/12 =17.13/36; 17.13/36 * 36=625&lt;br /&gt;
&lt;br /&gt;
Daher haben die Encoderscheiben auch Ihre 36 Segmente, denn das gibt eine schöne runde Zahl ohne gebrochenen Anteil. Die Drehgeber erzeugen also 625 Flanken pro Radumdrehung wobei jede Flanke einem Segment entspricht. Bei einem Raddurchmesser von ca. 50mm inkl. Raupenkette, ergibt sich rein rechnerisch ein Radumfang von ca. 157mm was 0.2512mm pro Zählschritt der Drehgeber entspricht. Da sich die Raupenketten aber fast immer etwas in den Untergrund eindrücken (bzw. auch selbst eingedrückt werden) kann man aber von 0.25mm pro Zählschritt ausgehen – meist ist es sogar etwas weniger, z.B. nur 0.24 oder 0.23mm. Das muss man durch abfahren von Teststrecken ermitteln, wie es im Anhang grob beschrieben ist. Sehr genau ist das allerdings durch Radschlupf (bzw. hier müssten wir eigentlich von „Kettenschlupf“ sprechen) und ähnlichen Dingen nicht - vor allem beim Rotieren auf der Stelle. Beim normalen Geradeausfahren ist dieser Fehler klein, aber beim Rotieren kann er schnell sehr große Werte annehmen! Abweichungen muss man evtl. durch weitere Tests ermitteln und mit einkalkulieren. Das ist bei Raupenantrieben leider so – auch bei viel teureren und hochwertigeren Robotern. Dafür hat man aber den Vorteil, dass der Roboter mit Raupenantrieb recht geländegängig ist im Vergleich zu Robotern mit normalem Differentialantrieb mit zwei Antriebsrädern und Stützrad. Kleinere Hindernisse und Rampen kann er meist problemlos überwinden.&lt;br /&gt;
Dabei sind die Encoder sehr nützlich, denn man kann die Geschwindigkeit gut einregeln, egal wie der Untergrund und die Motorbelastung gerade aussieht. Bei gemessenen 50 Segmenten pro Sekunde liegt die Geschwindigkeit bei 1.25 cm/s, sofern wir von 0.25mm pro Zählschritt ausgehen. Etwa 50 Segmente pro Sekunde ist auch die geringste gerade noch regelbare Geschwindigkeit (das variiert aber etwas von Roboter zu Roboter). Bei 1200 Segmenten pro Sekunde wären es die maximal möglichen 30 cm/s (bei 0.25mm Auflösung, bei 0.23 sind es 27.6 cm/s). Standardmäßig begrenzt die Funktionsbibliothek das aber auf 1000 Flanken pro Sekunde. Die maximale Geschwindigkeit ist vom Ladezustand der Akkus abhängig – daher wären 30cm/s nicht besonders lange haltbar. Außerdem erhöht sich die Lebensdauer der Getriebe und Motoren je langsamer man fährt!&lt;br /&gt;
&lt;br /&gt;
=====Encoder justieren=====&lt;br /&gt;
Damit der RP6 die Signale der Drehgeber richtig auswerten kann, muss man evtl. die Drehgeber einmalig justieren. Dies kann auch schon bei einem neu gekauften RP6 notwendig sein.&lt;br /&gt;
Eine genaue Anleitung dazu findet man [http://www.arexx.com/rp6/downloads/RP6_ENCODER_DE_20071219.zip hier]. Es gibt auch ein [http://www.arexx.com/rp6/downloads/rp6_encoder_video.zip Video], das die Drehgeber-Justierung zeigt.&lt;br /&gt;
&lt;br /&gt;
=====Encoder kalibrieren=====&lt;br /&gt;
Wenn der Roboter 4000 Segmente gezählt hat, ist er etwa einen Meter weit gefahren. Aber wie schon gesagt, gilt das natürlich nur für genau 0.25mm Auflösung. Ohne Kalibrierung hat man hier immer mehr oder weniger starke Abweichungen. Wem es nicht auf jeden mm ankommt, braucht nichts zu kalibrieren und kann einfach von 0.25mm oder besser 0.24mm ausgehen!&lt;br /&gt;
Optimal ist es, wenn man sich für Weg- und Winkelmessungen nicht auf die Encoder Daten stützen muss, sondern externe Systeme wie Infrarotbaken oder einen genauen elektronischen Kompass dazu zur Verfügung hat.&lt;br /&gt;
&lt;br /&gt;
Will man die Drehgeber des RP6 dennoch kalibrieren, kann man ihn z.B. mit diesem Testprogramm:&lt;br /&gt;
&amp;lt;pre&amp;gt;#include &amp;quot;RP6RobotBaseLib.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
	initRobotBase();&lt;br /&gt;
	powerON();&lt;br /&gt;
&lt;br /&gt;
	// Test: Go ahead 1m and stop!&lt;br /&gt;
	move (80, FWD, DIST_MM(1000), true);&lt;br /&gt;
	writeString_P(&amp;quot;LEFT RIGHT&amp;quot;);&lt;br /&gt;
 	writeString_P(&amp;quot;\n&amp;quot;);&lt;br /&gt;
 	writeInteger(mleft_dist, DEC);&lt;br /&gt;
	writeChar(' ');&lt;br /&gt;
 	writeInteger(mright_dist, DEC);&lt;br /&gt;
	writeString_P(&amp;quot;\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
	powerOFF();&lt;br /&gt;
&lt;br /&gt;
	return 0;&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
... 1m weit fahren lassen und dann messen, wie weit er tatsächlich gefahren ist. Das Programm gibt auf dem Terminal den Stand der Drehgeber aus. Teilt man dann die gemessene Fahrstrecke in mm durch den Wert der Drehgeber, erhält man die Auflösung. Diesen Wert kann man dann der Konstanten ENCODER_RESOLUTION in der RP6Config.h zuweisen. Nach &amp;quot;Make Clean&amp;quot;, einer Neukompilierung und erneuter Ausführung des Testprogramms müßte der RP6 jetzt genau 1m weit fahren. Das gilt zumindest für den Untergrund, auf dem die Kalibrierung durchgeführt wurde.&lt;br /&gt;
&lt;br /&gt;
====Stoßstangensensoren (Bumper)====&lt;br /&gt;
&lt;br /&gt;
Vorn am Roboter sind zwei Mikroschalter mit langem Schalthebel auf einer separaten&lt;br /&gt;
Platine untergebracht, die etwas vor der anderen Sensorplatine liegt. Dadurch werden&lt;br /&gt;
die IR LEDs auf der Sensorplatine geschützt und können nicht so leicht verbiegen&lt;br /&gt;
wenn der Roboter mal gegen ein Hindernis fährt. Mit den zwei Schaltern kann der Mikrocontroller&lt;br /&gt;
einen solchen Aufprall registrieren und dann beispielsweise zurücksetzen,&lt;br /&gt;
sich etwas drehen und weiterfahren. Die Schalter sind an zwei der Ports die schon mit&lt;br /&gt;
den LEDs verbunden sind angeschlossen und blockieren so keine anderen Ports des&lt;br /&gt;
Mikrocontrollers. Daher leuchten die LEDs auch immer wenn man einen der Schalter&lt;br /&gt;
drückt! Da dies normalerweise relativ selten passiert, stört das aber nicht weiter.&lt;br /&gt;
Die Stoßstange kann man auch abmontieren und z.B. gegen eine Schuss- oder Sammelvorrichtung&lt;br /&gt;
für Bälle o.ä. ersetzen wenn man möchte.&lt;br /&gt;
&lt;br /&gt;
====Lichtsensoren (LDRs)====&lt;br /&gt;
[[Bild:RP6_Licht.jpg|thumb]]&lt;br /&gt;
Vorne auf der kleinen Sensorplatine des Roboters sind zwei sog.&lt;br /&gt;
LDRs (=&amp;quot;Light Dependant Resistors&amp;quot; also lichtabhängige Widerstände)&lt;br /&gt;
platziert und nach links bzw. rechts ausgerichtet. Zwischen&lt;br /&gt;
den beiden Sensoren ist noch eine kleine schwarze&lt;br /&gt;
„Trennwand“ damit das Licht aus einer Richtung möglichst nur&lt;br /&gt;
einen der Sensoren erreicht. Sie bilden zusammen mit je einem&lt;br /&gt;
normalen Widerstand wie beim Batteriesensor einen Spannungsteiler – hier allerdings&lt;br /&gt;
um das Umgebungslicht zu messen. Die 5V Betriebsspannung wird auch geteilt, aber&lt;br /&gt;
hier ist einer der Widerstände variabel! Es wird also das Teilungsverhältnis je nach Intensität&lt;br /&gt;
des Lichteinfalls verändert und somit eine vom Lichteinfall abhängige Spannung&lt;br /&gt;
an einen der A/D Wandler Kanäle geleitet!&lt;br /&gt;
Über den Spannungsunterschied zwischen den beiden Sensoren kann man ermitteln in&lt;br /&gt;
welcher Richtung sich eine bzw. die hellste Lichtquelle vor dem Roboter befindet:&lt;br /&gt;
Links, Rechts oder in der Mitte. Mit einem entsprechenden Programm, kann man so z.B. eine starke Taschenlampe in&lt;br /&gt;
einem abgedunkelten Zimmer verfolgen, oder den Roboter die hellste Stelle in einem&lt;br /&gt;
Raum suchen lassen! Klappt z.B. sehr gut mit einem stärkeren Hand-Halogenscheinwerfer:&lt;br /&gt;
Wenn man damit auf den Boden leuchtet, kann der Roboter dem Lichtfleck auf&lt;br /&gt;
dem Boden folgen.&lt;br /&gt;
Das geht natürlich auch umgekehrt: Der Roboter könnte z.B. auch versuchen sich vor&lt;br /&gt;
hellem Licht zu verstecken...&lt;br /&gt;
Wenn man noch ein oder zwei LDRs hinten am Roboter anbringen würde, könnte man&lt;br /&gt;
das noch verfeinern und die Richtung in der sich Lichtquellen befinden besser bestimmen.&lt;br /&gt;
Der Roboter kann sonst nämlich oft nur schwer unterscheiden ob die Lichtquelle&lt;br /&gt;
vor oder hinter ihm liegt. Zwei der A/D Wandler Kanäle sind noch frei...&lt;br /&gt;
&lt;br /&gt;
====Anti Collision System (ACS)====&lt;br /&gt;
[[Bild:RP6 ACS.jpg|thumb|Das ACS]]&lt;br /&gt;
Der aus Softwaresicht komplexeste Sensor des RP6 ist das ACS - das „Anti Collision System“ (engl. für Anti Kollisions System)! Es besteht aus einem IR Empfänger (s. Abb.) und zwei vorne auf der Sensorplatine links und rechts angebrachten IR LEDs. Die IR LEDs werden direkt vom Mikrocontroller angesteuert. Die Ansteuerungsroutinen können beliebig verändert und verbessert werden! Beim Vorgängermodell war dafür noch ein eigener Controller nötig, dessen Programm aber nicht vom Anwender geändert werden konnte...&lt;br /&gt;
Mit den IR LEDs werden kurze, mit 36kHz modulierte Infrarot Impulse ausgesandt, auf die der darauf ausgelegte IR Empfänger reagiert. Werden die IR Impulse an einem Gegenstand vor dem Roboter reflektiert und vom IR Empfänger detektiert, kann der Mikrocontroller darauf reagieren und z.B. ein Ausweichmanöver einleiten. Damit das ACS nicht zu empfindlich bzw. auf eventuelle Störungen reagiert, wartet die Software bis eine bestimmte Anzahl von Impulsen in einer bestimmten Zeit empfangen worden ist. Es wird auch eine Synchronisation mit dem RC5 Empfang durchgeführt und auf die RC5 Signale von TV/Hifi Fernbedienungen wird so nicht reagiert. Bei anderen Codes kann das aber nicht garantiert werden und das ACS könnte dann Hindernisse erkennen, wo gar keine sind! Da es je eine IR LED links und rechts gibt, kann das ACS grob unterscheiden ob sich das Objekt links, rechts oder mittig vor dem Roboter befindet.&lt;br /&gt;
Man kann zusätzlich noch die Stromstärke mit der die beiden IR LEDs gepulst werden in drei Stufen einstellen. Das ACS funktioniert aber auch in der höchsten Stufe nicht mit allen Objekten immer zuverlässig, denn es kommt auf die Beschaffenheit der Oberfläche des jeweiligen Objekts an! Ein schwarzes Objekt reflektiert das IR Licht natürlich viel schlechter als ein weisses Objekt und ein kantiges und spiegelndes Objekt könnte das IR Licht hauptsächlich in eine bestimme Richtung reflektieren. Die Reichweite ist also immer vom jeweiligen Objekt abhängig! Das ist eine prinzipielle Schwäche von so gut wie allen IR Sensoren (jedenfalls in dieser Preisklasse).&lt;br /&gt;
Trotzdem werden die meisten Hindernisse zuverlässig erkannt und können umfahren werden. Falls das mal nicht klappt, gibt es noch die Stoßstange mit den Tastsensoren und falls auch die nicht richtig getroffen werden, kann der Roboter noch mit den Motorstromsensoren oder den Encodern erkennen, ob die Motoren blockieren (s.u.)!&lt;br /&gt;
Wem das nicht reicht, der könnte zusätzlich z.B. noch Ultraschallsensoren anbringen...&lt;br /&gt;
&lt;br /&gt;
====IR-Kommunikation (IRCOMM)====&lt;br /&gt;
Der RP6 kann über die IR-LEDs links und rechts über der Bumper-Platine Daten zu anderen IR-Empfängern senden.  Es ist z.B. möglich, dass mehrere Roboter ihre Sensorwerte untereinander vergleichen.&lt;br /&gt;
&lt;br /&gt;
====6 Status-LEDs====&lt;br /&gt;
Die Status-LEDs sind vorne links und rechts über den Lichtsensoren auf der Hauptplatine angebracht.&lt;br /&gt;
&lt;br /&gt;
Über die Status-LEDs können Sensorzustände, z.B. des ACS, der Bumper oder der Lichtsensoren, dargestellt werden.&lt;br /&gt;
&lt;br /&gt;
====IR-Sender====&lt;br /&gt;
Über den IR-Sender können Daten zu anderen Geräten übertragen werden.&lt;br /&gt;
&lt;br /&gt;
===Erweiterungssystem (EXPANSION SYSTEM)===&lt;br /&gt;
[[Bild:RP6_EXP.jpg|thumb]]&lt;br /&gt;
Eines der nützlichsten Features des RP6 ist das Erweiterungssystem.&lt;br /&gt;
Man kann den RP6 damit genau so weit ausbauen,&lt;br /&gt;
wie man es benötigt. Aus Kostengründen bietet das&lt;br /&gt;
Basissystem schließlich nur relativ wenig Sensoren. Es sind&lt;br /&gt;
zwar schon mehr als bei vielen anderen Robotern in dieser&lt;br /&gt;
Preisklasse, aber erst mit weiteren Sensoren macht ein Roboter&lt;br /&gt;
so richtig Spaß. Das ACS kann beispielsweise nur grob&lt;br /&gt;
erkennen ob sich ein Hindernis vor dem Roboter befindet.&lt;br /&gt;
Mit Ultraschallsensoren oder besseren zusätzlichen IR Sensoren,&lt;br /&gt;
könnte man aber die Distanz ermitteln und so beispielsweise&lt;br /&gt;
bessere Ausweichmanöver fahren!&lt;br /&gt;
&lt;br /&gt;
Neben Sensoren macht es auch sehr viel Sinn, zusätzliche Controller einzubauen um&lt;br /&gt;
die anfallenden Aufgaben aufteilen zu können. Beispielsweise die RP6 CONTROL M32&lt;br /&gt;
Platine mit einem weiteren MEGA32 Mikrocontroller oder die CCPRO M128.&lt;br /&gt;
&lt;br /&gt;
Das Erweiterungssystem muss natürlich in der Lage sein, viele Erweiterungsmodule&lt;br /&gt;
miteinander zu verbinden, dabei mit wenigen Signalleitungen&lt;br /&gt;
auskommen und eine ausreichend hohe Geschwindigkeit bieten.&lt;br /&gt;
&lt;br /&gt;
Siehe [[I2C]]&lt;br /&gt;
&lt;br /&gt;
===Steuerung (CONTROL SYSTEM)===&lt;br /&gt;
&lt;br /&gt;
====Hauptprozessor (ATMEGA32)====&lt;br /&gt;
[[Bild:RP6_MEGA32.jpg|thumb|Der MEGA32]]&lt;br /&gt;
Der Hauptprozessor ist der ATMEGA32 vom Atmel. Er hat 32KB Flash ROM und 2KB RAM. Der ATMEGA ist mit 8Mhz getaktet, kann also bis zu 8 Millionen Befehle pro Sekunde ausführen. Es sind 32 I/O-Pins  am Controller verfügbar. Die I/O-Pins gehören zu I/O-Ports mit jeweils 8 Pins. Davon gibt es 4: PORTA, PORTB, PORTC und PORTD. Der Controller kann die Ports entweder ein oder ausschalten (Output), oder erkennen, ob Spannung angelegt wurde oder nicht (Input). Es gibt mehrere Module, die verschiedene Aufgaben übernehmen:&lt;br /&gt;
* 3 Timer, einer davon erzeugt die PWM-Signale für die Motoren&lt;br /&gt;
* Die serielle Schnittstelle (UART)&lt;br /&gt;
* Das TWI (Two Wire Interface, also Zweidraht Schnittstelle)&lt;br /&gt;
* Ein ADC (Analog to Digital Converter) mit 8 Eingangskanälen, welche mit 10bit (0-1023) auflösen&lt;br /&gt;
* Drei externe Interrupt Eingänge&lt;br /&gt;
&lt;br /&gt;
Auserdem befindet sich im Microcontroller ein sog. Bootloader, welcher mit dem RP6 Loader kommuniziert und neue Programme in den Speicher lädt.&lt;br /&gt;
&lt;br /&gt;
===Antrieb (DRIVE SYSTEM)===&lt;br /&gt;
[[Bild:RP6_H-Brücke.jpg|thumb|Die H-Brücke]]&lt;br /&gt;
[[Bild:RP6_Tastverhältniss.jpg|thumb]]&lt;br /&gt;
Der Antrieb des RP6 besteht aus zwei Gleichstrom Motoren mit nachgeschaltetem Getriebe,&lt;br /&gt;
über das die beiden Raupenketten angetrieben werden.&lt;br /&gt;
Die Motoren genehmigen sich je nach Belastung&lt;br /&gt;
einen recht hohen Strom und können&lt;br /&gt;
natürlich nicht direkt vom Mikrocontroller&lt;br /&gt;
angesteuert werden. Dazu braucht man&lt;br /&gt;
Leistungstreiber in Form von je einer H-Brücke&lt;br /&gt;
pro Motor. Das grundlegende Prinzip&lt;br /&gt;
ist in der nebenstehenden Abbildung dargestellt.&lt;br /&gt;
Eine H-Brücke besteht aus vier&lt;br /&gt;
&amp;quot;Schaltern&amp;quot;, die in Form eines H's um einen&lt;br /&gt;
Motor angeordnet sind. Nehmen wir mal an,&lt;br /&gt;
zunächst seien alle Schalter aus. Schaltet&lt;br /&gt;
man dann S1 und S4 (Rot) an, liegt eine&lt;br /&gt;
Spannung am Motor an und er dreht sich&lt;br /&gt;
z.B. nach rechts. Schalten wir nun S1 und&lt;br /&gt;
S4 wieder aus und danach S2 und S3 (Grün)&lt;br /&gt;
an, wird die am Motor anliegende Spannung umgepolt und er dreht sich in die entgegen gesetzte&lt;br /&gt;
Richtung, also nach links! Man muss darauf achten, nicht gleichzeitig S1&lt;br /&gt;
und S2, oder S3 und S4 einzuschalten, sonst entstünde ein Kurzschluss und dadurch&lt;br /&gt;
könnten die &amp;quot;Schalter&amp;quot; zerstört werden!&lt;br /&gt;
Natürlich verwenden wir auf dem RP6 keine mechanischen Schalter, sondern sog.&lt;br /&gt;
MOSFETs. Diese schalten beim Anlegen einer genügend hohen Spannung am Eingang&lt;br /&gt;
durch. Die Schaltvorgänge können sehr schnell erfolgen, mehrere Kilohertz sind bei&lt;br /&gt;
unserer Anwendung möglich.&lt;br /&gt;
So kann man also schon mal die Drehrichtung einstellen. Und wie bekommt man den&lt;br /&gt;
Motor nun schneller bzw. langsamer? Ein Elektromotor dreht umso schneller, je höher&lt;br /&gt;
die angelegte Spannung ist. Die Drehzahl kann also über die Spannung eingestellt&lt;br /&gt;
werden - und genau dazu können wir die H-Brücke auch verwenden!&lt;br /&gt;
Die Abbildung verdeutlicht das Prinzip&lt;br /&gt;
nach dem wir vorgehen können.&lt;br /&gt;
Wir erzeugen&lt;br /&gt;
ein Rechtecksignal fester Frequenz,&lt;br /&gt;
bei dem wir das sog. Tastverhältnis&lt;br /&gt;
verändern. Mit &amp;quot;Tastverhältnis&amp;quot; ist das&lt;br /&gt;
Verhältnis von der eingeschalteten zur&lt;br /&gt;
ausgeschalteten Zeit des Signals gemeint.&lt;br /&gt;
Am Motor liegt dann effektiv eine niedrigere,&lt;br /&gt;
mittlere Gleichspannung an, die dem&lt;br /&gt;
Tastverhältnis entspricht. In der Grafik ist&lt;br /&gt;
dies durch eine rote Linie (Ug) und die roten&lt;br /&gt;
Flächen verdeutlicht. Wenn z.B. eine&lt;br /&gt;
Spannung von 7 Volt von den Akkus an&lt;br /&gt;
den Motortreibern anliegt, und diese mit&lt;br /&gt;
einem Tastverhältnis von 50% angesteuert werden, würde die mittlere Spannung in&lt;br /&gt;
etwa bei der Hälfte, also 3.5V liegen! Das stimmt real nicht ganz, aber so kann man&lt;br /&gt;
es sich schon gut und einfach vorstellen.&lt;br /&gt;
Das Antriebssystem ist dank der hohen Untersetzung (~ 1:72) relativ stark und so&lt;br /&gt;
kann der RP6 viel schwerere Lasten tragen als es z.B. der kleine Roboter ASURO&lt;br /&gt;
könnte. Allerdings steigt mit zunehmendem Gewicht natürlich auch der Energiebedarf&lt;br /&gt;
und die Akkus werden schneller leer sein ...&lt;br /&gt;
Im Vergleich mit einem ferngesteuerten Rennwagen o.ä. könnte man denken der RP6&lt;br /&gt;
sei langsam - stimmt auch - das ist jedoch absichtlich so! Der Roboter wird von einem&lt;br /&gt;
Mikrocontroller gesteuert und wenn der Programmierer einen Fehler bei der Programmierung&lt;br /&gt;
gemacht hat, wäre es ungünstig mit 10km/h vor die Wand zu prallen! Bei&lt;br /&gt;
dem eher gemächlichen Tempo des RP6 passiert aber nicht so schnell etwas und nebenbei&lt;br /&gt;
haben die Sensoren mehr Zeit die Umgebung auf Hindernisse zu untersuchen.&lt;br /&gt;
Und da wäre natürlich noch der Vorteil der höheren Belastbarkeit und der viel genaueren&lt;br /&gt;
Geschwindigkeitsregelung!&lt;br /&gt;
&lt;br /&gt;
===Stromversorgung (POWER SUPPLY)===&lt;br /&gt;
[[Bild:RP6_IC1.jpg|thumb]]&lt;br /&gt;
Natürlich benötigt ein Roboter Energie. Diese trägt der RP6 gespeichert in 6 Akkus mit&lt;br /&gt;
sich herum. Die Laufzeit ist durch die Kapazität der Akkus eingeschränkt, denn auch&lt;br /&gt;
wenn die Elektronik verhältnismäßig wenig Energie benötigt, schlucken die Motoren je&lt;br /&gt;
nach Belastung doch ziemlich viel.&lt;br /&gt;
&lt;br /&gt;
Damit die Akkus möglichst lange halten und der Roboter nicht ständig Pause machen&lt;br /&gt;
muss, sollte man ihm daher etwas größere Energiespeicher mit etwa 2500mAh gönnen.&lt;br /&gt;
Kleinere mit 2000mAh oder mehr funktionieren aber auch. Mit guten Akkus kann&lt;br /&gt;
man 3 bis 6 Stunden oder mehr Laufzeit erreichen, abhängig von der Betriebszeit der&lt;br /&gt;
Motoren, deren Belastung und Qualität der Akkus. Die 6 Akkus die notwendig sind,&lt;br /&gt;
haben insgesamt eine Nennspannung von 6x 1.2V = 7.2V. Im Blockdiagramm ist dies&lt;br /&gt;
mit &amp;quot;UB&amp;quot; (= &amp;quot;U-Battery&amp;quot;, U ist der Formelbuchstabe für Spannung) bezeichnet. „Nennspannung&amp;quot;,&lt;br /&gt;
weil sich die Spannung mit der Zeit stark verändert. Voll aufgeladen können&lt;br /&gt;
die Akkus im Leerlauf insgesamt bis zu 8.5V liefern! Diese Spannung sinkt während&lt;br /&gt;
der Entladung ab und schwankt auch je nach Belastung (Motoren an oder aus,&lt;br /&gt;
schnell langsam etc. - wie stark die Spannung schwankt, hängt auch von der Qualität&lt;br /&gt;
der verwendeten Akkus ab. Der Innenwiderstand ist hier die kritische Größe).&lt;br /&gt;
Das ist für Messungen von Sensorwerten und ähnlichem natürlich nicht ohne weiteres&lt;br /&gt;
brauchbar. Noch wichtiger ist jedoch, dass viele der verwendeten Komponenten wie&lt;br /&gt;
z.B. der Mikrocontroller nur auf 5V oder weniger Betriebsspannung ausgelegt sind und&lt;br /&gt;
bei so hohen Spannungen zerstört würden. Die Akku Spannung muss also auf einen&lt;br /&gt;
definierten Wert heruntergeregelt und stabilisiert werden!&lt;br /&gt;
Das übernimmt ein 5V Spannungsregler, der einen Strom von&lt;br /&gt;
maximal 1.5A liefern kann (s. Abb.). Bei 1.5A würde er jedoch&lt;br /&gt;
ziemlich viel Wärme abgeben. Es gibt daher eine große Kühlfläche&lt;br /&gt;
auf der Platine an die der Regler festgeschraubt ist. Über 1A&lt;br /&gt;
sollte der Regler trotz Kühlung besser nur kurzzeitig (also wenige&lt;br /&gt;
Sekunden) belastet werden, wenn man nicht noch einen zusätzlichen&lt;br /&gt;
großen Kühlköper draufschraubt.&lt;br /&gt;
&lt;br /&gt;
Es wird empfohlen, 800mA Dauerlast nicht zu überschreiten! Bei&lt;br /&gt;
so einer Belastung und zusammen mit den Motoren wären die&lt;br /&gt;
Akkus auch recht schnell leer. Im normalen Betrieb ohne ein Erweiterungsboard&lt;br /&gt;
nimmt der Roboter übrigens nicht mehr als 40mA auf (ausser wenn&lt;br /&gt;
das IRCOMM sendet), also überhaupt kein Problem für den Regler und man hat noch&lt;br /&gt;
genug Reserven für die Erweiterungsmodule, die meistens auch nicht mehr als 50mA&lt;br /&gt;
aufnehmen sofern keine Motoren, große LEDs o.ä. daran angeschlossen sind.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Umbau-Optionen==&lt;br /&gt;
Hier soll beschrieben werden, welche Umbau-Optionen es für die RP6 Base gibt. Im Text gibt es Verweise auf den Schaltplan des RP6 (RP6_MAINBOARD.PDF) in der Form: (SP2 B1: Bauteil). Dies bedeutet, dass man das Bauteil auf Blatt 2 des RP6-Schaltplans im Feld B1 finden kann. Beispielhaft sind im folgenden Text Bestell-Nummern der Firma [http://www.conrad.de/ce/ CONRAD] genannt. Natürlich kann man die Teile auch bei anderen Versendern beziehen.&lt;br /&gt;
&lt;br /&gt;
Bei den Materialangaben ist öfter die Rede von &amp;quot;Steckbuchsen mit Litze&amp;quot;. Diese Steckbuchsen mit angelöteter Litze können auf die ein- oder zweireihigen Stiftleisten aufgesteckt werden. Leider gibt es sie nicht (mehr) fertig konfektioniert bei CONRAD. Die einreihigen Steckbuchsen (RM 2,54mm) kann man aber z.B. bei [http://www.elv.de/output/controller.aspx ELV] bekommen: 2-polig (68-016635), 3-polig (68-022503) und 5-polig (68-023073). An sie muss man dann noch Litzen in der entsprechenden Länge selbst anlöten.&lt;br /&gt;
&lt;br /&gt;
===Elko für den IR-Empfänger===&lt;br /&gt;
[[Bild:RP6_C29_TSOP.JPG|thumb|RP6 C29 TSOP]]&lt;br /&gt;
Zur Spannungsstabilisierung kann ein Elko (C29; SP2 E1: C29*) am TSOP 34836 eingelötet werden.&lt;br /&gt;
&lt;br /&gt;
Normalerweise ist dieser Elko nicht erforderlich.&lt;br /&gt;
&lt;br /&gt;
Man braucht dazu:&lt;br /&gt;
* Einen Elektrolyt-Kondensator stehend 10 uF / 16V (C29); RM 2,5mm (445631)&lt;br /&gt;
&lt;br /&gt;
Der Elko kann auch eine geringere Kapazität als 10 uF haben (1 uF bis 4,7 uF reichen auch). Man lötet den Elko auf seinen Platz. Bitte auf die Polung achten: Der Minuspol zeigt nach vorn (in Fahrtrichtung des RP6).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Anschlüsse===&lt;br /&gt;
Hier wird aufgelistet, wo man auf dem RP6 Mainboard Anschlüsse nutzen kann, um sie z.B. zu weiteren Sensoren, zum USRBUS oder (weniger empfehlenswert!) direkt zu EPs oder Erweiterungsplatinen (M32, CCPRO M128) zu führen.&lt;br /&gt;
&lt;br /&gt;
====Analoge Sensoren an ADC0/1====&lt;br /&gt;
[[Bild:RP6_ADC01.JPG|thumb|RP6 ADC0/1]]&lt;br /&gt;
&lt;br /&gt;
Wenn man bis zu zwei analoge Sensoren (z.B. IR-Distanz-Mess-Sensoren Sharp GP2Y0A02YK 185364) direkt an den RP6 anschließen möchte, dann gibt es da zwei 3-polige Kontakte, beschriftet mit VDD/GND/ADCx (x = 0..1). Hier kann man 3-polige Stiftleisten auflöten, an die dann die Sensoren angeschlossen werden.&lt;br /&gt;
&lt;br /&gt;
Man braucht dazu:&lt;br /&gt;
* 1-reihige Stiftleiste RM 2,54mm (z.B. 36-polig 732478)&lt;br /&gt;
* Zwei Keramik-Vielschicht-Kondensatoren 100nF (C27, C28); RM 2,54mm (453099)&lt;br /&gt;
* ENTWEDER einen Elektrolyt-Kondensator stehend 220 uF / 16V (C26); RM 3,5mm (445903)&lt;br /&gt;
* ODER einen Elektrolyt-Kondensator stehend 470 uF / 16V (C26); RM 3,5mm (446211)&lt;br /&gt;
* Zwei 3-polige Steckbuchsen mit Litze zum Anschluß der Sensoren&lt;br /&gt;
&lt;br /&gt;
Man trennt nun von der 1-reihigen Stiftleiste zweimal 3 Kontakte ab und lötet sie auf die weiß umrahmten Kontakte (VDD/GND/ADCx; SP2 B1: ADC0, ADC1), anschließend C27, C28 (SP2 A1: C27*, C28*) auf ihre Plätze und zum Schluß den Elko 220 uF oder 470 uF (C26; SP2 A1: C26*). Der Elko ist nur bei Sensoren mit hohem Strombedarf notwendig, siehe dazu auch Anleitung des RP6, Seite 136! Beim Elko auf die Polung achten: Er muss so sitzen, dass er mit seinem Pluspol in Fahrtrichtung des RP6 (nach vorn) schaut.&lt;br /&gt;
&lt;br /&gt;
Die Sensoren lötet man an die Litzen der 3-poligen Steckbuchsen und steckt diese auf die neuen Kontakte.&lt;br /&gt;
&lt;br /&gt;
Da manche Sensoren einen höheren Stromverbrauch haben, kann man die Stromversorgung an den VDD-Pins der ADC0/1-Stecker abschaltbar machen oder eine separate +5V-Spannung einspeisen. Siehe dazu den Abschnitt &amp;quot;Trennstellen - Getrennte Stromversorgung für ADC0/1&amp;quot; weiter unten!&lt;br /&gt;
&lt;br /&gt;
====ISP (In System Programming)====&lt;br /&gt;
Der ATMEGA32 des RP6 wird standardmäßig über den PROG/UART Stecker programmiert. Dazu befindet sich im Prozessor ein Bootloader-Programm. Wenn man stattdessen oder zusätzlich die ISP-Programmierung mit einem dafür geeigneten ISP-Programmier-Adapter nutzen will, kann man den Adapter an einen (noch einzulötenden) Wannenstecker auf dem RP6 anschließen.&lt;br /&gt;
Vorher sind aber ein paar &amp;quot;Umbauarbeiten&amp;quot; erforderlich.&lt;br /&gt;
&lt;br /&gt;
Man braucht dazu:&lt;br /&gt;
* 1-reihige Stiftleiste RM 2,54mm (z.B. 36-polig 732478)&lt;br /&gt;
* Wannenstecker 2x5-polig gerade RM 2,54mm (z.B. [http://www.reichelt.de./ Reichelt] WSL 10G)&lt;br /&gt;
* Eine SMD-Diode LL 4148 (140902)&lt;br /&gt;
* Eine Codierbrücke (z.B. aus Set 742902)&lt;br /&gt;
&lt;br /&gt;
Zwischen dem XBUS-Stecker und C13 befinden sich 10 Lötpunkte für den ISP-Anschluß, auf die der Wannenstecker gelötet wird, und drei Lötpunkte (beschriftet mit ISP* - BOOTLOAD; SP2 A3: YR1..3), auf die eine 3-polige Stiftleiste gelötet werden muss.&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_ISP.JPG|RP6 ISP]]&lt;br /&gt;
&lt;br /&gt;
Vorher muss eine kurze Leiterbahn zwischen den Lötpunkten BOOTLOAD aufgetrennt werden. Die Leiterbahn befindet sich auf der Lötseite der Platine und muss mit einem scharfen Messer oder einem speziellen Leiterbahn-Unterbrecher zwischen den beiden Lötpunkten unterbrochen werden. Man sollte anschließend mit einem Widerstandsmeßgerät nachmessen: Es sollte keine Verbindung mehr zwischen den Lötpunkten bestehen.&lt;br /&gt;
Man trennt dann von der 1-reihigen Stiftleiste 3 Kontakte ab und lötet sie auf die beschriebenen drei Lötpunkte.&lt;br /&gt;
&lt;br /&gt;
Zum Schluss lötet man noch die Diode LL 4148 (SP2 B3: D11*) auf ihre Lötflächen zwischen R3 und C6. Die Kathode (Strich) der Diode kommt nach vorn (in Fahrtrichtung RP6, bzw. liegt rechts von R3). Wenn man jetzt eine Codierbrücke auf die mit &amp;quot;BOOTLOAD&amp;quot; beschrifteten Pins steckt, bleibt alles unverändert: Die Programmierung erfolgt weiter über den PROG/UART-Stecker mithilfe des Bootloaders im Prozessor.&lt;br /&gt;
Wird die Codierbrücke in Stellung &amp;quot;ISP*&amp;quot; umgesteckt, kann der Prozessor mit ISP programmiert werden.&lt;br /&gt;
&lt;br /&gt;
Vorsicht: Das Bootloader-Programm kann dabei zerstört werden! Es müssen zusätzlich Fusebits des ATMEGA32 verändert werden. Dabei kann der Prozessor im schlimmsten Fall nicht mehr ansprechbar sein. Man sollte diesen Umbau und die ISP-Programmierung nur machen, wenn man genau weiß, was man macht!&lt;br /&gt;
&lt;br /&gt;
Eine Kopie des Bootloaders und eine Kurzanleitung zum Einstellen der Fusebits gibt es hier:&lt;br /&gt;
[http://www.arexx.com/rp6/downloads/RP6BASE_BOOTLOADER.zip RP6_BOOTLOADER]&lt;br /&gt;
&lt;br /&gt;
====IO1..IO4====&lt;br /&gt;
[[Bild:RP6_IO1-4.JPG|thumb|RP6 IO1..IO4]]&lt;br /&gt;
Die Anschlüsse IO1 bis IO4 (SP2 E3: IO1..4) steuern bereits die Status-LEDs 1, 2, 4 und 5 an. Trotzdem kann man sie auch noch mit leichten Einschränkungen als I/O-Pins benutzen. Dazu lötet man zweimal 2 Pins einer 1-reihigen Stiftleiste RM 2,54mm (z.B. 36-polig 732478) auf die IO1/2 und IO3/4 Lötpunkte.&lt;br /&gt;
Hier eine Tabelle, die die Port-Pins zeigt, die IO1..IO4 zugeordnet sind:&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |IO&lt;br /&gt;
 |Status-LED&lt;br /&gt;
 |Port-Pin&lt;br /&gt;
 |-&lt;br /&gt;
 |1&lt;br /&gt;
 |SL1&lt;br /&gt;
 |PC4&lt;br /&gt;
 |-&lt;br /&gt;
 |2&lt;br /&gt;
 |SL2&lt;br /&gt;
 |PC5&lt;br /&gt;
 |-&lt;br /&gt;
 |3&lt;br /&gt;
 |SL4&lt;br /&gt;
 |PB7&lt;br /&gt;
 |-&lt;br /&gt;
 |4&lt;br /&gt;
 |SL5&lt;br /&gt;
 |PB1&lt;br /&gt;
 |-&lt;br /&gt;
|}&lt;br /&gt;
Wie können nun IO1..IO4 genutzt werden?&lt;br /&gt;
&lt;br /&gt;
Als ...&lt;br /&gt;
* Eingang, z.B. für zusätzliche Tastschalter/Bumper&lt;br /&gt;
* Ausgang, z.B. zur Ansteuerung von Treiberstufen, low-current LEDs, ...&lt;br /&gt;
&lt;br /&gt;
Wird ein Anschluß IOx als Eingang verwendet, muss ein Widerstand von 470 Ohm in Reihe mit dem Taster an VDD eingebaut werden, zusätzlich ein Pulldown-Widerstand 100 kOhm. Diese Beschaltung zeigen z.B. an SL6 die Widerstände R43 und R46 (SP2 E4: R43, R46).&lt;br /&gt;
&lt;br /&gt;
Als Ausgang geschaltet sollte an IOx kein hoher Strom entnommen werden: 10mA sind max. zu empfehlen!&lt;br /&gt;
&lt;br /&gt;
====USRBUS====&lt;br /&gt;
Die 14 Kontakte der beiden USRBUS-Stecker sind auf dem RP6 nirgendwo angeschlossen, sondern können über die Lötpunkte Y1..Y14 mit beliebigen Punkten auf dem Mainboard verbunden werden.&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_USRBUS.JPG|thumb|RP6 USRBUS]]&lt;br /&gt;
&lt;br /&gt;
Ich würde auf Y1..Y14 eine Stiftleiste löten, damit die USRBUS-Belegung geändert werden kann.&lt;br /&gt;
&lt;br /&gt;
Man braucht dazu:&lt;br /&gt;
* 2-reihige Stiftleiste RM 2,54mm (z.B. 2x36-polig 742007)&lt;br /&gt;
* Einige Steckbuchsen mit Litze&lt;br /&gt;
&lt;br /&gt;
Man trennt von der 2-reihigen Stiftleiste 2x7 Kontakte ab und lötet sie auf die Punkte Y1..Y14 (SP4 E34: Y1..14, Y1'..Y14') neben den beiden Wannensteckern USRBUS1 (vorn) und USRBUS2 (hinten). Wird der RP6 über Flachkabel mit einem USRBUS-Stecker auf einer RP6 Experimentierplatine (EP) und/oder mit einer Erweiterungsplatine (M32, CCPRO M128) verbunden, dann hat man mit allen mit dem USRBUS verbundenen Platinen eine direkte 14-polige Verbindung,- eben den &amp;quot;User Bus&amp;quot;. Den kann man dann nutzen, wie man will. Auf dem RP6 kann man mit Steckbuchsen die Pins Y1..Y14 mit anderen Pins verbinden.&lt;br /&gt;
&lt;br /&gt;
Beispiel: Verbindet man den Pin &amp;quot;ADC0&amp;quot; mit Y1 des USRBUS1, dann steht der Eingang ADC0 auf allen an den USRBUS1 angeschlossenen Platinen auf dem vorderen Platinenstapel an Y1 zur Verfügung. Man braucht also diesen Eingang nicht über ein eigenes Kabel auf eine EP zu führen, sondern kann dazu den USRBUS nehmen. Dadurch bleibt der Gesamtaufbau auf dem RP6 übersichtlich und komplett trennbar (man braucht nur die Stecker XBUS und USRBUS abzuziehen!).&lt;br /&gt;
&lt;br /&gt;
Wichtig:&lt;br /&gt;
* Man sollte gut dokumentieren, wie man den USRBUS am RP6 (vorn und hinten getrennt!), auf EPs und der M32/M128 benutzt! Sonst kann es bei einer anderen Anordnung von EPs zu USRBUS Konflikten/Kurzschlüssen kommen.&lt;br /&gt;
* Der USRBUS1- und der USRBUS2-Stecker sind auf dem RP6 NICHT miteinander verbunden.&lt;br /&gt;
&lt;br /&gt;
Einen Vorschlag für die Belegung des USRBUS1 (vorn) gibt es z.B. &lt;br /&gt;
[http://www.roboternetz.de/phpBB2/viewtopic.php?t=32549 hier] oder &lt;br /&gt;
[http://www.roboternetz.de/community/showthread.php/47102-Sensor-anschließen?p=453061&amp;amp;viewfull=1#post453061 da.]&lt;br /&gt;
&lt;br /&gt;
====Start/Stop Button====&lt;br /&gt;
[[Bild:RP6_ST.JPG|thumb|RP6 ST]]&lt;br /&gt;
Am mittleren Lochrasterfeld links finden sich zwei Lötpunkte ST1, ST2 (SP2 D2: ST1, ST2), an die weitere Start/Stop Taster (NO, normal offen) parallel zum Taster auf dem RP6 Mainboard angeschlossen werden können.&lt;br /&gt;
&lt;br /&gt;
Zum Anschluß kann man auch Stiftleisten auflöten. ST1, ST2 könnte man auch mit dem USRBUS1 verbinden, wenn man den RP6 z.B. von einer EP aus zurücksetzen möchte.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Serielle Schnittstelle====&lt;br /&gt;
[[Bild:RP6_RST.JPG|thumb|RP6 RST]]&lt;br /&gt;
Neben dem USRBUS1 Stecker befinden sich 5 Lötpunkte mit den Signalen RST, TX, RX, GND, VDD (SP4 AB5: YRX, YTX, YMRESET, YVDD). Hier kann z.B. eine 5-polige Stiftleiste aufgelötet werden, um einen Anschluß an die serielle Schnittstelle zu ermöglichen.&lt;br /&gt;
&lt;br /&gt;
Von diesen 5 Lötpunkten könnte z.B. auch [http://www.roboternetz.de/phpBB2/viewtopic.php?t=32549 so] eine Verbindung zum benachbarten USRBUS1 hergestellt werden, um die serielle Schnittstelle des RP6 auf EPs zu führen.&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;
&lt;br /&gt;
====I2C-Schnittstelle====&lt;br /&gt;
[[Bild:RP6_I2C.JPG|thumb|RP6 I2C]]&lt;br /&gt;
Neben dem XBUS2 Stecker finden sich 5 Lötpunkte mit den Signalen der I2C-Schnittstelle (SP4 D12: Stecker I2C). Dies sind: VDD (Pin 1), GND, SDA, SCL, INT1 (Pin 5). Hier kann z.B. eine 5-polige Stiftleiste aufgelötet werden, um einen Anschluß an die I2C-Schnittstelle zu ermöglichen.&lt;br /&gt;
&lt;br /&gt;
Von diesen 5 Lötpunkten könnte z.B. auch eine Verbindung zum USRBUS1 oder USRBUS2 hergestellt werden, um die I2C-Schnittstelle des RP6 auf EPs zu führen, allerdings hat man SCL, SDA, INT1 ja auch schon am XBUS zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Interrupt-Leitungen====&lt;br /&gt;
[[Bild:RP6_INTx.JPG|thumb|RP6 INTx]]&lt;br /&gt;
Die Interrupt-Leitungen INTU, INT1..3, MRESET (SP4 D34: MRESET, INT1..3, INTU) sind an 5 Lötpunkten neben dem XBUS1 Stecker zu kontaktieren. Hier kann natürlich auch eine 5-polige Stiftleiste aufgelötet werden. In der Regel wird man diese Anschlüsse nicht brauchen, weil sie schon auf dem XBUS zur Verfügung stehen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====VDD/GND/+UB Anschluß====&lt;br /&gt;
[[Bild:RP6_VDDGNDUB.JPG|thumb|RP6 VDD GND +UB]]&lt;br /&gt;
In der Nähe von C4 im hinteren Bereich des Mainboards finden sich Lötpunkte (SP4 E12: YVDDx, YGNDx; SP4 D2 YUBx), an denen man VDD, GND und +UB finden kann.&lt;br /&gt;
&lt;br /&gt;
Wenn man höhere Ströme an VDD (z.B. für Servos) oder +UB (z.B. für einen anderen IRCOMM-Sender oder einen DC-Motor) entnehmen möchte, empfehlen sich diese Lötpunkte, auf die man auch Stiftleisten löten kann.&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;
====EXT Anschluß====&lt;br /&gt;
[[Bild:RP6_EXT.jpg|thumb|RP6 EXT Anschluß]]&lt;br /&gt;
Am hinteren Rand der RP6 Hauptplatine gibt es eine Reihe von 8 Lötpunkten. Dies ist der EXT Anschluß (SP1 C23: Stecker EXT):&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |Pin&lt;br /&gt;
 |Name&lt;br /&gt;
 |Beschreibung&lt;br /&gt;
 |-&lt;br /&gt;
 |1&lt;br /&gt;
 |GND&lt;br /&gt;
 |RP6 und Akku Minuspol (GND)&lt;br /&gt;
 |-&lt;br /&gt;
 |2&lt;br /&gt;
 |CHRG&lt;br /&gt;
 |Anschluß (+) für ext. Ladegerät, identisch mit Pluspol der Ladebuchse (CHARGER, Pin 1). Ladung nur möglich, wenn S1 AUS ist!&lt;br /&gt;
 |-&lt;br /&gt;
 |3&lt;br /&gt;
 |CHRG&lt;br /&gt;
 |wie Pin 2!&lt;br /&gt;
 |-&lt;br /&gt;
 |4&lt;br /&gt;
 | +BAT&lt;br /&gt;
 |Akku Pluspol über Sicherung F1&lt;br /&gt;
 |-&lt;br /&gt;
 |5&lt;br /&gt;
 | +BAT&lt;br /&gt;
 |wie Pin 4!&lt;br /&gt;
 |-&lt;br /&gt;
 |6&lt;br /&gt;
 | +UB&lt;br /&gt;
 |RP6 +UB (+7,2V=, Bereich min. +5,5 bis max. +10V=)&lt;br /&gt;
 |-&lt;br /&gt;
 |7&lt;br /&gt;
 | +UB&lt;br /&gt;
 |wie Pin 6!&lt;br /&gt;
 |-&lt;br /&gt;
 |8&lt;br /&gt;
 |GND&lt;br /&gt;
 |wie Pin 1!&lt;br /&gt;
 |-&lt;br /&gt;
|}&lt;br /&gt;
Man kann hier eine JST XH Stiftleiste gerade, 8-polig, RM 2,5mm ([http://www.conrad.de/ce/de/product/740105/Stiftleiste-gerade-RM-25-mm-Serie-XH-Rastermass-25-mm-Pole-8-Nennstrom-3-A-B8B-XH-A-LFSN-JST-Inhalt-1-St 740105]) auflöten.&lt;br /&gt;
&lt;br /&gt;
Wozu kann man diesen Anschluß nutzen?&lt;br /&gt;
&lt;br /&gt;
Der wesentliche Sinn des EXT Anschlusses besteht darin, andere Arten der Stromversorgung und der Akkuladung zu ermöglichen. Normalerweise schaltet man den RP6 mit S1 an und aus. In Stellung AUS kann der Akku geladen werden, indem man ein Ladegerät an die CHARGER Buchse anschließt. Alternativ kann man das Ladegerät mit seinem Pluspol auch an CHRG (Pins 2, 3) anschließen. Siehe auch den Abschnitt &amp;quot;Trennstellen - EXT Anschluß: Andere Stromversorgung&amp;quot; weiter unten!&lt;br /&gt;
&lt;br /&gt;
An +BAT (Pins 4, 5) kann man direkt (ohne Unterbrechung durch S1) Strom aus dem Akku entnehmen. Die Grenze des Stroms bestimmt die Sicherung F1 (2,5A). Eine weitere Möglichkeit besteht darin, über diesen Anschluß den Akku auch mit einem geeigneten Ladegerät zu LADEN. Hierbei muss man aber darauf achten, dass S1 AUSgeschaltet ist, weil sonst der RP6 über +UB eine unzulässig hohe Spannung bekommen könnte. Wenn man den Akku mit 6 Mignonzellen im RP6 nicht nutzen will (der Akku-Halter bleibt leer!), sondern nur einen externen Akku, wäre der auch mit seinem Pluspol an +BAT über eine eigene Sicherung (2,5A träge) anzuschließen.&lt;br /&gt;
&lt;br /&gt;
+UB (+7,2V) ist die Versorgungsspannung des RP6 (kommt vom Akku-Pluspol über die Sicherung F1 und Schalter S1!). Mit +UB werden die H-Brücken (Motoransteuerung) direkt und die RP6 &amp;quot;Elektronik&amp;quot; über den 5V-Spannungswandler (IC1; SP1 D3: IC1) versorgt (= VDD). An +UB könnte man den RP6 direkt mit einer Spannung von +7,2V versorgen (Absicherung nicht vergessen!), dazu muss S1 AUSgeschaltet sein, damit es keine Konflikte mit dem eingebauten Akku gibt.&lt;br /&gt;
&lt;br /&gt;
Den EXT Anschluß kann man damit nutzen für:&lt;br /&gt;
* Externes Ladegerät&lt;br /&gt;
* Externen Akku&lt;br /&gt;
* Externe Stromversorgung ohne Akku&lt;br /&gt;
* Direkte Stromentnahme aus dem Akku&lt;br /&gt;
* Ergänzungsladung mit Solarzelle&lt;br /&gt;
* Autonome Akkuladung (Ladestation mit Kontakten, Induktionsladung ...)&lt;br /&gt;
* ...&lt;br /&gt;
&lt;br /&gt;
Man sollte gewisse Elektronik-Kenntnisse haben, wenn man die Spannungsversorgung des RP6 verändert. VOR irgendwelchen Veränderungen seht euch auch zuerst den Schaltplan des RP6 (SP1) genau an!&lt;br /&gt;
&lt;br /&gt;
===Mess-/Kontaktpunkte===&lt;br /&gt;
Hier geht es um Kontaktpunkte, an denen man z.B. den Logik-Pegel (High/Low) oder eine analoge Spannung messen kann. Natürlich kann man die Signale auch zur Weiterleitung auf eine EP kontaktieren, dies wird man aber normalerweise nicht brauchen.&lt;br /&gt;
&lt;br /&gt;
====UBAT====&lt;br /&gt;
[[Bild:RP6_UBAT.JPG|thumb|RP6 UBAT]]&lt;br /&gt;
In der Mitte des Mainboards befindet sich ein Kontaktpunkt UBAT (SP1 E1: YUBAT). Dies ist ADC7 des RP6 Microcontrollers.&lt;br /&gt;
&lt;br /&gt;
Man kann hier die analoge Spannung (gegen GND) messen, die vom +UB-Spannungssensor geliefert wird.&lt;br /&gt;
&lt;br /&gt;
Die Spannung ist:&lt;br /&gt;
 UBAT = +UB / 2&lt;br /&gt;
Da der Spannungsteiler (SP1 D12: R1, R2) des +UB-Spannungssensors nicht aus Präzisionswiderständen besteht, kann man für den eigenen RP6 einen Korrekturfaktor berechnen, wenn UBAT deutlich von +UB / 2 (+ UB z.B. gemessen am EXT Stecker, Pins 6 u. 7) abweicht. Damit kann man +UB sehr viel genauer bestimmen.&lt;br /&gt;
&lt;br /&gt;
====ACS====&lt;br /&gt;
[[Bild:RP6_ACS_TSOP.JPG|thumb|RP6 ACS TSOP]]&lt;br /&gt;
Hinter dem TSOP (IC3) befindet sich der Kontaktpunkt ACS (SP2 E1: ACS).&lt;br /&gt;
&lt;br /&gt;
Dies ist der Ausgang des TSOP bzw. Eingang PB2 des RP6 Microcontrollers. Man kann hier das Ausgangssignal des IR-Empfängers abnehmen, z.B. um es mit einem Oszilloskop sichtbar zu machen.&lt;br /&gt;
&lt;br /&gt;
Rechts neben dem TSOP kann man noch die 3 Kontaktpunkte ACS_R, ACS_P und ACS_L (SP2 E2: ACS_P, ACS_R, ACS_L) des ACS-IR-Senders finden.&lt;br /&gt;
&lt;br /&gt;
Folgende Tabelle zeigt die Verbindungen:&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |Kontakt&lt;br /&gt;
 |Microcontroller-Portpin&lt;br /&gt;
 |SP-Verbindung&lt;br /&gt;
 |ACS-IR-Sendediode&lt;br /&gt;
 |-&lt;br /&gt;
 |ACS_P&lt;br /&gt;
 |über R8: ACS_PWRH (PB3), über R9: ACS_PWR (PD6)&lt;br /&gt;
 |SP2: 3&lt;br /&gt;
 |Anoden D1, D2&lt;br /&gt;
 |-&lt;br /&gt;
 |ACS_R&lt;br /&gt;
 |ACS_R (PC7)&lt;br /&gt;
 |SP2: 2&lt;br /&gt;
 |Kathode D1&lt;br /&gt;
 |-&lt;br /&gt;
 |ACS_L&lt;br /&gt;
 |ACS_L/MISO (PB6)&lt;br /&gt;
 |SP1: 5&lt;br /&gt;
 |Kathode D2&lt;br /&gt;
 |-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====IRC====&lt;br /&gt;
[[Bild:RP6_IRC.JPG|thumb|RP6 IRC]] [[Bild:RP6_IRC3.JPG|thumb|RP6 IRC3]]&lt;br /&gt;
Im der Nähe von C13 befinden sich die Lötpunkte IRC, IRC+, IRC- und IRC3 (SP2 D2: YIRC; SP2 CD2: IRC+/-; SP2 C2: IRC3). Zusammen mit der Trennstelle IRC (siehe Abschnitt &amp;quot;Trennstellen - IRC&amp;quot; weiter unten!) kann man diese Kontaktstellen im Umfeld des IRCOMM-Sendedioden Treibers IRLML2502PBF (SP2 CD12: Q5) finden. Am Kontaktpunkt IRC findet sich der Eingang des Treibers bzw. Ausgang PD7 des RP6 Microcontrollers. IRC+, IRC- sind die Kontaktpunkte, an denen die IRCOMM-Sendedioden D3, D4 in Reihe auf der Sensorplatine angeschlossen sind (IRC+ = Anode). IRC3 ist verbunden mit dem Trennstellen-Lötpunkt IRC1 und liegt bei geschlossener Trennstelle IRC an +UB.&lt;br /&gt;
&lt;br /&gt;
Was läßt sich mit diesen Kontaktpunkten machen:&lt;br /&gt;
* Der IRCOMM-Sender ist der zweitgrößte Stromverbraucher des RP6 (nach dem Antrieb). An IRC3 kann daher eine eigene Stromversorgung für die IRCOMM-Sendedioden angeschlossen werden. Dazu muss die Trennstelle IRC zwischen ihren Lötpunkten IRC1, IRC2 aufgetrennt werden.&lt;br /&gt;
* An IRC+, IRC- könnten andere/weitere IRCOMM-Sendedioden angeschlossen werden (Anode an IRC+). Wenn der Vorwiderstand R6 (SP2 C2: R6) der Sendedioden dann nicht mehr paßt (bezügl. Leistung und/oder Widerstandswert), können neue leistungsfähigere IRCOMM-Sendedioden zwischen IRC3 und IRC- (Anode an IRC3) mit einem dafür geeigneten Vorwiderstand angebracht werden.&lt;br /&gt;
&lt;br /&gt;
====LS====&lt;br /&gt;
[[Bild:RP6_LS.JPG|thumb|RP6 LS]]&lt;br /&gt;
Die beiden Lötpunkte LS_L und LS_R (SP2 B12: LS_L, LS_R) neben R7 vorn auf dem Mainboard sind die Ausgänge der Helligkeitssensoren (links und rechts) bzw. die ADC-Eingänge ADC3 und ADC2 des RP6 Microcontrollers.&lt;br /&gt;
&lt;br /&gt;
Hier kann man die Spannungen messen, die den Helligkeitswerten entsprechen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====BP, S====&lt;br /&gt;
[[Bild:RP6_BP_S.JPG|thumb|RP6 BP S]]&lt;br /&gt;
Die Messpunkte BPL, BPR und der Kontaktpunkt S (SP2 E2: S; SP2 E3: BPR; SP2 E4: BPL) befinden sich am vorderen Platinenrand. BPL und BPR sind die Kontakte der Bumper. S ist eine nicht genutzte Verbindung zwischen dem Mainboard und der Sensorplatine, die über die Verbindung SP1, Pin 3, geführt wird (siehe folgende Tabelle!).&lt;br /&gt;
&lt;br /&gt;
Hier eine Tabelle mit der Belegung der 90°-Winkelverbindung SP1, SP2 zwischen dem RP6 Mainboard und der Sensorplatine: &lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |Pin&lt;br /&gt;
 |SP1&lt;br /&gt;
 |SP2&lt;br /&gt;
 |-&lt;br /&gt;
 |1&lt;br /&gt;
 |LS_L  --- Light Sensor Left&lt;br /&gt;
 |IRC-  --- IRCOMM-&lt;br /&gt;
 |-&lt;br /&gt;
 |2&lt;br /&gt;
 |BPL   --- Bumper Left&lt;br /&gt;
 |ACS_R --- ACS Right&lt;br /&gt;
 |-&lt;br /&gt;
 |3&lt;br /&gt;
 |S     --- Free for all&lt;br /&gt;
 |ACS_P --- ACS Power&lt;br /&gt;
 |-&lt;br /&gt;
 |4&lt;br /&gt;
 |GND&lt;br /&gt;
 |VDD&lt;br /&gt;
 |-&lt;br /&gt;
 |5&lt;br /&gt;
 |ACS_L --- ACS Left&lt;br /&gt;
 |BPR   --- Bumper Right&lt;br /&gt;
 |-&lt;br /&gt;
 |6&lt;br /&gt;
 |IRC+  --- IRCOMM+&lt;br /&gt;
 |LS_R  --- Light Sensor Right&lt;br /&gt;
 |-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====ENC====&lt;br /&gt;
[[Bild:RP6_ENC.JPG|thumb|RP6 ENC]]&lt;br /&gt;
Die beiden Messpunkte ENCL, ENCR (SP4 B12: ENCL, ENCR) sind die Ausgänge der Radencoder. ENCL ist verbunden mit PD2 (INT0), ENCR mit PD3 (INT1) des RP6 Microcontrollers.&lt;br /&gt;
&lt;br /&gt;
===Trennstellen===&lt;br /&gt;
An diesen Stellen können Leiterbahnen unterbrochen werden, um Funktionen zu deaktivieren oder anders zu nutzen.&lt;br /&gt;
&lt;br /&gt;
=====Getrennte Stromversorgung für ADC0/1=====&lt;br /&gt;
Wenn man für die analogen Sensoren an ADC0/1 (siehe Abschnitt &amp;quot;Anschlüsse - Analoge Sensoren an ADC0/1&amp;quot; weiter oben!) eine GETRENNTE Stromversorgung vorsehen will und/oder mit Codierbrücke (oder MOSFET) die Stromversorgung abschaltbar machen möchte, muss man erst Vorarbeit leisten.&lt;br /&gt;
[[Bild:RP6_SV.JPG|thumb|RP6 SV]]&lt;br /&gt;
&lt;br /&gt;
Man braucht dazu:&lt;br /&gt;
* 1-reihige Stiftleiste RM 2,54mm (z.B. 36-polig 732478)&lt;br /&gt;
* Evtl.: Eine Codierbrücke (z.B. aus Set 742902)&lt;br /&gt;
* Evtl.: Eine 1-polige Steckbuchse mit Litze zur ext. Stromversorgung&lt;br /&gt;
Es muss eine kurze Leiterbahn zwischen den Punkten &amp;quot;SV1&amp;quot; und &amp;quot;SV2&amp;quot; (SP2 A1: SV1, SV2; zwischen dem PROG/UART- und dem USRBUS1-Stecker) aufgetrennt werden. Die Leiterbahn befindet sich auf der Lötseite der Platine und muss mit einem scharfen Messer oder einem speziellen Leiterbahn-Unterbrecher zwischen den beiden Lötpunkten unterbrochen werden. Man sollte anschließend mit einem Widerstandsmeßgerät zwischen SV1 und SV2 nachmessen: Es sollte keine Verbindung mehr bestehen. Jetzt trennt man von der 1-reihigen Stiftleiste 2 Kontakte ab und lötet sie auf die Punkte SV1/SV2.&lt;br /&gt;
&lt;br /&gt;
Man kann hier zunächst eine Codierbrücke aufstecken. Damit versorgt der RP6 Akku die Sensoren mit 5V an den Pins VDD. Möchte man später eine getrennte 5V-Spannung anlegen, zieht man einfach die Codierbrücke ab und speist die externe 5V-Spannung (mit einer 1-poligen Steckbuchse) am Pin SV2 ein. Achtung: An Pin SV1 wird dann nichts angeschlossen!&lt;br /&gt;
&lt;br /&gt;
Anstelle der Codierbrücke kann man natürlich auch einen MOSFET anschließen, um die Sensoren per Software abschalten zu können.&lt;br /&gt;
&lt;br /&gt;
====ACS====&lt;br /&gt;
[[Bild:RP6_ACS_JP.JPG|thumb|RP6 ACS JP]]&lt;br /&gt;
Die Trennstelle ACS (SP2 E1: YIR1, YIR2; SP2 F1: YIR3) befindet sich neben C29*. Sie besteht aus 3 Lötpunkten, von denen die linken beiden (IRC1, IRC2) verbunden sind. Trennt man die Leiterbahn zwischen diesen Lötpunkten auf und verbindet stattdessen die rechten beiden Lötpunkte (IRC2, IRC3) mit etwas Lötzinn oder mit einem SMD Null Ohm Widerstand, dann ist der IR-Empfänger (TSOP, IC3) dauerhaft EINgeschaltet und kann nicht mehr über das Signal PWRON (PB4) geschaltet werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====IRC====&lt;br /&gt;
[[Bild:RP6_IRC_JP.JPG|thumb|RP6 IRC JP]]&lt;br /&gt;
Die Trennstelle IRC (SP2 C1: IRC1..2) ist eng verknüpft mit den Mess- und Kontaktpunkten des IRCOMM-Senders (siehe Abschnitt &amp;quot;Mess-/Kontaktpunkte - IRC&amp;quot; weiter oben!). Wenn man sie auftrennt, kann man den IRCOMM-Sender mit einer getrennten Stromversorgung anstelle von +UB des RP6 versehen. Dies ist sehr sinnvoll, wenn man diese Funktion häufig verwendet oder sogar noch leistungsfähigere IR-Sendedioden einbaut, denn der IRCOMM-Sender ist der zweitgrößte Stromfresser (nach dem Antrieb) auf dem RP6 (von Erweiterungsplatinen und EPs Marke Eigenbau einmal abgesehen!). Man kann hier natürlich auch eine 2-polige Stiftleiste einlöten, um die Verbindung zu +UB mit einer Codierbrücke trennbar zu machen. Eine getrennte Stromversorgung +7,2V (Bereich: +5,5 .. +10V) kann man an IRC1 einspeisen. IRC1 dieser Trennstelle ist mit dem Kontaktpunkt IRC3 (siehe Abschnitt &amp;quot;Mess-/Kontaktpunkte - IRC&amp;quot; weiter oben!) verbunden. &lt;br /&gt;
&lt;br /&gt;
====RP6 Antrieb====&lt;br /&gt;
Mit den folgenden Trennstellen kann man den RP6 Antrieb (H-Brücken und Motoren) fast komplett vom Rest des RP6 Mainboards abtrennen (es bleibt nur die 5V-Versorgung (VDD) von IC4, T1, T2 bestehen!). Damit ist es möglich, mit dem RP6 Mainboard einen ganz anderen Antrieb (also z.B. ein anderes Roboter-Chassis mit eigenen Motoren und H-Brücken) zu steuern. Umgekehrt könnte man den RP6 Antrieb auch deshalb abtrennen, um ihn durch ein anderes Prozessorsystem (z.B. auch eine M32!) anzusteuern. It's up to you!&lt;br /&gt;
&lt;br /&gt;
=====+UB Power=====&lt;br /&gt;
[[Bild:RP6_HB_Power.jpg|thumb|RP6 HB Power]]&lt;br /&gt;
Der RP6 Antrieb wird direkt aus dem Akku (über S1 und F1) mit 7,2V (+UB) versorgt. Diese Stromversorgung kann man komplett abtrennen. Die Trennstelle (SP3 E34: X) liegt unter der Sicherung F1 (siehe Abb. RP6 HB Power). Zwischen den beiden doppelten Lötflächen befinden sich auf der Lötseite (Unterseite) des Mainboards vier parallele Leiterbahnen, die aufgetrennt werden müssen. Der Pluspol einer externen Spannung zur Versorgung des RP6 Antriebs kann dann mit einer Kabelverbindung an den doppelten Lötflächen (mit einem &amp;quot;+&amp;quot; gekennzeichnet) direkt neben dem Leistungswiderstand (R27) angeschlossen werden. Eine Absicherung dieser Stromversorgung sollte man unbedingt vorsehen (2,5A träge)!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=====Stromsensoren=====&lt;br /&gt;
[[Bild:RP6_CS.JPG|thumb|RP6 CS]]&lt;br /&gt;
Um den Motorstrom der beiden Motoren des RP6 zu messen, wird ein Dual-Operationsverstärker (IC5 = 27M2C; SP3 B23/D23: IC5B/A) eingesetzt. Dieses IC wird über PWRON (PB4) mit Strom versorgt. Die Stromsensoren funktionieren also nicht, wenn PWRON Low-Pegel führt (Befehl powerOFF() der RP6 Library!). Auf dem RP6 Mainboard gibt es eine Trennstelle mit drei Lötflächen (SP3 E34: CS1, CS2, CS3). Sie befindet sich auf dem Mainboard neben C23. Möchte man IC5 nicht mehr über PWRON mit Strom versorgen, sondern über VDD (+5V), dann trennt man die Leiterbahn zwischen den linken beiden Lötpunkten (CS1, CS2) auf und verbindet die rechten beiden Lötpunkte (CS2, CS3) mit etwas Lötzinn oder einem SMD Null Ohm Widerstand. Danach sind die Stromsensoren immer eingeschaltet und können über PWRON nicht mehr geschaltet werden. Alternativ kann man an CS2 auch eine externe Versorgungsspannung (+5V) für IC5 einspeisen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=====DR/MR/ML/DL=====&lt;br /&gt;
[[Bild:RP6_DR_MR_ML_DL.JPG|thumb|RP6 DR MR ML DL]]&lt;br /&gt;
An diesen Trennstellen können die Eingänge der H-Brücke für die Geschwindigkeit (PWM) und Drehrichtung der Motoren von den Portpins des Microcontrollers abgetrennt werden.&lt;br /&gt;
Für den rechten Motor sind dies die Trennstellen MR1/2 und DR1/2 (SP3 A23: MR1/2, DR1/2), für den linken Motor ML1/2 und DL1/2 (SP3 F23: ML1/2, DL1/2).&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |Trennstelle&lt;br /&gt;
 |Portpin&lt;br /&gt;
 |Funktion H-Brücke&lt;br /&gt;
 |-&lt;br /&gt;
 |MR1/2&lt;br /&gt;
 |PD5 (OC1A)&lt;br /&gt;
 |PWM Motor rechts&lt;br /&gt;
 |-&lt;br /&gt;
 |DR1/2&lt;br /&gt;
 |PC3 (TMS)&lt;br /&gt;
 |Fahrtrichtung rechts&lt;br /&gt;
 |-&lt;br /&gt;
 |ML1/2&lt;br /&gt;
 |PD4 (OC1B)&lt;br /&gt;
 |PWM Motor links&lt;br /&gt;
 |-&lt;br /&gt;
 |DL1/2&lt;br /&gt;
 |PC2 (TCK)&lt;br /&gt;
 |Fahrtrichtung links&lt;br /&gt;
 |-&lt;br /&gt;
|}&lt;br /&gt;
Trennt man die Leiterbahn (auf der Lötseite des RP6 Mainboards) zwischen den Lötpunkten der Trennstellen auf, kann man die Eingänge der H-Brücke (Mx1, Dx1) z.B. mit einem anderen Microcontroller verbinden. Die Ausgänge (Portpins) des RP6 Microcontrollers (Mx2, Dx2) können dann anders genutzt werden. Natürlich kann man auf die Lötpunkte dieser Trennstellen auch Stiftleisten löten, um den Anschluß steckbar zu machen.&lt;br /&gt;
&lt;br /&gt;
=====MCR/MCL=====&lt;br /&gt;
[[Bild:RP6_MCR_MCL.JPG|thumb|RP6 MCR MCL]]&lt;br /&gt;
An diesen Trennstellen können die Motorstromsensoren von den ADC-Eingängen des Microcontrollers abgetrennt werden.&lt;br /&gt;
&lt;br /&gt;
Für den rechten Sensor ist dies die Trennstelle MCR1/2 (SP3 A1: MCR1, MCR2), für den linken Sensor MCL1/2 (SP3 E1: MCL1, MCL2).&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |Trennstelle&lt;br /&gt;
 |Portpin&lt;br /&gt;
 |Funktion H-Brücke&lt;br /&gt;
 |-&lt;br /&gt;
 |MCR1/2&lt;br /&gt;
 |PA5 (ADC5)&lt;br /&gt;
 |Motorstrom rechts&lt;br /&gt;
 |-&lt;br /&gt;
 |MCL1/2&lt;br /&gt;
 |PA6 (ADC6)&lt;br /&gt;
 |Motorstrom links&lt;br /&gt;
 |-&lt;br /&gt;
|}&lt;br /&gt;
Trennt man die Leiterbahn (auf der Lötseite des RP6 Mainboards) zwischen den Lötpunkten der Trennstellen auf, kann man die ADC-Eingänge (Portpins) des RP6 Microcontrollers (MCx1) anders nutzen und die Ausgänge der Motorstromsensoren (MCx2) z.B. mit ADC-Eingängen eines anderen Microcontrollers verbinden. Natürlich kann man auf die Lötpunkte dieser Trennstellen auch Stiftleisten löten, um den Anschluß steckbar zu machen.&lt;br /&gt;
&lt;br /&gt;
====PWRON-LED====&lt;br /&gt;
[[Bild:RP6_PWRON_L.JPG|thumb|RP6 PWRON L]]&lt;br /&gt;
Auf dem RP6 Mainboard gibt es eine gelbe LED, die anzeigt, ob PWRON High-Pegel hat. Mit einer Trennstelle neben dieser LED (SP2 D4: YL1, YL2) kann diese LED deaktiviert werden (z.B. um Strom zu sparen).&lt;br /&gt;
&lt;br /&gt;
Dazu trennt man die Leiterbahn zwischen den Lötpunkten auf. Soll die LED wieder aktiviert werden, verbindet man die Lötpunkte wieder mit etwas Lötzinn oder einem SMD Null Ohm Widerstand.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====+UB Sensor====&lt;br /&gt;
[[Bild:RP6_UB.JPG|thumb|RP6 UB]]&lt;br /&gt;
Die Versorgungsspannung +UB des RP6 wird mit dem +UB-Spannungssensor an PA7 (ADC7) gemessen. Will man diesen Spannungssensor mit seinem Eingangsspannungsteiler R1, R2 (SP1 D12: R1, R2) von +UB abtrennen (z.B. um ihn anders zu verwenden), gibt es eine Trennstelle UB1/2 (SP1 D2: UB1, UB2). Trennt man die Leiterbahn auf der Lötseite des RP6 Mainboards zwischen den Lötpunkten auf, kann +UB nicht mehr gemessen werden. Man kann dann den Lötpunkt UB2 mit einem anderen Messpunkt (z.B. mit +BAT) verbinden und dort die Spannung (0..10V) messen. Natürlich kann man auf die Lötpunkte dieser Trennstellen auch Stiftleisten löten, um den Anschluß steckbar zu machen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====EXT Anschluß: Andere Stromversorgung====&lt;br /&gt;
[[Bild:RP6_S1_CHRG.jpg|thumb|RP6 S1 CHRG]]&lt;br /&gt;
Wenn man für den RP6 eine andere Stromversorgung oder Ladeschaltung anschließen will, geht dies gut am EXT Anschluß (SP1 C23: Stecker EXT). Siehe auch den Abschnitt &amp;quot;Anschlüsse - EXT Anschluß&amp;quot; weiter oben! Dann muss der Schalter S1 dauerhaft AUSgeschaltet bleiben und die Verbindung zwischen S1 und CHRG des EXT Anschlusses (SP1 C3: X) unterbrochen werden. Diese Trennstelle befindet sich auf der Lötseite (Unterseite) des RP6 Mainboards etwas versteckt zwischen S1 (Pin 3) und der benachbarten Leiterbahn, die CHRG des EXT Anschlusses mit der Ladebuchse CHARGER (Pin 1 +) verbindet. Dort sind fünf kurze, parallele Leiterbahnen zu unterbrechen (siehe gelbe Markierung in der Abb. RP6 S1 CHRG!). Will man das nicht machen, darf man die Ladebuchse CHARGER auf jeden Fall nicht mehr nutzen!&lt;br /&gt;
&lt;br /&gt;
===Lochraster-Felder===&lt;br /&gt;
Auf diesen Feldern kann man eigene kleine Schaltungen aufbauen. An jedem der sechs Felder stehen VDD (+5V) und GND zur Verfügung (SP4 E12: YVDDx, YGNDx).&lt;br /&gt;
&lt;br /&gt;
Bitte beachten: Die Lochreihen oder -spalten, die mit einer eckigen Klammer &amp;quot;[&amp;quot; markiert sind, liegen auf der Lötseite (Unterseite) direkt auf dem Rahmen des Chassis! Hier können also keine Drähte von unten verlötet werden.&lt;br /&gt;
&lt;br /&gt;
====Vorn links====&lt;br /&gt;
Das kleine Lochrasterfeld vorn links kann z.B. für Beleuchtung (Blinker, Scheinwerfer links) oder auch für einen zusätzlichen Sensor genutzt werden.&lt;br /&gt;
Zur Verfügung steht eine 2-adrige Verbindung zum mittleren Lochrasterfeld links.&lt;br /&gt;
&lt;br /&gt;
In der Nähe dieses Lochrasterfeldes gibt es auch:&lt;br /&gt;
* IO3, IO4 (SP2 E3: IO3, IO4)&lt;br /&gt;
* ADC0 (SP2 B1: ADC0)&lt;br /&gt;
&lt;br /&gt;
====Mitte links====&lt;br /&gt;
[[Bild:RP6_Lochfeld_LM.JPG|thumb|RP6 Lochrasterfeld Mitte links]]&lt;br /&gt;
Das größere Lochrasterfeld Mitte links kann z.B. für eine kleinere Schaltung zur Ansteuerung der Beleuchtung/Sensoren auf den Lochrasterfeldern vorn und hinten links oder für andere Zwecke genutzt werden.&lt;br /&gt;
&lt;br /&gt;
Es stehen hier folgende Anschlüsse zur Verfügung:&lt;br /&gt;
* 2-adrige Verbindung zum Lochrasterfeld vorn links&lt;br /&gt;
* 2-adrige Verbindung zum Lochrasterfeld hinten links&lt;br /&gt;
* ST1/ST2 zum Anschluß weiterer Start/Stop Taster (SP2 D2: ST1/2)&lt;br /&gt;
* PWR (SP2 D2: YPWR1)&lt;br /&gt;
* I2C-Bus (SCL, SDA; SP4 C1: YSCL1, YSDA1)&lt;br /&gt;
* +UB (SP4 D2: YUB1)&lt;br /&gt;
In der Nähe dieses Lochrasterfeldes gibt es auch:&lt;br /&gt;
* Serielle Schnittstelle (RST, TX, RX; SP4 AB5: YRX, YTX, YMRESET, YVDD)&lt;br /&gt;
* USRBUS1 (vorn; SP4 E34: Y1'..Y14')&lt;br /&gt;
&lt;br /&gt;
=====Schaltungsvorschläge=====&lt;br /&gt;
Wie kann z.B. eine Schaltung für Beleuchtungseffekte oder Sensoren aussehen?&lt;br /&gt;
&lt;br /&gt;
Man könnte 8 zusätzliche Schaltkanäle mit dem I2C-Portexpander-IC PCF8574(A)P gewinnen. Dieses IC passt mit wenigen Zusatzteilen auf die mittlere Lochrasterfläche. Angesteuert wird es über den I2C-Bus. Mit den 8 Ausgängen lassen sich einige Beleuchtungseffekte erreichen, die dann über Software schaltbar sind.&lt;br /&gt;
&lt;br /&gt;
Alternativ kann man auch das IC PCF8591P z.B. für den Anschluß von analogen Sensoren verwenden. Auch dieser Baustein wird über I2C angesteuert. Beide ICs sind bei [http://www.reichelt.de./ Reichelt] erhältlich.&lt;br /&gt;
&lt;br /&gt;
Will man nicht den I2C-Bus benutzen, kann man als I/O-Ports IO1..IO4 oder als analoge Eingänge ADC0 und ADC1 verwenden. Auch SCL und SDA stehen als I/O-Ports zur Verfügung, wenn der I2C-Bus im ganzen System nicht verwendet werden soll.&lt;br /&gt;
&lt;br /&gt;
Wichtig für Zusatzschaltungen, die fest auf dem RP6 verlötet werden, sind zwei Aspekte:&lt;br /&gt;
* Wenn sie die Stromversorgung belasten, sollten sie (z.B. über einen Transistor oder MOSFET) abschaltbar sein. Dazu kann man auch das Signal PWR heranziehen, das auf beiden mittleren Lochrasterflächen zur Verfügung steht. Dann kann man mit dem Befehl &amp;quot;powerOFF()&amp;quot; der RP6 Library die Stromversorgung per Software abschalten.&lt;br /&gt;
* Wenn man auch anderweitig genutzte Portpins (SDA, SCL, IO1..IO4, ADC0/1) für die eigene Schaltung einsetzt, sollte man die Verbindung zu den Portpins mit einer abziehbaren Codierbrücke trennbar machen.&lt;br /&gt;
&lt;br /&gt;
====Hinten links====&lt;br /&gt;
Das kleine Lochrasterfeld hinten links kann z.B. für Beleuchtung (Blinker, Rücklicht links) oder auch für einen zusätzlichen Sensor genutzt werden.&lt;br /&gt;
Zur Verfügung steht eine 2-adrige Verbindung zum mittleren Lochrasterfeld links.&lt;br /&gt;
&lt;br /&gt;
In der Nähe dieses Lochrasterfeldes gibt es auch:&lt;br /&gt;
* EXT Anschluß (SP1 C23: Stecker EXT)&lt;br /&gt;
&lt;br /&gt;
====Vorn rechts====&lt;br /&gt;
Das kleine Lochrasterfeld vorn rechts kann z.B. für Beleuchtung (Blinker, Scheinwerfer rechts) oder auch für einen zusätzlichen Sensor genutzt werden.&lt;br /&gt;
Zur Verfügung steht eine 2-adrige Verbindung zum mittleren Lochrasterfeld rechts.&lt;br /&gt;
&lt;br /&gt;
In der Nähe dieses Lochrasterfeldes gibt es auch:&lt;br /&gt;
* IO1, IO2 (SP2 E3: IO1, IO2)&lt;br /&gt;
* ADC1 (SP2 B1: ADC1)&lt;br /&gt;
&lt;br /&gt;
====Mitte rechts====&lt;br /&gt;
Das größere Lochrasterfeld Mitte rechts kann z.B. für eine kleinere Schaltung zur Ansteuerung der Beleuchtung/Sensoren auf den Lochrasterfeldern vorn und hinten rechts oder für andere Zwecke genutzt werden.&lt;br /&gt;
&lt;br /&gt;
Es stehen hier folgende Anschlüsse zur Verfügung:&lt;br /&gt;
* 2-adrige Verbindung zum Lochrasterfeld vorn rechts&lt;br /&gt;
* 2-adrige Verbindung zum Lochrasterfeld hinten rechts&lt;br /&gt;
* PWR (SP2 D2: YPWR2)&lt;br /&gt;
* I2C-Bus (SCL, SDA; SP4 C1: YSCL2, YSDA2)&lt;br /&gt;
* +UB (SP4 D2: YUB2)&lt;br /&gt;
In der Nähe dieses Lochrasterfeldes gibt es auch:&lt;br /&gt;
* Interrupt-Anschluß (INTU, INT1..3, MRESET; SP4 D34: MRESET, INT1..3, INTU)&lt;br /&gt;
* USRBUS2 (hinten; SP4 E34: Y1..Y14)&lt;br /&gt;
&lt;br /&gt;
====Hinten rechts====&lt;br /&gt;
Das kleine Lochrasterfeld hinten rechts kann z.B. für Beleuchtung (Blinker, Rücklicht rechts) oder auch für einen zusätzlichen Sensor genutzt werden.&lt;br /&gt;
Zur Verfügung steht eine 2-adrige Verbindung zum mittleren Lochrasterfeld rechts.&lt;br /&gt;
&lt;br /&gt;
In der Nähe dieses Lochrasterfeldes gibt es auch:&lt;br /&gt;
* EXT Anschluß (SP1 C23: Stecker EXT)&lt;br /&gt;
* Akku-Anschluß (SP1 B3: BATTERY)&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Erweiterungen==&lt;br /&gt;
Auf / An den RP6 könnte man z.B. noch folgendes anbauen / erweitern:&lt;br /&gt;
&lt;br /&gt;
* Einen Greifarm&lt;br /&gt;
* Einen Ultraschallsensor&lt;br /&gt;
* Zwei Lichtsensoren hinten, um die hellste / dunkelste Stelle im Raum besser zu finden&lt;br /&gt;
* Einen digitalen Kompass&lt;br /&gt;
* uvm.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Erweiterungs-Module==&lt;br /&gt;
&lt;br /&gt;
Es sind von Arexx schon einige Erweiterungsmöglichkeiten auf dem Markt. Zum Ersten die Experimentierplatinen ([http://www.conrad.de/ce/de/product/191537/Arexx-RP6-Experimentierplatine 191537] AUSVERKAUFT!), die zum Erstellen von eigenen Schaltungen und Sensoren gedacht sind, und von denen eine schon im Lieferumfang des RP6 enthalten war, das Erweiterungsboard RP6 CONTROL M32 ([http://www.conrad.de/ce/de/product/191550/Arexx-RP6-ATMEGA32-Erweiterungssatz 191550] AUSVERKAUFT!) und die RP6 CCPRO M128 ([http://www.conrad.de/ce/de/product/191563/Arexx-RP6-CC-PRO-MEGA128-Erweiterungssatz 191563]).&lt;br /&gt;
&lt;br /&gt;
Die Boards kann man dann über den I2C Bus mit dem Mainboard kommunizieren lassen.  Es ist sehr sinnvoll, die Module symmetrisch hintereinander zu stapeln und nicht mehr als 6-8 Module zu verbauen, weil der Roboter sonst immer schwerer und langsamer wird. Basierend auf dem Master-Slave System könnte man so bis zu 127 Slaves anschließen. Zudem ist es ratsam, qualitativ hochwertige Akkus und ein Ladegerät mit passendem Stecker zu verwenden, da man ansonsten immer das Mainboard abschrauben müsste um an die Akkus heranzukommen. Für den Fall wurde extra eine Ladebuchse eingebaut.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Experimentierplatine ===&lt;br /&gt;
[[Bild:RP6_Exp.jpg|RP6 Experimentierplatine]]&lt;br /&gt;
&lt;br /&gt;
====Beschreibung====&lt;br /&gt;
Die Experimentier-Platine ist dazu gedacht, eigene Schaltungen auf dem RP6 zu realisieren, und ist seit Mai 2020 bei CONRAD ausverkauft. Sie wird über den I²C-Bus mit den anderen Erweiterungsmodulen verbunden. Ausserdem ist es sinnvoll, die (freien) I/O-Ports (ADC-Kanäle) der RP6 Base, des M32 Erweiterungsmoduls bzw. des CCPRO M128 Moduls über ein [http://www.reichelt.de/?;ACTION=3;LA=444;GROUP=C63;GROUPID=3328;ARTICLE=47637;START=0;SORT=artnr;OFFSET=16;SID=1580faBqwQAQ8AAGY-ZAM7cd511ee04a106a88a359faaac0071e2 10-Pol-Flachbandkabel] mit [http://www.reichelt.de/?ACTION=3;GROUP=C151;GROUPID=3231;ARTICLE=14571;SID=1580faBqwQAQ8AAGY-ZAM7cd511ee04a106a88a359faaac0071e2 Stecker] auf die Experimentierplatine zu führen, weil es übersichtlicher bleibt und keine Kabel lose herumhängen. Auf der Experimentierplatine kann man dann LEDs oder einen Temperatursensor an die I/O-Ports bzw. an die ADC-Kanäle anschießen.&lt;br /&gt;
&lt;br /&gt;
====Technische Daten====&lt;br /&gt;
{|  {{Blauetabelle}} &lt;br /&gt;
|'''Mikrocontroller:'''&lt;br /&gt;
|Keiner&lt;br /&gt;
|-&lt;br /&gt;
|'''Speicher:'''&lt;br /&gt;
|Keiner&amp;lt;br/&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|'''Programmierung:'''&lt;br /&gt;
|Kein Programmieradapter&lt;br /&gt;
|-&lt;br /&gt;
|'''Vorhandene Sensoren:'''&lt;br /&gt;
|Keine&amp;lt;br/&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|'''Vorhandene Aktoren:'''&lt;br /&gt;
|Keine&amp;lt;br/&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|'''Abmessungen:'''&lt;br /&gt;
|(L &amp;amp;times; B &amp;amp;times; H) 112 &amp;amp;times; 90 &amp;amp;times; 10 mm&lt;br /&gt;
|-&lt;br /&gt;
|'''Ausführung:'''&lt;br /&gt;
|Bausatz&lt;br /&gt;
|-&lt;br /&gt;
|'''Stromversorgung:'''&lt;br /&gt;
|6 AA NiMH Akkus (über die RP6 Base)&lt;br /&gt;
|-&lt;br /&gt;
|'''Hersteller:'''&lt;br /&gt;
|Arexx Niederlande&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Schaltungsideen ====&lt;br /&gt;
Auf der / den Experimentierplatinen könnte man z.B. folgendes realisieren:&lt;br /&gt;
&lt;br /&gt;
* eine Kameraschaltung (wie [http://www.rn-wissen.de/index.php/RP6_Kamera_-_Mitmach-Projekt hier] gezeigt)&lt;br /&gt;
* Scheinwerfer, Rücklichter, Blinker etc. (ABER immer mit Vorwiderstand!!!)&lt;br /&gt;
* ein LED-Lauflicht (über I/O-Expander, gibt´s beim [http://www.reichelt.de/?ACTION=3;ARTICLE=14527;PROVID=2402 Reichelt])&lt;br /&gt;
* mehr ADC-Kanäle (über ADC-Expander, einfach mal nach PCF8591 [http://www.google.de/search?q=PCF8591 googlen])&lt;br /&gt;
* eine Wetterstation mit Luftfeuchtemesser, Temperaturfühler und Lichtmesser ([http://www.roboternetz.de/phpBB2/viewtopic.php?t=52298 hier] gibt es eine Wetterstation uvm.)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== RP6 CONTROL M32 Platine ===&lt;br /&gt;
[[Bild:RP6Control_M32.jpg|RP6 CONTROL M32]]&lt;br /&gt;
&lt;br /&gt;
====Beschreibung====&lt;br /&gt;
Auf der M32 ([http://www.conrad.de/ce/de/product/191550/Arexx-RP6-ATMEGA32-Erweiterungssatz 191550]) lassen sich weitere LEDs, Sensoren oder ähnliches anschließen, außerdem steht ein weiterer ATMEGA32 zur Verfügung, welcher sich gut im Master Modus betreiben lässt. Es sind ein Mikrofonsensor, fünf Taster, vier Status-LEDs, ein Display-Port, ein Beeper, 6 freie ADC-Kanäle, 8 freie I/O-Ports, ein Programmieradapter, ein JTAG-Anschluss, eine ISP-Programmierschnittstelle sowie ein freier Steckplatz für ein EEPROM verfügbar.&lt;br /&gt;
&lt;br /&gt;
Seit Ende 2021 ist die M32 bei CONRAD ausverkauft!&lt;br /&gt;
&lt;br /&gt;
====Technische Daten====&lt;br /&gt;
{|  {{Blauetabelle}} &lt;br /&gt;
|'''Mikrocontroller:'''&lt;br /&gt;
|AVR [[ATmega32]]&lt;br /&gt;
|-&lt;br /&gt;
|'''Speicher:'''&lt;br /&gt;
|32 kB [[Flash]]-Speicher, davon 1 kB bereits vom Bootloader belegt&amp;lt;br/&amp;gt;&lt;br /&gt;
2 kB SRAM&amp;lt;br/&amp;gt; &lt;br /&gt;
1 kB [[EEPROM]]&lt;br /&gt;
|-&lt;br /&gt;
|'''Programmierung:'''&lt;br /&gt;
|Über AVR-[[Bootloader]], belegt ca. 1 kB des Flash-Speichers&lt;br /&gt;
|-&lt;br /&gt;
|'''Vorhandene Sensoren:'''&lt;br /&gt;
|1 Mikrofonsensor&amp;lt;br/&amp;gt;&lt;br /&gt;
5 Eingabetaster&amp;lt;br/&amp;gt;&lt;br /&gt;
14 I/O Ports, davon 6 ADC-Wandler&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|'''Vorhandene Aktoren:'''&lt;br /&gt;
|1 Beeper&amp;lt;br/&amp;gt;&lt;br /&gt;
4 Status-LEDs&amp;lt;br/&amp;gt;&lt;br /&gt;
1 LC-Display-Port&amp;lt;br/&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|'''Abmessungen:'''&lt;br /&gt;
|(L &amp;amp;times; B &amp;amp;times; H) 112 &amp;amp;times; 90 &amp;amp;times; 15 mm&lt;br /&gt;
|-&lt;br /&gt;
|'''Ausführung:'''&lt;br /&gt;
|Fertig aufgebautes Erweiterungsmodul&lt;br /&gt;
|-&lt;br /&gt;
|'''Stromversorgung:'''&lt;br /&gt;
|6 AA NiMH Akkus (über die RP6 Base)&lt;br /&gt;
|-&lt;br /&gt;
|'''Hersteller:'''&lt;br /&gt;
|Arexx Niederlande&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Umbau-Optionen ====&lt;br /&gt;
Dieser Absatz soll die Möglichkeiten der RP6 CONTROL M32 Platine (im Folgenden &amp;quot;M32&amp;quot; genannt) auflisten, die es gibt, um auf einfache Weise weitere Anschlüsse oder Verbindungen zu ermöglichen. Nicht beschrieben werden die Anschlußmöglichkeiten, die in Form der vorhandenen Wannenstecker sowieso gegeben sind (z.B. am LCD-, I/O- oder ADC-Stecker). Im Text gibt es Verweise auf den Schaltplan der M32 (RP6_CONTROL_M32.PDF) in der Form: (SP2 B1: Bauteil).  Dies bedeutet, dass man das Bauteil auf Blatt 2 des RP6-M32-Schaltplans im Feld B1 finden kann.&lt;br /&gt;
&lt;br /&gt;
Folgende Möglichkeiten zum Umbau/Ausbau sind vorgesehen:&lt;br /&gt;
* Zweites SPI-EEPROM (IC5)&lt;br /&gt;
* Zwei analoge Sensoren, evtl. mit getrennter Stromversorgung&lt;br /&gt;
* ISP (In System Programming)&lt;br /&gt;
* JTAG-Programmierung&lt;br /&gt;
* USRBUS&lt;br /&gt;
* IRQ-Zuweisung ändern&lt;br /&gt;
* ADC0 und ADC1 anders nutzen&lt;br /&gt;
* Schieberegister kaskadieren&lt;br /&gt;
Im folgenden Text soll beschrieben werden, wie man die weiteren Möglichkeiten nutzen kann. Es wird jeweils erwähnt, was man an Material braucht. Beispielhaft sind da Bestell-Nummern der Firma [http://www.conrad.de/ce/ CONRAD] genannt. Natürlich kann man die Teile auch bei anderen Versendern beziehen. Durch die Nennung der Bestell-Nummer ist das jeweilige Teil aber gut zu identifizieren. Man sollte Löten können und sich bewußt sein, dass ggf. ein Garantieanspruch nicht mehr besteht, wenn man an der Platine gelötet hat.&lt;br /&gt;
&lt;br /&gt;
Bei den Materialangaben ist öfter die Rede von &amp;quot;Steckbuchsen mit Litze&amp;quot;. Diese Steckbuchsen mit angelöteter Litze können auf die ein- oder zweireihigen Stiftleisten aufgesteckt werden. Leider gibt es sie nicht (mehr) fertig konfektioniert bei CONRAD. Die einreihigen Steckbuchsen (RM 2,54mm) kann man aber z.B. bei [http://www.elv.de/output/controller.aspx ELV] bekommen: 2-polig (68-016635), 3-polig (68-022503) und 5-polig (68-023073). An sie muss man dann noch Litzen in der entsprechenden Länge selbst anlöten.&lt;br /&gt;
&lt;br /&gt;
===== Zweites SPI-EEPROM =====&lt;br /&gt;
Es ist sehr einfach, ein zweites SPI-EEPROM (SP1 A1: IC5*) auf der M32 zu nutzen.&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_M32_IC5-Socket.JPG|thumb|Sockel des 2. SPI-EEPROMs]]&lt;br /&gt;
&lt;br /&gt;
Man braucht dazu:&lt;br /&gt;
* Einen IC-Sockel 8-pol DIP für IC5 ([http://www.conrad.de/ce/de/product/189600/IC-FASSUNG-PRAeZISION-8POLIG 189600])&lt;br /&gt;
* Einen Keramik-Vielschicht-Kondensator 100nF (C19); RM 2,54mm ([http://www.conrad.de/ce/de/product/453099/?insert=36&amp;amp;insertNoDeeplink&amp;amp;productname=KONDENSATOR-01-F-KDPU-254-MM 453099])&lt;br /&gt;
* Ein serielles SPI-EEPROM im PDIP8 Gehäuse (IC5)&lt;br /&gt;
Zuerst wird der IC-Sockel eingelötet (Kerbe beachten!), dann C19 (SP1 A1: C19*). Das war's.&lt;br /&gt;
&lt;br /&gt;
Leider gibt es das EEPROM nicht bei den gängigeren Versendern. Bekommen kann man es aber z.B. bei [http://de.farnell.com/jsp/home/homepage.jsp Farnell]. Dort hat das SPI-EEPROM mit 256 kbit die Bezeichnung 25LC256-I/P (1331398). Wenn man es noch größer mag: 25LC1024 (1331392) mit 1024 kbit. SPI-EEPROMs führt inzwischen auch [http://www.reichelt.de./ Reichelt].&lt;br /&gt;
&lt;br /&gt;
'''Programmierung:'''&lt;br /&gt;
&lt;br /&gt;
In die RP6ControlLib.h bitte einfügen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#define SPI_EEPROM2_PAGESIZE 64&lt;br /&gt;
&lt;br /&gt;
uint8_t SPI_EEPROM2_readByte(uint16_t memAddr);&lt;br /&gt;
void SPI_EEPROM2_writeByte(uint16_t memAddr, uint8_t data);&lt;br /&gt;
void SPI_EEPROM2_enableWrite(void);&lt;br /&gt;
void SPI_EEPROM2_disableWrite(void);&lt;br /&gt;
uint8_t SPI_EEPROM2_getStatus(void);&lt;br /&gt;
&lt;br /&gt;
void SPI_EEPROM2_writeBytes(uint16_t startAddr, uint8_t *buffer, uint8_t length);&lt;br /&gt;
void SPI_EEPROM2_readBytes(uint16_t startAddr, uint8_t *buffer, uint8_t length);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Die Konstante SPI_EEPROM2_PAGESIZE ist abhängig von der Art und Größe des EEPROMs. Für ein 256 kbit-EEPROM ist die Seitengröße (pagesize) in der Regel 64, für einen 512 kbit-Typ 128 und für einen 1024 kbit-Typ 256.&lt;br /&gt;
&lt;br /&gt;
In die RP6ControlLib.c bitte einfügen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Second external SPI EEPROM:&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Reads a single Byte from the 2nd external EEPROM.&lt;br /&gt;
 */&lt;br /&gt;
uint8_t SPI_EEPROM2_readByte(uint16_t memAddr)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t data;&lt;br /&gt;
	PORTB &amp;amp;= ~MEM_CS2;&lt;br /&gt;
	writeSPI(SPI_EEPROM_READ);&lt;br /&gt;
	writeWordSPI(memAddr);&lt;br /&gt;
	data = readSPI();&lt;br /&gt;
	PORTB |= MEM_CS2;&lt;br /&gt;
	return data;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Reads &amp;quot;length&amp;quot; Bytes into the Buffer &amp;quot;buffer&amp;quot; from startAdr on. &lt;br /&gt;
 * You can read the complete 2nd EEPROM into a buffer at once - if it is large enough. &lt;br /&gt;
 * (But you only have 2KB SRAM on a MEGA32 ;) )&lt;br /&gt;
 */&lt;br /&gt;
void SPI_EEPROM2_readBytes(uint16_t startAddr, uint8_t *buffer, uint8_t length)&lt;br /&gt;
{&lt;br /&gt;
	PORTB &amp;amp;= ~MEM_CS2;&lt;br /&gt;
	writeSPI(SPI_EEPROM_READ);&lt;br /&gt;
	writeWordSPI(startAddr);&lt;br /&gt;
	readBufferSPI(&amp;amp;buffer[0], length);&lt;br /&gt;
	PORTB |= MEM_CS2;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Enable Write Mode&lt;br /&gt;
 */&lt;br /&gt;
void SPI_EEPROM2_enableWrite(void)&lt;br /&gt;
{&lt;br /&gt;
	PORTB &amp;amp;= ~MEM_CS2;&lt;br /&gt;
	writeSPI(SPI_EEPROM_WREN);&lt;br /&gt;
	PORTB |= MEM_CS2;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Disable Write Mode&lt;br /&gt;
 */&lt;br /&gt;
void SPI_EEPROM2_disableWrite(void)&lt;br /&gt;
{&lt;br /&gt;
	PORTB &amp;amp;= ~MEM_CS2;&lt;br /&gt;
	writeSPI(SPI_EEPROM_WRDI);&lt;br /&gt;
	PORTB |= MEM_CS2;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Write a single data byte to the specified 2nd EEPROM address.&lt;br /&gt;
 */&lt;br /&gt;
void SPI_EEPROM2_writeByte(uint16_t memAddr, uint8_t data)&lt;br /&gt;
{&lt;br /&gt;
	while(SPI_EEPROM2_getStatus() &amp;amp; SPI_EEPROM_STAT_WIP);&lt;br /&gt;
	SPI_EEPROM2_enableWrite();&lt;br /&gt;
	PORTB &amp;amp;= ~MEM_CS2;&lt;br /&gt;
	writeSPI(SPI_EEPROM_WRITE);&lt;br /&gt;
	writeWordSPI(memAddr);&lt;br /&gt;
	writeSPI(data);&lt;br /&gt;
	PORTB |= MEM_CS2;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Write &amp;quot;length&amp;quot; Bytes from the Buffer to the 2nd EEPROM. &lt;br /&gt;
 * YOU CAN ONLY WRITE MAXIMAL [SPI_EEPROM2_PAGESIZE] BYTES AT ONCE!!!&lt;br /&gt;
 * This is the Pagesize!&lt;br /&gt;
 * You can NOT cross a page boundary!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void SPI_EEPROM2_writeBytes(uint16_t startAddr, uint8_t *buffer, uint8_t length)&lt;br /&gt;
{&lt;br /&gt;
	while(SPI_EEPROM2_getStatus() &amp;amp; SPI_EEPROM_STAT_WIP);&lt;br /&gt;
	SPI_EEPROM2_enableWrite();&lt;br /&gt;
	PORTB &amp;amp;= ~MEM_CS2;&lt;br /&gt;
	writeSPI(SPI_EEPROM_WRITE);&lt;br /&gt;
	writeWordSPI(startAddr);&lt;br /&gt;
	writeBufferSPI(&amp;amp;buffer[0], length);&lt;br /&gt;
	PORTB |= MEM_CS2;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Returns EEPROM Status register - for checking if 2nd EEPROM is buisy. &lt;br /&gt;
 * Writing takes about 5ms. &lt;br /&gt;
 */&lt;br /&gt;
uint8_t SPI_EEPROM2_getStatus(void)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t status;&lt;br /&gt;
	PORTB &amp;amp;= ~MEM_CS2;&lt;br /&gt;
	writeSPI(SPI_EEPROM_RDSR);&lt;br /&gt;
	status = readSPI();&lt;br /&gt;
	PORTB |= MEM_CS2;&lt;br /&gt;
	return status;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Hinweis zum 1024 kbit-EEPROM:&lt;br /&gt;
&lt;br /&gt;
Dieses EEPROM benötigt 24-Bit Adressen und muss daher etwas anders angesprochen werden als die &amp;quot;kleineren&amp;quot; Typen bis 512 kbit.&lt;br /&gt;
Die Funktion SPI_EEPROM2_readByte() sieht für ein 1024 kbit-EEPROM z.B. so aus:&lt;br /&gt;
&amp;lt;pre&amp;gt;uint8_t SPI_EEPROM2_readByte(uint32_t memAddr)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t data;&lt;br /&gt;
	PORTB &amp;amp;= ~MEM_CS2;&lt;br /&gt;
	writeSPI(SPI_EEPROM_READ);&lt;br /&gt;
	writeSPI((uint8_t)(memAddr &amp;gt;&amp;gt; 16));&lt;br /&gt;
	writeWordSPI((uint16_t)memAddr);&lt;br /&gt;
	data = readSPI();&lt;br /&gt;
	PORTB |= MEM_CS2;&lt;br /&gt;
	return data;&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
Alle weiteren Funktionen, die EEPROM-Adressen verwenden (SPI_EEPROM2_readBytes, SPI_EEPROM2_writeByte, SPI_EEPROM2_writeBytes), müssen genau so angepasst werden.&lt;br /&gt;
&lt;br /&gt;
===== Anschlüsse =====&lt;br /&gt;
Hier wird aufgelistet, wo man auf der M32 Platine Anschlüsse nutzen kann, um sie z.B. zu weiteren Sensoren, zum USRBUS oder (weniger empfehlenswert!) direkt zu EPs, zur RP6 Base oder zur CCPRO M128 zu führen. &lt;br /&gt;
&lt;br /&gt;
====== Analoge Sensoren an ADC2/3 ======&lt;br /&gt;
[[Bild:RP6_M32_ADC23.JPG|thumb|ADC2 ADC3]]&lt;br /&gt;
Wenn man bis zu zwei analoge Sensoren (z.B. IR-Distanz-Mess-Sensoren Sharp GP2Y0A02YK 185364) direkt an die M32 anschließen möchte, dann gibt es da zwei 3-polige Kontakte, beschriftet mit VDD/GND/ADCx (x = 2..3). Hier kann man 3-polige Stiftleisten auflöten, an die dann die Sensoren angeschlossen werden.&lt;br /&gt;
&lt;br /&gt;
Man braucht dazu:&lt;br /&gt;
* 1-reihige Stiftleiste RM 2,54mm (z.B. 36-polig 732478)&lt;br /&gt;
* Zwei Keramik-Vielschicht-Kondensatoren 100nF (C16, C17); RM 2,54mm (453099)&lt;br /&gt;
* Ein Elektrolyt-Kondensator stehend 470 uF / 16V (C18); RM 3,5mm (446211)&lt;br /&gt;
* Zwei 3-polige Steckbuchsen mit Litze zum Anschluß der Sensoren&lt;br /&gt;
Man trennt von der 1-reihigen Stiftleiste zweimal 3 Kontakte ab und lötet sie auf die weiß umrahmten Kontakte (VDD/GND/ADCx; SP2 C23: ADC2, YGND8, YVDD6, ADC3, YGND7, YVDD5), anschließend C16, C17 (SP2 C1: C16*, C17*) auf ihre Plätze und zum Schluß den Elko 470 uF (C18; SP2 B1: C18*). Beim Elko auf die Polung achten: Er muss genau so sitzen wie sein Nachbar C1 (Minuspol schaut zum Beeper SND).&lt;br /&gt;
&lt;br /&gt;
Die Sensoren lötet man an die Litzen der 3-poligen Steckbuchsen und steckt diese auf die neuen Kontakte.&lt;br /&gt;
&lt;br /&gt;
Da manche Sensoren einen höheren Stromverbrauch haben, kann man die Stromversorgung an den VDD-Pins der ADC2/3-Stecker abschaltbar machen oder eine separate +5V-Spannung einspeisen. Siehe dazu den Abschnitt &amp;quot;Trennstellen - Getrennte Stromversorgung für ADC2/3&amp;quot; weiter unten!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====== ISP (In System Programming) ======&lt;br /&gt;
Der ATMEGA32 der M32 wird standardmäßig über den PROG/UART Stecker programmiert. Dazu befindet sich im Prozessor ein Bootloader-Programm. Wenn man stattdessen oder zusätzlich die ISP-Programmierung mit einem dafür geeigneten ISP-Programmier-Adapter nutzen will, kann man den Adapter an den gewinkelten ISP-Stecker auf der M32 anschließen.&lt;br /&gt;
Vorher sind aber ein paar &amp;quot;Umbauarbeiten&amp;quot; erforderlich.&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_M32_ISP.JPG|thumb|ISP]]&lt;br /&gt;
&lt;br /&gt;
Man braucht dazu:&lt;br /&gt;
* 1-reihige Stiftleiste RM 2,54mm (z.B. 36-polig 732478)&lt;br /&gt;
* Einen SMD-Widerstand 10 kOhm (406376)&lt;br /&gt;
* Eine SMD-Diode LL 4148 (140902)&lt;br /&gt;
* Eine Codierbrücke (z.B. aus Set 742902)&lt;br /&gt;
&lt;br /&gt;
Der SMD-Widerstand wird auf seinen Platz (R1; SP1 A3: R1*) neben dem XBUS2-Stecker gelötet, danach die Diode LL 4148 (D2; SP1 B3: D2*). Die Kathode (Strich) der Diode zeigt in Richtung des Quarzes (X1). Zwischen R1 und C1 befinden sich drei Lötpunkte (beschriftet mit ISP/DEBUG - BOOTLOAD; SP1 A34: YRST1..3), auf die eine 3-polige Stiftleiste gelötet werden muss. Vorher muss eine kurze Leiterbahn zwischen den Lötpunkten BOOTLOAD aufgetrennt werden. Die Leiterbahn befindet sich auf der Lötseite der Platine und muss mit einem scharfen Messer oder einem speziellen Leiterbahn-Unterbrecher zwischen den beiden Lötpunkten unterbrochen werden. Man sollte anschließend mit einem Widerstandsmeßgerät nachmessen: Es sollte keine Verbindung mehr zwischen den Lötpunkten bestehen.&lt;br /&gt;
Man trennt dann von der 1-reihigen Stiftleiste 3 Kontakte ab und lötet sie auf die beschriebenen drei Lötpunkte.&lt;br /&gt;
&lt;br /&gt;
Wenn man jetzt eine Codierbrücke auf die mit &amp;quot;BOOTLOAD&amp;quot; beschrifteten Pins steckt, bleibt alles unverändert: Die Programmierung erfolgt weiter über den PROG/UART-Stecker mithilfe des Bootloaders im Prozessor. Wird die Codierbrücke in Stellung &amp;quot;ISP/DEBUG&amp;quot; umgesteckt, kann der Prozessor mit ISP programmiert werden.&lt;br /&gt;
&lt;br /&gt;
Vorsicht: Das Bootloader-Programm kann dabei zerstört werden! Es müssen zusätzlich Fusebits des ATMEGA32 verändert werden. &lt;br /&gt;
&lt;br /&gt;
Dabei kann der Prozessor im schlimmsten Fall nicht mehr ansprechbar sein. Man sollte diesen Umbau und die ISP-Programmierung nur machen, wenn man genau weiß, was man macht!&lt;br /&gt;
&lt;br /&gt;
Eine Kopie des Bootloaders und eine Kurzanleitung zum Einstellen der Fusebits gibt es hier: &lt;br /&gt;
[http://www.arexx.com/rp6/downloads/RP6_M32_BOOTLOADER.zip RP6_M32_BOOTLOADER]&lt;br /&gt;
&lt;br /&gt;
====== JTAG ======&lt;br /&gt;
[[Bild:RP6_M32_JTAG.JPG|thumb|JTAG]]&lt;br /&gt;
Die Programmierung und ein Debuggen sind auch mit der JTAG-Schnittstelle möglich. Das ist nur zu empfehlen, wenn man Erfahrungen mitbringt, oder der Prozessor der M32 durch eine ISP-Falschprogrammierung z.B. nicht mehr ansprechbar ist.&lt;br /&gt;
Um die JTAG-Schnittstelle nutzen zu können, muss der ISP-Umbau durchgeführt worden sein und die dort beschriebene Codierbrücke auf &amp;quot;ISP/DEBUG&amp;quot; gesteckt sein. Der JTAG-Programmer kann dann an die Lötpunkte &amp;quot;JTAG&amp;quot; zwischen ISP- und I/O-Stecker angeschlossen werden.&lt;br /&gt;
&lt;br /&gt;
Man braucht dazu:&lt;br /&gt;
* 2-reihige Stiftleiste RM 2,54mm (z.B. 2x36-polig 742007)&lt;br /&gt;
Man trennt von der 2-reihigen Stiftleiste 2x5 Kontakte ab und lötet sie auf die 10 JTAG-Lötpunkte (SP2 A12: YTDI, YTDO, YTMS, YTCK, YTRST, YVDD3/4, YGND3/4, YNC). Hier kann jetzt der JTAG-Programmer z.B. mit einem 10-poligen Flachkabel-Stecker angeschlossen werden. Um das JTAG-Interface des ATMEGA32 nutzen zu können, müssen Änderungen an den Fusebits vorgenommen werden.&lt;br /&gt;
&lt;br /&gt;
Vorsicht: Man sollte die JTAG-Programmierung und Fusebit-Manipulationen nur machen, wenn man genau weiß, was man macht!&lt;br /&gt;
&lt;br /&gt;
====== USRBUS ======&lt;br /&gt;
Die 14 Kontakte der beiden USRBUS-Stecker sind auf der M32 nirgendwo angeschlossen, sondern können über die Lötpunkte Y1..Y14 mit beliebigen Punkten auf der M32 verbunden werden.&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_M32_USRBUS.JPG|thumb|USRBUS]]&lt;br /&gt;
&lt;br /&gt;
Ich würde auf Y1..Y14 eine Stiftleiste löten, damit die USRBUS-Belegung geändert werden kann.&lt;br /&gt;
&lt;br /&gt;
Man braucht dazu:&lt;br /&gt;
* 2-reihige Stiftleiste RM 2,54mm (z.B. 2x36-polig 742007)&lt;br /&gt;
* Einige Steckbuchsen mit Litze&lt;br /&gt;
&lt;br /&gt;
Man trennt von der 2-reihigen Stiftleiste 2x7 Kontakte ab und lötet sie auf die Punkte Y1..Y14 (SP2 E3: Y1..Y14) neben dem Wannenstecker USRBUS2. Wird die M32 über Flachkabel mit einem USRBUS-Stecker auf einer RP6 Experimentierplatine (EP) und/oder mit dem RP6 selbst verbunden, dann hat man mit allen mit dem USRBUS verbundenen Platinen eine direkte 14-polige Verbindung,- eben den &amp;quot;User Bus&amp;quot;. Den kann man dann nutzen, wie man will. Auf der M32 kann man mit Steckbuchsen die Pins Y1..Y14 mit anderen Pins verbinden.&lt;br /&gt;
&lt;br /&gt;
Beispiel: Verbindet man den Pin &amp;quot;ADC2&amp;quot; mit Y1 des USRBUS, dann steht der Eingang ADC2 auf allen an den USRBUS angeschlossenen Platinen an Y1 zur Verfügung. Man braucht also diesen Eingang nicht über ein eigenes Kabel auf eine EP zu führen, sondern kann dazu den USRBUS nehmen. Dadurch bleibt der Gesamtaufbau auf dem RP6 übersichtlich und komplett trennbar (man braucht nur die Stecker XBUS und USRBUS abzuziehen!).&lt;br /&gt;
&lt;br /&gt;
Wichtig: Man sollte gut dokumentieren, wie man den USRBUS am RP6 (vorn und hinten getrennt!), auf EPs und der M32/M128 benutzt! Sonst kann es bei einer anderen Anordnung von EPs zu USRBUS Konflikten/Kurzschlüssen kommen.&lt;br /&gt;
&lt;br /&gt;
====== Schieberegister kaskadieren ======&lt;br /&gt;
[[Bild:RP6_M32_SPI.JPG|thumb|SPI]]&lt;br /&gt;
Auf der M32 wird ein 8-Bit Schieberegister-Baustein (IC3: 74HC4094D) dazu gebraucht, vier Status-LEDs (LED1..LED4) und ein LCD (am Stecker LCD) anzusteuern. Durch Schieberegister kann man Port-Pins gewinnen, wenn die Pins des Prozessors nicht ausreichen.&lt;br /&gt;
&lt;br /&gt;
Solche Schieberegister kann man &amp;quot;kaskadieren&amp;quot;, d.h. weitere identische Bausteine einbauen, die weitere Port-Pins zur Verfügung stellen. Wenn man zusätzliche 74HC4094 einsetzen will, wird man das am besten auf einer EP aufbauen. Die Anschlüsse für diese Schieberegister werden auf der M32 an einer 6-poligen Reihe von Lötpunkten (beschriftet mit MISO, STR, MOSI, SCK, QS, QS*; SP1 D3: YQS1/2, YMOSI, YSCK, YSTR, YMISO) links von IC3 zur Verfügung gestellt.&lt;br /&gt;
&lt;br /&gt;
Wenn man diese 6 Signalleitungen auf eine EP führen will, gibt es dafür zwei Möglichkeiten:&lt;br /&gt;
* a) Direkte 6-polige Kabelverbindung von den oben beschriebenen Lötpunkten zur EP&lt;br /&gt;
* b) Nutzung des USRBUS, um die 6 Signale zur EP zu führen&lt;br /&gt;
Wenn man im Abschnitt &amp;quot;[[RP6#USRBUS|USRBUS]]&amp;quot; den entsprechenden Umbau gemacht hat, würde ich b) empfehlen! Man könnte dafür eine 6-polige Stiftleiste auf die o.g. Lötpunkte auflöten und 1:1 z.B. mit den Pins Y4, Y6, Y8, Y10, Y12, Y14 des USRBUS verbinden. Dann kann man auf der EP weitere Schieberegister- und SPI-Bausteine (z.B. SPI-EEPROMs, [http://www.pollin.de/shop/dt/MDU5OTgxOTk-/Bausaetze_Module/Module/Funkmodul_RFM12_433_Sende_Empfangsmodul.html RFM12 Transceiver] o.ä.) aufbauen.&lt;br /&gt;
&lt;br /&gt;
Man braucht dazu:&lt;br /&gt;
* 1-reihige Stiftleiste RM 2,54mm (z.B. 36-polig 732478)&lt;br /&gt;
* Steckbuchsen mit Litze&lt;br /&gt;
Man trennt von der 1-reihigen Stiftleiste 6 Kontakte ab und lötet sie auf die beschriebenen sechs Lötpunkte auf der M32. Mit den Steckbuchsen mit Litze wird dann die Verbindung entweder direkt zur EP (Option a) oder über den USRBUS zur EP (Option b) hergestellt.&lt;br /&gt;
&lt;br /&gt;
====== VDD/GND/+UB Anschluß ======&lt;br /&gt;
[[Bild:RP6_M32_VDDGNDUB.JPG|thumb|RP6 M32 VDD GND +UB]]&lt;br /&gt;
VDD, GND und +UB (SP2 C3: YUB1, YGND1/2/5, YVDD1/2) kann man auf der M32 an diesen Lötpunkten abnehmen.&lt;br /&gt;
&lt;br /&gt;
Natürlich kann man hier auch Stiftleisten auflöten.&lt;br /&gt;
&lt;br /&gt;
Auf der anderen Platinenseite (zwischen dem USRBUS1 und ISP Stecker) befinden sich zusätzlich noch 2 weitere Lötpunkte, an denen man VDD und GND kontaktieren kann.&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;
&lt;br /&gt;
====== Serielle Schnittstelle ======&lt;br /&gt;
[[Bild:RP6_M32_RST.JPG|thumb|RP6 M32 RST]]&lt;br /&gt;
Neben dem PROG/UART Stecker befinden sich 5 Lötpunkte mit den Signalen RST, TX, RX, GND, VDD (SP2 BC3: YRX, YTX, YRST, YVDD, YGND). Hier kann z.B. eine 5-polige Stiftleiste aufgelötet werden, um einen Anschluß an die serielle Schnittstelle zu ermöglichen.&lt;br /&gt;
 &lt;br /&gt;
Von diesen 5 Lötpunkten könnte z.B. auch eine Verbindung zum USRBUS hergestellt werden, um die serielle Schnittstelle der M32 auf EPs zu führen.&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;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====== MEM_CS2 ======&lt;br /&gt;
[[Bild:RP6_M32_MEM_CS2.JPG|thumb|RP6 M32 MEM_CS2]]&lt;br /&gt;
MEM_CS2 (M32 Microcontroller Pin PB1) kann man am IC5-Sockel an Pin 1 (SP1 A1: IC5*, Pin 1) kontaktieren. Falls IC5 nicht eingesetzt werden soll, kann man hier durch Einstecken eines Kabels in Pin 1 des IC5-Sockels PB1 nutzen und z.B. zum USRBUS führen.&lt;br /&gt;
&lt;br /&gt;
===== Mess-/Kontaktpunkte =====&lt;br /&gt;
Hier geht es um Kontaktpunkte, an denen man z.B. den Logik-Pegel (High/Low) oder eine analoge Spannung messen kann. Natürlich kann man die Signale auch zur Weiterleitung auf eine EP kontaktieren, dies wird man aber normalerweise nicht brauchen.&lt;br /&gt;
&lt;br /&gt;
====== M-Signal ======&lt;br /&gt;
[[Bild:RP6_M32_M_SIGNAL.JPG|thumb|RP6 M32 M-Signal]]&lt;br /&gt;
An diesem Messpunkt (SP1 E3: YM_SIGNAL) neben D1 kann man die Ausgangsspannung des Mikrofon-Verstärkers IC4 (SP1 E3: IC4) messen oder z.B. mit einem Oszilloskop darstellen.&lt;br /&gt;
&lt;br /&gt;
===== Trennstellen =====&lt;br /&gt;
An diesen Stellen können Leiterbahnen unterbrochen werden, um Funktionen zu deaktivieren oder anders zu nutzen. &lt;br /&gt;
&lt;br /&gt;
====== Getrennte Stromversorgung für ADC2/3 ======&lt;br /&gt;
Wenn man für die analogen Sensoren an ADC2/3 (siehe Abschnitt &amp;quot;Anschlüsse - Analoge Sensoren an ADC2/3&amp;quot; weiter oben!) eine GETRENNTE Stromversorgung vorsehen will und/oder mit Codierbrücke (oder MOSFET) die Stromversorgung abschaltbar machen möchte, muss man erst Vorarbeit leisten.&lt;br /&gt;
[[Bild:RP6_M32_SV.jpg|thumb|RP6 M32 SV]]&lt;br /&gt;
&lt;br /&gt;
Man braucht dazu:&lt;br /&gt;
* 1-reihige Stiftleiste RM 2,54mm (z.B. 36-polig 732478)&lt;br /&gt;
* Evtl.: Eine Codierbrücke (z.B. aus Set 742902)&lt;br /&gt;
* Evtl.: Eine 1-polige Steckbuchse mit Litze zur ext. Stromversorgung&lt;br /&gt;
Es muss eine kurze Leiterbahn zwischen den Punkten &amp;quot;SV1&amp;quot; und &amp;quot;SV2&amp;quot; (SP2 B2: SV1, SV2) aufgetrennt werden. Die Leiterbahn befindet sich auf der Lötseite der Platine und muss mit einem scharfen Messer oder einem speziellen Leiterbahn-Unterbrecher zwischen den beiden Lötpunkten unterbrochen werden. Man sollte anschließend mit einem Widerstandsmeßgerät zwischen SV1 und SV2 nachmessen: Es sollte keine Verbindung mehr bestehen. Jetzt trennt man von der 1-reihigen Stiftleiste 2 Kontakte ab und lötet sie auf die Punkte SV1/SV2.&lt;br /&gt;
&lt;br /&gt;
Man kann hier zunächst eine Codierbrücke aufstecken. Damit versorgt der RP6 Akku die Sensoren mit 5V an den Pins VDD. Möchte man später eine getrennte 5V-Spannung anlegen, zieht man einfach die Codierbrücke ab und speist die externe 5V-Spannung (mit einer 1-poligen Steckbuchse) am Pin SV2 ein. Achtung: An Pin SV1 wird dann nichts angeschlossen!&lt;br /&gt;
&lt;br /&gt;
Anstelle der Codierbrücke kann man natürlich auch einen MOSFET anschließen, um die Sensoren per Software abschalten zu können.&lt;br /&gt;
&lt;br /&gt;
====== Interrupt-Zuordnung ändern ======&lt;br /&gt;
Am XBUS stehen vier Interrupt-Pins (genannt INT1..INT3, INTU) zur Verfügung. INT1 ist auf der RP6 Base mit PA4 verbunden, auf der M32 mit PD2 (Prozessor INT0), auf der M128 mit PE5 (Prozessor INT5) und auf der [[RP6v2#RP6v2_M256_WiFi_Platine|RP6 M256 WiFi]] mit PJ3 (Prozessor PCINT12). Diese Tabelle zeigt die Verbindung aller Interruptleitungen auf den Platinen (RP6 Base, M32, M128, M256 WiFi) über den XBUS:&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |XBUS Pin&lt;br /&gt;
 |XBUS INTx&lt;br /&gt;
 |RP6 Base Pin&lt;br /&gt;
 |RP6 Base INTx&lt;br /&gt;
 |RP6 M32 Pin&lt;br /&gt;
 |RP6 M32 INTx&lt;br /&gt;
 |RP6 M128 Pin&lt;br /&gt;
 |RP6 M128 INTx&lt;br /&gt;
 |RP6 M256 Pin&lt;br /&gt;
 |RP6 M256 INTx&lt;br /&gt;
 |-&lt;br /&gt;
 |8&lt;br /&gt;
 |INT1&lt;br /&gt;
 |PA4&lt;br /&gt;
 |kein&lt;br /&gt;
 |PD2&lt;br /&gt;
 |INT0&lt;br /&gt;
 |PE5&lt;br /&gt;
 |INT5&lt;br /&gt;
 |PJ3&lt;br /&gt;
 |PCINT12&lt;br /&gt;
 |-&lt;br /&gt;
 |11&lt;br /&gt;
 |INT2&lt;br /&gt;
 |n.c.&lt;br /&gt;
 |&lt;br /&gt;
 |PD3 *&lt;br /&gt;
 |INT1&lt;br /&gt;
 |n.c.&lt;br /&gt;
 |&lt;br /&gt;
 |PJ6&lt;br /&gt;
 |PCINT15&lt;br /&gt;
 |-&lt;br /&gt;
 |9&lt;br /&gt;
 |INT3&lt;br /&gt;
 |n.c.&lt;br /&gt;
 |&lt;br /&gt;
 |PB2 *&lt;br /&gt;
 |INT2&lt;br /&gt;
 |PE6&lt;br /&gt;
 |INT6&lt;br /&gt;
 |PJ5&lt;br /&gt;
 |PCINT14&lt;br /&gt;
 |-&lt;br /&gt;
 |7&lt;br /&gt;
 |INTU&lt;br /&gt;
 |n.c.&lt;br /&gt;
 |&lt;br /&gt;
 |n.c.    *&lt;br /&gt;
 |&lt;br /&gt;
 |n.c.&lt;br /&gt;
 |&lt;br /&gt;
 |PJ4&lt;br /&gt;
 |PCINT13&lt;br /&gt;
 |-&lt;br /&gt;
|}&lt;br /&gt;
'''Zu *:''' Standard-Belegung. Ggf. abhängig von der nachfolgend beschriebenen Interrupt-Zuordnung!&lt;br /&gt;
&lt;br /&gt;
Auf der M32 kann man die Interrupt-Zuordnung für INT2, INT3 und INTU durch drei Codierbrücken (beschriftet mit I2-INTU, INT3-I3, I2-INT2; SP2 A3: YINT2/3/U, YI2_1/2, YI3) ändern.&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_M32_INTx.JPG|thumb|INTx]]&lt;br /&gt;
&lt;br /&gt;
Man braucht dazu:&lt;br /&gt;
* 2-reihige Stiftleiste RM 2,54mm (z.B. 2x36-polig 742007)&lt;br /&gt;
* Drei Codierbrücken (z.B. aus Set 742902)&lt;br /&gt;
Vor dem Auflöten der Stiftleiste müssen zwei kurze Leiterbahnen zwischen zwei Lötpunkten aufgetrennt werden, und zwar zwischen den Lötpunkten INT3-I3 und I2-INT2. Die Leiterbahnen müssen mit einem scharfen Messer oder einem speziellen Leiterbahn-Unterbrecher zwischen den beiden Lötpunkten unterbrochen werden. Man sollte anschließend mit einem Widerstandsmeßgerät nachmessen: Es sollte keine Verbindung mehr zwischen INT3-I3 und I2-INT2 bestehen. Man trennt dann von der 2-reihigen Stiftleiste 2x3 Kontakte ab und lötet sie auf das weiß umrahmte Feld mit der o.g. Beschriftung.&lt;br /&gt;
&lt;br /&gt;
Hier kann man auf INT3-I3 und I2-INT2 je eine Codierbrücke aufstecken, wenn man die Standard-Belegung beibehalten will. Steckt man auf I2-INTU eine Codierbrücke, dann ist INTU des XBUS mit Pin PD3 (I2) der M32 verbunden.&lt;br /&gt;
&lt;br /&gt;
'''Hinweis:''' Man kann auf die 6-polige Stiftleiste auch Codierbrücken QUER zur eigentlichen (horizontalen) Richtung aufsetzen. Dadurch kann jede der 3 Interruptleitungen des XBUS (INT2, INT3, INTU) mit jedem der 2 Interrupt Pins der M32 (PD3, PB2) verbunden werden.&lt;br /&gt;
&lt;br /&gt;
Wenn man keine der Codierbrücken aufsteckt, sind die Pins PD3 (I2) und PB2 (I3) des M32-Prozessors nicht mehr mit dem XBUS verbunden und können anders verwendet werden. Auf der M32 kann man dann z.B. auch andere Verbindungen zum XBUS herstellen, indem man auf die Pins INT2, INT3 oder INTU Kabelverbindungen aufsteckt.&lt;br /&gt;
&lt;br /&gt;
====== ADC0 und ADC1 frei nutzen ======&lt;br /&gt;
Auf der M32 ist ADC0 fest mit dem Mikrofon (MIC) und ADC1 mit den Tastern T1..T5 (KEYPAD) verbunden. Wenn man diese ADC-Eingänge für andere Sensoren benötigt, kann man das Mikrofon und die Taster von den Eingängen abtrennen.&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_M32_MIC_KEY.JPG|thumb|MIC_KEYPAD]]&lt;br /&gt;
&lt;br /&gt;
Man braucht dazu:&lt;br /&gt;
* 1-reihige Stiftleiste RM 2,54mm (z.B. 36-polig 732478)&lt;br /&gt;
* Eine Codierbrücke (z.B. aus Set 742902)&lt;br /&gt;
&lt;br /&gt;
MIC/ADC0:&lt;br /&gt;
Es muss eine kurze Leiterbahn zwischen zwei Lötpunkten aufgetrennt werden, die sich zwischen R2 und C19 befinden (SP1 D4: YM1, YM2). Die Leiterbahn muss mit einem scharfen Messer oder einem speziellen Leiterbahn-Unterbrecher zwischen den beiden Lötpunkten unterbrochen werden. Man sollte anschließend mit einem Widerstandsmeßgerät nachmessen: Es sollte keine Verbindung mehr bestehen. Vorsicht: Nicht R2 beschädigen! Damit ist das Mikrofon auf der M32 ohne Funktion und ADC0 kann anders genutzt werden. ADC0 ist dann am oberen Lötpunkt zwischen R2 und C19 verfügbar, dort müßte eine Kabelverbindung angelötet werden.&lt;br /&gt;
Soll das Mikrofon später doch wieder an ADC0 angeschlossen werden, verbindet man die beiden Lötpunkte zwischen R2 und C19 einfach mit etwas Lötzinn oder mit einem SMD Null Ohm Widerstand.&lt;br /&gt;
&lt;br /&gt;
KEYPAD/ADC1:&lt;br /&gt;
Es muss eine kurze Leiterbahn zwischen zwei Lötpunkten aufgetrennt werden, die sich unterhalb von R15 befinden (SP1 D2: YKP1, YKP2). Die Leiterbahn befindet sich auf der Lötseite der Platine und muss mit einem scharfen Messer oder einem speziellen Leiterbahn-Unterbrecher zwischen den beiden Lötpunkten unterbrochen werden. Man sollte anschließend mit einem Widerstandsmeßgerät nachmessen: Es sollte keine Verbindung mehr bestehen. Jetzt trennt man von der 1-reihigen Stiftleiste 2 Kontakte ab und lötet sie auf die beiden Punkte unterhalb von R15. Hier kann man jetzt eine Codierbrücke aufstecken, wenn man die Taster weiter benutzen will. Wenn die Brücke abgezogen ist, sind die Taster ohne Funktion und ADC1 kann anders genutzt werden. ADC1 ist dann am linken Pin der 2-poligen Stiftleiste unterhalb von R15 verfügbar.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== RP6 CCPRO M128 Platine===&lt;br /&gt;
&lt;br /&gt;
[[Bild:CCPRO M128 k-1-.jpg|Das CCPRO M128]]&lt;br /&gt;
&lt;br /&gt;
====Beschreibung====&lt;br /&gt;
Die M128 (191550) ergänzt das RP6 Roboter System um einen leistungsfähigen ATMEGA 128 Prozessor.&lt;br /&gt;
&lt;br /&gt;
lassen sich weitere LEDs, Sensoren oder ähnliches anschließen, außerdem steht ein weiterer ATMEGA32 zur Verfügung, welcher sich gut im Master Modus betreiben lässt. Es sind ein Mikrofonsensor, fünf Taster, vier Status-LEDs, ein Display-Port, ein Beeper, 6 freie ADC-Kanäle, 8 freie I/O-Ports, ein Programmieradapter, ein JTAG-Anschluss, eine ISP-Programmierschnittstelle sowie ein freier Steckplatz für ein EEPROM verfügbar.&lt;br /&gt;
&lt;br /&gt;
====Technische Daten====&lt;br /&gt;
{|  {{Blauetabelle}} &lt;br /&gt;
|'''Mikrocontroller:'''&lt;br /&gt;
|Steckplatz für ein C-Control PRO MEGA128 Modul mit einem ATMEGA 128 ([https://www.conrad.de/de/p/c-control-prozessor-unit-mega-128-pro-198219.html 198219])&lt;br /&gt;
|-&lt;br /&gt;
|'''Speicher:'''&lt;br /&gt;
|128 kB [[Flash]]-Speicher, davon 4 kB bereits vom Bootloader belegt&amp;lt;br/&amp;gt;&lt;br /&gt;
4 kB SRAM intern&amp;lt;br/&amp;gt; &lt;br /&gt;
64 kB SRAM extern&amp;lt;br/&amp;gt;&lt;br /&gt;
4 kB [[EEPROM]]&lt;br /&gt;
|-&lt;br /&gt;
|'''Programmierung:'''&lt;br /&gt;
|Über CCPRO-IDE&lt;br /&gt;
|-&lt;br /&gt;
|'''Vorhandene Sensoren:'''&lt;br /&gt;
|1 12bit I²C Temperatursensor &amp;lt;br/&amp;gt;&lt;br /&gt;
19 I/O-Ports, davon 8 ADCs, 3 PWM (Servos) und 2 I/Os für eine weitere serielle Schnittstelle (UART)&lt;br /&gt;
|-&lt;br /&gt;
|'''Vorhandene Aktoren:'''&lt;br /&gt;
|1 Beeper&amp;lt;br/&amp;gt;&lt;br /&gt;
5 Status-LEDs&amp;lt;br/&amp;gt;&lt;br /&gt;
1 LC-Display-Port&amp;lt;br/&amp;gt;&lt;br /&gt;
1 Sockel für ein I²C-Bus EEPROM vom Typ 24(L)Cxxx&lt;br /&gt;
|-&lt;br /&gt;
|'''Abmessungen:'''&lt;br /&gt;
|(L &amp;amp;times; B &amp;amp;times; H) 112 &amp;amp;times; 90 &amp;amp;times; 21 mm&lt;br /&gt;
|-&lt;br /&gt;
|'''Ausführung:'''&lt;br /&gt;
|Fertig aufgebautes Erweiterungsmodul&lt;br /&gt;
|-&lt;br /&gt;
|'''Stromversorgung:'''&lt;br /&gt;
|6 AA NiMH Akkus (über die RP6 Base)&lt;br /&gt;
|-&lt;br /&gt;
|'''Hersteller:'''&lt;br /&gt;
|Arexx Niederlande&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Umbauoptionen====&lt;br /&gt;
Auf der CCPRO M128 ([http://www.conrad.de/ce/de/product/191563/Arexx-RP6-CC-PRO-MEGA128-Erweiterungssatz 191563]) kann leider nicht so viel umgebaut werden:&lt;br /&gt;
&lt;br /&gt;
* I2C-EEPROM&lt;br /&gt;
* Freie Nutzung von PORTA* und PORTC*&lt;br /&gt;
* USRBUS&lt;br /&gt;
* A16-/PD4-Nutzung&lt;br /&gt;
&lt;br /&gt;
Im Text gibt es Verweise auf den Schaltplan der CCPRO M128 (RP6_CCPRO_M128_Schematic.PDF) in der Form: (SP2 B1: Bauteil).  Dies bedeutet, dass man das Bauteil auf Blatt 2 des M128-Schaltplans im Feld B1 finden kann.&lt;br /&gt;
&lt;br /&gt;
Bei den Materialangaben ist öfter die Rede von &amp;quot;Steckbuchsen mit Litze&amp;quot;. Diese Steckbuchsen mit angelöteter Litze können auf die ein- oder zweireihigen Stiftleisten aufgesteckt werden. Leider gibt es sie nicht (mehr) fertig konfektioniert bei CONRAD. Die einreihigen Steckbuchsen (RM 2,54mm) kann man aber z.B. bei [http://www.elv.de/output/controller.aspx ELV] bekommen: 2-polig (68-016635), 3-polig (68-022503) und 5-polig (68-023073). An sie muss man dann noch Litzen in der entsprechenden Länge selbst anlöten.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=====I2C-EEPROM=====&lt;br /&gt;
Zum Einsetzen eines I2C-EEPROMS (IC6; SP2 C1: IC6) braucht man nichts umzubauen. Man kauft einfach ein passendes EEPROM des Typs 24(L)Cxxxx-P und setzt es auf seinen Sockel, Kerbe zum oberen Platinenrand.&lt;br /&gt;
&lt;br /&gt;
Mögliche Typen (erhältlich z.B. bei [http://www.digikey.de/ Digi-Key] oder bei [http://www.reichelt.de./ Reichelt]):&lt;br /&gt;
* AT24C128  (AT24C128-10PU-2.7-ND)&lt;br /&gt;
* AT24C256  (AT24C256-10PU-2.7-ND)&lt;br /&gt;
* AT24C512  (AT24C512-10PU-2.7-ND)&lt;br /&gt;
* AT24C1024 (AT24C1024-10PI-2.7-ND)&lt;br /&gt;
&lt;br /&gt;
=====Anschlüsse=====&lt;br /&gt;
Hier wird aufgelistet, wo man auf der M128 Platine Anschlüsse nutzen kann, um sie z.B. zu weiteren Sensoren, zum USRBUS oder (weniger empfehlenswert!) direkt zu EPs, zur RP6 Base oder zur M32 zu führen. &lt;br /&gt;
&lt;br /&gt;
======Freie Nutzung von PORTA* und PORTC*======&lt;br /&gt;
Um PORTA* und PORTC* frei nutzen zu können (für weitere I/O-Ports), muss man auf das externe SRAM verzichten, was nicht sehr ratsam ist. Mehr I/O-Ports kann man alternativ durch I/O Expander gewinnen. Falls man das SRAM trotzdem deaktivieren will, hier die Anleitung.&lt;br /&gt;
&lt;br /&gt;
Für den Umbau braucht man:&lt;br /&gt;
* Wannenstecker 2x5-polig gerade RM 2,54mm (z.B. [http://www.reichelt.de./ Reichelt] WSL 10G)&lt;br /&gt;
* 1-reihige Stiftleiste RM 2,54mm (z.B. 36-polig 732478)&lt;br /&gt;
* Eine Codierbrücke (z.B. aus Set 742902)&lt;br /&gt;
[[Bild:RP6_M128_PortA.JPG|thumb|PORTA*]]&lt;br /&gt;
&lt;br /&gt;
Für die Bestückung von PORTA* (SP2 AB2: Stecker PORTA*) lötet man den Wannenstecker hier (siehe Abb. PORTA*) auf.&lt;br /&gt;
[[Bild:RP6_M128_PortC.JPG|thumb|PORTC*]]&lt;br /&gt;
&lt;br /&gt;
Für die Bestückung von PORTC* (SP1 A2: PC0..7, YGND1) trennt man von der 1-reihigen Stiftleiste 9 Kontakte ab und lötet sie auf die PORTC*-Lötpunkte (siehe Abb. PORTC*).&lt;br /&gt;
&lt;br /&gt;
Dann muss noch der SRAM-Enable Jumper (SP1 EF1: Y27..29) bestückt werden:&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_M128_EN_SRAM.JPG|EN_SRAM]]&lt;br /&gt;
&lt;br /&gt;
Man trennt von der 1-reihigen Stiftleiste 3 Kontakte ab und lötet sie auf die abgebildeten Lötpunkte. Vorher muss eine Leiterbahn auf der Lötseite der Platine zwischen den ENABLE-Lötpunkten aufgetrennt werden.&lt;br /&gt;
Wenn das SRAM wie bisher genutzt werden soll, steckt man die Codierbrücke auf die Stellung &amp;quot;ENABLE&amp;quot;. Will man stattdessen Port A und Port C frei nutzen (und damit auf SRAM verzichten!), kommt die Codierbrücke auf &amp;quot;DISABLE&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
======USRBUS======&lt;br /&gt;
Auf die 14 Kontakte neben dem Wannenstecker USRBUS2 ist noch nichts gelötet.&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_M128_USRBUS.JPG|thumb|USRBUS]]&lt;br /&gt;
&lt;br /&gt;
Ich würde auf Y1..Y14 eine Stiftleiste löten, damit die USRBUS-Belegung geändert werden kann.&lt;br /&gt;
&lt;br /&gt;
Man braucht dazu:&lt;br /&gt;
* 2-reihige Stiftleiste RM 2,54mm (z.B. 2x36-polig 742007)&lt;br /&gt;
* Einige Steckbuchsen mit Litze&lt;br /&gt;
&lt;br /&gt;
Man trennt von der 2-reihigen Stiftleiste 2x7 Kontakte ab und lötet sie auf die Punkte Y1..Y14 (SP2 E234: Y1..Y14) neben dem Wannenstecker USRBUS2. Wird die M128 über Flachkabel mit einem USRBUS-Stecker auf einer RP6 Experimentierplatine (EP) und/oder mit dem RP6 selbst verbunden, dann hat man mit allen mit dem USRBUS verbundenen Platinen eine direkte 14-polige Verbindung,- eben den &amp;quot;User Bus&amp;quot;. Den kann man dann nutzen, wie man will. Auf der M128 kann man mit Steckbuchsen die Pins Y1..Y14 mit anderen Pins verbinden.&lt;br /&gt;
&lt;br /&gt;
Beispiel: Verbindet man den Pin &amp;quot;ADC4&amp;quot; mit Y1 des USRBUS, dann steht der Eingang ADC4 auf allen an den USRBUS angeschlossenen Platinen an Y1 zur Verfügung. Man braucht also diesen Eingang nicht über ein eigenes Kabel auf eine EP zu führen, sondern kann dazu den USRBUS nehmen. Dadurch bleibt der Gesamtaufbau auf dem RP6 übersichtlich und komplett trennbar (man braucht nur die Stecker XBUS und USRBUS abzuziehen!).&lt;br /&gt;
&lt;br /&gt;
Wichtig: Man sollte gut dokumentieren, wie man den USRBUS am RP6 (vorn und hinten getrennt!), auf EPs und der M128 benutzt! Sonst kann es bei einer anderen Anordnung von EPs zu USRBUS Konflikten/Kurzschlüssen kommen.&lt;br /&gt;
&lt;br /&gt;
======IC5 ALERT======&lt;br /&gt;
[[Bild:RP6_M128_IC5_ALERT.JPG|thumb|IC5 ALERT]]&lt;br /&gt;
Dieser Lötpunkt (SP2 C2: AL) neben IC5 ist der Anschluß ALERT (Pin 3) des I2C-Temperatursensors TCN75A (SP2 C2: IC5).&lt;br /&gt;
&lt;br /&gt;
Dies ist ein Open-Drain Ausgang, der ein Alarm-Signal ausgibt, wenn die Temperatur die eingestellten Grenzen über-/unterschreitet (siehe auch Datenblatt des Sensors (TCN75A.pdf), Abschnitt 5.3.4!). Wenn man ALERT auf einen Eingang des Microcontrollers führen will, muß man auch noch einen Pullup-Widerstand vorsehen oder den internen Pullup des uC-Eingangs aktivieren.&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;
======VDD/GND Anschluß======&lt;br /&gt;
[[Bild:RP6_M128_VDDGND.JPG|thumb|VDD GND]]&lt;br /&gt;
Auf der CCPRO M128 gibt es 2 Lötpunkte (SP1 E34: YVDD3, YGND4) zwischen R5 und C7 bzw. direkt neben der Codierbrücke (SP1 E3: YL9, YL10) zum Deaktivieren von LED5.&lt;br /&gt;
&lt;br /&gt;
Hier könnte man VDD und GND kontaktieren. VDD ist der Lötpunkt, der näher an R5 liegt.&lt;br /&gt;
&lt;br /&gt;
=====Trennstellen=====&lt;br /&gt;
An diesen Stellen können Leiterbahnen unterbrochen werden, um Funktionen zu deaktivieren oder anders zu nutzen. &lt;br /&gt;
&lt;br /&gt;
======A16-/PD4-Nutzung======&lt;br /&gt;
&lt;br /&gt;
[[Bild:v2RP6_M128_A16.JPG|thumb|A16/PD4]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Auf der CCPRO M128 gibt es ein 3-poliges Feld von Lötpunkten (SP2 AB1: PD4, A16, GND) unter dem CCPRO MEGA128 Modul (IC1). Standardmässig ist A16 des SRAM (IC3) hier auf GND gelegt. Damit kann man PD4 des Prozessors (ICP1) frei nutzen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Will man A16 des SRAM mit PD4 schaltbar machen, muss man eine Leiterbahn auf der Bestückungsseite zwischen den oberen zwei der drei Lötpunkte auftrennen und die anderen (unteren) beiden Lötpunkte mit etwas Lötzinn oder einem SMD Null Ohm Widerstand verbinden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der Sinn dieses Umbaus besteht darin, dass man danach anstelle von 64kB nun die vollen 128kB SRAM des IC3 adressieren kann. Man muss dann aber PD4 selbst schalten, da C-Control PRO ab Version 1.50 nur 64kB ext. SRAM ansteuern kann. Immerhin könnte man dann 2 Blöcke à je 64kB nutzen und mit PD4 zwischen beiden Blöcken umschalten.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ob CCPRO damit klar kommt: Wohl kaum! Ich würde daher diesen Umbau nicht durchführen.&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Zubehör und Ersatzteile ==&lt;br /&gt;
Von [http://www.conrad.de/ce/ CONRAD] gibt es z.B. &lt;br /&gt;
&lt;br /&gt;
* das LC- ([http://www.conrad.de/ce/de/product/190911/LC-DISPLAY-16-X-2-KONFEKTIONIERT 190911] AUSVERKAUFT!) oder Backlight-Display ([http://www.conrad.de/ce/de/product/191621/DISPLAY-RP5RP6-BLAU-MIT-BACKLIGHT 191621] AUSVERKAUFT!), welche an die M32, an die CCPRO M128 und an die M256 WiFi angeschlossen werden können,&lt;br /&gt;
* einen IR-Ball ([http://www.conrad.de/ce/de/product/191437/INFRAROT-BALL-FUeR-ROBOTER-FUssBALL 191437] AUSVERKAUFT!),&lt;br /&gt;
* einen Graustufen-Boden-Sensor ([http://www.conrad.de/ce/de/product/191599/GRAUSTUFEN-BODEN-SENSOR-FUeR-FUssBALLROBOT 191599] AUSVERKAUFT!),&lt;br /&gt;
* eine IR-Fernbedienung Promo 8 ([http://www.conrad.de/ce/de/product/340720/PROMO-8-UNIVERSALFERNBEDIENUNG 340720] AUSVERKAUFT!) oder Vivanco UR 89 ([http://www.conrad.de/ce/de/product/351013/VivancoUR-89-Fernbedienung-8-Geraete 351013] AUSVERKAUFT!),&lt;br /&gt;
* Ersatzräder ([http://www.conrad.de/ce/de/product/191307/ANTRIEBSRAD-RP5RP6 191307] AUSVERKAUFT!),&lt;br /&gt;
* Ersatzzahnräder ([http://www.conrad.de/ce/de/product/191346/SCHRAeG-ZAHNRAeDERSATZ-RP5RP6 191346]) und&lt;br /&gt;
* Ersatzraupen ([http://www.conrad.de/ce/de/product/191333/RAUPENSATZ-RP5RP6 191333] AUSVERKAUFT!).&lt;br /&gt;
&lt;br /&gt;
===Displays===&lt;br /&gt;
Die vorkonfektionierten Displays kann man zum Ausgeben von Texten, Sensordaten und kleinen Animationen benutzen. Sie können an die M32, an die CCPRO M128 und an die M256 WiFi angeschlossen werden.&lt;br /&gt;
&lt;br /&gt;
Diese 16x2 Zeichen Displays sind bisher lieferbar:&lt;br /&gt;
&lt;br /&gt;
* LC-Display ([http://www.conrad.de/ce/de/product/190911/LC-DISPLAY-16-X-2-KONFEKTIONIERT 190911])&lt;br /&gt;
* OLED-Display (197622)&lt;br /&gt;
* Backlight-Display AREXX RP-DSP88 ([http://www.conrad.de/ce/de/product/191621/DISPLAY-RP5RP6-BLAU-MIT-BACKLIGHT 191621])&lt;br /&gt;
&lt;br /&gt;
Das LCD ist seit September 2018 bei CONRAD ausverkauft; zeitweise (2007/08) gab es unter dieser Bestellnummer eine Version, die zu klein (66 x 37mm) war, um sie auf der M32, der CCPRO M128 oder der M256 WiFi zu montieren.&lt;br /&gt;
&lt;br /&gt;
Das OLED-Display ist aktuell (April 2012) nicht mehr lieferbar.&lt;br /&gt;
&lt;br /&gt;
Das zuletzt ausschließlich nur noch erhältliche blaufarbige Backlight-Display ist seit Mai 2020 bei CONRAD ausverkauft.&lt;br /&gt;
&lt;br /&gt;
Diese Displays können mit 4 M3-Abstandbolzen 25 mm ([http://www.conrad.de/ce/de/product/526665/Abstandsbolzen1-x-Aussengewinde1-x-InnengewindeMessing-vernickelt-Schluesselweite-55-mm Bestell-Nr. 526665]) und 4 Muttern M3 ([http://www.conrad.de/ce/de/product/815624/TOOLCRAFT-Sechskant-Muttern-DIN-934-934-Stahl-verzinkt-M3-100-St z.B. aus 815624]), sowie 4 Schrauben M3 ([http://www.conrad.de/ce/de/product/815322/TOOLCRAFT-Linsenkopfschrauben-mit-Kreuzschlitz-DIN-7985-7985-6-mm-Stahl-verzinkt-Guete-48-M3-100-St z.B. aus 815322]) auf der M32, der CCPRO M128 oder der M256 WiFi befestigt werden. Leider sind die Befestigungslöcher der Displays zu klein für ein M3-Gewinde, so dass man die Löcher sehr vorsichtig auf 3..3,2 mm erweitern muss.&lt;br /&gt;
&lt;br /&gt;
===IR-Ball===&lt;br /&gt;
Den IR-Ball (AREXX IRB-35, AUSVERKAUFT!) kann man benutzen, um mit dem RP6 Fußball oder Ähnliches zu spielen. Der Ball kann dann von den IR-Sensoren des RP6 erkannt und geortet werden.&lt;br /&gt;
&lt;br /&gt;
===Graustufen-Boden-Sensor===&lt;br /&gt;
Der Graustufen-Boden-Sensor (AREXX ARX-GS7) dient zur Orientierung eines Roboters auf einem Fußballfeld, das in bestimmten Grauabstufungen eingefärbt ist (CONRAD 191404  AUSVERKAUFT!). Dieser Fußballfeld-Aufkleber (AREXX ARX-FF008) ist bei CONRAD und bei [http://www.elv.de ELV] (Artikel-Nummer 68-101831) ausverkauft.&lt;br /&gt;
&lt;br /&gt;
===IR-Fernbedienung===&lt;br /&gt;
[[Bild:RP6_RC.jpg|thumb|2 RC5 Fernbedienungen]]&lt;br /&gt;
Mit einer Universal-IR-Fernbedienung, die den RC5-IR-Code senden kann, kann der RP6 wie ein ferngesteuertes &amp;quot;Auto&amp;quot; verwendet werden. Im Beispielprogramm &amp;quot;Example_08_TV_REMOTE&amp;quot; im Ordner der RP6-Base-Demos wird das noch genauer erläutert.&lt;br /&gt;
&lt;br /&gt;
===Ersatzräder===&lt;br /&gt;
Die Ersatzräder dienen als Ersatzteile für den RP6, RP6v2 und das RP5/RP6-Fahrgestell.&lt;br /&gt;
&lt;br /&gt;
===Ersatzzahnräder===&lt;br /&gt;
Die Ersatzzahnräder dienen als Ersatzteile für den RP6, RP6v2 und das RP5/RP6-Fahrgestell.&lt;br /&gt;
&lt;br /&gt;
===Ersatzraupen===&lt;br /&gt;
Die Ersatzraupen dienen als Ersatzteile für den RP6, RP6v2 und das RP5/RP6-Fahrgestell.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Programmierung==&lt;br /&gt;
Um diesen Grundlagenartikel zum RP6 nicht immer länger werden zu lassen, habe ich den Teil zur Programmierung des [[RP6_-_Programmierung#RP6_Base_und_CONTROL_M32|RP6]] und seiner Erweiterungsplatinen [[RP6_-_Programmierung#RP6_Base_und_CONTROL_M32|RP6 CONTROL M32]] und [[RP6_-_Programmierung#RP6_CCPRO_M128|RP6 CCPRO M128]] ausgelagert: [[RP6 - Programmierung]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==RP6v2==&lt;br /&gt;
Der neue [http://www.conrad.de/ce/de/product/191584/RP6-V2-ROBOTERSYSTEM RP6v2] ist weitgehend identisch mit dem RP6, so dass fast alle Angaben dieses Artikels auch für den RP6v2 zutreffen.&lt;br /&gt;
Für vom RP6 abweichende Details des RP6v2 und für dessen zukünftige Erweiterungsplatinen (z.B. das aktuell [http://www.arexx.com/forum/viewtopic.php?f=19&amp;amp;t=1797 hier] angekündigte Erweiterung-Modul [[RP6v2#RP6v2_M256_WiFi_Platine|RP6v2 M256 WiFi]]) gibt es einen eigenen Grundlagenartikel: [[RP6v2]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==RP6 Sensor Board und Xtra Module==&lt;br /&gt;
Einen eigenen Artikel gibt es auch für das [[RP6_Sensor_Board_und_Xtra_Module#RP6_Sensor_Board_2|RP6 Sensor Board]] und für die [[RP6_Sensor_Board_und_Xtra_Module#RP6_Xtra_Module_2|Xtra Module]]: [[RP6_Sensor_Board_und_Xtra_Module|RP6 Sensor Board und Xtra Module]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Erfahrungsberichte==&lt;br /&gt;
&lt;br /&gt;
...in Arbeit...(kann aber gerne ergänzt werden)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Siehe auch==&lt;br /&gt;
* [[RP6 - Programmierung]]&lt;br /&gt;
* [[RP6v2]]&lt;br /&gt;
* [[RP6_Sensor_Board_und_Xtra_Module]]&lt;br /&gt;
* [[RP6_Kamera_-_Mitmach-Projekt]]&lt;br /&gt;
* [[RP6v2_I2C-Portexpander]]&lt;br /&gt;
* [[RP6v2 USB-RS232-Adapter]]&lt;br /&gt;
* [[RP6v2 Orientierung]]&lt;br /&gt;
* [[RP6 Multi IO Projekt]]&lt;br /&gt;
* [[RP6 Multi IO Projekt - Software]]&lt;br /&gt;
* [[RP6 ArduIO]]&lt;br /&gt;
* [[RP6 ArduIO - Software]]&lt;br /&gt;
* [[Induktive_Ladestation_f%C3%BCr_den_RP6|Induktive Ladestation für den RP6]]&lt;br /&gt;
* [[IR-bake_f%C3%BCr_den_RP6|IR-bake für den RP6]]&lt;br /&gt;
* [[CCRP5]]&lt;br /&gt;
* [[Wild Thumper]]&lt;br /&gt;
* [[Wild Thumper - Programmierung]]&lt;br /&gt;
* [[Yeti]]&lt;br /&gt;
* [[Asuro]]&lt;br /&gt;
* [[C't-Bot]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Weblinks==&lt;br /&gt;
'''Siehe auch die Weblinks im [http://www.rn-wissen.de/index.php/RP6v2#Weblinks RP6v2 Artikel]!'''&lt;br /&gt;
&lt;br /&gt;
* [http://www.pcwelt.de/start/gaming_fun/gadgets/news/84558/ PC-Welt-Artikel]&lt;br /&gt;
&lt;br /&gt;
* Ankündigung des RP6 und der RP6 CONTROL M32 im [http://www.arexx.com/forum/viewtopic.php?t=370 AREXX Support Forum]&lt;br /&gt;
* Ankündigung der RP6 CCPRO M128 im [http://www.arexx.com/forum/viewtopic.php?f=19&amp;amp;t=834&amp;amp;start=0 AREXX Support Forum] und im [http://www.roboternetz.de/community/threads/42228-RP6-C-Control-PRO-MEGA128-Erweiterungsmodul-Website-online RoboterNETZ]&lt;br /&gt;
* Ankündigung des RP6v2 im [http://www.roboternetz.de/community/threads/56964-NEWS-RP6v2-die-neue-Version-2-des-RP6-Robot-Systems RoboterNETZ] und im [http://www.arexx.com/forum/viewtopic.php?f=19&amp;amp;t=1778 AREXX Support Forum]&lt;br /&gt;
* Ankündigung der RP6v2 M256 WiFi im [http://www.arexx.com/forum/viewtopic.php?f=19&amp;amp;t=1797 AREXX Support Forum]&lt;br /&gt;
* [http://www.arexx.com/rp6 AREXX RP6 Startseite]&lt;br /&gt;
* [http://www.arexx.com/forum/viewforum.php?f=19 AREXX Support Forum]&lt;br /&gt;
* [http://www.arexx.com/rp6/html/de/soft_doc_ccpro.htm AREXX CCPRO M128 Seite]&lt;br /&gt;
&lt;br /&gt;
* [http://www.conrad.de/ce/de/product/191524/RP6-ROBOTERSYSTEM RP6 bei CONRAD]&lt;br /&gt;
* [http://www.conrad.de/ce/de/product/191584/RP6-V2-ROBOTERSYSTEM RP6v2 bei CONRAD]&lt;br /&gt;
* [http://www.conrad.de/ce/de/product/191550/RP6-MEGA32-ERWEITERUNGSSATZ RP6 CONTROL M32 bei CONRAD]&lt;br /&gt;
* [http://www.conrad.de/ce/de/product/191563/RP6-CC-PRO-MEGA128-ERWEITERUNGSSATZ RP6 CCPRO M128 bei CONRAD]&lt;br /&gt;
* [http://www.c-control.de/c-control-pro/c-control-pro/startseite_c-control-pro.html C-Control PRO Startseite]&lt;br /&gt;
* [http://ccpro.cc2net.de/forum/ C-Control PRO Forum]&lt;br /&gt;
&lt;br /&gt;
* [http://www.roboternetz.de/phpBB2/viewforum.php?f=49 Roboternetz RP6 Forum]&lt;br /&gt;
* &amp;quot;Geburt&amp;quot; des Wiki im RN-Forum: [http://www.roboternetz.de/community/threads/32793-RP6-Wiki-Artikel RP6-Wiki-Artikel]&lt;br /&gt;
* Henkessoft: [http://www.henkessoft.de/Roboter/rp6.htm RP6]&lt;br /&gt;
* PIC-PROJEKTE Wiki: [http://pic-projekte.de/wiki/index.php?title=RP6  RP6]&lt;br /&gt;
* benhup.com: [http://www.benhup.com/?mf=eduntech&amp;amp;sf=rp6 Arexx RP6 Robot (with ATmega32 chip)]&lt;br /&gt;
* RP6 &amp;quot;Panzer&amp;quot;: [http://www.roboternetz.de/community/threads/57171-mein-(Heng-Long)-RP6 Heng-Long-RP6]&lt;br /&gt;
&lt;br /&gt;
* [http://www.youtube.com/results?search_query=rp6 RP6 Videos]&lt;br /&gt;
* [http://de-de.facebook.com/pages/Robby-RP6/155118711202285 facebook]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Robotikeinstieg]]	 &lt;br /&gt;
[[Kategorie:Praxis]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Autoren==&lt;br /&gt;
--[http://www.roboternetz.de/community/members/24729-sloti sloti] 22:23, 29. Dez 2007 (CET)&lt;br /&gt;
&lt;br /&gt;
--[http://www.roboternetz.de/community/members/44891-Tobias1 Tobias1] 18:30, 6. Apr 2010 (CET)&lt;br /&gt;
&lt;br /&gt;
--[http://www.roboternetz.de/community/members/1972-Dirk Dirk] 12:51, 23. Okt 2020 (CET)&lt;/div&gt;</summary>
		<author><name>Dirk NO2</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=RP6&amp;diff=28573</id>
		<title>RP6</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=RP6&amp;diff=28573"/>
				<updated>2022-03-31T08:52:54Z</updated>
		
		<summary type="html">&lt;p&gt;Dirk NO2: /* RP6 CCPRO M128 Platine */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Bild:RP6_2.jpg|RP6 Base Roboter|right|500px]]&lt;br /&gt;
==Was bisher geschah==&lt;br /&gt;
Fre, 08. Jun 2007 - Ankündigung des RP6 und der RP6 CONTROL M32&amp;lt;br/&amp;gt;&lt;br /&gt;
Mon, 02. Jul 2007 23:00 - Benachrichtigung der Tester&amp;lt;br/&amp;gt;&lt;br /&gt;
Die, 03. Jul 2007 15:00 - Bereitstellung der Dokumentation&amp;lt;br/&amp;gt;&lt;br /&gt;
Don, 05. Jul 2007 14:30 - Bereitstellung der Schaltungsunterlagen&amp;lt;br/&amp;gt;&lt;br /&gt;
Son, 08. Jul 2007 16:00 - Nachricht über den Versand der RP6&amp;lt;br/&amp;gt;&lt;br /&gt;
Mon, 09. Jul 2007 00:15 - Bereitstellung der Library und der Beispielprogramme&amp;lt;br/&amp;gt;&lt;br /&gt;
Die, 10. Jul 2007 - Eintreffen der RP6 bei den Testern&amp;lt;br/&amp;gt;&lt;br /&gt;
Mon, 16. Jul 2007 - Auslieferungsbeginn des RP6&amp;lt;br/&amp;gt;&lt;br /&gt;
Fre, 24. Apr 2009 - Ankündigung der RP6 CCPRO M128 (Auslieferung schon ab Mitte April 2009)&amp;lt;br/&amp;gt;&lt;br /&gt;
Mon, 27. Feb 2012 - Ankündigung des RP6v2&amp;lt;br/&amp;gt;&lt;br /&gt;
Don, 08. Mär 2012 - Auslieferungsbeginn des RP6v2&amp;lt;br/&amp;gt;&lt;br /&gt;
Sam, 17. Mär 2012 - Ankündigung der RP6v2 M256 WiFi&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Siehe auch &amp;quot;Was bisher geschah&amp;quot; im [http://www.rn-wissen.de/index.php/RP6v2#Was_bisher_geschah RP6v2 Artikel]!'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Allgemein==  &lt;br /&gt;
[[Bild:DSC03448.JPG|thumb|RP6 mit Erweiterungsboard]] [[Bild:RP6_Lieferumfang.jpg|thumb|RP6 im Lieferumfang]]&lt;br /&gt;
Der von Arexx entwickelte RP6 ([http://www.conrad.de/ce/de/product/191524/C-Control-Robot-System-RP6-Robotersystem 191524]) ist ein autonomes Raupenfahrzeug, das nicht nur für Schüler und Studenten zum Einstieg in das Gebiet Robotik sondern auch für Fortgeschrittene Elektroniker und Bastler sehr gut geeignet ist, da das System für selbstentworfene Erweiterungen ausgelegt ist. Der RP6 wird von einem, unter Roboterentwicklern beliebten, AVR Microcontroller von Atmel gesteuert und hat Lichtsensoren in Form von zwei LDRs, 2 Bumper an der Stoßstange, 6 Status LEDs, Sensoren zur Überwachung der Akkuspannung, Drehgeber mit 625 CPR, ein Infrarot Sensor zur Hinderniserkennung und Kommunikation und Motorstromsensoren zur Verfügung. Zudem liegt dem Roboter eine umfangreiche Anleitung, inklusive einem kleinen C-Crashkurs, ein USB-Interface zum Anschluss an den PC und ein USB Kabel bei.&lt;br /&gt;
&lt;br /&gt;
In diesem Artikel geht es um die Grundlagen des RP6. Zur Programmierung des RP6 gibt es eine eigene Seite: [[RP6 - Programmierung]]&lt;br /&gt;
&lt;br /&gt;
==Technische Daten==&lt;br /&gt;
{|  {{Blauetabelle}} &lt;br /&gt;
|'''Mikrocontroller:'''&lt;br /&gt;
|AVR [[ATmega32]]&lt;br /&gt;
|-&lt;br /&gt;
|'''Speicher:'''&lt;br /&gt;
|32 kB [[Flash]]-Speicher, davon 1 kB bereits vom Bootloader belegt&amp;lt;br/&amp;gt;&lt;br /&gt;
2 kB RAM&amp;lt;br/&amp;gt; &lt;br /&gt;
1 kB [[EEPROM]]&lt;br /&gt;
|-&lt;br /&gt;
|'''Programmierung:'''&lt;br /&gt;
|Über AVR-[[Bootloader]], belegt ca. 1 kB des Flash-Speichers&lt;br /&gt;
|-&lt;br /&gt;
|'''Vorhandene Sensoren:'''&lt;br /&gt;
|2 [[Sensorarten#Helligkeit|Lichtsensoren (LDR)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
1 [[Sensorarten#Helligkeit|Infrarot (ACS - Anti Collision System)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
2 [[Sensorarten#Bumpers|Bumper]] &amp;lt;br/&amp;gt; &lt;br /&gt;
2 [[Sensorarten#Incremental-Geber|Drehgeber (Encoder)]]&lt;br /&gt;
|-&lt;br /&gt;
|'''Vorhandene Aktoren:'''&lt;br /&gt;
|2 Motoren&amp;lt;br/&amp;gt;&lt;br /&gt;
6 Status-LEDs&amp;lt;br/&amp;gt;&lt;br /&gt;
1 IR-Sender&amp;lt;br/&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|'''Abmessungen:'''&lt;br /&gt;
|(L &amp;amp;times; B &amp;amp;times; H) 172 &amp;amp;times; 128 &amp;amp;times; 50 mm&lt;br /&gt;
|-&lt;br /&gt;
|'''Ausführung:'''&lt;br /&gt;
|Fertig aufgebauter Roboter&lt;br /&gt;
|-&lt;br /&gt;
|'''Stromversorgung:'''&lt;br /&gt;
|6 AA NiMH Akkus&lt;br /&gt;
|-&lt;br /&gt;
|'''Hersteller:'''&lt;br /&gt;
|Arexx Niederlande&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Mechanik==&lt;br /&gt;
===Beschreibung===&lt;br /&gt;
&lt;br /&gt;
===Sensoren===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Encoder====&lt;br /&gt;
&lt;br /&gt;
Die Drehgeber sind an den Getrieben der Motoren zur Drehzahlmessung angebracht. Es handelt sich dabei um Reflexlichtschranken, die auf Codierscheiben mit je 18 weissen und 18 schwarzen Segmenten ausgerichtet sind, also insgesamt 36 Segmente. Diese Codierscheiben sind wiederum an je eines der Zahnräder der beiden Getriebe geklebt worden. Wenn es sich dreht, wandern die einzelnen Segmente an der Reflexlichtschranke vorbei. Die weissen Segmente reflektieren das Infrarotlicht, die schwarzen Segmente nur wenig. Jedes der zwei mittleren Stufenzahnräder des Getriebes hat 50 Zähne auf dem großen, und 12 auf dem kleineren Zahnrad. Die Codierscheiben befinden sich auf dem Zahnrad neben dem Motor, also rechnet man:&lt;br /&gt;
50/12 * 50/12 =17.13/36; 17.13/36 * 36=625&lt;br /&gt;
Daher haben die Encoderscheiben auch Ihre 36 Segmente, denn das gibt eine schöne runde Zahl ohne gebrochenen Anteil. Die Drehgeber erzeugen also 625 Flanken pro Radumdrehung wobei jede Flanke einem Segment entspricht. Bei einem Raddurchmesser von ca. 50mm inkl. Raupenkette, ergibt sich rein rechnerisch ein Radumfang von ca. 157mm was 0.2512mm pro Zählschritt der Drehgeber entspricht. Da sich die Raupenketten aber fast immer etwas in den Untergrund eindrücken (bzw. auch selbst eingedrückt werden) kann man aber von 0.25mm pro Zählschritt ausgehen – meist ist es sogar etwas weniger, z.B. nur 0.24 oder 0.23mm. Das muss man durch abfahren von Teststrecken ermitteln, wie es im Anhang grob beschrieben ist. Sehr genau ist das allerdings durch Radschlupf (bzw. hier müssten wir eigentlich von „Kettenschlupf“ sprechen) und ähnlichen Dingen nicht - vor allem beim Rotieren auf der Stelle. Beim normalen Geradeausfahren ist dieser Fehler klein, aber beim Rotieren kann er schnell sehr große Werte annehmen! Abweichungen muss man evtl. durch weitere Tests ermitteln und mit einkalkulieren. Das ist bei Raupenantrieben leider so – auch bei viel teureren und hochwertigeren Robotern. Dafür hat man aber den Vorteil, dass der Roboter mit Raupenantrieb recht geländegängig ist im Vergleich zu Robotern mit normalem Differentialantrieb mit zwei Antriebsrädern und Stützrad. Kleinere Hindernisse und Rampen kann er meist problemlos überwinden.&lt;br /&gt;
Dabei sind die Encoder sehr nützlich, denn man kann die Geschwindigkeit gut einregeln, egal wie der Untergrund und die Motorbelastung gerade aussieht. Bei gemessenen 50 Segmenten pro Sekunde liegt die Geschwindigkeit bei 1.25 cm/s, sofern wir von 0.25mm pro Zählschritt ausgehen. Etwa 50 Segmente pro Sekunde ist auch die geringste gerade noch regelbare Geschwindigkeit (das variiert aber etwas von Roboter zu Roboter). Bei 1200 Segmenten pro Sekunde wären es die maximal möglichen 30 cm/s (bei 0.25mm Auflösung, bei 0.23 sind es 27.6 cm/s). Standardmäßig begrenzt die Funktionsbibliothek das aber auf 1000 Flanken pro Sekunde. Die maximale Geschwindigkeit ist vom Ladezustand der Akkus abhängig – daher wären 30cm/s nicht besonders lange haltbar. Außerdem erhöht sich die Lebensdauer der Getriebe und Motoren je langsamer man fährt! Wenn der Roboter 4000 Segmente gezählt hat, ist er übrigens etwa einen Meter weit gefahren. Aber wie schon gesagt, gilt das natürlich nur für genau 0.25mm Auflösung. Ohne Kalibrierung hat man hier immer mehr oder weniger starke Abweichungen. Wem es nicht auf jeden mm ankommt, braucht nichts zu kalibrieren und kann einfach von 0.25mm oder besser 0.24mm ausgehen!&lt;br /&gt;
&lt;br /&gt;
====Stoßstangensensoren====&lt;br /&gt;
&lt;br /&gt;
Vorn am Roboter sind zwei Mikroschalter mit langem Schalthebel auf einer separaten&lt;br /&gt;
Platine untergebracht, die etwas vor der anderen Sensorplatine liegt. Dadurch werden&lt;br /&gt;
die IR LEDs auf der Sensorplatine geschützt und können nicht so leicht verbiegen&lt;br /&gt;
wenn der Roboter mal gegen ein Hindernis fährt. Die Stoßstange kann man auch abmontieren und z.B. gegen eine Schuss- oder Sammelvorrichtung für Bälle o.ä. ersetzen wenn man möchte.&lt;br /&gt;
&lt;br /&gt;
====Lichtsensoren====&lt;br /&gt;
&lt;br /&gt;
Vorne auf der kleinen Sensorplatine des Roboters sind zwei sog.&lt;br /&gt;
LDRs (=&amp;quot;Light Dependant Resistors&amp;quot; also lichtabhängige Widerstände)&lt;br /&gt;
platziert und nach links bzw. rechts ausgerichtet. Zwischen&lt;br /&gt;
den beiden Sensoren ist noch eine kleine schwarze&lt;br /&gt;
„Trennwand“ damit das Licht aus einer Richtung möglichst nur&lt;br /&gt;
einen der Sensoren erreicht. Sie bilden zusammen mit je einem&lt;br /&gt;
normalen Widerstand wie beim Batteriesensor einen Spannungsteiler – hier allerdings&lt;br /&gt;
um das Umgebungslicht zu messen.&lt;br /&gt;
&lt;br /&gt;
====Anti Collision System====&lt;br /&gt;
&lt;br /&gt;
Der aus Softwaresicht komplexeste Sensor des RP6 ist das ACS - das&lt;br /&gt;
„Anti Collision System“ (engl. für Anti Kollisions System)! Es besteht&lt;br /&gt;
aus einem IR Empfänger (s. Abb.) und zwei vorne auf der Sensorplatine&lt;br /&gt;
links und rechts angebrachten IR LEDs.&lt;br /&gt;
Da es je eine IR LED links und rechts gibt, kann das ACS grob unterscheiden ob sich&lt;br /&gt;
das Objekt links, rechts oder mittig vor dem Roboter befindet.&lt;br /&gt;
Man kann zusätzlich noch die Stromstärke mit der die beiden IR LEDs gepulst werden&lt;br /&gt;
in drei Stufen einstellen. Das ACS funktioniert aber auch in der höchsten Stufe nicht&lt;br /&gt;
mit allen Objekten immer zuverlässig, denn es kommt auf die Beschaffenheit der&lt;br /&gt;
Oberfläche des jeweiligen Objekts an! Ein schwarzes Objekt reflektiert das IR Licht natürlich&lt;br /&gt;
viel schlechter als ein weisses Objekt und ein kantiges und spiegelndes Objekt&lt;br /&gt;
könnte das IR Licht hauptsächlich in eine bestimme Richtung reflektieren. Die Reichweite&lt;br /&gt;
ist also immer vom jeweiligen Objekt abhängig! Das ist eine prinzipielle Schwäche&lt;br /&gt;
von so gut wie allen IR Sensoren (jedenfalls in dieser Preisklasse).&lt;br /&gt;
Trotzdem werden die meisten Hindernisse zuverlässig erkannt und können umfahren&lt;br /&gt;
werden. Falls das mal nicht klappt, gibt es noch die Stoßstange mit den Tastsensoren&lt;br /&gt;
und falls auch die nicht richtig getroffen werden, kann der Roboter noch mit den Motorstromsensoren&lt;br /&gt;
oder den Encodern erkennen, ob die Motoren blockieren (s.u.)!&lt;br /&gt;
Wem das nicht reicht, der könnte zusätzlich z.B. noch Ultraschallsensoren anbringen...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Erweiterungssystem===&lt;br /&gt;
Auf dem Mainboard sind 22 freie 3,2mm Löcher vorhanden (im Chassis weitere 16), auf denen die Erweiterungsmodule symmetrisch vorne und hinten gestapelt werden können. Weil der Stromverbrauch durch mehr Module steigt, ist es sinnvoll nur insgesamt 6-8 Module auf dem Roboter zu stapeln. Auf dem Mainboard selbst sind noch 6 kleine Erweiterungsflächen verfügbar (plus 2 sehr kleine auf der Bumperplatine).&lt;br /&gt;
&lt;br /&gt;
===Antrieb===&lt;br /&gt;
&lt;br /&gt;
Die 7,2 VDC Motoren sind im Chassis eingebaut und werden mithilfe der H-Brücken gesteuert. Die maximale Geschwindigkeit liegt bei 25cm/s, das kann je nach Akkuspannung aber variieren. Ohne Softwarebegrenzung sind sogar 30cm/s möglich, dadurch verringert sich aber die Lebensdauer der Motoren. Die maximale Steigung, die der RP6 bewältigen kann, ist 30%, ohne Bumperplatine 40%, das hängt aber auch vom Untergrund ab. Kleine Hindernisse wie Bücher und Stifte kann der RP6 problemlos überqueren. Die Achsen der Räder sind in selbstschmierenden Sinterlagern mit 4mm Durchmesser gelagert.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Elektromechanik==&lt;br /&gt;
===Beschreibung===&lt;br /&gt;
===Odometrie===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Elektronik==&lt;br /&gt;
[[Bild:RP6 Block.jpg|thumb|Blockdiagramm]]&lt;br /&gt;
===Beschreibung===&lt;br /&gt;
&lt;br /&gt;
===Sensoren (SENSORS)===&lt;br /&gt;
&lt;br /&gt;
Die meisten Sensoren über die der Roboter verfügt, haben wir ja schon in anderen Abschnitten kurz genannt, wollen diese nun aber etwas detaillierter betrachten.&lt;br /&gt;
In dem Blockdiagramm sind einige der Sensoren nicht in dem blauen Bereich &amp;quot;Sensors&amp;quot; zu sehen, weil sie besser in andere Bereiche passen. Trotzdem zählen natürlich auch die Drehgeber (= “Encoder“), Motorstromsensoren und der Batteriespannungssensor zu den Sensoren und werden darum in diesem Abschnitt beschrieben!&lt;br /&gt;
&lt;br /&gt;
====Batteriespannungs-Sensor (Voltage Sensor)====&lt;br /&gt;
&lt;br /&gt;
Dieser &amp;quot;Sensor&amp;quot; ist eigentlich nur ein einfacher Spannungsteiler aus zwei Widerständen. Wir gehen davon aus, dass die Batterien insgesamt maximal 10V liefern können. 6 NiMH Akkus werden immer unterhalb davon bleiben. Die Referenzspannung des ADC, also die Spannung mit der er die gemessene Spannung vergleicht, beträgt 5V. Da auch die Betriebsspannung 5V beträgt, darf diese nicht überschritten werden. Also müssen wir die zu messende Spannung um die Hälfte herabsetzen! Dies geschieht über einen Spannungsteiler aus zwei Widerständen, der die Spannung an den Messbereich des ADCs anpasst. Der ADC löst mit 10 Bit auf (Wertebereich 0 bis 1023), was eine Auflösung von 10V/1024=9.765625mV ergibt. Ein Messwert von 512 entspricht hier also 5V und 1023 wären ungefähr 10V! Diese Grenzwerte sollten aber normalerweise nie erreicht werden! Das ist nicht besonders genau, da die Widerstände keineswegs Präzisionswiderstände sind. Abweichungen von einigen Prozent nach oben und unten sind möglich. Auch die Referenzspannung von 5V ist nicht ganz genau und kann bei normaler Belastung etwas variieren. Das stört hier nicht, denn wir brauchen ohnehin nur einen ungefähren Wert um festzustellen ob die Batterien sich langsam dem Ende nähern. Wer die Spannung genau messen will, braucht ein Multimeter um den Messfehler zu ermitteln und diesen dann in Software auszugleichen. Wenn man mit Fehlern leben kann, kann man die Spannung dank des günstigen Umrechnungsverhältnisses sogar direkt aus den ADC Werten ungefähr abschätzen: 720 entsprechen dann grob 7.2V, 700 etwa 7V und 650 wären etwa 6.5V. Bei einem konstanten Wert unter 560 kann man davon ausgehen, dass die Akkus fast leer sind.&lt;br /&gt;
&lt;br /&gt;
====Motorstrom====&lt;br /&gt;
[[Bild:RP6_MSS.jpg|thumb]]&lt;br /&gt;
Es befinden sich zwei Leistungswiderstände in den beiden Motorstromkreisen. Aus dem Ohm'schen Gesetz U=RxI folgt, dass sich die Spannung die an einem bestimmten Widerstand abfällt, proportional zum Strom verhält, der diesen durchfließt!&lt;br /&gt;
Damit die Spannungsabfälle an den Widerständen nicht zu groß werden, müssen die Widerstände klein gewählt werden. In unserem Fall haben Sie einen Wert von 0.1 Ohm&lt;br /&gt;
Die abfallende Spannung ist also nur sehr klein (0.1V bei einem Strom von 1A) und muss verstärkt werden bevor sie mit dem ADC gemessen werden kann. Das erledigt jeweils ein sog. Operationsverstärker (OPV). In der Schaltung des RP6 wird je Motorkanal ein OPV verwendet. Der Messbereich geht etwa bis 1.8A. Bei 1.8A fallen etwa 0.18V am Widerstand ab und es ergibt sich am Ausgang des OPV eine Spannung von etwa 4V. Mehr kann der verwendete OPV bei 5V Betriebsspannung nicht ausgeben:&lt;br /&gt;
&lt;br /&gt;
I = U / ((1 + (100k / 4,7k)) * 0,1)&lt;br /&gt;
&lt;br /&gt;
Die Leistungswiderstände haben eine Toleranz von 10%, die Widerstände am OPV 5%, also ist das alles nur sehr ungenau (Ungenauigkeiten im Bereich von etwa 270mA sind möglich wenn man die Sensoren nicht kalibriert!). Wir brauchen allerdings auch nur den ungefähren Wert um festzustellen ob die Motoren stark oder wenig belastet werden. So kann der Roboter gut blockierte oder gar defekte Motoren bzw. Drehgeber erkennen! Die DC-Motoren benötigen mehr Strom je stärker sie belastet werden (Drehmoment) und somit steigt der Strom sehr stark an wenn die Motoren blockiert sind. Das wird von der Robotersoftware zur Notabschaltung verwendet: wenn die Motoren dauerhaft mit hohem Strom betrieben würden, könnten diese sehr heiß werden und dadurch Schaden nehmen! Und wenn die Encoder mal ausfallen sollten – aus welchem Grund auch immer – kann auch das damit erkannt werden. Man würde dann eine Drehzahl von 0 messen. Lässt man die Motoren aber auf voller Kraft laufen und der Strom bleibt trotzdem klein (also sind die Ketten nicht blockiert!), kann man genau daraus schließen, dass entweder die Encoder, oder die Motoren ausgefallen sind (oder Encoder und Motorstromsensoren nicht funktionieren... das passiert z.B. wenn man vergessen hat diese vorher per Software einzuschalten).&lt;br /&gt;
&lt;br /&gt;
====Encoder====&lt;br /&gt;
[[Bild:RP6_ENCODER.jpg|thumb]]&lt;br /&gt;
Ganz anders als die letztgenannten Sensoren funktionieren die Drehgeber, die an den Getrieben der Motoren zur Drehzahlmessung angebracht sind. Es handelt sich dabei um Reflexlichtschranken, die auf Codierscheiben mit je 18 weissen und 18 schwarzen Segmenten ausgerichtet sind, also insgesamt 36 Segmente (s. Abb). Diese Codierscheiben sind wiederum an je eines der Zahnräder der beiden Getriebe geklebt worden. Wenn es sich dreht, wandern die einzelnen Segmente an der Reflexlichtschranke vorbei. Die weissen Segmente reflektieren das Infrarotlicht, die schwarzen Segmente nur wenig. Die Drehgeber erzeugen so zwar auch wie die anderen Sensoren ein analoges Signal, aber es wird digital interpretiert. Zunächst wird das Signal verstärkt und anschließend über einen sog. Schmitt Trigger in ein Rechtecksignal umgewandelt. Die Flanken dieses Signals, also die Wechsel von 5 auf 0V und umgekehrt, lösen jeweils ein Interrupt Ereignis aus und diese werden dann von der Software gezählt. So kann die zurückgelegte Wegstrecke gemessen und zusammen mit einem Timer zur Zeitmessung die Drehzahl und damit auch die Geschwindigkeit ermittelt werden. Die Ermittlung der Drehzahl ist auch Hauptanwendung der Encoder – nur mit den Encodern kann man die Drehzahl auf den gewünschten Sollwert einregeln. Ohne Regelung wäre die Drehzahl nämlich von der Akkuspannung, Belastung der Motoren usw. abhängig. Die hohe Auflösung ermöglicht es dabei, auch niedrige Geschwindigkeiten noch relativ genau einzuregeln. Jedes der zwei mittleren Stufenzahnräder des Getriebes hat 50 Zähne auf dem großen, und 12 auf dem kleineren Zahnrad (s. Abb). Die Codierscheiben befinden sich auf dem Zahnrad neben dem Motor, also rechnet man:&lt;br /&gt;
&lt;br /&gt;
50/12 * 50/12 =17.13/36; 17.13/36 * 36=625&lt;br /&gt;
&lt;br /&gt;
Daher haben die Encoderscheiben auch Ihre 36 Segmente, denn das gibt eine schöne runde Zahl ohne gebrochenen Anteil. Die Drehgeber erzeugen also 625 Flanken pro Radumdrehung wobei jede Flanke einem Segment entspricht. Bei einem Raddurchmesser von ca. 50mm inkl. Raupenkette, ergibt sich rein rechnerisch ein Radumfang von ca. 157mm was 0.2512mm pro Zählschritt der Drehgeber entspricht. Da sich die Raupenketten aber fast immer etwas in den Untergrund eindrücken (bzw. auch selbst eingedrückt werden) kann man aber von 0.25mm pro Zählschritt ausgehen – meist ist es sogar etwas weniger, z.B. nur 0.24 oder 0.23mm. Das muss man durch abfahren von Teststrecken ermitteln, wie es im Anhang grob beschrieben ist. Sehr genau ist das allerdings durch Radschlupf (bzw. hier müssten wir eigentlich von „Kettenschlupf“ sprechen) und ähnlichen Dingen nicht - vor allem beim Rotieren auf der Stelle. Beim normalen Geradeausfahren ist dieser Fehler klein, aber beim Rotieren kann er schnell sehr große Werte annehmen! Abweichungen muss man evtl. durch weitere Tests ermitteln und mit einkalkulieren. Das ist bei Raupenantrieben leider so – auch bei viel teureren und hochwertigeren Robotern. Dafür hat man aber den Vorteil, dass der Roboter mit Raupenantrieb recht geländegängig ist im Vergleich zu Robotern mit normalem Differentialantrieb mit zwei Antriebsrädern und Stützrad. Kleinere Hindernisse und Rampen kann er meist problemlos überwinden.&lt;br /&gt;
Dabei sind die Encoder sehr nützlich, denn man kann die Geschwindigkeit gut einregeln, egal wie der Untergrund und die Motorbelastung gerade aussieht. Bei gemessenen 50 Segmenten pro Sekunde liegt die Geschwindigkeit bei 1.25 cm/s, sofern wir von 0.25mm pro Zählschritt ausgehen. Etwa 50 Segmente pro Sekunde ist auch die geringste gerade noch regelbare Geschwindigkeit (das variiert aber etwas von Roboter zu Roboter). Bei 1200 Segmenten pro Sekunde wären es die maximal möglichen 30 cm/s (bei 0.25mm Auflösung, bei 0.23 sind es 27.6 cm/s). Standardmäßig begrenzt die Funktionsbibliothek das aber auf 1000 Flanken pro Sekunde. Die maximale Geschwindigkeit ist vom Ladezustand der Akkus abhängig – daher wären 30cm/s nicht besonders lange haltbar. Außerdem erhöht sich die Lebensdauer der Getriebe und Motoren je langsamer man fährt!&lt;br /&gt;
&lt;br /&gt;
=====Encoder justieren=====&lt;br /&gt;
Damit der RP6 die Signale der Drehgeber richtig auswerten kann, muss man evtl. die Drehgeber einmalig justieren. Dies kann auch schon bei einem neu gekauften RP6 notwendig sein.&lt;br /&gt;
Eine genaue Anleitung dazu findet man [http://www.arexx.com/rp6/downloads/RP6_ENCODER_DE_20071219.zip hier]. Es gibt auch ein [http://www.arexx.com/rp6/downloads/rp6_encoder_video.zip Video], das die Drehgeber-Justierung zeigt.&lt;br /&gt;
&lt;br /&gt;
=====Encoder kalibrieren=====&lt;br /&gt;
Wenn der Roboter 4000 Segmente gezählt hat, ist er etwa einen Meter weit gefahren. Aber wie schon gesagt, gilt das natürlich nur für genau 0.25mm Auflösung. Ohne Kalibrierung hat man hier immer mehr oder weniger starke Abweichungen. Wem es nicht auf jeden mm ankommt, braucht nichts zu kalibrieren und kann einfach von 0.25mm oder besser 0.24mm ausgehen!&lt;br /&gt;
Optimal ist es, wenn man sich für Weg- und Winkelmessungen nicht auf die Encoder Daten stützen muss, sondern externe Systeme wie Infrarotbaken oder einen genauen elektronischen Kompass dazu zur Verfügung hat.&lt;br /&gt;
&lt;br /&gt;
Will man die Drehgeber des RP6 dennoch kalibrieren, kann man ihn z.B. mit diesem Testprogramm:&lt;br /&gt;
&amp;lt;pre&amp;gt;#include &amp;quot;RP6RobotBaseLib.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
	initRobotBase();&lt;br /&gt;
	powerON();&lt;br /&gt;
&lt;br /&gt;
	// Test: Go ahead 1m and stop!&lt;br /&gt;
	move (80, FWD, DIST_MM(1000), true);&lt;br /&gt;
	writeString_P(&amp;quot;LEFT RIGHT&amp;quot;);&lt;br /&gt;
 	writeString_P(&amp;quot;\n&amp;quot;);&lt;br /&gt;
 	writeInteger(mleft_dist, DEC);&lt;br /&gt;
	writeChar(' ');&lt;br /&gt;
 	writeInteger(mright_dist, DEC);&lt;br /&gt;
	writeString_P(&amp;quot;\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
	powerOFF();&lt;br /&gt;
&lt;br /&gt;
	return 0;&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
... 1m weit fahren lassen und dann messen, wie weit er tatsächlich gefahren ist. Das Programm gibt auf dem Terminal den Stand der Drehgeber aus. Teilt man dann die gemessene Fahrstrecke in mm durch den Wert der Drehgeber, erhält man die Auflösung. Diesen Wert kann man dann der Konstanten ENCODER_RESOLUTION in der RP6Config.h zuweisen. Nach &amp;quot;Make Clean&amp;quot;, einer Neukompilierung und erneuter Ausführung des Testprogramms müßte der RP6 jetzt genau 1m weit fahren. Das gilt zumindest für den Untergrund, auf dem die Kalibrierung durchgeführt wurde.&lt;br /&gt;
&lt;br /&gt;
====Stoßstangensensoren (Bumper)====&lt;br /&gt;
&lt;br /&gt;
Vorn am Roboter sind zwei Mikroschalter mit langem Schalthebel auf einer separaten&lt;br /&gt;
Platine untergebracht, die etwas vor der anderen Sensorplatine liegt. Dadurch werden&lt;br /&gt;
die IR LEDs auf der Sensorplatine geschützt und können nicht so leicht verbiegen&lt;br /&gt;
wenn der Roboter mal gegen ein Hindernis fährt. Mit den zwei Schaltern kann der Mikrocontroller&lt;br /&gt;
einen solchen Aufprall registrieren und dann beispielsweise zurücksetzen,&lt;br /&gt;
sich etwas drehen und weiterfahren. Die Schalter sind an zwei der Ports die schon mit&lt;br /&gt;
den LEDs verbunden sind angeschlossen und blockieren so keine anderen Ports des&lt;br /&gt;
Mikrocontrollers. Daher leuchten die LEDs auch immer wenn man einen der Schalter&lt;br /&gt;
drückt! Da dies normalerweise relativ selten passiert, stört das aber nicht weiter.&lt;br /&gt;
Die Stoßstange kann man auch abmontieren und z.B. gegen eine Schuss- oder Sammelvorrichtung&lt;br /&gt;
für Bälle o.ä. ersetzen wenn man möchte.&lt;br /&gt;
&lt;br /&gt;
====Lichtsensoren (LDRs)====&lt;br /&gt;
[[Bild:RP6_Licht.jpg|thumb]]&lt;br /&gt;
Vorne auf der kleinen Sensorplatine des Roboters sind zwei sog.&lt;br /&gt;
LDRs (=&amp;quot;Light Dependant Resistors&amp;quot; also lichtabhängige Widerstände)&lt;br /&gt;
platziert und nach links bzw. rechts ausgerichtet. Zwischen&lt;br /&gt;
den beiden Sensoren ist noch eine kleine schwarze&lt;br /&gt;
„Trennwand“ damit das Licht aus einer Richtung möglichst nur&lt;br /&gt;
einen der Sensoren erreicht. Sie bilden zusammen mit je einem&lt;br /&gt;
normalen Widerstand wie beim Batteriesensor einen Spannungsteiler – hier allerdings&lt;br /&gt;
um das Umgebungslicht zu messen. Die 5V Betriebsspannung wird auch geteilt, aber&lt;br /&gt;
hier ist einer der Widerstände variabel! Es wird also das Teilungsverhältnis je nach Intensität&lt;br /&gt;
des Lichteinfalls verändert und somit eine vom Lichteinfall abhängige Spannung&lt;br /&gt;
an einen der A/D Wandler Kanäle geleitet!&lt;br /&gt;
Über den Spannungsunterschied zwischen den beiden Sensoren kann man ermitteln in&lt;br /&gt;
welcher Richtung sich eine bzw. die hellste Lichtquelle vor dem Roboter befindet:&lt;br /&gt;
Links, Rechts oder in der Mitte. Mit einem entsprechenden Programm, kann man so z.B. eine starke Taschenlampe in&lt;br /&gt;
einem abgedunkelten Zimmer verfolgen, oder den Roboter die hellste Stelle in einem&lt;br /&gt;
Raum suchen lassen! Klappt z.B. sehr gut mit einem stärkeren Hand-Halogenscheinwerfer:&lt;br /&gt;
Wenn man damit auf den Boden leuchtet, kann der Roboter dem Lichtfleck auf&lt;br /&gt;
dem Boden folgen.&lt;br /&gt;
Das geht natürlich auch umgekehrt: Der Roboter könnte z.B. auch versuchen sich vor&lt;br /&gt;
hellem Licht zu verstecken...&lt;br /&gt;
Wenn man noch ein oder zwei LDRs hinten am Roboter anbringen würde, könnte man&lt;br /&gt;
das noch verfeinern und die Richtung in der sich Lichtquellen befinden besser bestimmen.&lt;br /&gt;
Der Roboter kann sonst nämlich oft nur schwer unterscheiden ob die Lichtquelle&lt;br /&gt;
vor oder hinter ihm liegt. Zwei der A/D Wandler Kanäle sind noch frei...&lt;br /&gt;
&lt;br /&gt;
====Anti Collision System (ACS)====&lt;br /&gt;
[[Bild:RP6 ACS.jpg|thumb|Das ACS]]&lt;br /&gt;
Der aus Softwaresicht komplexeste Sensor des RP6 ist das ACS - das „Anti Collision System“ (engl. für Anti Kollisions System)! Es besteht aus einem IR Empfänger (s. Abb.) und zwei vorne auf der Sensorplatine links und rechts angebrachten IR LEDs. Die IR LEDs werden direkt vom Mikrocontroller angesteuert. Die Ansteuerungsroutinen können beliebig verändert und verbessert werden! Beim Vorgängermodell war dafür noch ein eigener Controller nötig, dessen Programm aber nicht vom Anwender geändert werden konnte...&lt;br /&gt;
Mit den IR LEDs werden kurze, mit 36kHz modulierte Infrarot Impulse ausgesandt, auf die der darauf ausgelegte IR Empfänger reagiert. Werden die IR Impulse an einem Gegenstand vor dem Roboter reflektiert und vom IR Empfänger detektiert, kann der Mikrocontroller darauf reagieren und z.B. ein Ausweichmanöver einleiten. Damit das ACS nicht zu empfindlich bzw. auf eventuelle Störungen reagiert, wartet die Software bis eine bestimmte Anzahl von Impulsen in einer bestimmten Zeit empfangen worden ist. Es wird auch eine Synchronisation mit dem RC5 Empfang durchgeführt und auf die RC5 Signale von TV/Hifi Fernbedienungen wird so nicht reagiert. Bei anderen Codes kann das aber nicht garantiert werden und das ACS könnte dann Hindernisse erkennen, wo gar keine sind! Da es je eine IR LED links und rechts gibt, kann das ACS grob unterscheiden ob sich das Objekt links, rechts oder mittig vor dem Roboter befindet.&lt;br /&gt;
Man kann zusätzlich noch die Stromstärke mit der die beiden IR LEDs gepulst werden in drei Stufen einstellen. Das ACS funktioniert aber auch in der höchsten Stufe nicht mit allen Objekten immer zuverlässig, denn es kommt auf die Beschaffenheit der Oberfläche des jeweiligen Objekts an! Ein schwarzes Objekt reflektiert das IR Licht natürlich viel schlechter als ein weisses Objekt und ein kantiges und spiegelndes Objekt könnte das IR Licht hauptsächlich in eine bestimme Richtung reflektieren. Die Reichweite ist also immer vom jeweiligen Objekt abhängig! Das ist eine prinzipielle Schwäche von so gut wie allen IR Sensoren (jedenfalls in dieser Preisklasse).&lt;br /&gt;
Trotzdem werden die meisten Hindernisse zuverlässig erkannt und können umfahren werden. Falls das mal nicht klappt, gibt es noch die Stoßstange mit den Tastsensoren und falls auch die nicht richtig getroffen werden, kann der Roboter noch mit den Motorstromsensoren oder den Encodern erkennen, ob die Motoren blockieren (s.u.)!&lt;br /&gt;
Wem das nicht reicht, der könnte zusätzlich z.B. noch Ultraschallsensoren anbringen...&lt;br /&gt;
&lt;br /&gt;
====IR-Kommunikation (IRCOMM)====&lt;br /&gt;
Der RP6 kann über die IR-LEDs links und rechts über der Bumper-Platine Daten zu anderen IR-Empfängern senden.  Es ist z.B. möglich, dass mehrere Roboter ihre Sensorwerte untereinander vergleichen.&lt;br /&gt;
&lt;br /&gt;
====6 Status-LEDs====&lt;br /&gt;
Die Status-LEDs sind vorne links und rechts über den Lichtsensoren auf der Hauptplatine angebracht.&lt;br /&gt;
&lt;br /&gt;
Über die Status-LEDs können Sensorzustände, z.B. des ACS, der Bumper oder der Lichtsensoren, dargestellt werden.&lt;br /&gt;
&lt;br /&gt;
====IR-Sender====&lt;br /&gt;
Über den IR-Sender können Daten zu anderen Geräten übertragen werden.&lt;br /&gt;
&lt;br /&gt;
===Erweiterungssystem (EXPANSION SYSTEM)===&lt;br /&gt;
[[Bild:RP6_EXP.jpg|thumb]]&lt;br /&gt;
Eines der nützlichsten Features des RP6 ist das Erweiterungssystem.&lt;br /&gt;
Man kann den RP6 damit genau so weit ausbauen,&lt;br /&gt;
wie man es benötigt. Aus Kostengründen bietet das&lt;br /&gt;
Basissystem schließlich nur relativ wenig Sensoren. Es sind&lt;br /&gt;
zwar schon mehr als bei vielen anderen Robotern in dieser&lt;br /&gt;
Preisklasse, aber erst mit weiteren Sensoren macht ein Roboter&lt;br /&gt;
so richtig Spaß. Das ACS kann beispielsweise nur grob&lt;br /&gt;
erkennen ob sich ein Hindernis vor dem Roboter befindet.&lt;br /&gt;
Mit Ultraschallsensoren oder besseren zusätzlichen IR Sensoren,&lt;br /&gt;
könnte man aber die Distanz ermitteln und so beispielsweise&lt;br /&gt;
bessere Ausweichmanöver fahren!&lt;br /&gt;
&lt;br /&gt;
Neben Sensoren macht es auch sehr viel Sinn, zusätzliche Controller einzubauen um&lt;br /&gt;
die anfallenden Aufgaben aufteilen zu können. Beispielsweise die RP6 CONTROL M32&lt;br /&gt;
Platine mit einem weiteren MEGA32 Mikrocontroller oder die CCPRO M128.&lt;br /&gt;
&lt;br /&gt;
Das Erweiterungssystem muss natürlich in der Lage sein, viele Erweiterungsmodule&lt;br /&gt;
miteinander zu verbinden, dabei mit wenigen Signalleitungen&lt;br /&gt;
auskommen und eine ausreichend hohe Geschwindigkeit bieten.&lt;br /&gt;
&lt;br /&gt;
Siehe [[I2C]]&lt;br /&gt;
&lt;br /&gt;
===Steuerung (CONTROL SYSTEM)===&lt;br /&gt;
&lt;br /&gt;
====Hauptprozessor (ATMEGA32)====&lt;br /&gt;
[[Bild:RP6_MEGA32.jpg|thumb|Der MEGA32]]&lt;br /&gt;
Der Hauptprozessor ist der ATMEGA32 vom Atmel. Er hat 32KB Flash ROM und 2KB RAM. Der ATMEGA ist mit 8Mhz getaktet, kann also bis zu 8 Millionen Befehle pro Sekunde ausführen. Es sind 32 I/O-Pins  am Controller verfügbar. Die I/O-Pins gehören zu I/O-Ports mit jeweils 8 Pins. Davon gibt es 4: PORTA, PORTB, PORTC und PORTD. Der Controller kann die Ports entweder ein oder ausschalten (Output), oder erkennen, ob Spannung angelegt wurde oder nicht (Input). Es gibt mehrere Module, die verschiedene Aufgaben übernehmen:&lt;br /&gt;
* 3 Timer, einer davon erzeugt die PWM-Signale für die Motoren&lt;br /&gt;
* Die serielle Schnittstelle (UART)&lt;br /&gt;
* Das TWI (Two Wire Interface, also Zweidraht Schnittstelle)&lt;br /&gt;
* Ein ADC (Analog to Digital Converter) mit 8 Eingangskanälen, welche mit 10bit (0-1023) auflösen&lt;br /&gt;
* Drei externe Interrupt Eingänge&lt;br /&gt;
&lt;br /&gt;
Auserdem befindet sich im Microcontroller ein sog. Bootloader, welcher mit dem RP6 Loader kommuniziert und neue Programme in den Speicher lädt.&lt;br /&gt;
&lt;br /&gt;
===Antrieb (DRIVE SYSTEM)===&lt;br /&gt;
[[Bild:RP6_H-Brücke.jpg|thumb|Die H-Brücke]]&lt;br /&gt;
[[Bild:RP6_Tastverhältniss.jpg|thumb]]&lt;br /&gt;
Der Antrieb des RP6 besteht aus zwei Gleichstrom Motoren mit nachgeschaltetem Getriebe,&lt;br /&gt;
über das die beiden Raupenketten angetrieben werden.&lt;br /&gt;
Die Motoren genehmigen sich je nach Belastung&lt;br /&gt;
einen recht hohen Strom und können&lt;br /&gt;
natürlich nicht direkt vom Mikrocontroller&lt;br /&gt;
angesteuert werden. Dazu braucht man&lt;br /&gt;
Leistungstreiber in Form von je einer H-Brücke&lt;br /&gt;
pro Motor. Das grundlegende Prinzip&lt;br /&gt;
ist in der nebenstehenden Abbildung dargestellt.&lt;br /&gt;
Eine H-Brücke besteht aus vier&lt;br /&gt;
&amp;quot;Schaltern&amp;quot;, die in Form eines H's um einen&lt;br /&gt;
Motor angeordnet sind. Nehmen wir mal an,&lt;br /&gt;
zunächst seien alle Schalter aus. Schaltet&lt;br /&gt;
man dann S1 und S4 (Rot) an, liegt eine&lt;br /&gt;
Spannung am Motor an und er dreht sich&lt;br /&gt;
z.B. nach rechts. Schalten wir nun S1 und&lt;br /&gt;
S4 wieder aus und danach S2 und S3 (Grün)&lt;br /&gt;
an, wird die am Motor anliegende Spannung umgepolt und er dreht sich in die entgegen gesetzte&lt;br /&gt;
Richtung, also nach links! Man muss darauf achten, nicht gleichzeitig S1&lt;br /&gt;
und S2, oder S3 und S4 einzuschalten, sonst entstünde ein Kurzschluss und dadurch&lt;br /&gt;
könnten die &amp;quot;Schalter&amp;quot; zerstört werden!&lt;br /&gt;
Natürlich verwenden wir auf dem RP6 keine mechanischen Schalter, sondern sog.&lt;br /&gt;
MOSFETs. Diese schalten beim Anlegen einer genügend hohen Spannung am Eingang&lt;br /&gt;
durch. Die Schaltvorgänge können sehr schnell erfolgen, mehrere Kilohertz sind bei&lt;br /&gt;
unserer Anwendung möglich.&lt;br /&gt;
So kann man also schon mal die Drehrichtung einstellen. Und wie bekommt man den&lt;br /&gt;
Motor nun schneller bzw. langsamer? Ein Elektromotor dreht umso schneller, je höher&lt;br /&gt;
die angelegte Spannung ist. Die Drehzahl kann also über die Spannung eingestellt&lt;br /&gt;
werden - und genau dazu können wir die H-Brücke auch verwenden!&lt;br /&gt;
Die Abbildung verdeutlicht das Prinzip&lt;br /&gt;
nach dem wir vorgehen können.&lt;br /&gt;
Wir erzeugen&lt;br /&gt;
ein Rechtecksignal fester Frequenz,&lt;br /&gt;
bei dem wir das sog. Tastverhältnis&lt;br /&gt;
verändern. Mit &amp;quot;Tastverhältnis&amp;quot; ist das&lt;br /&gt;
Verhältnis von der eingeschalteten zur&lt;br /&gt;
ausgeschalteten Zeit des Signals gemeint.&lt;br /&gt;
Am Motor liegt dann effektiv eine niedrigere,&lt;br /&gt;
mittlere Gleichspannung an, die dem&lt;br /&gt;
Tastverhältnis entspricht. In der Grafik ist&lt;br /&gt;
dies durch eine rote Linie (Ug) und die roten&lt;br /&gt;
Flächen verdeutlicht. Wenn z.B. eine&lt;br /&gt;
Spannung von 7 Volt von den Akkus an&lt;br /&gt;
den Motortreibern anliegt, und diese mit&lt;br /&gt;
einem Tastverhältnis von 50% angesteuert werden, würde die mittlere Spannung in&lt;br /&gt;
etwa bei der Hälfte, also 3.5V liegen! Das stimmt real nicht ganz, aber so kann man&lt;br /&gt;
es sich schon gut und einfach vorstellen.&lt;br /&gt;
Das Antriebssystem ist dank der hohen Untersetzung (~ 1:72) relativ stark und so&lt;br /&gt;
kann der RP6 viel schwerere Lasten tragen als es z.B. der kleine Roboter ASURO&lt;br /&gt;
könnte. Allerdings steigt mit zunehmendem Gewicht natürlich auch der Energiebedarf&lt;br /&gt;
und die Akkus werden schneller leer sein ...&lt;br /&gt;
Im Vergleich mit einem ferngesteuerten Rennwagen o.ä. könnte man denken der RP6&lt;br /&gt;
sei langsam - stimmt auch - das ist jedoch absichtlich so! Der Roboter wird von einem&lt;br /&gt;
Mikrocontroller gesteuert und wenn der Programmierer einen Fehler bei der Programmierung&lt;br /&gt;
gemacht hat, wäre es ungünstig mit 10km/h vor die Wand zu prallen! Bei&lt;br /&gt;
dem eher gemächlichen Tempo des RP6 passiert aber nicht so schnell etwas und nebenbei&lt;br /&gt;
haben die Sensoren mehr Zeit die Umgebung auf Hindernisse zu untersuchen.&lt;br /&gt;
Und da wäre natürlich noch der Vorteil der höheren Belastbarkeit und der viel genaueren&lt;br /&gt;
Geschwindigkeitsregelung!&lt;br /&gt;
&lt;br /&gt;
===Stromversorgung (POWER SUPPLY)===&lt;br /&gt;
[[Bild:RP6_IC1.jpg|thumb]]&lt;br /&gt;
Natürlich benötigt ein Roboter Energie. Diese trägt der RP6 gespeichert in 6 Akkus mit&lt;br /&gt;
sich herum. Die Laufzeit ist durch die Kapazität der Akkus eingeschränkt, denn auch&lt;br /&gt;
wenn die Elektronik verhältnismäßig wenig Energie benötigt, schlucken die Motoren je&lt;br /&gt;
nach Belastung doch ziemlich viel.&lt;br /&gt;
&lt;br /&gt;
Damit die Akkus möglichst lange halten und der Roboter nicht ständig Pause machen&lt;br /&gt;
muss, sollte man ihm daher etwas größere Energiespeicher mit etwa 2500mAh gönnen.&lt;br /&gt;
Kleinere mit 2000mAh oder mehr funktionieren aber auch. Mit guten Akkus kann&lt;br /&gt;
man 3 bis 6 Stunden oder mehr Laufzeit erreichen, abhängig von der Betriebszeit der&lt;br /&gt;
Motoren, deren Belastung und Qualität der Akkus. Die 6 Akkus die notwendig sind,&lt;br /&gt;
haben insgesamt eine Nennspannung von 6x 1.2V = 7.2V. Im Blockdiagramm ist dies&lt;br /&gt;
mit &amp;quot;UB&amp;quot; (= &amp;quot;U-Battery&amp;quot;, U ist der Formelbuchstabe für Spannung) bezeichnet. „Nennspannung&amp;quot;,&lt;br /&gt;
weil sich die Spannung mit der Zeit stark verändert. Voll aufgeladen können&lt;br /&gt;
die Akkus im Leerlauf insgesamt bis zu 8.5V liefern! Diese Spannung sinkt während&lt;br /&gt;
der Entladung ab und schwankt auch je nach Belastung (Motoren an oder aus,&lt;br /&gt;
schnell langsam etc. - wie stark die Spannung schwankt, hängt auch von der Qualität&lt;br /&gt;
der verwendeten Akkus ab. Der Innenwiderstand ist hier die kritische Größe).&lt;br /&gt;
Das ist für Messungen von Sensorwerten und ähnlichem natürlich nicht ohne weiteres&lt;br /&gt;
brauchbar. Noch wichtiger ist jedoch, dass viele der verwendeten Komponenten wie&lt;br /&gt;
z.B. der Mikrocontroller nur auf 5V oder weniger Betriebsspannung ausgelegt sind und&lt;br /&gt;
bei so hohen Spannungen zerstört würden. Die Akku Spannung muss also auf einen&lt;br /&gt;
definierten Wert heruntergeregelt und stabilisiert werden!&lt;br /&gt;
Das übernimmt ein 5V Spannungsregler, der einen Strom von&lt;br /&gt;
maximal 1.5A liefern kann (s. Abb.). Bei 1.5A würde er jedoch&lt;br /&gt;
ziemlich viel Wärme abgeben. Es gibt daher eine große Kühlfläche&lt;br /&gt;
auf der Platine an die der Regler festgeschraubt ist. Über 1A&lt;br /&gt;
sollte der Regler trotz Kühlung besser nur kurzzeitig (also wenige&lt;br /&gt;
Sekunden) belastet werden, wenn man nicht noch einen zusätzlichen&lt;br /&gt;
großen Kühlköper draufschraubt.&lt;br /&gt;
&lt;br /&gt;
Es wird empfohlen, 800mA Dauerlast nicht zu überschreiten! Bei&lt;br /&gt;
so einer Belastung und zusammen mit den Motoren wären die&lt;br /&gt;
Akkus auch recht schnell leer. Im normalen Betrieb ohne ein Erweiterungsboard&lt;br /&gt;
nimmt der Roboter übrigens nicht mehr als 40mA auf (ausser wenn&lt;br /&gt;
das IRCOMM sendet), also überhaupt kein Problem für den Regler und man hat noch&lt;br /&gt;
genug Reserven für die Erweiterungsmodule, die meistens auch nicht mehr als 50mA&lt;br /&gt;
aufnehmen sofern keine Motoren, große LEDs o.ä. daran angeschlossen sind.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Umbau-Optionen==&lt;br /&gt;
Hier soll beschrieben werden, welche Umbau-Optionen es für die RP6 Base gibt. Im Text gibt es Verweise auf den Schaltplan des RP6 (RP6_MAINBOARD.PDF) in der Form: (SP2 B1: Bauteil). Dies bedeutet, dass man das Bauteil auf Blatt 2 des RP6-Schaltplans im Feld B1 finden kann. Beispielhaft sind im folgenden Text Bestell-Nummern der Firma [http://www.conrad.de/ce/ CONRAD] genannt. Natürlich kann man die Teile auch bei anderen Versendern beziehen.&lt;br /&gt;
&lt;br /&gt;
Bei den Materialangaben ist öfter die Rede von &amp;quot;Steckbuchsen mit Litze&amp;quot;. Diese Steckbuchsen mit angelöteter Litze können auf die ein- oder zweireihigen Stiftleisten aufgesteckt werden. Leider gibt es sie nicht (mehr) fertig konfektioniert bei CONRAD. Die einreihigen Steckbuchsen (RM 2,54mm) kann man aber z.B. bei [http://www.elv.de/output/controller.aspx ELV] bekommen: 2-polig (68-016635), 3-polig (68-022503) und 5-polig (68-023073). An sie muss man dann noch Litzen in der entsprechenden Länge selbst anlöten.&lt;br /&gt;
&lt;br /&gt;
===Elko für den IR-Empfänger===&lt;br /&gt;
[[Bild:RP6_C29_TSOP.JPG|thumb|RP6 C29 TSOP]]&lt;br /&gt;
Zur Spannungsstabilisierung kann ein Elko (C29; SP2 E1: C29*) am TSOP 34836 eingelötet werden.&lt;br /&gt;
&lt;br /&gt;
Normalerweise ist dieser Elko nicht erforderlich.&lt;br /&gt;
&lt;br /&gt;
Man braucht dazu:&lt;br /&gt;
* Einen Elektrolyt-Kondensator stehend 10 uF / 16V (C29); RM 2,5mm (445631)&lt;br /&gt;
&lt;br /&gt;
Der Elko kann auch eine geringere Kapazität als 10 uF haben (1 uF bis 4,7 uF reichen auch). Man lötet den Elko auf seinen Platz. Bitte auf die Polung achten: Der Minuspol zeigt nach vorn (in Fahrtrichtung des RP6).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Anschlüsse===&lt;br /&gt;
Hier wird aufgelistet, wo man auf dem RP6 Mainboard Anschlüsse nutzen kann, um sie z.B. zu weiteren Sensoren, zum USRBUS oder (weniger empfehlenswert!) direkt zu EPs oder Erweiterungsplatinen (M32, CCPRO M128) zu führen.&lt;br /&gt;
&lt;br /&gt;
====Analoge Sensoren an ADC0/1====&lt;br /&gt;
[[Bild:RP6_ADC01.JPG|thumb|RP6 ADC0/1]]&lt;br /&gt;
&lt;br /&gt;
Wenn man bis zu zwei analoge Sensoren (z.B. IR-Distanz-Mess-Sensoren Sharp GP2Y0A02YK 185364) direkt an den RP6 anschließen möchte, dann gibt es da zwei 3-polige Kontakte, beschriftet mit VDD/GND/ADCx (x = 0..1). Hier kann man 3-polige Stiftleisten auflöten, an die dann die Sensoren angeschlossen werden.&lt;br /&gt;
&lt;br /&gt;
Man braucht dazu:&lt;br /&gt;
* 1-reihige Stiftleiste RM 2,54mm (z.B. 36-polig 732478)&lt;br /&gt;
* Zwei Keramik-Vielschicht-Kondensatoren 100nF (C27, C28); RM 2,54mm (453099)&lt;br /&gt;
* ENTWEDER einen Elektrolyt-Kondensator stehend 220 uF / 16V (C26); RM 3,5mm (445903)&lt;br /&gt;
* ODER einen Elektrolyt-Kondensator stehend 470 uF / 16V (C26); RM 3,5mm (446211)&lt;br /&gt;
* Zwei 3-polige Steckbuchsen mit Litze zum Anschluß der Sensoren&lt;br /&gt;
&lt;br /&gt;
Man trennt nun von der 1-reihigen Stiftleiste zweimal 3 Kontakte ab und lötet sie auf die weiß umrahmten Kontakte (VDD/GND/ADCx; SP2 B1: ADC0, ADC1), anschließend C27, C28 (SP2 A1: C27*, C28*) auf ihre Plätze und zum Schluß den Elko 220 uF oder 470 uF (C26; SP2 A1: C26*). Der Elko ist nur bei Sensoren mit hohem Strombedarf notwendig, siehe dazu auch Anleitung des RP6, Seite 136! Beim Elko auf die Polung achten: Er muss so sitzen, dass er mit seinem Pluspol in Fahrtrichtung des RP6 (nach vorn) schaut.&lt;br /&gt;
&lt;br /&gt;
Die Sensoren lötet man an die Litzen der 3-poligen Steckbuchsen und steckt diese auf die neuen Kontakte.&lt;br /&gt;
&lt;br /&gt;
Da manche Sensoren einen höheren Stromverbrauch haben, kann man die Stromversorgung an den VDD-Pins der ADC0/1-Stecker abschaltbar machen oder eine separate +5V-Spannung einspeisen. Siehe dazu den Abschnitt &amp;quot;Trennstellen - Getrennte Stromversorgung für ADC0/1&amp;quot; weiter unten!&lt;br /&gt;
&lt;br /&gt;
====ISP (In System Programming)====&lt;br /&gt;
Der ATMEGA32 des RP6 wird standardmäßig über den PROG/UART Stecker programmiert. Dazu befindet sich im Prozessor ein Bootloader-Programm. Wenn man stattdessen oder zusätzlich die ISP-Programmierung mit einem dafür geeigneten ISP-Programmier-Adapter nutzen will, kann man den Adapter an einen (noch einzulötenden) Wannenstecker auf dem RP6 anschließen.&lt;br /&gt;
Vorher sind aber ein paar &amp;quot;Umbauarbeiten&amp;quot; erforderlich.&lt;br /&gt;
&lt;br /&gt;
Man braucht dazu:&lt;br /&gt;
* 1-reihige Stiftleiste RM 2,54mm (z.B. 36-polig 732478)&lt;br /&gt;
* Wannenstecker 2x5-polig gerade RM 2,54mm (z.B. [http://www.reichelt.de./ Reichelt] WSL 10G)&lt;br /&gt;
* Eine SMD-Diode LL 4148 (140902)&lt;br /&gt;
* Eine Codierbrücke (z.B. aus Set 742902)&lt;br /&gt;
&lt;br /&gt;
Zwischen dem XBUS-Stecker und C13 befinden sich 10 Lötpunkte für den ISP-Anschluß, auf die der Wannenstecker gelötet wird, und drei Lötpunkte (beschriftet mit ISP* - BOOTLOAD; SP2 A3: YR1..3), auf die eine 3-polige Stiftleiste gelötet werden muss.&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_ISP.JPG|RP6 ISP]]&lt;br /&gt;
&lt;br /&gt;
Vorher muss eine kurze Leiterbahn zwischen den Lötpunkten BOOTLOAD aufgetrennt werden. Die Leiterbahn befindet sich auf der Lötseite der Platine und muss mit einem scharfen Messer oder einem speziellen Leiterbahn-Unterbrecher zwischen den beiden Lötpunkten unterbrochen werden. Man sollte anschließend mit einem Widerstandsmeßgerät nachmessen: Es sollte keine Verbindung mehr zwischen den Lötpunkten bestehen.&lt;br /&gt;
Man trennt dann von der 1-reihigen Stiftleiste 3 Kontakte ab und lötet sie auf die beschriebenen drei Lötpunkte.&lt;br /&gt;
&lt;br /&gt;
Zum Schluss lötet man noch die Diode LL 4148 (SP2 B3: D11*) auf ihre Lötflächen zwischen R3 und C6. Die Kathode (Strich) der Diode kommt nach vorn (in Fahrtrichtung RP6, bzw. liegt rechts von R3). Wenn man jetzt eine Codierbrücke auf die mit &amp;quot;BOOTLOAD&amp;quot; beschrifteten Pins steckt, bleibt alles unverändert: Die Programmierung erfolgt weiter über den PROG/UART-Stecker mithilfe des Bootloaders im Prozessor.&lt;br /&gt;
Wird die Codierbrücke in Stellung &amp;quot;ISP*&amp;quot; umgesteckt, kann der Prozessor mit ISP programmiert werden.&lt;br /&gt;
&lt;br /&gt;
Vorsicht: Das Bootloader-Programm kann dabei zerstört werden! Es müssen zusätzlich Fusebits des ATMEGA32 verändert werden. Dabei kann der Prozessor im schlimmsten Fall nicht mehr ansprechbar sein. Man sollte diesen Umbau und die ISP-Programmierung nur machen, wenn man genau weiß, was man macht!&lt;br /&gt;
&lt;br /&gt;
Eine Kopie des Bootloaders und eine Kurzanleitung zum Einstellen der Fusebits gibt es hier:&lt;br /&gt;
[http://www.arexx.com/rp6/downloads/RP6BASE_BOOTLOADER.zip RP6_BOOTLOADER]&lt;br /&gt;
&lt;br /&gt;
====IO1..IO4====&lt;br /&gt;
[[Bild:RP6_IO1-4.JPG|thumb|RP6 IO1..IO4]]&lt;br /&gt;
Die Anschlüsse IO1 bis IO4 (SP2 E3: IO1..4) steuern bereits die Status-LEDs 1, 2, 4 und 5 an. Trotzdem kann man sie auch noch mit leichten Einschränkungen als I/O-Pins benutzen. Dazu lötet man zweimal 2 Pins einer 1-reihigen Stiftleiste RM 2,54mm (z.B. 36-polig 732478) auf die IO1/2 und IO3/4 Lötpunkte.&lt;br /&gt;
Hier eine Tabelle, die die Port-Pins zeigt, die IO1..IO4 zugeordnet sind:&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |IO&lt;br /&gt;
 |Status-LED&lt;br /&gt;
 |Port-Pin&lt;br /&gt;
 |-&lt;br /&gt;
 |1&lt;br /&gt;
 |SL1&lt;br /&gt;
 |PC4&lt;br /&gt;
 |-&lt;br /&gt;
 |2&lt;br /&gt;
 |SL2&lt;br /&gt;
 |PC5&lt;br /&gt;
 |-&lt;br /&gt;
 |3&lt;br /&gt;
 |SL4&lt;br /&gt;
 |PB7&lt;br /&gt;
 |-&lt;br /&gt;
 |4&lt;br /&gt;
 |SL5&lt;br /&gt;
 |PB1&lt;br /&gt;
 |-&lt;br /&gt;
|}&lt;br /&gt;
Wie können nun IO1..IO4 genutzt werden?&lt;br /&gt;
&lt;br /&gt;
Als ...&lt;br /&gt;
* Eingang, z.B. für zusätzliche Tastschalter/Bumper&lt;br /&gt;
* Ausgang, z.B. zur Ansteuerung von Treiberstufen, low-current LEDs, ...&lt;br /&gt;
&lt;br /&gt;
Wird ein Anschluß IOx als Eingang verwendet, muss ein Widerstand von 470 Ohm in Reihe mit dem Taster an VDD eingebaut werden, zusätzlich ein Pulldown-Widerstand 100 kOhm. Diese Beschaltung zeigen z.B. an SL6 die Widerstände R43 und R46 (SP2 E4: R43, R46).&lt;br /&gt;
&lt;br /&gt;
Als Ausgang geschaltet sollte an IOx kein hoher Strom entnommen werden: 10mA sind max. zu empfehlen!&lt;br /&gt;
&lt;br /&gt;
====USRBUS====&lt;br /&gt;
Die 14 Kontakte der beiden USRBUS-Stecker sind auf dem RP6 nirgendwo angeschlossen, sondern können über die Lötpunkte Y1..Y14 mit beliebigen Punkten auf dem Mainboard verbunden werden.&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_USRBUS.JPG|thumb|RP6 USRBUS]]&lt;br /&gt;
&lt;br /&gt;
Ich würde auf Y1..Y14 eine Stiftleiste löten, damit die USRBUS-Belegung geändert werden kann.&lt;br /&gt;
&lt;br /&gt;
Man braucht dazu:&lt;br /&gt;
* 2-reihige Stiftleiste RM 2,54mm (z.B. 2x36-polig 742007)&lt;br /&gt;
* Einige Steckbuchsen mit Litze&lt;br /&gt;
&lt;br /&gt;
Man trennt von der 2-reihigen Stiftleiste 2x7 Kontakte ab und lötet sie auf die Punkte Y1..Y14 (SP4 E34: Y1..14, Y1'..Y14') neben den beiden Wannensteckern USRBUS1 (vorn) und USRBUS2 (hinten). Wird der RP6 über Flachkabel mit einem USRBUS-Stecker auf einer RP6 Experimentierplatine (EP) und/oder mit einer Erweiterungsplatine (M32, CCPRO M128) verbunden, dann hat man mit allen mit dem USRBUS verbundenen Platinen eine direkte 14-polige Verbindung,- eben den &amp;quot;User Bus&amp;quot;. Den kann man dann nutzen, wie man will. Auf dem RP6 kann man mit Steckbuchsen die Pins Y1..Y14 mit anderen Pins verbinden.&lt;br /&gt;
&lt;br /&gt;
Beispiel: Verbindet man den Pin &amp;quot;ADC0&amp;quot; mit Y1 des USRBUS1, dann steht der Eingang ADC0 auf allen an den USRBUS1 angeschlossenen Platinen auf dem vorderen Platinenstapel an Y1 zur Verfügung. Man braucht also diesen Eingang nicht über ein eigenes Kabel auf eine EP zu führen, sondern kann dazu den USRBUS nehmen. Dadurch bleibt der Gesamtaufbau auf dem RP6 übersichtlich und komplett trennbar (man braucht nur die Stecker XBUS und USRBUS abzuziehen!).&lt;br /&gt;
&lt;br /&gt;
Wichtig:&lt;br /&gt;
* Man sollte gut dokumentieren, wie man den USRBUS am RP6 (vorn und hinten getrennt!), auf EPs und der M32/M128 benutzt! Sonst kann es bei einer anderen Anordnung von EPs zu USRBUS Konflikten/Kurzschlüssen kommen.&lt;br /&gt;
* Der USRBUS1- und der USRBUS2-Stecker sind auf dem RP6 NICHT miteinander verbunden.&lt;br /&gt;
&lt;br /&gt;
Einen Vorschlag für die Belegung des USRBUS1 (vorn) gibt es z.B. &lt;br /&gt;
[http://www.roboternetz.de/phpBB2/viewtopic.php?t=32549 hier] oder &lt;br /&gt;
[http://www.roboternetz.de/community/showthread.php/47102-Sensor-anschließen?p=453061&amp;amp;viewfull=1#post453061 da.]&lt;br /&gt;
&lt;br /&gt;
====Start/Stop Button====&lt;br /&gt;
[[Bild:RP6_ST.JPG|thumb|RP6 ST]]&lt;br /&gt;
Am mittleren Lochrasterfeld links finden sich zwei Lötpunkte ST1, ST2 (SP2 D2: ST1, ST2), an die weitere Start/Stop Taster (NO, normal offen) parallel zum Taster auf dem RP6 Mainboard angeschlossen werden können.&lt;br /&gt;
&lt;br /&gt;
Zum Anschluß kann man auch Stiftleisten auflöten. ST1, ST2 könnte man auch mit dem USRBUS1 verbinden, wenn man den RP6 z.B. von einer EP aus zurücksetzen möchte.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Serielle Schnittstelle====&lt;br /&gt;
[[Bild:RP6_RST.JPG|thumb|RP6 RST]]&lt;br /&gt;
Neben dem USRBUS1 Stecker befinden sich 5 Lötpunkte mit den Signalen RST, TX, RX, GND, VDD (SP4 AB5: YRX, YTX, YMRESET, YVDD). Hier kann z.B. eine 5-polige Stiftleiste aufgelötet werden, um einen Anschluß an die serielle Schnittstelle zu ermöglichen.&lt;br /&gt;
&lt;br /&gt;
Von diesen 5 Lötpunkten könnte z.B. auch [http://www.roboternetz.de/phpBB2/viewtopic.php?t=32549 so] eine Verbindung zum benachbarten USRBUS1 hergestellt werden, um die serielle Schnittstelle des RP6 auf EPs zu führen.&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;
&lt;br /&gt;
====I2C-Schnittstelle====&lt;br /&gt;
[[Bild:RP6_I2C.JPG|thumb|RP6 I2C]]&lt;br /&gt;
Neben dem XBUS2 Stecker finden sich 5 Lötpunkte mit den Signalen der I2C-Schnittstelle (SP4 D12: Stecker I2C). Dies sind: VDD (Pin 1), GND, SDA, SCL, INT1 (Pin 5). Hier kann z.B. eine 5-polige Stiftleiste aufgelötet werden, um einen Anschluß an die I2C-Schnittstelle zu ermöglichen.&lt;br /&gt;
&lt;br /&gt;
Von diesen 5 Lötpunkten könnte z.B. auch eine Verbindung zum USRBUS1 oder USRBUS2 hergestellt werden, um die I2C-Schnittstelle des RP6 auf EPs zu führen, allerdings hat man SCL, SDA, INT1 ja auch schon am XBUS zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Interrupt-Leitungen====&lt;br /&gt;
[[Bild:RP6_INTx.JPG|thumb|RP6 INTx]]&lt;br /&gt;
Die Interrupt-Leitungen INTU, INT1..3, MRESET (SP4 D34: MRESET, INT1..3, INTU) sind an 5 Lötpunkten neben dem XBUS1 Stecker zu kontaktieren. Hier kann natürlich auch eine 5-polige Stiftleiste aufgelötet werden. In der Regel wird man diese Anschlüsse nicht brauchen, weil sie schon auf dem XBUS zur Verfügung stehen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====VDD/GND/+UB Anschluß====&lt;br /&gt;
[[Bild:RP6_VDDGNDUB.JPG|thumb|RP6 VDD GND +UB]]&lt;br /&gt;
In der Nähe von C4 im hinteren Bereich des Mainboards finden sich Lötpunkte (SP4 E12: YVDDx, YGNDx; SP4 D2 YUBx), an denen man VDD, GND und +UB finden kann.&lt;br /&gt;
&lt;br /&gt;
Wenn man höhere Ströme an VDD (z.B. für Servos) oder +UB (z.B. für einen anderen IRCOMM-Sender oder einen DC-Motor) entnehmen möchte, empfehlen sich diese Lötpunkte, auf die man auch Stiftleisten löten kann.&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;
====EXT Anschluß====&lt;br /&gt;
[[Bild:RP6_EXT.jpg|thumb|RP6 EXT Anschluß]]&lt;br /&gt;
Am hinteren Rand der RP6 Hauptplatine gibt es eine Reihe von 8 Lötpunkten. Dies ist der EXT Anschluß (SP1 C23: Stecker EXT):&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |Pin&lt;br /&gt;
 |Name&lt;br /&gt;
 |Beschreibung&lt;br /&gt;
 |-&lt;br /&gt;
 |1&lt;br /&gt;
 |GND&lt;br /&gt;
 |RP6 und Akku Minuspol (GND)&lt;br /&gt;
 |-&lt;br /&gt;
 |2&lt;br /&gt;
 |CHRG&lt;br /&gt;
 |Anschluß (+) für ext. Ladegerät, identisch mit Pluspol der Ladebuchse (CHARGER, Pin 1). Ladung nur möglich, wenn S1 AUS ist!&lt;br /&gt;
 |-&lt;br /&gt;
 |3&lt;br /&gt;
 |CHRG&lt;br /&gt;
 |wie Pin 2!&lt;br /&gt;
 |-&lt;br /&gt;
 |4&lt;br /&gt;
 | +BAT&lt;br /&gt;
 |Akku Pluspol über Sicherung F1&lt;br /&gt;
 |-&lt;br /&gt;
 |5&lt;br /&gt;
 | +BAT&lt;br /&gt;
 |wie Pin 4!&lt;br /&gt;
 |-&lt;br /&gt;
 |6&lt;br /&gt;
 | +UB&lt;br /&gt;
 |RP6 +UB (+7,2V=, Bereich min. +5,5 bis max. +10V=)&lt;br /&gt;
 |-&lt;br /&gt;
 |7&lt;br /&gt;
 | +UB&lt;br /&gt;
 |wie Pin 6!&lt;br /&gt;
 |-&lt;br /&gt;
 |8&lt;br /&gt;
 |GND&lt;br /&gt;
 |wie Pin 1!&lt;br /&gt;
 |-&lt;br /&gt;
|}&lt;br /&gt;
Man kann hier eine JST XH Stiftleiste gerade, 8-polig, RM 2,5mm ([http://www.conrad.de/ce/de/product/740105/Stiftleiste-gerade-RM-25-mm-Serie-XH-Rastermass-25-mm-Pole-8-Nennstrom-3-A-B8B-XH-A-LFSN-JST-Inhalt-1-St 740105]) auflöten.&lt;br /&gt;
&lt;br /&gt;
Wozu kann man diesen Anschluß nutzen?&lt;br /&gt;
&lt;br /&gt;
Der wesentliche Sinn des EXT Anschlusses besteht darin, andere Arten der Stromversorgung und der Akkuladung zu ermöglichen. Normalerweise schaltet man den RP6 mit S1 an und aus. In Stellung AUS kann der Akku geladen werden, indem man ein Ladegerät an die CHARGER Buchse anschließt. Alternativ kann man das Ladegerät mit seinem Pluspol auch an CHRG (Pins 2, 3) anschließen. Siehe auch den Abschnitt &amp;quot;Trennstellen - EXT Anschluß: Andere Stromversorgung&amp;quot; weiter unten!&lt;br /&gt;
&lt;br /&gt;
An +BAT (Pins 4, 5) kann man direkt (ohne Unterbrechung durch S1) Strom aus dem Akku entnehmen. Die Grenze des Stroms bestimmt die Sicherung F1 (2,5A). Eine weitere Möglichkeit besteht darin, über diesen Anschluß den Akku auch mit einem geeigneten Ladegerät zu LADEN. Hierbei muss man aber darauf achten, dass S1 AUSgeschaltet ist, weil sonst der RP6 über +UB eine unzulässig hohe Spannung bekommen könnte. Wenn man den Akku mit 6 Mignonzellen im RP6 nicht nutzen will (der Akku-Halter bleibt leer!), sondern nur einen externen Akku, wäre der auch mit seinem Pluspol an +BAT über eine eigene Sicherung (2,5A träge) anzuschließen.&lt;br /&gt;
&lt;br /&gt;
+UB (+7,2V) ist die Versorgungsspannung des RP6 (kommt vom Akku-Pluspol über die Sicherung F1 und Schalter S1!). Mit +UB werden die H-Brücken (Motoransteuerung) direkt und die RP6 &amp;quot;Elektronik&amp;quot; über den 5V-Spannungswandler (IC1; SP1 D3: IC1) versorgt (= VDD). An +UB könnte man den RP6 direkt mit einer Spannung von +7,2V versorgen (Absicherung nicht vergessen!), dazu muss S1 AUSgeschaltet sein, damit es keine Konflikte mit dem eingebauten Akku gibt.&lt;br /&gt;
&lt;br /&gt;
Den EXT Anschluß kann man damit nutzen für:&lt;br /&gt;
* Externes Ladegerät&lt;br /&gt;
* Externen Akku&lt;br /&gt;
* Externe Stromversorgung ohne Akku&lt;br /&gt;
* Direkte Stromentnahme aus dem Akku&lt;br /&gt;
* Ergänzungsladung mit Solarzelle&lt;br /&gt;
* Autonome Akkuladung (Ladestation mit Kontakten, Induktionsladung ...)&lt;br /&gt;
* ...&lt;br /&gt;
&lt;br /&gt;
Man sollte gewisse Elektronik-Kenntnisse haben, wenn man die Spannungsversorgung des RP6 verändert. VOR irgendwelchen Veränderungen seht euch auch zuerst den Schaltplan des RP6 (SP1) genau an!&lt;br /&gt;
&lt;br /&gt;
===Mess-/Kontaktpunkte===&lt;br /&gt;
Hier geht es um Kontaktpunkte, an denen man z.B. den Logik-Pegel (High/Low) oder eine analoge Spannung messen kann. Natürlich kann man die Signale auch zur Weiterleitung auf eine EP kontaktieren, dies wird man aber normalerweise nicht brauchen.&lt;br /&gt;
&lt;br /&gt;
====UBAT====&lt;br /&gt;
[[Bild:RP6_UBAT.JPG|thumb|RP6 UBAT]]&lt;br /&gt;
In der Mitte des Mainboards befindet sich ein Kontaktpunkt UBAT (SP1 E1: YUBAT). Dies ist ADC7 des RP6 Microcontrollers.&lt;br /&gt;
&lt;br /&gt;
Man kann hier die analoge Spannung (gegen GND) messen, die vom +UB-Spannungssensor geliefert wird.&lt;br /&gt;
&lt;br /&gt;
Die Spannung ist:&lt;br /&gt;
 UBAT = +UB / 2&lt;br /&gt;
Da der Spannungsteiler (SP1 D12: R1, R2) des +UB-Spannungssensors nicht aus Präzisionswiderständen besteht, kann man für den eigenen RP6 einen Korrekturfaktor berechnen, wenn UBAT deutlich von +UB / 2 (+ UB z.B. gemessen am EXT Stecker, Pins 6 u. 7) abweicht. Damit kann man +UB sehr viel genauer bestimmen.&lt;br /&gt;
&lt;br /&gt;
====ACS====&lt;br /&gt;
[[Bild:RP6_ACS_TSOP.JPG|thumb|RP6 ACS TSOP]]&lt;br /&gt;
Hinter dem TSOP (IC3) befindet sich der Kontaktpunkt ACS (SP2 E1: ACS).&lt;br /&gt;
&lt;br /&gt;
Dies ist der Ausgang des TSOP bzw. Eingang PB2 des RP6 Microcontrollers. Man kann hier das Ausgangssignal des IR-Empfängers abnehmen, z.B. um es mit einem Oszilloskop sichtbar zu machen.&lt;br /&gt;
&lt;br /&gt;
Rechts neben dem TSOP kann man noch die 3 Kontaktpunkte ACS_R, ACS_P und ACS_L (SP2 E2: ACS_P, ACS_R, ACS_L) des ACS-IR-Senders finden.&lt;br /&gt;
&lt;br /&gt;
Folgende Tabelle zeigt die Verbindungen:&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |Kontakt&lt;br /&gt;
 |Microcontroller-Portpin&lt;br /&gt;
 |SP-Verbindung&lt;br /&gt;
 |ACS-IR-Sendediode&lt;br /&gt;
 |-&lt;br /&gt;
 |ACS_P&lt;br /&gt;
 |über R8: ACS_PWRH (PB3), über R9: ACS_PWR (PD6)&lt;br /&gt;
 |SP2: 3&lt;br /&gt;
 |Anoden D1, D2&lt;br /&gt;
 |-&lt;br /&gt;
 |ACS_R&lt;br /&gt;
 |ACS_R (PC7)&lt;br /&gt;
 |SP2: 2&lt;br /&gt;
 |Kathode D1&lt;br /&gt;
 |-&lt;br /&gt;
 |ACS_L&lt;br /&gt;
 |ACS_L/MISO (PB6)&lt;br /&gt;
 |SP1: 5&lt;br /&gt;
 |Kathode D2&lt;br /&gt;
 |-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====IRC====&lt;br /&gt;
[[Bild:RP6_IRC.JPG|thumb|RP6 IRC]] [[Bild:RP6_IRC3.JPG|thumb|RP6 IRC3]]&lt;br /&gt;
Im der Nähe von C13 befinden sich die Lötpunkte IRC, IRC+, IRC- und IRC3 (SP2 D2: YIRC; SP2 CD2: IRC+/-; SP2 C2: IRC3). Zusammen mit der Trennstelle IRC (siehe Abschnitt &amp;quot;Trennstellen - IRC&amp;quot; weiter unten!) kann man diese Kontaktstellen im Umfeld des IRCOMM-Sendedioden Treibers IRLML2502PBF (SP2 CD12: Q5) finden. Am Kontaktpunkt IRC findet sich der Eingang des Treibers bzw. Ausgang PD7 des RP6 Microcontrollers. IRC+, IRC- sind die Kontaktpunkte, an denen die IRCOMM-Sendedioden D3, D4 in Reihe auf der Sensorplatine angeschlossen sind (IRC+ = Anode). IRC3 ist verbunden mit dem Trennstellen-Lötpunkt IRC1 und liegt bei geschlossener Trennstelle IRC an +UB.&lt;br /&gt;
&lt;br /&gt;
Was läßt sich mit diesen Kontaktpunkten machen:&lt;br /&gt;
* Der IRCOMM-Sender ist der zweitgrößte Stromverbraucher des RP6 (nach dem Antrieb). An IRC3 kann daher eine eigene Stromversorgung für die IRCOMM-Sendedioden angeschlossen werden. Dazu muss die Trennstelle IRC zwischen ihren Lötpunkten IRC1, IRC2 aufgetrennt werden.&lt;br /&gt;
* An IRC+, IRC- könnten andere/weitere IRCOMM-Sendedioden angeschlossen werden (Anode an IRC+). Wenn der Vorwiderstand R6 (SP2 C2: R6) der Sendedioden dann nicht mehr paßt (bezügl. Leistung und/oder Widerstandswert), können neue leistungsfähigere IRCOMM-Sendedioden zwischen IRC3 und IRC- (Anode an IRC3) mit einem dafür geeigneten Vorwiderstand angebracht werden.&lt;br /&gt;
&lt;br /&gt;
====LS====&lt;br /&gt;
[[Bild:RP6_LS.JPG|thumb|RP6 LS]]&lt;br /&gt;
Die beiden Lötpunkte LS_L und LS_R (SP2 B12: LS_L, LS_R) neben R7 vorn auf dem Mainboard sind die Ausgänge der Helligkeitssensoren (links und rechts) bzw. die ADC-Eingänge ADC3 und ADC2 des RP6 Microcontrollers.&lt;br /&gt;
&lt;br /&gt;
Hier kann man die Spannungen messen, die den Helligkeitswerten entsprechen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====BP, S====&lt;br /&gt;
[[Bild:RP6_BP_S.JPG|thumb|RP6 BP S]]&lt;br /&gt;
Die Messpunkte BPL, BPR und der Kontaktpunkt S (SP2 E2: S; SP2 E3: BPR; SP2 E4: BPL) befinden sich am vorderen Platinenrand. BPL und BPR sind die Kontakte der Bumper. S ist eine nicht genutzte Verbindung zwischen dem Mainboard und der Sensorplatine, die über die Verbindung SP1, Pin 3, geführt wird (siehe folgende Tabelle!).&lt;br /&gt;
&lt;br /&gt;
Hier eine Tabelle mit der Belegung der 90°-Winkelverbindung SP1, SP2 zwischen dem RP6 Mainboard und der Sensorplatine: &lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |Pin&lt;br /&gt;
 |SP1&lt;br /&gt;
 |SP2&lt;br /&gt;
 |-&lt;br /&gt;
 |1&lt;br /&gt;
 |LS_L  --- Light Sensor Left&lt;br /&gt;
 |IRC-  --- IRCOMM-&lt;br /&gt;
 |-&lt;br /&gt;
 |2&lt;br /&gt;
 |BPL   --- Bumper Left&lt;br /&gt;
 |ACS_R --- ACS Right&lt;br /&gt;
 |-&lt;br /&gt;
 |3&lt;br /&gt;
 |S     --- Free for all&lt;br /&gt;
 |ACS_P --- ACS Power&lt;br /&gt;
 |-&lt;br /&gt;
 |4&lt;br /&gt;
 |GND&lt;br /&gt;
 |VDD&lt;br /&gt;
 |-&lt;br /&gt;
 |5&lt;br /&gt;
 |ACS_L --- ACS Left&lt;br /&gt;
 |BPR   --- Bumper Right&lt;br /&gt;
 |-&lt;br /&gt;
 |6&lt;br /&gt;
 |IRC+  --- IRCOMM+&lt;br /&gt;
 |LS_R  --- Light Sensor Right&lt;br /&gt;
 |-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====ENC====&lt;br /&gt;
[[Bild:RP6_ENC.JPG|thumb|RP6 ENC]]&lt;br /&gt;
Die beiden Messpunkte ENCL, ENCR (SP4 B12: ENCL, ENCR) sind die Ausgänge der Radencoder. ENCL ist verbunden mit PD2 (INT0), ENCR mit PD3 (INT1) des RP6 Microcontrollers.&lt;br /&gt;
&lt;br /&gt;
===Trennstellen===&lt;br /&gt;
An diesen Stellen können Leiterbahnen unterbrochen werden, um Funktionen zu deaktivieren oder anders zu nutzen.&lt;br /&gt;
&lt;br /&gt;
=====Getrennte Stromversorgung für ADC0/1=====&lt;br /&gt;
Wenn man für die analogen Sensoren an ADC0/1 (siehe Abschnitt &amp;quot;Anschlüsse - Analoge Sensoren an ADC0/1&amp;quot; weiter oben!) eine GETRENNTE Stromversorgung vorsehen will und/oder mit Codierbrücke (oder MOSFET) die Stromversorgung abschaltbar machen möchte, muss man erst Vorarbeit leisten.&lt;br /&gt;
[[Bild:RP6_SV.JPG|thumb|RP6 SV]]&lt;br /&gt;
&lt;br /&gt;
Man braucht dazu:&lt;br /&gt;
* 1-reihige Stiftleiste RM 2,54mm (z.B. 36-polig 732478)&lt;br /&gt;
* Evtl.: Eine Codierbrücke (z.B. aus Set 742902)&lt;br /&gt;
* Evtl.: Eine 1-polige Steckbuchse mit Litze zur ext. Stromversorgung&lt;br /&gt;
Es muss eine kurze Leiterbahn zwischen den Punkten &amp;quot;SV1&amp;quot; und &amp;quot;SV2&amp;quot; (SP2 A1: SV1, SV2; zwischen dem PROG/UART- und dem USRBUS1-Stecker) aufgetrennt werden. Die Leiterbahn befindet sich auf der Lötseite der Platine und muss mit einem scharfen Messer oder einem speziellen Leiterbahn-Unterbrecher zwischen den beiden Lötpunkten unterbrochen werden. Man sollte anschließend mit einem Widerstandsmeßgerät zwischen SV1 und SV2 nachmessen: Es sollte keine Verbindung mehr bestehen. Jetzt trennt man von der 1-reihigen Stiftleiste 2 Kontakte ab und lötet sie auf die Punkte SV1/SV2.&lt;br /&gt;
&lt;br /&gt;
Man kann hier zunächst eine Codierbrücke aufstecken. Damit versorgt der RP6 Akku die Sensoren mit 5V an den Pins VDD. Möchte man später eine getrennte 5V-Spannung anlegen, zieht man einfach die Codierbrücke ab und speist die externe 5V-Spannung (mit einer 1-poligen Steckbuchse) am Pin SV2 ein. Achtung: An Pin SV1 wird dann nichts angeschlossen!&lt;br /&gt;
&lt;br /&gt;
Anstelle der Codierbrücke kann man natürlich auch einen MOSFET anschließen, um die Sensoren per Software abschalten zu können.&lt;br /&gt;
&lt;br /&gt;
====ACS====&lt;br /&gt;
[[Bild:RP6_ACS_JP.JPG|thumb|RP6 ACS JP]]&lt;br /&gt;
Die Trennstelle ACS (SP2 E1: YIR1, YIR2; SP2 F1: YIR3) befindet sich neben C29*. Sie besteht aus 3 Lötpunkten, von denen die linken beiden (IRC1, IRC2) verbunden sind. Trennt man die Leiterbahn zwischen diesen Lötpunkten auf und verbindet stattdessen die rechten beiden Lötpunkte (IRC2, IRC3) mit etwas Lötzinn oder mit einem SMD Null Ohm Widerstand, dann ist der IR-Empfänger (TSOP, IC3) dauerhaft EINgeschaltet und kann nicht mehr über das Signal PWRON (PB4) geschaltet werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====IRC====&lt;br /&gt;
[[Bild:RP6_IRC_JP.JPG|thumb|RP6 IRC JP]]&lt;br /&gt;
Die Trennstelle IRC (SP2 C1: IRC1..2) ist eng verknüpft mit den Mess- und Kontaktpunkten des IRCOMM-Senders (siehe Abschnitt &amp;quot;Mess-/Kontaktpunkte - IRC&amp;quot; weiter oben!). Wenn man sie auftrennt, kann man den IRCOMM-Sender mit einer getrennten Stromversorgung anstelle von +UB des RP6 versehen. Dies ist sehr sinnvoll, wenn man diese Funktion häufig verwendet oder sogar noch leistungsfähigere IR-Sendedioden einbaut, denn der IRCOMM-Sender ist der zweitgrößte Stromfresser (nach dem Antrieb) auf dem RP6 (von Erweiterungsplatinen und EPs Marke Eigenbau einmal abgesehen!). Man kann hier natürlich auch eine 2-polige Stiftleiste einlöten, um die Verbindung zu +UB mit einer Codierbrücke trennbar zu machen. Eine getrennte Stromversorgung +7,2V (Bereich: +5,5 .. +10V) kann man an IRC1 einspeisen. IRC1 dieser Trennstelle ist mit dem Kontaktpunkt IRC3 (siehe Abschnitt &amp;quot;Mess-/Kontaktpunkte - IRC&amp;quot; weiter oben!) verbunden. &lt;br /&gt;
&lt;br /&gt;
====RP6 Antrieb====&lt;br /&gt;
Mit den folgenden Trennstellen kann man den RP6 Antrieb (H-Brücken und Motoren) fast komplett vom Rest des RP6 Mainboards abtrennen (es bleibt nur die 5V-Versorgung (VDD) von IC4, T1, T2 bestehen!). Damit ist es möglich, mit dem RP6 Mainboard einen ganz anderen Antrieb (also z.B. ein anderes Roboter-Chassis mit eigenen Motoren und H-Brücken) zu steuern. Umgekehrt könnte man den RP6 Antrieb auch deshalb abtrennen, um ihn durch ein anderes Prozessorsystem (z.B. auch eine M32!) anzusteuern. It's up to you!&lt;br /&gt;
&lt;br /&gt;
=====+UB Power=====&lt;br /&gt;
[[Bild:RP6_HB_Power.jpg|thumb|RP6 HB Power]]&lt;br /&gt;
Der RP6 Antrieb wird direkt aus dem Akku (über S1 und F1) mit 7,2V (+UB) versorgt. Diese Stromversorgung kann man komplett abtrennen. Die Trennstelle (SP3 E34: X) liegt unter der Sicherung F1 (siehe Abb. RP6 HB Power). Zwischen den beiden doppelten Lötflächen befinden sich auf der Lötseite (Unterseite) des Mainboards vier parallele Leiterbahnen, die aufgetrennt werden müssen. Der Pluspol einer externen Spannung zur Versorgung des RP6 Antriebs kann dann mit einer Kabelverbindung an den doppelten Lötflächen (mit einem &amp;quot;+&amp;quot; gekennzeichnet) direkt neben dem Leistungswiderstand (R27) angeschlossen werden. Eine Absicherung dieser Stromversorgung sollte man unbedingt vorsehen (2,5A träge)!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=====Stromsensoren=====&lt;br /&gt;
[[Bild:RP6_CS.JPG|thumb|RP6 CS]]&lt;br /&gt;
Um den Motorstrom der beiden Motoren des RP6 zu messen, wird ein Dual-Operationsverstärker (IC5 = 27M2C; SP3 B23/D23: IC5B/A) eingesetzt. Dieses IC wird über PWRON (PB4) mit Strom versorgt. Die Stromsensoren funktionieren also nicht, wenn PWRON Low-Pegel führt (Befehl powerOFF() der RP6 Library!). Auf dem RP6 Mainboard gibt es eine Trennstelle mit drei Lötflächen (SP3 E34: CS1, CS2, CS3). Sie befindet sich auf dem Mainboard neben C23. Möchte man IC5 nicht mehr über PWRON mit Strom versorgen, sondern über VDD (+5V), dann trennt man die Leiterbahn zwischen den linken beiden Lötpunkten (CS1, CS2) auf und verbindet die rechten beiden Lötpunkte (CS2, CS3) mit etwas Lötzinn oder einem SMD Null Ohm Widerstand. Danach sind die Stromsensoren immer eingeschaltet und können über PWRON nicht mehr geschaltet werden. Alternativ kann man an CS2 auch eine externe Versorgungsspannung (+5V) für IC5 einspeisen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=====DR/MR/ML/DL=====&lt;br /&gt;
[[Bild:RP6_DR_MR_ML_DL.JPG|thumb|RP6 DR MR ML DL]]&lt;br /&gt;
An diesen Trennstellen können die Eingänge der H-Brücke für die Geschwindigkeit (PWM) und Drehrichtung der Motoren von den Portpins des Microcontrollers abgetrennt werden.&lt;br /&gt;
Für den rechten Motor sind dies die Trennstellen MR1/2 und DR1/2 (SP3 A23: MR1/2, DR1/2), für den linken Motor ML1/2 und DL1/2 (SP3 F23: ML1/2, DL1/2).&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |Trennstelle&lt;br /&gt;
 |Portpin&lt;br /&gt;
 |Funktion H-Brücke&lt;br /&gt;
 |-&lt;br /&gt;
 |MR1/2&lt;br /&gt;
 |PD5 (OC1A)&lt;br /&gt;
 |PWM Motor rechts&lt;br /&gt;
 |-&lt;br /&gt;
 |DR1/2&lt;br /&gt;
 |PC3 (TMS)&lt;br /&gt;
 |Fahrtrichtung rechts&lt;br /&gt;
 |-&lt;br /&gt;
 |ML1/2&lt;br /&gt;
 |PD4 (OC1B)&lt;br /&gt;
 |PWM Motor links&lt;br /&gt;
 |-&lt;br /&gt;
 |DL1/2&lt;br /&gt;
 |PC2 (TCK)&lt;br /&gt;
 |Fahrtrichtung links&lt;br /&gt;
 |-&lt;br /&gt;
|}&lt;br /&gt;
Trennt man die Leiterbahn (auf der Lötseite des RP6 Mainboards) zwischen den Lötpunkten der Trennstellen auf, kann man die Eingänge der H-Brücke (Mx1, Dx1) z.B. mit einem anderen Microcontroller verbinden. Die Ausgänge (Portpins) des RP6 Microcontrollers (Mx2, Dx2) können dann anders genutzt werden. Natürlich kann man auf die Lötpunkte dieser Trennstellen auch Stiftleisten löten, um den Anschluß steckbar zu machen.&lt;br /&gt;
&lt;br /&gt;
=====MCR/MCL=====&lt;br /&gt;
[[Bild:RP6_MCR_MCL.JPG|thumb|RP6 MCR MCL]]&lt;br /&gt;
An diesen Trennstellen können die Motorstromsensoren von den ADC-Eingängen des Microcontrollers abgetrennt werden.&lt;br /&gt;
&lt;br /&gt;
Für den rechten Sensor ist dies die Trennstelle MCR1/2 (SP3 A1: MCR1, MCR2), für den linken Sensor MCL1/2 (SP3 E1: MCL1, MCL2).&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |Trennstelle&lt;br /&gt;
 |Portpin&lt;br /&gt;
 |Funktion H-Brücke&lt;br /&gt;
 |-&lt;br /&gt;
 |MCR1/2&lt;br /&gt;
 |PA5 (ADC5)&lt;br /&gt;
 |Motorstrom rechts&lt;br /&gt;
 |-&lt;br /&gt;
 |MCL1/2&lt;br /&gt;
 |PA6 (ADC6)&lt;br /&gt;
 |Motorstrom links&lt;br /&gt;
 |-&lt;br /&gt;
|}&lt;br /&gt;
Trennt man die Leiterbahn (auf der Lötseite des RP6 Mainboards) zwischen den Lötpunkten der Trennstellen auf, kann man die ADC-Eingänge (Portpins) des RP6 Microcontrollers (MCx1) anders nutzen und die Ausgänge der Motorstromsensoren (MCx2) z.B. mit ADC-Eingängen eines anderen Microcontrollers verbinden. Natürlich kann man auf die Lötpunkte dieser Trennstellen auch Stiftleisten löten, um den Anschluß steckbar zu machen.&lt;br /&gt;
&lt;br /&gt;
====PWRON-LED====&lt;br /&gt;
[[Bild:RP6_PWRON_L.JPG|thumb|RP6 PWRON L]]&lt;br /&gt;
Auf dem RP6 Mainboard gibt es eine gelbe LED, die anzeigt, ob PWRON High-Pegel hat. Mit einer Trennstelle neben dieser LED (SP2 D4: YL1, YL2) kann diese LED deaktiviert werden (z.B. um Strom zu sparen).&lt;br /&gt;
&lt;br /&gt;
Dazu trennt man die Leiterbahn zwischen den Lötpunkten auf. Soll die LED wieder aktiviert werden, verbindet man die Lötpunkte wieder mit etwas Lötzinn oder einem SMD Null Ohm Widerstand.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====+UB Sensor====&lt;br /&gt;
[[Bild:RP6_UB.JPG|thumb|RP6 UB]]&lt;br /&gt;
Die Versorgungsspannung +UB des RP6 wird mit dem +UB-Spannungssensor an PA7 (ADC7) gemessen. Will man diesen Spannungssensor mit seinem Eingangsspannungsteiler R1, R2 (SP1 D12: R1, R2) von +UB abtrennen (z.B. um ihn anders zu verwenden), gibt es eine Trennstelle UB1/2 (SP1 D2: UB1, UB2). Trennt man die Leiterbahn auf der Lötseite des RP6 Mainboards zwischen den Lötpunkten auf, kann +UB nicht mehr gemessen werden. Man kann dann den Lötpunkt UB2 mit einem anderen Messpunkt (z.B. mit +BAT) verbinden und dort die Spannung (0..10V) messen. Natürlich kann man auf die Lötpunkte dieser Trennstellen auch Stiftleisten löten, um den Anschluß steckbar zu machen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====EXT Anschluß: Andere Stromversorgung====&lt;br /&gt;
[[Bild:RP6_S1_CHRG.jpg|thumb|RP6 S1 CHRG]]&lt;br /&gt;
Wenn man für den RP6 eine andere Stromversorgung oder Ladeschaltung anschließen will, geht dies gut am EXT Anschluß (SP1 C23: Stecker EXT). Siehe auch den Abschnitt &amp;quot;Anschlüsse - EXT Anschluß&amp;quot; weiter oben! Dann muss der Schalter S1 dauerhaft AUSgeschaltet bleiben und die Verbindung zwischen S1 und CHRG des EXT Anschlusses (SP1 C3: X) unterbrochen werden. Diese Trennstelle befindet sich auf der Lötseite (Unterseite) des RP6 Mainboards etwas versteckt zwischen S1 (Pin 3) und der benachbarten Leiterbahn, die CHRG des EXT Anschlusses mit der Ladebuchse CHARGER (Pin 1 +) verbindet. Dort sind fünf kurze, parallele Leiterbahnen zu unterbrechen (siehe gelbe Markierung in der Abb. RP6 S1 CHRG!). Will man das nicht machen, darf man die Ladebuchse CHARGER auf jeden Fall nicht mehr nutzen!&lt;br /&gt;
&lt;br /&gt;
===Lochraster-Felder===&lt;br /&gt;
Auf diesen Feldern kann man eigene kleine Schaltungen aufbauen. An jedem der sechs Felder stehen VDD (+5V) und GND zur Verfügung (SP4 E12: YVDDx, YGNDx).&lt;br /&gt;
&lt;br /&gt;
Bitte beachten: Die Lochreihen oder -spalten, die mit einer eckigen Klammer &amp;quot;[&amp;quot; markiert sind, liegen auf der Lötseite (Unterseite) direkt auf dem Rahmen des Chassis! Hier können also keine Drähte von unten verlötet werden.&lt;br /&gt;
&lt;br /&gt;
====Vorn links====&lt;br /&gt;
Das kleine Lochrasterfeld vorn links kann z.B. für Beleuchtung (Blinker, Scheinwerfer links) oder auch für einen zusätzlichen Sensor genutzt werden.&lt;br /&gt;
Zur Verfügung steht eine 2-adrige Verbindung zum mittleren Lochrasterfeld links.&lt;br /&gt;
&lt;br /&gt;
In der Nähe dieses Lochrasterfeldes gibt es auch:&lt;br /&gt;
* IO3, IO4 (SP2 E3: IO3, IO4)&lt;br /&gt;
* ADC0 (SP2 B1: ADC0)&lt;br /&gt;
&lt;br /&gt;
====Mitte links====&lt;br /&gt;
[[Bild:RP6_Lochfeld_LM.JPG|thumb|RP6 Lochrasterfeld Mitte links]]&lt;br /&gt;
Das größere Lochrasterfeld Mitte links kann z.B. für eine kleinere Schaltung zur Ansteuerung der Beleuchtung/Sensoren auf den Lochrasterfeldern vorn und hinten links oder für andere Zwecke genutzt werden.&lt;br /&gt;
&lt;br /&gt;
Es stehen hier folgende Anschlüsse zur Verfügung:&lt;br /&gt;
* 2-adrige Verbindung zum Lochrasterfeld vorn links&lt;br /&gt;
* 2-adrige Verbindung zum Lochrasterfeld hinten links&lt;br /&gt;
* ST1/ST2 zum Anschluß weiterer Start/Stop Taster (SP2 D2: ST1/2)&lt;br /&gt;
* PWR (SP2 D2: YPWR1)&lt;br /&gt;
* I2C-Bus (SCL, SDA; SP4 C1: YSCL1, YSDA1)&lt;br /&gt;
* +UB (SP4 D2: YUB1)&lt;br /&gt;
In der Nähe dieses Lochrasterfeldes gibt es auch:&lt;br /&gt;
* Serielle Schnittstelle (RST, TX, RX; SP4 AB5: YRX, YTX, YMRESET, YVDD)&lt;br /&gt;
* USRBUS1 (vorn; SP4 E34: Y1'..Y14')&lt;br /&gt;
&lt;br /&gt;
=====Schaltungsvorschläge=====&lt;br /&gt;
Wie kann z.B. eine Schaltung für Beleuchtungseffekte oder Sensoren aussehen?&lt;br /&gt;
&lt;br /&gt;
Man könnte 8 zusätzliche Schaltkanäle mit dem I2C-Portexpander-IC PCF8574(A)P gewinnen. Dieses IC passt mit wenigen Zusatzteilen auf die mittlere Lochrasterfläche. Angesteuert wird es über den I2C-Bus. Mit den 8 Ausgängen lassen sich einige Beleuchtungseffekte erreichen, die dann über Software schaltbar sind.&lt;br /&gt;
&lt;br /&gt;
Alternativ kann man auch das IC PCF8591P z.B. für den Anschluß von analogen Sensoren verwenden. Auch dieser Baustein wird über I2C angesteuert. Beide ICs sind bei [http://www.reichelt.de./ Reichelt] erhältlich.&lt;br /&gt;
&lt;br /&gt;
Will man nicht den I2C-Bus benutzen, kann man als I/O-Ports IO1..IO4 oder als analoge Eingänge ADC0 und ADC1 verwenden. Auch SCL und SDA stehen als I/O-Ports zur Verfügung, wenn der I2C-Bus im ganzen System nicht verwendet werden soll.&lt;br /&gt;
&lt;br /&gt;
Wichtig für Zusatzschaltungen, die fest auf dem RP6 verlötet werden, sind zwei Aspekte:&lt;br /&gt;
* Wenn sie die Stromversorgung belasten, sollten sie (z.B. über einen Transistor oder MOSFET) abschaltbar sein. Dazu kann man auch das Signal PWR heranziehen, das auf beiden mittleren Lochrasterflächen zur Verfügung steht. Dann kann man mit dem Befehl &amp;quot;powerOFF()&amp;quot; der RP6 Library die Stromversorgung per Software abschalten.&lt;br /&gt;
* Wenn man auch anderweitig genutzte Portpins (SDA, SCL, IO1..IO4, ADC0/1) für die eigene Schaltung einsetzt, sollte man die Verbindung zu den Portpins mit einer abziehbaren Codierbrücke trennbar machen.&lt;br /&gt;
&lt;br /&gt;
====Hinten links====&lt;br /&gt;
Das kleine Lochrasterfeld hinten links kann z.B. für Beleuchtung (Blinker, Rücklicht links) oder auch für einen zusätzlichen Sensor genutzt werden.&lt;br /&gt;
Zur Verfügung steht eine 2-adrige Verbindung zum mittleren Lochrasterfeld links.&lt;br /&gt;
&lt;br /&gt;
In der Nähe dieses Lochrasterfeldes gibt es auch:&lt;br /&gt;
* EXT Anschluß (SP1 C23: Stecker EXT)&lt;br /&gt;
&lt;br /&gt;
====Vorn rechts====&lt;br /&gt;
Das kleine Lochrasterfeld vorn rechts kann z.B. für Beleuchtung (Blinker, Scheinwerfer rechts) oder auch für einen zusätzlichen Sensor genutzt werden.&lt;br /&gt;
Zur Verfügung steht eine 2-adrige Verbindung zum mittleren Lochrasterfeld rechts.&lt;br /&gt;
&lt;br /&gt;
In der Nähe dieses Lochrasterfeldes gibt es auch:&lt;br /&gt;
* IO1, IO2 (SP2 E3: IO1, IO2)&lt;br /&gt;
* ADC1 (SP2 B1: ADC1)&lt;br /&gt;
&lt;br /&gt;
====Mitte rechts====&lt;br /&gt;
Das größere Lochrasterfeld Mitte rechts kann z.B. für eine kleinere Schaltung zur Ansteuerung der Beleuchtung/Sensoren auf den Lochrasterfeldern vorn und hinten rechts oder für andere Zwecke genutzt werden.&lt;br /&gt;
&lt;br /&gt;
Es stehen hier folgende Anschlüsse zur Verfügung:&lt;br /&gt;
* 2-adrige Verbindung zum Lochrasterfeld vorn rechts&lt;br /&gt;
* 2-adrige Verbindung zum Lochrasterfeld hinten rechts&lt;br /&gt;
* PWR (SP2 D2: YPWR2)&lt;br /&gt;
* I2C-Bus (SCL, SDA; SP4 C1: YSCL2, YSDA2)&lt;br /&gt;
* +UB (SP4 D2: YUB2)&lt;br /&gt;
In der Nähe dieses Lochrasterfeldes gibt es auch:&lt;br /&gt;
* Interrupt-Anschluß (INTU, INT1..3, MRESET; SP4 D34: MRESET, INT1..3, INTU)&lt;br /&gt;
* USRBUS2 (hinten; SP4 E34: Y1..Y14)&lt;br /&gt;
&lt;br /&gt;
====Hinten rechts====&lt;br /&gt;
Das kleine Lochrasterfeld hinten rechts kann z.B. für Beleuchtung (Blinker, Rücklicht rechts) oder auch für einen zusätzlichen Sensor genutzt werden.&lt;br /&gt;
Zur Verfügung steht eine 2-adrige Verbindung zum mittleren Lochrasterfeld rechts.&lt;br /&gt;
&lt;br /&gt;
In der Nähe dieses Lochrasterfeldes gibt es auch:&lt;br /&gt;
* EXT Anschluß (SP1 C23: Stecker EXT)&lt;br /&gt;
* Akku-Anschluß (SP1 B3: BATTERY)&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Erweiterungen==&lt;br /&gt;
Auf / An den RP6 könnte man z.B. noch folgendes anbauen / erweitern:&lt;br /&gt;
&lt;br /&gt;
* Einen Greifarm&lt;br /&gt;
* Einen Ultraschallsensor&lt;br /&gt;
* Zwei Lichtsensoren hinten, um die hellste / dunkelste Stelle im Raum besser zu finden&lt;br /&gt;
* Einen digitalen Kompass&lt;br /&gt;
* uvm.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Erweiterungs-Module==&lt;br /&gt;
&lt;br /&gt;
Es sind von Arexx schon einige Erweiterungsmöglichkeiten auf dem Markt. Zum Ersten die Experimentierplatinen ([http://www.conrad.de/ce/de/product/191537/Arexx-RP6-Experimentierplatine 191537] AUSVERKAUFT!), die zum Erstellen von eigenen Schaltungen und Sensoren gedacht sind, und von denen eine schon im Lieferumfang des RP6 enthalten war, das Erweiterungsboard RP6 CONTROL M32 ([http://www.conrad.de/ce/de/product/191550/Arexx-RP6-ATMEGA32-Erweiterungssatz 191550] AUSVERKAUFT!) und die RP6 CCPRO M128 ([http://www.conrad.de/ce/de/product/191563/Arexx-RP6-CC-PRO-MEGA128-Erweiterungssatz 191563]).&lt;br /&gt;
&lt;br /&gt;
Die Boards kann man dann über den I2C Bus mit dem Mainboard kommunizieren lassen.  Es ist sehr sinnvoll, die Module symmetrisch hintereinander zu stapeln und nicht mehr als 6-8 Module zu verbauen, weil der Roboter sonst immer schwerer und langsamer wird. Basierend auf dem Master-Slave System könnte man so bis zu 127 Slaves anschließen. Zudem ist es ratsam, qualitativ hochwertige Akkus und ein Ladegerät mit passendem Stecker zu verwenden, da man ansonsten immer das Mainboard abschrauben müsste um an die Akkus heranzukommen. Für den Fall wurde extra eine Ladebuchse eingebaut.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Experimentierplatine ===&lt;br /&gt;
[[Bild:RP6_Exp.jpg|RP6 Experimentierplatine]]&lt;br /&gt;
&lt;br /&gt;
====Beschreibung====&lt;br /&gt;
Die Experimentier-Platine ist dazu gedacht, eigene Schaltungen auf dem RP6 zu realisieren, und ist seit Mai 2020 bei CONRAD ausverkauft. Sie wird über den I²C-Bus mit den anderen Erweiterungsmodulen verbunden. Ausserdem ist es sinnvoll, die (freien) I/O-Ports (ADC-Kanäle) der RP6 Base, des M32 Erweiterungsmoduls bzw. des CCPRO M128 Moduls über ein [http://www.reichelt.de/?;ACTION=3;LA=444;GROUP=C63;GROUPID=3328;ARTICLE=47637;START=0;SORT=artnr;OFFSET=16;SID=1580faBqwQAQ8AAGY-ZAM7cd511ee04a106a88a359faaac0071e2 10-Pol-Flachbandkabel] mit [http://www.reichelt.de/?ACTION=3;GROUP=C151;GROUPID=3231;ARTICLE=14571;SID=1580faBqwQAQ8AAGY-ZAM7cd511ee04a106a88a359faaac0071e2 Stecker] auf die Experimentierplatine zu führen, weil es übersichtlicher bleibt und keine Kabel lose herumhängen. Auf der Experimentierplatine kann man dann LEDs oder einen Temperatursensor an die I/O-Ports bzw. an die ADC-Kanäle anschießen.&lt;br /&gt;
&lt;br /&gt;
====Technische Daten====&lt;br /&gt;
{|  {{Blauetabelle}} &lt;br /&gt;
|'''Mikrocontroller:'''&lt;br /&gt;
|Keiner&lt;br /&gt;
|-&lt;br /&gt;
|'''Speicher:'''&lt;br /&gt;
|Keiner&amp;lt;br/&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|'''Programmierung:'''&lt;br /&gt;
|Kein Programmieradapter&lt;br /&gt;
|-&lt;br /&gt;
|'''Vorhandene Sensoren:'''&lt;br /&gt;
|Keine&amp;lt;br/&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|'''Vorhandene Aktoren:'''&lt;br /&gt;
|Keine&amp;lt;br/&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|'''Abmessungen:'''&lt;br /&gt;
|(L &amp;amp;times; B &amp;amp;times; H) 112 &amp;amp;times; 90 &amp;amp;times; 10 mm&lt;br /&gt;
|-&lt;br /&gt;
|'''Ausführung:'''&lt;br /&gt;
|Bausatz&lt;br /&gt;
|-&lt;br /&gt;
|'''Stromversorgung:'''&lt;br /&gt;
|6 AA NiMH Akkus (über die RP6 Base)&lt;br /&gt;
|-&lt;br /&gt;
|'''Hersteller:'''&lt;br /&gt;
|Arexx Niederlande&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Schaltungsideen ====&lt;br /&gt;
Auf der / den Experimentierplatinen könnte man z.B. folgendes realisieren:&lt;br /&gt;
&lt;br /&gt;
* eine Kameraschaltung (wie [http://www.rn-wissen.de/index.php/RP6_Kamera_-_Mitmach-Projekt hier] gezeigt)&lt;br /&gt;
* Scheinwerfer, Rücklichter, Blinker etc. (ABER immer mit Vorwiderstand!!!)&lt;br /&gt;
* ein LED-Lauflicht (über I/O-Expander, gibt´s beim [http://www.reichelt.de/?ACTION=3;ARTICLE=14527;PROVID=2402 Reichelt])&lt;br /&gt;
* mehr ADC-Kanäle (über ADC-Expander, einfach mal nach PCF8591 [http://www.google.de/search?q=PCF8591 googlen])&lt;br /&gt;
* eine Wetterstation mit Luftfeuchtemesser, Temperaturfühler und Lichtmesser ([http://www.roboternetz.de/phpBB2/viewtopic.php?t=52298 hier] gibt es eine Wetterstation uvm.)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== RP6 CONTROL M32 Platine ===&lt;br /&gt;
[[Bild:RP6Control_M32.jpg|RP6 CONTROL M32]]&lt;br /&gt;
&lt;br /&gt;
====Beschreibung====&lt;br /&gt;
Auf der M32 ([http://www.conrad.de/ce/de/product/191550/Arexx-RP6-ATMEGA32-Erweiterungssatz 191550]) lassen sich weitere LEDs, Sensoren oder ähnliches anschließen, außerdem steht ein weiterer ATMEGA32 zur Verfügung, welcher sich gut im Master Modus betreiben lässt. Es sind ein Mikrofonsensor, fünf Taster, vier Status-LEDs, ein Display-Port, ein Beeper, 6 freie ADC-Kanäle, 8 freie I/O-Ports, ein Programmieradapter, ein JTAG-Anschluss, eine ISP-Programmierschnittstelle sowie ein freier Steckplatz für ein EEPROM verfügbar.&lt;br /&gt;
&lt;br /&gt;
Seit Ende 2021 ist die M32 bei CONRAD ausverkauft!&lt;br /&gt;
&lt;br /&gt;
====Technische Daten====&lt;br /&gt;
{|  {{Blauetabelle}} &lt;br /&gt;
|'''Mikrocontroller:'''&lt;br /&gt;
|AVR [[ATmega32]]&lt;br /&gt;
|-&lt;br /&gt;
|'''Speicher:'''&lt;br /&gt;
|32 kB [[Flash]]-Speicher, davon 1 kB bereits vom Bootloader belegt&amp;lt;br/&amp;gt;&lt;br /&gt;
2 kB SRAM&amp;lt;br/&amp;gt; &lt;br /&gt;
1 kB [[EEPROM]]&lt;br /&gt;
|-&lt;br /&gt;
|'''Programmierung:'''&lt;br /&gt;
|Über AVR-[[Bootloader]], belegt ca. 1 kB des Flash-Speichers&lt;br /&gt;
|-&lt;br /&gt;
|'''Vorhandene Sensoren:'''&lt;br /&gt;
|1 Mikrofonsensor&amp;lt;br/&amp;gt;&lt;br /&gt;
5 Eingabetaster&amp;lt;br/&amp;gt;&lt;br /&gt;
14 I/O Ports, davon 6 ADC-Wandler&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|'''Vorhandene Aktoren:'''&lt;br /&gt;
|1 Beeper&amp;lt;br/&amp;gt;&lt;br /&gt;
4 Status-LEDs&amp;lt;br/&amp;gt;&lt;br /&gt;
1 LC-Display-Port&amp;lt;br/&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|'''Abmessungen:'''&lt;br /&gt;
|(L &amp;amp;times; B &amp;amp;times; H) 112 &amp;amp;times; 90 &amp;amp;times; 15 mm&lt;br /&gt;
|-&lt;br /&gt;
|'''Ausführung:'''&lt;br /&gt;
|Fertig aufgebautes Erweiterungsmodul&lt;br /&gt;
|-&lt;br /&gt;
|'''Stromversorgung:'''&lt;br /&gt;
|6 AA NiMH Akkus (über die RP6 Base)&lt;br /&gt;
|-&lt;br /&gt;
|'''Hersteller:'''&lt;br /&gt;
|Arexx Niederlande&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Umbau-Optionen ====&lt;br /&gt;
Dieser Absatz soll die Möglichkeiten der RP6 CONTROL M32 Platine (im Folgenden &amp;quot;M32&amp;quot; genannt) auflisten, die es gibt, um auf einfache Weise weitere Anschlüsse oder Verbindungen zu ermöglichen. Nicht beschrieben werden die Anschlußmöglichkeiten, die in Form der vorhandenen Wannenstecker sowieso gegeben sind (z.B. am LCD-, I/O- oder ADC-Stecker). Im Text gibt es Verweise auf den Schaltplan der M32 (RP6_CONTROL_M32.PDF) in der Form: (SP2 B1: Bauteil).  Dies bedeutet, dass man das Bauteil auf Blatt 2 des RP6-M32-Schaltplans im Feld B1 finden kann.&lt;br /&gt;
&lt;br /&gt;
Folgende Möglichkeiten zum Umbau/Ausbau sind vorgesehen:&lt;br /&gt;
* Zweites SPI-EEPROM (IC5)&lt;br /&gt;
* Zwei analoge Sensoren, evtl. mit getrennter Stromversorgung&lt;br /&gt;
* ISP (In System Programming)&lt;br /&gt;
* JTAG-Programmierung&lt;br /&gt;
* USRBUS&lt;br /&gt;
* IRQ-Zuweisung ändern&lt;br /&gt;
* ADC0 und ADC1 anders nutzen&lt;br /&gt;
* Schieberegister kaskadieren&lt;br /&gt;
Im folgenden Text soll beschrieben werden, wie man die weiteren Möglichkeiten nutzen kann. Es wird jeweils erwähnt, was man an Material braucht. Beispielhaft sind da Bestell-Nummern der Firma [http://www.conrad.de/ce/ CONRAD] genannt. Natürlich kann man die Teile auch bei anderen Versendern beziehen. Durch die Nennung der Bestell-Nummer ist das jeweilige Teil aber gut zu identifizieren. Man sollte Löten können und sich bewußt sein, dass ggf. ein Garantieanspruch nicht mehr besteht, wenn man an der Platine gelötet hat.&lt;br /&gt;
&lt;br /&gt;
Bei den Materialangaben ist öfter die Rede von &amp;quot;Steckbuchsen mit Litze&amp;quot;. Diese Steckbuchsen mit angelöteter Litze können auf die ein- oder zweireihigen Stiftleisten aufgesteckt werden. Leider gibt es sie nicht (mehr) fertig konfektioniert bei CONRAD. Die einreihigen Steckbuchsen (RM 2,54mm) kann man aber z.B. bei [http://www.elv.de/output/controller.aspx ELV] bekommen: 2-polig (68-016635), 3-polig (68-022503) und 5-polig (68-023073). An sie muss man dann noch Litzen in der entsprechenden Länge selbst anlöten.&lt;br /&gt;
&lt;br /&gt;
===== Zweites SPI-EEPROM =====&lt;br /&gt;
Es ist sehr einfach, ein zweites SPI-EEPROM (SP1 A1: IC5*) auf der M32 zu nutzen.&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_M32_IC5-Socket.JPG|thumb|Sockel des 2. SPI-EEPROMs]]&lt;br /&gt;
&lt;br /&gt;
Man braucht dazu:&lt;br /&gt;
* Einen IC-Sockel 8-pol DIP für IC5 ([http://www.conrad.de/ce/de/product/189600/IC-FASSUNG-PRAeZISION-8POLIG 189600])&lt;br /&gt;
* Einen Keramik-Vielschicht-Kondensator 100nF (C19); RM 2,54mm ([http://www.conrad.de/ce/de/product/453099/?insert=36&amp;amp;insertNoDeeplink&amp;amp;productname=KONDENSATOR-01-F-KDPU-254-MM 453099])&lt;br /&gt;
* Ein serielles SPI-EEPROM im PDIP8 Gehäuse (IC5)&lt;br /&gt;
Zuerst wird der IC-Sockel eingelötet (Kerbe beachten!), dann C19 (SP1 A1: C19*). Das war's.&lt;br /&gt;
&lt;br /&gt;
Leider gibt es das EEPROM nicht bei den gängigeren Versendern. Bekommen kann man es aber z.B. bei [http://de.farnell.com/jsp/home/homepage.jsp Farnell]. Dort hat das SPI-EEPROM mit 256 kbit die Bezeichnung 25LC256-I/P (1331398). Wenn man es noch größer mag: 25LC1024 (1331392) mit 1024 kbit. SPI-EEPROMs führt inzwischen auch [http://www.reichelt.de./ Reichelt].&lt;br /&gt;
&lt;br /&gt;
'''Programmierung:'''&lt;br /&gt;
&lt;br /&gt;
In die RP6ControlLib.h bitte einfügen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#define SPI_EEPROM2_PAGESIZE 64&lt;br /&gt;
&lt;br /&gt;
uint8_t SPI_EEPROM2_readByte(uint16_t memAddr);&lt;br /&gt;
void SPI_EEPROM2_writeByte(uint16_t memAddr, uint8_t data);&lt;br /&gt;
void SPI_EEPROM2_enableWrite(void);&lt;br /&gt;
void SPI_EEPROM2_disableWrite(void);&lt;br /&gt;
uint8_t SPI_EEPROM2_getStatus(void);&lt;br /&gt;
&lt;br /&gt;
void SPI_EEPROM2_writeBytes(uint16_t startAddr, uint8_t *buffer, uint8_t length);&lt;br /&gt;
void SPI_EEPROM2_readBytes(uint16_t startAddr, uint8_t *buffer, uint8_t length);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Die Konstante SPI_EEPROM2_PAGESIZE ist abhängig von der Art und Größe des EEPROMs. Für ein 256 kbit-EEPROM ist die Seitengröße (pagesize) in der Regel 64, für einen 512 kbit-Typ 128 und für einen 1024 kbit-Typ 256.&lt;br /&gt;
&lt;br /&gt;
In die RP6ControlLib.c bitte einfügen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Second external SPI EEPROM:&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Reads a single Byte from the 2nd external EEPROM.&lt;br /&gt;
 */&lt;br /&gt;
uint8_t SPI_EEPROM2_readByte(uint16_t memAddr)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t data;&lt;br /&gt;
	PORTB &amp;amp;= ~MEM_CS2;&lt;br /&gt;
	writeSPI(SPI_EEPROM_READ);&lt;br /&gt;
	writeWordSPI(memAddr);&lt;br /&gt;
	data = readSPI();&lt;br /&gt;
	PORTB |= MEM_CS2;&lt;br /&gt;
	return data;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Reads &amp;quot;length&amp;quot; Bytes into the Buffer &amp;quot;buffer&amp;quot; from startAdr on. &lt;br /&gt;
 * You can read the complete 2nd EEPROM into a buffer at once - if it is large enough. &lt;br /&gt;
 * (But you only have 2KB SRAM on a MEGA32 ;) )&lt;br /&gt;
 */&lt;br /&gt;
void SPI_EEPROM2_readBytes(uint16_t startAddr, uint8_t *buffer, uint8_t length)&lt;br /&gt;
{&lt;br /&gt;
	PORTB &amp;amp;= ~MEM_CS2;&lt;br /&gt;
	writeSPI(SPI_EEPROM_READ);&lt;br /&gt;
	writeWordSPI(startAddr);&lt;br /&gt;
	readBufferSPI(&amp;amp;buffer[0], length);&lt;br /&gt;
	PORTB |= MEM_CS2;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Enable Write Mode&lt;br /&gt;
 */&lt;br /&gt;
void SPI_EEPROM2_enableWrite(void)&lt;br /&gt;
{&lt;br /&gt;
	PORTB &amp;amp;= ~MEM_CS2;&lt;br /&gt;
	writeSPI(SPI_EEPROM_WREN);&lt;br /&gt;
	PORTB |= MEM_CS2;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Disable Write Mode&lt;br /&gt;
 */&lt;br /&gt;
void SPI_EEPROM2_disableWrite(void)&lt;br /&gt;
{&lt;br /&gt;
	PORTB &amp;amp;= ~MEM_CS2;&lt;br /&gt;
	writeSPI(SPI_EEPROM_WRDI);&lt;br /&gt;
	PORTB |= MEM_CS2;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Write a single data byte to the specified 2nd EEPROM address.&lt;br /&gt;
 */&lt;br /&gt;
void SPI_EEPROM2_writeByte(uint16_t memAddr, uint8_t data)&lt;br /&gt;
{&lt;br /&gt;
	while(SPI_EEPROM2_getStatus() &amp;amp; SPI_EEPROM_STAT_WIP);&lt;br /&gt;
	SPI_EEPROM2_enableWrite();&lt;br /&gt;
	PORTB &amp;amp;= ~MEM_CS2;&lt;br /&gt;
	writeSPI(SPI_EEPROM_WRITE);&lt;br /&gt;
	writeWordSPI(memAddr);&lt;br /&gt;
	writeSPI(data);&lt;br /&gt;
	PORTB |= MEM_CS2;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Write &amp;quot;length&amp;quot; Bytes from the Buffer to the 2nd EEPROM. &lt;br /&gt;
 * YOU CAN ONLY WRITE MAXIMAL [SPI_EEPROM2_PAGESIZE] BYTES AT ONCE!!!&lt;br /&gt;
 * This is the Pagesize!&lt;br /&gt;
 * You can NOT cross a page boundary!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void SPI_EEPROM2_writeBytes(uint16_t startAddr, uint8_t *buffer, uint8_t length)&lt;br /&gt;
{&lt;br /&gt;
	while(SPI_EEPROM2_getStatus() &amp;amp; SPI_EEPROM_STAT_WIP);&lt;br /&gt;
	SPI_EEPROM2_enableWrite();&lt;br /&gt;
	PORTB &amp;amp;= ~MEM_CS2;&lt;br /&gt;
	writeSPI(SPI_EEPROM_WRITE);&lt;br /&gt;
	writeWordSPI(startAddr);&lt;br /&gt;
	writeBufferSPI(&amp;amp;buffer[0], length);&lt;br /&gt;
	PORTB |= MEM_CS2;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Returns EEPROM Status register - for checking if 2nd EEPROM is buisy. &lt;br /&gt;
 * Writing takes about 5ms. &lt;br /&gt;
 */&lt;br /&gt;
uint8_t SPI_EEPROM2_getStatus(void)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t status;&lt;br /&gt;
	PORTB &amp;amp;= ~MEM_CS2;&lt;br /&gt;
	writeSPI(SPI_EEPROM_RDSR);&lt;br /&gt;
	status = readSPI();&lt;br /&gt;
	PORTB |= MEM_CS2;&lt;br /&gt;
	return status;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Hinweis zum 1024 kbit-EEPROM:&lt;br /&gt;
&lt;br /&gt;
Dieses EEPROM benötigt 24-Bit Adressen und muss daher etwas anders angesprochen werden als die &amp;quot;kleineren&amp;quot; Typen bis 512 kbit.&lt;br /&gt;
Die Funktion SPI_EEPROM2_readByte() sieht für ein 1024 kbit-EEPROM z.B. so aus:&lt;br /&gt;
&amp;lt;pre&amp;gt;uint8_t SPI_EEPROM2_readByte(uint32_t memAddr)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t data;&lt;br /&gt;
	PORTB &amp;amp;= ~MEM_CS2;&lt;br /&gt;
	writeSPI(SPI_EEPROM_READ);&lt;br /&gt;
	writeSPI((uint8_t)(memAddr &amp;gt;&amp;gt; 16));&lt;br /&gt;
	writeWordSPI((uint16_t)memAddr);&lt;br /&gt;
	data = readSPI();&lt;br /&gt;
	PORTB |= MEM_CS2;&lt;br /&gt;
	return data;&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
Alle weiteren Funktionen, die EEPROM-Adressen verwenden (SPI_EEPROM2_readBytes, SPI_EEPROM2_writeByte, SPI_EEPROM2_writeBytes), müssen genau so angepasst werden.&lt;br /&gt;
&lt;br /&gt;
===== Anschlüsse =====&lt;br /&gt;
Hier wird aufgelistet, wo man auf der M32 Platine Anschlüsse nutzen kann, um sie z.B. zu weiteren Sensoren, zum USRBUS oder (weniger empfehlenswert!) direkt zu EPs, zur RP6 Base oder zur CCPRO M128 zu führen. &lt;br /&gt;
&lt;br /&gt;
====== Analoge Sensoren an ADC2/3 ======&lt;br /&gt;
[[Bild:RP6_M32_ADC23.JPG|thumb|ADC2 ADC3]]&lt;br /&gt;
Wenn man bis zu zwei analoge Sensoren (z.B. IR-Distanz-Mess-Sensoren Sharp GP2Y0A02YK 185364) direkt an die M32 anschließen möchte, dann gibt es da zwei 3-polige Kontakte, beschriftet mit VDD/GND/ADCx (x = 2..3). Hier kann man 3-polige Stiftleisten auflöten, an die dann die Sensoren angeschlossen werden.&lt;br /&gt;
&lt;br /&gt;
Man braucht dazu:&lt;br /&gt;
* 1-reihige Stiftleiste RM 2,54mm (z.B. 36-polig 732478)&lt;br /&gt;
* Zwei Keramik-Vielschicht-Kondensatoren 100nF (C16, C17); RM 2,54mm (453099)&lt;br /&gt;
* Ein Elektrolyt-Kondensator stehend 470 uF / 16V (C18); RM 3,5mm (446211)&lt;br /&gt;
* Zwei 3-polige Steckbuchsen mit Litze zum Anschluß der Sensoren&lt;br /&gt;
Man trennt von der 1-reihigen Stiftleiste zweimal 3 Kontakte ab und lötet sie auf die weiß umrahmten Kontakte (VDD/GND/ADCx; SP2 C23: ADC2, YGND8, YVDD6, ADC3, YGND7, YVDD5), anschließend C16, C17 (SP2 C1: C16*, C17*) auf ihre Plätze und zum Schluß den Elko 470 uF (C18; SP2 B1: C18*). Beim Elko auf die Polung achten: Er muss genau so sitzen wie sein Nachbar C1 (Minuspol schaut zum Beeper SND).&lt;br /&gt;
&lt;br /&gt;
Die Sensoren lötet man an die Litzen der 3-poligen Steckbuchsen und steckt diese auf die neuen Kontakte.&lt;br /&gt;
&lt;br /&gt;
Da manche Sensoren einen höheren Stromverbrauch haben, kann man die Stromversorgung an den VDD-Pins der ADC2/3-Stecker abschaltbar machen oder eine separate +5V-Spannung einspeisen. Siehe dazu den Abschnitt &amp;quot;Trennstellen - Getrennte Stromversorgung für ADC2/3&amp;quot; weiter unten!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====== ISP (In System Programming) ======&lt;br /&gt;
Der ATMEGA32 der M32 wird standardmäßig über den PROG/UART Stecker programmiert. Dazu befindet sich im Prozessor ein Bootloader-Programm. Wenn man stattdessen oder zusätzlich die ISP-Programmierung mit einem dafür geeigneten ISP-Programmier-Adapter nutzen will, kann man den Adapter an den gewinkelten ISP-Stecker auf der M32 anschließen.&lt;br /&gt;
Vorher sind aber ein paar &amp;quot;Umbauarbeiten&amp;quot; erforderlich.&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_M32_ISP.JPG|thumb|ISP]]&lt;br /&gt;
&lt;br /&gt;
Man braucht dazu:&lt;br /&gt;
* 1-reihige Stiftleiste RM 2,54mm (z.B. 36-polig 732478)&lt;br /&gt;
* Einen SMD-Widerstand 10 kOhm (406376)&lt;br /&gt;
* Eine SMD-Diode LL 4148 (140902)&lt;br /&gt;
* Eine Codierbrücke (z.B. aus Set 742902)&lt;br /&gt;
&lt;br /&gt;
Der SMD-Widerstand wird auf seinen Platz (R1; SP1 A3: R1*) neben dem XBUS2-Stecker gelötet, danach die Diode LL 4148 (D2; SP1 B3: D2*). Die Kathode (Strich) der Diode zeigt in Richtung des Quarzes (X1). Zwischen R1 und C1 befinden sich drei Lötpunkte (beschriftet mit ISP/DEBUG - BOOTLOAD; SP1 A34: YRST1..3), auf die eine 3-polige Stiftleiste gelötet werden muss. Vorher muss eine kurze Leiterbahn zwischen den Lötpunkten BOOTLOAD aufgetrennt werden. Die Leiterbahn befindet sich auf der Lötseite der Platine und muss mit einem scharfen Messer oder einem speziellen Leiterbahn-Unterbrecher zwischen den beiden Lötpunkten unterbrochen werden. Man sollte anschließend mit einem Widerstandsmeßgerät nachmessen: Es sollte keine Verbindung mehr zwischen den Lötpunkten bestehen.&lt;br /&gt;
Man trennt dann von der 1-reihigen Stiftleiste 3 Kontakte ab und lötet sie auf die beschriebenen drei Lötpunkte.&lt;br /&gt;
&lt;br /&gt;
Wenn man jetzt eine Codierbrücke auf die mit &amp;quot;BOOTLOAD&amp;quot; beschrifteten Pins steckt, bleibt alles unverändert: Die Programmierung erfolgt weiter über den PROG/UART-Stecker mithilfe des Bootloaders im Prozessor. Wird die Codierbrücke in Stellung &amp;quot;ISP/DEBUG&amp;quot; umgesteckt, kann der Prozessor mit ISP programmiert werden.&lt;br /&gt;
&lt;br /&gt;
Vorsicht: Das Bootloader-Programm kann dabei zerstört werden! Es müssen zusätzlich Fusebits des ATMEGA32 verändert werden. &lt;br /&gt;
&lt;br /&gt;
Dabei kann der Prozessor im schlimmsten Fall nicht mehr ansprechbar sein. Man sollte diesen Umbau und die ISP-Programmierung nur machen, wenn man genau weiß, was man macht!&lt;br /&gt;
&lt;br /&gt;
Eine Kopie des Bootloaders und eine Kurzanleitung zum Einstellen der Fusebits gibt es hier: &lt;br /&gt;
[http://www.arexx.com/rp6/downloads/RP6_M32_BOOTLOADER.zip RP6_M32_BOOTLOADER]&lt;br /&gt;
&lt;br /&gt;
====== JTAG ======&lt;br /&gt;
[[Bild:RP6_M32_JTAG.JPG|thumb|JTAG]]&lt;br /&gt;
Die Programmierung und ein Debuggen sind auch mit der JTAG-Schnittstelle möglich. Das ist nur zu empfehlen, wenn man Erfahrungen mitbringt, oder der Prozessor der M32 durch eine ISP-Falschprogrammierung z.B. nicht mehr ansprechbar ist.&lt;br /&gt;
Um die JTAG-Schnittstelle nutzen zu können, muss der ISP-Umbau durchgeführt worden sein und die dort beschriebene Codierbrücke auf &amp;quot;ISP/DEBUG&amp;quot; gesteckt sein. Der JTAG-Programmer kann dann an die Lötpunkte &amp;quot;JTAG&amp;quot; zwischen ISP- und I/O-Stecker angeschlossen werden.&lt;br /&gt;
&lt;br /&gt;
Man braucht dazu:&lt;br /&gt;
* 2-reihige Stiftleiste RM 2,54mm (z.B. 2x36-polig 742007)&lt;br /&gt;
Man trennt von der 2-reihigen Stiftleiste 2x5 Kontakte ab und lötet sie auf die 10 JTAG-Lötpunkte (SP2 A12: YTDI, YTDO, YTMS, YTCK, YTRST, YVDD3/4, YGND3/4, YNC). Hier kann jetzt der JTAG-Programmer z.B. mit einem 10-poligen Flachkabel-Stecker angeschlossen werden. Um das JTAG-Interface des ATMEGA32 nutzen zu können, müssen Änderungen an den Fusebits vorgenommen werden.&lt;br /&gt;
&lt;br /&gt;
Vorsicht: Man sollte die JTAG-Programmierung und Fusebit-Manipulationen nur machen, wenn man genau weiß, was man macht!&lt;br /&gt;
&lt;br /&gt;
====== USRBUS ======&lt;br /&gt;
Die 14 Kontakte der beiden USRBUS-Stecker sind auf der M32 nirgendwo angeschlossen, sondern können über die Lötpunkte Y1..Y14 mit beliebigen Punkten auf der M32 verbunden werden.&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_M32_USRBUS.JPG|thumb|USRBUS]]&lt;br /&gt;
&lt;br /&gt;
Ich würde auf Y1..Y14 eine Stiftleiste löten, damit die USRBUS-Belegung geändert werden kann.&lt;br /&gt;
&lt;br /&gt;
Man braucht dazu:&lt;br /&gt;
* 2-reihige Stiftleiste RM 2,54mm (z.B. 2x36-polig 742007)&lt;br /&gt;
* Einige Steckbuchsen mit Litze&lt;br /&gt;
&lt;br /&gt;
Man trennt von der 2-reihigen Stiftleiste 2x7 Kontakte ab und lötet sie auf die Punkte Y1..Y14 (SP2 E3: Y1..Y14) neben dem Wannenstecker USRBUS2. Wird die M32 über Flachkabel mit einem USRBUS-Stecker auf einer RP6 Experimentierplatine (EP) und/oder mit dem RP6 selbst verbunden, dann hat man mit allen mit dem USRBUS verbundenen Platinen eine direkte 14-polige Verbindung,- eben den &amp;quot;User Bus&amp;quot;. Den kann man dann nutzen, wie man will. Auf der M32 kann man mit Steckbuchsen die Pins Y1..Y14 mit anderen Pins verbinden.&lt;br /&gt;
&lt;br /&gt;
Beispiel: Verbindet man den Pin &amp;quot;ADC2&amp;quot; mit Y1 des USRBUS, dann steht der Eingang ADC2 auf allen an den USRBUS angeschlossenen Platinen an Y1 zur Verfügung. Man braucht also diesen Eingang nicht über ein eigenes Kabel auf eine EP zu führen, sondern kann dazu den USRBUS nehmen. Dadurch bleibt der Gesamtaufbau auf dem RP6 übersichtlich und komplett trennbar (man braucht nur die Stecker XBUS und USRBUS abzuziehen!).&lt;br /&gt;
&lt;br /&gt;
Wichtig: Man sollte gut dokumentieren, wie man den USRBUS am RP6 (vorn und hinten getrennt!), auf EPs und der M32/M128 benutzt! Sonst kann es bei einer anderen Anordnung von EPs zu USRBUS Konflikten/Kurzschlüssen kommen.&lt;br /&gt;
&lt;br /&gt;
====== Schieberegister kaskadieren ======&lt;br /&gt;
[[Bild:RP6_M32_SPI.JPG|thumb|SPI]]&lt;br /&gt;
Auf der M32 wird ein 8-Bit Schieberegister-Baustein (IC3: 74HC4094D) dazu gebraucht, vier Status-LEDs (LED1..LED4) und ein LCD (am Stecker LCD) anzusteuern. Durch Schieberegister kann man Port-Pins gewinnen, wenn die Pins des Prozessors nicht ausreichen.&lt;br /&gt;
&lt;br /&gt;
Solche Schieberegister kann man &amp;quot;kaskadieren&amp;quot;, d.h. weitere identische Bausteine einbauen, die weitere Port-Pins zur Verfügung stellen. Wenn man zusätzliche 74HC4094 einsetzen will, wird man das am besten auf einer EP aufbauen. Die Anschlüsse für diese Schieberegister werden auf der M32 an einer 6-poligen Reihe von Lötpunkten (beschriftet mit MISO, STR, MOSI, SCK, QS, QS*; SP1 D3: YQS1/2, YMOSI, YSCK, YSTR, YMISO) links von IC3 zur Verfügung gestellt.&lt;br /&gt;
&lt;br /&gt;
Wenn man diese 6 Signalleitungen auf eine EP führen will, gibt es dafür zwei Möglichkeiten:&lt;br /&gt;
* a) Direkte 6-polige Kabelverbindung von den oben beschriebenen Lötpunkten zur EP&lt;br /&gt;
* b) Nutzung des USRBUS, um die 6 Signale zur EP zu führen&lt;br /&gt;
Wenn man im Abschnitt &amp;quot;[[RP6#USRBUS|USRBUS]]&amp;quot; den entsprechenden Umbau gemacht hat, würde ich b) empfehlen! Man könnte dafür eine 6-polige Stiftleiste auf die o.g. Lötpunkte auflöten und 1:1 z.B. mit den Pins Y4, Y6, Y8, Y10, Y12, Y14 des USRBUS verbinden. Dann kann man auf der EP weitere Schieberegister- und SPI-Bausteine (z.B. SPI-EEPROMs, [http://www.pollin.de/shop/dt/MDU5OTgxOTk-/Bausaetze_Module/Module/Funkmodul_RFM12_433_Sende_Empfangsmodul.html RFM12 Transceiver] o.ä.) aufbauen.&lt;br /&gt;
&lt;br /&gt;
Man braucht dazu:&lt;br /&gt;
* 1-reihige Stiftleiste RM 2,54mm (z.B. 36-polig 732478)&lt;br /&gt;
* Steckbuchsen mit Litze&lt;br /&gt;
Man trennt von der 1-reihigen Stiftleiste 6 Kontakte ab und lötet sie auf die beschriebenen sechs Lötpunkte auf der M32. Mit den Steckbuchsen mit Litze wird dann die Verbindung entweder direkt zur EP (Option a) oder über den USRBUS zur EP (Option b) hergestellt.&lt;br /&gt;
&lt;br /&gt;
====== VDD/GND/+UB Anschluß ======&lt;br /&gt;
[[Bild:RP6_M32_VDDGNDUB.JPG|thumb|RP6 M32 VDD GND +UB]]&lt;br /&gt;
VDD, GND und +UB (SP2 C3: YUB1, YGND1/2/5, YVDD1/2) kann man auf der M32 an diesen Lötpunkten abnehmen.&lt;br /&gt;
&lt;br /&gt;
Natürlich kann man hier auch Stiftleisten auflöten.&lt;br /&gt;
&lt;br /&gt;
Auf der anderen Platinenseite (zwischen dem USRBUS1 und ISP Stecker) befinden sich zusätzlich noch 2 weitere Lötpunkte, an denen man VDD und GND kontaktieren kann.&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;
&lt;br /&gt;
====== Serielle Schnittstelle ======&lt;br /&gt;
[[Bild:RP6_M32_RST.JPG|thumb|RP6 M32 RST]]&lt;br /&gt;
Neben dem PROG/UART Stecker befinden sich 5 Lötpunkte mit den Signalen RST, TX, RX, GND, VDD (SP2 BC3: YRX, YTX, YRST, YVDD, YGND). Hier kann z.B. eine 5-polige Stiftleiste aufgelötet werden, um einen Anschluß an die serielle Schnittstelle zu ermöglichen.&lt;br /&gt;
 &lt;br /&gt;
Von diesen 5 Lötpunkten könnte z.B. auch eine Verbindung zum USRBUS hergestellt werden, um die serielle Schnittstelle der M32 auf EPs zu führen.&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;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====== MEM_CS2 ======&lt;br /&gt;
[[Bild:RP6_M32_MEM_CS2.JPG|thumb|RP6 M32 MEM_CS2]]&lt;br /&gt;
MEM_CS2 (M32 Microcontroller Pin PB1) kann man am IC5-Sockel an Pin 1 (SP1 A1: IC5*, Pin 1) kontaktieren. Falls IC5 nicht eingesetzt werden soll, kann man hier durch Einstecken eines Kabels in Pin 1 des IC5-Sockels PB1 nutzen und z.B. zum USRBUS führen.&lt;br /&gt;
&lt;br /&gt;
===== Mess-/Kontaktpunkte =====&lt;br /&gt;
Hier geht es um Kontaktpunkte, an denen man z.B. den Logik-Pegel (High/Low) oder eine analoge Spannung messen kann. Natürlich kann man die Signale auch zur Weiterleitung auf eine EP kontaktieren, dies wird man aber normalerweise nicht brauchen.&lt;br /&gt;
&lt;br /&gt;
====== M-Signal ======&lt;br /&gt;
[[Bild:RP6_M32_M_SIGNAL.JPG|thumb|RP6 M32 M-Signal]]&lt;br /&gt;
An diesem Messpunkt (SP1 E3: YM_SIGNAL) neben D1 kann man die Ausgangsspannung des Mikrofon-Verstärkers IC4 (SP1 E3: IC4) messen oder z.B. mit einem Oszilloskop darstellen.&lt;br /&gt;
&lt;br /&gt;
===== Trennstellen =====&lt;br /&gt;
An diesen Stellen können Leiterbahnen unterbrochen werden, um Funktionen zu deaktivieren oder anders zu nutzen. &lt;br /&gt;
&lt;br /&gt;
====== Getrennte Stromversorgung für ADC2/3 ======&lt;br /&gt;
Wenn man für die analogen Sensoren an ADC2/3 (siehe Abschnitt &amp;quot;Anschlüsse - Analoge Sensoren an ADC2/3&amp;quot; weiter oben!) eine GETRENNTE Stromversorgung vorsehen will und/oder mit Codierbrücke (oder MOSFET) die Stromversorgung abschaltbar machen möchte, muss man erst Vorarbeit leisten.&lt;br /&gt;
[[Bild:RP6_M32_SV.jpg|thumb|RP6 M32 SV]]&lt;br /&gt;
&lt;br /&gt;
Man braucht dazu:&lt;br /&gt;
* 1-reihige Stiftleiste RM 2,54mm (z.B. 36-polig 732478)&lt;br /&gt;
* Evtl.: Eine Codierbrücke (z.B. aus Set 742902)&lt;br /&gt;
* Evtl.: Eine 1-polige Steckbuchse mit Litze zur ext. Stromversorgung&lt;br /&gt;
Es muss eine kurze Leiterbahn zwischen den Punkten &amp;quot;SV1&amp;quot; und &amp;quot;SV2&amp;quot; (SP2 B2: SV1, SV2) aufgetrennt werden. Die Leiterbahn befindet sich auf der Lötseite der Platine und muss mit einem scharfen Messer oder einem speziellen Leiterbahn-Unterbrecher zwischen den beiden Lötpunkten unterbrochen werden. Man sollte anschließend mit einem Widerstandsmeßgerät zwischen SV1 und SV2 nachmessen: Es sollte keine Verbindung mehr bestehen. Jetzt trennt man von der 1-reihigen Stiftleiste 2 Kontakte ab und lötet sie auf die Punkte SV1/SV2.&lt;br /&gt;
&lt;br /&gt;
Man kann hier zunächst eine Codierbrücke aufstecken. Damit versorgt der RP6 Akku die Sensoren mit 5V an den Pins VDD. Möchte man später eine getrennte 5V-Spannung anlegen, zieht man einfach die Codierbrücke ab und speist die externe 5V-Spannung (mit einer 1-poligen Steckbuchse) am Pin SV2 ein. Achtung: An Pin SV1 wird dann nichts angeschlossen!&lt;br /&gt;
&lt;br /&gt;
Anstelle der Codierbrücke kann man natürlich auch einen MOSFET anschließen, um die Sensoren per Software abschalten zu können.&lt;br /&gt;
&lt;br /&gt;
====== Interrupt-Zuordnung ändern ======&lt;br /&gt;
Am XBUS stehen vier Interrupt-Pins (genannt INT1..INT3, INTU) zur Verfügung. INT1 ist auf der RP6 Base mit PA4 verbunden, auf der M32 mit PD2 (Prozessor INT0), auf der M128 mit PE5 (Prozessor INT5) und auf der [[RP6v2#RP6v2_M256_WiFi_Platine|RP6 M256 WiFi]] mit PJ3 (Prozessor PCINT12). Diese Tabelle zeigt die Verbindung aller Interruptleitungen auf den Platinen (RP6 Base, M32, M128, M256 WiFi) über den XBUS:&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |XBUS Pin&lt;br /&gt;
 |XBUS INTx&lt;br /&gt;
 |RP6 Base Pin&lt;br /&gt;
 |RP6 Base INTx&lt;br /&gt;
 |RP6 M32 Pin&lt;br /&gt;
 |RP6 M32 INTx&lt;br /&gt;
 |RP6 M128 Pin&lt;br /&gt;
 |RP6 M128 INTx&lt;br /&gt;
 |RP6 M256 Pin&lt;br /&gt;
 |RP6 M256 INTx&lt;br /&gt;
 |-&lt;br /&gt;
 |8&lt;br /&gt;
 |INT1&lt;br /&gt;
 |PA4&lt;br /&gt;
 |kein&lt;br /&gt;
 |PD2&lt;br /&gt;
 |INT0&lt;br /&gt;
 |PE5&lt;br /&gt;
 |INT5&lt;br /&gt;
 |PJ3&lt;br /&gt;
 |PCINT12&lt;br /&gt;
 |-&lt;br /&gt;
 |11&lt;br /&gt;
 |INT2&lt;br /&gt;
 |n.c.&lt;br /&gt;
 |&lt;br /&gt;
 |PD3 *&lt;br /&gt;
 |INT1&lt;br /&gt;
 |n.c.&lt;br /&gt;
 |&lt;br /&gt;
 |PJ6&lt;br /&gt;
 |PCINT15&lt;br /&gt;
 |-&lt;br /&gt;
 |9&lt;br /&gt;
 |INT3&lt;br /&gt;
 |n.c.&lt;br /&gt;
 |&lt;br /&gt;
 |PB2 *&lt;br /&gt;
 |INT2&lt;br /&gt;
 |PE6&lt;br /&gt;
 |INT6&lt;br /&gt;
 |PJ5&lt;br /&gt;
 |PCINT14&lt;br /&gt;
 |-&lt;br /&gt;
 |7&lt;br /&gt;
 |INTU&lt;br /&gt;
 |n.c.&lt;br /&gt;
 |&lt;br /&gt;
 |n.c.    *&lt;br /&gt;
 |&lt;br /&gt;
 |n.c.&lt;br /&gt;
 |&lt;br /&gt;
 |PJ4&lt;br /&gt;
 |PCINT13&lt;br /&gt;
 |-&lt;br /&gt;
|}&lt;br /&gt;
'''Zu *:''' Standard-Belegung. Ggf. abhängig von der nachfolgend beschriebenen Interrupt-Zuordnung!&lt;br /&gt;
&lt;br /&gt;
Auf der M32 kann man die Interrupt-Zuordnung für INT2, INT3 und INTU durch drei Codierbrücken (beschriftet mit I2-INTU, INT3-I3, I2-INT2; SP2 A3: YINT2/3/U, YI2_1/2, YI3) ändern.&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_M32_INTx.JPG|thumb|INTx]]&lt;br /&gt;
&lt;br /&gt;
Man braucht dazu:&lt;br /&gt;
* 2-reihige Stiftleiste RM 2,54mm (z.B. 2x36-polig 742007)&lt;br /&gt;
* Drei Codierbrücken (z.B. aus Set 742902)&lt;br /&gt;
Vor dem Auflöten der Stiftleiste müssen zwei kurze Leiterbahnen zwischen zwei Lötpunkten aufgetrennt werden, und zwar zwischen den Lötpunkten INT3-I3 und I2-INT2. Die Leiterbahnen müssen mit einem scharfen Messer oder einem speziellen Leiterbahn-Unterbrecher zwischen den beiden Lötpunkten unterbrochen werden. Man sollte anschließend mit einem Widerstandsmeßgerät nachmessen: Es sollte keine Verbindung mehr zwischen INT3-I3 und I2-INT2 bestehen. Man trennt dann von der 2-reihigen Stiftleiste 2x3 Kontakte ab und lötet sie auf das weiß umrahmte Feld mit der o.g. Beschriftung.&lt;br /&gt;
&lt;br /&gt;
Hier kann man auf INT3-I3 und I2-INT2 je eine Codierbrücke aufstecken, wenn man die Standard-Belegung beibehalten will. Steckt man auf I2-INTU eine Codierbrücke, dann ist INTU des XBUS mit Pin PD3 (I2) der M32 verbunden.&lt;br /&gt;
&lt;br /&gt;
'''Hinweis:''' Man kann auf die 6-polige Stiftleiste auch Codierbrücken QUER zur eigentlichen (horizontalen) Richtung aufsetzen. Dadurch kann jede der 3 Interruptleitungen des XBUS (INT2, INT3, INTU) mit jedem der 2 Interrupt Pins der M32 (PD3, PB2) verbunden werden.&lt;br /&gt;
&lt;br /&gt;
Wenn man keine der Codierbrücken aufsteckt, sind die Pins PD3 (I2) und PB2 (I3) des M32-Prozessors nicht mehr mit dem XBUS verbunden und können anders verwendet werden. Auf der M32 kann man dann z.B. auch andere Verbindungen zum XBUS herstellen, indem man auf die Pins INT2, INT3 oder INTU Kabelverbindungen aufsteckt.&lt;br /&gt;
&lt;br /&gt;
====== ADC0 und ADC1 frei nutzen ======&lt;br /&gt;
Auf der M32 ist ADC0 fest mit dem Mikrofon (MIC) und ADC1 mit den Tastern T1..T5 (KEYPAD) verbunden. Wenn man diese ADC-Eingänge für andere Sensoren benötigt, kann man das Mikrofon und die Taster von den Eingängen abtrennen.&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_M32_MIC_KEY.JPG|thumb|MIC_KEYPAD]]&lt;br /&gt;
&lt;br /&gt;
Man braucht dazu:&lt;br /&gt;
* 1-reihige Stiftleiste RM 2,54mm (z.B. 36-polig 732478)&lt;br /&gt;
* Eine Codierbrücke (z.B. aus Set 742902)&lt;br /&gt;
&lt;br /&gt;
MIC/ADC0:&lt;br /&gt;
Es muss eine kurze Leiterbahn zwischen zwei Lötpunkten aufgetrennt werden, die sich zwischen R2 und C19 befinden (SP1 D4: YM1, YM2). Die Leiterbahn muss mit einem scharfen Messer oder einem speziellen Leiterbahn-Unterbrecher zwischen den beiden Lötpunkten unterbrochen werden. Man sollte anschließend mit einem Widerstandsmeßgerät nachmessen: Es sollte keine Verbindung mehr bestehen. Vorsicht: Nicht R2 beschädigen! Damit ist das Mikrofon auf der M32 ohne Funktion und ADC0 kann anders genutzt werden. ADC0 ist dann am oberen Lötpunkt zwischen R2 und C19 verfügbar, dort müßte eine Kabelverbindung angelötet werden.&lt;br /&gt;
Soll das Mikrofon später doch wieder an ADC0 angeschlossen werden, verbindet man die beiden Lötpunkte zwischen R2 und C19 einfach mit etwas Lötzinn oder mit einem SMD Null Ohm Widerstand.&lt;br /&gt;
&lt;br /&gt;
KEYPAD/ADC1:&lt;br /&gt;
Es muss eine kurze Leiterbahn zwischen zwei Lötpunkten aufgetrennt werden, die sich unterhalb von R15 befinden (SP1 D2: YKP1, YKP2). Die Leiterbahn befindet sich auf der Lötseite der Platine und muss mit einem scharfen Messer oder einem speziellen Leiterbahn-Unterbrecher zwischen den beiden Lötpunkten unterbrochen werden. Man sollte anschließend mit einem Widerstandsmeßgerät nachmessen: Es sollte keine Verbindung mehr bestehen. Jetzt trennt man von der 1-reihigen Stiftleiste 2 Kontakte ab und lötet sie auf die beiden Punkte unterhalb von R15. Hier kann man jetzt eine Codierbrücke aufstecken, wenn man die Taster weiter benutzen will. Wenn die Brücke abgezogen ist, sind die Taster ohne Funktion und ADC1 kann anders genutzt werden. ADC1 ist dann am linken Pin der 2-poligen Stiftleiste unterhalb von R15 verfügbar.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== RP6 CCPRO M128 Platine===&lt;br /&gt;
&lt;br /&gt;
[[Bild:CCPRO M128 k-1-.jpg|Das CCPRO M128]]&lt;br /&gt;
&lt;br /&gt;
====Beschreibung====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Technische Daten====&lt;br /&gt;
{|  {{Blauetabelle}} &lt;br /&gt;
|'''Mikrocontroller:'''&lt;br /&gt;
|Steckplatz für ein C-Control PRO MEGA128 Modul mit einem ATMEGA 128 ([https://www.conrad.de/de/p/c-control-prozessor-unit-mega-128-pro-198219.html 198219])&lt;br /&gt;
|-&lt;br /&gt;
|'''Speicher:'''&lt;br /&gt;
|128 kB [[Flash]]-Speicher, davon 4 kB bereits vom Bootloader belegt&amp;lt;br/&amp;gt;&lt;br /&gt;
4 kB SRAM intern&amp;lt;br/&amp;gt; &lt;br /&gt;
64 kB SRAM extern&amp;lt;br/&amp;gt;&lt;br /&gt;
4 kB [[EEPROM]]&lt;br /&gt;
|-&lt;br /&gt;
|'''Programmierung:'''&lt;br /&gt;
|Über CCPRO-IDE&lt;br /&gt;
|-&lt;br /&gt;
|'''Vorhandene Sensoren:'''&lt;br /&gt;
|1 12bit I²C Temperatursensor &amp;lt;br/&amp;gt;&lt;br /&gt;
19 I/O-Ports, davon 8 ADCs, 3 PWM (Servos) und 2 I/Os für eine weitere serielle Schnittstelle (UART)&lt;br /&gt;
|-&lt;br /&gt;
|'''Vorhandene Aktoren:'''&lt;br /&gt;
|1 Beeper&amp;lt;br/&amp;gt;&lt;br /&gt;
5 Status-LEDs&amp;lt;br/&amp;gt;&lt;br /&gt;
1 LC-Display-Port&amp;lt;br/&amp;gt;&lt;br /&gt;
1 Sockel für ein I²C-Bus EEPROM vom Typ 24(L)Cxxx&lt;br /&gt;
|-&lt;br /&gt;
|'''Abmessungen:'''&lt;br /&gt;
|(L &amp;amp;times; B &amp;amp;times; H) 112 &amp;amp;times; 90 &amp;amp;times; 21 mm&lt;br /&gt;
|-&lt;br /&gt;
|'''Ausführung:'''&lt;br /&gt;
|Fertig aufgebautes Erweiterungsmodul&lt;br /&gt;
|-&lt;br /&gt;
|'''Stromversorgung:'''&lt;br /&gt;
|6 AA NiMH Akkus (über die RP6 Base)&lt;br /&gt;
|-&lt;br /&gt;
|'''Hersteller:'''&lt;br /&gt;
|Arexx Niederlande&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Umbauoptionen====&lt;br /&gt;
Auf der CCPRO M128 ([http://www.conrad.de/ce/de/product/191563/Arexx-RP6-CC-PRO-MEGA128-Erweiterungssatz 191563]) kann leider nicht so viel umgebaut werden:&lt;br /&gt;
&lt;br /&gt;
* I2C-EEPROM&lt;br /&gt;
* Freie Nutzung von PORTA* und PORTC*&lt;br /&gt;
* USRBUS&lt;br /&gt;
* A16-/PD4-Nutzung&lt;br /&gt;
&lt;br /&gt;
Im Text gibt es Verweise auf den Schaltplan der CCPRO M128 (RP6_CCPRO_M128_Schematic.PDF) in der Form: (SP2 B1: Bauteil).  Dies bedeutet, dass man das Bauteil auf Blatt 2 des M128-Schaltplans im Feld B1 finden kann.&lt;br /&gt;
&lt;br /&gt;
Bei den Materialangaben ist öfter die Rede von &amp;quot;Steckbuchsen mit Litze&amp;quot;. Diese Steckbuchsen mit angelöteter Litze können auf die ein- oder zweireihigen Stiftleisten aufgesteckt werden. Leider gibt es sie nicht (mehr) fertig konfektioniert bei CONRAD. Die einreihigen Steckbuchsen (RM 2,54mm) kann man aber z.B. bei [http://www.elv.de/output/controller.aspx ELV] bekommen: 2-polig (68-016635), 3-polig (68-022503) und 5-polig (68-023073). An sie muss man dann noch Litzen in der entsprechenden Länge selbst anlöten.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=====I2C-EEPROM=====&lt;br /&gt;
Zum Einsetzen eines I2C-EEPROMS (IC6; SP2 C1: IC6) braucht man nichts umzubauen. Man kauft einfach ein passendes EEPROM des Typs 24(L)Cxxxx-P und setzt es auf seinen Sockel, Kerbe zum oberen Platinenrand.&lt;br /&gt;
&lt;br /&gt;
Mögliche Typen (erhältlich z.B. bei [http://www.digikey.de/ Digi-Key] oder bei [http://www.reichelt.de./ Reichelt]):&lt;br /&gt;
* AT24C128  (AT24C128-10PU-2.7-ND)&lt;br /&gt;
* AT24C256  (AT24C256-10PU-2.7-ND)&lt;br /&gt;
* AT24C512  (AT24C512-10PU-2.7-ND)&lt;br /&gt;
* AT24C1024 (AT24C1024-10PI-2.7-ND)&lt;br /&gt;
&lt;br /&gt;
=====Anschlüsse=====&lt;br /&gt;
Hier wird aufgelistet, wo man auf der M128 Platine Anschlüsse nutzen kann, um sie z.B. zu weiteren Sensoren, zum USRBUS oder (weniger empfehlenswert!) direkt zu EPs, zur RP6 Base oder zur M32 zu führen. &lt;br /&gt;
&lt;br /&gt;
======Freie Nutzung von PORTA* und PORTC*======&lt;br /&gt;
Um PORTA* und PORTC* frei nutzen zu können (für weitere I/O-Ports), muss man auf das externe SRAM verzichten, was nicht sehr ratsam ist. Mehr I/O-Ports kann man alternativ durch I/O Expander gewinnen. Falls man das SRAM trotzdem deaktivieren will, hier die Anleitung.&lt;br /&gt;
&lt;br /&gt;
Für den Umbau braucht man:&lt;br /&gt;
* Wannenstecker 2x5-polig gerade RM 2,54mm (z.B. [http://www.reichelt.de./ Reichelt] WSL 10G)&lt;br /&gt;
* 1-reihige Stiftleiste RM 2,54mm (z.B. 36-polig 732478)&lt;br /&gt;
* Eine Codierbrücke (z.B. aus Set 742902)&lt;br /&gt;
[[Bild:RP6_M128_PortA.JPG|thumb|PORTA*]]&lt;br /&gt;
&lt;br /&gt;
Für die Bestückung von PORTA* (SP2 AB2: Stecker PORTA*) lötet man den Wannenstecker hier (siehe Abb. PORTA*) auf.&lt;br /&gt;
[[Bild:RP6_M128_PortC.JPG|thumb|PORTC*]]&lt;br /&gt;
&lt;br /&gt;
Für die Bestückung von PORTC* (SP1 A2: PC0..7, YGND1) trennt man von der 1-reihigen Stiftleiste 9 Kontakte ab und lötet sie auf die PORTC*-Lötpunkte (siehe Abb. PORTC*).&lt;br /&gt;
&lt;br /&gt;
Dann muss noch der SRAM-Enable Jumper (SP1 EF1: Y27..29) bestückt werden:&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_M128_EN_SRAM.JPG|EN_SRAM]]&lt;br /&gt;
&lt;br /&gt;
Man trennt von der 1-reihigen Stiftleiste 3 Kontakte ab und lötet sie auf die abgebildeten Lötpunkte. Vorher muss eine Leiterbahn auf der Lötseite der Platine zwischen den ENABLE-Lötpunkten aufgetrennt werden.&lt;br /&gt;
Wenn das SRAM wie bisher genutzt werden soll, steckt man die Codierbrücke auf die Stellung &amp;quot;ENABLE&amp;quot;. Will man stattdessen Port A und Port C frei nutzen (und damit auf SRAM verzichten!), kommt die Codierbrücke auf &amp;quot;DISABLE&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
======USRBUS======&lt;br /&gt;
Auf die 14 Kontakte neben dem Wannenstecker USRBUS2 ist noch nichts gelötet.&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_M128_USRBUS.JPG|thumb|USRBUS]]&lt;br /&gt;
&lt;br /&gt;
Ich würde auf Y1..Y14 eine Stiftleiste löten, damit die USRBUS-Belegung geändert werden kann.&lt;br /&gt;
&lt;br /&gt;
Man braucht dazu:&lt;br /&gt;
* 2-reihige Stiftleiste RM 2,54mm (z.B. 2x36-polig 742007)&lt;br /&gt;
* Einige Steckbuchsen mit Litze&lt;br /&gt;
&lt;br /&gt;
Man trennt von der 2-reihigen Stiftleiste 2x7 Kontakte ab und lötet sie auf die Punkte Y1..Y14 (SP2 E234: Y1..Y14) neben dem Wannenstecker USRBUS2. Wird die M128 über Flachkabel mit einem USRBUS-Stecker auf einer RP6 Experimentierplatine (EP) und/oder mit dem RP6 selbst verbunden, dann hat man mit allen mit dem USRBUS verbundenen Platinen eine direkte 14-polige Verbindung,- eben den &amp;quot;User Bus&amp;quot;. Den kann man dann nutzen, wie man will. Auf der M128 kann man mit Steckbuchsen die Pins Y1..Y14 mit anderen Pins verbinden.&lt;br /&gt;
&lt;br /&gt;
Beispiel: Verbindet man den Pin &amp;quot;ADC4&amp;quot; mit Y1 des USRBUS, dann steht der Eingang ADC4 auf allen an den USRBUS angeschlossenen Platinen an Y1 zur Verfügung. Man braucht also diesen Eingang nicht über ein eigenes Kabel auf eine EP zu führen, sondern kann dazu den USRBUS nehmen. Dadurch bleibt der Gesamtaufbau auf dem RP6 übersichtlich und komplett trennbar (man braucht nur die Stecker XBUS und USRBUS abzuziehen!).&lt;br /&gt;
&lt;br /&gt;
Wichtig: Man sollte gut dokumentieren, wie man den USRBUS am RP6 (vorn und hinten getrennt!), auf EPs und der M128 benutzt! Sonst kann es bei einer anderen Anordnung von EPs zu USRBUS Konflikten/Kurzschlüssen kommen.&lt;br /&gt;
&lt;br /&gt;
======IC5 ALERT======&lt;br /&gt;
[[Bild:RP6_M128_IC5_ALERT.JPG|thumb|IC5 ALERT]]&lt;br /&gt;
Dieser Lötpunkt (SP2 C2: AL) neben IC5 ist der Anschluß ALERT (Pin 3) des I2C-Temperatursensors TCN75A (SP2 C2: IC5).&lt;br /&gt;
&lt;br /&gt;
Dies ist ein Open-Drain Ausgang, der ein Alarm-Signal ausgibt, wenn die Temperatur die eingestellten Grenzen über-/unterschreitet (siehe auch Datenblatt des Sensors (TCN75A.pdf), Abschnitt 5.3.4!). Wenn man ALERT auf einen Eingang des Microcontrollers führen will, muß man auch noch einen Pullup-Widerstand vorsehen oder den internen Pullup des uC-Eingangs aktivieren.&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;
======VDD/GND Anschluß======&lt;br /&gt;
[[Bild:RP6_M128_VDDGND.JPG|thumb|VDD GND]]&lt;br /&gt;
Auf der CCPRO M128 gibt es 2 Lötpunkte (SP1 E34: YVDD3, YGND4) zwischen R5 und C7 bzw. direkt neben der Codierbrücke (SP1 E3: YL9, YL10) zum Deaktivieren von LED5.&lt;br /&gt;
&lt;br /&gt;
Hier könnte man VDD und GND kontaktieren. VDD ist der Lötpunkt, der näher an R5 liegt.&lt;br /&gt;
&lt;br /&gt;
=====Trennstellen=====&lt;br /&gt;
An diesen Stellen können Leiterbahnen unterbrochen werden, um Funktionen zu deaktivieren oder anders zu nutzen. &lt;br /&gt;
&lt;br /&gt;
======A16-/PD4-Nutzung======&lt;br /&gt;
&lt;br /&gt;
[[Bild:v2RP6_M128_A16.JPG|thumb|A16/PD4]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Auf der CCPRO M128 gibt es ein 3-poliges Feld von Lötpunkten (SP2 AB1: PD4, A16, GND) unter dem CCPRO MEGA128 Modul (IC1). Standardmässig ist A16 des SRAM (IC3) hier auf GND gelegt. Damit kann man PD4 des Prozessors (ICP1) frei nutzen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Will man A16 des SRAM mit PD4 schaltbar machen, muss man eine Leiterbahn auf der Bestückungsseite zwischen den oberen zwei der drei Lötpunkte auftrennen und die anderen (unteren) beiden Lötpunkte mit etwas Lötzinn oder einem SMD Null Ohm Widerstand verbinden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der Sinn dieses Umbaus besteht darin, dass man danach anstelle von 64kB nun die vollen 128kB SRAM des IC3 adressieren kann. Man muss dann aber PD4 selbst schalten, da C-Control PRO ab Version 1.50 nur 64kB ext. SRAM ansteuern kann. Immerhin könnte man dann 2 Blöcke à je 64kB nutzen und mit PD4 zwischen beiden Blöcken umschalten.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ob CCPRO damit klar kommt: Wohl kaum! Ich würde daher diesen Umbau nicht durchführen.&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Zubehör und Ersatzteile ==&lt;br /&gt;
Von [http://www.conrad.de/ce/ CONRAD] gibt es z.B. &lt;br /&gt;
&lt;br /&gt;
* das LC- ([http://www.conrad.de/ce/de/product/190911/LC-DISPLAY-16-X-2-KONFEKTIONIERT 190911] AUSVERKAUFT!) oder Backlight-Display ([http://www.conrad.de/ce/de/product/191621/DISPLAY-RP5RP6-BLAU-MIT-BACKLIGHT 191621] AUSVERKAUFT!), welche an die M32, an die CCPRO M128 und an die M256 WiFi angeschlossen werden können,&lt;br /&gt;
* einen IR-Ball ([http://www.conrad.de/ce/de/product/191437/INFRAROT-BALL-FUeR-ROBOTER-FUssBALL 191437] AUSVERKAUFT!),&lt;br /&gt;
* einen Graustufen-Boden-Sensor ([http://www.conrad.de/ce/de/product/191599/GRAUSTUFEN-BODEN-SENSOR-FUeR-FUssBALLROBOT 191599] AUSVERKAUFT!),&lt;br /&gt;
* eine IR-Fernbedienung Promo 8 ([http://www.conrad.de/ce/de/product/340720/PROMO-8-UNIVERSALFERNBEDIENUNG 340720] AUSVERKAUFT!) oder Vivanco UR 89 ([http://www.conrad.de/ce/de/product/351013/VivancoUR-89-Fernbedienung-8-Geraete 351013] AUSVERKAUFT!),&lt;br /&gt;
* Ersatzräder ([http://www.conrad.de/ce/de/product/191307/ANTRIEBSRAD-RP5RP6 191307] AUSVERKAUFT!),&lt;br /&gt;
* Ersatzzahnräder ([http://www.conrad.de/ce/de/product/191346/SCHRAeG-ZAHNRAeDERSATZ-RP5RP6 191346]) und&lt;br /&gt;
* Ersatzraupen ([http://www.conrad.de/ce/de/product/191333/RAUPENSATZ-RP5RP6 191333] AUSVERKAUFT!).&lt;br /&gt;
&lt;br /&gt;
===Displays===&lt;br /&gt;
Die vorkonfektionierten Displays kann man zum Ausgeben von Texten, Sensordaten und kleinen Animationen benutzen. Sie können an die M32, an die CCPRO M128 und an die M256 WiFi angeschlossen werden.&lt;br /&gt;
&lt;br /&gt;
Diese 16x2 Zeichen Displays sind bisher lieferbar:&lt;br /&gt;
&lt;br /&gt;
* LC-Display ([http://www.conrad.de/ce/de/product/190911/LC-DISPLAY-16-X-2-KONFEKTIONIERT 190911])&lt;br /&gt;
* OLED-Display (197622)&lt;br /&gt;
* Backlight-Display AREXX RP-DSP88 ([http://www.conrad.de/ce/de/product/191621/DISPLAY-RP5RP6-BLAU-MIT-BACKLIGHT 191621])&lt;br /&gt;
&lt;br /&gt;
Das LCD ist seit September 2018 bei CONRAD ausverkauft; zeitweise (2007/08) gab es unter dieser Bestellnummer eine Version, die zu klein (66 x 37mm) war, um sie auf der M32, der CCPRO M128 oder der M256 WiFi zu montieren.&lt;br /&gt;
&lt;br /&gt;
Das OLED-Display ist aktuell (April 2012) nicht mehr lieferbar.&lt;br /&gt;
&lt;br /&gt;
Das zuletzt ausschließlich nur noch erhältliche blaufarbige Backlight-Display ist seit Mai 2020 bei CONRAD ausverkauft.&lt;br /&gt;
&lt;br /&gt;
Diese Displays können mit 4 M3-Abstandbolzen 25 mm ([http://www.conrad.de/ce/de/product/526665/Abstandsbolzen1-x-Aussengewinde1-x-InnengewindeMessing-vernickelt-Schluesselweite-55-mm Bestell-Nr. 526665]) und 4 Muttern M3 ([http://www.conrad.de/ce/de/product/815624/TOOLCRAFT-Sechskant-Muttern-DIN-934-934-Stahl-verzinkt-M3-100-St z.B. aus 815624]), sowie 4 Schrauben M3 ([http://www.conrad.de/ce/de/product/815322/TOOLCRAFT-Linsenkopfschrauben-mit-Kreuzschlitz-DIN-7985-7985-6-mm-Stahl-verzinkt-Guete-48-M3-100-St z.B. aus 815322]) auf der M32, der CCPRO M128 oder der M256 WiFi befestigt werden. Leider sind die Befestigungslöcher der Displays zu klein für ein M3-Gewinde, so dass man die Löcher sehr vorsichtig auf 3..3,2 mm erweitern muss.&lt;br /&gt;
&lt;br /&gt;
===IR-Ball===&lt;br /&gt;
Den IR-Ball (AREXX IRB-35, AUSVERKAUFT!) kann man benutzen, um mit dem RP6 Fußball oder Ähnliches zu spielen. Der Ball kann dann von den IR-Sensoren des RP6 erkannt und geortet werden.&lt;br /&gt;
&lt;br /&gt;
===Graustufen-Boden-Sensor===&lt;br /&gt;
Der Graustufen-Boden-Sensor (AREXX ARX-GS7) dient zur Orientierung eines Roboters auf einem Fußballfeld, das in bestimmten Grauabstufungen eingefärbt ist (CONRAD 191404  AUSVERKAUFT!). Dieser Fußballfeld-Aufkleber (AREXX ARX-FF008) ist bei CONRAD und bei [http://www.elv.de ELV] (Artikel-Nummer 68-101831) ausverkauft.&lt;br /&gt;
&lt;br /&gt;
===IR-Fernbedienung===&lt;br /&gt;
[[Bild:RP6_RC.jpg|thumb|2 RC5 Fernbedienungen]]&lt;br /&gt;
Mit einer Universal-IR-Fernbedienung, die den RC5-IR-Code senden kann, kann der RP6 wie ein ferngesteuertes &amp;quot;Auto&amp;quot; verwendet werden. Im Beispielprogramm &amp;quot;Example_08_TV_REMOTE&amp;quot; im Ordner der RP6-Base-Demos wird das noch genauer erläutert.&lt;br /&gt;
&lt;br /&gt;
===Ersatzräder===&lt;br /&gt;
Die Ersatzräder dienen als Ersatzteile für den RP6, RP6v2 und das RP5/RP6-Fahrgestell.&lt;br /&gt;
&lt;br /&gt;
===Ersatzzahnräder===&lt;br /&gt;
Die Ersatzzahnräder dienen als Ersatzteile für den RP6, RP6v2 und das RP5/RP6-Fahrgestell.&lt;br /&gt;
&lt;br /&gt;
===Ersatzraupen===&lt;br /&gt;
Die Ersatzraupen dienen als Ersatzteile für den RP6, RP6v2 und das RP5/RP6-Fahrgestell.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Programmierung==&lt;br /&gt;
Um diesen Grundlagenartikel zum RP6 nicht immer länger werden zu lassen, habe ich den Teil zur Programmierung des [[RP6_-_Programmierung#RP6_Base_und_CONTROL_M32|RP6]] und seiner Erweiterungsplatinen [[RP6_-_Programmierung#RP6_Base_und_CONTROL_M32|RP6 CONTROL M32]] und [[RP6_-_Programmierung#RP6_CCPRO_M128|RP6 CCPRO M128]] ausgelagert: [[RP6 - Programmierung]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==RP6v2==&lt;br /&gt;
Der neue [http://www.conrad.de/ce/de/product/191584/RP6-V2-ROBOTERSYSTEM RP6v2] ist weitgehend identisch mit dem RP6, so dass fast alle Angaben dieses Artikels auch für den RP6v2 zutreffen.&lt;br /&gt;
Für vom RP6 abweichende Details des RP6v2 und für dessen zukünftige Erweiterungsplatinen (z.B. das aktuell [http://www.arexx.com/forum/viewtopic.php?f=19&amp;amp;t=1797 hier] angekündigte Erweiterung-Modul [[RP6v2#RP6v2_M256_WiFi_Platine|RP6v2 M256 WiFi]]) gibt es einen eigenen Grundlagenartikel: [[RP6v2]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==RP6 Sensor Board und Xtra Module==&lt;br /&gt;
Einen eigenen Artikel gibt es auch für das [[RP6_Sensor_Board_und_Xtra_Module#RP6_Sensor_Board_2|RP6 Sensor Board]] und für die [[RP6_Sensor_Board_und_Xtra_Module#RP6_Xtra_Module_2|Xtra Module]]: [[RP6_Sensor_Board_und_Xtra_Module|RP6 Sensor Board und Xtra Module]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Erfahrungsberichte==&lt;br /&gt;
&lt;br /&gt;
...in Arbeit...(kann aber gerne ergänzt werden)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Siehe auch==&lt;br /&gt;
* [[RP6 - Programmierung]]&lt;br /&gt;
* [[RP6v2]]&lt;br /&gt;
* [[RP6_Sensor_Board_und_Xtra_Module]]&lt;br /&gt;
* [[RP6_Kamera_-_Mitmach-Projekt]]&lt;br /&gt;
* [[RP6v2_I2C-Portexpander]]&lt;br /&gt;
* [[RP6v2 USB-RS232-Adapter]]&lt;br /&gt;
* [[RP6v2 Orientierung]]&lt;br /&gt;
* [[RP6 Multi IO Projekt]]&lt;br /&gt;
* [[RP6 Multi IO Projekt - Software]]&lt;br /&gt;
* [[RP6 ArduIO]]&lt;br /&gt;
* [[RP6 ArduIO - Software]]&lt;br /&gt;
* [[Induktive_Ladestation_f%C3%BCr_den_RP6|Induktive Ladestation für den RP6]]&lt;br /&gt;
* [[IR-bake_f%C3%BCr_den_RP6|IR-bake für den RP6]]&lt;br /&gt;
* [[CCRP5]]&lt;br /&gt;
* [[Wild Thumper]]&lt;br /&gt;
* [[Wild Thumper - Programmierung]]&lt;br /&gt;
* [[Yeti]]&lt;br /&gt;
* [[Asuro]]&lt;br /&gt;
* [[C't-Bot]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Weblinks==&lt;br /&gt;
'''Siehe auch die Weblinks im [http://www.rn-wissen.de/index.php/RP6v2#Weblinks RP6v2 Artikel]!'''&lt;br /&gt;
&lt;br /&gt;
* [http://www.pcwelt.de/start/gaming_fun/gadgets/news/84558/ PC-Welt-Artikel]&lt;br /&gt;
&lt;br /&gt;
* Ankündigung des RP6 und der RP6 CONTROL M32 im [http://www.arexx.com/forum/viewtopic.php?t=370 AREXX Support Forum]&lt;br /&gt;
* Ankündigung der RP6 CCPRO M128 im [http://www.arexx.com/forum/viewtopic.php?f=19&amp;amp;t=834&amp;amp;start=0 AREXX Support Forum] und im [http://www.roboternetz.de/community/threads/42228-RP6-C-Control-PRO-MEGA128-Erweiterungsmodul-Website-online RoboterNETZ]&lt;br /&gt;
* Ankündigung des RP6v2 im [http://www.roboternetz.de/community/threads/56964-NEWS-RP6v2-die-neue-Version-2-des-RP6-Robot-Systems RoboterNETZ] und im [http://www.arexx.com/forum/viewtopic.php?f=19&amp;amp;t=1778 AREXX Support Forum]&lt;br /&gt;
* Ankündigung der RP6v2 M256 WiFi im [http://www.arexx.com/forum/viewtopic.php?f=19&amp;amp;t=1797 AREXX Support Forum]&lt;br /&gt;
* [http://www.arexx.com/rp6 AREXX RP6 Startseite]&lt;br /&gt;
* [http://www.arexx.com/forum/viewforum.php?f=19 AREXX Support Forum]&lt;br /&gt;
* [http://www.arexx.com/rp6/html/de/soft_doc_ccpro.htm AREXX CCPRO M128 Seite]&lt;br /&gt;
&lt;br /&gt;
* [http://www.conrad.de/ce/de/product/191524/RP6-ROBOTERSYSTEM RP6 bei CONRAD]&lt;br /&gt;
* [http://www.conrad.de/ce/de/product/191584/RP6-V2-ROBOTERSYSTEM RP6v2 bei CONRAD]&lt;br /&gt;
* [http://www.conrad.de/ce/de/product/191550/RP6-MEGA32-ERWEITERUNGSSATZ RP6 CONTROL M32 bei CONRAD]&lt;br /&gt;
* [http://www.conrad.de/ce/de/product/191563/RP6-CC-PRO-MEGA128-ERWEITERUNGSSATZ RP6 CCPRO M128 bei CONRAD]&lt;br /&gt;
* [http://www.c-control.de/c-control-pro/c-control-pro/startseite_c-control-pro.html C-Control PRO Startseite]&lt;br /&gt;
* [http://ccpro.cc2net.de/forum/ C-Control PRO Forum]&lt;br /&gt;
&lt;br /&gt;
* [http://www.roboternetz.de/phpBB2/viewforum.php?f=49 Roboternetz RP6 Forum]&lt;br /&gt;
* &amp;quot;Geburt&amp;quot; des Wiki im RN-Forum: [http://www.roboternetz.de/community/threads/32793-RP6-Wiki-Artikel RP6-Wiki-Artikel]&lt;br /&gt;
* Henkessoft: [http://www.henkessoft.de/Roboter/rp6.htm RP6]&lt;br /&gt;
* PIC-PROJEKTE Wiki: [http://pic-projekte.de/wiki/index.php?title=RP6  RP6]&lt;br /&gt;
* benhup.com: [http://www.benhup.com/?mf=eduntech&amp;amp;sf=rp6 Arexx RP6 Robot (with ATmega32 chip)]&lt;br /&gt;
* RP6 &amp;quot;Panzer&amp;quot;: [http://www.roboternetz.de/community/threads/57171-mein-(Heng-Long)-RP6 Heng-Long-RP6]&lt;br /&gt;
&lt;br /&gt;
* [http://www.youtube.com/results?search_query=rp6 RP6 Videos]&lt;br /&gt;
* [http://de-de.facebook.com/pages/Robby-RP6/155118711202285 facebook]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Robotikeinstieg]]	 &lt;br /&gt;
[[Kategorie:Praxis]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Autoren==&lt;br /&gt;
--[http://www.roboternetz.de/community/members/24729-sloti sloti] 22:23, 29. Dez 2007 (CET)&lt;br /&gt;
&lt;br /&gt;
--[http://www.roboternetz.de/community/members/44891-Tobias1 Tobias1] 18:30, 6. Apr 2010 (CET)&lt;br /&gt;
&lt;br /&gt;
--[http://www.roboternetz.de/community/members/1972-Dirk Dirk] 12:51, 23. Okt 2020 (CET)&lt;/div&gt;</summary>
		<author><name>Dirk NO2</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=RP6&amp;diff=28572</id>
		<title>RP6</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=RP6&amp;diff=28572"/>
				<updated>2022-03-31T08:48:29Z</updated>
		
		<summary type="html">&lt;p&gt;Dirk NO2: /* Technische Daten */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Bild:RP6_2.jpg|RP6 Base Roboter|right|500px]]&lt;br /&gt;
==Was bisher geschah==&lt;br /&gt;
Fre, 08. Jun 2007 - Ankündigung des RP6 und der RP6 CONTROL M32&amp;lt;br/&amp;gt;&lt;br /&gt;
Mon, 02. Jul 2007 23:00 - Benachrichtigung der Tester&amp;lt;br/&amp;gt;&lt;br /&gt;
Die, 03. Jul 2007 15:00 - Bereitstellung der Dokumentation&amp;lt;br/&amp;gt;&lt;br /&gt;
Don, 05. Jul 2007 14:30 - Bereitstellung der Schaltungsunterlagen&amp;lt;br/&amp;gt;&lt;br /&gt;
Son, 08. Jul 2007 16:00 - Nachricht über den Versand der RP6&amp;lt;br/&amp;gt;&lt;br /&gt;
Mon, 09. Jul 2007 00:15 - Bereitstellung der Library und der Beispielprogramme&amp;lt;br/&amp;gt;&lt;br /&gt;
Die, 10. Jul 2007 - Eintreffen der RP6 bei den Testern&amp;lt;br/&amp;gt;&lt;br /&gt;
Mon, 16. Jul 2007 - Auslieferungsbeginn des RP6&amp;lt;br/&amp;gt;&lt;br /&gt;
Fre, 24. Apr 2009 - Ankündigung der RP6 CCPRO M128 (Auslieferung schon ab Mitte April 2009)&amp;lt;br/&amp;gt;&lt;br /&gt;
Mon, 27. Feb 2012 - Ankündigung des RP6v2&amp;lt;br/&amp;gt;&lt;br /&gt;
Don, 08. Mär 2012 - Auslieferungsbeginn des RP6v2&amp;lt;br/&amp;gt;&lt;br /&gt;
Sam, 17. Mär 2012 - Ankündigung der RP6v2 M256 WiFi&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Siehe auch &amp;quot;Was bisher geschah&amp;quot; im [http://www.rn-wissen.de/index.php/RP6v2#Was_bisher_geschah RP6v2 Artikel]!'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Allgemein==  &lt;br /&gt;
[[Bild:DSC03448.JPG|thumb|RP6 mit Erweiterungsboard]] [[Bild:RP6_Lieferumfang.jpg|thumb|RP6 im Lieferumfang]]&lt;br /&gt;
Der von Arexx entwickelte RP6 ([http://www.conrad.de/ce/de/product/191524/C-Control-Robot-System-RP6-Robotersystem 191524]) ist ein autonomes Raupenfahrzeug, das nicht nur für Schüler und Studenten zum Einstieg in das Gebiet Robotik sondern auch für Fortgeschrittene Elektroniker und Bastler sehr gut geeignet ist, da das System für selbstentworfene Erweiterungen ausgelegt ist. Der RP6 wird von einem, unter Roboterentwicklern beliebten, AVR Microcontroller von Atmel gesteuert und hat Lichtsensoren in Form von zwei LDRs, 2 Bumper an der Stoßstange, 6 Status LEDs, Sensoren zur Überwachung der Akkuspannung, Drehgeber mit 625 CPR, ein Infrarot Sensor zur Hinderniserkennung und Kommunikation und Motorstromsensoren zur Verfügung. Zudem liegt dem Roboter eine umfangreiche Anleitung, inklusive einem kleinen C-Crashkurs, ein USB-Interface zum Anschluss an den PC und ein USB Kabel bei.&lt;br /&gt;
&lt;br /&gt;
In diesem Artikel geht es um die Grundlagen des RP6. Zur Programmierung des RP6 gibt es eine eigene Seite: [[RP6 - Programmierung]]&lt;br /&gt;
&lt;br /&gt;
==Technische Daten==&lt;br /&gt;
{|  {{Blauetabelle}} &lt;br /&gt;
|'''Mikrocontroller:'''&lt;br /&gt;
|AVR [[ATmega32]]&lt;br /&gt;
|-&lt;br /&gt;
|'''Speicher:'''&lt;br /&gt;
|32 kB [[Flash]]-Speicher, davon 1 kB bereits vom Bootloader belegt&amp;lt;br/&amp;gt;&lt;br /&gt;
2 kB RAM&amp;lt;br/&amp;gt; &lt;br /&gt;
1 kB [[EEPROM]]&lt;br /&gt;
|-&lt;br /&gt;
|'''Programmierung:'''&lt;br /&gt;
|Über AVR-[[Bootloader]], belegt ca. 1 kB des Flash-Speichers&lt;br /&gt;
|-&lt;br /&gt;
|'''Vorhandene Sensoren:'''&lt;br /&gt;
|2 [[Sensorarten#Helligkeit|Lichtsensoren (LDR)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
1 [[Sensorarten#Helligkeit|Infrarot (ACS - Anti Collision System)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
2 [[Sensorarten#Bumpers|Bumper]] &amp;lt;br/&amp;gt; &lt;br /&gt;
2 [[Sensorarten#Incremental-Geber|Drehgeber (Encoder)]]&lt;br /&gt;
|-&lt;br /&gt;
|'''Vorhandene Aktoren:'''&lt;br /&gt;
|2 Motoren&amp;lt;br/&amp;gt;&lt;br /&gt;
6 Status-LEDs&amp;lt;br/&amp;gt;&lt;br /&gt;
1 IR-Sender&amp;lt;br/&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|'''Abmessungen:'''&lt;br /&gt;
|(L &amp;amp;times; B &amp;amp;times; H) 172 &amp;amp;times; 128 &amp;amp;times; 50 mm&lt;br /&gt;
|-&lt;br /&gt;
|'''Ausführung:'''&lt;br /&gt;
|Fertig aufgebauter Roboter&lt;br /&gt;
|-&lt;br /&gt;
|'''Stromversorgung:'''&lt;br /&gt;
|6 AA NiMH Akkus&lt;br /&gt;
|-&lt;br /&gt;
|'''Hersteller:'''&lt;br /&gt;
|Arexx Niederlande&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Mechanik==&lt;br /&gt;
===Beschreibung===&lt;br /&gt;
&lt;br /&gt;
===Sensoren===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Encoder====&lt;br /&gt;
&lt;br /&gt;
Die Drehgeber sind an den Getrieben der Motoren zur Drehzahlmessung angebracht. Es handelt sich dabei um Reflexlichtschranken, die auf Codierscheiben mit je 18 weissen und 18 schwarzen Segmenten ausgerichtet sind, also insgesamt 36 Segmente. Diese Codierscheiben sind wiederum an je eines der Zahnräder der beiden Getriebe geklebt worden. Wenn es sich dreht, wandern die einzelnen Segmente an der Reflexlichtschranke vorbei. Die weissen Segmente reflektieren das Infrarotlicht, die schwarzen Segmente nur wenig. Jedes der zwei mittleren Stufenzahnräder des Getriebes hat 50 Zähne auf dem großen, und 12 auf dem kleineren Zahnrad. Die Codierscheiben befinden sich auf dem Zahnrad neben dem Motor, also rechnet man:&lt;br /&gt;
50/12 * 50/12 =17.13/36; 17.13/36 * 36=625&lt;br /&gt;
Daher haben die Encoderscheiben auch Ihre 36 Segmente, denn das gibt eine schöne runde Zahl ohne gebrochenen Anteil. Die Drehgeber erzeugen also 625 Flanken pro Radumdrehung wobei jede Flanke einem Segment entspricht. Bei einem Raddurchmesser von ca. 50mm inkl. Raupenkette, ergibt sich rein rechnerisch ein Radumfang von ca. 157mm was 0.2512mm pro Zählschritt der Drehgeber entspricht. Da sich die Raupenketten aber fast immer etwas in den Untergrund eindrücken (bzw. auch selbst eingedrückt werden) kann man aber von 0.25mm pro Zählschritt ausgehen – meist ist es sogar etwas weniger, z.B. nur 0.24 oder 0.23mm. Das muss man durch abfahren von Teststrecken ermitteln, wie es im Anhang grob beschrieben ist. Sehr genau ist das allerdings durch Radschlupf (bzw. hier müssten wir eigentlich von „Kettenschlupf“ sprechen) und ähnlichen Dingen nicht - vor allem beim Rotieren auf der Stelle. Beim normalen Geradeausfahren ist dieser Fehler klein, aber beim Rotieren kann er schnell sehr große Werte annehmen! Abweichungen muss man evtl. durch weitere Tests ermitteln und mit einkalkulieren. Das ist bei Raupenantrieben leider so – auch bei viel teureren und hochwertigeren Robotern. Dafür hat man aber den Vorteil, dass der Roboter mit Raupenantrieb recht geländegängig ist im Vergleich zu Robotern mit normalem Differentialantrieb mit zwei Antriebsrädern und Stützrad. Kleinere Hindernisse und Rampen kann er meist problemlos überwinden.&lt;br /&gt;
Dabei sind die Encoder sehr nützlich, denn man kann die Geschwindigkeit gut einregeln, egal wie der Untergrund und die Motorbelastung gerade aussieht. Bei gemessenen 50 Segmenten pro Sekunde liegt die Geschwindigkeit bei 1.25 cm/s, sofern wir von 0.25mm pro Zählschritt ausgehen. Etwa 50 Segmente pro Sekunde ist auch die geringste gerade noch regelbare Geschwindigkeit (das variiert aber etwas von Roboter zu Roboter). Bei 1200 Segmenten pro Sekunde wären es die maximal möglichen 30 cm/s (bei 0.25mm Auflösung, bei 0.23 sind es 27.6 cm/s). Standardmäßig begrenzt die Funktionsbibliothek das aber auf 1000 Flanken pro Sekunde. Die maximale Geschwindigkeit ist vom Ladezustand der Akkus abhängig – daher wären 30cm/s nicht besonders lange haltbar. Außerdem erhöht sich die Lebensdauer der Getriebe und Motoren je langsamer man fährt! Wenn der Roboter 4000 Segmente gezählt hat, ist er übrigens etwa einen Meter weit gefahren. Aber wie schon gesagt, gilt das natürlich nur für genau 0.25mm Auflösung. Ohne Kalibrierung hat man hier immer mehr oder weniger starke Abweichungen. Wem es nicht auf jeden mm ankommt, braucht nichts zu kalibrieren und kann einfach von 0.25mm oder besser 0.24mm ausgehen!&lt;br /&gt;
&lt;br /&gt;
====Stoßstangensensoren====&lt;br /&gt;
&lt;br /&gt;
Vorn am Roboter sind zwei Mikroschalter mit langem Schalthebel auf einer separaten&lt;br /&gt;
Platine untergebracht, die etwas vor der anderen Sensorplatine liegt. Dadurch werden&lt;br /&gt;
die IR LEDs auf der Sensorplatine geschützt und können nicht so leicht verbiegen&lt;br /&gt;
wenn der Roboter mal gegen ein Hindernis fährt. Die Stoßstange kann man auch abmontieren und z.B. gegen eine Schuss- oder Sammelvorrichtung für Bälle o.ä. ersetzen wenn man möchte.&lt;br /&gt;
&lt;br /&gt;
====Lichtsensoren====&lt;br /&gt;
&lt;br /&gt;
Vorne auf der kleinen Sensorplatine des Roboters sind zwei sog.&lt;br /&gt;
LDRs (=&amp;quot;Light Dependant Resistors&amp;quot; also lichtabhängige Widerstände)&lt;br /&gt;
platziert und nach links bzw. rechts ausgerichtet. Zwischen&lt;br /&gt;
den beiden Sensoren ist noch eine kleine schwarze&lt;br /&gt;
„Trennwand“ damit das Licht aus einer Richtung möglichst nur&lt;br /&gt;
einen der Sensoren erreicht. Sie bilden zusammen mit je einem&lt;br /&gt;
normalen Widerstand wie beim Batteriesensor einen Spannungsteiler – hier allerdings&lt;br /&gt;
um das Umgebungslicht zu messen.&lt;br /&gt;
&lt;br /&gt;
====Anti Collision System====&lt;br /&gt;
&lt;br /&gt;
Der aus Softwaresicht komplexeste Sensor des RP6 ist das ACS - das&lt;br /&gt;
„Anti Collision System“ (engl. für Anti Kollisions System)! Es besteht&lt;br /&gt;
aus einem IR Empfänger (s. Abb.) und zwei vorne auf der Sensorplatine&lt;br /&gt;
links und rechts angebrachten IR LEDs.&lt;br /&gt;
Da es je eine IR LED links und rechts gibt, kann das ACS grob unterscheiden ob sich&lt;br /&gt;
das Objekt links, rechts oder mittig vor dem Roboter befindet.&lt;br /&gt;
Man kann zusätzlich noch die Stromstärke mit der die beiden IR LEDs gepulst werden&lt;br /&gt;
in drei Stufen einstellen. Das ACS funktioniert aber auch in der höchsten Stufe nicht&lt;br /&gt;
mit allen Objekten immer zuverlässig, denn es kommt auf die Beschaffenheit der&lt;br /&gt;
Oberfläche des jeweiligen Objekts an! Ein schwarzes Objekt reflektiert das IR Licht natürlich&lt;br /&gt;
viel schlechter als ein weisses Objekt und ein kantiges und spiegelndes Objekt&lt;br /&gt;
könnte das IR Licht hauptsächlich in eine bestimme Richtung reflektieren. Die Reichweite&lt;br /&gt;
ist also immer vom jeweiligen Objekt abhängig! Das ist eine prinzipielle Schwäche&lt;br /&gt;
von so gut wie allen IR Sensoren (jedenfalls in dieser Preisklasse).&lt;br /&gt;
Trotzdem werden die meisten Hindernisse zuverlässig erkannt und können umfahren&lt;br /&gt;
werden. Falls das mal nicht klappt, gibt es noch die Stoßstange mit den Tastsensoren&lt;br /&gt;
und falls auch die nicht richtig getroffen werden, kann der Roboter noch mit den Motorstromsensoren&lt;br /&gt;
oder den Encodern erkennen, ob die Motoren blockieren (s.u.)!&lt;br /&gt;
Wem das nicht reicht, der könnte zusätzlich z.B. noch Ultraschallsensoren anbringen...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Erweiterungssystem===&lt;br /&gt;
Auf dem Mainboard sind 22 freie 3,2mm Löcher vorhanden (im Chassis weitere 16), auf denen die Erweiterungsmodule symmetrisch vorne und hinten gestapelt werden können. Weil der Stromverbrauch durch mehr Module steigt, ist es sinnvoll nur insgesamt 6-8 Module auf dem Roboter zu stapeln. Auf dem Mainboard selbst sind noch 6 kleine Erweiterungsflächen verfügbar (plus 2 sehr kleine auf der Bumperplatine).&lt;br /&gt;
&lt;br /&gt;
===Antrieb===&lt;br /&gt;
&lt;br /&gt;
Die 7,2 VDC Motoren sind im Chassis eingebaut und werden mithilfe der H-Brücken gesteuert. Die maximale Geschwindigkeit liegt bei 25cm/s, das kann je nach Akkuspannung aber variieren. Ohne Softwarebegrenzung sind sogar 30cm/s möglich, dadurch verringert sich aber die Lebensdauer der Motoren. Die maximale Steigung, die der RP6 bewältigen kann, ist 30%, ohne Bumperplatine 40%, das hängt aber auch vom Untergrund ab. Kleine Hindernisse wie Bücher und Stifte kann der RP6 problemlos überqueren. Die Achsen der Räder sind in selbstschmierenden Sinterlagern mit 4mm Durchmesser gelagert.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Elektromechanik==&lt;br /&gt;
===Beschreibung===&lt;br /&gt;
===Odometrie===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Elektronik==&lt;br /&gt;
[[Bild:RP6 Block.jpg|thumb|Blockdiagramm]]&lt;br /&gt;
===Beschreibung===&lt;br /&gt;
&lt;br /&gt;
===Sensoren (SENSORS)===&lt;br /&gt;
&lt;br /&gt;
Die meisten Sensoren über die der Roboter verfügt, haben wir ja schon in anderen Abschnitten kurz genannt, wollen diese nun aber etwas detaillierter betrachten.&lt;br /&gt;
In dem Blockdiagramm sind einige der Sensoren nicht in dem blauen Bereich &amp;quot;Sensors&amp;quot; zu sehen, weil sie besser in andere Bereiche passen. Trotzdem zählen natürlich auch die Drehgeber (= “Encoder“), Motorstromsensoren und der Batteriespannungssensor zu den Sensoren und werden darum in diesem Abschnitt beschrieben!&lt;br /&gt;
&lt;br /&gt;
====Batteriespannungs-Sensor (Voltage Sensor)====&lt;br /&gt;
&lt;br /&gt;
Dieser &amp;quot;Sensor&amp;quot; ist eigentlich nur ein einfacher Spannungsteiler aus zwei Widerständen. Wir gehen davon aus, dass die Batterien insgesamt maximal 10V liefern können. 6 NiMH Akkus werden immer unterhalb davon bleiben. Die Referenzspannung des ADC, also die Spannung mit der er die gemessene Spannung vergleicht, beträgt 5V. Da auch die Betriebsspannung 5V beträgt, darf diese nicht überschritten werden. Also müssen wir die zu messende Spannung um die Hälfte herabsetzen! Dies geschieht über einen Spannungsteiler aus zwei Widerständen, der die Spannung an den Messbereich des ADCs anpasst. Der ADC löst mit 10 Bit auf (Wertebereich 0 bis 1023), was eine Auflösung von 10V/1024=9.765625mV ergibt. Ein Messwert von 512 entspricht hier also 5V und 1023 wären ungefähr 10V! Diese Grenzwerte sollten aber normalerweise nie erreicht werden! Das ist nicht besonders genau, da die Widerstände keineswegs Präzisionswiderstände sind. Abweichungen von einigen Prozent nach oben und unten sind möglich. Auch die Referenzspannung von 5V ist nicht ganz genau und kann bei normaler Belastung etwas variieren. Das stört hier nicht, denn wir brauchen ohnehin nur einen ungefähren Wert um festzustellen ob die Batterien sich langsam dem Ende nähern. Wer die Spannung genau messen will, braucht ein Multimeter um den Messfehler zu ermitteln und diesen dann in Software auszugleichen. Wenn man mit Fehlern leben kann, kann man die Spannung dank des günstigen Umrechnungsverhältnisses sogar direkt aus den ADC Werten ungefähr abschätzen: 720 entsprechen dann grob 7.2V, 700 etwa 7V und 650 wären etwa 6.5V. Bei einem konstanten Wert unter 560 kann man davon ausgehen, dass die Akkus fast leer sind.&lt;br /&gt;
&lt;br /&gt;
====Motorstrom====&lt;br /&gt;
[[Bild:RP6_MSS.jpg|thumb]]&lt;br /&gt;
Es befinden sich zwei Leistungswiderstände in den beiden Motorstromkreisen. Aus dem Ohm'schen Gesetz U=RxI folgt, dass sich die Spannung die an einem bestimmten Widerstand abfällt, proportional zum Strom verhält, der diesen durchfließt!&lt;br /&gt;
Damit die Spannungsabfälle an den Widerständen nicht zu groß werden, müssen die Widerstände klein gewählt werden. In unserem Fall haben Sie einen Wert von 0.1 Ohm&lt;br /&gt;
Die abfallende Spannung ist also nur sehr klein (0.1V bei einem Strom von 1A) und muss verstärkt werden bevor sie mit dem ADC gemessen werden kann. Das erledigt jeweils ein sog. Operationsverstärker (OPV). In der Schaltung des RP6 wird je Motorkanal ein OPV verwendet. Der Messbereich geht etwa bis 1.8A. Bei 1.8A fallen etwa 0.18V am Widerstand ab und es ergibt sich am Ausgang des OPV eine Spannung von etwa 4V. Mehr kann der verwendete OPV bei 5V Betriebsspannung nicht ausgeben:&lt;br /&gt;
&lt;br /&gt;
I = U / ((1 + (100k / 4,7k)) * 0,1)&lt;br /&gt;
&lt;br /&gt;
Die Leistungswiderstände haben eine Toleranz von 10%, die Widerstände am OPV 5%, also ist das alles nur sehr ungenau (Ungenauigkeiten im Bereich von etwa 270mA sind möglich wenn man die Sensoren nicht kalibriert!). Wir brauchen allerdings auch nur den ungefähren Wert um festzustellen ob die Motoren stark oder wenig belastet werden. So kann der Roboter gut blockierte oder gar defekte Motoren bzw. Drehgeber erkennen! Die DC-Motoren benötigen mehr Strom je stärker sie belastet werden (Drehmoment) und somit steigt der Strom sehr stark an wenn die Motoren blockiert sind. Das wird von der Robotersoftware zur Notabschaltung verwendet: wenn die Motoren dauerhaft mit hohem Strom betrieben würden, könnten diese sehr heiß werden und dadurch Schaden nehmen! Und wenn die Encoder mal ausfallen sollten – aus welchem Grund auch immer – kann auch das damit erkannt werden. Man würde dann eine Drehzahl von 0 messen. Lässt man die Motoren aber auf voller Kraft laufen und der Strom bleibt trotzdem klein (also sind die Ketten nicht blockiert!), kann man genau daraus schließen, dass entweder die Encoder, oder die Motoren ausgefallen sind (oder Encoder und Motorstromsensoren nicht funktionieren... das passiert z.B. wenn man vergessen hat diese vorher per Software einzuschalten).&lt;br /&gt;
&lt;br /&gt;
====Encoder====&lt;br /&gt;
[[Bild:RP6_ENCODER.jpg|thumb]]&lt;br /&gt;
Ganz anders als die letztgenannten Sensoren funktionieren die Drehgeber, die an den Getrieben der Motoren zur Drehzahlmessung angebracht sind. Es handelt sich dabei um Reflexlichtschranken, die auf Codierscheiben mit je 18 weissen und 18 schwarzen Segmenten ausgerichtet sind, also insgesamt 36 Segmente (s. Abb). Diese Codierscheiben sind wiederum an je eines der Zahnräder der beiden Getriebe geklebt worden. Wenn es sich dreht, wandern die einzelnen Segmente an der Reflexlichtschranke vorbei. Die weissen Segmente reflektieren das Infrarotlicht, die schwarzen Segmente nur wenig. Die Drehgeber erzeugen so zwar auch wie die anderen Sensoren ein analoges Signal, aber es wird digital interpretiert. Zunächst wird das Signal verstärkt und anschließend über einen sog. Schmitt Trigger in ein Rechtecksignal umgewandelt. Die Flanken dieses Signals, also die Wechsel von 5 auf 0V und umgekehrt, lösen jeweils ein Interrupt Ereignis aus und diese werden dann von der Software gezählt. So kann die zurückgelegte Wegstrecke gemessen und zusammen mit einem Timer zur Zeitmessung die Drehzahl und damit auch die Geschwindigkeit ermittelt werden. Die Ermittlung der Drehzahl ist auch Hauptanwendung der Encoder – nur mit den Encodern kann man die Drehzahl auf den gewünschten Sollwert einregeln. Ohne Regelung wäre die Drehzahl nämlich von der Akkuspannung, Belastung der Motoren usw. abhängig. Die hohe Auflösung ermöglicht es dabei, auch niedrige Geschwindigkeiten noch relativ genau einzuregeln. Jedes der zwei mittleren Stufenzahnräder des Getriebes hat 50 Zähne auf dem großen, und 12 auf dem kleineren Zahnrad (s. Abb). Die Codierscheiben befinden sich auf dem Zahnrad neben dem Motor, also rechnet man:&lt;br /&gt;
&lt;br /&gt;
50/12 * 50/12 =17.13/36; 17.13/36 * 36=625&lt;br /&gt;
&lt;br /&gt;
Daher haben die Encoderscheiben auch Ihre 36 Segmente, denn das gibt eine schöne runde Zahl ohne gebrochenen Anteil. Die Drehgeber erzeugen also 625 Flanken pro Radumdrehung wobei jede Flanke einem Segment entspricht. Bei einem Raddurchmesser von ca. 50mm inkl. Raupenkette, ergibt sich rein rechnerisch ein Radumfang von ca. 157mm was 0.2512mm pro Zählschritt der Drehgeber entspricht. Da sich die Raupenketten aber fast immer etwas in den Untergrund eindrücken (bzw. auch selbst eingedrückt werden) kann man aber von 0.25mm pro Zählschritt ausgehen – meist ist es sogar etwas weniger, z.B. nur 0.24 oder 0.23mm. Das muss man durch abfahren von Teststrecken ermitteln, wie es im Anhang grob beschrieben ist. Sehr genau ist das allerdings durch Radschlupf (bzw. hier müssten wir eigentlich von „Kettenschlupf“ sprechen) und ähnlichen Dingen nicht - vor allem beim Rotieren auf der Stelle. Beim normalen Geradeausfahren ist dieser Fehler klein, aber beim Rotieren kann er schnell sehr große Werte annehmen! Abweichungen muss man evtl. durch weitere Tests ermitteln und mit einkalkulieren. Das ist bei Raupenantrieben leider so – auch bei viel teureren und hochwertigeren Robotern. Dafür hat man aber den Vorteil, dass der Roboter mit Raupenantrieb recht geländegängig ist im Vergleich zu Robotern mit normalem Differentialantrieb mit zwei Antriebsrädern und Stützrad. Kleinere Hindernisse und Rampen kann er meist problemlos überwinden.&lt;br /&gt;
Dabei sind die Encoder sehr nützlich, denn man kann die Geschwindigkeit gut einregeln, egal wie der Untergrund und die Motorbelastung gerade aussieht. Bei gemessenen 50 Segmenten pro Sekunde liegt die Geschwindigkeit bei 1.25 cm/s, sofern wir von 0.25mm pro Zählschritt ausgehen. Etwa 50 Segmente pro Sekunde ist auch die geringste gerade noch regelbare Geschwindigkeit (das variiert aber etwas von Roboter zu Roboter). Bei 1200 Segmenten pro Sekunde wären es die maximal möglichen 30 cm/s (bei 0.25mm Auflösung, bei 0.23 sind es 27.6 cm/s). Standardmäßig begrenzt die Funktionsbibliothek das aber auf 1000 Flanken pro Sekunde. Die maximale Geschwindigkeit ist vom Ladezustand der Akkus abhängig – daher wären 30cm/s nicht besonders lange haltbar. Außerdem erhöht sich die Lebensdauer der Getriebe und Motoren je langsamer man fährt!&lt;br /&gt;
&lt;br /&gt;
=====Encoder justieren=====&lt;br /&gt;
Damit der RP6 die Signale der Drehgeber richtig auswerten kann, muss man evtl. die Drehgeber einmalig justieren. Dies kann auch schon bei einem neu gekauften RP6 notwendig sein.&lt;br /&gt;
Eine genaue Anleitung dazu findet man [http://www.arexx.com/rp6/downloads/RP6_ENCODER_DE_20071219.zip hier]. Es gibt auch ein [http://www.arexx.com/rp6/downloads/rp6_encoder_video.zip Video], das die Drehgeber-Justierung zeigt.&lt;br /&gt;
&lt;br /&gt;
=====Encoder kalibrieren=====&lt;br /&gt;
Wenn der Roboter 4000 Segmente gezählt hat, ist er etwa einen Meter weit gefahren. Aber wie schon gesagt, gilt das natürlich nur für genau 0.25mm Auflösung. Ohne Kalibrierung hat man hier immer mehr oder weniger starke Abweichungen. Wem es nicht auf jeden mm ankommt, braucht nichts zu kalibrieren und kann einfach von 0.25mm oder besser 0.24mm ausgehen!&lt;br /&gt;
Optimal ist es, wenn man sich für Weg- und Winkelmessungen nicht auf die Encoder Daten stützen muss, sondern externe Systeme wie Infrarotbaken oder einen genauen elektronischen Kompass dazu zur Verfügung hat.&lt;br /&gt;
&lt;br /&gt;
Will man die Drehgeber des RP6 dennoch kalibrieren, kann man ihn z.B. mit diesem Testprogramm:&lt;br /&gt;
&amp;lt;pre&amp;gt;#include &amp;quot;RP6RobotBaseLib.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
	initRobotBase();&lt;br /&gt;
	powerON();&lt;br /&gt;
&lt;br /&gt;
	// Test: Go ahead 1m and stop!&lt;br /&gt;
	move (80, FWD, DIST_MM(1000), true);&lt;br /&gt;
	writeString_P(&amp;quot;LEFT RIGHT&amp;quot;);&lt;br /&gt;
 	writeString_P(&amp;quot;\n&amp;quot;);&lt;br /&gt;
 	writeInteger(mleft_dist, DEC);&lt;br /&gt;
	writeChar(' ');&lt;br /&gt;
 	writeInteger(mright_dist, DEC);&lt;br /&gt;
	writeString_P(&amp;quot;\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
	powerOFF();&lt;br /&gt;
&lt;br /&gt;
	return 0;&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
... 1m weit fahren lassen und dann messen, wie weit er tatsächlich gefahren ist. Das Programm gibt auf dem Terminal den Stand der Drehgeber aus. Teilt man dann die gemessene Fahrstrecke in mm durch den Wert der Drehgeber, erhält man die Auflösung. Diesen Wert kann man dann der Konstanten ENCODER_RESOLUTION in der RP6Config.h zuweisen. Nach &amp;quot;Make Clean&amp;quot;, einer Neukompilierung und erneuter Ausführung des Testprogramms müßte der RP6 jetzt genau 1m weit fahren. Das gilt zumindest für den Untergrund, auf dem die Kalibrierung durchgeführt wurde.&lt;br /&gt;
&lt;br /&gt;
====Stoßstangensensoren (Bumper)====&lt;br /&gt;
&lt;br /&gt;
Vorn am Roboter sind zwei Mikroschalter mit langem Schalthebel auf einer separaten&lt;br /&gt;
Platine untergebracht, die etwas vor der anderen Sensorplatine liegt. Dadurch werden&lt;br /&gt;
die IR LEDs auf der Sensorplatine geschützt und können nicht so leicht verbiegen&lt;br /&gt;
wenn der Roboter mal gegen ein Hindernis fährt. Mit den zwei Schaltern kann der Mikrocontroller&lt;br /&gt;
einen solchen Aufprall registrieren und dann beispielsweise zurücksetzen,&lt;br /&gt;
sich etwas drehen und weiterfahren. Die Schalter sind an zwei der Ports die schon mit&lt;br /&gt;
den LEDs verbunden sind angeschlossen und blockieren so keine anderen Ports des&lt;br /&gt;
Mikrocontrollers. Daher leuchten die LEDs auch immer wenn man einen der Schalter&lt;br /&gt;
drückt! Da dies normalerweise relativ selten passiert, stört das aber nicht weiter.&lt;br /&gt;
Die Stoßstange kann man auch abmontieren und z.B. gegen eine Schuss- oder Sammelvorrichtung&lt;br /&gt;
für Bälle o.ä. ersetzen wenn man möchte.&lt;br /&gt;
&lt;br /&gt;
====Lichtsensoren (LDRs)====&lt;br /&gt;
[[Bild:RP6_Licht.jpg|thumb]]&lt;br /&gt;
Vorne auf der kleinen Sensorplatine des Roboters sind zwei sog.&lt;br /&gt;
LDRs (=&amp;quot;Light Dependant Resistors&amp;quot; also lichtabhängige Widerstände)&lt;br /&gt;
platziert und nach links bzw. rechts ausgerichtet. Zwischen&lt;br /&gt;
den beiden Sensoren ist noch eine kleine schwarze&lt;br /&gt;
„Trennwand“ damit das Licht aus einer Richtung möglichst nur&lt;br /&gt;
einen der Sensoren erreicht. Sie bilden zusammen mit je einem&lt;br /&gt;
normalen Widerstand wie beim Batteriesensor einen Spannungsteiler – hier allerdings&lt;br /&gt;
um das Umgebungslicht zu messen. Die 5V Betriebsspannung wird auch geteilt, aber&lt;br /&gt;
hier ist einer der Widerstände variabel! Es wird also das Teilungsverhältnis je nach Intensität&lt;br /&gt;
des Lichteinfalls verändert und somit eine vom Lichteinfall abhängige Spannung&lt;br /&gt;
an einen der A/D Wandler Kanäle geleitet!&lt;br /&gt;
Über den Spannungsunterschied zwischen den beiden Sensoren kann man ermitteln in&lt;br /&gt;
welcher Richtung sich eine bzw. die hellste Lichtquelle vor dem Roboter befindet:&lt;br /&gt;
Links, Rechts oder in der Mitte. Mit einem entsprechenden Programm, kann man so z.B. eine starke Taschenlampe in&lt;br /&gt;
einem abgedunkelten Zimmer verfolgen, oder den Roboter die hellste Stelle in einem&lt;br /&gt;
Raum suchen lassen! Klappt z.B. sehr gut mit einem stärkeren Hand-Halogenscheinwerfer:&lt;br /&gt;
Wenn man damit auf den Boden leuchtet, kann der Roboter dem Lichtfleck auf&lt;br /&gt;
dem Boden folgen.&lt;br /&gt;
Das geht natürlich auch umgekehrt: Der Roboter könnte z.B. auch versuchen sich vor&lt;br /&gt;
hellem Licht zu verstecken...&lt;br /&gt;
Wenn man noch ein oder zwei LDRs hinten am Roboter anbringen würde, könnte man&lt;br /&gt;
das noch verfeinern und die Richtung in der sich Lichtquellen befinden besser bestimmen.&lt;br /&gt;
Der Roboter kann sonst nämlich oft nur schwer unterscheiden ob die Lichtquelle&lt;br /&gt;
vor oder hinter ihm liegt. Zwei der A/D Wandler Kanäle sind noch frei...&lt;br /&gt;
&lt;br /&gt;
====Anti Collision System (ACS)====&lt;br /&gt;
[[Bild:RP6 ACS.jpg|thumb|Das ACS]]&lt;br /&gt;
Der aus Softwaresicht komplexeste Sensor des RP6 ist das ACS - das „Anti Collision System“ (engl. für Anti Kollisions System)! Es besteht aus einem IR Empfänger (s. Abb.) und zwei vorne auf der Sensorplatine links und rechts angebrachten IR LEDs. Die IR LEDs werden direkt vom Mikrocontroller angesteuert. Die Ansteuerungsroutinen können beliebig verändert und verbessert werden! Beim Vorgängermodell war dafür noch ein eigener Controller nötig, dessen Programm aber nicht vom Anwender geändert werden konnte...&lt;br /&gt;
Mit den IR LEDs werden kurze, mit 36kHz modulierte Infrarot Impulse ausgesandt, auf die der darauf ausgelegte IR Empfänger reagiert. Werden die IR Impulse an einem Gegenstand vor dem Roboter reflektiert und vom IR Empfänger detektiert, kann der Mikrocontroller darauf reagieren und z.B. ein Ausweichmanöver einleiten. Damit das ACS nicht zu empfindlich bzw. auf eventuelle Störungen reagiert, wartet die Software bis eine bestimmte Anzahl von Impulsen in einer bestimmten Zeit empfangen worden ist. Es wird auch eine Synchronisation mit dem RC5 Empfang durchgeführt und auf die RC5 Signale von TV/Hifi Fernbedienungen wird so nicht reagiert. Bei anderen Codes kann das aber nicht garantiert werden und das ACS könnte dann Hindernisse erkennen, wo gar keine sind! Da es je eine IR LED links und rechts gibt, kann das ACS grob unterscheiden ob sich das Objekt links, rechts oder mittig vor dem Roboter befindet.&lt;br /&gt;
Man kann zusätzlich noch die Stromstärke mit der die beiden IR LEDs gepulst werden in drei Stufen einstellen. Das ACS funktioniert aber auch in der höchsten Stufe nicht mit allen Objekten immer zuverlässig, denn es kommt auf die Beschaffenheit der Oberfläche des jeweiligen Objekts an! Ein schwarzes Objekt reflektiert das IR Licht natürlich viel schlechter als ein weisses Objekt und ein kantiges und spiegelndes Objekt könnte das IR Licht hauptsächlich in eine bestimme Richtung reflektieren. Die Reichweite ist also immer vom jeweiligen Objekt abhängig! Das ist eine prinzipielle Schwäche von so gut wie allen IR Sensoren (jedenfalls in dieser Preisklasse).&lt;br /&gt;
Trotzdem werden die meisten Hindernisse zuverlässig erkannt und können umfahren werden. Falls das mal nicht klappt, gibt es noch die Stoßstange mit den Tastsensoren und falls auch die nicht richtig getroffen werden, kann der Roboter noch mit den Motorstromsensoren oder den Encodern erkennen, ob die Motoren blockieren (s.u.)!&lt;br /&gt;
Wem das nicht reicht, der könnte zusätzlich z.B. noch Ultraschallsensoren anbringen...&lt;br /&gt;
&lt;br /&gt;
====IR-Kommunikation (IRCOMM)====&lt;br /&gt;
Der RP6 kann über die IR-LEDs links und rechts über der Bumper-Platine Daten zu anderen IR-Empfängern senden.  Es ist z.B. möglich, dass mehrere Roboter ihre Sensorwerte untereinander vergleichen.&lt;br /&gt;
&lt;br /&gt;
====6 Status-LEDs====&lt;br /&gt;
Die Status-LEDs sind vorne links und rechts über den Lichtsensoren auf der Hauptplatine angebracht.&lt;br /&gt;
&lt;br /&gt;
Über die Status-LEDs können Sensorzustände, z.B. des ACS, der Bumper oder der Lichtsensoren, dargestellt werden.&lt;br /&gt;
&lt;br /&gt;
====IR-Sender====&lt;br /&gt;
Über den IR-Sender können Daten zu anderen Geräten übertragen werden.&lt;br /&gt;
&lt;br /&gt;
===Erweiterungssystem (EXPANSION SYSTEM)===&lt;br /&gt;
[[Bild:RP6_EXP.jpg|thumb]]&lt;br /&gt;
Eines der nützlichsten Features des RP6 ist das Erweiterungssystem.&lt;br /&gt;
Man kann den RP6 damit genau so weit ausbauen,&lt;br /&gt;
wie man es benötigt. Aus Kostengründen bietet das&lt;br /&gt;
Basissystem schließlich nur relativ wenig Sensoren. Es sind&lt;br /&gt;
zwar schon mehr als bei vielen anderen Robotern in dieser&lt;br /&gt;
Preisklasse, aber erst mit weiteren Sensoren macht ein Roboter&lt;br /&gt;
so richtig Spaß. Das ACS kann beispielsweise nur grob&lt;br /&gt;
erkennen ob sich ein Hindernis vor dem Roboter befindet.&lt;br /&gt;
Mit Ultraschallsensoren oder besseren zusätzlichen IR Sensoren,&lt;br /&gt;
könnte man aber die Distanz ermitteln und so beispielsweise&lt;br /&gt;
bessere Ausweichmanöver fahren!&lt;br /&gt;
&lt;br /&gt;
Neben Sensoren macht es auch sehr viel Sinn, zusätzliche Controller einzubauen um&lt;br /&gt;
die anfallenden Aufgaben aufteilen zu können. Beispielsweise die RP6 CONTROL M32&lt;br /&gt;
Platine mit einem weiteren MEGA32 Mikrocontroller oder die CCPRO M128.&lt;br /&gt;
&lt;br /&gt;
Das Erweiterungssystem muss natürlich in der Lage sein, viele Erweiterungsmodule&lt;br /&gt;
miteinander zu verbinden, dabei mit wenigen Signalleitungen&lt;br /&gt;
auskommen und eine ausreichend hohe Geschwindigkeit bieten.&lt;br /&gt;
&lt;br /&gt;
Siehe [[I2C]]&lt;br /&gt;
&lt;br /&gt;
===Steuerung (CONTROL SYSTEM)===&lt;br /&gt;
&lt;br /&gt;
====Hauptprozessor (ATMEGA32)====&lt;br /&gt;
[[Bild:RP6_MEGA32.jpg|thumb|Der MEGA32]]&lt;br /&gt;
Der Hauptprozessor ist der ATMEGA32 vom Atmel. Er hat 32KB Flash ROM und 2KB RAM. Der ATMEGA ist mit 8Mhz getaktet, kann also bis zu 8 Millionen Befehle pro Sekunde ausführen. Es sind 32 I/O-Pins  am Controller verfügbar. Die I/O-Pins gehören zu I/O-Ports mit jeweils 8 Pins. Davon gibt es 4: PORTA, PORTB, PORTC und PORTD. Der Controller kann die Ports entweder ein oder ausschalten (Output), oder erkennen, ob Spannung angelegt wurde oder nicht (Input). Es gibt mehrere Module, die verschiedene Aufgaben übernehmen:&lt;br /&gt;
* 3 Timer, einer davon erzeugt die PWM-Signale für die Motoren&lt;br /&gt;
* Die serielle Schnittstelle (UART)&lt;br /&gt;
* Das TWI (Two Wire Interface, also Zweidraht Schnittstelle)&lt;br /&gt;
* Ein ADC (Analog to Digital Converter) mit 8 Eingangskanälen, welche mit 10bit (0-1023) auflösen&lt;br /&gt;
* Drei externe Interrupt Eingänge&lt;br /&gt;
&lt;br /&gt;
Auserdem befindet sich im Microcontroller ein sog. Bootloader, welcher mit dem RP6 Loader kommuniziert und neue Programme in den Speicher lädt.&lt;br /&gt;
&lt;br /&gt;
===Antrieb (DRIVE SYSTEM)===&lt;br /&gt;
[[Bild:RP6_H-Brücke.jpg|thumb|Die H-Brücke]]&lt;br /&gt;
[[Bild:RP6_Tastverhältniss.jpg|thumb]]&lt;br /&gt;
Der Antrieb des RP6 besteht aus zwei Gleichstrom Motoren mit nachgeschaltetem Getriebe,&lt;br /&gt;
über das die beiden Raupenketten angetrieben werden.&lt;br /&gt;
Die Motoren genehmigen sich je nach Belastung&lt;br /&gt;
einen recht hohen Strom und können&lt;br /&gt;
natürlich nicht direkt vom Mikrocontroller&lt;br /&gt;
angesteuert werden. Dazu braucht man&lt;br /&gt;
Leistungstreiber in Form von je einer H-Brücke&lt;br /&gt;
pro Motor. Das grundlegende Prinzip&lt;br /&gt;
ist in der nebenstehenden Abbildung dargestellt.&lt;br /&gt;
Eine H-Brücke besteht aus vier&lt;br /&gt;
&amp;quot;Schaltern&amp;quot;, die in Form eines H's um einen&lt;br /&gt;
Motor angeordnet sind. Nehmen wir mal an,&lt;br /&gt;
zunächst seien alle Schalter aus. Schaltet&lt;br /&gt;
man dann S1 und S4 (Rot) an, liegt eine&lt;br /&gt;
Spannung am Motor an und er dreht sich&lt;br /&gt;
z.B. nach rechts. Schalten wir nun S1 und&lt;br /&gt;
S4 wieder aus und danach S2 und S3 (Grün)&lt;br /&gt;
an, wird die am Motor anliegende Spannung umgepolt und er dreht sich in die entgegen gesetzte&lt;br /&gt;
Richtung, also nach links! Man muss darauf achten, nicht gleichzeitig S1&lt;br /&gt;
und S2, oder S3 und S4 einzuschalten, sonst entstünde ein Kurzschluss und dadurch&lt;br /&gt;
könnten die &amp;quot;Schalter&amp;quot; zerstört werden!&lt;br /&gt;
Natürlich verwenden wir auf dem RP6 keine mechanischen Schalter, sondern sog.&lt;br /&gt;
MOSFETs. Diese schalten beim Anlegen einer genügend hohen Spannung am Eingang&lt;br /&gt;
durch. Die Schaltvorgänge können sehr schnell erfolgen, mehrere Kilohertz sind bei&lt;br /&gt;
unserer Anwendung möglich.&lt;br /&gt;
So kann man also schon mal die Drehrichtung einstellen. Und wie bekommt man den&lt;br /&gt;
Motor nun schneller bzw. langsamer? Ein Elektromotor dreht umso schneller, je höher&lt;br /&gt;
die angelegte Spannung ist. Die Drehzahl kann also über die Spannung eingestellt&lt;br /&gt;
werden - und genau dazu können wir die H-Brücke auch verwenden!&lt;br /&gt;
Die Abbildung verdeutlicht das Prinzip&lt;br /&gt;
nach dem wir vorgehen können.&lt;br /&gt;
Wir erzeugen&lt;br /&gt;
ein Rechtecksignal fester Frequenz,&lt;br /&gt;
bei dem wir das sog. Tastverhältnis&lt;br /&gt;
verändern. Mit &amp;quot;Tastverhältnis&amp;quot; ist das&lt;br /&gt;
Verhältnis von der eingeschalteten zur&lt;br /&gt;
ausgeschalteten Zeit des Signals gemeint.&lt;br /&gt;
Am Motor liegt dann effektiv eine niedrigere,&lt;br /&gt;
mittlere Gleichspannung an, die dem&lt;br /&gt;
Tastverhältnis entspricht. In der Grafik ist&lt;br /&gt;
dies durch eine rote Linie (Ug) und die roten&lt;br /&gt;
Flächen verdeutlicht. Wenn z.B. eine&lt;br /&gt;
Spannung von 7 Volt von den Akkus an&lt;br /&gt;
den Motortreibern anliegt, und diese mit&lt;br /&gt;
einem Tastverhältnis von 50% angesteuert werden, würde die mittlere Spannung in&lt;br /&gt;
etwa bei der Hälfte, also 3.5V liegen! Das stimmt real nicht ganz, aber so kann man&lt;br /&gt;
es sich schon gut und einfach vorstellen.&lt;br /&gt;
Das Antriebssystem ist dank der hohen Untersetzung (~ 1:72) relativ stark und so&lt;br /&gt;
kann der RP6 viel schwerere Lasten tragen als es z.B. der kleine Roboter ASURO&lt;br /&gt;
könnte. Allerdings steigt mit zunehmendem Gewicht natürlich auch der Energiebedarf&lt;br /&gt;
und die Akkus werden schneller leer sein ...&lt;br /&gt;
Im Vergleich mit einem ferngesteuerten Rennwagen o.ä. könnte man denken der RP6&lt;br /&gt;
sei langsam - stimmt auch - das ist jedoch absichtlich so! Der Roboter wird von einem&lt;br /&gt;
Mikrocontroller gesteuert und wenn der Programmierer einen Fehler bei der Programmierung&lt;br /&gt;
gemacht hat, wäre es ungünstig mit 10km/h vor die Wand zu prallen! Bei&lt;br /&gt;
dem eher gemächlichen Tempo des RP6 passiert aber nicht so schnell etwas und nebenbei&lt;br /&gt;
haben die Sensoren mehr Zeit die Umgebung auf Hindernisse zu untersuchen.&lt;br /&gt;
Und da wäre natürlich noch der Vorteil der höheren Belastbarkeit und der viel genaueren&lt;br /&gt;
Geschwindigkeitsregelung!&lt;br /&gt;
&lt;br /&gt;
===Stromversorgung (POWER SUPPLY)===&lt;br /&gt;
[[Bild:RP6_IC1.jpg|thumb]]&lt;br /&gt;
Natürlich benötigt ein Roboter Energie. Diese trägt der RP6 gespeichert in 6 Akkus mit&lt;br /&gt;
sich herum. Die Laufzeit ist durch die Kapazität der Akkus eingeschränkt, denn auch&lt;br /&gt;
wenn die Elektronik verhältnismäßig wenig Energie benötigt, schlucken die Motoren je&lt;br /&gt;
nach Belastung doch ziemlich viel.&lt;br /&gt;
&lt;br /&gt;
Damit die Akkus möglichst lange halten und der Roboter nicht ständig Pause machen&lt;br /&gt;
muss, sollte man ihm daher etwas größere Energiespeicher mit etwa 2500mAh gönnen.&lt;br /&gt;
Kleinere mit 2000mAh oder mehr funktionieren aber auch. Mit guten Akkus kann&lt;br /&gt;
man 3 bis 6 Stunden oder mehr Laufzeit erreichen, abhängig von der Betriebszeit der&lt;br /&gt;
Motoren, deren Belastung und Qualität der Akkus. Die 6 Akkus die notwendig sind,&lt;br /&gt;
haben insgesamt eine Nennspannung von 6x 1.2V = 7.2V. Im Blockdiagramm ist dies&lt;br /&gt;
mit &amp;quot;UB&amp;quot; (= &amp;quot;U-Battery&amp;quot;, U ist der Formelbuchstabe für Spannung) bezeichnet. „Nennspannung&amp;quot;,&lt;br /&gt;
weil sich die Spannung mit der Zeit stark verändert. Voll aufgeladen können&lt;br /&gt;
die Akkus im Leerlauf insgesamt bis zu 8.5V liefern! Diese Spannung sinkt während&lt;br /&gt;
der Entladung ab und schwankt auch je nach Belastung (Motoren an oder aus,&lt;br /&gt;
schnell langsam etc. - wie stark die Spannung schwankt, hängt auch von der Qualität&lt;br /&gt;
der verwendeten Akkus ab. Der Innenwiderstand ist hier die kritische Größe).&lt;br /&gt;
Das ist für Messungen von Sensorwerten und ähnlichem natürlich nicht ohne weiteres&lt;br /&gt;
brauchbar. Noch wichtiger ist jedoch, dass viele der verwendeten Komponenten wie&lt;br /&gt;
z.B. der Mikrocontroller nur auf 5V oder weniger Betriebsspannung ausgelegt sind und&lt;br /&gt;
bei so hohen Spannungen zerstört würden. Die Akku Spannung muss also auf einen&lt;br /&gt;
definierten Wert heruntergeregelt und stabilisiert werden!&lt;br /&gt;
Das übernimmt ein 5V Spannungsregler, der einen Strom von&lt;br /&gt;
maximal 1.5A liefern kann (s. Abb.). Bei 1.5A würde er jedoch&lt;br /&gt;
ziemlich viel Wärme abgeben. Es gibt daher eine große Kühlfläche&lt;br /&gt;
auf der Platine an die der Regler festgeschraubt ist. Über 1A&lt;br /&gt;
sollte der Regler trotz Kühlung besser nur kurzzeitig (also wenige&lt;br /&gt;
Sekunden) belastet werden, wenn man nicht noch einen zusätzlichen&lt;br /&gt;
großen Kühlköper draufschraubt.&lt;br /&gt;
&lt;br /&gt;
Es wird empfohlen, 800mA Dauerlast nicht zu überschreiten! Bei&lt;br /&gt;
so einer Belastung und zusammen mit den Motoren wären die&lt;br /&gt;
Akkus auch recht schnell leer. Im normalen Betrieb ohne ein Erweiterungsboard&lt;br /&gt;
nimmt der Roboter übrigens nicht mehr als 40mA auf (ausser wenn&lt;br /&gt;
das IRCOMM sendet), also überhaupt kein Problem für den Regler und man hat noch&lt;br /&gt;
genug Reserven für die Erweiterungsmodule, die meistens auch nicht mehr als 50mA&lt;br /&gt;
aufnehmen sofern keine Motoren, große LEDs o.ä. daran angeschlossen sind.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Umbau-Optionen==&lt;br /&gt;
Hier soll beschrieben werden, welche Umbau-Optionen es für die RP6 Base gibt. Im Text gibt es Verweise auf den Schaltplan des RP6 (RP6_MAINBOARD.PDF) in der Form: (SP2 B1: Bauteil). Dies bedeutet, dass man das Bauteil auf Blatt 2 des RP6-Schaltplans im Feld B1 finden kann. Beispielhaft sind im folgenden Text Bestell-Nummern der Firma [http://www.conrad.de/ce/ CONRAD] genannt. Natürlich kann man die Teile auch bei anderen Versendern beziehen.&lt;br /&gt;
&lt;br /&gt;
Bei den Materialangaben ist öfter die Rede von &amp;quot;Steckbuchsen mit Litze&amp;quot;. Diese Steckbuchsen mit angelöteter Litze können auf die ein- oder zweireihigen Stiftleisten aufgesteckt werden. Leider gibt es sie nicht (mehr) fertig konfektioniert bei CONRAD. Die einreihigen Steckbuchsen (RM 2,54mm) kann man aber z.B. bei [http://www.elv.de/output/controller.aspx ELV] bekommen: 2-polig (68-016635), 3-polig (68-022503) und 5-polig (68-023073). An sie muss man dann noch Litzen in der entsprechenden Länge selbst anlöten.&lt;br /&gt;
&lt;br /&gt;
===Elko für den IR-Empfänger===&lt;br /&gt;
[[Bild:RP6_C29_TSOP.JPG|thumb|RP6 C29 TSOP]]&lt;br /&gt;
Zur Spannungsstabilisierung kann ein Elko (C29; SP2 E1: C29*) am TSOP 34836 eingelötet werden.&lt;br /&gt;
&lt;br /&gt;
Normalerweise ist dieser Elko nicht erforderlich.&lt;br /&gt;
&lt;br /&gt;
Man braucht dazu:&lt;br /&gt;
* Einen Elektrolyt-Kondensator stehend 10 uF / 16V (C29); RM 2,5mm (445631)&lt;br /&gt;
&lt;br /&gt;
Der Elko kann auch eine geringere Kapazität als 10 uF haben (1 uF bis 4,7 uF reichen auch). Man lötet den Elko auf seinen Platz. Bitte auf die Polung achten: Der Minuspol zeigt nach vorn (in Fahrtrichtung des RP6).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Anschlüsse===&lt;br /&gt;
Hier wird aufgelistet, wo man auf dem RP6 Mainboard Anschlüsse nutzen kann, um sie z.B. zu weiteren Sensoren, zum USRBUS oder (weniger empfehlenswert!) direkt zu EPs oder Erweiterungsplatinen (M32, CCPRO M128) zu führen.&lt;br /&gt;
&lt;br /&gt;
====Analoge Sensoren an ADC0/1====&lt;br /&gt;
[[Bild:RP6_ADC01.JPG|thumb|RP6 ADC0/1]]&lt;br /&gt;
&lt;br /&gt;
Wenn man bis zu zwei analoge Sensoren (z.B. IR-Distanz-Mess-Sensoren Sharp GP2Y0A02YK 185364) direkt an den RP6 anschließen möchte, dann gibt es da zwei 3-polige Kontakte, beschriftet mit VDD/GND/ADCx (x = 0..1). Hier kann man 3-polige Stiftleisten auflöten, an die dann die Sensoren angeschlossen werden.&lt;br /&gt;
&lt;br /&gt;
Man braucht dazu:&lt;br /&gt;
* 1-reihige Stiftleiste RM 2,54mm (z.B. 36-polig 732478)&lt;br /&gt;
* Zwei Keramik-Vielschicht-Kondensatoren 100nF (C27, C28); RM 2,54mm (453099)&lt;br /&gt;
* ENTWEDER einen Elektrolyt-Kondensator stehend 220 uF / 16V (C26); RM 3,5mm (445903)&lt;br /&gt;
* ODER einen Elektrolyt-Kondensator stehend 470 uF / 16V (C26); RM 3,5mm (446211)&lt;br /&gt;
* Zwei 3-polige Steckbuchsen mit Litze zum Anschluß der Sensoren&lt;br /&gt;
&lt;br /&gt;
Man trennt nun von der 1-reihigen Stiftleiste zweimal 3 Kontakte ab und lötet sie auf die weiß umrahmten Kontakte (VDD/GND/ADCx; SP2 B1: ADC0, ADC1), anschließend C27, C28 (SP2 A1: C27*, C28*) auf ihre Plätze und zum Schluß den Elko 220 uF oder 470 uF (C26; SP2 A1: C26*). Der Elko ist nur bei Sensoren mit hohem Strombedarf notwendig, siehe dazu auch Anleitung des RP6, Seite 136! Beim Elko auf die Polung achten: Er muss so sitzen, dass er mit seinem Pluspol in Fahrtrichtung des RP6 (nach vorn) schaut.&lt;br /&gt;
&lt;br /&gt;
Die Sensoren lötet man an die Litzen der 3-poligen Steckbuchsen und steckt diese auf die neuen Kontakte.&lt;br /&gt;
&lt;br /&gt;
Da manche Sensoren einen höheren Stromverbrauch haben, kann man die Stromversorgung an den VDD-Pins der ADC0/1-Stecker abschaltbar machen oder eine separate +5V-Spannung einspeisen. Siehe dazu den Abschnitt &amp;quot;Trennstellen - Getrennte Stromversorgung für ADC0/1&amp;quot; weiter unten!&lt;br /&gt;
&lt;br /&gt;
====ISP (In System Programming)====&lt;br /&gt;
Der ATMEGA32 des RP6 wird standardmäßig über den PROG/UART Stecker programmiert. Dazu befindet sich im Prozessor ein Bootloader-Programm. Wenn man stattdessen oder zusätzlich die ISP-Programmierung mit einem dafür geeigneten ISP-Programmier-Adapter nutzen will, kann man den Adapter an einen (noch einzulötenden) Wannenstecker auf dem RP6 anschließen.&lt;br /&gt;
Vorher sind aber ein paar &amp;quot;Umbauarbeiten&amp;quot; erforderlich.&lt;br /&gt;
&lt;br /&gt;
Man braucht dazu:&lt;br /&gt;
* 1-reihige Stiftleiste RM 2,54mm (z.B. 36-polig 732478)&lt;br /&gt;
* Wannenstecker 2x5-polig gerade RM 2,54mm (z.B. [http://www.reichelt.de./ Reichelt] WSL 10G)&lt;br /&gt;
* Eine SMD-Diode LL 4148 (140902)&lt;br /&gt;
* Eine Codierbrücke (z.B. aus Set 742902)&lt;br /&gt;
&lt;br /&gt;
Zwischen dem XBUS-Stecker und C13 befinden sich 10 Lötpunkte für den ISP-Anschluß, auf die der Wannenstecker gelötet wird, und drei Lötpunkte (beschriftet mit ISP* - BOOTLOAD; SP2 A3: YR1..3), auf die eine 3-polige Stiftleiste gelötet werden muss.&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_ISP.JPG|RP6 ISP]]&lt;br /&gt;
&lt;br /&gt;
Vorher muss eine kurze Leiterbahn zwischen den Lötpunkten BOOTLOAD aufgetrennt werden. Die Leiterbahn befindet sich auf der Lötseite der Platine und muss mit einem scharfen Messer oder einem speziellen Leiterbahn-Unterbrecher zwischen den beiden Lötpunkten unterbrochen werden. Man sollte anschließend mit einem Widerstandsmeßgerät nachmessen: Es sollte keine Verbindung mehr zwischen den Lötpunkten bestehen.&lt;br /&gt;
Man trennt dann von der 1-reihigen Stiftleiste 3 Kontakte ab und lötet sie auf die beschriebenen drei Lötpunkte.&lt;br /&gt;
&lt;br /&gt;
Zum Schluss lötet man noch die Diode LL 4148 (SP2 B3: D11*) auf ihre Lötflächen zwischen R3 und C6. Die Kathode (Strich) der Diode kommt nach vorn (in Fahrtrichtung RP6, bzw. liegt rechts von R3). Wenn man jetzt eine Codierbrücke auf die mit &amp;quot;BOOTLOAD&amp;quot; beschrifteten Pins steckt, bleibt alles unverändert: Die Programmierung erfolgt weiter über den PROG/UART-Stecker mithilfe des Bootloaders im Prozessor.&lt;br /&gt;
Wird die Codierbrücke in Stellung &amp;quot;ISP*&amp;quot; umgesteckt, kann der Prozessor mit ISP programmiert werden.&lt;br /&gt;
&lt;br /&gt;
Vorsicht: Das Bootloader-Programm kann dabei zerstört werden! Es müssen zusätzlich Fusebits des ATMEGA32 verändert werden. Dabei kann der Prozessor im schlimmsten Fall nicht mehr ansprechbar sein. Man sollte diesen Umbau und die ISP-Programmierung nur machen, wenn man genau weiß, was man macht!&lt;br /&gt;
&lt;br /&gt;
Eine Kopie des Bootloaders und eine Kurzanleitung zum Einstellen der Fusebits gibt es hier:&lt;br /&gt;
[http://www.arexx.com/rp6/downloads/RP6BASE_BOOTLOADER.zip RP6_BOOTLOADER]&lt;br /&gt;
&lt;br /&gt;
====IO1..IO4====&lt;br /&gt;
[[Bild:RP6_IO1-4.JPG|thumb|RP6 IO1..IO4]]&lt;br /&gt;
Die Anschlüsse IO1 bis IO4 (SP2 E3: IO1..4) steuern bereits die Status-LEDs 1, 2, 4 und 5 an. Trotzdem kann man sie auch noch mit leichten Einschränkungen als I/O-Pins benutzen. Dazu lötet man zweimal 2 Pins einer 1-reihigen Stiftleiste RM 2,54mm (z.B. 36-polig 732478) auf die IO1/2 und IO3/4 Lötpunkte.&lt;br /&gt;
Hier eine Tabelle, die die Port-Pins zeigt, die IO1..IO4 zugeordnet sind:&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |IO&lt;br /&gt;
 |Status-LED&lt;br /&gt;
 |Port-Pin&lt;br /&gt;
 |-&lt;br /&gt;
 |1&lt;br /&gt;
 |SL1&lt;br /&gt;
 |PC4&lt;br /&gt;
 |-&lt;br /&gt;
 |2&lt;br /&gt;
 |SL2&lt;br /&gt;
 |PC5&lt;br /&gt;
 |-&lt;br /&gt;
 |3&lt;br /&gt;
 |SL4&lt;br /&gt;
 |PB7&lt;br /&gt;
 |-&lt;br /&gt;
 |4&lt;br /&gt;
 |SL5&lt;br /&gt;
 |PB1&lt;br /&gt;
 |-&lt;br /&gt;
|}&lt;br /&gt;
Wie können nun IO1..IO4 genutzt werden?&lt;br /&gt;
&lt;br /&gt;
Als ...&lt;br /&gt;
* Eingang, z.B. für zusätzliche Tastschalter/Bumper&lt;br /&gt;
* Ausgang, z.B. zur Ansteuerung von Treiberstufen, low-current LEDs, ...&lt;br /&gt;
&lt;br /&gt;
Wird ein Anschluß IOx als Eingang verwendet, muss ein Widerstand von 470 Ohm in Reihe mit dem Taster an VDD eingebaut werden, zusätzlich ein Pulldown-Widerstand 100 kOhm. Diese Beschaltung zeigen z.B. an SL6 die Widerstände R43 und R46 (SP2 E4: R43, R46).&lt;br /&gt;
&lt;br /&gt;
Als Ausgang geschaltet sollte an IOx kein hoher Strom entnommen werden: 10mA sind max. zu empfehlen!&lt;br /&gt;
&lt;br /&gt;
====USRBUS====&lt;br /&gt;
Die 14 Kontakte der beiden USRBUS-Stecker sind auf dem RP6 nirgendwo angeschlossen, sondern können über die Lötpunkte Y1..Y14 mit beliebigen Punkten auf dem Mainboard verbunden werden.&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_USRBUS.JPG|thumb|RP6 USRBUS]]&lt;br /&gt;
&lt;br /&gt;
Ich würde auf Y1..Y14 eine Stiftleiste löten, damit die USRBUS-Belegung geändert werden kann.&lt;br /&gt;
&lt;br /&gt;
Man braucht dazu:&lt;br /&gt;
* 2-reihige Stiftleiste RM 2,54mm (z.B. 2x36-polig 742007)&lt;br /&gt;
* Einige Steckbuchsen mit Litze&lt;br /&gt;
&lt;br /&gt;
Man trennt von der 2-reihigen Stiftleiste 2x7 Kontakte ab und lötet sie auf die Punkte Y1..Y14 (SP4 E34: Y1..14, Y1'..Y14') neben den beiden Wannensteckern USRBUS1 (vorn) und USRBUS2 (hinten). Wird der RP6 über Flachkabel mit einem USRBUS-Stecker auf einer RP6 Experimentierplatine (EP) und/oder mit einer Erweiterungsplatine (M32, CCPRO M128) verbunden, dann hat man mit allen mit dem USRBUS verbundenen Platinen eine direkte 14-polige Verbindung,- eben den &amp;quot;User Bus&amp;quot;. Den kann man dann nutzen, wie man will. Auf dem RP6 kann man mit Steckbuchsen die Pins Y1..Y14 mit anderen Pins verbinden.&lt;br /&gt;
&lt;br /&gt;
Beispiel: Verbindet man den Pin &amp;quot;ADC0&amp;quot; mit Y1 des USRBUS1, dann steht der Eingang ADC0 auf allen an den USRBUS1 angeschlossenen Platinen auf dem vorderen Platinenstapel an Y1 zur Verfügung. Man braucht also diesen Eingang nicht über ein eigenes Kabel auf eine EP zu führen, sondern kann dazu den USRBUS nehmen. Dadurch bleibt der Gesamtaufbau auf dem RP6 übersichtlich und komplett trennbar (man braucht nur die Stecker XBUS und USRBUS abzuziehen!).&lt;br /&gt;
&lt;br /&gt;
Wichtig:&lt;br /&gt;
* Man sollte gut dokumentieren, wie man den USRBUS am RP6 (vorn und hinten getrennt!), auf EPs und der M32/M128 benutzt! Sonst kann es bei einer anderen Anordnung von EPs zu USRBUS Konflikten/Kurzschlüssen kommen.&lt;br /&gt;
* Der USRBUS1- und der USRBUS2-Stecker sind auf dem RP6 NICHT miteinander verbunden.&lt;br /&gt;
&lt;br /&gt;
Einen Vorschlag für die Belegung des USRBUS1 (vorn) gibt es z.B. &lt;br /&gt;
[http://www.roboternetz.de/phpBB2/viewtopic.php?t=32549 hier] oder &lt;br /&gt;
[http://www.roboternetz.de/community/showthread.php/47102-Sensor-anschließen?p=453061&amp;amp;viewfull=1#post453061 da.]&lt;br /&gt;
&lt;br /&gt;
====Start/Stop Button====&lt;br /&gt;
[[Bild:RP6_ST.JPG|thumb|RP6 ST]]&lt;br /&gt;
Am mittleren Lochrasterfeld links finden sich zwei Lötpunkte ST1, ST2 (SP2 D2: ST1, ST2), an die weitere Start/Stop Taster (NO, normal offen) parallel zum Taster auf dem RP6 Mainboard angeschlossen werden können.&lt;br /&gt;
&lt;br /&gt;
Zum Anschluß kann man auch Stiftleisten auflöten. ST1, ST2 könnte man auch mit dem USRBUS1 verbinden, wenn man den RP6 z.B. von einer EP aus zurücksetzen möchte.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Serielle Schnittstelle====&lt;br /&gt;
[[Bild:RP6_RST.JPG|thumb|RP6 RST]]&lt;br /&gt;
Neben dem USRBUS1 Stecker befinden sich 5 Lötpunkte mit den Signalen RST, TX, RX, GND, VDD (SP4 AB5: YRX, YTX, YMRESET, YVDD). Hier kann z.B. eine 5-polige Stiftleiste aufgelötet werden, um einen Anschluß an die serielle Schnittstelle zu ermöglichen.&lt;br /&gt;
&lt;br /&gt;
Von diesen 5 Lötpunkten könnte z.B. auch [http://www.roboternetz.de/phpBB2/viewtopic.php?t=32549 so] eine Verbindung zum benachbarten USRBUS1 hergestellt werden, um die serielle Schnittstelle des RP6 auf EPs zu führen.&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;
&lt;br /&gt;
====I2C-Schnittstelle====&lt;br /&gt;
[[Bild:RP6_I2C.JPG|thumb|RP6 I2C]]&lt;br /&gt;
Neben dem XBUS2 Stecker finden sich 5 Lötpunkte mit den Signalen der I2C-Schnittstelle (SP4 D12: Stecker I2C). Dies sind: VDD (Pin 1), GND, SDA, SCL, INT1 (Pin 5). Hier kann z.B. eine 5-polige Stiftleiste aufgelötet werden, um einen Anschluß an die I2C-Schnittstelle zu ermöglichen.&lt;br /&gt;
&lt;br /&gt;
Von diesen 5 Lötpunkten könnte z.B. auch eine Verbindung zum USRBUS1 oder USRBUS2 hergestellt werden, um die I2C-Schnittstelle des RP6 auf EPs zu führen, allerdings hat man SCL, SDA, INT1 ja auch schon am XBUS zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Interrupt-Leitungen====&lt;br /&gt;
[[Bild:RP6_INTx.JPG|thumb|RP6 INTx]]&lt;br /&gt;
Die Interrupt-Leitungen INTU, INT1..3, MRESET (SP4 D34: MRESET, INT1..3, INTU) sind an 5 Lötpunkten neben dem XBUS1 Stecker zu kontaktieren. Hier kann natürlich auch eine 5-polige Stiftleiste aufgelötet werden. In der Regel wird man diese Anschlüsse nicht brauchen, weil sie schon auf dem XBUS zur Verfügung stehen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====VDD/GND/+UB Anschluß====&lt;br /&gt;
[[Bild:RP6_VDDGNDUB.JPG|thumb|RP6 VDD GND +UB]]&lt;br /&gt;
In der Nähe von C4 im hinteren Bereich des Mainboards finden sich Lötpunkte (SP4 E12: YVDDx, YGNDx; SP4 D2 YUBx), an denen man VDD, GND und +UB finden kann.&lt;br /&gt;
&lt;br /&gt;
Wenn man höhere Ströme an VDD (z.B. für Servos) oder +UB (z.B. für einen anderen IRCOMM-Sender oder einen DC-Motor) entnehmen möchte, empfehlen sich diese Lötpunkte, auf die man auch Stiftleisten löten kann.&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;
====EXT Anschluß====&lt;br /&gt;
[[Bild:RP6_EXT.jpg|thumb|RP6 EXT Anschluß]]&lt;br /&gt;
Am hinteren Rand der RP6 Hauptplatine gibt es eine Reihe von 8 Lötpunkten. Dies ist der EXT Anschluß (SP1 C23: Stecker EXT):&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |Pin&lt;br /&gt;
 |Name&lt;br /&gt;
 |Beschreibung&lt;br /&gt;
 |-&lt;br /&gt;
 |1&lt;br /&gt;
 |GND&lt;br /&gt;
 |RP6 und Akku Minuspol (GND)&lt;br /&gt;
 |-&lt;br /&gt;
 |2&lt;br /&gt;
 |CHRG&lt;br /&gt;
 |Anschluß (+) für ext. Ladegerät, identisch mit Pluspol der Ladebuchse (CHARGER, Pin 1). Ladung nur möglich, wenn S1 AUS ist!&lt;br /&gt;
 |-&lt;br /&gt;
 |3&lt;br /&gt;
 |CHRG&lt;br /&gt;
 |wie Pin 2!&lt;br /&gt;
 |-&lt;br /&gt;
 |4&lt;br /&gt;
 | +BAT&lt;br /&gt;
 |Akku Pluspol über Sicherung F1&lt;br /&gt;
 |-&lt;br /&gt;
 |5&lt;br /&gt;
 | +BAT&lt;br /&gt;
 |wie Pin 4!&lt;br /&gt;
 |-&lt;br /&gt;
 |6&lt;br /&gt;
 | +UB&lt;br /&gt;
 |RP6 +UB (+7,2V=, Bereich min. +5,5 bis max. +10V=)&lt;br /&gt;
 |-&lt;br /&gt;
 |7&lt;br /&gt;
 | +UB&lt;br /&gt;
 |wie Pin 6!&lt;br /&gt;
 |-&lt;br /&gt;
 |8&lt;br /&gt;
 |GND&lt;br /&gt;
 |wie Pin 1!&lt;br /&gt;
 |-&lt;br /&gt;
|}&lt;br /&gt;
Man kann hier eine JST XH Stiftleiste gerade, 8-polig, RM 2,5mm ([http://www.conrad.de/ce/de/product/740105/Stiftleiste-gerade-RM-25-mm-Serie-XH-Rastermass-25-mm-Pole-8-Nennstrom-3-A-B8B-XH-A-LFSN-JST-Inhalt-1-St 740105]) auflöten.&lt;br /&gt;
&lt;br /&gt;
Wozu kann man diesen Anschluß nutzen?&lt;br /&gt;
&lt;br /&gt;
Der wesentliche Sinn des EXT Anschlusses besteht darin, andere Arten der Stromversorgung und der Akkuladung zu ermöglichen. Normalerweise schaltet man den RP6 mit S1 an und aus. In Stellung AUS kann der Akku geladen werden, indem man ein Ladegerät an die CHARGER Buchse anschließt. Alternativ kann man das Ladegerät mit seinem Pluspol auch an CHRG (Pins 2, 3) anschließen. Siehe auch den Abschnitt &amp;quot;Trennstellen - EXT Anschluß: Andere Stromversorgung&amp;quot; weiter unten!&lt;br /&gt;
&lt;br /&gt;
An +BAT (Pins 4, 5) kann man direkt (ohne Unterbrechung durch S1) Strom aus dem Akku entnehmen. Die Grenze des Stroms bestimmt die Sicherung F1 (2,5A). Eine weitere Möglichkeit besteht darin, über diesen Anschluß den Akku auch mit einem geeigneten Ladegerät zu LADEN. Hierbei muss man aber darauf achten, dass S1 AUSgeschaltet ist, weil sonst der RP6 über +UB eine unzulässig hohe Spannung bekommen könnte. Wenn man den Akku mit 6 Mignonzellen im RP6 nicht nutzen will (der Akku-Halter bleibt leer!), sondern nur einen externen Akku, wäre der auch mit seinem Pluspol an +BAT über eine eigene Sicherung (2,5A träge) anzuschließen.&lt;br /&gt;
&lt;br /&gt;
+UB (+7,2V) ist die Versorgungsspannung des RP6 (kommt vom Akku-Pluspol über die Sicherung F1 und Schalter S1!). Mit +UB werden die H-Brücken (Motoransteuerung) direkt und die RP6 &amp;quot;Elektronik&amp;quot; über den 5V-Spannungswandler (IC1; SP1 D3: IC1) versorgt (= VDD). An +UB könnte man den RP6 direkt mit einer Spannung von +7,2V versorgen (Absicherung nicht vergessen!), dazu muss S1 AUSgeschaltet sein, damit es keine Konflikte mit dem eingebauten Akku gibt.&lt;br /&gt;
&lt;br /&gt;
Den EXT Anschluß kann man damit nutzen für:&lt;br /&gt;
* Externes Ladegerät&lt;br /&gt;
* Externen Akku&lt;br /&gt;
* Externe Stromversorgung ohne Akku&lt;br /&gt;
* Direkte Stromentnahme aus dem Akku&lt;br /&gt;
* Ergänzungsladung mit Solarzelle&lt;br /&gt;
* Autonome Akkuladung (Ladestation mit Kontakten, Induktionsladung ...)&lt;br /&gt;
* ...&lt;br /&gt;
&lt;br /&gt;
Man sollte gewisse Elektronik-Kenntnisse haben, wenn man die Spannungsversorgung des RP6 verändert. VOR irgendwelchen Veränderungen seht euch auch zuerst den Schaltplan des RP6 (SP1) genau an!&lt;br /&gt;
&lt;br /&gt;
===Mess-/Kontaktpunkte===&lt;br /&gt;
Hier geht es um Kontaktpunkte, an denen man z.B. den Logik-Pegel (High/Low) oder eine analoge Spannung messen kann. Natürlich kann man die Signale auch zur Weiterleitung auf eine EP kontaktieren, dies wird man aber normalerweise nicht brauchen.&lt;br /&gt;
&lt;br /&gt;
====UBAT====&lt;br /&gt;
[[Bild:RP6_UBAT.JPG|thumb|RP6 UBAT]]&lt;br /&gt;
In der Mitte des Mainboards befindet sich ein Kontaktpunkt UBAT (SP1 E1: YUBAT). Dies ist ADC7 des RP6 Microcontrollers.&lt;br /&gt;
&lt;br /&gt;
Man kann hier die analoge Spannung (gegen GND) messen, die vom +UB-Spannungssensor geliefert wird.&lt;br /&gt;
&lt;br /&gt;
Die Spannung ist:&lt;br /&gt;
 UBAT = +UB / 2&lt;br /&gt;
Da der Spannungsteiler (SP1 D12: R1, R2) des +UB-Spannungssensors nicht aus Präzisionswiderständen besteht, kann man für den eigenen RP6 einen Korrekturfaktor berechnen, wenn UBAT deutlich von +UB / 2 (+ UB z.B. gemessen am EXT Stecker, Pins 6 u. 7) abweicht. Damit kann man +UB sehr viel genauer bestimmen.&lt;br /&gt;
&lt;br /&gt;
====ACS====&lt;br /&gt;
[[Bild:RP6_ACS_TSOP.JPG|thumb|RP6 ACS TSOP]]&lt;br /&gt;
Hinter dem TSOP (IC3) befindet sich der Kontaktpunkt ACS (SP2 E1: ACS).&lt;br /&gt;
&lt;br /&gt;
Dies ist der Ausgang des TSOP bzw. Eingang PB2 des RP6 Microcontrollers. Man kann hier das Ausgangssignal des IR-Empfängers abnehmen, z.B. um es mit einem Oszilloskop sichtbar zu machen.&lt;br /&gt;
&lt;br /&gt;
Rechts neben dem TSOP kann man noch die 3 Kontaktpunkte ACS_R, ACS_P und ACS_L (SP2 E2: ACS_P, ACS_R, ACS_L) des ACS-IR-Senders finden.&lt;br /&gt;
&lt;br /&gt;
Folgende Tabelle zeigt die Verbindungen:&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |Kontakt&lt;br /&gt;
 |Microcontroller-Portpin&lt;br /&gt;
 |SP-Verbindung&lt;br /&gt;
 |ACS-IR-Sendediode&lt;br /&gt;
 |-&lt;br /&gt;
 |ACS_P&lt;br /&gt;
 |über R8: ACS_PWRH (PB3), über R9: ACS_PWR (PD6)&lt;br /&gt;
 |SP2: 3&lt;br /&gt;
 |Anoden D1, D2&lt;br /&gt;
 |-&lt;br /&gt;
 |ACS_R&lt;br /&gt;
 |ACS_R (PC7)&lt;br /&gt;
 |SP2: 2&lt;br /&gt;
 |Kathode D1&lt;br /&gt;
 |-&lt;br /&gt;
 |ACS_L&lt;br /&gt;
 |ACS_L/MISO (PB6)&lt;br /&gt;
 |SP1: 5&lt;br /&gt;
 |Kathode D2&lt;br /&gt;
 |-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====IRC====&lt;br /&gt;
[[Bild:RP6_IRC.JPG|thumb|RP6 IRC]] [[Bild:RP6_IRC3.JPG|thumb|RP6 IRC3]]&lt;br /&gt;
Im der Nähe von C13 befinden sich die Lötpunkte IRC, IRC+, IRC- und IRC3 (SP2 D2: YIRC; SP2 CD2: IRC+/-; SP2 C2: IRC3). Zusammen mit der Trennstelle IRC (siehe Abschnitt &amp;quot;Trennstellen - IRC&amp;quot; weiter unten!) kann man diese Kontaktstellen im Umfeld des IRCOMM-Sendedioden Treibers IRLML2502PBF (SP2 CD12: Q5) finden. Am Kontaktpunkt IRC findet sich der Eingang des Treibers bzw. Ausgang PD7 des RP6 Microcontrollers. IRC+, IRC- sind die Kontaktpunkte, an denen die IRCOMM-Sendedioden D3, D4 in Reihe auf der Sensorplatine angeschlossen sind (IRC+ = Anode). IRC3 ist verbunden mit dem Trennstellen-Lötpunkt IRC1 und liegt bei geschlossener Trennstelle IRC an +UB.&lt;br /&gt;
&lt;br /&gt;
Was läßt sich mit diesen Kontaktpunkten machen:&lt;br /&gt;
* Der IRCOMM-Sender ist der zweitgrößte Stromverbraucher des RP6 (nach dem Antrieb). An IRC3 kann daher eine eigene Stromversorgung für die IRCOMM-Sendedioden angeschlossen werden. Dazu muss die Trennstelle IRC zwischen ihren Lötpunkten IRC1, IRC2 aufgetrennt werden.&lt;br /&gt;
* An IRC+, IRC- könnten andere/weitere IRCOMM-Sendedioden angeschlossen werden (Anode an IRC+). Wenn der Vorwiderstand R6 (SP2 C2: R6) der Sendedioden dann nicht mehr paßt (bezügl. Leistung und/oder Widerstandswert), können neue leistungsfähigere IRCOMM-Sendedioden zwischen IRC3 und IRC- (Anode an IRC3) mit einem dafür geeigneten Vorwiderstand angebracht werden.&lt;br /&gt;
&lt;br /&gt;
====LS====&lt;br /&gt;
[[Bild:RP6_LS.JPG|thumb|RP6 LS]]&lt;br /&gt;
Die beiden Lötpunkte LS_L und LS_R (SP2 B12: LS_L, LS_R) neben R7 vorn auf dem Mainboard sind die Ausgänge der Helligkeitssensoren (links und rechts) bzw. die ADC-Eingänge ADC3 und ADC2 des RP6 Microcontrollers.&lt;br /&gt;
&lt;br /&gt;
Hier kann man die Spannungen messen, die den Helligkeitswerten entsprechen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====BP, S====&lt;br /&gt;
[[Bild:RP6_BP_S.JPG|thumb|RP6 BP S]]&lt;br /&gt;
Die Messpunkte BPL, BPR und der Kontaktpunkt S (SP2 E2: S; SP2 E3: BPR; SP2 E4: BPL) befinden sich am vorderen Platinenrand. BPL und BPR sind die Kontakte der Bumper. S ist eine nicht genutzte Verbindung zwischen dem Mainboard und der Sensorplatine, die über die Verbindung SP1, Pin 3, geführt wird (siehe folgende Tabelle!).&lt;br /&gt;
&lt;br /&gt;
Hier eine Tabelle mit der Belegung der 90°-Winkelverbindung SP1, SP2 zwischen dem RP6 Mainboard und der Sensorplatine: &lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |Pin&lt;br /&gt;
 |SP1&lt;br /&gt;
 |SP2&lt;br /&gt;
 |-&lt;br /&gt;
 |1&lt;br /&gt;
 |LS_L  --- Light Sensor Left&lt;br /&gt;
 |IRC-  --- IRCOMM-&lt;br /&gt;
 |-&lt;br /&gt;
 |2&lt;br /&gt;
 |BPL   --- Bumper Left&lt;br /&gt;
 |ACS_R --- ACS Right&lt;br /&gt;
 |-&lt;br /&gt;
 |3&lt;br /&gt;
 |S     --- Free for all&lt;br /&gt;
 |ACS_P --- ACS Power&lt;br /&gt;
 |-&lt;br /&gt;
 |4&lt;br /&gt;
 |GND&lt;br /&gt;
 |VDD&lt;br /&gt;
 |-&lt;br /&gt;
 |5&lt;br /&gt;
 |ACS_L --- ACS Left&lt;br /&gt;
 |BPR   --- Bumper Right&lt;br /&gt;
 |-&lt;br /&gt;
 |6&lt;br /&gt;
 |IRC+  --- IRCOMM+&lt;br /&gt;
 |LS_R  --- Light Sensor Right&lt;br /&gt;
 |-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====ENC====&lt;br /&gt;
[[Bild:RP6_ENC.JPG|thumb|RP6 ENC]]&lt;br /&gt;
Die beiden Messpunkte ENCL, ENCR (SP4 B12: ENCL, ENCR) sind die Ausgänge der Radencoder. ENCL ist verbunden mit PD2 (INT0), ENCR mit PD3 (INT1) des RP6 Microcontrollers.&lt;br /&gt;
&lt;br /&gt;
===Trennstellen===&lt;br /&gt;
An diesen Stellen können Leiterbahnen unterbrochen werden, um Funktionen zu deaktivieren oder anders zu nutzen.&lt;br /&gt;
&lt;br /&gt;
=====Getrennte Stromversorgung für ADC0/1=====&lt;br /&gt;
Wenn man für die analogen Sensoren an ADC0/1 (siehe Abschnitt &amp;quot;Anschlüsse - Analoge Sensoren an ADC0/1&amp;quot; weiter oben!) eine GETRENNTE Stromversorgung vorsehen will und/oder mit Codierbrücke (oder MOSFET) die Stromversorgung abschaltbar machen möchte, muss man erst Vorarbeit leisten.&lt;br /&gt;
[[Bild:RP6_SV.JPG|thumb|RP6 SV]]&lt;br /&gt;
&lt;br /&gt;
Man braucht dazu:&lt;br /&gt;
* 1-reihige Stiftleiste RM 2,54mm (z.B. 36-polig 732478)&lt;br /&gt;
* Evtl.: Eine Codierbrücke (z.B. aus Set 742902)&lt;br /&gt;
* Evtl.: Eine 1-polige Steckbuchse mit Litze zur ext. Stromversorgung&lt;br /&gt;
Es muss eine kurze Leiterbahn zwischen den Punkten &amp;quot;SV1&amp;quot; und &amp;quot;SV2&amp;quot; (SP2 A1: SV1, SV2; zwischen dem PROG/UART- und dem USRBUS1-Stecker) aufgetrennt werden. Die Leiterbahn befindet sich auf der Lötseite der Platine und muss mit einem scharfen Messer oder einem speziellen Leiterbahn-Unterbrecher zwischen den beiden Lötpunkten unterbrochen werden. Man sollte anschließend mit einem Widerstandsmeßgerät zwischen SV1 und SV2 nachmessen: Es sollte keine Verbindung mehr bestehen. Jetzt trennt man von der 1-reihigen Stiftleiste 2 Kontakte ab und lötet sie auf die Punkte SV1/SV2.&lt;br /&gt;
&lt;br /&gt;
Man kann hier zunächst eine Codierbrücke aufstecken. Damit versorgt der RP6 Akku die Sensoren mit 5V an den Pins VDD. Möchte man später eine getrennte 5V-Spannung anlegen, zieht man einfach die Codierbrücke ab und speist die externe 5V-Spannung (mit einer 1-poligen Steckbuchse) am Pin SV2 ein. Achtung: An Pin SV1 wird dann nichts angeschlossen!&lt;br /&gt;
&lt;br /&gt;
Anstelle der Codierbrücke kann man natürlich auch einen MOSFET anschließen, um die Sensoren per Software abschalten zu können.&lt;br /&gt;
&lt;br /&gt;
====ACS====&lt;br /&gt;
[[Bild:RP6_ACS_JP.JPG|thumb|RP6 ACS JP]]&lt;br /&gt;
Die Trennstelle ACS (SP2 E1: YIR1, YIR2; SP2 F1: YIR3) befindet sich neben C29*. Sie besteht aus 3 Lötpunkten, von denen die linken beiden (IRC1, IRC2) verbunden sind. Trennt man die Leiterbahn zwischen diesen Lötpunkten auf und verbindet stattdessen die rechten beiden Lötpunkte (IRC2, IRC3) mit etwas Lötzinn oder mit einem SMD Null Ohm Widerstand, dann ist der IR-Empfänger (TSOP, IC3) dauerhaft EINgeschaltet und kann nicht mehr über das Signal PWRON (PB4) geschaltet werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====IRC====&lt;br /&gt;
[[Bild:RP6_IRC_JP.JPG|thumb|RP6 IRC JP]]&lt;br /&gt;
Die Trennstelle IRC (SP2 C1: IRC1..2) ist eng verknüpft mit den Mess- und Kontaktpunkten des IRCOMM-Senders (siehe Abschnitt &amp;quot;Mess-/Kontaktpunkte - IRC&amp;quot; weiter oben!). Wenn man sie auftrennt, kann man den IRCOMM-Sender mit einer getrennten Stromversorgung anstelle von +UB des RP6 versehen. Dies ist sehr sinnvoll, wenn man diese Funktion häufig verwendet oder sogar noch leistungsfähigere IR-Sendedioden einbaut, denn der IRCOMM-Sender ist der zweitgrößte Stromfresser (nach dem Antrieb) auf dem RP6 (von Erweiterungsplatinen und EPs Marke Eigenbau einmal abgesehen!). Man kann hier natürlich auch eine 2-polige Stiftleiste einlöten, um die Verbindung zu +UB mit einer Codierbrücke trennbar zu machen. Eine getrennte Stromversorgung +7,2V (Bereich: +5,5 .. +10V) kann man an IRC1 einspeisen. IRC1 dieser Trennstelle ist mit dem Kontaktpunkt IRC3 (siehe Abschnitt &amp;quot;Mess-/Kontaktpunkte - IRC&amp;quot; weiter oben!) verbunden. &lt;br /&gt;
&lt;br /&gt;
====RP6 Antrieb====&lt;br /&gt;
Mit den folgenden Trennstellen kann man den RP6 Antrieb (H-Brücken und Motoren) fast komplett vom Rest des RP6 Mainboards abtrennen (es bleibt nur die 5V-Versorgung (VDD) von IC4, T1, T2 bestehen!). Damit ist es möglich, mit dem RP6 Mainboard einen ganz anderen Antrieb (also z.B. ein anderes Roboter-Chassis mit eigenen Motoren und H-Brücken) zu steuern. Umgekehrt könnte man den RP6 Antrieb auch deshalb abtrennen, um ihn durch ein anderes Prozessorsystem (z.B. auch eine M32!) anzusteuern. It's up to you!&lt;br /&gt;
&lt;br /&gt;
=====+UB Power=====&lt;br /&gt;
[[Bild:RP6_HB_Power.jpg|thumb|RP6 HB Power]]&lt;br /&gt;
Der RP6 Antrieb wird direkt aus dem Akku (über S1 und F1) mit 7,2V (+UB) versorgt. Diese Stromversorgung kann man komplett abtrennen. Die Trennstelle (SP3 E34: X) liegt unter der Sicherung F1 (siehe Abb. RP6 HB Power). Zwischen den beiden doppelten Lötflächen befinden sich auf der Lötseite (Unterseite) des Mainboards vier parallele Leiterbahnen, die aufgetrennt werden müssen. Der Pluspol einer externen Spannung zur Versorgung des RP6 Antriebs kann dann mit einer Kabelverbindung an den doppelten Lötflächen (mit einem &amp;quot;+&amp;quot; gekennzeichnet) direkt neben dem Leistungswiderstand (R27) angeschlossen werden. Eine Absicherung dieser Stromversorgung sollte man unbedingt vorsehen (2,5A träge)!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=====Stromsensoren=====&lt;br /&gt;
[[Bild:RP6_CS.JPG|thumb|RP6 CS]]&lt;br /&gt;
Um den Motorstrom der beiden Motoren des RP6 zu messen, wird ein Dual-Operationsverstärker (IC5 = 27M2C; SP3 B23/D23: IC5B/A) eingesetzt. Dieses IC wird über PWRON (PB4) mit Strom versorgt. Die Stromsensoren funktionieren also nicht, wenn PWRON Low-Pegel führt (Befehl powerOFF() der RP6 Library!). Auf dem RP6 Mainboard gibt es eine Trennstelle mit drei Lötflächen (SP3 E34: CS1, CS2, CS3). Sie befindet sich auf dem Mainboard neben C23. Möchte man IC5 nicht mehr über PWRON mit Strom versorgen, sondern über VDD (+5V), dann trennt man die Leiterbahn zwischen den linken beiden Lötpunkten (CS1, CS2) auf und verbindet die rechten beiden Lötpunkte (CS2, CS3) mit etwas Lötzinn oder einem SMD Null Ohm Widerstand. Danach sind die Stromsensoren immer eingeschaltet und können über PWRON nicht mehr geschaltet werden. Alternativ kann man an CS2 auch eine externe Versorgungsspannung (+5V) für IC5 einspeisen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=====DR/MR/ML/DL=====&lt;br /&gt;
[[Bild:RP6_DR_MR_ML_DL.JPG|thumb|RP6 DR MR ML DL]]&lt;br /&gt;
An diesen Trennstellen können die Eingänge der H-Brücke für die Geschwindigkeit (PWM) und Drehrichtung der Motoren von den Portpins des Microcontrollers abgetrennt werden.&lt;br /&gt;
Für den rechten Motor sind dies die Trennstellen MR1/2 und DR1/2 (SP3 A23: MR1/2, DR1/2), für den linken Motor ML1/2 und DL1/2 (SP3 F23: ML1/2, DL1/2).&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |Trennstelle&lt;br /&gt;
 |Portpin&lt;br /&gt;
 |Funktion H-Brücke&lt;br /&gt;
 |-&lt;br /&gt;
 |MR1/2&lt;br /&gt;
 |PD5 (OC1A)&lt;br /&gt;
 |PWM Motor rechts&lt;br /&gt;
 |-&lt;br /&gt;
 |DR1/2&lt;br /&gt;
 |PC3 (TMS)&lt;br /&gt;
 |Fahrtrichtung rechts&lt;br /&gt;
 |-&lt;br /&gt;
 |ML1/2&lt;br /&gt;
 |PD4 (OC1B)&lt;br /&gt;
 |PWM Motor links&lt;br /&gt;
 |-&lt;br /&gt;
 |DL1/2&lt;br /&gt;
 |PC2 (TCK)&lt;br /&gt;
 |Fahrtrichtung links&lt;br /&gt;
 |-&lt;br /&gt;
|}&lt;br /&gt;
Trennt man die Leiterbahn (auf der Lötseite des RP6 Mainboards) zwischen den Lötpunkten der Trennstellen auf, kann man die Eingänge der H-Brücke (Mx1, Dx1) z.B. mit einem anderen Microcontroller verbinden. Die Ausgänge (Portpins) des RP6 Microcontrollers (Mx2, Dx2) können dann anders genutzt werden. Natürlich kann man auf die Lötpunkte dieser Trennstellen auch Stiftleisten löten, um den Anschluß steckbar zu machen.&lt;br /&gt;
&lt;br /&gt;
=====MCR/MCL=====&lt;br /&gt;
[[Bild:RP6_MCR_MCL.JPG|thumb|RP6 MCR MCL]]&lt;br /&gt;
An diesen Trennstellen können die Motorstromsensoren von den ADC-Eingängen des Microcontrollers abgetrennt werden.&lt;br /&gt;
&lt;br /&gt;
Für den rechten Sensor ist dies die Trennstelle MCR1/2 (SP3 A1: MCR1, MCR2), für den linken Sensor MCL1/2 (SP3 E1: MCL1, MCL2).&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |Trennstelle&lt;br /&gt;
 |Portpin&lt;br /&gt;
 |Funktion H-Brücke&lt;br /&gt;
 |-&lt;br /&gt;
 |MCR1/2&lt;br /&gt;
 |PA5 (ADC5)&lt;br /&gt;
 |Motorstrom rechts&lt;br /&gt;
 |-&lt;br /&gt;
 |MCL1/2&lt;br /&gt;
 |PA6 (ADC6)&lt;br /&gt;
 |Motorstrom links&lt;br /&gt;
 |-&lt;br /&gt;
|}&lt;br /&gt;
Trennt man die Leiterbahn (auf der Lötseite des RP6 Mainboards) zwischen den Lötpunkten der Trennstellen auf, kann man die ADC-Eingänge (Portpins) des RP6 Microcontrollers (MCx1) anders nutzen und die Ausgänge der Motorstromsensoren (MCx2) z.B. mit ADC-Eingängen eines anderen Microcontrollers verbinden. Natürlich kann man auf die Lötpunkte dieser Trennstellen auch Stiftleisten löten, um den Anschluß steckbar zu machen.&lt;br /&gt;
&lt;br /&gt;
====PWRON-LED====&lt;br /&gt;
[[Bild:RP6_PWRON_L.JPG|thumb|RP6 PWRON L]]&lt;br /&gt;
Auf dem RP6 Mainboard gibt es eine gelbe LED, die anzeigt, ob PWRON High-Pegel hat. Mit einer Trennstelle neben dieser LED (SP2 D4: YL1, YL2) kann diese LED deaktiviert werden (z.B. um Strom zu sparen).&lt;br /&gt;
&lt;br /&gt;
Dazu trennt man die Leiterbahn zwischen den Lötpunkten auf. Soll die LED wieder aktiviert werden, verbindet man die Lötpunkte wieder mit etwas Lötzinn oder einem SMD Null Ohm Widerstand.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====+UB Sensor====&lt;br /&gt;
[[Bild:RP6_UB.JPG|thumb|RP6 UB]]&lt;br /&gt;
Die Versorgungsspannung +UB des RP6 wird mit dem +UB-Spannungssensor an PA7 (ADC7) gemessen. Will man diesen Spannungssensor mit seinem Eingangsspannungsteiler R1, R2 (SP1 D12: R1, R2) von +UB abtrennen (z.B. um ihn anders zu verwenden), gibt es eine Trennstelle UB1/2 (SP1 D2: UB1, UB2). Trennt man die Leiterbahn auf der Lötseite des RP6 Mainboards zwischen den Lötpunkten auf, kann +UB nicht mehr gemessen werden. Man kann dann den Lötpunkt UB2 mit einem anderen Messpunkt (z.B. mit +BAT) verbinden und dort die Spannung (0..10V) messen. Natürlich kann man auf die Lötpunkte dieser Trennstellen auch Stiftleisten löten, um den Anschluß steckbar zu machen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====EXT Anschluß: Andere Stromversorgung====&lt;br /&gt;
[[Bild:RP6_S1_CHRG.jpg|thumb|RP6 S1 CHRG]]&lt;br /&gt;
Wenn man für den RP6 eine andere Stromversorgung oder Ladeschaltung anschließen will, geht dies gut am EXT Anschluß (SP1 C23: Stecker EXT). Siehe auch den Abschnitt &amp;quot;Anschlüsse - EXT Anschluß&amp;quot; weiter oben! Dann muss der Schalter S1 dauerhaft AUSgeschaltet bleiben und die Verbindung zwischen S1 und CHRG des EXT Anschlusses (SP1 C3: X) unterbrochen werden. Diese Trennstelle befindet sich auf der Lötseite (Unterseite) des RP6 Mainboards etwas versteckt zwischen S1 (Pin 3) und der benachbarten Leiterbahn, die CHRG des EXT Anschlusses mit der Ladebuchse CHARGER (Pin 1 +) verbindet. Dort sind fünf kurze, parallele Leiterbahnen zu unterbrechen (siehe gelbe Markierung in der Abb. RP6 S1 CHRG!). Will man das nicht machen, darf man die Ladebuchse CHARGER auf jeden Fall nicht mehr nutzen!&lt;br /&gt;
&lt;br /&gt;
===Lochraster-Felder===&lt;br /&gt;
Auf diesen Feldern kann man eigene kleine Schaltungen aufbauen. An jedem der sechs Felder stehen VDD (+5V) und GND zur Verfügung (SP4 E12: YVDDx, YGNDx).&lt;br /&gt;
&lt;br /&gt;
Bitte beachten: Die Lochreihen oder -spalten, die mit einer eckigen Klammer &amp;quot;[&amp;quot; markiert sind, liegen auf der Lötseite (Unterseite) direkt auf dem Rahmen des Chassis! Hier können also keine Drähte von unten verlötet werden.&lt;br /&gt;
&lt;br /&gt;
====Vorn links====&lt;br /&gt;
Das kleine Lochrasterfeld vorn links kann z.B. für Beleuchtung (Blinker, Scheinwerfer links) oder auch für einen zusätzlichen Sensor genutzt werden.&lt;br /&gt;
Zur Verfügung steht eine 2-adrige Verbindung zum mittleren Lochrasterfeld links.&lt;br /&gt;
&lt;br /&gt;
In der Nähe dieses Lochrasterfeldes gibt es auch:&lt;br /&gt;
* IO3, IO4 (SP2 E3: IO3, IO4)&lt;br /&gt;
* ADC0 (SP2 B1: ADC0)&lt;br /&gt;
&lt;br /&gt;
====Mitte links====&lt;br /&gt;
[[Bild:RP6_Lochfeld_LM.JPG|thumb|RP6 Lochrasterfeld Mitte links]]&lt;br /&gt;
Das größere Lochrasterfeld Mitte links kann z.B. für eine kleinere Schaltung zur Ansteuerung der Beleuchtung/Sensoren auf den Lochrasterfeldern vorn und hinten links oder für andere Zwecke genutzt werden.&lt;br /&gt;
&lt;br /&gt;
Es stehen hier folgende Anschlüsse zur Verfügung:&lt;br /&gt;
* 2-adrige Verbindung zum Lochrasterfeld vorn links&lt;br /&gt;
* 2-adrige Verbindung zum Lochrasterfeld hinten links&lt;br /&gt;
* ST1/ST2 zum Anschluß weiterer Start/Stop Taster (SP2 D2: ST1/2)&lt;br /&gt;
* PWR (SP2 D2: YPWR1)&lt;br /&gt;
* I2C-Bus (SCL, SDA; SP4 C1: YSCL1, YSDA1)&lt;br /&gt;
* +UB (SP4 D2: YUB1)&lt;br /&gt;
In der Nähe dieses Lochrasterfeldes gibt es auch:&lt;br /&gt;
* Serielle Schnittstelle (RST, TX, RX; SP4 AB5: YRX, YTX, YMRESET, YVDD)&lt;br /&gt;
* USRBUS1 (vorn; SP4 E34: Y1'..Y14')&lt;br /&gt;
&lt;br /&gt;
=====Schaltungsvorschläge=====&lt;br /&gt;
Wie kann z.B. eine Schaltung für Beleuchtungseffekte oder Sensoren aussehen?&lt;br /&gt;
&lt;br /&gt;
Man könnte 8 zusätzliche Schaltkanäle mit dem I2C-Portexpander-IC PCF8574(A)P gewinnen. Dieses IC passt mit wenigen Zusatzteilen auf die mittlere Lochrasterfläche. Angesteuert wird es über den I2C-Bus. Mit den 8 Ausgängen lassen sich einige Beleuchtungseffekte erreichen, die dann über Software schaltbar sind.&lt;br /&gt;
&lt;br /&gt;
Alternativ kann man auch das IC PCF8591P z.B. für den Anschluß von analogen Sensoren verwenden. Auch dieser Baustein wird über I2C angesteuert. Beide ICs sind bei [http://www.reichelt.de./ Reichelt] erhältlich.&lt;br /&gt;
&lt;br /&gt;
Will man nicht den I2C-Bus benutzen, kann man als I/O-Ports IO1..IO4 oder als analoge Eingänge ADC0 und ADC1 verwenden. Auch SCL und SDA stehen als I/O-Ports zur Verfügung, wenn der I2C-Bus im ganzen System nicht verwendet werden soll.&lt;br /&gt;
&lt;br /&gt;
Wichtig für Zusatzschaltungen, die fest auf dem RP6 verlötet werden, sind zwei Aspekte:&lt;br /&gt;
* Wenn sie die Stromversorgung belasten, sollten sie (z.B. über einen Transistor oder MOSFET) abschaltbar sein. Dazu kann man auch das Signal PWR heranziehen, das auf beiden mittleren Lochrasterflächen zur Verfügung steht. Dann kann man mit dem Befehl &amp;quot;powerOFF()&amp;quot; der RP6 Library die Stromversorgung per Software abschalten.&lt;br /&gt;
* Wenn man auch anderweitig genutzte Portpins (SDA, SCL, IO1..IO4, ADC0/1) für die eigene Schaltung einsetzt, sollte man die Verbindung zu den Portpins mit einer abziehbaren Codierbrücke trennbar machen.&lt;br /&gt;
&lt;br /&gt;
====Hinten links====&lt;br /&gt;
Das kleine Lochrasterfeld hinten links kann z.B. für Beleuchtung (Blinker, Rücklicht links) oder auch für einen zusätzlichen Sensor genutzt werden.&lt;br /&gt;
Zur Verfügung steht eine 2-adrige Verbindung zum mittleren Lochrasterfeld links.&lt;br /&gt;
&lt;br /&gt;
In der Nähe dieses Lochrasterfeldes gibt es auch:&lt;br /&gt;
* EXT Anschluß (SP1 C23: Stecker EXT)&lt;br /&gt;
&lt;br /&gt;
====Vorn rechts====&lt;br /&gt;
Das kleine Lochrasterfeld vorn rechts kann z.B. für Beleuchtung (Blinker, Scheinwerfer rechts) oder auch für einen zusätzlichen Sensor genutzt werden.&lt;br /&gt;
Zur Verfügung steht eine 2-adrige Verbindung zum mittleren Lochrasterfeld rechts.&lt;br /&gt;
&lt;br /&gt;
In der Nähe dieses Lochrasterfeldes gibt es auch:&lt;br /&gt;
* IO1, IO2 (SP2 E3: IO1, IO2)&lt;br /&gt;
* ADC1 (SP2 B1: ADC1)&lt;br /&gt;
&lt;br /&gt;
====Mitte rechts====&lt;br /&gt;
Das größere Lochrasterfeld Mitte rechts kann z.B. für eine kleinere Schaltung zur Ansteuerung der Beleuchtung/Sensoren auf den Lochrasterfeldern vorn und hinten rechts oder für andere Zwecke genutzt werden.&lt;br /&gt;
&lt;br /&gt;
Es stehen hier folgende Anschlüsse zur Verfügung:&lt;br /&gt;
* 2-adrige Verbindung zum Lochrasterfeld vorn rechts&lt;br /&gt;
* 2-adrige Verbindung zum Lochrasterfeld hinten rechts&lt;br /&gt;
* PWR (SP2 D2: YPWR2)&lt;br /&gt;
* I2C-Bus (SCL, SDA; SP4 C1: YSCL2, YSDA2)&lt;br /&gt;
* +UB (SP4 D2: YUB2)&lt;br /&gt;
In der Nähe dieses Lochrasterfeldes gibt es auch:&lt;br /&gt;
* Interrupt-Anschluß (INTU, INT1..3, MRESET; SP4 D34: MRESET, INT1..3, INTU)&lt;br /&gt;
* USRBUS2 (hinten; SP4 E34: Y1..Y14)&lt;br /&gt;
&lt;br /&gt;
====Hinten rechts====&lt;br /&gt;
Das kleine Lochrasterfeld hinten rechts kann z.B. für Beleuchtung (Blinker, Rücklicht rechts) oder auch für einen zusätzlichen Sensor genutzt werden.&lt;br /&gt;
Zur Verfügung steht eine 2-adrige Verbindung zum mittleren Lochrasterfeld rechts.&lt;br /&gt;
&lt;br /&gt;
In der Nähe dieses Lochrasterfeldes gibt es auch:&lt;br /&gt;
* EXT Anschluß (SP1 C23: Stecker EXT)&lt;br /&gt;
* Akku-Anschluß (SP1 B3: BATTERY)&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Erweiterungen==&lt;br /&gt;
Auf / An den RP6 könnte man z.B. noch folgendes anbauen / erweitern:&lt;br /&gt;
&lt;br /&gt;
* Einen Greifarm&lt;br /&gt;
* Einen Ultraschallsensor&lt;br /&gt;
* Zwei Lichtsensoren hinten, um die hellste / dunkelste Stelle im Raum besser zu finden&lt;br /&gt;
* Einen digitalen Kompass&lt;br /&gt;
* uvm.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Erweiterungs-Module==&lt;br /&gt;
&lt;br /&gt;
Es sind von Arexx schon einige Erweiterungsmöglichkeiten auf dem Markt. Zum Ersten die Experimentierplatinen ([http://www.conrad.de/ce/de/product/191537/Arexx-RP6-Experimentierplatine 191537] AUSVERKAUFT!), die zum Erstellen von eigenen Schaltungen und Sensoren gedacht sind, und von denen eine schon im Lieferumfang des RP6 enthalten war, das Erweiterungsboard RP6 CONTROL M32 ([http://www.conrad.de/ce/de/product/191550/Arexx-RP6-ATMEGA32-Erweiterungssatz 191550] AUSVERKAUFT!) und die RP6 CCPRO M128 ([http://www.conrad.de/ce/de/product/191563/Arexx-RP6-CC-PRO-MEGA128-Erweiterungssatz 191563]).&lt;br /&gt;
&lt;br /&gt;
Die Boards kann man dann über den I2C Bus mit dem Mainboard kommunizieren lassen.  Es ist sehr sinnvoll, die Module symmetrisch hintereinander zu stapeln und nicht mehr als 6-8 Module zu verbauen, weil der Roboter sonst immer schwerer und langsamer wird. Basierend auf dem Master-Slave System könnte man so bis zu 127 Slaves anschließen. Zudem ist es ratsam, qualitativ hochwertige Akkus und ein Ladegerät mit passendem Stecker zu verwenden, da man ansonsten immer das Mainboard abschrauben müsste um an die Akkus heranzukommen. Für den Fall wurde extra eine Ladebuchse eingebaut.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Experimentierplatine ===&lt;br /&gt;
[[Bild:RP6_Exp.jpg|RP6 Experimentierplatine]]&lt;br /&gt;
&lt;br /&gt;
====Beschreibung====&lt;br /&gt;
Die Experimentier-Platine ist dazu gedacht, eigene Schaltungen auf dem RP6 zu realisieren, und ist seit Mai 2020 bei CONRAD ausverkauft. Sie wird über den I²C-Bus mit den anderen Erweiterungsmodulen verbunden. Ausserdem ist es sinnvoll, die (freien) I/O-Ports (ADC-Kanäle) der RP6 Base, des M32 Erweiterungsmoduls bzw. des CCPRO M128 Moduls über ein [http://www.reichelt.de/?;ACTION=3;LA=444;GROUP=C63;GROUPID=3328;ARTICLE=47637;START=0;SORT=artnr;OFFSET=16;SID=1580faBqwQAQ8AAGY-ZAM7cd511ee04a106a88a359faaac0071e2 10-Pol-Flachbandkabel] mit [http://www.reichelt.de/?ACTION=3;GROUP=C151;GROUPID=3231;ARTICLE=14571;SID=1580faBqwQAQ8AAGY-ZAM7cd511ee04a106a88a359faaac0071e2 Stecker] auf die Experimentierplatine zu führen, weil es übersichtlicher bleibt und keine Kabel lose herumhängen. Auf der Experimentierplatine kann man dann LEDs oder einen Temperatursensor an die I/O-Ports bzw. an die ADC-Kanäle anschießen.&lt;br /&gt;
&lt;br /&gt;
====Technische Daten====&lt;br /&gt;
{|  {{Blauetabelle}} &lt;br /&gt;
|'''Mikrocontroller:'''&lt;br /&gt;
|Keiner&lt;br /&gt;
|-&lt;br /&gt;
|'''Speicher:'''&lt;br /&gt;
|Keiner&amp;lt;br/&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|'''Programmierung:'''&lt;br /&gt;
|Kein Programmieradapter&lt;br /&gt;
|-&lt;br /&gt;
|'''Vorhandene Sensoren:'''&lt;br /&gt;
|Keine&amp;lt;br/&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|'''Vorhandene Aktoren:'''&lt;br /&gt;
|Keine&amp;lt;br/&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|'''Abmessungen:'''&lt;br /&gt;
|(L &amp;amp;times; B &amp;amp;times; H) 112 &amp;amp;times; 90 &amp;amp;times; 10 mm&lt;br /&gt;
|-&lt;br /&gt;
|'''Ausführung:'''&lt;br /&gt;
|Bausatz&lt;br /&gt;
|-&lt;br /&gt;
|'''Stromversorgung:'''&lt;br /&gt;
|6 AA NiMH Akkus (über die RP6 Base)&lt;br /&gt;
|-&lt;br /&gt;
|'''Hersteller:'''&lt;br /&gt;
|Arexx Niederlande&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Schaltungsideen ====&lt;br /&gt;
Auf der / den Experimentierplatinen könnte man z.B. folgendes realisieren:&lt;br /&gt;
&lt;br /&gt;
* eine Kameraschaltung (wie [http://www.rn-wissen.de/index.php/RP6_Kamera_-_Mitmach-Projekt hier] gezeigt)&lt;br /&gt;
* Scheinwerfer, Rücklichter, Blinker etc. (ABER immer mit Vorwiderstand!!!)&lt;br /&gt;
* ein LED-Lauflicht (über I/O-Expander, gibt´s beim [http://www.reichelt.de/?ACTION=3;ARTICLE=14527;PROVID=2402 Reichelt])&lt;br /&gt;
* mehr ADC-Kanäle (über ADC-Expander, einfach mal nach PCF8591 [http://www.google.de/search?q=PCF8591 googlen])&lt;br /&gt;
* eine Wetterstation mit Luftfeuchtemesser, Temperaturfühler und Lichtmesser ([http://www.roboternetz.de/phpBB2/viewtopic.php?t=52298 hier] gibt es eine Wetterstation uvm.)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== RP6 CONTROL M32 Platine ===&lt;br /&gt;
[[Bild:RP6Control_M32.jpg|RP6 CONTROL M32]]&lt;br /&gt;
&lt;br /&gt;
====Beschreibung====&lt;br /&gt;
Auf der M32 ([http://www.conrad.de/ce/de/product/191550/Arexx-RP6-ATMEGA32-Erweiterungssatz 191550]) lassen sich weitere LEDs, Sensoren oder ähnliches anschließen, außerdem steht ein weiterer ATMEGA32 zur Verfügung, welcher sich gut im Master Modus betreiben lässt. Es sind ein Mikrofonsensor, fünf Taster, vier Status-LEDs, ein Display-Port, ein Beeper, 6 freie ADC-Kanäle, 8 freie I/O-Ports, ein Programmieradapter, ein JTAG-Anschluss, eine ISP-Programmierschnittstelle sowie ein freier Steckplatz für ein EEPROM verfügbar.&lt;br /&gt;
&lt;br /&gt;
Seit Ende 2021 ist die M32 bei CONRAD ausverkauft!&lt;br /&gt;
&lt;br /&gt;
====Technische Daten====&lt;br /&gt;
{|  {{Blauetabelle}} &lt;br /&gt;
|'''Mikrocontroller:'''&lt;br /&gt;
|AVR [[ATmega32]]&lt;br /&gt;
|-&lt;br /&gt;
|'''Speicher:'''&lt;br /&gt;
|32 kB [[Flash]]-Speicher, davon 1 kB bereits vom Bootloader belegt&amp;lt;br/&amp;gt;&lt;br /&gt;
2 kB SRAM&amp;lt;br/&amp;gt; &lt;br /&gt;
1 kB [[EEPROM]]&lt;br /&gt;
|-&lt;br /&gt;
|'''Programmierung:'''&lt;br /&gt;
|Über AVR-[[Bootloader]], belegt ca. 1 kB des Flash-Speichers&lt;br /&gt;
|-&lt;br /&gt;
|'''Vorhandene Sensoren:'''&lt;br /&gt;
|1 Mikrofonsensor&amp;lt;br/&amp;gt;&lt;br /&gt;
5 Eingabetaster&amp;lt;br/&amp;gt;&lt;br /&gt;
14 I/O Ports, davon 6 ADC-Wandler&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|'''Vorhandene Aktoren:'''&lt;br /&gt;
|1 Beeper&amp;lt;br/&amp;gt;&lt;br /&gt;
4 Status-LEDs&amp;lt;br/&amp;gt;&lt;br /&gt;
1 LC-Display-Port&amp;lt;br/&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|'''Abmessungen:'''&lt;br /&gt;
|(L &amp;amp;times; B &amp;amp;times; H) 112 &amp;amp;times; 90 &amp;amp;times; 15 mm&lt;br /&gt;
|-&lt;br /&gt;
|'''Ausführung:'''&lt;br /&gt;
|Fertig aufgebautes Erweiterungsmodul&lt;br /&gt;
|-&lt;br /&gt;
|'''Stromversorgung:'''&lt;br /&gt;
|6 AA NiMH Akkus (über die RP6 Base)&lt;br /&gt;
|-&lt;br /&gt;
|'''Hersteller:'''&lt;br /&gt;
|Arexx Niederlande&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Umbau-Optionen ====&lt;br /&gt;
Dieser Absatz soll die Möglichkeiten der RP6 CONTROL M32 Platine (im Folgenden &amp;quot;M32&amp;quot; genannt) auflisten, die es gibt, um auf einfache Weise weitere Anschlüsse oder Verbindungen zu ermöglichen. Nicht beschrieben werden die Anschlußmöglichkeiten, die in Form der vorhandenen Wannenstecker sowieso gegeben sind (z.B. am LCD-, I/O- oder ADC-Stecker). Im Text gibt es Verweise auf den Schaltplan der M32 (RP6_CONTROL_M32.PDF) in der Form: (SP2 B1: Bauteil).  Dies bedeutet, dass man das Bauteil auf Blatt 2 des RP6-M32-Schaltplans im Feld B1 finden kann.&lt;br /&gt;
&lt;br /&gt;
Folgende Möglichkeiten zum Umbau/Ausbau sind vorgesehen:&lt;br /&gt;
* Zweites SPI-EEPROM (IC5)&lt;br /&gt;
* Zwei analoge Sensoren, evtl. mit getrennter Stromversorgung&lt;br /&gt;
* ISP (In System Programming)&lt;br /&gt;
* JTAG-Programmierung&lt;br /&gt;
* USRBUS&lt;br /&gt;
* IRQ-Zuweisung ändern&lt;br /&gt;
* ADC0 und ADC1 anders nutzen&lt;br /&gt;
* Schieberegister kaskadieren&lt;br /&gt;
Im folgenden Text soll beschrieben werden, wie man die weiteren Möglichkeiten nutzen kann. Es wird jeweils erwähnt, was man an Material braucht. Beispielhaft sind da Bestell-Nummern der Firma [http://www.conrad.de/ce/ CONRAD] genannt. Natürlich kann man die Teile auch bei anderen Versendern beziehen. Durch die Nennung der Bestell-Nummer ist das jeweilige Teil aber gut zu identifizieren. Man sollte Löten können und sich bewußt sein, dass ggf. ein Garantieanspruch nicht mehr besteht, wenn man an der Platine gelötet hat.&lt;br /&gt;
&lt;br /&gt;
Bei den Materialangaben ist öfter die Rede von &amp;quot;Steckbuchsen mit Litze&amp;quot;. Diese Steckbuchsen mit angelöteter Litze können auf die ein- oder zweireihigen Stiftleisten aufgesteckt werden. Leider gibt es sie nicht (mehr) fertig konfektioniert bei CONRAD. Die einreihigen Steckbuchsen (RM 2,54mm) kann man aber z.B. bei [http://www.elv.de/output/controller.aspx ELV] bekommen: 2-polig (68-016635), 3-polig (68-022503) und 5-polig (68-023073). An sie muss man dann noch Litzen in der entsprechenden Länge selbst anlöten.&lt;br /&gt;
&lt;br /&gt;
===== Zweites SPI-EEPROM =====&lt;br /&gt;
Es ist sehr einfach, ein zweites SPI-EEPROM (SP1 A1: IC5*) auf der M32 zu nutzen.&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_M32_IC5-Socket.JPG|thumb|Sockel des 2. SPI-EEPROMs]]&lt;br /&gt;
&lt;br /&gt;
Man braucht dazu:&lt;br /&gt;
* Einen IC-Sockel 8-pol DIP für IC5 ([http://www.conrad.de/ce/de/product/189600/IC-FASSUNG-PRAeZISION-8POLIG 189600])&lt;br /&gt;
* Einen Keramik-Vielschicht-Kondensator 100nF (C19); RM 2,54mm ([http://www.conrad.de/ce/de/product/453099/?insert=36&amp;amp;insertNoDeeplink&amp;amp;productname=KONDENSATOR-01-F-KDPU-254-MM 453099])&lt;br /&gt;
* Ein serielles SPI-EEPROM im PDIP8 Gehäuse (IC5)&lt;br /&gt;
Zuerst wird der IC-Sockel eingelötet (Kerbe beachten!), dann C19 (SP1 A1: C19*). Das war's.&lt;br /&gt;
&lt;br /&gt;
Leider gibt es das EEPROM nicht bei den gängigeren Versendern. Bekommen kann man es aber z.B. bei [http://de.farnell.com/jsp/home/homepage.jsp Farnell]. Dort hat das SPI-EEPROM mit 256 kbit die Bezeichnung 25LC256-I/P (1331398). Wenn man es noch größer mag: 25LC1024 (1331392) mit 1024 kbit. SPI-EEPROMs führt inzwischen auch [http://www.reichelt.de./ Reichelt].&lt;br /&gt;
&lt;br /&gt;
'''Programmierung:'''&lt;br /&gt;
&lt;br /&gt;
In die RP6ControlLib.h bitte einfügen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#define SPI_EEPROM2_PAGESIZE 64&lt;br /&gt;
&lt;br /&gt;
uint8_t SPI_EEPROM2_readByte(uint16_t memAddr);&lt;br /&gt;
void SPI_EEPROM2_writeByte(uint16_t memAddr, uint8_t data);&lt;br /&gt;
void SPI_EEPROM2_enableWrite(void);&lt;br /&gt;
void SPI_EEPROM2_disableWrite(void);&lt;br /&gt;
uint8_t SPI_EEPROM2_getStatus(void);&lt;br /&gt;
&lt;br /&gt;
void SPI_EEPROM2_writeBytes(uint16_t startAddr, uint8_t *buffer, uint8_t length);&lt;br /&gt;
void SPI_EEPROM2_readBytes(uint16_t startAddr, uint8_t *buffer, uint8_t length);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Die Konstante SPI_EEPROM2_PAGESIZE ist abhängig von der Art und Größe des EEPROMs. Für ein 256 kbit-EEPROM ist die Seitengröße (pagesize) in der Regel 64, für einen 512 kbit-Typ 128 und für einen 1024 kbit-Typ 256.&lt;br /&gt;
&lt;br /&gt;
In die RP6ControlLib.c bitte einfügen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Second external SPI EEPROM:&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Reads a single Byte from the 2nd external EEPROM.&lt;br /&gt;
 */&lt;br /&gt;
uint8_t SPI_EEPROM2_readByte(uint16_t memAddr)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t data;&lt;br /&gt;
	PORTB &amp;amp;= ~MEM_CS2;&lt;br /&gt;
	writeSPI(SPI_EEPROM_READ);&lt;br /&gt;
	writeWordSPI(memAddr);&lt;br /&gt;
	data = readSPI();&lt;br /&gt;
	PORTB |= MEM_CS2;&lt;br /&gt;
	return data;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Reads &amp;quot;length&amp;quot; Bytes into the Buffer &amp;quot;buffer&amp;quot; from startAdr on. &lt;br /&gt;
 * You can read the complete 2nd EEPROM into a buffer at once - if it is large enough. &lt;br /&gt;
 * (But you only have 2KB SRAM on a MEGA32 ;) )&lt;br /&gt;
 */&lt;br /&gt;
void SPI_EEPROM2_readBytes(uint16_t startAddr, uint8_t *buffer, uint8_t length)&lt;br /&gt;
{&lt;br /&gt;
	PORTB &amp;amp;= ~MEM_CS2;&lt;br /&gt;
	writeSPI(SPI_EEPROM_READ);&lt;br /&gt;
	writeWordSPI(startAddr);&lt;br /&gt;
	readBufferSPI(&amp;amp;buffer[0], length);&lt;br /&gt;
	PORTB |= MEM_CS2;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Enable Write Mode&lt;br /&gt;
 */&lt;br /&gt;
void SPI_EEPROM2_enableWrite(void)&lt;br /&gt;
{&lt;br /&gt;
	PORTB &amp;amp;= ~MEM_CS2;&lt;br /&gt;
	writeSPI(SPI_EEPROM_WREN);&lt;br /&gt;
	PORTB |= MEM_CS2;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Disable Write Mode&lt;br /&gt;
 */&lt;br /&gt;
void SPI_EEPROM2_disableWrite(void)&lt;br /&gt;
{&lt;br /&gt;
	PORTB &amp;amp;= ~MEM_CS2;&lt;br /&gt;
	writeSPI(SPI_EEPROM_WRDI);&lt;br /&gt;
	PORTB |= MEM_CS2;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Write a single data byte to the specified 2nd EEPROM address.&lt;br /&gt;
 */&lt;br /&gt;
void SPI_EEPROM2_writeByte(uint16_t memAddr, uint8_t data)&lt;br /&gt;
{&lt;br /&gt;
	while(SPI_EEPROM2_getStatus() &amp;amp; SPI_EEPROM_STAT_WIP);&lt;br /&gt;
	SPI_EEPROM2_enableWrite();&lt;br /&gt;
	PORTB &amp;amp;= ~MEM_CS2;&lt;br /&gt;
	writeSPI(SPI_EEPROM_WRITE);&lt;br /&gt;
	writeWordSPI(memAddr);&lt;br /&gt;
	writeSPI(data);&lt;br /&gt;
	PORTB |= MEM_CS2;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Write &amp;quot;length&amp;quot; Bytes from the Buffer to the 2nd EEPROM. &lt;br /&gt;
 * YOU CAN ONLY WRITE MAXIMAL [SPI_EEPROM2_PAGESIZE] BYTES AT ONCE!!!&lt;br /&gt;
 * This is the Pagesize!&lt;br /&gt;
 * You can NOT cross a page boundary!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void SPI_EEPROM2_writeBytes(uint16_t startAddr, uint8_t *buffer, uint8_t length)&lt;br /&gt;
{&lt;br /&gt;
	while(SPI_EEPROM2_getStatus() &amp;amp; SPI_EEPROM_STAT_WIP);&lt;br /&gt;
	SPI_EEPROM2_enableWrite();&lt;br /&gt;
	PORTB &amp;amp;= ~MEM_CS2;&lt;br /&gt;
	writeSPI(SPI_EEPROM_WRITE);&lt;br /&gt;
	writeWordSPI(startAddr);&lt;br /&gt;
	writeBufferSPI(&amp;amp;buffer[0], length);&lt;br /&gt;
	PORTB |= MEM_CS2;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Returns EEPROM Status register - for checking if 2nd EEPROM is buisy. &lt;br /&gt;
 * Writing takes about 5ms. &lt;br /&gt;
 */&lt;br /&gt;
uint8_t SPI_EEPROM2_getStatus(void)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t status;&lt;br /&gt;
	PORTB &amp;amp;= ~MEM_CS2;&lt;br /&gt;
	writeSPI(SPI_EEPROM_RDSR);&lt;br /&gt;
	status = readSPI();&lt;br /&gt;
	PORTB |= MEM_CS2;&lt;br /&gt;
	return status;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Hinweis zum 1024 kbit-EEPROM:&lt;br /&gt;
&lt;br /&gt;
Dieses EEPROM benötigt 24-Bit Adressen und muss daher etwas anders angesprochen werden als die &amp;quot;kleineren&amp;quot; Typen bis 512 kbit.&lt;br /&gt;
Die Funktion SPI_EEPROM2_readByte() sieht für ein 1024 kbit-EEPROM z.B. so aus:&lt;br /&gt;
&amp;lt;pre&amp;gt;uint8_t SPI_EEPROM2_readByte(uint32_t memAddr)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t data;&lt;br /&gt;
	PORTB &amp;amp;= ~MEM_CS2;&lt;br /&gt;
	writeSPI(SPI_EEPROM_READ);&lt;br /&gt;
	writeSPI((uint8_t)(memAddr &amp;gt;&amp;gt; 16));&lt;br /&gt;
	writeWordSPI((uint16_t)memAddr);&lt;br /&gt;
	data = readSPI();&lt;br /&gt;
	PORTB |= MEM_CS2;&lt;br /&gt;
	return data;&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
Alle weiteren Funktionen, die EEPROM-Adressen verwenden (SPI_EEPROM2_readBytes, SPI_EEPROM2_writeByte, SPI_EEPROM2_writeBytes), müssen genau so angepasst werden.&lt;br /&gt;
&lt;br /&gt;
===== Anschlüsse =====&lt;br /&gt;
Hier wird aufgelistet, wo man auf der M32 Platine Anschlüsse nutzen kann, um sie z.B. zu weiteren Sensoren, zum USRBUS oder (weniger empfehlenswert!) direkt zu EPs, zur RP6 Base oder zur CCPRO M128 zu führen. &lt;br /&gt;
&lt;br /&gt;
====== Analoge Sensoren an ADC2/3 ======&lt;br /&gt;
[[Bild:RP6_M32_ADC23.JPG|thumb|ADC2 ADC3]]&lt;br /&gt;
Wenn man bis zu zwei analoge Sensoren (z.B. IR-Distanz-Mess-Sensoren Sharp GP2Y0A02YK 185364) direkt an die M32 anschließen möchte, dann gibt es da zwei 3-polige Kontakte, beschriftet mit VDD/GND/ADCx (x = 2..3). Hier kann man 3-polige Stiftleisten auflöten, an die dann die Sensoren angeschlossen werden.&lt;br /&gt;
&lt;br /&gt;
Man braucht dazu:&lt;br /&gt;
* 1-reihige Stiftleiste RM 2,54mm (z.B. 36-polig 732478)&lt;br /&gt;
* Zwei Keramik-Vielschicht-Kondensatoren 100nF (C16, C17); RM 2,54mm (453099)&lt;br /&gt;
* Ein Elektrolyt-Kondensator stehend 470 uF / 16V (C18); RM 3,5mm (446211)&lt;br /&gt;
* Zwei 3-polige Steckbuchsen mit Litze zum Anschluß der Sensoren&lt;br /&gt;
Man trennt von der 1-reihigen Stiftleiste zweimal 3 Kontakte ab und lötet sie auf die weiß umrahmten Kontakte (VDD/GND/ADCx; SP2 C23: ADC2, YGND8, YVDD6, ADC3, YGND7, YVDD5), anschließend C16, C17 (SP2 C1: C16*, C17*) auf ihre Plätze und zum Schluß den Elko 470 uF (C18; SP2 B1: C18*). Beim Elko auf die Polung achten: Er muss genau so sitzen wie sein Nachbar C1 (Minuspol schaut zum Beeper SND).&lt;br /&gt;
&lt;br /&gt;
Die Sensoren lötet man an die Litzen der 3-poligen Steckbuchsen und steckt diese auf die neuen Kontakte.&lt;br /&gt;
&lt;br /&gt;
Da manche Sensoren einen höheren Stromverbrauch haben, kann man die Stromversorgung an den VDD-Pins der ADC2/3-Stecker abschaltbar machen oder eine separate +5V-Spannung einspeisen. Siehe dazu den Abschnitt &amp;quot;Trennstellen - Getrennte Stromversorgung für ADC2/3&amp;quot; weiter unten!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====== ISP (In System Programming) ======&lt;br /&gt;
Der ATMEGA32 der M32 wird standardmäßig über den PROG/UART Stecker programmiert. Dazu befindet sich im Prozessor ein Bootloader-Programm. Wenn man stattdessen oder zusätzlich die ISP-Programmierung mit einem dafür geeigneten ISP-Programmier-Adapter nutzen will, kann man den Adapter an den gewinkelten ISP-Stecker auf der M32 anschließen.&lt;br /&gt;
Vorher sind aber ein paar &amp;quot;Umbauarbeiten&amp;quot; erforderlich.&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_M32_ISP.JPG|thumb|ISP]]&lt;br /&gt;
&lt;br /&gt;
Man braucht dazu:&lt;br /&gt;
* 1-reihige Stiftleiste RM 2,54mm (z.B. 36-polig 732478)&lt;br /&gt;
* Einen SMD-Widerstand 10 kOhm (406376)&lt;br /&gt;
* Eine SMD-Diode LL 4148 (140902)&lt;br /&gt;
* Eine Codierbrücke (z.B. aus Set 742902)&lt;br /&gt;
&lt;br /&gt;
Der SMD-Widerstand wird auf seinen Platz (R1; SP1 A3: R1*) neben dem XBUS2-Stecker gelötet, danach die Diode LL 4148 (D2; SP1 B3: D2*). Die Kathode (Strich) der Diode zeigt in Richtung des Quarzes (X1). Zwischen R1 und C1 befinden sich drei Lötpunkte (beschriftet mit ISP/DEBUG - BOOTLOAD; SP1 A34: YRST1..3), auf die eine 3-polige Stiftleiste gelötet werden muss. Vorher muss eine kurze Leiterbahn zwischen den Lötpunkten BOOTLOAD aufgetrennt werden. Die Leiterbahn befindet sich auf der Lötseite der Platine und muss mit einem scharfen Messer oder einem speziellen Leiterbahn-Unterbrecher zwischen den beiden Lötpunkten unterbrochen werden. Man sollte anschließend mit einem Widerstandsmeßgerät nachmessen: Es sollte keine Verbindung mehr zwischen den Lötpunkten bestehen.&lt;br /&gt;
Man trennt dann von der 1-reihigen Stiftleiste 3 Kontakte ab und lötet sie auf die beschriebenen drei Lötpunkte.&lt;br /&gt;
&lt;br /&gt;
Wenn man jetzt eine Codierbrücke auf die mit &amp;quot;BOOTLOAD&amp;quot; beschrifteten Pins steckt, bleibt alles unverändert: Die Programmierung erfolgt weiter über den PROG/UART-Stecker mithilfe des Bootloaders im Prozessor. Wird die Codierbrücke in Stellung &amp;quot;ISP/DEBUG&amp;quot; umgesteckt, kann der Prozessor mit ISP programmiert werden.&lt;br /&gt;
&lt;br /&gt;
Vorsicht: Das Bootloader-Programm kann dabei zerstört werden! Es müssen zusätzlich Fusebits des ATMEGA32 verändert werden. &lt;br /&gt;
&lt;br /&gt;
Dabei kann der Prozessor im schlimmsten Fall nicht mehr ansprechbar sein. Man sollte diesen Umbau und die ISP-Programmierung nur machen, wenn man genau weiß, was man macht!&lt;br /&gt;
&lt;br /&gt;
Eine Kopie des Bootloaders und eine Kurzanleitung zum Einstellen der Fusebits gibt es hier: &lt;br /&gt;
[http://www.arexx.com/rp6/downloads/RP6_M32_BOOTLOADER.zip RP6_M32_BOOTLOADER]&lt;br /&gt;
&lt;br /&gt;
====== JTAG ======&lt;br /&gt;
[[Bild:RP6_M32_JTAG.JPG|thumb|JTAG]]&lt;br /&gt;
Die Programmierung und ein Debuggen sind auch mit der JTAG-Schnittstelle möglich. Das ist nur zu empfehlen, wenn man Erfahrungen mitbringt, oder der Prozessor der M32 durch eine ISP-Falschprogrammierung z.B. nicht mehr ansprechbar ist.&lt;br /&gt;
Um die JTAG-Schnittstelle nutzen zu können, muss der ISP-Umbau durchgeführt worden sein und die dort beschriebene Codierbrücke auf &amp;quot;ISP/DEBUG&amp;quot; gesteckt sein. Der JTAG-Programmer kann dann an die Lötpunkte &amp;quot;JTAG&amp;quot; zwischen ISP- und I/O-Stecker angeschlossen werden.&lt;br /&gt;
&lt;br /&gt;
Man braucht dazu:&lt;br /&gt;
* 2-reihige Stiftleiste RM 2,54mm (z.B. 2x36-polig 742007)&lt;br /&gt;
Man trennt von der 2-reihigen Stiftleiste 2x5 Kontakte ab und lötet sie auf die 10 JTAG-Lötpunkte (SP2 A12: YTDI, YTDO, YTMS, YTCK, YTRST, YVDD3/4, YGND3/4, YNC). Hier kann jetzt der JTAG-Programmer z.B. mit einem 10-poligen Flachkabel-Stecker angeschlossen werden. Um das JTAG-Interface des ATMEGA32 nutzen zu können, müssen Änderungen an den Fusebits vorgenommen werden.&lt;br /&gt;
&lt;br /&gt;
Vorsicht: Man sollte die JTAG-Programmierung und Fusebit-Manipulationen nur machen, wenn man genau weiß, was man macht!&lt;br /&gt;
&lt;br /&gt;
====== USRBUS ======&lt;br /&gt;
Die 14 Kontakte der beiden USRBUS-Stecker sind auf der M32 nirgendwo angeschlossen, sondern können über die Lötpunkte Y1..Y14 mit beliebigen Punkten auf der M32 verbunden werden.&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_M32_USRBUS.JPG|thumb|USRBUS]]&lt;br /&gt;
&lt;br /&gt;
Ich würde auf Y1..Y14 eine Stiftleiste löten, damit die USRBUS-Belegung geändert werden kann.&lt;br /&gt;
&lt;br /&gt;
Man braucht dazu:&lt;br /&gt;
* 2-reihige Stiftleiste RM 2,54mm (z.B. 2x36-polig 742007)&lt;br /&gt;
* Einige Steckbuchsen mit Litze&lt;br /&gt;
&lt;br /&gt;
Man trennt von der 2-reihigen Stiftleiste 2x7 Kontakte ab und lötet sie auf die Punkte Y1..Y14 (SP2 E3: Y1..Y14) neben dem Wannenstecker USRBUS2. Wird die M32 über Flachkabel mit einem USRBUS-Stecker auf einer RP6 Experimentierplatine (EP) und/oder mit dem RP6 selbst verbunden, dann hat man mit allen mit dem USRBUS verbundenen Platinen eine direkte 14-polige Verbindung,- eben den &amp;quot;User Bus&amp;quot;. Den kann man dann nutzen, wie man will. Auf der M32 kann man mit Steckbuchsen die Pins Y1..Y14 mit anderen Pins verbinden.&lt;br /&gt;
&lt;br /&gt;
Beispiel: Verbindet man den Pin &amp;quot;ADC2&amp;quot; mit Y1 des USRBUS, dann steht der Eingang ADC2 auf allen an den USRBUS angeschlossenen Platinen an Y1 zur Verfügung. Man braucht also diesen Eingang nicht über ein eigenes Kabel auf eine EP zu führen, sondern kann dazu den USRBUS nehmen. Dadurch bleibt der Gesamtaufbau auf dem RP6 übersichtlich und komplett trennbar (man braucht nur die Stecker XBUS und USRBUS abzuziehen!).&lt;br /&gt;
&lt;br /&gt;
Wichtig: Man sollte gut dokumentieren, wie man den USRBUS am RP6 (vorn und hinten getrennt!), auf EPs und der M32/M128 benutzt! Sonst kann es bei einer anderen Anordnung von EPs zu USRBUS Konflikten/Kurzschlüssen kommen.&lt;br /&gt;
&lt;br /&gt;
====== Schieberegister kaskadieren ======&lt;br /&gt;
[[Bild:RP6_M32_SPI.JPG|thumb|SPI]]&lt;br /&gt;
Auf der M32 wird ein 8-Bit Schieberegister-Baustein (IC3: 74HC4094D) dazu gebraucht, vier Status-LEDs (LED1..LED4) und ein LCD (am Stecker LCD) anzusteuern. Durch Schieberegister kann man Port-Pins gewinnen, wenn die Pins des Prozessors nicht ausreichen.&lt;br /&gt;
&lt;br /&gt;
Solche Schieberegister kann man &amp;quot;kaskadieren&amp;quot;, d.h. weitere identische Bausteine einbauen, die weitere Port-Pins zur Verfügung stellen. Wenn man zusätzliche 74HC4094 einsetzen will, wird man das am besten auf einer EP aufbauen. Die Anschlüsse für diese Schieberegister werden auf der M32 an einer 6-poligen Reihe von Lötpunkten (beschriftet mit MISO, STR, MOSI, SCK, QS, QS*; SP1 D3: YQS1/2, YMOSI, YSCK, YSTR, YMISO) links von IC3 zur Verfügung gestellt.&lt;br /&gt;
&lt;br /&gt;
Wenn man diese 6 Signalleitungen auf eine EP führen will, gibt es dafür zwei Möglichkeiten:&lt;br /&gt;
* a) Direkte 6-polige Kabelverbindung von den oben beschriebenen Lötpunkten zur EP&lt;br /&gt;
* b) Nutzung des USRBUS, um die 6 Signale zur EP zu führen&lt;br /&gt;
Wenn man im Abschnitt &amp;quot;[[RP6#USRBUS|USRBUS]]&amp;quot; den entsprechenden Umbau gemacht hat, würde ich b) empfehlen! Man könnte dafür eine 6-polige Stiftleiste auf die o.g. Lötpunkte auflöten und 1:1 z.B. mit den Pins Y4, Y6, Y8, Y10, Y12, Y14 des USRBUS verbinden. Dann kann man auf der EP weitere Schieberegister- und SPI-Bausteine (z.B. SPI-EEPROMs, [http://www.pollin.de/shop/dt/MDU5OTgxOTk-/Bausaetze_Module/Module/Funkmodul_RFM12_433_Sende_Empfangsmodul.html RFM12 Transceiver] o.ä.) aufbauen.&lt;br /&gt;
&lt;br /&gt;
Man braucht dazu:&lt;br /&gt;
* 1-reihige Stiftleiste RM 2,54mm (z.B. 36-polig 732478)&lt;br /&gt;
* Steckbuchsen mit Litze&lt;br /&gt;
Man trennt von der 1-reihigen Stiftleiste 6 Kontakte ab und lötet sie auf die beschriebenen sechs Lötpunkte auf der M32. Mit den Steckbuchsen mit Litze wird dann die Verbindung entweder direkt zur EP (Option a) oder über den USRBUS zur EP (Option b) hergestellt.&lt;br /&gt;
&lt;br /&gt;
====== VDD/GND/+UB Anschluß ======&lt;br /&gt;
[[Bild:RP6_M32_VDDGNDUB.JPG|thumb|RP6 M32 VDD GND +UB]]&lt;br /&gt;
VDD, GND und +UB (SP2 C3: YUB1, YGND1/2/5, YVDD1/2) kann man auf der M32 an diesen Lötpunkten abnehmen.&lt;br /&gt;
&lt;br /&gt;
Natürlich kann man hier auch Stiftleisten auflöten.&lt;br /&gt;
&lt;br /&gt;
Auf der anderen Platinenseite (zwischen dem USRBUS1 und ISP Stecker) befinden sich zusätzlich noch 2 weitere Lötpunkte, an denen man VDD und GND kontaktieren kann.&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;
&lt;br /&gt;
====== Serielle Schnittstelle ======&lt;br /&gt;
[[Bild:RP6_M32_RST.JPG|thumb|RP6 M32 RST]]&lt;br /&gt;
Neben dem PROG/UART Stecker befinden sich 5 Lötpunkte mit den Signalen RST, TX, RX, GND, VDD (SP2 BC3: YRX, YTX, YRST, YVDD, YGND). Hier kann z.B. eine 5-polige Stiftleiste aufgelötet werden, um einen Anschluß an die serielle Schnittstelle zu ermöglichen.&lt;br /&gt;
 &lt;br /&gt;
Von diesen 5 Lötpunkten könnte z.B. auch eine Verbindung zum USRBUS hergestellt werden, um die serielle Schnittstelle der M32 auf EPs zu führen.&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;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====== MEM_CS2 ======&lt;br /&gt;
[[Bild:RP6_M32_MEM_CS2.JPG|thumb|RP6 M32 MEM_CS2]]&lt;br /&gt;
MEM_CS2 (M32 Microcontroller Pin PB1) kann man am IC5-Sockel an Pin 1 (SP1 A1: IC5*, Pin 1) kontaktieren. Falls IC5 nicht eingesetzt werden soll, kann man hier durch Einstecken eines Kabels in Pin 1 des IC5-Sockels PB1 nutzen und z.B. zum USRBUS führen.&lt;br /&gt;
&lt;br /&gt;
===== Mess-/Kontaktpunkte =====&lt;br /&gt;
Hier geht es um Kontaktpunkte, an denen man z.B. den Logik-Pegel (High/Low) oder eine analoge Spannung messen kann. Natürlich kann man die Signale auch zur Weiterleitung auf eine EP kontaktieren, dies wird man aber normalerweise nicht brauchen.&lt;br /&gt;
&lt;br /&gt;
====== M-Signal ======&lt;br /&gt;
[[Bild:RP6_M32_M_SIGNAL.JPG|thumb|RP6 M32 M-Signal]]&lt;br /&gt;
An diesem Messpunkt (SP1 E3: YM_SIGNAL) neben D1 kann man die Ausgangsspannung des Mikrofon-Verstärkers IC4 (SP1 E3: IC4) messen oder z.B. mit einem Oszilloskop darstellen.&lt;br /&gt;
&lt;br /&gt;
===== Trennstellen =====&lt;br /&gt;
An diesen Stellen können Leiterbahnen unterbrochen werden, um Funktionen zu deaktivieren oder anders zu nutzen. &lt;br /&gt;
&lt;br /&gt;
====== Getrennte Stromversorgung für ADC2/3 ======&lt;br /&gt;
Wenn man für die analogen Sensoren an ADC2/3 (siehe Abschnitt &amp;quot;Anschlüsse - Analoge Sensoren an ADC2/3&amp;quot; weiter oben!) eine GETRENNTE Stromversorgung vorsehen will und/oder mit Codierbrücke (oder MOSFET) die Stromversorgung abschaltbar machen möchte, muss man erst Vorarbeit leisten.&lt;br /&gt;
[[Bild:RP6_M32_SV.jpg|thumb|RP6 M32 SV]]&lt;br /&gt;
&lt;br /&gt;
Man braucht dazu:&lt;br /&gt;
* 1-reihige Stiftleiste RM 2,54mm (z.B. 36-polig 732478)&lt;br /&gt;
* Evtl.: Eine Codierbrücke (z.B. aus Set 742902)&lt;br /&gt;
* Evtl.: Eine 1-polige Steckbuchse mit Litze zur ext. Stromversorgung&lt;br /&gt;
Es muss eine kurze Leiterbahn zwischen den Punkten &amp;quot;SV1&amp;quot; und &amp;quot;SV2&amp;quot; (SP2 B2: SV1, SV2) aufgetrennt werden. Die Leiterbahn befindet sich auf der Lötseite der Platine und muss mit einem scharfen Messer oder einem speziellen Leiterbahn-Unterbrecher zwischen den beiden Lötpunkten unterbrochen werden. Man sollte anschließend mit einem Widerstandsmeßgerät zwischen SV1 und SV2 nachmessen: Es sollte keine Verbindung mehr bestehen. Jetzt trennt man von der 1-reihigen Stiftleiste 2 Kontakte ab und lötet sie auf die Punkte SV1/SV2.&lt;br /&gt;
&lt;br /&gt;
Man kann hier zunächst eine Codierbrücke aufstecken. Damit versorgt der RP6 Akku die Sensoren mit 5V an den Pins VDD. Möchte man später eine getrennte 5V-Spannung anlegen, zieht man einfach die Codierbrücke ab und speist die externe 5V-Spannung (mit einer 1-poligen Steckbuchse) am Pin SV2 ein. Achtung: An Pin SV1 wird dann nichts angeschlossen!&lt;br /&gt;
&lt;br /&gt;
Anstelle der Codierbrücke kann man natürlich auch einen MOSFET anschließen, um die Sensoren per Software abschalten zu können.&lt;br /&gt;
&lt;br /&gt;
====== Interrupt-Zuordnung ändern ======&lt;br /&gt;
Am XBUS stehen vier Interrupt-Pins (genannt INT1..INT3, INTU) zur Verfügung. INT1 ist auf der RP6 Base mit PA4 verbunden, auf der M32 mit PD2 (Prozessor INT0), auf der M128 mit PE5 (Prozessor INT5) und auf der [[RP6v2#RP6v2_M256_WiFi_Platine|RP6 M256 WiFi]] mit PJ3 (Prozessor PCINT12). Diese Tabelle zeigt die Verbindung aller Interruptleitungen auf den Platinen (RP6 Base, M32, M128, M256 WiFi) über den XBUS:&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |XBUS Pin&lt;br /&gt;
 |XBUS INTx&lt;br /&gt;
 |RP6 Base Pin&lt;br /&gt;
 |RP6 Base INTx&lt;br /&gt;
 |RP6 M32 Pin&lt;br /&gt;
 |RP6 M32 INTx&lt;br /&gt;
 |RP6 M128 Pin&lt;br /&gt;
 |RP6 M128 INTx&lt;br /&gt;
 |RP6 M256 Pin&lt;br /&gt;
 |RP6 M256 INTx&lt;br /&gt;
 |-&lt;br /&gt;
 |8&lt;br /&gt;
 |INT1&lt;br /&gt;
 |PA4&lt;br /&gt;
 |kein&lt;br /&gt;
 |PD2&lt;br /&gt;
 |INT0&lt;br /&gt;
 |PE5&lt;br /&gt;
 |INT5&lt;br /&gt;
 |PJ3&lt;br /&gt;
 |PCINT12&lt;br /&gt;
 |-&lt;br /&gt;
 |11&lt;br /&gt;
 |INT2&lt;br /&gt;
 |n.c.&lt;br /&gt;
 |&lt;br /&gt;
 |PD3 *&lt;br /&gt;
 |INT1&lt;br /&gt;
 |n.c.&lt;br /&gt;
 |&lt;br /&gt;
 |PJ6&lt;br /&gt;
 |PCINT15&lt;br /&gt;
 |-&lt;br /&gt;
 |9&lt;br /&gt;
 |INT3&lt;br /&gt;
 |n.c.&lt;br /&gt;
 |&lt;br /&gt;
 |PB2 *&lt;br /&gt;
 |INT2&lt;br /&gt;
 |PE6&lt;br /&gt;
 |INT6&lt;br /&gt;
 |PJ5&lt;br /&gt;
 |PCINT14&lt;br /&gt;
 |-&lt;br /&gt;
 |7&lt;br /&gt;
 |INTU&lt;br /&gt;
 |n.c.&lt;br /&gt;
 |&lt;br /&gt;
 |n.c.    *&lt;br /&gt;
 |&lt;br /&gt;
 |n.c.&lt;br /&gt;
 |&lt;br /&gt;
 |PJ4&lt;br /&gt;
 |PCINT13&lt;br /&gt;
 |-&lt;br /&gt;
|}&lt;br /&gt;
'''Zu *:''' Standard-Belegung. Ggf. abhängig von der nachfolgend beschriebenen Interrupt-Zuordnung!&lt;br /&gt;
&lt;br /&gt;
Auf der M32 kann man die Interrupt-Zuordnung für INT2, INT3 und INTU durch drei Codierbrücken (beschriftet mit I2-INTU, INT3-I3, I2-INT2; SP2 A3: YINT2/3/U, YI2_1/2, YI3) ändern.&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_M32_INTx.JPG|thumb|INTx]]&lt;br /&gt;
&lt;br /&gt;
Man braucht dazu:&lt;br /&gt;
* 2-reihige Stiftleiste RM 2,54mm (z.B. 2x36-polig 742007)&lt;br /&gt;
* Drei Codierbrücken (z.B. aus Set 742902)&lt;br /&gt;
Vor dem Auflöten der Stiftleiste müssen zwei kurze Leiterbahnen zwischen zwei Lötpunkten aufgetrennt werden, und zwar zwischen den Lötpunkten INT3-I3 und I2-INT2. Die Leiterbahnen müssen mit einem scharfen Messer oder einem speziellen Leiterbahn-Unterbrecher zwischen den beiden Lötpunkten unterbrochen werden. Man sollte anschließend mit einem Widerstandsmeßgerät nachmessen: Es sollte keine Verbindung mehr zwischen INT3-I3 und I2-INT2 bestehen. Man trennt dann von der 2-reihigen Stiftleiste 2x3 Kontakte ab und lötet sie auf das weiß umrahmte Feld mit der o.g. Beschriftung.&lt;br /&gt;
&lt;br /&gt;
Hier kann man auf INT3-I3 und I2-INT2 je eine Codierbrücke aufstecken, wenn man die Standard-Belegung beibehalten will. Steckt man auf I2-INTU eine Codierbrücke, dann ist INTU des XBUS mit Pin PD3 (I2) der M32 verbunden.&lt;br /&gt;
&lt;br /&gt;
'''Hinweis:''' Man kann auf die 6-polige Stiftleiste auch Codierbrücken QUER zur eigentlichen (horizontalen) Richtung aufsetzen. Dadurch kann jede der 3 Interruptleitungen des XBUS (INT2, INT3, INTU) mit jedem der 2 Interrupt Pins der M32 (PD3, PB2) verbunden werden.&lt;br /&gt;
&lt;br /&gt;
Wenn man keine der Codierbrücken aufsteckt, sind die Pins PD3 (I2) und PB2 (I3) des M32-Prozessors nicht mehr mit dem XBUS verbunden und können anders verwendet werden. Auf der M32 kann man dann z.B. auch andere Verbindungen zum XBUS herstellen, indem man auf die Pins INT2, INT3 oder INTU Kabelverbindungen aufsteckt.&lt;br /&gt;
&lt;br /&gt;
====== ADC0 und ADC1 frei nutzen ======&lt;br /&gt;
Auf der M32 ist ADC0 fest mit dem Mikrofon (MIC) und ADC1 mit den Tastern T1..T5 (KEYPAD) verbunden. Wenn man diese ADC-Eingänge für andere Sensoren benötigt, kann man das Mikrofon und die Taster von den Eingängen abtrennen.&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_M32_MIC_KEY.JPG|thumb|MIC_KEYPAD]]&lt;br /&gt;
&lt;br /&gt;
Man braucht dazu:&lt;br /&gt;
* 1-reihige Stiftleiste RM 2,54mm (z.B. 36-polig 732478)&lt;br /&gt;
* Eine Codierbrücke (z.B. aus Set 742902)&lt;br /&gt;
&lt;br /&gt;
MIC/ADC0:&lt;br /&gt;
Es muss eine kurze Leiterbahn zwischen zwei Lötpunkten aufgetrennt werden, die sich zwischen R2 und C19 befinden (SP1 D4: YM1, YM2). Die Leiterbahn muss mit einem scharfen Messer oder einem speziellen Leiterbahn-Unterbrecher zwischen den beiden Lötpunkten unterbrochen werden. Man sollte anschließend mit einem Widerstandsmeßgerät nachmessen: Es sollte keine Verbindung mehr bestehen. Vorsicht: Nicht R2 beschädigen! Damit ist das Mikrofon auf der M32 ohne Funktion und ADC0 kann anders genutzt werden. ADC0 ist dann am oberen Lötpunkt zwischen R2 und C19 verfügbar, dort müßte eine Kabelverbindung angelötet werden.&lt;br /&gt;
Soll das Mikrofon später doch wieder an ADC0 angeschlossen werden, verbindet man die beiden Lötpunkte zwischen R2 und C19 einfach mit etwas Lötzinn oder mit einem SMD Null Ohm Widerstand.&lt;br /&gt;
&lt;br /&gt;
KEYPAD/ADC1:&lt;br /&gt;
Es muss eine kurze Leiterbahn zwischen zwei Lötpunkten aufgetrennt werden, die sich unterhalb von R15 befinden (SP1 D2: YKP1, YKP2). Die Leiterbahn befindet sich auf der Lötseite der Platine und muss mit einem scharfen Messer oder einem speziellen Leiterbahn-Unterbrecher zwischen den beiden Lötpunkten unterbrochen werden. Man sollte anschließend mit einem Widerstandsmeßgerät nachmessen: Es sollte keine Verbindung mehr bestehen. Jetzt trennt man von der 1-reihigen Stiftleiste 2 Kontakte ab und lötet sie auf die beiden Punkte unterhalb von R15. Hier kann man jetzt eine Codierbrücke aufstecken, wenn man die Taster weiter benutzen will. Wenn die Brücke abgezogen ist, sind die Taster ohne Funktion und ADC1 kann anders genutzt werden. ADC1 ist dann am linken Pin der 2-poligen Stiftleiste unterhalb von R15 verfügbar.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== RP6 CCPRO M128 Platine===&lt;br /&gt;
&lt;br /&gt;
[[Bild:CCPRO M128 k-1-.jpg|Das CCPRO M128]]&lt;br /&gt;
&lt;br /&gt;
====Technische Daten====&lt;br /&gt;
{|  {{Blauetabelle}} &lt;br /&gt;
|'''Mikrocontroller:'''&lt;br /&gt;
|Steckplatz für ein C-Control PRO MEGA128 Modul mit einem ATMEGA 128 ([https://www.conrad.de/de/p/c-control-prozessor-unit-mega-128-pro-198219.html 198219])&lt;br /&gt;
|-&lt;br /&gt;
|'''Speicher:'''&lt;br /&gt;
|128 kB [[Flash]]-Speicher, davon 4 kB bereits vom Bootloader belegt&amp;lt;br/&amp;gt;&lt;br /&gt;
4 kB SRAM intern&amp;lt;br/&amp;gt; &lt;br /&gt;
64 kB SRAM extern&amp;lt;br/&amp;gt;&lt;br /&gt;
4 kB [[EEPROM]]&lt;br /&gt;
|-&lt;br /&gt;
|'''Programmierung:'''&lt;br /&gt;
|Über CCPRO-IDE&lt;br /&gt;
|-&lt;br /&gt;
|'''Vorhandene Sensoren:'''&lt;br /&gt;
|1 12bit I²C Temperatursensor &amp;lt;br/&amp;gt;&lt;br /&gt;
19 I/O-Ports, davon 8 ADCs, 3 PWM (Servos) und 2 I/Os für eine weitere serielle Schnittstelle (UART)&lt;br /&gt;
|-&lt;br /&gt;
|'''Vorhandene Aktoren:'''&lt;br /&gt;
|1 Beeper&amp;lt;br/&amp;gt;&lt;br /&gt;
5 Status-LEDs&amp;lt;br/&amp;gt;&lt;br /&gt;
1 LC-Display-Port&amp;lt;br/&amp;gt;&lt;br /&gt;
1 Sockel für ein I²C-Bus EEPROM vom Typ 24(L)Cxxx&lt;br /&gt;
|-&lt;br /&gt;
|'''Abmessungen:'''&lt;br /&gt;
|(L &amp;amp;times; B &amp;amp;times; H) 112 &amp;amp;times; 90 &amp;amp;times; 21 mm&lt;br /&gt;
|-&lt;br /&gt;
|'''Ausführung:'''&lt;br /&gt;
|Fertig aufgebautes Erweiterungsmodul&lt;br /&gt;
|-&lt;br /&gt;
|'''Stromversorgung:'''&lt;br /&gt;
|6 AA NiMH Akkus (über die RP6 Base)&lt;br /&gt;
|-&lt;br /&gt;
|'''Hersteller:'''&lt;br /&gt;
|Arexx Niederlande&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Umbauoptionen====&lt;br /&gt;
Auf der CCPRO M128 ([http://www.conrad.de/ce/de/product/191563/Arexx-RP6-CC-PRO-MEGA128-Erweiterungssatz 191563]) kann leider nicht so viel umgebaut werden:&lt;br /&gt;
&lt;br /&gt;
* I2C-EEPROM&lt;br /&gt;
* Freie Nutzung von PORTA* und PORTC*&lt;br /&gt;
* USRBUS&lt;br /&gt;
* A16-/PD4-Nutzung&lt;br /&gt;
&lt;br /&gt;
Im Text gibt es Verweise auf den Schaltplan der CCPRO M128 (RP6_CCPRO_M128_Schematic.PDF) in der Form: (SP2 B1: Bauteil).  Dies bedeutet, dass man das Bauteil auf Blatt 2 des M128-Schaltplans im Feld B1 finden kann.&lt;br /&gt;
&lt;br /&gt;
Bei den Materialangaben ist öfter die Rede von &amp;quot;Steckbuchsen mit Litze&amp;quot;. Diese Steckbuchsen mit angelöteter Litze können auf die ein- oder zweireihigen Stiftleisten aufgesteckt werden. Leider gibt es sie nicht (mehr) fertig konfektioniert bei CONRAD. Die einreihigen Steckbuchsen (RM 2,54mm) kann man aber z.B. bei [http://www.elv.de/output/controller.aspx ELV] bekommen: 2-polig (68-016635), 3-polig (68-022503) und 5-polig (68-023073). An sie muss man dann noch Litzen in der entsprechenden Länge selbst anlöten.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=====I2C-EEPROM=====&lt;br /&gt;
Zum Einsetzen eines I2C-EEPROMS (IC6; SP2 C1: IC6) braucht man nichts umzubauen. Man kauft einfach ein passendes EEPROM des Typs 24(L)Cxxxx-P und setzt es auf seinen Sockel, Kerbe zum oberen Platinenrand.&lt;br /&gt;
&lt;br /&gt;
Mögliche Typen (erhältlich z.B. bei [http://www.digikey.de/ Digi-Key] oder bei [http://www.reichelt.de./ Reichelt]):&lt;br /&gt;
* AT24C128  (AT24C128-10PU-2.7-ND)&lt;br /&gt;
* AT24C256  (AT24C256-10PU-2.7-ND)&lt;br /&gt;
* AT24C512  (AT24C512-10PU-2.7-ND)&lt;br /&gt;
* AT24C1024 (AT24C1024-10PI-2.7-ND)&lt;br /&gt;
&lt;br /&gt;
=====Anschlüsse=====&lt;br /&gt;
Hier wird aufgelistet, wo man auf der M128 Platine Anschlüsse nutzen kann, um sie z.B. zu weiteren Sensoren, zum USRBUS oder (weniger empfehlenswert!) direkt zu EPs, zur RP6 Base oder zur M32 zu führen. &lt;br /&gt;
&lt;br /&gt;
======Freie Nutzung von PORTA* und PORTC*======&lt;br /&gt;
Um PORTA* und PORTC* frei nutzen zu können (für weitere I/O-Ports), muss man auf das externe SRAM verzichten, was nicht sehr ratsam ist. Mehr I/O-Ports kann man alternativ durch I/O Expander gewinnen. Falls man das SRAM trotzdem deaktivieren will, hier die Anleitung.&lt;br /&gt;
&lt;br /&gt;
Für den Umbau braucht man:&lt;br /&gt;
* Wannenstecker 2x5-polig gerade RM 2,54mm (z.B. [http://www.reichelt.de./ Reichelt] WSL 10G)&lt;br /&gt;
* 1-reihige Stiftleiste RM 2,54mm (z.B. 36-polig 732478)&lt;br /&gt;
* Eine Codierbrücke (z.B. aus Set 742902)&lt;br /&gt;
[[Bild:RP6_M128_PortA.JPG|thumb|PORTA*]]&lt;br /&gt;
&lt;br /&gt;
Für die Bestückung von PORTA* (SP2 AB2: Stecker PORTA*) lötet man den Wannenstecker hier (siehe Abb. PORTA*) auf.&lt;br /&gt;
[[Bild:RP6_M128_PortC.JPG|thumb|PORTC*]]&lt;br /&gt;
&lt;br /&gt;
Für die Bestückung von PORTC* (SP1 A2: PC0..7, YGND1) trennt man von der 1-reihigen Stiftleiste 9 Kontakte ab und lötet sie auf die PORTC*-Lötpunkte (siehe Abb. PORTC*).&lt;br /&gt;
&lt;br /&gt;
Dann muss noch der SRAM-Enable Jumper (SP1 EF1: Y27..29) bestückt werden:&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_M128_EN_SRAM.JPG|EN_SRAM]]&lt;br /&gt;
&lt;br /&gt;
Man trennt von der 1-reihigen Stiftleiste 3 Kontakte ab und lötet sie auf die abgebildeten Lötpunkte. Vorher muss eine Leiterbahn auf der Lötseite der Platine zwischen den ENABLE-Lötpunkten aufgetrennt werden.&lt;br /&gt;
Wenn das SRAM wie bisher genutzt werden soll, steckt man die Codierbrücke auf die Stellung &amp;quot;ENABLE&amp;quot;. Will man stattdessen Port A und Port C frei nutzen (und damit auf SRAM verzichten!), kommt die Codierbrücke auf &amp;quot;DISABLE&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
======USRBUS======&lt;br /&gt;
Auf die 14 Kontakte neben dem Wannenstecker USRBUS2 ist noch nichts gelötet.&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_M128_USRBUS.JPG|thumb|USRBUS]]&lt;br /&gt;
&lt;br /&gt;
Ich würde auf Y1..Y14 eine Stiftleiste löten, damit die USRBUS-Belegung geändert werden kann.&lt;br /&gt;
&lt;br /&gt;
Man braucht dazu:&lt;br /&gt;
* 2-reihige Stiftleiste RM 2,54mm (z.B. 2x36-polig 742007)&lt;br /&gt;
* Einige Steckbuchsen mit Litze&lt;br /&gt;
&lt;br /&gt;
Man trennt von der 2-reihigen Stiftleiste 2x7 Kontakte ab und lötet sie auf die Punkte Y1..Y14 (SP2 E234: Y1..Y14) neben dem Wannenstecker USRBUS2. Wird die M128 über Flachkabel mit einem USRBUS-Stecker auf einer RP6 Experimentierplatine (EP) und/oder mit dem RP6 selbst verbunden, dann hat man mit allen mit dem USRBUS verbundenen Platinen eine direkte 14-polige Verbindung,- eben den &amp;quot;User Bus&amp;quot;. Den kann man dann nutzen, wie man will. Auf der M128 kann man mit Steckbuchsen die Pins Y1..Y14 mit anderen Pins verbinden.&lt;br /&gt;
&lt;br /&gt;
Beispiel: Verbindet man den Pin &amp;quot;ADC4&amp;quot; mit Y1 des USRBUS, dann steht der Eingang ADC4 auf allen an den USRBUS angeschlossenen Platinen an Y1 zur Verfügung. Man braucht also diesen Eingang nicht über ein eigenes Kabel auf eine EP zu führen, sondern kann dazu den USRBUS nehmen. Dadurch bleibt der Gesamtaufbau auf dem RP6 übersichtlich und komplett trennbar (man braucht nur die Stecker XBUS und USRBUS abzuziehen!).&lt;br /&gt;
&lt;br /&gt;
Wichtig: Man sollte gut dokumentieren, wie man den USRBUS am RP6 (vorn und hinten getrennt!), auf EPs und der M128 benutzt! Sonst kann es bei einer anderen Anordnung von EPs zu USRBUS Konflikten/Kurzschlüssen kommen.&lt;br /&gt;
&lt;br /&gt;
======IC5 ALERT======&lt;br /&gt;
[[Bild:RP6_M128_IC5_ALERT.JPG|thumb|IC5 ALERT]]&lt;br /&gt;
Dieser Lötpunkt (SP2 C2: AL) neben IC5 ist der Anschluß ALERT (Pin 3) des I2C-Temperatursensors TCN75A (SP2 C2: IC5).&lt;br /&gt;
&lt;br /&gt;
Dies ist ein Open-Drain Ausgang, der ein Alarm-Signal ausgibt, wenn die Temperatur die eingestellten Grenzen über-/unterschreitet (siehe auch Datenblatt des Sensors (TCN75A.pdf), Abschnitt 5.3.4!). Wenn man ALERT auf einen Eingang des Microcontrollers führen will, muß man auch noch einen Pullup-Widerstand vorsehen oder den internen Pullup des uC-Eingangs aktivieren.&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;
======VDD/GND Anschluß======&lt;br /&gt;
[[Bild:RP6_M128_VDDGND.JPG|thumb|VDD GND]]&lt;br /&gt;
Auf der CCPRO M128 gibt es 2 Lötpunkte (SP1 E34: YVDD3, YGND4) zwischen R5 und C7 bzw. direkt neben der Codierbrücke (SP1 E3: YL9, YL10) zum Deaktivieren von LED5.&lt;br /&gt;
&lt;br /&gt;
Hier könnte man VDD und GND kontaktieren. VDD ist der Lötpunkt, der näher an R5 liegt.&lt;br /&gt;
&lt;br /&gt;
=====Trennstellen=====&lt;br /&gt;
An diesen Stellen können Leiterbahnen unterbrochen werden, um Funktionen zu deaktivieren oder anders zu nutzen. &lt;br /&gt;
&lt;br /&gt;
======A16-/PD4-Nutzung======&lt;br /&gt;
&lt;br /&gt;
[[Bild:v2RP6_M128_A16.JPG|thumb|A16/PD4]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Auf der CCPRO M128 gibt es ein 3-poliges Feld von Lötpunkten (SP2 AB1: PD4, A16, GND) unter dem CCPRO MEGA128 Modul (IC1). Standardmässig ist A16 des SRAM (IC3) hier auf GND gelegt. Damit kann man PD4 des Prozessors (ICP1) frei nutzen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Will man A16 des SRAM mit PD4 schaltbar machen, muss man eine Leiterbahn auf der Bestückungsseite zwischen den oberen zwei der drei Lötpunkte auftrennen und die anderen (unteren) beiden Lötpunkte mit etwas Lötzinn oder einem SMD Null Ohm Widerstand verbinden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der Sinn dieses Umbaus besteht darin, dass man danach anstelle von 64kB nun die vollen 128kB SRAM des IC3 adressieren kann. Man muss dann aber PD4 selbst schalten, da C-Control PRO ab Version 1.50 nur 64kB ext. SRAM ansteuern kann. Immerhin könnte man dann 2 Blöcke à je 64kB nutzen und mit PD4 zwischen beiden Blöcken umschalten.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ob CCPRO damit klar kommt: Wohl kaum! Ich würde daher diesen Umbau nicht durchführen.&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Zubehör und Ersatzteile ==&lt;br /&gt;
Von [http://www.conrad.de/ce/ CONRAD] gibt es z.B. &lt;br /&gt;
&lt;br /&gt;
* das LC- ([http://www.conrad.de/ce/de/product/190911/LC-DISPLAY-16-X-2-KONFEKTIONIERT 190911] AUSVERKAUFT!) oder Backlight-Display ([http://www.conrad.de/ce/de/product/191621/DISPLAY-RP5RP6-BLAU-MIT-BACKLIGHT 191621] AUSVERKAUFT!), welche an die M32, an die CCPRO M128 und an die M256 WiFi angeschlossen werden können,&lt;br /&gt;
* einen IR-Ball ([http://www.conrad.de/ce/de/product/191437/INFRAROT-BALL-FUeR-ROBOTER-FUssBALL 191437] AUSVERKAUFT!),&lt;br /&gt;
* einen Graustufen-Boden-Sensor ([http://www.conrad.de/ce/de/product/191599/GRAUSTUFEN-BODEN-SENSOR-FUeR-FUssBALLROBOT 191599] AUSVERKAUFT!),&lt;br /&gt;
* eine IR-Fernbedienung Promo 8 ([http://www.conrad.de/ce/de/product/340720/PROMO-8-UNIVERSALFERNBEDIENUNG 340720] AUSVERKAUFT!) oder Vivanco UR 89 ([http://www.conrad.de/ce/de/product/351013/VivancoUR-89-Fernbedienung-8-Geraete 351013] AUSVERKAUFT!),&lt;br /&gt;
* Ersatzräder ([http://www.conrad.de/ce/de/product/191307/ANTRIEBSRAD-RP5RP6 191307] AUSVERKAUFT!),&lt;br /&gt;
* Ersatzzahnräder ([http://www.conrad.de/ce/de/product/191346/SCHRAeG-ZAHNRAeDERSATZ-RP5RP6 191346]) und&lt;br /&gt;
* Ersatzraupen ([http://www.conrad.de/ce/de/product/191333/RAUPENSATZ-RP5RP6 191333] AUSVERKAUFT!).&lt;br /&gt;
&lt;br /&gt;
===Displays===&lt;br /&gt;
Die vorkonfektionierten Displays kann man zum Ausgeben von Texten, Sensordaten und kleinen Animationen benutzen. Sie können an die M32, an die CCPRO M128 und an die M256 WiFi angeschlossen werden.&lt;br /&gt;
&lt;br /&gt;
Diese 16x2 Zeichen Displays sind bisher lieferbar:&lt;br /&gt;
&lt;br /&gt;
* LC-Display ([http://www.conrad.de/ce/de/product/190911/LC-DISPLAY-16-X-2-KONFEKTIONIERT 190911])&lt;br /&gt;
* OLED-Display (197622)&lt;br /&gt;
* Backlight-Display AREXX RP-DSP88 ([http://www.conrad.de/ce/de/product/191621/DISPLAY-RP5RP6-BLAU-MIT-BACKLIGHT 191621])&lt;br /&gt;
&lt;br /&gt;
Das LCD ist seit September 2018 bei CONRAD ausverkauft; zeitweise (2007/08) gab es unter dieser Bestellnummer eine Version, die zu klein (66 x 37mm) war, um sie auf der M32, der CCPRO M128 oder der M256 WiFi zu montieren.&lt;br /&gt;
&lt;br /&gt;
Das OLED-Display ist aktuell (April 2012) nicht mehr lieferbar.&lt;br /&gt;
&lt;br /&gt;
Das zuletzt ausschließlich nur noch erhältliche blaufarbige Backlight-Display ist seit Mai 2020 bei CONRAD ausverkauft.&lt;br /&gt;
&lt;br /&gt;
Diese Displays können mit 4 M3-Abstandbolzen 25 mm ([http://www.conrad.de/ce/de/product/526665/Abstandsbolzen1-x-Aussengewinde1-x-InnengewindeMessing-vernickelt-Schluesselweite-55-mm Bestell-Nr. 526665]) und 4 Muttern M3 ([http://www.conrad.de/ce/de/product/815624/TOOLCRAFT-Sechskant-Muttern-DIN-934-934-Stahl-verzinkt-M3-100-St z.B. aus 815624]), sowie 4 Schrauben M3 ([http://www.conrad.de/ce/de/product/815322/TOOLCRAFT-Linsenkopfschrauben-mit-Kreuzschlitz-DIN-7985-7985-6-mm-Stahl-verzinkt-Guete-48-M3-100-St z.B. aus 815322]) auf der M32, der CCPRO M128 oder der M256 WiFi befestigt werden. Leider sind die Befestigungslöcher der Displays zu klein für ein M3-Gewinde, so dass man die Löcher sehr vorsichtig auf 3..3,2 mm erweitern muss.&lt;br /&gt;
&lt;br /&gt;
===IR-Ball===&lt;br /&gt;
Den IR-Ball (AREXX IRB-35, AUSVERKAUFT!) kann man benutzen, um mit dem RP6 Fußball oder Ähnliches zu spielen. Der Ball kann dann von den IR-Sensoren des RP6 erkannt und geortet werden.&lt;br /&gt;
&lt;br /&gt;
===Graustufen-Boden-Sensor===&lt;br /&gt;
Der Graustufen-Boden-Sensor (AREXX ARX-GS7) dient zur Orientierung eines Roboters auf einem Fußballfeld, das in bestimmten Grauabstufungen eingefärbt ist (CONRAD 191404  AUSVERKAUFT!). Dieser Fußballfeld-Aufkleber (AREXX ARX-FF008) ist bei CONRAD und bei [http://www.elv.de ELV] (Artikel-Nummer 68-101831) ausverkauft.&lt;br /&gt;
&lt;br /&gt;
===IR-Fernbedienung===&lt;br /&gt;
[[Bild:RP6_RC.jpg|thumb|2 RC5 Fernbedienungen]]&lt;br /&gt;
Mit einer Universal-IR-Fernbedienung, die den RC5-IR-Code senden kann, kann der RP6 wie ein ferngesteuertes &amp;quot;Auto&amp;quot; verwendet werden. Im Beispielprogramm &amp;quot;Example_08_TV_REMOTE&amp;quot; im Ordner der RP6-Base-Demos wird das noch genauer erläutert.&lt;br /&gt;
&lt;br /&gt;
===Ersatzräder===&lt;br /&gt;
Die Ersatzräder dienen als Ersatzteile für den RP6, RP6v2 und das RP5/RP6-Fahrgestell.&lt;br /&gt;
&lt;br /&gt;
===Ersatzzahnräder===&lt;br /&gt;
Die Ersatzzahnräder dienen als Ersatzteile für den RP6, RP6v2 und das RP5/RP6-Fahrgestell.&lt;br /&gt;
&lt;br /&gt;
===Ersatzraupen===&lt;br /&gt;
Die Ersatzraupen dienen als Ersatzteile für den RP6, RP6v2 und das RP5/RP6-Fahrgestell.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Programmierung==&lt;br /&gt;
Um diesen Grundlagenartikel zum RP6 nicht immer länger werden zu lassen, habe ich den Teil zur Programmierung des [[RP6_-_Programmierung#RP6_Base_und_CONTROL_M32|RP6]] und seiner Erweiterungsplatinen [[RP6_-_Programmierung#RP6_Base_und_CONTROL_M32|RP6 CONTROL M32]] und [[RP6_-_Programmierung#RP6_CCPRO_M128|RP6 CCPRO M128]] ausgelagert: [[RP6 - Programmierung]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==RP6v2==&lt;br /&gt;
Der neue [http://www.conrad.de/ce/de/product/191584/RP6-V2-ROBOTERSYSTEM RP6v2] ist weitgehend identisch mit dem RP6, so dass fast alle Angaben dieses Artikels auch für den RP6v2 zutreffen.&lt;br /&gt;
Für vom RP6 abweichende Details des RP6v2 und für dessen zukünftige Erweiterungsplatinen (z.B. das aktuell [http://www.arexx.com/forum/viewtopic.php?f=19&amp;amp;t=1797 hier] angekündigte Erweiterung-Modul [[RP6v2#RP6v2_M256_WiFi_Platine|RP6v2 M256 WiFi]]) gibt es einen eigenen Grundlagenartikel: [[RP6v2]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==RP6 Sensor Board und Xtra Module==&lt;br /&gt;
Einen eigenen Artikel gibt es auch für das [[RP6_Sensor_Board_und_Xtra_Module#RP6_Sensor_Board_2|RP6 Sensor Board]] und für die [[RP6_Sensor_Board_und_Xtra_Module#RP6_Xtra_Module_2|Xtra Module]]: [[RP6_Sensor_Board_und_Xtra_Module|RP6 Sensor Board und Xtra Module]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Erfahrungsberichte==&lt;br /&gt;
&lt;br /&gt;
...in Arbeit...(kann aber gerne ergänzt werden)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Siehe auch==&lt;br /&gt;
* [[RP6 - Programmierung]]&lt;br /&gt;
* [[RP6v2]]&lt;br /&gt;
* [[RP6_Sensor_Board_und_Xtra_Module]]&lt;br /&gt;
* [[RP6_Kamera_-_Mitmach-Projekt]]&lt;br /&gt;
* [[RP6v2_I2C-Portexpander]]&lt;br /&gt;
* [[RP6v2 USB-RS232-Adapter]]&lt;br /&gt;
* [[RP6v2 Orientierung]]&lt;br /&gt;
* [[RP6 Multi IO Projekt]]&lt;br /&gt;
* [[RP6 Multi IO Projekt - Software]]&lt;br /&gt;
* [[RP6 ArduIO]]&lt;br /&gt;
* [[RP6 ArduIO - Software]]&lt;br /&gt;
* [[Induktive_Ladestation_f%C3%BCr_den_RP6|Induktive Ladestation für den RP6]]&lt;br /&gt;
* [[IR-bake_f%C3%BCr_den_RP6|IR-bake für den RP6]]&lt;br /&gt;
* [[CCRP5]]&lt;br /&gt;
* [[Wild Thumper]]&lt;br /&gt;
* [[Wild Thumper - Programmierung]]&lt;br /&gt;
* [[Yeti]]&lt;br /&gt;
* [[Asuro]]&lt;br /&gt;
* [[C't-Bot]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Weblinks==&lt;br /&gt;
'''Siehe auch die Weblinks im [http://www.rn-wissen.de/index.php/RP6v2#Weblinks RP6v2 Artikel]!'''&lt;br /&gt;
&lt;br /&gt;
* [http://www.pcwelt.de/start/gaming_fun/gadgets/news/84558/ PC-Welt-Artikel]&lt;br /&gt;
&lt;br /&gt;
* Ankündigung des RP6 und der RP6 CONTROL M32 im [http://www.arexx.com/forum/viewtopic.php?t=370 AREXX Support Forum]&lt;br /&gt;
* Ankündigung der RP6 CCPRO M128 im [http://www.arexx.com/forum/viewtopic.php?f=19&amp;amp;t=834&amp;amp;start=0 AREXX Support Forum] und im [http://www.roboternetz.de/community/threads/42228-RP6-C-Control-PRO-MEGA128-Erweiterungsmodul-Website-online RoboterNETZ]&lt;br /&gt;
* Ankündigung des RP6v2 im [http://www.roboternetz.de/community/threads/56964-NEWS-RP6v2-die-neue-Version-2-des-RP6-Robot-Systems RoboterNETZ] und im [http://www.arexx.com/forum/viewtopic.php?f=19&amp;amp;t=1778 AREXX Support Forum]&lt;br /&gt;
* Ankündigung der RP6v2 M256 WiFi im [http://www.arexx.com/forum/viewtopic.php?f=19&amp;amp;t=1797 AREXX Support Forum]&lt;br /&gt;
* [http://www.arexx.com/rp6 AREXX RP6 Startseite]&lt;br /&gt;
* [http://www.arexx.com/forum/viewforum.php?f=19 AREXX Support Forum]&lt;br /&gt;
* [http://www.arexx.com/rp6/html/de/soft_doc_ccpro.htm AREXX CCPRO M128 Seite]&lt;br /&gt;
&lt;br /&gt;
* [http://www.conrad.de/ce/de/product/191524/RP6-ROBOTERSYSTEM RP6 bei CONRAD]&lt;br /&gt;
* [http://www.conrad.de/ce/de/product/191584/RP6-V2-ROBOTERSYSTEM RP6v2 bei CONRAD]&lt;br /&gt;
* [http://www.conrad.de/ce/de/product/191550/RP6-MEGA32-ERWEITERUNGSSATZ RP6 CONTROL M32 bei CONRAD]&lt;br /&gt;
* [http://www.conrad.de/ce/de/product/191563/RP6-CC-PRO-MEGA128-ERWEITERUNGSSATZ RP6 CCPRO M128 bei CONRAD]&lt;br /&gt;
* [http://www.c-control.de/c-control-pro/c-control-pro/startseite_c-control-pro.html C-Control PRO Startseite]&lt;br /&gt;
* [http://ccpro.cc2net.de/forum/ C-Control PRO Forum]&lt;br /&gt;
&lt;br /&gt;
* [http://www.roboternetz.de/phpBB2/viewforum.php?f=49 Roboternetz RP6 Forum]&lt;br /&gt;
* &amp;quot;Geburt&amp;quot; des Wiki im RN-Forum: [http://www.roboternetz.de/community/threads/32793-RP6-Wiki-Artikel RP6-Wiki-Artikel]&lt;br /&gt;
* Henkessoft: [http://www.henkessoft.de/Roboter/rp6.htm RP6]&lt;br /&gt;
* PIC-PROJEKTE Wiki: [http://pic-projekte.de/wiki/index.php?title=RP6  RP6]&lt;br /&gt;
* benhup.com: [http://www.benhup.com/?mf=eduntech&amp;amp;sf=rp6 Arexx RP6 Robot (with ATmega32 chip)]&lt;br /&gt;
* RP6 &amp;quot;Panzer&amp;quot;: [http://www.roboternetz.de/community/threads/57171-mein-(Heng-Long)-RP6 Heng-Long-RP6]&lt;br /&gt;
&lt;br /&gt;
* [http://www.youtube.com/results?search_query=rp6 RP6 Videos]&lt;br /&gt;
* [http://de-de.facebook.com/pages/Robby-RP6/155118711202285 facebook]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Robotikeinstieg]]	 &lt;br /&gt;
[[Kategorie:Praxis]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Autoren==&lt;br /&gt;
--[http://www.roboternetz.de/community/members/24729-sloti sloti] 22:23, 29. Dez 2007 (CET)&lt;br /&gt;
&lt;br /&gt;
--[http://www.roboternetz.de/community/members/44891-Tobias1 Tobias1] 18:30, 6. Apr 2010 (CET)&lt;br /&gt;
&lt;br /&gt;
--[http://www.roboternetz.de/community/members/1972-Dirk Dirk] 12:51, 23. Okt 2020 (CET)&lt;/div&gt;</summary>
		<author><name>Dirk NO2</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=RP6&amp;diff=28571</id>
		<title>RP6</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=RP6&amp;diff=28571"/>
				<updated>2022-03-31T08:45:57Z</updated>
		
		<summary type="html">&lt;p&gt;Dirk NO2: /* Beschreibung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Bild:RP6_2.jpg|RP6 Base Roboter|right|500px]]&lt;br /&gt;
==Was bisher geschah==&lt;br /&gt;
Fre, 08. Jun 2007 - Ankündigung des RP6 und der RP6 CONTROL M32&amp;lt;br/&amp;gt;&lt;br /&gt;
Mon, 02. Jul 2007 23:00 - Benachrichtigung der Tester&amp;lt;br/&amp;gt;&lt;br /&gt;
Die, 03. Jul 2007 15:00 - Bereitstellung der Dokumentation&amp;lt;br/&amp;gt;&lt;br /&gt;
Don, 05. Jul 2007 14:30 - Bereitstellung der Schaltungsunterlagen&amp;lt;br/&amp;gt;&lt;br /&gt;
Son, 08. Jul 2007 16:00 - Nachricht über den Versand der RP6&amp;lt;br/&amp;gt;&lt;br /&gt;
Mon, 09. Jul 2007 00:15 - Bereitstellung der Library und der Beispielprogramme&amp;lt;br/&amp;gt;&lt;br /&gt;
Die, 10. Jul 2007 - Eintreffen der RP6 bei den Testern&amp;lt;br/&amp;gt;&lt;br /&gt;
Mon, 16. Jul 2007 - Auslieferungsbeginn des RP6&amp;lt;br/&amp;gt;&lt;br /&gt;
Fre, 24. Apr 2009 - Ankündigung der RP6 CCPRO M128 (Auslieferung schon ab Mitte April 2009)&amp;lt;br/&amp;gt;&lt;br /&gt;
Mon, 27. Feb 2012 - Ankündigung des RP6v2&amp;lt;br/&amp;gt;&lt;br /&gt;
Don, 08. Mär 2012 - Auslieferungsbeginn des RP6v2&amp;lt;br/&amp;gt;&lt;br /&gt;
Sam, 17. Mär 2012 - Ankündigung der RP6v2 M256 WiFi&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Siehe auch &amp;quot;Was bisher geschah&amp;quot; im [http://www.rn-wissen.de/index.php/RP6v2#Was_bisher_geschah RP6v2 Artikel]!'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Allgemein==  &lt;br /&gt;
[[Bild:DSC03448.JPG|thumb|RP6 mit Erweiterungsboard]] [[Bild:RP6_Lieferumfang.jpg|thumb|RP6 im Lieferumfang]]&lt;br /&gt;
Der von Arexx entwickelte RP6 ([http://www.conrad.de/ce/de/product/191524/C-Control-Robot-System-RP6-Robotersystem 191524]) ist ein autonomes Raupenfahrzeug, das nicht nur für Schüler und Studenten zum Einstieg in das Gebiet Robotik sondern auch für Fortgeschrittene Elektroniker und Bastler sehr gut geeignet ist, da das System für selbstentworfene Erweiterungen ausgelegt ist. Der RP6 wird von einem, unter Roboterentwicklern beliebten, AVR Microcontroller von Atmel gesteuert und hat Lichtsensoren in Form von zwei LDRs, 2 Bumper an der Stoßstange, 6 Status LEDs, Sensoren zur Überwachung der Akkuspannung, Drehgeber mit 625 CPR, ein Infrarot Sensor zur Hinderniserkennung und Kommunikation und Motorstromsensoren zur Verfügung. Zudem liegt dem Roboter eine umfangreiche Anleitung, inklusive einem kleinen C-Crashkurs, ein USB-Interface zum Anschluss an den PC und ein USB Kabel bei.&lt;br /&gt;
&lt;br /&gt;
In diesem Artikel geht es um die Grundlagen des RP6. Zur Programmierung des RP6 gibt es eine eigene Seite: [[RP6 - Programmierung]]&lt;br /&gt;
&lt;br /&gt;
==Technische Daten==&lt;br /&gt;
{|  {{Blauetabelle}} &lt;br /&gt;
|'''Mikrocontroller:'''&lt;br /&gt;
|AVR [[ATmega32]]&lt;br /&gt;
|-&lt;br /&gt;
|'''Speicher:'''&lt;br /&gt;
|32 kB [[Flash]]-Speicher, davon 1 kB bereits vom Bootloader belegt&amp;lt;br/&amp;gt;&lt;br /&gt;
2 kB RAM&amp;lt;br/&amp;gt; &lt;br /&gt;
1 kB [[EEPROM]]&lt;br /&gt;
|-&lt;br /&gt;
|'''Programmierung:'''&lt;br /&gt;
|Über AVR-[[Bootloader]], belegt ca. 1 kB des Flash-Speichers&lt;br /&gt;
|-&lt;br /&gt;
|'''Vorhandene Sensoren:'''&lt;br /&gt;
|2 [[Sensorarten#Helligkeit|Lichtsensoren (LDR)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
1 [[Sensorarten#Helligkeit|Infrarot (ACS - Anti Collision System)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
2 [[Sensorarten#Bumpers|Bumper]] &amp;lt;br/&amp;gt; &lt;br /&gt;
2 [[Sensorarten#Incremental-Geber|Drehgeber (Encoder)]]&lt;br /&gt;
|-&lt;br /&gt;
|'''Vorhandene Aktoren:'''&lt;br /&gt;
|2 Motoren&amp;lt;br/&amp;gt;&lt;br /&gt;
6 Status-LEDs&amp;lt;br/&amp;gt;&lt;br /&gt;
1 IR-Sender&amp;lt;br/&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|'''Abmessungen:'''&lt;br /&gt;
|(L &amp;amp;times; B &amp;amp;times; H) 172 &amp;amp;times; 128 &amp;amp;times; 50 mm&lt;br /&gt;
|-&lt;br /&gt;
|'''Ausführung:'''&lt;br /&gt;
|Fertig aufgebauter Roboter&lt;br /&gt;
|-&lt;br /&gt;
|'''Stromversorgung:'''&lt;br /&gt;
|6 AA NiMH Akkus&lt;br /&gt;
|-&lt;br /&gt;
|'''Hersteller:'''&lt;br /&gt;
|Arexx Niederlande&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Mechanik==&lt;br /&gt;
===Beschreibung===&lt;br /&gt;
&lt;br /&gt;
===Sensoren===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Encoder====&lt;br /&gt;
&lt;br /&gt;
Die Drehgeber sind an den Getrieben der Motoren zur Drehzahlmessung angebracht. Es handelt sich dabei um Reflexlichtschranken, die auf Codierscheiben mit je 18 weissen und 18 schwarzen Segmenten ausgerichtet sind, also insgesamt 36 Segmente. Diese Codierscheiben sind wiederum an je eines der Zahnräder der beiden Getriebe geklebt worden. Wenn es sich dreht, wandern die einzelnen Segmente an der Reflexlichtschranke vorbei. Die weissen Segmente reflektieren das Infrarotlicht, die schwarzen Segmente nur wenig. Jedes der zwei mittleren Stufenzahnräder des Getriebes hat 50 Zähne auf dem großen, und 12 auf dem kleineren Zahnrad. Die Codierscheiben befinden sich auf dem Zahnrad neben dem Motor, also rechnet man:&lt;br /&gt;
50/12 * 50/12 =17.13/36; 17.13/36 * 36=625&lt;br /&gt;
Daher haben die Encoderscheiben auch Ihre 36 Segmente, denn das gibt eine schöne runde Zahl ohne gebrochenen Anteil. Die Drehgeber erzeugen also 625 Flanken pro Radumdrehung wobei jede Flanke einem Segment entspricht. Bei einem Raddurchmesser von ca. 50mm inkl. Raupenkette, ergibt sich rein rechnerisch ein Radumfang von ca. 157mm was 0.2512mm pro Zählschritt der Drehgeber entspricht. Da sich die Raupenketten aber fast immer etwas in den Untergrund eindrücken (bzw. auch selbst eingedrückt werden) kann man aber von 0.25mm pro Zählschritt ausgehen – meist ist es sogar etwas weniger, z.B. nur 0.24 oder 0.23mm. Das muss man durch abfahren von Teststrecken ermitteln, wie es im Anhang grob beschrieben ist. Sehr genau ist das allerdings durch Radschlupf (bzw. hier müssten wir eigentlich von „Kettenschlupf“ sprechen) und ähnlichen Dingen nicht - vor allem beim Rotieren auf der Stelle. Beim normalen Geradeausfahren ist dieser Fehler klein, aber beim Rotieren kann er schnell sehr große Werte annehmen! Abweichungen muss man evtl. durch weitere Tests ermitteln und mit einkalkulieren. Das ist bei Raupenantrieben leider so – auch bei viel teureren und hochwertigeren Robotern. Dafür hat man aber den Vorteil, dass der Roboter mit Raupenantrieb recht geländegängig ist im Vergleich zu Robotern mit normalem Differentialantrieb mit zwei Antriebsrädern und Stützrad. Kleinere Hindernisse und Rampen kann er meist problemlos überwinden.&lt;br /&gt;
Dabei sind die Encoder sehr nützlich, denn man kann die Geschwindigkeit gut einregeln, egal wie der Untergrund und die Motorbelastung gerade aussieht. Bei gemessenen 50 Segmenten pro Sekunde liegt die Geschwindigkeit bei 1.25 cm/s, sofern wir von 0.25mm pro Zählschritt ausgehen. Etwa 50 Segmente pro Sekunde ist auch die geringste gerade noch regelbare Geschwindigkeit (das variiert aber etwas von Roboter zu Roboter). Bei 1200 Segmenten pro Sekunde wären es die maximal möglichen 30 cm/s (bei 0.25mm Auflösung, bei 0.23 sind es 27.6 cm/s). Standardmäßig begrenzt die Funktionsbibliothek das aber auf 1000 Flanken pro Sekunde. Die maximale Geschwindigkeit ist vom Ladezustand der Akkus abhängig – daher wären 30cm/s nicht besonders lange haltbar. Außerdem erhöht sich die Lebensdauer der Getriebe und Motoren je langsamer man fährt! Wenn der Roboter 4000 Segmente gezählt hat, ist er übrigens etwa einen Meter weit gefahren. Aber wie schon gesagt, gilt das natürlich nur für genau 0.25mm Auflösung. Ohne Kalibrierung hat man hier immer mehr oder weniger starke Abweichungen. Wem es nicht auf jeden mm ankommt, braucht nichts zu kalibrieren und kann einfach von 0.25mm oder besser 0.24mm ausgehen!&lt;br /&gt;
&lt;br /&gt;
====Stoßstangensensoren====&lt;br /&gt;
&lt;br /&gt;
Vorn am Roboter sind zwei Mikroschalter mit langem Schalthebel auf einer separaten&lt;br /&gt;
Platine untergebracht, die etwas vor der anderen Sensorplatine liegt. Dadurch werden&lt;br /&gt;
die IR LEDs auf der Sensorplatine geschützt und können nicht so leicht verbiegen&lt;br /&gt;
wenn der Roboter mal gegen ein Hindernis fährt. Die Stoßstange kann man auch abmontieren und z.B. gegen eine Schuss- oder Sammelvorrichtung für Bälle o.ä. ersetzen wenn man möchte.&lt;br /&gt;
&lt;br /&gt;
====Lichtsensoren====&lt;br /&gt;
&lt;br /&gt;
Vorne auf der kleinen Sensorplatine des Roboters sind zwei sog.&lt;br /&gt;
LDRs (=&amp;quot;Light Dependant Resistors&amp;quot; also lichtabhängige Widerstände)&lt;br /&gt;
platziert und nach links bzw. rechts ausgerichtet. Zwischen&lt;br /&gt;
den beiden Sensoren ist noch eine kleine schwarze&lt;br /&gt;
„Trennwand“ damit das Licht aus einer Richtung möglichst nur&lt;br /&gt;
einen der Sensoren erreicht. Sie bilden zusammen mit je einem&lt;br /&gt;
normalen Widerstand wie beim Batteriesensor einen Spannungsteiler – hier allerdings&lt;br /&gt;
um das Umgebungslicht zu messen.&lt;br /&gt;
&lt;br /&gt;
====Anti Collision System====&lt;br /&gt;
&lt;br /&gt;
Der aus Softwaresicht komplexeste Sensor des RP6 ist das ACS - das&lt;br /&gt;
„Anti Collision System“ (engl. für Anti Kollisions System)! Es besteht&lt;br /&gt;
aus einem IR Empfänger (s. Abb.) und zwei vorne auf der Sensorplatine&lt;br /&gt;
links und rechts angebrachten IR LEDs.&lt;br /&gt;
Da es je eine IR LED links und rechts gibt, kann das ACS grob unterscheiden ob sich&lt;br /&gt;
das Objekt links, rechts oder mittig vor dem Roboter befindet.&lt;br /&gt;
Man kann zusätzlich noch die Stromstärke mit der die beiden IR LEDs gepulst werden&lt;br /&gt;
in drei Stufen einstellen. Das ACS funktioniert aber auch in der höchsten Stufe nicht&lt;br /&gt;
mit allen Objekten immer zuverlässig, denn es kommt auf die Beschaffenheit der&lt;br /&gt;
Oberfläche des jeweiligen Objekts an! Ein schwarzes Objekt reflektiert das IR Licht natürlich&lt;br /&gt;
viel schlechter als ein weisses Objekt und ein kantiges und spiegelndes Objekt&lt;br /&gt;
könnte das IR Licht hauptsächlich in eine bestimme Richtung reflektieren. Die Reichweite&lt;br /&gt;
ist also immer vom jeweiligen Objekt abhängig! Das ist eine prinzipielle Schwäche&lt;br /&gt;
von so gut wie allen IR Sensoren (jedenfalls in dieser Preisklasse).&lt;br /&gt;
Trotzdem werden die meisten Hindernisse zuverlässig erkannt und können umfahren&lt;br /&gt;
werden. Falls das mal nicht klappt, gibt es noch die Stoßstange mit den Tastsensoren&lt;br /&gt;
und falls auch die nicht richtig getroffen werden, kann der Roboter noch mit den Motorstromsensoren&lt;br /&gt;
oder den Encodern erkennen, ob die Motoren blockieren (s.u.)!&lt;br /&gt;
Wem das nicht reicht, der könnte zusätzlich z.B. noch Ultraschallsensoren anbringen...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Erweiterungssystem===&lt;br /&gt;
Auf dem Mainboard sind 22 freie 3,2mm Löcher vorhanden (im Chassis weitere 16), auf denen die Erweiterungsmodule symmetrisch vorne und hinten gestapelt werden können. Weil der Stromverbrauch durch mehr Module steigt, ist es sinnvoll nur insgesamt 6-8 Module auf dem Roboter zu stapeln. Auf dem Mainboard selbst sind noch 6 kleine Erweiterungsflächen verfügbar (plus 2 sehr kleine auf der Bumperplatine).&lt;br /&gt;
&lt;br /&gt;
===Antrieb===&lt;br /&gt;
&lt;br /&gt;
Die 7,2 VDC Motoren sind im Chassis eingebaut und werden mithilfe der H-Brücken gesteuert. Die maximale Geschwindigkeit liegt bei 25cm/s, das kann je nach Akkuspannung aber variieren. Ohne Softwarebegrenzung sind sogar 30cm/s möglich, dadurch verringert sich aber die Lebensdauer der Motoren. Die maximale Steigung, die der RP6 bewältigen kann, ist 30%, ohne Bumperplatine 40%, das hängt aber auch vom Untergrund ab. Kleine Hindernisse wie Bücher und Stifte kann der RP6 problemlos überqueren. Die Achsen der Räder sind in selbstschmierenden Sinterlagern mit 4mm Durchmesser gelagert.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Elektromechanik==&lt;br /&gt;
===Beschreibung===&lt;br /&gt;
===Odometrie===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Elektronik==&lt;br /&gt;
[[Bild:RP6 Block.jpg|thumb|Blockdiagramm]]&lt;br /&gt;
===Beschreibung===&lt;br /&gt;
&lt;br /&gt;
===Sensoren (SENSORS)===&lt;br /&gt;
&lt;br /&gt;
Die meisten Sensoren über die der Roboter verfügt, haben wir ja schon in anderen Abschnitten kurz genannt, wollen diese nun aber etwas detaillierter betrachten.&lt;br /&gt;
In dem Blockdiagramm sind einige der Sensoren nicht in dem blauen Bereich &amp;quot;Sensors&amp;quot; zu sehen, weil sie besser in andere Bereiche passen. Trotzdem zählen natürlich auch die Drehgeber (= “Encoder“), Motorstromsensoren und der Batteriespannungssensor zu den Sensoren und werden darum in diesem Abschnitt beschrieben!&lt;br /&gt;
&lt;br /&gt;
====Batteriespannungs-Sensor (Voltage Sensor)====&lt;br /&gt;
&lt;br /&gt;
Dieser &amp;quot;Sensor&amp;quot; ist eigentlich nur ein einfacher Spannungsteiler aus zwei Widerständen. Wir gehen davon aus, dass die Batterien insgesamt maximal 10V liefern können. 6 NiMH Akkus werden immer unterhalb davon bleiben. Die Referenzspannung des ADC, also die Spannung mit der er die gemessene Spannung vergleicht, beträgt 5V. Da auch die Betriebsspannung 5V beträgt, darf diese nicht überschritten werden. Also müssen wir die zu messende Spannung um die Hälfte herabsetzen! Dies geschieht über einen Spannungsteiler aus zwei Widerständen, der die Spannung an den Messbereich des ADCs anpasst. Der ADC löst mit 10 Bit auf (Wertebereich 0 bis 1023), was eine Auflösung von 10V/1024=9.765625mV ergibt. Ein Messwert von 512 entspricht hier also 5V und 1023 wären ungefähr 10V! Diese Grenzwerte sollten aber normalerweise nie erreicht werden! Das ist nicht besonders genau, da die Widerstände keineswegs Präzisionswiderstände sind. Abweichungen von einigen Prozent nach oben und unten sind möglich. Auch die Referenzspannung von 5V ist nicht ganz genau und kann bei normaler Belastung etwas variieren. Das stört hier nicht, denn wir brauchen ohnehin nur einen ungefähren Wert um festzustellen ob die Batterien sich langsam dem Ende nähern. Wer die Spannung genau messen will, braucht ein Multimeter um den Messfehler zu ermitteln und diesen dann in Software auszugleichen. Wenn man mit Fehlern leben kann, kann man die Spannung dank des günstigen Umrechnungsverhältnisses sogar direkt aus den ADC Werten ungefähr abschätzen: 720 entsprechen dann grob 7.2V, 700 etwa 7V und 650 wären etwa 6.5V. Bei einem konstanten Wert unter 560 kann man davon ausgehen, dass die Akkus fast leer sind.&lt;br /&gt;
&lt;br /&gt;
====Motorstrom====&lt;br /&gt;
[[Bild:RP6_MSS.jpg|thumb]]&lt;br /&gt;
Es befinden sich zwei Leistungswiderstände in den beiden Motorstromkreisen. Aus dem Ohm'schen Gesetz U=RxI folgt, dass sich die Spannung die an einem bestimmten Widerstand abfällt, proportional zum Strom verhält, der diesen durchfließt!&lt;br /&gt;
Damit die Spannungsabfälle an den Widerständen nicht zu groß werden, müssen die Widerstände klein gewählt werden. In unserem Fall haben Sie einen Wert von 0.1 Ohm&lt;br /&gt;
Die abfallende Spannung ist also nur sehr klein (0.1V bei einem Strom von 1A) und muss verstärkt werden bevor sie mit dem ADC gemessen werden kann. Das erledigt jeweils ein sog. Operationsverstärker (OPV). In der Schaltung des RP6 wird je Motorkanal ein OPV verwendet. Der Messbereich geht etwa bis 1.8A. Bei 1.8A fallen etwa 0.18V am Widerstand ab und es ergibt sich am Ausgang des OPV eine Spannung von etwa 4V. Mehr kann der verwendete OPV bei 5V Betriebsspannung nicht ausgeben:&lt;br /&gt;
&lt;br /&gt;
I = U / ((1 + (100k / 4,7k)) * 0,1)&lt;br /&gt;
&lt;br /&gt;
Die Leistungswiderstände haben eine Toleranz von 10%, die Widerstände am OPV 5%, also ist das alles nur sehr ungenau (Ungenauigkeiten im Bereich von etwa 270mA sind möglich wenn man die Sensoren nicht kalibriert!). Wir brauchen allerdings auch nur den ungefähren Wert um festzustellen ob die Motoren stark oder wenig belastet werden. So kann der Roboter gut blockierte oder gar defekte Motoren bzw. Drehgeber erkennen! Die DC-Motoren benötigen mehr Strom je stärker sie belastet werden (Drehmoment) und somit steigt der Strom sehr stark an wenn die Motoren blockiert sind. Das wird von der Robotersoftware zur Notabschaltung verwendet: wenn die Motoren dauerhaft mit hohem Strom betrieben würden, könnten diese sehr heiß werden und dadurch Schaden nehmen! Und wenn die Encoder mal ausfallen sollten – aus welchem Grund auch immer – kann auch das damit erkannt werden. Man würde dann eine Drehzahl von 0 messen. Lässt man die Motoren aber auf voller Kraft laufen und der Strom bleibt trotzdem klein (also sind die Ketten nicht blockiert!), kann man genau daraus schließen, dass entweder die Encoder, oder die Motoren ausgefallen sind (oder Encoder und Motorstromsensoren nicht funktionieren... das passiert z.B. wenn man vergessen hat diese vorher per Software einzuschalten).&lt;br /&gt;
&lt;br /&gt;
====Encoder====&lt;br /&gt;
[[Bild:RP6_ENCODER.jpg|thumb]]&lt;br /&gt;
Ganz anders als die letztgenannten Sensoren funktionieren die Drehgeber, die an den Getrieben der Motoren zur Drehzahlmessung angebracht sind. Es handelt sich dabei um Reflexlichtschranken, die auf Codierscheiben mit je 18 weissen und 18 schwarzen Segmenten ausgerichtet sind, also insgesamt 36 Segmente (s. Abb). Diese Codierscheiben sind wiederum an je eines der Zahnräder der beiden Getriebe geklebt worden. Wenn es sich dreht, wandern die einzelnen Segmente an der Reflexlichtschranke vorbei. Die weissen Segmente reflektieren das Infrarotlicht, die schwarzen Segmente nur wenig. Die Drehgeber erzeugen so zwar auch wie die anderen Sensoren ein analoges Signal, aber es wird digital interpretiert. Zunächst wird das Signal verstärkt und anschließend über einen sog. Schmitt Trigger in ein Rechtecksignal umgewandelt. Die Flanken dieses Signals, also die Wechsel von 5 auf 0V und umgekehrt, lösen jeweils ein Interrupt Ereignis aus und diese werden dann von der Software gezählt. So kann die zurückgelegte Wegstrecke gemessen und zusammen mit einem Timer zur Zeitmessung die Drehzahl und damit auch die Geschwindigkeit ermittelt werden. Die Ermittlung der Drehzahl ist auch Hauptanwendung der Encoder – nur mit den Encodern kann man die Drehzahl auf den gewünschten Sollwert einregeln. Ohne Regelung wäre die Drehzahl nämlich von der Akkuspannung, Belastung der Motoren usw. abhängig. Die hohe Auflösung ermöglicht es dabei, auch niedrige Geschwindigkeiten noch relativ genau einzuregeln. Jedes der zwei mittleren Stufenzahnräder des Getriebes hat 50 Zähne auf dem großen, und 12 auf dem kleineren Zahnrad (s. Abb). Die Codierscheiben befinden sich auf dem Zahnrad neben dem Motor, also rechnet man:&lt;br /&gt;
&lt;br /&gt;
50/12 * 50/12 =17.13/36; 17.13/36 * 36=625&lt;br /&gt;
&lt;br /&gt;
Daher haben die Encoderscheiben auch Ihre 36 Segmente, denn das gibt eine schöne runde Zahl ohne gebrochenen Anteil. Die Drehgeber erzeugen also 625 Flanken pro Radumdrehung wobei jede Flanke einem Segment entspricht. Bei einem Raddurchmesser von ca. 50mm inkl. Raupenkette, ergibt sich rein rechnerisch ein Radumfang von ca. 157mm was 0.2512mm pro Zählschritt der Drehgeber entspricht. Da sich die Raupenketten aber fast immer etwas in den Untergrund eindrücken (bzw. auch selbst eingedrückt werden) kann man aber von 0.25mm pro Zählschritt ausgehen – meist ist es sogar etwas weniger, z.B. nur 0.24 oder 0.23mm. Das muss man durch abfahren von Teststrecken ermitteln, wie es im Anhang grob beschrieben ist. Sehr genau ist das allerdings durch Radschlupf (bzw. hier müssten wir eigentlich von „Kettenschlupf“ sprechen) und ähnlichen Dingen nicht - vor allem beim Rotieren auf der Stelle. Beim normalen Geradeausfahren ist dieser Fehler klein, aber beim Rotieren kann er schnell sehr große Werte annehmen! Abweichungen muss man evtl. durch weitere Tests ermitteln und mit einkalkulieren. Das ist bei Raupenantrieben leider so – auch bei viel teureren und hochwertigeren Robotern. Dafür hat man aber den Vorteil, dass der Roboter mit Raupenantrieb recht geländegängig ist im Vergleich zu Robotern mit normalem Differentialantrieb mit zwei Antriebsrädern und Stützrad. Kleinere Hindernisse und Rampen kann er meist problemlos überwinden.&lt;br /&gt;
Dabei sind die Encoder sehr nützlich, denn man kann die Geschwindigkeit gut einregeln, egal wie der Untergrund und die Motorbelastung gerade aussieht. Bei gemessenen 50 Segmenten pro Sekunde liegt die Geschwindigkeit bei 1.25 cm/s, sofern wir von 0.25mm pro Zählschritt ausgehen. Etwa 50 Segmente pro Sekunde ist auch die geringste gerade noch regelbare Geschwindigkeit (das variiert aber etwas von Roboter zu Roboter). Bei 1200 Segmenten pro Sekunde wären es die maximal möglichen 30 cm/s (bei 0.25mm Auflösung, bei 0.23 sind es 27.6 cm/s). Standardmäßig begrenzt die Funktionsbibliothek das aber auf 1000 Flanken pro Sekunde. Die maximale Geschwindigkeit ist vom Ladezustand der Akkus abhängig – daher wären 30cm/s nicht besonders lange haltbar. Außerdem erhöht sich die Lebensdauer der Getriebe und Motoren je langsamer man fährt!&lt;br /&gt;
&lt;br /&gt;
=====Encoder justieren=====&lt;br /&gt;
Damit der RP6 die Signale der Drehgeber richtig auswerten kann, muss man evtl. die Drehgeber einmalig justieren. Dies kann auch schon bei einem neu gekauften RP6 notwendig sein.&lt;br /&gt;
Eine genaue Anleitung dazu findet man [http://www.arexx.com/rp6/downloads/RP6_ENCODER_DE_20071219.zip hier]. Es gibt auch ein [http://www.arexx.com/rp6/downloads/rp6_encoder_video.zip Video], das die Drehgeber-Justierung zeigt.&lt;br /&gt;
&lt;br /&gt;
=====Encoder kalibrieren=====&lt;br /&gt;
Wenn der Roboter 4000 Segmente gezählt hat, ist er etwa einen Meter weit gefahren. Aber wie schon gesagt, gilt das natürlich nur für genau 0.25mm Auflösung. Ohne Kalibrierung hat man hier immer mehr oder weniger starke Abweichungen. Wem es nicht auf jeden mm ankommt, braucht nichts zu kalibrieren und kann einfach von 0.25mm oder besser 0.24mm ausgehen!&lt;br /&gt;
Optimal ist es, wenn man sich für Weg- und Winkelmessungen nicht auf die Encoder Daten stützen muss, sondern externe Systeme wie Infrarotbaken oder einen genauen elektronischen Kompass dazu zur Verfügung hat.&lt;br /&gt;
&lt;br /&gt;
Will man die Drehgeber des RP6 dennoch kalibrieren, kann man ihn z.B. mit diesem Testprogramm:&lt;br /&gt;
&amp;lt;pre&amp;gt;#include &amp;quot;RP6RobotBaseLib.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
	initRobotBase();&lt;br /&gt;
	powerON();&lt;br /&gt;
&lt;br /&gt;
	// Test: Go ahead 1m and stop!&lt;br /&gt;
	move (80, FWD, DIST_MM(1000), true);&lt;br /&gt;
	writeString_P(&amp;quot;LEFT RIGHT&amp;quot;);&lt;br /&gt;
 	writeString_P(&amp;quot;\n&amp;quot;);&lt;br /&gt;
 	writeInteger(mleft_dist, DEC);&lt;br /&gt;
	writeChar(' ');&lt;br /&gt;
 	writeInteger(mright_dist, DEC);&lt;br /&gt;
	writeString_P(&amp;quot;\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
	powerOFF();&lt;br /&gt;
&lt;br /&gt;
	return 0;&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
... 1m weit fahren lassen und dann messen, wie weit er tatsächlich gefahren ist. Das Programm gibt auf dem Terminal den Stand der Drehgeber aus. Teilt man dann die gemessene Fahrstrecke in mm durch den Wert der Drehgeber, erhält man die Auflösung. Diesen Wert kann man dann der Konstanten ENCODER_RESOLUTION in der RP6Config.h zuweisen. Nach &amp;quot;Make Clean&amp;quot;, einer Neukompilierung und erneuter Ausführung des Testprogramms müßte der RP6 jetzt genau 1m weit fahren. Das gilt zumindest für den Untergrund, auf dem die Kalibrierung durchgeführt wurde.&lt;br /&gt;
&lt;br /&gt;
====Stoßstangensensoren (Bumper)====&lt;br /&gt;
&lt;br /&gt;
Vorn am Roboter sind zwei Mikroschalter mit langem Schalthebel auf einer separaten&lt;br /&gt;
Platine untergebracht, die etwas vor der anderen Sensorplatine liegt. Dadurch werden&lt;br /&gt;
die IR LEDs auf der Sensorplatine geschützt und können nicht so leicht verbiegen&lt;br /&gt;
wenn der Roboter mal gegen ein Hindernis fährt. Mit den zwei Schaltern kann der Mikrocontroller&lt;br /&gt;
einen solchen Aufprall registrieren und dann beispielsweise zurücksetzen,&lt;br /&gt;
sich etwas drehen und weiterfahren. Die Schalter sind an zwei der Ports die schon mit&lt;br /&gt;
den LEDs verbunden sind angeschlossen und blockieren so keine anderen Ports des&lt;br /&gt;
Mikrocontrollers. Daher leuchten die LEDs auch immer wenn man einen der Schalter&lt;br /&gt;
drückt! Da dies normalerweise relativ selten passiert, stört das aber nicht weiter.&lt;br /&gt;
Die Stoßstange kann man auch abmontieren und z.B. gegen eine Schuss- oder Sammelvorrichtung&lt;br /&gt;
für Bälle o.ä. ersetzen wenn man möchte.&lt;br /&gt;
&lt;br /&gt;
====Lichtsensoren (LDRs)====&lt;br /&gt;
[[Bild:RP6_Licht.jpg|thumb]]&lt;br /&gt;
Vorne auf der kleinen Sensorplatine des Roboters sind zwei sog.&lt;br /&gt;
LDRs (=&amp;quot;Light Dependant Resistors&amp;quot; also lichtabhängige Widerstände)&lt;br /&gt;
platziert und nach links bzw. rechts ausgerichtet. Zwischen&lt;br /&gt;
den beiden Sensoren ist noch eine kleine schwarze&lt;br /&gt;
„Trennwand“ damit das Licht aus einer Richtung möglichst nur&lt;br /&gt;
einen der Sensoren erreicht. Sie bilden zusammen mit je einem&lt;br /&gt;
normalen Widerstand wie beim Batteriesensor einen Spannungsteiler – hier allerdings&lt;br /&gt;
um das Umgebungslicht zu messen. Die 5V Betriebsspannung wird auch geteilt, aber&lt;br /&gt;
hier ist einer der Widerstände variabel! Es wird also das Teilungsverhältnis je nach Intensität&lt;br /&gt;
des Lichteinfalls verändert und somit eine vom Lichteinfall abhängige Spannung&lt;br /&gt;
an einen der A/D Wandler Kanäle geleitet!&lt;br /&gt;
Über den Spannungsunterschied zwischen den beiden Sensoren kann man ermitteln in&lt;br /&gt;
welcher Richtung sich eine bzw. die hellste Lichtquelle vor dem Roboter befindet:&lt;br /&gt;
Links, Rechts oder in der Mitte. Mit einem entsprechenden Programm, kann man so z.B. eine starke Taschenlampe in&lt;br /&gt;
einem abgedunkelten Zimmer verfolgen, oder den Roboter die hellste Stelle in einem&lt;br /&gt;
Raum suchen lassen! Klappt z.B. sehr gut mit einem stärkeren Hand-Halogenscheinwerfer:&lt;br /&gt;
Wenn man damit auf den Boden leuchtet, kann der Roboter dem Lichtfleck auf&lt;br /&gt;
dem Boden folgen.&lt;br /&gt;
Das geht natürlich auch umgekehrt: Der Roboter könnte z.B. auch versuchen sich vor&lt;br /&gt;
hellem Licht zu verstecken...&lt;br /&gt;
Wenn man noch ein oder zwei LDRs hinten am Roboter anbringen würde, könnte man&lt;br /&gt;
das noch verfeinern und die Richtung in der sich Lichtquellen befinden besser bestimmen.&lt;br /&gt;
Der Roboter kann sonst nämlich oft nur schwer unterscheiden ob die Lichtquelle&lt;br /&gt;
vor oder hinter ihm liegt. Zwei der A/D Wandler Kanäle sind noch frei...&lt;br /&gt;
&lt;br /&gt;
====Anti Collision System (ACS)====&lt;br /&gt;
[[Bild:RP6 ACS.jpg|thumb|Das ACS]]&lt;br /&gt;
Der aus Softwaresicht komplexeste Sensor des RP6 ist das ACS - das „Anti Collision System“ (engl. für Anti Kollisions System)! Es besteht aus einem IR Empfänger (s. Abb.) und zwei vorne auf der Sensorplatine links und rechts angebrachten IR LEDs. Die IR LEDs werden direkt vom Mikrocontroller angesteuert. Die Ansteuerungsroutinen können beliebig verändert und verbessert werden! Beim Vorgängermodell war dafür noch ein eigener Controller nötig, dessen Programm aber nicht vom Anwender geändert werden konnte...&lt;br /&gt;
Mit den IR LEDs werden kurze, mit 36kHz modulierte Infrarot Impulse ausgesandt, auf die der darauf ausgelegte IR Empfänger reagiert. Werden die IR Impulse an einem Gegenstand vor dem Roboter reflektiert und vom IR Empfänger detektiert, kann der Mikrocontroller darauf reagieren und z.B. ein Ausweichmanöver einleiten. Damit das ACS nicht zu empfindlich bzw. auf eventuelle Störungen reagiert, wartet die Software bis eine bestimmte Anzahl von Impulsen in einer bestimmten Zeit empfangen worden ist. Es wird auch eine Synchronisation mit dem RC5 Empfang durchgeführt und auf die RC5 Signale von TV/Hifi Fernbedienungen wird so nicht reagiert. Bei anderen Codes kann das aber nicht garantiert werden und das ACS könnte dann Hindernisse erkennen, wo gar keine sind! Da es je eine IR LED links und rechts gibt, kann das ACS grob unterscheiden ob sich das Objekt links, rechts oder mittig vor dem Roboter befindet.&lt;br /&gt;
Man kann zusätzlich noch die Stromstärke mit der die beiden IR LEDs gepulst werden in drei Stufen einstellen. Das ACS funktioniert aber auch in der höchsten Stufe nicht mit allen Objekten immer zuverlässig, denn es kommt auf die Beschaffenheit der Oberfläche des jeweiligen Objekts an! Ein schwarzes Objekt reflektiert das IR Licht natürlich viel schlechter als ein weisses Objekt und ein kantiges und spiegelndes Objekt könnte das IR Licht hauptsächlich in eine bestimme Richtung reflektieren. Die Reichweite ist also immer vom jeweiligen Objekt abhängig! Das ist eine prinzipielle Schwäche von so gut wie allen IR Sensoren (jedenfalls in dieser Preisklasse).&lt;br /&gt;
Trotzdem werden die meisten Hindernisse zuverlässig erkannt und können umfahren werden. Falls das mal nicht klappt, gibt es noch die Stoßstange mit den Tastsensoren und falls auch die nicht richtig getroffen werden, kann der Roboter noch mit den Motorstromsensoren oder den Encodern erkennen, ob die Motoren blockieren (s.u.)!&lt;br /&gt;
Wem das nicht reicht, der könnte zusätzlich z.B. noch Ultraschallsensoren anbringen...&lt;br /&gt;
&lt;br /&gt;
====IR-Kommunikation (IRCOMM)====&lt;br /&gt;
Der RP6 kann über die IR-LEDs links und rechts über der Bumper-Platine Daten zu anderen IR-Empfängern senden.  Es ist z.B. möglich, dass mehrere Roboter ihre Sensorwerte untereinander vergleichen.&lt;br /&gt;
&lt;br /&gt;
====6 Status-LEDs====&lt;br /&gt;
Die Status-LEDs sind vorne links und rechts über den Lichtsensoren auf der Hauptplatine angebracht.&lt;br /&gt;
&lt;br /&gt;
Über die Status-LEDs können Sensorzustände, z.B. des ACS, der Bumper oder der Lichtsensoren, dargestellt werden.&lt;br /&gt;
&lt;br /&gt;
====IR-Sender====&lt;br /&gt;
Über den IR-Sender können Daten zu anderen Geräten übertragen werden.&lt;br /&gt;
&lt;br /&gt;
===Erweiterungssystem (EXPANSION SYSTEM)===&lt;br /&gt;
[[Bild:RP6_EXP.jpg|thumb]]&lt;br /&gt;
Eines der nützlichsten Features des RP6 ist das Erweiterungssystem.&lt;br /&gt;
Man kann den RP6 damit genau so weit ausbauen,&lt;br /&gt;
wie man es benötigt. Aus Kostengründen bietet das&lt;br /&gt;
Basissystem schließlich nur relativ wenig Sensoren. Es sind&lt;br /&gt;
zwar schon mehr als bei vielen anderen Robotern in dieser&lt;br /&gt;
Preisklasse, aber erst mit weiteren Sensoren macht ein Roboter&lt;br /&gt;
so richtig Spaß. Das ACS kann beispielsweise nur grob&lt;br /&gt;
erkennen ob sich ein Hindernis vor dem Roboter befindet.&lt;br /&gt;
Mit Ultraschallsensoren oder besseren zusätzlichen IR Sensoren,&lt;br /&gt;
könnte man aber die Distanz ermitteln und so beispielsweise&lt;br /&gt;
bessere Ausweichmanöver fahren!&lt;br /&gt;
&lt;br /&gt;
Neben Sensoren macht es auch sehr viel Sinn, zusätzliche Controller einzubauen um&lt;br /&gt;
die anfallenden Aufgaben aufteilen zu können. Beispielsweise die RP6 CONTROL M32&lt;br /&gt;
Platine mit einem weiteren MEGA32 Mikrocontroller oder die CCPRO M128.&lt;br /&gt;
&lt;br /&gt;
Das Erweiterungssystem muss natürlich in der Lage sein, viele Erweiterungsmodule&lt;br /&gt;
miteinander zu verbinden, dabei mit wenigen Signalleitungen&lt;br /&gt;
auskommen und eine ausreichend hohe Geschwindigkeit bieten.&lt;br /&gt;
&lt;br /&gt;
Siehe [[I2C]]&lt;br /&gt;
&lt;br /&gt;
===Steuerung (CONTROL SYSTEM)===&lt;br /&gt;
&lt;br /&gt;
====Hauptprozessor (ATMEGA32)====&lt;br /&gt;
[[Bild:RP6_MEGA32.jpg|thumb|Der MEGA32]]&lt;br /&gt;
Der Hauptprozessor ist der ATMEGA32 vom Atmel. Er hat 32KB Flash ROM und 2KB RAM. Der ATMEGA ist mit 8Mhz getaktet, kann also bis zu 8 Millionen Befehle pro Sekunde ausführen. Es sind 32 I/O-Pins  am Controller verfügbar. Die I/O-Pins gehören zu I/O-Ports mit jeweils 8 Pins. Davon gibt es 4: PORTA, PORTB, PORTC und PORTD. Der Controller kann die Ports entweder ein oder ausschalten (Output), oder erkennen, ob Spannung angelegt wurde oder nicht (Input). Es gibt mehrere Module, die verschiedene Aufgaben übernehmen:&lt;br /&gt;
* 3 Timer, einer davon erzeugt die PWM-Signale für die Motoren&lt;br /&gt;
* Die serielle Schnittstelle (UART)&lt;br /&gt;
* Das TWI (Two Wire Interface, also Zweidraht Schnittstelle)&lt;br /&gt;
* Ein ADC (Analog to Digital Converter) mit 8 Eingangskanälen, welche mit 10bit (0-1023) auflösen&lt;br /&gt;
* Drei externe Interrupt Eingänge&lt;br /&gt;
&lt;br /&gt;
Auserdem befindet sich im Microcontroller ein sog. Bootloader, welcher mit dem RP6 Loader kommuniziert und neue Programme in den Speicher lädt.&lt;br /&gt;
&lt;br /&gt;
===Antrieb (DRIVE SYSTEM)===&lt;br /&gt;
[[Bild:RP6_H-Brücke.jpg|thumb|Die H-Brücke]]&lt;br /&gt;
[[Bild:RP6_Tastverhältniss.jpg|thumb]]&lt;br /&gt;
Der Antrieb des RP6 besteht aus zwei Gleichstrom Motoren mit nachgeschaltetem Getriebe,&lt;br /&gt;
über das die beiden Raupenketten angetrieben werden.&lt;br /&gt;
Die Motoren genehmigen sich je nach Belastung&lt;br /&gt;
einen recht hohen Strom und können&lt;br /&gt;
natürlich nicht direkt vom Mikrocontroller&lt;br /&gt;
angesteuert werden. Dazu braucht man&lt;br /&gt;
Leistungstreiber in Form von je einer H-Brücke&lt;br /&gt;
pro Motor. Das grundlegende Prinzip&lt;br /&gt;
ist in der nebenstehenden Abbildung dargestellt.&lt;br /&gt;
Eine H-Brücke besteht aus vier&lt;br /&gt;
&amp;quot;Schaltern&amp;quot;, die in Form eines H's um einen&lt;br /&gt;
Motor angeordnet sind. Nehmen wir mal an,&lt;br /&gt;
zunächst seien alle Schalter aus. Schaltet&lt;br /&gt;
man dann S1 und S4 (Rot) an, liegt eine&lt;br /&gt;
Spannung am Motor an und er dreht sich&lt;br /&gt;
z.B. nach rechts. Schalten wir nun S1 und&lt;br /&gt;
S4 wieder aus und danach S2 und S3 (Grün)&lt;br /&gt;
an, wird die am Motor anliegende Spannung umgepolt und er dreht sich in die entgegen gesetzte&lt;br /&gt;
Richtung, also nach links! Man muss darauf achten, nicht gleichzeitig S1&lt;br /&gt;
und S2, oder S3 und S4 einzuschalten, sonst entstünde ein Kurzschluss und dadurch&lt;br /&gt;
könnten die &amp;quot;Schalter&amp;quot; zerstört werden!&lt;br /&gt;
Natürlich verwenden wir auf dem RP6 keine mechanischen Schalter, sondern sog.&lt;br /&gt;
MOSFETs. Diese schalten beim Anlegen einer genügend hohen Spannung am Eingang&lt;br /&gt;
durch. Die Schaltvorgänge können sehr schnell erfolgen, mehrere Kilohertz sind bei&lt;br /&gt;
unserer Anwendung möglich.&lt;br /&gt;
So kann man also schon mal die Drehrichtung einstellen. Und wie bekommt man den&lt;br /&gt;
Motor nun schneller bzw. langsamer? Ein Elektromotor dreht umso schneller, je höher&lt;br /&gt;
die angelegte Spannung ist. Die Drehzahl kann also über die Spannung eingestellt&lt;br /&gt;
werden - und genau dazu können wir die H-Brücke auch verwenden!&lt;br /&gt;
Die Abbildung verdeutlicht das Prinzip&lt;br /&gt;
nach dem wir vorgehen können.&lt;br /&gt;
Wir erzeugen&lt;br /&gt;
ein Rechtecksignal fester Frequenz,&lt;br /&gt;
bei dem wir das sog. Tastverhältnis&lt;br /&gt;
verändern. Mit &amp;quot;Tastverhältnis&amp;quot; ist das&lt;br /&gt;
Verhältnis von der eingeschalteten zur&lt;br /&gt;
ausgeschalteten Zeit des Signals gemeint.&lt;br /&gt;
Am Motor liegt dann effektiv eine niedrigere,&lt;br /&gt;
mittlere Gleichspannung an, die dem&lt;br /&gt;
Tastverhältnis entspricht. In der Grafik ist&lt;br /&gt;
dies durch eine rote Linie (Ug) und die roten&lt;br /&gt;
Flächen verdeutlicht. Wenn z.B. eine&lt;br /&gt;
Spannung von 7 Volt von den Akkus an&lt;br /&gt;
den Motortreibern anliegt, und diese mit&lt;br /&gt;
einem Tastverhältnis von 50% angesteuert werden, würde die mittlere Spannung in&lt;br /&gt;
etwa bei der Hälfte, also 3.5V liegen! Das stimmt real nicht ganz, aber so kann man&lt;br /&gt;
es sich schon gut und einfach vorstellen.&lt;br /&gt;
Das Antriebssystem ist dank der hohen Untersetzung (~ 1:72) relativ stark und so&lt;br /&gt;
kann der RP6 viel schwerere Lasten tragen als es z.B. der kleine Roboter ASURO&lt;br /&gt;
könnte. Allerdings steigt mit zunehmendem Gewicht natürlich auch der Energiebedarf&lt;br /&gt;
und die Akkus werden schneller leer sein ...&lt;br /&gt;
Im Vergleich mit einem ferngesteuerten Rennwagen o.ä. könnte man denken der RP6&lt;br /&gt;
sei langsam - stimmt auch - das ist jedoch absichtlich so! Der Roboter wird von einem&lt;br /&gt;
Mikrocontroller gesteuert und wenn der Programmierer einen Fehler bei der Programmierung&lt;br /&gt;
gemacht hat, wäre es ungünstig mit 10km/h vor die Wand zu prallen! Bei&lt;br /&gt;
dem eher gemächlichen Tempo des RP6 passiert aber nicht so schnell etwas und nebenbei&lt;br /&gt;
haben die Sensoren mehr Zeit die Umgebung auf Hindernisse zu untersuchen.&lt;br /&gt;
Und da wäre natürlich noch der Vorteil der höheren Belastbarkeit und der viel genaueren&lt;br /&gt;
Geschwindigkeitsregelung!&lt;br /&gt;
&lt;br /&gt;
===Stromversorgung (POWER SUPPLY)===&lt;br /&gt;
[[Bild:RP6_IC1.jpg|thumb]]&lt;br /&gt;
Natürlich benötigt ein Roboter Energie. Diese trägt der RP6 gespeichert in 6 Akkus mit&lt;br /&gt;
sich herum. Die Laufzeit ist durch die Kapazität der Akkus eingeschränkt, denn auch&lt;br /&gt;
wenn die Elektronik verhältnismäßig wenig Energie benötigt, schlucken die Motoren je&lt;br /&gt;
nach Belastung doch ziemlich viel.&lt;br /&gt;
&lt;br /&gt;
Damit die Akkus möglichst lange halten und der Roboter nicht ständig Pause machen&lt;br /&gt;
muss, sollte man ihm daher etwas größere Energiespeicher mit etwa 2500mAh gönnen.&lt;br /&gt;
Kleinere mit 2000mAh oder mehr funktionieren aber auch. Mit guten Akkus kann&lt;br /&gt;
man 3 bis 6 Stunden oder mehr Laufzeit erreichen, abhängig von der Betriebszeit der&lt;br /&gt;
Motoren, deren Belastung und Qualität der Akkus. Die 6 Akkus die notwendig sind,&lt;br /&gt;
haben insgesamt eine Nennspannung von 6x 1.2V = 7.2V. Im Blockdiagramm ist dies&lt;br /&gt;
mit &amp;quot;UB&amp;quot; (= &amp;quot;U-Battery&amp;quot;, U ist der Formelbuchstabe für Spannung) bezeichnet. „Nennspannung&amp;quot;,&lt;br /&gt;
weil sich die Spannung mit der Zeit stark verändert. Voll aufgeladen können&lt;br /&gt;
die Akkus im Leerlauf insgesamt bis zu 8.5V liefern! Diese Spannung sinkt während&lt;br /&gt;
der Entladung ab und schwankt auch je nach Belastung (Motoren an oder aus,&lt;br /&gt;
schnell langsam etc. - wie stark die Spannung schwankt, hängt auch von der Qualität&lt;br /&gt;
der verwendeten Akkus ab. Der Innenwiderstand ist hier die kritische Größe).&lt;br /&gt;
Das ist für Messungen von Sensorwerten und ähnlichem natürlich nicht ohne weiteres&lt;br /&gt;
brauchbar. Noch wichtiger ist jedoch, dass viele der verwendeten Komponenten wie&lt;br /&gt;
z.B. der Mikrocontroller nur auf 5V oder weniger Betriebsspannung ausgelegt sind und&lt;br /&gt;
bei so hohen Spannungen zerstört würden. Die Akku Spannung muss also auf einen&lt;br /&gt;
definierten Wert heruntergeregelt und stabilisiert werden!&lt;br /&gt;
Das übernimmt ein 5V Spannungsregler, der einen Strom von&lt;br /&gt;
maximal 1.5A liefern kann (s. Abb.). Bei 1.5A würde er jedoch&lt;br /&gt;
ziemlich viel Wärme abgeben. Es gibt daher eine große Kühlfläche&lt;br /&gt;
auf der Platine an die der Regler festgeschraubt ist. Über 1A&lt;br /&gt;
sollte der Regler trotz Kühlung besser nur kurzzeitig (also wenige&lt;br /&gt;
Sekunden) belastet werden, wenn man nicht noch einen zusätzlichen&lt;br /&gt;
großen Kühlköper draufschraubt.&lt;br /&gt;
&lt;br /&gt;
Es wird empfohlen, 800mA Dauerlast nicht zu überschreiten! Bei&lt;br /&gt;
so einer Belastung und zusammen mit den Motoren wären die&lt;br /&gt;
Akkus auch recht schnell leer. Im normalen Betrieb ohne ein Erweiterungsboard&lt;br /&gt;
nimmt der Roboter übrigens nicht mehr als 40mA auf (ausser wenn&lt;br /&gt;
das IRCOMM sendet), also überhaupt kein Problem für den Regler und man hat noch&lt;br /&gt;
genug Reserven für die Erweiterungsmodule, die meistens auch nicht mehr als 50mA&lt;br /&gt;
aufnehmen sofern keine Motoren, große LEDs o.ä. daran angeschlossen sind.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Umbau-Optionen==&lt;br /&gt;
Hier soll beschrieben werden, welche Umbau-Optionen es für die RP6 Base gibt. Im Text gibt es Verweise auf den Schaltplan des RP6 (RP6_MAINBOARD.PDF) in der Form: (SP2 B1: Bauteil). Dies bedeutet, dass man das Bauteil auf Blatt 2 des RP6-Schaltplans im Feld B1 finden kann. Beispielhaft sind im folgenden Text Bestell-Nummern der Firma [http://www.conrad.de/ce/ CONRAD] genannt. Natürlich kann man die Teile auch bei anderen Versendern beziehen.&lt;br /&gt;
&lt;br /&gt;
Bei den Materialangaben ist öfter die Rede von &amp;quot;Steckbuchsen mit Litze&amp;quot;. Diese Steckbuchsen mit angelöteter Litze können auf die ein- oder zweireihigen Stiftleisten aufgesteckt werden. Leider gibt es sie nicht (mehr) fertig konfektioniert bei CONRAD. Die einreihigen Steckbuchsen (RM 2,54mm) kann man aber z.B. bei [http://www.elv.de/output/controller.aspx ELV] bekommen: 2-polig (68-016635), 3-polig (68-022503) und 5-polig (68-023073). An sie muss man dann noch Litzen in der entsprechenden Länge selbst anlöten.&lt;br /&gt;
&lt;br /&gt;
===Elko für den IR-Empfänger===&lt;br /&gt;
[[Bild:RP6_C29_TSOP.JPG|thumb|RP6 C29 TSOP]]&lt;br /&gt;
Zur Spannungsstabilisierung kann ein Elko (C29; SP2 E1: C29*) am TSOP 34836 eingelötet werden.&lt;br /&gt;
&lt;br /&gt;
Normalerweise ist dieser Elko nicht erforderlich.&lt;br /&gt;
&lt;br /&gt;
Man braucht dazu:&lt;br /&gt;
* Einen Elektrolyt-Kondensator stehend 10 uF / 16V (C29); RM 2,5mm (445631)&lt;br /&gt;
&lt;br /&gt;
Der Elko kann auch eine geringere Kapazität als 10 uF haben (1 uF bis 4,7 uF reichen auch). Man lötet den Elko auf seinen Platz. Bitte auf die Polung achten: Der Minuspol zeigt nach vorn (in Fahrtrichtung des RP6).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Anschlüsse===&lt;br /&gt;
Hier wird aufgelistet, wo man auf dem RP6 Mainboard Anschlüsse nutzen kann, um sie z.B. zu weiteren Sensoren, zum USRBUS oder (weniger empfehlenswert!) direkt zu EPs oder Erweiterungsplatinen (M32, CCPRO M128) zu führen.&lt;br /&gt;
&lt;br /&gt;
====Analoge Sensoren an ADC0/1====&lt;br /&gt;
[[Bild:RP6_ADC01.JPG|thumb|RP6 ADC0/1]]&lt;br /&gt;
&lt;br /&gt;
Wenn man bis zu zwei analoge Sensoren (z.B. IR-Distanz-Mess-Sensoren Sharp GP2Y0A02YK 185364) direkt an den RP6 anschließen möchte, dann gibt es da zwei 3-polige Kontakte, beschriftet mit VDD/GND/ADCx (x = 0..1). Hier kann man 3-polige Stiftleisten auflöten, an die dann die Sensoren angeschlossen werden.&lt;br /&gt;
&lt;br /&gt;
Man braucht dazu:&lt;br /&gt;
* 1-reihige Stiftleiste RM 2,54mm (z.B. 36-polig 732478)&lt;br /&gt;
* Zwei Keramik-Vielschicht-Kondensatoren 100nF (C27, C28); RM 2,54mm (453099)&lt;br /&gt;
* ENTWEDER einen Elektrolyt-Kondensator stehend 220 uF / 16V (C26); RM 3,5mm (445903)&lt;br /&gt;
* ODER einen Elektrolyt-Kondensator stehend 470 uF / 16V (C26); RM 3,5mm (446211)&lt;br /&gt;
* Zwei 3-polige Steckbuchsen mit Litze zum Anschluß der Sensoren&lt;br /&gt;
&lt;br /&gt;
Man trennt nun von der 1-reihigen Stiftleiste zweimal 3 Kontakte ab und lötet sie auf die weiß umrahmten Kontakte (VDD/GND/ADCx; SP2 B1: ADC0, ADC1), anschließend C27, C28 (SP2 A1: C27*, C28*) auf ihre Plätze und zum Schluß den Elko 220 uF oder 470 uF (C26; SP2 A1: C26*). Der Elko ist nur bei Sensoren mit hohem Strombedarf notwendig, siehe dazu auch Anleitung des RP6, Seite 136! Beim Elko auf die Polung achten: Er muss so sitzen, dass er mit seinem Pluspol in Fahrtrichtung des RP6 (nach vorn) schaut.&lt;br /&gt;
&lt;br /&gt;
Die Sensoren lötet man an die Litzen der 3-poligen Steckbuchsen und steckt diese auf die neuen Kontakte.&lt;br /&gt;
&lt;br /&gt;
Da manche Sensoren einen höheren Stromverbrauch haben, kann man die Stromversorgung an den VDD-Pins der ADC0/1-Stecker abschaltbar machen oder eine separate +5V-Spannung einspeisen. Siehe dazu den Abschnitt &amp;quot;Trennstellen - Getrennte Stromversorgung für ADC0/1&amp;quot; weiter unten!&lt;br /&gt;
&lt;br /&gt;
====ISP (In System Programming)====&lt;br /&gt;
Der ATMEGA32 des RP6 wird standardmäßig über den PROG/UART Stecker programmiert. Dazu befindet sich im Prozessor ein Bootloader-Programm. Wenn man stattdessen oder zusätzlich die ISP-Programmierung mit einem dafür geeigneten ISP-Programmier-Adapter nutzen will, kann man den Adapter an einen (noch einzulötenden) Wannenstecker auf dem RP6 anschließen.&lt;br /&gt;
Vorher sind aber ein paar &amp;quot;Umbauarbeiten&amp;quot; erforderlich.&lt;br /&gt;
&lt;br /&gt;
Man braucht dazu:&lt;br /&gt;
* 1-reihige Stiftleiste RM 2,54mm (z.B. 36-polig 732478)&lt;br /&gt;
* Wannenstecker 2x5-polig gerade RM 2,54mm (z.B. [http://www.reichelt.de./ Reichelt] WSL 10G)&lt;br /&gt;
* Eine SMD-Diode LL 4148 (140902)&lt;br /&gt;
* Eine Codierbrücke (z.B. aus Set 742902)&lt;br /&gt;
&lt;br /&gt;
Zwischen dem XBUS-Stecker und C13 befinden sich 10 Lötpunkte für den ISP-Anschluß, auf die der Wannenstecker gelötet wird, und drei Lötpunkte (beschriftet mit ISP* - BOOTLOAD; SP2 A3: YR1..3), auf die eine 3-polige Stiftleiste gelötet werden muss.&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_ISP.JPG|RP6 ISP]]&lt;br /&gt;
&lt;br /&gt;
Vorher muss eine kurze Leiterbahn zwischen den Lötpunkten BOOTLOAD aufgetrennt werden. Die Leiterbahn befindet sich auf der Lötseite der Platine und muss mit einem scharfen Messer oder einem speziellen Leiterbahn-Unterbrecher zwischen den beiden Lötpunkten unterbrochen werden. Man sollte anschließend mit einem Widerstandsmeßgerät nachmessen: Es sollte keine Verbindung mehr zwischen den Lötpunkten bestehen.&lt;br /&gt;
Man trennt dann von der 1-reihigen Stiftleiste 3 Kontakte ab und lötet sie auf die beschriebenen drei Lötpunkte.&lt;br /&gt;
&lt;br /&gt;
Zum Schluss lötet man noch die Diode LL 4148 (SP2 B3: D11*) auf ihre Lötflächen zwischen R3 und C6. Die Kathode (Strich) der Diode kommt nach vorn (in Fahrtrichtung RP6, bzw. liegt rechts von R3). Wenn man jetzt eine Codierbrücke auf die mit &amp;quot;BOOTLOAD&amp;quot; beschrifteten Pins steckt, bleibt alles unverändert: Die Programmierung erfolgt weiter über den PROG/UART-Stecker mithilfe des Bootloaders im Prozessor.&lt;br /&gt;
Wird die Codierbrücke in Stellung &amp;quot;ISP*&amp;quot; umgesteckt, kann der Prozessor mit ISP programmiert werden.&lt;br /&gt;
&lt;br /&gt;
Vorsicht: Das Bootloader-Programm kann dabei zerstört werden! Es müssen zusätzlich Fusebits des ATMEGA32 verändert werden. Dabei kann der Prozessor im schlimmsten Fall nicht mehr ansprechbar sein. Man sollte diesen Umbau und die ISP-Programmierung nur machen, wenn man genau weiß, was man macht!&lt;br /&gt;
&lt;br /&gt;
Eine Kopie des Bootloaders und eine Kurzanleitung zum Einstellen der Fusebits gibt es hier:&lt;br /&gt;
[http://www.arexx.com/rp6/downloads/RP6BASE_BOOTLOADER.zip RP6_BOOTLOADER]&lt;br /&gt;
&lt;br /&gt;
====IO1..IO4====&lt;br /&gt;
[[Bild:RP6_IO1-4.JPG|thumb|RP6 IO1..IO4]]&lt;br /&gt;
Die Anschlüsse IO1 bis IO4 (SP2 E3: IO1..4) steuern bereits die Status-LEDs 1, 2, 4 und 5 an. Trotzdem kann man sie auch noch mit leichten Einschränkungen als I/O-Pins benutzen. Dazu lötet man zweimal 2 Pins einer 1-reihigen Stiftleiste RM 2,54mm (z.B. 36-polig 732478) auf die IO1/2 und IO3/4 Lötpunkte.&lt;br /&gt;
Hier eine Tabelle, die die Port-Pins zeigt, die IO1..IO4 zugeordnet sind:&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |IO&lt;br /&gt;
 |Status-LED&lt;br /&gt;
 |Port-Pin&lt;br /&gt;
 |-&lt;br /&gt;
 |1&lt;br /&gt;
 |SL1&lt;br /&gt;
 |PC4&lt;br /&gt;
 |-&lt;br /&gt;
 |2&lt;br /&gt;
 |SL2&lt;br /&gt;
 |PC5&lt;br /&gt;
 |-&lt;br /&gt;
 |3&lt;br /&gt;
 |SL4&lt;br /&gt;
 |PB7&lt;br /&gt;
 |-&lt;br /&gt;
 |4&lt;br /&gt;
 |SL5&lt;br /&gt;
 |PB1&lt;br /&gt;
 |-&lt;br /&gt;
|}&lt;br /&gt;
Wie können nun IO1..IO4 genutzt werden?&lt;br /&gt;
&lt;br /&gt;
Als ...&lt;br /&gt;
* Eingang, z.B. für zusätzliche Tastschalter/Bumper&lt;br /&gt;
* Ausgang, z.B. zur Ansteuerung von Treiberstufen, low-current LEDs, ...&lt;br /&gt;
&lt;br /&gt;
Wird ein Anschluß IOx als Eingang verwendet, muss ein Widerstand von 470 Ohm in Reihe mit dem Taster an VDD eingebaut werden, zusätzlich ein Pulldown-Widerstand 100 kOhm. Diese Beschaltung zeigen z.B. an SL6 die Widerstände R43 und R46 (SP2 E4: R43, R46).&lt;br /&gt;
&lt;br /&gt;
Als Ausgang geschaltet sollte an IOx kein hoher Strom entnommen werden: 10mA sind max. zu empfehlen!&lt;br /&gt;
&lt;br /&gt;
====USRBUS====&lt;br /&gt;
Die 14 Kontakte der beiden USRBUS-Stecker sind auf dem RP6 nirgendwo angeschlossen, sondern können über die Lötpunkte Y1..Y14 mit beliebigen Punkten auf dem Mainboard verbunden werden.&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_USRBUS.JPG|thumb|RP6 USRBUS]]&lt;br /&gt;
&lt;br /&gt;
Ich würde auf Y1..Y14 eine Stiftleiste löten, damit die USRBUS-Belegung geändert werden kann.&lt;br /&gt;
&lt;br /&gt;
Man braucht dazu:&lt;br /&gt;
* 2-reihige Stiftleiste RM 2,54mm (z.B. 2x36-polig 742007)&lt;br /&gt;
* Einige Steckbuchsen mit Litze&lt;br /&gt;
&lt;br /&gt;
Man trennt von der 2-reihigen Stiftleiste 2x7 Kontakte ab und lötet sie auf die Punkte Y1..Y14 (SP4 E34: Y1..14, Y1'..Y14') neben den beiden Wannensteckern USRBUS1 (vorn) und USRBUS2 (hinten). Wird der RP6 über Flachkabel mit einem USRBUS-Stecker auf einer RP6 Experimentierplatine (EP) und/oder mit einer Erweiterungsplatine (M32, CCPRO M128) verbunden, dann hat man mit allen mit dem USRBUS verbundenen Platinen eine direkte 14-polige Verbindung,- eben den &amp;quot;User Bus&amp;quot;. Den kann man dann nutzen, wie man will. Auf dem RP6 kann man mit Steckbuchsen die Pins Y1..Y14 mit anderen Pins verbinden.&lt;br /&gt;
&lt;br /&gt;
Beispiel: Verbindet man den Pin &amp;quot;ADC0&amp;quot; mit Y1 des USRBUS1, dann steht der Eingang ADC0 auf allen an den USRBUS1 angeschlossenen Platinen auf dem vorderen Platinenstapel an Y1 zur Verfügung. Man braucht also diesen Eingang nicht über ein eigenes Kabel auf eine EP zu führen, sondern kann dazu den USRBUS nehmen. Dadurch bleibt der Gesamtaufbau auf dem RP6 übersichtlich und komplett trennbar (man braucht nur die Stecker XBUS und USRBUS abzuziehen!).&lt;br /&gt;
&lt;br /&gt;
Wichtig:&lt;br /&gt;
* Man sollte gut dokumentieren, wie man den USRBUS am RP6 (vorn und hinten getrennt!), auf EPs und der M32/M128 benutzt! Sonst kann es bei einer anderen Anordnung von EPs zu USRBUS Konflikten/Kurzschlüssen kommen.&lt;br /&gt;
* Der USRBUS1- und der USRBUS2-Stecker sind auf dem RP6 NICHT miteinander verbunden.&lt;br /&gt;
&lt;br /&gt;
Einen Vorschlag für die Belegung des USRBUS1 (vorn) gibt es z.B. &lt;br /&gt;
[http://www.roboternetz.de/phpBB2/viewtopic.php?t=32549 hier] oder &lt;br /&gt;
[http://www.roboternetz.de/community/showthread.php/47102-Sensor-anschließen?p=453061&amp;amp;viewfull=1#post453061 da.]&lt;br /&gt;
&lt;br /&gt;
====Start/Stop Button====&lt;br /&gt;
[[Bild:RP6_ST.JPG|thumb|RP6 ST]]&lt;br /&gt;
Am mittleren Lochrasterfeld links finden sich zwei Lötpunkte ST1, ST2 (SP2 D2: ST1, ST2), an die weitere Start/Stop Taster (NO, normal offen) parallel zum Taster auf dem RP6 Mainboard angeschlossen werden können.&lt;br /&gt;
&lt;br /&gt;
Zum Anschluß kann man auch Stiftleisten auflöten. ST1, ST2 könnte man auch mit dem USRBUS1 verbinden, wenn man den RP6 z.B. von einer EP aus zurücksetzen möchte.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Serielle Schnittstelle====&lt;br /&gt;
[[Bild:RP6_RST.JPG|thumb|RP6 RST]]&lt;br /&gt;
Neben dem USRBUS1 Stecker befinden sich 5 Lötpunkte mit den Signalen RST, TX, RX, GND, VDD (SP4 AB5: YRX, YTX, YMRESET, YVDD). Hier kann z.B. eine 5-polige Stiftleiste aufgelötet werden, um einen Anschluß an die serielle Schnittstelle zu ermöglichen.&lt;br /&gt;
&lt;br /&gt;
Von diesen 5 Lötpunkten könnte z.B. auch [http://www.roboternetz.de/phpBB2/viewtopic.php?t=32549 so] eine Verbindung zum benachbarten USRBUS1 hergestellt werden, um die serielle Schnittstelle des RP6 auf EPs zu führen.&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;
&lt;br /&gt;
====I2C-Schnittstelle====&lt;br /&gt;
[[Bild:RP6_I2C.JPG|thumb|RP6 I2C]]&lt;br /&gt;
Neben dem XBUS2 Stecker finden sich 5 Lötpunkte mit den Signalen der I2C-Schnittstelle (SP4 D12: Stecker I2C). Dies sind: VDD (Pin 1), GND, SDA, SCL, INT1 (Pin 5). Hier kann z.B. eine 5-polige Stiftleiste aufgelötet werden, um einen Anschluß an die I2C-Schnittstelle zu ermöglichen.&lt;br /&gt;
&lt;br /&gt;
Von diesen 5 Lötpunkten könnte z.B. auch eine Verbindung zum USRBUS1 oder USRBUS2 hergestellt werden, um die I2C-Schnittstelle des RP6 auf EPs zu führen, allerdings hat man SCL, SDA, INT1 ja auch schon am XBUS zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Interrupt-Leitungen====&lt;br /&gt;
[[Bild:RP6_INTx.JPG|thumb|RP6 INTx]]&lt;br /&gt;
Die Interrupt-Leitungen INTU, INT1..3, MRESET (SP4 D34: MRESET, INT1..3, INTU) sind an 5 Lötpunkten neben dem XBUS1 Stecker zu kontaktieren. Hier kann natürlich auch eine 5-polige Stiftleiste aufgelötet werden. In der Regel wird man diese Anschlüsse nicht brauchen, weil sie schon auf dem XBUS zur Verfügung stehen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====VDD/GND/+UB Anschluß====&lt;br /&gt;
[[Bild:RP6_VDDGNDUB.JPG|thumb|RP6 VDD GND +UB]]&lt;br /&gt;
In der Nähe von C4 im hinteren Bereich des Mainboards finden sich Lötpunkte (SP4 E12: YVDDx, YGNDx; SP4 D2 YUBx), an denen man VDD, GND und +UB finden kann.&lt;br /&gt;
&lt;br /&gt;
Wenn man höhere Ströme an VDD (z.B. für Servos) oder +UB (z.B. für einen anderen IRCOMM-Sender oder einen DC-Motor) entnehmen möchte, empfehlen sich diese Lötpunkte, auf die man auch Stiftleisten löten kann.&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;
====EXT Anschluß====&lt;br /&gt;
[[Bild:RP6_EXT.jpg|thumb|RP6 EXT Anschluß]]&lt;br /&gt;
Am hinteren Rand der RP6 Hauptplatine gibt es eine Reihe von 8 Lötpunkten. Dies ist der EXT Anschluß (SP1 C23: Stecker EXT):&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |Pin&lt;br /&gt;
 |Name&lt;br /&gt;
 |Beschreibung&lt;br /&gt;
 |-&lt;br /&gt;
 |1&lt;br /&gt;
 |GND&lt;br /&gt;
 |RP6 und Akku Minuspol (GND)&lt;br /&gt;
 |-&lt;br /&gt;
 |2&lt;br /&gt;
 |CHRG&lt;br /&gt;
 |Anschluß (+) für ext. Ladegerät, identisch mit Pluspol der Ladebuchse (CHARGER, Pin 1). Ladung nur möglich, wenn S1 AUS ist!&lt;br /&gt;
 |-&lt;br /&gt;
 |3&lt;br /&gt;
 |CHRG&lt;br /&gt;
 |wie Pin 2!&lt;br /&gt;
 |-&lt;br /&gt;
 |4&lt;br /&gt;
 | +BAT&lt;br /&gt;
 |Akku Pluspol über Sicherung F1&lt;br /&gt;
 |-&lt;br /&gt;
 |5&lt;br /&gt;
 | +BAT&lt;br /&gt;
 |wie Pin 4!&lt;br /&gt;
 |-&lt;br /&gt;
 |6&lt;br /&gt;
 | +UB&lt;br /&gt;
 |RP6 +UB (+7,2V=, Bereich min. +5,5 bis max. +10V=)&lt;br /&gt;
 |-&lt;br /&gt;
 |7&lt;br /&gt;
 | +UB&lt;br /&gt;
 |wie Pin 6!&lt;br /&gt;
 |-&lt;br /&gt;
 |8&lt;br /&gt;
 |GND&lt;br /&gt;
 |wie Pin 1!&lt;br /&gt;
 |-&lt;br /&gt;
|}&lt;br /&gt;
Man kann hier eine JST XH Stiftleiste gerade, 8-polig, RM 2,5mm ([http://www.conrad.de/ce/de/product/740105/Stiftleiste-gerade-RM-25-mm-Serie-XH-Rastermass-25-mm-Pole-8-Nennstrom-3-A-B8B-XH-A-LFSN-JST-Inhalt-1-St 740105]) auflöten.&lt;br /&gt;
&lt;br /&gt;
Wozu kann man diesen Anschluß nutzen?&lt;br /&gt;
&lt;br /&gt;
Der wesentliche Sinn des EXT Anschlusses besteht darin, andere Arten der Stromversorgung und der Akkuladung zu ermöglichen. Normalerweise schaltet man den RP6 mit S1 an und aus. In Stellung AUS kann der Akku geladen werden, indem man ein Ladegerät an die CHARGER Buchse anschließt. Alternativ kann man das Ladegerät mit seinem Pluspol auch an CHRG (Pins 2, 3) anschließen. Siehe auch den Abschnitt &amp;quot;Trennstellen - EXT Anschluß: Andere Stromversorgung&amp;quot; weiter unten!&lt;br /&gt;
&lt;br /&gt;
An +BAT (Pins 4, 5) kann man direkt (ohne Unterbrechung durch S1) Strom aus dem Akku entnehmen. Die Grenze des Stroms bestimmt die Sicherung F1 (2,5A). Eine weitere Möglichkeit besteht darin, über diesen Anschluß den Akku auch mit einem geeigneten Ladegerät zu LADEN. Hierbei muss man aber darauf achten, dass S1 AUSgeschaltet ist, weil sonst der RP6 über +UB eine unzulässig hohe Spannung bekommen könnte. Wenn man den Akku mit 6 Mignonzellen im RP6 nicht nutzen will (der Akku-Halter bleibt leer!), sondern nur einen externen Akku, wäre der auch mit seinem Pluspol an +BAT über eine eigene Sicherung (2,5A träge) anzuschließen.&lt;br /&gt;
&lt;br /&gt;
+UB (+7,2V) ist die Versorgungsspannung des RP6 (kommt vom Akku-Pluspol über die Sicherung F1 und Schalter S1!). Mit +UB werden die H-Brücken (Motoransteuerung) direkt und die RP6 &amp;quot;Elektronik&amp;quot; über den 5V-Spannungswandler (IC1; SP1 D3: IC1) versorgt (= VDD). An +UB könnte man den RP6 direkt mit einer Spannung von +7,2V versorgen (Absicherung nicht vergessen!), dazu muss S1 AUSgeschaltet sein, damit es keine Konflikte mit dem eingebauten Akku gibt.&lt;br /&gt;
&lt;br /&gt;
Den EXT Anschluß kann man damit nutzen für:&lt;br /&gt;
* Externes Ladegerät&lt;br /&gt;
* Externen Akku&lt;br /&gt;
* Externe Stromversorgung ohne Akku&lt;br /&gt;
* Direkte Stromentnahme aus dem Akku&lt;br /&gt;
* Ergänzungsladung mit Solarzelle&lt;br /&gt;
* Autonome Akkuladung (Ladestation mit Kontakten, Induktionsladung ...)&lt;br /&gt;
* ...&lt;br /&gt;
&lt;br /&gt;
Man sollte gewisse Elektronik-Kenntnisse haben, wenn man die Spannungsversorgung des RP6 verändert. VOR irgendwelchen Veränderungen seht euch auch zuerst den Schaltplan des RP6 (SP1) genau an!&lt;br /&gt;
&lt;br /&gt;
===Mess-/Kontaktpunkte===&lt;br /&gt;
Hier geht es um Kontaktpunkte, an denen man z.B. den Logik-Pegel (High/Low) oder eine analoge Spannung messen kann. Natürlich kann man die Signale auch zur Weiterleitung auf eine EP kontaktieren, dies wird man aber normalerweise nicht brauchen.&lt;br /&gt;
&lt;br /&gt;
====UBAT====&lt;br /&gt;
[[Bild:RP6_UBAT.JPG|thumb|RP6 UBAT]]&lt;br /&gt;
In der Mitte des Mainboards befindet sich ein Kontaktpunkt UBAT (SP1 E1: YUBAT). Dies ist ADC7 des RP6 Microcontrollers.&lt;br /&gt;
&lt;br /&gt;
Man kann hier die analoge Spannung (gegen GND) messen, die vom +UB-Spannungssensor geliefert wird.&lt;br /&gt;
&lt;br /&gt;
Die Spannung ist:&lt;br /&gt;
 UBAT = +UB / 2&lt;br /&gt;
Da der Spannungsteiler (SP1 D12: R1, R2) des +UB-Spannungssensors nicht aus Präzisionswiderständen besteht, kann man für den eigenen RP6 einen Korrekturfaktor berechnen, wenn UBAT deutlich von +UB / 2 (+ UB z.B. gemessen am EXT Stecker, Pins 6 u. 7) abweicht. Damit kann man +UB sehr viel genauer bestimmen.&lt;br /&gt;
&lt;br /&gt;
====ACS====&lt;br /&gt;
[[Bild:RP6_ACS_TSOP.JPG|thumb|RP6 ACS TSOP]]&lt;br /&gt;
Hinter dem TSOP (IC3) befindet sich der Kontaktpunkt ACS (SP2 E1: ACS).&lt;br /&gt;
&lt;br /&gt;
Dies ist der Ausgang des TSOP bzw. Eingang PB2 des RP6 Microcontrollers. Man kann hier das Ausgangssignal des IR-Empfängers abnehmen, z.B. um es mit einem Oszilloskop sichtbar zu machen.&lt;br /&gt;
&lt;br /&gt;
Rechts neben dem TSOP kann man noch die 3 Kontaktpunkte ACS_R, ACS_P und ACS_L (SP2 E2: ACS_P, ACS_R, ACS_L) des ACS-IR-Senders finden.&lt;br /&gt;
&lt;br /&gt;
Folgende Tabelle zeigt die Verbindungen:&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |Kontakt&lt;br /&gt;
 |Microcontroller-Portpin&lt;br /&gt;
 |SP-Verbindung&lt;br /&gt;
 |ACS-IR-Sendediode&lt;br /&gt;
 |-&lt;br /&gt;
 |ACS_P&lt;br /&gt;
 |über R8: ACS_PWRH (PB3), über R9: ACS_PWR (PD6)&lt;br /&gt;
 |SP2: 3&lt;br /&gt;
 |Anoden D1, D2&lt;br /&gt;
 |-&lt;br /&gt;
 |ACS_R&lt;br /&gt;
 |ACS_R (PC7)&lt;br /&gt;
 |SP2: 2&lt;br /&gt;
 |Kathode D1&lt;br /&gt;
 |-&lt;br /&gt;
 |ACS_L&lt;br /&gt;
 |ACS_L/MISO (PB6)&lt;br /&gt;
 |SP1: 5&lt;br /&gt;
 |Kathode D2&lt;br /&gt;
 |-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====IRC====&lt;br /&gt;
[[Bild:RP6_IRC.JPG|thumb|RP6 IRC]] [[Bild:RP6_IRC3.JPG|thumb|RP6 IRC3]]&lt;br /&gt;
Im der Nähe von C13 befinden sich die Lötpunkte IRC, IRC+, IRC- und IRC3 (SP2 D2: YIRC; SP2 CD2: IRC+/-; SP2 C2: IRC3). Zusammen mit der Trennstelle IRC (siehe Abschnitt &amp;quot;Trennstellen - IRC&amp;quot; weiter unten!) kann man diese Kontaktstellen im Umfeld des IRCOMM-Sendedioden Treibers IRLML2502PBF (SP2 CD12: Q5) finden. Am Kontaktpunkt IRC findet sich der Eingang des Treibers bzw. Ausgang PD7 des RP6 Microcontrollers. IRC+, IRC- sind die Kontaktpunkte, an denen die IRCOMM-Sendedioden D3, D4 in Reihe auf der Sensorplatine angeschlossen sind (IRC+ = Anode). IRC3 ist verbunden mit dem Trennstellen-Lötpunkt IRC1 und liegt bei geschlossener Trennstelle IRC an +UB.&lt;br /&gt;
&lt;br /&gt;
Was läßt sich mit diesen Kontaktpunkten machen:&lt;br /&gt;
* Der IRCOMM-Sender ist der zweitgrößte Stromverbraucher des RP6 (nach dem Antrieb). An IRC3 kann daher eine eigene Stromversorgung für die IRCOMM-Sendedioden angeschlossen werden. Dazu muss die Trennstelle IRC zwischen ihren Lötpunkten IRC1, IRC2 aufgetrennt werden.&lt;br /&gt;
* An IRC+, IRC- könnten andere/weitere IRCOMM-Sendedioden angeschlossen werden (Anode an IRC+). Wenn der Vorwiderstand R6 (SP2 C2: R6) der Sendedioden dann nicht mehr paßt (bezügl. Leistung und/oder Widerstandswert), können neue leistungsfähigere IRCOMM-Sendedioden zwischen IRC3 und IRC- (Anode an IRC3) mit einem dafür geeigneten Vorwiderstand angebracht werden.&lt;br /&gt;
&lt;br /&gt;
====LS====&lt;br /&gt;
[[Bild:RP6_LS.JPG|thumb|RP6 LS]]&lt;br /&gt;
Die beiden Lötpunkte LS_L und LS_R (SP2 B12: LS_L, LS_R) neben R7 vorn auf dem Mainboard sind die Ausgänge der Helligkeitssensoren (links und rechts) bzw. die ADC-Eingänge ADC3 und ADC2 des RP6 Microcontrollers.&lt;br /&gt;
&lt;br /&gt;
Hier kann man die Spannungen messen, die den Helligkeitswerten entsprechen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====BP, S====&lt;br /&gt;
[[Bild:RP6_BP_S.JPG|thumb|RP6 BP S]]&lt;br /&gt;
Die Messpunkte BPL, BPR und der Kontaktpunkt S (SP2 E2: S; SP2 E3: BPR; SP2 E4: BPL) befinden sich am vorderen Platinenrand. BPL und BPR sind die Kontakte der Bumper. S ist eine nicht genutzte Verbindung zwischen dem Mainboard und der Sensorplatine, die über die Verbindung SP1, Pin 3, geführt wird (siehe folgende Tabelle!).&lt;br /&gt;
&lt;br /&gt;
Hier eine Tabelle mit der Belegung der 90°-Winkelverbindung SP1, SP2 zwischen dem RP6 Mainboard und der Sensorplatine: &lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |Pin&lt;br /&gt;
 |SP1&lt;br /&gt;
 |SP2&lt;br /&gt;
 |-&lt;br /&gt;
 |1&lt;br /&gt;
 |LS_L  --- Light Sensor Left&lt;br /&gt;
 |IRC-  --- IRCOMM-&lt;br /&gt;
 |-&lt;br /&gt;
 |2&lt;br /&gt;
 |BPL   --- Bumper Left&lt;br /&gt;
 |ACS_R --- ACS Right&lt;br /&gt;
 |-&lt;br /&gt;
 |3&lt;br /&gt;
 |S     --- Free for all&lt;br /&gt;
 |ACS_P --- ACS Power&lt;br /&gt;
 |-&lt;br /&gt;
 |4&lt;br /&gt;
 |GND&lt;br /&gt;
 |VDD&lt;br /&gt;
 |-&lt;br /&gt;
 |5&lt;br /&gt;
 |ACS_L --- ACS Left&lt;br /&gt;
 |BPR   --- Bumper Right&lt;br /&gt;
 |-&lt;br /&gt;
 |6&lt;br /&gt;
 |IRC+  --- IRCOMM+&lt;br /&gt;
 |LS_R  --- Light Sensor Right&lt;br /&gt;
 |-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====ENC====&lt;br /&gt;
[[Bild:RP6_ENC.JPG|thumb|RP6 ENC]]&lt;br /&gt;
Die beiden Messpunkte ENCL, ENCR (SP4 B12: ENCL, ENCR) sind die Ausgänge der Radencoder. ENCL ist verbunden mit PD2 (INT0), ENCR mit PD3 (INT1) des RP6 Microcontrollers.&lt;br /&gt;
&lt;br /&gt;
===Trennstellen===&lt;br /&gt;
An diesen Stellen können Leiterbahnen unterbrochen werden, um Funktionen zu deaktivieren oder anders zu nutzen.&lt;br /&gt;
&lt;br /&gt;
=====Getrennte Stromversorgung für ADC0/1=====&lt;br /&gt;
Wenn man für die analogen Sensoren an ADC0/1 (siehe Abschnitt &amp;quot;Anschlüsse - Analoge Sensoren an ADC0/1&amp;quot; weiter oben!) eine GETRENNTE Stromversorgung vorsehen will und/oder mit Codierbrücke (oder MOSFET) die Stromversorgung abschaltbar machen möchte, muss man erst Vorarbeit leisten.&lt;br /&gt;
[[Bild:RP6_SV.JPG|thumb|RP6 SV]]&lt;br /&gt;
&lt;br /&gt;
Man braucht dazu:&lt;br /&gt;
* 1-reihige Stiftleiste RM 2,54mm (z.B. 36-polig 732478)&lt;br /&gt;
* Evtl.: Eine Codierbrücke (z.B. aus Set 742902)&lt;br /&gt;
* Evtl.: Eine 1-polige Steckbuchse mit Litze zur ext. Stromversorgung&lt;br /&gt;
Es muss eine kurze Leiterbahn zwischen den Punkten &amp;quot;SV1&amp;quot; und &amp;quot;SV2&amp;quot; (SP2 A1: SV1, SV2; zwischen dem PROG/UART- und dem USRBUS1-Stecker) aufgetrennt werden. Die Leiterbahn befindet sich auf der Lötseite der Platine und muss mit einem scharfen Messer oder einem speziellen Leiterbahn-Unterbrecher zwischen den beiden Lötpunkten unterbrochen werden. Man sollte anschließend mit einem Widerstandsmeßgerät zwischen SV1 und SV2 nachmessen: Es sollte keine Verbindung mehr bestehen. Jetzt trennt man von der 1-reihigen Stiftleiste 2 Kontakte ab und lötet sie auf die Punkte SV1/SV2.&lt;br /&gt;
&lt;br /&gt;
Man kann hier zunächst eine Codierbrücke aufstecken. Damit versorgt der RP6 Akku die Sensoren mit 5V an den Pins VDD. Möchte man später eine getrennte 5V-Spannung anlegen, zieht man einfach die Codierbrücke ab und speist die externe 5V-Spannung (mit einer 1-poligen Steckbuchse) am Pin SV2 ein. Achtung: An Pin SV1 wird dann nichts angeschlossen!&lt;br /&gt;
&lt;br /&gt;
Anstelle der Codierbrücke kann man natürlich auch einen MOSFET anschließen, um die Sensoren per Software abschalten zu können.&lt;br /&gt;
&lt;br /&gt;
====ACS====&lt;br /&gt;
[[Bild:RP6_ACS_JP.JPG|thumb|RP6 ACS JP]]&lt;br /&gt;
Die Trennstelle ACS (SP2 E1: YIR1, YIR2; SP2 F1: YIR3) befindet sich neben C29*. Sie besteht aus 3 Lötpunkten, von denen die linken beiden (IRC1, IRC2) verbunden sind. Trennt man die Leiterbahn zwischen diesen Lötpunkten auf und verbindet stattdessen die rechten beiden Lötpunkte (IRC2, IRC3) mit etwas Lötzinn oder mit einem SMD Null Ohm Widerstand, dann ist der IR-Empfänger (TSOP, IC3) dauerhaft EINgeschaltet und kann nicht mehr über das Signal PWRON (PB4) geschaltet werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====IRC====&lt;br /&gt;
[[Bild:RP6_IRC_JP.JPG|thumb|RP6 IRC JP]]&lt;br /&gt;
Die Trennstelle IRC (SP2 C1: IRC1..2) ist eng verknüpft mit den Mess- und Kontaktpunkten des IRCOMM-Senders (siehe Abschnitt &amp;quot;Mess-/Kontaktpunkte - IRC&amp;quot; weiter oben!). Wenn man sie auftrennt, kann man den IRCOMM-Sender mit einer getrennten Stromversorgung anstelle von +UB des RP6 versehen. Dies ist sehr sinnvoll, wenn man diese Funktion häufig verwendet oder sogar noch leistungsfähigere IR-Sendedioden einbaut, denn der IRCOMM-Sender ist der zweitgrößte Stromfresser (nach dem Antrieb) auf dem RP6 (von Erweiterungsplatinen und EPs Marke Eigenbau einmal abgesehen!). Man kann hier natürlich auch eine 2-polige Stiftleiste einlöten, um die Verbindung zu +UB mit einer Codierbrücke trennbar zu machen. Eine getrennte Stromversorgung +7,2V (Bereich: +5,5 .. +10V) kann man an IRC1 einspeisen. IRC1 dieser Trennstelle ist mit dem Kontaktpunkt IRC3 (siehe Abschnitt &amp;quot;Mess-/Kontaktpunkte - IRC&amp;quot; weiter oben!) verbunden. &lt;br /&gt;
&lt;br /&gt;
====RP6 Antrieb====&lt;br /&gt;
Mit den folgenden Trennstellen kann man den RP6 Antrieb (H-Brücken und Motoren) fast komplett vom Rest des RP6 Mainboards abtrennen (es bleibt nur die 5V-Versorgung (VDD) von IC4, T1, T2 bestehen!). Damit ist es möglich, mit dem RP6 Mainboard einen ganz anderen Antrieb (also z.B. ein anderes Roboter-Chassis mit eigenen Motoren und H-Brücken) zu steuern. Umgekehrt könnte man den RP6 Antrieb auch deshalb abtrennen, um ihn durch ein anderes Prozessorsystem (z.B. auch eine M32!) anzusteuern. It's up to you!&lt;br /&gt;
&lt;br /&gt;
=====+UB Power=====&lt;br /&gt;
[[Bild:RP6_HB_Power.jpg|thumb|RP6 HB Power]]&lt;br /&gt;
Der RP6 Antrieb wird direkt aus dem Akku (über S1 und F1) mit 7,2V (+UB) versorgt. Diese Stromversorgung kann man komplett abtrennen. Die Trennstelle (SP3 E34: X) liegt unter der Sicherung F1 (siehe Abb. RP6 HB Power). Zwischen den beiden doppelten Lötflächen befinden sich auf der Lötseite (Unterseite) des Mainboards vier parallele Leiterbahnen, die aufgetrennt werden müssen. Der Pluspol einer externen Spannung zur Versorgung des RP6 Antriebs kann dann mit einer Kabelverbindung an den doppelten Lötflächen (mit einem &amp;quot;+&amp;quot; gekennzeichnet) direkt neben dem Leistungswiderstand (R27) angeschlossen werden. Eine Absicherung dieser Stromversorgung sollte man unbedingt vorsehen (2,5A träge)!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=====Stromsensoren=====&lt;br /&gt;
[[Bild:RP6_CS.JPG|thumb|RP6 CS]]&lt;br /&gt;
Um den Motorstrom der beiden Motoren des RP6 zu messen, wird ein Dual-Operationsverstärker (IC5 = 27M2C; SP3 B23/D23: IC5B/A) eingesetzt. Dieses IC wird über PWRON (PB4) mit Strom versorgt. Die Stromsensoren funktionieren also nicht, wenn PWRON Low-Pegel führt (Befehl powerOFF() der RP6 Library!). Auf dem RP6 Mainboard gibt es eine Trennstelle mit drei Lötflächen (SP3 E34: CS1, CS2, CS3). Sie befindet sich auf dem Mainboard neben C23. Möchte man IC5 nicht mehr über PWRON mit Strom versorgen, sondern über VDD (+5V), dann trennt man die Leiterbahn zwischen den linken beiden Lötpunkten (CS1, CS2) auf und verbindet die rechten beiden Lötpunkte (CS2, CS3) mit etwas Lötzinn oder einem SMD Null Ohm Widerstand. Danach sind die Stromsensoren immer eingeschaltet und können über PWRON nicht mehr geschaltet werden. Alternativ kann man an CS2 auch eine externe Versorgungsspannung (+5V) für IC5 einspeisen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=====DR/MR/ML/DL=====&lt;br /&gt;
[[Bild:RP6_DR_MR_ML_DL.JPG|thumb|RP6 DR MR ML DL]]&lt;br /&gt;
An diesen Trennstellen können die Eingänge der H-Brücke für die Geschwindigkeit (PWM) und Drehrichtung der Motoren von den Portpins des Microcontrollers abgetrennt werden.&lt;br /&gt;
Für den rechten Motor sind dies die Trennstellen MR1/2 und DR1/2 (SP3 A23: MR1/2, DR1/2), für den linken Motor ML1/2 und DL1/2 (SP3 F23: ML1/2, DL1/2).&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |Trennstelle&lt;br /&gt;
 |Portpin&lt;br /&gt;
 |Funktion H-Brücke&lt;br /&gt;
 |-&lt;br /&gt;
 |MR1/2&lt;br /&gt;
 |PD5 (OC1A)&lt;br /&gt;
 |PWM Motor rechts&lt;br /&gt;
 |-&lt;br /&gt;
 |DR1/2&lt;br /&gt;
 |PC3 (TMS)&lt;br /&gt;
 |Fahrtrichtung rechts&lt;br /&gt;
 |-&lt;br /&gt;
 |ML1/2&lt;br /&gt;
 |PD4 (OC1B)&lt;br /&gt;
 |PWM Motor links&lt;br /&gt;
 |-&lt;br /&gt;
 |DL1/2&lt;br /&gt;
 |PC2 (TCK)&lt;br /&gt;
 |Fahrtrichtung links&lt;br /&gt;
 |-&lt;br /&gt;
|}&lt;br /&gt;
Trennt man die Leiterbahn (auf der Lötseite des RP6 Mainboards) zwischen den Lötpunkten der Trennstellen auf, kann man die Eingänge der H-Brücke (Mx1, Dx1) z.B. mit einem anderen Microcontroller verbinden. Die Ausgänge (Portpins) des RP6 Microcontrollers (Mx2, Dx2) können dann anders genutzt werden. Natürlich kann man auf die Lötpunkte dieser Trennstellen auch Stiftleisten löten, um den Anschluß steckbar zu machen.&lt;br /&gt;
&lt;br /&gt;
=====MCR/MCL=====&lt;br /&gt;
[[Bild:RP6_MCR_MCL.JPG|thumb|RP6 MCR MCL]]&lt;br /&gt;
An diesen Trennstellen können die Motorstromsensoren von den ADC-Eingängen des Microcontrollers abgetrennt werden.&lt;br /&gt;
&lt;br /&gt;
Für den rechten Sensor ist dies die Trennstelle MCR1/2 (SP3 A1: MCR1, MCR2), für den linken Sensor MCL1/2 (SP3 E1: MCL1, MCL2).&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |Trennstelle&lt;br /&gt;
 |Portpin&lt;br /&gt;
 |Funktion H-Brücke&lt;br /&gt;
 |-&lt;br /&gt;
 |MCR1/2&lt;br /&gt;
 |PA5 (ADC5)&lt;br /&gt;
 |Motorstrom rechts&lt;br /&gt;
 |-&lt;br /&gt;
 |MCL1/2&lt;br /&gt;
 |PA6 (ADC6)&lt;br /&gt;
 |Motorstrom links&lt;br /&gt;
 |-&lt;br /&gt;
|}&lt;br /&gt;
Trennt man die Leiterbahn (auf der Lötseite des RP6 Mainboards) zwischen den Lötpunkten der Trennstellen auf, kann man die ADC-Eingänge (Portpins) des RP6 Microcontrollers (MCx1) anders nutzen und die Ausgänge der Motorstromsensoren (MCx2) z.B. mit ADC-Eingängen eines anderen Microcontrollers verbinden. Natürlich kann man auf die Lötpunkte dieser Trennstellen auch Stiftleisten löten, um den Anschluß steckbar zu machen.&lt;br /&gt;
&lt;br /&gt;
====PWRON-LED====&lt;br /&gt;
[[Bild:RP6_PWRON_L.JPG|thumb|RP6 PWRON L]]&lt;br /&gt;
Auf dem RP6 Mainboard gibt es eine gelbe LED, die anzeigt, ob PWRON High-Pegel hat. Mit einer Trennstelle neben dieser LED (SP2 D4: YL1, YL2) kann diese LED deaktiviert werden (z.B. um Strom zu sparen).&lt;br /&gt;
&lt;br /&gt;
Dazu trennt man die Leiterbahn zwischen den Lötpunkten auf. Soll die LED wieder aktiviert werden, verbindet man die Lötpunkte wieder mit etwas Lötzinn oder einem SMD Null Ohm Widerstand.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====+UB Sensor====&lt;br /&gt;
[[Bild:RP6_UB.JPG|thumb|RP6 UB]]&lt;br /&gt;
Die Versorgungsspannung +UB des RP6 wird mit dem +UB-Spannungssensor an PA7 (ADC7) gemessen. Will man diesen Spannungssensor mit seinem Eingangsspannungsteiler R1, R2 (SP1 D12: R1, R2) von +UB abtrennen (z.B. um ihn anders zu verwenden), gibt es eine Trennstelle UB1/2 (SP1 D2: UB1, UB2). Trennt man die Leiterbahn auf der Lötseite des RP6 Mainboards zwischen den Lötpunkten auf, kann +UB nicht mehr gemessen werden. Man kann dann den Lötpunkt UB2 mit einem anderen Messpunkt (z.B. mit +BAT) verbinden und dort die Spannung (0..10V) messen. Natürlich kann man auf die Lötpunkte dieser Trennstellen auch Stiftleisten löten, um den Anschluß steckbar zu machen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====EXT Anschluß: Andere Stromversorgung====&lt;br /&gt;
[[Bild:RP6_S1_CHRG.jpg|thumb|RP6 S1 CHRG]]&lt;br /&gt;
Wenn man für den RP6 eine andere Stromversorgung oder Ladeschaltung anschließen will, geht dies gut am EXT Anschluß (SP1 C23: Stecker EXT). Siehe auch den Abschnitt &amp;quot;Anschlüsse - EXT Anschluß&amp;quot; weiter oben! Dann muss der Schalter S1 dauerhaft AUSgeschaltet bleiben und die Verbindung zwischen S1 und CHRG des EXT Anschlusses (SP1 C3: X) unterbrochen werden. Diese Trennstelle befindet sich auf der Lötseite (Unterseite) des RP6 Mainboards etwas versteckt zwischen S1 (Pin 3) und der benachbarten Leiterbahn, die CHRG des EXT Anschlusses mit der Ladebuchse CHARGER (Pin 1 +) verbindet. Dort sind fünf kurze, parallele Leiterbahnen zu unterbrechen (siehe gelbe Markierung in der Abb. RP6 S1 CHRG!). Will man das nicht machen, darf man die Ladebuchse CHARGER auf jeden Fall nicht mehr nutzen!&lt;br /&gt;
&lt;br /&gt;
===Lochraster-Felder===&lt;br /&gt;
Auf diesen Feldern kann man eigene kleine Schaltungen aufbauen. An jedem der sechs Felder stehen VDD (+5V) und GND zur Verfügung (SP4 E12: YVDDx, YGNDx).&lt;br /&gt;
&lt;br /&gt;
Bitte beachten: Die Lochreihen oder -spalten, die mit einer eckigen Klammer &amp;quot;[&amp;quot; markiert sind, liegen auf der Lötseite (Unterseite) direkt auf dem Rahmen des Chassis! Hier können also keine Drähte von unten verlötet werden.&lt;br /&gt;
&lt;br /&gt;
====Vorn links====&lt;br /&gt;
Das kleine Lochrasterfeld vorn links kann z.B. für Beleuchtung (Blinker, Scheinwerfer links) oder auch für einen zusätzlichen Sensor genutzt werden.&lt;br /&gt;
Zur Verfügung steht eine 2-adrige Verbindung zum mittleren Lochrasterfeld links.&lt;br /&gt;
&lt;br /&gt;
In der Nähe dieses Lochrasterfeldes gibt es auch:&lt;br /&gt;
* IO3, IO4 (SP2 E3: IO3, IO4)&lt;br /&gt;
* ADC0 (SP2 B1: ADC0)&lt;br /&gt;
&lt;br /&gt;
====Mitte links====&lt;br /&gt;
[[Bild:RP6_Lochfeld_LM.JPG|thumb|RP6 Lochrasterfeld Mitte links]]&lt;br /&gt;
Das größere Lochrasterfeld Mitte links kann z.B. für eine kleinere Schaltung zur Ansteuerung der Beleuchtung/Sensoren auf den Lochrasterfeldern vorn und hinten links oder für andere Zwecke genutzt werden.&lt;br /&gt;
&lt;br /&gt;
Es stehen hier folgende Anschlüsse zur Verfügung:&lt;br /&gt;
* 2-adrige Verbindung zum Lochrasterfeld vorn links&lt;br /&gt;
* 2-adrige Verbindung zum Lochrasterfeld hinten links&lt;br /&gt;
* ST1/ST2 zum Anschluß weiterer Start/Stop Taster (SP2 D2: ST1/2)&lt;br /&gt;
* PWR (SP2 D2: YPWR1)&lt;br /&gt;
* I2C-Bus (SCL, SDA; SP4 C1: YSCL1, YSDA1)&lt;br /&gt;
* +UB (SP4 D2: YUB1)&lt;br /&gt;
In der Nähe dieses Lochrasterfeldes gibt es auch:&lt;br /&gt;
* Serielle Schnittstelle (RST, TX, RX; SP4 AB5: YRX, YTX, YMRESET, YVDD)&lt;br /&gt;
* USRBUS1 (vorn; SP4 E34: Y1'..Y14')&lt;br /&gt;
&lt;br /&gt;
=====Schaltungsvorschläge=====&lt;br /&gt;
Wie kann z.B. eine Schaltung für Beleuchtungseffekte oder Sensoren aussehen?&lt;br /&gt;
&lt;br /&gt;
Man könnte 8 zusätzliche Schaltkanäle mit dem I2C-Portexpander-IC PCF8574(A)P gewinnen. Dieses IC passt mit wenigen Zusatzteilen auf die mittlere Lochrasterfläche. Angesteuert wird es über den I2C-Bus. Mit den 8 Ausgängen lassen sich einige Beleuchtungseffekte erreichen, die dann über Software schaltbar sind.&lt;br /&gt;
&lt;br /&gt;
Alternativ kann man auch das IC PCF8591P z.B. für den Anschluß von analogen Sensoren verwenden. Auch dieser Baustein wird über I2C angesteuert. Beide ICs sind bei [http://www.reichelt.de./ Reichelt] erhältlich.&lt;br /&gt;
&lt;br /&gt;
Will man nicht den I2C-Bus benutzen, kann man als I/O-Ports IO1..IO4 oder als analoge Eingänge ADC0 und ADC1 verwenden. Auch SCL und SDA stehen als I/O-Ports zur Verfügung, wenn der I2C-Bus im ganzen System nicht verwendet werden soll.&lt;br /&gt;
&lt;br /&gt;
Wichtig für Zusatzschaltungen, die fest auf dem RP6 verlötet werden, sind zwei Aspekte:&lt;br /&gt;
* Wenn sie die Stromversorgung belasten, sollten sie (z.B. über einen Transistor oder MOSFET) abschaltbar sein. Dazu kann man auch das Signal PWR heranziehen, das auf beiden mittleren Lochrasterflächen zur Verfügung steht. Dann kann man mit dem Befehl &amp;quot;powerOFF()&amp;quot; der RP6 Library die Stromversorgung per Software abschalten.&lt;br /&gt;
* Wenn man auch anderweitig genutzte Portpins (SDA, SCL, IO1..IO4, ADC0/1) für die eigene Schaltung einsetzt, sollte man die Verbindung zu den Portpins mit einer abziehbaren Codierbrücke trennbar machen.&lt;br /&gt;
&lt;br /&gt;
====Hinten links====&lt;br /&gt;
Das kleine Lochrasterfeld hinten links kann z.B. für Beleuchtung (Blinker, Rücklicht links) oder auch für einen zusätzlichen Sensor genutzt werden.&lt;br /&gt;
Zur Verfügung steht eine 2-adrige Verbindung zum mittleren Lochrasterfeld links.&lt;br /&gt;
&lt;br /&gt;
In der Nähe dieses Lochrasterfeldes gibt es auch:&lt;br /&gt;
* EXT Anschluß (SP1 C23: Stecker EXT)&lt;br /&gt;
&lt;br /&gt;
====Vorn rechts====&lt;br /&gt;
Das kleine Lochrasterfeld vorn rechts kann z.B. für Beleuchtung (Blinker, Scheinwerfer rechts) oder auch für einen zusätzlichen Sensor genutzt werden.&lt;br /&gt;
Zur Verfügung steht eine 2-adrige Verbindung zum mittleren Lochrasterfeld rechts.&lt;br /&gt;
&lt;br /&gt;
In der Nähe dieses Lochrasterfeldes gibt es auch:&lt;br /&gt;
* IO1, IO2 (SP2 E3: IO1, IO2)&lt;br /&gt;
* ADC1 (SP2 B1: ADC1)&lt;br /&gt;
&lt;br /&gt;
====Mitte rechts====&lt;br /&gt;
Das größere Lochrasterfeld Mitte rechts kann z.B. für eine kleinere Schaltung zur Ansteuerung der Beleuchtung/Sensoren auf den Lochrasterfeldern vorn und hinten rechts oder für andere Zwecke genutzt werden.&lt;br /&gt;
&lt;br /&gt;
Es stehen hier folgende Anschlüsse zur Verfügung:&lt;br /&gt;
* 2-adrige Verbindung zum Lochrasterfeld vorn rechts&lt;br /&gt;
* 2-adrige Verbindung zum Lochrasterfeld hinten rechts&lt;br /&gt;
* PWR (SP2 D2: YPWR2)&lt;br /&gt;
* I2C-Bus (SCL, SDA; SP4 C1: YSCL2, YSDA2)&lt;br /&gt;
* +UB (SP4 D2: YUB2)&lt;br /&gt;
In der Nähe dieses Lochrasterfeldes gibt es auch:&lt;br /&gt;
* Interrupt-Anschluß (INTU, INT1..3, MRESET; SP4 D34: MRESET, INT1..3, INTU)&lt;br /&gt;
* USRBUS2 (hinten; SP4 E34: Y1..Y14)&lt;br /&gt;
&lt;br /&gt;
====Hinten rechts====&lt;br /&gt;
Das kleine Lochrasterfeld hinten rechts kann z.B. für Beleuchtung (Blinker, Rücklicht rechts) oder auch für einen zusätzlichen Sensor genutzt werden.&lt;br /&gt;
Zur Verfügung steht eine 2-adrige Verbindung zum mittleren Lochrasterfeld rechts.&lt;br /&gt;
&lt;br /&gt;
In der Nähe dieses Lochrasterfeldes gibt es auch:&lt;br /&gt;
* EXT Anschluß (SP1 C23: Stecker EXT)&lt;br /&gt;
* Akku-Anschluß (SP1 B3: BATTERY)&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Erweiterungen==&lt;br /&gt;
Auf / An den RP6 könnte man z.B. noch folgendes anbauen / erweitern:&lt;br /&gt;
&lt;br /&gt;
* Einen Greifarm&lt;br /&gt;
* Einen Ultraschallsensor&lt;br /&gt;
* Zwei Lichtsensoren hinten, um die hellste / dunkelste Stelle im Raum besser zu finden&lt;br /&gt;
* Einen digitalen Kompass&lt;br /&gt;
* uvm.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Erweiterungs-Module==&lt;br /&gt;
&lt;br /&gt;
Es sind von Arexx schon einige Erweiterungsmöglichkeiten auf dem Markt. Zum Ersten die Experimentierplatinen ([http://www.conrad.de/ce/de/product/191537/Arexx-RP6-Experimentierplatine 191537] AUSVERKAUFT!), die zum Erstellen von eigenen Schaltungen und Sensoren gedacht sind, und von denen eine schon im Lieferumfang des RP6 enthalten war, das Erweiterungsboard RP6 CONTROL M32 ([http://www.conrad.de/ce/de/product/191550/Arexx-RP6-ATMEGA32-Erweiterungssatz 191550] AUSVERKAUFT!) und die RP6 CCPRO M128 ([http://www.conrad.de/ce/de/product/191563/Arexx-RP6-CC-PRO-MEGA128-Erweiterungssatz 191563]).&lt;br /&gt;
&lt;br /&gt;
Die Boards kann man dann über den I2C Bus mit dem Mainboard kommunizieren lassen.  Es ist sehr sinnvoll, die Module symmetrisch hintereinander zu stapeln und nicht mehr als 6-8 Module zu verbauen, weil der Roboter sonst immer schwerer und langsamer wird. Basierend auf dem Master-Slave System könnte man so bis zu 127 Slaves anschließen. Zudem ist es ratsam, qualitativ hochwertige Akkus und ein Ladegerät mit passendem Stecker zu verwenden, da man ansonsten immer das Mainboard abschrauben müsste um an die Akkus heranzukommen. Für den Fall wurde extra eine Ladebuchse eingebaut.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Experimentierplatine ===&lt;br /&gt;
[[Bild:RP6_Exp.jpg|RP6 Experimentierplatine]]&lt;br /&gt;
&lt;br /&gt;
====Beschreibung====&lt;br /&gt;
Die Experimentier-Platine ist dazu gedacht, eigene Schaltungen auf dem RP6 zu realisieren, und ist seit Mai 2020 bei CONRAD ausverkauft. Sie wird über den I²C-Bus mit den anderen Erweiterungsmodulen verbunden. Ausserdem ist es sinnvoll, die (freien) I/O-Ports (ADC-Kanäle) der RP6 Base, des M32 Erweiterungsmoduls bzw. des CCPRO M128 Moduls über ein [http://www.reichelt.de/?;ACTION=3;LA=444;GROUP=C63;GROUPID=3328;ARTICLE=47637;START=0;SORT=artnr;OFFSET=16;SID=1580faBqwQAQ8AAGY-ZAM7cd511ee04a106a88a359faaac0071e2 10-Pol-Flachbandkabel] mit [http://www.reichelt.de/?ACTION=3;GROUP=C151;GROUPID=3231;ARTICLE=14571;SID=1580faBqwQAQ8AAGY-ZAM7cd511ee04a106a88a359faaac0071e2 Stecker] auf die Experimentierplatine zu führen, weil es übersichtlicher bleibt und keine Kabel lose herumhängen. Auf der Experimentierplatine kann man dann LEDs oder einen Temperatursensor an die I/O-Ports bzw. an die ADC-Kanäle anschießen.&lt;br /&gt;
&lt;br /&gt;
====Technische Daten====&lt;br /&gt;
{|  {{Blauetabelle}} &lt;br /&gt;
|'''Mikrocontroller:'''&lt;br /&gt;
|Keiner&lt;br /&gt;
|-&lt;br /&gt;
|'''Speicher:'''&lt;br /&gt;
|Keiner&amp;lt;br/&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|'''Programmierung:'''&lt;br /&gt;
|Kein Programmieradapter&lt;br /&gt;
|-&lt;br /&gt;
|'''Vorhandene Sensoren:'''&lt;br /&gt;
|Keine&amp;lt;br/&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|'''Vorhandene Aktoren:'''&lt;br /&gt;
|Keine&amp;lt;br/&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|'''Abmessungen:'''&lt;br /&gt;
|(L &amp;amp;times; B &amp;amp;times; H) 112 &amp;amp;times; 90 &amp;amp;times; 10 mm&lt;br /&gt;
|-&lt;br /&gt;
|'''Ausführung:'''&lt;br /&gt;
|Bausatz&lt;br /&gt;
|-&lt;br /&gt;
|'''Stromversorgung:'''&lt;br /&gt;
|6 AA NiMH Akkus (über die RP6 Base)&lt;br /&gt;
|-&lt;br /&gt;
|'''Hersteller:'''&lt;br /&gt;
|Arexx Niederlande&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Schaltungsideen ====&lt;br /&gt;
Auf der / den Experimentierplatinen könnte man z.B. folgendes realisieren:&lt;br /&gt;
&lt;br /&gt;
* eine Kameraschaltung (wie [http://www.rn-wissen.de/index.php/RP6_Kamera_-_Mitmach-Projekt hier] gezeigt)&lt;br /&gt;
* Scheinwerfer, Rücklichter, Blinker etc. (ABER immer mit Vorwiderstand!!!)&lt;br /&gt;
* ein LED-Lauflicht (über I/O-Expander, gibt´s beim [http://www.reichelt.de/?ACTION=3;ARTICLE=14527;PROVID=2402 Reichelt])&lt;br /&gt;
* mehr ADC-Kanäle (über ADC-Expander, einfach mal nach PCF8591 [http://www.google.de/search?q=PCF8591 googlen])&lt;br /&gt;
* eine Wetterstation mit Luftfeuchtemesser, Temperaturfühler und Lichtmesser ([http://www.roboternetz.de/phpBB2/viewtopic.php?t=52298 hier] gibt es eine Wetterstation uvm.)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== RP6 CONTROL M32 Platine ===&lt;br /&gt;
[[Bild:RP6Control_M32.jpg|RP6 CONTROL M32]]&lt;br /&gt;
&lt;br /&gt;
====Beschreibung====&lt;br /&gt;
Auf der M32 ([http://www.conrad.de/ce/de/product/191550/Arexx-RP6-ATMEGA32-Erweiterungssatz 191550]) lassen sich weitere LEDs, Sensoren oder ähnliches anschließen, außerdem steht ein weiterer ATMEGA32 zur Verfügung, welcher sich gut im Master Modus betreiben lässt. Es sind ein Mikrofonsensor, fünf Taster, vier Status-LEDs, ein Display-Port, ein Beeper, 6 freie ADC-Kanäle, 8 freie I/O-Ports, ein Programmieradapter, ein JTAG-Anschluss, eine ISP-Programmierschnittstelle sowie ein freier Steckplatz für ein EEPROM verfügbar.&lt;br /&gt;
&lt;br /&gt;
Seit Ende 2021 ist die M32 bei CONRAD ausverkauft!&lt;br /&gt;
&lt;br /&gt;
====Technische Daten====&lt;br /&gt;
{|  {{Blauetabelle}} &lt;br /&gt;
|'''Mikrocontroller:'''&lt;br /&gt;
|AVR [[ATmega32]]&lt;br /&gt;
|-&lt;br /&gt;
|'''Speicher:'''&lt;br /&gt;
|32 kB [[Flash]]-Speicher, davon 1 kB bereits vom Bootloader belegt&amp;lt;br/&amp;gt;&lt;br /&gt;
2 kB SRAM&amp;lt;br/&amp;gt; &lt;br /&gt;
1 kB [[EEPROM]]&lt;br /&gt;
|-&lt;br /&gt;
|'''Programmierung:'''&lt;br /&gt;
|Über AVR-[[Bootloader]], belegt ca. 1 kB des Flash-Speichers&lt;br /&gt;
|-&lt;br /&gt;
|'''Vorhandene Sensoren:'''&lt;br /&gt;
|1 Mikrofonsensor&amp;lt;br/&amp;gt;&lt;br /&gt;
5 Eingabetaster&amp;lt;br/&amp;gt;&lt;br /&gt;
14 I/O Ports, davon 6 ADC-Wandler&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|'''Vorhandene Aktoren:'''&lt;br /&gt;
|1 Beeper&amp;lt;br/&amp;gt;&lt;br /&gt;
4 Status-LEDs&amp;lt;br/&amp;gt;&lt;br /&gt;
1 LC-Display-Port&amp;lt;br/&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|'''Abmessungen:'''&lt;br /&gt;
|(L &amp;amp;times; B &amp;amp;times; H) 112 &amp;amp;times; 90 &amp;amp;times; 15 mm&lt;br /&gt;
|-&lt;br /&gt;
|'''Ausführung:'''&lt;br /&gt;
|Fertig aufgebautes Erweiterungsmodul&lt;br /&gt;
|-&lt;br /&gt;
|'''Stromversorgung:'''&lt;br /&gt;
|6 AA NiMH Akkus (über die RP6 Base)&lt;br /&gt;
|-&lt;br /&gt;
|'''Hersteller:'''&lt;br /&gt;
|Arexx Niederlande&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Umbau-Optionen ====&lt;br /&gt;
Dieser Absatz soll die Möglichkeiten der RP6 CONTROL M32 Platine (im Folgenden &amp;quot;M32&amp;quot; genannt) auflisten, die es gibt, um auf einfache Weise weitere Anschlüsse oder Verbindungen zu ermöglichen. Nicht beschrieben werden die Anschlußmöglichkeiten, die in Form der vorhandenen Wannenstecker sowieso gegeben sind (z.B. am LCD-, I/O- oder ADC-Stecker). Im Text gibt es Verweise auf den Schaltplan der M32 (RP6_CONTROL_M32.PDF) in der Form: (SP2 B1: Bauteil).  Dies bedeutet, dass man das Bauteil auf Blatt 2 des RP6-M32-Schaltplans im Feld B1 finden kann.&lt;br /&gt;
&lt;br /&gt;
Folgende Möglichkeiten zum Umbau/Ausbau sind vorgesehen:&lt;br /&gt;
* Zweites SPI-EEPROM (IC5)&lt;br /&gt;
* Zwei analoge Sensoren, evtl. mit getrennter Stromversorgung&lt;br /&gt;
* ISP (In System Programming)&lt;br /&gt;
* JTAG-Programmierung&lt;br /&gt;
* USRBUS&lt;br /&gt;
* IRQ-Zuweisung ändern&lt;br /&gt;
* ADC0 und ADC1 anders nutzen&lt;br /&gt;
* Schieberegister kaskadieren&lt;br /&gt;
Im folgenden Text soll beschrieben werden, wie man die weiteren Möglichkeiten nutzen kann. Es wird jeweils erwähnt, was man an Material braucht. Beispielhaft sind da Bestell-Nummern der Firma [http://www.conrad.de/ce/ CONRAD] genannt. Natürlich kann man die Teile auch bei anderen Versendern beziehen. Durch die Nennung der Bestell-Nummer ist das jeweilige Teil aber gut zu identifizieren. Man sollte Löten können und sich bewußt sein, dass ggf. ein Garantieanspruch nicht mehr besteht, wenn man an der Platine gelötet hat.&lt;br /&gt;
&lt;br /&gt;
Bei den Materialangaben ist öfter die Rede von &amp;quot;Steckbuchsen mit Litze&amp;quot;. Diese Steckbuchsen mit angelöteter Litze können auf die ein- oder zweireihigen Stiftleisten aufgesteckt werden. Leider gibt es sie nicht (mehr) fertig konfektioniert bei CONRAD. Die einreihigen Steckbuchsen (RM 2,54mm) kann man aber z.B. bei [http://www.elv.de/output/controller.aspx ELV] bekommen: 2-polig (68-016635), 3-polig (68-022503) und 5-polig (68-023073). An sie muss man dann noch Litzen in der entsprechenden Länge selbst anlöten.&lt;br /&gt;
&lt;br /&gt;
===== Zweites SPI-EEPROM =====&lt;br /&gt;
Es ist sehr einfach, ein zweites SPI-EEPROM (SP1 A1: IC5*) auf der M32 zu nutzen.&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_M32_IC5-Socket.JPG|thumb|Sockel des 2. SPI-EEPROMs]]&lt;br /&gt;
&lt;br /&gt;
Man braucht dazu:&lt;br /&gt;
* Einen IC-Sockel 8-pol DIP für IC5 ([http://www.conrad.de/ce/de/product/189600/IC-FASSUNG-PRAeZISION-8POLIG 189600])&lt;br /&gt;
* Einen Keramik-Vielschicht-Kondensator 100nF (C19); RM 2,54mm ([http://www.conrad.de/ce/de/product/453099/?insert=36&amp;amp;insertNoDeeplink&amp;amp;productname=KONDENSATOR-01-F-KDPU-254-MM 453099])&lt;br /&gt;
* Ein serielles SPI-EEPROM im PDIP8 Gehäuse (IC5)&lt;br /&gt;
Zuerst wird der IC-Sockel eingelötet (Kerbe beachten!), dann C19 (SP1 A1: C19*). Das war's.&lt;br /&gt;
&lt;br /&gt;
Leider gibt es das EEPROM nicht bei den gängigeren Versendern. Bekommen kann man es aber z.B. bei [http://de.farnell.com/jsp/home/homepage.jsp Farnell]. Dort hat das SPI-EEPROM mit 256 kbit die Bezeichnung 25LC256-I/P (1331398). Wenn man es noch größer mag: 25LC1024 (1331392) mit 1024 kbit. SPI-EEPROMs führt inzwischen auch [http://www.reichelt.de./ Reichelt].&lt;br /&gt;
&lt;br /&gt;
'''Programmierung:'''&lt;br /&gt;
&lt;br /&gt;
In die RP6ControlLib.h bitte einfügen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#define SPI_EEPROM2_PAGESIZE 64&lt;br /&gt;
&lt;br /&gt;
uint8_t SPI_EEPROM2_readByte(uint16_t memAddr);&lt;br /&gt;
void SPI_EEPROM2_writeByte(uint16_t memAddr, uint8_t data);&lt;br /&gt;
void SPI_EEPROM2_enableWrite(void);&lt;br /&gt;
void SPI_EEPROM2_disableWrite(void);&lt;br /&gt;
uint8_t SPI_EEPROM2_getStatus(void);&lt;br /&gt;
&lt;br /&gt;
void SPI_EEPROM2_writeBytes(uint16_t startAddr, uint8_t *buffer, uint8_t length);&lt;br /&gt;
void SPI_EEPROM2_readBytes(uint16_t startAddr, uint8_t *buffer, uint8_t length);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Die Konstante SPI_EEPROM2_PAGESIZE ist abhängig von der Art und Größe des EEPROMs. Für ein 256 kbit-EEPROM ist die Seitengröße (pagesize) in der Regel 64, für einen 512 kbit-Typ 128 und für einen 1024 kbit-Typ 256.&lt;br /&gt;
&lt;br /&gt;
In die RP6ControlLib.c bitte einfügen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Second external SPI EEPROM:&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Reads a single Byte from the 2nd external EEPROM.&lt;br /&gt;
 */&lt;br /&gt;
uint8_t SPI_EEPROM2_readByte(uint16_t memAddr)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t data;&lt;br /&gt;
	PORTB &amp;amp;= ~MEM_CS2;&lt;br /&gt;
	writeSPI(SPI_EEPROM_READ);&lt;br /&gt;
	writeWordSPI(memAddr);&lt;br /&gt;
	data = readSPI();&lt;br /&gt;
	PORTB |= MEM_CS2;&lt;br /&gt;
	return data;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Reads &amp;quot;length&amp;quot; Bytes into the Buffer &amp;quot;buffer&amp;quot; from startAdr on. &lt;br /&gt;
 * You can read the complete 2nd EEPROM into a buffer at once - if it is large enough. &lt;br /&gt;
 * (But you only have 2KB SRAM on a MEGA32 ;) )&lt;br /&gt;
 */&lt;br /&gt;
void SPI_EEPROM2_readBytes(uint16_t startAddr, uint8_t *buffer, uint8_t length)&lt;br /&gt;
{&lt;br /&gt;
	PORTB &amp;amp;= ~MEM_CS2;&lt;br /&gt;
	writeSPI(SPI_EEPROM_READ);&lt;br /&gt;
	writeWordSPI(startAddr);&lt;br /&gt;
	readBufferSPI(&amp;amp;buffer[0], length);&lt;br /&gt;
	PORTB |= MEM_CS2;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Enable Write Mode&lt;br /&gt;
 */&lt;br /&gt;
void SPI_EEPROM2_enableWrite(void)&lt;br /&gt;
{&lt;br /&gt;
	PORTB &amp;amp;= ~MEM_CS2;&lt;br /&gt;
	writeSPI(SPI_EEPROM_WREN);&lt;br /&gt;
	PORTB |= MEM_CS2;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Disable Write Mode&lt;br /&gt;
 */&lt;br /&gt;
void SPI_EEPROM2_disableWrite(void)&lt;br /&gt;
{&lt;br /&gt;
	PORTB &amp;amp;= ~MEM_CS2;&lt;br /&gt;
	writeSPI(SPI_EEPROM_WRDI);&lt;br /&gt;
	PORTB |= MEM_CS2;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Write a single data byte to the specified 2nd EEPROM address.&lt;br /&gt;
 */&lt;br /&gt;
void SPI_EEPROM2_writeByte(uint16_t memAddr, uint8_t data)&lt;br /&gt;
{&lt;br /&gt;
	while(SPI_EEPROM2_getStatus() &amp;amp; SPI_EEPROM_STAT_WIP);&lt;br /&gt;
	SPI_EEPROM2_enableWrite();&lt;br /&gt;
	PORTB &amp;amp;= ~MEM_CS2;&lt;br /&gt;
	writeSPI(SPI_EEPROM_WRITE);&lt;br /&gt;
	writeWordSPI(memAddr);&lt;br /&gt;
	writeSPI(data);&lt;br /&gt;
	PORTB |= MEM_CS2;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Write &amp;quot;length&amp;quot; Bytes from the Buffer to the 2nd EEPROM. &lt;br /&gt;
 * YOU CAN ONLY WRITE MAXIMAL [SPI_EEPROM2_PAGESIZE] BYTES AT ONCE!!!&lt;br /&gt;
 * This is the Pagesize!&lt;br /&gt;
 * You can NOT cross a page boundary!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void SPI_EEPROM2_writeBytes(uint16_t startAddr, uint8_t *buffer, uint8_t length)&lt;br /&gt;
{&lt;br /&gt;
	while(SPI_EEPROM2_getStatus() &amp;amp; SPI_EEPROM_STAT_WIP);&lt;br /&gt;
	SPI_EEPROM2_enableWrite();&lt;br /&gt;
	PORTB &amp;amp;= ~MEM_CS2;&lt;br /&gt;
	writeSPI(SPI_EEPROM_WRITE);&lt;br /&gt;
	writeWordSPI(startAddr);&lt;br /&gt;
	writeBufferSPI(&amp;amp;buffer[0], length);&lt;br /&gt;
	PORTB |= MEM_CS2;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Returns EEPROM Status register - for checking if 2nd EEPROM is buisy. &lt;br /&gt;
 * Writing takes about 5ms. &lt;br /&gt;
 */&lt;br /&gt;
uint8_t SPI_EEPROM2_getStatus(void)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t status;&lt;br /&gt;
	PORTB &amp;amp;= ~MEM_CS2;&lt;br /&gt;
	writeSPI(SPI_EEPROM_RDSR);&lt;br /&gt;
	status = readSPI();&lt;br /&gt;
	PORTB |= MEM_CS2;&lt;br /&gt;
	return status;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Hinweis zum 1024 kbit-EEPROM:&lt;br /&gt;
&lt;br /&gt;
Dieses EEPROM benötigt 24-Bit Adressen und muss daher etwas anders angesprochen werden als die &amp;quot;kleineren&amp;quot; Typen bis 512 kbit.&lt;br /&gt;
Die Funktion SPI_EEPROM2_readByte() sieht für ein 1024 kbit-EEPROM z.B. so aus:&lt;br /&gt;
&amp;lt;pre&amp;gt;uint8_t SPI_EEPROM2_readByte(uint32_t memAddr)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t data;&lt;br /&gt;
	PORTB &amp;amp;= ~MEM_CS2;&lt;br /&gt;
	writeSPI(SPI_EEPROM_READ);&lt;br /&gt;
	writeSPI((uint8_t)(memAddr &amp;gt;&amp;gt; 16));&lt;br /&gt;
	writeWordSPI((uint16_t)memAddr);&lt;br /&gt;
	data = readSPI();&lt;br /&gt;
	PORTB |= MEM_CS2;&lt;br /&gt;
	return data;&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
Alle weiteren Funktionen, die EEPROM-Adressen verwenden (SPI_EEPROM2_readBytes, SPI_EEPROM2_writeByte, SPI_EEPROM2_writeBytes), müssen genau so angepasst werden.&lt;br /&gt;
&lt;br /&gt;
===== Anschlüsse =====&lt;br /&gt;
Hier wird aufgelistet, wo man auf der M32 Platine Anschlüsse nutzen kann, um sie z.B. zu weiteren Sensoren, zum USRBUS oder (weniger empfehlenswert!) direkt zu EPs, zur RP6 Base oder zur CCPRO M128 zu führen. &lt;br /&gt;
&lt;br /&gt;
====== Analoge Sensoren an ADC2/3 ======&lt;br /&gt;
[[Bild:RP6_M32_ADC23.JPG|thumb|ADC2 ADC3]]&lt;br /&gt;
Wenn man bis zu zwei analoge Sensoren (z.B. IR-Distanz-Mess-Sensoren Sharp GP2Y0A02YK 185364) direkt an die M32 anschließen möchte, dann gibt es da zwei 3-polige Kontakte, beschriftet mit VDD/GND/ADCx (x = 2..3). Hier kann man 3-polige Stiftleisten auflöten, an die dann die Sensoren angeschlossen werden.&lt;br /&gt;
&lt;br /&gt;
Man braucht dazu:&lt;br /&gt;
* 1-reihige Stiftleiste RM 2,54mm (z.B. 36-polig 732478)&lt;br /&gt;
* Zwei Keramik-Vielschicht-Kondensatoren 100nF (C16, C17); RM 2,54mm (453099)&lt;br /&gt;
* Ein Elektrolyt-Kondensator stehend 470 uF / 16V (C18); RM 3,5mm (446211)&lt;br /&gt;
* Zwei 3-polige Steckbuchsen mit Litze zum Anschluß der Sensoren&lt;br /&gt;
Man trennt von der 1-reihigen Stiftleiste zweimal 3 Kontakte ab und lötet sie auf die weiß umrahmten Kontakte (VDD/GND/ADCx; SP2 C23: ADC2, YGND8, YVDD6, ADC3, YGND7, YVDD5), anschließend C16, C17 (SP2 C1: C16*, C17*) auf ihre Plätze und zum Schluß den Elko 470 uF (C18; SP2 B1: C18*). Beim Elko auf die Polung achten: Er muss genau so sitzen wie sein Nachbar C1 (Minuspol schaut zum Beeper SND).&lt;br /&gt;
&lt;br /&gt;
Die Sensoren lötet man an die Litzen der 3-poligen Steckbuchsen und steckt diese auf die neuen Kontakte.&lt;br /&gt;
&lt;br /&gt;
Da manche Sensoren einen höheren Stromverbrauch haben, kann man die Stromversorgung an den VDD-Pins der ADC2/3-Stecker abschaltbar machen oder eine separate +5V-Spannung einspeisen. Siehe dazu den Abschnitt &amp;quot;Trennstellen - Getrennte Stromversorgung für ADC2/3&amp;quot; weiter unten!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====== ISP (In System Programming) ======&lt;br /&gt;
Der ATMEGA32 der M32 wird standardmäßig über den PROG/UART Stecker programmiert. Dazu befindet sich im Prozessor ein Bootloader-Programm. Wenn man stattdessen oder zusätzlich die ISP-Programmierung mit einem dafür geeigneten ISP-Programmier-Adapter nutzen will, kann man den Adapter an den gewinkelten ISP-Stecker auf der M32 anschließen.&lt;br /&gt;
Vorher sind aber ein paar &amp;quot;Umbauarbeiten&amp;quot; erforderlich.&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_M32_ISP.JPG|thumb|ISP]]&lt;br /&gt;
&lt;br /&gt;
Man braucht dazu:&lt;br /&gt;
* 1-reihige Stiftleiste RM 2,54mm (z.B. 36-polig 732478)&lt;br /&gt;
* Einen SMD-Widerstand 10 kOhm (406376)&lt;br /&gt;
* Eine SMD-Diode LL 4148 (140902)&lt;br /&gt;
* Eine Codierbrücke (z.B. aus Set 742902)&lt;br /&gt;
&lt;br /&gt;
Der SMD-Widerstand wird auf seinen Platz (R1; SP1 A3: R1*) neben dem XBUS2-Stecker gelötet, danach die Diode LL 4148 (D2; SP1 B3: D2*). Die Kathode (Strich) der Diode zeigt in Richtung des Quarzes (X1). Zwischen R1 und C1 befinden sich drei Lötpunkte (beschriftet mit ISP/DEBUG - BOOTLOAD; SP1 A34: YRST1..3), auf die eine 3-polige Stiftleiste gelötet werden muss. Vorher muss eine kurze Leiterbahn zwischen den Lötpunkten BOOTLOAD aufgetrennt werden. Die Leiterbahn befindet sich auf der Lötseite der Platine und muss mit einem scharfen Messer oder einem speziellen Leiterbahn-Unterbrecher zwischen den beiden Lötpunkten unterbrochen werden. Man sollte anschließend mit einem Widerstandsmeßgerät nachmessen: Es sollte keine Verbindung mehr zwischen den Lötpunkten bestehen.&lt;br /&gt;
Man trennt dann von der 1-reihigen Stiftleiste 3 Kontakte ab und lötet sie auf die beschriebenen drei Lötpunkte.&lt;br /&gt;
&lt;br /&gt;
Wenn man jetzt eine Codierbrücke auf die mit &amp;quot;BOOTLOAD&amp;quot; beschrifteten Pins steckt, bleibt alles unverändert: Die Programmierung erfolgt weiter über den PROG/UART-Stecker mithilfe des Bootloaders im Prozessor. Wird die Codierbrücke in Stellung &amp;quot;ISP/DEBUG&amp;quot; umgesteckt, kann der Prozessor mit ISP programmiert werden.&lt;br /&gt;
&lt;br /&gt;
Vorsicht: Das Bootloader-Programm kann dabei zerstört werden! Es müssen zusätzlich Fusebits des ATMEGA32 verändert werden. &lt;br /&gt;
&lt;br /&gt;
Dabei kann der Prozessor im schlimmsten Fall nicht mehr ansprechbar sein. Man sollte diesen Umbau und die ISP-Programmierung nur machen, wenn man genau weiß, was man macht!&lt;br /&gt;
&lt;br /&gt;
Eine Kopie des Bootloaders und eine Kurzanleitung zum Einstellen der Fusebits gibt es hier: &lt;br /&gt;
[http://www.arexx.com/rp6/downloads/RP6_M32_BOOTLOADER.zip RP6_M32_BOOTLOADER]&lt;br /&gt;
&lt;br /&gt;
====== JTAG ======&lt;br /&gt;
[[Bild:RP6_M32_JTAG.JPG|thumb|JTAG]]&lt;br /&gt;
Die Programmierung und ein Debuggen sind auch mit der JTAG-Schnittstelle möglich. Das ist nur zu empfehlen, wenn man Erfahrungen mitbringt, oder der Prozessor der M32 durch eine ISP-Falschprogrammierung z.B. nicht mehr ansprechbar ist.&lt;br /&gt;
Um die JTAG-Schnittstelle nutzen zu können, muss der ISP-Umbau durchgeführt worden sein und die dort beschriebene Codierbrücke auf &amp;quot;ISP/DEBUG&amp;quot; gesteckt sein. Der JTAG-Programmer kann dann an die Lötpunkte &amp;quot;JTAG&amp;quot; zwischen ISP- und I/O-Stecker angeschlossen werden.&lt;br /&gt;
&lt;br /&gt;
Man braucht dazu:&lt;br /&gt;
* 2-reihige Stiftleiste RM 2,54mm (z.B. 2x36-polig 742007)&lt;br /&gt;
Man trennt von der 2-reihigen Stiftleiste 2x5 Kontakte ab und lötet sie auf die 10 JTAG-Lötpunkte (SP2 A12: YTDI, YTDO, YTMS, YTCK, YTRST, YVDD3/4, YGND3/4, YNC). Hier kann jetzt der JTAG-Programmer z.B. mit einem 10-poligen Flachkabel-Stecker angeschlossen werden. Um das JTAG-Interface des ATMEGA32 nutzen zu können, müssen Änderungen an den Fusebits vorgenommen werden.&lt;br /&gt;
&lt;br /&gt;
Vorsicht: Man sollte die JTAG-Programmierung und Fusebit-Manipulationen nur machen, wenn man genau weiß, was man macht!&lt;br /&gt;
&lt;br /&gt;
====== USRBUS ======&lt;br /&gt;
Die 14 Kontakte der beiden USRBUS-Stecker sind auf der M32 nirgendwo angeschlossen, sondern können über die Lötpunkte Y1..Y14 mit beliebigen Punkten auf der M32 verbunden werden.&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_M32_USRBUS.JPG|thumb|USRBUS]]&lt;br /&gt;
&lt;br /&gt;
Ich würde auf Y1..Y14 eine Stiftleiste löten, damit die USRBUS-Belegung geändert werden kann.&lt;br /&gt;
&lt;br /&gt;
Man braucht dazu:&lt;br /&gt;
* 2-reihige Stiftleiste RM 2,54mm (z.B. 2x36-polig 742007)&lt;br /&gt;
* Einige Steckbuchsen mit Litze&lt;br /&gt;
&lt;br /&gt;
Man trennt von der 2-reihigen Stiftleiste 2x7 Kontakte ab und lötet sie auf die Punkte Y1..Y14 (SP2 E3: Y1..Y14) neben dem Wannenstecker USRBUS2. Wird die M32 über Flachkabel mit einem USRBUS-Stecker auf einer RP6 Experimentierplatine (EP) und/oder mit dem RP6 selbst verbunden, dann hat man mit allen mit dem USRBUS verbundenen Platinen eine direkte 14-polige Verbindung,- eben den &amp;quot;User Bus&amp;quot;. Den kann man dann nutzen, wie man will. Auf der M32 kann man mit Steckbuchsen die Pins Y1..Y14 mit anderen Pins verbinden.&lt;br /&gt;
&lt;br /&gt;
Beispiel: Verbindet man den Pin &amp;quot;ADC2&amp;quot; mit Y1 des USRBUS, dann steht der Eingang ADC2 auf allen an den USRBUS angeschlossenen Platinen an Y1 zur Verfügung. Man braucht also diesen Eingang nicht über ein eigenes Kabel auf eine EP zu führen, sondern kann dazu den USRBUS nehmen. Dadurch bleibt der Gesamtaufbau auf dem RP6 übersichtlich und komplett trennbar (man braucht nur die Stecker XBUS und USRBUS abzuziehen!).&lt;br /&gt;
&lt;br /&gt;
Wichtig: Man sollte gut dokumentieren, wie man den USRBUS am RP6 (vorn und hinten getrennt!), auf EPs und der M32/M128 benutzt! Sonst kann es bei einer anderen Anordnung von EPs zu USRBUS Konflikten/Kurzschlüssen kommen.&lt;br /&gt;
&lt;br /&gt;
====== Schieberegister kaskadieren ======&lt;br /&gt;
[[Bild:RP6_M32_SPI.JPG|thumb|SPI]]&lt;br /&gt;
Auf der M32 wird ein 8-Bit Schieberegister-Baustein (IC3: 74HC4094D) dazu gebraucht, vier Status-LEDs (LED1..LED4) und ein LCD (am Stecker LCD) anzusteuern. Durch Schieberegister kann man Port-Pins gewinnen, wenn die Pins des Prozessors nicht ausreichen.&lt;br /&gt;
&lt;br /&gt;
Solche Schieberegister kann man &amp;quot;kaskadieren&amp;quot;, d.h. weitere identische Bausteine einbauen, die weitere Port-Pins zur Verfügung stellen. Wenn man zusätzliche 74HC4094 einsetzen will, wird man das am besten auf einer EP aufbauen. Die Anschlüsse für diese Schieberegister werden auf der M32 an einer 6-poligen Reihe von Lötpunkten (beschriftet mit MISO, STR, MOSI, SCK, QS, QS*; SP1 D3: YQS1/2, YMOSI, YSCK, YSTR, YMISO) links von IC3 zur Verfügung gestellt.&lt;br /&gt;
&lt;br /&gt;
Wenn man diese 6 Signalleitungen auf eine EP führen will, gibt es dafür zwei Möglichkeiten:&lt;br /&gt;
* a) Direkte 6-polige Kabelverbindung von den oben beschriebenen Lötpunkten zur EP&lt;br /&gt;
* b) Nutzung des USRBUS, um die 6 Signale zur EP zu führen&lt;br /&gt;
Wenn man im Abschnitt &amp;quot;[[RP6#USRBUS|USRBUS]]&amp;quot; den entsprechenden Umbau gemacht hat, würde ich b) empfehlen! Man könnte dafür eine 6-polige Stiftleiste auf die o.g. Lötpunkte auflöten und 1:1 z.B. mit den Pins Y4, Y6, Y8, Y10, Y12, Y14 des USRBUS verbinden. Dann kann man auf der EP weitere Schieberegister- und SPI-Bausteine (z.B. SPI-EEPROMs, [http://www.pollin.de/shop/dt/MDU5OTgxOTk-/Bausaetze_Module/Module/Funkmodul_RFM12_433_Sende_Empfangsmodul.html RFM12 Transceiver] o.ä.) aufbauen.&lt;br /&gt;
&lt;br /&gt;
Man braucht dazu:&lt;br /&gt;
* 1-reihige Stiftleiste RM 2,54mm (z.B. 36-polig 732478)&lt;br /&gt;
* Steckbuchsen mit Litze&lt;br /&gt;
Man trennt von der 1-reihigen Stiftleiste 6 Kontakte ab und lötet sie auf die beschriebenen sechs Lötpunkte auf der M32. Mit den Steckbuchsen mit Litze wird dann die Verbindung entweder direkt zur EP (Option a) oder über den USRBUS zur EP (Option b) hergestellt.&lt;br /&gt;
&lt;br /&gt;
====== VDD/GND/+UB Anschluß ======&lt;br /&gt;
[[Bild:RP6_M32_VDDGNDUB.JPG|thumb|RP6 M32 VDD GND +UB]]&lt;br /&gt;
VDD, GND und +UB (SP2 C3: YUB1, YGND1/2/5, YVDD1/2) kann man auf der M32 an diesen Lötpunkten abnehmen.&lt;br /&gt;
&lt;br /&gt;
Natürlich kann man hier auch Stiftleisten auflöten.&lt;br /&gt;
&lt;br /&gt;
Auf der anderen Platinenseite (zwischen dem USRBUS1 und ISP Stecker) befinden sich zusätzlich noch 2 weitere Lötpunkte, an denen man VDD und GND kontaktieren kann.&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;
&lt;br /&gt;
====== Serielle Schnittstelle ======&lt;br /&gt;
[[Bild:RP6_M32_RST.JPG|thumb|RP6 M32 RST]]&lt;br /&gt;
Neben dem PROG/UART Stecker befinden sich 5 Lötpunkte mit den Signalen RST, TX, RX, GND, VDD (SP2 BC3: YRX, YTX, YRST, YVDD, YGND). Hier kann z.B. eine 5-polige Stiftleiste aufgelötet werden, um einen Anschluß an die serielle Schnittstelle zu ermöglichen.&lt;br /&gt;
 &lt;br /&gt;
Von diesen 5 Lötpunkten könnte z.B. auch eine Verbindung zum USRBUS hergestellt werden, um die serielle Schnittstelle der M32 auf EPs zu führen.&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;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====== MEM_CS2 ======&lt;br /&gt;
[[Bild:RP6_M32_MEM_CS2.JPG|thumb|RP6 M32 MEM_CS2]]&lt;br /&gt;
MEM_CS2 (M32 Microcontroller Pin PB1) kann man am IC5-Sockel an Pin 1 (SP1 A1: IC5*, Pin 1) kontaktieren. Falls IC5 nicht eingesetzt werden soll, kann man hier durch Einstecken eines Kabels in Pin 1 des IC5-Sockels PB1 nutzen und z.B. zum USRBUS führen.&lt;br /&gt;
&lt;br /&gt;
===== Mess-/Kontaktpunkte =====&lt;br /&gt;
Hier geht es um Kontaktpunkte, an denen man z.B. den Logik-Pegel (High/Low) oder eine analoge Spannung messen kann. Natürlich kann man die Signale auch zur Weiterleitung auf eine EP kontaktieren, dies wird man aber normalerweise nicht brauchen.&lt;br /&gt;
&lt;br /&gt;
====== M-Signal ======&lt;br /&gt;
[[Bild:RP6_M32_M_SIGNAL.JPG|thumb|RP6 M32 M-Signal]]&lt;br /&gt;
An diesem Messpunkt (SP1 E3: YM_SIGNAL) neben D1 kann man die Ausgangsspannung des Mikrofon-Verstärkers IC4 (SP1 E3: IC4) messen oder z.B. mit einem Oszilloskop darstellen.&lt;br /&gt;
&lt;br /&gt;
===== Trennstellen =====&lt;br /&gt;
An diesen Stellen können Leiterbahnen unterbrochen werden, um Funktionen zu deaktivieren oder anders zu nutzen. &lt;br /&gt;
&lt;br /&gt;
====== Getrennte Stromversorgung für ADC2/3 ======&lt;br /&gt;
Wenn man für die analogen Sensoren an ADC2/3 (siehe Abschnitt &amp;quot;Anschlüsse - Analoge Sensoren an ADC2/3&amp;quot; weiter oben!) eine GETRENNTE Stromversorgung vorsehen will und/oder mit Codierbrücke (oder MOSFET) die Stromversorgung abschaltbar machen möchte, muss man erst Vorarbeit leisten.&lt;br /&gt;
[[Bild:RP6_M32_SV.jpg|thumb|RP6 M32 SV]]&lt;br /&gt;
&lt;br /&gt;
Man braucht dazu:&lt;br /&gt;
* 1-reihige Stiftleiste RM 2,54mm (z.B. 36-polig 732478)&lt;br /&gt;
* Evtl.: Eine Codierbrücke (z.B. aus Set 742902)&lt;br /&gt;
* Evtl.: Eine 1-polige Steckbuchse mit Litze zur ext. Stromversorgung&lt;br /&gt;
Es muss eine kurze Leiterbahn zwischen den Punkten &amp;quot;SV1&amp;quot; und &amp;quot;SV2&amp;quot; (SP2 B2: SV1, SV2) aufgetrennt werden. Die Leiterbahn befindet sich auf der Lötseite der Platine und muss mit einem scharfen Messer oder einem speziellen Leiterbahn-Unterbrecher zwischen den beiden Lötpunkten unterbrochen werden. Man sollte anschließend mit einem Widerstandsmeßgerät zwischen SV1 und SV2 nachmessen: Es sollte keine Verbindung mehr bestehen. Jetzt trennt man von der 1-reihigen Stiftleiste 2 Kontakte ab und lötet sie auf die Punkte SV1/SV2.&lt;br /&gt;
&lt;br /&gt;
Man kann hier zunächst eine Codierbrücke aufstecken. Damit versorgt der RP6 Akku die Sensoren mit 5V an den Pins VDD. Möchte man später eine getrennte 5V-Spannung anlegen, zieht man einfach die Codierbrücke ab und speist die externe 5V-Spannung (mit einer 1-poligen Steckbuchse) am Pin SV2 ein. Achtung: An Pin SV1 wird dann nichts angeschlossen!&lt;br /&gt;
&lt;br /&gt;
Anstelle der Codierbrücke kann man natürlich auch einen MOSFET anschließen, um die Sensoren per Software abschalten zu können.&lt;br /&gt;
&lt;br /&gt;
====== Interrupt-Zuordnung ändern ======&lt;br /&gt;
Am XBUS stehen vier Interrupt-Pins (genannt INT1..INT3, INTU) zur Verfügung. INT1 ist auf der RP6 Base mit PA4 verbunden, auf der M32 mit PD2 (Prozessor INT0), auf der M128 mit PE5 (Prozessor INT5) und auf der [[RP6v2#RP6v2_M256_WiFi_Platine|RP6 M256 WiFi]] mit PJ3 (Prozessor PCINT12). Diese Tabelle zeigt die Verbindung aller Interruptleitungen auf den Platinen (RP6 Base, M32, M128, M256 WiFi) über den XBUS:&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |XBUS Pin&lt;br /&gt;
 |XBUS INTx&lt;br /&gt;
 |RP6 Base Pin&lt;br /&gt;
 |RP6 Base INTx&lt;br /&gt;
 |RP6 M32 Pin&lt;br /&gt;
 |RP6 M32 INTx&lt;br /&gt;
 |RP6 M128 Pin&lt;br /&gt;
 |RP6 M128 INTx&lt;br /&gt;
 |RP6 M256 Pin&lt;br /&gt;
 |RP6 M256 INTx&lt;br /&gt;
 |-&lt;br /&gt;
 |8&lt;br /&gt;
 |INT1&lt;br /&gt;
 |PA4&lt;br /&gt;
 |kein&lt;br /&gt;
 |PD2&lt;br /&gt;
 |INT0&lt;br /&gt;
 |PE5&lt;br /&gt;
 |INT5&lt;br /&gt;
 |PJ3&lt;br /&gt;
 |PCINT12&lt;br /&gt;
 |-&lt;br /&gt;
 |11&lt;br /&gt;
 |INT2&lt;br /&gt;
 |n.c.&lt;br /&gt;
 |&lt;br /&gt;
 |PD3 *&lt;br /&gt;
 |INT1&lt;br /&gt;
 |n.c.&lt;br /&gt;
 |&lt;br /&gt;
 |PJ6&lt;br /&gt;
 |PCINT15&lt;br /&gt;
 |-&lt;br /&gt;
 |9&lt;br /&gt;
 |INT3&lt;br /&gt;
 |n.c.&lt;br /&gt;
 |&lt;br /&gt;
 |PB2 *&lt;br /&gt;
 |INT2&lt;br /&gt;
 |PE6&lt;br /&gt;
 |INT6&lt;br /&gt;
 |PJ5&lt;br /&gt;
 |PCINT14&lt;br /&gt;
 |-&lt;br /&gt;
 |7&lt;br /&gt;
 |INTU&lt;br /&gt;
 |n.c.&lt;br /&gt;
 |&lt;br /&gt;
 |n.c.    *&lt;br /&gt;
 |&lt;br /&gt;
 |n.c.&lt;br /&gt;
 |&lt;br /&gt;
 |PJ4&lt;br /&gt;
 |PCINT13&lt;br /&gt;
 |-&lt;br /&gt;
|}&lt;br /&gt;
'''Zu *:''' Standard-Belegung. Ggf. abhängig von der nachfolgend beschriebenen Interrupt-Zuordnung!&lt;br /&gt;
&lt;br /&gt;
Auf der M32 kann man die Interrupt-Zuordnung für INT2, INT3 und INTU durch drei Codierbrücken (beschriftet mit I2-INTU, INT3-I3, I2-INT2; SP2 A3: YINT2/3/U, YI2_1/2, YI3) ändern.&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_M32_INTx.JPG|thumb|INTx]]&lt;br /&gt;
&lt;br /&gt;
Man braucht dazu:&lt;br /&gt;
* 2-reihige Stiftleiste RM 2,54mm (z.B. 2x36-polig 742007)&lt;br /&gt;
* Drei Codierbrücken (z.B. aus Set 742902)&lt;br /&gt;
Vor dem Auflöten der Stiftleiste müssen zwei kurze Leiterbahnen zwischen zwei Lötpunkten aufgetrennt werden, und zwar zwischen den Lötpunkten INT3-I3 und I2-INT2. Die Leiterbahnen müssen mit einem scharfen Messer oder einem speziellen Leiterbahn-Unterbrecher zwischen den beiden Lötpunkten unterbrochen werden. Man sollte anschließend mit einem Widerstandsmeßgerät nachmessen: Es sollte keine Verbindung mehr zwischen INT3-I3 und I2-INT2 bestehen. Man trennt dann von der 2-reihigen Stiftleiste 2x3 Kontakte ab und lötet sie auf das weiß umrahmte Feld mit der o.g. Beschriftung.&lt;br /&gt;
&lt;br /&gt;
Hier kann man auf INT3-I3 und I2-INT2 je eine Codierbrücke aufstecken, wenn man die Standard-Belegung beibehalten will. Steckt man auf I2-INTU eine Codierbrücke, dann ist INTU des XBUS mit Pin PD3 (I2) der M32 verbunden.&lt;br /&gt;
&lt;br /&gt;
'''Hinweis:''' Man kann auf die 6-polige Stiftleiste auch Codierbrücken QUER zur eigentlichen (horizontalen) Richtung aufsetzen. Dadurch kann jede der 3 Interruptleitungen des XBUS (INT2, INT3, INTU) mit jedem der 2 Interrupt Pins der M32 (PD3, PB2) verbunden werden.&lt;br /&gt;
&lt;br /&gt;
Wenn man keine der Codierbrücken aufsteckt, sind die Pins PD3 (I2) und PB2 (I3) des M32-Prozessors nicht mehr mit dem XBUS verbunden und können anders verwendet werden. Auf der M32 kann man dann z.B. auch andere Verbindungen zum XBUS herstellen, indem man auf die Pins INT2, INT3 oder INTU Kabelverbindungen aufsteckt.&lt;br /&gt;
&lt;br /&gt;
====== ADC0 und ADC1 frei nutzen ======&lt;br /&gt;
Auf der M32 ist ADC0 fest mit dem Mikrofon (MIC) und ADC1 mit den Tastern T1..T5 (KEYPAD) verbunden. Wenn man diese ADC-Eingänge für andere Sensoren benötigt, kann man das Mikrofon und die Taster von den Eingängen abtrennen.&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_M32_MIC_KEY.JPG|thumb|MIC_KEYPAD]]&lt;br /&gt;
&lt;br /&gt;
Man braucht dazu:&lt;br /&gt;
* 1-reihige Stiftleiste RM 2,54mm (z.B. 36-polig 732478)&lt;br /&gt;
* Eine Codierbrücke (z.B. aus Set 742902)&lt;br /&gt;
&lt;br /&gt;
MIC/ADC0:&lt;br /&gt;
Es muss eine kurze Leiterbahn zwischen zwei Lötpunkten aufgetrennt werden, die sich zwischen R2 und C19 befinden (SP1 D4: YM1, YM2). Die Leiterbahn muss mit einem scharfen Messer oder einem speziellen Leiterbahn-Unterbrecher zwischen den beiden Lötpunkten unterbrochen werden. Man sollte anschließend mit einem Widerstandsmeßgerät nachmessen: Es sollte keine Verbindung mehr bestehen. Vorsicht: Nicht R2 beschädigen! Damit ist das Mikrofon auf der M32 ohne Funktion und ADC0 kann anders genutzt werden. ADC0 ist dann am oberen Lötpunkt zwischen R2 und C19 verfügbar, dort müßte eine Kabelverbindung angelötet werden.&lt;br /&gt;
Soll das Mikrofon später doch wieder an ADC0 angeschlossen werden, verbindet man die beiden Lötpunkte zwischen R2 und C19 einfach mit etwas Lötzinn oder mit einem SMD Null Ohm Widerstand.&lt;br /&gt;
&lt;br /&gt;
KEYPAD/ADC1:&lt;br /&gt;
Es muss eine kurze Leiterbahn zwischen zwei Lötpunkten aufgetrennt werden, die sich unterhalb von R15 befinden (SP1 D2: YKP1, YKP2). Die Leiterbahn befindet sich auf der Lötseite der Platine und muss mit einem scharfen Messer oder einem speziellen Leiterbahn-Unterbrecher zwischen den beiden Lötpunkten unterbrochen werden. Man sollte anschließend mit einem Widerstandsmeßgerät nachmessen: Es sollte keine Verbindung mehr bestehen. Jetzt trennt man von der 1-reihigen Stiftleiste 2 Kontakte ab und lötet sie auf die beiden Punkte unterhalb von R15. Hier kann man jetzt eine Codierbrücke aufstecken, wenn man die Taster weiter benutzen will. Wenn die Brücke abgezogen ist, sind die Taster ohne Funktion und ADC1 kann anders genutzt werden. ADC1 ist dann am linken Pin der 2-poligen Stiftleiste unterhalb von R15 verfügbar.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== RP6 CCPRO M128 Platine===&lt;br /&gt;
&lt;br /&gt;
[[Bild:CCPRO M128 k-1-.jpg|Das CCPRO M128]]&lt;br /&gt;
&lt;br /&gt;
====Technische Daten====&lt;br /&gt;
{|  {{Blauetabelle}} &lt;br /&gt;
|'''Mikrocontroller:'''&lt;br /&gt;
|Steckplatz für ein C-Control PRO MEGA128 Modul mit einem ([https://www.conrad.de/de/p/c-control-prozessor-unit-mega-128-pro-198219.html] ATMEGA128)&lt;br /&gt;
|-&lt;br /&gt;
|'''Speicher:'''&lt;br /&gt;
|128 kB [[Flash]]-Speicher, davon 4 kB bereits vom Bootloader belegt&amp;lt;br/&amp;gt;&lt;br /&gt;
4 kB SRAM intern&amp;lt;br/&amp;gt; &lt;br /&gt;
64 kB SRAM extern&amp;lt;br/&amp;gt;&lt;br /&gt;
4 kB [[EEPROM]]&lt;br /&gt;
|-&lt;br /&gt;
|'''Programmierung:'''&lt;br /&gt;
|Über CCPRO-IDE&lt;br /&gt;
|-&lt;br /&gt;
|'''Vorhandene Sensoren:'''&lt;br /&gt;
|1 12bit I²C Temperatursensor &amp;lt;br/&amp;gt;&lt;br /&gt;
19 I/O-Ports, davon 8 ADCs, 3 PWM (Servos) und 2 I/Os für eine weitere serielle Schnittstelle (UART)&lt;br /&gt;
|-&lt;br /&gt;
|'''Vorhandene Aktoren:'''&lt;br /&gt;
|1 Beeper&amp;lt;br/&amp;gt;&lt;br /&gt;
5 Status-LEDs&amp;lt;br/&amp;gt;&lt;br /&gt;
1 LC-Display-Port&amp;lt;br/&amp;gt;&lt;br /&gt;
1 Sockel für ein I²C-Bus EEPROM vom Typ 24(L)Cxxx&lt;br /&gt;
|-&lt;br /&gt;
|'''Abmessungen:'''&lt;br /&gt;
|(L &amp;amp;times; B &amp;amp;times; H) 112 &amp;amp;times; 90 &amp;amp;times; 21 mm&lt;br /&gt;
|-&lt;br /&gt;
|'''Ausführung:'''&lt;br /&gt;
|Fertig aufgebautes Erweiterungsmodul&lt;br /&gt;
|-&lt;br /&gt;
|'''Stromversorgung:'''&lt;br /&gt;
|6 AA NiMH Akkus (über die RP6 Base)&lt;br /&gt;
|-&lt;br /&gt;
|'''Hersteller:'''&lt;br /&gt;
|Arexx Niederlande&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Umbauoptionen====&lt;br /&gt;
Auf der CCPRO M128 ([http://www.conrad.de/ce/de/product/191563/Arexx-RP6-CC-PRO-MEGA128-Erweiterungssatz 191563]) kann leider nicht so viel umgebaut werden:&lt;br /&gt;
&lt;br /&gt;
* I2C-EEPROM&lt;br /&gt;
* Freie Nutzung von PORTA* und PORTC*&lt;br /&gt;
* USRBUS&lt;br /&gt;
* A16-/PD4-Nutzung&lt;br /&gt;
&lt;br /&gt;
Im Text gibt es Verweise auf den Schaltplan der CCPRO M128 (RP6_CCPRO_M128_Schematic.PDF) in der Form: (SP2 B1: Bauteil).  Dies bedeutet, dass man das Bauteil auf Blatt 2 des M128-Schaltplans im Feld B1 finden kann.&lt;br /&gt;
&lt;br /&gt;
Bei den Materialangaben ist öfter die Rede von &amp;quot;Steckbuchsen mit Litze&amp;quot;. Diese Steckbuchsen mit angelöteter Litze können auf die ein- oder zweireihigen Stiftleisten aufgesteckt werden. Leider gibt es sie nicht (mehr) fertig konfektioniert bei CONRAD. Die einreihigen Steckbuchsen (RM 2,54mm) kann man aber z.B. bei [http://www.elv.de/output/controller.aspx ELV] bekommen: 2-polig (68-016635), 3-polig (68-022503) und 5-polig (68-023073). An sie muss man dann noch Litzen in der entsprechenden Länge selbst anlöten.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=====I2C-EEPROM=====&lt;br /&gt;
Zum Einsetzen eines I2C-EEPROMS (IC6; SP2 C1: IC6) braucht man nichts umzubauen. Man kauft einfach ein passendes EEPROM des Typs 24(L)Cxxxx-P und setzt es auf seinen Sockel, Kerbe zum oberen Platinenrand.&lt;br /&gt;
&lt;br /&gt;
Mögliche Typen (erhältlich z.B. bei [http://www.digikey.de/ Digi-Key] oder bei [http://www.reichelt.de./ Reichelt]):&lt;br /&gt;
* AT24C128  (AT24C128-10PU-2.7-ND)&lt;br /&gt;
* AT24C256  (AT24C256-10PU-2.7-ND)&lt;br /&gt;
* AT24C512  (AT24C512-10PU-2.7-ND)&lt;br /&gt;
* AT24C1024 (AT24C1024-10PI-2.7-ND)&lt;br /&gt;
&lt;br /&gt;
=====Anschlüsse=====&lt;br /&gt;
Hier wird aufgelistet, wo man auf der M128 Platine Anschlüsse nutzen kann, um sie z.B. zu weiteren Sensoren, zum USRBUS oder (weniger empfehlenswert!) direkt zu EPs, zur RP6 Base oder zur M32 zu führen. &lt;br /&gt;
&lt;br /&gt;
======Freie Nutzung von PORTA* und PORTC*======&lt;br /&gt;
Um PORTA* und PORTC* frei nutzen zu können (für weitere I/O-Ports), muss man auf das externe SRAM verzichten, was nicht sehr ratsam ist. Mehr I/O-Ports kann man alternativ durch I/O Expander gewinnen. Falls man das SRAM trotzdem deaktivieren will, hier die Anleitung.&lt;br /&gt;
&lt;br /&gt;
Für den Umbau braucht man:&lt;br /&gt;
* Wannenstecker 2x5-polig gerade RM 2,54mm (z.B. [http://www.reichelt.de./ Reichelt] WSL 10G)&lt;br /&gt;
* 1-reihige Stiftleiste RM 2,54mm (z.B. 36-polig 732478)&lt;br /&gt;
* Eine Codierbrücke (z.B. aus Set 742902)&lt;br /&gt;
[[Bild:RP6_M128_PortA.JPG|thumb|PORTA*]]&lt;br /&gt;
&lt;br /&gt;
Für die Bestückung von PORTA* (SP2 AB2: Stecker PORTA*) lötet man den Wannenstecker hier (siehe Abb. PORTA*) auf.&lt;br /&gt;
[[Bild:RP6_M128_PortC.JPG|thumb|PORTC*]]&lt;br /&gt;
&lt;br /&gt;
Für die Bestückung von PORTC* (SP1 A2: PC0..7, YGND1) trennt man von der 1-reihigen Stiftleiste 9 Kontakte ab und lötet sie auf die PORTC*-Lötpunkte (siehe Abb. PORTC*).&lt;br /&gt;
&lt;br /&gt;
Dann muss noch der SRAM-Enable Jumper (SP1 EF1: Y27..29) bestückt werden:&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_M128_EN_SRAM.JPG|EN_SRAM]]&lt;br /&gt;
&lt;br /&gt;
Man trennt von der 1-reihigen Stiftleiste 3 Kontakte ab und lötet sie auf die abgebildeten Lötpunkte. Vorher muss eine Leiterbahn auf der Lötseite der Platine zwischen den ENABLE-Lötpunkten aufgetrennt werden.&lt;br /&gt;
Wenn das SRAM wie bisher genutzt werden soll, steckt man die Codierbrücke auf die Stellung &amp;quot;ENABLE&amp;quot;. Will man stattdessen Port A und Port C frei nutzen (und damit auf SRAM verzichten!), kommt die Codierbrücke auf &amp;quot;DISABLE&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
======USRBUS======&lt;br /&gt;
Auf die 14 Kontakte neben dem Wannenstecker USRBUS2 ist noch nichts gelötet.&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_M128_USRBUS.JPG|thumb|USRBUS]]&lt;br /&gt;
&lt;br /&gt;
Ich würde auf Y1..Y14 eine Stiftleiste löten, damit die USRBUS-Belegung geändert werden kann.&lt;br /&gt;
&lt;br /&gt;
Man braucht dazu:&lt;br /&gt;
* 2-reihige Stiftleiste RM 2,54mm (z.B. 2x36-polig 742007)&lt;br /&gt;
* Einige Steckbuchsen mit Litze&lt;br /&gt;
&lt;br /&gt;
Man trennt von der 2-reihigen Stiftleiste 2x7 Kontakte ab und lötet sie auf die Punkte Y1..Y14 (SP2 E234: Y1..Y14) neben dem Wannenstecker USRBUS2. Wird die M128 über Flachkabel mit einem USRBUS-Stecker auf einer RP6 Experimentierplatine (EP) und/oder mit dem RP6 selbst verbunden, dann hat man mit allen mit dem USRBUS verbundenen Platinen eine direkte 14-polige Verbindung,- eben den &amp;quot;User Bus&amp;quot;. Den kann man dann nutzen, wie man will. Auf der M128 kann man mit Steckbuchsen die Pins Y1..Y14 mit anderen Pins verbinden.&lt;br /&gt;
&lt;br /&gt;
Beispiel: Verbindet man den Pin &amp;quot;ADC4&amp;quot; mit Y1 des USRBUS, dann steht der Eingang ADC4 auf allen an den USRBUS angeschlossenen Platinen an Y1 zur Verfügung. Man braucht also diesen Eingang nicht über ein eigenes Kabel auf eine EP zu führen, sondern kann dazu den USRBUS nehmen. Dadurch bleibt der Gesamtaufbau auf dem RP6 übersichtlich und komplett trennbar (man braucht nur die Stecker XBUS und USRBUS abzuziehen!).&lt;br /&gt;
&lt;br /&gt;
Wichtig: Man sollte gut dokumentieren, wie man den USRBUS am RP6 (vorn und hinten getrennt!), auf EPs und der M128 benutzt! Sonst kann es bei einer anderen Anordnung von EPs zu USRBUS Konflikten/Kurzschlüssen kommen.&lt;br /&gt;
&lt;br /&gt;
======IC5 ALERT======&lt;br /&gt;
[[Bild:RP6_M128_IC5_ALERT.JPG|thumb|IC5 ALERT]]&lt;br /&gt;
Dieser Lötpunkt (SP2 C2: AL) neben IC5 ist der Anschluß ALERT (Pin 3) des I2C-Temperatursensors TCN75A (SP2 C2: IC5).&lt;br /&gt;
&lt;br /&gt;
Dies ist ein Open-Drain Ausgang, der ein Alarm-Signal ausgibt, wenn die Temperatur die eingestellten Grenzen über-/unterschreitet (siehe auch Datenblatt des Sensors (TCN75A.pdf), Abschnitt 5.3.4!). Wenn man ALERT auf einen Eingang des Microcontrollers führen will, muß man auch noch einen Pullup-Widerstand vorsehen oder den internen Pullup des uC-Eingangs aktivieren.&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;
======VDD/GND Anschluß======&lt;br /&gt;
[[Bild:RP6_M128_VDDGND.JPG|thumb|VDD GND]]&lt;br /&gt;
Auf der CCPRO M128 gibt es 2 Lötpunkte (SP1 E34: YVDD3, YGND4) zwischen R5 und C7 bzw. direkt neben der Codierbrücke (SP1 E3: YL9, YL10) zum Deaktivieren von LED5.&lt;br /&gt;
&lt;br /&gt;
Hier könnte man VDD und GND kontaktieren. VDD ist der Lötpunkt, der näher an R5 liegt.&lt;br /&gt;
&lt;br /&gt;
=====Trennstellen=====&lt;br /&gt;
An diesen Stellen können Leiterbahnen unterbrochen werden, um Funktionen zu deaktivieren oder anders zu nutzen. &lt;br /&gt;
&lt;br /&gt;
======A16-/PD4-Nutzung======&lt;br /&gt;
&lt;br /&gt;
[[Bild:v2RP6_M128_A16.JPG|thumb|A16/PD4]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Auf der CCPRO M128 gibt es ein 3-poliges Feld von Lötpunkten (SP2 AB1: PD4, A16, GND) unter dem CCPRO MEGA128 Modul (IC1). Standardmässig ist A16 des SRAM (IC3) hier auf GND gelegt. Damit kann man PD4 des Prozessors (ICP1) frei nutzen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Will man A16 des SRAM mit PD4 schaltbar machen, muss man eine Leiterbahn auf der Bestückungsseite zwischen den oberen zwei der drei Lötpunkte auftrennen und die anderen (unteren) beiden Lötpunkte mit etwas Lötzinn oder einem SMD Null Ohm Widerstand verbinden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der Sinn dieses Umbaus besteht darin, dass man danach anstelle von 64kB nun die vollen 128kB SRAM des IC3 adressieren kann. Man muss dann aber PD4 selbst schalten, da C-Control PRO ab Version 1.50 nur 64kB ext. SRAM ansteuern kann. Immerhin könnte man dann 2 Blöcke à je 64kB nutzen und mit PD4 zwischen beiden Blöcken umschalten.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ob CCPRO damit klar kommt: Wohl kaum! Ich würde daher diesen Umbau nicht durchführen.&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Zubehör und Ersatzteile ==&lt;br /&gt;
Von [http://www.conrad.de/ce/ CONRAD] gibt es z.B. &lt;br /&gt;
&lt;br /&gt;
* das LC- ([http://www.conrad.de/ce/de/product/190911/LC-DISPLAY-16-X-2-KONFEKTIONIERT 190911] AUSVERKAUFT!) oder Backlight-Display ([http://www.conrad.de/ce/de/product/191621/DISPLAY-RP5RP6-BLAU-MIT-BACKLIGHT 191621] AUSVERKAUFT!), welche an die M32, an die CCPRO M128 und an die M256 WiFi angeschlossen werden können,&lt;br /&gt;
* einen IR-Ball ([http://www.conrad.de/ce/de/product/191437/INFRAROT-BALL-FUeR-ROBOTER-FUssBALL 191437] AUSVERKAUFT!),&lt;br /&gt;
* einen Graustufen-Boden-Sensor ([http://www.conrad.de/ce/de/product/191599/GRAUSTUFEN-BODEN-SENSOR-FUeR-FUssBALLROBOT 191599] AUSVERKAUFT!),&lt;br /&gt;
* eine IR-Fernbedienung Promo 8 ([http://www.conrad.de/ce/de/product/340720/PROMO-8-UNIVERSALFERNBEDIENUNG 340720] AUSVERKAUFT!) oder Vivanco UR 89 ([http://www.conrad.de/ce/de/product/351013/VivancoUR-89-Fernbedienung-8-Geraete 351013] AUSVERKAUFT!),&lt;br /&gt;
* Ersatzräder ([http://www.conrad.de/ce/de/product/191307/ANTRIEBSRAD-RP5RP6 191307] AUSVERKAUFT!),&lt;br /&gt;
* Ersatzzahnräder ([http://www.conrad.de/ce/de/product/191346/SCHRAeG-ZAHNRAeDERSATZ-RP5RP6 191346]) und&lt;br /&gt;
* Ersatzraupen ([http://www.conrad.de/ce/de/product/191333/RAUPENSATZ-RP5RP6 191333] AUSVERKAUFT!).&lt;br /&gt;
&lt;br /&gt;
===Displays===&lt;br /&gt;
Die vorkonfektionierten Displays kann man zum Ausgeben von Texten, Sensordaten und kleinen Animationen benutzen. Sie können an die M32, an die CCPRO M128 und an die M256 WiFi angeschlossen werden.&lt;br /&gt;
&lt;br /&gt;
Diese 16x2 Zeichen Displays sind bisher lieferbar:&lt;br /&gt;
&lt;br /&gt;
* LC-Display ([http://www.conrad.de/ce/de/product/190911/LC-DISPLAY-16-X-2-KONFEKTIONIERT 190911])&lt;br /&gt;
* OLED-Display (197622)&lt;br /&gt;
* Backlight-Display AREXX RP-DSP88 ([http://www.conrad.de/ce/de/product/191621/DISPLAY-RP5RP6-BLAU-MIT-BACKLIGHT 191621])&lt;br /&gt;
&lt;br /&gt;
Das LCD ist seit September 2018 bei CONRAD ausverkauft; zeitweise (2007/08) gab es unter dieser Bestellnummer eine Version, die zu klein (66 x 37mm) war, um sie auf der M32, der CCPRO M128 oder der M256 WiFi zu montieren.&lt;br /&gt;
&lt;br /&gt;
Das OLED-Display ist aktuell (April 2012) nicht mehr lieferbar.&lt;br /&gt;
&lt;br /&gt;
Das zuletzt ausschließlich nur noch erhältliche blaufarbige Backlight-Display ist seit Mai 2020 bei CONRAD ausverkauft.&lt;br /&gt;
&lt;br /&gt;
Diese Displays können mit 4 M3-Abstandbolzen 25 mm ([http://www.conrad.de/ce/de/product/526665/Abstandsbolzen1-x-Aussengewinde1-x-InnengewindeMessing-vernickelt-Schluesselweite-55-mm Bestell-Nr. 526665]) und 4 Muttern M3 ([http://www.conrad.de/ce/de/product/815624/TOOLCRAFT-Sechskant-Muttern-DIN-934-934-Stahl-verzinkt-M3-100-St z.B. aus 815624]), sowie 4 Schrauben M3 ([http://www.conrad.de/ce/de/product/815322/TOOLCRAFT-Linsenkopfschrauben-mit-Kreuzschlitz-DIN-7985-7985-6-mm-Stahl-verzinkt-Guete-48-M3-100-St z.B. aus 815322]) auf der M32, der CCPRO M128 oder der M256 WiFi befestigt werden. Leider sind die Befestigungslöcher der Displays zu klein für ein M3-Gewinde, so dass man die Löcher sehr vorsichtig auf 3..3,2 mm erweitern muss.&lt;br /&gt;
&lt;br /&gt;
===IR-Ball===&lt;br /&gt;
Den IR-Ball (AREXX IRB-35, AUSVERKAUFT!) kann man benutzen, um mit dem RP6 Fußball oder Ähnliches zu spielen. Der Ball kann dann von den IR-Sensoren des RP6 erkannt und geortet werden.&lt;br /&gt;
&lt;br /&gt;
===Graustufen-Boden-Sensor===&lt;br /&gt;
Der Graustufen-Boden-Sensor (AREXX ARX-GS7) dient zur Orientierung eines Roboters auf einem Fußballfeld, das in bestimmten Grauabstufungen eingefärbt ist (CONRAD 191404  AUSVERKAUFT!). Dieser Fußballfeld-Aufkleber (AREXX ARX-FF008) ist bei CONRAD und bei [http://www.elv.de ELV] (Artikel-Nummer 68-101831) ausverkauft.&lt;br /&gt;
&lt;br /&gt;
===IR-Fernbedienung===&lt;br /&gt;
[[Bild:RP6_RC.jpg|thumb|2 RC5 Fernbedienungen]]&lt;br /&gt;
Mit einer Universal-IR-Fernbedienung, die den RC5-IR-Code senden kann, kann der RP6 wie ein ferngesteuertes &amp;quot;Auto&amp;quot; verwendet werden. Im Beispielprogramm &amp;quot;Example_08_TV_REMOTE&amp;quot; im Ordner der RP6-Base-Demos wird das noch genauer erläutert.&lt;br /&gt;
&lt;br /&gt;
===Ersatzräder===&lt;br /&gt;
Die Ersatzräder dienen als Ersatzteile für den RP6, RP6v2 und das RP5/RP6-Fahrgestell.&lt;br /&gt;
&lt;br /&gt;
===Ersatzzahnräder===&lt;br /&gt;
Die Ersatzzahnräder dienen als Ersatzteile für den RP6, RP6v2 und das RP5/RP6-Fahrgestell.&lt;br /&gt;
&lt;br /&gt;
===Ersatzraupen===&lt;br /&gt;
Die Ersatzraupen dienen als Ersatzteile für den RP6, RP6v2 und das RP5/RP6-Fahrgestell.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Programmierung==&lt;br /&gt;
Um diesen Grundlagenartikel zum RP6 nicht immer länger werden zu lassen, habe ich den Teil zur Programmierung des [[RP6_-_Programmierung#RP6_Base_und_CONTROL_M32|RP6]] und seiner Erweiterungsplatinen [[RP6_-_Programmierung#RP6_Base_und_CONTROL_M32|RP6 CONTROL M32]] und [[RP6_-_Programmierung#RP6_CCPRO_M128|RP6 CCPRO M128]] ausgelagert: [[RP6 - Programmierung]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==RP6v2==&lt;br /&gt;
Der neue [http://www.conrad.de/ce/de/product/191584/RP6-V2-ROBOTERSYSTEM RP6v2] ist weitgehend identisch mit dem RP6, so dass fast alle Angaben dieses Artikels auch für den RP6v2 zutreffen.&lt;br /&gt;
Für vom RP6 abweichende Details des RP6v2 und für dessen zukünftige Erweiterungsplatinen (z.B. das aktuell [http://www.arexx.com/forum/viewtopic.php?f=19&amp;amp;t=1797 hier] angekündigte Erweiterung-Modul [[RP6v2#RP6v2_M256_WiFi_Platine|RP6v2 M256 WiFi]]) gibt es einen eigenen Grundlagenartikel: [[RP6v2]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==RP6 Sensor Board und Xtra Module==&lt;br /&gt;
Einen eigenen Artikel gibt es auch für das [[RP6_Sensor_Board_und_Xtra_Module#RP6_Sensor_Board_2|RP6 Sensor Board]] und für die [[RP6_Sensor_Board_und_Xtra_Module#RP6_Xtra_Module_2|Xtra Module]]: [[RP6_Sensor_Board_und_Xtra_Module|RP6 Sensor Board und Xtra Module]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Erfahrungsberichte==&lt;br /&gt;
&lt;br /&gt;
...in Arbeit...(kann aber gerne ergänzt werden)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Siehe auch==&lt;br /&gt;
* [[RP6 - Programmierung]]&lt;br /&gt;
* [[RP6v2]]&lt;br /&gt;
* [[RP6_Sensor_Board_und_Xtra_Module]]&lt;br /&gt;
* [[RP6_Kamera_-_Mitmach-Projekt]]&lt;br /&gt;
* [[RP6v2_I2C-Portexpander]]&lt;br /&gt;
* [[RP6v2 USB-RS232-Adapter]]&lt;br /&gt;
* [[RP6v2 Orientierung]]&lt;br /&gt;
* [[RP6 Multi IO Projekt]]&lt;br /&gt;
* [[RP6 Multi IO Projekt - Software]]&lt;br /&gt;
* [[RP6 ArduIO]]&lt;br /&gt;
* [[RP6 ArduIO - Software]]&lt;br /&gt;
* [[Induktive_Ladestation_f%C3%BCr_den_RP6|Induktive Ladestation für den RP6]]&lt;br /&gt;
* [[IR-bake_f%C3%BCr_den_RP6|IR-bake für den RP6]]&lt;br /&gt;
* [[CCRP5]]&lt;br /&gt;
* [[Wild Thumper]]&lt;br /&gt;
* [[Wild Thumper - Programmierung]]&lt;br /&gt;
* [[Yeti]]&lt;br /&gt;
* [[Asuro]]&lt;br /&gt;
* [[C't-Bot]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Weblinks==&lt;br /&gt;
'''Siehe auch die Weblinks im [http://www.rn-wissen.de/index.php/RP6v2#Weblinks RP6v2 Artikel]!'''&lt;br /&gt;
&lt;br /&gt;
* [http://www.pcwelt.de/start/gaming_fun/gadgets/news/84558/ PC-Welt-Artikel]&lt;br /&gt;
&lt;br /&gt;
* Ankündigung des RP6 und der RP6 CONTROL M32 im [http://www.arexx.com/forum/viewtopic.php?t=370 AREXX Support Forum]&lt;br /&gt;
* Ankündigung der RP6 CCPRO M128 im [http://www.arexx.com/forum/viewtopic.php?f=19&amp;amp;t=834&amp;amp;start=0 AREXX Support Forum] und im [http://www.roboternetz.de/community/threads/42228-RP6-C-Control-PRO-MEGA128-Erweiterungsmodul-Website-online RoboterNETZ]&lt;br /&gt;
* Ankündigung des RP6v2 im [http://www.roboternetz.de/community/threads/56964-NEWS-RP6v2-die-neue-Version-2-des-RP6-Robot-Systems RoboterNETZ] und im [http://www.arexx.com/forum/viewtopic.php?f=19&amp;amp;t=1778 AREXX Support Forum]&lt;br /&gt;
* Ankündigung der RP6v2 M256 WiFi im [http://www.arexx.com/forum/viewtopic.php?f=19&amp;amp;t=1797 AREXX Support Forum]&lt;br /&gt;
* [http://www.arexx.com/rp6 AREXX RP6 Startseite]&lt;br /&gt;
* [http://www.arexx.com/forum/viewforum.php?f=19 AREXX Support Forum]&lt;br /&gt;
* [http://www.arexx.com/rp6/html/de/soft_doc_ccpro.htm AREXX CCPRO M128 Seite]&lt;br /&gt;
&lt;br /&gt;
* [http://www.conrad.de/ce/de/product/191524/RP6-ROBOTERSYSTEM RP6 bei CONRAD]&lt;br /&gt;
* [http://www.conrad.de/ce/de/product/191584/RP6-V2-ROBOTERSYSTEM RP6v2 bei CONRAD]&lt;br /&gt;
* [http://www.conrad.de/ce/de/product/191550/RP6-MEGA32-ERWEITERUNGSSATZ RP6 CONTROL M32 bei CONRAD]&lt;br /&gt;
* [http://www.conrad.de/ce/de/product/191563/RP6-CC-PRO-MEGA128-ERWEITERUNGSSATZ RP6 CCPRO M128 bei CONRAD]&lt;br /&gt;
* [http://www.c-control.de/c-control-pro/c-control-pro/startseite_c-control-pro.html C-Control PRO Startseite]&lt;br /&gt;
* [http://ccpro.cc2net.de/forum/ C-Control PRO Forum]&lt;br /&gt;
&lt;br /&gt;
* [http://www.roboternetz.de/phpBB2/viewforum.php?f=49 Roboternetz RP6 Forum]&lt;br /&gt;
* &amp;quot;Geburt&amp;quot; des Wiki im RN-Forum: [http://www.roboternetz.de/community/threads/32793-RP6-Wiki-Artikel RP6-Wiki-Artikel]&lt;br /&gt;
* Henkessoft: [http://www.henkessoft.de/Roboter/rp6.htm RP6]&lt;br /&gt;
* PIC-PROJEKTE Wiki: [http://pic-projekte.de/wiki/index.php?title=RP6  RP6]&lt;br /&gt;
* benhup.com: [http://www.benhup.com/?mf=eduntech&amp;amp;sf=rp6 Arexx RP6 Robot (with ATmega32 chip)]&lt;br /&gt;
* RP6 &amp;quot;Panzer&amp;quot;: [http://www.roboternetz.de/community/threads/57171-mein-(Heng-Long)-RP6 Heng-Long-RP6]&lt;br /&gt;
&lt;br /&gt;
* [http://www.youtube.com/results?search_query=rp6 RP6 Videos]&lt;br /&gt;
* [http://de-de.facebook.com/pages/Robby-RP6/155118711202285 facebook]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Robotikeinstieg]]	 &lt;br /&gt;
[[Kategorie:Praxis]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Autoren==&lt;br /&gt;
--[http://www.roboternetz.de/community/members/24729-sloti sloti] 22:23, 29. Dez 2007 (CET)&lt;br /&gt;
&lt;br /&gt;
--[http://www.roboternetz.de/community/members/44891-Tobias1 Tobias1] 18:30, 6. Apr 2010 (CET)&lt;br /&gt;
&lt;br /&gt;
--[http://www.roboternetz.de/community/members/1972-Dirk Dirk] 12:51, 23. Okt 2020 (CET)&lt;/div&gt;</summary>
		<author><name>Dirk NO2</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=RP6&amp;diff=28570</id>
		<title>RP6</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=RP6&amp;diff=28570"/>
				<updated>2022-03-31T08:44:16Z</updated>
		
		<summary type="html">&lt;p&gt;Dirk NO2: /* Erweiterungs-Module */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Bild:RP6_2.jpg|RP6 Base Roboter|right|500px]]&lt;br /&gt;
==Was bisher geschah==&lt;br /&gt;
Fre, 08. Jun 2007 - Ankündigung des RP6 und der RP6 CONTROL M32&amp;lt;br/&amp;gt;&lt;br /&gt;
Mon, 02. Jul 2007 23:00 - Benachrichtigung der Tester&amp;lt;br/&amp;gt;&lt;br /&gt;
Die, 03. Jul 2007 15:00 - Bereitstellung der Dokumentation&amp;lt;br/&amp;gt;&lt;br /&gt;
Don, 05. Jul 2007 14:30 - Bereitstellung der Schaltungsunterlagen&amp;lt;br/&amp;gt;&lt;br /&gt;
Son, 08. Jul 2007 16:00 - Nachricht über den Versand der RP6&amp;lt;br/&amp;gt;&lt;br /&gt;
Mon, 09. Jul 2007 00:15 - Bereitstellung der Library und der Beispielprogramme&amp;lt;br/&amp;gt;&lt;br /&gt;
Die, 10. Jul 2007 - Eintreffen der RP6 bei den Testern&amp;lt;br/&amp;gt;&lt;br /&gt;
Mon, 16. Jul 2007 - Auslieferungsbeginn des RP6&amp;lt;br/&amp;gt;&lt;br /&gt;
Fre, 24. Apr 2009 - Ankündigung der RP6 CCPRO M128 (Auslieferung schon ab Mitte April 2009)&amp;lt;br/&amp;gt;&lt;br /&gt;
Mon, 27. Feb 2012 - Ankündigung des RP6v2&amp;lt;br/&amp;gt;&lt;br /&gt;
Don, 08. Mär 2012 - Auslieferungsbeginn des RP6v2&amp;lt;br/&amp;gt;&lt;br /&gt;
Sam, 17. Mär 2012 - Ankündigung der RP6v2 M256 WiFi&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Siehe auch &amp;quot;Was bisher geschah&amp;quot; im [http://www.rn-wissen.de/index.php/RP6v2#Was_bisher_geschah RP6v2 Artikel]!'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Allgemein==  &lt;br /&gt;
[[Bild:DSC03448.JPG|thumb|RP6 mit Erweiterungsboard]] [[Bild:RP6_Lieferumfang.jpg|thumb|RP6 im Lieferumfang]]&lt;br /&gt;
Der von Arexx entwickelte RP6 ([http://www.conrad.de/ce/de/product/191524/C-Control-Robot-System-RP6-Robotersystem 191524]) ist ein autonomes Raupenfahrzeug, das nicht nur für Schüler und Studenten zum Einstieg in das Gebiet Robotik sondern auch für Fortgeschrittene Elektroniker und Bastler sehr gut geeignet ist, da das System für selbstentworfene Erweiterungen ausgelegt ist. Der RP6 wird von einem, unter Roboterentwicklern beliebten, AVR Microcontroller von Atmel gesteuert und hat Lichtsensoren in Form von zwei LDRs, 2 Bumper an der Stoßstange, 6 Status LEDs, Sensoren zur Überwachung der Akkuspannung, Drehgeber mit 625 CPR, ein Infrarot Sensor zur Hinderniserkennung und Kommunikation und Motorstromsensoren zur Verfügung. Zudem liegt dem Roboter eine umfangreiche Anleitung, inklusive einem kleinen C-Crashkurs, ein USB-Interface zum Anschluss an den PC und ein USB Kabel bei.&lt;br /&gt;
&lt;br /&gt;
In diesem Artikel geht es um die Grundlagen des RP6. Zur Programmierung des RP6 gibt es eine eigene Seite: [[RP6 - Programmierung]]&lt;br /&gt;
&lt;br /&gt;
==Technische Daten==&lt;br /&gt;
{|  {{Blauetabelle}} &lt;br /&gt;
|'''Mikrocontroller:'''&lt;br /&gt;
|AVR [[ATmega32]]&lt;br /&gt;
|-&lt;br /&gt;
|'''Speicher:'''&lt;br /&gt;
|32 kB [[Flash]]-Speicher, davon 1 kB bereits vom Bootloader belegt&amp;lt;br/&amp;gt;&lt;br /&gt;
2 kB RAM&amp;lt;br/&amp;gt; &lt;br /&gt;
1 kB [[EEPROM]]&lt;br /&gt;
|-&lt;br /&gt;
|'''Programmierung:'''&lt;br /&gt;
|Über AVR-[[Bootloader]], belegt ca. 1 kB des Flash-Speichers&lt;br /&gt;
|-&lt;br /&gt;
|'''Vorhandene Sensoren:'''&lt;br /&gt;
|2 [[Sensorarten#Helligkeit|Lichtsensoren (LDR)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
1 [[Sensorarten#Helligkeit|Infrarot (ACS - Anti Collision System)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
2 [[Sensorarten#Bumpers|Bumper]] &amp;lt;br/&amp;gt; &lt;br /&gt;
2 [[Sensorarten#Incremental-Geber|Drehgeber (Encoder)]]&lt;br /&gt;
|-&lt;br /&gt;
|'''Vorhandene Aktoren:'''&lt;br /&gt;
|2 Motoren&amp;lt;br/&amp;gt;&lt;br /&gt;
6 Status-LEDs&amp;lt;br/&amp;gt;&lt;br /&gt;
1 IR-Sender&amp;lt;br/&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|'''Abmessungen:'''&lt;br /&gt;
|(L &amp;amp;times; B &amp;amp;times; H) 172 &amp;amp;times; 128 &amp;amp;times; 50 mm&lt;br /&gt;
|-&lt;br /&gt;
|'''Ausführung:'''&lt;br /&gt;
|Fertig aufgebauter Roboter&lt;br /&gt;
|-&lt;br /&gt;
|'''Stromversorgung:'''&lt;br /&gt;
|6 AA NiMH Akkus&lt;br /&gt;
|-&lt;br /&gt;
|'''Hersteller:'''&lt;br /&gt;
|Arexx Niederlande&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Mechanik==&lt;br /&gt;
===Beschreibung===&lt;br /&gt;
&lt;br /&gt;
===Sensoren===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Encoder====&lt;br /&gt;
&lt;br /&gt;
Die Drehgeber sind an den Getrieben der Motoren zur Drehzahlmessung angebracht. Es handelt sich dabei um Reflexlichtschranken, die auf Codierscheiben mit je 18 weissen und 18 schwarzen Segmenten ausgerichtet sind, also insgesamt 36 Segmente. Diese Codierscheiben sind wiederum an je eines der Zahnräder der beiden Getriebe geklebt worden. Wenn es sich dreht, wandern die einzelnen Segmente an der Reflexlichtschranke vorbei. Die weissen Segmente reflektieren das Infrarotlicht, die schwarzen Segmente nur wenig. Jedes der zwei mittleren Stufenzahnräder des Getriebes hat 50 Zähne auf dem großen, und 12 auf dem kleineren Zahnrad. Die Codierscheiben befinden sich auf dem Zahnrad neben dem Motor, also rechnet man:&lt;br /&gt;
50/12 * 50/12 =17.13/36; 17.13/36 * 36=625&lt;br /&gt;
Daher haben die Encoderscheiben auch Ihre 36 Segmente, denn das gibt eine schöne runde Zahl ohne gebrochenen Anteil. Die Drehgeber erzeugen also 625 Flanken pro Radumdrehung wobei jede Flanke einem Segment entspricht. Bei einem Raddurchmesser von ca. 50mm inkl. Raupenkette, ergibt sich rein rechnerisch ein Radumfang von ca. 157mm was 0.2512mm pro Zählschritt der Drehgeber entspricht. Da sich die Raupenketten aber fast immer etwas in den Untergrund eindrücken (bzw. auch selbst eingedrückt werden) kann man aber von 0.25mm pro Zählschritt ausgehen – meist ist es sogar etwas weniger, z.B. nur 0.24 oder 0.23mm. Das muss man durch abfahren von Teststrecken ermitteln, wie es im Anhang grob beschrieben ist. Sehr genau ist das allerdings durch Radschlupf (bzw. hier müssten wir eigentlich von „Kettenschlupf“ sprechen) und ähnlichen Dingen nicht - vor allem beim Rotieren auf der Stelle. Beim normalen Geradeausfahren ist dieser Fehler klein, aber beim Rotieren kann er schnell sehr große Werte annehmen! Abweichungen muss man evtl. durch weitere Tests ermitteln und mit einkalkulieren. Das ist bei Raupenantrieben leider so – auch bei viel teureren und hochwertigeren Robotern. Dafür hat man aber den Vorteil, dass der Roboter mit Raupenantrieb recht geländegängig ist im Vergleich zu Robotern mit normalem Differentialantrieb mit zwei Antriebsrädern und Stützrad. Kleinere Hindernisse und Rampen kann er meist problemlos überwinden.&lt;br /&gt;
Dabei sind die Encoder sehr nützlich, denn man kann die Geschwindigkeit gut einregeln, egal wie der Untergrund und die Motorbelastung gerade aussieht. Bei gemessenen 50 Segmenten pro Sekunde liegt die Geschwindigkeit bei 1.25 cm/s, sofern wir von 0.25mm pro Zählschritt ausgehen. Etwa 50 Segmente pro Sekunde ist auch die geringste gerade noch regelbare Geschwindigkeit (das variiert aber etwas von Roboter zu Roboter). Bei 1200 Segmenten pro Sekunde wären es die maximal möglichen 30 cm/s (bei 0.25mm Auflösung, bei 0.23 sind es 27.6 cm/s). Standardmäßig begrenzt die Funktionsbibliothek das aber auf 1000 Flanken pro Sekunde. Die maximale Geschwindigkeit ist vom Ladezustand der Akkus abhängig – daher wären 30cm/s nicht besonders lange haltbar. Außerdem erhöht sich die Lebensdauer der Getriebe und Motoren je langsamer man fährt! Wenn der Roboter 4000 Segmente gezählt hat, ist er übrigens etwa einen Meter weit gefahren. Aber wie schon gesagt, gilt das natürlich nur für genau 0.25mm Auflösung. Ohne Kalibrierung hat man hier immer mehr oder weniger starke Abweichungen. Wem es nicht auf jeden mm ankommt, braucht nichts zu kalibrieren und kann einfach von 0.25mm oder besser 0.24mm ausgehen!&lt;br /&gt;
&lt;br /&gt;
====Stoßstangensensoren====&lt;br /&gt;
&lt;br /&gt;
Vorn am Roboter sind zwei Mikroschalter mit langem Schalthebel auf einer separaten&lt;br /&gt;
Platine untergebracht, die etwas vor der anderen Sensorplatine liegt. Dadurch werden&lt;br /&gt;
die IR LEDs auf der Sensorplatine geschützt und können nicht so leicht verbiegen&lt;br /&gt;
wenn der Roboter mal gegen ein Hindernis fährt. Die Stoßstange kann man auch abmontieren und z.B. gegen eine Schuss- oder Sammelvorrichtung für Bälle o.ä. ersetzen wenn man möchte.&lt;br /&gt;
&lt;br /&gt;
====Lichtsensoren====&lt;br /&gt;
&lt;br /&gt;
Vorne auf der kleinen Sensorplatine des Roboters sind zwei sog.&lt;br /&gt;
LDRs (=&amp;quot;Light Dependant Resistors&amp;quot; also lichtabhängige Widerstände)&lt;br /&gt;
platziert und nach links bzw. rechts ausgerichtet. Zwischen&lt;br /&gt;
den beiden Sensoren ist noch eine kleine schwarze&lt;br /&gt;
„Trennwand“ damit das Licht aus einer Richtung möglichst nur&lt;br /&gt;
einen der Sensoren erreicht. Sie bilden zusammen mit je einem&lt;br /&gt;
normalen Widerstand wie beim Batteriesensor einen Spannungsteiler – hier allerdings&lt;br /&gt;
um das Umgebungslicht zu messen.&lt;br /&gt;
&lt;br /&gt;
====Anti Collision System====&lt;br /&gt;
&lt;br /&gt;
Der aus Softwaresicht komplexeste Sensor des RP6 ist das ACS - das&lt;br /&gt;
„Anti Collision System“ (engl. für Anti Kollisions System)! Es besteht&lt;br /&gt;
aus einem IR Empfänger (s. Abb.) und zwei vorne auf der Sensorplatine&lt;br /&gt;
links und rechts angebrachten IR LEDs.&lt;br /&gt;
Da es je eine IR LED links und rechts gibt, kann das ACS grob unterscheiden ob sich&lt;br /&gt;
das Objekt links, rechts oder mittig vor dem Roboter befindet.&lt;br /&gt;
Man kann zusätzlich noch die Stromstärke mit der die beiden IR LEDs gepulst werden&lt;br /&gt;
in drei Stufen einstellen. Das ACS funktioniert aber auch in der höchsten Stufe nicht&lt;br /&gt;
mit allen Objekten immer zuverlässig, denn es kommt auf die Beschaffenheit der&lt;br /&gt;
Oberfläche des jeweiligen Objekts an! Ein schwarzes Objekt reflektiert das IR Licht natürlich&lt;br /&gt;
viel schlechter als ein weisses Objekt und ein kantiges und spiegelndes Objekt&lt;br /&gt;
könnte das IR Licht hauptsächlich in eine bestimme Richtung reflektieren. Die Reichweite&lt;br /&gt;
ist also immer vom jeweiligen Objekt abhängig! Das ist eine prinzipielle Schwäche&lt;br /&gt;
von so gut wie allen IR Sensoren (jedenfalls in dieser Preisklasse).&lt;br /&gt;
Trotzdem werden die meisten Hindernisse zuverlässig erkannt und können umfahren&lt;br /&gt;
werden. Falls das mal nicht klappt, gibt es noch die Stoßstange mit den Tastsensoren&lt;br /&gt;
und falls auch die nicht richtig getroffen werden, kann der Roboter noch mit den Motorstromsensoren&lt;br /&gt;
oder den Encodern erkennen, ob die Motoren blockieren (s.u.)!&lt;br /&gt;
Wem das nicht reicht, der könnte zusätzlich z.B. noch Ultraschallsensoren anbringen...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Erweiterungssystem===&lt;br /&gt;
Auf dem Mainboard sind 22 freie 3,2mm Löcher vorhanden (im Chassis weitere 16), auf denen die Erweiterungsmodule symmetrisch vorne und hinten gestapelt werden können. Weil der Stromverbrauch durch mehr Module steigt, ist es sinnvoll nur insgesamt 6-8 Module auf dem Roboter zu stapeln. Auf dem Mainboard selbst sind noch 6 kleine Erweiterungsflächen verfügbar (plus 2 sehr kleine auf der Bumperplatine).&lt;br /&gt;
&lt;br /&gt;
===Antrieb===&lt;br /&gt;
&lt;br /&gt;
Die 7,2 VDC Motoren sind im Chassis eingebaut und werden mithilfe der H-Brücken gesteuert. Die maximale Geschwindigkeit liegt bei 25cm/s, das kann je nach Akkuspannung aber variieren. Ohne Softwarebegrenzung sind sogar 30cm/s möglich, dadurch verringert sich aber die Lebensdauer der Motoren. Die maximale Steigung, die der RP6 bewältigen kann, ist 30%, ohne Bumperplatine 40%, das hängt aber auch vom Untergrund ab. Kleine Hindernisse wie Bücher und Stifte kann der RP6 problemlos überqueren. Die Achsen der Räder sind in selbstschmierenden Sinterlagern mit 4mm Durchmesser gelagert.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Elektromechanik==&lt;br /&gt;
===Beschreibung===&lt;br /&gt;
===Odometrie===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Elektronik==&lt;br /&gt;
[[Bild:RP6 Block.jpg|thumb|Blockdiagramm]]&lt;br /&gt;
===Beschreibung===&lt;br /&gt;
&lt;br /&gt;
===Sensoren (SENSORS)===&lt;br /&gt;
&lt;br /&gt;
Die meisten Sensoren über die der Roboter verfügt, haben wir ja schon in anderen Abschnitten kurz genannt, wollen diese nun aber etwas detaillierter betrachten.&lt;br /&gt;
In dem Blockdiagramm sind einige der Sensoren nicht in dem blauen Bereich &amp;quot;Sensors&amp;quot; zu sehen, weil sie besser in andere Bereiche passen. Trotzdem zählen natürlich auch die Drehgeber (= “Encoder“), Motorstromsensoren und der Batteriespannungssensor zu den Sensoren und werden darum in diesem Abschnitt beschrieben!&lt;br /&gt;
&lt;br /&gt;
====Batteriespannungs-Sensor (Voltage Sensor)====&lt;br /&gt;
&lt;br /&gt;
Dieser &amp;quot;Sensor&amp;quot; ist eigentlich nur ein einfacher Spannungsteiler aus zwei Widerständen. Wir gehen davon aus, dass die Batterien insgesamt maximal 10V liefern können. 6 NiMH Akkus werden immer unterhalb davon bleiben. Die Referenzspannung des ADC, also die Spannung mit der er die gemessene Spannung vergleicht, beträgt 5V. Da auch die Betriebsspannung 5V beträgt, darf diese nicht überschritten werden. Also müssen wir die zu messende Spannung um die Hälfte herabsetzen! Dies geschieht über einen Spannungsteiler aus zwei Widerständen, der die Spannung an den Messbereich des ADCs anpasst. Der ADC löst mit 10 Bit auf (Wertebereich 0 bis 1023), was eine Auflösung von 10V/1024=9.765625mV ergibt. Ein Messwert von 512 entspricht hier also 5V und 1023 wären ungefähr 10V! Diese Grenzwerte sollten aber normalerweise nie erreicht werden! Das ist nicht besonders genau, da die Widerstände keineswegs Präzisionswiderstände sind. Abweichungen von einigen Prozent nach oben und unten sind möglich. Auch die Referenzspannung von 5V ist nicht ganz genau und kann bei normaler Belastung etwas variieren. Das stört hier nicht, denn wir brauchen ohnehin nur einen ungefähren Wert um festzustellen ob die Batterien sich langsam dem Ende nähern. Wer die Spannung genau messen will, braucht ein Multimeter um den Messfehler zu ermitteln und diesen dann in Software auszugleichen. Wenn man mit Fehlern leben kann, kann man die Spannung dank des günstigen Umrechnungsverhältnisses sogar direkt aus den ADC Werten ungefähr abschätzen: 720 entsprechen dann grob 7.2V, 700 etwa 7V und 650 wären etwa 6.5V. Bei einem konstanten Wert unter 560 kann man davon ausgehen, dass die Akkus fast leer sind.&lt;br /&gt;
&lt;br /&gt;
====Motorstrom====&lt;br /&gt;
[[Bild:RP6_MSS.jpg|thumb]]&lt;br /&gt;
Es befinden sich zwei Leistungswiderstände in den beiden Motorstromkreisen. Aus dem Ohm'schen Gesetz U=RxI folgt, dass sich die Spannung die an einem bestimmten Widerstand abfällt, proportional zum Strom verhält, der diesen durchfließt!&lt;br /&gt;
Damit die Spannungsabfälle an den Widerständen nicht zu groß werden, müssen die Widerstände klein gewählt werden. In unserem Fall haben Sie einen Wert von 0.1 Ohm&lt;br /&gt;
Die abfallende Spannung ist also nur sehr klein (0.1V bei einem Strom von 1A) und muss verstärkt werden bevor sie mit dem ADC gemessen werden kann. Das erledigt jeweils ein sog. Operationsverstärker (OPV). In der Schaltung des RP6 wird je Motorkanal ein OPV verwendet. Der Messbereich geht etwa bis 1.8A. Bei 1.8A fallen etwa 0.18V am Widerstand ab und es ergibt sich am Ausgang des OPV eine Spannung von etwa 4V. Mehr kann der verwendete OPV bei 5V Betriebsspannung nicht ausgeben:&lt;br /&gt;
&lt;br /&gt;
I = U / ((1 + (100k / 4,7k)) * 0,1)&lt;br /&gt;
&lt;br /&gt;
Die Leistungswiderstände haben eine Toleranz von 10%, die Widerstände am OPV 5%, also ist das alles nur sehr ungenau (Ungenauigkeiten im Bereich von etwa 270mA sind möglich wenn man die Sensoren nicht kalibriert!). Wir brauchen allerdings auch nur den ungefähren Wert um festzustellen ob die Motoren stark oder wenig belastet werden. So kann der Roboter gut blockierte oder gar defekte Motoren bzw. Drehgeber erkennen! Die DC-Motoren benötigen mehr Strom je stärker sie belastet werden (Drehmoment) und somit steigt der Strom sehr stark an wenn die Motoren blockiert sind. Das wird von der Robotersoftware zur Notabschaltung verwendet: wenn die Motoren dauerhaft mit hohem Strom betrieben würden, könnten diese sehr heiß werden und dadurch Schaden nehmen! Und wenn die Encoder mal ausfallen sollten – aus welchem Grund auch immer – kann auch das damit erkannt werden. Man würde dann eine Drehzahl von 0 messen. Lässt man die Motoren aber auf voller Kraft laufen und der Strom bleibt trotzdem klein (also sind die Ketten nicht blockiert!), kann man genau daraus schließen, dass entweder die Encoder, oder die Motoren ausgefallen sind (oder Encoder und Motorstromsensoren nicht funktionieren... das passiert z.B. wenn man vergessen hat diese vorher per Software einzuschalten).&lt;br /&gt;
&lt;br /&gt;
====Encoder====&lt;br /&gt;
[[Bild:RP6_ENCODER.jpg|thumb]]&lt;br /&gt;
Ganz anders als die letztgenannten Sensoren funktionieren die Drehgeber, die an den Getrieben der Motoren zur Drehzahlmessung angebracht sind. Es handelt sich dabei um Reflexlichtschranken, die auf Codierscheiben mit je 18 weissen und 18 schwarzen Segmenten ausgerichtet sind, also insgesamt 36 Segmente (s. Abb). Diese Codierscheiben sind wiederum an je eines der Zahnräder der beiden Getriebe geklebt worden. Wenn es sich dreht, wandern die einzelnen Segmente an der Reflexlichtschranke vorbei. Die weissen Segmente reflektieren das Infrarotlicht, die schwarzen Segmente nur wenig. Die Drehgeber erzeugen so zwar auch wie die anderen Sensoren ein analoges Signal, aber es wird digital interpretiert. Zunächst wird das Signal verstärkt und anschließend über einen sog. Schmitt Trigger in ein Rechtecksignal umgewandelt. Die Flanken dieses Signals, also die Wechsel von 5 auf 0V und umgekehrt, lösen jeweils ein Interrupt Ereignis aus und diese werden dann von der Software gezählt. So kann die zurückgelegte Wegstrecke gemessen und zusammen mit einem Timer zur Zeitmessung die Drehzahl und damit auch die Geschwindigkeit ermittelt werden. Die Ermittlung der Drehzahl ist auch Hauptanwendung der Encoder – nur mit den Encodern kann man die Drehzahl auf den gewünschten Sollwert einregeln. Ohne Regelung wäre die Drehzahl nämlich von der Akkuspannung, Belastung der Motoren usw. abhängig. Die hohe Auflösung ermöglicht es dabei, auch niedrige Geschwindigkeiten noch relativ genau einzuregeln. Jedes der zwei mittleren Stufenzahnräder des Getriebes hat 50 Zähne auf dem großen, und 12 auf dem kleineren Zahnrad (s. Abb). Die Codierscheiben befinden sich auf dem Zahnrad neben dem Motor, also rechnet man:&lt;br /&gt;
&lt;br /&gt;
50/12 * 50/12 =17.13/36; 17.13/36 * 36=625&lt;br /&gt;
&lt;br /&gt;
Daher haben die Encoderscheiben auch Ihre 36 Segmente, denn das gibt eine schöne runde Zahl ohne gebrochenen Anteil. Die Drehgeber erzeugen also 625 Flanken pro Radumdrehung wobei jede Flanke einem Segment entspricht. Bei einem Raddurchmesser von ca. 50mm inkl. Raupenkette, ergibt sich rein rechnerisch ein Radumfang von ca. 157mm was 0.2512mm pro Zählschritt der Drehgeber entspricht. Da sich die Raupenketten aber fast immer etwas in den Untergrund eindrücken (bzw. auch selbst eingedrückt werden) kann man aber von 0.25mm pro Zählschritt ausgehen – meist ist es sogar etwas weniger, z.B. nur 0.24 oder 0.23mm. Das muss man durch abfahren von Teststrecken ermitteln, wie es im Anhang grob beschrieben ist. Sehr genau ist das allerdings durch Radschlupf (bzw. hier müssten wir eigentlich von „Kettenschlupf“ sprechen) und ähnlichen Dingen nicht - vor allem beim Rotieren auf der Stelle. Beim normalen Geradeausfahren ist dieser Fehler klein, aber beim Rotieren kann er schnell sehr große Werte annehmen! Abweichungen muss man evtl. durch weitere Tests ermitteln und mit einkalkulieren. Das ist bei Raupenantrieben leider so – auch bei viel teureren und hochwertigeren Robotern. Dafür hat man aber den Vorteil, dass der Roboter mit Raupenantrieb recht geländegängig ist im Vergleich zu Robotern mit normalem Differentialantrieb mit zwei Antriebsrädern und Stützrad. Kleinere Hindernisse und Rampen kann er meist problemlos überwinden.&lt;br /&gt;
Dabei sind die Encoder sehr nützlich, denn man kann die Geschwindigkeit gut einregeln, egal wie der Untergrund und die Motorbelastung gerade aussieht. Bei gemessenen 50 Segmenten pro Sekunde liegt die Geschwindigkeit bei 1.25 cm/s, sofern wir von 0.25mm pro Zählschritt ausgehen. Etwa 50 Segmente pro Sekunde ist auch die geringste gerade noch regelbare Geschwindigkeit (das variiert aber etwas von Roboter zu Roboter). Bei 1200 Segmenten pro Sekunde wären es die maximal möglichen 30 cm/s (bei 0.25mm Auflösung, bei 0.23 sind es 27.6 cm/s). Standardmäßig begrenzt die Funktionsbibliothek das aber auf 1000 Flanken pro Sekunde. Die maximale Geschwindigkeit ist vom Ladezustand der Akkus abhängig – daher wären 30cm/s nicht besonders lange haltbar. Außerdem erhöht sich die Lebensdauer der Getriebe und Motoren je langsamer man fährt!&lt;br /&gt;
&lt;br /&gt;
=====Encoder justieren=====&lt;br /&gt;
Damit der RP6 die Signale der Drehgeber richtig auswerten kann, muss man evtl. die Drehgeber einmalig justieren. Dies kann auch schon bei einem neu gekauften RP6 notwendig sein.&lt;br /&gt;
Eine genaue Anleitung dazu findet man [http://www.arexx.com/rp6/downloads/RP6_ENCODER_DE_20071219.zip hier]. Es gibt auch ein [http://www.arexx.com/rp6/downloads/rp6_encoder_video.zip Video], das die Drehgeber-Justierung zeigt.&lt;br /&gt;
&lt;br /&gt;
=====Encoder kalibrieren=====&lt;br /&gt;
Wenn der Roboter 4000 Segmente gezählt hat, ist er etwa einen Meter weit gefahren. Aber wie schon gesagt, gilt das natürlich nur für genau 0.25mm Auflösung. Ohne Kalibrierung hat man hier immer mehr oder weniger starke Abweichungen. Wem es nicht auf jeden mm ankommt, braucht nichts zu kalibrieren und kann einfach von 0.25mm oder besser 0.24mm ausgehen!&lt;br /&gt;
Optimal ist es, wenn man sich für Weg- und Winkelmessungen nicht auf die Encoder Daten stützen muss, sondern externe Systeme wie Infrarotbaken oder einen genauen elektronischen Kompass dazu zur Verfügung hat.&lt;br /&gt;
&lt;br /&gt;
Will man die Drehgeber des RP6 dennoch kalibrieren, kann man ihn z.B. mit diesem Testprogramm:&lt;br /&gt;
&amp;lt;pre&amp;gt;#include &amp;quot;RP6RobotBaseLib.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
	initRobotBase();&lt;br /&gt;
	powerON();&lt;br /&gt;
&lt;br /&gt;
	// Test: Go ahead 1m and stop!&lt;br /&gt;
	move (80, FWD, DIST_MM(1000), true);&lt;br /&gt;
	writeString_P(&amp;quot;LEFT RIGHT&amp;quot;);&lt;br /&gt;
 	writeString_P(&amp;quot;\n&amp;quot;);&lt;br /&gt;
 	writeInteger(mleft_dist, DEC);&lt;br /&gt;
	writeChar(' ');&lt;br /&gt;
 	writeInteger(mright_dist, DEC);&lt;br /&gt;
	writeString_P(&amp;quot;\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
	powerOFF();&lt;br /&gt;
&lt;br /&gt;
	return 0;&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
... 1m weit fahren lassen und dann messen, wie weit er tatsächlich gefahren ist. Das Programm gibt auf dem Terminal den Stand der Drehgeber aus. Teilt man dann die gemessene Fahrstrecke in mm durch den Wert der Drehgeber, erhält man die Auflösung. Diesen Wert kann man dann der Konstanten ENCODER_RESOLUTION in der RP6Config.h zuweisen. Nach &amp;quot;Make Clean&amp;quot;, einer Neukompilierung und erneuter Ausführung des Testprogramms müßte der RP6 jetzt genau 1m weit fahren. Das gilt zumindest für den Untergrund, auf dem die Kalibrierung durchgeführt wurde.&lt;br /&gt;
&lt;br /&gt;
====Stoßstangensensoren (Bumper)====&lt;br /&gt;
&lt;br /&gt;
Vorn am Roboter sind zwei Mikroschalter mit langem Schalthebel auf einer separaten&lt;br /&gt;
Platine untergebracht, die etwas vor der anderen Sensorplatine liegt. Dadurch werden&lt;br /&gt;
die IR LEDs auf der Sensorplatine geschützt und können nicht so leicht verbiegen&lt;br /&gt;
wenn der Roboter mal gegen ein Hindernis fährt. Mit den zwei Schaltern kann der Mikrocontroller&lt;br /&gt;
einen solchen Aufprall registrieren und dann beispielsweise zurücksetzen,&lt;br /&gt;
sich etwas drehen und weiterfahren. Die Schalter sind an zwei der Ports die schon mit&lt;br /&gt;
den LEDs verbunden sind angeschlossen und blockieren so keine anderen Ports des&lt;br /&gt;
Mikrocontrollers. Daher leuchten die LEDs auch immer wenn man einen der Schalter&lt;br /&gt;
drückt! Da dies normalerweise relativ selten passiert, stört das aber nicht weiter.&lt;br /&gt;
Die Stoßstange kann man auch abmontieren und z.B. gegen eine Schuss- oder Sammelvorrichtung&lt;br /&gt;
für Bälle o.ä. ersetzen wenn man möchte.&lt;br /&gt;
&lt;br /&gt;
====Lichtsensoren (LDRs)====&lt;br /&gt;
[[Bild:RP6_Licht.jpg|thumb]]&lt;br /&gt;
Vorne auf der kleinen Sensorplatine des Roboters sind zwei sog.&lt;br /&gt;
LDRs (=&amp;quot;Light Dependant Resistors&amp;quot; also lichtabhängige Widerstände)&lt;br /&gt;
platziert und nach links bzw. rechts ausgerichtet. Zwischen&lt;br /&gt;
den beiden Sensoren ist noch eine kleine schwarze&lt;br /&gt;
„Trennwand“ damit das Licht aus einer Richtung möglichst nur&lt;br /&gt;
einen der Sensoren erreicht. Sie bilden zusammen mit je einem&lt;br /&gt;
normalen Widerstand wie beim Batteriesensor einen Spannungsteiler – hier allerdings&lt;br /&gt;
um das Umgebungslicht zu messen. Die 5V Betriebsspannung wird auch geteilt, aber&lt;br /&gt;
hier ist einer der Widerstände variabel! Es wird also das Teilungsverhältnis je nach Intensität&lt;br /&gt;
des Lichteinfalls verändert und somit eine vom Lichteinfall abhängige Spannung&lt;br /&gt;
an einen der A/D Wandler Kanäle geleitet!&lt;br /&gt;
Über den Spannungsunterschied zwischen den beiden Sensoren kann man ermitteln in&lt;br /&gt;
welcher Richtung sich eine bzw. die hellste Lichtquelle vor dem Roboter befindet:&lt;br /&gt;
Links, Rechts oder in der Mitte. Mit einem entsprechenden Programm, kann man so z.B. eine starke Taschenlampe in&lt;br /&gt;
einem abgedunkelten Zimmer verfolgen, oder den Roboter die hellste Stelle in einem&lt;br /&gt;
Raum suchen lassen! Klappt z.B. sehr gut mit einem stärkeren Hand-Halogenscheinwerfer:&lt;br /&gt;
Wenn man damit auf den Boden leuchtet, kann der Roboter dem Lichtfleck auf&lt;br /&gt;
dem Boden folgen.&lt;br /&gt;
Das geht natürlich auch umgekehrt: Der Roboter könnte z.B. auch versuchen sich vor&lt;br /&gt;
hellem Licht zu verstecken...&lt;br /&gt;
Wenn man noch ein oder zwei LDRs hinten am Roboter anbringen würde, könnte man&lt;br /&gt;
das noch verfeinern und die Richtung in der sich Lichtquellen befinden besser bestimmen.&lt;br /&gt;
Der Roboter kann sonst nämlich oft nur schwer unterscheiden ob die Lichtquelle&lt;br /&gt;
vor oder hinter ihm liegt. Zwei der A/D Wandler Kanäle sind noch frei...&lt;br /&gt;
&lt;br /&gt;
====Anti Collision System (ACS)====&lt;br /&gt;
[[Bild:RP6 ACS.jpg|thumb|Das ACS]]&lt;br /&gt;
Der aus Softwaresicht komplexeste Sensor des RP6 ist das ACS - das „Anti Collision System“ (engl. für Anti Kollisions System)! Es besteht aus einem IR Empfänger (s. Abb.) und zwei vorne auf der Sensorplatine links und rechts angebrachten IR LEDs. Die IR LEDs werden direkt vom Mikrocontroller angesteuert. Die Ansteuerungsroutinen können beliebig verändert und verbessert werden! Beim Vorgängermodell war dafür noch ein eigener Controller nötig, dessen Programm aber nicht vom Anwender geändert werden konnte...&lt;br /&gt;
Mit den IR LEDs werden kurze, mit 36kHz modulierte Infrarot Impulse ausgesandt, auf die der darauf ausgelegte IR Empfänger reagiert. Werden die IR Impulse an einem Gegenstand vor dem Roboter reflektiert und vom IR Empfänger detektiert, kann der Mikrocontroller darauf reagieren und z.B. ein Ausweichmanöver einleiten. Damit das ACS nicht zu empfindlich bzw. auf eventuelle Störungen reagiert, wartet die Software bis eine bestimmte Anzahl von Impulsen in einer bestimmten Zeit empfangen worden ist. Es wird auch eine Synchronisation mit dem RC5 Empfang durchgeführt und auf die RC5 Signale von TV/Hifi Fernbedienungen wird so nicht reagiert. Bei anderen Codes kann das aber nicht garantiert werden und das ACS könnte dann Hindernisse erkennen, wo gar keine sind! Da es je eine IR LED links und rechts gibt, kann das ACS grob unterscheiden ob sich das Objekt links, rechts oder mittig vor dem Roboter befindet.&lt;br /&gt;
Man kann zusätzlich noch die Stromstärke mit der die beiden IR LEDs gepulst werden in drei Stufen einstellen. Das ACS funktioniert aber auch in der höchsten Stufe nicht mit allen Objekten immer zuverlässig, denn es kommt auf die Beschaffenheit der Oberfläche des jeweiligen Objekts an! Ein schwarzes Objekt reflektiert das IR Licht natürlich viel schlechter als ein weisses Objekt und ein kantiges und spiegelndes Objekt könnte das IR Licht hauptsächlich in eine bestimme Richtung reflektieren. Die Reichweite ist also immer vom jeweiligen Objekt abhängig! Das ist eine prinzipielle Schwäche von so gut wie allen IR Sensoren (jedenfalls in dieser Preisklasse).&lt;br /&gt;
Trotzdem werden die meisten Hindernisse zuverlässig erkannt und können umfahren werden. Falls das mal nicht klappt, gibt es noch die Stoßstange mit den Tastsensoren und falls auch die nicht richtig getroffen werden, kann der Roboter noch mit den Motorstromsensoren oder den Encodern erkennen, ob die Motoren blockieren (s.u.)!&lt;br /&gt;
Wem das nicht reicht, der könnte zusätzlich z.B. noch Ultraschallsensoren anbringen...&lt;br /&gt;
&lt;br /&gt;
====IR-Kommunikation (IRCOMM)====&lt;br /&gt;
Der RP6 kann über die IR-LEDs links und rechts über der Bumper-Platine Daten zu anderen IR-Empfängern senden.  Es ist z.B. möglich, dass mehrere Roboter ihre Sensorwerte untereinander vergleichen.&lt;br /&gt;
&lt;br /&gt;
====6 Status-LEDs====&lt;br /&gt;
Die Status-LEDs sind vorne links und rechts über den Lichtsensoren auf der Hauptplatine angebracht.&lt;br /&gt;
&lt;br /&gt;
Über die Status-LEDs können Sensorzustände, z.B. des ACS, der Bumper oder der Lichtsensoren, dargestellt werden.&lt;br /&gt;
&lt;br /&gt;
====IR-Sender====&lt;br /&gt;
Über den IR-Sender können Daten zu anderen Geräten übertragen werden.&lt;br /&gt;
&lt;br /&gt;
===Erweiterungssystem (EXPANSION SYSTEM)===&lt;br /&gt;
[[Bild:RP6_EXP.jpg|thumb]]&lt;br /&gt;
Eines der nützlichsten Features des RP6 ist das Erweiterungssystem.&lt;br /&gt;
Man kann den RP6 damit genau so weit ausbauen,&lt;br /&gt;
wie man es benötigt. Aus Kostengründen bietet das&lt;br /&gt;
Basissystem schließlich nur relativ wenig Sensoren. Es sind&lt;br /&gt;
zwar schon mehr als bei vielen anderen Robotern in dieser&lt;br /&gt;
Preisklasse, aber erst mit weiteren Sensoren macht ein Roboter&lt;br /&gt;
so richtig Spaß. Das ACS kann beispielsweise nur grob&lt;br /&gt;
erkennen ob sich ein Hindernis vor dem Roboter befindet.&lt;br /&gt;
Mit Ultraschallsensoren oder besseren zusätzlichen IR Sensoren,&lt;br /&gt;
könnte man aber die Distanz ermitteln und so beispielsweise&lt;br /&gt;
bessere Ausweichmanöver fahren!&lt;br /&gt;
&lt;br /&gt;
Neben Sensoren macht es auch sehr viel Sinn, zusätzliche Controller einzubauen um&lt;br /&gt;
die anfallenden Aufgaben aufteilen zu können. Beispielsweise die RP6 CONTROL M32&lt;br /&gt;
Platine mit einem weiteren MEGA32 Mikrocontroller oder die CCPRO M128.&lt;br /&gt;
&lt;br /&gt;
Das Erweiterungssystem muss natürlich in der Lage sein, viele Erweiterungsmodule&lt;br /&gt;
miteinander zu verbinden, dabei mit wenigen Signalleitungen&lt;br /&gt;
auskommen und eine ausreichend hohe Geschwindigkeit bieten.&lt;br /&gt;
&lt;br /&gt;
Siehe [[I2C]]&lt;br /&gt;
&lt;br /&gt;
===Steuerung (CONTROL SYSTEM)===&lt;br /&gt;
&lt;br /&gt;
====Hauptprozessor (ATMEGA32)====&lt;br /&gt;
[[Bild:RP6_MEGA32.jpg|thumb|Der MEGA32]]&lt;br /&gt;
Der Hauptprozessor ist der ATMEGA32 vom Atmel. Er hat 32KB Flash ROM und 2KB RAM. Der ATMEGA ist mit 8Mhz getaktet, kann also bis zu 8 Millionen Befehle pro Sekunde ausführen. Es sind 32 I/O-Pins  am Controller verfügbar. Die I/O-Pins gehören zu I/O-Ports mit jeweils 8 Pins. Davon gibt es 4: PORTA, PORTB, PORTC und PORTD. Der Controller kann die Ports entweder ein oder ausschalten (Output), oder erkennen, ob Spannung angelegt wurde oder nicht (Input). Es gibt mehrere Module, die verschiedene Aufgaben übernehmen:&lt;br /&gt;
* 3 Timer, einer davon erzeugt die PWM-Signale für die Motoren&lt;br /&gt;
* Die serielle Schnittstelle (UART)&lt;br /&gt;
* Das TWI (Two Wire Interface, also Zweidraht Schnittstelle)&lt;br /&gt;
* Ein ADC (Analog to Digital Converter) mit 8 Eingangskanälen, welche mit 10bit (0-1023) auflösen&lt;br /&gt;
* Drei externe Interrupt Eingänge&lt;br /&gt;
&lt;br /&gt;
Auserdem befindet sich im Microcontroller ein sog. Bootloader, welcher mit dem RP6 Loader kommuniziert und neue Programme in den Speicher lädt.&lt;br /&gt;
&lt;br /&gt;
===Antrieb (DRIVE SYSTEM)===&lt;br /&gt;
[[Bild:RP6_H-Brücke.jpg|thumb|Die H-Brücke]]&lt;br /&gt;
[[Bild:RP6_Tastverhältniss.jpg|thumb]]&lt;br /&gt;
Der Antrieb des RP6 besteht aus zwei Gleichstrom Motoren mit nachgeschaltetem Getriebe,&lt;br /&gt;
über das die beiden Raupenketten angetrieben werden.&lt;br /&gt;
Die Motoren genehmigen sich je nach Belastung&lt;br /&gt;
einen recht hohen Strom und können&lt;br /&gt;
natürlich nicht direkt vom Mikrocontroller&lt;br /&gt;
angesteuert werden. Dazu braucht man&lt;br /&gt;
Leistungstreiber in Form von je einer H-Brücke&lt;br /&gt;
pro Motor. Das grundlegende Prinzip&lt;br /&gt;
ist in der nebenstehenden Abbildung dargestellt.&lt;br /&gt;
Eine H-Brücke besteht aus vier&lt;br /&gt;
&amp;quot;Schaltern&amp;quot;, die in Form eines H's um einen&lt;br /&gt;
Motor angeordnet sind. Nehmen wir mal an,&lt;br /&gt;
zunächst seien alle Schalter aus. Schaltet&lt;br /&gt;
man dann S1 und S4 (Rot) an, liegt eine&lt;br /&gt;
Spannung am Motor an und er dreht sich&lt;br /&gt;
z.B. nach rechts. Schalten wir nun S1 und&lt;br /&gt;
S4 wieder aus und danach S2 und S3 (Grün)&lt;br /&gt;
an, wird die am Motor anliegende Spannung umgepolt und er dreht sich in die entgegen gesetzte&lt;br /&gt;
Richtung, also nach links! Man muss darauf achten, nicht gleichzeitig S1&lt;br /&gt;
und S2, oder S3 und S4 einzuschalten, sonst entstünde ein Kurzschluss und dadurch&lt;br /&gt;
könnten die &amp;quot;Schalter&amp;quot; zerstört werden!&lt;br /&gt;
Natürlich verwenden wir auf dem RP6 keine mechanischen Schalter, sondern sog.&lt;br /&gt;
MOSFETs. Diese schalten beim Anlegen einer genügend hohen Spannung am Eingang&lt;br /&gt;
durch. Die Schaltvorgänge können sehr schnell erfolgen, mehrere Kilohertz sind bei&lt;br /&gt;
unserer Anwendung möglich.&lt;br /&gt;
So kann man also schon mal die Drehrichtung einstellen. Und wie bekommt man den&lt;br /&gt;
Motor nun schneller bzw. langsamer? Ein Elektromotor dreht umso schneller, je höher&lt;br /&gt;
die angelegte Spannung ist. Die Drehzahl kann also über die Spannung eingestellt&lt;br /&gt;
werden - und genau dazu können wir die H-Brücke auch verwenden!&lt;br /&gt;
Die Abbildung verdeutlicht das Prinzip&lt;br /&gt;
nach dem wir vorgehen können.&lt;br /&gt;
Wir erzeugen&lt;br /&gt;
ein Rechtecksignal fester Frequenz,&lt;br /&gt;
bei dem wir das sog. Tastverhältnis&lt;br /&gt;
verändern. Mit &amp;quot;Tastverhältnis&amp;quot; ist das&lt;br /&gt;
Verhältnis von der eingeschalteten zur&lt;br /&gt;
ausgeschalteten Zeit des Signals gemeint.&lt;br /&gt;
Am Motor liegt dann effektiv eine niedrigere,&lt;br /&gt;
mittlere Gleichspannung an, die dem&lt;br /&gt;
Tastverhältnis entspricht. In der Grafik ist&lt;br /&gt;
dies durch eine rote Linie (Ug) und die roten&lt;br /&gt;
Flächen verdeutlicht. Wenn z.B. eine&lt;br /&gt;
Spannung von 7 Volt von den Akkus an&lt;br /&gt;
den Motortreibern anliegt, und diese mit&lt;br /&gt;
einem Tastverhältnis von 50% angesteuert werden, würde die mittlere Spannung in&lt;br /&gt;
etwa bei der Hälfte, also 3.5V liegen! Das stimmt real nicht ganz, aber so kann man&lt;br /&gt;
es sich schon gut und einfach vorstellen.&lt;br /&gt;
Das Antriebssystem ist dank der hohen Untersetzung (~ 1:72) relativ stark und so&lt;br /&gt;
kann der RP6 viel schwerere Lasten tragen als es z.B. der kleine Roboter ASURO&lt;br /&gt;
könnte. Allerdings steigt mit zunehmendem Gewicht natürlich auch der Energiebedarf&lt;br /&gt;
und die Akkus werden schneller leer sein ...&lt;br /&gt;
Im Vergleich mit einem ferngesteuerten Rennwagen o.ä. könnte man denken der RP6&lt;br /&gt;
sei langsam - stimmt auch - das ist jedoch absichtlich so! Der Roboter wird von einem&lt;br /&gt;
Mikrocontroller gesteuert und wenn der Programmierer einen Fehler bei der Programmierung&lt;br /&gt;
gemacht hat, wäre es ungünstig mit 10km/h vor die Wand zu prallen! Bei&lt;br /&gt;
dem eher gemächlichen Tempo des RP6 passiert aber nicht so schnell etwas und nebenbei&lt;br /&gt;
haben die Sensoren mehr Zeit die Umgebung auf Hindernisse zu untersuchen.&lt;br /&gt;
Und da wäre natürlich noch der Vorteil der höheren Belastbarkeit und der viel genaueren&lt;br /&gt;
Geschwindigkeitsregelung!&lt;br /&gt;
&lt;br /&gt;
===Stromversorgung (POWER SUPPLY)===&lt;br /&gt;
[[Bild:RP6_IC1.jpg|thumb]]&lt;br /&gt;
Natürlich benötigt ein Roboter Energie. Diese trägt der RP6 gespeichert in 6 Akkus mit&lt;br /&gt;
sich herum. Die Laufzeit ist durch die Kapazität der Akkus eingeschränkt, denn auch&lt;br /&gt;
wenn die Elektronik verhältnismäßig wenig Energie benötigt, schlucken die Motoren je&lt;br /&gt;
nach Belastung doch ziemlich viel.&lt;br /&gt;
&lt;br /&gt;
Damit die Akkus möglichst lange halten und der Roboter nicht ständig Pause machen&lt;br /&gt;
muss, sollte man ihm daher etwas größere Energiespeicher mit etwa 2500mAh gönnen.&lt;br /&gt;
Kleinere mit 2000mAh oder mehr funktionieren aber auch. Mit guten Akkus kann&lt;br /&gt;
man 3 bis 6 Stunden oder mehr Laufzeit erreichen, abhängig von der Betriebszeit der&lt;br /&gt;
Motoren, deren Belastung und Qualität der Akkus. Die 6 Akkus die notwendig sind,&lt;br /&gt;
haben insgesamt eine Nennspannung von 6x 1.2V = 7.2V. Im Blockdiagramm ist dies&lt;br /&gt;
mit &amp;quot;UB&amp;quot; (= &amp;quot;U-Battery&amp;quot;, U ist der Formelbuchstabe für Spannung) bezeichnet. „Nennspannung&amp;quot;,&lt;br /&gt;
weil sich die Spannung mit der Zeit stark verändert. Voll aufgeladen können&lt;br /&gt;
die Akkus im Leerlauf insgesamt bis zu 8.5V liefern! Diese Spannung sinkt während&lt;br /&gt;
der Entladung ab und schwankt auch je nach Belastung (Motoren an oder aus,&lt;br /&gt;
schnell langsam etc. - wie stark die Spannung schwankt, hängt auch von der Qualität&lt;br /&gt;
der verwendeten Akkus ab. Der Innenwiderstand ist hier die kritische Größe).&lt;br /&gt;
Das ist für Messungen von Sensorwerten und ähnlichem natürlich nicht ohne weiteres&lt;br /&gt;
brauchbar. Noch wichtiger ist jedoch, dass viele der verwendeten Komponenten wie&lt;br /&gt;
z.B. der Mikrocontroller nur auf 5V oder weniger Betriebsspannung ausgelegt sind und&lt;br /&gt;
bei so hohen Spannungen zerstört würden. Die Akku Spannung muss also auf einen&lt;br /&gt;
definierten Wert heruntergeregelt und stabilisiert werden!&lt;br /&gt;
Das übernimmt ein 5V Spannungsregler, der einen Strom von&lt;br /&gt;
maximal 1.5A liefern kann (s. Abb.). Bei 1.5A würde er jedoch&lt;br /&gt;
ziemlich viel Wärme abgeben. Es gibt daher eine große Kühlfläche&lt;br /&gt;
auf der Platine an die der Regler festgeschraubt ist. Über 1A&lt;br /&gt;
sollte der Regler trotz Kühlung besser nur kurzzeitig (also wenige&lt;br /&gt;
Sekunden) belastet werden, wenn man nicht noch einen zusätzlichen&lt;br /&gt;
großen Kühlköper draufschraubt.&lt;br /&gt;
&lt;br /&gt;
Es wird empfohlen, 800mA Dauerlast nicht zu überschreiten! Bei&lt;br /&gt;
so einer Belastung und zusammen mit den Motoren wären die&lt;br /&gt;
Akkus auch recht schnell leer. Im normalen Betrieb ohne ein Erweiterungsboard&lt;br /&gt;
nimmt der Roboter übrigens nicht mehr als 40mA auf (ausser wenn&lt;br /&gt;
das IRCOMM sendet), also überhaupt kein Problem für den Regler und man hat noch&lt;br /&gt;
genug Reserven für die Erweiterungsmodule, die meistens auch nicht mehr als 50mA&lt;br /&gt;
aufnehmen sofern keine Motoren, große LEDs o.ä. daran angeschlossen sind.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Umbau-Optionen==&lt;br /&gt;
Hier soll beschrieben werden, welche Umbau-Optionen es für die RP6 Base gibt. Im Text gibt es Verweise auf den Schaltplan des RP6 (RP6_MAINBOARD.PDF) in der Form: (SP2 B1: Bauteil). Dies bedeutet, dass man das Bauteil auf Blatt 2 des RP6-Schaltplans im Feld B1 finden kann. Beispielhaft sind im folgenden Text Bestell-Nummern der Firma [http://www.conrad.de/ce/ CONRAD] genannt. Natürlich kann man die Teile auch bei anderen Versendern beziehen.&lt;br /&gt;
&lt;br /&gt;
Bei den Materialangaben ist öfter die Rede von &amp;quot;Steckbuchsen mit Litze&amp;quot;. Diese Steckbuchsen mit angelöteter Litze können auf die ein- oder zweireihigen Stiftleisten aufgesteckt werden. Leider gibt es sie nicht (mehr) fertig konfektioniert bei CONRAD. Die einreihigen Steckbuchsen (RM 2,54mm) kann man aber z.B. bei [http://www.elv.de/output/controller.aspx ELV] bekommen: 2-polig (68-016635), 3-polig (68-022503) und 5-polig (68-023073). An sie muss man dann noch Litzen in der entsprechenden Länge selbst anlöten.&lt;br /&gt;
&lt;br /&gt;
===Elko für den IR-Empfänger===&lt;br /&gt;
[[Bild:RP6_C29_TSOP.JPG|thumb|RP6 C29 TSOP]]&lt;br /&gt;
Zur Spannungsstabilisierung kann ein Elko (C29; SP2 E1: C29*) am TSOP 34836 eingelötet werden.&lt;br /&gt;
&lt;br /&gt;
Normalerweise ist dieser Elko nicht erforderlich.&lt;br /&gt;
&lt;br /&gt;
Man braucht dazu:&lt;br /&gt;
* Einen Elektrolyt-Kondensator stehend 10 uF / 16V (C29); RM 2,5mm (445631)&lt;br /&gt;
&lt;br /&gt;
Der Elko kann auch eine geringere Kapazität als 10 uF haben (1 uF bis 4,7 uF reichen auch). Man lötet den Elko auf seinen Platz. Bitte auf die Polung achten: Der Minuspol zeigt nach vorn (in Fahrtrichtung des RP6).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Anschlüsse===&lt;br /&gt;
Hier wird aufgelistet, wo man auf dem RP6 Mainboard Anschlüsse nutzen kann, um sie z.B. zu weiteren Sensoren, zum USRBUS oder (weniger empfehlenswert!) direkt zu EPs oder Erweiterungsplatinen (M32, CCPRO M128) zu führen.&lt;br /&gt;
&lt;br /&gt;
====Analoge Sensoren an ADC0/1====&lt;br /&gt;
[[Bild:RP6_ADC01.JPG|thumb|RP6 ADC0/1]]&lt;br /&gt;
&lt;br /&gt;
Wenn man bis zu zwei analoge Sensoren (z.B. IR-Distanz-Mess-Sensoren Sharp GP2Y0A02YK 185364) direkt an den RP6 anschließen möchte, dann gibt es da zwei 3-polige Kontakte, beschriftet mit VDD/GND/ADCx (x = 0..1). Hier kann man 3-polige Stiftleisten auflöten, an die dann die Sensoren angeschlossen werden.&lt;br /&gt;
&lt;br /&gt;
Man braucht dazu:&lt;br /&gt;
* 1-reihige Stiftleiste RM 2,54mm (z.B. 36-polig 732478)&lt;br /&gt;
* Zwei Keramik-Vielschicht-Kondensatoren 100nF (C27, C28); RM 2,54mm (453099)&lt;br /&gt;
* ENTWEDER einen Elektrolyt-Kondensator stehend 220 uF / 16V (C26); RM 3,5mm (445903)&lt;br /&gt;
* ODER einen Elektrolyt-Kondensator stehend 470 uF / 16V (C26); RM 3,5mm (446211)&lt;br /&gt;
* Zwei 3-polige Steckbuchsen mit Litze zum Anschluß der Sensoren&lt;br /&gt;
&lt;br /&gt;
Man trennt nun von der 1-reihigen Stiftleiste zweimal 3 Kontakte ab und lötet sie auf die weiß umrahmten Kontakte (VDD/GND/ADCx; SP2 B1: ADC0, ADC1), anschließend C27, C28 (SP2 A1: C27*, C28*) auf ihre Plätze und zum Schluß den Elko 220 uF oder 470 uF (C26; SP2 A1: C26*). Der Elko ist nur bei Sensoren mit hohem Strombedarf notwendig, siehe dazu auch Anleitung des RP6, Seite 136! Beim Elko auf die Polung achten: Er muss so sitzen, dass er mit seinem Pluspol in Fahrtrichtung des RP6 (nach vorn) schaut.&lt;br /&gt;
&lt;br /&gt;
Die Sensoren lötet man an die Litzen der 3-poligen Steckbuchsen und steckt diese auf die neuen Kontakte.&lt;br /&gt;
&lt;br /&gt;
Da manche Sensoren einen höheren Stromverbrauch haben, kann man die Stromversorgung an den VDD-Pins der ADC0/1-Stecker abschaltbar machen oder eine separate +5V-Spannung einspeisen. Siehe dazu den Abschnitt &amp;quot;Trennstellen - Getrennte Stromversorgung für ADC0/1&amp;quot; weiter unten!&lt;br /&gt;
&lt;br /&gt;
====ISP (In System Programming)====&lt;br /&gt;
Der ATMEGA32 des RP6 wird standardmäßig über den PROG/UART Stecker programmiert. Dazu befindet sich im Prozessor ein Bootloader-Programm. Wenn man stattdessen oder zusätzlich die ISP-Programmierung mit einem dafür geeigneten ISP-Programmier-Adapter nutzen will, kann man den Adapter an einen (noch einzulötenden) Wannenstecker auf dem RP6 anschließen.&lt;br /&gt;
Vorher sind aber ein paar &amp;quot;Umbauarbeiten&amp;quot; erforderlich.&lt;br /&gt;
&lt;br /&gt;
Man braucht dazu:&lt;br /&gt;
* 1-reihige Stiftleiste RM 2,54mm (z.B. 36-polig 732478)&lt;br /&gt;
* Wannenstecker 2x5-polig gerade RM 2,54mm (z.B. [http://www.reichelt.de./ Reichelt] WSL 10G)&lt;br /&gt;
* Eine SMD-Diode LL 4148 (140902)&lt;br /&gt;
* Eine Codierbrücke (z.B. aus Set 742902)&lt;br /&gt;
&lt;br /&gt;
Zwischen dem XBUS-Stecker und C13 befinden sich 10 Lötpunkte für den ISP-Anschluß, auf die der Wannenstecker gelötet wird, und drei Lötpunkte (beschriftet mit ISP* - BOOTLOAD; SP2 A3: YR1..3), auf die eine 3-polige Stiftleiste gelötet werden muss.&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_ISP.JPG|RP6 ISP]]&lt;br /&gt;
&lt;br /&gt;
Vorher muss eine kurze Leiterbahn zwischen den Lötpunkten BOOTLOAD aufgetrennt werden. Die Leiterbahn befindet sich auf der Lötseite der Platine und muss mit einem scharfen Messer oder einem speziellen Leiterbahn-Unterbrecher zwischen den beiden Lötpunkten unterbrochen werden. Man sollte anschließend mit einem Widerstandsmeßgerät nachmessen: Es sollte keine Verbindung mehr zwischen den Lötpunkten bestehen.&lt;br /&gt;
Man trennt dann von der 1-reihigen Stiftleiste 3 Kontakte ab und lötet sie auf die beschriebenen drei Lötpunkte.&lt;br /&gt;
&lt;br /&gt;
Zum Schluss lötet man noch die Diode LL 4148 (SP2 B3: D11*) auf ihre Lötflächen zwischen R3 und C6. Die Kathode (Strich) der Diode kommt nach vorn (in Fahrtrichtung RP6, bzw. liegt rechts von R3). Wenn man jetzt eine Codierbrücke auf die mit &amp;quot;BOOTLOAD&amp;quot; beschrifteten Pins steckt, bleibt alles unverändert: Die Programmierung erfolgt weiter über den PROG/UART-Stecker mithilfe des Bootloaders im Prozessor.&lt;br /&gt;
Wird die Codierbrücke in Stellung &amp;quot;ISP*&amp;quot; umgesteckt, kann der Prozessor mit ISP programmiert werden.&lt;br /&gt;
&lt;br /&gt;
Vorsicht: Das Bootloader-Programm kann dabei zerstört werden! Es müssen zusätzlich Fusebits des ATMEGA32 verändert werden. Dabei kann der Prozessor im schlimmsten Fall nicht mehr ansprechbar sein. Man sollte diesen Umbau und die ISP-Programmierung nur machen, wenn man genau weiß, was man macht!&lt;br /&gt;
&lt;br /&gt;
Eine Kopie des Bootloaders und eine Kurzanleitung zum Einstellen der Fusebits gibt es hier:&lt;br /&gt;
[http://www.arexx.com/rp6/downloads/RP6BASE_BOOTLOADER.zip RP6_BOOTLOADER]&lt;br /&gt;
&lt;br /&gt;
====IO1..IO4====&lt;br /&gt;
[[Bild:RP6_IO1-4.JPG|thumb|RP6 IO1..IO4]]&lt;br /&gt;
Die Anschlüsse IO1 bis IO4 (SP2 E3: IO1..4) steuern bereits die Status-LEDs 1, 2, 4 und 5 an. Trotzdem kann man sie auch noch mit leichten Einschränkungen als I/O-Pins benutzen. Dazu lötet man zweimal 2 Pins einer 1-reihigen Stiftleiste RM 2,54mm (z.B. 36-polig 732478) auf die IO1/2 und IO3/4 Lötpunkte.&lt;br /&gt;
Hier eine Tabelle, die die Port-Pins zeigt, die IO1..IO4 zugeordnet sind:&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |IO&lt;br /&gt;
 |Status-LED&lt;br /&gt;
 |Port-Pin&lt;br /&gt;
 |-&lt;br /&gt;
 |1&lt;br /&gt;
 |SL1&lt;br /&gt;
 |PC4&lt;br /&gt;
 |-&lt;br /&gt;
 |2&lt;br /&gt;
 |SL2&lt;br /&gt;
 |PC5&lt;br /&gt;
 |-&lt;br /&gt;
 |3&lt;br /&gt;
 |SL4&lt;br /&gt;
 |PB7&lt;br /&gt;
 |-&lt;br /&gt;
 |4&lt;br /&gt;
 |SL5&lt;br /&gt;
 |PB1&lt;br /&gt;
 |-&lt;br /&gt;
|}&lt;br /&gt;
Wie können nun IO1..IO4 genutzt werden?&lt;br /&gt;
&lt;br /&gt;
Als ...&lt;br /&gt;
* Eingang, z.B. für zusätzliche Tastschalter/Bumper&lt;br /&gt;
* Ausgang, z.B. zur Ansteuerung von Treiberstufen, low-current LEDs, ...&lt;br /&gt;
&lt;br /&gt;
Wird ein Anschluß IOx als Eingang verwendet, muss ein Widerstand von 470 Ohm in Reihe mit dem Taster an VDD eingebaut werden, zusätzlich ein Pulldown-Widerstand 100 kOhm. Diese Beschaltung zeigen z.B. an SL6 die Widerstände R43 und R46 (SP2 E4: R43, R46).&lt;br /&gt;
&lt;br /&gt;
Als Ausgang geschaltet sollte an IOx kein hoher Strom entnommen werden: 10mA sind max. zu empfehlen!&lt;br /&gt;
&lt;br /&gt;
====USRBUS====&lt;br /&gt;
Die 14 Kontakte der beiden USRBUS-Stecker sind auf dem RP6 nirgendwo angeschlossen, sondern können über die Lötpunkte Y1..Y14 mit beliebigen Punkten auf dem Mainboard verbunden werden.&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_USRBUS.JPG|thumb|RP6 USRBUS]]&lt;br /&gt;
&lt;br /&gt;
Ich würde auf Y1..Y14 eine Stiftleiste löten, damit die USRBUS-Belegung geändert werden kann.&lt;br /&gt;
&lt;br /&gt;
Man braucht dazu:&lt;br /&gt;
* 2-reihige Stiftleiste RM 2,54mm (z.B. 2x36-polig 742007)&lt;br /&gt;
* Einige Steckbuchsen mit Litze&lt;br /&gt;
&lt;br /&gt;
Man trennt von der 2-reihigen Stiftleiste 2x7 Kontakte ab und lötet sie auf die Punkte Y1..Y14 (SP4 E34: Y1..14, Y1'..Y14') neben den beiden Wannensteckern USRBUS1 (vorn) und USRBUS2 (hinten). Wird der RP6 über Flachkabel mit einem USRBUS-Stecker auf einer RP6 Experimentierplatine (EP) und/oder mit einer Erweiterungsplatine (M32, CCPRO M128) verbunden, dann hat man mit allen mit dem USRBUS verbundenen Platinen eine direkte 14-polige Verbindung,- eben den &amp;quot;User Bus&amp;quot;. Den kann man dann nutzen, wie man will. Auf dem RP6 kann man mit Steckbuchsen die Pins Y1..Y14 mit anderen Pins verbinden.&lt;br /&gt;
&lt;br /&gt;
Beispiel: Verbindet man den Pin &amp;quot;ADC0&amp;quot; mit Y1 des USRBUS1, dann steht der Eingang ADC0 auf allen an den USRBUS1 angeschlossenen Platinen auf dem vorderen Platinenstapel an Y1 zur Verfügung. Man braucht also diesen Eingang nicht über ein eigenes Kabel auf eine EP zu führen, sondern kann dazu den USRBUS nehmen. Dadurch bleibt der Gesamtaufbau auf dem RP6 übersichtlich und komplett trennbar (man braucht nur die Stecker XBUS und USRBUS abzuziehen!).&lt;br /&gt;
&lt;br /&gt;
Wichtig:&lt;br /&gt;
* Man sollte gut dokumentieren, wie man den USRBUS am RP6 (vorn und hinten getrennt!), auf EPs und der M32/M128 benutzt! Sonst kann es bei einer anderen Anordnung von EPs zu USRBUS Konflikten/Kurzschlüssen kommen.&lt;br /&gt;
* Der USRBUS1- und der USRBUS2-Stecker sind auf dem RP6 NICHT miteinander verbunden.&lt;br /&gt;
&lt;br /&gt;
Einen Vorschlag für die Belegung des USRBUS1 (vorn) gibt es z.B. &lt;br /&gt;
[http://www.roboternetz.de/phpBB2/viewtopic.php?t=32549 hier] oder &lt;br /&gt;
[http://www.roboternetz.de/community/showthread.php/47102-Sensor-anschließen?p=453061&amp;amp;viewfull=1#post453061 da.]&lt;br /&gt;
&lt;br /&gt;
====Start/Stop Button====&lt;br /&gt;
[[Bild:RP6_ST.JPG|thumb|RP6 ST]]&lt;br /&gt;
Am mittleren Lochrasterfeld links finden sich zwei Lötpunkte ST1, ST2 (SP2 D2: ST1, ST2), an die weitere Start/Stop Taster (NO, normal offen) parallel zum Taster auf dem RP6 Mainboard angeschlossen werden können.&lt;br /&gt;
&lt;br /&gt;
Zum Anschluß kann man auch Stiftleisten auflöten. ST1, ST2 könnte man auch mit dem USRBUS1 verbinden, wenn man den RP6 z.B. von einer EP aus zurücksetzen möchte.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Serielle Schnittstelle====&lt;br /&gt;
[[Bild:RP6_RST.JPG|thumb|RP6 RST]]&lt;br /&gt;
Neben dem USRBUS1 Stecker befinden sich 5 Lötpunkte mit den Signalen RST, TX, RX, GND, VDD (SP4 AB5: YRX, YTX, YMRESET, YVDD). Hier kann z.B. eine 5-polige Stiftleiste aufgelötet werden, um einen Anschluß an die serielle Schnittstelle zu ermöglichen.&lt;br /&gt;
&lt;br /&gt;
Von diesen 5 Lötpunkten könnte z.B. auch [http://www.roboternetz.de/phpBB2/viewtopic.php?t=32549 so] eine Verbindung zum benachbarten USRBUS1 hergestellt werden, um die serielle Schnittstelle des RP6 auf EPs zu führen.&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;
&lt;br /&gt;
====I2C-Schnittstelle====&lt;br /&gt;
[[Bild:RP6_I2C.JPG|thumb|RP6 I2C]]&lt;br /&gt;
Neben dem XBUS2 Stecker finden sich 5 Lötpunkte mit den Signalen der I2C-Schnittstelle (SP4 D12: Stecker I2C). Dies sind: VDD (Pin 1), GND, SDA, SCL, INT1 (Pin 5). Hier kann z.B. eine 5-polige Stiftleiste aufgelötet werden, um einen Anschluß an die I2C-Schnittstelle zu ermöglichen.&lt;br /&gt;
&lt;br /&gt;
Von diesen 5 Lötpunkten könnte z.B. auch eine Verbindung zum USRBUS1 oder USRBUS2 hergestellt werden, um die I2C-Schnittstelle des RP6 auf EPs zu führen, allerdings hat man SCL, SDA, INT1 ja auch schon am XBUS zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Interrupt-Leitungen====&lt;br /&gt;
[[Bild:RP6_INTx.JPG|thumb|RP6 INTx]]&lt;br /&gt;
Die Interrupt-Leitungen INTU, INT1..3, MRESET (SP4 D34: MRESET, INT1..3, INTU) sind an 5 Lötpunkten neben dem XBUS1 Stecker zu kontaktieren. Hier kann natürlich auch eine 5-polige Stiftleiste aufgelötet werden. In der Regel wird man diese Anschlüsse nicht brauchen, weil sie schon auf dem XBUS zur Verfügung stehen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====VDD/GND/+UB Anschluß====&lt;br /&gt;
[[Bild:RP6_VDDGNDUB.JPG|thumb|RP6 VDD GND +UB]]&lt;br /&gt;
In der Nähe von C4 im hinteren Bereich des Mainboards finden sich Lötpunkte (SP4 E12: YVDDx, YGNDx; SP4 D2 YUBx), an denen man VDD, GND und +UB finden kann.&lt;br /&gt;
&lt;br /&gt;
Wenn man höhere Ströme an VDD (z.B. für Servos) oder +UB (z.B. für einen anderen IRCOMM-Sender oder einen DC-Motor) entnehmen möchte, empfehlen sich diese Lötpunkte, auf die man auch Stiftleisten löten kann.&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;
====EXT Anschluß====&lt;br /&gt;
[[Bild:RP6_EXT.jpg|thumb|RP6 EXT Anschluß]]&lt;br /&gt;
Am hinteren Rand der RP6 Hauptplatine gibt es eine Reihe von 8 Lötpunkten. Dies ist der EXT Anschluß (SP1 C23: Stecker EXT):&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |Pin&lt;br /&gt;
 |Name&lt;br /&gt;
 |Beschreibung&lt;br /&gt;
 |-&lt;br /&gt;
 |1&lt;br /&gt;
 |GND&lt;br /&gt;
 |RP6 und Akku Minuspol (GND)&lt;br /&gt;
 |-&lt;br /&gt;
 |2&lt;br /&gt;
 |CHRG&lt;br /&gt;
 |Anschluß (+) für ext. Ladegerät, identisch mit Pluspol der Ladebuchse (CHARGER, Pin 1). Ladung nur möglich, wenn S1 AUS ist!&lt;br /&gt;
 |-&lt;br /&gt;
 |3&lt;br /&gt;
 |CHRG&lt;br /&gt;
 |wie Pin 2!&lt;br /&gt;
 |-&lt;br /&gt;
 |4&lt;br /&gt;
 | +BAT&lt;br /&gt;
 |Akku Pluspol über Sicherung F1&lt;br /&gt;
 |-&lt;br /&gt;
 |5&lt;br /&gt;
 | +BAT&lt;br /&gt;
 |wie Pin 4!&lt;br /&gt;
 |-&lt;br /&gt;
 |6&lt;br /&gt;
 | +UB&lt;br /&gt;
 |RP6 +UB (+7,2V=, Bereich min. +5,5 bis max. +10V=)&lt;br /&gt;
 |-&lt;br /&gt;
 |7&lt;br /&gt;
 | +UB&lt;br /&gt;
 |wie Pin 6!&lt;br /&gt;
 |-&lt;br /&gt;
 |8&lt;br /&gt;
 |GND&lt;br /&gt;
 |wie Pin 1!&lt;br /&gt;
 |-&lt;br /&gt;
|}&lt;br /&gt;
Man kann hier eine JST XH Stiftleiste gerade, 8-polig, RM 2,5mm ([http://www.conrad.de/ce/de/product/740105/Stiftleiste-gerade-RM-25-mm-Serie-XH-Rastermass-25-mm-Pole-8-Nennstrom-3-A-B8B-XH-A-LFSN-JST-Inhalt-1-St 740105]) auflöten.&lt;br /&gt;
&lt;br /&gt;
Wozu kann man diesen Anschluß nutzen?&lt;br /&gt;
&lt;br /&gt;
Der wesentliche Sinn des EXT Anschlusses besteht darin, andere Arten der Stromversorgung und der Akkuladung zu ermöglichen. Normalerweise schaltet man den RP6 mit S1 an und aus. In Stellung AUS kann der Akku geladen werden, indem man ein Ladegerät an die CHARGER Buchse anschließt. Alternativ kann man das Ladegerät mit seinem Pluspol auch an CHRG (Pins 2, 3) anschließen. Siehe auch den Abschnitt &amp;quot;Trennstellen - EXT Anschluß: Andere Stromversorgung&amp;quot; weiter unten!&lt;br /&gt;
&lt;br /&gt;
An +BAT (Pins 4, 5) kann man direkt (ohne Unterbrechung durch S1) Strom aus dem Akku entnehmen. Die Grenze des Stroms bestimmt die Sicherung F1 (2,5A). Eine weitere Möglichkeit besteht darin, über diesen Anschluß den Akku auch mit einem geeigneten Ladegerät zu LADEN. Hierbei muss man aber darauf achten, dass S1 AUSgeschaltet ist, weil sonst der RP6 über +UB eine unzulässig hohe Spannung bekommen könnte. Wenn man den Akku mit 6 Mignonzellen im RP6 nicht nutzen will (der Akku-Halter bleibt leer!), sondern nur einen externen Akku, wäre der auch mit seinem Pluspol an +BAT über eine eigene Sicherung (2,5A träge) anzuschließen.&lt;br /&gt;
&lt;br /&gt;
+UB (+7,2V) ist die Versorgungsspannung des RP6 (kommt vom Akku-Pluspol über die Sicherung F1 und Schalter S1!). Mit +UB werden die H-Brücken (Motoransteuerung) direkt und die RP6 &amp;quot;Elektronik&amp;quot; über den 5V-Spannungswandler (IC1; SP1 D3: IC1) versorgt (= VDD). An +UB könnte man den RP6 direkt mit einer Spannung von +7,2V versorgen (Absicherung nicht vergessen!), dazu muss S1 AUSgeschaltet sein, damit es keine Konflikte mit dem eingebauten Akku gibt.&lt;br /&gt;
&lt;br /&gt;
Den EXT Anschluß kann man damit nutzen für:&lt;br /&gt;
* Externes Ladegerät&lt;br /&gt;
* Externen Akku&lt;br /&gt;
* Externe Stromversorgung ohne Akku&lt;br /&gt;
* Direkte Stromentnahme aus dem Akku&lt;br /&gt;
* Ergänzungsladung mit Solarzelle&lt;br /&gt;
* Autonome Akkuladung (Ladestation mit Kontakten, Induktionsladung ...)&lt;br /&gt;
* ...&lt;br /&gt;
&lt;br /&gt;
Man sollte gewisse Elektronik-Kenntnisse haben, wenn man die Spannungsversorgung des RP6 verändert. VOR irgendwelchen Veränderungen seht euch auch zuerst den Schaltplan des RP6 (SP1) genau an!&lt;br /&gt;
&lt;br /&gt;
===Mess-/Kontaktpunkte===&lt;br /&gt;
Hier geht es um Kontaktpunkte, an denen man z.B. den Logik-Pegel (High/Low) oder eine analoge Spannung messen kann. Natürlich kann man die Signale auch zur Weiterleitung auf eine EP kontaktieren, dies wird man aber normalerweise nicht brauchen.&lt;br /&gt;
&lt;br /&gt;
====UBAT====&lt;br /&gt;
[[Bild:RP6_UBAT.JPG|thumb|RP6 UBAT]]&lt;br /&gt;
In der Mitte des Mainboards befindet sich ein Kontaktpunkt UBAT (SP1 E1: YUBAT). Dies ist ADC7 des RP6 Microcontrollers.&lt;br /&gt;
&lt;br /&gt;
Man kann hier die analoge Spannung (gegen GND) messen, die vom +UB-Spannungssensor geliefert wird.&lt;br /&gt;
&lt;br /&gt;
Die Spannung ist:&lt;br /&gt;
 UBAT = +UB / 2&lt;br /&gt;
Da der Spannungsteiler (SP1 D12: R1, R2) des +UB-Spannungssensors nicht aus Präzisionswiderständen besteht, kann man für den eigenen RP6 einen Korrekturfaktor berechnen, wenn UBAT deutlich von +UB / 2 (+ UB z.B. gemessen am EXT Stecker, Pins 6 u. 7) abweicht. Damit kann man +UB sehr viel genauer bestimmen.&lt;br /&gt;
&lt;br /&gt;
====ACS====&lt;br /&gt;
[[Bild:RP6_ACS_TSOP.JPG|thumb|RP6 ACS TSOP]]&lt;br /&gt;
Hinter dem TSOP (IC3) befindet sich der Kontaktpunkt ACS (SP2 E1: ACS).&lt;br /&gt;
&lt;br /&gt;
Dies ist der Ausgang des TSOP bzw. Eingang PB2 des RP6 Microcontrollers. Man kann hier das Ausgangssignal des IR-Empfängers abnehmen, z.B. um es mit einem Oszilloskop sichtbar zu machen.&lt;br /&gt;
&lt;br /&gt;
Rechts neben dem TSOP kann man noch die 3 Kontaktpunkte ACS_R, ACS_P und ACS_L (SP2 E2: ACS_P, ACS_R, ACS_L) des ACS-IR-Senders finden.&lt;br /&gt;
&lt;br /&gt;
Folgende Tabelle zeigt die Verbindungen:&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |Kontakt&lt;br /&gt;
 |Microcontroller-Portpin&lt;br /&gt;
 |SP-Verbindung&lt;br /&gt;
 |ACS-IR-Sendediode&lt;br /&gt;
 |-&lt;br /&gt;
 |ACS_P&lt;br /&gt;
 |über R8: ACS_PWRH (PB3), über R9: ACS_PWR (PD6)&lt;br /&gt;
 |SP2: 3&lt;br /&gt;
 |Anoden D1, D2&lt;br /&gt;
 |-&lt;br /&gt;
 |ACS_R&lt;br /&gt;
 |ACS_R (PC7)&lt;br /&gt;
 |SP2: 2&lt;br /&gt;
 |Kathode D1&lt;br /&gt;
 |-&lt;br /&gt;
 |ACS_L&lt;br /&gt;
 |ACS_L/MISO (PB6)&lt;br /&gt;
 |SP1: 5&lt;br /&gt;
 |Kathode D2&lt;br /&gt;
 |-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====IRC====&lt;br /&gt;
[[Bild:RP6_IRC.JPG|thumb|RP6 IRC]] [[Bild:RP6_IRC3.JPG|thumb|RP6 IRC3]]&lt;br /&gt;
Im der Nähe von C13 befinden sich die Lötpunkte IRC, IRC+, IRC- und IRC3 (SP2 D2: YIRC; SP2 CD2: IRC+/-; SP2 C2: IRC3). Zusammen mit der Trennstelle IRC (siehe Abschnitt &amp;quot;Trennstellen - IRC&amp;quot; weiter unten!) kann man diese Kontaktstellen im Umfeld des IRCOMM-Sendedioden Treibers IRLML2502PBF (SP2 CD12: Q5) finden. Am Kontaktpunkt IRC findet sich der Eingang des Treibers bzw. Ausgang PD7 des RP6 Microcontrollers. IRC+, IRC- sind die Kontaktpunkte, an denen die IRCOMM-Sendedioden D3, D4 in Reihe auf der Sensorplatine angeschlossen sind (IRC+ = Anode). IRC3 ist verbunden mit dem Trennstellen-Lötpunkt IRC1 und liegt bei geschlossener Trennstelle IRC an +UB.&lt;br /&gt;
&lt;br /&gt;
Was läßt sich mit diesen Kontaktpunkten machen:&lt;br /&gt;
* Der IRCOMM-Sender ist der zweitgrößte Stromverbraucher des RP6 (nach dem Antrieb). An IRC3 kann daher eine eigene Stromversorgung für die IRCOMM-Sendedioden angeschlossen werden. Dazu muss die Trennstelle IRC zwischen ihren Lötpunkten IRC1, IRC2 aufgetrennt werden.&lt;br /&gt;
* An IRC+, IRC- könnten andere/weitere IRCOMM-Sendedioden angeschlossen werden (Anode an IRC+). Wenn der Vorwiderstand R6 (SP2 C2: R6) der Sendedioden dann nicht mehr paßt (bezügl. Leistung und/oder Widerstandswert), können neue leistungsfähigere IRCOMM-Sendedioden zwischen IRC3 und IRC- (Anode an IRC3) mit einem dafür geeigneten Vorwiderstand angebracht werden.&lt;br /&gt;
&lt;br /&gt;
====LS====&lt;br /&gt;
[[Bild:RP6_LS.JPG|thumb|RP6 LS]]&lt;br /&gt;
Die beiden Lötpunkte LS_L und LS_R (SP2 B12: LS_L, LS_R) neben R7 vorn auf dem Mainboard sind die Ausgänge der Helligkeitssensoren (links und rechts) bzw. die ADC-Eingänge ADC3 und ADC2 des RP6 Microcontrollers.&lt;br /&gt;
&lt;br /&gt;
Hier kann man die Spannungen messen, die den Helligkeitswerten entsprechen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====BP, S====&lt;br /&gt;
[[Bild:RP6_BP_S.JPG|thumb|RP6 BP S]]&lt;br /&gt;
Die Messpunkte BPL, BPR und der Kontaktpunkt S (SP2 E2: S; SP2 E3: BPR; SP2 E4: BPL) befinden sich am vorderen Platinenrand. BPL und BPR sind die Kontakte der Bumper. S ist eine nicht genutzte Verbindung zwischen dem Mainboard und der Sensorplatine, die über die Verbindung SP1, Pin 3, geführt wird (siehe folgende Tabelle!).&lt;br /&gt;
&lt;br /&gt;
Hier eine Tabelle mit der Belegung der 90°-Winkelverbindung SP1, SP2 zwischen dem RP6 Mainboard und der Sensorplatine: &lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |Pin&lt;br /&gt;
 |SP1&lt;br /&gt;
 |SP2&lt;br /&gt;
 |-&lt;br /&gt;
 |1&lt;br /&gt;
 |LS_L  --- Light Sensor Left&lt;br /&gt;
 |IRC-  --- IRCOMM-&lt;br /&gt;
 |-&lt;br /&gt;
 |2&lt;br /&gt;
 |BPL   --- Bumper Left&lt;br /&gt;
 |ACS_R --- ACS Right&lt;br /&gt;
 |-&lt;br /&gt;
 |3&lt;br /&gt;
 |S     --- Free for all&lt;br /&gt;
 |ACS_P --- ACS Power&lt;br /&gt;
 |-&lt;br /&gt;
 |4&lt;br /&gt;
 |GND&lt;br /&gt;
 |VDD&lt;br /&gt;
 |-&lt;br /&gt;
 |5&lt;br /&gt;
 |ACS_L --- ACS Left&lt;br /&gt;
 |BPR   --- Bumper Right&lt;br /&gt;
 |-&lt;br /&gt;
 |6&lt;br /&gt;
 |IRC+  --- IRCOMM+&lt;br /&gt;
 |LS_R  --- Light Sensor Right&lt;br /&gt;
 |-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====ENC====&lt;br /&gt;
[[Bild:RP6_ENC.JPG|thumb|RP6 ENC]]&lt;br /&gt;
Die beiden Messpunkte ENCL, ENCR (SP4 B12: ENCL, ENCR) sind die Ausgänge der Radencoder. ENCL ist verbunden mit PD2 (INT0), ENCR mit PD3 (INT1) des RP6 Microcontrollers.&lt;br /&gt;
&lt;br /&gt;
===Trennstellen===&lt;br /&gt;
An diesen Stellen können Leiterbahnen unterbrochen werden, um Funktionen zu deaktivieren oder anders zu nutzen.&lt;br /&gt;
&lt;br /&gt;
=====Getrennte Stromversorgung für ADC0/1=====&lt;br /&gt;
Wenn man für die analogen Sensoren an ADC0/1 (siehe Abschnitt &amp;quot;Anschlüsse - Analoge Sensoren an ADC0/1&amp;quot; weiter oben!) eine GETRENNTE Stromversorgung vorsehen will und/oder mit Codierbrücke (oder MOSFET) die Stromversorgung abschaltbar machen möchte, muss man erst Vorarbeit leisten.&lt;br /&gt;
[[Bild:RP6_SV.JPG|thumb|RP6 SV]]&lt;br /&gt;
&lt;br /&gt;
Man braucht dazu:&lt;br /&gt;
* 1-reihige Stiftleiste RM 2,54mm (z.B. 36-polig 732478)&lt;br /&gt;
* Evtl.: Eine Codierbrücke (z.B. aus Set 742902)&lt;br /&gt;
* Evtl.: Eine 1-polige Steckbuchse mit Litze zur ext. Stromversorgung&lt;br /&gt;
Es muss eine kurze Leiterbahn zwischen den Punkten &amp;quot;SV1&amp;quot; und &amp;quot;SV2&amp;quot; (SP2 A1: SV1, SV2; zwischen dem PROG/UART- und dem USRBUS1-Stecker) aufgetrennt werden. Die Leiterbahn befindet sich auf der Lötseite der Platine und muss mit einem scharfen Messer oder einem speziellen Leiterbahn-Unterbrecher zwischen den beiden Lötpunkten unterbrochen werden. Man sollte anschließend mit einem Widerstandsmeßgerät zwischen SV1 und SV2 nachmessen: Es sollte keine Verbindung mehr bestehen. Jetzt trennt man von der 1-reihigen Stiftleiste 2 Kontakte ab und lötet sie auf die Punkte SV1/SV2.&lt;br /&gt;
&lt;br /&gt;
Man kann hier zunächst eine Codierbrücke aufstecken. Damit versorgt der RP6 Akku die Sensoren mit 5V an den Pins VDD. Möchte man später eine getrennte 5V-Spannung anlegen, zieht man einfach die Codierbrücke ab und speist die externe 5V-Spannung (mit einer 1-poligen Steckbuchse) am Pin SV2 ein. Achtung: An Pin SV1 wird dann nichts angeschlossen!&lt;br /&gt;
&lt;br /&gt;
Anstelle der Codierbrücke kann man natürlich auch einen MOSFET anschließen, um die Sensoren per Software abschalten zu können.&lt;br /&gt;
&lt;br /&gt;
====ACS====&lt;br /&gt;
[[Bild:RP6_ACS_JP.JPG|thumb|RP6 ACS JP]]&lt;br /&gt;
Die Trennstelle ACS (SP2 E1: YIR1, YIR2; SP2 F1: YIR3) befindet sich neben C29*. Sie besteht aus 3 Lötpunkten, von denen die linken beiden (IRC1, IRC2) verbunden sind. Trennt man die Leiterbahn zwischen diesen Lötpunkten auf und verbindet stattdessen die rechten beiden Lötpunkte (IRC2, IRC3) mit etwas Lötzinn oder mit einem SMD Null Ohm Widerstand, dann ist der IR-Empfänger (TSOP, IC3) dauerhaft EINgeschaltet und kann nicht mehr über das Signal PWRON (PB4) geschaltet werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====IRC====&lt;br /&gt;
[[Bild:RP6_IRC_JP.JPG|thumb|RP6 IRC JP]]&lt;br /&gt;
Die Trennstelle IRC (SP2 C1: IRC1..2) ist eng verknüpft mit den Mess- und Kontaktpunkten des IRCOMM-Senders (siehe Abschnitt &amp;quot;Mess-/Kontaktpunkte - IRC&amp;quot; weiter oben!). Wenn man sie auftrennt, kann man den IRCOMM-Sender mit einer getrennten Stromversorgung anstelle von +UB des RP6 versehen. Dies ist sehr sinnvoll, wenn man diese Funktion häufig verwendet oder sogar noch leistungsfähigere IR-Sendedioden einbaut, denn der IRCOMM-Sender ist der zweitgrößte Stromfresser (nach dem Antrieb) auf dem RP6 (von Erweiterungsplatinen und EPs Marke Eigenbau einmal abgesehen!). Man kann hier natürlich auch eine 2-polige Stiftleiste einlöten, um die Verbindung zu +UB mit einer Codierbrücke trennbar zu machen. Eine getrennte Stromversorgung +7,2V (Bereich: +5,5 .. +10V) kann man an IRC1 einspeisen. IRC1 dieser Trennstelle ist mit dem Kontaktpunkt IRC3 (siehe Abschnitt &amp;quot;Mess-/Kontaktpunkte - IRC&amp;quot; weiter oben!) verbunden. &lt;br /&gt;
&lt;br /&gt;
====RP6 Antrieb====&lt;br /&gt;
Mit den folgenden Trennstellen kann man den RP6 Antrieb (H-Brücken und Motoren) fast komplett vom Rest des RP6 Mainboards abtrennen (es bleibt nur die 5V-Versorgung (VDD) von IC4, T1, T2 bestehen!). Damit ist es möglich, mit dem RP6 Mainboard einen ganz anderen Antrieb (also z.B. ein anderes Roboter-Chassis mit eigenen Motoren und H-Brücken) zu steuern. Umgekehrt könnte man den RP6 Antrieb auch deshalb abtrennen, um ihn durch ein anderes Prozessorsystem (z.B. auch eine M32!) anzusteuern. It's up to you!&lt;br /&gt;
&lt;br /&gt;
=====+UB Power=====&lt;br /&gt;
[[Bild:RP6_HB_Power.jpg|thumb|RP6 HB Power]]&lt;br /&gt;
Der RP6 Antrieb wird direkt aus dem Akku (über S1 und F1) mit 7,2V (+UB) versorgt. Diese Stromversorgung kann man komplett abtrennen. Die Trennstelle (SP3 E34: X) liegt unter der Sicherung F1 (siehe Abb. RP6 HB Power). Zwischen den beiden doppelten Lötflächen befinden sich auf der Lötseite (Unterseite) des Mainboards vier parallele Leiterbahnen, die aufgetrennt werden müssen. Der Pluspol einer externen Spannung zur Versorgung des RP6 Antriebs kann dann mit einer Kabelverbindung an den doppelten Lötflächen (mit einem &amp;quot;+&amp;quot; gekennzeichnet) direkt neben dem Leistungswiderstand (R27) angeschlossen werden. Eine Absicherung dieser Stromversorgung sollte man unbedingt vorsehen (2,5A träge)!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=====Stromsensoren=====&lt;br /&gt;
[[Bild:RP6_CS.JPG|thumb|RP6 CS]]&lt;br /&gt;
Um den Motorstrom der beiden Motoren des RP6 zu messen, wird ein Dual-Operationsverstärker (IC5 = 27M2C; SP3 B23/D23: IC5B/A) eingesetzt. Dieses IC wird über PWRON (PB4) mit Strom versorgt. Die Stromsensoren funktionieren also nicht, wenn PWRON Low-Pegel führt (Befehl powerOFF() der RP6 Library!). Auf dem RP6 Mainboard gibt es eine Trennstelle mit drei Lötflächen (SP3 E34: CS1, CS2, CS3). Sie befindet sich auf dem Mainboard neben C23. Möchte man IC5 nicht mehr über PWRON mit Strom versorgen, sondern über VDD (+5V), dann trennt man die Leiterbahn zwischen den linken beiden Lötpunkten (CS1, CS2) auf und verbindet die rechten beiden Lötpunkte (CS2, CS3) mit etwas Lötzinn oder einem SMD Null Ohm Widerstand. Danach sind die Stromsensoren immer eingeschaltet und können über PWRON nicht mehr geschaltet werden. Alternativ kann man an CS2 auch eine externe Versorgungsspannung (+5V) für IC5 einspeisen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=====DR/MR/ML/DL=====&lt;br /&gt;
[[Bild:RP6_DR_MR_ML_DL.JPG|thumb|RP6 DR MR ML DL]]&lt;br /&gt;
An diesen Trennstellen können die Eingänge der H-Brücke für die Geschwindigkeit (PWM) und Drehrichtung der Motoren von den Portpins des Microcontrollers abgetrennt werden.&lt;br /&gt;
Für den rechten Motor sind dies die Trennstellen MR1/2 und DR1/2 (SP3 A23: MR1/2, DR1/2), für den linken Motor ML1/2 und DL1/2 (SP3 F23: ML1/2, DL1/2).&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |Trennstelle&lt;br /&gt;
 |Portpin&lt;br /&gt;
 |Funktion H-Brücke&lt;br /&gt;
 |-&lt;br /&gt;
 |MR1/2&lt;br /&gt;
 |PD5 (OC1A)&lt;br /&gt;
 |PWM Motor rechts&lt;br /&gt;
 |-&lt;br /&gt;
 |DR1/2&lt;br /&gt;
 |PC3 (TMS)&lt;br /&gt;
 |Fahrtrichtung rechts&lt;br /&gt;
 |-&lt;br /&gt;
 |ML1/2&lt;br /&gt;
 |PD4 (OC1B)&lt;br /&gt;
 |PWM Motor links&lt;br /&gt;
 |-&lt;br /&gt;
 |DL1/2&lt;br /&gt;
 |PC2 (TCK)&lt;br /&gt;
 |Fahrtrichtung links&lt;br /&gt;
 |-&lt;br /&gt;
|}&lt;br /&gt;
Trennt man die Leiterbahn (auf der Lötseite des RP6 Mainboards) zwischen den Lötpunkten der Trennstellen auf, kann man die Eingänge der H-Brücke (Mx1, Dx1) z.B. mit einem anderen Microcontroller verbinden. Die Ausgänge (Portpins) des RP6 Microcontrollers (Mx2, Dx2) können dann anders genutzt werden. Natürlich kann man auf die Lötpunkte dieser Trennstellen auch Stiftleisten löten, um den Anschluß steckbar zu machen.&lt;br /&gt;
&lt;br /&gt;
=====MCR/MCL=====&lt;br /&gt;
[[Bild:RP6_MCR_MCL.JPG|thumb|RP6 MCR MCL]]&lt;br /&gt;
An diesen Trennstellen können die Motorstromsensoren von den ADC-Eingängen des Microcontrollers abgetrennt werden.&lt;br /&gt;
&lt;br /&gt;
Für den rechten Sensor ist dies die Trennstelle MCR1/2 (SP3 A1: MCR1, MCR2), für den linken Sensor MCL1/2 (SP3 E1: MCL1, MCL2).&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |Trennstelle&lt;br /&gt;
 |Portpin&lt;br /&gt;
 |Funktion H-Brücke&lt;br /&gt;
 |-&lt;br /&gt;
 |MCR1/2&lt;br /&gt;
 |PA5 (ADC5)&lt;br /&gt;
 |Motorstrom rechts&lt;br /&gt;
 |-&lt;br /&gt;
 |MCL1/2&lt;br /&gt;
 |PA6 (ADC6)&lt;br /&gt;
 |Motorstrom links&lt;br /&gt;
 |-&lt;br /&gt;
|}&lt;br /&gt;
Trennt man die Leiterbahn (auf der Lötseite des RP6 Mainboards) zwischen den Lötpunkten der Trennstellen auf, kann man die ADC-Eingänge (Portpins) des RP6 Microcontrollers (MCx1) anders nutzen und die Ausgänge der Motorstromsensoren (MCx2) z.B. mit ADC-Eingängen eines anderen Microcontrollers verbinden. Natürlich kann man auf die Lötpunkte dieser Trennstellen auch Stiftleisten löten, um den Anschluß steckbar zu machen.&lt;br /&gt;
&lt;br /&gt;
====PWRON-LED====&lt;br /&gt;
[[Bild:RP6_PWRON_L.JPG|thumb|RP6 PWRON L]]&lt;br /&gt;
Auf dem RP6 Mainboard gibt es eine gelbe LED, die anzeigt, ob PWRON High-Pegel hat. Mit einer Trennstelle neben dieser LED (SP2 D4: YL1, YL2) kann diese LED deaktiviert werden (z.B. um Strom zu sparen).&lt;br /&gt;
&lt;br /&gt;
Dazu trennt man die Leiterbahn zwischen den Lötpunkten auf. Soll die LED wieder aktiviert werden, verbindet man die Lötpunkte wieder mit etwas Lötzinn oder einem SMD Null Ohm Widerstand.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====+UB Sensor====&lt;br /&gt;
[[Bild:RP6_UB.JPG|thumb|RP6 UB]]&lt;br /&gt;
Die Versorgungsspannung +UB des RP6 wird mit dem +UB-Spannungssensor an PA7 (ADC7) gemessen. Will man diesen Spannungssensor mit seinem Eingangsspannungsteiler R1, R2 (SP1 D12: R1, R2) von +UB abtrennen (z.B. um ihn anders zu verwenden), gibt es eine Trennstelle UB1/2 (SP1 D2: UB1, UB2). Trennt man die Leiterbahn auf der Lötseite des RP6 Mainboards zwischen den Lötpunkten auf, kann +UB nicht mehr gemessen werden. Man kann dann den Lötpunkt UB2 mit einem anderen Messpunkt (z.B. mit +BAT) verbinden und dort die Spannung (0..10V) messen. Natürlich kann man auf die Lötpunkte dieser Trennstellen auch Stiftleisten löten, um den Anschluß steckbar zu machen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====EXT Anschluß: Andere Stromversorgung====&lt;br /&gt;
[[Bild:RP6_S1_CHRG.jpg|thumb|RP6 S1 CHRG]]&lt;br /&gt;
Wenn man für den RP6 eine andere Stromversorgung oder Ladeschaltung anschließen will, geht dies gut am EXT Anschluß (SP1 C23: Stecker EXT). Siehe auch den Abschnitt &amp;quot;Anschlüsse - EXT Anschluß&amp;quot; weiter oben! Dann muss der Schalter S1 dauerhaft AUSgeschaltet bleiben und die Verbindung zwischen S1 und CHRG des EXT Anschlusses (SP1 C3: X) unterbrochen werden. Diese Trennstelle befindet sich auf der Lötseite (Unterseite) des RP6 Mainboards etwas versteckt zwischen S1 (Pin 3) und der benachbarten Leiterbahn, die CHRG des EXT Anschlusses mit der Ladebuchse CHARGER (Pin 1 +) verbindet. Dort sind fünf kurze, parallele Leiterbahnen zu unterbrechen (siehe gelbe Markierung in der Abb. RP6 S1 CHRG!). Will man das nicht machen, darf man die Ladebuchse CHARGER auf jeden Fall nicht mehr nutzen!&lt;br /&gt;
&lt;br /&gt;
===Lochraster-Felder===&lt;br /&gt;
Auf diesen Feldern kann man eigene kleine Schaltungen aufbauen. An jedem der sechs Felder stehen VDD (+5V) und GND zur Verfügung (SP4 E12: YVDDx, YGNDx).&lt;br /&gt;
&lt;br /&gt;
Bitte beachten: Die Lochreihen oder -spalten, die mit einer eckigen Klammer &amp;quot;[&amp;quot; markiert sind, liegen auf der Lötseite (Unterseite) direkt auf dem Rahmen des Chassis! Hier können also keine Drähte von unten verlötet werden.&lt;br /&gt;
&lt;br /&gt;
====Vorn links====&lt;br /&gt;
Das kleine Lochrasterfeld vorn links kann z.B. für Beleuchtung (Blinker, Scheinwerfer links) oder auch für einen zusätzlichen Sensor genutzt werden.&lt;br /&gt;
Zur Verfügung steht eine 2-adrige Verbindung zum mittleren Lochrasterfeld links.&lt;br /&gt;
&lt;br /&gt;
In der Nähe dieses Lochrasterfeldes gibt es auch:&lt;br /&gt;
* IO3, IO4 (SP2 E3: IO3, IO4)&lt;br /&gt;
* ADC0 (SP2 B1: ADC0)&lt;br /&gt;
&lt;br /&gt;
====Mitte links====&lt;br /&gt;
[[Bild:RP6_Lochfeld_LM.JPG|thumb|RP6 Lochrasterfeld Mitte links]]&lt;br /&gt;
Das größere Lochrasterfeld Mitte links kann z.B. für eine kleinere Schaltung zur Ansteuerung der Beleuchtung/Sensoren auf den Lochrasterfeldern vorn und hinten links oder für andere Zwecke genutzt werden.&lt;br /&gt;
&lt;br /&gt;
Es stehen hier folgende Anschlüsse zur Verfügung:&lt;br /&gt;
* 2-adrige Verbindung zum Lochrasterfeld vorn links&lt;br /&gt;
* 2-adrige Verbindung zum Lochrasterfeld hinten links&lt;br /&gt;
* ST1/ST2 zum Anschluß weiterer Start/Stop Taster (SP2 D2: ST1/2)&lt;br /&gt;
* PWR (SP2 D2: YPWR1)&lt;br /&gt;
* I2C-Bus (SCL, SDA; SP4 C1: YSCL1, YSDA1)&lt;br /&gt;
* +UB (SP4 D2: YUB1)&lt;br /&gt;
In der Nähe dieses Lochrasterfeldes gibt es auch:&lt;br /&gt;
* Serielle Schnittstelle (RST, TX, RX; SP4 AB5: YRX, YTX, YMRESET, YVDD)&lt;br /&gt;
* USRBUS1 (vorn; SP4 E34: Y1'..Y14')&lt;br /&gt;
&lt;br /&gt;
=====Schaltungsvorschläge=====&lt;br /&gt;
Wie kann z.B. eine Schaltung für Beleuchtungseffekte oder Sensoren aussehen?&lt;br /&gt;
&lt;br /&gt;
Man könnte 8 zusätzliche Schaltkanäle mit dem I2C-Portexpander-IC PCF8574(A)P gewinnen. Dieses IC passt mit wenigen Zusatzteilen auf die mittlere Lochrasterfläche. Angesteuert wird es über den I2C-Bus. Mit den 8 Ausgängen lassen sich einige Beleuchtungseffekte erreichen, die dann über Software schaltbar sind.&lt;br /&gt;
&lt;br /&gt;
Alternativ kann man auch das IC PCF8591P z.B. für den Anschluß von analogen Sensoren verwenden. Auch dieser Baustein wird über I2C angesteuert. Beide ICs sind bei [http://www.reichelt.de./ Reichelt] erhältlich.&lt;br /&gt;
&lt;br /&gt;
Will man nicht den I2C-Bus benutzen, kann man als I/O-Ports IO1..IO4 oder als analoge Eingänge ADC0 und ADC1 verwenden. Auch SCL und SDA stehen als I/O-Ports zur Verfügung, wenn der I2C-Bus im ganzen System nicht verwendet werden soll.&lt;br /&gt;
&lt;br /&gt;
Wichtig für Zusatzschaltungen, die fest auf dem RP6 verlötet werden, sind zwei Aspekte:&lt;br /&gt;
* Wenn sie die Stromversorgung belasten, sollten sie (z.B. über einen Transistor oder MOSFET) abschaltbar sein. Dazu kann man auch das Signal PWR heranziehen, das auf beiden mittleren Lochrasterflächen zur Verfügung steht. Dann kann man mit dem Befehl &amp;quot;powerOFF()&amp;quot; der RP6 Library die Stromversorgung per Software abschalten.&lt;br /&gt;
* Wenn man auch anderweitig genutzte Portpins (SDA, SCL, IO1..IO4, ADC0/1) für die eigene Schaltung einsetzt, sollte man die Verbindung zu den Portpins mit einer abziehbaren Codierbrücke trennbar machen.&lt;br /&gt;
&lt;br /&gt;
====Hinten links====&lt;br /&gt;
Das kleine Lochrasterfeld hinten links kann z.B. für Beleuchtung (Blinker, Rücklicht links) oder auch für einen zusätzlichen Sensor genutzt werden.&lt;br /&gt;
Zur Verfügung steht eine 2-adrige Verbindung zum mittleren Lochrasterfeld links.&lt;br /&gt;
&lt;br /&gt;
In der Nähe dieses Lochrasterfeldes gibt es auch:&lt;br /&gt;
* EXT Anschluß (SP1 C23: Stecker EXT)&lt;br /&gt;
&lt;br /&gt;
====Vorn rechts====&lt;br /&gt;
Das kleine Lochrasterfeld vorn rechts kann z.B. für Beleuchtung (Blinker, Scheinwerfer rechts) oder auch für einen zusätzlichen Sensor genutzt werden.&lt;br /&gt;
Zur Verfügung steht eine 2-adrige Verbindung zum mittleren Lochrasterfeld rechts.&lt;br /&gt;
&lt;br /&gt;
In der Nähe dieses Lochrasterfeldes gibt es auch:&lt;br /&gt;
* IO1, IO2 (SP2 E3: IO1, IO2)&lt;br /&gt;
* ADC1 (SP2 B1: ADC1)&lt;br /&gt;
&lt;br /&gt;
====Mitte rechts====&lt;br /&gt;
Das größere Lochrasterfeld Mitte rechts kann z.B. für eine kleinere Schaltung zur Ansteuerung der Beleuchtung/Sensoren auf den Lochrasterfeldern vorn und hinten rechts oder für andere Zwecke genutzt werden.&lt;br /&gt;
&lt;br /&gt;
Es stehen hier folgende Anschlüsse zur Verfügung:&lt;br /&gt;
* 2-adrige Verbindung zum Lochrasterfeld vorn rechts&lt;br /&gt;
* 2-adrige Verbindung zum Lochrasterfeld hinten rechts&lt;br /&gt;
* PWR (SP2 D2: YPWR2)&lt;br /&gt;
* I2C-Bus (SCL, SDA; SP4 C1: YSCL2, YSDA2)&lt;br /&gt;
* +UB (SP4 D2: YUB2)&lt;br /&gt;
In der Nähe dieses Lochrasterfeldes gibt es auch:&lt;br /&gt;
* Interrupt-Anschluß (INTU, INT1..3, MRESET; SP4 D34: MRESET, INT1..3, INTU)&lt;br /&gt;
* USRBUS2 (hinten; SP4 E34: Y1..Y14)&lt;br /&gt;
&lt;br /&gt;
====Hinten rechts====&lt;br /&gt;
Das kleine Lochrasterfeld hinten rechts kann z.B. für Beleuchtung (Blinker, Rücklicht rechts) oder auch für einen zusätzlichen Sensor genutzt werden.&lt;br /&gt;
Zur Verfügung steht eine 2-adrige Verbindung zum mittleren Lochrasterfeld rechts.&lt;br /&gt;
&lt;br /&gt;
In der Nähe dieses Lochrasterfeldes gibt es auch:&lt;br /&gt;
* EXT Anschluß (SP1 C23: Stecker EXT)&lt;br /&gt;
* Akku-Anschluß (SP1 B3: BATTERY)&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Erweiterungen==&lt;br /&gt;
Auf / An den RP6 könnte man z.B. noch folgendes anbauen / erweitern:&lt;br /&gt;
&lt;br /&gt;
* Einen Greifarm&lt;br /&gt;
* Einen Ultraschallsensor&lt;br /&gt;
* Zwei Lichtsensoren hinten, um die hellste / dunkelste Stelle im Raum besser zu finden&lt;br /&gt;
* Einen digitalen Kompass&lt;br /&gt;
* uvm.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Erweiterungs-Module==&lt;br /&gt;
&lt;br /&gt;
Es sind von Arexx schon einige Erweiterungsmöglichkeiten auf dem Markt. Zum Ersten die Experimentierplatinen ([http://www.conrad.de/ce/de/product/191537/Arexx-RP6-Experimentierplatine 191537] AUSVERKAUFT!), die zum Erstellen von eigenen Schaltungen und Sensoren gedacht sind, und von denen eine schon im Lieferumfang des RP6 enthalten war, das Erweiterungsboard RP6 CONTROL M32 ([http://www.conrad.de/ce/de/product/191550/Arexx-RP6-ATMEGA32-Erweiterungssatz 191550] AUSVERKAUFT!) und die RP6 CCPRO M128 ([http://www.conrad.de/ce/de/product/191563/Arexx-RP6-CC-PRO-MEGA128-Erweiterungssatz 191563]).&lt;br /&gt;
&lt;br /&gt;
Die Boards kann man dann über den I2C Bus mit dem Mainboard kommunizieren lassen.  Es ist sehr sinnvoll, die Module symmetrisch hintereinander zu stapeln und nicht mehr als 6-8 Module zu verbauen, weil der Roboter sonst immer schwerer und langsamer wird. Basierend auf dem Master-Slave System könnte man so bis zu 127 Slaves anschließen. Zudem ist es ratsam, qualitativ hochwertige Akkus und ein Ladegerät mit passendem Stecker zu verwenden, da man ansonsten immer das Mainboard abschrauben müsste um an die Akkus heranzukommen. Für den Fall wurde extra eine Ladebuchse eingebaut.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Experimentierplatine ===&lt;br /&gt;
[[Bild:RP6_Exp.jpg|RP6 Experimentierplatine]]&lt;br /&gt;
&lt;br /&gt;
====Beschreibung====&lt;br /&gt;
Die Experimentier-Platine ist dazu gedacht, eigene Schaltungen auf dem RP6 zu realisieren, und ist seit Mai 2020 bei CONRAD ausverkauft. Sie wird über den I²C-Bus mit den anderen Erweiterungsmodulen verbunden. Ausserdem ist es sinnvoll, die (freien) I/O-Ports (ADC-Kanäle) der RP6 Base, des M32 Erweiterungsmoduls bzw. des CCPRO M128 Moduls über ein [http://www.reichelt.de/?;ACTION=3;LA=444;GROUP=C63;GROUPID=3328;ARTICLE=47637;START=0;SORT=artnr;OFFSET=16;SID=1580faBqwQAQ8AAGY-ZAM7cd511ee04a106a88a359faaac0071e2 10-Pol-Flachbandkabel] mit [http://www.reichelt.de/?ACTION=3;GROUP=C151;GROUPID=3231;ARTICLE=14571;SID=1580faBqwQAQ8AAGY-ZAM7cd511ee04a106a88a359faaac0071e2 Stecker] auf die Experimentierplatine zu führen, weil es übersichtlicher bleibt und keine Kabel lose herumhängen. Auf der Experimentierplatine kann man dann LEDs oder einen Temperatursensor an die I/O-Ports bzw. an die ADC-Kanäle anschießen.&lt;br /&gt;
&lt;br /&gt;
====Technische Daten====&lt;br /&gt;
{|  {{Blauetabelle}} &lt;br /&gt;
|'''Mikrocontroller:'''&lt;br /&gt;
|Keiner&lt;br /&gt;
|-&lt;br /&gt;
|'''Speicher:'''&lt;br /&gt;
|Keiner&amp;lt;br/&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|'''Programmierung:'''&lt;br /&gt;
|Kein Programmieradapter&lt;br /&gt;
|-&lt;br /&gt;
|'''Vorhandene Sensoren:'''&lt;br /&gt;
|Keine&amp;lt;br/&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|'''Vorhandene Aktoren:'''&lt;br /&gt;
|Keine&amp;lt;br/&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|'''Abmessungen:'''&lt;br /&gt;
|(L &amp;amp;times; B &amp;amp;times; H) 112 &amp;amp;times; 90 &amp;amp;times; 10 mm&lt;br /&gt;
|-&lt;br /&gt;
|'''Ausführung:'''&lt;br /&gt;
|Bausatz&lt;br /&gt;
|-&lt;br /&gt;
|'''Stromversorgung:'''&lt;br /&gt;
|6 AA NiMH Akkus (über die RP6 Base)&lt;br /&gt;
|-&lt;br /&gt;
|'''Hersteller:'''&lt;br /&gt;
|Arexx Niederlande&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Schaltungsideen ====&lt;br /&gt;
Auf der / den Experimentierplatinen könnte man z.B. folgendes realisieren:&lt;br /&gt;
&lt;br /&gt;
* eine Kameraschaltung (wie [http://www.rn-wissen.de/index.php/RP6_Kamera_-_Mitmach-Projekt hier] gezeigt)&lt;br /&gt;
* Scheinwerfer, Rücklichter, Blinker etc. (ABER immer mit Vorwiderstand!!!)&lt;br /&gt;
* ein LED-Lauflicht (über I/O-Expander, gibt´s beim [http://www.reichelt.de/?ACTION=3;ARTICLE=14527;PROVID=2402 Reichelt])&lt;br /&gt;
* mehr ADC-Kanäle (über ADC-Expander, einfach mal nach PCF8591 [http://www.google.de/search?q=PCF8591 googlen])&lt;br /&gt;
* eine Wetterstation mit Luftfeuchtemesser, Temperaturfühler und Lichtmesser ([http://www.roboternetz.de/phpBB2/viewtopic.php?t=52298 hier] gibt es eine Wetterstation uvm.)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== RP6 CONTROL M32 Platine ===&lt;br /&gt;
[[Bild:RP6Control_M32.jpg|RP6 CONTROL M32]]&lt;br /&gt;
&lt;br /&gt;
====Beschreibung====&lt;br /&gt;
Auf der M32 ([http://www.conrad.de/ce/de/product/191550/Arexx-RP6-ATMEGA32-Erweiterungssatz 191550]) lassen sich weitere LEDs, Sensoren oder ähnliches anschließen, außerdem steht ein weiterer ATMEGA32 zur Verfügung, welcher sich gut im Master Modus betreiben lässt. Es sind ein Mikrofonsensor, fünf Taster, vier Status-LEDs, ein Display-Port, ein Beeper, 6 freie ADC-Kanäle, 8 freie I/O-Ports, ein Programmieradapter, ein JTAG-Anschluss, eine ISP-Programmierschnittstelle sowie ein freier Steckplatz für ein EEPROM verfügbar.&lt;br /&gt;
&lt;br /&gt;
====Technische Daten====&lt;br /&gt;
{|  {{Blauetabelle}} &lt;br /&gt;
|'''Mikrocontroller:'''&lt;br /&gt;
|AVR [[ATmega32]]&lt;br /&gt;
|-&lt;br /&gt;
|'''Speicher:'''&lt;br /&gt;
|32 kB [[Flash]]-Speicher, davon 1 kB bereits vom Bootloader belegt&amp;lt;br/&amp;gt;&lt;br /&gt;
2 kB SRAM&amp;lt;br/&amp;gt; &lt;br /&gt;
1 kB [[EEPROM]]&lt;br /&gt;
|-&lt;br /&gt;
|'''Programmierung:'''&lt;br /&gt;
|Über AVR-[[Bootloader]], belegt ca. 1 kB des Flash-Speichers&lt;br /&gt;
|-&lt;br /&gt;
|'''Vorhandene Sensoren:'''&lt;br /&gt;
|1 Mikrofonsensor&amp;lt;br/&amp;gt;&lt;br /&gt;
5 Eingabetaster&amp;lt;br/&amp;gt;&lt;br /&gt;
14 I/O Ports, davon 6 ADC-Wandler&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|'''Vorhandene Aktoren:'''&lt;br /&gt;
|1 Beeper&amp;lt;br/&amp;gt;&lt;br /&gt;
4 Status-LEDs&amp;lt;br/&amp;gt;&lt;br /&gt;
1 LC-Display-Port&amp;lt;br/&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|'''Abmessungen:'''&lt;br /&gt;
|(L &amp;amp;times; B &amp;amp;times; H) 112 &amp;amp;times; 90 &amp;amp;times; 15 mm&lt;br /&gt;
|-&lt;br /&gt;
|'''Ausführung:'''&lt;br /&gt;
|Fertig aufgebautes Erweiterungsmodul&lt;br /&gt;
|-&lt;br /&gt;
|'''Stromversorgung:'''&lt;br /&gt;
|6 AA NiMH Akkus (über die RP6 Base)&lt;br /&gt;
|-&lt;br /&gt;
|'''Hersteller:'''&lt;br /&gt;
|Arexx Niederlande&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Umbau-Optionen ====&lt;br /&gt;
Dieser Absatz soll die Möglichkeiten der RP6 CONTROL M32 Platine (im Folgenden &amp;quot;M32&amp;quot; genannt) auflisten, die es gibt, um auf einfache Weise weitere Anschlüsse oder Verbindungen zu ermöglichen. Nicht beschrieben werden die Anschlußmöglichkeiten, die in Form der vorhandenen Wannenstecker sowieso gegeben sind (z.B. am LCD-, I/O- oder ADC-Stecker). Im Text gibt es Verweise auf den Schaltplan der M32 (RP6_CONTROL_M32.PDF) in der Form: (SP2 B1: Bauteil).  Dies bedeutet, dass man das Bauteil auf Blatt 2 des RP6-M32-Schaltplans im Feld B1 finden kann.&lt;br /&gt;
&lt;br /&gt;
Folgende Möglichkeiten zum Umbau/Ausbau sind vorgesehen:&lt;br /&gt;
* Zweites SPI-EEPROM (IC5)&lt;br /&gt;
* Zwei analoge Sensoren, evtl. mit getrennter Stromversorgung&lt;br /&gt;
* ISP (In System Programming)&lt;br /&gt;
* JTAG-Programmierung&lt;br /&gt;
* USRBUS&lt;br /&gt;
* IRQ-Zuweisung ändern&lt;br /&gt;
* ADC0 und ADC1 anders nutzen&lt;br /&gt;
* Schieberegister kaskadieren&lt;br /&gt;
Im folgenden Text soll beschrieben werden, wie man die weiteren Möglichkeiten nutzen kann. Es wird jeweils erwähnt, was man an Material braucht. Beispielhaft sind da Bestell-Nummern der Firma [http://www.conrad.de/ce/ CONRAD] genannt. Natürlich kann man die Teile auch bei anderen Versendern beziehen. Durch die Nennung der Bestell-Nummer ist das jeweilige Teil aber gut zu identifizieren. Man sollte Löten können und sich bewußt sein, dass ggf. ein Garantieanspruch nicht mehr besteht, wenn man an der Platine gelötet hat.&lt;br /&gt;
&lt;br /&gt;
Bei den Materialangaben ist öfter die Rede von &amp;quot;Steckbuchsen mit Litze&amp;quot;. Diese Steckbuchsen mit angelöteter Litze können auf die ein- oder zweireihigen Stiftleisten aufgesteckt werden. Leider gibt es sie nicht (mehr) fertig konfektioniert bei CONRAD. Die einreihigen Steckbuchsen (RM 2,54mm) kann man aber z.B. bei [http://www.elv.de/output/controller.aspx ELV] bekommen: 2-polig (68-016635), 3-polig (68-022503) und 5-polig (68-023073). An sie muss man dann noch Litzen in der entsprechenden Länge selbst anlöten.&lt;br /&gt;
&lt;br /&gt;
===== Zweites SPI-EEPROM =====&lt;br /&gt;
Es ist sehr einfach, ein zweites SPI-EEPROM (SP1 A1: IC5*) auf der M32 zu nutzen.&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_M32_IC5-Socket.JPG|thumb|Sockel des 2. SPI-EEPROMs]]&lt;br /&gt;
&lt;br /&gt;
Man braucht dazu:&lt;br /&gt;
* Einen IC-Sockel 8-pol DIP für IC5 ([http://www.conrad.de/ce/de/product/189600/IC-FASSUNG-PRAeZISION-8POLIG 189600])&lt;br /&gt;
* Einen Keramik-Vielschicht-Kondensator 100nF (C19); RM 2,54mm ([http://www.conrad.de/ce/de/product/453099/?insert=36&amp;amp;insertNoDeeplink&amp;amp;productname=KONDENSATOR-01-F-KDPU-254-MM 453099])&lt;br /&gt;
* Ein serielles SPI-EEPROM im PDIP8 Gehäuse (IC5)&lt;br /&gt;
Zuerst wird der IC-Sockel eingelötet (Kerbe beachten!), dann C19 (SP1 A1: C19*). Das war's.&lt;br /&gt;
&lt;br /&gt;
Leider gibt es das EEPROM nicht bei den gängigeren Versendern. Bekommen kann man es aber z.B. bei [http://de.farnell.com/jsp/home/homepage.jsp Farnell]. Dort hat das SPI-EEPROM mit 256 kbit die Bezeichnung 25LC256-I/P (1331398). Wenn man es noch größer mag: 25LC1024 (1331392) mit 1024 kbit. SPI-EEPROMs führt inzwischen auch [http://www.reichelt.de./ Reichelt].&lt;br /&gt;
&lt;br /&gt;
'''Programmierung:'''&lt;br /&gt;
&lt;br /&gt;
In die RP6ControlLib.h bitte einfügen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#define SPI_EEPROM2_PAGESIZE 64&lt;br /&gt;
&lt;br /&gt;
uint8_t SPI_EEPROM2_readByte(uint16_t memAddr);&lt;br /&gt;
void SPI_EEPROM2_writeByte(uint16_t memAddr, uint8_t data);&lt;br /&gt;
void SPI_EEPROM2_enableWrite(void);&lt;br /&gt;
void SPI_EEPROM2_disableWrite(void);&lt;br /&gt;
uint8_t SPI_EEPROM2_getStatus(void);&lt;br /&gt;
&lt;br /&gt;
void SPI_EEPROM2_writeBytes(uint16_t startAddr, uint8_t *buffer, uint8_t length);&lt;br /&gt;
void SPI_EEPROM2_readBytes(uint16_t startAddr, uint8_t *buffer, uint8_t length);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Die Konstante SPI_EEPROM2_PAGESIZE ist abhängig von der Art und Größe des EEPROMs. Für ein 256 kbit-EEPROM ist die Seitengröße (pagesize) in der Regel 64, für einen 512 kbit-Typ 128 und für einen 1024 kbit-Typ 256.&lt;br /&gt;
&lt;br /&gt;
In die RP6ControlLib.c bitte einfügen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Second external SPI EEPROM:&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Reads a single Byte from the 2nd external EEPROM.&lt;br /&gt;
 */&lt;br /&gt;
uint8_t SPI_EEPROM2_readByte(uint16_t memAddr)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t data;&lt;br /&gt;
	PORTB &amp;amp;= ~MEM_CS2;&lt;br /&gt;
	writeSPI(SPI_EEPROM_READ);&lt;br /&gt;
	writeWordSPI(memAddr);&lt;br /&gt;
	data = readSPI();&lt;br /&gt;
	PORTB |= MEM_CS2;&lt;br /&gt;
	return data;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Reads &amp;quot;length&amp;quot; Bytes into the Buffer &amp;quot;buffer&amp;quot; from startAdr on. &lt;br /&gt;
 * You can read the complete 2nd EEPROM into a buffer at once - if it is large enough. &lt;br /&gt;
 * (But you only have 2KB SRAM on a MEGA32 ;) )&lt;br /&gt;
 */&lt;br /&gt;
void SPI_EEPROM2_readBytes(uint16_t startAddr, uint8_t *buffer, uint8_t length)&lt;br /&gt;
{&lt;br /&gt;
	PORTB &amp;amp;= ~MEM_CS2;&lt;br /&gt;
	writeSPI(SPI_EEPROM_READ);&lt;br /&gt;
	writeWordSPI(startAddr);&lt;br /&gt;
	readBufferSPI(&amp;amp;buffer[0], length);&lt;br /&gt;
	PORTB |= MEM_CS2;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Enable Write Mode&lt;br /&gt;
 */&lt;br /&gt;
void SPI_EEPROM2_enableWrite(void)&lt;br /&gt;
{&lt;br /&gt;
	PORTB &amp;amp;= ~MEM_CS2;&lt;br /&gt;
	writeSPI(SPI_EEPROM_WREN);&lt;br /&gt;
	PORTB |= MEM_CS2;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Disable Write Mode&lt;br /&gt;
 */&lt;br /&gt;
void SPI_EEPROM2_disableWrite(void)&lt;br /&gt;
{&lt;br /&gt;
	PORTB &amp;amp;= ~MEM_CS2;&lt;br /&gt;
	writeSPI(SPI_EEPROM_WRDI);&lt;br /&gt;
	PORTB |= MEM_CS2;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Write a single data byte to the specified 2nd EEPROM address.&lt;br /&gt;
 */&lt;br /&gt;
void SPI_EEPROM2_writeByte(uint16_t memAddr, uint8_t data)&lt;br /&gt;
{&lt;br /&gt;
	while(SPI_EEPROM2_getStatus() &amp;amp; SPI_EEPROM_STAT_WIP);&lt;br /&gt;
	SPI_EEPROM2_enableWrite();&lt;br /&gt;
	PORTB &amp;amp;= ~MEM_CS2;&lt;br /&gt;
	writeSPI(SPI_EEPROM_WRITE);&lt;br /&gt;
	writeWordSPI(memAddr);&lt;br /&gt;
	writeSPI(data);&lt;br /&gt;
	PORTB |= MEM_CS2;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Write &amp;quot;length&amp;quot; Bytes from the Buffer to the 2nd EEPROM. &lt;br /&gt;
 * YOU CAN ONLY WRITE MAXIMAL [SPI_EEPROM2_PAGESIZE] BYTES AT ONCE!!!&lt;br /&gt;
 * This is the Pagesize!&lt;br /&gt;
 * You can NOT cross a page boundary!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void SPI_EEPROM2_writeBytes(uint16_t startAddr, uint8_t *buffer, uint8_t length)&lt;br /&gt;
{&lt;br /&gt;
	while(SPI_EEPROM2_getStatus() &amp;amp; SPI_EEPROM_STAT_WIP);&lt;br /&gt;
	SPI_EEPROM2_enableWrite();&lt;br /&gt;
	PORTB &amp;amp;= ~MEM_CS2;&lt;br /&gt;
	writeSPI(SPI_EEPROM_WRITE);&lt;br /&gt;
	writeWordSPI(startAddr);&lt;br /&gt;
	writeBufferSPI(&amp;amp;buffer[0], length);&lt;br /&gt;
	PORTB |= MEM_CS2;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Returns EEPROM Status register - for checking if 2nd EEPROM is buisy. &lt;br /&gt;
 * Writing takes about 5ms. &lt;br /&gt;
 */&lt;br /&gt;
uint8_t SPI_EEPROM2_getStatus(void)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t status;&lt;br /&gt;
	PORTB &amp;amp;= ~MEM_CS2;&lt;br /&gt;
	writeSPI(SPI_EEPROM_RDSR);&lt;br /&gt;
	status = readSPI();&lt;br /&gt;
	PORTB |= MEM_CS2;&lt;br /&gt;
	return status;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Hinweis zum 1024 kbit-EEPROM:&lt;br /&gt;
&lt;br /&gt;
Dieses EEPROM benötigt 24-Bit Adressen und muss daher etwas anders angesprochen werden als die &amp;quot;kleineren&amp;quot; Typen bis 512 kbit.&lt;br /&gt;
Die Funktion SPI_EEPROM2_readByte() sieht für ein 1024 kbit-EEPROM z.B. so aus:&lt;br /&gt;
&amp;lt;pre&amp;gt;uint8_t SPI_EEPROM2_readByte(uint32_t memAddr)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t data;&lt;br /&gt;
	PORTB &amp;amp;= ~MEM_CS2;&lt;br /&gt;
	writeSPI(SPI_EEPROM_READ);&lt;br /&gt;
	writeSPI((uint8_t)(memAddr &amp;gt;&amp;gt; 16));&lt;br /&gt;
	writeWordSPI((uint16_t)memAddr);&lt;br /&gt;
	data = readSPI();&lt;br /&gt;
	PORTB |= MEM_CS2;&lt;br /&gt;
	return data;&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
Alle weiteren Funktionen, die EEPROM-Adressen verwenden (SPI_EEPROM2_readBytes, SPI_EEPROM2_writeByte, SPI_EEPROM2_writeBytes), müssen genau so angepasst werden.&lt;br /&gt;
&lt;br /&gt;
===== Anschlüsse =====&lt;br /&gt;
Hier wird aufgelistet, wo man auf der M32 Platine Anschlüsse nutzen kann, um sie z.B. zu weiteren Sensoren, zum USRBUS oder (weniger empfehlenswert!) direkt zu EPs, zur RP6 Base oder zur CCPRO M128 zu führen. &lt;br /&gt;
&lt;br /&gt;
====== Analoge Sensoren an ADC2/3 ======&lt;br /&gt;
[[Bild:RP6_M32_ADC23.JPG|thumb|ADC2 ADC3]]&lt;br /&gt;
Wenn man bis zu zwei analoge Sensoren (z.B. IR-Distanz-Mess-Sensoren Sharp GP2Y0A02YK 185364) direkt an die M32 anschließen möchte, dann gibt es da zwei 3-polige Kontakte, beschriftet mit VDD/GND/ADCx (x = 2..3). Hier kann man 3-polige Stiftleisten auflöten, an die dann die Sensoren angeschlossen werden.&lt;br /&gt;
&lt;br /&gt;
Man braucht dazu:&lt;br /&gt;
* 1-reihige Stiftleiste RM 2,54mm (z.B. 36-polig 732478)&lt;br /&gt;
* Zwei Keramik-Vielschicht-Kondensatoren 100nF (C16, C17); RM 2,54mm (453099)&lt;br /&gt;
* Ein Elektrolyt-Kondensator stehend 470 uF / 16V (C18); RM 3,5mm (446211)&lt;br /&gt;
* Zwei 3-polige Steckbuchsen mit Litze zum Anschluß der Sensoren&lt;br /&gt;
Man trennt von der 1-reihigen Stiftleiste zweimal 3 Kontakte ab und lötet sie auf die weiß umrahmten Kontakte (VDD/GND/ADCx; SP2 C23: ADC2, YGND8, YVDD6, ADC3, YGND7, YVDD5), anschließend C16, C17 (SP2 C1: C16*, C17*) auf ihre Plätze und zum Schluß den Elko 470 uF (C18; SP2 B1: C18*). Beim Elko auf die Polung achten: Er muss genau so sitzen wie sein Nachbar C1 (Minuspol schaut zum Beeper SND).&lt;br /&gt;
&lt;br /&gt;
Die Sensoren lötet man an die Litzen der 3-poligen Steckbuchsen und steckt diese auf die neuen Kontakte.&lt;br /&gt;
&lt;br /&gt;
Da manche Sensoren einen höheren Stromverbrauch haben, kann man die Stromversorgung an den VDD-Pins der ADC2/3-Stecker abschaltbar machen oder eine separate +5V-Spannung einspeisen. Siehe dazu den Abschnitt &amp;quot;Trennstellen - Getrennte Stromversorgung für ADC2/3&amp;quot; weiter unten!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====== ISP (In System Programming) ======&lt;br /&gt;
Der ATMEGA32 der M32 wird standardmäßig über den PROG/UART Stecker programmiert. Dazu befindet sich im Prozessor ein Bootloader-Programm. Wenn man stattdessen oder zusätzlich die ISP-Programmierung mit einem dafür geeigneten ISP-Programmier-Adapter nutzen will, kann man den Adapter an den gewinkelten ISP-Stecker auf der M32 anschließen.&lt;br /&gt;
Vorher sind aber ein paar &amp;quot;Umbauarbeiten&amp;quot; erforderlich.&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_M32_ISP.JPG|thumb|ISP]]&lt;br /&gt;
&lt;br /&gt;
Man braucht dazu:&lt;br /&gt;
* 1-reihige Stiftleiste RM 2,54mm (z.B. 36-polig 732478)&lt;br /&gt;
* Einen SMD-Widerstand 10 kOhm (406376)&lt;br /&gt;
* Eine SMD-Diode LL 4148 (140902)&lt;br /&gt;
* Eine Codierbrücke (z.B. aus Set 742902)&lt;br /&gt;
&lt;br /&gt;
Der SMD-Widerstand wird auf seinen Platz (R1; SP1 A3: R1*) neben dem XBUS2-Stecker gelötet, danach die Diode LL 4148 (D2; SP1 B3: D2*). Die Kathode (Strich) der Diode zeigt in Richtung des Quarzes (X1). Zwischen R1 und C1 befinden sich drei Lötpunkte (beschriftet mit ISP/DEBUG - BOOTLOAD; SP1 A34: YRST1..3), auf die eine 3-polige Stiftleiste gelötet werden muss. Vorher muss eine kurze Leiterbahn zwischen den Lötpunkten BOOTLOAD aufgetrennt werden. Die Leiterbahn befindet sich auf der Lötseite der Platine und muss mit einem scharfen Messer oder einem speziellen Leiterbahn-Unterbrecher zwischen den beiden Lötpunkten unterbrochen werden. Man sollte anschließend mit einem Widerstandsmeßgerät nachmessen: Es sollte keine Verbindung mehr zwischen den Lötpunkten bestehen.&lt;br /&gt;
Man trennt dann von der 1-reihigen Stiftleiste 3 Kontakte ab und lötet sie auf die beschriebenen drei Lötpunkte.&lt;br /&gt;
&lt;br /&gt;
Wenn man jetzt eine Codierbrücke auf die mit &amp;quot;BOOTLOAD&amp;quot; beschrifteten Pins steckt, bleibt alles unverändert: Die Programmierung erfolgt weiter über den PROG/UART-Stecker mithilfe des Bootloaders im Prozessor. Wird die Codierbrücke in Stellung &amp;quot;ISP/DEBUG&amp;quot; umgesteckt, kann der Prozessor mit ISP programmiert werden.&lt;br /&gt;
&lt;br /&gt;
Vorsicht: Das Bootloader-Programm kann dabei zerstört werden! Es müssen zusätzlich Fusebits des ATMEGA32 verändert werden. &lt;br /&gt;
&lt;br /&gt;
Dabei kann der Prozessor im schlimmsten Fall nicht mehr ansprechbar sein. Man sollte diesen Umbau und die ISP-Programmierung nur machen, wenn man genau weiß, was man macht!&lt;br /&gt;
&lt;br /&gt;
Eine Kopie des Bootloaders und eine Kurzanleitung zum Einstellen der Fusebits gibt es hier: &lt;br /&gt;
[http://www.arexx.com/rp6/downloads/RP6_M32_BOOTLOADER.zip RP6_M32_BOOTLOADER]&lt;br /&gt;
&lt;br /&gt;
====== JTAG ======&lt;br /&gt;
[[Bild:RP6_M32_JTAG.JPG|thumb|JTAG]]&lt;br /&gt;
Die Programmierung und ein Debuggen sind auch mit der JTAG-Schnittstelle möglich. Das ist nur zu empfehlen, wenn man Erfahrungen mitbringt, oder der Prozessor der M32 durch eine ISP-Falschprogrammierung z.B. nicht mehr ansprechbar ist.&lt;br /&gt;
Um die JTAG-Schnittstelle nutzen zu können, muss der ISP-Umbau durchgeführt worden sein und die dort beschriebene Codierbrücke auf &amp;quot;ISP/DEBUG&amp;quot; gesteckt sein. Der JTAG-Programmer kann dann an die Lötpunkte &amp;quot;JTAG&amp;quot; zwischen ISP- und I/O-Stecker angeschlossen werden.&lt;br /&gt;
&lt;br /&gt;
Man braucht dazu:&lt;br /&gt;
* 2-reihige Stiftleiste RM 2,54mm (z.B. 2x36-polig 742007)&lt;br /&gt;
Man trennt von der 2-reihigen Stiftleiste 2x5 Kontakte ab und lötet sie auf die 10 JTAG-Lötpunkte (SP2 A12: YTDI, YTDO, YTMS, YTCK, YTRST, YVDD3/4, YGND3/4, YNC). Hier kann jetzt der JTAG-Programmer z.B. mit einem 10-poligen Flachkabel-Stecker angeschlossen werden. Um das JTAG-Interface des ATMEGA32 nutzen zu können, müssen Änderungen an den Fusebits vorgenommen werden.&lt;br /&gt;
&lt;br /&gt;
Vorsicht: Man sollte die JTAG-Programmierung und Fusebit-Manipulationen nur machen, wenn man genau weiß, was man macht!&lt;br /&gt;
&lt;br /&gt;
====== USRBUS ======&lt;br /&gt;
Die 14 Kontakte der beiden USRBUS-Stecker sind auf der M32 nirgendwo angeschlossen, sondern können über die Lötpunkte Y1..Y14 mit beliebigen Punkten auf der M32 verbunden werden.&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_M32_USRBUS.JPG|thumb|USRBUS]]&lt;br /&gt;
&lt;br /&gt;
Ich würde auf Y1..Y14 eine Stiftleiste löten, damit die USRBUS-Belegung geändert werden kann.&lt;br /&gt;
&lt;br /&gt;
Man braucht dazu:&lt;br /&gt;
* 2-reihige Stiftleiste RM 2,54mm (z.B. 2x36-polig 742007)&lt;br /&gt;
* Einige Steckbuchsen mit Litze&lt;br /&gt;
&lt;br /&gt;
Man trennt von der 2-reihigen Stiftleiste 2x7 Kontakte ab und lötet sie auf die Punkte Y1..Y14 (SP2 E3: Y1..Y14) neben dem Wannenstecker USRBUS2. Wird die M32 über Flachkabel mit einem USRBUS-Stecker auf einer RP6 Experimentierplatine (EP) und/oder mit dem RP6 selbst verbunden, dann hat man mit allen mit dem USRBUS verbundenen Platinen eine direkte 14-polige Verbindung,- eben den &amp;quot;User Bus&amp;quot;. Den kann man dann nutzen, wie man will. Auf der M32 kann man mit Steckbuchsen die Pins Y1..Y14 mit anderen Pins verbinden.&lt;br /&gt;
&lt;br /&gt;
Beispiel: Verbindet man den Pin &amp;quot;ADC2&amp;quot; mit Y1 des USRBUS, dann steht der Eingang ADC2 auf allen an den USRBUS angeschlossenen Platinen an Y1 zur Verfügung. Man braucht also diesen Eingang nicht über ein eigenes Kabel auf eine EP zu führen, sondern kann dazu den USRBUS nehmen. Dadurch bleibt der Gesamtaufbau auf dem RP6 übersichtlich und komplett trennbar (man braucht nur die Stecker XBUS und USRBUS abzuziehen!).&lt;br /&gt;
&lt;br /&gt;
Wichtig: Man sollte gut dokumentieren, wie man den USRBUS am RP6 (vorn und hinten getrennt!), auf EPs und der M32/M128 benutzt! Sonst kann es bei einer anderen Anordnung von EPs zu USRBUS Konflikten/Kurzschlüssen kommen.&lt;br /&gt;
&lt;br /&gt;
====== Schieberegister kaskadieren ======&lt;br /&gt;
[[Bild:RP6_M32_SPI.JPG|thumb|SPI]]&lt;br /&gt;
Auf der M32 wird ein 8-Bit Schieberegister-Baustein (IC3: 74HC4094D) dazu gebraucht, vier Status-LEDs (LED1..LED4) und ein LCD (am Stecker LCD) anzusteuern. Durch Schieberegister kann man Port-Pins gewinnen, wenn die Pins des Prozessors nicht ausreichen.&lt;br /&gt;
&lt;br /&gt;
Solche Schieberegister kann man &amp;quot;kaskadieren&amp;quot;, d.h. weitere identische Bausteine einbauen, die weitere Port-Pins zur Verfügung stellen. Wenn man zusätzliche 74HC4094 einsetzen will, wird man das am besten auf einer EP aufbauen. Die Anschlüsse für diese Schieberegister werden auf der M32 an einer 6-poligen Reihe von Lötpunkten (beschriftet mit MISO, STR, MOSI, SCK, QS, QS*; SP1 D3: YQS1/2, YMOSI, YSCK, YSTR, YMISO) links von IC3 zur Verfügung gestellt.&lt;br /&gt;
&lt;br /&gt;
Wenn man diese 6 Signalleitungen auf eine EP führen will, gibt es dafür zwei Möglichkeiten:&lt;br /&gt;
* a) Direkte 6-polige Kabelverbindung von den oben beschriebenen Lötpunkten zur EP&lt;br /&gt;
* b) Nutzung des USRBUS, um die 6 Signale zur EP zu führen&lt;br /&gt;
Wenn man im Abschnitt &amp;quot;[[RP6#USRBUS|USRBUS]]&amp;quot; den entsprechenden Umbau gemacht hat, würde ich b) empfehlen! Man könnte dafür eine 6-polige Stiftleiste auf die o.g. Lötpunkte auflöten und 1:1 z.B. mit den Pins Y4, Y6, Y8, Y10, Y12, Y14 des USRBUS verbinden. Dann kann man auf der EP weitere Schieberegister- und SPI-Bausteine (z.B. SPI-EEPROMs, [http://www.pollin.de/shop/dt/MDU5OTgxOTk-/Bausaetze_Module/Module/Funkmodul_RFM12_433_Sende_Empfangsmodul.html RFM12 Transceiver] o.ä.) aufbauen.&lt;br /&gt;
&lt;br /&gt;
Man braucht dazu:&lt;br /&gt;
* 1-reihige Stiftleiste RM 2,54mm (z.B. 36-polig 732478)&lt;br /&gt;
* Steckbuchsen mit Litze&lt;br /&gt;
Man trennt von der 1-reihigen Stiftleiste 6 Kontakte ab und lötet sie auf die beschriebenen sechs Lötpunkte auf der M32. Mit den Steckbuchsen mit Litze wird dann die Verbindung entweder direkt zur EP (Option a) oder über den USRBUS zur EP (Option b) hergestellt.&lt;br /&gt;
&lt;br /&gt;
====== VDD/GND/+UB Anschluß ======&lt;br /&gt;
[[Bild:RP6_M32_VDDGNDUB.JPG|thumb|RP6 M32 VDD GND +UB]]&lt;br /&gt;
VDD, GND und +UB (SP2 C3: YUB1, YGND1/2/5, YVDD1/2) kann man auf der M32 an diesen Lötpunkten abnehmen.&lt;br /&gt;
&lt;br /&gt;
Natürlich kann man hier auch Stiftleisten auflöten.&lt;br /&gt;
&lt;br /&gt;
Auf der anderen Platinenseite (zwischen dem USRBUS1 und ISP Stecker) befinden sich zusätzlich noch 2 weitere Lötpunkte, an denen man VDD und GND kontaktieren kann.&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;
&lt;br /&gt;
====== Serielle Schnittstelle ======&lt;br /&gt;
[[Bild:RP6_M32_RST.JPG|thumb|RP6 M32 RST]]&lt;br /&gt;
Neben dem PROG/UART Stecker befinden sich 5 Lötpunkte mit den Signalen RST, TX, RX, GND, VDD (SP2 BC3: YRX, YTX, YRST, YVDD, YGND). Hier kann z.B. eine 5-polige Stiftleiste aufgelötet werden, um einen Anschluß an die serielle Schnittstelle zu ermöglichen.&lt;br /&gt;
 &lt;br /&gt;
Von diesen 5 Lötpunkten könnte z.B. auch eine Verbindung zum USRBUS hergestellt werden, um die serielle Schnittstelle der M32 auf EPs zu führen.&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;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====== MEM_CS2 ======&lt;br /&gt;
[[Bild:RP6_M32_MEM_CS2.JPG|thumb|RP6 M32 MEM_CS2]]&lt;br /&gt;
MEM_CS2 (M32 Microcontroller Pin PB1) kann man am IC5-Sockel an Pin 1 (SP1 A1: IC5*, Pin 1) kontaktieren. Falls IC5 nicht eingesetzt werden soll, kann man hier durch Einstecken eines Kabels in Pin 1 des IC5-Sockels PB1 nutzen und z.B. zum USRBUS führen.&lt;br /&gt;
&lt;br /&gt;
===== Mess-/Kontaktpunkte =====&lt;br /&gt;
Hier geht es um Kontaktpunkte, an denen man z.B. den Logik-Pegel (High/Low) oder eine analoge Spannung messen kann. Natürlich kann man die Signale auch zur Weiterleitung auf eine EP kontaktieren, dies wird man aber normalerweise nicht brauchen.&lt;br /&gt;
&lt;br /&gt;
====== M-Signal ======&lt;br /&gt;
[[Bild:RP6_M32_M_SIGNAL.JPG|thumb|RP6 M32 M-Signal]]&lt;br /&gt;
An diesem Messpunkt (SP1 E3: YM_SIGNAL) neben D1 kann man die Ausgangsspannung des Mikrofon-Verstärkers IC4 (SP1 E3: IC4) messen oder z.B. mit einem Oszilloskop darstellen.&lt;br /&gt;
&lt;br /&gt;
===== Trennstellen =====&lt;br /&gt;
An diesen Stellen können Leiterbahnen unterbrochen werden, um Funktionen zu deaktivieren oder anders zu nutzen. &lt;br /&gt;
&lt;br /&gt;
====== Getrennte Stromversorgung für ADC2/3 ======&lt;br /&gt;
Wenn man für die analogen Sensoren an ADC2/3 (siehe Abschnitt &amp;quot;Anschlüsse - Analoge Sensoren an ADC2/3&amp;quot; weiter oben!) eine GETRENNTE Stromversorgung vorsehen will und/oder mit Codierbrücke (oder MOSFET) die Stromversorgung abschaltbar machen möchte, muss man erst Vorarbeit leisten.&lt;br /&gt;
[[Bild:RP6_M32_SV.jpg|thumb|RP6 M32 SV]]&lt;br /&gt;
&lt;br /&gt;
Man braucht dazu:&lt;br /&gt;
* 1-reihige Stiftleiste RM 2,54mm (z.B. 36-polig 732478)&lt;br /&gt;
* Evtl.: Eine Codierbrücke (z.B. aus Set 742902)&lt;br /&gt;
* Evtl.: Eine 1-polige Steckbuchse mit Litze zur ext. Stromversorgung&lt;br /&gt;
Es muss eine kurze Leiterbahn zwischen den Punkten &amp;quot;SV1&amp;quot; und &amp;quot;SV2&amp;quot; (SP2 B2: SV1, SV2) aufgetrennt werden. Die Leiterbahn befindet sich auf der Lötseite der Platine und muss mit einem scharfen Messer oder einem speziellen Leiterbahn-Unterbrecher zwischen den beiden Lötpunkten unterbrochen werden. Man sollte anschließend mit einem Widerstandsmeßgerät zwischen SV1 und SV2 nachmessen: Es sollte keine Verbindung mehr bestehen. Jetzt trennt man von der 1-reihigen Stiftleiste 2 Kontakte ab und lötet sie auf die Punkte SV1/SV2.&lt;br /&gt;
&lt;br /&gt;
Man kann hier zunächst eine Codierbrücke aufstecken. Damit versorgt der RP6 Akku die Sensoren mit 5V an den Pins VDD. Möchte man später eine getrennte 5V-Spannung anlegen, zieht man einfach die Codierbrücke ab und speist die externe 5V-Spannung (mit einer 1-poligen Steckbuchse) am Pin SV2 ein. Achtung: An Pin SV1 wird dann nichts angeschlossen!&lt;br /&gt;
&lt;br /&gt;
Anstelle der Codierbrücke kann man natürlich auch einen MOSFET anschließen, um die Sensoren per Software abschalten zu können.&lt;br /&gt;
&lt;br /&gt;
====== Interrupt-Zuordnung ändern ======&lt;br /&gt;
Am XBUS stehen vier Interrupt-Pins (genannt INT1..INT3, INTU) zur Verfügung. INT1 ist auf der RP6 Base mit PA4 verbunden, auf der M32 mit PD2 (Prozessor INT0), auf der M128 mit PE5 (Prozessor INT5) und auf der [[RP6v2#RP6v2_M256_WiFi_Platine|RP6 M256 WiFi]] mit PJ3 (Prozessor PCINT12). Diese Tabelle zeigt die Verbindung aller Interruptleitungen auf den Platinen (RP6 Base, M32, M128, M256 WiFi) über den XBUS:&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |XBUS Pin&lt;br /&gt;
 |XBUS INTx&lt;br /&gt;
 |RP6 Base Pin&lt;br /&gt;
 |RP6 Base INTx&lt;br /&gt;
 |RP6 M32 Pin&lt;br /&gt;
 |RP6 M32 INTx&lt;br /&gt;
 |RP6 M128 Pin&lt;br /&gt;
 |RP6 M128 INTx&lt;br /&gt;
 |RP6 M256 Pin&lt;br /&gt;
 |RP6 M256 INTx&lt;br /&gt;
 |-&lt;br /&gt;
 |8&lt;br /&gt;
 |INT1&lt;br /&gt;
 |PA4&lt;br /&gt;
 |kein&lt;br /&gt;
 |PD2&lt;br /&gt;
 |INT0&lt;br /&gt;
 |PE5&lt;br /&gt;
 |INT5&lt;br /&gt;
 |PJ3&lt;br /&gt;
 |PCINT12&lt;br /&gt;
 |-&lt;br /&gt;
 |11&lt;br /&gt;
 |INT2&lt;br /&gt;
 |n.c.&lt;br /&gt;
 |&lt;br /&gt;
 |PD3 *&lt;br /&gt;
 |INT1&lt;br /&gt;
 |n.c.&lt;br /&gt;
 |&lt;br /&gt;
 |PJ6&lt;br /&gt;
 |PCINT15&lt;br /&gt;
 |-&lt;br /&gt;
 |9&lt;br /&gt;
 |INT3&lt;br /&gt;
 |n.c.&lt;br /&gt;
 |&lt;br /&gt;
 |PB2 *&lt;br /&gt;
 |INT2&lt;br /&gt;
 |PE6&lt;br /&gt;
 |INT6&lt;br /&gt;
 |PJ5&lt;br /&gt;
 |PCINT14&lt;br /&gt;
 |-&lt;br /&gt;
 |7&lt;br /&gt;
 |INTU&lt;br /&gt;
 |n.c.&lt;br /&gt;
 |&lt;br /&gt;
 |n.c.    *&lt;br /&gt;
 |&lt;br /&gt;
 |n.c.&lt;br /&gt;
 |&lt;br /&gt;
 |PJ4&lt;br /&gt;
 |PCINT13&lt;br /&gt;
 |-&lt;br /&gt;
|}&lt;br /&gt;
'''Zu *:''' Standard-Belegung. Ggf. abhängig von der nachfolgend beschriebenen Interrupt-Zuordnung!&lt;br /&gt;
&lt;br /&gt;
Auf der M32 kann man die Interrupt-Zuordnung für INT2, INT3 und INTU durch drei Codierbrücken (beschriftet mit I2-INTU, INT3-I3, I2-INT2; SP2 A3: YINT2/3/U, YI2_1/2, YI3) ändern.&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_M32_INTx.JPG|thumb|INTx]]&lt;br /&gt;
&lt;br /&gt;
Man braucht dazu:&lt;br /&gt;
* 2-reihige Stiftleiste RM 2,54mm (z.B. 2x36-polig 742007)&lt;br /&gt;
* Drei Codierbrücken (z.B. aus Set 742902)&lt;br /&gt;
Vor dem Auflöten der Stiftleiste müssen zwei kurze Leiterbahnen zwischen zwei Lötpunkten aufgetrennt werden, und zwar zwischen den Lötpunkten INT3-I3 und I2-INT2. Die Leiterbahnen müssen mit einem scharfen Messer oder einem speziellen Leiterbahn-Unterbrecher zwischen den beiden Lötpunkten unterbrochen werden. Man sollte anschließend mit einem Widerstandsmeßgerät nachmessen: Es sollte keine Verbindung mehr zwischen INT3-I3 und I2-INT2 bestehen. Man trennt dann von der 2-reihigen Stiftleiste 2x3 Kontakte ab und lötet sie auf das weiß umrahmte Feld mit der o.g. Beschriftung.&lt;br /&gt;
&lt;br /&gt;
Hier kann man auf INT3-I3 und I2-INT2 je eine Codierbrücke aufstecken, wenn man die Standard-Belegung beibehalten will. Steckt man auf I2-INTU eine Codierbrücke, dann ist INTU des XBUS mit Pin PD3 (I2) der M32 verbunden.&lt;br /&gt;
&lt;br /&gt;
'''Hinweis:''' Man kann auf die 6-polige Stiftleiste auch Codierbrücken QUER zur eigentlichen (horizontalen) Richtung aufsetzen. Dadurch kann jede der 3 Interruptleitungen des XBUS (INT2, INT3, INTU) mit jedem der 2 Interrupt Pins der M32 (PD3, PB2) verbunden werden.&lt;br /&gt;
&lt;br /&gt;
Wenn man keine der Codierbrücken aufsteckt, sind die Pins PD3 (I2) und PB2 (I3) des M32-Prozessors nicht mehr mit dem XBUS verbunden und können anders verwendet werden. Auf der M32 kann man dann z.B. auch andere Verbindungen zum XBUS herstellen, indem man auf die Pins INT2, INT3 oder INTU Kabelverbindungen aufsteckt.&lt;br /&gt;
&lt;br /&gt;
====== ADC0 und ADC1 frei nutzen ======&lt;br /&gt;
Auf der M32 ist ADC0 fest mit dem Mikrofon (MIC) und ADC1 mit den Tastern T1..T5 (KEYPAD) verbunden. Wenn man diese ADC-Eingänge für andere Sensoren benötigt, kann man das Mikrofon und die Taster von den Eingängen abtrennen.&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_M32_MIC_KEY.JPG|thumb|MIC_KEYPAD]]&lt;br /&gt;
&lt;br /&gt;
Man braucht dazu:&lt;br /&gt;
* 1-reihige Stiftleiste RM 2,54mm (z.B. 36-polig 732478)&lt;br /&gt;
* Eine Codierbrücke (z.B. aus Set 742902)&lt;br /&gt;
&lt;br /&gt;
MIC/ADC0:&lt;br /&gt;
Es muss eine kurze Leiterbahn zwischen zwei Lötpunkten aufgetrennt werden, die sich zwischen R2 und C19 befinden (SP1 D4: YM1, YM2). Die Leiterbahn muss mit einem scharfen Messer oder einem speziellen Leiterbahn-Unterbrecher zwischen den beiden Lötpunkten unterbrochen werden. Man sollte anschließend mit einem Widerstandsmeßgerät nachmessen: Es sollte keine Verbindung mehr bestehen. Vorsicht: Nicht R2 beschädigen! Damit ist das Mikrofon auf der M32 ohne Funktion und ADC0 kann anders genutzt werden. ADC0 ist dann am oberen Lötpunkt zwischen R2 und C19 verfügbar, dort müßte eine Kabelverbindung angelötet werden.&lt;br /&gt;
Soll das Mikrofon später doch wieder an ADC0 angeschlossen werden, verbindet man die beiden Lötpunkte zwischen R2 und C19 einfach mit etwas Lötzinn oder mit einem SMD Null Ohm Widerstand.&lt;br /&gt;
&lt;br /&gt;
KEYPAD/ADC1:&lt;br /&gt;
Es muss eine kurze Leiterbahn zwischen zwei Lötpunkten aufgetrennt werden, die sich unterhalb von R15 befinden (SP1 D2: YKP1, YKP2). Die Leiterbahn befindet sich auf der Lötseite der Platine und muss mit einem scharfen Messer oder einem speziellen Leiterbahn-Unterbrecher zwischen den beiden Lötpunkten unterbrochen werden. Man sollte anschließend mit einem Widerstandsmeßgerät nachmessen: Es sollte keine Verbindung mehr bestehen. Jetzt trennt man von der 1-reihigen Stiftleiste 2 Kontakte ab und lötet sie auf die beiden Punkte unterhalb von R15. Hier kann man jetzt eine Codierbrücke aufstecken, wenn man die Taster weiter benutzen will. Wenn die Brücke abgezogen ist, sind die Taster ohne Funktion und ADC1 kann anders genutzt werden. ADC1 ist dann am linken Pin der 2-poligen Stiftleiste unterhalb von R15 verfügbar.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== RP6 CCPRO M128 Platine===&lt;br /&gt;
&lt;br /&gt;
[[Bild:CCPRO M128 k-1-.jpg|Das CCPRO M128]]&lt;br /&gt;
&lt;br /&gt;
====Technische Daten====&lt;br /&gt;
{|  {{Blauetabelle}} &lt;br /&gt;
|'''Mikrocontroller:'''&lt;br /&gt;
|Steckplatz für ein C-Control PRO MEGA128 Modul mit einem ([https://www.conrad.de/de/p/c-control-prozessor-unit-mega-128-pro-198219.html] ATMEGA128)&lt;br /&gt;
|-&lt;br /&gt;
|'''Speicher:'''&lt;br /&gt;
|128 kB [[Flash]]-Speicher, davon 4 kB bereits vom Bootloader belegt&amp;lt;br/&amp;gt;&lt;br /&gt;
4 kB SRAM intern&amp;lt;br/&amp;gt; &lt;br /&gt;
64 kB SRAM extern&amp;lt;br/&amp;gt;&lt;br /&gt;
4 kB [[EEPROM]]&lt;br /&gt;
|-&lt;br /&gt;
|'''Programmierung:'''&lt;br /&gt;
|Über CCPRO-IDE&lt;br /&gt;
|-&lt;br /&gt;
|'''Vorhandene Sensoren:'''&lt;br /&gt;
|1 12bit I²C Temperatursensor &amp;lt;br/&amp;gt;&lt;br /&gt;
19 I/O-Ports, davon 8 ADCs, 3 PWM (Servos) und 2 I/Os für eine weitere serielle Schnittstelle (UART)&lt;br /&gt;
|-&lt;br /&gt;
|'''Vorhandene Aktoren:'''&lt;br /&gt;
|1 Beeper&amp;lt;br/&amp;gt;&lt;br /&gt;
5 Status-LEDs&amp;lt;br/&amp;gt;&lt;br /&gt;
1 LC-Display-Port&amp;lt;br/&amp;gt;&lt;br /&gt;
1 Sockel für ein I²C-Bus EEPROM vom Typ 24(L)Cxxx&lt;br /&gt;
|-&lt;br /&gt;
|'''Abmessungen:'''&lt;br /&gt;
|(L &amp;amp;times; B &amp;amp;times; H) 112 &amp;amp;times; 90 &amp;amp;times; 21 mm&lt;br /&gt;
|-&lt;br /&gt;
|'''Ausführung:'''&lt;br /&gt;
|Fertig aufgebautes Erweiterungsmodul&lt;br /&gt;
|-&lt;br /&gt;
|'''Stromversorgung:'''&lt;br /&gt;
|6 AA NiMH Akkus (über die RP6 Base)&lt;br /&gt;
|-&lt;br /&gt;
|'''Hersteller:'''&lt;br /&gt;
|Arexx Niederlande&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Umbauoptionen====&lt;br /&gt;
Auf der CCPRO M128 ([http://www.conrad.de/ce/de/product/191563/Arexx-RP6-CC-PRO-MEGA128-Erweiterungssatz 191563]) kann leider nicht so viel umgebaut werden:&lt;br /&gt;
&lt;br /&gt;
* I2C-EEPROM&lt;br /&gt;
* Freie Nutzung von PORTA* und PORTC*&lt;br /&gt;
* USRBUS&lt;br /&gt;
* A16-/PD4-Nutzung&lt;br /&gt;
&lt;br /&gt;
Im Text gibt es Verweise auf den Schaltplan der CCPRO M128 (RP6_CCPRO_M128_Schematic.PDF) in der Form: (SP2 B1: Bauteil).  Dies bedeutet, dass man das Bauteil auf Blatt 2 des M128-Schaltplans im Feld B1 finden kann.&lt;br /&gt;
&lt;br /&gt;
Bei den Materialangaben ist öfter die Rede von &amp;quot;Steckbuchsen mit Litze&amp;quot;. Diese Steckbuchsen mit angelöteter Litze können auf die ein- oder zweireihigen Stiftleisten aufgesteckt werden. Leider gibt es sie nicht (mehr) fertig konfektioniert bei CONRAD. Die einreihigen Steckbuchsen (RM 2,54mm) kann man aber z.B. bei [http://www.elv.de/output/controller.aspx ELV] bekommen: 2-polig (68-016635), 3-polig (68-022503) und 5-polig (68-023073). An sie muss man dann noch Litzen in der entsprechenden Länge selbst anlöten.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=====I2C-EEPROM=====&lt;br /&gt;
Zum Einsetzen eines I2C-EEPROMS (IC6; SP2 C1: IC6) braucht man nichts umzubauen. Man kauft einfach ein passendes EEPROM des Typs 24(L)Cxxxx-P und setzt es auf seinen Sockel, Kerbe zum oberen Platinenrand.&lt;br /&gt;
&lt;br /&gt;
Mögliche Typen (erhältlich z.B. bei [http://www.digikey.de/ Digi-Key] oder bei [http://www.reichelt.de./ Reichelt]):&lt;br /&gt;
* AT24C128  (AT24C128-10PU-2.7-ND)&lt;br /&gt;
* AT24C256  (AT24C256-10PU-2.7-ND)&lt;br /&gt;
* AT24C512  (AT24C512-10PU-2.7-ND)&lt;br /&gt;
* AT24C1024 (AT24C1024-10PI-2.7-ND)&lt;br /&gt;
&lt;br /&gt;
=====Anschlüsse=====&lt;br /&gt;
Hier wird aufgelistet, wo man auf der M128 Platine Anschlüsse nutzen kann, um sie z.B. zu weiteren Sensoren, zum USRBUS oder (weniger empfehlenswert!) direkt zu EPs, zur RP6 Base oder zur M32 zu führen. &lt;br /&gt;
&lt;br /&gt;
======Freie Nutzung von PORTA* und PORTC*======&lt;br /&gt;
Um PORTA* und PORTC* frei nutzen zu können (für weitere I/O-Ports), muss man auf das externe SRAM verzichten, was nicht sehr ratsam ist. Mehr I/O-Ports kann man alternativ durch I/O Expander gewinnen. Falls man das SRAM trotzdem deaktivieren will, hier die Anleitung.&lt;br /&gt;
&lt;br /&gt;
Für den Umbau braucht man:&lt;br /&gt;
* Wannenstecker 2x5-polig gerade RM 2,54mm (z.B. [http://www.reichelt.de./ Reichelt] WSL 10G)&lt;br /&gt;
* 1-reihige Stiftleiste RM 2,54mm (z.B. 36-polig 732478)&lt;br /&gt;
* Eine Codierbrücke (z.B. aus Set 742902)&lt;br /&gt;
[[Bild:RP6_M128_PortA.JPG|thumb|PORTA*]]&lt;br /&gt;
&lt;br /&gt;
Für die Bestückung von PORTA* (SP2 AB2: Stecker PORTA*) lötet man den Wannenstecker hier (siehe Abb. PORTA*) auf.&lt;br /&gt;
[[Bild:RP6_M128_PortC.JPG|thumb|PORTC*]]&lt;br /&gt;
&lt;br /&gt;
Für die Bestückung von PORTC* (SP1 A2: PC0..7, YGND1) trennt man von der 1-reihigen Stiftleiste 9 Kontakte ab und lötet sie auf die PORTC*-Lötpunkte (siehe Abb. PORTC*).&lt;br /&gt;
&lt;br /&gt;
Dann muss noch der SRAM-Enable Jumper (SP1 EF1: Y27..29) bestückt werden:&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_M128_EN_SRAM.JPG|EN_SRAM]]&lt;br /&gt;
&lt;br /&gt;
Man trennt von der 1-reihigen Stiftleiste 3 Kontakte ab und lötet sie auf die abgebildeten Lötpunkte. Vorher muss eine Leiterbahn auf der Lötseite der Platine zwischen den ENABLE-Lötpunkten aufgetrennt werden.&lt;br /&gt;
Wenn das SRAM wie bisher genutzt werden soll, steckt man die Codierbrücke auf die Stellung &amp;quot;ENABLE&amp;quot;. Will man stattdessen Port A und Port C frei nutzen (und damit auf SRAM verzichten!), kommt die Codierbrücke auf &amp;quot;DISABLE&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
======USRBUS======&lt;br /&gt;
Auf die 14 Kontakte neben dem Wannenstecker USRBUS2 ist noch nichts gelötet.&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_M128_USRBUS.JPG|thumb|USRBUS]]&lt;br /&gt;
&lt;br /&gt;
Ich würde auf Y1..Y14 eine Stiftleiste löten, damit die USRBUS-Belegung geändert werden kann.&lt;br /&gt;
&lt;br /&gt;
Man braucht dazu:&lt;br /&gt;
* 2-reihige Stiftleiste RM 2,54mm (z.B. 2x36-polig 742007)&lt;br /&gt;
* Einige Steckbuchsen mit Litze&lt;br /&gt;
&lt;br /&gt;
Man trennt von der 2-reihigen Stiftleiste 2x7 Kontakte ab und lötet sie auf die Punkte Y1..Y14 (SP2 E234: Y1..Y14) neben dem Wannenstecker USRBUS2. Wird die M128 über Flachkabel mit einem USRBUS-Stecker auf einer RP6 Experimentierplatine (EP) und/oder mit dem RP6 selbst verbunden, dann hat man mit allen mit dem USRBUS verbundenen Platinen eine direkte 14-polige Verbindung,- eben den &amp;quot;User Bus&amp;quot;. Den kann man dann nutzen, wie man will. Auf der M128 kann man mit Steckbuchsen die Pins Y1..Y14 mit anderen Pins verbinden.&lt;br /&gt;
&lt;br /&gt;
Beispiel: Verbindet man den Pin &amp;quot;ADC4&amp;quot; mit Y1 des USRBUS, dann steht der Eingang ADC4 auf allen an den USRBUS angeschlossenen Platinen an Y1 zur Verfügung. Man braucht also diesen Eingang nicht über ein eigenes Kabel auf eine EP zu führen, sondern kann dazu den USRBUS nehmen. Dadurch bleibt der Gesamtaufbau auf dem RP6 übersichtlich und komplett trennbar (man braucht nur die Stecker XBUS und USRBUS abzuziehen!).&lt;br /&gt;
&lt;br /&gt;
Wichtig: Man sollte gut dokumentieren, wie man den USRBUS am RP6 (vorn und hinten getrennt!), auf EPs und der M128 benutzt! Sonst kann es bei einer anderen Anordnung von EPs zu USRBUS Konflikten/Kurzschlüssen kommen.&lt;br /&gt;
&lt;br /&gt;
======IC5 ALERT======&lt;br /&gt;
[[Bild:RP6_M128_IC5_ALERT.JPG|thumb|IC5 ALERT]]&lt;br /&gt;
Dieser Lötpunkt (SP2 C2: AL) neben IC5 ist der Anschluß ALERT (Pin 3) des I2C-Temperatursensors TCN75A (SP2 C2: IC5).&lt;br /&gt;
&lt;br /&gt;
Dies ist ein Open-Drain Ausgang, der ein Alarm-Signal ausgibt, wenn die Temperatur die eingestellten Grenzen über-/unterschreitet (siehe auch Datenblatt des Sensors (TCN75A.pdf), Abschnitt 5.3.4!). Wenn man ALERT auf einen Eingang des Microcontrollers führen will, muß man auch noch einen Pullup-Widerstand vorsehen oder den internen Pullup des uC-Eingangs aktivieren.&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;
======VDD/GND Anschluß======&lt;br /&gt;
[[Bild:RP6_M128_VDDGND.JPG|thumb|VDD GND]]&lt;br /&gt;
Auf der CCPRO M128 gibt es 2 Lötpunkte (SP1 E34: YVDD3, YGND4) zwischen R5 und C7 bzw. direkt neben der Codierbrücke (SP1 E3: YL9, YL10) zum Deaktivieren von LED5.&lt;br /&gt;
&lt;br /&gt;
Hier könnte man VDD und GND kontaktieren. VDD ist der Lötpunkt, der näher an R5 liegt.&lt;br /&gt;
&lt;br /&gt;
=====Trennstellen=====&lt;br /&gt;
An diesen Stellen können Leiterbahnen unterbrochen werden, um Funktionen zu deaktivieren oder anders zu nutzen. &lt;br /&gt;
&lt;br /&gt;
======A16-/PD4-Nutzung======&lt;br /&gt;
&lt;br /&gt;
[[Bild:v2RP6_M128_A16.JPG|thumb|A16/PD4]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Auf der CCPRO M128 gibt es ein 3-poliges Feld von Lötpunkten (SP2 AB1: PD4, A16, GND) unter dem CCPRO MEGA128 Modul (IC1). Standardmässig ist A16 des SRAM (IC3) hier auf GND gelegt. Damit kann man PD4 des Prozessors (ICP1) frei nutzen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Will man A16 des SRAM mit PD4 schaltbar machen, muss man eine Leiterbahn auf der Bestückungsseite zwischen den oberen zwei der drei Lötpunkte auftrennen und die anderen (unteren) beiden Lötpunkte mit etwas Lötzinn oder einem SMD Null Ohm Widerstand verbinden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der Sinn dieses Umbaus besteht darin, dass man danach anstelle von 64kB nun die vollen 128kB SRAM des IC3 adressieren kann. Man muss dann aber PD4 selbst schalten, da C-Control PRO ab Version 1.50 nur 64kB ext. SRAM ansteuern kann. Immerhin könnte man dann 2 Blöcke à je 64kB nutzen und mit PD4 zwischen beiden Blöcken umschalten.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ob CCPRO damit klar kommt: Wohl kaum! Ich würde daher diesen Umbau nicht durchführen.&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Zubehör und Ersatzteile ==&lt;br /&gt;
Von [http://www.conrad.de/ce/ CONRAD] gibt es z.B. &lt;br /&gt;
&lt;br /&gt;
* das LC- ([http://www.conrad.de/ce/de/product/190911/LC-DISPLAY-16-X-2-KONFEKTIONIERT 190911] AUSVERKAUFT!) oder Backlight-Display ([http://www.conrad.de/ce/de/product/191621/DISPLAY-RP5RP6-BLAU-MIT-BACKLIGHT 191621] AUSVERKAUFT!), welche an die M32, an die CCPRO M128 und an die M256 WiFi angeschlossen werden können,&lt;br /&gt;
* einen IR-Ball ([http://www.conrad.de/ce/de/product/191437/INFRAROT-BALL-FUeR-ROBOTER-FUssBALL 191437] AUSVERKAUFT!),&lt;br /&gt;
* einen Graustufen-Boden-Sensor ([http://www.conrad.de/ce/de/product/191599/GRAUSTUFEN-BODEN-SENSOR-FUeR-FUssBALLROBOT 191599] AUSVERKAUFT!),&lt;br /&gt;
* eine IR-Fernbedienung Promo 8 ([http://www.conrad.de/ce/de/product/340720/PROMO-8-UNIVERSALFERNBEDIENUNG 340720] AUSVERKAUFT!) oder Vivanco UR 89 ([http://www.conrad.de/ce/de/product/351013/VivancoUR-89-Fernbedienung-8-Geraete 351013] AUSVERKAUFT!),&lt;br /&gt;
* Ersatzräder ([http://www.conrad.de/ce/de/product/191307/ANTRIEBSRAD-RP5RP6 191307] AUSVERKAUFT!),&lt;br /&gt;
* Ersatzzahnräder ([http://www.conrad.de/ce/de/product/191346/SCHRAeG-ZAHNRAeDERSATZ-RP5RP6 191346]) und&lt;br /&gt;
* Ersatzraupen ([http://www.conrad.de/ce/de/product/191333/RAUPENSATZ-RP5RP6 191333] AUSVERKAUFT!).&lt;br /&gt;
&lt;br /&gt;
===Displays===&lt;br /&gt;
Die vorkonfektionierten Displays kann man zum Ausgeben von Texten, Sensordaten und kleinen Animationen benutzen. Sie können an die M32, an die CCPRO M128 und an die M256 WiFi angeschlossen werden.&lt;br /&gt;
&lt;br /&gt;
Diese 16x2 Zeichen Displays sind bisher lieferbar:&lt;br /&gt;
&lt;br /&gt;
* LC-Display ([http://www.conrad.de/ce/de/product/190911/LC-DISPLAY-16-X-2-KONFEKTIONIERT 190911])&lt;br /&gt;
* OLED-Display (197622)&lt;br /&gt;
* Backlight-Display AREXX RP-DSP88 ([http://www.conrad.de/ce/de/product/191621/DISPLAY-RP5RP6-BLAU-MIT-BACKLIGHT 191621])&lt;br /&gt;
&lt;br /&gt;
Das LCD ist seit September 2018 bei CONRAD ausverkauft; zeitweise (2007/08) gab es unter dieser Bestellnummer eine Version, die zu klein (66 x 37mm) war, um sie auf der M32, der CCPRO M128 oder der M256 WiFi zu montieren.&lt;br /&gt;
&lt;br /&gt;
Das OLED-Display ist aktuell (April 2012) nicht mehr lieferbar.&lt;br /&gt;
&lt;br /&gt;
Das zuletzt ausschließlich nur noch erhältliche blaufarbige Backlight-Display ist seit Mai 2020 bei CONRAD ausverkauft.&lt;br /&gt;
&lt;br /&gt;
Diese Displays können mit 4 M3-Abstandbolzen 25 mm ([http://www.conrad.de/ce/de/product/526665/Abstandsbolzen1-x-Aussengewinde1-x-InnengewindeMessing-vernickelt-Schluesselweite-55-mm Bestell-Nr. 526665]) und 4 Muttern M3 ([http://www.conrad.de/ce/de/product/815624/TOOLCRAFT-Sechskant-Muttern-DIN-934-934-Stahl-verzinkt-M3-100-St z.B. aus 815624]), sowie 4 Schrauben M3 ([http://www.conrad.de/ce/de/product/815322/TOOLCRAFT-Linsenkopfschrauben-mit-Kreuzschlitz-DIN-7985-7985-6-mm-Stahl-verzinkt-Guete-48-M3-100-St z.B. aus 815322]) auf der M32, der CCPRO M128 oder der M256 WiFi befestigt werden. Leider sind die Befestigungslöcher der Displays zu klein für ein M3-Gewinde, so dass man die Löcher sehr vorsichtig auf 3..3,2 mm erweitern muss.&lt;br /&gt;
&lt;br /&gt;
===IR-Ball===&lt;br /&gt;
Den IR-Ball (AREXX IRB-35, AUSVERKAUFT!) kann man benutzen, um mit dem RP6 Fußball oder Ähnliches zu spielen. Der Ball kann dann von den IR-Sensoren des RP6 erkannt und geortet werden.&lt;br /&gt;
&lt;br /&gt;
===Graustufen-Boden-Sensor===&lt;br /&gt;
Der Graustufen-Boden-Sensor (AREXX ARX-GS7) dient zur Orientierung eines Roboters auf einem Fußballfeld, das in bestimmten Grauabstufungen eingefärbt ist (CONRAD 191404  AUSVERKAUFT!). Dieser Fußballfeld-Aufkleber (AREXX ARX-FF008) ist bei CONRAD und bei [http://www.elv.de ELV] (Artikel-Nummer 68-101831) ausverkauft.&lt;br /&gt;
&lt;br /&gt;
===IR-Fernbedienung===&lt;br /&gt;
[[Bild:RP6_RC.jpg|thumb|2 RC5 Fernbedienungen]]&lt;br /&gt;
Mit einer Universal-IR-Fernbedienung, die den RC5-IR-Code senden kann, kann der RP6 wie ein ferngesteuertes &amp;quot;Auto&amp;quot; verwendet werden. Im Beispielprogramm &amp;quot;Example_08_TV_REMOTE&amp;quot; im Ordner der RP6-Base-Demos wird das noch genauer erläutert.&lt;br /&gt;
&lt;br /&gt;
===Ersatzräder===&lt;br /&gt;
Die Ersatzräder dienen als Ersatzteile für den RP6, RP6v2 und das RP5/RP6-Fahrgestell.&lt;br /&gt;
&lt;br /&gt;
===Ersatzzahnräder===&lt;br /&gt;
Die Ersatzzahnräder dienen als Ersatzteile für den RP6, RP6v2 und das RP5/RP6-Fahrgestell.&lt;br /&gt;
&lt;br /&gt;
===Ersatzraupen===&lt;br /&gt;
Die Ersatzraupen dienen als Ersatzteile für den RP6, RP6v2 und das RP5/RP6-Fahrgestell.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Programmierung==&lt;br /&gt;
Um diesen Grundlagenartikel zum RP6 nicht immer länger werden zu lassen, habe ich den Teil zur Programmierung des [[RP6_-_Programmierung#RP6_Base_und_CONTROL_M32|RP6]] und seiner Erweiterungsplatinen [[RP6_-_Programmierung#RP6_Base_und_CONTROL_M32|RP6 CONTROL M32]] und [[RP6_-_Programmierung#RP6_CCPRO_M128|RP6 CCPRO M128]] ausgelagert: [[RP6 - Programmierung]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==RP6v2==&lt;br /&gt;
Der neue [http://www.conrad.de/ce/de/product/191584/RP6-V2-ROBOTERSYSTEM RP6v2] ist weitgehend identisch mit dem RP6, so dass fast alle Angaben dieses Artikels auch für den RP6v2 zutreffen.&lt;br /&gt;
Für vom RP6 abweichende Details des RP6v2 und für dessen zukünftige Erweiterungsplatinen (z.B. das aktuell [http://www.arexx.com/forum/viewtopic.php?f=19&amp;amp;t=1797 hier] angekündigte Erweiterung-Modul [[RP6v2#RP6v2_M256_WiFi_Platine|RP6v2 M256 WiFi]]) gibt es einen eigenen Grundlagenartikel: [[RP6v2]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==RP6 Sensor Board und Xtra Module==&lt;br /&gt;
Einen eigenen Artikel gibt es auch für das [[RP6_Sensor_Board_und_Xtra_Module#RP6_Sensor_Board_2|RP6 Sensor Board]] und für die [[RP6_Sensor_Board_und_Xtra_Module#RP6_Xtra_Module_2|Xtra Module]]: [[RP6_Sensor_Board_und_Xtra_Module|RP6 Sensor Board und Xtra Module]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Erfahrungsberichte==&lt;br /&gt;
&lt;br /&gt;
...in Arbeit...(kann aber gerne ergänzt werden)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Siehe auch==&lt;br /&gt;
* [[RP6 - Programmierung]]&lt;br /&gt;
* [[RP6v2]]&lt;br /&gt;
* [[RP6_Sensor_Board_und_Xtra_Module]]&lt;br /&gt;
* [[RP6_Kamera_-_Mitmach-Projekt]]&lt;br /&gt;
* [[RP6v2_I2C-Portexpander]]&lt;br /&gt;
* [[RP6v2 USB-RS232-Adapter]]&lt;br /&gt;
* [[RP6v2 Orientierung]]&lt;br /&gt;
* [[RP6 Multi IO Projekt]]&lt;br /&gt;
* [[RP6 Multi IO Projekt - Software]]&lt;br /&gt;
* [[RP6 ArduIO]]&lt;br /&gt;
* [[RP6 ArduIO - Software]]&lt;br /&gt;
* [[Induktive_Ladestation_f%C3%BCr_den_RP6|Induktive Ladestation für den RP6]]&lt;br /&gt;
* [[IR-bake_f%C3%BCr_den_RP6|IR-bake für den RP6]]&lt;br /&gt;
* [[CCRP5]]&lt;br /&gt;
* [[Wild Thumper]]&lt;br /&gt;
* [[Wild Thumper - Programmierung]]&lt;br /&gt;
* [[Yeti]]&lt;br /&gt;
* [[Asuro]]&lt;br /&gt;
* [[C't-Bot]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Weblinks==&lt;br /&gt;
'''Siehe auch die Weblinks im [http://www.rn-wissen.de/index.php/RP6v2#Weblinks RP6v2 Artikel]!'''&lt;br /&gt;
&lt;br /&gt;
* [http://www.pcwelt.de/start/gaming_fun/gadgets/news/84558/ PC-Welt-Artikel]&lt;br /&gt;
&lt;br /&gt;
* Ankündigung des RP6 und der RP6 CONTROL M32 im [http://www.arexx.com/forum/viewtopic.php?t=370 AREXX Support Forum]&lt;br /&gt;
* Ankündigung der RP6 CCPRO M128 im [http://www.arexx.com/forum/viewtopic.php?f=19&amp;amp;t=834&amp;amp;start=0 AREXX Support Forum] und im [http://www.roboternetz.de/community/threads/42228-RP6-C-Control-PRO-MEGA128-Erweiterungsmodul-Website-online RoboterNETZ]&lt;br /&gt;
* Ankündigung des RP6v2 im [http://www.roboternetz.de/community/threads/56964-NEWS-RP6v2-die-neue-Version-2-des-RP6-Robot-Systems RoboterNETZ] und im [http://www.arexx.com/forum/viewtopic.php?f=19&amp;amp;t=1778 AREXX Support Forum]&lt;br /&gt;
* Ankündigung der RP6v2 M256 WiFi im [http://www.arexx.com/forum/viewtopic.php?f=19&amp;amp;t=1797 AREXX Support Forum]&lt;br /&gt;
* [http://www.arexx.com/rp6 AREXX RP6 Startseite]&lt;br /&gt;
* [http://www.arexx.com/forum/viewforum.php?f=19 AREXX Support Forum]&lt;br /&gt;
* [http://www.arexx.com/rp6/html/de/soft_doc_ccpro.htm AREXX CCPRO M128 Seite]&lt;br /&gt;
&lt;br /&gt;
* [http://www.conrad.de/ce/de/product/191524/RP6-ROBOTERSYSTEM RP6 bei CONRAD]&lt;br /&gt;
* [http://www.conrad.de/ce/de/product/191584/RP6-V2-ROBOTERSYSTEM RP6v2 bei CONRAD]&lt;br /&gt;
* [http://www.conrad.de/ce/de/product/191550/RP6-MEGA32-ERWEITERUNGSSATZ RP6 CONTROL M32 bei CONRAD]&lt;br /&gt;
* [http://www.conrad.de/ce/de/product/191563/RP6-CC-PRO-MEGA128-ERWEITERUNGSSATZ RP6 CCPRO M128 bei CONRAD]&lt;br /&gt;
* [http://www.c-control.de/c-control-pro/c-control-pro/startseite_c-control-pro.html C-Control PRO Startseite]&lt;br /&gt;
* [http://ccpro.cc2net.de/forum/ C-Control PRO Forum]&lt;br /&gt;
&lt;br /&gt;
* [http://www.roboternetz.de/phpBB2/viewforum.php?f=49 Roboternetz RP6 Forum]&lt;br /&gt;
* &amp;quot;Geburt&amp;quot; des Wiki im RN-Forum: [http://www.roboternetz.de/community/threads/32793-RP6-Wiki-Artikel RP6-Wiki-Artikel]&lt;br /&gt;
* Henkessoft: [http://www.henkessoft.de/Roboter/rp6.htm RP6]&lt;br /&gt;
* PIC-PROJEKTE Wiki: [http://pic-projekte.de/wiki/index.php?title=RP6  RP6]&lt;br /&gt;
* benhup.com: [http://www.benhup.com/?mf=eduntech&amp;amp;sf=rp6 Arexx RP6 Robot (with ATmega32 chip)]&lt;br /&gt;
* RP6 &amp;quot;Panzer&amp;quot;: [http://www.roboternetz.de/community/threads/57171-mein-(Heng-Long)-RP6 Heng-Long-RP6]&lt;br /&gt;
&lt;br /&gt;
* [http://www.youtube.com/results?search_query=rp6 RP6 Videos]&lt;br /&gt;
* [http://de-de.facebook.com/pages/Robby-RP6/155118711202285 facebook]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Robotikeinstieg]]	 &lt;br /&gt;
[[Kategorie:Praxis]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Autoren==&lt;br /&gt;
--[http://www.roboternetz.de/community/members/24729-sloti sloti] 22:23, 29. Dez 2007 (CET)&lt;br /&gt;
&lt;br /&gt;
--[http://www.roboternetz.de/community/members/44891-Tobias1 Tobias1] 18:30, 6. Apr 2010 (CET)&lt;br /&gt;
&lt;br /&gt;
--[http://www.roboternetz.de/community/members/1972-Dirk Dirk] 12:51, 23. Okt 2020 (CET)&lt;/div&gt;</summary>
		<author><name>Dirk NO2</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=RP6&amp;diff=28569</id>
		<title>RP6</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=RP6&amp;diff=28569"/>
				<updated>2022-03-31T08:42:56Z</updated>
		
		<summary type="html">&lt;p&gt;Dirk NO2: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Bild:RP6_2.jpg|RP6 Base Roboter|right|500px]]&lt;br /&gt;
==Was bisher geschah==&lt;br /&gt;
Fre, 08. Jun 2007 - Ankündigung des RP6 und der RP6 CONTROL M32&amp;lt;br/&amp;gt;&lt;br /&gt;
Mon, 02. Jul 2007 23:00 - Benachrichtigung der Tester&amp;lt;br/&amp;gt;&lt;br /&gt;
Die, 03. Jul 2007 15:00 - Bereitstellung der Dokumentation&amp;lt;br/&amp;gt;&lt;br /&gt;
Don, 05. Jul 2007 14:30 - Bereitstellung der Schaltungsunterlagen&amp;lt;br/&amp;gt;&lt;br /&gt;
Son, 08. Jul 2007 16:00 - Nachricht über den Versand der RP6&amp;lt;br/&amp;gt;&lt;br /&gt;
Mon, 09. Jul 2007 00:15 - Bereitstellung der Library und der Beispielprogramme&amp;lt;br/&amp;gt;&lt;br /&gt;
Die, 10. Jul 2007 - Eintreffen der RP6 bei den Testern&amp;lt;br/&amp;gt;&lt;br /&gt;
Mon, 16. Jul 2007 - Auslieferungsbeginn des RP6&amp;lt;br/&amp;gt;&lt;br /&gt;
Fre, 24. Apr 2009 - Ankündigung der RP6 CCPRO M128 (Auslieferung schon ab Mitte April 2009)&amp;lt;br/&amp;gt;&lt;br /&gt;
Mon, 27. Feb 2012 - Ankündigung des RP6v2&amp;lt;br/&amp;gt;&lt;br /&gt;
Don, 08. Mär 2012 - Auslieferungsbeginn des RP6v2&amp;lt;br/&amp;gt;&lt;br /&gt;
Sam, 17. Mär 2012 - Ankündigung der RP6v2 M256 WiFi&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Siehe auch &amp;quot;Was bisher geschah&amp;quot; im [http://www.rn-wissen.de/index.php/RP6v2#Was_bisher_geschah RP6v2 Artikel]!'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Allgemein==  &lt;br /&gt;
[[Bild:DSC03448.JPG|thumb|RP6 mit Erweiterungsboard]] [[Bild:RP6_Lieferumfang.jpg|thumb|RP6 im Lieferumfang]]&lt;br /&gt;
Der von Arexx entwickelte RP6 ([http://www.conrad.de/ce/de/product/191524/C-Control-Robot-System-RP6-Robotersystem 191524]) ist ein autonomes Raupenfahrzeug, das nicht nur für Schüler und Studenten zum Einstieg in das Gebiet Robotik sondern auch für Fortgeschrittene Elektroniker und Bastler sehr gut geeignet ist, da das System für selbstentworfene Erweiterungen ausgelegt ist. Der RP6 wird von einem, unter Roboterentwicklern beliebten, AVR Microcontroller von Atmel gesteuert und hat Lichtsensoren in Form von zwei LDRs, 2 Bumper an der Stoßstange, 6 Status LEDs, Sensoren zur Überwachung der Akkuspannung, Drehgeber mit 625 CPR, ein Infrarot Sensor zur Hinderniserkennung und Kommunikation und Motorstromsensoren zur Verfügung. Zudem liegt dem Roboter eine umfangreiche Anleitung, inklusive einem kleinen C-Crashkurs, ein USB-Interface zum Anschluss an den PC und ein USB Kabel bei.&lt;br /&gt;
&lt;br /&gt;
In diesem Artikel geht es um die Grundlagen des RP6. Zur Programmierung des RP6 gibt es eine eigene Seite: [[RP6 - Programmierung]]&lt;br /&gt;
&lt;br /&gt;
==Technische Daten==&lt;br /&gt;
{|  {{Blauetabelle}} &lt;br /&gt;
|'''Mikrocontroller:'''&lt;br /&gt;
|AVR [[ATmega32]]&lt;br /&gt;
|-&lt;br /&gt;
|'''Speicher:'''&lt;br /&gt;
|32 kB [[Flash]]-Speicher, davon 1 kB bereits vom Bootloader belegt&amp;lt;br/&amp;gt;&lt;br /&gt;
2 kB RAM&amp;lt;br/&amp;gt; &lt;br /&gt;
1 kB [[EEPROM]]&lt;br /&gt;
|-&lt;br /&gt;
|'''Programmierung:'''&lt;br /&gt;
|Über AVR-[[Bootloader]], belegt ca. 1 kB des Flash-Speichers&lt;br /&gt;
|-&lt;br /&gt;
|'''Vorhandene Sensoren:'''&lt;br /&gt;
|2 [[Sensorarten#Helligkeit|Lichtsensoren (LDR)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
1 [[Sensorarten#Helligkeit|Infrarot (ACS - Anti Collision System)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
2 [[Sensorarten#Bumpers|Bumper]] &amp;lt;br/&amp;gt; &lt;br /&gt;
2 [[Sensorarten#Incremental-Geber|Drehgeber (Encoder)]]&lt;br /&gt;
|-&lt;br /&gt;
|'''Vorhandene Aktoren:'''&lt;br /&gt;
|2 Motoren&amp;lt;br/&amp;gt;&lt;br /&gt;
6 Status-LEDs&amp;lt;br/&amp;gt;&lt;br /&gt;
1 IR-Sender&amp;lt;br/&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|'''Abmessungen:'''&lt;br /&gt;
|(L &amp;amp;times; B &amp;amp;times; H) 172 &amp;amp;times; 128 &amp;amp;times; 50 mm&lt;br /&gt;
|-&lt;br /&gt;
|'''Ausführung:'''&lt;br /&gt;
|Fertig aufgebauter Roboter&lt;br /&gt;
|-&lt;br /&gt;
|'''Stromversorgung:'''&lt;br /&gt;
|6 AA NiMH Akkus&lt;br /&gt;
|-&lt;br /&gt;
|'''Hersteller:'''&lt;br /&gt;
|Arexx Niederlande&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Mechanik==&lt;br /&gt;
===Beschreibung===&lt;br /&gt;
&lt;br /&gt;
===Sensoren===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Encoder====&lt;br /&gt;
&lt;br /&gt;
Die Drehgeber sind an den Getrieben der Motoren zur Drehzahlmessung angebracht. Es handelt sich dabei um Reflexlichtschranken, die auf Codierscheiben mit je 18 weissen und 18 schwarzen Segmenten ausgerichtet sind, also insgesamt 36 Segmente. Diese Codierscheiben sind wiederum an je eines der Zahnräder der beiden Getriebe geklebt worden. Wenn es sich dreht, wandern die einzelnen Segmente an der Reflexlichtschranke vorbei. Die weissen Segmente reflektieren das Infrarotlicht, die schwarzen Segmente nur wenig. Jedes der zwei mittleren Stufenzahnräder des Getriebes hat 50 Zähne auf dem großen, und 12 auf dem kleineren Zahnrad. Die Codierscheiben befinden sich auf dem Zahnrad neben dem Motor, also rechnet man:&lt;br /&gt;
50/12 * 50/12 =17.13/36; 17.13/36 * 36=625&lt;br /&gt;
Daher haben die Encoderscheiben auch Ihre 36 Segmente, denn das gibt eine schöne runde Zahl ohne gebrochenen Anteil. Die Drehgeber erzeugen also 625 Flanken pro Radumdrehung wobei jede Flanke einem Segment entspricht. Bei einem Raddurchmesser von ca. 50mm inkl. Raupenkette, ergibt sich rein rechnerisch ein Radumfang von ca. 157mm was 0.2512mm pro Zählschritt der Drehgeber entspricht. Da sich die Raupenketten aber fast immer etwas in den Untergrund eindrücken (bzw. auch selbst eingedrückt werden) kann man aber von 0.25mm pro Zählschritt ausgehen – meist ist es sogar etwas weniger, z.B. nur 0.24 oder 0.23mm. Das muss man durch abfahren von Teststrecken ermitteln, wie es im Anhang grob beschrieben ist. Sehr genau ist das allerdings durch Radschlupf (bzw. hier müssten wir eigentlich von „Kettenschlupf“ sprechen) und ähnlichen Dingen nicht - vor allem beim Rotieren auf der Stelle. Beim normalen Geradeausfahren ist dieser Fehler klein, aber beim Rotieren kann er schnell sehr große Werte annehmen! Abweichungen muss man evtl. durch weitere Tests ermitteln und mit einkalkulieren. Das ist bei Raupenantrieben leider so – auch bei viel teureren und hochwertigeren Robotern. Dafür hat man aber den Vorteil, dass der Roboter mit Raupenantrieb recht geländegängig ist im Vergleich zu Robotern mit normalem Differentialantrieb mit zwei Antriebsrädern und Stützrad. Kleinere Hindernisse und Rampen kann er meist problemlos überwinden.&lt;br /&gt;
Dabei sind die Encoder sehr nützlich, denn man kann die Geschwindigkeit gut einregeln, egal wie der Untergrund und die Motorbelastung gerade aussieht. Bei gemessenen 50 Segmenten pro Sekunde liegt die Geschwindigkeit bei 1.25 cm/s, sofern wir von 0.25mm pro Zählschritt ausgehen. Etwa 50 Segmente pro Sekunde ist auch die geringste gerade noch regelbare Geschwindigkeit (das variiert aber etwas von Roboter zu Roboter). Bei 1200 Segmenten pro Sekunde wären es die maximal möglichen 30 cm/s (bei 0.25mm Auflösung, bei 0.23 sind es 27.6 cm/s). Standardmäßig begrenzt die Funktionsbibliothek das aber auf 1000 Flanken pro Sekunde. Die maximale Geschwindigkeit ist vom Ladezustand der Akkus abhängig – daher wären 30cm/s nicht besonders lange haltbar. Außerdem erhöht sich die Lebensdauer der Getriebe und Motoren je langsamer man fährt! Wenn der Roboter 4000 Segmente gezählt hat, ist er übrigens etwa einen Meter weit gefahren. Aber wie schon gesagt, gilt das natürlich nur für genau 0.25mm Auflösung. Ohne Kalibrierung hat man hier immer mehr oder weniger starke Abweichungen. Wem es nicht auf jeden mm ankommt, braucht nichts zu kalibrieren und kann einfach von 0.25mm oder besser 0.24mm ausgehen!&lt;br /&gt;
&lt;br /&gt;
====Stoßstangensensoren====&lt;br /&gt;
&lt;br /&gt;
Vorn am Roboter sind zwei Mikroschalter mit langem Schalthebel auf einer separaten&lt;br /&gt;
Platine untergebracht, die etwas vor der anderen Sensorplatine liegt. Dadurch werden&lt;br /&gt;
die IR LEDs auf der Sensorplatine geschützt und können nicht so leicht verbiegen&lt;br /&gt;
wenn der Roboter mal gegen ein Hindernis fährt. Die Stoßstange kann man auch abmontieren und z.B. gegen eine Schuss- oder Sammelvorrichtung für Bälle o.ä. ersetzen wenn man möchte.&lt;br /&gt;
&lt;br /&gt;
====Lichtsensoren====&lt;br /&gt;
&lt;br /&gt;
Vorne auf der kleinen Sensorplatine des Roboters sind zwei sog.&lt;br /&gt;
LDRs (=&amp;quot;Light Dependant Resistors&amp;quot; also lichtabhängige Widerstände)&lt;br /&gt;
platziert und nach links bzw. rechts ausgerichtet. Zwischen&lt;br /&gt;
den beiden Sensoren ist noch eine kleine schwarze&lt;br /&gt;
„Trennwand“ damit das Licht aus einer Richtung möglichst nur&lt;br /&gt;
einen der Sensoren erreicht. Sie bilden zusammen mit je einem&lt;br /&gt;
normalen Widerstand wie beim Batteriesensor einen Spannungsteiler – hier allerdings&lt;br /&gt;
um das Umgebungslicht zu messen.&lt;br /&gt;
&lt;br /&gt;
====Anti Collision System====&lt;br /&gt;
&lt;br /&gt;
Der aus Softwaresicht komplexeste Sensor des RP6 ist das ACS - das&lt;br /&gt;
„Anti Collision System“ (engl. für Anti Kollisions System)! Es besteht&lt;br /&gt;
aus einem IR Empfänger (s. Abb.) und zwei vorne auf der Sensorplatine&lt;br /&gt;
links und rechts angebrachten IR LEDs.&lt;br /&gt;
Da es je eine IR LED links und rechts gibt, kann das ACS grob unterscheiden ob sich&lt;br /&gt;
das Objekt links, rechts oder mittig vor dem Roboter befindet.&lt;br /&gt;
Man kann zusätzlich noch die Stromstärke mit der die beiden IR LEDs gepulst werden&lt;br /&gt;
in drei Stufen einstellen. Das ACS funktioniert aber auch in der höchsten Stufe nicht&lt;br /&gt;
mit allen Objekten immer zuverlässig, denn es kommt auf die Beschaffenheit der&lt;br /&gt;
Oberfläche des jeweiligen Objekts an! Ein schwarzes Objekt reflektiert das IR Licht natürlich&lt;br /&gt;
viel schlechter als ein weisses Objekt und ein kantiges und spiegelndes Objekt&lt;br /&gt;
könnte das IR Licht hauptsächlich in eine bestimme Richtung reflektieren. Die Reichweite&lt;br /&gt;
ist also immer vom jeweiligen Objekt abhängig! Das ist eine prinzipielle Schwäche&lt;br /&gt;
von so gut wie allen IR Sensoren (jedenfalls in dieser Preisklasse).&lt;br /&gt;
Trotzdem werden die meisten Hindernisse zuverlässig erkannt und können umfahren&lt;br /&gt;
werden. Falls das mal nicht klappt, gibt es noch die Stoßstange mit den Tastsensoren&lt;br /&gt;
und falls auch die nicht richtig getroffen werden, kann der Roboter noch mit den Motorstromsensoren&lt;br /&gt;
oder den Encodern erkennen, ob die Motoren blockieren (s.u.)!&lt;br /&gt;
Wem das nicht reicht, der könnte zusätzlich z.B. noch Ultraschallsensoren anbringen...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Erweiterungssystem===&lt;br /&gt;
Auf dem Mainboard sind 22 freie 3,2mm Löcher vorhanden (im Chassis weitere 16), auf denen die Erweiterungsmodule symmetrisch vorne und hinten gestapelt werden können. Weil der Stromverbrauch durch mehr Module steigt, ist es sinnvoll nur insgesamt 6-8 Module auf dem Roboter zu stapeln. Auf dem Mainboard selbst sind noch 6 kleine Erweiterungsflächen verfügbar (plus 2 sehr kleine auf der Bumperplatine).&lt;br /&gt;
&lt;br /&gt;
===Antrieb===&lt;br /&gt;
&lt;br /&gt;
Die 7,2 VDC Motoren sind im Chassis eingebaut und werden mithilfe der H-Brücken gesteuert. Die maximale Geschwindigkeit liegt bei 25cm/s, das kann je nach Akkuspannung aber variieren. Ohne Softwarebegrenzung sind sogar 30cm/s möglich, dadurch verringert sich aber die Lebensdauer der Motoren. Die maximale Steigung, die der RP6 bewältigen kann, ist 30%, ohne Bumperplatine 40%, das hängt aber auch vom Untergrund ab. Kleine Hindernisse wie Bücher und Stifte kann der RP6 problemlos überqueren. Die Achsen der Räder sind in selbstschmierenden Sinterlagern mit 4mm Durchmesser gelagert.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Elektromechanik==&lt;br /&gt;
===Beschreibung===&lt;br /&gt;
===Odometrie===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Elektronik==&lt;br /&gt;
[[Bild:RP6 Block.jpg|thumb|Blockdiagramm]]&lt;br /&gt;
===Beschreibung===&lt;br /&gt;
&lt;br /&gt;
===Sensoren (SENSORS)===&lt;br /&gt;
&lt;br /&gt;
Die meisten Sensoren über die der Roboter verfügt, haben wir ja schon in anderen Abschnitten kurz genannt, wollen diese nun aber etwas detaillierter betrachten.&lt;br /&gt;
In dem Blockdiagramm sind einige der Sensoren nicht in dem blauen Bereich &amp;quot;Sensors&amp;quot; zu sehen, weil sie besser in andere Bereiche passen. Trotzdem zählen natürlich auch die Drehgeber (= “Encoder“), Motorstromsensoren und der Batteriespannungssensor zu den Sensoren und werden darum in diesem Abschnitt beschrieben!&lt;br /&gt;
&lt;br /&gt;
====Batteriespannungs-Sensor (Voltage Sensor)====&lt;br /&gt;
&lt;br /&gt;
Dieser &amp;quot;Sensor&amp;quot; ist eigentlich nur ein einfacher Spannungsteiler aus zwei Widerständen. Wir gehen davon aus, dass die Batterien insgesamt maximal 10V liefern können. 6 NiMH Akkus werden immer unterhalb davon bleiben. Die Referenzspannung des ADC, also die Spannung mit der er die gemessene Spannung vergleicht, beträgt 5V. Da auch die Betriebsspannung 5V beträgt, darf diese nicht überschritten werden. Also müssen wir die zu messende Spannung um die Hälfte herabsetzen! Dies geschieht über einen Spannungsteiler aus zwei Widerständen, der die Spannung an den Messbereich des ADCs anpasst. Der ADC löst mit 10 Bit auf (Wertebereich 0 bis 1023), was eine Auflösung von 10V/1024=9.765625mV ergibt. Ein Messwert von 512 entspricht hier also 5V und 1023 wären ungefähr 10V! Diese Grenzwerte sollten aber normalerweise nie erreicht werden! Das ist nicht besonders genau, da die Widerstände keineswegs Präzisionswiderstände sind. Abweichungen von einigen Prozent nach oben und unten sind möglich. Auch die Referenzspannung von 5V ist nicht ganz genau und kann bei normaler Belastung etwas variieren. Das stört hier nicht, denn wir brauchen ohnehin nur einen ungefähren Wert um festzustellen ob die Batterien sich langsam dem Ende nähern. Wer die Spannung genau messen will, braucht ein Multimeter um den Messfehler zu ermitteln und diesen dann in Software auszugleichen. Wenn man mit Fehlern leben kann, kann man die Spannung dank des günstigen Umrechnungsverhältnisses sogar direkt aus den ADC Werten ungefähr abschätzen: 720 entsprechen dann grob 7.2V, 700 etwa 7V und 650 wären etwa 6.5V. Bei einem konstanten Wert unter 560 kann man davon ausgehen, dass die Akkus fast leer sind.&lt;br /&gt;
&lt;br /&gt;
====Motorstrom====&lt;br /&gt;
[[Bild:RP6_MSS.jpg|thumb]]&lt;br /&gt;
Es befinden sich zwei Leistungswiderstände in den beiden Motorstromkreisen. Aus dem Ohm'schen Gesetz U=RxI folgt, dass sich die Spannung die an einem bestimmten Widerstand abfällt, proportional zum Strom verhält, der diesen durchfließt!&lt;br /&gt;
Damit die Spannungsabfälle an den Widerständen nicht zu groß werden, müssen die Widerstände klein gewählt werden. In unserem Fall haben Sie einen Wert von 0.1 Ohm&lt;br /&gt;
Die abfallende Spannung ist also nur sehr klein (0.1V bei einem Strom von 1A) und muss verstärkt werden bevor sie mit dem ADC gemessen werden kann. Das erledigt jeweils ein sog. Operationsverstärker (OPV). In der Schaltung des RP6 wird je Motorkanal ein OPV verwendet. Der Messbereich geht etwa bis 1.8A. Bei 1.8A fallen etwa 0.18V am Widerstand ab und es ergibt sich am Ausgang des OPV eine Spannung von etwa 4V. Mehr kann der verwendete OPV bei 5V Betriebsspannung nicht ausgeben:&lt;br /&gt;
&lt;br /&gt;
I = U / ((1 + (100k / 4,7k)) * 0,1)&lt;br /&gt;
&lt;br /&gt;
Die Leistungswiderstände haben eine Toleranz von 10%, die Widerstände am OPV 5%, also ist das alles nur sehr ungenau (Ungenauigkeiten im Bereich von etwa 270mA sind möglich wenn man die Sensoren nicht kalibriert!). Wir brauchen allerdings auch nur den ungefähren Wert um festzustellen ob die Motoren stark oder wenig belastet werden. So kann der Roboter gut blockierte oder gar defekte Motoren bzw. Drehgeber erkennen! Die DC-Motoren benötigen mehr Strom je stärker sie belastet werden (Drehmoment) und somit steigt der Strom sehr stark an wenn die Motoren blockiert sind. Das wird von der Robotersoftware zur Notabschaltung verwendet: wenn die Motoren dauerhaft mit hohem Strom betrieben würden, könnten diese sehr heiß werden und dadurch Schaden nehmen! Und wenn die Encoder mal ausfallen sollten – aus welchem Grund auch immer – kann auch das damit erkannt werden. Man würde dann eine Drehzahl von 0 messen. Lässt man die Motoren aber auf voller Kraft laufen und der Strom bleibt trotzdem klein (also sind die Ketten nicht blockiert!), kann man genau daraus schließen, dass entweder die Encoder, oder die Motoren ausgefallen sind (oder Encoder und Motorstromsensoren nicht funktionieren... das passiert z.B. wenn man vergessen hat diese vorher per Software einzuschalten).&lt;br /&gt;
&lt;br /&gt;
====Encoder====&lt;br /&gt;
[[Bild:RP6_ENCODER.jpg|thumb]]&lt;br /&gt;
Ganz anders als die letztgenannten Sensoren funktionieren die Drehgeber, die an den Getrieben der Motoren zur Drehzahlmessung angebracht sind. Es handelt sich dabei um Reflexlichtschranken, die auf Codierscheiben mit je 18 weissen und 18 schwarzen Segmenten ausgerichtet sind, also insgesamt 36 Segmente (s. Abb). Diese Codierscheiben sind wiederum an je eines der Zahnräder der beiden Getriebe geklebt worden. Wenn es sich dreht, wandern die einzelnen Segmente an der Reflexlichtschranke vorbei. Die weissen Segmente reflektieren das Infrarotlicht, die schwarzen Segmente nur wenig. Die Drehgeber erzeugen so zwar auch wie die anderen Sensoren ein analoges Signal, aber es wird digital interpretiert. Zunächst wird das Signal verstärkt und anschließend über einen sog. Schmitt Trigger in ein Rechtecksignal umgewandelt. Die Flanken dieses Signals, also die Wechsel von 5 auf 0V und umgekehrt, lösen jeweils ein Interrupt Ereignis aus und diese werden dann von der Software gezählt. So kann die zurückgelegte Wegstrecke gemessen und zusammen mit einem Timer zur Zeitmessung die Drehzahl und damit auch die Geschwindigkeit ermittelt werden. Die Ermittlung der Drehzahl ist auch Hauptanwendung der Encoder – nur mit den Encodern kann man die Drehzahl auf den gewünschten Sollwert einregeln. Ohne Regelung wäre die Drehzahl nämlich von der Akkuspannung, Belastung der Motoren usw. abhängig. Die hohe Auflösung ermöglicht es dabei, auch niedrige Geschwindigkeiten noch relativ genau einzuregeln. Jedes der zwei mittleren Stufenzahnräder des Getriebes hat 50 Zähne auf dem großen, und 12 auf dem kleineren Zahnrad (s. Abb). Die Codierscheiben befinden sich auf dem Zahnrad neben dem Motor, also rechnet man:&lt;br /&gt;
&lt;br /&gt;
50/12 * 50/12 =17.13/36; 17.13/36 * 36=625&lt;br /&gt;
&lt;br /&gt;
Daher haben die Encoderscheiben auch Ihre 36 Segmente, denn das gibt eine schöne runde Zahl ohne gebrochenen Anteil. Die Drehgeber erzeugen also 625 Flanken pro Radumdrehung wobei jede Flanke einem Segment entspricht. Bei einem Raddurchmesser von ca. 50mm inkl. Raupenkette, ergibt sich rein rechnerisch ein Radumfang von ca. 157mm was 0.2512mm pro Zählschritt der Drehgeber entspricht. Da sich die Raupenketten aber fast immer etwas in den Untergrund eindrücken (bzw. auch selbst eingedrückt werden) kann man aber von 0.25mm pro Zählschritt ausgehen – meist ist es sogar etwas weniger, z.B. nur 0.24 oder 0.23mm. Das muss man durch abfahren von Teststrecken ermitteln, wie es im Anhang grob beschrieben ist. Sehr genau ist das allerdings durch Radschlupf (bzw. hier müssten wir eigentlich von „Kettenschlupf“ sprechen) und ähnlichen Dingen nicht - vor allem beim Rotieren auf der Stelle. Beim normalen Geradeausfahren ist dieser Fehler klein, aber beim Rotieren kann er schnell sehr große Werte annehmen! Abweichungen muss man evtl. durch weitere Tests ermitteln und mit einkalkulieren. Das ist bei Raupenantrieben leider so – auch bei viel teureren und hochwertigeren Robotern. Dafür hat man aber den Vorteil, dass der Roboter mit Raupenantrieb recht geländegängig ist im Vergleich zu Robotern mit normalem Differentialantrieb mit zwei Antriebsrädern und Stützrad. Kleinere Hindernisse und Rampen kann er meist problemlos überwinden.&lt;br /&gt;
Dabei sind die Encoder sehr nützlich, denn man kann die Geschwindigkeit gut einregeln, egal wie der Untergrund und die Motorbelastung gerade aussieht. Bei gemessenen 50 Segmenten pro Sekunde liegt die Geschwindigkeit bei 1.25 cm/s, sofern wir von 0.25mm pro Zählschritt ausgehen. Etwa 50 Segmente pro Sekunde ist auch die geringste gerade noch regelbare Geschwindigkeit (das variiert aber etwas von Roboter zu Roboter). Bei 1200 Segmenten pro Sekunde wären es die maximal möglichen 30 cm/s (bei 0.25mm Auflösung, bei 0.23 sind es 27.6 cm/s). Standardmäßig begrenzt die Funktionsbibliothek das aber auf 1000 Flanken pro Sekunde. Die maximale Geschwindigkeit ist vom Ladezustand der Akkus abhängig – daher wären 30cm/s nicht besonders lange haltbar. Außerdem erhöht sich die Lebensdauer der Getriebe und Motoren je langsamer man fährt!&lt;br /&gt;
&lt;br /&gt;
=====Encoder justieren=====&lt;br /&gt;
Damit der RP6 die Signale der Drehgeber richtig auswerten kann, muss man evtl. die Drehgeber einmalig justieren. Dies kann auch schon bei einem neu gekauften RP6 notwendig sein.&lt;br /&gt;
Eine genaue Anleitung dazu findet man [http://www.arexx.com/rp6/downloads/RP6_ENCODER_DE_20071219.zip hier]. Es gibt auch ein [http://www.arexx.com/rp6/downloads/rp6_encoder_video.zip Video], das die Drehgeber-Justierung zeigt.&lt;br /&gt;
&lt;br /&gt;
=====Encoder kalibrieren=====&lt;br /&gt;
Wenn der Roboter 4000 Segmente gezählt hat, ist er etwa einen Meter weit gefahren. Aber wie schon gesagt, gilt das natürlich nur für genau 0.25mm Auflösung. Ohne Kalibrierung hat man hier immer mehr oder weniger starke Abweichungen. Wem es nicht auf jeden mm ankommt, braucht nichts zu kalibrieren und kann einfach von 0.25mm oder besser 0.24mm ausgehen!&lt;br /&gt;
Optimal ist es, wenn man sich für Weg- und Winkelmessungen nicht auf die Encoder Daten stützen muss, sondern externe Systeme wie Infrarotbaken oder einen genauen elektronischen Kompass dazu zur Verfügung hat.&lt;br /&gt;
&lt;br /&gt;
Will man die Drehgeber des RP6 dennoch kalibrieren, kann man ihn z.B. mit diesem Testprogramm:&lt;br /&gt;
&amp;lt;pre&amp;gt;#include &amp;quot;RP6RobotBaseLib.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
	initRobotBase();&lt;br /&gt;
	powerON();&lt;br /&gt;
&lt;br /&gt;
	// Test: Go ahead 1m and stop!&lt;br /&gt;
	move (80, FWD, DIST_MM(1000), true);&lt;br /&gt;
	writeString_P(&amp;quot;LEFT RIGHT&amp;quot;);&lt;br /&gt;
 	writeString_P(&amp;quot;\n&amp;quot;);&lt;br /&gt;
 	writeInteger(mleft_dist, DEC);&lt;br /&gt;
	writeChar(' ');&lt;br /&gt;
 	writeInteger(mright_dist, DEC);&lt;br /&gt;
	writeString_P(&amp;quot;\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
	powerOFF();&lt;br /&gt;
&lt;br /&gt;
	return 0;&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
... 1m weit fahren lassen und dann messen, wie weit er tatsächlich gefahren ist. Das Programm gibt auf dem Terminal den Stand der Drehgeber aus. Teilt man dann die gemessene Fahrstrecke in mm durch den Wert der Drehgeber, erhält man die Auflösung. Diesen Wert kann man dann der Konstanten ENCODER_RESOLUTION in der RP6Config.h zuweisen. Nach &amp;quot;Make Clean&amp;quot;, einer Neukompilierung und erneuter Ausführung des Testprogramms müßte der RP6 jetzt genau 1m weit fahren. Das gilt zumindest für den Untergrund, auf dem die Kalibrierung durchgeführt wurde.&lt;br /&gt;
&lt;br /&gt;
====Stoßstangensensoren (Bumper)====&lt;br /&gt;
&lt;br /&gt;
Vorn am Roboter sind zwei Mikroschalter mit langem Schalthebel auf einer separaten&lt;br /&gt;
Platine untergebracht, die etwas vor der anderen Sensorplatine liegt. Dadurch werden&lt;br /&gt;
die IR LEDs auf der Sensorplatine geschützt und können nicht so leicht verbiegen&lt;br /&gt;
wenn der Roboter mal gegen ein Hindernis fährt. Mit den zwei Schaltern kann der Mikrocontroller&lt;br /&gt;
einen solchen Aufprall registrieren und dann beispielsweise zurücksetzen,&lt;br /&gt;
sich etwas drehen und weiterfahren. Die Schalter sind an zwei der Ports die schon mit&lt;br /&gt;
den LEDs verbunden sind angeschlossen und blockieren so keine anderen Ports des&lt;br /&gt;
Mikrocontrollers. Daher leuchten die LEDs auch immer wenn man einen der Schalter&lt;br /&gt;
drückt! Da dies normalerweise relativ selten passiert, stört das aber nicht weiter.&lt;br /&gt;
Die Stoßstange kann man auch abmontieren und z.B. gegen eine Schuss- oder Sammelvorrichtung&lt;br /&gt;
für Bälle o.ä. ersetzen wenn man möchte.&lt;br /&gt;
&lt;br /&gt;
====Lichtsensoren (LDRs)====&lt;br /&gt;
[[Bild:RP6_Licht.jpg|thumb]]&lt;br /&gt;
Vorne auf der kleinen Sensorplatine des Roboters sind zwei sog.&lt;br /&gt;
LDRs (=&amp;quot;Light Dependant Resistors&amp;quot; also lichtabhängige Widerstände)&lt;br /&gt;
platziert und nach links bzw. rechts ausgerichtet. Zwischen&lt;br /&gt;
den beiden Sensoren ist noch eine kleine schwarze&lt;br /&gt;
„Trennwand“ damit das Licht aus einer Richtung möglichst nur&lt;br /&gt;
einen der Sensoren erreicht. Sie bilden zusammen mit je einem&lt;br /&gt;
normalen Widerstand wie beim Batteriesensor einen Spannungsteiler – hier allerdings&lt;br /&gt;
um das Umgebungslicht zu messen. Die 5V Betriebsspannung wird auch geteilt, aber&lt;br /&gt;
hier ist einer der Widerstände variabel! Es wird also das Teilungsverhältnis je nach Intensität&lt;br /&gt;
des Lichteinfalls verändert und somit eine vom Lichteinfall abhängige Spannung&lt;br /&gt;
an einen der A/D Wandler Kanäle geleitet!&lt;br /&gt;
Über den Spannungsunterschied zwischen den beiden Sensoren kann man ermitteln in&lt;br /&gt;
welcher Richtung sich eine bzw. die hellste Lichtquelle vor dem Roboter befindet:&lt;br /&gt;
Links, Rechts oder in der Mitte. Mit einem entsprechenden Programm, kann man so z.B. eine starke Taschenlampe in&lt;br /&gt;
einem abgedunkelten Zimmer verfolgen, oder den Roboter die hellste Stelle in einem&lt;br /&gt;
Raum suchen lassen! Klappt z.B. sehr gut mit einem stärkeren Hand-Halogenscheinwerfer:&lt;br /&gt;
Wenn man damit auf den Boden leuchtet, kann der Roboter dem Lichtfleck auf&lt;br /&gt;
dem Boden folgen.&lt;br /&gt;
Das geht natürlich auch umgekehrt: Der Roboter könnte z.B. auch versuchen sich vor&lt;br /&gt;
hellem Licht zu verstecken...&lt;br /&gt;
Wenn man noch ein oder zwei LDRs hinten am Roboter anbringen würde, könnte man&lt;br /&gt;
das noch verfeinern und die Richtung in der sich Lichtquellen befinden besser bestimmen.&lt;br /&gt;
Der Roboter kann sonst nämlich oft nur schwer unterscheiden ob die Lichtquelle&lt;br /&gt;
vor oder hinter ihm liegt. Zwei der A/D Wandler Kanäle sind noch frei...&lt;br /&gt;
&lt;br /&gt;
====Anti Collision System (ACS)====&lt;br /&gt;
[[Bild:RP6 ACS.jpg|thumb|Das ACS]]&lt;br /&gt;
Der aus Softwaresicht komplexeste Sensor des RP6 ist das ACS - das „Anti Collision System“ (engl. für Anti Kollisions System)! Es besteht aus einem IR Empfänger (s. Abb.) und zwei vorne auf der Sensorplatine links und rechts angebrachten IR LEDs. Die IR LEDs werden direkt vom Mikrocontroller angesteuert. Die Ansteuerungsroutinen können beliebig verändert und verbessert werden! Beim Vorgängermodell war dafür noch ein eigener Controller nötig, dessen Programm aber nicht vom Anwender geändert werden konnte...&lt;br /&gt;
Mit den IR LEDs werden kurze, mit 36kHz modulierte Infrarot Impulse ausgesandt, auf die der darauf ausgelegte IR Empfänger reagiert. Werden die IR Impulse an einem Gegenstand vor dem Roboter reflektiert und vom IR Empfänger detektiert, kann der Mikrocontroller darauf reagieren und z.B. ein Ausweichmanöver einleiten. Damit das ACS nicht zu empfindlich bzw. auf eventuelle Störungen reagiert, wartet die Software bis eine bestimmte Anzahl von Impulsen in einer bestimmten Zeit empfangen worden ist. Es wird auch eine Synchronisation mit dem RC5 Empfang durchgeführt und auf die RC5 Signale von TV/Hifi Fernbedienungen wird so nicht reagiert. Bei anderen Codes kann das aber nicht garantiert werden und das ACS könnte dann Hindernisse erkennen, wo gar keine sind! Da es je eine IR LED links und rechts gibt, kann das ACS grob unterscheiden ob sich das Objekt links, rechts oder mittig vor dem Roboter befindet.&lt;br /&gt;
Man kann zusätzlich noch die Stromstärke mit der die beiden IR LEDs gepulst werden in drei Stufen einstellen. Das ACS funktioniert aber auch in der höchsten Stufe nicht mit allen Objekten immer zuverlässig, denn es kommt auf die Beschaffenheit der Oberfläche des jeweiligen Objekts an! Ein schwarzes Objekt reflektiert das IR Licht natürlich viel schlechter als ein weisses Objekt und ein kantiges und spiegelndes Objekt könnte das IR Licht hauptsächlich in eine bestimme Richtung reflektieren. Die Reichweite ist also immer vom jeweiligen Objekt abhängig! Das ist eine prinzipielle Schwäche von so gut wie allen IR Sensoren (jedenfalls in dieser Preisklasse).&lt;br /&gt;
Trotzdem werden die meisten Hindernisse zuverlässig erkannt und können umfahren werden. Falls das mal nicht klappt, gibt es noch die Stoßstange mit den Tastsensoren und falls auch die nicht richtig getroffen werden, kann der Roboter noch mit den Motorstromsensoren oder den Encodern erkennen, ob die Motoren blockieren (s.u.)!&lt;br /&gt;
Wem das nicht reicht, der könnte zusätzlich z.B. noch Ultraschallsensoren anbringen...&lt;br /&gt;
&lt;br /&gt;
====IR-Kommunikation (IRCOMM)====&lt;br /&gt;
Der RP6 kann über die IR-LEDs links und rechts über der Bumper-Platine Daten zu anderen IR-Empfängern senden.  Es ist z.B. möglich, dass mehrere Roboter ihre Sensorwerte untereinander vergleichen.&lt;br /&gt;
&lt;br /&gt;
====6 Status-LEDs====&lt;br /&gt;
Die Status-LEDs sind vorne links und rechts über den Lichtsensoren auf der Hauptplatine angebracht.&lt;br /&gt;
&lt;br /&gt;
Über die Status-LEDs können Sensorzustände, z.B. des ACS, der Bumper oder der Lichtsensoren, dargestellt werden.&lt;br /&gt;
&lt;br /&gt;
====IR-Sender====&lt;br /&gt;
Über den IR-Sender können Daten zu anderen Geräten übertragen werden.&lt;br /&gt;
&lt;br /&gt;
===Erweiterungssystem (EXPANSION SYSTEM)===&lt;br /&gt;
[[Bild:RP6_EXP.jpg|thumb]]&lt;br /&gt;
Eines der nützlichsten Features des RP6 ist das Erweiterungssystem.&lt;br /&gt;
Man kann den RP6 damit genau so weit ausbauen,&lt;br /&gt;
wie man es benötigt. Aus Kostengründen bietet das&lt;br /&gt;
Basissystem schließlich nur relativ wenig Sensoren. Es sind&lt;br /&gt;
zwar schon mehr als bei vielen anderen Robotern in dieser&lt;br /&gt;
Preisklasse, aber erst mit weiteren Sensoren macht ein Roboter&lt;br /&gt;
so richtig Spaß. Das ACS kann beispielsweise nur grob&lt;br /&gt;
erkennen ob sich ein Hindernis vor dem Roboter befindet.&lt;br /&gt;
Mit Ultraschallsensoren oder besseren zusätzlichen IR Sensoren,&lt;br /&gt;
könnte man aber die Distanz ermitteln und so beispielsweise&lt;br /&gt;
bessere Ausweichmanöver fahren!&lt;br /&gt;
&lt;br /&gt;
Neben Sensoren macht es auch sehr viel Sinn, zusätzliche Controller einzubauen um&lt;br /&gt;
die anfallenden Aufgaben aufteilen zu können. Beispielsweise die RP6 CONTROL M32&lt;br /&gt;
Platine mit einem weiteren MEGA32 Mikrocontroller oder die CCPRO M128.&lt;br /&gt;
&lt;br /&gt;
Das Erweiterungssystem muss natürlich in der Lage sein, viele Erweiterungsmodule&lt;br /&gt;
miteinander zu verbinden, dabei mit wenigen Signalleitungen&lt;br /&gt;
auskommen und eine ausreichend hohe Geschwindigkeit bieten.&lt;br /&gt;
&lt;br /&gt;
Siehe [[I2C]]&lt;br /&gt;
&lt;br /&gt;
===Steuerung (CONTROL SYSTEM)===&lt;br /&gt;
&lt;br /&gt;
====Hauptprozessor (ATMEGA32)====&lt;br /&gt;
[[Bild:RP6_MEGA32.jpg|thumb|Der MEGA32]]&lt;br /&gt;
Der Hauptprozessor ist der ATMEGA32 vom Atmel. Er hat 32KB Flash ROM und 2KB RAM. Der ATMEGA ist mit 8Mhz getaktet, kann also bis zu 8 Millionen Befehle pro Sekunde ausführen. Es sind 32 I/O-Pins  am Controller verfügbar. Die I/O-Pins gehören zu I/O-Ports mit jeweils 8 Pins. Davon gibt es 4: PORTA, PORTB, PORTC und PORTD. Der Controller kann die Ports entweder ein oder ausschalten (Output), oder erkennen, ob Spannung angelegt wurde oder nicht (Input). Es gibt mehrere Module, die verschiedene Aufgaben übernehmen:&lt;br /&gt;
* 3 Timer, einer davon erzeugt die PWM-Signale für die Motoren&lt;br /&gt;
* Die serielle Schnittstelle (UART)&lt;br /&gt;
* Das TWI (Two Wire Interface, also Zweidraht Schnittstelle)&lt;br /&gt;
* Ein ADC (Analog to Digital Converter) mit 8 Eingangskanälen, welche mit 10bit (0-1023) auflösen&lt;br /&gt;
* Drei externe Interrupt Eingänge&lt;br /&gt;
&lt;br /&gt;
Auserdem befindet sich im Microcontroller ein sog. Bootloader, welcher mit dem RP6 Loader kommuniziert und neue Programme in den Speicher lädt.&lt;br /&gt;
&lt;br /&gt;
===Antrieb (DRIVE SYSTEM)===&lt;br /&gt;
[[Bild:RP6_H-Brücke.jpg|thumb|Die H-Brücke]]&lt;br /&gt;
[[Bild:RP6_Tastverhältniss.jpg|thumb]]&lt;br /&gt;
Der Antrieb des RP6 besteht aus zwei Gleichstrom Motoren mit nachgeschaltetem Getriebe,&lt;br /&gt;
über das die beiden Raupenketten angetrieben werden.&lt;br /&gt;
Die Motoren genehmigen sich je nach Belastung&lt;br /&gt;
einen recht hohen Strom und können&lt;br /&gt;
natürlich nicht direkt vom Mikrocontroller&lt;br /&gt;
angesteuert werden. Dazu braucht man&lt;br /&gt;
Leistungstreiber in Form von je einer H-Brücke&lt;br /&gt;
pro Motor. Das grundlegende Prinzip&lt;br /&gt;
ist in der nebenstehenden Abbildung dargestellt.&lt;br /&gt;
Eine H-Brücke besteht aus vier&lt;br /&gt;
&amp;quot;Schaltern&amp;quot;, die in Form eines H's um einen&lt;br /&gt;
Motor angeordnet sind. Nehmen wir mal an,&lt;br /&gt;
zunächst seien alle Schalter aus. Schaltet&lt;br /&gt;
man dann S1 und S4 (Rot) an, liegt eine&lt;br /&gt;
Spannung am Motor an und er dreht sich&lt;br /&gt;
z.B. nach rechts. Schalten wir nun S1 und&lt;br /&gt;
S4 wieder aus und danach S2 und S3 (Grün)&lt;br /&gt;
an, wird die am Motor anliegende Spannung umgepolt und er dreht sich in die entgegen gesetzte&lt;br /&gt;
Richtung, also nach links! Man muss darauf achten, nicht gleichzeitig S1&lt;br /&gt;
und S2, oder S3 und S4 einzuschalten, sonst entstünde ein Kurzschluss und dadurch&lt;br /&gt;
könnten die &amp;quot;Schalter&amp;quot; zerstört werden!&lt;br /&gt;
Natürlich verwenden wir auf dem RP6 keine mechanischen Schalter, sondern sog.&lt;br /&gt;
MOSFETs. Diese schalten beim Anlegen einer genügend hohen Spannung am Eingang&lt;br /&gt;
durch. Die Schaltvorgänge können sehr schnell erfolgen, mehrere Kilohertz sind bei&lt;br /&gt;
unserer Anwendung möglich.&lt;br /&gt;
So kann man also schon mal die Drehrichtung einstellen. Und wie bekommt man den&lt;br /&gt;
Motor nun schneller bzw. langsamer? Ein Elektromotor dreht umso schneller, je höher&lt;br /&gt;
die angelegte Spannung ist. Die Drehzahl kann also über die Spannung eingestellt&lt;br /&gt;
werden - und genau dazu können wir die H-Brücke auch verwenden!&lt;br /&gt;
Die Abbildung verdeutlicht das Prinzip&lt;br /&gt;
nach dem wir vorgehen können.&lt;br /&gt;
Wir erzeugen&lt;br /&gt;
ein Rechtecksignal fester Frequenz,&lt;br /&gt;
bei dem wir das sog. Tastverhältnis&lt;br /&gt;
verändern. Mit &amp;quot;Tastverhältnis&amp;quot; ist das&lt;br /&gt;
Verhältnis von der eingeschalteten zur&lt;br /&gt;
ausgeschalteten Zeit des Signals gemeint.&lt;br /&gt;
Am Motor liegt dann effektiv eine niedrigere,&lt;br /&gt;
mittlere Gleichspannung an, die dem&lt;br /&gt;
Tastverhältnis entspricht. In der Grafik ist&lt;br /&gt;
dies durch eine rote Linie (Ug) und die roten&lt;br /&gt;
Flächen verdeutlicht. Wenn z.B. eine&lt;br /&gt;
Spannung von 7 Volt von den Akkus an&lt;br /&gt;
den Motortreibern anliegt, und diese mit&lt;br /&gt;
einem Tastverhältnis von 50% angesteuert werden, würde die mittlere Spannung in&lt;br /&gt;
etwa bei der Hälfte, also 3.5V liegen! Das stimmt real nicht ganz, aber so kann man&lt;br /&gt;
es sich schon gut und einfach vorstellen.&lt;br /&gt;
Das Antriebssystem ist dank der hohen Untersetzung (~ 1:72) relativ stark und so&lt;br /&gt;
kann der RP6 viel schwerere Lasten tragen als es z.B. der kleine Roboter ASURO&lt;br /&gt;
könnte. Allerdings steigt mit zunehmendem Gewicht natürlich auch der Energiebedarf&lt;br /&gt;
und die Akkus werden schneller leer sein ...&lt;br /&gt;
Im Vergleich mit einem ferngesteuerten Rennwagen o.ä. könnte man denken der RP6&lt;br /&gt;
sei langsam - stimmt auch - das ist jedoch absichtlich so! Der Roboter wird von einem&lt;br /&gt;
Mikrocontroller gesteuert und wenn der Programmierer einen Fehler bei der Programmierung&lt;br /&gt;
gemacht hat, wäre es ungünstig mit 10km/h vor die Wand zu prallen! Bei&lt;br /&gt;
dem eher gemächlichen Tempo des RP6 passiert aber nicht so schnell etwas und nebenbei&lt;br /&gt;
haben die Sensoren mehr Zeit die Umgebung auf Hindernisse zu untersuchen.&lt;br /&gt;
Und da wäre natürlich noch der Vorteil der höheren Belastbarkeit und der viel genaueren&lt;br /&gt;
Geschwindigkeitsregelung!&lt;br /&gt;
&lt;br /&gt;
===Stromversorgung (POWER SUPPLY)===&lt;br /&gt;
[[Bild:RP6_IC1.jpg|thumb]]&lt;br /&gt;
Natürlich benötigt ein Roboter Energie. Diese trägt der RP6 gespeichert in 6 Akkus mit&lt;br /&gt;
sich herum. Die Laufzeit ist durch die Kapazität der Akkus eingeschränkt, denn auch&lt;br /&gt;
wenn die Elektronik verhältnismäßig wenig Energie benötigt, schlucken die Motoren je&lt;br /&gt;
nach Belastung doch ziemlich viel.&lt;br /&gt;
&lt;br /&gt;
Damit die Akkus möglichst lange halten und der Roboter nicht ständig Pause machen&lt;br /&gt;
muss, sollte man ihm daher etwas größere Energiespeicher mit etwa 2500mAh gönnen.&lt;br /&gt;
Kleinere mit 2000mAh oder mehr funktionieren aber auch. Mit guten Akkus kann&lt;br /&gt;
man 3 bis 6 Stunden oder mehr Laufzeit erreichen, abhängig von der Betriebszeit der&lt;br /&gt;
Motoren, deren Belastung und Qualität der Akkus. Die 6 Akkus die notwendig sind,&lt;br /&gt;
haben insgesamt eine Nennspannung von 6x 1.2V = 7.2V. Im Blockdiagramm ist dies&lt;br /&gt;
mit &amp;quot;UB&amp;quot; (= &amp;quot;U-Battery&amp;quot;, U ist der Formelbuchstabe für Spannung) bezeichnet. „Nennspannung&amp;quot;,&lt;br /&gt;
weil sich die Spannung mit der Zeit stark verändert. Voll aufgeladen können&lt;br /&gt;
die Akkus im Leerlauf insgesamt bis zu 8.5V liefern! Diese Spannung sinkt während&lt;br /&gt;
der Entladung ab und schwankt auch je nach Belastung (Motoren an oder aus,&lt;br /&gt;
schnell langsam etc. - wie stark die Spannung schwankt, hängt auch von der Qualität&lt;br /&gt;
der verwendeten Akkus ab. Der Innenwiderstand ist hier die kritische Größe).&lt;br /&gt;
Das ist für Messungen von Sensorwerten und ähnlichem natürlich nicht ohne weiteres&lt;br /&gt;
brauchbar. Noch wichtiger ist jedoch, dass viele der verwendeten Komponenten wie&lt;br /&gt;
z.B. der Mikrocontroller nur auf 5V oder weniger Betriebsspannung ausgelegt sind und&lt;br /&gt;
bei so hohen Spannungen zerstört würden. Die Akku Spannung muss also auf einen&lt;br /&gt;
definierten Wert heruntergeregelt und stabilisiert werden!&lt;br /&gt;
Das übernimmt ein 5V Spannungsregler, der einen Strom von&lt;br /&gt;
maximal 1.5A liefern kann (s. Abb.). Bei 1.5A würde er jedoch&lt;br /&gt;
ziemlich viel Wärme abgeben. Es gibt daher eine große Kühlfläche&lt;br /&gt;
auf der Platine an die der Regler festgeschraubt ist. Über 1A&lt;br /&gt;
sollte der Regler trotz Kühlung besser nur kurzzeitig (also wenige&lt;br /&gt;
Sekunden) belastet werden, wenn man nicht noch einen zusätzlichen&lt;br /&gt;
großen Kühlköper draufschraubt.&lt;br /&gt;
&lt;br /&gt;
Es wird empfohlen, 800mA Dauerlast nicht zu überschreiten! Bei&lt;br /&gt;
so einer Belastung und zusammen mit den Motoren wären die&lt;br /&gt;
Akkus auch recht schnell leer. Im normalen Betrieb ohne ein Erweiterungsboard&lt;br /&gt;
nimmt der Roboter übrigens nicht mehr als 40mA auf (ausser wenn&lt;br /&gt;
das IRCOMM sendet), also überhaupt kein Problem für den Regler und man hat noch&lt;br /&gt;
genug Reserven für die Erweiterungsmodule, die meistens auch nicht mehr als 50mA&lt;br /&gt;
aufnehmen sofern keine Motoren, große LEDs o.ä. daran angeschlossen sind.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Umbau-Optionen==&lt;br /&gt;
Hier soll beschrieben werden, welche Umbau-Optionen es für die RP6 Base gibt. Im Text gibt es Verweise auf den Schaltplan des RP6 (RP6_MAINBOARD.PDF) in der Form: (SP2 B1: Bauteil). Dies bedeutet, dass man das Bauteil auf Blatt 2 des RP6-Schaltplans im Feld B1 finden kann. Beispielhaft sind im folgenden Text Bestell-Nummern der Firma [http://www.conrad.de/ce/ CONRAD] genannt. Natürlich kann man die Teile auch bei anderen Versendern beziehen.&lt;br /&gt;
&lt;br /&gt;
Bei den Materialangaben ist öfter die Rede von &amp;quot;Steckbuchsen mit Litze&amp;quot;. Diese Steckbuchsen mit angelöteter Litze können auf die ein- oder zweireihigen Stiftleisten aufgesteckt werden. Leider gibt es sie nicht (mehr) fertig konfektioniert bei CONRAD. Die einreihigen Steckbuchsen (RM 2,54mm) kann man aber z.B. bei [http://www.elv.de/output/controller.aspx ELV] bekommen: 2-polig (68-016635), 3-polig (68-022503) und 5-polig (68-023073). An sie muss man dann noch Litzen in der entsprechenden Länge selbst anlöten.&lt;br /&gt;
&lt;br /&gt;
===Elko für den IR-Empfänger===&lt;br /&gt;
[[Bild:RP6_C29_TSOP.JPG|thumb|RP6 C29 TSOP]]&lt;br /&gt;
Zur Spannungsstabilisierung kann ein Elko (C29; SP2 E1: C29*) am TSOP 34836 eingelötet werden.&lt;br /&gt;
&lt;br /&gt;
Normalerweise ist dieser Elko nicht erforderlich.&lt;br /&gt;
&lt;br /&gt;
Man braucht dazu:&lt;br /&gt;
* Einen Elektrolyt-Kondensator stehend 10 uF / 16V (C29); RM 2,5mm (445631)&lt;br /&gt;
&lt;br /&gt;
Der Elko kann auch eine geringere Kapazität als 10 uF haben (1 uF bis 4,7 uF reichen auch). Man lötet den Elko auf seinen Platz. Bitte auf die Polung achten: Der Minuspol zeigt nach vorn (in Fahrtrichtung des RP6).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Anschlüsse===&lt;br /&gt;
Hier wird aufgelistet, wo man auf dem RP6 Mainboard Anschlüsse nutzen kann, um sie z.B. zu weiteren Sensoren, zum USRBUS oder (weniger empfehlenswert!) direkt zu EPs oder Erweiterungsplatinen (M32, CCPRO M128) zu führen.&lt;br /&gt;
&lt;br /&gt;
====Analoge Sensoren an ADC0/1====&lt;br /&gt;
[[Bild:RP6_ADC01.JPG|thumb|RP6 ADC0/1]]&lt;br /&gt;
&lt;br /&gt;
Wenn man bis zu zwei analoge Sensoren (z.B. IR-Distanz-Mess-Sensoren Sharp GP2Y0A02YK 185364) direkt an den RP6 anschließen möchte, dann gibt es da zwei 3-polige Kontakte, beschriftet mit VDD/GND/ADCx (x = 0..1). Hier kann man 3-polige Stiftleisten auflöten, an die dann die Sensoren angeschlossen werden.&lt;br /&gt;
&lt;br /&gt;
Man braucht dazu:&lt;br /&gt;
* 1-reihige Stiftleiste RM 2,54mm (z.B. 36-polig 732478)&lt;br /&gt;
* Zwei Keramik-Vielschicht-Kondensatoren 100nF (C27, C28); RM 2,54mm (453099)&lt;br /&gt;
* ENTWEDER einen Elektrolyt-Kondensator stehend 220 uF / 16V (C26); RM 3,5mm (445903)&lt;br /&gt;
* ODER einen Elektrolyt-Kondensator stehend 470 uF / 16V (C26); RM 3,5mm (446211)&lt;br /&gt;
* Zwei 3-polige Steckbuchsen mit Litze zum Anschluß der Sensoren&lt;br /&gt;
&lt;br /&gt;
Man trennt nun von der 1-reihigen Stiftleiste zweimal 3 Kontakte ab und lötet sie auf die weiß umrahmten Kontakte (VDD/GND/ADCx; SP2 B1: ADC0, ADC1), anschließend C27, C28 (SP2 A1: C27*, C28*) auf ihre Plätze und zum Schluß den Elko 220 uF oder 470 uF (C26; SP2 A1: C26*). Der Elko ist nur bei Sensoren mit hohem Strombedarf notwendig, siehe dazu auch Anleitung des RP6, Seite 136! Beim Elko auf die Polung achten: Er muss so sitzen, dass er mit seinem Pluspol in Fahrtrichtung des RP6 (nach vorn) schaut.&lt;br /&gt;
&lt;br /&gt;
Die Sensoren lötet man an die Litzen der 3-poligen Steckbuchsen und steckt diese auf die neuen Kontakte.&lt;br /&gt;
&lt;br /&gt;
Da manche Sensoren einen höheren Stromverbrauch haben, kann man die Stromversorgung an den VDD-Pins der ADC0/1-Stecker abschaltbar machen oder eine separate +5V-Spannung einspeisen. Siehe dazu den Abschnitt &amp;quot;Trennstellen - Getrennte Stromversorgung für ADC0/1&amp;quot; weiter unten!&lt;br /&gt;
&lt;br /&gt;
====ISP (In System Programming)====&lt;br /&gt;
Der ATMEGA32 des RP6 wird standardmäßig über den PROG/UART Stecker programmiert. Dazu befindet sich im Prozessor ein Bootloader-Programm. Wenn man stattdessen oder zusätzlich die ISP-Programmierung mit einem dafür geeigneten ISP-Programmier-Adapter nutzen will, kann man den Adapter an einen (noch einzulötenden) Wannenstecker auf dem RP6 anschließen.&lt;br /&gt;
Vorher sind aber ein paar &amp;quot;Umbauarbeiten&amp;quot; erforderlich.&lt;br /&gt;
&lt;br /&gt;
Man braucht dazu:&lt;br /&gt;
* 1-reihige Stiftleiste RM 2,54mm (z.B. 36-polig 732478)&lt;br /&gt;
* Wannenstecker 2x5-polig gerade RM 2,54mm (z.B. [http://www.reichelt.de./ Reichelt] WSL 10G)&lt;br /&gt;
* Eine SMD-Diode LL 4148 (140902)&lt;br /&gt;
* Eine Codierbrücke (z.B. aus Set 742902)&lt;br /&gt;
&lt;br /&gt;
Zwischen dem XBUS-Stecker und C13 befinden sich 10 Lötpunkte für den ISP-Anschluß, auf die der Wannenstecker gelötet wird, und drei Lötpunkte (beschriftet mit ISP* - BOOTLOAD; SP2 A3: YR1..3), auf die eine 3-polige Stiftleiste gelötet werden muss.&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_ISP.JPG|RP6 ISP]]&lt;br /&gt;
&lt;br /&gt;
Vorher muss eine kurze Leiterbahn zwischen den Lötpunkten BOOTLOAD aufgetrennt werden. Die Leiterbahn befindet sich auf der Lötseite der Platine und muss mit einem scharfen Messer oder einem speziellen Leiterbahn-Unterbrecher zwischen den beiden Lötpunkten unterbrochen werden. Man sollte anschließend mit einem Widerstandsmeßgerät nachmessen: Es sollte keine Verbindung mehr zwischen den Lötpunkten bestehen.&lt;br /&gt;
Man trennt dann von der 1-reihigen Stiftleiste 3 Kontakte ab und lötet sie auf die beschriebenen drei Lötpunkte.&lt;br /&gt;
&lt;br /&gt;
Zum Schluss lötet man noch die Diode LL 4148 (SP2 B3: D11*) auf ihre Lötflächen zwischen R3 und C6. Die Kathode (Strich) der Diode kommt nach vorn (in Fahrtrichtung RP6, bzw. liegt rechts von R3). Wenn man jetzt eine Codierbrücke auf die mit &amp;quot;BOOTLOAD&amp;quot; beschrifteten Pins steckt, bleibt alles unverändert: Die Programmierung erfolgt weiter über den PROG/UART-Stecker mithilfe des Bootloaders im Prozessor.&lt;br /&gt;
Wird die Codierbrücke in Stellung &amp;quot;ISP*&amp;quot; umgesteckt, kann der Prozessor mit ISP programmiert werden.&lt;br /&gt;
&lt;br /&gt;
Vorsicht: Das Bootloader-Programm kann dabei zerstört werden! Es müssen zusätzlich Fusebits des ATMEGA32 verändert werden. Dabei kann der Prozessor im schlimmsten Fall nicht mehr ansprechbar sein. Man sollte diesen Umbau und die ISP-Programmierung nur machen, wenn man genau weiß, was man macht!&lt;br /&gt;
&lt;br /&gt;
Eine Kopie des Bootloaders und eine Kurzanleitung zum Einstellen der Fusebits gibt es hier:&lt;br /&gt;
[http://www.arexx.com/rp6/downloads/RP6BASE_BOOTLOADER.zip RP6_BOOTLOADER]&lt;br /&gt;
&lt;br /&gt;
====IO1..IO4====&lt;br /&gt;
[[Bild:RP6_IO1-4.JPG|thumb|RP6 IO1..IO4]]&lt;br /&gt;
Die Anschlüsse IO1 bis IO4 (SP2 E3: IO1..4) steuern bereits die Status-LEDs 1, 2, 4 und 5 an. Trotzdem kann man sie auch noch mit leichten Einschränkungen als I/O-Pins benutzen. Dazu lötet man zweimal 2 Pins einer 1-reihigen Stiftleiste RM 2,54mm (z.B. 36-polig 732478) auf die IO1/2 und IO3/4 Lötpunkte.&lt;br /&gt;
Hier eine Tabelle, die die Port-Pins zeigt, die IO1..IO4 zugeordnet sind:&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |IO&lt;br /&gt;
 |Status-LED&lt;br /&gt;
 |Port-Pin&lt;br /&gt;
 |-&lt;br /&gt;
 |1&lt;br /&gt;
 |SL1&lt;br /&gt;
 |PC4&lt;br /&gt;
 |-&lt;br /&gt;
 |2&lt;br /&gt;
 |SL2&lt;br /&gt;
 |PC5&lt;br /&gt;
 |-&lt;br /&gt;
 |3&lt;br /&gt;
 |SL4&lt;br /&gt;
 |PB7&lt;br /&gt;
 |-&lt;br /&gt;
 |4&lt;br /&gt;
 |SL5&lt;br /&gt;
 |PB1&lt;br /&gt;
 |-&lt;br /&gt;
|}&lt;br /&gt;
Wie können nun IO1..IO4 genutzt werden?&lt;br /&gt;
&lt;br /&gt;
Als ...&lt;br /&gt;
* Eingang, z.B. für zusätzliche Tastschalter/Bumper&lt;br /&gt;
* Ausgang, z.B. zur Ansteuerung von Treiberstufen, low-current LEDs, ...&lt;br /&gt;
&lt;br /&gt;
Wird ein Anschluß IOx als Eingang verwendet, muss ein Widerstand von 470 Ohm in Reihe mit dem Taster an VDD eingebaut werden, zusätzlich ein Pulldown-Widerstand 100 kOhm. Diese Beschaltung zeigen z.B. an SL6 die Widerstände R43 und R46 (SP2 E4: R43, R46).&lt;br /&gt;
&lt;br /&gt;
Als Ausgang geschaltet sollte an IOx kein hoher Strom entnommen werden: 10mA sind max. zu empfehlen!&lt;br /&gt;
&lt;br /&gt;
====USRBUS====&lt;br /&gt;
Die 14 Kontakte der beiden USRBUS-Stecker sind auf dem RP6 nirgendwo angeschlossen, sondern können über die Lötpunkte Y1..Y14 mit beliebigen Punkten auf dem Mainboard verbunden werden.&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_USRBUS.JPG|thumb|RP6 USRBUS]]&lt;br /&gt;
&lt;br /&gt;
Ich würde auf Y1..Y14 eine Stiftleiste löten, damit die USRBUS-Belegung geändert werden kann.&lt;br /&gt;
&lt;br /&gt;
Man braucht dazu:&lt;br /&gt;
* 2-reihige Stiftleiste RM 2,54mm (z.B. 2x36-polig 742007)&lt;br /&gt;
* Einige Steckbuchsen mit Litze&lt;br /&gt;
&lt;br /&gt;
Man trennt von der 2-reihigen Stiftleiste 2x7 Kontakte ab und lötet sie auf die Punkte Y1..Y14 (SP4 E34: Y1..14, Y1'..Y14') neben den beiden Wannensteckern USRBUS1 (vorn) und USRBUS2 (hinten). Wird der RP6 über Flachkabel mit einem USRBUS-Stecker auf einer RP6 Experimentierplatine (EP) und/oder mit einer Erweiterungsplatine (M32, CCPRO M128) verbunden, dann hat man mit allen mit dem USRBUS verbundenen Platinen eine direkte 14-polige Verbindung,- eben den &amp;quot;User Bus&amp;quot;. Den kann man dann nutzen, wie man will. Auf dem RP6 kann man mit Steckbuchsen die Pins Y1..Y14 mit anderen Pins verbinden.&lt;br /&gt;
&lt;br /&gt;
Beispiel: Verbindet man den Pin &amp;quot;ADC0&amp;quot; mit Y1 des USRBUS1, dann steht der Eingang ADC0 auf allen an den USRBUS1 angeschlossenen Platinen auf dem vorderen Platinenstapel an Y1 zur Verfügung. Man braucht also diesen Eingang nicht über ein eigenes Kabel auf eine EP zu führen, sondern kann dazu den USRBUS nehmen. Dadurch bleibt der Gesamtaufbau auf dem RP6 übersichtlich und komplett trennbar (man braucht nur die Stecker XBUS und USRBUS abzuziehen!).&lt;br /&gt;
&lt;br /&gt;
Wichtig:&lt;br /&gt;
* Man sollte gut dokumentieren, wie man den USRBUS am RP6 (vorn und hinten getrennt!), auf EPs und der M32/M128 benutzt! Sonst kann es bei einer anderen Anordnung von EPs zu USRBUS Konflikten/Kurzschlüssen kommen.&lt;br /&gt;
* Der USRBUS1- und der USRBUS2-Stecker sind auf dem RP6 NICHT miteinander verbunden.&lt;br /&gt;
&lt;br /&gt;
Einen Vorschlag für die Belegung des USRBUS1 (vorn) gibt es z.B. &lt;br /&gt;
[http://www.roboternetz.de/phpBB2/viewtopic.php?t=32549 hier] oder &lt;br /&gt;
[http://www.roboternetz.de/community/showthread.php/47102-Sensor-anschließen?p=453061&amp;amp;viewfull=1#post453061 da.]&lt;br /&gt;
&lt;br /&gt;
====Start/Stop Button====&lt;br /&gt;
[[Bild:RP6_ST.JPG|thumb|RP6 ST]]&lt;br /&gt;
Am mittleren Lochrasterfeld links finden sich zwei Lötpunkte ST1, ST2 (SP2 D2: ST1, ST2), an die weitere Start/Stop Taster (NO, normal offen) parallel zum Taster auf dem RP6 Mainboard angeschlossen werden können.&lt;br /&gt;
&lt;br /&gt;
Zum Anschluß kann man auch Stiftleisten auflöten. ST1, ST2 könnte man auch mit dem USRBUS1 verbinden, wenn man den RP6 z.B. von einer EP aus zurücksetzen möchte.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Serielle Schnittstelle====&lt;br /&gt;
[[Bild:RP6_RST.JPG|thumb|RP6 RST]]&lt;br /&gt;
Neben dem USRBUS1 Stecker befinden sich 5 Lötpunkte mit den Signalen RST, TX, RX, GND, VDD (SP4 AB5: YRX, YTX, YMRESET, YVDD). Hier kann z.B. eine 5-polige Stiftleiste aufgelötet werden, um einen Anschluß an die serielle Schnittstelle zu ermöglichen.&lt;br /&gt;
&lt;br /&gt;
Von diesen 5 Lötpunkten könnte z.B. auch [http://www.roboternetz.de/phpBB2/viewtopic.php?t=32549 so] eine Verbindung zum benachbarten USRBUS1 hergestellt werden, um die serielle Schnittstelle des RP6 auf EPs zu führen.&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;
&lt;br /&gt;
====I2C-Schnittstelle====&lt;br /&gt;
[[Bild:RP6_I2C.JPG|thumb|RP6 I2C]]&lt;br /&gt;
Neben dem XBUS2 Stecker finden sich 5 Lötpunkte mit den Signalen der I2C-Schnittstelle (SP4 D12: Stecker I2C). Dies sind: VDD (Pin 1), GND, SDA, SCL, INT1 (Pin 5). Hier kann z.B. eine 5-polige Stiftleiste aufgelötet werden, um einen Anschluß an die I2C-Schnittstelle zu ermöglichen.&lt;br /&gt;
&lt;br /&gt;
Von diesen 5 Lötpunkten könnte z.B. auch eine Verbindung zum USRBUS1 oder USRBUS2 hergestellt werden, um die I2C-Schnittstelle des RP6 auf EPs zu führen, allerdings hat man SCL, SDA, INT1 ja auch schon am XBUS zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Interrupt-Leitungen====&lt;br /&gt;
[[Bild:RP6_INTx.JPG|thumb|RP6 INTx]]&lt;br /&gt;
Die Interrupt-Leitungen INTU, INT1..3, MRESET (SP4 D34: MRESET, INT1..3, INTU) sind an 5 Lötpunkten neben dem XBUS1 Stecker zu kontaktieren. Hier kann natürlich auch eine 5-polige Stiftleiste aufgelötet werden. In der Regel wird man diese Anschlüsse nicht brauchen, weil sie schon auf dem XBUS zur Verfügung stehen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====VDD/GND/+UB Anschluß====&lt;br /&gt;
[[Bild:RP6_VDDGNDUB.JPG|thumb|RP6 VDD GND +UB]]&lt;br /&gt;
In der Nähe von C4 im hinteren Bereich des Mainboards finden sich Lötpunkte (SP4 E12: YVDDx, YGNDx; SP4 D2 YUBx), an denen man VDD, GND und +UB finden kann.&lt;br /&gt;
&lt;br /&gt;
Wenn man höhere Ströme an VDD (z.B. für Servos) oder +UB (z.B. für einen anderen IRCOMM-Sender oder einen DC-Motor) entnehmen möchte, empfehlen sich diese Lötpunkte, auf die man auch Stiftleisten löten kann.&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;
====EXT Anschluß====&lt;br /&gt;
[[Bild:RP6_EXT.jpg|thumb|RP6 EXT Anschluß]]&lt;br /&gt;
Am hinteren Rand der RP6 Hauptplatine gibt es eine Reihe von 8 Lötpunkten. Dies ist der EXT Anschluß (SP1 C23: Stecker EXT):&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |Pin&lt;br /&gt;
 |Name&lt;br /&gt;
 |Beschreibung&lt;br /&gt;
 |-&lt;br /&gt;
 |1&lt;br /&gt;
 |GND&lt;br /&gt;
 |RP6 und Akku Minuspol (GND)&lt;br /&gt;
 |-&lt;br /&gt;
 |2&lt;br /&gt;
 |CHRG&lt;br /&gt;
 |Anschluß (+) für ext. Ladegerät, identisch mit Pluspol der Ladebuchse (CHARGER, Pin 1). Ladung nur möglich, wenn S1 AUS ist!&lt;br /&gt;
 |-&lt;br /&gt;
 |3&lt;br /&gt;
 |CHRG&lt;br /&gt;
 |wie Pin 2!&lt;br /&gt;
 |-&lt;br /&gt;
 |4&lt;br /&gt;
 | +BAT&lt;br /&gt;
 |Akku Pluspol über Sicherung F1&lt;br /&gt;
 |-&lt;br /&gt;
 |5&lt;br /&gt;
 | +BAT&lt;br /&gt;
 |wie Pin 4!&lt;br /&gt;
 |-&lt;br /&gt;
 |6&lt;br /&gt;
 | +UB&lt;br /&gt;
 |RP6 +UB (+7,2V=, Bereich min. +5,5 bis max. +10V=)&lt;br /&gt;
 |-&lt;br /&gt;
 |7&lt;br /&gt;
 | +UB&lt;br /&gt;
 |wie Pin 6!&lt;br /&gt;
 |-&lt;br /&gt;
 |8&lt;br /&gt;
 |GND&lt;br /&gt;
 |wie Pin 1!&lt;br /&gt;
 |-&lt;br /&gt;
|}&lt;br /&gt;
Man kann hier eine JST XH Stiftleiste gerade, 8-polig, RM 2,5mm ([http://www.conrad.de/ce/de/product/740105/Stiftleiste-gerade-RM-25-mm-Serie-XH-Rastermass-25-mm-Pole-8-Nennstrom-3-A-B8B-XH-A-LFSN-JST-Inhalt-1-St 740105]) auflöten.&lt;br /&gt;
&lt;br /&gt;
Wozu kann man diesen Anschluß nutzen?&lt;br /&gt;
&lt;br /&gt;
Der wesentliche Sinn des EXT Anschlusses besteht darin, andere Arten der Stromversorgung und der Akkuladung zu ermöglichen. Normalerweise schaltet man den RP6 mit S1 an und aus. In Stellung AUS kann der Akku geladen werden, indem man ein Ladegerät an die CHARGER Buchse anschließt. Alternativ kann man das Ladegerät mit seinem Pluspol auch an CHRG (Pins 2, 3) anschließen. Siehe auch den Abschnitt &amp;quot;Trennstellen - EXT Anschluß: Andere Stromversorgung&amp;quot; weiter unten!&lt;br /&gt;
&lt;br /&gt;
An +BAT (Pins 4, 5) kann man direkt (ohne Unterbrechung durch S1) Strom aus dem Akku entnehmen. Die Grenze des Stroms bestimmt die Sicherung F1 (2,5A). Eine weitere Möglichkeit besteht darin, über diesen Anschluß den Akku auch mit einem geeigneten Ladegerät zu LADEN. Hierbei muss man aber darauf achten, dass S1 AUSgeschaltet ist, weil sonst der RP6 über +UB eine unzulässig hohe Spannung bekommen könnte. Wenn man den Akku mit 6 Mignonzellen im RP6 nicht nutzen will (der Akku-Halter bleibt leer!), sondern nur einen externen Akku, wäre der auch mit seinem Pluspol an +BAT über eine eigene Sicherung (2,5A träge) anzuschließen.&lt;br /&gt;
&lt;br /&gt;
+UB (+7,2V) ist die Versorgungsspannung des RP6 (kommt vom Akku-Pluspol über die Sicherung F1 und Schalter S1!). Mit +UB werden die H-Brücken (Motoransteuerung) direkt und die RP6 &amp;quot;Elektronik&amp;quot; über den 5V-Spannungswandler (IC1; SP1 D3: IC1) versorgt (= VDD). An +UB könnte man den RP6 direkt mit einer Spannung von +7,2V versorgen (Absicherung nicht vergessen!), dazu muss S1 AUSgeschaltet sein, damit es keine Konflikte mit dem eingebauten Akku gibt.&lt;br /&gt;
&lt;br /&gt;
Den EXT Anschluß kann man damit nutzen für:&lt;br /&gt;
* Externes Ladegerät&lt;br /&gt;
* Externen Akku&lt;br /&gt;
* Externe Stromversorgung ohne Akku&lt;br /&gt;
* Direkte Stromentnahme aus dem Akku&lt;br /&gt;
* Ergänzungsladung mit Solarzelle&lt;br /&gt;
* Autonome Akkuladung (Ladestation mit Kontakten, Induktionsladung ...)&lt;br /&gt;
* ...&lt;br /&gt;
&lt;br /&gt;
Man sollte gewisse Elektronik-Kenntnisse haben, wenn man die Spannungsversorgung des RP6 verändert. VOR irgendwelchen Veränderungen seht euch auch zuerst den Schaltplan des RP6 (SP1) genau an!&lt;br /&gt;
&lt;br /&gt;
===Mess-/Kontaktpunkte===&lt;br /&gt;
Hier geht es um Kontaktpunkte, an denen man z.B. den Logik-Pegel (High/Low) oder eine analoge Spannung messen kann. Natürlich kann man die Signale auch zur Weiterleitung auf eine EP kontaktieren, dies wird man aber normalerweise nicht brauchen.&lt;br /&gt;
&lt;br /&gt;
====UBAT====&lt;br /&gt;
[[Bild:RP6_UBAT.JPG|thumb|RP6 UBAT]]&lt;br /&gt;
In der Mitte des Mainboards befindet sich ein Kontaktpunkt UBAT (SP1 E1: YUBAT). Dies ist ADC7 des RP6 Microcontrollers.&lt;br /&gt;
&lt;br /&gt;
Man kann hier die analoge Spannung (gegen GND) messen, die vom +UB-Spannungssensor geliefert wird.&lt;br /&gt;
&lt;br /&gt;
Die Spannung ist:&lt;br /&gt;
 UBAT = +UB / 2&lt;br /&gt;
Da der Spannungsteiler (SP1 D12: R1, R2) des +UB-Spannungssensors nicht aus Präzisionswiderständen besteht, kann man für den eigenen RP6 einen Korrekturfaktor berechnen, wenn UBAT deutlich von +UB / 2 (+ UB z.B. gemessen am EXT Stecker, Pins 6 u. 7) abweicht. Damit kann man +UB sehr viel genauer bestimmen.&lt;br /&gt;
&lt;br /&gt;
====ACS====&lt;br /&gt;
[[Bild:RP6_ACS_TSOP.JPG|thumb|RP6 ACS TSOP]]&lt;br /&gt;
Hinter dem TSOP (IC3) befindet sich der Kontaktpunkt ACS (SP2 E1: ACS).&lt;br /&gt;
&lt;br /&gt;
Dies ist der Ausgang des TSOP bzw. Eingang PB2 des RP6 Microcontrollers. Man kann hier das Ausgangssignal des IR-Empfängers abnehmen, z.B. um es mit einem Oszilloskop sichtbar zu machen.&lt;br /&gt;
&lt;br /&gt;
Rechts neben dem TSOP kann man noch die 3 Kontaktpunkte ACS_R, ACS_P und ACS_L (SP2 E2: ACS_P, ACS_R, ACS_L) des ACS-IR-Senders finden.&lt;br /&gt;
&lt;br /&gt;
Folgende Tabelle zeigt die Verbindungen:&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |Kontakt&lt;br /&gt;
 |Microcontroller-Portpin&lt;br /&gt;
 |SP-Verbindung&lt;br /&gt;
 |ACS-IR-Sendediode&lt;br /&gt;
 |-&lt;br /&gt;
 |ACS_P&lt;br /&gt;
 |über R8: ACS_PWRH (PB3), über R9: ACS_PWR (PD6)&lt;br /&gt;
 |SP2: 3&lt;br /&gt;
 |Anoden D1, D2&lt;br /&gt;
 |-&lt;br /&gt;
 |ACS_R&lt;br /&gt;
 |ACS_R (PC7)&lt;br /&gt;
 |SP2: 2&lt;br /&gt;
 |Kathode D1&lt;br /&gt;
 |-&lt;br /&gt;
 |ACS_L&lt;br /&gt;
 |ACS_L/MISO (PB6)&lt;br /&gt;
 |SP1: 5&lt;br /&gt;
 |Kathode D2&lt;br /&gt;
 |-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====IRC====&lt;br /&gt;
[[Bild:RP6_IRC.JPG|thumb|RP6 IRC]] [[Bild:RP6_IRC3.JPG|thumb|RP6 IRC3]]&lt;br /&gt;
Im der Nähe von C13 befinden sich die Lötpunkte IRC, IRC+, IRC- und IRC3 (SP2 D2: YIRC; SP2 CD2: IRC+/-; SP2 C2: IRC3). Zusammen mit der Trennstelle IRC (siehe Abschnitt &amp;quot;Trennstellen - IRC&amp;quot; weiter unten!) kann man diese Kontaktstellen im Umfeld des IRCOMM-Sendedioden Treibers IRLML2502PBF (SP2 CD12: Q5) finden. Am Kontaktpunkt IRC findet sich der Eingang des Treibers bzw. Ausgang PD7 des RP6 Microcontrollers. IRC+, IRC- sind die Kontaktpunkte, an denen die IRCOMM-Sendedioden D3, D4 in Reihe auf der Sensorplatine angeschlossen sind (IRC+ = Anode). IRC3 ist verbunden mit dem Trennstellen-Lötpunkt IRC1 und liegt bei geschlossener Trennstelle IRC an +UB.&lt;br /&gt;
&lt;br /&gt;
Was läßt sich mit diesen Kontaktpunkten machen:&lt;br /&gt;
* Der IRCOMM-Sender ist der zweitgrößte Stromverbraucher des RP6 (nach dem Antrieb). An IRC3 kann daher eine eigene Stromversorgung für die IRCOMM-Sendedioden angeschlossen werden. Dazu muss die Trennstelle IRC zwischen ihren Lötpunkten IRC1, IRC2 aufgetrennt werden.&lt;br /&gt;
* An IRC+, IRC- könnten andere/weitere IRCOMM-Sendedioden angeschlossen werden (Anode an IRC+). Wenn der Vorwiderstand R6 (SP2 C2: R6) der Sendedioden dann nicht mehr paßt (bezügl. Leistung und/oder Widerstandswert), können neue leistungsfähigere IRCOMM-Sendedioden zwischen IRC3 und IRC- (Anode an IRC3) mit einem dafür geeigneten Vorwiderstand angebracht werden.&lt;br /&gt;
&lt;br /&gt;
====LS====&lt;br /&gt;
[[Bild:RP6_LS.JPG|thumb|RP6 LS]]&lt;br /&gt;
Die beiden Lötpunkte LS_L und LS_R (SP2 B12: LS_L, LS_R) neben R7 vorn auf dem Mainboard sind die Ausgänge der Helligkeitssensoren (links und rechts) bzw. die ADC-Eingänge ADC3 und ADC2 des RP6 Microcontrollers.&lt;br /&gt;
&lt;br /&gt;
Hier kann man die Spannungen messen, die den Helligkeitswerten entsprechen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====BP, S====&lt;br /&gt;
[[Bild:RP6_BP_S.JPG|thumb|RP6 BP S]]&lt;br /&gt;
Die Messpunkte BPL, BPR und der Kontaktpunkt S (SP2 E2: S; SP2 E3: BPR; SP2 E4: BPL) befinden sich am vorderen Platinenrand. BPL und BPR sind die Kontakte der Bumper. S ist eine nicht genutzte Verbindung zwischen dem Mainboard und der Sensorplatine, die über die Verbindung SP1, Pin 3, geführt wird (siehe folgende Tabelle!).&lt;br /&gt;
&lt;br /&gt;
Hier eine Tabelle mit der Belegung der 90°-Winkelverbindung SP1, SP2 zwischen dem RP6 Mainboard und der Sensorplatine: &lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |Pin&lt;br /&gt;
 |SP1&lt;br /&gt;
 |SP2&lt;br /&gt;
 |-&lt;br /&gt;
 |1&lt;br /&gt;
 |LS_L  --- Light Sensor Left&lt;br /&gt;
 |IRC-  --- IRCOMM-&lt;br /&gt;
 |-&lt;br /&gt;
 |2&lt;br /&gt;
 |BPL   --- Bumper Left&lt;br /&gt;
 |ACS_R --- ACS Right&lt;br /&gt;
 |-&lt;br /&gt;
 |3&lt;br /&gt;
 |S     --- Free for all&lt;br /&gt;
 |ACS_P --- ACS Power&lt;br /&gt;
 |-&lt;br /&gt;
 |4&lt;br /&gt;
 |GND&lt;br /&gt;
 |VDD&lt;br /&gt;
 |-&lt;br /&gt;
 |5&lt;br /&gt;
 |ACS_L --- ACS Left&lt;br /&gt;
 |BPR   --- Bumper Right&lt;br /&gt;
 |-&lt;br /&gt;
 |6&lt;br /&gt;
 |IRC+  --- IRCOMM+&lt;br /&gt;
 |LS_R  --- Light Sensor Right&lt;br /&gt;
 |-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====ENC====&lt;br /&gt;
[[Bild:RP6_ENC.JPG|thumb|RP6 ENC]]&lt;br /&gt;
Die beiden Messpunkte ENCL, ENCR (SP4 B12: ENCL, ENCR) sind die Ausgänge der Radencoder. ENCL ist verbunden mit PD2 (INT0), ENCR mit PD3 (INT1) des RP6 Microcontrollers.&lt;br /&gt;
&lt;br /&gt;
===Trennstellen===&lt;br /&gt;
An diesen Stellen können Leiterbahnen unterbrochen werden, um Funktionen zu deaktivieren oder anders zu nutzen.&lt;br /&gt;
&lt;br /&gt;
=====Getrennte Stromversorgung für ADC0/1=====&lt;br /&gt;
Wenn man für die analogen Sensoren an ADC0/1 (siehe Abschnitt &amp;quot;Anschlüsse - Analoge Sensoren an ADC0/1&amp;quot; weiter oben!) eine GETRENNTE Stromversorgung vorsehen will und/oder mit Codierbrücke (oder MOSFET) die Stromversorgung abschaltbar machen möchte, muss man erst Vorarbeit leisten.&lt;br /&gt;
[[Bild:RP6_SV.JPG|thumb|RP6 SV]]&lt;br /&gt;
&lt;br /&gt;
Man braucht dazu:&lt;br /&gt;
* 1-reihige Stiftleiste RM 2,54mm (z.B. 36-polig 732478)&lt;br /&gt;
* Evtl.: Eine Codierbrücke (z.B. aus Set 742902)&lt;br /&gt;
* Evtl.: Eine 1-polige Steckbuchse mit Litze zur ext. Stromversorgung&lt;br /&gt;
Es muss eine kurze Leiterbahn zwischen den Punkten &amp;quot;SV1&amp;quot; und &amp;quot;SV2&amp;quot; (SP2 A1: SV1, SV2; zwischen dem PROG/UART- und dem USRBUS1-Stecker) aufgetrennt werden. Die Leiterbahn befindet sich auf der Lötseite der Platine und muss mit einem scharfen Messer oder einem speziellen Leiterbahn-Unterbrecher zwischen den beiden Lötpunkten unterbrochen werden. Man sollte anschließend mit einem Widerstandsmeßgerät zwischen SV1 und SV2 nachmessen: Es sollte keine Verbindung mehr bestehen. Jetzt trennt man von der 1-reihigen Stiftleiste 2 Kontakte ab und lötet sie auf die Punkte SV1/SV2.&lt;br /&gt;
&lt;br /&gt;
Man kann hier zunächst eine Codierbrücke aufstecken. Damit versorgt der RP6 Akku die Sensoren mit 5V an den Pins VDD. Möchte man später eine getrennte 5V-Spannung anlegen, zieht man einfach die Codierbrücke ab und speist die externe 5V-Spannung (mit einer 1-poligen Steckbuchse) am Pin SV2 ein. Achtung: An Pin SV1 wird dann nichts angeschlossen!&lt;br /&gt;
&lt;br /&gt;
Anstelle der Codierbrücke kann man natürlich auch einen MOSFET anschließen, um die Sensoren per Software abschalten zu können.&lt;br /&gt;
&lt;br /&gt;
====ACS====&lt;br /&gt;
[[Bild:RP6_ACS_JP.JPG|thumb|RP6 ACS JP]]&lt;br /&gt;
Die Trennstelle ACS (SP2 E1: YIR1, YIR2; SP2 F1: YIR3) befindet sich neben C29*. Sie besteht aus 3 Lötpunkten, von denen die linken beiden (IRC1, IRC2) verbunden sind. Trennt man die Leiterbahn zwischen diesen Lötpunkten auf und verbindet stattdessen die rechten beiden Lötpunkte (IRC2, IRC3) mit etwas Lötzinn oder mit einem SMD Null Ohm Widerstand, dann ist der IR-Empfänger (TSOP, IC3) dauerhaft EINgeschaltet und kann nicht mehr über das Signal PWRON (PB4) geschaltet werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====IRC====&lt;br /&gt;
[[Bild:RP6_IRC_JP.JPG|thumb|RP6 IRC JP]]&lt;br /&gt;
Die Trennstelle IRC (SP2 C1: IRC1..2) ist eng verknüpft mit den Mess- und Kontaktpunkten des IRCOMM-Senders (siehe Abschnitt &amp;quot;Mess-/Kontaktpunkte - IRC&amp;quot; weiter oben!). Wenn man sie auftrennt, kann man den IRCOMM-Sender mit einer getrennten Stromversorgung anstelle von +UB des RP6 versehen. Dies ist sehr sinnvoll, wenn man diese Funktion häufig verwendet oder sogar noch leistungsfähigere IR-Sendedioden einbaut, denn der IRCOMM-Sender ist der zweitgrößte Stromfresser (nach dem Antrieb) auf dem RP6 (von Erweiterungsplatinen und EPs Marke Eigenbau einmal abgesehen!). Man kann hier natürlich auch eine 2-polige Stiftleiste einlöten, um die Verbindung zu +UB mit einer Codierbrücke trennbar zu machen. Eine getrennte Stromversorgung +7,2V (Bereich: +5,5 .. +10V) kann man an IRC1 einspeisen. IRC1 dieser Trennstelle ist mit dem Kontaktpunkt IRC3 (siehe Abschnitt &amp;quot;Mess-/Kontaktpunkte - IRC&amp;quot; weiter oben!) verbunden. &lt;br /&gt;
&lt;br /&gt;
====RP6 Antrieb====&lt;br /&gt;
Mit den folgenden Trennstellen kann man den RP6 Antrieb (H-Brücken und Motoren) fast komplett vom Rest des RP6 Mainboards abtrennen (es bleibt nur die 5V-Versorgung (VDD) von IC4, T1, T2 bestehen!). Damit ist es möglich, mit dem RP6 Mainboard einen ganz anderen Antrieb (also z.B. ein anderes Roboter-Chassis mit eigenen Motoren und H-Brücken) zu steuern. Umgekehrt könnte man den RP6 Antrieb auch deshalb abtrennen, um ihn durch ein anderes Prozessorsystem (z.B. auch eine M32!) anzusteuern. It's up to you!&lt;br /&gt;
&lt;br /&gt;
=====+UB Power=====&lt;br /&gt;
[[Bild:RP6_HB_Power.jpg|thumb|RP6 HB Power]]&lt;br /&gt;
Der RP6 Antrieb wird direkt aus dem Akku (über S1 und F1) mit 7,2V (+UB) versorgt. Diese Stromversorgung kann man komplett abtrennen. Die Trennstelle (SP3 E34: X) liegt unter der Sicherung F1 (siehe Abb. RP6 HB Power). Zwischen den beiden doppelten Lötflächen befinden sich auf der Lötseite (Unterseite) des Mainboards vier parallele Leiterbahnen, die aufgetrennt werden müssen. Der Pluspol einer externen Spannung zur Versorgung des RP6 Antriebs kann dann mit einer Kabelverbindung an den doppelten Lötflächen (mit einem &amp;quot;+&amp;quot; gekennzeichnet) direkt neben dem Leistungswiderstand (R27) angeschlossen werden. Eine Absicherung dieser Stromversorgung sollte man unbedingt vorsehen (2,5A träge)!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=====Stromsensoren=====&lt;br /&gt;
[[Bild:RP6_CS.JPG|thumb|RP6 CS]]&lt;br /&gt;
Um den Motorstrom der beiden Motoren des RP6 zu messen, wird ein Dual-Operationsverstärker (IC5 = 27M2C; SP3 B23/D23: IC5B/A) eingesetzt. Dieses IC wird über PWRON (PB4) mit Strom versorgt. Die Stromsensoren funktionieren also nicht, wenn PWRON Low-Pegel führt (Befehl powerOFF() der RP6 Library!). Auf dem RP6 Mainboard gibt es eine Trennstelle mit drei Lötflächen (SP3 E34: CS1, CS2, CS3). Sie befindet sich auf dem Mainboard neben C23. Möchte man IC5 nicht mehr über PWRON mit Strom versorgen, sondern über VDD (+5V), dann trennt man die Leiterbahn zwischen den linken beiden Lötpunkten (CS1, CS2) auf und verbindet die rechten beiden Lötpunkte (CS2, CS3) mit etwas Lötzinn oder einem SMD Null Ohm Widerstand. Danach sind die Stromsensoren immer eingeschaltet und können über PWRON nicht mehr geschaltet werden. Alternativ kann man an CS2 auch eine externe Versorgungsspannung (+5V) für IC5 einspeisen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=====DR/MR/ML/DL=====&lt;br /&gt;
[[Bild:RP6_DR_MR_ML_DL.JPG|thumb|RP6 DR MR ML DL]]&lt;br /&gt;
An diesen Trennstellen können die Eingänge der H-Brücke für die Geschwindigkeit (PWM) und Drehrichtung der Motoren von den Portpins des Microcontrollers abgetrennt werden.&lt;br /&gt;
Für den rechten Motor sind dies die Trennstellen MR1/2 und DR1/2 (SP3 A23: MR1/2, DR1/2), für den linken Motor ML1/2 und DL1/2 (SP3 F23: ML1/2, DL1/2).&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |Trennstelle&lt;br /&gt;
 |Portpin&lt;br /&gt;
 |Funktion H-Brücke&lt;br /&gt;
 |-&lt;br /&gt;
 |MR1/2&lt;br /&gt;
 |PD5 (OC1A)&lt;br /&gt;
 |PWM Motor rechts&lt;br /&gt;
 |-&lt;br /&gt;
 |DR1/2&lt;br /&gt;
 |PC3 (TMS)&lt;br /&gt;
 |Fahrtrichtung rechts&lt;br /&gt;
 |-&lt;br /&gt;
 |ML1/2&lt;br /&gt;
 |PD4 (OC1B)&lt;br /&gt;
 |PWM Motor links&lt;br /&gt;
 |-&lt;br /&gt;
 |DL1/2&lt;br /&gt;
 |PC2 (TCK)&lt;br /&gt;
 |Fahrtrichtung links&lt;br /&gt;
 |-&lt;br /&gt;
|}&lt;br /&gt;
Trennt man die Leiterbahn (auf der Lötseite des RP6 Mainboards) zwischen den Lötpunkten der Trennstellen auf, kann man die Eingänge der H-Brücke (Mx1, Dx1) z.B. mit einem anderen Microcontroller verbinden. Die Ausgänge (Portpins) des RP6 Microcontrollers (Mx2, Dx2) können dann anders genutzt werden. Natürlich kann man auf die Lötpunkte dieser Trennstellen auch Stiftleisten löten, um den Anschluß steckbar zu machen.&lt;br /&gt;
&lt;br /&gt;
=====MCR/MCL=====&lt;br /&gt;
[[Bild:RP6_MCR_MCL.JPG|thumb|RP6 MCR MCL]]&lt;br /&gt;
An diesen Trennstellen können die Motorstromsensoren von den ADC-Eingängen des Microcontrollers abgetrennt werden.&lt;br /&gt;
&lt;br /&gt;
Für den rechten Sensor ist dies die Trennstelle MCR1/2 (SP3 A1: MCR1, MCR2), für den linken Sensor MCL1/2 (SP3 E1: MCL1, MCL2).&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |Trennstelle&lt;br /&gt;
 |Portpin&lt;br /&gt;
 |Funktion H-Brücke&lt;br /&gt;
 |-&lt;br /&gt;
 |MCR1/2&lt;br /&gt;
 |PA5 (ADC5)&lt;br /&gt;
 |Motorstrom rechts&lt;br /&gt;
 |-&lt;br /&gt;
 |MCL1/2&lt;br /&gt;
 |PA6 (ADC6)&lt;br /&gt;
 |Motorstrom links&lt;br /&gt;
 |-&lt;br /&gt;
|}&lt;br /&gt;
Trennt man die Leiterbahn (auf der Lötseite des RP6 Mainboards) zwischen den Lötpunkten der Trennstellen auf, kann man die ADC-Eingänge (Portpins) des RP6 Microcontrollers (MCx1) anders nutzen und die Ausgänge der Motorstromsensoren (MCx2) z.B. mit ADC-Eingängen eines anderen Microcontrollers verbinden. Natürlich kann man auf die Lötpunkte dieser Trennstellen auch Stiftleisten löten, um den Anschluß steckbar zu machen.&lt;br /&gt;
&lt;br /&gt;
====PWRON-LED====&lt;br /&gt;
[[Bild:RP6_PWRON_L.JPG|thumb|RP6 PWRON L]]&lt;br /&gt;
Auf dem RP6 Mainboard gibt es eine gelbe LED, die anzeigt, ob PWRON High-Pegel hat. Mit einer Trennstelle neben dieser LED (SP2 D4: YL1, YL2) kann diese LED deaktiviert werden (z.B. um Strom zu sparen).&lt;br /&gt;
&lt;br /&gt;
Dazu trennt man die Leiterbahn zwischen den Lötpunkten auf. Soll die LED wieder aktiviert werden, verbindet man die Lötpunkte wieder mit etwas Lötzinn oder einem SMD Null Ohm Widerstand.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====+UB Sensor====&lt;br /&gt;
[[Bild:RP6_UB.JPG|thumb|RP6 UB]]&lt;br /&gt;
Die Versorgungsspannung +UB des RP6 wird mit dem +UB-Spannungssensor an PA7 (ADC7) gemessen. Will man diesen Spannungssensor mit seinem Eingangsspannungsteiler R1, R2 (SP1 D12: R1, R2) von +UB abtrennen (z.B. um ihn anders zu verwenden), gibt es eine Trennstelle UB1/2 (SP1 D2: UB1, UB2). Trennt man die Leiterbahn auf der Lötseite des RP6 Mainboards zwischen den Lötpunkten auf, kann +UB nicht mehr gemessen werden. Man kann dann den Lötpunkt UB2 mit einem anderen Messpunkt (z.B. mit +BAT) verbinden und dort die Spannung (0..10V) messen. Natürlich kann man auf die Lötpunkte dieser Trennstellen auch Stiftleisten löten, um den Anschluß steckbar zu machen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====EXT Anschluß: Andere Stromversorgung====&lt;br /&gt;
[[Bild:RP6_S1_CHRG.jpg|thumb|RP6 S1 CHRG]]&lt;br /&gt;
Wenn man für den RP6 eine andere Stromversorgung oder Ladeschaltung anschließen will, geht dies gut am EXT Anschluß (SP1 C23: Stecker EXT). Siehe auch den Abschnitt &amp;quot;Anschlüsse - EXT Anschluß&amp;quot; weiter oben! Dann muss der Schalter S1 dauerhaft AUSgeschaltet bleiben und die Verbindung zwischen S1 und CHRG des EXT Anschlusses (SP1 C3: X) unterbrochen werden. Diese Trennstelle befindet sich auf der Lötseite (Unterseite) des RP6 Mainboards etwas versteckt zwischen S1 (Pin 3) und der benachbarten Leiterbahn, die CHRG des EXT Anschlusses mit der Ladebuchse CHARGER (Pin 1 +) verbindet. Dort sind fünf kurze, parallele Leiterbahnen zu unterbrechen (siehe gelbe Markierung in der Abb. RP6 S1 CHRG!). Will man das nicht machen, darf man die Ladebuchse CHARGER auf jeden Fall nicht mehr nutzen!&lt;br /&gt;
&lt;br /&gt;
===Lochraster-Felder===&lt;br /&gt;
Auf diesen Feldern kann man eigene kleine Schaltungen aufbauen. An jedem der sechs Felder stehen VDD (+5V) und GND zur Verfügung (SP4 E12: YVDDx, YGNDx).&lt;br /&gt;
&lt;br /&gt;
Bitte beachten: Die Lochreihen oder -spalten, die mit einer eckigen Klammer &amp;quot;[&amp;quot; markiert sind, liegen auf der Lötseite (Unterseite) direkt auf dem Rahmen des Chassis! Hier können also keine Drähte von unten verlötet werden.&lt;br /&gt;
&lt;br /&gt;
====Vorn links====&lt;br /&gt;
Das kleine Lochrasterfeld vorn links kann z.B. für Beleuchtung (Blinker, Scheinwerfer links) oder auch für einen zusätzlichen Sensor genutzt werden.&lt;br /&gt;
Zur Verfügung steht eine 2-adrige Verbindung zum mittleren Lochrasterfeld links.&lt;br /&gt;
&lt;br /&gt;
In der Nähe dieses Lochrasterfeldes gibt es auch:&lt;br /&gt;
* IO3, IO4 (SP2 E3: IO3, IO4)&lt;br /&gt;
* ADC0 (SP2 B1: ADC0)&lt;br /&gt;
&lt;br /&gt;
====Mitte links====&lt;br /&gt;
[[Bild:RP6_Lochfeld_LM.JPG|thumb|RP6 Lochrasterfeld Mitte links]]&lt;br /&gt;
Das größere Lochrasterfeld Mitte links kann z.B. für eine kleinere Schaltung zur Ansteuerung der Beleuchtung/Sensoren auf den Lochrasterfeldern vorn und hinten links oder für andere Zwecke genutzt werden.&lt;br /&gt;
&lt;br /&gt;
Es stehen hier folgende Anschlüsse zur Verfügung:&lt;br /&gt;
* 2-adrige Verbindung zum Lochrasterfeld vorn links&lt;br /&gt;
* 2-adrige Verbindung zum Lochrasterfeld hinten links&lt;br /&gt;
* ST1/ST2 zum Anschluß weiterer Start/Stop Taster (SP2 D2: ST1/2)&lt;br /&gt;
* PWR (SP2 D2: YPWR1)&lt;br /&gt;
* I2C-Bus (SCL, SDA; SP4 C1: YSCL1, YSDA1)&lt;br /&gt;
* +UB (SP4 D2: YUB1)&lt;br /&gt;
In der Nähe dieses Lochrasterfeldes gibt es auch:&lt;br /&gt;
* Serielle Schnittstelle (RST, TX, RX; SP4 AB5: YRX, YTX, YMRESET, YVDD)&lt;br /&gt;
* USRBUS1 (vorn; SP4 E34: Y1'..Y14')&lt;br /&gt;
&lt;br /&gt;
=====Schaltungsvorschläge=====&lt;br /&gt;
Wie kann z.B. eine Schaltung für Beleuchtungseffekte oder Sensoren aussehen?&lt;br /&gt;
&lt;br /&gt;
Man könnte 8 zusätzliche Schaltkanäle mit dem I2C-Portexpander-IC PCF8574(A)P gewinnen. Dieses IC passt mit wenigen Zusatzteilen auf die mittlere Lochrasterfläche. Angesteuert wird es über den I2C-Bus. Mit den 8 Ausgängen lassen sich einige Beleuchtungseffekte erreichen, die dann über Software schaltbar sind.&lt;br /&gt;
&lt;br /&gt;
Alternativ kann man auch das IC PCF8591P z.B. für den Anschluß von analogen Sensoren verwenden. Auch dieser Baustein wird über I2C angesteuert. Beide ICs sind bei [http://www.reichelt.de./ Reichelt] erhältlich.&lt;br /&gt;
&lt;br /&gt;
Will man nicht den I2C-Bus benutzen, kann man als I/O-Ports IO1..IO4 oder als analoge Eingänge ADC0 und ADC1 verwenden. Auch SCL und SDA stehen als I/O-Ports zur Verfügung, wenn der I2C-Bus im ganzen System nicht verwendet werden soll.&lt;br /&gt;
&lt;br /&gt;
Wichtig für Zusatzschaltungen, die fest auf dem RP6 verlötet werden, sind zwei Aspekte:&lt;br /&gt;
* Wenn sie die Stromversorgung belasten, sollten sie (z.B. über einen Transistor oder MOSFET) abschaltbar sein. Dazu kann man auch das Signal PWR heranziehen, das auf beiden mittleren Lochrasterflächen zur Verfügung steht. Dann kann man mit dem Befehl &amp;quot;powerOFF()&amp;quot; der RP6 Library die Stromversorgung per Software abschalten.&lt;br /&gt;
* Wenn man auch anderweitig genutzte Portpins (SDA, SCL, IO1..IO4, ADC0/1) für die eigene Schaltung einsetzt, sollte man die Verbindung zu den Portpins mit einer abziehbaren Codierbrücke trennbar machen.&lt;br /&gt;
&lt;br /&gt;
====Hinten links====&lt;br /&gt;
Das kleine Lochrasterfeld hinten links kann z.B. für Beleuchtung (Blinker, Rücklicht links) oder auch für einen zusätzlichen Sensor genutzt werden.&lt;br /&gt;
Zur Verfügung steht eine 2-adrige Verbindung zum mittleren Lochrasterfeld links.&lt;br /&gt;
&lt;br /&gt;
In der Nähe dieses Lochrasterfeldes gibt es auch:&lt;br /&gt;
* EXT Anschluß (SP1 C23: Stecker EXT)&lt;br /&gt;
&lt;br /&gt;
====Vorn rechts====&lt;br /&gt;
Das kleine Lochrasterfeld vorn rechts kann z.B. für Beleuchtung (Blinker, Scheinwerfer rechts) oder auch für einen zusätzlichen Sensor genutzt werden.&lt;br /&gt;
Zur Verfügung steht eine 2-adrige Verbindung zum mittleren Lochrasterfeld rechts.&lt;br /&gt;
&lt;br /&gt;
In der Nähe dieses Lochrasterfeldes gibt es auch:&lt;br /&gt;
* IO1, IO2 (SP2 E3: IO1, IO2)&lt;br /&gt;
* ADC1 (SP2 B1: ADC1)&lt;br /&gt;
&lt;br /&gt;
====Mitte rechts====&lt;br /&gt;
Das größere Lochrasterfeld Mitte rechts kann z.B. für eine kleinere Schaltung zur Ansteuerung der Beleuchtung/Sensoren auf den Lochrasterfeldern vorn und hinten rechts oder für andere Zwecke genutzt werden.&lt;br /&gt;
&lt;br /&gt;
Es stehen hier folgende Anschlüsse zur Verfügung:&lt;br /&gt;
* 2-adrige Verbindung zum Lochrasterfeld vorn rechts&lt;br /&gt;
* 2-adrige Verbindung zum Lochrasterfeld hinten rechts&lt;br /&gt;
* PWR (SP2 D2: YPWR2)&lt;br /&gt;
* I2C-Bus (SCL, SDA; SP4 C1: YSCL2, YSDA2)&lt;br /&gt;
* +UB (SP4 D2: YUB2)&lt;br /&gt;
In der Nähe dieses Lochrasterfeldes gibt es auch:&lt;br /&gt;
* Interrupt-Anschluß (INTU, INT1..3, MRESET; SP4 D34: MRESET, INT1..3, INTU)&lt;br /&gt;
* USRBUS2 (hinten; SP4 E34: Y1..Y14)&lt;br /&gt;
&lt;br /&gt;
====Hinten rechts====&lt;br /&gt;
Das kleine Lochrasterfeld hinten rechts kann z.B. für Beleuchtung (Blinker, Rücklicht rechts) oder auch für einen zusätzlichen Sensor genutzt werden.&lt;br /&gt;
Zur Verfügung steht eine 2-adrige Verbindung zum mittleren Lochrasterfeld rechts.&lt;br /&gt;
&lt;br /&gt;
In der Nähe dieses Lochrasterfeldes gibt es auch:&lt;br /&gt;
* EXT Anschluß (SP1 C23: Stecker EXT)&lt;br /&gt;
* Akku-Anschluß (SP1 B3: BATTERY)&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Erweiterungen==&lt;br /&gt;
Auf / An den RP6 könnte man z.B. noch folgendes anbauen / erweitern:&lt;br /&gt;
&lt;br /&gt;
* Einen Greifarm&lt;br /&gt;
* Einen Ultraschallsensor&lt;br /&gt;
* Zwei Lichtsensoren hinten, um die hellste / dunkelste Stelle im Raum besser zu finden&lt;br /&gt;
* Einen digitalen Kompass&lt;br /&gt;
* uvm.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Erweiterungs-Module==&lt;br /&gt;
&lt;br /&gt;
Es sind von Arexx schon einige Erweiterungsmöglichkeiten auf dem Markt. Zum Ersten die Experimentierplatinen ([http://www.conrad.de/ce/de/product/191537/Arexx-RP6-Experimentierplatine 191537] AUSVERKAUFT!), die zum Erstellen von eigenen Schaltungen und Sensoren gedacht sind, und von denen eine schon im Lieferumfang des RP6 enthalten war, das Erweiterungsboard RP6 CONTROL M32 ([http://www.conrad.de/ce/de/product/191550/Arexx-RP6-ATMEGA32-Erweiterungssatz 191550]) und die RP6 CCPRO M128 ([http://www.conrad.de/ce/de/product/191563/Arexx-RP6-CC-PRO-MEGA128-Erweiterungssatz 191563]).&lt;br /&gt;
&lt;br /&gt;
Die Boards kann man dann über den I2C Bus mit dem Mainboard kommunizieren lassen.  Es ist sehr sinnvoll, die Module symmetrisch hintereinander zu stapeln und nicht mehr als 6-8 Module zu verbauen, weil der Roboter sonst immer schwerer und langsamer wird. Basierend auf dem Master-Slave System könnte man so bis zu 127 Slaves anschließen. Zudem ist es ratsam, qualitativ hochwertige Akkus und ein Ladegerät mit passendem Stecker zu verwenden, da man ansonsten immer das Mainboard abschrauben müsste um an die Akkus heranzukommen. Für den Fall wurde extra eine Ladebuchse eingebaut.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Experimentierplatine ===&lt;br /&gt;
[[Bild:RP6_Exp.jpg|RP6 Experimentierplatine]]&lt;br /&gt;
&lt;br /&gt;
====Beschreibung====&lt;br /&gt;
Die Experimentier-Platine ist dazu gedacht, eigene Schaltungen auf dem RP6 zu realisieren, und ist seit Mai 2020 bei CONRAD ausverkauft. Sie wird über den I²C-Bus mit den anderen Erweiterungsmodulen verbunden. Ausserdem ist es sinnvoll, die (freien) I/O-Ports (ADC-Kanäle) der RP6 Base, des M32 Erweiterungsmoduls bzw. des CCPRO M128 Moduls über ein [http://www.reichelt.de/?;ACTION=3;LA=444;GROUP=C63;GROUPID=3328;ARTICLE=47637;START=0;SORT=artnr;OFFSET=16;SID=1580faBqwQAQ8AAGY-ZAM7cd511ee04a106a88a359faaac0071e2 10-Pol-Flachbandkabel] mit [http://www.reichelt.de/?ACTION=3;GROUP=C151;GROUPID=3231;ARTICLE=14571;SID=1580faBqwQAQ8AAGY-ZAM7cd511ee04a106a88a359faaac0071e2 Stecker] auf die Experimentierplatine zu führen, weil es übersichtlicher bleibt und keine Kabel lose herumhängen. Auf der Experimentierplatine kann man dann LEDs oder einen Temperatursensor an die I/O-Ports bzw. an die ADC-Kanäle anschießen.&lt;br /&gt;
&lt;br /&gt;
====Technische Daten====&lt;br /&gt;
{|  {{Blauetabelle}} &lt;br /&gt;
|'''Mikrocontroller:'''&lt;br /&gt;
|Keiner&lt;br /&gt;
|-&lt;br /&gt;
|'''Speicher:'''&lt;br /&gt;
|Keiner&amp;lt;br/&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|'''Programmierung:'''&lt;br /&gt;
|Kein Programmieradapter&lt;br /&gt;
|-&lt;br /&gt;
|'''Vorhandene Sensoren:'''&lt;br /&gt;
|Keine&amp;lt;br/&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|'''Vorhandene Aktoren:'''&lt;br /&gt;
|Keine&amp;lt;br/&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|'''Abmessungen:'''&lt;br /&gt;
|(L &amp;amp;times; B &amp;amp;times; H) 112 &amp;amp;times; 90 &amp;amp;times; 10 mm&lt;br /&gt;
|-&lt;br /&gt;
|'''Ausführung:'''&lt;br /&gt;
|Bausatz&lt;br /&gt;
|-&lt;br /&gt;
|'''Stromversorgung:'''&lt;br /&gt;
|6 AA NiMH Akkus (über die RP6 Base)&lt;br /&gt;
|-&lt;br /&gt;
|'''Hersteller:'''&lt;br /&gt;
|Arexx Niederlande&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Schaltungsideen ====&lt;br /&gt;
Auf der / den Experimentierplatinen könnte man z.B. folgendes realisieren:&lt;br /&gt;
&lt;br /&gt;
* eine Kameraschaltung (wie [http://www.rn-wissen.de/index.php/RP6_Kamera_-_Mitmach-Projekt hier] gezeigt)&lt;br /&gt;
* Scheinwerfer, Rücklichter, Blinker etc. (ABER immer mit Vorwiderstand!!!)&lt;br /&gt;
* ein LED-Lauflicht (über I/O-Expander, gibt´s beim [http://www.reichelt.de/?ACTION=3;ARTICLE=14527;PROVID=2402 Reichelt])&lt;br /&gt;
* mehr ADC-Kanäle (über ADC-Expander, einfach mal nach PCF8591 [http://www.google.de/search?q=PCF8591 googlen])&lt;br /&gt;
* eine Wetterstation mit Luftfeuchtemesser, Temperaturfühler und Lichtmesser ([http://www.roboternetz.de/phpBB2/viewtopic.php?t=52298 hier] gibt es eine Wetterstation uvm.)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== RP6 CONTROL M32 Platine ===&lt;br /&gt;
[[Bild:RP6Control_M32.jpg|RP6 CONTROL M32]]&lt;br /&gt;
&lt;br /&gt;
====Beschreibung====&lt;br /&gt;
Auf der M32 ([http://www.conrad.de/ce/de/product/191550/Arexx-RP6-ATMEGA32-Erweiterungssatz 191550]) lassen sich weitere LEDs, Sensoren oder ähnliches anschließen, außerdem steht ein weiterer ATMEGA32 zur Verfügung, welcher sich gut im Master Modus betreiben lässt. Es sind ein Mikrofonsensor, fünf Taster, vier Status-LEDs, ein Display-Port, ein Beeper, 6 freie ADC-Kanäle, 8 freie I/O-Ports, ein Programmieradapter, ein JTAG-Anschluss, eine ISP-Programmierschnittstelle sowie ein freier Steckplatz für ein EEPROM verfügbar.&lt;br /&gt;
&lt;br /&gt;
====Technische Daten====&lt;br /&gt;
{|  {{Blauetabelle}} &lt;br /&gt;
|'''Mikrocontroller:'''&lt;br /&gt;
|AVR [[ATmega32]]&lt;br /&gt;
|-&lt;br /&gt;
|'''Speicher:'''&lt;br /&gt;
|32 kB [[Flash]]-Speicher, davon 1 kB bereits vom Bootloader belegt&amp;lt;br/&amp;gt;&lt;br /&gt;
2 kB SRAM&amp;lt;br/&amp;gt; &lt;br /&gt;
1 kB [[EEPROM]]&lt;br /&gt;
|-&lt;br /&gt;
|'''Programmierung:'''&lt;br /&gt;
|Über AVR-[[Bootloader]], belegt ca. 1 kB des Flash-Speichers&lt;br /&gt;
|-&lt;br /&gt;
|'''Vorhandene Sensoren:'''&lt;br /&gt;
|1 Mikrofonsensor&amp;lt;br/&amp;gt;&lt;br /&gt;
5 Eingabetaster&amp;lt;br/&amp;gt;&lt;br /&gt;
14 I/O Ports, davon 6 ADC-Wandler&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|'''Vorhandene Aktoren:'''&lt;br /&gt;
|1 Beeper&amp;lt;br/&amp;gt;&lt;br /&gt;
4 Status-LEDs&amp;lt;br/&amp;gt;&lt;br /&gt;
1 LC-Display-Port&amp;lt;br/&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|'''Abmessungen:'''&lt;br /&gt;
|(L &amp;amp;times; B &amp;amp;times; H) 112 &amp;amp;times; 90 &amp;amp;times; 15 mm&lt;br /&gt;
|-&lt;br /&gt;
|'''Ausführung:'''&lt;br /&gt;
|Fertig aufgebautes Erweiterungsmodul&lt;br /&gt;
|-&lt;br /&gt;
|'''Stromversorgung:'''&lt;br /&gt;
|6 AA NiMH Akkus (über die RP6 Base)&lt;br /&gt;
|-&lt;br /&gt;
|'''Hersteller:'''&lt;br /&gt;
|Arexx Niederlande&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Umbau-Optionen ====&lt;br /&gt;
Dieser Absatz soll die Möglichkeiten der RP6 CONTROL M32 Platine (im Folgenden &amp;quot;M32&amp;quot; genannt) auflisten, die es gibt, um auf einfache Weise weitere Anschlüsse oder Verbindungen zu ermöglichen. Nicht beschrieben werden die Anschlußmöglichkeiten, die in Form der vorhandenen Wannenstecker sowieso gegeben sind (z.B. am LCD-, I/O- oder ADC-Stecker). Im Text gibt es Verweise auf den Schaltplan der M32 (RP6_CONTROL_M32.PDF) in der Form: (SP2 B1: Bauteil).  Dies bedeutet, dass man das Bauteil auf Blatt 2 des RP6-M32-Schaltplans im Feld B1 finden kann.&lt;br /&gt;
&lt;br /&gt;
Folgende Möglichkeiten zum Umbau/Ausbau sind vorgesehen:&lt;br /&gt;
* Zweites SPI-EEPROM (IC5)&lt;br /&gt;
* Zwei analoge Sensoren, evtl. mit getrennter Stromversorgung&lt;br /&gt;
* ISP (In System Programming)&lt;br /&gt;
* JTAG-Programmierung&lt;br /&gt;
* USRBUS&lt;br /&gt;
* IRQ-Zuweisung ändern&lt;br /&gt;
* ADC0 und ADC1 anders nutzen&lt;br /&gt;
* Schieberegister kaskadieren&lt;br /&gt;
Im folgenden Text soll beschrieben werden, wie man die weiteren Möglichkeiten nutzen kann. Es wird jeweils erwähnt, was man an Material braucht. Beispielhaft sind da Bestell-Nummern der Firma [http://www.conrad.de/ce/ CONRAD] genannt. Natürlich kann man die Teile auch bei anderen Versendern beziehen. Durch die Nennung der Bestell-Nummer ist das jeweilige Teil aber gut zu identifizieren. Man sollte Löten können und sich bewußt sein, dass ggf. ein Garantieanspruch nicht mehr besteht, wenn man an der Platine gelötet hat.&lt;br /&gt;
&lt;br /&gt;
Bei den Materialangaben ist öfter die Rede von &amp;quot;Steckbuchsen mit Litze&amp;quot;. Diese Steckbuchsen mit angelöteter Litze können auf die ein- oder zweireihigen Stiftleisten aufgesteckt werden. Leider gibt es sie nicht (mehr) fertig konfektioniert bei CONRAD. Die einreihigen Steckbuchsen (RM 2,54mm) kann man aber z.B. bei [http://www.elv.de/output/controller.aspx ELV] bekommen: 2-polig (68-016635), 3-polig (68-022503) und 5-polig (68-023073). An sie muss man dann noch Litzen in der entsprechenden Länge selbst anlöten.&lt;br /&gt;
&lt;br /&gt;
===== Zweites SPI-EEPROM =====&lt;br /&gt;
Es ist sehr einfach, ein zweites SPI-EEPROM (SP1 A1: IC5*) auf der M32 zu nutzen.&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_M32_IC5-Socket.JPG|thumb|Sockel des 2. SPI-EEPROMs]]&lt;br /&gt;
&lt;br /&gt;
Man braucht dazu:&lt;br /&gt;
* Einen IC-Sockel 8-pol DIP für IC5 ([http://www.conrad.de/ce/de/product/189600/IC-FASSUNG-PRAeZISION-8POLIG 189600])&lt;br /&gt;
* Einen Keramik-Vielschicht-Kondensator 100nF (C19); RM 2,54mm ([http://www.conrad.de/ce/de/product/453099/?insert=36&amp;amp;insertNoDeeplink&amp;amp;productname=KONDENSATOR-01-F-KDPU-254-MM 453099])&lt;br /&gt;
* Ein serielles SPI-EEPROM im PDIP8 Gehäuse (IC5)&lt;br /&gt;
Zuerst wird der IC-Sockel eingelötet (Kerbe beachten!), dann C19 (SP1 A1: C19*). Das war's.&lt;br /&gt;
&lt;br /&gt;
Leider gibt es das EEPROM nicht bei den gängigeren Versendern. Bekommen kann man es aber z.B. bei [http://de.farnell.com/jsp/home/homepage.jsp Farnell]. Dort hat das SPI-EEPROM mit 256 kbit die Bezeichnung 25LC256-I/P (1331398). Wenn man es noch größer mag: 25LC1024 (1331392) mit 1024 kbit. SPI-EEPROMs führt inzwischen auch [http://www.reichelt.de./ Reichelt].&lt;br /&gt;
&lt;br /&gt;
'''Programmierung:'''&lt;br /&gt;
&lt;br /&gt;
In die RP6ControlLib.h bitte einfügen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#define SPI_EEPROM2_PAGESIZE 64&lt;br /&gt;
&lt;br /&gt;
uint8_t SPI_EEPROM2_readByte(uint16_t memAddr);&lt;br /&gt;
void SPI_EEPROM2_writeByte(uint16_t memAddr, uint8_t data);&lt;br /&gt;
void SPI_EEPROM2_enableWrite(void);&lt;br /&gt;
void SPI_EEPROM2_disableWrite(void);&lt;br /&gt;
uint8_t SPI_EEPROM2_getStatus(void);&lt;br /&gt;
&lt;br /&gt;
void SPI_EEPROM2_writeBytes(uint16_t startAddr, uint8_t *buffer, uint8_t length);&lt;br /&gt;
void SPI_EEPROM2_readBytes(uint16_t startAddr, uint8_t *buffer, uint8_t length);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Die Konstante SPI_EEPROM2_PAGESIZE ist abhängig von der Art und Größe des EEPROMs. Für ein 256 kbit-EEPROM ist die Seitengröße (pagesize) in der Regel 64, für einen 512 kbit-Typ 128 und für einen 1024 kbit-Typ 256.&lt;br /&gt;
&lt;br /&gt;
In die RP6ControlLib.c bitte einfügen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Second external SPI EEPROM:&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Reads a single Byte from the 2nd external EEPROM.&lt;br /&gt;
 */&lt;br /&gt;
uint8_t SPI_EEPROM2_readByte(uint16_t memAddr)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t data;&lt;br /&gt;
	PORTB &amp;amp;= ~MEM_CS2;&lt;br /&gt;
	writeSPI(SPI_EEPROM_READ);&lt;br /&gt;
	writeWordSPI(memAddr);&lt;br /&gt;
	data = readSPI();&lt;br /&gt;
	PORTB |= MEM_CS2;&lt;br /&gt;
	return data;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Reads &amp;quot;length&amp;quot; Bytes into the Buffer &amp;quot;buffer&amp;quot; from startAdr on. &lt;br /&gt;
 * You can read the complete 2nd EEPROM into a buffer at once - if it is large enough. &lt;br /&gt;
 * (But you only have 2KB SRAM on a MEGA32 ;) )&lt;br /&gt;
 */&lt;br /&gt;
void SPI_EEPROM2_readBytes(uint16_t startAddr, uint8_t *buffer, uint8_t length)&lt;br /&gt;
{&lt;br /&gt;
	PORTB &amp;amp;= ~MEM_CS2;&lt;br /&gt;
	writeSPI(SPI_EEPROM_READ);&lt;br /&gt;
	writeWordSPI(startAddr);&lt;br /&gt;
	readBufferSPI(&amp;amp;buffer[0], length);&lt;br /&gt;
	PORTB |= MEM_CS2;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Enable Write Mode&lt;br /&gt;
 */&lt;br /&gt;
void SPI_EEPROM2_enableWrite(void)&lt;br /&gt;
{&lt;br /&gt;
	PORTB &amp;amp;= ~MEM_CS2;&lt;br /&gt;
	writeSPI(SPI_EEPROM_WREN);&lt;br /&gt;
	PORTB |= MEM_CS2;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Disable Write Mode&lt;br /&gt;
 */&lt;br /&gt;
void SPI_EEPROM2_disableWrite(void)&lt;br /&gt;
{&lt;br /&gt;
	PORTB &amp;amp;= ~MEM_CS2;&lt;br /&gt;
	writeSPI(SPI_EEPROM_WRDI);&lt;br /&gt;
	PORTB |= MEM_CS2;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Write a single data byte to the specified 2nd EEPROM address.&lt;br /&gt;
 */&lt;br /&gt;
void SPI_EEPROM2_writeByte(uint16_t memAddr, uint8_t data)&lt;br /&gt;
{&lt;br /&gt;
	while(SPI_EEPROM2_getStatus() &amp;amp; SPI_EEPROM_STAT_WIP);&lt;br /&gt;
	SPI_EEPROM2_enableWrite();&lt;br /&gt;
	PORTB &amp;amp;= ~MEM_CS2;&lt;br /&gt;
	writeSPI(SPI_EEPROM_WRITE);&lt;br /&gt;
	writeWordSPI(memAddr);&lt;br /&gt;
	writeSPI(data);&lt;br /&gt;
	PORTB |= MEM_CS2;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Write &amp;quot;length&amp;quot; Bytes from the Buffer to the 2nd EEPROM. &lt;br /&gt;
 * YOU CAN ONLY WRITE MAXIMAL [SPI_EEPROM2_PAGESIZE] BYTES AT ONCE!!!&lt;br /&gt;
 * This is the Pagesize!&lt;br /&gt;
 * You can NOT cross a page boundary!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void SPI_EEPROM2_writeBytes(uint16_t startAddr, uint8_t *buffer, uint8_t length)&lt;br /&gt;
{&lt;br /&gt;
	while(SPI_EEPROM2_getStatus() &amp;amp; SPI_EEPROM_STAT_WIP);&lt;br /&gt;
	SPI_EEPROM2_enableWrite();&lt;br /&gt;
	PORTB &amp;amp;= ~MEM_CS2;&lt;br /&gt;
	writeSPI(SPI_EEPROM_WRITE);&lt;br /&gt;
	writeWordSPI(startAddr);&lt;br /&gt;
	writeBufferSPI(&amp;amp;buffer[0], length);&lt;br /&gt;
	PORTB |= MEM_CS2;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Returns EEPROM Status register - for checking if 2nd EEPROM is buisy. &lt;br /&gt;
 * Writing takes about 5ms. &lt;br /&gt;
 */&lt;br /&gt;
uint8_t SPI_EEPROM2_getStatus(void)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t status;&lt;br /&gt;
	PORTB &amp;amp;= ~MEM_CS2;&lt;br /&gt;
	writeSPI(SPI_EEPROM_RDSR);&lt;br /&gt;
	status = readSPI();&lt;br /&gt;
	PORTB |= MEM_CS2;&lt;br /&gt;
	return status;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Hinweis zum 1024 kbit-EEPROM:&lt;br /&gt;
&lt;br /&gt;
Dieses EEPROM benötigt 24-Bit Adressen und muss daher etwas anders angesprochen werden als die &amp;quot;kleineren&amp;quot; Typen bis 512 kbit.&lt;br /&gt;
Die Funktion SPI_EEPROM2_readByte() sieht für ein 1024 kbit-EEPROM z.B. so aus:&lt;br /&gt;
&amp;lt;pre&amp;gt;uint8_t SPI_EEPROM2_readByte(uint32_t memAddr)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t data;&lt;br /&gt;
	PORTB &amp;amp;= ~MEM_CS2;&lt;br /&gt;
	writeSPI(SPI_EEPROM_READ);&lt;br /&gt;
	writeSPI((uint8_t)(memAddr &amp;gt;&amp;gt; 16));&lt;br /&gt;
	writeWordSPI((uint16_t)memAddr);&lt;br /&gt;
	data = readSPI();&lt;br /&gt;
	PORTB |= MEM_CS2;&lt;br /&gt;
	return data;&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
Alle weiteren Funktionen, die EEPROM-Adressen verwenden (SPI_EEPROM2_readBytes, SPI_EEPROM2_writeByte, SPI_EEPROM2_writeBytes), müssen genau so angepasst werden.&lt;br /&gt;
&lt;br /&gt;
===== Anschlüsse =====&lt;br /&gt;
Hier wird aufgelistet, wo man auf der M32 Platine Anschlüsse nutzen kann, um sie z.B. zu weiteren Sensoren, zum USRBUS oder (weniger empfehlenswert!) direkt zu EPs, zur RP6 Base oder zur CCPRO M128 zu führen. &lt;br /&gt;
&lt;br /&gt;
====== Analoge Sensoren an ADC2/3 ======&lt;br /&gt;
[[Bild:RP6_M32_ADC23.JPG|thumb|ADC2 ADC3]]&lt;br /&gt;
Wenn man bis zu zwei analoge Sensoren (z.B. IR-Distanz-Mess-Sensoren Sharp GP2Y0A02YK 185364) direkt an die M32 anschließen möchte, dann gibt es da zwei 3-polige Kontakte, beschriftet mit VDD/GND/ADCx (x = 2..3). Hier kann man 3-polige Stiftleisten auflöten, an die dann die Sensoren angeschlossen werden.&lt;br /&gt;
&lt;br /&gt;
Man braucht dazu:&lt;br /&gt;
* 1-reihige Stiftleiste RM 2,54mm (z.B. 36-polig 732478)&lt;br /&gt;
* Zwei Keramik-Vielschicht-Kondensatoren 100nF (C16, C17); RM 2,54mm (453099)&lt;br /&gt;
* Ein Elektrolyt-Kondensator stehend 470 uF / 16V (C18); RM 3,5mm (446211)&lt;br /&gt;
* Zwei 3-polige Steckbuchsen mit Litze zum Anschluß der Sensoren&lt;br /&gt;
Man trennt von der 1-reihigen Stiftleiste zweimal 3 Kontakte ab und lötet sie auf die weiß umrahmten Kontakte (VDD/GND/ADCx; SP2 C23: ADC2, YGND8, YVDD6, ADC3, YGND7, YVDD5), anschließend C16, C17 (SP2 C1: C16*, C17*) auf ihre Plätze und zum Schluß den Elko 470 uF (C18; SP2 B1: C18*). Beim Elko auf die Polung achten: Er muss genau so sitzen wie sein Nachbar C1 (Minuspol schaut zum Beeper SND).&lt;br /&gt;
&lt;br /&gt;
Die Sensoren lötet man an die Litzen der 3-poligen Steckbuchsen und steckt diese auf die neuen Kontakte.&lt;br /&gt;
&lt;br /&gt;
Da manche Sensoren einen höheren Stromverbrauch haben, kann man die Stromversorgung an den VDD-Pins der ADC2/3-Stecker abschaltbar machen oder eine separate +5V-Spannung einspeisen. Siehe dazu den Abschnitt &amp;quot;Trennstellen - Getrennte Stromversorgung für ADC2/3&amp;quot; weiter unten!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====== ISP (In System Programming) ======&lt;br /&gt;
Der ATMEGA32 der M32 wird standardmäßig über den PROG/UART Stecker programmiert. Dazu befindet sich im Prozessor ein Bootloader-Programm. Wenn man stattdessen oder zusätzlich die ISP-Programmierung mit einem dafür geeigneten ISP-Programmier-Adapter nutzen will, kann man den Adapter an den gewinkelten ISP-Stecker auf der M32 anschließen.&lt;br /&gt;
Vorher sind aber ein paar &amp;quot;Umbauarbeiten&amp;quot; erforderlich.&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_M32_ISP.JPG|thumb|ISP]]&lt;br /&gt;
&lt;br /&gt;
Man braucht dazu:&lt;br /&gt;
* 1-reihige Stiftleiste RM 2,54mm (z.B. 36-polig 732478)&lt;br /&gt;
* Einen SMD-Widerstand 10 kOhm (406376)&lt;br /&gt;
* Eine SMD-Diode LL 4148 (140902)&lt;br /&gt;
* Eine Codierbrücke (z.B. aus Set 742902)&lt;br /&gt;
&lt;br /&gt;
Der SMD-Widerstand wird auf seinen Platz (R1; SP1 A3: R1*) neben dem XBUS2-Stecker gelötet, danach die Diode LL 4148 (D2; SP1 B3: D2*). Die Kathode (Strich) der Diode zeigt in Richtung des Quarzes (X1). Zwischen R1 und C1 befinden sich drei Lötpunkte (beschriftet mit ISP/DEBUG - BOOTLOAD; SP1 A34: YRST1..3), auf die eine 3-polige Stiftleiste gelötet werden muss. Vorher muss eine kurze Leiterbahn zwischen den Lötpunkten BOOTLOAD aufgetrennt werden. Die Leiterbahn befindet sich auf der Lötseite der Platine und muss mit einem scharfen Messer oder einem speziellen Leiterbahn-Unterbrecher zwischen den beiden Lötpunkten unterbrochen werden. Man sollte anschließend mit einem Widerstandsmeßgerät nachmessen: Es sollte keine Verbindung mehr zwischen den Lötpunkten bestehen.&lt;br /&gt;
Man trennt dann von der 1-reihigen Stiftleiste 3 Kontakte ab und lötet sie auf die beschriebenen drei Lötpunkte.&lt;br /&gt;
&lt;br /&gt;
Wenn man jetzt eine Codierbrücke auf die mit &amp;quot;BOOTLOAD&amp;quot; beschrifteten Pins steckt, bleibt alles unverändert: Die Programmierung erfolgt weiter über den PROG/UART-Stecker mithilfe des Bootloaders im Prozessor. Wird die Codierbrücke in Stellung &amp;quot;ISP/DEBUG&amp;quot; umgesteckt, kann der Prozessor mit ISP programmiert werden.&lt;br /&gt;
&lt;br /&gt;
Vorsicht: Das Bootloader-Programm kann dabei zerstört werden! Es müssen zusätzlich Fusebits des ATMEGA32 verändert werden. &lt;br /&gt;
&lt;br /&gt;
Dabei kann der Prozessor im schlimmsten Fall nicht mehr ansprechbar sein. Man sollte diesen Umbau und die ISP-Programmierung nur machen, wenn man genau weiß, was man macht!&lt;br /&gt;
&lt;br /&gt;
Eine Kopie des Bootloaders und eine Kurzanleitung zum Einstellen der Fusebits gibt es hier: &lt;br /&gt;
[http://www.arexx.com/rp6/downloads/RP6_M32_BOOTLOADER.zip RP6_M32_BOOTLOADER]&lt;br /&gt;
&lt;br /&gt;
====== JTAG ======&lt;br /&gt;
[[Bild:RP6_M32_JTAG.JPG|thumb|JTAG]]&lt;br /&gt;
Die Programmierung und ein Debuggen sind auch mit der JTAG-Schnittstelle möglich. Das ist nur zu empfehlen, wenn man Erfahrungen mitbringt, oder der Prozessor der M32 durch eine ISP-Falschprogrammierung z.B. nicht mehr ansprechbar ist.&lt;br /&gt;
Um die JTAG-Schnittstelle nutzen zu können, muss der ISP-Umbau durchgeführt worden sein und die dort beschriebene Codierbrücke auf &amp;quot;ISP/DEBUG&amp;quot; gesteckt sein. Der JTAG-Programmer kann dann an die Lötpunkte &amp;quot;JTAG&amp;quot; zwischen ISP- und I/O-Stecker angeschlossen werden.&lt;br /&gt;
&lt;br /&gt;
Man braucht dazu:&lt;br /&gt;
* 2-reihige Stiftleiste RM 2,54mm (z.B. 2x36-polig 742007)&lt;br /&gt;
Man trennt von der 2-reihigen Stiftleiste 2x5 Kontakte ab und lötet sie auf die 10 JTAG-Lötpunkte (SP2 A12: YTDI, YTDO, YTMS, YTCK, YTRST, YVDD3/4, YGND3/4, YNC). Hier kann jetzt der JTAG-Programmer z.B. mit einem 10-poligen Flachkabel-Stecker angeschlossen werden. Um das JTAG-Interface des ATMEGA32 nutzen zu können, müssen Änderungen an den Fusebits vorgenommen werden.&lt;br /&gt;
&lt;br /&gt;
Vorsicht: Man sollte die JTAG-Programmierung und Fusebit-Manipulationen nur machen, wenn man genau weiß, was man macht!&lt;br /&gt;
&lt;br /&gt;
====== USRBUS ======&lt;br /&gt;
Die 14 Kontakte der beiden USRBUS-Stecker sind auf der M32 nirgendwo angeschlossen, sondern können über die Lötpunkte Y1..Y14 mit beliebigen Punkten auf der M32 verbunden werden.&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_M32_USRBUS.JPG|thumb|USRBUS]]&lt;br /&gt;
&lt;br /&gt;
Ich würde auf Y1..Y14 eine Stiftleiste löten, damit die USRBUS-Belegung geändert werden kann.&lt;br /&gt;
&lt;br /&gt;
Man braucht dazu:&lt;br /&gt;
* 2-reihige Stiftleiste RM 2,54mm (z.B. 2x36-polig 742007)&lt;br /&gt;
* Einige Steckbuchsen mit Litze&lt;br /&gt;
&lt;br /&gt;
Man trennt von der 2-reihigen Stiftleiste 2x7 Kontakte ab und lötet sie auf die Punkte Y1..Y14 (SP2 E3: Y1..Y14) neben dem Wannenstecker USRBUS2. Wird die M32 über Flachkabel mit einem USRBUS-Stecker auf einer RP6 Experimentierplatine (EP) und/oder mit dem RP6 selbst verbunden, dann hat man mit allen mit dem USRBUS verbundenen Platinen eine direkte 14-polige Verbindung,- eben den &amp;quot;User Bus&amp;quot;. Den kann man dann nutzen, wie man will. Auf der M32 kann man mit Steckbuchsen die Pins Y1..Y14 mit anderen Pins verbinden.&lt;br /&gt;
&lt;br /&gt;
Beispiel: Verbindet man den Pin &amp;quot;ADC2&amp;quot; mit Y1 des USRBUS, dann steht der Eingang ADC2 auf allen an den USRBUS angeschlossenen Platinen an Y1 zur Verfügung. Man braucht also diesen Eingang nicht über ein eigenes Kabel auf eine EP zu führen, sondern kann dazu den USRBUS nehmen. Dadurch bleibt der Gesamtaufbau auf dem RP6 übersichtlich und komplett trennbar (man braucht nur die Stecker XBUS und USRBUS abzuziehen!).&lt;br /&gt;
&lt;br /&gt;
Wichtig: Man sollte gut dokumentieren, wie man den USRBUS am RP6 (vorn und hinten getrennt!), auf EPs und der M32/M128 benutzt! Sonst kann es bei einer anderen Anordnung von EPs zu USRBUS Konflikten/Kurzschlüssen kommen.&lt;br /&gt;
&lt;br /&gt;
====== Schieberegister kaskadieren ======&lt;br /&gt;
[[Bild:RP6_M32_SPI.JPG|thumb|SPI]]&lt;br /&gt;
Auf der M32 wird ein 8-Bit Schieberegister-Baustein (IC3: 74HC4094D) dazu gebraucht, vier Status-LEDs (LED1..LED4) und ein LCD (am Stecker LCD) anzusteuern. Durch Schieberegister kann man Port-Pins gewinnen, wenn die Pins des Prozessors nicht ausreichen.&lt;br /&gt;
&lt;br /&gt;
Solche Schieberegister kann man &amp;quot;kaskadieren&amp;quot;, d.h. weitere identische Bausteine einbauen, die weitere Port-Pins zur Verfügung stellen. Wenn man zusätzliche 74HC4094 einsetzen will, wird man das am besten auf einer EP aufbauen. Die Anschlüsse für diese Schieberegister werden auf der M32 an einer 6-poligen Reihe von Lötpunkten (beschriftet mit MISO, STR, MOSI, SCK, QS, QS*; SP1 D3: YQS1/2, YMOSI, YSCK, YSTR, YMISO) links von IC3 zur Verfügung gestellt.&lt;br /&gt;
&lt;br /&gt;
Wenn man diese 6 Signalleitungen auf eine EP führen will, gibt es dafür zwei Möglichkeiten:&lt;br /&gt;
* a) Direkte 6-polige Kabelverbindung von den oben beschriebenen Lötpunkten zur EP&lt;br /&gt;
* b) Nutzung des USRBUS, um die 6 Signale zur EP zu führen&lt;br /&gt;
Wenn man im Abschnitt &amp;quot;[[RP6#USRBUS|USRBUS]]&amp;quot; den entsprechenden Umbau gemacht hat, würde ich b) empfehlen! Man könnte dafür eine 6-polige Stiftleiste auf die o.g. Lötpunkte auflöten und 1:1 z.B. mit den Pins Y4, Y6, Y8, Y10, Y12, Y14 des USRBUS verbinden. Dann kann man auf der EP weitere Schieberegister- und SPI-Bausteine (z.B. SPI-EEPROMs, [http://www.pollin.de/shop/dt/MDU5OTgxOTk-/Bausaetze_Module/Module/Funkmodul_RFM12_433_Sende_Empfangsmodul.html RFM12 Transceiver] o.ä.) aufbauen.&lt;br /&gt;
&lt;br /&gt;
Man braucht dazu:&lt;br /&gt;
* 1-reihige Stiftleiste RM 2,54mm (z.B. 36-polig 732478)&lt;br /&gt;
* Steckbuchsen mit Litze&lt;br /&gt;
Man trennt von der 1-reihigen Stiftleiste 6 Kontakte ab und lötet sie auf die beschriebenen sechs Lötpunkte auf der M32. Mit den Steckbuchsen mit Litze wird dann die Verbindung entweder direkt zur EP (Option a) oder über den USRBUS zur EP (Option b) hergestellt.&lt;br /&gt;
&lt;br /&gt;
====== VDD/GND/+UB Anschluß ======&lt;br /&gt;
[[Bild:RP6_M32_VDDGNDUB.JPG|thumb|RP6 M32 VDD GND +UB]]&lt;br /&gt;
VDD, GND und +UB (SP2 C3: YUB1, YGND1/2/5, YVDD1/2) kann man auf der M32 an diesen Lötpunkten abnehmen.&lt;br /&gt;
&lt;br /&gt;
Natürlich kann man hier auch Stiftleisten auflöten.&lt;br /&gt;
&lt;br /&gt;
Auf der anderen Platinenseite (zwischen dem USRBUS1 und ISP Stecker) befinden sich zusätzlich noch 2 weitere Lötpunkte, an denen man VDD und GND kontaktieren kann.&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;
&lt;br /&gt;
====== Serielle Schnittstelle ======&lt;br /&gt;
[[Bild:RP6_M32_RST.JPG|thumb|RP6 M32 RST]]&lt;br /&gt;
Neben dem PROG/UART Stecker befinden sich 5 Lötpunkte mit den Signalen RST, TX, RX, GND, VDD (SP2 BC3: YRX, YTX, YRST, YVDD, YGND). Hier kann z.B. eine 5-polige Stiftleiste aufgelötet werden, um einen Anschluß an die serielle Schnittstelle zu ermöglichen.&lt;br /&gt;
 &lt;br /&gt;
Von diesen 5 Lötpunkten könnte z.B. auch eine Verbindung zum USRBUS hergestellt werden, um die serielle Schnittstelle der M32 auf EPs zu führen.&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;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====== MEM_CS2 ======&lt;br /&gt;
[[Bild:RP6_M32_MEM_CS2.JPG|thumb|RP6 M32 MEM_CS2]]&lt;br /&gt;
MEM_CS2 (M32 Microcontroller Pin PB1) kann man am IC5-Sockel an Pin 1 (SP1 A1: IC5*, Pin 1) kontaktieren. Falls IC5 nicht eingesetzt werden soll, kann man hier durch Einstecken eines Kabels in Pin 1 des IC5-Sockels PB1 nutzen und z.B. zum USRBUS führen.&lt;br /&gt;
&lt;br /&gt;
===== Mess-/Kontaktpunkte =====&lt;br /&gt;
Hier geht es um Kontaktpunkte, an denen man z.B. den Logik-Pegel (High/Low) oder eine analoge Spannung messen kann. Natürlich kann man die Signale auch zur Weiterleitung auf eine EP kontaktieren, dies wird man aber normalerweise nicht brauchen.&lt;br /&gt;
&lt;br /&gt;
====== M-Signal ======&lt;br /&gt;
[[Bild:RP6_M32_M_SIGNAL.JPG|thumb|RP6 M32 M-Signal]]&lt;br /&gt;
An diesem Messpunkt (SP1 E3: YM_SIGNAL) neben D1 kann man die Ausgangsspannung des Mikrofon-Verstärkers IC4 (SP1 E3: IC4) messen oder z.B. mit einem Oszilloskop darstellen.&lt;br /&gt;
&lt;br /&gt;
===== Trennstellen =====&lt;br /&gt;
An diesen Stellen können Leiterbahnen unterbrochen werden, um Funktionen zu deaktivieren oder anders zu nutzen. &lt;br /&gt;
&lt;br /&gt;
====== Getrennte Stromversorgung für ADC2/3 ======&lt;br /&gt;
Wenn man für die analogen Sensoren an ADC2/3 (siehe Abschnitt &amp;quot;Anschlüsse - Analoge Sensoren an ADC2/3&amp;quot; weiter oben!) eine GETRENNTE Stromversorgung vorsehen will und/oder mit Codierbrücke (oder MOSFET) die Stromversorgung abschaltbar machen möchte, muss man erst Vorarbeit leisten.&lt;br /&gt;
[[Bild:RP6_M32_SV.jpg|thumb|RP6 M32 SV]]&lt;br /&gt;
&lt;br /&gt;
Man braucht dazu:&lt;br /&gt;
* 1-reihige Stiftleiste RM 2,54mm (z.B. 36-polig 732478)&lt;br /&gt;
* Evtl.: Eine Codierbrücke (z.B. aus Set 742902)&lt;br /&gt;
* Evtl.: Eine 1-polige Steckbuchse mit Litze zur ext. Stromversorgung&lt;br /&gt;
Es muss eine kurze Leiterbahn zwischen den Punkten &amp;quot;SV1&amp;quot; und &amp;quot;SV2&amp;quot; (SP2 B2: SV1, SV2) aufgetrennt werden. Die Leiterbahn befindet sich auf der Lötseite der Platine und muss mit einem scharfen Messer oder einem speziellen Leiterbahn-Unterbrecher zwischen den beiden Lötpunkten unterbrochen werden. Man sollte anschließend mit einem Widerstandsmeßgerät zwischen SV1 und SV2 nachmessen: Es sollte keine Verbindung mehr bestehen. Jetzt trennt man von der 1-reihigen Stiftleiste 2 Kontakte ab und lötet sie auf die Punkte SV1/SV2.&lt;br /&gt;
&lt;br /&gt;
Man kann hier zunächst eine Codierbrücke aufstecken. Damit versorgt der RP6 Akku die Sensoren mit 5V an den Pins VDD. Möchte man später eine getrennte 5V-Spannung anlegen, zieht man einfach die Codierbrücke ab und speist die externe 5V-Spannung (mit einer 1-poligen Steckbuchse) am Pin SV2 ein. Achtung: An Pin SV1 wird dann nichts angeschlossen!&lt;br /&gt;
&lt;br /&gt;
Anstelle der Codierbrücke kann man natürlich auch einen MOSFET anschließen, um die Sensoren per Software abschalten zu können.&lt;br /&gt;
&lt;br /&gt;
====== Interrupt-Zuordnung ändern ======&lt;br /&gt;
Am XBUS stehen vier Interrupt-Pins (genannt INT1..INT3, INTU) zur Verfügung. INT1 ist auf der RP6 Base mit PA4 verbunden, auf der M32 mit PD2 (Prozessor INT0), auf der M128 mit PE5 (Prozessor INT5) und auf der [[RP6v2#RP6v2_M256_WiFi_Platine|RP6 M256 WiFi]] mit PJ3 (Prozessor PCINT12). Diese Tabelle zeigt die Verbindung aller Interruptleitungen auf den Platinen (RP6 Base, M32, M128, M256 WiFi) über den XBUS:&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |XBUS Pin&lt;br /&gt;
 |XBUS INTx&lt;br /&gt;
 |RP6 Base Pin&lt;br /&gt;
 |RP6 Base INTx&lt;br /&gt;
 |RP6 M32 Pin&lt;br /&gt;
 |RP6 M32 INTx&lt;br /&gt;
 |RP6 M128 Pin&lt;br /&gt;
 |RP6 M128 INTx&lt;br /&gt;
 |RP6 M256 Pin&lt;br /&gt;
 |RP6 M256 INTx&lt;br /&gt;
 |-&lt;br /&gt;
 |8&lt;br /&gt;
 |INT1&lt;br /&gt;
 |PA4&lt;br /&gt;
 |kein&lt;br /&gt;
 |PD2&lt;br /&gt;
 |INT0&lt;br /&gt;
 |PE5&lt;br /&gt;
 |INT5&lt;br /&gt;
 |PJ3&lt;br /&gt;
 |PCINT12&lt;br /&gt;
 |-&lt;br /&gt;
 |11&lt;br /&gt;
 |INT2&lt;br /&gt;
 |n.c.&lt;br /&gt;
 |&lt;br /&gt;
 |PD3 *&lt;br /&gt;
 |INT1&lt;br /&gt;
 |n.c.&lt;br /&gt;
 |&lt;br /&gt;
 |PJ6&lt;br /&gt;
 |PCINT15&lt;br /&gt;
 |-&lt;br /&gt;
 |9&lt;br /&gt;
 |INT3&lt;br /&gt;
 |n.c.&lt;br /&gt;
 |&lt;br /&gt;
 |PB2 *&lt;br /&gt;
 |INT2&lt;br /&gt;
 |PE6&lt;br /&gt;
 |INT6&lt;br /&gt;
 |PJ5&lt;br /&gt;
 |PCINT14&lt;br /&gt;
 |-&lt;br /&gt;
 |7&lt;br /&gt;
 |INTU&lt;br /&gt;
 |n.c.&lt;br /&gt;
 |&lt;br /&gt;
 |n.c.    *&lt;br /&gt;
 |&lt;br /&gt;
 |n.c.&lt;br /&gt;
 |&lt;br /&gt;
 |PJ4&lt;br /&gt;
 |PCINT13&lt;br /&gt;
 |-&lt;br /&gt;
|}&lt;br /&gt;
'''Zu *:''' Standard-Belegung. Ggf. abhängig von der nachfolgend beschriebenen Interrupt-Zuordnung!&lt;br /&gt;
&lt;br /&gt;
Auf der M32 kann man die Interrupt-Zuordnung für INT2, INT3 und INTU durch drei Codierbrücken (beschriftet mit I2-INTU, INT3-I3, I2-INT2; SP2 A3: YINT2/3/U, YI2_1/2, YI3) ändern.&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_M32_INTx.JPG|thumb|INTx]]&lt;br /&gt;
&lt;br /&gt;
Man braucht dazu:&lt;br /&gt;
* 2-reihige Stiftleiste RM 2,54mm (z.B. 2x36-polig 742007)&lt;br /&gt;
* Drei Codierbrücken (z.B. aus Set 742902)&lt;br /&gt;
Vor dem Auflöten der Stiftleiste müssen zwei kurze Leiterbahnen zwischen zwei Lötpunkten aufgetrennt werden, und zwar zwischen den Lötpunkten INT3-I3 und I2-INT2. Die Leiterbahnen müssen mit einem scharfen Messer oder einem speziellen Leiterbahn-Unterbrecher zwischen den beiden Lötpunkten unterbrochen werden. Man sollte anschließend mit einem Widerstandsmeßgerät nachmessen: Es sollte keine Verbindung mehr zwischen INT3-I3 und I2-INT2 bestehen. Man trennt dann von der 2-reihigen Stiftleiste 2x3 Kontakte ab und lötet sie auf das weiß umrahmte Feld mit der o.g. Beschriftung.&lt;br /&gt;
&lt;br /&gt;
Hier kann man auf INT3-I3 und I2-INT2 je eine Codierbrücke aufstecken, wenn man die Standard-Belegung beibehalten will. Steckt man auf I2-INTU eine Codierbrücke, dann ist INTU des XBUS mit Pin PD3 (I2) der M32 verbunden.&lt;br /&gt;
&lt;br /&gt;
'''Hinweis:''' Man kann auf die 6-polige Stiftleiste auch Codierbrücken QUER zur eigentlichen (horizontalen) Richtung aufsetzen. Dadurch kann jede der 3 Interruptleitungen des XBUS (INT2, INT3, INTU) mit jedem der 2 Interrupt Pins der M32 (PD3, PB2) verbunden werden.&lt;br /&gt;
&lt;br /&gt;
Wenn man keine der Codierbrücken aufsteckt, sind die Pins PD3 (I2) und PB2 (I3) des M32-Prozessors nicht mehr mit dem XBUS verbunden und können anders verwendet werden. Auf der M32 kann man dann z.B. auch andere Verbindungen zum XBUS herstellen, indem man auf die Pins INT2, INT3 oder INTU Kabelverbindungen aufsteckt.&lt;br /&gt;
&lt;br /&gt;
====== ADC0 und ADC1 frei nutzen ======&lt;br /&gt;
Auf der M32 ist ADC0 fest mit dem Mikrofon (MIC) und ADC1 mit den Tastern T1..T5 (KEYPAD) verbunden. Wenn man diese ADC-Eingänge für andere Sensoren benötigt, kann man das Mikrofon und die Taster von den Eingängen abtrennen.&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_M32_MIC_KEY.JPG|thumb|MIC_KEYPAD]]&lt;br /&gt;
&lt;br /&gt;
Man braucht dazu:&lt;br /&gt;
* 1-reihige Stiftleiste RM 2,54mm (z.B. 36-polig 732478)&lt;br /&gt;
* Eine Codierbrücke (z.B. aus Set 742902)&lt;br /&gt;
&lt;br /&gt;
MIC/ADC0:&lt;br /&gt;
Es muss eine kurze Leiterbahn zwischen zwei Lötpunkten aufgetrennt werden, die sich zwischen R2 und C19 befinden (SP1 D4: YM1, YM2). Die Leiterbahn muss mit einem scharfen Messer oder einem speziellen Leiterbahn-Unterbrecher zwischen den beiden Lötpunkten unterbrochen werden. Man sollte anschließend mit einem Widerstandsmeßgerät nachmessen: Es sollte keine Verbindung mehr bestehen. Vorsicht: Nicht R2 beschädigen! Damit ist das Mikrofon auf der M32 ohne Funktion und ADC0 kann anders genutzt werden. ADC0 ist dann am oberen Lötpunkt zwischen R2 und C19 verfügbar, dort müßte eine Kabelverbindung angelötet werden.&lt;br /&gt;
Soll das Mikrofon später doch wieder an ADC0 angeschlossen werden, verbindet man die beiden Lötpunkte zwischen R2 und C19 einfach mit etwas Lötzinn oder mit einem SMD Null Ohm Widerstand.&lt;br /&gt;
&lt;br /&gt;
KEYPAD/ADC1:&lt;br /&gt;
Es muss eine kurze Leiterbahn zwischen zwei Lötpunkten aufgetrennt werden, die sich unterhalb von R15 befinden (SP1 D2: YKP1, YKP2). Die Leiterbahn befindet sich auf der Lötseite der Platine und muss mit einem scharfen Messer oder einem speziellen Leiterbahn-Unterbrecher zwischen den beiden Lötpunkten unterbrochen werden. Man sollte anschließend mit einem Widerstandsmeßgerät nachmessen: Es sollte keine Verbindung mehr bestehen. Jetzt trennt man von der 1-reihigen Stiftleiste 2 Kontakte ab und lötet sie auf die beiden Punkte unterhalb von R15. Hier kann man jetzt eine Codierbrücke aufstecken, wenn man die Taster weiter benutzen will. Wenn die Brücke abgezogen ist, sind die Taster ohne Funktion und ADC1 kann anders genutzt werden. ADC1 ist dann am linken Pin der 2-poligen Stiftleiste unterhalb von R15 verfügbar.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== RP6 CCPRO M128 Platine===&lt;br /&gt;
&lt;br /&gt;
[[Bild:CCPRO M128 k-1-.jpg|Das CCPRO M128]]&lt;br /&gt;
&lt;br /&gt;
====Technische Daten====&lt;br /&gt;
{|  {{Blauetabelle}} &lt;br /&gt;
|'''Mikrocontroller:'''&lt;br /&gt;
|Steckplatz für ein C-Control PRO MEGA128 Modul mit einem ([https://www.conrad.de/de/p/c-control-prozessor-unit-mega-128-pro-198219.html] ATMEGA128)&lt;br /&gt;
|-&lt;br /&gt;
|'''Speicher:'''&lt;br /&gt;
|128 kB [[Flash]]-Speicher, davon 4 kB bereits vom Bootloader belegt&amp;lt;br/&amp;gt;&lt;br /&gt;
4 kB SRAM intern&amp;lt;br/&amp;gt; &lt;br /&gt;
64 kB SRAM extern&amp;lt;br/&amp;gt;&lt;br /&gt;
4 kB [[EEPROM]]&lt;br /&gt;
|-&lt;br /&gt;
|'''Programmierung:'''&lt;br /&gt;
|Über CCPRO-IDE&lt;br /&gt;
|-&lt;br /&gt;
|'''Vorhandene Sensoren:'''&lt;br /&gt;
|1 12bit I²C Temperatursensor &amp;lt;br/&amp;gt;&lt;br /&gt;
19 I/O-Ports, davon 8 ADCs, 3 PWM (Servos) und 2 I/Os für eine weitere serielle Schnittstelle (UART)&lt;br /&gt;
|-&lt;br /&gt;
|'''Vorhandene Aktoren:'''&lt;br /&gt;
|1 Beeper&amp;lt;br/&amp;gt;&lt;br /&gt;
5 Status-LEDs&amp;lt;br/&amp;gt;&lt;br /&gt;
1 LC-Display-Port&amp;lt;br/&amp;gt;&lt;br /&gt;
1 Sockel für ein I²C-Bus EEPROM vom Typ 24(L)Cxxx&lt;br /&gt;
|-&lt;br /&gt;
|'''Abmessungen:'''&lt;br /&gt;
|(L &amp;amp;times; B &amp;amp;times; H) 112 &amp;amp;times; 90 &amp;amp;times; 21 mm&lt;br /&gt;
|-&lt;br /&gt;
|'''Ausführung:'''&lt;br /&gt;
|Fertig aufgebautes Erweiterungsmodul&lt;br /&gt;
|-&lt;br /&gt;
|'''Stromversorgung:'''&lt;br /&gt;
|6 AA NiMH Akkus (über die RP6 Base)&lt;br /&gt;
|-&lt;br /&gt;
|'''Hersteller:'''&lt;br /&gt;
|Arexx Niederlande&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Umbauoptionen====&lt;br /&gt;
Auf der CCPRO M128 ([http://www.conrad.de/ce/de/product/191563/Arexx-RP6-CC-PRO-MEGA128-Erweiterungssatz 191563]) kann leider nicht so viel umgebaut werden:&lt;br /&gt;
&lt;br /&gt;
* I2C-EEPROM&lt;br /&gt;
* Freie Nutzung von PORTA* und PORTC*&lt;br /&gt;
* USRBUS&lt;br /&gt;
* A16-/PD4-Nutzung&lt;br /&gt;
&lt;br /&gt;
Im Text gibt es Verweise auf den Schaltplan der CCPRO M128 (RP6_CCPRO_M128_Schematic.PDF) in der Form: (SP2 B1: Bauteil).  Dies bedeutet, dass man das Bauteil auf Blatt 2 des M128-Schaltplans im Feld B1 finden kann.&lt;br /&gt;
&lt;br /&gt;
Bei den Materialangaben ist öfter die Rede von &amp;quot;Steckbuchsen mit Litze&amp;quot;. Diese Steckbuchsen mit angelöteter Litze können auf die ein- oder zweireihigen Stiftleisten aufgesteckt werden. Leider gibt es sie nicht (mehr) fertig konfektioniert bei CONRAD. Die einreihigen Steckbuchsen (RM 2,54mm) kann man aber z.B. bei [http://www.elv.de/output/controller.aspx ELV] bekommen: 2-polig (68-016635), 3-polig (68-022503) und 5-polig (68-023073). An sie muss man dann noch Litzen in der entsprechenden Länge selbst anlöten.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=====I2C-EEPROM=====&lt;br /&gt;
Zum Einsetzen eines I2C-EEPROMS (IC6; SP2 C1: IC6) braucht man nichts umzubauen. Man kauft einfach ein passendes EEPROM des Typs 24(L)Cxxxx-P und setzt es auf seinen Sockel, Kerbe zum oberen Platinenrand.&lt;br /&gt;
&lt;br /&gt;
Mögliche Typen (erhältlich z.B. bei [http://www.digikey.de/ Digi-Key] oder bei [http://www.reichelt.de./ Reichelt]):&lt;br /&gt;
* AT24C128  (AT24C128-10PU-2.7-ND)&lt;br /&gt;
* AT24C256  (AT24C256-10PU-2.7-ND)&lt;br /&gt;
* AT24C512  (AT24C512-10PU-2.7-ND)&lt;br /&gt;
* AT24C1024 (AT24C1024-10PI-2.7-ND)&lt;br /&gt;
&lt;br /&gt;
=====Anschlüsse=====&lt;br /&gt;
Hier wird aufgelistet, wo man auf der M128 Platine Anschlüsse nutzen kann, um sie z.B. zu weiteren Sensoren, zum USRBUS oder (weniger empfehlenswert!) direkt zu EPs, zur RP6 Base oder zur M32 zu führen. &lt;br /&gt;
&lt;br /&gt;
======Freie Nutzung von PORTA* und PORTC*======&lt;br /&gt;
Um PORTA* und PORTC* frei nutzen zu können (für weitere I/O-Ports), muss man auf das externe SRAM verzichten, was nicht sehr ratsam ist. Mehr I/O-Ports kann man alternativ durch I/O Expander gewinnen. Falls man das SRAM trotzdem deaktivieren will, hier die Anleitung.&lt;br /&gt;
&lt;br /&gt;
Für den Umbau braucht man:&lt;br /&gt;
* Wannenstecker 2x5-polig gerade RM 2,54mm (z.B. [http://www.reichelt.de./ Reichelt] WSL 10G)&lt;br /&gt;
* 1-reihige Stiftleiste RM 2,54mm (z.B. 36-polig 732478)&lt;br /&gt;
* Eine Codierbrücke (z.B. aus Set 742902)&lt;br /&gt;
[[Bild:RP6_M128_PortA.JPG|thumb|PORTA*]]&lt;br /&gt;
&lt;br /&gt;
Für die Bestückung von PORTA* (SP2 AB2: Stecker PORTA*) lötet man den Wannenstecker hier (siehe Abb. PORTA*) auf.&lt;br /&gt;
[[Bild:RP6_M128_PortC.JPG|thumb|PORTC*]]&lt;br /&gt;
&lt;br /&gt;
Für die Bestückung von PORTC* (SP1 A2: PC0..7, YGND1) trennt man von der 1-reihigen Stiftleiste 9 Kontakte ab und lötet sie auf die PORTC*-Lötpunkte (siehe Abb. PORTC*).&lt;br /&gt;
&lt;br /&gt;
Dann muss noch der SRAM-Enable Jumper (SP1 EF1: Y27..29) bestückt werden:&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_M128_EN_SRAM.JPG|EN_SRAM]]&lt;br /&gt;
&lt;br /&gt;
Man trennt von der 1-reihigen Stiftleiste 3 Kontakte ab und lötet sie auf die abgebildeten Lötpunkte. Vorher muss eine Leiterbahn auf der Lötseite der Platine zwischen den ENABLE-Lötpunkten aufgetrennt werden.&lt;br /&gt;
Wenn das SRAM wie bisher genutzt werden soll, steckt man die Codierbrücke auf die Stellung &amp;quot;ENABLE&amp;quot;. Will man stattdessen Port A und Port C frei nutzen (und damit auf SRAM verzichten!), kommt die Codierbrücke auf &amp;quot;DISABLE&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
======USRBUS======&lt;br /&gt;
Auf die 14 Kontakte neben dem Wannenstecker USRBUS2 ist noch nichts gelötet.&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_M128_USRBUS.JPG|thumb|USRBUS]]&lt;br /&gt;
&lt;br /&gt;
Ich würde auf Y1..Y14 eine Stiftleiste löten, damit die USRBUS-Belegung geändert werden kann.&lt;br /&gt;
&lt;br /&gt;
Man braucht dazu:&lt;br /&gt;
* 2-reihige Stiftleiste RM 2,54mm (z.B. 2x36-polig 742007)&lt;br /&gt;
* Einige Steckbuchsen mit Litze&lt;br /&gt;
&lt;br /&gt;
Man trennt von der 2-reihigen Stiftleiste 2x7 Kontakte ab und lötet sie auf die Punkte Y1..Y14 (SP2 E234: Y1..Y14) neben dem Wannenstecker USRBUS2. Wird die M128 über Flachkabel mit einem USRBUS-Stecker auf einer RP6 Experimentierplatine (EP) und/oder mit dem RP6 selbst verbunden, dann hat man mit allen mit dem USRBUS verbundenen Platinen eine direkte 14-polige Verbindung,- eben den &amp;quot;User Bus&amp;quot;. Den kann man dann nutzen, wie man will. Auf der M128 kann man mit Steckbuchsen die Pins Y1..Y14 mit anderen Pins verbinden.&lt;br /&gt;
&lt;br /&gt;
Beispiel: Verbindet man den Pin &amp;quot;ADC4&amp;quot; mit Y1 des USRBUS, dann steht der Eingang ADC4 auf allen an den USRBUS angeschlossenen Platinen an Y1 zur Verfügung. Man braucht also diesen Eingang nicht über ein eigenes Kabel auf eine EP zu führen, sondern kann dazu den USRBUS nehmen. Dadurch bleibt der Gesamtaufbau auf dem RP6 übersichtlich und komplett trennbar (man braucht nur die Stecker XBUS und USRBUS abzuziehen!).&lt;br /&gt;
&lt;br /&gt;
Wichtig: Man sollte gut dokumentieren, wie man den USRBUS am RP6 (vorn und hinten getrennt!), auf EPs und der M128 benutzt! Sonst kann es bei einer anderen Anordnung von EPs zu USRBUS Konflikten/Kurzschlüssen kommen.&lt;br /&gt;
&lt;br /&gt;
======IC5 ALERT======&lt;br /&gt;
[[Bild:RP6_M128_IC5_ALERT.JPG|thumb|IC5 ALERT]]&lt;br /&gt;
Dieser Lötpunkt (SP2 C2: AL) neben IC5 ist der Anschluß ALERT (Pin 3) des I2C-Temperatursensors TCN75A (SP2 C2: IC5).&lt;br /&gt;
&lt;br /&gt;
Dies ist ein Open-Drain Ausgang, der ein Alarm-Signal ausgibt, wenn die Temperatur die eingestellten Grenzen über-/unterschreitet (siehe auch Datenblatt des Sensors (TCN75A.pdf), Abschnitt 5.3.4!). Wenn man ALERT auf einen Eingang des Microcontrollers führen will, muß man auch noch einen Pullup-Widerstand vorsehen oder den internen Pullup des uC-Eingangs aktivieren.&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;
======VDD/GND Anschluß======&lt;br /&gt;
[[Bild:RP6_M128_VDDGND.JPG|thumb|VDD GND]]&lt;br /&gt;
Auf der CCPRO M128 gibt es 2 Lötpunkte (SP1 E34: YVDD3, YGND4) zwischen R5 und C7 bzw. direkt neben der Codierbrücke (SP1 E3: YL9, YL10) zum Deaktivieren von LED5.&lt;br /&gt;
&lt;br /&gt;
Hier könnte man VDD und GND kontaktieren. VDD ist der Lötpunkt, der näher an R5 liegt.&lt;br /&gt;
&lt;br /&gt;
=====Trennstellen=====&lt;br /&gt;
An diesen Stellen können Leiterbahnen unterbrochen werden, um Funktionen zu deaktivieren oder anders zu nutzen. &lt;br /&gt;
&lt;br /&gt;
======A16-/PD4-Nutzung======&lt;br /&gt;
&lt;br /&gt;
[[Bild:v2RP6_M128_A16.JPG|thumb|A16/PD4]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Auf der CCPRO M128 gibt es ein 3-poliges Feld von Lötpunkten (SP2 AB1: PD4, A16, GND) unter dem CCPRO MEGA128 Modul (IC1). Standardmässig ist A16 des SRAM (IC3) hier auf GND gelegt. Damit kann man PD4 des Prozessors (ICP1) frei nutzen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Will man A16 des SRAM mit PD4 schaltbar machen, muss man eine Leiterbahn auf der Bestückungsseite zwischen den oberen zwei der drei Lötpunkte auftrennen und die anderen (unteren) beiden Lötpunkte mit etwas Lötzinn oder einem SMD Null Ohm Widerstand verbinden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der Sinn dieses Umbaus besteht darin, dass man danach anstelle von 64kB nun die vollen 128kB SRAM des IC3 adressieren kann. Man muss dann aber PD4 selbst schalten, da C-Control PRO ab Version 1.50 nur 64kB ext. SRAM ansteuern kann. Immerhin könnte man dann 2 Blöcke à je 64kB nutzen und mit PD4 zwischen beiden Blöcken umschalten.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ob CCPRO damit klar kommt: Wohl kaum! Ich würde daher diesen Umbau nicht durchführen.&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Zubehör und Ersatzteile ==&lt;br /&gt;
Von [http://www.conrad.de/ce/ CONRAD] gibt es z.B. &lt;br /&gt;
&lt;br /&gt;
* das LC- ([http://www.conrad.de/ce/de/product/190911/LC-DISPLAY-16-X-2-KONFEKTIONIERT 190911] AUSVERKAUFT!) oder Backlight-Display ([http://www.conrad.de/ce/de/product/191621/DISPLAY-RP5RP6-BLAU-MIT-BACKLIGHT 191621] AUSVERKAUFT!), welche an die M32, an die CCPRO M128 und an die M256 WiFi angeschlossen werden können,&lt;br /&gt;
* einen IR-Ball ([http://www.conrad.de/ce/de/product/191437/INFRAROT-BALL-FUeR-ROBOTER-FUssBALL 191437] AUSVERKAUFT!),&lt;br /&gt;
* einen Graustufen-Boden-Sensor ([http://www.conrad.de/ce/de/product/191599/GRAUSTUFEN-BODEN-SENSOR-FUeR-FUssBALLROBOT 191599] AUSVERKAUFT!),&lt;br /&gt;
* eine IR-Fernbedienung Promo 8 ([http://www.conrad.de/ce/de/product/340720/PROMO-8-UNIVERSALFERNBEDIENUNG 340720] AUSVERKAUFT!) oder Vivanco UR 89 ([http://www.conrad.de/ce/de/product/351013/VivancoUR-89-Fernbedienung-8-Geraete 351013] AUSVERKAUFT!),&lt;br /&gt;
* Ersatzräder ([http://www.conrad.de/ce/de/product/191307/ANTRIEBSRAD-RP5RP6 191307] AUSVERKAUFT!),&lt;br /&gt;
* Ersatzzahnräder ([http://www.conrad.de/ce/de/product/191346/SCHRAeG-ZAHNRAeDERSATZ-RP5RP6 191346]) und&lt;br /&gt;
* Ersatzraupen ([http://www.conrad.de/ce/de/product/191333/RAUPENSATZ-RP5RP6 191333] AUSVERKAUFT!).&lt;br /&gt;
&lt;br /&gt;
===Displays===&lt;br /&gt;
Die vorkonfektionierten Displays kann man zum Ausgeben von Texten, Sensordaten und kleinen Animationen benutzen. Sie können an die M32, an die CCPRO M128 und an die M256 WiFi angeschlossen werden.&lt;br /&gt;
&lt;br /&gt;
Diese 16x2 Zeichen Displays sind bisher lieferbar:&lt;br /&gt;
&lt;br /&gt;
* LC-Display ([http://www.conrad.de/ce/de/product/190911/LC-DISPLAY-16-X-2-KONFEKTIONIERT 190911])&lt;br /&gt;
* OLED-Display (197622)&lt;br /&gt;
* Backlight-Display AREXX RP-DSP88 ([http://www.conrad.de/ce/de/product/191621/DISPLAY-RP5RP6-BLAU-MIT-BACKLIGHT 191621])&lt;br /&gt;
&lt;br /&gt;
Das LCD ist seit September 2018 bei CONRAD ausverkauft; zeitweise (2007/08) gab es unter dieser Bestellnummer eine Version, die zu klein (66 x 37mm) war, um sie auf der M32, der CCPRO M128 oder der M256 WiFi zu montieren.&lt;br /&gt;
&lt;br /&gt;
Das OLED-Display ist aktuell (April 2012) nicht mehr lieferbar.&lt;br /&gt;
&lt;br /&gt;
Das zuletzt ausschließlich nur noch erhältliche blaufarbige Backlight-Display ist seit Mai 2020 bei CONRAD ausverkauft.&lt;br /&gt;
&lt;br /&gt;
Diese Displays können mit 4 M3-Abstandbolzen 25 mm ([http://www.conrad.de/ce/de/product/526665/Abstandsbolzen1-x-Aussengewinde1-x-InnengewindeMessing-vernickelt-Schluesselweite-55-mm Bestell-Nr. 526665]) und 4 Muttern M3 ([http://www.conrad.de/ce/de/product/815624/TOOLCRAFT-Sechskant-Muttern-DIN-934-934-Stahl-verzinkt-M3-100-St z.B. aus 815624]), sowie 4 Schrauben M3 ([http://www.conrad.de/ce/de/product/815322/TOOLCRAFT-Linsenkopfschrauben-mit-Kreuzschlitz-DIN-7985-7985-6-mm-Stahl-verzinkt-Guete-48-M3-100-St z.B. aus 815322]) auf der M32, der CCPRO M128 oder der M256 WiFi befestigt werden. Leider sind die Befestigungslöcher der Displays zu klein für ein M3-Gewinde, so dass man die Löcher sehr vorsichtig auf 3..3,2 mm erweitern muss.&lt;br /&gt;
&lt;br /&gt;
===IR-Ball===&lt;br /&gt;
Den IR-Ball (AREXX IRB-35, AUSVERKAUFT!) kann man benutzen, um mit dem RP6 Fußball oder Ähnliches zu spielen. Der Ball kann dann von den IR-Sensoren des RP6 erkannt und geortet werden.&lt;br /&gt;
&lt;br /&gt;
===Graustufen-Boden-Sensor===&lt;br /&gt;
Der Graustufen-Boden-Sensor (AREXX ARX-GS7) dient zur Orientierung eines Roboters auf einem Fußballfeld, das in bestimmten Grauabstufungen eingefärbt ist (CONRAD 191404  AUSVERKAUFT!). Dieser Fußballfeld-Aufkleber (AREXX ARX-FF008) ist bei CONRAD und bei [http://www.elv.de ELV] (Artikel-Nummer 68-101831) ausverkauft.&lt;br /&gt;
&lt;br /&gt;
===IR-Fernbedienung===&lt;br /&gt;
[[Bild:RP6_RC.jpg|thumb|2 RC5 Fernbedienungen]]&lt;br /&gt;
Mit einer Universal-IR-Fernbedienung, die den RC5-IR-Code senden kann, kann der RP6 wie ein ferngesteuertes &amp;quot;Auto&amp;quot; verwendet werden. Im Beispielprogramm &amp;quot;Example_08_TV_REMOTE&amp;quot; im Ordner der RP6-Base-Demos wird das noch genauer erläutert.&lt;br /&gt;
&lt;br /&gt;
===Ersatzräder===&lt;br /&gt;
Die Ersatzräder dienen als Ersatzteile für den RP6, RP6v2 und das RP5/RP6-Fahrgestell.&lt;br /&gt;
&lt;br /&gt;
===Ersatzzahnräder===&lt;br /&gt;
Die Ersatzzahnräder dienen als Ersatzteile für den RP6, RP6v2 und das RP5/RP6-Fahrgestell.&lt;br /&gt;
&lt;br /&gt;
===Ersatzraupen===&lt;br /&gt;
Die Ersatzraupen dienen als Ersatzteile für den RP6, RP6v2 und das RP5/RP6-Fahrgestell.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Programmierung==&lt;br /&gt;
Um diesen Grundlagenartikel zum RP6 nicht immer länger werden zu lassen, habe ich den Teil zur Programmierung des [[RP6_-_Programmierung#RP6_Base_und_CONTROL_M32|RP6]] und seiner Erweiterungsplatinen [[RP6_-_Programmierung#RP6_Base_und_CONTROL_M32|RP6 CONTROL M32]] und [[RP6_-_Programmierung#RP6_CCPRO_M128|RP6 CCPRO M128]] ausgelagert: [[RP6 - Programmierung]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==RP6v2==&lt;br /&gt;
Der neue [http://www.conrad.de/ce/de/product/191584/RP6-V2-ROBOTERSYSTEM RP6v2] ist weitgehend identisch mit dem RP6, so dass fast alle Angaben dieses Artikels auch für den RP6v2 zutreffen.&lt;br /&gt;
Für vom RP6 abweichende Details des RP6v2 und für dessen zukünftige Erweiterungsplatinen (z.B. das aktuell [http://www.arexx.com/forum/viewtopic.php?f=19&amp;amp;t=1797 hier] angekündigte Erweiterung-Modul [[RP6v2#RP6v2_M256_WiFi_Platine|RP6v2 M256 WiFi]]) gibt es einen eigenen Grundlagenartikel: [[RP6v2]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==RP6 Sensor Board und Xtra Module==&lt;br /&gt;
Einen eigenen Artikel gibt es auch für das [[RP6_Sensor_Board_und_Xtra_Module#RP6_Sensor_Board_2|RP6 Sensor Board]] und für die [[RP6_Sensor_Board_und_Xtra_Module#RP6_Xtra_Module_2|Xtra Module]]: [[RP6_Sensor_Board_und_Xtra_Module|RP6 Sensor Board und Xtra Module]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Erfahrungsberichte==&lt;br /&gt;
&lt;br /&gt;
...in Arbeit...(kann aber gerne ergänzt werden)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Siehe auch==&lt;br /&gt;
* [[RP6 - Programmierung]]&lt;br /&gt;
* [[RP6v2]]&lt;br /&gt;
* [[RP6_Sensor_Board_und_Xtra_Module]]&lt;br /&gt;
* [[RP6_Kamera_-_Mitmach-Projekt]]&lt;br /&gt;
* [[RP6v2_I2C-Portexpander]]&lt;br /&gt;
* [[RP6v2 USB-RS232-Adapter]]&lt;br /&gt;
* [[RP6v2 Orientierung]]&lt;br /&gt;
* [[RP6 Multi IO Projekt]]&lt;br /&gt;
* [[RP6 Multi IO Projekt - Software]]&lt;br /&gt;
* [[RP6 ArduIO]]&lt;br /&gt;
* [[RP6 ArduIO - Software]]&lt;br /&gt;
* [[Induktive_Ladestation_f%C3%BCr_den_RP6|Induktive Ladestation für den RP6]]&lt;br /&gt;
* [[IR-bake_f%C3%BCr_den_RP6|IR-bake für den RP6]]&lt;br /&gt;
* [[CCRP5]]&lt;br /&gt;
* [[Wild Thumper]]&lt;br /&gt;
* [[Wild Thumper - Programmierung]]&lt;br /&gt;
* [[Yeti]]&lt;br /&gt;
* [[Asuro]]&lt;br /&gt;
* [[C't-Bot]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Weblinks==&lt;br /&gt;
'''Siehe auch die Weblinks im [http://www.rn-wissen.de/index.php/RP6v2#Weblinks RP6v2 Artikel]!'''&lt;br /&gt;
&lt;br /&gt;
* [http://www.pcwelt.de/start/gaming_fun/gadgets/news/84558/ PC-Welt-Artikel]&lt;br /&gt;
&lt;br /&gt;
* Ankündigung des RP6 und der RP6 CONTROL M32 im [http://www.arexx.com/forum/viewtopic.php?t=370 AREXX Support Forum]&lt;br /&gt;
* Ankündigung der RP6 CCPRO M128 im [http://www.arexx.com/forum/viewtopic.php?f=19&amp;amp;t=834&amp;amp;start=0 AREXX Support Forum] und im [http://www.roboternetz.de/community/threads/42228-RP6-C-Control-PRO-MEGA128-Erweiterungsmodul-Website-online RoboterNETZ]&lt;br /&gt;
* Ankündigung des RP6v2 im [http://www.roboternetz.de/community/threads/56964-NEWS-RP6v2-die-neue-Version-2-des-RP6-Robot-Systems RoboterNETZ] und im [http://www.arexx.com/forum/viewtopic.php?f=19&amp;amp;t=1778 AREXX Support Forum]&lt;br /&gt;
* Ankündigung der RP6v2 M256 WiFi im [http://www.arexx.com/forum/viewtopic.php?f=19&amp;amp;t=1797 AREXX Support Forum]&lt;br /&gt;
* [http://www.arexx.com/rp6 AREXX RP6 Startseite]&lt;br /&gt;
* [http://www.arexx.com/forum/viewforum.php?f=19 AREXX Support Forum]&lt;br /&gt;
* [http://www.arexx.com/rp6/html/de/soft_doc_ccpro.htm AREXX CCPRO M128 Seite]&lt;br /&gt;
&lt;br /&gt;
* [http://www.conrad.de/ce/de/product/191524/RP6-ROBOTERSYSTEM RP6 bei CONRAD]&lt;br /&gt;
* [http://www.conrad.de/ce/de/product/191584/RP6-V2-ROBOTERSYSTEM RP6v2 bei CONRAD]&lt;br /&gt;
* [http://www.conrad.de/ce/de/product/191550/RP6-MEGA32-ERWEITERUNGSSATZ RP6 CONTROL M32 bei CONRAD]&lt;br /&gt;
* [http://www.conrad.de/ce/de/product/191563/RP6-CC-PRO-MEGA128-ERWEITERUNGSSATZ RP6 CCPRO M128 bei CONRAD]&lt;br /&gt;
* [http://www.c-control.de/c-control-pro/c-control-pro/startseite_c-control-pro.html C-Control PRO Startseite]&lt;br /&gt;
* [http://ccpro.cc2net.de/forum/ C-Control PRO Forum]&lt;br /&gt;
&lt;br /&gt;
* [http://www.roboternetz.de/phpBB2/viewforum.php?f=49 Roboternetz RP6 Forum]&lt;br /&gt;
* &amp;quot;Geburt&amp;quot; des Wiki im RN-Forum: [http://www.roboternetz.de/community/threads/32793-RP6-Wiki-Artikel RP6-Wiki-Artikel]&lt;br /&gt;
* Henkessoft: [http://www.henkessoft.de/Roboter/rp6.htm RP6]&lt;br /&gt;
* PIC-PROJEKTE Wiki: [http://pic-projekte.de/wiki/index.php?title=RP6  RP6]&lt;br /&gt;
* benhup.com: [http://www.benhup.com/?mf=eduntech&amp;amp;sf=rp6 Arexx RP6 Robot (with ATmega32 chip)]&lt;br /&gt;
* RP6 &amp;quot;Panzer&amp;quot;: [http://www.roboternetz.de/community/threads/57171-mein-(Heng-Long)-RP6 Heng-Long-RP6]&lt;br /&gt;
&lt;br /&gt;
* [http://www.youtube.com/results?search_query=rp6 RP6 Videos]&lt;br /&gt;
* [http://de-de.facebook.com/pages/Robby-RP6/155118711202285 facebook]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Robotikeinstieg]]	 &lt;br /&gt;
[[Kategorie:Praxis]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Autoren==&lt;br /&gt;
--[http://www.roboternetz.de/community/members/24729-sloti sloti] 22:23, 29. Dez 2007 (CET)&lt;br /&gt;
&lt;br /&gt;
--[http://www.roboternetz.de/community/members/44891-Tobias1 Tobias1] 18:30, 6. Apr 2010 (CET)&lt;br /&gt;
&lt;br /&gt;
--[http://www.roboternetz.de/community/members/1972-Dirk Dirk] 12:51, 23. Okt 2020 (CET)&lt;/div&gt;</summary>
		<author><name>Dirk NO2</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Oszilloskop_-_Tutorial&amp;diff=24939</id>
		<title>Oszilloskop - Tutorial</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Oszilloskop_-_Tutorial&amp;diff=24939"/>
				<updated>2014-07-18T16:29:59Z</updated>
		
		<summary type="html">&lt;p&gt;Dirk NO2: /* Test-Messung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[bild:Voltcraft 630-2.JPG|right|500px]]&lt;br /&gt;
&lt;br /&gt;
=Allgemein=&lt;br /&gt;
Ein Oszilloskop-Tutorial gehört auch hier im RN-Wissen zu den [[Wunschthemen|Wunsch-Artikeln]]. Es gibt im Netz zwar auch schon gute Tutorials, aber hier soll versucht werden, möglichst einfach an das Thema heran zu gehen. Ich werde mich hauptsächlich mit dem analogen Oszilloskop am Beispiel des [http://www.conrad.de/ce/de/product/122421/VOLTCRAFT-VC-630-2-Analoges-2-Kanal-Oszilloskop-Bandbreite-0-DC-bis-30-MHz Voltcraft 630-2] beschäftigen. Die Bedienelemente dieses Oszilloskops werden sich ähnlich auch bei allen anderen Typen finden.&lt;br /&gt;
&lt;br /&gt;
Ich würde mir wünschen, dass jemand den Abschnitt zum [[Oszilloskop_-_Tutorial#Digital_Oszilloskop|digitalen Oszilloskop]] übernimmt.&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Analog Oszilloskop==&lt;br /&gt;
===Prinzip===&lt;br /&gt;
&lt;br /&gt;
[[bild:Voltcraft 630-2 Schematic.PNG|640px]]&lt;br /&gt;
&lt;br /&gt;
===Bedienelemente===&lt;br /&gt;
[[bild:Voltcraft 630-2 Front.PNG|640px]]&lt;br /&gt;
&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |Nummer&lt;br /&gt;
 |Bezeichnung&lt;br /&gt;
 |Funktion&lt;br /&gt;
 |-&lt;br /&gt;
 |1&lt;br /&gt;
 |CAL&lt;br /&gt;
 |Kalibrierspannung&lt;br /&gt;
 |-&lt;br /&gt;
 |2&lt;br /&gt;
 |INTEN&lt;br /&gt;
 |Helligkeit des Elektronenstrahls&lt;br /&gt;
 |-&lt;br /&gt;
 |3&lt;br /&gt;
 |FOCUS&lt;br /&gt;
 |Fokussierung auf das schärfste Bild&lt;br /&gt;
 |-&lt;br /&gt;
 |4&lt;br /&gt;
 |TRACE ROTATION&lt;br /&gt;
 |Abstimmung der horizontalen Spur mit den Rasterlinien&lt;br /&gt;
 |-&lt;br /&gt;
 |5&lt;br /&gt;
 |LED&lt;br /&gt;
 |Power Anzeige&lt;br /&gt;
 |-&lt;br /&gt;
 |6&lt;br /&gt;
 |POWER&lt;br /&gt;
 |Hauptschalter&lt;br /&gt;
 |-&lt;br /&gt;
 |7&lt;br /&gt;
 |CH1 VOLTS/DIV&lt;br /&gt;
 |CH1 Vertikalachsen-Empfindlichkeit&lt;br /&gt;
 |-&lt;br /&gt;
 |8&lt;br /&gt;
 |CH1 (X)&lt;br /&gt;
 |Vertikaler Eingang für CH1 und X-Achse im X-Y-Betrieb&lt;br /&gt;
 |-&lt;br /&gt;
 |9&lt;br /&gt;
 |CH1 VARIABLE CH1&lt;br /&gt;
 |CH1 Empfindlichkeit Feineinstellung&lt;br /&gt;
 |-&lt;br /&gt;
 |10&lt;br /&gt;
 |CH1 AC-GND-DC&lt;br /&gt;
 |CH1 Vertikalverstärker-Kopplung&lt;br /&gt;
 |-&lt;br /&gt;
 |11&lt;br /&gt;
 |CH1 ^ v POSITION&lt;br /&gt;
 |CH1 Vertikale Positionierung&lt;br /&gt;
 |-&lt;br /&gt;
 |12&lt;br /&gt;
 |ALT/CHOP&lt;br /&gt;
 |Anzeigeart im Zweikanal-Modus&lt;br /&gt;
 |-&lt;br /&gt;
 |13&lt;br /&gt;
 |CH1 DC BAL&lt;br /&gt;
 |CH1 Dämpferabgleich&lt;br /&gt;
 |-&lt;br /&gt;
 |14&lt;br /&gt;
 |VERT MODE&lt;br /&gt;
 |Auswahl der Betriebsart&lt;br /&gt;
 |-&lt;br /&gt;
 |15&lt;br /&gt;
 |GND&lt;br /&gt;
 |Masseanschluss des Gehäuses&lt;br /&gt;
 |-&lt;br /&gt;
 |16&lt;br /&gt;
 |CH2 INV&lt;br /&gt;
 |Eingangssignal von CH2 wird invertiert&lt;br /&gt;
 |-&lt;br /&gt;
 |17&lt;br /&gt;
 |CH2 DC BAL&lt;br /&gt;
 |CH2 Dämpferabgleich&lt;br /&gt;
 |-&lt;br /&gt;
 |18&lt;br /&gt;
 |CH2 AC-GND-DC&lt;br /&gt;
 |CH2 Vertikalverstärker-Kopplung&lt;br /&gt;
 |-&lt;br /&gt;
 |19&lt;br /&gt;
 |CH2 ^ v POSITION&lt;br /&gt;
 |CH2 Vertikale Positionierung&lt;br /&gt;
 |-&lt;br /&gt;
 |20&lt;br /&gt;
 |CH2 (Y)&lt;br /&gt;
 |Vertikaler Eingang für CH2 und Y-Achse im X-Y-Betrieb&lt;br /&gt;
 |-&lt;br /&gt;
 |21&lt;br /&gt;
 |CH2 VARIABLE&lt;br /&gt;
 |CH2 Empfindlichkeit Feineinstellung&lt;br /&gt;
 |-&lt;br /&gt;
 |22&lt;br /&gt;
 |CH2 VOLTS/DIV&lt;br /&gt;
 |CH2 Vertikalachsen-Empfindlichkeit&lt;br /&gt;
 |-&lt;br /&gt;
 |23&lt;br /&gt;
 |SOURCE&lt;br /&gt;
 |Auswahl des externen oder internen Triggersignals&lt;br /&gt;
 |-&lt;br /&gt;
 |24&lt;br /&gt;
 |EXT TRIG IN&lt;br /&gt;
 |Eingangsbuchse für externes Triggersignal&lt;br /&gt;
 |-&lt;br /&gt;
 |25&lt;br /&gt;
 |TRIGGER MODE&lt;br /&gt;
 |Auswahl des Triggermodus&lt;br /&gt;
 |-&lt;br /&gt;
 |26&lt;br /&gt;
 |SLOPE&lt;br /&gt;
 |Auswahl der Triggerflanke&lt;br /&gt;
 |-&lt;br /&gt;
 |27&lt;br /&gt;
 |TRIG.ALT&lt;br /&gt;
 |Internes Triggersignal alterniert zwischen CH1 und CH2&lt;br /&gt;
 |-&lt;br /&gt;
 |28&lt;br /&gt;
 |LEVEL&lt;br /&gt;
 |Bestimmung des Startpunktes für die Wellenform&lt;br /&gt;
 |-&lt;br /&gt;
 |29&lt;br /&gt;
 |TIME/DIV&lt;br /&gt;
 |Wahl der Ablenkzeiten&lt;br /&gt;
 |-&lt;br /&gt;
 |30&lt;br /&gt;
 |SWP.VAR&lt;br /&gt;
 |Feineinstellung der Ablenkzeit&lt;br /&gt;
 |-&lt;br /&gt;
 |31&lt;br /&gt;
 |x10 MAG&lt;br /&gt;
 |Vergrößerung um den Faktor 10&lt;br /&gt;
 |-&lt;br /&gt;
 |32&lt;br /&gt;
 |&amp;lt; &amp;gt; POSITION &lt;br /&gt;
 |Einstellung der horizontalen Position&lt;br /&gt;
 |-&lt;br /&gt;
 |33&lt;br /&gt;
 |FILTER&lt;br /&gt;
 |Filter zum einfachen Ablesen der Wellenformen&lt;br /&gt;
 |-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[bild:Voltcraft 630-2 Rear.PNG|640px]]&lt;br /&gt;
&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |Nummer&lt;br /&gt;
 |Bezeichnung&lt;br /&gt;
 |Funktion&lt;br /&gt;
 |-&lt;br /&gt;
 |34&lt;br /&gt;
 |Z AXIS INPUT&lt;br /&gt;
 |Eingangsbuchse für externes Intensitätsmodulationssignal&lt;br /&gt;
 |-&lt;br /&gt;
 |35&lt;br /&gt;
 |CH1 SIGNAL OUTPUT&lt;br /&gt;
 |CH1 Ausgangssignal für Frequenzmesser&lt;br /&gt;
 |-&lt;br /&gt;
 |36&lt;br /&gt;
 |&lt;br /&gt;
 |Ständer&lt;br /&gt;
 |-&lt;br /&gt;
 |37&lt;br /&gt;
 |&lt;br /&gt;
 |SICHERUNG &amp;amp; Netzspannungswahlschalter&lt;br /&gt;
 |-&lt;br /&gt;
 |38&lt;br /&gt;
 |&lt;br /&gt;
 |AC Eingangsbuchse&lt;br /&gt;
 |-&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
===Grundeinstellungen===&lt;br /&gt;
Wenn man neue Messungen beginnen will, sollte man das Oszilloskop vor dem Einschalten in die Grundeinstellung bringen.&lt;br /&gt;
&lt;br /&gt;
====Einkanal-Betrieb====&lt;br /&gt;
&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |Nummer&lt;br /&gt;
 |Bezeichnung&lt;br /&gt;
 |Einstellung&lt;br /&gt;
 |-&lt;br /&gt;
 |2&lt;br /&gt;
 |INTEN&lt;br /&gt;
 |Mittelstellung&lt;br /&gt;
 |-&lt;br /&gt;
 |3&lt;br /&gt;
 |FOCUS&lt;br /&gt;
 |Mittelstellung&lt;br /&gt;
 |-&lt;br /&gt;
 |7&lt;br /&gt;
 |CH1 VOLTS/DIV&lt;br /&gt;
 |0.5V/DIV&lt;br /&gt;
 |-&lt;br /&gt;
 |9&lt;br /&gt;
 |CH1 VARIABLE&lt;br /&gt;
 |CAL (Position im Uhrzeigersinn)&lt;br /&gt;
 |-&lt;br /&gt;
 |10&lt;br /&gt;
 |CH1 AC-GND-DC&lt;br /&gt;
 |GND&lt;br /&gt;
 |-&lt;br /&gt;
 |11&lt;br /&gt;
 |CH1 ^ v POSITION&lt;br /&gt;
 |Mittelstellung&lt;br /&gt;
 |-&lt;br /&gt;
 |14&lt;br /&gt;
 |VERT MODE&lt;br /&gt;
 |CH1&lt;br /&gt;
 |-&lt;br /&gt;
 |16&lt;br /&gt;
 |CH2 INV&lt;br /&gt;
 |OFF&lt;br /&gt;
 |-&lt;br /&gt;
 |18&lt;br /&gt;
 |CH2 AC-GND-DC&lt;br /&gt;
 |GND&lt;br /&gt;
 |-&lt;br /&gt;
 |19&lt;br /&gt;
 |CH2 ^ v POSITION&lt;br /&gt;
 |Mittelstellung&lt;br /&gt;
 |-&lt;br /&gt;
 |21&lt;br /&gt;
 |CH2 VARIABLE&lt;br /&gt;
 |CAL (Position im Uhrzeigersinn)&lt;br /&gt;
 |-&lt;br /&gt;
 |22&lt;br /&gt;
 |CH2 VOLTS/DIV&lt;br /&gt;
 |0.5V/DIV&lt;br /&gt;
 |-&lt;br /&gt;
 |23&lt;br /&gt;
 |SOURCE&lt;br /&gt;
 |CH1&lt;br /&gt;
 |-&lt;br /&gt;
 |25&lt;br /&gt;
 |TRIGGER MODE&lt;br /&gt;
 |AUTO&lt;br /&gt;
 |-&lt;br /&gt;
 |26&lt;br /&gt;
 |SLOPE&lt;br /&gt;
 | + &lt;br /&gt;
 |-&lt;br /&gt;
 |27&lt;br /&gt;
 |TRIG.ALT&lt;br /&gt;
 |OFF&lt;br /&gt;
 |-&lt;br /&gt;
 |29&lt;br /&gt;
 |TIME/DIV&lt;br /&gt;
 |0.5ms/DIV&lt;br /&gt;
 |-&lt;br /&gt;
 |30&lt;br /&gt;
 |SWP.VAR&lt;br /&gt;
 |CAL&lt;br /&gt;
 |-&lt;br /&gt;
 |31&lt;br /&gt;
 |x10 MAG&lt;br /&gt;
 |OFF&lt;br /&gt;
 |-&lt;br /&gt;
 |32&lt;br /&gt;
 |&amp;lt; &amp;gt; POSITION &lt;br /&gt;
 |Mittelstellung&lt;br /&gt;
 |-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Zweikanal-Betrieb====&lt;br /&gt;
Für den Zweikanal-Betrieb wählt man zunächst alle Einstellungen des [[Oszilloskop_-_Tutorial#Einkanal-Betrieb|Einkanal-Betriebs]].&lt;br /&gt;
&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |Nummer&lt;br /&gt;
 |Bezeichnung&lt;br /&gt;
 |Einstellung&lt;br /&gt;
 |-&lt;br /&gt;
 |14&lt;br /&gt;
 |VERT MODE&lt;br /&gt;
 |DUAL&lt;br /&gt;
 |-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Inbetriebnahme===&lt;br /&gt;
====Power====&lt;br /&gt;
Wenn der Netzspannungswahlschalter (37) einmalig auf die richtige Netzspannung (AC 115V oder 230V) und die Grundeinstellung für den Einkanal- oder Zweikanal-Betrieb eingestellt wurde, kann das Oszilloskop mit dem Hauptschalter (6) eingeschaltet werden. Die POWER LED (5) leuchtet auf.&lt;br /&gt;
&lt;br /&gt;
====Strahlabgleich====&lt;br /&gt;
Nach dem [[Oszilloskop_-_Tutorial#Power|Einschalten]] des Oszilloskops in der Grundstellung &amp;quot;[[Oszilloskop_-_Tutorial#Einkanal-Betrieb|Einkanal-Betrieb]]&amp;quot; sollte nach höchstens 20 Sekunden die horizontale Strahllinie auf dem Bildschirm erscheinen. Ist dies nicht der Fall, dann zunächst den INTEN Helligkeits-Regler (2) weiter nach rechts drehen bis die Linie erscheint. Gut eingestellt ist die '''Helligkeit''', wenn die Linie deutlich zu erkennen aber nicht überstrahlt ist.&lt;br /&gt;
&lt;br /&gt;
Sieht die Strahllinie nicht scharf begrenzt aus, kann man die '''Schärfe''' noch mit dem FOCUS Regler (3) optimal einstellen. Dies ist der Fall, wenn die Linie möglichst dünn aussieht.&lt;br /&gt;
&lt;br /&gt;
Nun sollte die Strahllinie noch richtig ausgerichtet werden:&lt;br /&gt;
* '''Vertikale Lage:''' Die Strahllinie mit dem CH1 ^v POSITION Regler (11) mit der mittleren horizontalen Rasterlinie in Deckung bringen.&lt;br /&gt;
* '''Horizontale Lage:''' Die Strahllinie mit dem &amp;lt;&amp;gt; POSITION Regler (32) so in die Mitte des Bildschirms legen, dass das Strahlende rechts und links nicht mehr sichtbar ist.&lt;br /&gt;
* '''Rotation:''' Wenn der Strahl nicht parallel zur mittleren horizontalen Rasterlinie verläuft, sondern sie in einem Winkel kreuzt, dann muss die Strahl-Rotation noch eingestellt werden. Mit einem kleinen Schlitz-Schraubendreher stellt man die Rotation vorsichtig am Regler TRACE ROTATION (4) ein. Diese Einstellung muss man i.d.R. nur einmalig vornehmen und nicht bei jeder Inbetriebnahme. Anschließend muss man die vertikale Lage ggf. noch einmal korrigieren.&lt;br /&gt;
&lt;br /&gt;
====Test-Messung====&lt;br /&gt;
Der mitgelieferte '''Oszilloskop-Tastkopf''' wird nun an die CH1 Eingangsbuchse (8) angeschlossen. Verfügt der Tastkopf über einen kleinen Schiebeschalter beschriftet mit &amp;quot;1&amp;quot; und &amp;quot;10&amp;quot;, dann wird dieser Schiebeschalter in seine Grundstellung &amp;quot;1&amp;quot; gebracht. Die Messspitze wird dann an den Kalibrierausgang CAL (1) angeklemmt.&lt;br /&gt;
&lt;br /&gt;
Wenn die Grundstellung richtig vorgenommen wurde, darf sich zunächst am Bildschirm nichts verändern, d.h. die Strahllinie ist unverändert in der Mitte zu sehen.&lt;br /&gt;
&lt;br /&gt;
Grund: Die CH1 Eingangsbuchse (8) ist noch vom Oszilloskop abgekoppelt und der Eingang des (internen) CH1 Verstärkers liegt an GND. Erst wenn man den CH1 Eingangswahlschalter (10) aus der Grundstellung &amp;quot;GND&amp;quot; nach oben in die Stellung &amp;quot;AC&amp;quot; schiebt, verändert sich die Bildschirm-Ausgabe: Es ist das Rechteck-Signal des Kalibrierausgangs CAL (1) zu sehen.&lt;br /&gt;
&lt;br /&gt;
'''Die CH1 &amp;amp; CH2 Eingangswahlschalter (10, 18) sind also sehr wichtig! In der Stellung &amp;quot;GND&amp;quot; ist das Oszilloskop gut geschützt. Man sollte den/die Eingangswahlschalter nur zum eigentlichen Messbetrieb in die Stellung &amp;quot;AC&amp;quot; oder &amp;quot;DC&amp;quot; bringen und sonst in der Grundstellung &amp;quot;GND&amp;quot; lassen.''' &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Digital Oszilloskop==&lt;br /&gt;
Wer möchte diesen Abschnitt übernehmen?&lt;br /&gt;
&lt;br /&gt;
===Prinzip===&lt;br /&gt;
===Bedienelemente===&lt;br /&gt;
===Grundeinstellungen===&lt;br /&gt;
====Einkanal-Betrieb====&lt;br /&gt;
====Zweikanal-Betrieb====&lt;br /&gt;
===Inbetriebnahme===&lt;br /&gt;
====Power====&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Grundlagen]]	 &lt;br /&gt;
[[Kategorie:Praxis]]&lt;br /&gt;
[[Kategorie:Elektronik]]&lt;br /&gt;
&lt;br /&gt;
=Autoren=&lt;br /&gt;
--[[Benutzer:Dirk|Dirk]] 21:04, 15. Jul 2014 (CET)&lt;/div&gt;</summary>
		<author><name>Dirk NO2</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Oszilloskop_-_Tutorial&amp;diff=24938</id>
		<title>Oszilloskop - Tutorial</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Oszilloskop_-_Tutorial&amp;diff=24938"/>
				<updated>2014-07-18T16:22:50Z</updated>
		
		<summary type="html">&lt;p&gt;Dirk NO2: /* Test-Messung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[bild:Voltcraft 630-2.JPG|right|500px]]&lt;br /&gt;
&lt;br /&gt;
=Allgemein=&lt;br /&gt;
Ein Oszilloskop-Tutorial gehört auch hier im RN-Wissen zu den [[Wunschthemen|Wunsch-Artikeln]]. Es gibt im Netz zwar auch schon gute Tutorials, aber hier soll versucht werden, möglichst einfach an das Thema heran zu gehen. Ich werde mich hauptsächlich mit dem analogen Oszilloskop am Beispiel des [http://www.conrad.de/ce/de/product/122421/VOLTCRAFT-VC-630-2-Analoges-2-Kanal-Oszilloskop-Bandbreite-0-DC-bis-30-MHz Voltcraft 630-2] beschäftigen. Die Bedienelemente dieses Oszilloskops werden sich ähnlich auch bei allen anderen Typen finden.&lt;br /&gt;
&lt;br /&gt;
Ich würde mir wünschen, dass jemand den Abschnitt zum [[Oszilloskop_-_Tutorial#Digital_Oszilloskop|digitalen Oszilloskop]] übernimmt.&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Analog Oszilloskop==&lt;br /&gt;
===Prinzip===&lt;br /&gt;
&lt;br /&gt;
[[bild:Voltcraft 630-2 Schematic.PNG|640px]]&lt;br /&gt;
&lt;br /&gt;
===Bedienelemente===&lt;br /&gt;
[[bild:Voltcraft 630-2 Front.PNG|640px]]&lt;br /&gt;
&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |Nummer&lt;br /&gt;
 |Bezeichnung&lt;br /&gt;
 |Funktion&lt;br /&gt;
 |-&lt;br /&gt;
 |1&lt;br /&gt;
 |CAL&lt;br /&gt;
 |Kalibrierspannung&lt;br /&gt;
 |-&lt;br /&gt;
 |2&lt;br /&gt;
 |INTEN&lt;br /&gt;
 |Helligkeit des Elektronenstrahls&lt;br /&gt;
 |-&lt;br /&gt;
 |3&lt;br /&gt;
 |FOCUS&lt;br /&gt;
 |Fokussierung auf das schärfste Bild&lt;br /&gt;
 |-&lt;br /&gt;
 |4&lt;br /&gt;
 |TRACE ROTATION&lt;br /&gt;
 |Abstimmung der horizontalen Spur mit den Rasterlinien&lt;br /&gt;
 |-&lt;br /&gt;
 |5&lt;br /&gt;
 |LED&lt;br /&gt;
 |Power Anzeige&lt;br /&gt;
 |-&lt;br /&gt;
 |6&lt;br /&gt;
 |POWER&lt;br /&gt;
 |Hauptschalter&lt;br /&gt;
 |-&lt;br /&gt;
 |7&lt;br /&gt;
 |CH1 VOLTS/DIV&lt;br /&gt;
 |CH1 Vertikalachsen-Empfindlichkeit&lt;br /&gt;
 |-&lt;br /&gt;
 |8&lt;br /&gt;
 |CH1 (X)&lt;br /&gt;
 |Vertikaler Eingang für CH1 und X-Achse im X-Y-Betrieb&lt;br /&gt;
 |-&lt;br /&gt;
 |9&lt;br /&gt;
 |CH1 VARIABLE CH1&lt;br /&gt;
 |CH1 Empfindlichkeit Feineinstellung&lt;br /&gt;
 |-&lt;br /&gt;
 |10&lt;br /&gt;
 |CH1 AC-GND-DC&lt;br /&gt;
 |CH1 Vertikalverstärker-Kopplung&lt;br /&gt;
 |-&lt;br /&gt;
 |11&lt;br /&gt;
 |CH1 ^ v POSITION&lt;br /&gt;
 |CH1 Vertikale Positionierung&lt;br /&gt;
 |-&lt;br /&gt;
 |12&lt;br /&gt;
 |ALT/CHOP&lt;br /&gt;
 |Anzeigeart im Zweikanal-Modus&lt;br /&gt;
 |-&lt;br /&gt;
 |13&lt;br /&gt;
 |CH1 DC BAL&lt;br /&gt;
 |CH1 Dämpferabgleich&lt;br /&gt;
 |-&lt;br /&gt;
 |14&lt;br /&gt;
 |VERT MODE&lt;br /&gt;
 |Auswahl der Betriebsart&lt;br /&gt;
 |-&lt;br /&gt;
 |15&lt;br /&gt;
 |GND&lt;br /&gt;
 |Masseanschluss des Gehäuses&lt;br /&gt;
 |-&lt;br /&gt;
 |16&lt;br /&gt;
 |CH2 INV&lt;br /&gt;
 |Eingangssignal von CH2 wird invertiert&lt;br /&gt;
 |-&lt;br /&gt;
 |17&lt;br /&gt;
 |CH2 DC BAL&lt;br /&gt;
 |CH2 Dämpferabgleich&lt;br /&gt;
 |-&lt;br /&gt;
 |18&lt;br /&gt;
 |CH2 AC-GND-DC&lt;br /&gt;
 |CH2 Vertikalverstärker-Kopplung&lt;br /&gt;
 |-&lt;br /&gt;
 |19&lt;br /&gt;
 |CH2 ^ v POSITION&lt;br /&gt;
 |CH2 Vertikale Positionierung&lt;br /&gt;
 |-&lt;br /&gt;
 |20&lt;br /&gt;
 |CH2 (Y)&lt;br /&gt;
 |Vertikaler Eingang für CH2 und Y-Achse im X-Y-Betrieb&lt;br /&gt;
 |-&lt;br /&gt;
 |21&lt;br /&gt;
 |CH2 VARIABLE&lt;br /&gt;
 |CH2 Empfindlichkeit Feineinstellung&lt;br /&gt;
 |-&lt;br /&gt;
 |22&lt;br /&gt;
 |CH2 VOLTS/DIV&lt;br /&gt;
 |CH2 Vertikalachsen-Empfindlichkeit&lt;br /&gt;
 |-&lt;br /&gt;
 |23&lt;br /&gt;
 |SOURCE&lt;br /&gt;
 |Auswahl des externen oder internen Triggersignals&lt;br /&gt;
 |-&lt;br /&gt;
 |24&lt;br /&gt;
 |EXT TRIG IN&lt;br /&gt;
 |Eingangsbuchse für externes Triggersignal&lt;br /&gt;
 |-&lt;br /&gt;
 |25&lt;br /&gt;
 |TRIGGER MODE&lt;br /&gt;
 |Auswahl des Triggermodus&lt;br /&gt;
 |-&lt;br /&gt;
 |26&lt;br /&gt;
 |SLOPE&lt;br /&gt;
 |Auswahl der Triggerflanke&lt;br /&gt;
 |-&lt;br /&gt;
 |27&lt;br /&gt;
 |TRIG.ALT&lt;br /&gt;
 |Internes Triggersignal alterniert zwischen CH1 und CH2&lt;br /&gt;
 |-&lt;br /&gt;
 |28&lt;br /&gt;
 |LEVEL&lt;br /&gt;
 |Bestimmung des Startpunktes für die Wellenform&lt;br /&gt;
 |-&lt;br /&gt;
 |29&lt;br /&gt;
 |TIME/DIV&lt;br /&gt;
 |Wahl der Ablenkzeiten&lt;br /&gt;
 |-&lt;br /&gt;
 |30&lt;br /&gt;
 |SWP.VAR&lt;br /&gt;
 |Feineinstellung der Ablenkzeit&lt;br /&gt;
 |-&lt;br /&gt;
 |31&lt;br /&gt;
 |x10 MAG&lt;br /&gt;
 |Vergrößerung um den Faktor 10&lt;br /&gt;
 |-&lt;br /&gt;
 |32&lt;br /&gt;
 |&amp;lt; &amp;gt; POSITION &lt;br /&gt;
 |Einstellung der horizontalen Position&lt;br /&gt;
 |-&lt;br /&gt;
 |33&lt;br /&gt;
 |FILTER&lt;br /&gt;
 |Filter zum einfachen Ablesen der Wellenformen&lt;br /&gt;
 |-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[bild:Voltcraft 630-2 Rear.PNG|640px]]&lt;br /&gt;
&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |Nummer&lt;br /&gt;
 |Bezeichnung&lt;br /&gt;
 |Funktion&lt;br /&gt;
 |-&lt;br /&gt;
 |34&lt;br /&gt;
 |Z AXIS INPUT&lt;br /&gt;
 |Eingangsbuchse für externes Intensitätsmodulationssignal&lt;br /&gt;
 |-&lt;br /&gt;
 |35&lt;br /&gt;
 |CH1 SIGNAL OUTPUT&lt;br /&gt;
 |CH1 Ausgangssignal für Frequenzmesser&lt;br /&gt;
 |-&lt;br /&gt;
 |36&lt;br /&gt;
 |&lt;br /&gt;
 |Ständer&lt;br /&gt;
 |-&lt;br /&gt;
 |37&lt;br /&gt;
 |&lt;br /&gt;
 |SICHERUNG &amp;amp; Netzspannungswahlschalter&lt;br /&gt;
 |-&lt;br /&gt;
 |38&lt;br /&gt;
 |&lt;br /&gt;
 |AC Eingangsbuchse&lt;br /&gt;
 |-&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
===Grundeinstellungen===&lt;br /&gt;
Wenn man neue Messungen beginnen will, sollte man das Oszilloskop vor dem Einschalten in die Grundeinstellung bringen.&lt;br /&gt;
&lt;br /&gt;
====Einkanal-Betrieb====&lt;br /&gt;
&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |Nummer&lt;br /&gt;
 |Bezeichnung&lt;br /&gt;
 |Einstellung&lt;br /&gt;
 |-&lt;br /&gt;
 |2&lt;br /&gt;
 |INTEN&lt;br /&gt;
 |Mittelstellung&lt;br /&gt;
 |-&lt;br /&gt;
 |3&lt;br /&gt;
 |FOCUS&lt;br /&gt;
 |Mittelstellung&lt;br /&gt;
 |-&lt;br /&gt;
 |7&lt;br /&gt;
 |CH1 VOLTS/DIV&lt;br /&gt;
 |0.5V/DIV&lt;br /&gt;
 |-&lt;br /&gt;
 |9&lt;br /&gt;
 |CH1 VARIABLE&lt;br /&gt;
 |CAL (Position im Uhrzeigersinn)&lt;br /&gt;
 |-&lt;br /&gt;
 |10&lt;br /&gt;
 |CH1 AC-GND-DC&lt;br /&gt;
 |GND&lt;br /&gt;
 |-&lt;br /&gt;
 |11&lt;br /&gt;
 |CH1 ^ v POSITION&lt;br /&gt;
 |Mittelstellung&lt;br /&gt;
 |-&lt;br /&gt;
 |14&lt;br /&gt;
 |VERT MODE&lt;br /&gt;
 |CH1&lt;br /&gt;
 |-&lt;br /&gt;
 |16&lt;br /&gt;
 |CH2 INV&lt;br /&gt;
 |OFF&lt;br /&gt;
 |-&lt;br /&gt;
 |18&lt;br /&gt;
 |CH2 AC-GND-DC&lt;br /&gt;
 |GND&lt;br /&gt;
 |-&lt;br /&gt;
 |19&lt;br /&gt;
 |CH2 ^ v POSITION&lt;br /&gt;
 |Mittelstellung&lt;br /&gt;
 |-&lt;br /&gt;
 |21&lt;br /&gt;
 |CH2 VARIABLE&lt;br /&gt;
 |CAL (Position im Uhrzeigersinn)&lt;br /&gt;
 |-&lt;br /&gt;
 |22&lt;br /&gt;
 |CH2 VOLTS/DIV&lt;br /&gt;
 |0.5V/DIV&lt;br /&gt;
 |-&lt;br /&gt;
 |23&lt;br /&gt;
 |SOURCE&lt;br /&gt;
 |CH1&lt;br /&gt;
 |-&lt;br /&gt;
 |25&lt;br /&gt;
 |TRIGGER MODE&lt;br /&gt;
 |AUTO&lt;br /&gt;
 |-&lt;br /&gt;
 |26&lt;br /&gt;
 |SLOPE&lt;br /&gt;
 | + &lt;br /&gt;
 |-&lt;br /&gt;
 |27&lt;br /&gt;
 |TRIG.ALT&lt;br /&gt;
 |OFF&lt;br /&gt;
 |-&lt;br /&gt;
 |29&lt;br /&gt;
 |TIME/DIV&lt;br /&gt;
 |0.5ms/DIV&lt;br /&gt;
 |-&lt;br /&gt;
 |30&lt;br /&gt;
 |SWP.VAR&lt;br /&gt;
 |CAL&lt;br /&gt;
 |-&lt;br /&gt;
 |31&lt;br /&gt;
 |x10 MAG&lt;br /&gt;
 |OFF&lt;br /&gt;
 |-&lt;br /&gt;
 |32&lt;br /&gt;
 |&amp;lt; &amp;gt; POSITION &lt;br /&gt;
 |Mittelstellung&lt;br /&gt;
 |-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Zweikanal-Betrieb====&lt;br /&gt;
Für den Zweikanal-Betrieb wählt man zunächst alle Einstellungen des [[Oszilloskop_-_Tutorial#Einkanal-Betrieb|Einkanal-Betriebs]].&lt;br /&gt;
&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |Nummer&lt;br /&gt;
 |Bezeichnung&lt;br /&gt;
 |Einstellung&lt;br /&gt;
 |-&lt;br /&gt;
 |14&lt;br /&gt;
 |VERT MODE&lt;br /&gt;
 |DUAL&lt;br /&gt;
 |-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Inbetriebnahme===&lt;br /&gt;
====Power====&lt;br /&gt;
Wenn der Netzspannungswahlschalter (37) einmalig auf die richtige Netzspannung (AC 115V oder 230V) und die Grundeinstellung für den Einkanal- oder Zweikanal-Betrieb eingestellt wurde, kann das Oszilloskop mit dem Hauptschalter (6) eingeschaltet werden. Die POWER LED (5) leuchtet auf.&lt;br /&gt;
&lt;br /&gt;
====Strahlabgleich====&lt;br /&gt;
Nach dem [[Oszilloskop_-_Tutorial#Power|Einschalten]] des Oszilloskops in der Grundstellung &amp;quot;[[Oszilloskop_-_Tutorial#Einkanal-Betrieb|Einkanal-Betrieb]]&amp;quot; sollte nach höchstens 20 Sekunden die horizontale Strahllinie auf dem Bildschirm erscheinen. Ist dies nicht der Fall, dann zunächst den INTEN Helligkeits-Regler (2) weiter nach rechts drehen bis die Linie erscheint. Gut eingestellt ist die '''Helligkeit''', wenn die Linie deutlich zu erkennen aber nicht überstrahlt ist.&lt;br /&gt;
&lt;br /&gt;
Sieht die Strahllinie nicht scharf begrenzt aus, kann man die '''Schärfe''' noch mit dem FOCUS Regler (3) optimal einstellen. Dies ist der Fall, wenn die Linie möglichst dünn aussieht.&lt;br /&gt;
&lt;br /&gt;
Nun sollte die Strahllinie noch richtig ausgerichtet werden:&lt;br /&gt;
* '''Vertikale Lage:''' Die Strahllinie mit dem CH1 ^v POSITION Regler (11) mit der mittleren horizontalen Rasterlinie in Deckung bringen.&lt;br /&gt;
* '''Horizontale Lage:''' Die Strahllinie mit dem &amp;lt;&amp;gt; POSITION Regler (32) so in die Mitte des Bildschirms legen, dass das Strahlende rechts und links nicht mehr sichtbar ist.&lt;br /&gt;
* '''Rotation:''' Wenn der Strahl nicht parallel zur mittleren horizontalen Rasterlinie verläuft, sondern sie in einem Winkel kreuzt, dann muss die Strahl-Rotation noch eingestellt werden. Mit einem kleinen Schlitz-Schraubendreher stellt man die Rotation vorsichtig am Regler TRACE ROTATION (4) ein. Diese Einstellung muss man i.d.R. nur einmalig vornehmen und nicht bei jeder Inbetriebnahme. Anschließend muss man die vertikale Lage ggf. noch einmal korrigieren.&lt;br /&gt;
&lt;br /&gt;
====Test-Messung====&lt;br /&gt;
Der mitgelieferte '''Oszilloskop-Tastkopf''' wird nun an die CH1 Eingangsbuchse (8) angeschlossen und die Messspitze an den Kalibrierausgang CAL (1) angeklemmt.&lt;br /&gt;
&lt;br /&gt;
Wenn die Grundstellung richtig vorgenommen wurde, darf sich zunächst am Bildschirm nichts verändern, d.h. die Strahllinie ist unverändert in der Mitte zu sehen.&lt;br /&gt;
&lt;br /&gt;
Grund: Die CH1 Eingangsbuchse (8) ist noch vom Oszilloskop abgekoppelt und der Eingang des (internen) CH1 Verstärkers liegt an GND. Erst wenn man den CH1 Eingangswahlschalter (10) aus der Grundstellung &amp;quot;GND&amp;quot; nach oben in die Stellung &amp;quot;AC&amp;quot; schiebt, verändert sich die Bildschirm-Ausgabe: Es ist das Rechteck-Signal des Kalibrierausgangs CAL (1) zu sehen.&lt;br /&gt;
&lt;br /&gt;
'''Die CH1 &amp;amp; CH2 Eingangswahlschalter (10, 18) sind also sehr wichtig! In der Stellung &amp;quot;GND&amp;quot; ist das Oszilloskop gut geschützt. Man sollte den/die Eingangswahlschalter nur zum eigentlichen Messbetrieb in die Stellung &amp;quot;AC&amp;quot; oder &amp;quot;DC&amp;quot; bringen und sonst in der Grundstellung &amp;quot;GND&amp;quot; lassen.''' &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Digital Oszilloskop==&lt;br /&gt;
Wer möchte diesen Abschnitt übernehmen?&lt;br /&gt;
&lt;br /&gt;
===Prinzip===&lt;br /&gt;
===Bedienelemente===&lt;br /&gt;
===Grundeinstellungen===&lt;br /&gt;
====Einkanal-Betrieb====&lt;br /&gt;
====Zweikanal-Betrieb====&lt;br /&gt;
===Inbetriebnahme===&lt;br /&gt;
====Power====&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Grundlagen]]	 &lt;br /&gt;
[[Kategorie:Praxis]]&lt;br /&gt;
[[Kategorie:Elektronik]]&lt;br /&gt;
&lt;br /&gt;
=Autoren=&lt;br /&gt;
--[[Benutzer:Dirk|Dirk]] 21:04, 15. Jul 2014 (CET)&lt;/div&gt;</summary>
		<author><name>Dirk NO2</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Oszilloskop_-_Tutorial&amp;diff=24937</id>
		<title>Oszilloskop - Tutorial</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Oszilloskop_-_Tutorial&amp;diff=24937"/>
				<updated>2014-07-18T16:21:44Z</updated>
		
		<summary type="html">&lt;p&gt;Dirk NO2: /* Test-Messung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[bild:Voltcraft 630-2.JPG|right|500px]]&lt;br /&gt;
&lt;br /&gt;
=Allgemein=&lt;br /&gt;
Ein Oszilloskop-Tutorial gehört auch hier im RN-Wissen zu den [[Wunschthemen|Wunsch-Artikeln]]. Es gibt im Netz zwar auch schon gute Tutorials, aber hier soll versucht werden, möglichst einfach an das Thema heran zu gehen. Ich werde mich hauptsächlich mit dem analogen Oszilloskop am Beispiel des [http://www.conrad.de/ce/de/product/122421/VOLTCRAFT-VC-630-2-Analoges-2-Kanal-Oszilloskop-Bandbreite-0-DC-bis-30-MHz Voltcraft 630-2] beschäftigen. Die Bedienelemente dieses Oszilloskops werden sich ähnlich auch bei allen anderen Typen finden.&lt;br /&gt;
&lt;br /&gt;
Ich würde mir wünschen, dass jemand den Abschnitt zum [[Oszilloskop_-_Tutorial#Digital_Oszilloskop|digitalen Oszilloskop]] übernimmt.&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Analog Oszilloskop==&lt;br /&gt;
===Prinzip===&lt;br /&gt;
&lt;br /&gt;
[[bild:Voltcraft 630-2 Schematic.PNG|640px]]&lt;br /&gt;
&lt;br /&gt;
===Bedienelemente===&lt;br /&gt;
[[bild:Voltcraft 630-2 Front.PNG|640px]]&lt;br /&gt;
&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |Nummer&lt;br /&gt;
 |Bezeichnung&lt;br /&gt;
 |Funktion&lt;br /&gt;
 |-&lt;br /&gt;
 |1&lt;br /&gt;
 |CAL&lt;br /&gt;
 |Kalibrierspannung&lt;br /&gt;
 |-&lt;br /&gt;
 |2&lt;br /&gt;
 |INTEN&lt;br /&gt;
 |Helligkeit des Elektronenstrahls&lt;br /&gt;
 |-&lt;br /&gt;
 |3&lt;br /&gt;
 |FOCUS&lt;br /&gt;
 |Fokussierung auf das schärfste Bild&lt;br /&gt;
 |-&lt;br /&gt;
 |4&lt;br /&gt;
 |TRACE ROTATION&lt;br /&gt;
 |Abstimmung der horizontalen Spur mit den Rasterlinien&lt;br /&gt;
 |-&lt;br /&gt;
 |5&lt;br /&gt;
 |LED&lt;br /&gt;
 |Power Anzeige&lt;br /&gt;
 |-&lt;br /&gt;
 |6&lt;br /&gt;
 |POWER&lt;br /&gt;
 |Hauptschalter&lt;br /&gt;
 |-&lt;br /&gt;
 |7&lt;br /&gt;
 |CH1 VOLTS/DIV&lt;br /&gt;
 |CH1 Vertikalachsen-Empfindlichkeit&lt;br /&gt;
 |-&lt;br /&gt;
 |8&lt;br /&gt;
 |CH1 (X)&lt;br /&gt;
 |Vertikaler Eingang für CH1 und X-Achse im X-Y-Betrieb&lt;br /&gt;
 |-&lt;br /&gt;
 |9&lt;br /&gt;
 |CH1 VARIABLE CH1&lt;br /&gt;
 |CH1 Empfindlichkeit Feineinstellung&lt;br /&gt;
 |-&lt;br /&gt;
 |10&lt;br /&gt;
 |CH1 AC-GND-DC&lt;br /&gt;
 |CH1 Vertikalverstärker-Kopplung&lt;br /&gt;
 |-&lt;br /&gt;
 |11&lt;br /&gt;
 |CH1 ^ v POSITION&lt;br /&gt;
 |CH1 Vertikale Positionierung&lt;br /&gt;
 |-&lt;br /&gt;
 |12&lt;br /&gt;
 |ALT/CHOP&lt;br /&gt;
 |Anzeigeart im Zweikanal-Modus&lt;br /&gt;
 |-&lt;br /&gt;
 |13&lt;br /&gt;
 |CH1 DC BAL&lt;br /&gt;
 |CH1 Dämpferabgleich&lt;br /&gt;
 |-&lt;br /&gt;
 |14&lt;br /&gt;
 |VERT MODE&lt;br /&gt;
 |Auswahl der Betriebsart&lt;br /&gt;
 |-&lt;br /&gt;
 |15&lt;br /&gt;
 |GND&lt;br /&gt;
 |Masseanschluss des Gehäuses&lt;br /&gt;
 |-&lt;br /&gt;
 |16&lt;br /&gt;
 |CH2 INV&lt;br /&gt;
 |Eingangssignal von CH2 wird invertiert&lt;br /&gt;
 |-&lt;br /&gt;
 |17&lt;br /&gt;
 |CH2 DC BAL&lt;br /&gt;
 |CH2 Dämpferabgleich&lt;br /&gt;
 |-&lt;br /&gt;
 |18&lt;br /&gt;
 |CH2 AC-GND-DC&lt;br /&gt;
 |CH2 Vertikalverstärker-Kopplung&lt;br /&gt;
 |-&lt;br /&gt;
 |19&lt;br /&gt;
 |CH2 ^ v POSITION&lt;br /&gt;
 |CH2 Vertikale Positionierung&lt;br /&gt;
 |-&lt;br /&gt;
 |20&lt;br /&gt;
 |CH2 (Y)&lt;br /&gt;
 |Vertikaler Eingang für CH2 und Y-Achse im X-Y-Betrieb&lt;br /&gt;
 |-&lt;br /&gt;
 |21&lt;br /&gt;
 |CH2 VARIABLE&lt;br /&gt;
 |CH2 Empfindlichkeit Feineinstellung&lt;br /&gt;
 |-&lt;br /&gt;
 |22&lt;br /&gt;
 |CH2 VOLTS/DIV&lt;br /&gt;
 |CH2 Vertikalachsen-Empfindlichkeit&lt;br /&gt;
 |-&lt;br /&gt;
 |23&lt;br /&gt;
 |SOURCE&lt;br /&gt;
 |Auswahl des externen oder internen Triggersignals&lt;br /&gt;
 |-&lt;br /&gt;
 |24&lt;br /&gt;
 |EXT TRIG IN&lt;br /&gt;
 |Eingangsbuchse für externes Triggersignal&lt;br /&gt;
 |-&lt;br /&gt;
 |25&lt;br /&gt;
 |TRIGGER MODE&lt;br /&gt;
 |Auswahl des Triggermodus&lt;br /&gt;
 |-&lt;br /&gt;
 |26&lt;br /&gt;
 |SLOPE&lt;br /&gt;
 |Auswahl der Triggerflanke&lt;br /&gt;
 |-&lt;br /&gt;
 |27&lt;br /&gt;
 |TRIG.ALT&lt;br /&gt;
 |Internes Triggersignal alterniert zwischen CH1 und CH2&lt;br /&gt;
 |-&lt;br /&gt;
 |28&lt;br /&gt;
 |LEVEL&lt;br /&gt;
 |Bestimmung des Startpunktes für die Wellenform&lt;br /&gt;
 |-&lt;br /&gt;
 |29&lt;br /&gt;
 |TIME/DIV&lt;br /&gt;
 |Wahl der Ablenkzeiten&lt;br /&gt;
 |-&lt;br /&gt;
 |30&lt;br /&gt;
 |SWP.VAR&lt;br /&gt;
 |Feineinstellung der Ablenkzeit&lt;br /&gt;
 |-&lt;br /&gt;
 |31&lt;br /&gt;
 |x10 MAG&lt;br /&gt;
 |Vergrößerung um den Faktor 10&lt;br /&gt;
 |-&lt;br /&gt;
 |32&lt;br /&gt;
 |&amp;lt; &amp;gt; POSITION &lt;br /&gt;
 |Einstellung der horizontalen Position&lt;br /&gt;
 |-&lt;br /&gt;
 |33&lt;br /&gt;
 |FILTER&lt;br /&gt;
 |Filter zum einfachen Ablesen der Wellenformen&lt;br /&gt;
 |-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[bild:Voltcraft 630-2 Rear.PNG|640px]]&lt;br /&gt;
&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |Nummer&lt;br /&gt;
 |Bezeichnung&lt;br /&gt;
 |Funktion&lt;br /&gt;
 |-&lt;br /&gt;
 |34&lt;br /&gt;
 |Z AXIS INPUT&lt;br /&gt;
 |Eingangsbuchse für externes Intensitätsmodulationssignal&lt;br /&gt;
 |-&lt;br /&gt;
 |35&lt;br /&gt;
 |CH1 SIGNAL OUTPUT&lt;br /&gt;
 |CH1 Ausgangssignal für Frequenzmesser&lt;br /&gt;
 |-&lt;br /&gt;
 |36&lt;br /&gt;
 |&lt;br /&gt;
 |Ständer&lt;br /&gt;
 |-&lt;br /&gt;
 |37&lt;br /&gt;
 |&lt;br /&gt;
 |SICHERUNG &amp;amp; Netzspannungswahlschalter&lt;br /&gt;
 |-&lt;br /&gt;
 |38&lt;br /&gt;
 |&lt;br /&gt;
 |AC Eingangsbuchse&lt;br /&gt;
 |-&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
===Grundeinstellungen===&lt;br /&gt;
Wenn man neue Messungen beginnen will, sollte man das Oszilloskop vor dem Einschalten in die Grundeinstellung bringen.&lt;br /&gt;
&lt;br /&gt;
====Einkanal-Betrieb====&lt;br /&gt;
&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |Nummer&lt;br /&gt;
 |Bezeichnung&lt;br /&gt;
 |Einstellung&lt;br /&gt;
 |-&lt;br /&gt;
 |2&lt;br /&gt;
 |INTEN&lt;br /&gt;
 |Mittelstellung&lt;br /&gt;
 |-&lt;br /&gt;
 |3&lt;br /&gt;
 |FOCUS&lt;br /&gt;
 |Mittelstellung&lt;br /&gt;
 |-&lt;br /&gt;
 |7&lt;br /&gt;
 |CH1 VOLTS/DIV&lt;br /&gt;
 |0.5V/DIV&lt;br /&gt;
 |-&lt;br /&gt;
 |9&lt;br /&gt;
 |CH1 VARIABLE&lt;br /&gt;
 |CAL (Position im Uhrzeigersinn)&lt;br /&gt;
 |-&lt;br /&gt;
 |10&lt;br /&gt;
 |CH1 AC-GND-DC&lt;br /&gt;
 |GND&lt;br /&gt;
 |-&lt;br /&gt;
 |11&lt;br /&gt;
 |CH1 ^ v POSITION&lt;br /&gt;
 |Mittelstellung&lt;br /&gt;
 |-&lt;br /&gt;
 |14&lt;br /&gt;
 |VERT MODE&lt;br /&gt;
 |CH1&lt;br /&gt;
 |-&lt;br /&gt;
 |16&lt;br /&gt;
 |CH2 INV&lt;br /&gt;
 |OFF&lt;br /&gt;
 |-&lt;br /&gt;
 |18&lt;br /&gt;
 |CH2 AC-GND-DC&lt;br /&gt;
 |GND&lt;br /&gt;
 |-&lt;br /&gt;
 |19&lt;br /&gt;
 |CH2 ^ v POSITION&lt;br /&gt;
 |Mittelstellung&lt;br /&gt;
 |-&lt;br /&gt;
 |21&lt;br /&gt;
 |CH2 VARIABLE&lt;br /&gt;
 |CAL (Position im Uhrzeigersinn)&lt;br /&gt;
 |-&lt;br /&gt;
 |22&lt;br /&gt;
 |CH2 VOLTS/DIV&lt;br /&gt;
 |0.5V/DIV&lt;br /&gt;
 |-&lt;br /&gt;
 |23&lt;br /&gt;
 |SOURCE&lt;br /&gt;
 |CH1&lt;br /&gt;
 |-&lt;br /&gt;
 |25&lt;br /&gt;
 |TRIGGER MODE&lt;br /&gt;
 |AUTO&lt;br /&gt;
 |-&lt;br /&gt;
 |26&lt;br /&gt;
 |SLOPE&lt;br /&gt;
 | + &lt;br /&gt;
 |-&lt;br /&gt;
 |27&lt;br /&gt;
 |TRIG.ALT&lt;br /&gt;
 |OFF&lt;br /&gt;
 |-&lt;br /&gt;
 |29&lt;br /&gt;
 |TIME/DIV&lt;br /&gt;
 |0.5ms/DIV&lt;br /&gt;
 |-&lt;br /&gt;
 |30&lt;br /&gt;
 |SWP.VAR&lt;br /&gt;
 |CAL&lt;br /&gt;
 |-&lt;br /&gt;
 |31&lt;br /&gt;
 |x10 MAG&lt;br /&gt;
 |OFF&lt;br /&gt;
 |-&lt;br /&gt;
 |32&lt;br /&gt;
 |&amp;lt; &amp;gt; POSITION &lt;br /&gt;
 |Mittelstellung&lt;br /&gt;
 |-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Zweikanal-Betrieb====&lt;br /&gt;
Für den Zweikanal-Betrieb wählt man zunächst alle Einstellungen des [[Oszilloskop_-_Tutorial#Einkanal-Betrieb|Einkanal-Betriebs]].&lt;br /&gt;
&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |Nummer&lt;br /&gt;
 |Bezeichnung&lt;br /&gt;
 |Einstellung&lt;br /&gt;
 |-&lt;br /&gt;
 |14&lt;br /&gt;
 |VERT MODE&lt;br /&gt;
 |DUAL&lt;br /&gt;
 |-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Inbetriebnahme===&lt;br /&gt;
====Power====&lt;br /&gt;
Wenn der Netzspannungswahlschalter (37) einmalig auf die richtige Netzspannung (AC 115V oder 230V) und die Grundeinstellung für den Einkanal- oder Zweikanal-Betrieb eingestellt wurde, kann das Oszilloskop mit dem Hauptschalter (6) eingeschaltet werden. Die POWER LED (5) leuchtet auf.&lt;br /&gt;
&lt;br /&gt;
====Strahlabgleich====&lt;br /&gt;
Nach dem [[Oszilloskop_-_Tutorial#Power|Einschalten]] des Oszilloskops in der Grundstellung &amp;quot;[[Oszilloskop_-_Tutorial#Einkanal-Betrieb|Einkanal-Betrieb]]&amp;quot; sollte nach höchstens 20 Sekunden die horizontale Strahllinie auf dem Bildschirm erscheinen. Ist dies nicht der Fall, dann zunächst den INTEN Helligkeits-Regler (2) weiter nach rechts drehen bis die Linie erscheint. Gut eingestellt ist die '''Helligkeit''', wenn die Linie deutlich zu erkennen aber nicht überstrahlt ist.&lt;br /&gt;
&lt;br /&gt;
Sieht die Strahllinie nicht scharf begrenzt aus, kann man die '''Schärfe''' noch mit dem FOCUS Regler (3) optimal einstellen. Dies ist der Fall, wenn die Linie möglichst dünn aussieht.&lt;br /&gt;
&lt;br /&gt;
Nun sollte die Strahllinie noch richtig ausgerichtet werden:&lt;br /&gt;
* '''Vertikale Lage:''' Die Strahllinie mit dem CH1 ^v POSITION Regler (11) mit der mittleren horizontalen Rasterlinie in Deckung bringen.&lt;br /&gt;
* '''Horizontale Lage:''' Die Strahllinie mit dem &amp;lt;&amp;gt; POSITION Regler (32) so in die Mitte des Bildschirms legen, dass das Strahlende rechts und links nicht mehr sichtbar ist.&lt;br /&gt;
* '''Rotation:''' Wenn der Strahl nicht parallel zur mittleren horizontalen Rasterlinie verläuft, sondern sie in einem Winkel kreuzt, dann muss die Strahl-Rotation noch eingestellt werden. Mit einem kleinen Schlitz-Schraubendreher stellt man die Rotation vorsichtig am Regler TRACE ROTATION (4) ein. Diese Einstellung muss man i.d.R. nur einmalig vornehmen und nicht bei jeder Inbetriebnahme. Anschließend muss man die vertikale Lage ggf. noch einmal korrigieren.&lt;br /&gt;
&lt;br /&gt;
====Test-Messung====&lt;br /&gt;
Der mitgelieferte Oszilloskop-Tastkopf wird nun an die CH1 Eingangsbuchse (8) angeschlossen und die Messspitze an den Kalibrierausgang CAL (1) angeklemmt.&lt;br /&gt;
&lt;br /&gt;
Wenn die Grundstellung richtig vorgenommen wurde, darf sich zunächst am Bildschirm nichts verändern, d.h. die Strahllinie ist unverändert in der Mitte zu sehen.&lt;br /&gt;
&lt;br /&gt;
Grund: Die CH1 Eingangsbuchse (8) ist noch vom Oszilloskop abgekoppelt und der Eingang des (internen) CH1 Verstärkers liegt an GND. Erst wenn man den CH1 Eingangswahlschalter (10) aus der Grundstellung &amp;quot;GND&amp;quot; nach oben in die Stellung &amp;quot;AC&amp;quot; schiebt, verändert sich die Bildschirm-Ausgabe: Es ist das Rechteck-Signal des Kalibrierausgangs CAL (1) zu sehen.&lt;br /&gt;
&lt;br /&gt;
'''Die CH1 &amp;amp; CH2 Eingangswahlschalter (10, 18) sind also sehr wichtig! In der Stellung &amp;quot;GND&amp;quot; ist das Oszilloskop gut geschützt. Man sollte den/die Eingangswahlschalter nur zum eigentlichen Messbetrieb in die Stellung &amp;quot;AC&amp;quot; oder &amp;quot;DC&amp;quot; bringen und sonst in der Grundstellung &amp;quot;GND&amp;quot; lassen.''' &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Digital Oszilloskop==&lt;br /&gt;
Wer möchte diesen Abschnitt übernehmen?&lt;br /&gt;
&lt;br /&gt;
===Prinzip===&lt;br /&gt;
===Bedienelemente===&lt;br /&gt;
===Grundeinstellungen===&lt;br /&gt;
====Einkanal-Betrieb====&lt;br /&gt;
====Zweikanal-Betrieb====&lt;br /&gt;
===Inbetriebnahme===&lt;br /&gt;
====Power====&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Grundlagen]]	 &lt;br /&gt;
[[Kategorie:Praxis]]&lt;br /&gt;
[[Kategorie:Elektronik]]&lt;br /&gt;
&lt;br /&gt;
=Autoren=&lt;br /&gt;
--[[Benutzer:Dirk|Dirk]] 21:04, 15. Jul 2014 (CET)&lt;/div&gt;</summary>
		<author><name>Dirk NO2</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Oszilloskop_-_Tutorial&amp;diff=24936</id>
		<title>Oszilloskop - Tutorial</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Oszilloskop_-_Tutorial&amp;diff=24936"/>
				<updated>2014-07-18T16:13:45Z</updated>
		
		<summary type="html">&lt;p&gt;Dirk NO2: /* Test-Messung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[bild:Voltcraft 630-2.JPG|right|500px]]&lt;br /&gt;
&lt;br /&gt;
=Allgemein=&lt;br /&gt;
Ein Oszilloskop-Tutorial gehört auch hier im RN-Wissen zu den [[Wunschthemen|Wunsch-Artikeln]]. Es gibt im Netz zwar auch schon gute Tutorials, aber hier soll versucht werden, möglichst einfach an das Thema heran zu gehen. Ich werde mich hauptsächlich mit dem analogen Oszilloskop am Beispiel des [http://www.conrad.de/ce/de/product/122421/VOLTCRAFT-VC-630-2-Analoges-2-Kanal-Oszilloskop-Bandbreite-0-DC-bis-30-MHz Voltcraft 630-2] beschäftigen. Die Bedienelemente dieses Oszilloskops werden sich ähnlich auch bei allen anderen Typen finden.&lt;br /&gt;
&lt;br /&gt;
Ich würde mir wünschen, dass jemand den Abschnitt zum [[Oszilloskop_-_Tutorial#Digital_Oszilloskop|digitalen Oszilloskop]] übernimmt.&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Analog Oszilloskop==&lt;br /&gt;
===Prinzip===&lt;br /&gt;
&lt;br /&gt;
[[bild:Voltcraft 630-2 Schematic.PNG|640px]]&lt;br /&gt;
&lt;br /&gt;
===Bedienelemente===&lt;br /&gt;
[[bild:Voltcraft 630-2 Front.PNG|640px]]&lt;br /&gt;
&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |Nummer&lt;br /&gt;
 |Bezeichnung&lt;br /&gt;
 |Funktion&lt;br /&gt;
 |-&lt;br /&gt;
 |1&lt;br /&gt;
 |CAL&lt;br /&gt;
 |Kalibrierspannung&lt;br /&gt;
 |-&lt;br /&gt;
 |2&lt;br /&gt;
 |INTEN&lt;br /&gt;
 |Helligkeit des Elektronenstrahls&lt;br /&gt;
 |-&lt;br /&gt;
 |3&lt;br /&gt;
 |FOCUS&lt;br /&gt;
 |Fokussierung auf das schärfste Bild&lt;br /&gt;
 |-&lt;br /&gt;
 |4&lt;br /&gt;
 |TRACE ROTATION&lt;br /&gt;
 |Abstimmung der horizontalen Spur mit den Rasterlinien&lt;br /&gt;
 |-&lt;br /&gt;
 |5&lt;br /&gt;
 |LED&lt;br /&gt;
 |Power Anzeige&lt;br /&gt;
 |-&lt;br /&gt;
 |6&lt;br /&gt;
 |POWER&lt;br /&gt;
 |Hauptschalter&lt;br /&gt;
 |-&lt;br /&gt;
 |7&lt;br /&gt;
 |CH1 VOLTS/DIV&lt;br /&gt;
 |CH1 Vertikalachsen-Empfindlichkeit&lt;br /&gt;
 |-&lt;br /&gt;
 |8&lt;br /&gt;
 |CH1 (X)&lt;br /&gt;
 |Vertikaler Eingang für CH1 und X-Achse im X-Y-Betrieb&lt;br /&gt;
 |-&lt;br /&gt;
 |9&lt;br /&gt;
 |CH1 VARIABLE CH1&lt;br /&gt;
 |CH1 Empfindlichkeit Feineinstellung&lt;br /&gt;
 |-&lt;br /&gt;
 |10&lt;br /&gt;
 |CH1 AC-GND-DC&lt;br /&gt;
 |CH1 Vertikalverstärker-Kopplung&lt;br /&gt;
 |-&lt;br /&gt;
 |11&lt;br /&gt;
 |CH1 ^ v POSITION&lt;br /&gt;
 |CH1 Vertikale Positionierung&lt;br /&gt;
 |-&lt;br /&gt;
 |12&lt;br /&gt;
 |ALT/CHOP&lt;br /&gt;
 |Anzeigeart im Zweikanal-Modus&lt;br /&gt;
 |-&lt;br /&gt;
 |13&lt;br /&gt;
 |CH1 DC BAL&lt;br /&gt;
 |CH1 Dämpferabgleich&lt;br /&gt;
 |-&lt;br /&gt;
 |14&lt;br /&gt;
 |VERT MODE&lt;br /&gt;
 |Auswahl der Betriebsart&lt;br /&gt;
 |-&lt;br /&gt;
 |15&lt;br /&gt;
 |GND&lt;br /&gt;
 |Masseanschluss des Gehäuses&lt;br /&gt;
 |-&lt;br /&gt;
 |16&lt;br /&gt;
 |CH2 INV&lt;br /&gt;
 |Eingangssignal von CH2 wird invertiert&lt;br /&gt;
 |-&lt;br /&gt;
 |17&lt;br /&gt;
 |CH2 DC BAL&lt;br /&gt;
 |CH2 Dämpferabgleich&lt;br /&gt;
 |-&lt;br /&gt;
 |18&lt;br /&gt;
 |CH2 AC-GND-DC&lt;br /&gt;
 |CH2 Vertikalverstärker-Kopplung&lt;br /&gt;
 |-&lt;br /&gt;
 |19&lt;br /&gt;
 |CH2 ^ v POSITION&lt;br /&gt;
 |CH2 Vertikale Positionierung&lt;br /&gt;
 |-&lt;br /&gt;
 |20&lt;br /&gt;
 |CH2 (Y)&lt;br /&gt;
 |Vertikaler Eingang für CH2 und Y-Achse im X-Y-Betrieb&lt;br /&gt;
 |-&lt;br /&gt;
 |21&lt;br /&gt;
 |CH2 VARIABLE&lt;br /&gt;
 |CH2 Empfindlichkeit Feineinstellung&lt;br /&gt;
 |-&lt;br /&gt;
 |22&lt;br /&gt;
 |CH2 VOLTS/DIV&lt;br /&gt;
 |CH2 Vertikalachsen-Empfindlichkeit&lt;br /&gt;
 |-&lt;br /&gt;
 |23&lt;br /&gt;
 |SOURCE&lt;br /&gt;
 |Auswahl des externen oder internen Triggersignals&lt;br /&gt;
 |-&lt;br /&gt;
 |24&lt;br /&gt;
 |EXT TRIG IN&lt;br /&gt;
 |Eingangsbuchse für externes Triggersignal&lt;br /&gt;
 |-&lt;br /&gt;
 |25&lt;br /&gt;
 |TRIGGER MODE&lt;br /&gt;
 |Auswahl des Triggermodus&lt;br /&gt;
 |-&lt;br /&gt;
 |26&lt;br /&gt;
 |SLOPE&lt;br /&gt;
 |Auswahl der Triggerflanke&lt;br /&gt;
 |-&lt;br /&gt;
 |27&lt;br /&gt;
 |TRIG.ALT&lt;br /&gt;
 |Internes Triggersignal alterniert zwischen CH1 und CH2&lt;br /&gt;
 |-&lt;br /&gt;
 |28&lt;br /&gt;
 |LEVEL&lt;br /&gt;
 |Bestimmung des Startpunktes für die Wellenform&lt;br /&gt;
 |-&lt;br /&gt;
 |29&lt;br /&gt;
 |TIME/DIV&lt;br /&gt;
 |Wahl der Ablenkzeiten&lt;br /&gt;
 |-&lt;br /&gt;
 |30&lt;br /&gt;
 |SWP.VAR&lt;br /&gt;
 |Feineinstellung der Ablenkzeit&lt;br /&gt;
 |-&lt;br /&gt;
 |31&lt;br /&gt;
 |x10 MAG&lt;br /&gt;
 |Vergrößerung um den Faktor 10&lt;br /&gt;
 |-&lt;br /&gt;
 |32&lt;br /&gt;
 |&amp;lt; &amp;gt; POSITION &lt;br /&gt;
 |Einstellung der horizontalen Position&lt;br /&gt;
 |-&lt;br /&gt;
 |33&lt;br /&gt;
 |FILTER&lt;br /&gt;
 |Filter zum einfachen Ablesen der Wellenformen&lt;br /&gt;
 |-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[bild:Voltcraft 630-2 Rear.PNG|640px]]&lt;br /&gt;
&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |Nummer&lt;br /&gt;
 |Bezeichnung&lt;br /&gt;
 |Funktion&lt;br /&gt;
 |-&lt;br /&gt;
 |34&lt;br /&gt;
 |Z AXIS INPUT&lt;br /&gt;
 |Eingangsbuchse für externes Intensitätsmodulationssignal&lt;br /&gt;
 |-&lt;br /&gt;
 |35&lt;br /&gt;
 |CH1 SIGNAL OUTPUT&lt;br /&gt;
 |CH1 Ausgangssignal für Frequenzmesser&lt;br /&gt;
 |-&lt;br /&gt;
 |36&lt;br /&gt;
 |&lt;br /&gt;
 |Ständer&lt;br /&gt;
 |-&lt;br /&gt;
 |37&lt;br /&gt;
 |&lt;br /&gt;
 |SICHERUNG &amp;amp; Netzspannungswahlschalter&lt;br /&gt;
 |-&lt;br /&gt;
 |38&lt;br /&gt;
 |&lt;br /&gt;
 |AC Eingangsbuchse&lt;br /&gt;
 |-&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
===Grundeinstellungen===&lt;br /&gt;
Wenn man neue Messungen beginnen will, sollte man das Oszilloskop vor dem Einschalten in die Grundeinstellung bringen.&lt;br /&gt;
&lt;br /&gt;
====Einkanal-Betrieb====&lt;br /&gt;
&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |Nummer&lt;br /&gt;
 |Bezeichnung&lt;br /&gt;
 |Einstellung&lt;br /&gt;
 |-&lt;br /&gt;
 |2&lt;br /&gt;
 |INTEN&lt;br /&gt;
 |Mittelstellung&lt;br /&gt;
 |-&lt;br /&gt;
 |3&lt;br /&gt;
 |FOCUS&lt;br /&gt;
 |Mittelstellung&lt;br /&gt;
 |-&lt;br /&gt;
 |7&lt;br /&gt;
 |CH1 VOLTS/DIV&lt;br /&gt;
 |0.5V/DIV&lt;br /&gt;
 |-&lt;br /&gt;
 |9&lt;br /&gt;
 |CH1 VARIABLE&lt;br /&gt;
 |CAL (Position im Uhrzeigersinn)&lt;br /&gt;
 |-&lt;br /&gt;
 |10&lt;br /&gt;
 |CH1 AC-GND-DC&lt;br /&gt;
 |GND&lt;br /&gt;
 |-&lt;br /&gt;
 |11&lt;br /&gt;
 |CH1 ^ v POSITION&lt;br /&gt;
 |Mittelstellung&lt;br /&gt;
 |-&lt;br /&gt;
 |14&lt;br /&gt;
 |VERT MODE&lt;br /&gt;
 |CH1&lt;br /&gt;
 |-&lt;br /&gt;
 |16&lt;br /&gt;
 |CH2 INV&lt;br /&gt;
 |OFF&lt;br /&gt;
 |-&lt;br /&gt;
 |18&lt;br /&gt;
 |CH2 AC-GND-DC&lt;br /&gt;
 |GND&lt;br /&gt;
 |-&lt;br /&gt;
 |19&lt;br /&gt;
 |CH2 ^ v POSITION&lt;br /&gt;
 |Mittelstellung&lt;br /&gt;
 |-&lt;br /&gt;
 |21&lt;br /&gt;
 |CH2 VARIABLE&lt;br /&gt;
 |CAL (Position im Uhrzeigersinn)&lt;br /&gt;
 |-&lt;br /&gt;
 |22&lt;br /&gt;
 |CH2 VOLTS/DIV&lt;br /&gt;
 |0.5V/DIV&lt;br /&gt;
 |-&lt;br /&gt;
 |23&lt;br /&gt;
 |SOURCE&lt;br /&gt;
 |CH1&lt;br /&gt;
 |-&lt;br /&gt;
 |25&lt;br /&gt;
 |TRIGGER MODE&lt;br /&gt;
 |AUTO&lt;br /&gt;
 |-&lt;br /&gt;
 |26&lt;br /&gt;
 |SLOPE&lt;br /&gt;
 | + &lt;br /&gt;
 |-&lt;br /&gt;
 |27&lt;br /&gt;
 |TRIG.ALT&lt;br /&gt;
 |OFF&lt;br /&gt;
 |-&lt;br /&gt;
 |29&lt;br /&gt;
 |TIME/DIV&lt;br /&gt;
 |0.5ms/DIV&lt;br /&gt;
 |-&lt;br /&gt;
 |30&lt;br /&gt;
 |SWP.VAR&lt;br /&gt;
 |CAL&lt;br /&gt;
 |-&lt;br /&gt;
 |31&lt;br /&gt;
 |x10 MAG&lt;br /&gt;
 |OFF&lt;br /&gt;
 |-&lt;br /&gt;
 |32&lt;br /&gt;
 |&amp;lt; &amp;gt; POSITION &lt;br /&gt;
 |Mittelstellung&lt;br /&gt;
 |-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Zweikanal-Betrieb====&lt;br /&gt;
Für den Zweikanal-Betrieb wählt man zunächst alle Einstellungen des [[Oszilloskop_-_Tutorial#Einkanal-Betrieb|Einkanal-Betriebs]].&lt;br /&gt;
&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |Nummer&lt;br /&gt;
 |Bezeichnung&lt;br /&gt;
 |Einstellung&lt;br /&gt;
 |-&lt;br /&gt;
 |14&lt;br /&gt;
 |VERT MODE&lt;br /&gt;
 |DUAL&lt;br /&gt;
 |-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Inbetriebnahme===&lt;br /&gt;
====Power====&lt;br /&gt;
Wenn der Netzspannungswahlschalter (37) einmalig auf die richtige Netzspannung (AC 115V oder 230V) und die Grundeinstellung für den Einkanal- oder Zweikanal-Betrieb eingestellt wurde, kann das Oszilloskop mit dem Hauptschalter (6) eingeschaltet werden. Die POWER LED (5) leuchtet auf.&lt;br /&gt;
&lt;br /&gt;
====Strahlabgleich====&lt;br /&gt;
Nach dem [[Oszilloskop_-_Tutorial#Power|Einschalten]] des Oszilloskops in der Grundstellung &amp;quot;[[Oszilloskop_-_Tutorial#Einkanal-Betrieb|Einkanal-Betrieb]]&amp;quot; sollte nach höchstens 20 Sekunden die horizontale Strahllinie auf dem Bildschirm erscheinen. Ist dies nicht der Fall, dann zunächst den INTEN Helligkeits-Regler (2) weiter nach rechts drehen bis die Linie erscheint. Gut eingestellt ist die '''Helligkeit''', wenn die Linie deutlich zu erkennen aber nicht überstrahlt ist.&lt;br /&gt;
&lt;br /&gt;
Sieht die Strahllinie nicht scharf begrenzt aus, kann man die '''Schärfe''' noch mit dem FOCUS Regler (3) optimal einstellen. Dies ist der Fall, wenn die Linie möglichst dünn aussieht.&lt;br /&gt;
&lt;br /&gt;
Nun sollte die Strahllinie noch richtig ausgerichtet werden:&lt;br /&gt;
* '''Vertikale Lage:''' Die Strahllinie mit dem CH1 ^v POSITION Regler (11) mit der mittleren horizontalen Rasterlinie in Deckung bringen.&lt;br /&gt;
* '''Horizontale Lage:''' Die Strahllinie mit dem &amp;lt;&amp;gt; POSITION Regler (32) so in die Mitte des Bildschirms legen, dass das Strahlende rechts und links nicht mehr sichtbar ist.&lt;br /&gt;
* '''Rotation:''' Wenn der Strahl nicht parallel zur mittleren horizontalen Rasterlinie verläuft, sondern sie in einem Winkel kreuzt, dann muss die Strahl-Rotation noch eingestellt werden. Mit einem kleinen Schlitz-Schraubendreher stellt man die Rotation vorsichtig am Regler TRACE ROTATION (4) ein. Diese Einstellung muss man i.d.R. nur einmalig vornehmen und nicht bei jeder Inbetriebnahme. Anschließend muss man die vertikale Lage ggf. noch einmal korrigieren.&lt;br /&gt;
&lt;br /&gt;
====Test-Messung====&lt;br /&gt;
Der mitgelieferte Oszilloskop-Tastkopf wird nun an die CH1 Eingangsbuchse (8) angeschlossen und die Messspitze an den Kalibrierausgang CAL (1) angeklemmt.&lt;br /&gt;
&lt;br /&gt;
Wenn die Grundstellung richtig vorgenommen wurde, darf sich zunächst am Bildschirm nichts verändern, d.h. die Strahllinie ist unverändert in der Mitte zu sehen.&lt;br /&gt;
&lt;br /&gt;
Grund: Die CH1 Eingangsbuchse (8) ist noch vom Oszilloskop abgekoppelt und der Eingang des (internen) CH1 Verstärkers liegt an GND. Erst wenn man den CH1 Eingangswahlschalter (10) aus der Grundstellung &amp;quot;GND&amp;quot; nach oben in die Stellung &amp;quot;AC&amp;quot; schiebt, verändert sich die Bildschirm-Ausgabe: Es ist das Rechteck-Signal des Kalibrierausgangs CAL (1) zu sehen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Digital Oszilloskop==&lt;br /&gt;
Wer möchte diesen Abschnitt übernehmen?&lt;br /&gt;
&lt;br /&gt;
===Prinzip===&lt;br /&gt;
===Bedienelemente===&lt;br /&gt;
===Grundeinstellungen===&lt;br /&gt;
====Einkanal-Betrieb====&lt;br /&gt;
====Zweikanal-Betrieb====&lt;br /&gt;
===Inbetriebnahme===&lt;br /&gt;
====Power====&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Grundlagen]]	 &lt;br /&gt;
[[Kategorie:Praxis]]&lt;br /&gt;
[[Kategorie:Elektronik]]&lt;br /&gt;
&lt;br /&gt;
=Autoren=&lt;br /&gt;
--[[Benutzer:Dirk|Dirk]] 21:04, 15. Jul 2014 (CET)&lt;/div&gt;</summary>
		<author><name>Dirk NO2</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Oszilloskop_-_Tutorial&amp;diff=24935</id>
		<title>Oszilloskop - Tutorial</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Oszilloskop_-_Tutorial&amp;diff=24935"/>
				<updated>2014-07-18T16:04:13Z</updated>
		
		<summary type="html">&lt;p&gt;Dirk NO2: /* Inbetriebnahme */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[bild:Voltcraft 630-2.JPG|right|500px]]&lt;br /&gt;
&lt;br /&gt;
=Allgemein=&lt;br /&gt;
Ein Oszilloskop-Tutorial gehört auch hier im RN-Wissen zu den [[Wunschthemen|Wunsch-Artikeln]]. Es gibt im Netz zwar auch schon gute Tutorials, aber hier soll versucht werden, möglichst einfach an das Thema heran zu gehen. Ich werde mich hauptsächlich mit dem analogen Oszilloskop am Beispiel des [http://www.conrad.de/ce/de/product/122421/VOLTCRAFT-VC-630-2-Analoges-2-Kanal-Oszilloskop-Bandbreite-0-DC-bis-30-MHz Voltcraft 630-2] beschäftigen. Die Bedienelemente dieses Oszilloskops werden sich ähnlich auch bei allen anderen Typen finden.&lt;br /&gt;
&lt;br /&gt;
Ich würde mir wünschen, dass jemand den Abschnitt zum [[Oszilloskop_-_Tutorial#Digital_Oszilloskop|digitalen Oszilloskop]] übernimmt.&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Analog Oszilloskop==&lt;br /&gt;
===Prinzip===&lt;br /&gt;
&lt;br /&gt;
[[bild:Voltcraft 630-2 Schematic.PNG|640px]]&lt;br /&gt;
&lt;br /&gt;
===Bedienelemente===&lt;br /&gt;
[[bild:Voltcraft 630-2 Front.PNG|640px]]&lt;br /&gt;
&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |Nummer&lt;br /&gt;
 |Bezeichnung&lt;br /&gt;
 |Funktion&lt;br /&gt;
 |-&lt;br /&gt;
 |1&lt;br /&gt;
 |CAL&lt;br /&gt;
 |Kalibrierspannung&lt;br /&gt;
 |-&lt;br /&gt;
 |2&lt;br /&gt;
 |INTEN&lt;br /&gt;
 |Helligkeit des Elektronenstrahls&lt;br /&gt;
 |-&lt;br /&gt;
 |3&lt;br /&gt;
 |FOCUS&lt;br /&gt;
 |Fokussierung auf das schärfste Bild&lt;br /&gt;
 |-&lt;br /&gt;
 |4&lt;br /&gt;
 |TRACE ROTATION&lt;br /&gt;
 |Abstimmung der horizontalen Spur mit den Rasterlinien&lt;br /&gt;
 |-&lt;br /&gt;
 |5&lt;br /&gt;
 |LED&lt;br /&gt;
 |Power Anzeige&lt;br /&gt;
 |-&lt;br /&gt;
 |6&lt;br /&gt;
 |POWER&lt;br /&gt;
 |Hauptschalter&lt;br /&gt;
 |-&lt;br /&gt;
 |7&lt;br /&gt;
 |CH1 VOLTS/DIV&lt;br /&gt;
 |CH1 Vertikalachsen-Empfindlichkeit&lt;br /&gt;
 |-&lt;br /&gt;
 |8&lt;br /&gt;
 |CH1 (X)&lt;br /&gt;
 |Vertikaler Eingang für CH1 und X-Achse im X-Y-Betrieb&lt;br /&gt;
 |-&lt;br /&gt;
 |9&lt;br /&gt;
 |CH1 VARIABLE CH1&lt;br /&gt;
 |CH1 Empfindlichkeit Feineinstellung&lt;br /&gt;
 |-&lt;br /&gt;
 |10&lt;br /&gt;
 |CH1 AC-GND-DC&lt;br /&gt;
 |CH1 Vertikalverstärker-Kopplung&lt;br /&gt;
 |-&lt;br /&gt;
 |11&lt;br /&gt;
 |CH1 ^ v POSITION&lt;br /&gt;
 |CH1 Vertikale Positionierung&lt;br /&gt;
 |-&lt;br /&gt;
 |12&lt;br /&gt;
 |ALT/CHOP&lt;br /&gt;
 |Anzeigeart im Zweikanal-Modus&lt;br /&gt;
 |-&lt;br /&gt;
 |13&lt;br /&gt;
 |CH1 DC BAL&lt;br /&gt;
 |CH1 Dämpferabgleich&lt;br /&gt;
 |-&lt;br /&gt;
 |14&lt;br /&gt;
 |VERT MODE&lt;br /&gt;
 |Auswahl der Betriebsart&lt;br /&gt;
 |-&lt;br /&gt;
 |15&lt;br /&gt;
 |GND&lt;br /&gt;
 |Masseanschluss des Gehäuses&lt;br /&gt;
 |-&lt;br /&gt;
 |16&lt;br /&gt;
 |CH2 INV&lt;br /&gt;
 |Eingangssignal von CH2 wird invertiert&lt;br /&gt;
 |-&lt;br /&gt;
 |17&lt;br /&gt;
 |CH2 DC BAL&lt;br /&gt;
 |CH2 Dämpferabgleich&lt;br /&gt;
 |-&lt;br /&gt;
 |18&lt;br /&gt;
 |CH2 AC-GND-DC&lt;br /&gt;
 |CH2 Vertikalverstärker-Kopplung&lt;br /&gt;
 |-&lt;br /&gt;
 |19&lt;br /&gt;
 |CH2 ^ v POSITION&lt;br /&gt;
 |CH2 Vertikale Positionierung&lt;br /&gt;
 |-&lt;br /&gt;
 |20&lt;br /&gt;
 |CH2 (Y)&lt;br /&gt;
 |Vertikaler Eingang für CH2 und Y-Achse im X-Y-Betrieb&lt;br /&gt;
 |-&lt;br /&gt;
 |21&lt;br /&gt;
 |CH2 VARIABLE&lt;br /&gt;
 |CH2 Empfindlichkeit Feineinstellung&lt;br /&gt;
 |-&lt;br /&gt;
 |22&lt;br /&gt;
 |CH2 VOLTS/DIV&lt;br /&gt;
 |CH2 Vertikalachsen-Empfindlichkeit&lt;br /&gt;
 |-&lt;br /&gt;
 |23&lt;br /&gt;
 |SOURCE&lt;br /&gt;
 |Auswahl des externen oder internen Triggersignals&lt;br /&gt;
 |-&lt;br /&gt;
 |24&lt;br /&gt;
 |EXT TRIG IN&lt;br /&gt;
 |Eingangsbuchse für externes Triggersignal&lt;br /&gt;
 |-&lt;br /&gt;
 |25&lt;br /&gt;
 |TRIGGER MODE&lt;br /&gt;
 |Auswahl des Triggermodus&lt;br /&gt;
 |-&lt;br /&gt;
 |26&lt;br /&gt;
 |SLOPE&lt;br /&gt;
 |Auswahl der Triggerflanke&lt;br /&gt;
 |-&lt;br /&gt;
 |27&lt;br /&gt;
 |TRIG.ALT&lt;br /&gt;
 |Internes Triggersignal alterniert zwischen CH1 und CH2&lt;br /&gt;
 |-&lt;br /&gt;
 |28&lt;br /&gt;
 |LEVEL&lt;br /&gt;
 |Bestimmung des Startpunktes für die Wellenform&lt;br /&gt;
 |-&lt;br /&gt;
 |29&lt;br /&gt;
 |TIME/DIV&lt;br /&gt;
 |Wahl der Ablenkzeiten&lt;br /&gt;
 |-&lt;br /&gt;
 |30&lt;br /&gt;
 |SWP.VAR&lt;br /&gt;
 |Feineinstellung der Ablenkzeit&lt;br /&gt;
 |-&lt;br /&gt;
 |31&lt;br /&gt;
 |x10 MAG&lt;br /&gt;
 |Vergrößerung um den Faktor 10&lt;br /&gt;
 |-&lt;br /&gt;
 |32&lt;br /&gt;
 |&amp;lt; &amp;gt; POSITION &lt;br /&gt;
 |Einstellung der horizontalen Position&lt;br /&gt;
 |-&lt;br /&gt;
 |33&lt;br /&gt;
 |FILTER&lt;br /&gt;
 |Filter zum einfachen Ablesen der Wellenformen&lt;br /&gt;
 |-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[bild:Voltcraft 630-2 Rear.PNG|640px]]&lt;br /&gt;
&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |Nummer&lt;br /&gt;
 |Bezeichnung&lt;br /&gt;
 |Funktion&lt;br /&gt;
 |-&lt;br /&gt;
 |34&lt;br /&gt;
 |Z AXIS INPUT&lt;br /&gt;
 |Eingangsbuchse für externes Intensitätsmodulationssignal&lt;br /&gt;
 |-&lt;br /&gt;
 |35&lt;br /&gt;
 |CH1 SIGNAL OUTPUT&lt;br /&gt;
 |CH1 Ausgangssignal für Frequenzmesser&lt;br /&gt;
 |-&lt;br /&gt;
 |36&lt;br /&gt;
 |&lt;br /&gt;
 |Ständer&lt;br /&gt;
 |-&lt;br /&gt;
 |37&lt;br /&gt;
 |&lt;br /&gt;
 |SICHERUNG &amp;amp; Netzspannungswahlschalter&lt;br /&gt;
 |-&lt;br /&gt;
 |38&lt;br /&gt;
 |&lt;br /&gt;
 |AC Eingangsbuchse&lt;br /&gt;
 |-&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
===Grundeinstellungen===&lt;br /&gt;
Wenn man neue Messungen beginnen will, sollte man das Oszilloskop vor dem Einschalten in die Grundeinstellung bringen.&lt;br /&gt;
&lt;br /&gt;
====Einkanal-Betrieb====&lt;br /&gt;
&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |Nummer&lt;br /&gt;
 |Bezeichnung&lt;br /&gt;
 |Einstellung&lt;br /&gt;
 |-&lt;br /&gt;
 |2&lt;br /&gt;
 |INTEN&lt;br /&gt;
 |Mittelstellung&lt;br /&gt;
 |-&lt;br /&gt;
 |3&lt;br /&gt;
 |FOCUS&lt;br /&gt;
 |Mittelstellung&lt;br /&gt;
 |-&lt;br /&gt;
 |7&lt;br /&gt;
 |CH1 VOLTS/DIV&lt;br /&gt;
 |0.5V/DIV&lt;br /&gt;
 |-&lt;br /&gt;
 |9&lt;br /&gt;
 |CH1 VARIABLE&lt;br /&gt;
 |CAL (Position im Uhrzeigersinn)&lt;br /&gt;
 |-&lt;br /&gt;
 |10&lt;br /&gt;
 |CH1 AC-GND-DC&lt;br /&gt;
 |GND&lt;br /&gt;
 |-&lt;br /&gt;
 |11&lt;br /&gt;
 |CH1 ^ v POSITION&lt;br /&gt;
 |Mittelstellung&lt;br /&gt;
 |-&lt;br /&gt;
 |14&lt;br /&gt;
 |VERT MODE&lt;br /&gt;
 |CH1&lt;br /&gt;
 |-&lt;br /&gt;
 |16&lt;br /&gt;
 |CH2 INV&lt;br /&gt;
 |OFF&lt;br /&gt;
 |-&lt;br /&gt;
 |18&lt;br /&gt;
 |CH2 AC-GND-DC&lt;br /&gt;
 |GND&lt;br /&gt;
 |-&lt;br /&gt;
 |19&lt;br /&gt;
 |CH2 ^ v POSITION&lt;br /&gt;
 |Mittelstellung&lt;br /&gt;
 |-&lt;br /&gt;
 |21&lt;br /&gt;
 |CH2 VARIABLE&lt;br /&gt;
 |CAL (Position im Uhrzeigersinn)&lt;br /&gt;
 |-&lt;br /&gt;
 |22&lt;br /&gt;
 |CH2 VOLTS/DIV&lt;br /&gt;
 |0.5V/DIV&lt;br /&gt;
 |-&lt;br /&gt;
 |23&lt;br /&gt;
 |SOURCE&lt;br /&gt;
 |CH1&lt;br /&gt;
 |-&lt;br /&gt;
 |25&lt;br /&gt;
 |TRIGGER MODE&lt;br /&gt;
 |AUTO&lt;br /&gt;
 |-&lt;br /&gt;
 |26&lt;br /&gt;
 |SLOPE&lt;br /&gt;
 | + &lt;br /&gt;
 |-&lt;br /&gt;
 |27&lt;br /&gt;
 |TRIG.ALT&lt;br /&gt;
 |OFF&lt;br /&gt;
 |-&lt;br /&gt;
 |29&lt;br /&gt;
 |TIME/DIV&lt;br /&gt;
 |0.5ms/DIV&lt;br /&gt;
 |-&lt;br /&gt;
 |30&lt;br /&gt;
 |SWP.VAR&lt;br /&gt;
 |CAL&lt;br /&gt;
 |-&lt;br /&gt;
 |31&lt;br /&gt;
 |x10 MAG&lt;br /&gt;
 |OFF&lt;br /&gt;
 |-&lt;br /&gt;
 |32&lt;br /&gt;
 |&amp;lt; &amp;gt; POSITION &lt;br /&gt;
 |Mittelstellung&lt;br /&gt;
 |-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Zweikanal-Betrieb====&lt;br /&gt;
Für den Zweikanal-Betrieb wählt man zunächst alle Einstellungen des [[Oszilloskop_-_Tutorial#Einkanal-Betrieb|Einkanal-Betriebs]].&lt;br /&gt;
&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |Nummer&lt;br /&gt;
 |Bezeichnung&lt;br /&gt;
 |Einstellung&lt;br /&gt;
 |-&lt;br /&gt;
 |14&lt;br /&gt;
 |VERT MODE&lt;br /&gt;
 |DUAL&lt;br /&gt;
 |-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Inbetriebnahme===&lt;br /&gt;
====Power====&lt;br /&gt;
Wenn der Netzspannungswahlschalter (37) einmalig auf die richtige Netzspannung (AC 115V oder 230V) und die Grundeinstellung für den Einkanal- oder Zweikanal-Betrieb eingestellt wurde, kann das Oszilloskop mit dem Hauptschalter (6) eingeschaltet werden. Die POWER LED (5) leuchtet auf.&lt;br /&gt;
&lt;br /&gt;
====Strahlabgleich====&lt;br /&gt;
Nach dem [[Oszilloskop_-_Tutorial#Power|Einschalten]] des Oszilloskops in der Grundstellung &amp;quot;[[Oszilloskop_-_Tutorial#Einkanal-Betrieb|Einkanal-Betrieb]]&amp;quot; sollte nach höchstens 20 Sekunden die horizontale Strahllinie auf dem Bildschirm erscheinen. Ist dies nicht der Fall, dann zunächst den INTEN Helligkeits-Regler (2) weiter nach rechts drehen bis die Linie erscheint. Gut eingestellt ist die '''Helligkeit''', wenn die Linie deutlich zu erkennen aber nicht überstrahlt ist.&lt;br /&gt;
&lt;br /&gt;
Sieht die Strahllinie nicht scharf begrenzt aus, kann man die '''Schärfe''' noch mit dem FOCUS Regler (3) optimal einstellen. Dies ist der Fall, wenn die Linie möglichst dünn aussieht.&lt;br /&gt;
&lt;br /&gt;
Nun sollte die Strahllinie noch richtig ausgerichtet werden:&lt;br /&gt;
* '''Vertikale Lage:''' Die Strahllinie mit dem CH1 ^v POSITION Regler (11) mit der mittleren horizontalen Rasterlinie in Deckung bringen.&lt;br /&gt;
* '''Horizontale Lage:''' Die Strahllinie mit dem &amp;lt;&amp;gt; POSITION Regler (32) so in die Mitte des Bildschirms legen, dass das Strahlende rechts und links nicht mehr sichtbar ist.&lt;br /&gt;
* '''Rotation:''' Wenn der Strahl nicht parallel zur mittleren horizontalen Rasterlinie verläuft, sondern sie in einem Winkel kreuzt, dann muss die Strahl-Rotation noch eingestellt werden. Mit einem kleinen Schlitz-Schraubendreher stellt man die Rotation vorsichtig am Regler TRACE ROTATION (4) ein. Diese Einstellung muss man i.d.R. nur einmalig vornehmen und nicht bei jeder Inbetriebnahme. Anschließend muss man die vertikale Lage ggf. noch einmal korrigieren.&lt;br /&gt;
&lt;br /&gt;
====Test-Messung====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Digital Oszilloskop==&lt;br /&gt;
Wer möchte diesen Abschnitt übernehmen?&lt;br /&gt;
&lt;br /&gt;
===Prinzip===&lt;br /&gt;
===Bedienelemente===&lt;br /&gt;
===Grundeinstellungen===&lt;br /&gt;
====Einkanal-Betrieb====&lt;br /&gt;
====Zweikanal-Betrieb====&lt;br /&gt;
===Inbetriebnahme===&lt;br /&gt;
====Power====&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Grundlagen]]	 &lt;br /&gt;
[[Kategorie:Praxis]]&lt;br /&gt;
[[Kategorie:Elektronik]]&lt;br /&gt;
&lt;br /&gt;
=Autoren=&lt;br /&gt;
--[[Benutzer:Dirk|Dirk]] 21:04, 15. Jul 2014 (CET)&lt;/div&gt;</summary>
		<author><name>Dirk NO2</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Oszilloskop_-_Tutorial&amp;diff=24934</id>
		<title>Oszilloskop - Tutorial</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Oszilloskop_-_Tutorial&amp;diff=24934"/>
				<updated>2014-07-18T16:01:38Z</updated>
		
		<summary type="html">&lt;p&gt;Dirk NO2: /* Strahlabgleich */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[bild:Voltcraft 630-2.JPG|right|500px]]&lt;br /&gt;
&lt;br /&gt;
=Allgemein=&lt;br /&gt;
Ein Oszilloskop-Tutorial gehört auch hier im RN-Wissen zu den [[Wunschthemen|Wunsch-Artikeln]]. Es gibt im Netz zwar auch schon gute Tutorials, aber hier soll versucht werden, möglichst einfach an das Thema heran zu gehen. Ich werde mich hauptsächlich mit dem analogen Oszilloskop am Beispiel des [http://www.conrad.de/ce/de/product/122421/VOLTCRAFT-VC-630-2-Analoges-2-Kanal-Oszilloskop-Bandbreite-0-DC-bis-30-MHz Voltcraft 630-2] beschäftigen. Die Bedienelemente dieses Oszilloskops werden sich ähnlich auch bei allen anderen Typen finden.&lt;br /&gt;
&lt;br /&gt;
Ich würde mir wünschen, dass jemand den Abschnitt zum [[Oszilloskop_-_Tutorial#Digital_Oszilloskop|digitalen Oszilloskop]] übernimmt.&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Analog Oszilloskop==&lt;br /&gt;
===Prinzip===&lt;br /&gt;
&lt;br /&gt;
[[bild:Voltcraft 630-2 Schematic.PNG|640px]]&lt;br /&gt;
&lt;br /&gt;
===Bedienelemente===&lt;br /&gt;
[[bild:Voltcraft 630-2 Front.PNG|640px]]&lt;br /&gt;
&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |Nummer&lt;br /&gt;
 |Bezeichnung&lt;br /&gt;
 |Funktion&lt;br /&gt;
 |-&lt;br /&gt;
 |1&lt;br /&gt;
 |CAL&lt;br /&gt;
 |Kalibrierspannung&lt;br /&gt;
 |-&lt;br /&gt;
 |2&lt;br /&gt;
 |INTEN&lt;br /&gt;
 |Helligkeit des Elektronenstrahls&lt;br /&gt;
 |-&lt;br /&gt;
 |3&lt;br /&gt;
 |FOCUS&lt;br /&gt;
 |Fokussierung auf das schärfste Bild&lt;br /&gt;
 |-&lt;br /&gt;
 |4&lt;br /&gt;
 |TRACE ROTATION&lt;br /&gt;
 |Abstimmung der horizontalen Spur mit den Rasterlinien&lt;br /&gt;
 |-&lt;br /&gt;
 |5&lt;br /&gt;
 |LED&lt;br /&gt;
 |Power Anzeige&lt;br /&gt;
 |-&lt;br /&gt;
 |6&lt;br /&gt;
 |POWER&lt;br /&gt;
 |Hauptschalter&lt;br /&gt;
 |-&lt;br /&gt;
 |7&lt;br /&gt;
 |CH1 VOLTS/DIV&lt;br /&gt;
 |CH1 Vertikalachsen-Empfindlichkeit&lt;br /&gt;
 |-&lt;br /&gt;
 |8&lt;br /&gt;
 |CH1 (X)&lt;br /&gt;
 |Vertikaler Eingang für CH1 und X-Achse im X-Y-Betrieb&lt;br /&gt;
 |-&lt;br /&gt;
 |9&lt;br /&gt;
 |CH1 VARIABLE CH1&lt;br /&gt;
 |CH1 Empfindlichkeit Feineinstellung&lt;br /&gt;
 |-&lt;br /&gt;
 |10&lt;br /&gt;
 |CH1 AC-GND-DC&lt;br /&gt;
 |CH1 Vertikalverstärker-Kopplung&lt;br /&gt;
 |-&lt;br /&gt;
 |11&lt;br /&gt;
 |CH1 ^ v POSITION&lt;br /&gt;
 |CH1 Vertikale Positionierung&lt;br /&gt;
 |-&lt;br /&gt;
 |12&lt;br /&gt;
 |ALT/CHOP&lt;br /&gt;
 |Anzeigeart im Zweikanal-Modus&lt;br /&gt;
 |-&lt;br /&gt;
 |13&lt;br /&gt;
 |CH1 DC BAL&lt;br /&gt;
 |CH1 Dämpferabgleich&lt;br /&gt;
 |-&lt;br /&gt;
 |14&lt;br /&gt;
 |VERT MODE&lt;br /&gt;
 |Auswahl der Betriebsart&lt;br /&gt;
 |-&lt;br /&gt;
 |15&lt;br /&gt;
 |GND&lt;br /&gt;
 |Masseanschluss des Gehäuses&lt;br /&gt;
 |-&lt;br /&gt;
 |16&lt;br /&gt;
 |CH2 INV&lt;br /&gt;
 |Eingangssignal von CH2 wird invertiert&lt;br /&gt;
 |-&lt;br /&gt;
 |17&lt;br /&gt;
 |CH2 DC BAL&lt;br /&gt;
 |CH2 Dämpferabgleich&lt;br /&gt;
 |-&lt;br /&gt;
 |18&lt;br /&gt;
 |CH2 AC-GND-DC&lt;br /&gt;
 |CH2 Vertikalverstärker-Kopplung&lt;br /&gt;
 |-&lt;br /&gt;
 |19&lt;br /&gt;
 |CH2 ^ v POSITION&lt;br /&gt;
 |CH2 Vertikale Positionierung&lt;br /&gt;
 |-&lt;br /&gt;
 |20&lt;br /&gt;
 |CH2 (Y)&lt;br /&gt;
 |Vertikaler Eingang für CH2 und Y-Achse im X-Y-Betrieb&lt;br /&gt;
 |-&lt;br /&gt;
 |21&lt;br /&gt;
 |CH2 VARIABLE&lt;br /&gt;
 |CH2 Empfindlichkeit Feineinstellung&lt;br /&gt;
 |-&lt;br /&gt;
 |22&lt;br /&gt;
 |CH2 VOLTS/DIV&lt;br /&gt;
 |CH2 Vertikalachsen-Empfindlichkeit&lt;br /&gt;
 |-&lt;br /&gt;
 |23&lt;br /&gt;
 |SOURCE&lt;br /&gt;
 |Auswahl des externen oder internen Triggersignals&lt;br /&gt;
 |-&lt;br /&gt;
 |24&lt;br /&gt;
 |EXT TRIG IN&lt;br /&gt;
 |Eingangsbuchse für externes Triggersignal&lt;br /&gt;
 |-&lt;br /&gt;
 |25&lt;br /&gt;
 |TRIGGER MODE&lt;br /&gt;
 |Auswahl des Triggermodus&lt;br /&gt;
 |-&lt;br /&gt;
 |26&lt;br /&gt;
 |SLOPE&lt;br /&gt;
 |Auswahl der Triggerflanke&lt;br /&gt;
 |-&lt;br /&gt;
 |27&lt;br /&gt;
 |TRIG.ALT&lt;br /&gt;
 |Internes Triggersignal alterniert zwischen CH1 und CH2&lt;br /&gt;
 |-&lt;br /&gt;
 |28&lt;br /&gt;
 |LEVEL&lt;br /&gt;
 |Bestimmung des Startpunktes für die Wellenform&lt;br /&gt;
 |-&lt;br /&gt;
 |29&lt;br /&gt;
 |TIME/DIV&lt;br /&gt;
 |Wahl der Ablenkzeiten&lt;br /&gt;
 |-&lt;br /&gt;
 |30&lt;br /&gt;
 |SWP.VAR&lt;br /&gt;
 |Feineinstellung der Ablenkzeit&lt;br /&gt;
 |-&lt;br /&gt;
 |31&lt;br /&gt;
 |x10 MAG&lt;br /&gt;
 |Vergrößerung um den Faktor 10&lt;br /&gt;
 |-&lt;br /&gt;
 |32&lt;br /&gt;
 |&amp;lt; &amp;gt; POSITION &lt;br /&gt;
 |Einstellung der horizontalen Position&lt;br /&gt;
 |-&lt;br /&gt;
 |33&lt;br /&gt;
 |FILTER&lt;br /&gt;
 |Filter zum einfachen Ablesen der Wellenformen&lt;br /&gt;
 |-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[bild:Voltcraft 630-2 Rear.PNG|640px]]&lt;br /&gt;
&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |Nummer&lt;br /&gt;
 |Bezeichnung&lt;br /&gt;
 |Funktion&lt;br /&gt;
 |-&lt;br /&gt;
 |34&lt;br /&gt;
 |Z AXIS INPUT&lt;br /&gt;
 |Eingangsbuchse für externes Intensitätsmodulationssignal&lt;br /&gt;
 |-&lt;br /&gt;
 |35&lt;br /&gt;
 |CH1 SIGNAL OUTPUT&lt;br /&gt;
 |CH1 Ausgangssignal für Frequenzmesser&lt;br /&gt;
 |-&lt;br /&gt;
 |36&lt;br /&gt;
 |&lt;br /&gt;
 |Ständer&lt;br /&gt;
 |-&lt;br /&gt;
 |37&lt;br /&gt;
 |&lt;br /&gt;
 |SICHERUNG &amp;amp; Netzspannungswahlschalter&lt;br /&gt;
 |-&lt;br /&gt;
 |38&lt;br /&gt;
 |&lt;br /&gt;
 |AC Eingangsbuchse&lt;br /&gt;
 |-&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
===Grundeinstellungen===&lt;br /&gt;
Wenn man neue Messungen beginnen will, sollte man das Oszilloskop vor dem Einschalten in die Grundeinstellung bringen.&lt;br /&gt;
&lt;br /&gt;
====Einkanal-Betrieb====&lt;br /&gt;
&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |Nummer&lt;br /&gt;
 |Bezeichnung&lt;br /&gt;
 |Einstellung&lt;br /&gt;
 |-&lt;br /&gt;
 |2&lt;br /&gt;
 |INTEN&lt;br /&gt;
 |Mittelstellung&lt;br /&gt;
 |-&lt;br /&gt;
 |3&lt;br /&gt;
 |FOCUS&lt;br /&gt;
 |Mittelstellung&lt;br /&gt;
 |-&lt;br /&gt;
 |7&lt;br /&gt;
 |CH1 VOLTS/DIV&lt;br /&gt;
 |0.5V/DIV&lt;br /&gt;
 |-&lt;br /&gt;
 |9&lt;br /&gt;
 |CH1 VARIABLE&lt;br /&gt;
 |CAL (Position im Uhrzeigersinn)&lt;br /&gt;
 |-&lt;br /&gt;
 |10&lt;br /&gt;
 |CH1 AC-GND-DC&lt;br /&gt;
 |GND&lt;br /&gt;
 |-&lt;br /&gt;
 |11&lt;br /&gt;
 |CH1 ^ v POSITION&lt;br /&gt;
 |Mittelstellung&lt;br /&gt;
 |-&lt;br /&gt;
 |14&lt;br /&gt;
 |VERT MODE&lt;br /&gt;
 |CH1&lt;br /&gt;
 |-&lt;br /&gt;
 |16&lt;br /&gt;
 |CH2 INV&lt;br /&gt;
 |OFF&lt;br /&gt;
 |-&lt;br /&gt;
 |18&lt;br /&gt;
 |CH2 AC-GND-DC&lt;br /&gt;
 |GND&lt;br /&gt;
 |-&lt;br /&gt;
 |19&lt;br /&gt;
 |CH2 ^ v POSITION&lt;br /&gt;
 |Mittelstellung&lt;br /&gt;
 |-&lt;br /&gt;
 |21&lt;br /&gt;
 |CH2 VARIABLE&lt;br /&gt;
 |CAL (Position im Uhrzeigersinn)&lt;br /&gt;
 |-&lt;br /&gt;
 |22&lt;br /&gt;
 |CH2 VOLTS/DIV&lt;br /&gt;
 |0.5V/DIV&lt;br /&gt;
 |-&lt;br /&gt;
 |23&lt;br /&gt;
 |SOURCE&lt;br /&gt;
 |CH1&lt;br /&gt;
 |-&lt;br /&gt;
 |25&lt;br /&gt;
 |TRIGGER MODE&lt;br /&gt;
 |AUTO&lt;br /&gt;
 |-&lt;br /&gt;
 |26&lt;br /&gt;
 |SLOPE&lt;br /&gt;
 | + &lt;br /&gt;
 |-&lt;br /&gt;
 |27&lt;br /&gt;
 |TRIG.ALT&lt;br /&gt;
 |OFF&lt;br /&gt;
 |-&lt;br /&gt;
 |29&lt;br /&gt;
 |TIME/DIV&lt;br /&gt;
 |0.5ms/DIV&lt;br /&gt;
 |-&lt;br /&gt;
 |30&lt;br /&gt;
 |SWP.VAR&lt;br /&gt;
 |CAL&lt;br /&gt;
 |-&lt;br /&gt;
 |31&lt;br /&gt;
 |x10 MAG&lt;br /&gt;
 |OFF&lt;br /&gt;
 |-&lt;br /&gt;
 |32&lt;br /&gt;
 |&amp;lt; &amp;gt; POSITION &lt;br /&gt;
 |Mittelstellung&lt;br /&gt;
 |-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Zweikanal-Betrieb====&lt;br /&gt;
Für den Zweikanal-Betrieb wählt man zunächst alle Einstellungen des [[Oszilloskop_-_Tutorial#Einkanal-Betrieb|Einkanal-Betriebs]].&lt;br /&gt;
&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |Nummer&lt;br /&gt;
 |Bezeichnung&lt;br /&gt;
 |Einstellung&lt;br /&gt;
 |-&lt;br /&gt;
 |14&lt;br /&gt;
 |VERT MODE&lt;br /&gt;
 |DUAL&lt;br /&gt;
 |-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Inbetriebnahme===&lt;br /&gt;
====Power====&lt;br /&gt;
Wenn der Netzspannungswahlschalter (37) einmalig auf die richtige Netzspannung (AC 115V oder 230V) und die Grundeinstellung für den Einkanal- oder Zweikanal-Betrieb eingestellt wurde, kann das Oszilloskop mit dem Hauptschalter (6) eingeschaltet werden. Die POWER LED (5) leuchtet auf.&lt;br /&gt;
&lt;br /&gt;
====Strahlabgleich====&lt;br /&gt;
Nach dem [[Oszilloskop_-_Tutorial#Power|Einschalten]] des Oszilloskops in der Grundstellung &amp;quot;[[Oszilloskop_-_Tutorial#Einkanal-Betrieb|Einkanal-Betrieb]]&amp;quot; sollte nach höchstens 20 Sekunden die horizontale Strahllinie auf dem Bildschirm erscheinen. Ist dies nicht der Fall, dann zunächst den INTEN Helligkeits-Regler (2) weiter nach rechts drehen bis die Linie erscheint. Gut eingestellt ist die '''Helligkeit''', wenn die Linie deutlich zu erkennen aber nicht überstrahlt ist.&lt;br /&gt;
&lt;br /&gt;
Sieht die Strahllinie nicht scharf begrenzt aus, kann man die '''Schärfe''' noch mit dem FOCUS Regler (3) optimal einstellen. Dies ist der Fall, wenn die Linie möglichst dünn aussieht.&lt;br /&gt;
&lt;br /&gt;
Nun sollte die Strahllinie noch richtig ausgerichtet werden:&lt;br /&gt;
* '''Vertikale Lage:''' Die Strahllinie mit dem CH1 ^v POSITION Regler (11) mit der mittleren horizontalen Rasterlinie in Deckung bringen.&lt;br /&gt;
* '''Horizontale Lage:''' Die Strahllinie mit dem &amp;lt;&amp;gt; POSITION Regler (32) so in die Mitte des Bildschirms legen, dass das Strahlende rechts und links nicht mehr sichtbar ist.&lt;br /&gt;
* '''Rotation:''' Wenn der Strahl nicht parallel zur mittleren horizontalen Rasterlinie verläuft, sondern sie in einem Winkel kreuzt, dann muss die Strahl-Rotation noch eingestellt werden. Mit einem kleinen Schlitz-Schraubendreher stellt man die Rotation vorsichtig am Regler TRACE ROTATION (4) ein. Diese Einstellung muss man i.d.R. nur einmalig vornehmen und nicht bei jeder Inbetriebnahme.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Digital Oszilloskop==&lt;br /&gt;
Wer möchte diesen Abschnitt übernehmen?&lt;br /&gt;
&lt;br /&gt;
===Prinzip===&lt;br /&gt;
===Bedienelemente===&lt;br /&gt;
===Grundeinstellungen===&lt;br /&gt;
====Einkanal-Betrieb====&lt;br /&gt;
====Zweikanal-Betrieb====&lt;br /&gt;
===Inbetriebnahme===&lt;br /&gt;
====Power====&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Grundlagen]]	 &lt;br /&gt;
[[Kategorie:Praxis]]&lt;br /&gt;
[[Kategorie:Elektronik]]&lt;br /&gt;
&lt;br /&gt;
=Autoren=&lt;br /&gt;
--[[Benutzer:Dirk|Dirk]] 21:04, 15. Jul 2014 (CET)&lt;/div&gt;</summary>
		<author><name>Dirk NO2</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Oszilloskop_-_Tutorial&amp;diff=24933</id>
		<title>Oszilloskop - Tutorial</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Oszilloskop_-_Tutorial&amp;diff=24933"/>
				<updated>2014-07-18T15:58:39Z</updated>
		
		<summary type="html">&lt;p&gt;Dirk NO2: /* Strahlabgleich */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[bild:Voltcraft 630-2.JPG|right|500px]]&lt;br /&gt;
&lt;br /&gt;
=Allgemein=&lt;br /&gt;
Ein Oszilloskop-Tutorial gehört auch hier im RN-Wissen zu den [[Wunschthemen|Wunsch-Artikeln]]. Es gibt im Netz zwar auch schon gute Tutorials, aber hier soll versucht werden, möglichst einfach an das Thema heran zu gehen. Ich werde mich hauptsächlich mit dem analogen Oszilloskop am Beispiel des [http://www.conrad.de/ce/de/product/122421/VOLTCRAFT-VC-630-2-Analoges-2-Kanal-Oszilloskop-Bandbreite-0-DC-bis-30-MHz Voltcraft 630-2] beschäftigen. Die Bedienelemente dieses Oszilloskops werden sich ähnlich auch bei allen anderen Typen finden.&lt;br /&gt;
&lt;br /&gt;
Ich würde mir wünschen, dass jemand den Abschnitt zum [[Oszilloskop_-_Tutorial#Digital_Oszilloskop|digitalen Oszilloskop]] übernimmt.&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Analog Oszilloskop==&lt;br /&gt;
===Prinzip===&lt;br /&gt;
&lt;br /&gt;
[[bild:Voltcraft 630-2 Schematic.PNG|640px]]&lt;br /&gt;
&lt;br /&gt;
===Bedienelemente===&lt;br /&gt;
[[bild:Voltcraft 630-2 Front.PNG|640px]]&lt;br /&gt;
&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |Nummer&lt;br /&gt;
 |Bezeichnung&lt;br /&gt;
 |Funktion&lt;br /&gt;
 |-&lt;br /&gt;
 |1&lt;br /&gt;
 |CAL&lt;br /&gt;
 |Kalibrierspannung&lt;br /&gt;
 |-&lt;br /&gt;
 |2&lt;br /&gt;
 |INTEN&lt;br /&gt;
 |Helligkeit des Elektronenstrahls&lt;br /&gt;
 |-&lt;br /&gt;
 |3&lt;br /&gt;
 |FOCUS&lt;br /&gt;
 |Fokussierung auf das schärfste Bild&lt;br /&gt;
 |-&lt;br /&gt;
 |4&lt;br /&gt;
 |TRACE ROTATION&lt;br /&gt;
 |Abstimmung der horizontalen Spur mit den Rasterlinien&lt;br /&gt;
 |-&lt;br /&gt;
 |5&lt;br /&gt;
 |LED&lt;br /&gt;
 |Power Anzeige&lt;br /&gt;
 |-&lt;br /&gt;
 |6&lt;br /&gt;
 |POWER&lt;br /&gt;
 |Hauptschalter&lt;br /&gt;
 |-&lt;br /&gt;
 |7&lt;br /&gt;
 |CH1 VOLTS/DIV&lt;br /&gt;
 |CH1 Vertikalachsen-Empfindlichkeit&lt;br /&gt;
 |-&lt;br /&gt;
 |8&lt;br /&gt;
 |CH1 (X)&lt;br /&gt;
 |Vertikaler Eingang für CH1 und X-Achse im X-Y-Betrieb&lt;br /&gt;
 |-&lt;br /&gt;
 |9&lt;br /&gt;
 |CH1 VARIABLE CH1&lt;br /&gt;
 |CH1 Empfindlichkeit Feineinstellung&lt;br /&gt;
 |-&lt;br /&gt;
 |10&lt;br /&gt;
 |CH1 AC-GND-DC&lt;br /&gt;
 |CH1 Vertikalverstärker-Kopplung&lt;br /&gt;
 |-&lt;br /&gt;
 |11&lt;br /&gt;
 |CH1 ^ v POSITION&lt;br /&gt;
 |CH1 Vertikale Positionierung&lt;br /&gt;
 |-&lt;br /&gt;
 |12&lt;br /&gt;
 |ALT/CHOP&lt;br /&gt;
 |Anzeigeart im Zweikanal-Modus&lt;br /&gt;
 |-&lt;br /&gt;
 |13&lt;br /&gt;
 |CH1 DC BAL&lt;br /&gt;
 |CH1 Dämpferabgleich&lt;br /&gt;
 |-&lt;br /&gt;
 |14&lt;br /&gt;
 |VERT MODE&lt;br /&gt;
 |Auswahl der Betriebsart&lt;br /&gt;
 |-&lt;br /&gt;
 |15&lt;br /&gt;
 |GND&lt;br /&gt;
 |Masseanschluss des Gehäuses&lt;br /&gt;
 |-&lt;br /&gt;
 |16&lt;br /&gt;
 |CH2 INV&lt;br /&gt;
 |Eingangssignal von CH2 wird invertiert&lt;br /&gt;
 |-&lt;br /&gt;
 |17&lt;br /&gt;
 |CH2 DC BAL&lt;br /&gt;
 |CH2 Dämpferabgleich&lt;br /&gt;
 |-&lt;br /&gt;
 |18&lt;br /&gt;
 |CH2 AC-GND-DC&lt;br /&gt;
 |CH2 Vertikalverstärker-Kopplung&lt;br /&gt;
 |-&lt;br /&gt;
 |19&lt;br /&gt;
 |CH2 ^ v POSITION&lt;br /&gt;
 |CH2 Vertikale Positionierung&lt;br /&gt;
 |-&lt;br /&gt;
 |20&lt;br /&gt;
 |CH2 (Y)&lt;br /&gt;
 |Vertikaler Eingang für CH2 und Y-Achse im X-Y-Betrieb&lt;br /&gt;
 |-&lt;br /&gt;
 |21&lt;br /&gt;
 |CH2 VARIABLE&lt;br /&gt;
 |CH2 Empfindlichkeit Feineinstellung&lt;br /&gt;
 |-&lt;br /&gt;
 |22&lt;br /&gt;
 |CH2 VOLTS/DIV&lt;br /&gt;
 |CH2 Vertikalachsen-Empfindlichkeit&lt;br /&gt;
 |-&lt;br /&gt;
 |23&lt;br /&gt;
 |SOURCE&lt;br /&gt;
 |Auswahl des externen oder internen Triggersignals&lt;br /&gt;
 |-&lt;br /&gt;
 |24&lt;br /&gt;
 |EXT TRIG IN&lt;br /&gt;
 |Eingangsbuchse für externes Triggersignal&lt;br /&gt;
 |-&lt;br /&gt;
 |25&lt;br /&gt;
 |TRIGGER MODE&lt;br /&gt;
 |Auswahl des Triggermodus&lt;br /&gt;
 |-&lt;br /&gt;
 |26&lt;br /&gt;
 |SLOPE&lt;br /&gt;
 |Auswahl der Triggerflanke&lt;br /&gt;
 |-&lt;br /&gt;
 |27&lt;br /&gt;
 |TRIG.ALT&lt;br /&gt;
 |Internes Triggersignal alterniert zwischen CH1 und CH2&lt;br /&gt;
 |-&lt;br /&gt;
 |28&lt;br /&gt;
 |LEVEL&lt;br /&gt;
 |Bestimmung des Startpunktes für die Wellenform&lt;br /&gt;
 |-&lt;br /&gt;
 |29&lt;br /&gt;
 |TIME/DIV&lt;br /&gt;
 |Wahl der Ablenkzeiten&lt;br /&gt;
 |-&lt;br /&gt;
 |30&lt;br /&gt;
 |SWP.VAR&lt;br /&gt;
 |Feineinstellung der Ablenkzeit&lt;br /&gt;
 |-&lt;br /&gt;
 |31&lt;br /&gt;
 |x10 MAG&lt;br /&gt;
 |Vergrößerung um den Faktor 10&lt;br /&gt;
 |-&lt;br /&gt;
 |32&lt;br /&gt;
 |&amp;lt; &amp;gt; POSITION &lt;br /&gt;
 |Einstellung der horizontalen Position&lt;br /&gt;
 |-&lt;br /&gt;
 |33&lt;br /&gt;
 |FILTER&lt;br /&gt;
 |Filter zum einfachen Ablesen der Wellenformen&lt;br /&gt;
 |-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[bild:Voltcraft 630-2 Rear.PNG|640px]]&lt;br /&gt;
&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |Nummer&lt;br /&gt;
 |Bezeichnung&lt;br /&gt;
 |Funktion&lt;br /&gt;
 |-&lt;br /&gt;
 |34&lt;br /&gt;
 |Z AXIS INPUT&lt;br /&gt;
 |Eingangsbuchse für externes Intensitätsmodulationssignal&lt;br /&gt;
 |-&lt;br /&gt;
 |35&lt;br /&gt;
 |CH1 SIGNAL OUTPUT&lt;br /&gt;
 |CH1 Ausgangssignal für Frequenzmesser&lt;br /&gt;
 |-&lt;br /&gt;
 |36&lt;br /&gt;
 |&lt;br /&gt;
 |Ständer&lt;br /&gt;
 |-&lt;br /&gt;
 |37&lt;br /&gt;
 |&lt;br /&gt;
 |SICHERUNG &amp;amp; Netzspannungswahlschalter&lt;br /&gt;
 |-&lt;br /&gt;
 |38&lt;br /&gt;
 |&lt;br /&gt;
 |AC Eingangsbuchse&lt;br /&gt;
 |-&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
===Grundeinstellungen===&lt;br /&gt;
Wenn man neue Messungen beginnen will, sollte man das Oszilloskop vor dem Einschalten in die Grundeinstellung bringen.&lt;br /&gt;
&lt;br /&gt;
====Einkanal-Betrieb====&lt;br /&gt;
&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |Nummer&lt;br /&gt;
 |Bezeichnung&lt;br /&gt;
 |Einstellung&lt;br /&gt;
 |-&lt;br /&gt;
 |2&lt;br /&gt;
 |INTEN&lt;br /&gt;
 |Mittelstellung&lt;br /&gt;
 |-&lt;br /&gt;
 |3&lt;br /&gt;
 |FOCUS&lt;br /&gt;
 |Mittelstellung&lt;br /&gt;
 |-&lt;br /&gt;
 |7&lt;br /&gt;
 |CH1 VOLTS/DIV&lt;br /&gt;
 |0.5V/DIV&lt;br /&gt;
 |-&lt;br /&gt;
 |9&lt;br /&gt;
 |CH1 VARIABLE&lt;br /&gt;
 |CAL (Position im Uhrzeigersinn)&lt;br /&gt;
 |-&lt;br /&gt;
 |10&lt;br /&gt;
 |CH1 AC-GND-DC&lt;br /&gt;
 |GND&lt;br /&gt;
 |-&lt;br /&gt;
 |11&lt;br /&gt;
 |CH1 ^ v POSITION&lt;br /&gt;
 |Mittelstellung&lt;br /&gt;
 |-&lt;br /&gt;
 |14&lt;br /&gt;
 |VERT MODE&lt;br /&gt;
 |CH1&lt;br /&gt;
 |-&lt;br /&gt;
 |16&lt;br /&gt;
 |CH2 INV&lt;br /&gt;
 |OFF&lt;br /&gt;
 |-&lt;br /&gt;
 |18&lt;br /&gt;
 |CH2 AC-GND-DC&lt;br /&gt;
 |GND&lt;br /&gt;
 |-&lt;br /&gt;
 |19&lt;br /&gt;
 |CH2 ^ v POSITION&lt;br /&gt;
 |Mittelstellung&lt;br /&gt;
 |-&lt;br /&gt;
 |21&lt;br /&gt;
 |CH2 VARIABLE&lt;br /&gt;
 |CAL (Position im Uhrzeigersinn)&lt;br /&gt;
 |-&lt;br /&gt;
 |22&lt;br /&gt;
 |CH2 VOLTS/DIV&lt;br /&gt;
 |0.5V/DIV&lt;br /&gt;
 |-&lt;br /&gt;
 |23&lt;br /&gt;
 |SOURCE&lt;br /&gt;
 |CH1&lt;br /&gt;
 |-&lt;br /&gt;
 |25&lt;br /&gt;
 |TRIGGER MODE&lt;br /&gt;
 |AUTO&lt;br /&gt;
 |-&lt;br /&gt;
 |26&lt;br /&gt;
 |SLOPE&lt;br /&gt;
 | + &lt;br /&gt;
 |-&lt;br /&gt;
 |27&lt;br /&gt;
 |TRIG.ALT&lt;br /&gt;
 |OFF&lt;br /&gt;
 |-&lt;br /&gt;
 |29&lt;br /&gt;
 |TIME/DIV&lt;br /&gt;
 |0.5ms/DIV&lt;br /&gt;
 |-&lt;br /&gt;
 |30&lt;br /&gt;
 |SWP.VAR&lt;br /&gt;
 |CAL&lt;br /&gt;
 |-&lt;br /&gt;
 |31&lt;br /&gt;
 |x10 MAG&lt;br /&gt;
 |OFF&lt;br /&gt;
 |-&lt;br /&gt;
 |32&lt;br /&gt;
 |&amp;lt; &amp;gt; POSITION &lt;br /&gt;
 |Mittelstellung&lt;br /&gt;
 |-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Zweikanal-Betrieb====&lt;br /&gt;
Für den Zweikanal-Betrieb wählt man zunächst alle Einstellungen des [[Oszilloskop_-_Tutorial#Einkanal-Betrieb|Einkanal-Betriebs]].&lt;br /&gt;
&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |Nummer&lt;br /&gt;
 |Bezeichnung&lt;br /&gt;
 |Einstellung&lt;br /&gt;
 |-&lt;br /&gt;
 |14&lt;br /&gt;
 |VERT MODE&lt;br /&gt;
 |DUAL&lt;br /&gt;
 |-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Inbetriebnahme===&lt;br /&gt;
====Power====&lt;br /&gt;
Wenn der Netzspannungswahlschalter (37) einmalig auf die richtige Netzspannung (AC 115V oder 230V) und die Grundeinstellung für den Einkanal- oder Zweikanal-Betrieb eingestellt wurde, kann das Oszilloskop mit dem Hauptschalter (6) eingeschaltet werden. Die POWER LED (5) leuchtet auf.&lt;br /&gt;
&lt;br /&gt;
====Strahlabgleich====&lt;br /&gt;
Nach dem [[Oszilloskop_-_Tutorial#Power|Einschalten]] des Oszilloskops in der Grundstellung &amp;quot;[[Oszilloskop_-_Tutorial#Einkanal-Betrieb|Einkanal-Betrieb]]&amp;quot; sollte nach höchstens 20 Sekunden die horizontale Strahllinie auf dem Bildschirm erscheinen. Ist dies nicht der Fall, dann zunächst den INTEN Helligkeits-Regler (2) weiter nach rechts drehen bis die Linie erscheint. Gut eingestellt ist die '''Helligkeit''', wenn die Linie deutlich zu erkennen aber nicht überstrahlt ist.&lt;br /&gt;
&lt;br /&gt;
Sieht die Strahllinie nicht scharf begrenzt aus, kann man die '''Schärfe''' noch mit dem FOCUS Regler (3) optimal einstellen. Dies ist der Fall, wenn die Linie möglichst dünn aussieht.&lt;br /&gt;
&lt;br /&gt;
Nun sollte die Strahllinie noch richtig ausgerichtet werden:&lt;br /&gt;
* '''Horizontale Lage:''' Die Strahllinie mit dem CH1 ^v POSITION Regler (11) mit der mittleren horizontalen Rasterlinie in Deckung bringen.&lt;br /&gt;
* '''Vertikale Lage:''' Die Strahllinie mit dem &amp;lt;&amp;gt; POSITION Regler (32) so in die Mitte des Bildschirms legen, dass das Strahlende rechts und links nicht mehr sichtbar ist.&lt;br /&gt;
* '''Rotation:''' Wenn der Strahl nicht parallel zur mittleren horizontalen Rasterlinie verläuft, sondern sie in einem Winkel kreuzt, dann muss die Strahl-Rotation noch eingestellt werden. Mit einem kleinen Schlitz-Schraubendreher stellt man die Rotation vorsichtig am Regler TRACE ROTATION (4) ein. Diese Einstellung muss man i.d.R. nur einmalig vornehmen und nicht bei jeder Inbetriebnahme.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Digital Oszilloskop==&lt;br /&gt;
Wer möchte diesen Abschnitt übernehmen?&lt;br /&gt;
&lt;br /&gt;
===Prinzip===&lt;br /&gt;
===Bedienelemente===&lt;br /&gt;
===Grundeinstellungen===&lt;br /&gt;
====Einkanal-Betrieb====&lt;br /&gt;
====Zweikanal-Betrieb====&lt;br /&gt;
===Inbetriebnahme===&lt;br /&gt;
====Power====&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Grundlagen]]	 &lt;br /&gt;
[[Kategorie:Praxis]]&lt;br /&gt;
[[Kategorie:Elektronik]]&lt;br /&gt;
&lt;br /&gt;
=Autoren=&lt;br /&gt;
--[[Benutzer:Dirk|Dirk]] 21:04, 15. Jul 2014 (CET)&lt;/div&gt;</summary>
		<author><name>Dirk NO2</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Oszilloskop_-_Tutorial&amp;diff=24932</id>
		<title>Oszilloskop - Tutorial</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Oszilloskop_-_Tutorial&amp;diff=24932"/>
				<updated>2014-07-18T15:57:54Z</updated>
		
		<summary type="html">&lt;p&gt;Dirk NO2: /* Strahlabgleich */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[bild:Voltcraft 630-2.JPG|right|500px]]&lt;br /&gt;
&lt;br /&gt;
=Allgemein=&lt;br /&gt;
Ein Oszilloskop-Tutorial gehört auch hier im RN-Wissen zu den [[Wunschthemen|Wunsch-Artikeln]]. Es gibt im Netz zwar auch schon gute Tutorials, aber hier soll versucht werden, möglichst einfach an das Thema heran zu gehen. Ich werde mich hauptsächlich mit dem analogen Oszilloskop am Beispiel des [http://www.conrad.de/ce/de/product/122421/VOLTCRAFT-VC-630-2-Analoges-2-Kanal-Oszilloskop-Bandbreite-0-DC-bis-30-MHz Voltcraft 630-2] beschäftigen. Die Bedienelemente dieses Oszilloskops werden sich ähnlich auch bei allen anderen Typen finden.&lt;br /&gt;
&lt;br /&gt;
Ich würde mir wünschen, dass jemand den Abschnitt zum [[Oszilloskop_-_Tutorial#Digital_Oszilloskop|digitalen Oszilloskop]] übernimmt.&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Analog Oszilloskop==&lt;br /&gt;
===Prinzip===&lt;br /&gt;
&lt;br /&gt;
[[bild:Voltcraft 630-2 Schematic.PNG|640px]]&lt;br /&gt;
&lt;br /&gt;
===Bedienelemente===&lt;br /&gt;
[[bild:Voltcraft 630-2 Front.PNG|640px]]&lt;br /&gt;
&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |Nummer&lt;br /&gt;
 |Bezeichnung&lt;br /&gt;
 |Funktion&lt;br /&gt;
 |-&lt;br /&gt;
 |1&lt;br /&gt;
 |CAL&lt;br /&gt;
 |Kalibrierspannung&lt;br /&gt;
 |-&lt;br /&gt;
 |2&lt;br /&gt;
 |INTEN&lt;br /&gt;
 |Helligkeit des Elektronenstrahls&lt;br /&gt;
 |-&lt;br /&gt;
 |3&lt;br /&gt;
 |FOCUS&lt;br /&gt;
 |Fokussierung auf das schärfste Bild&lt;br /&gt;
 |-&lt;br /&gt;
 |4&lt;br /&gt;
 |TRACE ROTATION&lt;br /&gt;
 |Abstimmung der horizontalen Spur mit den Rasterlinien&lt;br /&gt;
 |-&lt;br /&gt;
 |5&lt;br /&gt;
 |LED&lt;br /&gt;
 |Power Anzeige&lt;br /&gt;
 |-&lt;br /&gt;
 |6&lt;br /&gt;
 |POWER&lt;br /&gt;
 |Hauptschalter&lt;br /&gt;
 |-&lt;br /&gt;
 |7&lt;br /&gt;
 |CH1 VOLTS/DIV&lt;br /&gt;
 |CH1 Vertikalachsen-Empfindlichkeit&lt;br /&gt;
 |-&lt;br /&gt;
 |8&lt;br /&gt;
 |CH1 (X)&lt;br /&gt;
 |Vertikaler Eingang für CH1 und X-Achse im X-Y-Betrieb&lt;br /&gt;
 |-&lt;br /&gt;
 |9&lt;br /&gt;
 |CH1 VARIABLE CH1&lt;br /&gt;
 |CH1 Empfindlichkeit Feineinstellung&lt;br /&gt;
 |-&lt;br /&gt;
 |10&lt;br /&gt;
 |CH1 AC-GND-DC&lt;br /&gt;
 |CH1 Vertikalverstärker-Kopplung&lt;br /&gt;
 |-&lt;br /&gt;
 |11&lt;br /&gt;
 |CH1 ^ v POSITION&lt;br /&gt;
 |CH1 Vertikale Positionierung&lt;br /&gt;
 |-&lt;br /&gt;
 |12&lt;br /&gt;
 |ALT/CHOP&lt;br /&gt;
 |Anzeigeart im Zweikanal-Modus&lt;br /&gt;
 |-&lt;br /&gt;
 |13&lt;br /&gt;
 |CH1 DC BAL&lt;br /&gt;
 |CH1 Dämpferabgleich&lt;br /&gt;
 |-&lt;br /&gt;
 |14&lt;br /&gt;
 |VERT MODE&lt;br /&gt;
 |Auswahl der Betriebsart&lt;br /&gt;
 |-&lt;br /&gt;
 |15&lt;br /&gt;
 |GND&lt;br /&gt;
 |Masseanschluss des Gehäuses&lt;br /&gt;
 |-&lt;br /&gt;
 |16&lt;br /&gt;
 |CH2 INV&lt;br /&gt;
 |Eingangssignal von CH2 wird invertiert&lt;br /&gt;
 |-&lt;br /&gt;
 |17&lt;br /&gt;
 |CH2 DC BAL&lt;br /&gt;
 |CH2 Dämpferabgleich&lt;br /&gt;
 |-&lt;br /&gt;
 |18&lt;br /&gt;
 |CH2 AC-GND-DC&lt;br /&gt;
 |CH2 Vertikalverstärker-Kopplung&lt;br /&gt;
 |-&lt;br /&gt;
 |19&lt;br /&gt;
 |CH2 ^ v POSITION&lt;br /&gt;
 |CH2 Vertikale Positionierung&lt;br /&gt;
 |-&lt;br /&gt;
 |20&lt;br /&gt;
 |CH2 (Y)&lt;br /&gt;
 |Vertikaler Eingang für CH2 und Y-Achse im X-Y-Betrieb&lt;br /&gt;
 |-&lt;br /&gt;
 |21&lt;br /&gt;
 |CH2 VARIABLE&lt;br /&gt;
 |CH2 Empfindlichkeit Feineinstellung&lt;br /&gt;
 |-&lt;br /&gt;
 |22&lt;br /&gt;
 |CH2 VOLTS/DIV&lt;br /&gt;
 |CH2 Vertikalachsen-Empfindlichkeit&lt;br /&gt;
 |-&lt;br /&gt;
 |23&lt;br /&gt;
 |SOURCE&lt;br /&gt;
 |Auswahl des externen oder internen Triggersignals&lt;br /&gt;
 |-&lt;br /&gt;
 |24&lt;br /&gt;
 |EXT TRIG IN&lt;br /&gt;
 |Eingangsbuchse für externes Triggersignal&lt;br /&gt;
 |-&lt;br /&gt;
 |25&lt;br /&gt;
 |TRIGGER MODE&lt;br /&gt;
 |Auswahl des Triggermodus&lt;br /&gt;
 |-&lt;br /&gt;
 |26&lt;br /&gt;
 |SLOPE&lt;br /&gt;
 |Auswahl der Triggerflanke&lt;br /&gt;
 |-&lt;br /&gt;
 |27&lt;br /&gt;
 |TRIG.ALT&lt;br /&gt;
 |Internes Triggersignal alterniert zwischen CH1 und CH2&lt;br /&gt;
 |-&lt;br /&gt;
 |28&lt;br /&gt;
 |LEVEL&lt;br /&gt;
 |Bestimmung des Startpunktes für die Wellenform&lt;br /&gt;
 |-&lt;br /&gt;
 |29&lt;br /&gt;
 |TIME/DIV&lt;br /&gt;
 |Wahl der Ablenkzeiten&lt;br /&gt;
 |-&lt;br /&gt;
 |30&lt;br /&gt;
 |SWP.VAR&lt;br /&gt;
 |Feineinstellung der Ablenkzeit&lt;br /&gt;
 |-&lt;br /&gt;
 |31&lt;br /&gt;
 |x10 MAG&lt;br /&gt;
 |Vergrößerung um den Faktor 10&lt;br /&gt;
 |-&lt;br /&gt;
 |32&lt;br /&gt;
 |&amp;lt; &amp;gt; POSITION &lt;br /&gt;
 |Einstellung der horizontalen Position&lt;br /&gt;
 |-&lt;br /&gt;
 |33&lt;br /&gt;
 |FILTER&lt;br /&gt;
 |Filter zum einfachen Ablesen der Wellenformen&lt;br /&gt;
 |-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[bild:Voltcraft 630-2 Rear.PNG|640px]]&lt;br /&gt;
&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |Nummer&lt;br /&gt;
 |Bezeichnung&lt;br /&gt;
 |Funktion&lt;br /&gt;
 |-&lt;br /&gt;
 |34&lt;br /&gt;
 |Z AXIS INPUT&lt;br /&gt;
 |Eingangsbuchse für externes Intensitätsmodulationssignal&lt;br /&gt;
 |-&lt;br /&gt;
 |35&lt;br /&gt;
 |CH1 SIGNAL OUTPUT&lt;br /&gt;
 |CH1 Ausgangssignal für Frequenzmesser&lt;br /&gt;
 |-&lt;br /&gt;
 |36&lt;br /&gt;
 |&lt;br /&gt;
 |Ständer&lt;br /&gt;
 |-&lt;br /&gt;
 |37&lt;br /&gt;
 |&lt;br /&gt;
 |SICHERUNG &amp;amp; Netzspannungswahlschalter&lt;br /&gt;
 |-&lt;br /&gt;
 |38&lt;br /&gt;
 |&lt;br /&gt;
 |AC Eingangsbuchse&lt;br /&gt;
 |-&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
===Grundeinstellungen===&lt;br /&gt;
Wenn man neue Messungen beginnen will, sollte man das Oszilloskop vor dem Einschalten in die Grundeinstellung bringen.&lt;br /&gt;
&lt;br /&gt;
====Einkanal-Betrieb====&lt;br /&gt;
&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |Nummer&lt;br /&gt;
 |Bezeichnung&lt;br /&gt;
 |Einstellung&lt;br /&gt;
 |-&lt;br /&gt;
 |2&lt;br /&gt;
 |INTEN&lt;br /&gt;
 |Mittelstellung&lt;br /&gt;
 |-&lt;br /&gt;
 |3&lt;br /&gt;
 |FOCUS&lt;br /&gt;
 |Mittelstellung&lt;br /&gt;
 |-&lt;br /&gt;
 |7&lt;br /&gt;
 |CH1 VOLTS/DIV&lt;br /&gt;
 |0.5V/DIV&lt;br /&gt;
 |-&lt;br /&gt;
 |9&lt;br /&gt;
 |CH1 VARIABLE&lt;br /&gt;
 |CAL (Position im Uhrzeigersinn)&lt;br /&gt;
 |-&lt;br /&gt;
 |10&lt;br /&gt;
 |CH1 AC-GND-DC&lt;br /&gt;
 |GND&lt;br /&gt;
 |-&lt;br /&gt;
 |11&lt;br /&gt;
 |CH1 ^ v POSITION&lt;br /&gt;
 |Mittelstellung&lt;br /&gt;
 |-&lt;br /&gt;
 |14&lt;br /&gt;
 |VERT MODE&lt;br /&gt;
 |CH1&lt;br /&gt;
 |-&lt;br /&gt;
 |16&lt;br /&gt;
 |CH2 INV&lt;br /&gt;
 |OFF&lt;br /&gt;
 |-&lt;br /&gt;
 |18&lt;br /&gt;
 |CH2 AC-GND-DC&lt;br /&gt;
 |GND&lt;br /&gt;
 |-&lt;br /&gt;
 |19&lt;br /&gt;
 |CH2 ^ v POSITION&lt;br /&gt;
 |Mittelstellung&lt;br /&gt;
 |-&lt;br /&gt;
 |21&lt;br /&gt;
 |CH2 VARIABLE&lt;br /&gt;
 |CAL (Position im Uhrzeigersinn)&lt;br /&gt;
 |-&lt;br /&gt;
 |22&lt;br /&gt;
 |CH2 VOLTS/DIV&lt;br /&gt;
 |0.5V/DIV&lt;br /&gt;
 |-&lt;br /&gt;
 |23&lt;br /&gt;
 |SOURCE&lt;br /&gt;
 |CH1&lt;br /&gt;
 |-&lt;br /&gt;
 |25&lt;br /&gt;
 |TRIGGER MODE&lt;br /&gt;
 |AUTO&lt;br /&gt;
 |-&lt;br /&gt;
 |26&lt;br /&gt;
 |SLOPE&lt;br /&gt;
 | + &lt;br /&gt;
 |-&lt;br /&gt;
 |27&lt;br /&gt;
 |TRIG.ALT&lt;br /&gt;
 |OFF&lt;br /&gt;
 |-&lt;br /&gt;
 |29&lt;br /&gt;
 |TIME/DIV&lt;br /&gt;
 |0.5ms/DIV&lt;br /&gt;
 |-&lt;br /&gt;
 |30&lt;br /&gt;
 |SWP.VAR&lt;br /&gt;
 |CAL&lt;br /&gt;
 |-&lt;br /&gt;
 |31&lt;br /&gt;
 |x10 MAG&lt;br /&gt;
 |OFF&lt;br /&gt;
 |-&lt;br /&gt;
 |32&lt;br /&gt;
 |&amp;lt; &amp;gt; POSITION &lt;br /&gt;
 |Mittelstellung&lt;br /&gt;
 |-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Zweikanal-Betrieb====&lt;br /&gt;
Für den Zweikanal-Betrieb wählt man zunächst alle Einstellungen des [[Oszilloskop_-_Tutorial#Einkanal-Betrieb|Einkanal-Betriebs]].&lt;br /&gt;
&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |Nummer&lt;br /&gt;
 |Bezeichnung&lt;br /&gt;
 |Einstellung&lt;br /&gt;
 |-&lt;br /&gt;
 |14&lt;br /&gt;
 |VERT MODE&lt;br /&gt;
 |DUAL&lt;br /&gt;
 |-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Inbetriebnahme===&lt;br /&gt;
====Power====&lt;br /&gt;
Wenn der Netzspannungswahlschalter (37) einmalig auf die richtige Netzspannung (AC 115V oder 230V) und die Grundeinstellung für den Einkanal- oder Zweikanal-Betrieb eingestellt wurde, kann das Oszilloskop mit dem Hauptschalter (6) eingeschaltet werden. Die POWER LED (5) leuchtet auf.&lt;br /&gt;
&lt;br /&gt;
====Strahlabgleich====&lt;br /&gt;
Nach dem [[Oszilloskop_-_Tutorial#Power|Einschalten]] des Oszilloskops in der Grundstellung &amp;quot;[[Oszilloskop_-_Tutorial#Einkanal-Betrieb|Einkanal-Betrieb]]&amp;quot; sollte nach höchstens 20 Sekunden die horizontale Strahllinie auf dem Bildschirm erscheinen. Ist dies nicht der Fall, dann zunächst den INTEN Helligkeits-Regler (2) weiter nach rechts drehen bis die Linie erscheint. Gut eingestellt ist die '''Helligkeit''', wenn die Linie deutlich zu erkennen aber nicht überstrahlt ist.&lt;br /&gt;
&lt;br /&gt;
Sieht die Strahllinie nicht scharf begrenzt aus, kann man die '''Schärfe''' noch mit dem FOCUS Regler (3) optimal einstellen. Dies ist der Fall, wenn die Linie möglichst dünn aussieht.&lt;br /&gt;
&lt;br /&gt;
Nun sollte die Strahllinie noch richtig ausgerichtet werden:&lt;br /&gt;
* '''Horizontale Lage:''' Die Strahllinie mit dem CH1 ^v POSITION Regler (11) mit der mittleren Rasterlinie in Deckung bringen.&lt;br /&gt;
* '''Vertikale Lage:''' Die Strahllinie mit dem &amp;lt;&amp;gt; POSITION Regler (32) so in die Mitte des Bildschirms legen, dass das Strahlende rechts und links nicht mehr sichtbar ist.&lt;br /&gt;
* '''Rotation:''' Wenn der Strahl nicht parallel zur mittleren Rasterlinie verläuft, sondern sie in einem Winkel kreuzt, dann muss die Strahl-Rotation noch eingestellt werden. Mit einem kleinen Schlitz-Schraubendreher stellt man die Rotation vorsichtig am Regler TRACE ROTATION (4) ein. Diese Einstellung muss man i.d.R. nur einmalig vornehmen und nicht bei jeder Inbetriebnahme.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Digital Oszilloskop==&lt;br /&gt;
Wer möchte diesen Abschnitt übernehmen?&lt;br /&gt;
&lt;br /&gt;
===Prinzip===&lt;br /&gt;
===Bedienelemente===&lt;br /&gt;
===Grundeinstellungen===&lt;br /&gt;
====Einkanal-Betrieb====&lt;br /&gt;
====Zweikanal-Betrieb====&lt;br /&gt;
===Inbetriebnahme===&lt;br /&gt;
====Power====&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Grundlagen]]	 &lt;br /&gt;
[[Kategorie:Praxis]]&lt;br /&gt;
[[Kategorie:Elektronik]]&lt;br /&gt;
&lt;br /&gt;
=Autoren=&lt;br /&gt;
--[[Benutzer:Dirk|Dirk]] 21:04, 15. Jul 2014 (CET)&lt;/div&gt;</summary>
		<author><name>Dirk NO2</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Oszilloskop_-_Tutorial&amp;diff=24931</id>
		<title>Oszilloskop - Tutorial</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Oszilloskop_-_Tutorial&amp;diff=24931"/>
				<updated>2014-07-18T15:57:15Z</updated>
		
		<summary type="html">&lt;p&gt;Dirk NO2: /* Strahlabgleich */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[bild:Voltcraft 630-2.JPG|right|500px]]&lt;br /&gt;
&lt;br /&gt;
=Allgemein=&lt;br /&gt;
Ein Oszilloskop-Tutorial gehört auch hier im RN-Wissen zu den [[Wunschthemen|Wunsch-Artikeln]]. Es gibt im Netz zwar auch schon gute Tutorials, aber hier soll versucht werden, möglichst einfach an das Thema heran zu gehen. Ich werde mich hauptsächlich mit dem analogen Oszilloskop am Beispiel des [http://www.conrad.de/ce/de/product/122421/VOLTCRAFT-VC-630-2-Analoges-2-Kanal-Oszilloskop-Bandbreite-0-DC-bis-30-MHz Voltcraft 630-2] beschäftigen. Die Bedienelemente dieses Oszilloskops werden sich ähnlich auch bei allen anderen Typen finden.&lt;br /&gt;
&lt;br /&gt;
Ich würde mir wünschen, dass jemand den Abschnitt zum [[Oszilloskop_-_Tutorial#Digital_Oszilloskop|digitalen Oszilloskop]] übernimmt.&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Analog Oszilloskop==&lt;br /&gt;
===Prinzip===&lt;br /&gt;
&lt;br /&gt;
[[bild:Voltcraft 630-2 Schematic.PNG|640px]]&lt;br /&gt;
&lt;br /&gt;
===Bedienelemente===&lt;br /&gt;
[[bild:Voltcraft 630-2 Front.PNG|640px]]&lt;br /&gt;
&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |Nummer&lt;br /&gt;
 |Bezeichnung&lt;br /&gt;
 |Funktion&lt;br /&gt;
 |-&lt;br /&gt;
 |1&lt;br /&gt;
 |CAL&lt;br /&gt;
 |Kalibrierspannung&lt;br /&gt;
 |-&lt;br /&gt;
 |2&lt;br /&gt;
 |INTEN&lt;br /&gt;
 |Helligkeit des Elektronenstrahls&lt;br /&gt;
 |-&lt;br /&gt;
 |3&lt;br /&gt;
 |FOCUS&lt;br /&gt;
 |Fokussierung auf das schärfste Bild&lt;br /&gt;
 |-&lt;br /&gt;
 |4&lt;br /&gt;
 |TRACE ROTATION&lt;br /&gt;
 |Abstimmung der horizontalen Spur mit den Rasterlinien&lt;br /&gt;
 |-&lt;br /&gt;
 |5&lt;br /&gt;
 |LED&lt;br /&gt;
 |Power Anzeige&lt;br /&gt;
 |-&lt;br /&gt;
 |6&lt;br /&gt;
 |POWER&lt;br /&gt;
 |Hauptschalter&lt;br /&gt;
 |-&lt;br /&gt;
 |7&lt;br /&gt;
 |CH1 VOLTS/DIV&lt;br /&gt;
 |CH1 Vertikalachsen-Empfindlichkeit&lt;br /&gt;
 |-&lt;br /&gt;
 |8&lt;br /&gt;
 |CH1 (X)&lt;br /&gt;
 |Vertikaler Eingang für CH1 und X-Achse im X-Y-Betrieb&lt;br /&gt;
 |-&lt;br /&gt;
 |9&lt;br /&gt;
 |CH1 VARIABLE CH1&lt;br /&gt;
 |CH1 Empfindlichkeit Feineinstellung&lt;br /&gt;
 |-&lt;br /&gt;
 |10&lt;br /&gt;
 |CH1 AC-GND-DC&lt;br /&gt;
 |CH1 Vertikalverstärker-Kopplung&lt;br /&gt;
 |-&lt;br /&gt;
 |11&lt;br /&gt;
 |CH1 ^ v POSITION&lt;br /&gt;
 |CH1 Vertikale Positionierung&lt;br /&gt;
 |-&lt;br /&gt;
 |12&lt;br /&gt;
 |ALT/CHOP&lt;br /&gt;
 |Anzeigeart im Zweikanal-Modus&lt;br /&gt;
 |-&lt;br /&gt;
 |13&lt;br /&gt;
 |CH1 DC BAL&lt;br /&gt;
 |CH1 Dämpferabgleich&lt;br /&gt;
 |-&lt;br /&gt;
 |14&lt;br /&gt;
 |VERT MODE&lt;br /&gt;
 |Auswahl der Betriebsart&lt;br /&gt;
 |-&lt;br /&gt;
 |15&lt;br /&gt;
 |GND&lt;br /&gt;
 |Masseanschluss des Gehäuses&lt;br /&gt;
 |-&lt;br /&gt;
 |16&lt;br /&gt;
 |CH2 INV&lt;br /&gt;
 |Eingangssignal von CH2 wird invertiert&lt;br /&gt;
 |-&lt;br /&gt;
 |17&lt;br /&gt;
 |CH2 DC BAL&lt;br /&gt;
 |CH2 Dämpferabgleich&lt;br /&gt;
 |-&lt;br /&gt;
 |18&lt;br /&gt;
 |CH2 AC-GND-DC&lt;br /&gt;
 |CH2 Vertikalverstärker-Kopplung&lt;br /&gt;
 |-&lt;br /&gt;
 |19&lt;br /&gt;
 |CH2 ^ v POSITION&lt;br /&gt;
 |CH2 Vertikale Positionierung&lt;br /&gt;
 |-&lt;br /&gt;
 |20&lt;br /&gt;
 |CH2 (Y)&lt;br /&gt;
 |Vertikaler Eingang für CH2 und Y-Achse im X-Y-Betrieb&lt;br /&gt;
 |-&lt;br /&gt;
 |21&lt;br /&gt;
 |CH2 VARIABLE&lt;br /&gt;
 |CH2 Empfindlichkeit Feineinstellung&lt;br /&gt;
 |-&lt;br /&gt;
 |22&lt;br /&gt;
 |CH2 VOLTS/DIV&lt;br /&gt;
 |CH2 Vertikalachsen-Empfindlichkeit&lt;br /&gt;
 |-&lt;br /&gt;
 |23&lt;br /&gt;
 |SOURCE&lt;br /&gt;
 |Auswahl des externen oder internen Triggersignals&lt;br /&gt;
 |-&lt;br /&gt;
 |24&lt;br /&gt;
 |EXT TRIG IN&lt;br /&gt;
 |Eingangsbuchse für externes Triggersignal&lt;br /&gt;
 |-&lt;br /&gt;
 |25&lt;br /&gt;
 |TRIGGER MODE&lt;br /&gt;
 |Auswahl des Triggermodus&lt;br /&gt;
 |-&lt;br /&gt;
 |26&lt;br /&gt;
 |SLOPE&lt;br /&gt;
 |Auswahl der Triggerflanke&lt;br /&gt;
 |-&lt;br /&gt;
 |27&lt;br /&gt;
 |TRIG.ALT&lt;br /&gt;
 |Internes Triggersignal alterniert zwischen CH1 und CH2&lt;br /&gt;
 |-&lt;br /&gt;
 |28&lt;br /&gt;
 |LEVEL&lt;br /&gt;
 |Bestimmung des Startpunktes für die Wellenform&lt;br /&gt;
 |-&lt;br /&gt;
 |29&lt;br /&gt;
 |TIME/DIV&lt;br /&gt;
 |Wahl der Ablenkzeiten&lt;br /&gt;
 |-&lt;br /&gt;
 |30&lt;br /&gt;
 |SWP.VAR&lt;br /&gt;
 |Feineinstellung der Ablenkzeit&lt;br /&gt;
 |-&lt;br /&gt;
 |31&lt;br /&gt;
 |x10 MAG&lt;br /&gt;
 |Vergrößerung um den Faktor 10&lt;br /&gt;
 |-&lt;br /&gt;
 |32&lt;br /&gt;
 |&amp;lt; &amp;gt; POSITION &lt;br /&gt;
 |Einstellung der horizontalen Position&lt;br /&gt;
 |-&lt;br /&gt;
 |33&lt;br /&gt;
 |FILTER&lt;br /&gt;
 |Filter zum einfachen Ablesen der Wellenformen&lt;br /&gt;
 |-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[bild:Voltcraft 630-2 Rear.PNG|640px]]&lt;br /&gt;
&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |Nummer&lt;br /&gt;
 |Bezeichnung&lt;br /&gt;
 |Funktion&lt;br /&gt;
 |-&lt;br /&gt;
 |34&lt;br /&gt;
 |Z AXIS INPUT&lt;br /&gt;
 |Eingangsbuchse für externes Intensitätsmodulationssignal&lt;br /&gt;
 |-&lt;br /&gt;
 |35&lt;br /&gt;
 |CH1 SIGNAL OUTPUT&lt;br /&gt;
 |CH1 Ausgangssignal für Frequenzmesser&lt;br /&gt;
 |-&lt;br /&gt;
 |36&lt;br /&gt;
 |&lt;br /&gt;
 |Ständer&lt;br /&gt;
 |-&lt;br /&gt;
 |37&lt;br /&gt;
 |&lt;br /&gt;
 |SICHERUNG &amp;amp; Netzspannungswahlschalter&lt;br /&gt;
 |-&lt;br /&gt;
 |38&lt;br /&gt;
 |&lt;br /&gt;
 |AC Eingangsbuchse&lt;br /&gt;
 |-&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
===Grundeinstellungen===&lt;br /&gt;
Wenn man neue Messungen beginnen will, sollte man das Oszilloskop vor dem Einschalten in die Grundeinstellung bringen.&lt;br /&gt;
&lt;br /&gt;
====Einkanal-Betrieb====&lt;br /&gt;
&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |Nummer&lt;br /&gt;
 |Bezeichnung&lt;br /&gt;
 |Einstellung&lt;br /&gt;
 |-&lt;br /&gt;
 |2&lt;br /&gt;
 |INTEN&lt;br /&gt;
 |Mittelstellung&lt;br /&gt;
 |-&lt;br /&gt;
 |3&lt;br /&gt;
 |FOCUS&lt;br /&gt;
 |Mittelstellung&lt;br /&gt;
 |-&lt;br /&gt;
 |7&lt;br /&gt;
 |CH1 VOLTS/DIV&lt;br /&gt;
 |0.5V/DIV&lt;br /&gt;
 |-&lt;br /&gt;
 |9&lt;br /&gt;
 |CH1 VARIABLE&lt;br /&gt;
 |CAL (Position im Uhrzeigersinn)&lt;br /&gt;
 |-&lt;br /&gt;
 |10&lt;br /&gt;
 |CH1 AC-GND-DC&lt;br /&gt;
 |GND&lt;br /&gt;
 |-&lt;br /&gt;
 |11&lt;br /&gt;
 |CH1 ^ v POSITION&lt;br /&gt;
 |Mittelstellung&lt;br /&gt;
 |-&lt;br /&gt;
 |14&lt;br /&gt;
 |VERT MODE&lt;br /&gt;
 |CH1&lt;br /&gt;
 |-&lt;br /&gt;
 |16&lt;br /&gt;
 |CH2 INV&lt;br /&gt;
 |OFF&lt;br /&gt;
 |-&lt;br /&gt;
 |18&lt;br /&gt;
 |CH2 AC-GND-DC&lt;br /&gt;
 |GND&lt;br /&gt;
 |-&lt;br /&gt;
 |19&lt;br /&gt;
 |CH2 ^ v POSITION&lt;br /&gt;
 |Mittelstellung&lt;br /&gt;
 |-&lt;br /&gt;
 |21&lt;br /&gt;
 |CH2 VARIABLE&lt;br /&gt;
 |CAL (Position im Uhrzeigersinn)&lt;br /&gt;
 |-&lt;br /&gt;
 |22&lt;br /&gt;
 |CH2 VOLTS/DIV&lt;br /&gt;
 |0.5V/DIV&lt;br /&gt;
 |-&lt;br /&gt;
 |23&lt;br /&gt;
 |SOURCE&lt;br /&gt;
 |CH1&lt;br /&gt;
 |-&lt;br /&gt;
 |25&lt;br /&gt;
 |TRIGGER MODE&lt;br /&gt;
 |AUTO&lt;br /&gt;
 |-&lt;br /&gt;
 |26&lt;br /&gt;
 |SLOPE&lt;br /&gt;
 | + &lt;br /&gt;
 |-&lt;br /&gt;
 |27&lt;br /&gt;
 |TRIG.ALT&lt;br /&gt;
 |OFF&lt;br /&gt;
 |-&lt;br /&gt;
 |29&lt;br /&gt;
 |TIME/DIV&lt;br /&gt;
 |0.5ms/DIV&lt;br /&gt;
 |-&lt;br /&gt;
 |30&lt;br /&gt;
 |SWP.VAR&lt;br /&gt;
 |CAL&lt;br /&gt;
 |-&lt;br /&gt;
 |31&lt;br /&gt;
 |x10 MAG&lt;br /&gt;
 |OFF&lt;br /&gt;
 |-&lt;br /&gt;
 |32&lt;br /&gt;
 |&amp;lt; &amp;gt; POSITION &lt;br /&gt;
 |Mittelstellung&lt;br /&gt;
 |-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Zweikanal-Betrieb====&lt;br /&gt;
Für den Zweikanal-Betrieb wählt man zunächst alle Einstellungen des [[Oszilloskop_-_Tutorial#Einkanal-Betrieb|Einkanal-Betriebs]].&lt;br /&gt;
&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |Nummer&lt;br /&gt;
 |Bezeichnung&lt;br /&gt;
 |Einstellung&lt;br /&gt;
 |-&lt;br /&gt;
 |14&lt;br /&gt;
 |VERT MODE&lt;br /&gt;
 |DUAL&lt;br /&gt;
 |-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Inbetriebnahme===&lt;br /&gt;
====Power====&lt;br /&gt;
Wenn der Netzspannungswahlschalter (37) einmalig auf die richtige Netzspannung (AC 115V oder 230V) und die Grundeinstellung für den Einkanal- oder Zweikanal-Betrieb eingestellt wurde, kann das Oszilloskop mit dem Hauptschalter (6) eingeschaltet werden. Die POWER LED (5) leuchtet auf.&lt;br /&gt;
&lt;br /&gt;
====Strahlabgleich====&lt;br /&gt;
Nach dem [[Oszilloskop_-_Tutorial#Power|Einschalten]] des Oszilloskops in der Grundstellung &amp;quot;[[Oszilloskop_-_Tutorial#Einkanal-Betrieb|Einkanal-Betrieb]]&amp;quot; sollte nach höchstens 20 Sekunden die horizontale Strahllinie auf dem Bildschirm erscheinen. Ist dies nicht der Fall, dann zunächst den INTEN Helligkeits-Regler (2) weiter nach rechts drehen bis die Linie erscheint. Gut eingestellt ist die Helligkeit, wenn die Linie deutlich zu erkennen aber nicht überstrahlt ist.&lt;br /&gt;
&lt;br /&gt;
Sieht die Strahllinie nicht scharf begrenzt aus, kann man die Schärfe noch mit dem FOCUS Regler (3) optimal einstellen. Dies ist der Fall, wenn die Linie möglichst dünn aussieht.&lt;br /&gt;
&lt;br /&gt;
Nun sollte die Strahllinie noch richtig ausgerichtet werden:&lt;br /&gt;
* '''Horizontale Lage:''' Die Strahllinie mit dem CH1 ^v POSITION Regler (11) mit der mittleren Rasterlinie in Deckung bringen.&lt;br /&gt;
* '''Vertikale Lage:''' Die Strahllinie mit dem &amp;lt;&amp;gt; POSITION Regler (32) so in die Mitte des Bildschirms legen, dass das Strahlende rechts und links nicht mehr sichtbar ist.&lt;br /&gt;
* '''Rotation:''' Wenn der Strahl nicht parallel zur mittleren Rasterlinie verläuft, sondern sie in einem Winkel kreuzt, dann muss die Strahl-Rotation noch eingestellt werden. Mit einem kleinen Schlitz-Schraubendreher stellt man die Rotation vorsichtig am Regler TRACE ROTATION (4) ein. Diese Einstellung muss man i.d.R. nur einmalig vornehmen und nicht bei jeder Inbetriebnahme.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Digital Oszilloskop==&lt;br /&gt;
Wer möchte diesen Abschnitt übernehmen?&lt;br /&gt;
&lt;br /&gt;
===Prinzip===&lt;br /&gt;
===Bedienelemente===&lt;br /&gt;
===Grundeinstellungen===&lt;br /&gt;
====Einkanal-Betrieb====&lt;br /&gt;
====Zweikanal-Betrieb====&lt;br /&gt;
===Inbetriebnahme===&lt;br /&gt;
====Power====&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Grundlagen]]	 &lt;br /&gt;
[[Kategorie:Praxis]]&lt;br /&gt;
[[Kategorie:Elektronik]]&lt;br /&gt;
&lt;br /&gt;
=Autoren=&lt;br /&gt;
--[[Benutzer:Dirk|Dirk]] 21:04, 15. Jul 2014 (CET)&lt;/div&gt;</summary>
		<author><name>Dirk NO2</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Oszilloskop_-_Tutorial&amp;diff=24930</id>
		<title>Oszilloskop - Tutorial</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Oszilloskop_-_Tutorial&amp;diff=24930"/>
				<updated>2014-07-18T15:47:09Z</updated>
		
		<summary type="html">&lt;p&gt;Dirk NO2: /* Strahlabgleich */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[bild:Voltcraft 630-2.JPG|right|500px]]&lt;br /&gt;
&lt;br /&gt;
=Allgemein=&lt;br /&gt;
Ein Oszilloskop-Tutorial gehört auch hier im RN-Wissen zu den [[Wunschthemen|Wunsch-Artikeln]]. Es gibt im Netz zwar auch schon gute Tutorials, aber hier soll versucht werden, möglichst einfach an das Thema heran zu gehen. Ich werde mich hauptsächlich mit dem analogen Oszilloskop am Beispiel des [http://www.conrad.de/ce/de/product/122421/VOLTCRAFT-VC-630-2-Analoges-2-Kanal-Oszilloskop-Bandbreite-0-DC-bis-30-MHz Voltcraft 630-2] beschäftigen. Die Bedienelemente dieses Oszilloskops werden sich ähnlich auch bei allen anderen Typen finden.&lt;br /&gt;
&lt;br /&gt;
Ich würde mir wünschen, dass jemand den Abschnitt zum [[Oszilloskop_-_Tutorial#Digital_Oszilloskop|digitalen Oszilloskop]] übernimmt.&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Analog Oszilloskop==&lt;br /&gt;
===Prinzip===&lt;br /&gt;
&lt;br /&gt;
[[bild:Voltcraft 630-2 Schematic.PNG|640px]]&lt;br /&gt;
&lt;br /&gt;
===Bedienelemente===&lt;br /&gt;
[[bild:Voltcraft 630-2 Front.PNG|640px]]&lt;br /&gt;
&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |Nummer&lt;br /&gt;
 |Bezeichnung&lt;br /&gt;
 |Funktion&lt;br /&gt;
 |-&lt;br /&gt;
 |1&lt;br /&gt;
 |CAL&lt;br /&gt;
 |Kalibrierspannung&lt;br /&gt;
 |-&lt;br /&gt;
 |2&lt;br /&gt;
 |INTEN&lt;br /&gt;
 |Helligkeit des Elektronenstrahls&lt;br /&gt;
 |-&lt;br /&gt;
 |3&lt;br /&gt;
 |FOCUS&lt;br /&gt;
 |Fokussierung auf das schärfste Bild&lt;br /&gt;
 |-&lt;br /&gt;
 |4&lt;br /&gt;
 |TRACE ROTATION&lt;br /&gt;
 |Abstimmung der horizontalen Spur mit den Rasterlinien&lt;br /&gt;
 |-&lt;br /&gt;
 |5&lt;br /&gt;
 |LED&lt;br /&gt;
 |Power Anzeige&lt;br /&gt;
 |-&lt;br /&gt;
 |6&lt;br /&gt;
 |POWER&lt;br /&gt;
 |Hauptschalter&lt;br /&gt;
 |-&lt;br /&gt;
 |7&lt;br /&gt;
 |CH1 VOLTS/DIV&lt;br /&gt;
 |CH1 Vertikalachsen-Empfindlichkeit&lt;br /&gt;
 |-&lt;br /&gt;
 |8&lt;br /&gt;
 |CH1 (X)&lt;br /&gt;
 |Vertikaler Eingang für CH1 und X-Achse im X-Y-Betrieb&lt;br /&gt;
 |-&lt;br /&gt;
 |9&lt;br /&gt;
 |CH1 VARIABLE CH1&lt;br /&gt;
 |CH1 Empfindlichkeit Feineinstellung&lt;br /&gt;
 |-&lt;br /&gt;
 |10&lt;br /&gt;
 |CH1 AC-GND-DC&lt;br /&gt;
 |CH1 Vertikalverstärker-Kopplung&lt;br /&gt;
 |-&lt;br /&gt;
 |11&lt;br /&gt;
 |CH1 ^ v POSITION&lt;br /&gt;
 |CH1 Vertikale Positionierung&lt;br /&gt;
 |-&lt;br /&gt;
 |12&lt;br /&gt;
 |ALT/CHOP&lt;br /&gt;
 |Anzeigeart im Zweikanal-Modus&lt;br /&gt;
 |-&lt;br /&gt;
 |13&lt;br /&gt;
 |CH1 DC BAL&lt;br /&gt;
 |CH1 Dämpferabgleich&lt;br /&gt;
 |-&lt;br /&gt;
 |14&lt;br /&gt;
 |VERT MODE&lt;br /&gt;
 |Auswahl der Betriebsart&lt;br /&gt;
 |-&lt;br /&gt;
 |15&lt;br /&gt;
 |GND&lt;br /&gt;
 |Masseanschluss des Gehäuses&lt;br /&gt;
 |-&lt;br /&gt;
 |16&lt;br /&gt;
 |CH2 INV&lt;br /&gt;
 |Eingangssignal von CH2 wird invertiert&lt;br /&gt;
 |-&lt;br /&gt;
 |17&lt;br /&gt;
 |CH2 DC BAL&lt;br /&gt;
 |CH2 Dämpferabgleich&lt;br /&gt;
 |-&lt;br /&gt;
 |18&lt;br /&gt;
 |CH2 AC-GND-DC&lt;br /&gt;
 |CH2 Vertikalverstärker-Kopplung&lt;br /&gt;
 |-&lt;br /&gt;
 |19&lt;br /&gt;
 |CH2 ^ v POSITION&lt;br /&gt;
 |CH2 Vertikale Positionierung&lt;br /&gt;
 |-&lt;br /&gt;
 |20&lt;br /&gt;
 |CH2 (Y)&lt;br /&gt;
 |Vertikaler Eingang für CH2 und Y-Achse im X-Y-Betrieb&lt;br /&gt;
 |-&lt;br /&gt;
 |21&lt;br /&gt;
 |CH2 VARIABLE&lt;br /&gt;
 |CH2 Empfindlichkeit Feineinstellung&lt;br /&gt;
 |-&lt;br /&gt;
 |22&lt;br /&gt;
 |CH2 VOLTS/DIV&lt;br /&gt;
 |CH2 Vertikalachsen-Empfindlichkeit&lt;br /&gt;
 |-&lt;br /&gt;
 |23&lt;br /&gt;
 |SOURCE&lt;br /&gt;
 |Auswahl des externen oder internen Triggersignals&lt;br /&gt;
 |-&lt;br /&gt;
 |24&lt;br /&gt;
 |EXT TRIG IN&lt;br /&gt;
 |Eingangsbuchse für externes Triggersignal&lt;br /&gt;
 |-&lt;br /&gt;
 |25&lt;br /&gt;
 |TRIGGER MODE&lt;br /&gt;
 |Auswahl des Triggermodus&lt;br /&gt;
 |-&lt;br /&gt;
 |26&lt;br /&gt;
 |SLOPE&lt;br /&gt;
 |Auswahl der Triggerflanke&lt;br /&gt;
 |-&lt;br /&gt;
 |27&lt;br /&gt;
 |TRIG.ALT&lt;br /&gt;
 |Internes Triggersignal alterniert zwischen CH1 und CH2&lt;br /&gt;
 |-&lt;br /&gt;
 |28&lt;br /&gt;
 |LEVEL&lt;br /&gt;
 |Bestimmung des Startpunktes für die Wellenform&lt;br /&gt;
 |-&lt;br /&gt;
 |29&lt;br /&gt;
 |TIME/DIV&lt;br /&gt;
 |Wahl der Ablenkzeiten&lt;br /&gt;
 |-&lt;br /&gt;
 |30&lt;br /&gt;
 |SWP.VAR&lt;br /&gt;
 |Feineinstellung der Ablenkzeit&lt;br /&gt;
 |-&lt;br /&gt;
 |31&lt;br /&gt;
 |x10 MAG&lt;br /&gt;
 |Vergrößerung um den Faktor 10&lt;br /&gt;
 |-&lt;br /&gt;
 |32&lt;br /&gt;
 |&amp;lt; &amp;gt; POSITION &lt;br /&gt;
 |Einstellung der horizontalen Position&lt;br /&gt;
 |-&lt;br /&gt;
 |33&lt;br /&gt;
 |FILTER&lt;br /&gt;
 |Filter zum einfachen Ablesen der Wellenformen&lt;br /&gt;
 |-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[bild:Voltcraft 630-2 Rear.PNG|640px]]&lt;br /&gt;
&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |Nummer&lt;br /&gt;
 |Bezeichnung&lt;br /&gt;
 |Funktion&lt;br /&gt;
 |-&lt;br /&gt;
 |34&lt;br /&gt;
 |Z AXIS INPUT&lt;br /&gt;
 |Eingangsbuchse für externes Intensitätsmodulationssignal&lt;br /&gt;
 |-&lt;br /&gt;
 |35&lt;br /&gt;
 |CH1 SIGNAL OUTPUT&lt;br /&gt;
 |CH1 Ausgangssignal für Frequenzmesser&lt;br /&gt;
 |-&lt;br /&gt;
 |36&lt;br /&gt;
 |&lt;br /&gt;
 |Ständer&lt;br /&gt;
 |-&lt;br /&gt;
 |37&lt;br /&gt;
 |&lt;br /&gt;
 |SICHERUNG &amp;amp; Netzspannungswahlschalter&lt;br /&gt;
 |-&lt;br /&gt;
 |38&lt;br /&gt;
 |&lt;br /&gt;
 |AC Eingangsbuchse&lt;br /&gt;
 |-&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
===Grundeinstellungen===&lt;br /&gt;
Wenn man neue Messungen beginnen will, sollte man das Oszilloskop vor dem Einschalten in die Grundeinstellung bringen.&lt;br /&gt;
&lt;br /&gt;
====Einkanal-Betrieb====&lt;br /&gt;
&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |Nummer&lt;br /&gt;
 |Bezeichnung&lt;br /&gt;
 |Einstellung&lt;br /&gt;
 |-&lt;br /&gt;
 |2&lt;br /&gt;
 |INTEN&lt;br /&gt;
 |Mittelstellung&lt;br /&gt;
 |-&lt;br /&gt;
 |3&lt;br /&gt;
 |FOCUS&lt;br /&gt;
 |Mittelstellung&lt;br /&gt;
 |-&lt;br /&gt;
 |7&lt;br /&gt;
 |CH1 VOLTS/DIV&lt;br /&gt;
 |0.5V/DIV&lt;br /&gt;
 |-&lt;br /&gt;
 |9&lt;br /&gt;
 |CH1 VARIABLE&lt;br /&gt;
 |CAL (Position im Uhrzeigersinn)&lt;br /&gt;
 |-&lt;br /&gt;
 |10&lt;br /&gt;
 |CH1 AC-GND-DC&lt;br /&gt;
 |GND&lt;br /&gt;
 |-&lt;br /&gt;
 |11&lt;br /&gt;
 |CH1 ^ v POSITION&lt;br /&gt;
 |Mittelstellung&lt;br /&gt;
 |-&lt;br /&gt;
 |14&lt;br /&gt;
 |VERT MODE&lt;br /&gt;
 |CH1&lt;br /&gt;
 |-&lt;br /&gt;
 |16&lt;br /&gt;
 |CH2 INV&lt;br /&gt;
 |OFF&lt;br /&gt;
 |-&lt;br /&gt;
 |18&lt;br /&gt;
 |CH2 AC-GND-DC&lt;br /&gt;
 |GND&lt;br /&gt;
 |-&lt;br /&gt;
 |19&lt;br /&gt;
 |CH2 ^ v POSITION&lt;br /&gt;
 |Mittelstellung&lt;br /&gt;
 |-&lt;br /&gt;
 |21&lt;br /&gt;
 |CH2 VARIABLE&lt;br /&gt;
 |CAL (Position im Uhrzeigersinn)&lt;br /&gt;
 |-&lt;br /&gt;
 |22&lt;br /&gt;
 |CH2 VOLTS/DIV&lt;br /&gt;
 |0.5V/DIV&lt;br /&gt;
 |-&lt;br /&gt;
 |23&lt;br /&gt;
 |SOURCE&lt;br /&gt;
 |CH1&lt;br /&gt;
 |-&lt;br /&gt;
 |25&lt;br /&gt;
 |TRIGGER MODE&lt;br /&gt;
 |AUTO&lt;br /&gt;
 |-&lt;br /&gt;
 |26&lt;br /&gt;
 |SLOPE&lt;br /&gt;
 | + &lt;br /&gt;
 |-&lt;br /&gt;
 |27&lt;br /&gt;
 |TRIG.ALT&lt;br /&gt;
 |OFF&lt;br /&gt;
 |-&lt;br /&gt;
 |29&lt;br /&gt;
 |TIME/DIV&lt;br /&gt;
 |0.5ms/DIV&lt;br /&gt;
 |-&lt;br /&gt;
 |30&lt;br /&gt;
 |SWP.VAR&lt;br /&gt;
 |CAL&lt;br /&gt;
 |-&lt;br /&gt;
 |31&lt;br /&gt;
 |x10 MAG&lt;br /&gt;
 |OFF&lt;br /&gt;
 |-&lt;br /&gt;
 |32&lt;br /&gt;
 |&amp;lt; &amp;gt; POSITION &lt;br /&gt;
 |Mittelstellung&lt;br /&gt;
 |-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Zweikanal-Betrieb====&lt;br /&gt;
Für den Zweikanal-Betrieb wählt man zunächst alle Einstellungen des [[Oszilloskop_-_Tutorial#Einkanal-Betrieb|Einkanal-Betriebs]].&lt;br /&gt;
&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |Nummer&lt;br /&gt;
 |Bezeichnung&lt;br /&gt;
 |Einstellung&lt;br /&gt;
 |-&lt;br /&gt;
 |14&lt;br /&gt;
 |VERT MODE&lt;br /&gt;
 |DUAL&lt;br /&gt;
 |-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Inbetriebnahme===&lt;br /&gt;
====Power====&lt;br /&gt;
Wenn der Netzspannungswahlschalter (37) einmalig auf die richtige Netzspannung (AC 115V oder 230V) und die Grundeinstellung für den Einkanal- oder Zweikanal-Betrieb eingestellt wurde, kann das Oszilloskop mit dem Hauptschalter (6) eingeschaltet werden. Die POWER LED (5) leuchtet auf.&lt;br /&gt;
&lt;br /&gt;
====Strahlabgleich====&lt;br /&gt;
Nach dem [[Oszilloskop_-_Tutorial#Power|Einschalten]] des Oszilloskops in der Grundstellung &amp;quot;[[Oszilloskop_-_Tutorial#Einkanal-Betrieb|Einkanal-Betrieb]]&amp;quot; sollte nach höchstens 20 Sekunden die horizontale Strahllinie auf dem Bildschirm erscheinen. Ist dies nicht der Fall, dann zunächst den INTEN Helligkeits-Regler (2) weiter nach rechts drehen bis die Linie erscheint. Gut eingestellt ist die Helligkeit, wenn die Linie deutlich zu erkennen aber nicht überstrahlt ist.&lt;br /&gt;
&lt;br /&gt;
Sieht die Strahllinie nicht scharf begrenzt aus, kann man die Schärfe noch mit dem FOCUS Regler (3) optimal einstellen. Dies ist der Fall, wenn die Linie möglichst dünn aussieht.&lt;br /&gt;
&lt;br /&gt;
Nun sollte die Strahllinie noch richtig ausgerichtet werden:&lt;br /&gt;
* &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Digital Oszilloskop==&lt;br /&gt;
Wer möchte diesen Abschnitt übernehmen?&lt;br /&gt;
&lt;br /&gt;
===Prinzip===&lt;br /&gt;
===Bedienelemente===&lt;br /&gt;
===Grundeinstellungen===&lt;br /&gt;
====Einkanal-Betrieb====&lt;br /&gt;
====Zweikanal-Betrieb====&lt;br /&gt;
===Inbetriebnahme===&lt;br /&gt;
====Power====&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Grundlagen]]	 &lt;br /&gt;
[[Kategorie:Praxis]]&lt;br /&gt;
[[Kategorie:Elektronik]]&lt;br /&gt;
&lt;br /&gt;
=Autoren=&lt;br /&gt;
--[[Benutzer:Dirk|Dirk]] 21:04, 15. Jul 2014 (CET)&lt;/div&gt;</summary>
		<author><name>Dirk NO2</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Oszilloskop_-_Tutorial&amp;diff=24929</id>
		<title>Oszilloskop - Tutorial</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Oszilloskop_-_Tutorial&amp;diff=24929"/>
				<updated>2014-07-18T15:44:24Z</updated>
		
		<summary type="html">&lt;p&gt;Dirk NO2: /* Strahlabgleich */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[bild:Voltcraft 630-2.JPG|right|500px]]&lt;br /&gt;
&lt;br /&gt;
=Allgemein=&lt;br /&gt;
Ein Oszilloskop-Tutorial gehört auch hier im RN-Wissen zu den [[Wunschthemen|Wunsch-Artikeln]]. Es gibt im Netz zwar auch schon gute Tutorials, aber hier soll versucht werden, möglichst einfach an das Thema heran zu gehen. Ich werde mich hauptsächlich mit dem analogen Oszilloskop am Beispiel des [http://www.conrad.de/ce/de/product/122421/VOLTCRAFT-VC-630-2-Analoges-2-Kanal-Oszilloskop-Bandbreite-0-DC-bis-30-MHz Voltcraft 630-2] beschäftigen. Die Bedienelemente dieses Oszilloskops werden sich ähnlich auch bei allen anderen Typen finden.&lt;br /&gt;
&lt;br /&gt;
Ich würde mir wünschen, dass jemand den Abschnitt zum [[Oszilloskop_-_Tutorial#Digital_Oszilloskop|digitalen Oszilloskop]] übernimmt.&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Analog Oszilloskop==&lt;br /&gt;
===Prinzip===&lt;br /&gt;
&lt;br /&gt;
[[bild:Voltcraft 630-2 Schematic.PNG|640px]]&lt;br /&gt;
&lt;br /&gt;
===Bedienelemente===&lt;br /&gt;
[[bild:Voltcraft 630-2 Front.PNG|640px]]&lt;br /&gt;
&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |Nummer&lt;br /&gt;
 |Bezeichnung&lt;br /&gt;
 |Funktion&lt;br /&gt;
 |-&lt;br /&gt;
 |1&lt;br /&gt;
 |CAL&lt;br /&gt;
 |Kalibrierspannung&lt;br /&gt;
 |-&lt;br /&gt;
 |2&lt;br /&gt;
 |INTEN&lt;br /&gt;
 |Helligkeit des Elektronenstrahls&lt;br /&gt;
 |-&lt;br /&gt;
 |3&lt;br /&gt;
 |FOCUS&lt;br /&gt;
 |Fokussierung auf das schärfste Bild&lt;br /&gt;
 |-&lt;br /&gt;
 |4&lt;br /&gt;
 |TRACE ROTATION&lt;br /&gt;
 |Abstimmung der horizontalen Spur mit den Rasterlinien&lt;br /&gt;
 |-&lt;br /&gt;
 |5&lt;br /&gt;
 |LED&lt;br /&gt;
 |Power Anzeige&lt;br /&gt;
 |-&lt;br /&gt;
 |6&lt;br /&gt;
 |POWER&lt;br /&gt;
 |Hauptschalter&lt;br /&gt;
 |-&lt;br /&gt;
 |7&lt;br /&gt;
 |CH1 VOLTS/DIV&lt;br /&gt;
 |CH1 Vertikalachsen-Empfindlichkeit&lt;br /&gt;
 |-&lt;br /&gt;
 |8&lt;br /&gt;
 |CH1 (X)&lt;br /&gt;
 |Vertikaler Eingang für CH1 und X-Achse im X-Y-Betrieb&lt;br /&gt;
 |-&lt;br /&gt;
 |9&lt;br /&gt;
 |CH1 VARIABLE CH1&lt;br /&gt;
 |CH1 Empfindlichkeit Feineinstellung&lt;br /&gt;
 |-&lt;br /&gt;
 |10&lt;br /&gt;
 |CH1 AC-GND-DC&lt;br /&gt;
 |CH1 Vertikalverstärker-Kopplung&lt;br /&gt;
 |-&lt;br /&gt;
 |11&lt;br /&gt;
 |CH1 ^ v POSITION&lt;br /&gt;
 |CH1 Vertikale Positionierung&lt;br /&gt;
 |-&lt;br /&gt;
 |12&lt;br /&gt;
 |ALT/CHOP&lt;br /&gt;
 |Anzeigeart im Zweikanal-Modus&lt;br /&gt;
 |-&lt;br /&gt;
 |13&lt;br /&gt;
 |CH1 DC BAL&lt;br /&gt;
 |CH1 Dämpferabgleich&lt;br /&gt;
 |-&lt;br /&gt;
 |14&lt;br /&gt;
 |VERT MODE&lt;br /&gt;
 |Auswahl der Betriebsart&lt;br /&gt;
 |-&lt;br /&gt;
 |15&lt;br /&gt;
 |GND&lt;br /&gt;
 |Masseanschluss des Gehäuses&lt;br /&gt;
 |-&lt;br /&gt;
 |16&lt;br /&gt;
 |CH2 INV&lt;br /&gt;
 |Eingangssignal von CH2 wird invertiert&lt;br /&gt;
 |-&lt;br /&gt;
 |17&lt;br /&gt;
 |CH2 DC BAL&lt;br /&gt;
 |CH2 Dämpferabgleich&lt;br /&gt;
 |-&lt;br /&gt;
 |18&lt;br /&gt;
 |CH2 AC-GND-DC&lt;br /&gt;
 |CH2 Vertikalverstärker-Kopplung&lt;br /&gt;
 |-&lt;br /&gt;
 |19&lt;br /&gt;
 |CH2 ^ v POSITION&lt;br /&gt;
 |CH2 Vertikale Positionierung&lt;br /&gt;
 |-&lt;br /&gt;
 |20&lt;br /&gt;
 |CH2 (Y)&lt;br /&gt;
 |Vertikaler Eingang für CH2 und Y-Achse im X-Y-Betrieb&lt;br /&gt;
 |-&lt;br /&gt;
 |21&lt;br /&gt;
 |CH2 VARIABLE&lt;br /&gt;
 |CH2 Empfindlichkeit Feineinstellung&lt;br /&gt;
 |-&lt;br /&gt;
 |22&lt;br /&gt;
 |CH2 VOLTS/DIV&lt;br /&gt;
 |CH2 Vertikalachsen-Empfindlichkeit&lt;br /&gt;
 |-&lt;br /&gt;
 |23&lt;br /&gt;
 |SOURCE&lt;br /&gt;
 |Auswahl des externen oder internen Triggersignals&lt;br /&gt;
 |-&lt;br /&gt;
 |24&lt;br /&gt;
 |EXT TRIG IN&lt;br /&gt;
 |Eingangsbuchse für externes Triggersignal&lt;br /&gt;
 |-&lt;br /&gt;
 |25&lt;br /&gt;
 |TRIGGER MODE&lt;br /&gt;
 |Auswahl des Triggermodus&lt;br /&gt;
 |-&lt;br /&gt;
 |26&lt;br /&gt;
 |SLOPE&lt;br /&gt;
 |Auswahl der Triggerflanke&lt;br /&gt;
 |-&lt;br /&gt;
 |27&lt;br /&gt;
 |TRIG.ALT&lt;br /&gt;
 |Internes Triggersignal alterniert zwischen CH1 und CH2&lt;br /&gt;
 |-&lt;br /&gt;
 |28&lt;br /&gt;
 |LEVEL&lt;br /&gt;
 |Bestimmung des Startpunktes für die Wellenform&lt;br /&gt;
 |-&lt;br /&gt;
 |29&lt;br /&gt;
 |TIME/DIV&lt;br /&gt;
 |Wahl der Ablenkzeiten&lt;br /&gt;
 |-&lt;br /&gt;
 |30&lt;br /&gt;
 |SWP.VAR&lt;br /&gt;
 |Feineinstellung der Ablenkzeit&lt;br /&gt;
 |-&lt;br /&gt;
 |31&lt;br /&gt;
 |x10 MAG&lt;br /&gt;
 |Vergrößerung um den Faktor 10&lt;br /&gt;
 |-&lt;br /&gt;
 |32&lt;br /&gt;
 |&amp;lt; &amp;gt; POSITION &lt;br /&gt;
 |Einstellung der horizontalen Position&lt;br /&gt;
 |-&lt;br /&gt;
 |33&lt;br /&gt;
 |FILTER&lt;br /&gt;
 |Filter zum einfachen Ablesen der Wellenformen&lt;br /&gt;
 |-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[bild:Voltcraft 630-2 Rear.PNG|640px]]&lt;br /&gt;
&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |Nummer&lt;br /&gt;
 |Bezeichnung&lt;br /&gt;
 |Funktion&lt;br /&gt;
 |-&lt;br /&gt;
 |34&lt;br /&gt;
 |Z AXIS INPUT&lt;br /&gt;
 |Eingangsbuchse für externes Intensitätsmodulationssignal&lt;br /&gt;
 |-&lt;br /&gt;
 |35&lt;br /&gt;
 |CH1 SIGNAL OUTPUT&lt;br /&gt;
 |CH1 Ausgangssignal für Frequenzmesser&lt;br /&gt;
 |-&lt;br /&gt;
 |36&lt;br /&gt;
 |&lt;br /&gt;
 |Ständer&lt;br /&gt;
 |-&lt;br /&gt;
 |37&lt;br /&gt;
 |&lt;br /&gt;
 |SICHERUNG &amp;amp; Netzspannungswahlschalter&lt;br /&gt;
 |-&lt;br /&gt;
 |38&lt;br /&gt;
 |&lt;br /&gt;
 |AC Eingangsbuchse&lt;br /&gt;
 |-&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
===Grundeinstellungen===&lt;br /&gt;
Wenn man neue Messungen beginnen will, sollte man das Oszilloskop vor dem Einschalten in die Grundeinstellung bringen.&lt;br /&gt;
&lt;br /&gt;
====Einkanal-Betrieb====&lt;br /&gt;
&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |Nummer&lt;br /&gt;
 |Bezeichnung&lt;br /&gt;
 |Einstellung&lt;br /&gt;
 |-&lt;br /&gt;
 |2&lt;br /&gt;
 |INTEN&lt;br /&gt;
 |Mittelstellung&lt;br /&gt;
 |-&lt;br /&gt;
 |3&lt;br /&gt;
 |FOCUS&lt;br /&gt;
 |Mittelstellung&lt;br /&gt;
 |-&lt;br /&gt;
 |7&lt;br /&gt;
 |CH1 VOLTS/DIV&lt;br /&gt;
 |0.5V/DIV&lt;br /&gt;
 |-&lt;br /&gt;
 |9&lt;br /&gt;
 |CH1 VARIABLE&lt;br /&gt;
 |CAL (Position im Uhrzeigersinn)&lt;br /&gt;
 |-&lt;br /&gt;
 |10&lt;br /&gt;
 |CH1 AC-GND-DC&lt;br /&gt;
 |GND&lt;br /&gt;
 |-&lt;br /&gt;
 |11&lt;br /&gt;
 |CH1 ^ v POSITION&lt;br /&gt;
 |Mittelstellung&lt;br /&gt;
 |-&lt;br /&gt;
 |14&lt;br /&gt;
 |VERT MODE&lt;br /&gt;
 |CH1&lt;br /&gt;
 |-&lt;br /&gt;
 |16&lt;br /&gt;
 |CH2 INV&lt;br /&gt;
 |OFF&lt;br /&gt;
 |-&lt;br /&gt;
 |18&lt;br /&gt;
 |CH2 AC-GND-DC&lt;br /&gt;
 |GND&lt;br /&gt;
 |-&lt;br /&gt;
 |19&lt;br /&gt;
 |CH2 ^ v POSITION&lt;br /&gt;
 |Mittelstellung&lt;br /&gt;
 |-&lt;br /&gt;
 |21&lt;br /&gt;
 |CH2 VARIABLE&lt;br /&gt;
 |CAL (Position im Uhrzeigersinn)&lt;br /&gt;
 |-&lt;br /&gt;
 |22&lt;br /&gt;
 |CH2 VOLTS/DIV&lt;br /&gt;
 |0.5V/DIV&lt;br /&gt;
 |-&lt;br /&gt;
 |23&lt;br /&gt;
 |SOURCE&lt;br /&gt;
 |CH1&lt;br /&gt;
 |-&lt;br /&gt;
 |25&lt;br /&gt;
 |TRIGGER MODE&lt;br /&gt;
 |AUTO&lt;br /&gt;
 |-&lt;br /&gt;
 |26&lt;br /&gt;
 |SLOPE&lt;br /&gt;
 | + &lt;br /&gt;
 |-&lt;br /&gt;
 |27&lt;br /&gt;
 |TRIG.ALT&lt;br /&gt;
 |OFF&lt;br /&gt;
 |-&lt;br /&gt;
 |29&lt;br /&gt;
 |TIME/DIV&lt;br /&gt;
 |0.5ms/DIV&lt;br /&gt;
 |-&lt;br /&gt;
 |30&lt;br /&gt;
 |SWP.VAR&lt;br /&gt;
 |CAL&lt;br /&gt;
 |-&lt;br /&gt;
 |31&lt;br /&gt;
 |x10 MAG&lt;br /&gt;
 |OFF&lt;br /&gt;
 |-&lt;br /&gt;
 |32&lt;br /&gt;
 |&amp;lt; &amp;gt; POSITION &lt;br /&gt;
 |Mittelstellung&lt;br /&gt;
 |-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Zweikanal-Betrieb====&lt;br /&gt;
Für den Zweikanal-Betrieb wählt man zunächst alle Einstellungen des [[Oszilloskop_-_Tutorial#Einkanal-Betrieb|Einkanal-Betriebs]].&lt;br /&gt;
&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |Nummer&lt;br /&gt;
 |Bezeichnung&lt;br /&gt;
 |Einstellung&lt;br /&gt;
 |-&lt;br /&gt;
 |14&lt;br /&gt;
 |VERT MODE&lt;br /&gt;
 |DUAL&lt;br /&gt;
 |-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Inbetriebnahme===&lt;br /&gt;
====Power====&lt;br /&gt;
Wenn der Netzspannungswahlschalter (37) einmalig auf die richtige Netzspannung (AC 115V oder 230V) und die Grundeinstellung für den Einkanal- oder Zweikanal-Betrieb eingestellt wurde, kann das Oszilloskop mit dem Hauptschalter (6) eingeschaltet werden. Die POWER LED (5) leuchtet auf.&lt;br /&gt;
&lt;br /&gt;
====Strahlabgleich====&lt;br /&gt;
Nach dem Einschalten des Oszilloskops in der Grundstellung &amp;quot;Einkanal-Betrieb&amp;quot; sollte nach höchstens 20 Sekunden die horizontale Strahllinie auf dem Bildschirm erscheinen. Ist dies nicht der Fall, dann zunächst den INTEN Helligkeits-Regler (2) weiter nach rechts drehen bis die Linie erscheint. Gut eingestellt ist die Helligkeit, wenn die Linie deutlich zu erkennen aber nicht überstrahlt ist.&lt;br /&gt;
&lt;br /&gt;
Sieht die Strahllinie nicht scharf begrenzt aus, kann man die Schärfe noch mit dem FOCUS Regler (3) optimal einstellen. Dies ist der Fall, wenn die Linie möglichst dünn aussieht.&lt;br /&gt;
&lt;br /&gt;
Nun sollte die Strahllinie noch richtig ausgerichtet werden:&lt;br /&gt;
* &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Digital Oszilloskop==&lt;br /&gt;
Wer möchte diesen Abschnitt übernehmen?&lt;br /&gt;
&lt;br /&gt;
===Prinzip===&lt;br /&gt;
===Bedienelemente===&lt;br /&gt;
===Grundeinstellungen===&lt;br /&gt;
====Einkanal-Betrieb====&lt;br /&gt;
====Zweikanal-Betrieb====&lt;br /&gt;
===Inbetriebnahme===&lt;br /&gt;
====Power====&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Grundlagen]]	 &lt;br /&gt;
[[Kategorie:Praxis]]&lt;br /&gt;
[[Kategorie:Elektronik]]&lt;br /&gt;
&lt;br /&gt;
=Autoren=&lt;br /&gt;
--[[Benutzer:Dirk|Dirk]] 21:04, 15. Jul 2014 (CET)&lt;/div&gt;</summary>
		<author><name>Dirk NO2</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Oszilloskop_-_Tutorial&amp;diff=24928</id>
		<title>Oszilloskop - Tutorial</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Oszilloskop_-_Tutorial&amp;diff=24928"/>
				<updated>2014-07-18T15:41:22Z</updated>
		
		<summary type="html">&lt;p&gt;Dirk NO2: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[bild:Voltcraft 630-2.JPG|right|500px]]&lt;br /&gt;
&lt;br /&gt;
=Allgemein=&lt;br /&gt;
Ein Oszilloskop-Tutorial gehört auch hier im RN-Wissen zu den [[Wunschthemen|Wunsch-Artikeln]]. Es gibt im Netz zwar auch schon gute Tutorials, aber hier soll versucht werden, möglichst einfach an das Thema heran zu gehen. Ich werde mich hauptsächlich mit dem analogen Oszilloskop am Beispiel des [http://www.conrad.de/ce/de/product/122421/VOLTCRAFT-VC-630-2-Analoges-2-Kanal-Oszilloskop-Bandbreite-0-DC-bis-30-MHz Voltcraft 630-2] beschäftigen. Die Bedienelemente dieses Oszilloskops werden sich ähnlich auch bei allen anderen Typen finden.&lt;br /&gt;
&lt;br /&gt;
Ich würde mir wünschen, dass jemand den Abschnitt zum [[Oszilloskop_-_Tutorial#Digital_Oszilloskop|digitalen Oszilloskop]] übernimmt.&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Analog Oszilloskop==&lt;br /&gt;
===Prinzip===&lt;br /&gt;
&lt;br /&gt;
[[bild:Voltcraft 630-2 Schematic.PNG|640px]]&lt;br /&gt;
&lt;br /&gt;
===Bedienelemente===&lt;br /&gt;
[[bild:Voltcraft 630-2 Front.PNG|640px]]&lt;br /&gt;
&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |Nummer&lt;br /&gt;
 |Bezeichnung&lt;br /&gt;
 |Funktion&lt;br /&gt;
 |-&lt;br /&gt;
 |1&lt;br /&gt;
 |CAL&lt;br /&gt;
 |Kalibrierspannung&lt;br /&gt;
 |-&lt;br /&gt;
 |2&lt;br /&gt;
 |INTEN&lt;br /&gt;
 |Helligkeit des Elektronenstrahls&lt;br /&gt;
 |-&lt;br /&gt;
 |3&lt;br /&gt;
 |FOCUS&lt;br /&gt;
 |Fokussierung auf das schärfste Bild&lt;br /&gt;
 |-&lt;br /&gt;
 |4&lt;br /&gt;
 |TRACE ROTATION&lt;br /&gt;
 |Abstimmung der horizontalen Spur mit den Rasterlinien&lt;br /&gt;
 |-&lt;br /&gt;
 |5&lt;br /&gt;
 |LED&lt;br /&gt;
 |Power Anzeige&lt;br /&gt;
 |-&lt;br /&gt;
 |6&lt;br /&gt;
 |POWER&lt;br /&gt;
 |Hauptschalter&lt;br /&gt;
 |-&lt;br /&gt;
 |7&lt;br /&gt;
 |CH1 VOLTS/DIV&lt;br /&gt;
 |CH1 Vertikalachsen-Empfindlichkeit&lt;br /&gt;
 |-&lt;br /&gt;
 |8&lt;br /&gt;
 |CH1 (X)&lt;br /&gt;
 |Vertikaler Eingang für CH1 und X-Achse im X-Y-Betrieb&lt;br /&gt;
 |-&lt;br /&gt;
 |9&lt;br /&gt;
 |CH1 VARIABLE CH1&lt;br /&gt;
 |CH1 Empfindlichkeit Feineinstellung&lt;br /&gt;
 |-&lt;br /&gt;
 |10&lt;br /&gt;
 |CH1 AC-GND-DC&lt;br /&gt;
 |CH1 Vertikalverstärker-Kopplung&lt;br /&gt;
 |-&lt;br /&gt;
 |11&lt;br /&gt;
 |CH1 ^ v POSITION&lt;br /&gt;
 |CH1 Vertikale Positionierung&lt;br /&gt;
 |-&lt;br /&gt;
 |12&lt;br /&gt;
 |ALT/CHOP&lt;br /&gt;
 |Anzeigeart im Zweikanal-Modus&lt;br /&gt;
 |-&lt;br /&gt;
 |13&lt;br /&gt;
 |CH1 DC BAL&lt;br /&gt;
 |CH1 Dämpferabgleich&lt;br /&gt;
 |-&lt;br /&gt;
 |14&lt;br /&gt;
 |VERT MODE&lt;br /&gt;
 |Auswahl der Betriebsart&lt;br /&gt;
 |-&lt;br /&gt;
 |15&lt;br /&gt;
 |GND&lt;br /&gt;
 |Masseanschluss des Gehäuses&lt;br /&gt;
 |-&lt;br /&gt;
 |16&lt;br /&gt;
 |CH2 INV&lt;br /&gt;
 |Eingangssignal von CH2 wird invertiert&lt;br /&gt;
 |-&lt;br /&gt;
 |17&lt;br /&gt;
 |CH2 DC BAL&lt;br /&gt;
 |CH2 Dämpferabgleich&lt;br /&gt;
 |-&lt;br /&gt;
 |18&lt;br /&gt;
 |CH2 AC-GND-DC&lt;br /&gt;
 |CH2 Vertikalverstärker-Kopplung&lt;br /&gt;
 |-&lt;br /&gt;
 |19&lt;br /&gt;
 |CH2 ^ v POSITION&lt;br /&gt;
 |CH2 Vertikale Positionierung&lt;br /&gt;
 |-&lt;br /&gt;
 |20&lt;br /&gt;
 |CH2 (Y)&lt;br /&gt;
 |Vertikaler Eingang für CH2 und Y-Achse im X-Y-Betrieb&lt;br /&gt;
 |-&lt;br /&gt;
 |21&lt;br /&gt;
 |CH2 VARIABLE&lt;br /&gt;
 |CH2 Empfindlichkeit Feineinstellung&lt;br /&gt;
 |-&lt;br /&gt;
 |22&lt;br /&gt;
 |CH2 VOLTS/DIV&lt;br /&gt;
 |CH2 Vertikalachsen-Empfindlichkeit&lt;br /&gt;
 |-&lt;br /&gt;
 |23&lt;br /&gt;
 |SOURCE&lt;br /&gt;
 |Auswahl des externen oder internen Triggersignals&lt;br /&gt;
 |-&lt;br /&gt;
 |24&lt;br /&gt;
 |EXT TRIG IN&lt;br /&gt;
 |Eingangsbuchse für externes Triggersignal&lt;br /&gt;
 |-&lt;br /&gt;
 |25&lt;br /&gt;
 |TRIGGER MODE&lt;br /&gt;
 |Auswahl des Triggermodus&lt;br /&gt;
 |-&lt;br /&gt;
 |26&lt;br /&gt;
 |SLOPE&lt;br /&gt;
 |Auswahl der Triggerflanke&lt;br /&gt;
 |-&lt;br /&gt;
 |27&lt;br /&gt;
 |TRIG.ALT&lt;br /&gt;
 |Internes Triggersignal alterniert zwischen CH1 und CH2&lt;br /&gt;
 |-&lt;br /&gt;
 |28&lt;br /&gt;
 |LEVEL&lt;br /&gt;
 |Bestimmung des Startpunktes für die Wellenform&lt;br /&gt;
 |-&lt;br /&gt;
 |29&lt;br /&gt;
 |TIME/DIV&lt;br /&gt;
 |Wahl der Ablenkzeiten&lt;br /&gt;
 |-&lt;br /&gt;
 |30&lt;br /&gt;
 |SWP.VAR&lt;br /&gt;
 |Feineinstellung der Ablenkzeit&lt;br /&gt;
 |-&lt;br /&gt;
 |31&lt;br /&gt;
 |x10 MAG&lt;br /&gt;
 |Vergrößerung um den Faktor 10&lt;br /&gt;
 |-&lt;br /&gt;
 |32&lt;br /&gt;
 |&amp;lt; &amp;gt; POSITION &lt;br /&gt;
 |Einstellung der horizontalen Position&lt;br /&gt;
 |-&lt;br /&gt;
 |33&lt;br /&gt;
 |FILTER&lt;br /&gt;
 |Filter zum einfachen Ablesen der Wellenformen&lt;br /&gt;
 |-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[bild:Voltcraft 630-2 Rear.PNG|640px]]&lt;br /&gt;
&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |Nummer&lt;br /&gt;
 |Bezeichnung&lt;br /&gt;
 |Funktion&lt;br /&gt;
 |-&lt;br /&gt;
 |34&lt;br /&gt;
 |Z AXIS INPUT&lt;br /&gt;
 |Eingangsbuchse für externes Intensitätsmodulationssignal&lt;br /&gt;
 |-&lt;br /&gt;
 |35&lt;br /&gt;
 |CH1 SIGNAL OUTPUT&lt;br /&gt;
 |CH1 Ausgangssignal für Frequenzmesser&lt;br /&gt;
 |-&lt;br /&gt;
 |36&lt;br /&gt;
 |&lt;br /&gt;
 |Ständer&lt;br /&gt;
 |-&lt;br /&gt;
 |37&lt;br /&gt;
 |&lt;br /&gt;
 |SICHERUNG &amp;amp; Netzspannungswahlschalter&lt;br /&gt;
 |-&lt;br /&gt;
 |38&lt;br /&gt;
 |&lt;br /&gt;
 |AC Eingangsbuchse&lt;br /&gt;
 |-&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
===Grundeinstellungen===&lt;br /&gt;
Wenn man neue Messungen beginnen will, sollte man das Oszilloskop vor dem Einschalten in die Grundeinstellung bringen.&lt;br /&gt;
&lt;br /&gt;
====Einkanal-Betrieb====&lt;br /&gt;
&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |Nummer&lt;br /&gt;
 |Bezeichnung&lt;br /&gt;
 |Einstellung&lt;br /&gt;
 |-&lt;br /&gt;
 |2&lt;br /&gt;
 |INTEN&lt;br /&gt;
 |Mittelstellung&lt;br /&gt;
 |-&lt;br /&gt;
 |3&lt;br /&gt;
 |FOCUS&lt;br /&gt;
 |Mittelstellung&lt;br /&gt;
 |-&lt;br /&gt;
 |7&lt;br /&gt;
 |CH1 VOLTS/DIV&lt;br /&gt;
 |0.5V/DIV&lt;br /&gt;
 |-&lt;br /&gt;
 |9&lt;br /&gt;
 |CH1 VARIABLE&lt;br /&gt;
 |CAL (Position im Uhrzeigersinn)&lt;br /&gt;
 |-&lt;br /&gt;
 |10&lt;br /&gt;
 |CH1 AC-GND-DC&lt;br /&gt;
 |GND&lt;br /&gt;
 |-&lt;br /&gt;
 |11&lt;br /&gt;
 |CH1 ^ v POSITION&lt;br /&gt;
 |Mittelstellung&lt;br /&gt;
 |-&lt;br /&gt;
 |14&lt;br /&gt;
 |VERT MODE&lt;br /&gt;
 |CH1&lt;br /&gt;
 |-&lt;br /&gt;
 |16&lt;br /&gt;
 |CH2 INV&lt;br /&gt;
 |OFF&lt;br /&gt;
 |-&lt;br /&gt;
 |18&lt;br /&gt;
 |CH2 AC-GND-DC&lt;br /&gt;
 |GND&lt;br /&gt;
 |-&lt;br /&gt;
 |19&lt;br /&gt;
 |CH2 ^ v POSITION&lt;br /&gt;
 |Mittelstellung&lt;br /&gt;
 |-&lt;br /&gt;
 |21&lt;br /&gt;
 |CH2 VARIABLE&lt;br /&gt;
 |CAL (Position im Uhrzeigersinn)&lt;br /&gt;
 |-&lt;br /&gt;
 |22&lt;br /&gt;
 |CH2 VOLTS/DIV&lt;br /&gt;
 |0.5V/DIV&lt;br /&gt;
 |-&lt;br /&gt;
 |23&lt;br /&gt;
 |SOURCE&lt;br /&gt;
 |CH1&lt;br /&gt;
 |-&lt;br /&gt;
 |25&lt;br /&gt;
 |TRIGGER MODE&lt;br /&gt;
 |AUTO&lt;br /&gt;
 |-&lt;br /&gt;
 |26&lt;br /&gt;
 |SLOPE&lt;br /&gt;
 | + &lt;br /&gt;
 |-&lt;br /&gt;
 |27&lt;br /&gt;
 |TRIG.ALT&lt;br /&gt;
 |OFF&lt;br /&gt;
 |-&lt;br /&gt;
 |29&lt;br /&gt;
 |TIME/DIV&lt;br /&gt;
 |0.5ms/DIV&lt;br /&gt;
 |-&lt;br /&gt;
 |30&lt;br /&gt;
 |SWP.VAR&lt;br /&gt;
 |CAL&lt;br /&gt;
 |-&lt;br /&gt;
 |31&lt;br /&gt;
 |x10 MAG&lt;br /&gt;
 |OFF&lt;br /&gt;
 |-&lt;br /&gt;
 |32&lt;br /&gt;
 |&amp;lt; &amp;gt; POSITION &lt;br /&gt;
 |Mittelstellung&lt;br /&gt;
 |-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Zweikanal-Betrieb====&lt;br /&gt;
Für den Zweikanal-Betrieb wählt man zunächst alle Einstellungen des [[Oszilloskop_-_Tutorial#Einkanal-Betrieb|Einkanal-Betriebs]].&lt;br /&gt;
&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |Nummer&lt;br /&gt;
 |Bezeichnung&lt;br /&gt;
 |Einstellung&lt;br /&gt;
 |-&lt;br /&gt;
 |14&lt;br /&gt;
 |VERT MODE&lt;br /&gt;
 |DUAL&lt;br /&gt;
 |-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Inbetriebnahme===&lt;br /&gt;
====Power====&lt;br /&gt;
Wenn der Netzspannungswahlschalter (37) einmalig auf die richtige Netzspannung (AC 115V oder 230V) und die Grundeinstellung für den Einkanal- oder Zweikanal-Betrieb eingestellt wurde, kann das Oszilloskop mit dem Hauptschalter (6) eingeschaltet werden. Die POWER LED (5) leuchtet auf.&lt;br /&gt;
&lt;br /&gt;
====Strahlabgleich====&lt;br /&gt;
Nach dem Einschalten des Oszilloskops in der Grundstellung sollte nach höchstens 20 Sekunden die horizontale Strahllinie auf dem Bildschirm erscheinen. Ist dies nicht der Fall, dann zunächst den INTEN Helligkeits-Regler (2) weiter nach rechts drehen bis die Linie erscheint. Gut eingestellt ist die Helligkeit, wenn die Linie deutlich zu erkennen aber nicht überstrahlt ist.&lt;br /&gt;
&lt;br /&gt;
Sieht die Strahllinie nicht scharf begrenzt aus, kann man die Schärfe noch mit dem FOCUS Regler (3) optimal einstellen. Dies ist der Fall, wenn die Linie möglichst dünn aussieht.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Digital Oszilloskop==&lt;br /&gt;
Wer möchte diesen Abschnitt übernehmen?&lt;br /&gt;
&lt;br /&gt;
===Prinzip===&lt;br /&gt;
===Bedienelemente===&lt;br /&gt;
===Grundeinstellungen===&lt;br /&gt;
====Einkanal-Betrieb====&lt;br /&gt;
====Zweikanal-Betrieb====&lt;br /&gt;
===Inbetriebnahme===&lt;br /&gt;
====Power====&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Grundlagen]]	 &lt;br /&gt;
[[Kategorie:Praxis]]&lt;br /&gt;
[[Kategorie:Elektronik]]&lt;br /&gt;
&lt;br /&gt;
=Autoren=&lt;br /&gt;
--[[Benutzer:Dirk|Dirk]] 21:04, 15. Jul 2014 (CET)&lt;/div&gt;</summary>
		<author><name>Dirk NO2</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Oszilloskop_-_Tutorial&amp;diff=24927</id>
		<title>Oszilloskop - Tutorial</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Oszilloskop_-_Tutorial&amp;diff=24927"/>
				<updated>2014-07-18T15:40:14Z</updated>
		
		<summary type="html">&lt;p&gt;Dirk NO2: /* Digital Oszilloskop */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[bild:Voltcraft 630-2.JPG|right|500px]]&lt;br /&gt;
&lt;br /&gt;
=Allgemein=&lt;br /&gt;
Ein Oszilloskop-Tutorial gehört auch hier im RN-Wissen zu den [[Wunschthemen|Wunsch-Artikeln]]. Es gibt im Netz zwar auch schon gute Tutorials, aber hier soll versucht werden, möglichst einfach an das Thema heran zu gehen. Ich werde mich hauptsächlich mit dem analogen Oszilloskop am Beispiel des [http://www.conrad.de/ce/de/product/122421/VOLTCRAFT-VC-630-2-Analoges-2-Kanal-Oszilloskop-Bandbreite-0-DC-bis-30-MHz Voltcraft 630-2] beschäftigen. Die Bedienelemente dieses Oszilloskops werden sich ähnlich auch bei allen anderen Typen finden.&lt;br /&gt;
&lt;br /&gt;
Ich würde mir wünschen, dass jemand den Abschnitt zum [[Oszilloskop_-_Tutorial#Digital_Oszilloskop|digitalen Oszilloskop]] übernimmt.&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Analog Oszilloskop==&lt;br /&gt;
===Prinzip===&lt;br /&gt;
&lt;br /&gt;
[[bild:Voltcraft 630-2 Schematic.PNG|640px]]&lt;br /&gt;
&lt;br /&gt;
===Bedienelemente===&lt;br /&gt;
[[bild:Voltcraft 630-2 Front.PNG|640px]]&lt;br /&gt;
&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |Nummer&lt;br /&gt;
 |Bezeichnung&lt;br /&gt;
 |Funktion&lt;br /&gt;
 |-&lt;br /&gt;
 |1&lt;br /&gt;
 |CAL&lt;br /&gt;
 |Kalibrierspannung&lt;br /&gt;
 |-&lt;br /&gt;
 |2&lt;br /&gt;
 |INTEN&lt;br /&gt;
 |Helligkeit des Elektronenstrahls&lt;br /&gt;
 |-&lt;br /&gt;
 |3&lt;br /&gt;
 |FOCUS&lt;br /&gt;
 |Fokussierung auf das schärfste Bild&lt;br /&gt;
 |-&lt;br /&gt;
 |4&lt;br /&gt;
 |TRACE ROTATION&lt;br /&gt;
 |Abstimmung der horizontalen Spur mit den Rasterlinien&lt;br /&gt;
 |-&lt;br /&gt;
 |5&lt;br /&gt;
 |LED&lt;br /&gt;
 |Power Anzeige&lt;br /&gt;
 |-&lt;br /&gt;
 |6&lt;br /&gt;
 |POWER&lt;br /&gt;
 |Hauptschalter&lt;br /&gt;
 |-&lt;br /&gt;
 |7&lt;br /&gt;
 |CH1 VOLTS/DIV&lt;br /&gt;
 |CH1 Vertikalachsen-Empfindlichkeit&lt;br /&gt;
 |-&lt;br /&gt;
 |8&lt;br /&gt;
 |CH1 (X)&lt;br /&gt;
 |Vertikaler Eingang für CH1 und X-Achse im X-Y-Betrieb&lt;br /&gt;
 |-&lt;br /&gt;
 |9&lt;br /&gt;
 |CH1 VARIABLE CH1&lt;br /&gt;
 |CH1 Empfindlichkeit Feineinstellung&lt;br /&gt;
 |-&lt;br /&gt;
 |10&lt;br /&gt;
 |CH1 AC-GND-DC&lt;br /&gt;
 |CH1 Vertikalverstärker-Kopplung&lt;br /&gt;
 |-&lt;br /&gt;
 |11&lt;br /&gt;
 |CH1 ^ v POSITION&lt;br /&gt;
 |CH1 Vertikale Positionierung&lt;br /&gt;
 |-&lt;br /&gt;
 |12&lt;br /&gt;
 |ALT/CHOP&lt;br /&gt;
 |Anzeigeart im Zweikanal-Modus&lt;br /&gt;
 |-&lt;br /&gt;
 |13&lt;br /&gt;
 |CH1 DC BAL&lt;br /&gt;
 |CH1 Dämpferabgleich&lt;br /&gt;
 |-&lt;br /&gt;
 |14&lt;br /&gt;
 |VERT MODE&lt;br /&gt;
 |Auswahl der Betriebsart&lt;br /&gt;
 |-&lt;br /&gt;
 |15&lt;br /&gt;
 |GND&lt;br /&gt;
 |Masseanschluss des Gehäuses&lt;br /&gt;
 |-&lt;br /&gt;
 |16&lt;br /&gt;
 |CH2 INV&lt;br /&gt;
 |Eingangssignal von CH2 wird invertiert&lt;br /&gt;
 |-&lt;br /&gt;
 |17&lt;br /&gt;
 |CH2 DC BAL&lt;br /&gt;
 |CH2 Dämpferabgleich&lt;br /&gt;
 |-&lt;br /&gt;
 |18&lt;br /&gt;
 |CH2 AC-GND-DC&lt;br /&gt;
 |CH2 Vertikalverstärker-Kopplung&lt;br /&gt;
 |-&lt;br /&gt;
 |19&lt;br /&gt;
 |CH2 ^ v POSITION&lt;br /&gt;
 |CH2 Vertikale Positionierung&lt;br /&gt;
 |-&lt;br /&gt;
 |20&lt;br /&gt;
 |CH2 (Y)&lt;br /&gt;
 |Vertikaler Eingang für CH2 und Y-Achse im X-Y-Betrieb&lt;br /&gt;
 |-&lt;br /&gt;
 |21&lt;br /&gt;
 |CH2 VARIABLE&lt;br /&gt;
 |CH2 Empfindlichkeit Feineinstellung&lt;br /&gt;
 |-&lt;br /&gt;
 |22&lt;br /&gt;
 |CH2 VOLTS/DIV&lt;br /&gt;
 |CH2 Vertikalachsen-Empfindlichkeit&lt;br /&gt;
 |-&lt;br /&gt;
 |23&lt;br /&gt;
 |SOURCE&lt;br /&gt;
 |Auswahl des externen oder internen Triggersignals&lt;br /&gt;
 |-&lt;br /&gt;
 |24&lt;br /&gt;
 |EXT TRIG IN&lt;br /&gt;
 |Eingangsbuchse für externes Triggersignal&lt;br /&gt;
 |-&lt;br /&gt;
 |25&lt;br /&gt;
 |TRIGGER MODE&lt;br /&gt;
 |Auswahl des Triggermodus&lt;br /&gt;
 |-&lt;br /&gt;
 |26&lt;br /&gt;
 |SLOPE&lt;br /&gt;
 |Auswahl der Triggerflanke&lt;br /&gt;
 |-&lt;br /&gt;
 |27&lt;br /&gt;
 |TRIG.ALT&lt;br /&gt;
 |Internes Triggersignal alterniert zwischen CH1 und CH2&lt;br /&gt;
 |-&lt;br /&gt;
 |28&lt;br /&gt;
 |LEVEL&lt;br /&gt;
 |Bestimmung des Startpunktes für die Wellenform&lt;br /&gt;
 |-&lt;br /&gt;
 |29&lt;br /&gt;
 |TIME/DIV&lt;br /&gt;
 |Wahl der Ablenkzeiten&lt;br /&gt;
 |-&lt;br /&gt;
 |30&lt;br /&gt;
 |SWP.VAR&lt;br /&gt;
 |Feineinstellung der Ablenkzeit&lt;br /&gt;
 |-&lt;br /&gt;
 |31&lt;br /&gt;
 |x10 MAG&lt;br /&gt;
 |Vergrößerung um den Faktor 10&lt;br /&gt;
 |-&lt;br /&gt;
 |32&lt;br /&gt;
 |&amp;lt; &amp;gt; POSITION &lt;br /&gt;
 |Einstellung der horizontalen Position&lt;br /&gt;
 |-&lt;br /&gt;
 |33&lt;br /&gt;
 |FILTER&lt;br /&gt;
 |Filter zum einfachen Ablesen der Wellenformen&lt;br /&gt;
 |-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[bild:Voltcraft 630-2 Rear.PNG|640px]]&lt;br /&gt;
&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |Nummer&lt;br /&gt;
 |Bezeichnung&lt;br /&gt;
 |Funktion&lt;br /&gt;
 |-&lt;br /&gt;
 |34&lt;br /&gt;
 |Z AXIS INPUT&lt;br /&gt;
 |Eingangsbuchse für externes Intensitätsmodulationssignal&lt;br /&gt;
 |-&lt;br /&gt;
 |35&lt;br /&gt;
 |CH1 SIGNAL OUTPUT&lt;br /&gt;
 |CH1 Ausgangssignal für Frequenzmesser&lt;br /&gt;
 |-&lt;br /&gt;
 |36&lt;br /&gt;
 |&lt;br /&gt;
 |Ständer&lt;br /&gt;
 |-&lt;br /&gt;
 |37&lt;br /&gt;
 |&lt;br /&gt;
 |SICHERUNG &amp;amp; Netzspannungswahlschalter&lt;br /&gt;
 |-&lt;br /&gt;
 |38&lt;br /&gt;
 |&lt;br /&gt;
 |AC Eingangsbuchse&lt;br /&gt;
 |-&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
===Grundeinstellungen===&lt;br /&gt;
Wenn man neue Messungen beginnen will, sollte man das Oszilloskop vor dem Einschalten in die Grundeinstellung bringen.&lt;br /&gt;
&lt;br /&gt;
====Einkanal-Betrieb====&lt;br /&gt;
&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |Nummer&lt;br /&gt;
 |Bezeichnung&lt;br /&gt;
 |Einstellung&lt;br /&gt;
 |-&lt;br /&gt;
 |2&lt;br /&gt;
 |INTEN&lt;br /&gt;
 |Mittelstellung&lt;br /&gt;
 |-&lt;br /&gt;
 |3&lt;br /&gt;
 |FOCUS&lt;br /&gt;
 |Mittelstellung&lt;br /&gt;
 |-&lt;br /&gt;
 |7&lt;br /&gt;
 |CH1 VOLTS/DIV&lt;br /&gt;
 |0.5V/DIV&lt;br /&gt;
 |-&lt;br /&gt;
 |9&lt;br /&gt;
 |CH1 VARIABLE&lt;br /&gt;
 |CAL (Position im Uhrzeigersinn)&lt;br /&gt;
 |-&lt;br /&gt;
 |10&lt;br /&gt;
 |CH1 AC-GND-DC&lt;br /&gt;
 |GND&lt;br /&gt;
 |-&lt;br /&gt;
 |11&lt;br /&gt;
 |CH1 ^ v POSITION&lt;br /&gt;
 |Mittelstellung&lt;br /&gt;
 |-&lt;br /&gt;
 |14&lt;br /&gt;
 |VERT MODE&lt;br /&gt;
 |CH1&lt;br /&gt;
 |-&lt;br /&gt;
 |16&lt;br /&gt;
 |CH2 INV&lt;br /&gt;
 |OFF&lt;br /&gt;
 |-&lt;br /&gt;
 |18&lt;br /&gt;
 |CH2 AC-GND-DC&lt;br /&gt;
 |GND&lt;br /&gt;
 |-&lt;br /&gt;
 |19&lt;br /&gt;
 |CH2 ^ v POSITION&lt;br /&gt;
 |Mittelstellung&lt;br /&gt;
 |-&lt;br /&gt;
 |21&lt;br /&gt;
 |CH2 VARIABLE&lt;br /&gt;
 |CAL (Position im Uhrzeigersinn)&lt;br /&gt;
 |-&lt;br /&gt;
 |22&lt;br /&gt;
 |CH2 VOLTS/DIV&lt;br /&gt;
 |0.5V/DIV&lt;br /&gt;
 |-&lt;br /&gt;
 |23&lt;br /&gt;
 |SOURCE&lt;br /&gt;
 |CH1&lt;br /&gt;
 |-&lt;br /&gt;
 |25&lt;br /&gt;
 |TRIGGER MODE&lt;br /&gt;
 |AUTO&lt;br /&gt;
 |-&lt;br /&gt;
 |26&lt;br /&gt;
 |SLOPE&lt;br /&gt;
 | + &lt;br /&gt;
 |-&lt;br /&gt;
 |27&lt;br /&gt;
 |TRIG.ALT&lt;br /&gt;
 |OFF&lt;br /&gt;
 |-&lt;br /&gt;
 |29&lt;br /&gt;
 |TIME/DIV&lt;br /&gt;
 |0.5ms/DIV&lt;br /&gt;
 |-&lt;br /&gt;
 |30&lt;br /&gt;
 |SWP.VAR&lt;br /&gt;
 |CAL&lt;br /&gt;
 |-&lt;br /&gt;
 |31&lt;br /&gt;
 |x10 MAG&lt;br /&gt;
 |OFF&lt;br /&gt;
 |-&lt;br /&gt;
 |32&lt;br /&gt;
 |&amp;lt; &amp;gt; POSITION &lt;br /&gt;
 |Mittelstellung&lt;br /&gt;
 |-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Zweikanal-Betrieb====&lt;br /&gt;
Für den Zweikanal-Betrieb wählt man zunächst alle Einstellungen des [[Oszilloskop_-_Tutorial#Einkanal-Betrieb|Einkanal-Betriebs]].&lt;br /&gt;
&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |Nummer&lt;br /&gt;
 |Bezeichnung&lt;br /&gt;
 |Einstellung&lt;br /&gt;
 |-&lt;br /&gt;
 |14&lt;br /&gt;
 |VERT MODE&lt;br /&gt;
 |DUAL&lt;br /&gt;
 |-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Inbetriebnahme====&lt;br /&gt;
=====Power=====&lt;br /&gt;
Wenn der Netzspannungswahlschalter (37) einmalig auf die richtige Netzspannung (AC 115V oder 230V) und die Grundeinstellung für den Einkanal- oder Zweikanal-Betrieb eingestellt wurde, kann das Oszilloskop mit dem Hauptschalter (6) eingeschaltet werden. Die POWER LED (5) leuchtet auf.&lt;br /&gt;
&lt;br /&gt;
=====Strahlabgleich=====&lt;br /&gt;
Nach dem Einschalten des Oszilloskops in der Grundstellung sollte nach höchstens 20 Sekunden die horizontale Strahllinie auf dem Bildschirm erscheinen. Ist dies nicht der Fall, dann zunächst den INTEN Helligkeits-Regler (2) weiter nach rechts drehen bis die Linie erscheint. Gut eingestellt ist die Helligkeit, wenn die Linie deutlich zu erkennen aber nicht überstrahlt ist.&lt;br /&gt;
&lt;br /&gt;
Sieht die Strahllinie nicht scharf begrenzt aus, kann man die Schärfe noch mit dem FOCUS Regler (3) optimal einstellen. Dies ist der Fall, wenn die Linie möglichst dünn aussieht.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Digital Oszilloskop==&lt;br /&gt;
Wer möchte diesen Abschnitt übernehmen?&lt;br /&gt;
&lt;br /&gt;
===Prinzip===&lt;br /&gt;
===Bedienelemente===&lt;br /&gt;
===Grundeinstellungen===&lt;br /&gt;
====Einkanal-Betrieb====&lt;br /&gt;
====Zweikanal-Betrieb====&lt;br /&gt;
===Inbetriebnahme===&lt;br /&gt;
====Power====&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Grundlagen]]	 &lt;br /&gt;
[[Kategorie:Praxis]]&lt;br /&gt;
[[Kategorie:Elektronik]]&lt;br /&gt;
&lt;br /&gt;
=Autoren=&lt;br /&gt;
--[[Benutzer:Dirk|Dirk]] 21:04, 15. Jul 2014 (CET)&lt;/div&gt;</summary>
		<author><name>Dirk NO2</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Oszilloskop_-_Tutorial&amp;diff=24926</id>
		<title>Oszilloskop - Tutorial</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Oszilloskop_-_Tutorial&amp;diff=24926"/>
				<updated>2014-07-18T15:39:38Z</updated>
		
		<summary type="html">&lt;p&gt;Dirk NO2: /* Digital Oszilloskop */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[bild:Voltcraft 630-2.JPG|right|500px]]&lt;br /&gt;
&lt;br /&gt;
=Allgemein=&lt;br /&gt;
Ein Oszilloskop-Tutorial gehört auch hier im RN-Wissen zu den [[Wunschthemen|Wunsch-Artikeln]]. Es gibt im Netz zwar auch schon gute Tutorials, aber hier soll versucht werden, möglichst einfach an das Thema heran zu gehen. Ich werde mich hauptsächlich mit dem analogen Oszilloskop am Beispiel des [http://www.conrad.de/ce/de/product/122421/VOLTCRAFT-VC-630-2-Analoges-2-Kanal-Oszilloskop-Bandbreite-0-DC-bis-30-MHz Voltcraft 630-2] beschäftigen. Die Bedienelemente dieses Oszilloskops werden sich ähnlich auch bei allen anderen Typen finden.&lt;br /&gt;
&lt;br /&gt;
Ich würde mir wünschen, dass jemand den Abschnitt zum [[Oszilloskop_-_Tutorial#Digital_Oszilloskop|digitalen Oszilloskop]] übernimmt.&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Analog Oszilloskop==&lt;br /&gt;
===Prinzip===&lt;br /&gt;
&lt;br /&gt;
[[bild:Voltcraft 630-2 Schematic.PNG|640px]]&lt;br /&gt;
&lt;br /&gt;
===Bedienelemente===&lt;br /&gt;
[[bild:Voltcraft 630-2 Front.PNG|640px]]&lt;br /&gt;
&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |Nummer&lt;br /&gt;
 |Bezeichnung&lt;br /&gt;
 |Funktion&lt;br /&gt;
 |-&lt;br /&gt;
 |1&lt;br /&gt;
 |CAL&lt;br /&gt;
 |Kalibrierspannung&lt;br /&gt;
 |-&lt;br /&gt;
 |2&lt;br /&gt;
 |INTEN&lt;br /&gt;
 |Helligkeit des Elektronenstrahls&lt;br /&gt;
 |-&lt;br /&gt;
 |3&lt;br /&gt;
 |FOCUS&lt;br /&gt;
 |Fokussierung auf das schärfste Bild&lt;br /&gt;
 |-&lt;br /&gt;
 |4&lt;br /&gt;
 |TRACE ROTATION&lt;br /&gt;
 |Abstimmung der horizontalen Spur mit den Rasterlinien&lt;br /&gt;
 |-&lt;br /&gt;
 |5&lt;br /&gt;
 |LED&lt;br /&gt;
 |Power Anzeige&lt;br /&gt;
 |-&lt;br /&gt;
 |6&lt;br /&gt;
 |POWER&lt;br /&gt;
 |Hauptschalter&lt;br /&gt;
 |-&lt;br /&gt;
 |7&lt;br /&gt;
 |CH1 VOLTS/DIV&lt;br /&gt;
 |CH1 Vertikalachsen-Empfindlichkeit&lt;br /&gt;
 |-&lt;br /&gt;
 |8&lt;br /&gt;
 |CH1 (X)&lt;br /&gt;
 |Vertikaler Eingang für CH1 und X-Achse im X-Y-Betrieb&lt;br /&gt;
 |-&lt;br /&gt;
 |9&lt;br /&gt;
 |CH1 VARIABLE CH1&lt;br /&gt;
 |CH1 Empfindlichkeit Feineinstellung&lt;br /&gt;
 |-&lt;br /&gt;
 |10&lt;br /&gt;
 |CH1 AC-GND-DC&lt;br /&gt;
 |CH1 Vertikalverstärker-Kopplung&lt;br /&gt;
 |-&lt;br /&gt;
 |11&lt;br /&gt;
 |CH1 ^ v POSITION&lt;br /&gt;
 |CH1 Vertikale Positionierung&lt;br /&gt;
 |-&lt;br /&gt;
 |12&lt;br /&gt;
 |ALT/CHOP&lt;br /&gt;
 |Anzeigeart im Zweikanal-Modus&lt;br /&gt;
 |-&lt;br /&gt;
 |13&lt;br /&gt;
 |CH1 DC BAL&lt;br /&gt;
 |CH1 Dämpferabgleich&lt;br /&gt;
 |-&lt;br /&gt;
 |14&lt;br /&gt;
 |VERT MODE&lt;br /&gt;
 |Auswahl der Betriebsart&lt;br /&gt;
 |-&lt;br /&gt;
 |15&lt;br /&gt;
 |GND&lt;br /&gt;
 |Masseanschluss des Gehäuses&lt;br /&gt;
 |-&lt;br /&gt;
 |16&lt;br /&gt;
 |CH2 INV&lt;br /&gt;
 |Eingangssignal von CH2 wird invertiert&lt;br /&gt;
 |-&lt;br /&gt;
 |17&lt;br /&gt;
 |CH2 DC BAL&lt;br /&gt;
 |CH2 Dämpferabgleich&lt;br /&gt;
 |-&lt;br /&gt;
 |18&lt;br /&gt;
 |CH2 AC-GND-DC&lt;br /&gt;
 |CH2 Vertikalverstärker-Kopplung&lt;br /&gt;
 |-&lt;br /&gt;
 |19&lt;br /&gt;
 |CH2 ^ v POSITION&lt;br /&gt;
 |CH2 Vertikale Positionierung&lt;br /&gt;
 |-&lt;br /&gt;
 |20&lt;br /&gt;
 |CH2 (Y)&lt;br /&gt;
 |Vertikaler Eingang für CH2 und Y-Achse im X-Y-Betrieb&lt;br /&gt;
 |-&lt;br /&gt;
 |21&lt;br /&gt;
 |CH2 VARIABLE&lt;br /&gt;
 |CH2 Empfindlichkeit Feineinstellung&lt;br /&gt;
 |-&lt;br /&gt;
 |22&lt;br /&gt;
 |CH2 VOLTS/DIV&lt;br /&gt;
 |CH2 Vertikalachsen-Empfindlichkeit&lt;br /&gt;
 |-&lt;br /&gt;
 |23&lt;br /&gt;
 |SOURCE&lt;br /&gt;
 |Auswahl des externen oder internen Triggersignals&lt;br /&gt;
 |-&lt;br /&gt;
 |24&lt;br /&gt;
 |EXT TRIG IN&lt;br /&gt;
 |Eingangsbuchse für externes Triggersignal&lt;br /&gt;
 |-&lt;br /&gt;
 |25&lt;br /&gt;
 |TRIGGER MODE&lt;br /&gt;
 |Auswahl des Triggermodus&lt;br /&gt;
 |-&lt;br /&gt;
 |26&lt;br /&gt;
 |SLOPE&lt;br /&gt;
 |Auswahl der Triggerflanke&lt;br /&gt;
 |-&lt;br /&gt;
 |27&lt;br /&gt;
 |TRIG.ALT&lt;br /&gt;
 |Internes Triggersignal alterniert zwischen CH1 und CH2&lt;br /&gt;
 |-&lt;br /&gt;
 |28&lt;br /&gt;
 |LEVEL&lt;br /&gt;
 |Bestimmung des Startpunktes für die Wellenform&lt;br /&gt;
 |-&lt;br /&gt;
 |29&lt;br /&gt;
 |TIME/DIV&lt;br /&gt;
 |Wahl der Ablenkzeiten&lt;br /&gt;
 |-&lt;br /&gt;
 |30&lt;br /&gt;
 |SWP.VAR&lt;br /&gt;
 |Feineinstellung der Ablenkzeit&lt;br /&gt;
 |-&lt;br /&gt;
 |31&lt;br /&gt;
 |x10 MAG&lt;br /&gt;
 |Vergrößerung um den Faktor 10&lt;br /&gt;
 |-&lt;br /&gt;
 |32&lt;br /&gt;
 |&amp;lt; &amp;gt; POSITION &lt;br /&gt;
 |Einstellung der horizontalen Position&lt;br /&gt;
 |-&lt;br /&gt;
 |33&lt;br /&gt;
 |FILTER&lt;br /&gt;
 |Filter zum einfachen Ablesen der Wellenformen&lt;br /&gt;
 |-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[bild:Voltcraft 630-2 Rear.PNG|640px]]&lt;br /&gt;
&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |Nummer&lt;br /&gt;
 |Bezeichnung&lt;br /&gt;
 |Funktion&lt;br /&gt;
 |-&lt;br /&gt;
 |34&lt;br /&gt;
 |Z AXIS INPUT&lt;br /&gt;
 |Eingangsbuchse für externes Intensitätsmodulationssignal&lt;br /&gt;
 |-&lt;br /&gt;
 |35&lt;br /&gt;
 |CH1 SIGNAL OUTPUT&lt;br /&gt;
 |CH1 Ausgangssignal für Frequenzmesser&lt;br /&gt;
 |-&lt;br /&gt;
 |36&lt;br /&gt;
 |&lt;br /&gt;
 |Ständer&lt;br /&gt;
 |-&lt;br /&gt;
 |37&lt;br /&gt;
 |&lt;br /&gt;
 |SICHERUNG &amp;amp; Netzspannungswahlschalter&lt;br /&gt;
 |-&lt;br /&gt;
 |38&lt;br /&gt;
 |&lt;br /&gt;
 |AC Eingangsbuchse&lt;br /&gt;
 |-&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
===Grundeinstellungen===&lt;br /&gt;
Wenn man neue Messungen beginnen will, sollte man das Oszilloskop vor dem Einschalten in die Grundeinstellung bringen.&lt;br /&gt;
&lt;br /&gt;
====Einkanal-Betrieb====&lt;br /&gt;
&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |Nummer&lt;br /&gt;
 |Bezeichnung&lt;br /&gt;
 |Einstellung&lt;br /&gt;
 |-&lt;br /&gt;
 |2&lt;br /&gt;
 |INTEN&lt;br /&gt;
 |Mittelstellung&lt;br /&gt;
 |-&lt;br /&gt;
 |3&lt;br /&gt;
 |FOCUS&lt;br /&gt;
 |Mittelstellung&lt;br /&gt;
 |-&lt;br /&gt;
 |7&lt;br /&gt;
 |CH1 VOLTS/DIV&lt;br /&gt;
 |0.5V/DIV&lt;br /&gt;
 |-&lt;br /&gt;
 |9&lt;br /&gt;
 |CH1 VARIABLE&lt;br /&gt;
 |CAL (Position im Uhrzeigersinn)&lt;br /&gt;
 |-&lt;br /&gt;
 |10&lt;br /&gt;
 |CH1 AC-GND-DC&lt;br /&gt;
 |GND&lt;br /&gt;
 |-&lt;br /&gt;
 |11&lt;br /&gt;
 |CH1 ^ v POSITION&lt;br /&gt;
 |Mittelstellung&lt;br /&gt;
 |-&lt;br /&gt;
 |14&lt;br /&gt;
 |VERT MODE&lt;br /&gt;
 |CH1&lt;br /&gt;
 |-&lt;br /&gt;
 |16&lt;br /&gt;
 |CH2 INV&lt;br /&gt;
 |OFF&lt;br /&gt;
 |-&lt;br /&gt;
 |18&lt;br /&gt;
 |CH2 AC-GND-DC&lt;br /&gt;
 |GND&lt;br /&gt;
 |-&lt;br /&gt;
 |19&lt;br /&gt;
 |CH2 ^ v POSITION&lt;br /&gt;
 |Mittelstellung&lt;br /&gt;
 |-&lt;br /&gt;
 |21&lt;br /&gt;
 |CH2 VARIABLE&lt;br /&gt;
 |CAL (Position im Uhrzeigersinn)&lt;br /&gt;
 |-&lt;br /&gt;
 |22&lt;br /&gt;
 |CH2 VOLTS/DIV&lt;br /&gt;
 |0.5V/DIV&lt;br /&gt;
 |-&lt;br /&gt;
 |23&lt;br /&gt;
 |SOURCE&lt;br /&gt;
 |CH1&lt;br /&gt;
 |-&lt;br /&gt;
 |25&lt;br /&gt;
 |TRIGGER MODE&lt;br /&gt;
 |AUTO&lt;br /&gt;
 |-&lt;br /&gt;
 |26&lt;br /&gt;
 |SLOPE&lt;br /&gt;
 | + &lt;br /&gt;
 |-&lt;br /&gt;
 |27&lt;br /&gt;
 |TRIG.ALT&lt;br /&gt;
 |OFF&lt;br /&gt;
 |-&lt;br /&gt;
 |29&lt;br /&gt;
 |TIME/DIV&lt;br /&gt;
 |0.5ms/DIV&lt;br /&gt;
 |-&lt;br /&gt;
 |30&lt;br /&gt;
 |SWP.VAR&lt;br /&gt;
 |CAL&lt;br /&gt;
 |-&lt;br /&gt;
 |31&lt;br /&gt;
 |x10 MAG&lt;br /&gt;
 |OFF&lt;br /&gt;
 |-&lt;br /&gt;
 |32&lt;br /&gt;
 |&amp;lt; &amp;gt; POSITION &lt;br /&gt;
 |Mittelstellung&lt;br /&gt;
 |-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Zweikanal-Betrieb====&lt;br /&gt;
Für den Zweikanal-Betrieb wählt man zunächst alle Einstellungen des [[Oszilloskop_-_Tutorial#Einkanal-Betrieb|Einkanal-Betriebs]].&lt;br /&gt;
&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |Nummer&lt;br /&gt;
 |Bezeichnung&lt;br /&gt;
 |Einstellung&lt;br /&gt;
 |-&lt;br /&gt;
 |14&lt;br /&gt;
 |VERT MODE&lt;br /&gt;
 |DUAL&lt;br /&gt;
 |-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Inbetriebnahme====&lt;br /&gt;
=====Power=====&lt;br /&gt;
Wenn der Netzspannungswahlschalter (37) einmalig auf die richtige Netzspannung (AC 115V oder 230V) und die Grundeinstellung für den Einkanal- oder Zweikanal-Betrieb eingestellt wurde, kann das Oszilloskop mit dem Hauptschalter (6) eingeschaltet werden. Die POWER LED (5) leuchtet auf.&lt;br /&gt;
&lt;br /&gt;
=====Strahlabgleich=====&lt;br /&gt;
Nach dem Einschalten des Oszilloskops in der Grundstellung sollte nach höchstens 20 Sekunden die horizontale Strahllinie auf dem Bildschirm erscheinen. Ist dies nicht der Fall, dann zunächst den INTEN Helligkeits-Regler (2) weiter nach rechts drehen bis die Linie erscheint. Gut eingestellt ist die Helligkeit, wenn die Linie deutlich zu erkennen aber nicht überstrahlt ist.&lt;br /&gt;
&lt;br /&gt;
Sieht die Strahllinie nicht scharf begrenzt aus, kann man die Schärfe noch mit dem FOCUS Regler (3) optimal einstellen. Dies ist der Fall, wenn die Linie möglichst dünn aussieht.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Digital Oszilloskop==&lt;br /&gt;
Wer möchte diesen Abschnitt übernehmen?&lt;br /&gt;
&lt;br /&gt;
===Prinzip===&lt;br /&gt;
===Bedienelemente===&lt;br /&gt;
===Grundeinstellungen===&lt;br /&gt;
====Einkanal-Betrieb====&lt;br /&gt;
====Zweikanal-Betrieb====&lt;br /&gt;
====Inbetriebnahme====&lt;br /&gt;
=====Power=====&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Grundlagen]]	 &lt;br /&gt;
[[Kategorie:Praxis]]&lt;br /&gt;
[[Kategorie:Elektronik]]&lt;br /&gt;
&lt;br /&gt;
=Autoren=&lt;br /&gt;
--[[Benutzer:Dirk|Dirk]] 21:04, 15. Jul 2014 (CET)&lt;/div&gt;</summary>
		<author><name>Dirk NO2</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Oszilloskop_-_Tutorial&amp;diff=24925</id>
		<title>Oszilloskop - Tutorial</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Oszilloskop_-_Tutorial&amp;diff=24925"/>
				<updated>2014-07-18T15:38:30Z</updated>
		
		<summary type="html">&lt;p&gt;Dirk NO2: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[bild:Voltcraft 630-2.JPG|right|500px]]&lt;br /&gt;
&lt;br /&gt;
=Allgemein=&lt;br /&gt;
Ein Oszilloskop-Tutorial gehört auch hier im RN-Wissen zu den [[Wunschthemen|Wunsch-Artikeln]]. Es gibt im Netz zwar auch schon gute Tutorials, aber hier soll versucht werden, möglichst einfach an das Thema heran zu gehen. Ich werde mich hauptsächlich mit dem analogen Oszilloskop am Beispiel des [http://www.conrad.de/ce/de/product/122421/VOLTCRAFT-VC-630-2-Analoges-2-Kanal-Oszilloskop-Bandbreite-0-DC-bis-30-MHz Voltcraft 630-2] beschäftigen. Die Bedienelemente dieses Oszilloskops werden sich ähnlich auch bei allen anderen Typen finden.&lt;br /&gt;
&lt;br /&gt;
Ich würde mir wünschen, dass jemand den Abschnitt zum [[Oszilloskop_-_Tutorial#Digital_Oszilloskop|digitalen Oszilloskop]] übernimmt.&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Analog Oszilloskop==&lt;br /&gt;
===Prinzip===&lt;br /&gt;
&lt;br /&gt;
[[bild:Voltcraft 630-2 Schematic.PNG|640px]]&lt;br /&gt;
&lt;br /&gt;
===Bedienelemente===&lt;br /&gt;
[[bild:Voltcraft 630-2 Front.PNG|640px]]&lt;br /&gt;
&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |Nummer&lt;br /&gt;
 |Bezeichnung&lt;br /&gt;
 |Funktion&lt;br /&gt;
 |-&lt;br /&gt;
 |1&lt;br /&gt;
 |CAL&lt;br /&gt;
 |Kalibrierspannung&lt;br /&gt;
 |-&lt;br /&gt;
 |2&lt;br /&gt;
 |INTEN&lt;br /&gt;
 |Helligkeit des Elektronenstrahls&lt;br /&gt;
 |-&lt;br /&gt;
 |3&lt;br /&gt;
 |FOCUS&lt;br /&gt;
 |Fokussierung auf das schärfste Bild&lt;br /&gt;
 |-&lt;br /&gt;
 |4&lt;br /&gt;
 |TRACE ROTATION&lt;br /&gt;
 |Abstimmung der horizontalen Spur mit den Rasterlinien&lt;br /&gt;
 |-&lt;br /&gt;
 |5&lt;br /&gt;
 |LED&lt;br /&gt;
 |Power Anzeige&lt;br /&gt;
 |-&lt;br /&gt;
 |6&lt;br /&gt;
 |POWER&lt;br /&gt;
 |Hauptschalter&lt;br /&gt;
 |-&lt;br /&gt;
 |7&lt;br /&gt;
 |CH1 VOLTS/DIV&lt;br /&gt;
 |CH1 Vertikalachsen-Empfindlichkeit&lt;br /&gt;
 |-&lt;br /&gt;
 |8&lt;br /&gt;
 |CH1 (X)&lt;br /&gt;
 |Vertikaler Eingang für CH1 und X-Achse im X-Y-Betrieb&lt;br /&gt;
 |-&lt;br /&gt;
 |9&lt;br /&gt;
 |CH1 VARIABLE CH1&lt;br /&gt;
 |CH1 Empfindlichkeit Feineinstellung&lt;br /&gt;
 |-&lt;br /&gt;
 |10&lt;br /&gt;
 |CH1 AC-GND-DC&lt;br /&gt;
 |CH1 Vertikalverstärker-Kopplung&lt;br /&gt;
 |-&lt;br /&gt;
 |11&lt;br /&gt;
 |CH1 ^ v POSITION&lt;br /&gt;
 |CH1 Vertikale Positionierung&lt;br /&gt;
 |-&lt;br /&gt;
 |12&lt;br /&gt;
 |ALT/CHOP&lt;br /&gt;
 |Anzeigeart im Zweikanal-Modus&lt;br /&gt;
 |-&lt;br /&gt;
 |13&lt;br /&gt;
 |CH1 DC BAL&lt;br /&gt;
 |CH1 Dämpferabgleich&lt;br /&gt;
 |-&lt;br /&gt;
 |14&lt;br /&gt;
 |VERT MODE&lt;br /&gt;
 |Auswahl der Betriebsart&lt;br /&gt;
 |-&lt;br /&gt;
 |15&lt;br /&gt;
 |GND&lt;br /&gt;
 |Masseanschluss des Gehäuses&lt;br /&gt;
 |-&lt;br /&gt;
 |16&lt;br /&gt;
 |CH2 INV&lt;br /&gt;
 |Eingangssignal von CH2 wird invertiert&lt;br /&gt;
 |-&lt;br /&gt;
 |17&lt;br /&gt;
 |CH2 DC BAL&lt;br /&gt;
 |CH2 Dämpferabgleich&lt;br /&gt;
 |-&lt;br /&gt;
 |18&lt;br /&gt;
 |CH2 AC-GND-DC&lt;br /&gt;
 |CH2 Vertikalverstärker-Kopplung&lt;br /&gt;
 |-&lt;br /&gt;
 |19&lt;br /&gt;
 |CH2 ^ v POSITION&lt;br /&gt;
 |CH2 Vertikale Positionierung&lt;br /&gt;
 |-&lt;br /&gt;
 |20&lt;br /&gt;
 |CH2 (Y)&lt;br /&gt;
 |Vertikaler Eingang für CH2 und Y-Achse im X-Y-Betrieb&lt;br /&gt;
 |-&lt;br /&gt;
 |21&lt;br /&gt;
 |CH2 VARIABLE&lt;br /&gt;
 |CH2 Empfindlichkeit Feineinstellung&lt;br /&gt;
 |-&lt;br /&gt;
 |22&lt;br /&gt;
 |CH2 VOLTS/DIV&lt;br /&gt;
 |CH2 Vertikalachsen-Empfindlichkeit&lt;br /&gt;
 |-&lt;br /&gt;
 |23&lt;br /&gt;
 |SOURCE&lt;br /&gt;
 |Auswahl des externen oder internen Triggersignals&lt;br /&gt;
 |-&lt;br /&gt;
 |24&lt;br /&gt;
 |EXT TRIG IN&lt;br /&gt;
 |Eingangsbuchse für externes Triggersignal&lt;br /&gt;
 |-&lt;br /&gt;
 |25&lt;br /&gt;
 |TRIGGER MODE&lt;br /&gt;
 |Auswahl des Triggermodus&lt;br /&gt;
 |-&lt;br /&gt;
 |26&lt;br /&gt;
 |SLOPE&lt;br /&gt;
 |Auswahl der Triggerflanke&lt;br /&gt;
 |-&lt;br /&gt;
 |27&lt;br /&gt;
 |TRIG.ALT&lt;br /&gt;
 |Internes Triggersignal alterniert zwischen CH1 und CH2&lt;br /&gt;
 |-&lt;br /&gt;
 |28&lt;br /&gt;
 |LEVEL&lt;br /&gt;
 |Bestimmung des Startpunktes für die Wellenform&lt;br /&gt;
 |-&lt;br /&gt;
 |29&lt;br /&gt;
 |TIME/DIV&lt;br /&gt;
 |Wahl der Ablenkzeiten&lt;br /&gt;
 |-&lt;br /&gt;
 |30&lt;br /&gt;
 |SWP.VAR&lt;br /&gt;
 |Feineinstellung der Ablenkzeit&lt;br /&gt;
 |-&lt;br /&gt;
 |31&lt;br /&gt;
 |x10 MAG&lt;br /&gt;
 |Vergrößerung um den Faktor 10&lt;br /&gt;
 |-&lt;br /&gt;
 |32&lt;br /&gt;
 |&amp;lt; &amp;gt; POSITION &lt;br /&gt;
 |Einstellung der horizontalen Position&lt;br /&gt;
 |-&lt;br /&gt;
 |33&lt;br /&gt;
 |FILTER&lt;br /&gt;
 |Filter zum einfachen Ablesen der Wellenformen&lt;br /&gt;
 |-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[bild:Voltcraft 630-2 Rear.PNG|640px]]&lt;br /&gt;
&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |Nummer&lt;br /&gt;
 |Bezeichnung&lt;br /&gt;
 |Funktion&lt;br /&gt;
 |-&lt;br /&gt;
 |34&lt;br /&gt;
 |Z AXIS INPUT&lt;br /&gt;
 |Eingangsbuchse für externes Intensitätsmodulationssignal&lt;br /&gt;
 |-&lt;br /&gt;
 |35&lt;br /&gt;
 |CH1 SIGNAL OUTPUT&lt;br /&gt;
 |CH1 Ausgangssignal für Frequenzmesser&lt;br /&gt;
 |-&lt;br /&gt;
 |36&lt;br /&gt;
 |&lt;br /&gt;
 |Ständer&lt;br /&gt;
 |-&lt;br /&gt;
 |37&lt;br /&gt;
 |&lt;br /&gt;
 |SICHERUNG &amp;amp; Netzspannungswahlschalter&lt;br /&gt;
 |-&lt;br /&gt;
 |38&lt;br /&gt;
 |&lt;br /&gt;
 |AC Eingangsbuchse&lt;br /&gt;
 |-&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
===Grundeinstellungen===&lt;br /&gt;
Wenn man neue Messungen beginnen will, sollte man das Oszilloskop vor dem Einschalten in die Grundeinstellung bringen.&lt;br /&gt;
&lt;br /&gt;
====Einkanal-Betrieb====&lt;br /&gt;
&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |Nummer&lt;br /&gt;
 |Bezeichnung&lt;br /&gt;
 |Einstellung&lt;br /&gt;
 |-&lt;br /&gt;
 |2&lt;br /&gt;
 |INTEN&lt;br /&gt;
 |Mittelstellung&lt;br /&gt;
 |-&lt;br /&gt;
 |3&lt;br /&gt;
 |FOCUS&lt;br /&gt;
 |Mittelstellung&lt;br /&gt;
 |-&lt;br /&gt;
 |7&lt;br /&gt;
 |CH1 VOLTS/DIV&lt;br /&gt;
 |0.5V/DIV&lt;br /&gt;
 |-&lt;br /&gt;
 |9&lt;br /&gt;
 |CH1 VARIABLE&lt;br /&gt;
 |CAL (Position im Uhrzeigersinn)&lt;br /&gt;
 |-&lt;br /&gt;
 |10&lt;br /&gt;
 |CH1 AC-GND-DC&lt;br /&gt;
 |GND&lt;br /&gt;
 |-&lt;br /&gt;
 |11&lt;br /&gt;
 |CH1 ^ v POSITION&lt;br /&gt;
 |Mittelstellung&lt;br /&gt;
 |-&lt;br /&gt;
 |14&lt;br /&gt;
 |VERT MODE&lt;br /&gt;
 |CH1&lt;br /&gt;
 |-&lt;br /&gt;
 |16&lt;br /&gt;
 |CH2 INV&lt;br /&gt;
 |OFF&lt;br /&gt;
 |-&lt;br /&gt;
 |18&lt;br /&gt;
 |CH2 AC-GND-DC&lt;br /&gt;
 |GND&lt;br /&gt;
 |-&lt;br /&gt;
 |19&lt;br /&gt;
 |CH2 ^ v POSITION&lt;br /&gt;
 |Mittelstellung&lt;br /&gt;
 |-&lt;br /&gt;
 |21&lt;br /&gt;
 |CH2 VARIABLE&lt;br /&gt;
 |CAL (Position im Uhrzeigersinn)&lt;br /&gt;
 |-&lt;br /&gt;
 |22&lt;br /&gt;
 |CH2 VOLTS/DIV&lt;br /&gt;
 |0.5V/DIV&lt;br /&gt;
 |-&lt;br /&gt;
 |23&lt;br /&gt;
 |SOURCE&lt;br /&gt;
 |CH1&lt;br /&gt;
 |-&lt;br /&gt;
 |25&lt;br /&gt;
 |TRIGGER MODE&lt;br /&gt;
 |AUTO&lt;br /&gt;
 |-&lt;br /&gt;
 |26&lt;br /&gt;
 |SLOPE&lt;br /&gt;
 | + &lt;br /&gt;
 |-&lt;br /&gt;
 |27&lt;br /&gt;
 |TRIG.ALT&lt;br /&gt;
 |OFF&lt;br /&gt;
 |-&lt;br /&gt;
 |29&lt;br /&gt;
 |TIME/DIV&lt;br /&gt;
 |0.5ms/DIV&lt;br /&gt;
 |-&lt;br /&gt;
 |30&lt;br /&gt;
 |SWP.VAR&lt;br /&gt;
 |CAL&lt;br /&gt;
 |-&lt;br /&gt;
 |31&lt;br /&gt;
 |x10 MAG&lt;br /&gt;
 |OFF&lt;br /&gt;
 |-&lt;br /&gt;
 |32&lt;br /&gt;
 |&amp;lt; &amp;gt; POSITION &lt;br /&gt;
 |Mittelstellung&lt;br /&gt;
 |-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Zweikanal-Betrieb====&lt;br /&gt;
Für den Zweikanal-Betrieb wählt man zunächst alle Einstellungen des [[Oszilloskop_-_Tutorial#Einkanal-Betrieb|Einkanal-Betriebs]].&lt;br /&gt;
&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |Nummer&lt;br /&gt;
 |Bezeichnung&lt;br /&gt;
 |Einstellung&lt;br /&gt;
 |-&lt;br /&gt;
 |14&lt;br /&gt;
 |VERT MODE&lt;br /&gt;
 |DUAL&lt;br /&gt;
 |-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Inbetriebnahme====&lt;br /&gt;
=====Power=====&lt;br /&gt;
Wenn der Netzspannungswahlschalter (37) einmalig auf die richtige Netzspannung (AC 115V oder 230V) und die Grundeinstellung für den Einkanal- oder Zweikanal-Betrieb eingestellt wurde, kann das Oszilloskop mit dem Hauptschalter (6) eingeschaltet werden. Die POWER LED (5) leuchtet auf.&lt;br /&gt;
&lt;br /&gt;
=====Strahlabgleich=====&lt;br /&gt;
Nach dem Einschalten des Oszilloskops in der Grundstellung sollte nach höchstens 20 Sekunden die horizontale Strahllinie auf dem Bildschirm erscheinen. Ist dies nicht der Fall, dann zunächst den INTEN Helligkeits-Regler (2) weiter nach rechts drehen bis die Linie erscheint. Gut eingestellt ist die Helligkeit, wenn die Linie deutlich zu erkennen aber nicht überstrahlt ist.&lt;br /&gt;
&lt;br /&gt;
Sieht die Strahllinie nicht scharf begrenzt aus, kann man die Schärfe noch mit dem FOCUS Regler (3) optimal einstellen. Dies ist der Fall, wenn die Linie möglichst dünn aussieht.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Digital Oszilloskop==&lt;br /&gt;
Wer möchte diesen Abschnitt übernehmen?&lt;br /&gt;
&lt;br /&gt;
===Prinzip===&lt;br /&gt;
===Bedienelemente===&lt;br /&gt;
===Grundeinstellungen===&lt;br /&gt;
====Einkanal-Betrieb====&lt;br /&gt;
====Zweikanal-Betrieb====&lt;br /&gt;
====Power====&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Grundlagen]]	 &lt;br /&gt;
[[Kategorie:Praxis]]&lt;br /&gt;
[[Kategorie:Elektronik]]&lt;br /&gt;
&lt;br /&gt;
=Autoren=&lt;br /&gt;
--[[Benutzer:Dirk|Dirk]] 21:04, 15. Jul 2014 (CET)&lt;/div&gt;</summary>
		<author><name>Dirk NO2</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Oszilloskop_-_Tutorial&amp;diff=24924</id>
		<title>Oszilloskop - Tutorial</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Oszilloskop_-_Tutorial&amp;diff=24924"/>
				<updated>2014-07-18T15:37:00Z</updated>
		
		<summary type="html">&lt;p&gt;Dirk NO2: /* Strahlabgleich */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[bild:Voltcraft 630-2.JPG|right|500px]]&lt;br /&gt;
&lt;br /&gt;
=Allgemein=&lt;br /&gt;
Ein Oszilloskop-Tutorial gehört auch hier im RN-Wissen zu den [[Wunschthemen|Wunsch-Artikeln]]. Es gibt im Netz zwar auch schon gute Tutorials, aber hier soll versucht werden, möglichst einfach an das Thema heran zu gehen. Ich werde mich hauptsächlich mit dem analogen Oszilloskop am Beispiel des [http://www.conrad.de/ce/de/product/122421/VOLTCRAFT-VC-630-2-Analoges-2-Kanal-Oszilloskop-Bandbreite-0-DC-bis-30-MHz Voltcraft 630-2] beschäftigen. Die Bedienelemente dieses Oszilloskops werden sich ähnlich auch bei allen anderen Typen finden.&lt;br /&gt;
&lt;br /&gt;
Ich würde mir wünschen, dass jemand den Abschnitt zum [[Oszilloskop_-_Tutorial#Digital_Oszilloskop|digitalen Oszilloskop]] übernimmt.&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Analog Oszilloskop==&lt;br /&gt;
===Prinzip===&lt;br /&gt;
&lt;br /&gt;
[[bild:Voltcraft 630-2 Schematic.PNG|640px]]&lt;br /&gt;
&lt;br /&gt;
===Bedienelemente===&lt;br /&gt;
[[bild:Voltcraft 630-2 Front.PNG|640px]]&lt;br /&gt;
&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |Nummer&lt;br /&gt;
 |Bezeichnung&lt;br /&gt;
 |Funktion&lt;br /&gt;
 |-&lt;br /&gt;
 |1&lt;br /&gt;
 |CAL&lt;br /&gt;
 |Kalibrierspannung&lt;br /&gt;
 |-&lt;br /&gt;
 |2&lt;br /&gt;
 |INTEN&lt;br /&gt;
 |Helligkeit des Elektronenstrahls&lt;br /&gt;
 |-&lt;br /&gt;
 |3&lt;br /&gt;
 |FOCUS&lt;br /&gt;
 |Fokussierung auf das schärfste Bild&lt;br /&gt;
 |-&lt;br /&gt;
 |4&lt;br /&gt;
 |TRACE ROTATION&lt;br /&gt;
 |Abstimmung der horizontalen Spur mit den Rasterlinien&lt;br /&gt;
 |-&lt;br /&gt;
 |5&lt;br /&gt;
 |LED&lt;br /&gt;
 |Power Anzeige&lt;br /&gt;
 |-&lt;br /&gt;
 |6&lt;br /&gt;
 |POWER&lt;br /&gt;
 |Hauptschalter&lt;br /&gt;
 |-&lt;br /&gt;
 |7&lt;br /&gt;
 |CH1 VOLTS/DIV&lt;br /&gt;
 |CH1 Vertikalachsen-Empfindlichkeit&lt;br /&gt;
 |-&lt;br /&gt;
 |8&lt;br /&gt;
 |CH1 (X)&lt;br /&gt;
 |Vertikaler Eingang für CH1 und X-Achse im X-Y-Betrieb&lt;br /&gt;
 |-&lt;br /&gt;
 |9&lt;br /&gt;
 |CH1 VARIABLE CH1&lt;br /&gt;
 |CH1 Empfindlichkeit Feineinstellung&lt;br /&gt;
 |-&lt;br /&gt;
 |10&lt;br /&gt;
 |CH1 AC-GND-DC&lt;br /&gt;
 |CH1 Vertikalverstärker-Kopplung&lt;br /&gt;
 |-&lt;br /&gt;
 |11&lt;br /&gt;
 |CH1 ^ v POSITION&lt;br /&gt;
 |CH1 Vertikale Positionierung&lt;br /&gt;
 |-&lt;br /&gt;
 |12&lt;br /&gt;
 |ALT/CHOP&lt;br /&gt;
 |Anzeigeart im Zweikanal-Modus&lt;br /&gt;
 |-&lt;br /&gt;
 |13&lt;br /&gt;
 |CH1 DC BAL&lt;br /&gt;
 |CH1 Dämpferabgleich&lt;br /&gt;
 |-&lt;br /&gt;
 |14&lt;br /&gt;
 |VERT MODE&lt;br /&gt;
 |Auswahl der Betriebsart&lt;br /&gt;
 |-&lt;br /&gt;
 |15&lt;br /&gt;
 |GND&lt;br /&gt;
 |Masseanschluss des Gehäuses&lt;br /&gt;
 |-&lt;br /&gt;
 |16&lt;br /&gt;
 |CH2 INV&lt;br /&gt;
 |Eingangssignal von CH2 wird invertiert&lt;br /&gt;
 |-&lt;br /&gt;
 |17&lt;br /&gt;
 |CH2 DC BAL&lt;br /&gt;
 |CH2 Dämpferabgleich&lt;br /&gt;
 |-&lt;br /&gt;
 |18&lt;br /&gt;
 |CH2 AC-GND-DC&lt;br /&gt;
 |CH2 Vertikalverstärker-Kopplung&lt;br /&gt;
 |-&lt;br /&gt;
 |19&lt;br /&gt;
 |CH2 ^ v POSITION&lt;br /&gt;
 |CH2 Vertikale Positionierung&lt;br /&gt;
 |-&lt;br /&gt;
 |20&lt;br /&gt;
 |CH2 (Y)&lt;br /&gt;
 |Vertikaler Eingang für CH2 und Y-Achse im X-Y-Betrieb&lt;br /&gt;
 |-&lt;br /&gt;
 |21&lt;br /&gt;
 |CH2 VARIABLE&lt;br /&gt;
 |CH2 Empfindlichkeit Feineinstellung&lt;br /&gt;
 |-&lt;br /&gt;
 |22&lt;br /&gt;
 |CH2 VOLTS/DIV&lt;br /&gt;
 |CH2 Vertikalachsen-Empfindlichkeit&lt;br /&gt;
 |-&lt;br /&gt;
 |23&lt;br /&gt;
 |SOURCE&lt;br /&gt;
 |Auswahl des externen oder internen Triggersignals&lt;br /&gt;
 |-&lt;br /&gt;
 |24&lt;br /&gt;
 |EXT TRIG IN&lt;br /&gt;
 |Eingangsbuchse für externes Triggersignal&lt;br /&gt;
 |-&lt;br /&gt;
 |25&lt;br /&gt;
 |TRIGGER MODE&lt;br /&gt;
 |Auswahl des Triggermodus&lt;br /&gt;
 |-&lt;br /&gt;
 |26&lt;br /&gt;
 |SLOPE&lt;br /&gt;
 |Auswahl der Triggerflanke&lt;br /&gt;
 |-&lt;br /&gt;
 |27&lt;br /&gt;
 |TRIG.ALT&lt;br /&gt;
 |Internes Triggersignal alterniert zwischen CH1 und CH2&lt;br /&gt;
 |-&lt;br /&gt;
 |28&lt;br /&gt;
 |LEVEL&lt;br /&gt;
 |Bestimmung des Startpunktes für die Wellenform&lt;br /&gt;
 |-&lt;br /&gt;
 |29&lt;br /&gt;
 |TIME/DIV&lt;br /&gt;
 |Wahl der Ablenkzeiten&lt;br /&gt;
 |-&lt;br /&gt;
 |30&lt;br /&gt;
 |SWP.VAR&lt;br /&gt;
 |Feineinstellung der Ablenkzeit&lt;br /&gt;
 |-&lt;br /&gt;
 |31&lt;br /&gt;
 |x10 MAG&lt;br /&gt;
 |Vergrößerung um den Faktor 10&lt;br /&gt;
 |-&lt;br /&gt;
 |32&lt;br /&gt;
 |&amp;lt; &amp;gt; POSITION &lt;br /&gt;
 |Einstellung der horizontalen Position&lt;br /&gt;
 |-&lt;br /&gt;
 |33&lt;br /&gt;
 |FILTER&lt;br /&gt;
 |Filter zum einfachen Ablesen der Wellenformen&lt;br /&gt;
 |-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[bild:Voltcraft 630-2 Rear.PNG|640px]]&lt;br /&gt;
&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |Nummer&lt;br /&gt;
 |Bezeichnung&lt;br /&gt;
 |Funktion&lt;br /&gt;
 |-&lt;br /&gt;
 |34&lt;br /&gt;
 |Z AXIS INPUT&lt;br /&gt;
 |Eingangsbuchse für externes Intensitätsmodulationssignal&lt;br /&gt;
 |-&lt;br /&gt;
 |35&lt;br /&gt;
 |CH1 SIGNAL OUTPUT&lt;br /&gt;
 |CH1 Ausgangssignal für Frequenzmesser&lt;br /&gt;
 |-&lt;br /&gt;
 |36&lt;br /&gt;
 |&lt;br /&gt;
 |Ständer&lt;br /&gt;
 |-&lt;br /&gt;
 |37&lt;br /&gt;
 |&lt;br /&gt;
 |SICHERUNG &amp;amp; Netzspannungswahlschalter&lt;br /&gt;
 |-&lt;br /&gt;
 |38&lt;br /&gt;
 |&lt;br /&gt;
 |AC Eingangsbuchse&lt;br /&gt;
 |-&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
===Grundeinstellungen===&lt;br /&gt;
Wenn man neue Messungen beginnen will, sollte man das Oszilloskop vor dem Einschalten in die Grundeinstellung bringen.&lt;br /&gt;
&lt;br /&gt;
====Einkanal-Betrieb====&lt;br /&gt;
&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |Nummer&lt;br /&gt;
 |Bezeichnung&lt;br /&gt;
 |Einstellung&lt;br /&gt;
 |-&lt;br /&gt;
 |2&lt;br /&gt;
 |INTEN&lt;br /&gt;
 |Mittelstellung&lt;br /&gt;
 |-&lt;br /&gt;
 |3&lt;br /&gt;
 |FOCUS&lt;br /&gt;
 |Mittelstellung&lt;br /&gt;
 |-&lt;br /&gt;
 |7&lt;br /&gt;
 |CH1 VOLTS/DIV&lt;br /&gt;
 |0.5V/DIV&lt;br /&gt;
 |-&lt;br /&gt;
 |9&lt;br /&gt;
 |CH1 VARIABLE&lt;br /&gt;
 |CAL (Position im Uhrzeigersinn)&lt;br /&gt;
 |-&lt;br /&gt;
 |10&lt;br /&gt;
 |CH1 AC-GND-DC&lt;br /&gt;
 |GND&lt;br /&gt;
 |-&lt;br /&gt;
 |11&lt;br /&gt;
 |CH1 ^ v POSITION&lt;br /&gt;
 |Mittelstellung&lt;br /&gt;
 |-&lt;br /&gt;
 |14&lt;br /&gt;
 |VERT MODE&lt;br /&gt;
 |CH1&lt;br /&gt;
 |-&lt;br /&gt;
 |16&lt;br /&gt;
 |CH2 INV&lt;br /&gt;
 |OFF&lt;br /&gt;
 |-&lt;br /&gt;
 |18&lt;br /&gt;
 |CH2 AC-GND-DC&lt;br /&gt;
 |GND&lt;br /&gt;
 |-&lt;br /&gt;
 |19&lt;br /&gt;
 |CH2 ^ v POSITION&lt;br /&gt;
 |Mittelstellung&lt;br /&gt;
 |-&lt;br /&gt;
 |21&lt;br /&gt;
 |CH2 VARIABLE&lt;br /&gt;
 |CAL (Position im Uhrzeigersinn)&lt;br /&gt;
 |-&lt;br /&gt;
 |22&lt;br /&gt;
 |CH2 VOLTS/DIV&lt;br /&gt;
 |0.5V/DIV&lt;br /&gt;
 |-&lt;br /&gt;
 |23&lt;br /&gt;
 |SOURCE&lt;br /&gt;
 |CH1&lt;br /&gt;
 |-&lt;br /&gt;
 |25&lt;br /&gt;
 |TRIGGER MODE&lt;br /&gt;
 |AUTO&lt;br /&gt;
 |-&lt;br /&gt;
 |26&lt;br /&gt;
 |SLOPE&lt;br /&gt;
 | + &lt;br /&gt;
 |-&lt;br /&gt;
 |27&lt;br /&gt;
 |TRIG.ALT&lt;br /&gt;
 |OFF&lt;br /&gt;
 |-&lt;br /&gt;
 |29&lt;br /&gt;
 |TIME/DIV&lt;br /&gt;
 |0.5ms/DIV&lt;br /&gt;
 |-&lt;br /&gt;
 |30&lt;br /&gt;
 |SWP.VAR&lt;br /&gt;
 |CAL&lt;br /&gt;
 |-&lt;br /&gt;
 |31&lt;br /&gt;
 |x10 MAG&lt;br /&gt;
 |OFF&lt;br /&gt;
 |-&lt;br /&gt;
 |32&lt;br /&gt;
 |&amp;lt; &amp;gt; POSITION &lt;br /&gt;
 |Mittelstellung&lt;br /&gt;
 |-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Zweikanal-Betrieb====&lt;br /&gt;
Für den Zweikanal-Betrieb wählt man zunächst alle Einstellungen des [[Oszilloskop_-_Tutorial#Einkanal-Betrieb|Einkanal-Betriebs]].&lt;br /&gt;
&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
 |Nummer&lt;br /&gt;
 |Bezeichnung&lt;br /&gt;
 |Einstellung&lt;br /&gt;
 |-&lt;br /&gt;
 |14&lt;br /&gt;
 |VERT MODE&lt;br /&gt;
 |DUAL&lt;br /&gt;
 |-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Power====&lt;br /&gt;
Wenn der Netzspannungswahlschalter (37) einmalig auf die richtige Netzspannung (AC 115V oder 230V) und die Grundeinstellung für den Einkanal- oder Zweikanal-Betrieb eingestellt wurde, kann das Oszilloskop mit dem Hauptschalter (6) eingeschaltet werden. Die POWER LED (5) leuchtet auf.&lt;br /&gt;
&lt;br /&gt;
====Strahlabgleich====&lt;br /&gt;
Nach dem Einschalten des Oszilloskops in der Grundstellung sollte nach höchstens 20 Sekunden die horizontale Strahllinie auf dem Bildschirm erscheinen. Ist dies nicht der Fall, dann zunächst den INTEN Helligkeits-Regler (2) weiter nach rechts drehen bis die Linie erscheint. Gut eingestellt ist die Helligkeit, wenn die Linie deutlich zu erkennen aber nicht überstrahlt ist.&lt;br /&gt;
&lt;br /&gt;
Sieht die Strahllinie nicht scharf begrenzt aus, kann man die Schärfe noch mit dem FOCUS Regler (3) optimal einstellen. Dies ist der Fall, wenn die Linie möglichst dünn aussieht.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Digital Oszilloskop==&lt;br /&gt;
Wer möchte diesen Abschnitt übernehmen?&lt;br /&gt;
&lt;br /&gt;
===Prinzip===&lt;br /&gt;
===Bedienelemente===&lt;br /&gt;
===Grundeinstellungen===&lt;br /&gt;
====Einkanal-Betrieb====&lt;br /&gt;
====Zweikanal-Betrieb====&lt;br /&gt;
====Power====&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Grundlagen]]	 &lt;br /&gt;
[[Kategorie:Praxis]]&lt;br /&gt;
[[Kategorie:Elektronik]]&lt;br /&gt;
&lt;br /&gt;
=Autoren=&lt;br /&gt;
--[[Benutzer:Dirk|Dirk]] 21:04, 15. Jul 2014 (CET)&lt;/div&gt;</summary>
		<author><name>Dirk NO2</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=RP6_Sensor_Board_und_Xtra_Module&amp;diff=24818</id>
		<title>RP6 Sensor Board und Xtra Module</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=RP6_Sensor_Board_und_Xtra_Module&amp;diff=24818"/>
				<updated>2014-07-08T15:27:33Z</updated>
		
		<summary type="html">&lt;p&gt;Dirk NO2: /* Autoren */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Bild:RP6_Sensor_Board.jpg|Das RP6 Sensor Board|right|500px]]&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_Xtra_module.JPG|RP6 Xtra module|right|500px]]&lt;br /&gt;
==Was bisher geschah==&lt;br /&gt;
'''Siehe auch &amp;quot;Was bisher geschah&amp;quot; im [http://www.rn-wissen.de/index.php/RP6v2#Was_bisher_geschah RP6v2] und im [http://www.rn-wissen.de/index.php/RP6#Was_bisher_geschah RP6] Artikel!'''&lt;br /&gt;
&lt;br /&gt;
Mit, 27. Nov 2013 - Ankündigung einer Sensorerweiterungsplatine, die an die RP6v2-M256-WIFI angeschlossen werden kann&amp;lt;br/&amp;gt;&lt;br /&gt;
Sam, 22. Feb 2014 - Auslieferungsbeginn des RP6 Sensor Boards, des I2C GPS Empfängers, des 3D Accelerometer Moduls und des Gyro Moduls&amp;lt;br/&amp;gt;&lt;br /&gt;
Mon, 17. Mär 2014 - Das RP6 Sensor Board ist &amp;quot;nicht lieferbar&amp;quot;, neuer Liefertermin angekündigt für den 12.06.2014 (!?)&amp;lt;br/&amp;gt;&lt;br /&gt;
Die, 25. Mär 2014 - Das RP6 Sensor Board ist wieder &amp;quot;sofort lieferbar&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Allgemein==&lt;br /&gt;
Dieser Artikel beschreibt die Grundlagen und Programmierung des RP6 Sensor Boards und der RP6 Xtra Module. Dieses Erweiterungs-Modul und die Xtra Module sind Teile des RP6-Systems, das in den RN-Wissen-Artikeln [[RP6]], [[RP6v2]] und [[RP6_-_Programmierung|RP6 - Programmierung]] ausführlich beschrieben wird. Ausgegliedert aus den &amp;quot;Haupt-Artikeln&amp;quot; habe ich diese Module, da sie m.E. zu einer neuen &amp;quot;Ära&amp;quot; des RP6-Systems gehören:&lt;br /&gt;
&lt;br /&gt;
Sie wurden nicht mehr von '''[[Benutzer:SlyD|SlyD]] (Dominik S. Herwald)''' in Zusammenarbeit mit '''[http://www.arexx.com/ AREXX]''' entwickelt, sondern nun von '''[http://jm3-engineering.com/ JM3 Engeneering] (Dipl.-Ing. Jürgen Maisel)'''. Ab Februar 2014 waren dann das '''RP6 Sensor Board RP6-JM03-61''' ([http://www.conrad.de/ce/de/product/1082384/Arexx-RP6-Sensor-Board-RP6-JM03-61 1082384]) und die drei RP6 Xtra Module '''I2C GPS Empfänger JM3-GPS''' ([http://www.conrad.de/ce/de/product/1082385/Arexx-IC-GPS-Empfaenger-JM3-GPS 1082385]), '''Gyro Modul JM3-GYRO''' ([http://www.conrad.de/ce/de/product/1082386/Arexx-Gyro-Modul-JM3-GYRO 1082386]) und '''3D Accelerometer Modul JM3-3DA''' ([http://www.conrad.de/ce/de/product/1082387/Arexx-3D-Accelerometer-Modul-JM3-3DA 1082387]) bei CONRAD lieferbar. Einen ersten Eindruck vom Sensor Board kann man im RoboterNetz und AREXX Support Forum bekommen,- siehe unter [[RP6_Sensor_Board_und_Xtra_Module#Weblinks|Weblinks]]!&lt;br /&gt;
&lt;br /&gt;
===RP6 Sensor Board===&lt;br /&gt;
Das [[RP6_Sensor_Board_und_Xtra_Module#RP6_Sensor_Board_2|RP6 Sensor Board]] gehört zu den &amp;quot;Erweiterungs-Modulen&amp;quot; des RP6-Systems. '''Andere &amp;quot;Erweiterungs-Module&amp;quot; werden im [[RP6v2#Erweiterungs-Module|RP6v2]] und im [[RP6#Erweiterungs-Module|RP6]] Artikel beschrieben!'''&lt;br /&gt;
&lt;br /&gt;
Das ''RP6 Sensor Board'' ist das erste &amp;quot;Erweiterungs-Modul&amp;quot;, das nicht über einen eigenen Microprozessor verfügt,- es ist also ein ''passives Modul'', das von einem Microprozessor-System (z.B. RP6v2, M32, M128, M256 Wifi) angesteuert werden muss. Es ist ebenfalls das erste Modul, das nicht mehr über die rautenförmige Einbuchtung an der Vorderkante verfügt, sondern komplett rechteckig ist. Damit passt es (montiert auf den Standard-Abstandbolzen) nur auf den vorderen Platinenstapel 1 des RP6.&lt;br /&gt;
&lt;br /&gt;
===RP6 Xtra Module===&lt;br /&gt;
Die [[RP6_Sensor_Board_und_Xtra_Module#RP6_Xtra_Module_2|RP6 Xtra Module]] gehören zu den &amp;quot;Zubehör- und Ersatzteilen&amp;quot; des RP6-Systems. '''Über die weiteren &amp;quot;Zubehör- und Ersatzteile&amp;quot; zum RP6 informiert der entsprechende Abschnitt im [[RP6v2#Zubeh.C3.B6r_und_Ersatzteile|RP6v2]] und im [[RP6#Zubehör und Ersatzteile|RP6]] Artikel!'''&lt;br /&gt;
&lt;br /&gt;
Die ''RP6 Xtra Module'' unterscheiden sich von den weiteren &amp;quot;Zubehör- und Ersatzteilen&amp;quot; dadurch, dass sie selbstständige Sensor-Platinen sind, die ideal zum RP6-System passen, aber auch mit anderen Microcontroller-Plattformen nutzbar sind.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==RP6 Sensor Board==&lt;br /&gt;
Das RP6 Sensor Board RP6-JM03-61 ([http://www.conrad.de/ce/de/product/1082384/Arexx-RP6-Sensor-Board-RP6-JM03-61 1082384]) wurde am 27.11.2013 von [[Benutzer:SlyD|SlyD]] angekündigt (siehe Weblink!).&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_Sensor_Board.jpg|Das RP6 Sensor Board]]&lt;br /&gt;
&lt;br /&gt;
===Beschreibung===&lt;br /&gt;
(Laut Online-Katalog der Firma CONRAD!)&lt;br /&gt;
&lt;br /&gt;
''&amp;quot;Das RP6 Sensor Board erweitert die Möglichkeiten aller RP6 Roboter um wesentliche Sensorsignale für Robotik-Anwendungen wie zum Beispiel Dreharten (Yaw-Gyro), Kipp- und Neigewinkel, Kompassrichtung oder aber auch Zeit und Datum.&lt;br /&gt;
Sie können einfach mit zusätzlichen Sharp Sensoren Abstände genau messen, z.B. für autonome Fahrrouten oder falls der Sensor nach unten gerichtet ist, kann er Treppenstufen oder ähnliches entdecken. Außerdem gibt es die Möglichkeit z.B. die Sharp Sensoren ein- bzw. auszuschalten um Strom zu sparen. Zusätzlich können bis zu 8 Servos angesteuert werden um z.B. einen Roboterarm zu bewegen, der auch mechanisch einfach zu montieren ist. Um die Möglichkeiten des RP6 Sensor Boards komplett ausnutzen zu können, wird ein RP6V2 und RP6Wifi Control Board empfohlen. Die ermöglicht den Roboter über Wifi fernzusteuern oder Sensordaten auf dem Kommandozentrum (PC) z.B Kompassdaten, Temperatur oder Kipp- und Neigewinkel anzeigen zu lassen.&amp;quot;''&lt;br /&gt;
&lt;br /&gt;
'''Ausstattung'''&lt;br /&gt;
* Magnetometer- und Accelerometer für Kompassfunktion&lt;br /&gt;
* Gyro Sensor (Yaw)&lt;br /&gt;
* Sharp-Sensor Schnittstelle&lt;br /&gt;
* LED Scheinwerfer&lt;br /&gt;
* LED Treiber mit Smart Funktionen&lt;br /&gt;
* I²C Bus mit max. 400 kHz Übertragungsrate; Hot Swap I²C-Bus Buffer&lt;br /&gt;
* Taster mit LED&lt;br /&gt;
* Echtzeit-Uhr RTC&lt;br /&gt;
* Backupbatterie (Aufladung während des Betriebs)&lt;br /&gt;
* Expansion Port z.B. für GPS-I²C Bus Modul&lt;br /&gt;
* 8 Servo-Ausgänge mit eigenem Schaltregler&lt;br /&gt;
* 8 PWM Ausgänge&lt;br /&gt;
* 5 LED Ausgänge und 2 Digital-I/O Ausgänge.&lt;br /&gt;
&lt;br /&gt;
'''Lieferumfang'''&lt;br /&gt;
* RP6 Sensor Board&lt;br /&gt;
* Montage-Kit&lt;br /&gt;
* Kabel&lt;br /&gt;
* Anleitung und CD mit Dokumentation.&lt;br /&gt;
&lt;br /&gt;
====Blockschaltbild====&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_Sensor_Board_BSP.png|RP6 Sensor Board Blockschaltbild]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Technische Daten===&lt;br /&gt;
{|  {{Blauetabelle}} &lt;br /&gt;
|'''Mikrocontroller:'''&lt;br /&gt;
|kein&lt;br /&gt;
|-&lt;br /&gt;
|'''Speicher:'''&lt;br /&gt;
|kein&amp;lt;br/&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|'''Programmierung:'''&lt;br /&gt;
|C++ (GCC, u.a.) über externes µC-System&lt;br /&gt;
|-&lt;br /&gt;
|'''Vorhandene Sensoren:'''&lt;br /&gt;
|Temperatur, 3D Magnetfeld (Kompass), 3D Beschleunigung, Yaw-Gyro&amp;lt;br/&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|'''Vorhandene Aktoren:'''&lt;br /&gt;
|LED Controller (2 LEDs on board, 5 freie LED Ports), Status LED,&amp;lt;br/&amp;gt;Button, Servo (PWM) Controller für 8 Servos und 8 PWM-Kanäle,&amp;lt;br/&amp;gt;Real Time Clock (RTC), 2 freie I/O Ports&lt;br /&gt;
|-&lt;br /&gt;
|'''Abmessungen:'''&lt;br /&gt;
|(L &amp;amp;times; B &amp;amp;times; H) 112 &amp;amp;times; 90 &amp;amp;times; 19 mm&amp;lt;br/&amp;gt;(B + 5 mm durch Scheinwerfer vorn)&lt;br /&gt;
|-&lt;br /&gt;
|'''Ausführung:'''&lt;br /&gt;
|Fertig aufgebautes Erweiterungsmodul&lt;br /&gt;
|-&lt;br /&gt;
|'''Stromversorgung:'''&lt;br /&gt;
|6 AA NiMH Akkus (über die RP6v2 Base)&amp;lt;br/&amp;gt;und optionaler Zusatzakku 7,2..10 V für Servo Power&lt;br /&gt;
|-&lt;br /&gt;
|'''Hersteller:'''&lt;br /&gt;
|Arexx Niederlande&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Umbau-Optionen===&lt;br /&gt;
Hier soll beschrieben werden, welche Umbau-Optionen es für das RP6 Sensor Board gibt. Im Text gibt es Verweise auf den Schaltplan des RP6 Sensor Boards (RP6_Sensor_Board_Rev2_Schema.pdf) in der Form: (SP2: Bauteil). Dies bedeutet, dass man das Bauteil auf Blatt 2 des Schaltplans finden kann. Beispielhaft sind im folgenden Text Bestell-Nummern der Firma [http://www.conrad.de/ce/ CONRAD] genannt. Natürlich kann man die Teile auch bei anderen Versendern beziehen.&lt;br /&gt;
&lt;br /&gt;
====USRBUS- und XBUS-Wannenstecker====&lt;br /&gt;
Der zweite Wannenstecker für den XBUS (SP3: K14) und USRBUS (SP3: K16) kann nachbestückt werden.&lt;br /&gt;
Man braucht dazu: &lt;br /&gt;
* 2 Wannenstecker 2x5-polig gerade RM 2,54mm (CONRAD [http://www.conrad.de/ce/de/product/741648/Stiftleiste-Print-Montage-gerade-Rastermass-254-mm-Pole-2-x-5-10120554-BKL-Electronic-Inhalt-1-St/ 741648])&lt;br /&gt;
Die Wannenstecker lötet man auf die eingezeichneten Positionen.&lt;br /&gt;
&lt;br /&gt;
'''USRBUS-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''USRBUS''' || '''Sensor Board-Funktion''' || '''Verwendung''' || '''I/O'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Y1 || &amp;quot;ADC0&amp;quot; || SHARP vorn || I&lt;br /&gt;
|-&lt;br /&gt;
| 2 || Y2 || &amp;quot;ADC1&amp;quot; || Yaw-Gyro || I&lt;br /&gt;
|-&lt;br /&gt;
| 3 || Y3 || PWR || Power für&amp;lt;br/&amp;gt;SHARPs, CAM_IF,&amp;lt;br/&amp;gt;I2C-MODULE || O&lt;br /&gt;
|-&lt;br /&gt;
| 4 || Y4 || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 5 || Y5 || &amp;quot;ADC4&amp;quot; || SHARP hinten ||I&lt;br /&gt;
|-&lt;br /&gt;
| 6..14 || Y6..Y14 || || keine ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
'''XBUS-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''XBUS''' || '''M256-Port''' ||'''M256-Funktion''' || '''Sensor Board-Funktion''' || '''Jumper''' || '''Verwendung''' || '''I/O'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || GND || || GND || GND || || ||&lt;br /&gt;
|-&lt;br /&gt;
| 2 || GND || || GND || GND || || ||&lt;br /&gt;
|-&lt;br /&gt;
| 3 || VDD || || VDD|| VDD_1 || || VDD +5V ||&lt;br /&gt;
|-&lt;br /&gt;
| 4 || +UB || || +UB || VSS_1 || || CAM_IF Power ||&lt;br /&gt;
|-&lt;br /&gt;
| 5 || VDD || || VDD || VDD_1 || || VDD +5V ||&lt;br /&gt;
|-&lt;br /&gt;
| 6 || +UB || || +UB || VSS_1 || || CAM_IF Power ||&lt;br /&gt;
|-&lt;br /&gt;
| 7 || INTU || PJ4 || PCINT13 || INTU || || keine || I&lt;br /&gt;
|-&lt;br /&gt;
| 8 || INT1 || PJ3 || PCINT12 || INT1 || 3 || LSM303DLHC: INT1 || I&lt;br /&gt;
|-&lt;br /&gt;
| 9 || INT3 || PJ5 || PCINT14 || INT3 || 2&amp;lt;br/&amp;gt;5 || DS1339: SQW/INT_N&amp;lt;br/&amp;gt;LSM303DLHC: INT2 || I&amp;lt;br/&amp;gt;I&lt;br /&gt;
|-&lt;br /&gt;
| 10 || SCL || PD0 || SCL || SCL_M || || I2C-Bus || O&lt;br /&gt;
|-&lt;br /&gt;
| 11 || INT2 || PJ6 || PCINT15 || INT2 || 4 || MAX7311: INT_N || I&lt;br /&gt;
|-&lt;br /&gt;
| 12 || SDA || PD1 || SDA || SDA_M || || I2C-Bus || I/O&lt;br /&gt;
|-&lt;br /&gt;
| 13 || MRESET || || MRESET || MRESET || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 14 || GND || || GND || GND || || ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====I/O-Patchfield_1====&lt;br /&gt;
Dieses 2x 5-polige &amp;quot;Patchfield_1&amp;quot; (SP3: K8), beschriftet mit &amp;quot;I/O&amp;quot; liegt neben dem Wannenstecker I/O und weist dieselbe Belegung auf. Möchte man auf dem Sensor Board Verbindungen über den Wannenstecker I/O zu einer angeschlossenen Microprozessor-Platine herstellen, dann kann man auf das &amp;quot;Patchfield_1&amp;quot; eine Stiftleiste löten.&lt;br /&gt;
Man braucht dazu: &lt;br /&gt;
* 2-reihige Stiftleiste RM 2,54mm (z.B. 2x40-polig [http://www.conrad.de/ce/de/product/741306/Doppelreihige-Stiftleiste-RM-254-gerade-Pole-2-x-40-10120173-BKL-Electronic-Inhalt-1-St 741306]) &lt;br /&gt;
Man trennt von der 2-reihigen Stiftleiste 2x5 Kontakte ab und lötet sie auf die Lötpunkte &amp;quot;I/O&amp;quot;. Zuvor muss man u.U. Lötzinnreste aus den Lötpunkten mit Entlötlitze bzw. Entlötsaugpumpe entfernen.&lt;br /&gt;
&lt;br /&gt;
'''Stecker I/O an M256 IO_PWM/T0/T1:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''M256-Port''' ||'''M256-Funktion''' || '''Sensor Board-Funktion''' || '''Verwendung''' || '''I/O'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || PD4 || ICP1 || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 2 || || GND || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 3 || PD6 || T1 || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 4 || PB7 || OC0A || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 5 || PG5 || OC0B || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 6 || PD7 || T0 || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 7 || PB5 || OC1A || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 8 || PK5 || ADC13 || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 9 || PB6 || OC1B || &amp;quot;PD5&amp;quot; || I2C Bus Buffer Enable || O&lt;br /&gt;
|-&lt;br /&gt;
| 10 || || VDD || || keine ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====ADC-Patchfield_2====&lt;br /&gt;
Dieses 2x 5-polige &amp;quot;Patchfield_2&amp;quot; (SP3: K9), beschriftet mit &amp;quot;ADC&amp;quot; liegt neben dem Wannenstecker ADC und weist dieselbe Belegung auf. Möchte man auf dem Sensor Board Verbindungen über den Wannenstecker ADC zu einer angeschlossenen Microprozessor-Platine herstellen, dann kann man auf das &amp;quot;Patchfield_2&amp;quot; eine Stiftleiste löten.&lt;br /&gt;
Man braucht dazu: &lt;br /&gt;
* 2-reihige Stiftleiste RM 2,54mm (z.B. 2x40-polig [http://www.conrad.de/ce/de/product/741306/Doppelreihige-Stiftleiste-RM-254-gerade-Pole-2-x-40-10120173-BKL-Electronic-Inhalt-1-St 741306]) &lt;br /&gt;
Man trennt von der 2-reihigen Stiftleiste 2x5 Kontakte ab und lötet sie auf die Lötpunkte &amp;quot;ADC&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
'''Stecker ADC an M256 ADC_IO2/CMP:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''M256-Port''' ||'''M256-Funktion''' || '''Sensor Board-Funktion''' || '''Jumper''' || '''Verwendung''' || '''I/O'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || PK0 || ADC8 || || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 2 || || GND || || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 3 || PK1 || ADC9 || &amp;quot;ADC4&amp;quot; || 6 || SHARP hinten || I&lt;br /&gt;
|-&lt;br /&gt;
| 4 || PE3 || OC3A/AIN1 || || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 5 || PK2 || ADC10 || || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 6 || || GND || || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 7 || PK3 || ADC11 || || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 8 || PE2 || XCK0/AIN0 || || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 9 || PK4 || ADC12 || || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 10 || || VDD || || || keine ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Anschluss-Optionen===&lt;br /&gt;
Hier soll beschrieben werden, welche Anschluss-Optionen es für das RP6 Sensor Board gibt. In erster Linie geht es dabei um die Belegung der vorhandenen Stecker bzw. Stiftleisten.&lt;br /&gt;
&lt;br /&gt;
Allgemein kann man Anschlüsse an Stiftleisten mit entsprechenden Steckbuchsen erreichen. Solche Steckbuchsen sind z.B. bei ELV erhältlich:&lt;br /&gt;
* Steckbuchse, 2-polig, RM 2,54mm ([http://www.elv.de/steckbuchse-2-polig.html ELV 68-016635])&lt;br /&gt;
* Steckbuchse, 3-polig, RM 2,54mm ([http://www.elv.de/steckbuchse-3-polig.html ELV 68-022503])&lt;br /&gt;
* Steckbuchse, 5-polig, RM 2,54mm ([http://www.elv.de/steckbuchse-5-polig.html ELV 68-023073])&lt;br /&gt;
Die Crimpkontakte dieser Steckbuchse werden an Litzen angequetscht (oder angelötet) und zum entsprechenden Sensor bzw. Aktor geführt. &lt;br /&gt;
&lt;br /&gt;
====I2C-MODULE====&lt;br /&gt;
Der I2C-MODULE Anschluss (SP1: M1) auf dem Sensor Board besteht aus einer 9-poligen Präzisions-Buchsenleiste RM 2,54mm (z.B. [http://www.conrad.de/ce/de/product/741360/Praezisions-Buchsenleiste-RM-254-gerade-Pole-1-x-20-10120832-BKL-Electronic-Inhalt-1-St 741360]). Wenn man eigene I2C-Module hier anschliessen will, braucht man zur Kontaktierung:&lt;br /&gt;
* Präzisions-Stiftleiste, 9-polig, RM 2,54mm (z.B. [http://www.conrad.de/ce/de/product/741307/Praezisions-Stiftleiste-RM-254-gerade-Pole-1-x-20-10120536-BKL-Electronic-Inhalt-1-St 741307])&lt;br /&gt;
&lt;br /&gt;
'''I2C-MODULE-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''Sensor Board&amp;lt;br/&amp;gt;-Funktion (M1)''' || '''Verwendung''' || '''I/O''' |||| [[RP6_Sensor_Board_und_Xtra_Module#I2C_GPS_Empf.C3.A4nger_JM3-GPS|'''I2C GPS Empfänger]]&amp;lt;br/&amp;gt;-Funktion (K1)'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || VCC || +5V || |||| VCC_1&lt;br /&gt;
|-&lt;br /&gt;
| 2 || SCLOUT || Buffered I2C-Bus || O |||| SCL/SCK&lt;br /&gt;
|-&lt;br /&gt;
| 3 || SDAOUT || Buffered I2C-Bus || I/O |||| SDA/MOSI&lt;br /&gt;
|-&lt;br /&gt;
| 4 || NC || keine || ||||&lt;br /&gt;
|-&lt;br /&gt;
| 5 || I/O1 || Status LED || O ||||&lt;br /&gt;
|-&lt;br /&gt;
| 6 || I/O2 || Taster || I ||||&lt;br /&gt;
|-&lt;br /&gt;
| 7 || NC || keine || ||||&lt;br /&gt;
|-&lt;br /&gt;
| 8 || GND || GND (geschaltet!) || |||| GND&lt;br /&gt;
|-&lt;br /&gt;
| 9 || GND || GND (geschaltet!) || |||| GND&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====CAM_IF====&lt;br /&gt;
Der CAM_IF Anschluss (SP1: K28) ist eine 2x 3-polige Stiftleiste mit der folgenden Belegung:&lt;br /&gt;
&lt;br /&gt;
'''CAM_IF-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''Sensor Board&amp;lt;br/&amp;gt;-Funktion (K28)''' || '''Verwendung''' || '''I/O'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || GND || GND (geschaltet!) ||&lt;br /&gt;
|-&lt;br /&gt;
| 2 || VSS_1 || +7,2..10V (RP6: +UB) ||&lt;br /&gt;
|-&lt;br /&gt;
| 3 || SCLOUT || Buffered I2C-Bus || O&lt;br /&gt;
|-&lt;br /&gt;
| 4 || SDAOUT || Buffered I2C-Bus || I/O&lt;br /&gt;
|-&lt;br /&gt;
| 5 || SCL_M || I2C-Bus || O&lt;br /&gt;
|-&lt;br /&gt;
| 6 || SDA_M || I2C-Bus || I/O&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====IO_EXT====&lt;br /&gt;
Der IO_EXT Anschluss (SP1: K19) ist eine 2x 2-polige Stiftleiste mit der folgenden Belegung:&lt;br /&gt;
&lt;br /&gt;
'''IO_EXT-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''Sensor Board&amp;lt;br/&amp;gt;-Funktion (K19)''' || '''Verwendung''' || '''I/O'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || MAX7311: I/O1.2 || freier I/O Port || I/O&lt;br /&gt;
|-&lt;br /&gt;
| 2 || GND || ||&lt;br /&gt;
|-&lt;br /&gt;
| 3 || MAX7311: I/O1.1 || freier I/O Port || I/O&lt;br /&gt;
|-&lt;br /&gt;
| 4 || GND || ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====PWM_OUT====&lt;br /&gt;
Der PWM_OUT Anschluss (SP5: K12) ist eine 2x 4-polige Stiftleiste mit der folgenden Belegung:&lt;br /&gt;
&lt;br /&gt;
'''PWM_OUT-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''Sensor Board&amp;lt;br/&amp;gt;-Funktion (K12)''' || '''Verwendung''' || '''I/O'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || PCA9685: PWM0 || freier PWM Port || O&lt;br /&gt;
|-&lt;br /&gt;
| 2 || PCA9685: PWM1 || freier PWM Port || O&lt;br /&gt;
|-&lt;br /&gt;
| 3 || PCA9685: PWM2 || freier PWM Port || O&lt;br /&gt;
|-&lt;br /&gt;
| 4 || PCA9685: PWM3 || freier PWM Port || O&lt;br /&gt;
|-&lt;br /&gt;
| 5 || PCA9685: PWM4 || freier PWM Port || O&lt;br /&gt;
|-&lt;br /&gt;
| 6 || PCA9685: PWM5 || freier PWM Port || O&lt;br /&gt;
|-&lt;br /&gt;
| 7 || PCA9685: PWM6 || freier PWM Port || O&lt;br /&gt;
|-&lt;br /&gt;
| 8 || PCA9685: PWM7 || freier PWM Port || O&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====TP1====&lt;br /&gt;
Am Testpunkt TP1 (SP4: TP1) kann man das Signal SQW/INT_N der RTC (DS1339) prüfen/messen.&lt;br /&gt;
&lt;br /&gt;
====LEDs====&lt;br /&gt;
=====Rücklichter=====&lt;br /&gt;
Der Rücklichter Anschluss (SP1: K10) ist eine 2-polige Stiftleiste mit der folgenden Belegung:&lt;br /&gt;
&lt;br /&gt;
'''Rücklichter-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''Sensor Board&amp;lt;br/&amp;gt;-Funktion (K10)''' || '''Verwendung''' || '''I/O'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || TCA6507: P3 || Rücklicht rechts || O&lt;br /&gt;
|-&lt;br /&gt;
| 2 || TCA6507: P4 || Rücklicht links || O&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=====Display-Hintergrundbeleuchtung=====&lt;br /&gt;
Der Display-Hintergrundbeleuchtung Anschluss (SP1: K7) ist eine 2-polige Stiftleiste mit der folgenden Belegung:&lt;br /&gt;
&lt;br /&gt;
'''Display-Hintergrundbeleuchtung-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''Sensor Board&amp;lt;br/&amp;gt;-Funktion (K7)''' || '''Verwendung''' || '''I/O'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || TCA6507: P0 || Display-Hintergrundbeleuchtung || O&lt;br /&gt;
|-&lt;br /&gt;
| 2 || VDD_1 || +5V ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=====Freie Ausgänge=====&lt;br /&gt;
Der freie Ausgang 1 Anschluss (SP1: K4) ist eine 2-polige Stiftleiste mit der folgenden Belegung:&lt;br /&gt;
&lt;br /&gt;
'''Freier Ausgang 1-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''Sensor Board&amp;lt;br/&amp;gt;-Funktion (K4)''' || '''Verwendung''' || '''I/O'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || TCA6507: P1 || freier LED Port || O&lt;br /&gt;
|-&lt;br /&gt;
| 2 || VDD_1 || +5V ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Der freie Ausgang 2 Anschluss (SP1: K2) ist eine 2-polige Stiftleiste mit der folgenden Belegung:&lt;br /&gt;
&lt;br /&gt;
'''Freier Ausgang 2-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''Sensor Board&amp;lt;br/&amp;gt;-Funktion (K2)''' || '''Verwendung''' || '''I/O'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || TCA6507: P2 || freier LED Port || O&lt;br /&gt;
|-&lt;br /&gt;
| 2 || VDD_1 || +5V ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====SHARP Sensoren====&lt;br /&gt;
Das RP6 Sensor Board verfügt über zwei Stecker SHARP_F (SP1: K5) und SHARP_R (SP1: K3) zum Anschluß von analogen SHARP Infrarot-Distanz-Sensoren. Folgende SHARP Sensoren sind anschließbar:&lt;br /&gt;
* 1. SHARP Distanz-Sensor GP2Y0A41SK0F ([http://www.conrad.de/ce/de/product/504596/Distanz-Sensor-GP2Y0A41SK0F-Sharp-GP2Y0A41SK0F-Messbereiche-Erfassungsbereich-4-30-cm-5-VDC 504596]), Messbereich 4..30cm&lt;br /&gt;
* 2. SHARP Distanz-Sensor GP2Y0A21YK0F ([http://www.conrad.de/ce/de/product/504591/Distanz-Sensor-GP2Y0A21YK0F-Sharp-GP2Y0A21YK0F-Messbereiche-Erfassungsbereich-10-80-cm-5-VDC 504591]), Messbereich 10..80cm&lt;br /&gt;
* 3. SHARP Distanz-Sensor GP2Y0A02YK ([http://www.conrad.de/ce/de/product/185364/Distanz-Sensor-GP-2-Y0A-02-YK-Sharp-GP-2-Y0A-02-YK-Messbereiche-Erfassungsbereich-20-150-cm-5-VDC 185364]), Messbereich 20..150cm&lt;br /&gt;
* 4. SHARP Distanz-Sensor GP2Y0A710K0F ([http://www.conrad.de/ce/de/product/504597/Distanz-Sensor-GP2Y0A710K0F-Sharp-GP2Y0A710K0F-Messbereiche-Erfassungsbereich-100-550-cm-5-VDC 504597]), Messbereich 100..550cm&lt;br /&gt;
''Die Auswahl der geeigneten SHARP Sensoren hängt von der gewünschten Funktion ab: Zur Erkundung großer Räume eignet sich insbesondere der Typ 4 mit einer hohen Reichweite von 5,5m. Er ist aber ungeeignet, die Distanz von Objekten zu erkennen, die sich näher als 1m vor dem Sensor befinden. Ein guter Kompromiss zwischen Nahbereichsmessung und &amp;quot;Fernsicht&amp;quot; sind die Typen 2 (10..80cm) und 3 (20..150cm). Will man den Distanz-Sensor vor allem zur Vermeidung eins Sturzes von einer Treppe (Tiefenerkennung) oder nur zur Erkennung von Hindernissen direkt vor dem Roboter (Kollisionserkennung) benutzen, dann eignet sich insbesondere für den vorderen Sensor (SHARP_F) der Typ 1, da er im Nahbereich von 4 bis 30cm messen kann.''&lt;br /&gt;
&lt;br /&gt;
Für die Verbindung zwischen den beiden 3-poligen JST XH Steckern (K3, 5) auf dem Sensor Board und den SHARP-Sensoren braucht man auf der Sensor Board Seite folgende Stecker-/buchsenteile:&lt;br /&gt;
* 2x JST XH Gehäuse, 3-polig, RM 2,5mm ([http://www.conrad.de/ce/de/product/740583/Gehaeuse-RM-25-mm-Serie-XH-Rastermass-25-mm-Pole-3-Nennstrom-3-A-XHP-3-JST-Inhalt-1-St 740583])&lt;br /&gt;
* 6x JST XH Crimpkontakt f. RM 2,5mm ([http://www.conrad.de/ce/de/product/741112/Crimpkontakt-fuer-RM-25-mm-Serie-XH-Rastermass-25-mm-BXH-001T-P06-JST-Inhalt-1-St 741112])&lt;br /&gt;
Die Crimpkontakte dieser Steckbuchse werden an die meist 3-adrige Litze des Sensors angequetscht (oder angelötet). Zur Belegung des Sensor Anschlusses siehe das jeweilige Datenblatt!&lt;br /&gt;
&lt;br /&gt;
=====Vorn=====&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_Sensor_Board_SHARP_F.JPG|RP6 Sensor Board SHARP Sensor vorn|thumb]]&lt;br /&gt;
&lt;br /&gt;
Der vordere SHARP Sensor kann auch mechanisch am Sensor Board befestigt werden. Dazu gibt es an der Vorderkante der Platine zwei Befestigungslöcher.&lt;br /&gt;
&lt;br /&gt;
Das Bild rechts zeigt den SHARP Distanzsensor GP2Y0A02YK montiert vorn auf dem Sensor Board mit zwei M3 Gelenkbolzen ([http://www.conrad.de/ce/de/product/521043/Gelenkbolzen-1-x-Aussengewinde1-x-Innengewinde-Messing-vernickelt-Schluesselweite-55-mm/ 521043]) und passenden Schrauben/Muttern.&lt;br /&gt;
&lt;br /&gt;
'''Vorn-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''RP6v2-Port''' ||'''RP6v2-Funktion''' || '''Sensor Board&amp;lt;br/&amp;gt;-Funktion (K5)''' || '''Verwendung''' || '''I/O''' |||| '''SHARP Sensor&amp;lt;br/&amp;gt;-Funktion''' &lt;br /&gt;
|-&lt;br /&gt;
| 1 || PA0 || ADC0 || &amp;quot;ADC0&amp;quot; || SHARP vorn || I |||| Vo&lt;br /&gt;
|-&lt;br /&gt;
| 2 || || || VDD_1 || +5V || |||| Vcc&lt;br /&gt;
|-&lt;br /&gt;
| 3 || || || GND || GND (geschaltet!) || |||| GND&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=====Hinten=====&lt;br /&gt;
Der hintere SHARP Sensor kann z.B. an der Rückseite des RP6v2 Fahrgestells befestigt werden.&lt;br /&gt;
&lt;br /&gt;
'''Hinten-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''M256-Port''' ||'''M256-Funktion''' || '''Sensor Board&amp;lt;br/&amp;gt;-Funktion (K3)''' || '''Verwendung''' || '''I/O''' |||| '''SHARP Sensor&amp;lt;br/&amp;gt;-Funktion''' &lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| 1 || PK1 || ADC9 || &amp;quot;ADC4&amp;quot; || SHARP hinten || I |||| Vo&lt;br /&gt;
|-&lt;br /&gt;
| 2 || || || VDD_1 || +5V || |||| Vcc&lt;br /&gt;
|-&lt;br /&gt;
| 3 || || || GND || GND (geschaltet!) || |||| GND&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Servos====&lt;br /&gt;
=====Power=====&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_Sensor_Board_Servo-PWR.jpg|RP6 Sensor Board Servo-PWR Stecker|thumb]]&lt;br /&gt;
&lt;br /&gt;
An den SERVO_PWR Stecker (SP5: K1) muss ein Akku zur Stromversorgung der mit dem Sensor Board verbundenen Servos angeschlossen werden. Der Stecker hat folgende Belegung:&lt;br /&gt;
 &lt;br /&gt;
'''SERVO_PWR-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''Sensor Board&amp;lt;br/&amp;gt;-Funktion (K1)''' || '''Verwendung'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || GND_POWER || Servo Power GND&lt;br /&gt;
|-&lt;br /&gt;
| 2 || VSS_POWER || Servo Power Eingang +7,2..10V&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Der Akku zur Versorgung der Servos muss eine Nennspannung von 7,2..10V aufweisen. Der Schaltregler auf dem Sensor Board kann bei einer 5,0V Servo-Spannung Ströme bis 3,0A (Spitzen bis 5,0A) liefern. '''Die Polung des Akkus darf am Stecker SERVO_PWR nicht vertauscht werden.''' Siehe den oberen Teil der nebenstehende Abbildung! Ratsam ist es, eine Sicherung 3,15A in die Plusleitung zwischen Akku und SERVO_PWR Stecker zu legen.&lt;br /&gt;
&lt;br /&gt;
Für die Verbindung zwischen dem 2-poligen JST XH Stecker (SERVO_PWR, K1) auf dem Sensor Board und dem Akku braucht man auf der Sensor Board Seite folgende Stecker-/buchsenteile:&lt;br /&gt;
* JST XH Gehäuse, 2-polig, RM 2,5mm ([http://www.conrad.de/ce/de/product/740549/Gehaeuse-RM-25-mm-Serie-XH-Rastermass-25-mm-Pole-2-Nennstrom-3-A-XHP-2-JST-Inhalt-1-St 740549])&lt;br /&gt;
* 2x JST XH Crimpkontakt f. RM 2,5mm ([http://www.conrad.de/ce/de/product/741112/Crimpkontakt-fuer-RM-25-mm-Serie-XH-Rastermass-25-mm-BXH-001T-P06-JST-Inhalt-1-St 741112])&lt;br /&gt;
Die Crimpkontakte dieser Steckbuchse werden an die 2-adrige Litze zum Akku angequetscht (oder angelötet).&lt;br /&gt;
&lt;br /&gt;
Wenn man keinen separaten Akku zur Versorgung der Servos nehmen will, kann man auch +UB der RP6v2 Base dafür nutzen. An +UB liegt die Akkuspannung der Base (Nennspannung 7,2V) über eine Sicherung F1 3,15A (RP6v2) bzw. 2,5A (RP6) auf dem Mainboard an. +UB kann man z.B. am [[RP6#EXT_Anschlu.C3.9F|EXT Anschluß der Base]] entnehmen. Die nebenstehende Abbildung zeigt im unteren Teil, an welchen Pins man dort +UB kontaktieren kann!&lt;br /&gt;
&lt;br /&gt;
Dabei ist zu beachten, dass die Sicherung F1 auf dem RP6(v2) Mainboard den nutzbaren Strom für die Servos deutlich begrenzt: Durch diese Sicherung fließt ja nicht nur der Servo-Strom, sondern auch der Strom für den RP6 und alle darauf montierten Zusatzplatinen. Wenn der RP6 also herumfährt und z.B. noch die IRCOMM-Sendedioden nutzt, bleibt kaum noch Stromreserve für die Servos auf dem Sensor Board übrig.&lt;br /&gt;
'''Das bedeutet: Man sollte unbedingt einen separaten Akku für die Servos auf dem Sensor Board benutzen!'''&lt;br /&gt;
&lt;br /&gt;
======SERVO_PWR-EXT Verbindung======&lt;br /&gt;
Für die Verbindung zwischen dem 2-poligen JST XH Stecker (SERVO_PWR, K1) auf dem Sensor Board und dem 8-poligen JST XH Stecker (EXT) auf dem RP6v2 Mainboard braucht man folgende Stecker-/buchsenteile:&lt;br /&gt;
* JST XH Gehäuse, 2-polig, RM 2,5mm ([http://www.conrad.de/ce/de/product/740549/Gehaeuse-RM-25-mm-Serie-XH-Rastermass-25-mm-Pole-2-Nennstrom-3-A-XHP-2-JST-Inhalt-1-St 740549])&lt;br /&gt;
* JST XH Gehäuse, 8-polig, RM 2,5mm ([http://www.conrad.de/ce/de/product/740928/Gehaeuse-RM-25-mm-Serie-XH-Rastermass-25-mm-Pole-8-Nennstrom-3-A-XHP-8-JST-Inhalt-1-St 740928])&lt;br /&gt;
* 10x JST XH Crimpkontakt f. RM 2,5mm ([http://www.conrad.de/ce/de/product/741112/Crimpkontakt-fuer-RM-25-mm-Serie-XH-Rastermass-25-mm-BXH-001T-P06-JST-Inhalt-1-St 741112])&lt;br /&gt;
Mit einer 2-adrigen Litze, die beidseits mit den Crimpkontakten verquetscht (oder verlötet) wird, verbindet man dann den SERVO_PWR Stecker mit dem EXT Stecker, wie in der Abbildung oben gezeigt. ''Achtung: Plus (+) und Minus (-) nicht vertauschen!''&lt;br /&gt;
 Ein passendes Kabel soll zukünftig (*) mitgeliefert werden.&lt;br /&gt;
&lt;br /&gt;
Auf dem RP6 Mainboard ist der 8-polige EXT Stecker noch nicht bestückt. Wenn man ihn nachrüsten will, muss man noch bestellen:&lt;br /&gt;
* JST XH Stiftleiste gerade, 8-polig, RM 2,5mm ([http://www.conrad.de/ce/de/product/740105/Stiftleiste-gerade-RM-25-mm-Serie-XH-Rastermass-25-mm-Pole-8-Nennstrom-3-A-B8B-XH-A-LFSN-JST-Inhalt-1-St 740105])&lt;br /&gt;
Die Stiftleiste wird auf das RP6 Mainboard gelötet, dabei weisen die beiden Einkerbungen an einer Längsseite der Stiftleiste nach hinten zum Rand des Mainboards.&lt;br /&gt;
 Auch diese Stiftleiste soll zukünftig (*) zum Lieferumfang gehören.&lt;br /&gt;
'''Zu *)''' Meinem RP6 Sensor Board (bestellt am 1.3.2014) lag das konfektionierte Kabel und die Stiftleiste noch nicht bei!&lt;br /&gt;
&lt;br /&gt;
=====Stecker=====&lt;br /&gt;
An die acht 3-poligen Stiftleisten SERVO_1 bis SERVO_8 (SP5: K6, 11, 29..34) können Servos angeschlossen werden. Direkt aufstecken kann man Servo-Steckbuchsen mit der Belegung von CONRAD, Graupner/JR und Robbe/Futaba (Versorgungsspannung Plus am mittleren Pin). Auf der Sensor Board Platine kann man den Pin 3 (Servo Power GND) der 3-poligen Stiftleisten daran erkennen, dass er näher zum rechten Platinenrand (Seite mit dem XBUS Stecker) angeordnet ist als der zugehörige Pin 1 (Servo Signal).&lt;br /&gt;
&lt;br /&gt;
Wenn Servos mit nicht passender Steckbuchse angeschlossen werden sollen, dann braucht man auf der Sensor Board Seite folgende Stecker-/buchsenteile für jedes Servo:&lt;br /&gt;
* Steckbuchse, 3-polig, RM 2,54mm ([http://www.elv.de/steckbuchse-3-polig.html ELV 68-022503])&lt;br /&gt;
Die Crimpkontakte dieser Steckbuchse werden an die 3-adrige Litze des Servos angequetscht (oder angelötet). &lt;br /&gt;
&lt;br /&gt;
'''SERVO_1..8-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''Sensor Board&amp;lt;br/&amp;gt;-Funktion (K6,11,29..34)''' || '''Verwendung''' || '''I/O''' |||| '''Servo-&amp;lt;br/&amp;gt;Kabelfarben'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || PCA9685: PWM15..8 || Servo Signal || O |||| Weiß, Orange&lt;br /&gt;
|-&lt;br /&gt;
| 2 || Servo_PWR || Servo Power +5V (geschaltet!) || |||| Rot&lt;br /&gt;
|-&lt;br /&gt;
| 3 || GND_POWER || Servo Power GND || |||| Schwarz, Braun&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Roboterarm RA2-HOBBY====&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_Sensor_Board_RA2-MINI.JPG|RP6 Sensor Board mit Roboterarm RA2-MINI|thumb]]&lt;br /&gt;
&lt;br /&gt;
In der Anleitung zum RP6 Sensor Board ist der Arexx Roboterarm RA2-HOBBY bzw. RA2-MINI [http://www.conrad.de/ce/de/product/191534/Arexx-Mini-Roboterarm-RA2-MINI (191534)] abgebildet. Er ist dort ohne Grundgestell und Controller-Platine auf dem Sensor Board befestigt.&lt;br /&gt;
Das Sensor Board eignet sich sehr gut zur Ansteuerung der 6 Servos des Roboterarms.&lt;br /&gt;
&lt;br /&gt;
Zur Montage des RA2-MINI auf dem Sensor Board geht man so vor:&lt;br /&gt;
* Lösen der 4 Rundkopfschrauben M3x6, die die Servobodenplatte mit den Abstandbolzen M3x30 auf der Controller-Platine verbinden (siehe Anleitung zum RA2-MINI, Seite 19!)&lt;br /&gt;
* Lösen der Servobodenplatte vom Bodenservo (siehe Anleitung zum RA2-MINI, Seite 8!)&lt;br /&gt;
* Bohren der Befestigungslöcher in die Servobodenplatte:&lt;br /&gt;
** Rechts-Links Lochabstand 4,75cm, Vorn-Hinten Lochabstand 4,1cm&lt;br /&gt;
** Ungefähre Lage der Löcher siehe Abbildung in der Anleitung zum Sensor Board, Seite 4!&lt;br /&gt;
** Markierung der Bohrlöcher auf der Rückseite der Servobodenplatte:&lt;br /&gt;
*** 1. Mit einer Hilfslinie die Hinterkante des Servoausschnitts (das ist die kürzere Kante, die näher am Rand der Bodenplatte liegt!) nach beiden Seiten verlängern&lt;br /&gt;
*** 2. Eine 2. Hilfslinie parallel zur ersten im Abstand von 1,4cm zur Mitte der Servobodenplatte hin einzeichnen&lt;br /&gt;
*** 3. Auf dieser Linie jetzt die beiden hinteren Bohrlöcher symmetrisch im Abstand von 4,75cm markieren&lt;br /&gt;
*** 4. Für die vorderen Bohrlöcher eine 3. Hilfslinie im Abstand von 4,1cm parallel zur 2. Linie einzeichnen&lt;br /&gt;
*** 5. Auf dieser Linie die beiden vorderen Bohrlöcher symmetrisch im Abstand von 4,75cm markieren&lt;br /&gt;
*** 6. Kontrolle: Die 4 markierten Bohrlochpositionen bilden ein Rechteck mit 4,1cm seitlicher und 4,75cm vorderer/hinterer Kantenlänge&lt;br /&gt;
** Bohren der 4 Löcher (D = 3,2mm) in die Servobodenplatte&lt;br /&gt;
* Befestigen des Bodenservos auf der Servobodenplatte (siehe Anleitung zum RA2-MINI, Seite 8!)&lt;br /&gt;
* Anbringen des Roboterarms auf dem Sensor Board mit 4 Abstandbolzen M3 (L = 30..50mm) und passenden Schrauben/Muttern&lt;br /&gt;
&lt;br /&gt;
Die Servo-Steckbuchsen werden dann ''in der selben Reihenfolge (S1..S6) wie vorher auf der Controller-Platine des Roboterarms'' auf die Stiftleisten SERVO_1 bis SERVO_6 des Sensor Boards gesteckt.&lt;br /&gt;
'''Man sollte unbedingt einen separaten Akku für die Servos auf dem Sensor Board benutzen!'''&lt;br /&gt;
&lt;br /&gt;
====Grafik-Display====&lt;br /&gt;
Ob es mal ein Grafik-Display für das RP6 Sensor Board geben wird, ist ''pure Spekulation''. Allerdings gibt es drei Hinweise darauf, dass eine solche Hardware-Ergänzung kommen könnte:&lt;br /&gt;
* 1. Der vorbereitete Anschluss für eine [[RP6_Sensor_Board_und_Xtra_Module#Display-Hintergrundbeleuchtung|Display-Hintergrundbeleuchtung]]&lt;br /&gt;
* 2. Die 4 Befestigungslöcher in der Mitte des Sensor Boards&lt;br /&gt;
* 3. Eine Abbildung '''Grafik-Display 128x64''' bei JM3-Engeneering (siehe [[RP6_Sensor_Board_und_Xtra_Module#Weblinks|Weblinks]]!)&lt;br /&gt;
Wir werden sehen ...&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==RP6 Xtra Module==&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_Xtra_module.JPG|RP6 Xtra module|right|500px]]&lt;br /&gt;
&lt;br /&gt;
Von den '''AREXX RP6 Xtra Modulen''' sind bei [http://www.conrad.de/ce/ CONRAD] für den RP6v2 erhältlich:&lt;br /&gt;
* Arexx [[RP6_Sensor_Board_und_Xtra_Module#I2C_GPS_Empf.C3.A4nger_JM3-GPS|I2C GPS Empfänger JM3-GPS]] ([http://www.conrad.de/ce/de/product/1082385/Arexx-IC-GPS-Empfaenger-JM3-GPS 1082385])&lt;br /&gt;
* Arexx [[RP6_Sensor_Board_und_Xtra_Module#Gyro_Modul_JM3-GYRO|Gyro Modul JM3-GYRO]] ([http://www.conrad.de/ce/de/product/1082386/Arexx-Gyro-Modul-JM3-GYRO 1082386])&lt;br /&gt;
* Arexx [[RP6_Sensor_Board_und_Xtra_Module#3D_Accelerometer_Modul_JM3-3DA|3D Accelerometer Modul JM3-3DA]] ([http://www.conrad.de/ce/de/product/1082387/Arexx-3D-Accelerometer-Modul-JM3-3DA 1082387])&lt;br /&gt;
&lt;br /&gt;
===I2C GPS Empfänger JM3-GPS===&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_I2C_GPS_Empfänger.JPG|RP6 I2C GPS Empfänger|right|400px]]&lt;br /&gt;
&lt;br /&gt;
(Laut Online-Katalog der Firma CONRAD!)&lt;br /&gt;
&lt;br /&gt;
''&amp;quot;Universelles GPS-I²C-Bus Modul für RP6 Roboter. Der GPS Empfänger stellt die NMEA-0183 Datensätze GGA, RMC, GSA und VTG in den veschiedenen Registern zur Verfügung. Damit ist eine einfache Weiterverarbeitung möglich.&amp;quot;''&lt;br /&gt;
&lt;br /&gt;
====Beschreibung====&lt;br /&gt;
Der I2C GPS Empfänger ist eine kleine (38 x 23 mm) Zusatzplatine (RP6 Xtra Modul), die direkt auf das [[RP6_Sensor_Board_und_Xtra_Module#RP6_Sensor_Board_2|RP6 Sensor Board]] aufgesteckt werden kann. Sie kann aber auch überall eingesetzt werden, wo eine stabilisierte 5V Versorgungsspannung und ein 5V-I2C-Bus bis 400 kHz zur Verfügung steht.&lt;br /&gt;
&lt;br /&gt;
Die Platine ist bestückt mit dem &amp;quot;Fastrax GPS antenna module&amp;quot; [https://www.u-blox.com/de/positioning-antennas/gnss-antenna-modules/uc530.html UC530]. Als Backup-Batterie dient eine wieder aufladbare Lithium-Batterie ([http://www.farnell.com/datasheets/321180.pdf MS621FE]). Zur Kommunikation zwischen dem UC530 und dem I2C-Bus ist ein [http://www.atmel.com/Images/Atmel-8303-8-bit-AVR-Microcontroller-tinyAVR-ATtiny1634_Datasheet.pdf ATtiny1634] an Bord, der auch die Auswertung des [http://de.wikipedia.org/wiki/NMEA_0183 NMEA Protokolls] übernimmt. Die 3,3 V Versorgungsspannung wird auf der Platine durch einen Spannungsregler ([http://www.mouser.com/ds/2/405/lm3480-316799.pdf LM3480IM3-3.3]) erzeugt. Über den I2C-Bus können folgende Daten der NMEA-0183 Datensätze GGA, RMC, GSA und VTG auf einfache Weise gelesen werden:&lt;br /&gt;
&lt;br /&gt;
* Geograf. Breite&lt;br /&gt;
* Geograf. Länge&lt;br /&gt;
* GPS Status&lt;br /&gt;
* HDOP&lt;br /&gt;
* Satellitenzahl&lt;br /&gt;
* Kurs&lt;br /&gt;
* Geschwindigkeit&lt;br /&gt;
* Höhe&lt;br /&gt;
* UTC-Zeit&lt;br /&gt;
* Datum&lt;br /&gt;
* PDOP&lt;br /&gt;
* VDOP&lt;br /&gt;
* Satellit 1..12&lt;br /&gt;
&lt;br /&gt;
Der ATtiny1634 ist natürlich vorprogrammiert, kann aber über eine vorbereitete 6-polige ISP-Schnittstelle auf der Platine auch umprogrammiert werden.&lt;br /&gt;
&lt;br /&gt;
'''Lieferumfang'''&lt;br /&gt;
* I2C GPS Empfänger&lt;br /&gt;
* CD mit Anleitung und Software-Beispielen.&lt;br /&gt;
&lt;br /&gt;
====Technische Daten====&lt;br /&gt;
* Versorgungsspannung: 5,0 V +/- 5%&lt;br /&gt;
* Stromverbrauch: &amp;lt;= 20 mA (typ.)&lt;br /&gt;
* I2C-Bus Geschwindigkeit: &amp;lt;= 400 kHz&lt;br /&gt;
* GPS Antenne: eingebaut&lt;br /&gt;
* Backup Batterie: Lithium, im Betrieb wieder aufladbar&lt;br /&gt;
* Temperatur Bereich: -10 bis 65 °C&lt;br /&gt;
* Form Faktor: 38 x 23 mm&lt;br /&gt;
* Gewicht: ca. 6 g&lt;br /&gt;
* Empfänger Spezifikationen (UC530):&lt;br /&gt;
** Empfänger: GPS L1 C/A-Code, SPS&lt;br /&gt;
** Kanäle: 66/22 (Suche/Track)&lt;br /&gt;
** Tracking Empfindlichkeit: -165 dBm typ.&lt;br /&gt;
** Navigations Empfindlichkeit: -148 dbm typ (Kaltstart)&lt;br /&gt;
** Update Rate: 1 Sek.&lt;br /&gt;
** Positions Genauigkeit:&lt;br /&gt;
*** 3,0m (67%) typ. horizontal&lt;br /&gt;
*** 5,0m (67%) typ. vertikal&lt;br /&gt;
*** 0,02 m/s (50%) typ. Geschwindigkeit&lt;br /&gt;
** Zeit bis zum ersten Fix: typ. 31 Sek.&lt;br /&gt;
** Protokoll: NMEA-0183 Rev. 3.01&lt;br /&gt;
&lt;br /&gt;
====Anschluss-Schema====&lt;br /&gt;
Belegung des 9-poligen Anschluss-Steckers (K1) siehe in [[RP6_Sensor_Board_und_Xtra_Module#I2C-MODULE|dieser]] Tabelle!&lt;br /&gt;
&lt;br /&gt;
====Umbau-Optionen====&lt;br /&gt;
Wenn man den ATtiny1634 selbst programmieren will, muss man Stiftleisten auf die Platine löten.&lt;br /&gt;
&lt;br /&gt;
Man braucht dazu: &lt;br /&gt;
* 2-reihige Stiftleiste RM 2,54mm (z.B. 2x40-polig 741306) &lt;br /&gt;
&lt;br /&gt;
Man trennt von der 2-reihigen Stiftleiste 2x3 Kontakte ab und lötet sie auf die Punkte &amp;quot;ISP6&amp;quot;.&lt;br /&gt;
Mit einem ISP-Programmer kann dann eine neue Firmware geflasht werden. Die aktuelle Firmware des ATtiny1634 (Version 1.2) wird als .HEX mitgeliefert, leider ohne Source-Code.&lt;br /&gt;
&lt;br /&gt;
Vorsicht: Dabei kann der Prozessor im schlimmsten Fall nicht mehr ansprechbar sein oder der GPS Empfänger UC530 beschädigt werden. Man sollte diesen Umbau und die ISP-Programmierung nur machen, wenn man genau weiß, was man macht! &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Gyro Modul JM3-GYRO===&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_Gyro_Modul.JPG|RP6 Gyro Modul|right|200px]]&lt;br /&gt;
&lt;br /&gt;
(Laut Online-Katalog der Firma CONRAD!)&lt;br /&gt;
&lt;br /&gt;
''&amp;quot;Das universelle Gyro-Sensor Modul für RP6, RP6 V2, RP6 ATMEGA32 und das RP6 V2 Control M256 Wifi-Kit ist ideal zur Erkennung der Blockierung des Roboters in seiner Drehbewegung, sowie der Stabilisierung der Geradeausfahrt.&amp;quot;''&lt;br /&gt;
&lt;br /&gt;
====Beschreibung====&lt;br /&gt;
Das Gyro Modul ist eine kleine (19 x 17 mm) Zusatzplatine (RP6 Xtra Modul), die im RP6-System genutzt werden kann. Es gibt zwar keinen direkt passenden &amp;quot;Steckplatz&amp;quot; auf einer der Microcontroller-Plattformen (RP6v2, M32, M128, M256 Wifi), jedoch ist der Anschluß einfach:&lt;br /&gt;
Benötigt werden +5V und GND, sowie ein freier ADC-Kanal, der bis 5V messen kann. Damit kann das Gyro Modul sehr universell eingesetzt werden. Es misst die Drehrate um die Z-Achse (Hochachse oder Yaw).&lt;br /&gt;
&lt;br /&gt;
Die Platine ist bestückt mit dem analogen Gyro-Sensor [http://www.st.com/web/en/resource/technical/document/datasheet/CD00254111.pdf LY330ALH], dessen Ausgangsspannung durch zwei OP-Amps ([http://www.ti.com.cn/cn/lit/ds/symlink/lm321.pdf LM321], [http://www.produktinfo.conrad.com/datenblaetter/00000-24999/001072615-da-01-en-IC_AMP_PREC_LMP7731MF_NOPB_SOT_23_5_TID.pdf LMP7731MF]) in Ruhe bei 2,5 V liegt. Höhere Ausgangsspannungen (bis 5 V) bedeuten eine Drehgeschwindigkeit nach LINKS, niedrigere (bis 0 V) eine Drehgeschwindigkeit nach RECHTS. Die 3,3 V Versorgungsspannung des LY330ALH wird auf der Platine durch einen Spannungsregler ([http://www.mouser.com/ds/2/405/lm3480-316799.pdf LM3480IM3-3.3]) erzeugt.&lt;br /&gt;
&lt;br /&gt;
'''Lieferumfang'''&lt;br /&gt;
* Gyro Modul&lt;br /&gt;
* CD mit Anleitung und Software-Beispielen.&lt;br /&gt;
&lt;br /&gt;
====Technische Daten====&lt;br /&gt;
&lt;br /&gt;
* VDD: 5,0 V +/- 5%&lt;br /&gt;
* Vout(0): 2,5 V +/- 2% (ohne Bewegung)&lt;br /&gt;
* Vout: Vout(0) + 10mV / dps +/- 2%&lt;br /&gt;
* Messbereich: ca. 200 dps max.&lt;br /&gt;
&lt;br /&gt;
====Anschluss-Schema====&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_Gyro_Modul_SP.JPG|RP6 Gyro Modul - Anschluss-Schema]]&lt;br /&gt;
&lt;br /&gt;
====Umbau-Optionen====&lt;br /&gt;
Am Gyro Modul gibt es nichts umzubauen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===3D Accelerometer Modul JM3-3DA===&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_3D_Accelerometer_Modul.JPG|RP6 3D Accelerometer Modul|right|105px]]&lt;br /&gt;
&lt;br /&gt;
(Laut Online-Katalog der Firma CONRAD!)&lt;br /&gt;
&lt;br /&gt;
''&amp;quot;Universeller 3-Achsen Beschleunigungssensor für RP6, RP6 V2, RP6 ATMEGA32 und das RP6 V2 Control M256 WIFI-Kit. Ideal zur Winkelmessung (Neigung-, Kipp-Winkel) und vieles mehr.&amp;quot;''&lt;br /&gt;
&lt;br /&gt;
====Beschreibung====&lt;br /&gt;
&lt;br /&gt;
Das 3D Accelerometer Modul ist eine kleine (15 x 10 mm) Zusatzplatine (RP6 Xtra Modul), die direkt auf den EEPROM-Sockel (IC5) der Zusatzplatine [[RP6#RP6_CONTROL_M32_Platine|RP6 CONTROL M32]] gesteckt und über den SPI-Bus angesteuert werden kann. Das Accelerometer Modul kann aber auch mit allen Microcontroller-Plattformen betrieben werden, die eine stabilisierte 5V-Versorgungsspannung und einen SPI- oder I2C-Bus bieten.&lt;br /&gt;
&lt;br /&gt;
Die Platine ist bestückt mit dem 3D Beschleunigungs-Sensor [http://www.farnell.com/datasheets/1691680.pdf LIS302DLH]. Die 3,3 V Versorgungsspannung des LIS302DLH wird auf der Platine durch einen Spannungsregler ([http://www.mouser.com/ds/2/405/lm3480-316799.pdf LM3480IM3-3.3]) erzeugt.&lt;br /&gt;
&lt;br /&gt;
'''Lieferumfang'''&lt;br /&gt;
* 3D Accelerometer Modul&lt;br /&gt;
* CD mit Anleitung und Software-Beispielen.&lt;br /&gt;
&lt;br /&gt;
====Technische Daten====&lt;br /&gt;
&lt;br /&gt;
* VDD: 5,0 V +/- 5%&lt;br /&gt;
* Messbereiche: +-2 g, +-4 g, +-8 g&lt;br /&gt;
* Datenausgabe: 16 Bit&lt;br /&gt;
* Schnittstellen: I2C, SPI&lt;br /&gt;
&lt;br /&gt;
====Anschluss-Schema====&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_3D_Accelerometer_Modul_SP.JPG|RP6 3D Accelerometer Modul - Anschluss-Schema|350px]]&lt;br /&gt;
&lt;br /&gt;
====Umbau-Optionen====&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_3D_Accelerometer_Modul_M32.JPG|RP6 3D Accelerometer Modul auf der M32|right|500px]]&lt;br /&gt;
&lt;br /&gt;
'''Will man das Modul auf der M32 einsetzen, muss man auf dem 3D Accelerometer Modul die Widerstände R2 und R3 (falls vorhanden!) auslöten (siehe Anleitung zum Modul, Seiten 4/5!)''' und einen IC-Sockel an Position IC5 und einen Kondensator an Position C19 auf der M32 einlöten, siehe [[RP6#Zweites_SPI-EEPROM|hier]]!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die Abbildung rechts zeigt das 3D Accelerometer Modul auf der M32.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Programmierung==&lt;br /&gt;
In diesem Abschnitt geht es um die Programmierung der Sensoren und Aktoren auf dem [[RP6_Sensor_Board_und_Xtra_Module#RP6_Sensor_Board_3|RP6 Sensor Board]] und auf den [[RP6_Sensor_Board_und_Xtra_Module#RP6_Xtra_Module_3|Xtra Modulen]]. Die hier veröffentlichte Software baut NICHT auf die mitgelieferten C++ Software-Beispiele auf der ''&amp;quot;RP6 Robot System Xtra Modules CD-ROM&amp;quot;'' auf, sondern basiert auf Eigenentwicklungen in GCC.&lt;br /&gt;
&lt;br /&gt;
===RP6 Sensor Board===&lt;br /&gt;
Das RP6 Sensor Board RP6-JM03-61 verfügt nicht über einen eigenen Microprozessor. Daher geht es hier eigentlich nicht um die Programmierung des Sensor Boards, sondern um die Programmierung der Microcontroller-Plattform, an die das Sensor Board angeschlossen ist. In der Regel wird das die RP6 M256 WiFi Zusatzplatine sein, aber auch die RP6v2 Base steuert (als I2C-Slave) in der vorgesehenen Konfiguration gewisse Funktionen des Sensor Boards an.&lt;br /&gt;
Prinzipiell kann das Sensor Board aber auch an der RP6 CONTROL M32 (''passende Library auf Anfrage beim Autor!'') oder der RP6 CCPRO M128 Zusatzplatine betrieben werden.&lt;br /&gt;
&lt;br /&gt;
====Dokumentation====&lt;br /&gt;
Die Dokumentation zum RP6 Sensor Board befindet sich auf der mitgelieferten ''&amp;quot;RP6 Robot System Xtra Modules CD-ROM&amp;quot;''.&lt;br /&gt;
&lt;br /&gt;
=====Manuals=====&lt;br /&gt;
Das Handbuch kann auch [http://www.produktinfo.conrad.com/datenblaetter/00000-24999/001082384-an-01-de-RP6_SENSOR_BOARD.pdf hier] eingesehen werden.&lt;br /&gt;
 ACHTUNG: Das Manual enthält aktuell noch teils irreführende Beschreibungen!&lt;br /&gt;
&lt;br /&gt;
=====Schematics=====&lt;br /&gt;
=====Datasheets=====&lt;br /&gt;
&lt;br /&gt;
====Demo-Programmme====&lt;br /&gt;
Demo-Programme zum RP6 Sensor Board befinden sich auf der mitgelieferten ''&amp;quot;RP6 Robot System Xtra Modules CD-ROM&amp;quot;''.&lt;br /&gt;
&lt;br /&gt;
====RP6 M256 WiFi: Sensor Board Library====&lt;br /&gt;
Die nachfolgende RP6M256_Sensor_BoardLib (GCC) dient zur Ansteuerung des Sensor Boards durch die RP6M256 WiFi.&lt;br /&gt;
&lt;br /&gt;
=====Configuration Header=====&lt;br /&gt;
Vor dem Kompilieren der Library muss eine Anpassung des Configuration Headers an die eigenen Hardware-Voraussetzungen erfolgen.&lt;br /&gt;
Dazu gibt es im Configuration Header eine Definition:&lt;br /&gt;
* USE_PD5 -&amp;gt; Die Sensor Board Funktion &amp;quot;PD5&amp;quot; steuert den TCA4311A Enable Pin (EN).&lt;br /&gt;
Im nachfolgenden Listing ist die Definition USE_PD5 NICHT aktiv (d.h. der TCA4311A Enable Pin (EN) wird vom MAX7311 I/O 1.0 Pin angesteuert!). Dies muss an die eigene Hardware angepaßt werden. Wenn &amp;quot;PD5&amp;quot; den TCA4311A Enable Pin (EN) steuern soll, muss die Zeile mit &amp;quot;USE_PD5&amp;quot; &amp;quot;aktiviert&amp;quot; werden. Dazu entfernt man &amp;quot;//&amp;quot; am Zeilenanfang:&lt;br /&gt;
 #define USE_PD5&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Bevor man Beschleunigungs-, Magnetfeldsensor und Gyroskop nutzen kann, muss man sie kalibrieren:&lt;br /&gt;
&lt;br /&gt;
* '''Accelerometer:'''&lt;br /&gt;
** Die X-Achse wird kalibriert, indem man den RP6 mit der rechten Seite nach unten hält und den Maximalwert in MAX_X_A einträgt. Dann neigt man ihn auf seine linke Seite und trägt den negativen Maximalwert in MIN_X_A ein.&lt;br /&gt;
** Die Y-Achse wird kalibriert, indem man den RP6 mit der Vorderseite nach oben hält und den Maximalwert in MAX_Y_A einträgt. Dann kippt man die Vorderseite nach unten und trägt den negativen Maximalwert in MIN_Y_A ein.&lt;br /&gt;
** Die Z-Achse wird kalibriert, indem man den RP6 normal waagerecht hält und den Maximalwert in MAX_Z_A einträgt. Dann dreht man den RP6 &amp;quot;auf den Kopf&amp;quot; und trägt den negativen Maximalwert in MIN_Z_A ein.&lt;br /&gt;
** Sollten die angezeigten Pitch- und Roll-Werte nach der Kalibrierung der Achsen und genau waagerecht stehendem Sensor bzw. RP6 vom Nullwert deutlich abweichen, kann man sie mithilfe der Definitionen OFFSET_PITCH_A und OFFSET_ROLL_A &amp;quot;nullen&amp;quot;. Die Einheit dieser Definitionen ist °.&lt;br /&gt;
 ''HINWEIS: Die internen Berechnungen werden durch diese Offset-Korrektur&lt;br /&gt;
 NICHT beeinflußt. Die Offset-Werte können also nicht dazu benutzt werden,&lt;br /&gt;
 eine Achsenabweichung zwischen Sensor und RP6 zu kompensieren!''&lt;br /&gt;
* '''Magnetometer:'''&lt;br /&gt;
** Zur Kalibrierung des Magnetfeldsensors stellt man den RP6 auf eine waagerechte Fläche. Es dürfen keine Elektrogeräte, Metallteile und stromführende Leitungen in der Nähe sein, die das Magnetfeld verändern können.&lt;br /&gt;
** Zunächst ist es möglich, die sogenannten &amp;quot;hard iron&amp;quot; Effekte auszugleichen. Dies sind feste Magnetfeldabweichungen, die durch das &amp;quot;Gerät&amp;quot; (in unserem Fall also durch den kompletten RP6) verursacht werden, in oder auf dem der Sensor angebracht ist. Mit den Definitionen OFFSET_X_M, OFFSET_Y_M und OFFSET_Z_M können diese Effekte ausgeglichen werden. Diese Kalibrierung wird hier aktuell (noch) nicht beschrieben, so dass man die Werte für diese Definitionen zunächst bei 0 belassen sollte.&lt;br /&gt;
** Die X-Achse und Y-Achse wird kalibriert, indem man den RP6 langsam mehrfach um die eigene (Z-)Achse dreht und die Maximalwerte in MAX_X_M und MAX_Y_M einträgt. Die negativen Maximalwerte trägt man in MIN_X_M und MIN_Y_M ein.&lt;br /&gt;
** Die Z-Achse wird kalibriert, indem man den RP6 auf die rechte oder linke Seite legt, ihn dann langsam mehrfach auf der Stelle (um seine Y-Achse) dreht und den Maximalwert in MAX_Z_M und den negativen Maximalwert in MIN_Z_M einträgt.&lt;br /&gt;
** Mit der Definition DECLINATION_M kann man zur Verbesserung der Genauigkeit der Richtungsangaben den magnetischen Deklinationswert [°] (d.h. die magnetische Missweisung) am aktuellen Standort festlegen. [http://www.ngdc.noaa.gov/geomag-web/#declination Hier] befindet sich ein &amp;quot;Deklinations-Rechner&amp;quot;, mit dem man den Deklinationswert für den eigenen Standort ermitteln kann. &lt;br /&gt;
** Wenn man den Temperaturwert des LSM303DLHC nutzen will, muss man die Definition GET_TEMP_M aktivieren (Standard!). Den Temperaturwert kann man noch eichen, indem man die Definition OFFSET_TEMP_M anpasst. Die Einheit von OFFSET_TEMP_M ist °C.&lt;br /&gt;
* '''Gyroskop:'''&lt;br /&gt;
** In Ruhelage des RP6 wird ein ADC-Wert von ca. 511 angezeigt, wenn die Definition ADCVAL_ZERORATE_LEVEL im Configuration Header (RP6M256_Sensor_Board.h) vor der ersten Kompilierung zunächst auf 0 gesetzt wurde. Die Kalibrierung des Gyroskops ist abgeschlossen, nachdem man den in Ruhelage angezeigten ADC-Wert als ADCVAL_ZERORATE_LEVEL eingetragen hat.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''HINWEISE ZUR KALIBRIERUNG:'''&lt;br /&gt;
* Das Demo-Programm ist nicht sehr gut geeignet, um die Kalibrierungen durchzuführen.&lt;br /&gt;
* Man sollte mit einem eigenen kurzen ''Kalibrierungs-Programm'' nur die Rohwerte der jeweiligen X-, Y- und Z-Achse z.B. zweimal pro Sekunde ausgeben.&lt;br /&gt;
* Die Rohwerte sind in Variablen x_axis..., y_axis..., z_axis... enthalten. Da die Rohwerte in den Funktionen normalizeLSM303DLHC_A() bzw. normalizeLSM303DLHC_M() ggf. verändert werden, müssen die Rohwerte VOR Durchlaufen dieser Funktionen ausgegeben werden.&lt;br /&gt;
* '''Ohne eine sorgfältige Kalibrierung wird die Kompass-Funktion (insbesondere die neigungskompensierte Ausgabe der Himmelsrichtung) nicht funktionieren!'''&lt;br /&gt;
* Nach dem Eintragen der Kalibrierungs-Werte in den Configuration Header (RP6M256_Sensor_Board.h) muss die ''Demo'' neu kompiliert werden. Vorher sollten die Compiler-Hilfsdateien der Sensor Board-Library (Dateiendungen .st und .o) im Programmverzeichnis gelöscht werden.&lt;br /&gt;
* Getestet wird das Ergebnis der Kalibrierung, indem die Ausgabewerte (Temperatur, Pitch, Roll, Heading, Neigungs-kompensiertes Heading) der ''Demo'' überprüft werden. Dazu kann man Vergleichswerte (Thermometer, Winkelmesser für Pitch, Roll und externer Kompass für Heading) heranziehen.&lt;br /&gt;
* Wenn die Ausgabewerte nicht den Erwartungen entsprechen, muss die Kalibrierung wiederholt werden.&lt;br /&gt;
* Eine Kalibrierung der Sensoren ist nur zuverlässig, solange die Position des jeweiligen Sensors und seine komplette Hardware-Umgebung (also der RP6 mit allen seinen Teilen!) nicht verändert wird. Gibt es trotzdem Veränderungen, z.B. durch weitere Aufbauten auf dem RP6, müssen diese Sensoren neu kalibriert werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Datei: RP6M256_Sensor_Board.h&lt;br /&gt;
&amp;lt;pre&amp;gt;/* ****************************************************************************&lt;br /&gt;
 *                           _______________________&lt;br /&gt;
 *                           \| RP6  ROBOT SYSTEM |/&lt;br /&gt;
 *                            \_-_-_-_-_-_-_-_-_-_/           &amp;gt;&amp;gt;&amp;gt; RP6 M256 WIFI&lt;br /&gt;
 * ----------------------------------------------------------------------------&lt;br /&gt;
 * ----------------------------- [c]2014 - Dirk -------------------------------&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * File: RP6M256_Sensor_Board.h&lt;br /&gt;
 * Version: 1.0&lt;br /&gt;
 * Target: RP6 M256 WIFI - ATMEGA2560 @16.00MHz&lt;br /&gt;
 * Author(s): Dirk&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Description:&lt;br /&gt;
 * Configuration header file for new RP6 Sensor Board library.&lt;br /&gt;
 * The RP6 Sensor Board (CONRAD 1082384) is connected to the RP6M256 with the&lt;br /&gt;
 * two plugs:&lt;br /&gt;
 *   Sensor Board &amp;lt;---&amp;gt; RP6M256&lt;br /&gt;
 *   --------------------------------&lt;br /&gt;
 *   I/O (K17)    &amp;lt;---&amp;gt; IO_PWM/T0/T1&lt;br /&gt;
 *   ADC (K18)    &amp;lt;---&amp;gt; ADC_IO2/CMP&lt;br /&gt;
 * The RP6 Sensor Board function &amp;quot;PD5&amp;quot; (IC6: EN) is now connected to RP6M256&lt;br /&gt;
 * OC1B (PB6) and the RP6 Sensor Board function &amp;quot;ADC4&amp;quot; (SHARP_R) to RP6M256&lt;br /&gt;
 * ADC9 (PK1).&lt;br /&gt;
 * On the RP6 Sensor Board the functions &amp;quot;ADC0&amp;quot;, &amp;quot;ADC1&amp;quot;, &amp;quot;PWR&amp;quot; and &amp;quot;ADC4&amp;quot; are&lt;br /&gt;
 * connected to the USRBUS. The USRBUS may be wired on the RP6 mainboard like&lt;br /&gt;
 * this:&lt;br /&gt;
 *   Function : Sensor Board - USRBUS: * &amp;lt;---&amp;gt; RP6 Mainboard&lt;br /&gt;
 *   --------------------------------------------------------&lt;br /&gt;
 *   SHARP_F  : &amp;quot;ADC0&amp;quot;       - Pin 1     &amp;lt;---&amp;gt; ADC0: Pin 3&lt;br /&gt;
 *   GYRO     : &amp;quot;ADC1&amp;quot;       - Pin 2     &amp;lt;---&amp;gt; ADC1: Pin 3&lt;br /&gt;
 *   PWRON ²  : &amp;quot;PWR&amp;quot;        - Pin 3     &amp;lt;---&amp;gt; PWR&lt;br /&gt;
 *   SHARP_R  : &amp;quot;ADC4&amp;quot;       - Pin 5     &amp;lt;---&amp;gt; Not connected!&lt;br /&gt;
 * At *) It is also possible not to use the USRBUS, but to connect the RP6&lt;br /&gt;
 *       Sensor Board directly to the RP6 mainboard with 3 single cables.&lt;br /&gt;
 * At ²) See RP6 manual &amp;quot;4.6.8. Stromsparfunktionen&amp;quot;! &lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
#ifndef RP6M256_SENSOR_BOARD_H&lt;br /&gt;
#define RP6M256_SENSOR_BOARD_H&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// RP6 Sensor Board hardwired components:&lt;br /&gt;
// - I2C I/O Port Expander (MAX7311)&lt;br /&gt;
// - I2C Real Time Clock (RTC DS1339)&lt;br /&gt;
// - I2C Temperature Sensor (LM75B)&lt;br /&gt;
// - I2C Servo Controller (PCA9685)&lt;br /&gt;
// - I2C LED Driver (TCA6507)&lt;br /&gt;
// - I2C 3D Magnetometer &amp;amp; Accelerometer (LSM303DLHC)&lt;br /&gt;
// - Analog Yaw-Rate Gyroscope (LY330ALH)&lt;br /&gt;
// - Hot Swappable 2-Wire Bus Buffer (TCA4311A)&lt;br /&gt;
// - Button&lt;br /&gt;
// - Status LED&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C I/O Port Expander (MAX7311):&lt;br /&gt;
#define I2C_SENSOR_PORTEXP_ADR			0x40	// Default&lt;br /&gt;
&lt;br /&gt;
// Interrupt I/O portpin definitions (RP6M256):&lt;br /&gt;
#define IO_SENSOR_INT1_IN				INT1_PI12 // PCINT12 PJ3  XBUS Pin 8&lt;br /&gt;
#define IO_SENSOR_INT1_DDR				DDRJ&lt;br /&gt;
#define IO_SENSOR_INT1_PIN				PINJ&lt;br /&gt;
#define IO_SENSOR_INT1_PORT				PORTJ&lt;br /&gt;
#define IO_SENSOR_INT2_IN				INT2_PI15 // PCINT15 PJ6  XBUS Pin 11&lt;br /&gt;
#define IO_SENSOR_INT2_DDR				DDRJ&lt;br /&gt;
#define IO_SENSOR_INT2_PIN				PINJ&lt;br /&gt;
#define IO_SENSOR_INT2_PORT				PORTJ&lt;br /&gt;
#define IO_SENSOR_INT3_IN				INT3_PI14 // PCINT14 PJ5  XBUS Pin 9&lt;br /&gt;
#define IO_SENSOR_INT3_DDR				DDRJ&lt;br /&gt;
#define IO_SENSOR_INT3_PIN				PINJ&lt;br /&gt;
#define IO_SENSOR_INT3_PORT				PORTJ&lt;br /&gt;
#define IO_SENSOR_INTU_IN				INTU_PI13 // PCINT13 PJ4  XBUS Pin 7&lt;br /&gt;
#define IO_SENSOR_INTU_DDR				DDRJ&lt;br /&gt;
#define IO_SENSOR_INTU_PIN				PINJ&lt;br /&gt;
#define IO_SENSOR_INTU_PORT				PORTJ&lt;br /&gt;
&lt;br /&gt;
// I/O PORT pin numbers:&lt;br /&gt;
#define PIN7							7&lt;br /&gt;
#define PIN6							6&lt;br /&gt;
#define PIN5							5&lt;br /&gt;
#define PIN4							4&lt;br /&gt;
#define PIN3							3&lt;br /&gt;
#define PIN2							2&lt;br /&gt;
#define PIN1							1&lt;br /&gt;
#define PIN0							0&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Real Time Clock (RTC DS1339):&lt;br /&gt;
#define I2C_SENSOR_RTC_ADR				0xd0	// Default&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Temperature Sensor (LM75B):&lt;br /&gt;
#define I2C_SENSOR_TEMP_ADR				0x90	// Default&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Servo Controller (PCA9685):&lt;br /&gt;
#define I2C_SENSOR_SERVO_ADR			0x88	// Default&lt;br /&gt;
&lt;br /&gt;
// Servo and PWM channels:&lt;br /&gt;
#define CH_SERVO_1						16		// At K6: 1  &amp;quot;SERVO_1&amp;quot;&lt;br /&gt;
#define CH_SERVO_2						15		// At K11: 1 &amp;quot;SERVO_2&amp;quot;&lt;br /&gt;
#define CH_SERVO_3						13		// At K29: 1 &amp;quot;SERVO_3&amp;quot;&lt;br /&gt;
#define CH_SERVO_4						14		// At K30: 1 &amp;quot;SERVO_4&amp;quot;&lt;br /&gt;
#define CH_SERVO_5						11		// At K31: 1 &amp;quot;SERVO_5&amp;quot;&lt;br /&gt;
#define CH_SERVO_6						12		// At K32: 1 &amp;quot;SERVO_6&amp;quot;&lt;br /&gt;
#define CH_SERVO_7						9		// At K33: 1 &amp;quot;SERVO_7&amp;quot;&lt;br /&gt;
#define CH_SERVO_8						10		// At K34: 1 &amp;quot;SERVO_8&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#define CH_PWM_OUT_1					1		// At K12: 1 &amp;quot;PWM_OUT&amp;quot;&lt;br /&gt;
#define CH_PWM_OUT_2					2		// At K12: 2&lt;br /&gt;
#define CH_PWM_OUT_3					3		// At K12: 3&lt;br /&gt;
#define CH_PWM_OUT_4					4		// At K12: 4&lt;br /&gt;
#define CH_PWM_OUT_5					5		// At K12: 5&lt;br /&gt;
#define CH_PWM_OUT_6					6		// At K12: 6&lt;br /&gt;
#define CH_PWM_OUT_7					7		// At K12: 7&lt;br /&gt;
#define CH_PWM_OUT_8					8		// At K12: 8&lt;br /&gt;
&lt;br /&gt;
// Servo left touch (LT), right touch (RT), middle position (MP) constants:&lt;br /&gt;
// (Hints: - Servo impulse length [ms] = Servo position value / 204.8&lt;br /&gt;
//           (Formula only valid for a PWM of 50 Hz!)&lt;br /&gt;
//         - Min. servo impulse (0,7 ms) = Servo position 143&lt;br /&gt;
//         - Mid. servo impulse (1,5 ms) = Servo position 307&lt;br /&gt;
//         - Max. servo impulse (2,3 ms) = Servo position 471&lt;br /&gt;
//         - !!! You should NOT use servo position values &amp;lt; 143 or &amp;gt; 471 !!!)&lt;br /&gt;
#define SERVO1_LT						205		// Servo impulse ~1ms&lt;br /&gt;
#define SERVO1_RT						410		// Servo impulse ~2ms&lt;br /&gt;
#define SERVO1_MP						((SERVO1_RT - SERVO1_LT) / 2 + SERVO1_LT)&lt;br /&gt;
#define SERVO2_LT						205&lt;br /&gt;
#define SERVO2_RT						410&lt;br /&gt;
#define SERVO2_MP						((SERVO2_RT - SERVO2_LT) / 2 + SERVO2_LT)&lt;br /&gt;
#define SERVO3_LT						205&lt;br /&gt;
#define SERVO3_RT						410&lt;br /&gt;
#define SERVO3_MP						((SERVO3_RT - SERVO3_LT) / 2 + SERVO3_LT)&lt;br /&gt;
#define SERVO4_LT						205&lt;br /&gt;
#define SERVO4_RT						410&lt;br /&gt;
#define SERVO4_MP						((SERVO4_RT - SERVO4_LT) / 2 + SERVO4_LT)&lt;br /&gt;
#define SERVO5_LT						205&lt;br /&gt;
#define SERVO5_RT						410&lt;br /&gt;
#define SERVO5_MP						((SERVO5_RT - SERVO5_LT) / 2 + SERVO5_LT)&lt;br /&gt;
#define SERVO6_LT						205&lt;br /&gt;
#define SERVO6_RT						410&lt;br /&gt;
#define SERVO6_MP						((SERVO6_RT - SERVO6_LT) / 2 + SERVO6_LT)&lt;br /&gt;
#define SERVO7_LT						205&lt;br /&gt;
#define SERVO7_RT						410&lt;br /&gt;
#define SERVO7_MP						((SERVO7_RT - SERVO7_LT) / 2 + SERVO7_LT)&lt;br /&gt;
#define SERVO8_LT						205&lt;br /&gt;
#define SERVO8_RT						410&lt;br /&gt;
#define SERVO8_MP						((SERVO8_RT - SERVO8_LT) / 2 + SERVO8_LT)&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C LED Driver (TCA6507):&lt;br /&gt;
#define I2C_SENSOR_LEDDRIVER_ADR		0x8a	// Default&lt;br /&gt;
&lt;br /&gt;
// LED numbers:&lt;br /&gt;
#define LED0							0		// At K7&lt;br /&gt;
#define DISPLAY_BACKLIGHT				0		// Display background light&lt;br /&gt;
#define LED1							1		// At K4&lt;br /&gt;
#define LED2							2		// At K2&lt;br /&gt;
#define LED3							3		// At K10: 1&lt;br /&gt;
#define BACKLIGHT_R						3		// Right backlight&lt;br /&gt;
#define LED4							4		// At K10: 2&lt;br /&gt;
#define BACKLIGHT_L						4		// Left backlight&lt;br /&gt;
#define LED5							5		// White LED (D3)&lt;br /&gt;
#define HEADLIGHT_R						5		// Right headlight&lt;br /&gt;
#define LED6							6		// White LED (D1)&lt;br /&gt;
#define HEADLIGHT_L						6		// Left headlight&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C 3D Magnetometer &amp;amp; Accelerometer (LSM303DLHC):&lt;br /&gt;
&lt;br /&gt;
// LSM303DLHC accelerometer:&lt;br /&gt;
#define I2C_SENSOR_LSM303DLHC_A_ADR 	0x32	// Default&lt;br /&gt;
&lt;br /&gt;
// LSM303DLHC accelerometer calibration data:&lt;br /&gt;
#define MAX_X_A						1037		// Max. X-axis value&lt;br /&gt;
#define MIN_X_A						-1030		// Min. X-axis value&lt;br /&gt;
#define MAX_Y_A						1030		// Max. Y-axis value&lt;br /&gt;
#define MIN_Y_A						-1019		// Min. Y-axis value&lt;br /&gt;
#define MAX_Z_A						1062		// Max. Z-axis value&lt;br /&gt;
#define MIN_Z_A						-1056		// Min. Z-axis value&lt;br /&gt;
#define OFFSET_PITCH_A				0.0			// Offset Pitch [°]&lt;br /&gt;
#define OFFSET_ROLL_A				0.0			// Offset Roll [°]&lt;br /&gt;
&lt;br /&gt;
// LSM303DLHC magnetometer:&lt;br /&gt;
#define I2C_SENSOR_LSM303DLHC_M_ADR		0x3c	// Default&lt;br /&gt;
&lt;br /&gt;
// LSM303DLHC magnetometer calibration data:&lt;br /&gt;
#define MAX_X_M						-111.0		// Max. X-axis value&lt;br /&gt;
#define MIN_X_M						-634.0		// Min. X-axis value&lt;br /&gt;
#define OFFSET_X_M					0			// Hard iron X-axis offset&lt;br /&gt;
#define MAX_Y_M						297.0		// Max. Y-axis value&lt;br /&gt;
#define MIN_Y_M						-215.0		// Min. Y-axis value&lt;br /&gt;
#define OFFSET_Y_M					0			// Hard iron Y-axis offset&lt;br /&gt;
#define MAX_Z_M						183.0		// Max. Z-axis value&lt;br /&gt;
#define MIN_Z_M						-214.0		// Min. Z-axis value&lt;br /&gt;
#define OFFSET_Z_M					0			// Hard iron Z-axis offset&lt;br /&gt;
#define DECLINATION_M				0.0			// E at local position [°]&lt;br /&gt;
&lt;br /&gt;
// LSM303DLHC temperature sensor definitions:&lt;br /&gt;
#define GET_TEMP_M								// Enable temperature sensor&lt;br /&gt;
#define OFFSET_TEMP_M				0.0			// Temperature offset [°C]&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Analog Yaw-Rate Gyroscope (LY330ALH):&lt;br /&gt;
&lt;br /&gt;
// LY330ALH gyroscope:&lt;br /&gt;
#define ADC_SENSOR_LY330ALH				ADC_1	// At USRBUS: 2 (RP6BASE)&lt;br /&gt;
&lt;br /&gt;
// LY330ALH gyroscope calibration data:&lt;br /&gt;
// (Higher values [505..1023] mean an angular velocity while rotating LEFT&lt;br /&gt;
//  and lower values [503..0] while rotating RIGHT!)&lt;br /&gt;
#define ADCVAL_MINRATE					0		// Min. rate value&lt;br /&gt;
#define ADCVAL_ZERORATE_LEVEL			504		// Zero rate level&lt;br /&gt;
#define ADCVAL_MAXRATE					1023	// Max. rate value&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Hot Swappable 2-Wire Bus Buffer (TCA4311A):&lt;br /&gt;
&lt;br /&gt;
// Define USE_PD5, if you want to control the TCA4311A enable pin (EN) with&lt;br /&gt;
// the RP6 Sensor Board function &amp;quot;PD5&amp;quot;. If USE_PD5 is NOT defined (default),&lt;br /&gt;
// the TCA4311A EN pin is controlled by the MAX7311 I/O 1.0 pin.&lt;br /&gt;
// ---------------&lt;br /&gt;
//#define USE_PD5&lt;br /&gt;
// ---------------&lt;br /&gt;
&lt;br /&gt;
#define IO_SENSOR_TCA4311A_EN_IN		OC1B_PI6 // At I/O: 9 (RP6M256)&lt;br /&gt;
#define IO_SENSOR_TCA4311A_EN_DDR		DDRB&lt;br /&gt;
#define IO_SENSOR_TCA4311A_EN_PIN		PINB&lt;br /&gt;
#define IO_SENSOR_TCA4311A_EN_PORT		PORTB&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Button:&lt;br /&gt;
&lt;br /&gt;
// (Button is connected to I/O 1.7 of the MAX7311!)&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Status LED:&lt;br /&gt;
&lt;br /&gt;
// (Status LED is connected to I/O 1.6 of the MAX7311!)&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Other ADC channel definitions:&lt;br /&gt;
&lt;br /&gt;
// (Depending on connections on the RP6 Sensor Board!)&lt;br /&gt;
#define ADC_SENSOR_SHARP_F				ADC_0	// At USRBUS: 1 (RP6BASE)&lt;br /&gt;
#define ADC_SENSOR_SHARP_R				ADC_9	// At ADC: 3    (RP6M256)&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
/******************************************************************************&lt;br /&gt;
 * Additional info&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Changelog:&lt;br /&gt;
 * &lt;br /&gt;
 *  ---&amp;gt; changes are documented in the file &amp;quot;RP6M256_Sensor_BoardLib.c&amp;quot;&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=====Library Header=====&lt;br /&gt;
Datei: RP6M256_Sensor_BoardLib.h&lt;br /&gt;
&amp;lt;pre&amp;gt;/* ****************************************************************************&lt;br /&gt;
 *                           _______________________&lt;br /&gt;
 *                           \| RP6  ROBOT SYSTEM |/&lt;br /&gt;
 *                            \_-_-_-_-_-_-_-_-_-_/           &amp;gt;&amp;gt;&amp;gt; RP6 M256 WIFI&lt;br /&gt;
 * ----------------------------------------------------------------------------&lt;br /&gt;
 * ----------------------------- [c]2014 - Dirk -------------------------------&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * File: RP6M256_Sensor_BoardLib.h&lt;br /&gt;
 * Version: 1.0&lt;br /&gt;
 * Target: RP6 M256 WIFI - ATMEGA2560 @16.00MHz&lt;br /&gt;
 * Author(s): Dirk&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Description:&lt;br /&gt;
 * Header file for new RP6 Sensor Board library.&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
#ifndef RP6M256_SENSOR_BOARDLIB_H&lt;br /&gt;
#define RP6M256_SENSOR_BOARDLIB_H&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// RP6 Sensor Board hardwired components:&lt;br /&gt;
// - I2C I/O Port Expander (MAX7311)&lt;br /&gt;
// - I2C Real Time Clock (RTC DS1339)&lt;br /&gt;
// - I2C Temperature Sensor (LM75B)&lt;br /&gt;
// - I2C Servo Controller (PCA9685)&lt;br /&gt;
// - I2C LED Driver (TCA6507)&lt;br /&gt;
// - I2C 3D Magnetometer &amp;amp; Accelerometer (LSM303DLHC)&lt;br /&gt;
// - Analog Yaw-Rate Gyroscope (LY330ALH)&lt;br /&gt;
// - Hot Swappable 2-Wire Bus Buffer (TCA4311A)&lt;br /&gt;
// - Button&lt;br /&gt;
// - Status LED&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Includes:&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6M256Lib.h&amp;quot;&lt;br /&gt;
#include &amp;quot;RP6I2CmasterTWI.h&amp;quot;&lt;br /&gt;
#include &amp;quot;RP6M256_Sensor_Board.h&amp;quot;&lt;br /&gt;
#include &amp;lt;math.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// RP6M256_I2CMasterLib definitions:&lt;br /&gt;
&lt;br /&gt;
#ifndef I2C_RP6_BASE_ADR&lt;br /&gt;
	#define I2C_RP6_BASE_ADR			10&lt;br /&gt;
#endif&lt;br /&gt;
#ifndef I2C_REG_ADC_ADC0_L&lt;br /&gt;
	#define I2C_REG_ADC_ADC0_L			23&lt;br /&gt;
#endif&lt;br /&gt;
#ifndef I2C_REG_ADC_ADC1_L&lt;br /&gt;
	#define I2C_REG_ADC_ADC1_L			25&lt;br /&gt;
#endif&lt;br /&gt;
#ifndef CMD_POWER_OFF&lt;br /&gt;
	#define CMD_POWER_OFF				0&lt;br /&gt;
#endif&lt;br /&gt;
#ifndef CMD_POWER_ON&lt;br /&gt;
	#define CMD_POWER_ON				1&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C I/O Port Expander (MAX7311):&lt;br /&gt;
&lt;br /&gt;
// Registers:&lt;br /&gt;
#define MAX7311_INPUT_PORT1				0&lt;br /&gt;
#define MAX7311_INPUT_PORT2				1&lt;br /&gt;
#define MAX7311_OUTPUT_PORT1			2&lt;br /&gt;
#define MAX7311_OUTPUT_PORT2			3&lt;br /&gt;
#define MAX7311_PORT1_POL_INV			4&lt;br /&gt;
#define MAX7311_PORT2_POL_INV			5&lt;br /&gt;
#define MAX7311_PORT1_CONFIG			6&lt;br /&gt;
#define MAX7311_PORT2_CONFIG			7&lt;br /&gt;
#define MAX7311_TIMEOUT					8&lt;br /&gt;
&lt;br /&gt;
// Port 1 configuration register bitmasks:&lt;br /&gt;
#define ST_GYRO							(1 &amp;lt;&amp;lt; PIN7)	// I/O 0.7 (Output)&lt;br /&gt;
#define PD_GYRO							(1 &amp;lt;&amp;lt; PIN6)	// I/O 0.6 (Output)&lt;br /&gt;
#define PWR_CAM_IF						(1 &amp;lt;&amp;lt; PIN5)	// I/O 0.5 (Output)&lt;br /&gt;
#define EN_LEDDRIV						(1 &amp;lt;&amp;lt; PIN4)	// I/O 0.4 (Output)&lt;br /&gt;
#define RDY_BUSBUFF						(1 &amp;lt;&amp;lt; PIN3)	// I/O 0.3 (Input)&lt;br /&gt;
#define PWR_SHARP_R						(1 &amp;lt;&amp;lt; PIN2)	// I/O 0.2 (Output)&lt;br /&gt;
#define PWR_SHARP_F						(1 &amp;lt;&amp;lt; PIN1)	// I/O 0.1 (Output)&lt;br /&gt;
#define PWR_I2C							(1 &amp;lt;&amp;lt; PIN0)	// I/O 0.0 (Output)&lt;br /&gt;
&lt;br /&gt;
// Port 2 configuration register bitmasks:&lt;br /&gt;
#define IO2_I2C							(1 &amp;lt;&amp;lt; PIN7)	// I/O 1.7 (Input)&lt;br /&gt;
#define IO1_I2C							(1 &amp;lt;&amp;lt; PIN6)	// I/O 1.6 (Output)&lt;br /&gt;
#define DRDY_MAGACC						(1 &amp;lt;&amp;lt; PIN5)	// I/O 1.5 (Input)&lt;br /&gt;
#define PWR_SERVO						(1 &amp;lt;&amp;lt; PIN4)	// I/O 1.4 (Output)&lt;br /&gt;
#define OEN_SERVO						(1 &amp;lt;&amp;lt; PIN3)	// I/O 1.3 (Output)&lt;br /&gt;
#define IO_K19_1						(1 &amp;lt;&amp;lt; PIN2)	// I/O 1.2 (Input)&lt;br /&gt;
#define IO_K19_3						(1 &amp;lt;&amp;lt; PIN1)	// I/O 1.1 (Input)&lt;br /&gt;
#define EN_BUSBUFF						(1 &amp;lt;&amp;lt; PIN0)	// I/O 1.0 (Output)&lt;br /&gt;
&lt;br /&gt;
// Port 1 &amp;amp; 2 register 16-bit bitmasks:&lt;br /&gt;
// (CONFIG: 1 = Input, 0 = Output)&lt;br /&gt;
#define MAX7311_CONFIG_DEFAULT			0b1010011000001000&lt;br /&gt;
#define MAX7311_CONFIG_USE_PD5			0b1010011100001000&lt;br /&gt;
// (OUTPUT: 1 = High/True, 0 = Low/False)&lt;br /&gt;
#define MAX7311_OUTPUT_DEFAULT			0b0100000100010000&lt;br /&gt;
#define MAX7311_OUTPUT_FULLPOWER		0b0001000100110111&lt;br /&gt;
#define MAX7311_OUTPUT_SHUTDOWN			0b0100100011000000&lt;br /&gt;
&lt;br /&gt;
// Safe configuration:&lt;br /&gt;
// (Ensures if activated, that I/Os 0.3, 1.5 and 1.7 cannot be configured&lt;br /&gt;
//  as output with the function MAX7311_write_cfg(). This may protect the&lt;br /&gt;
//  RP6 Sensor Board from hardware damage.)&lt;br /&gt;
// -------------------&lt;br /&gt;
#define SAFE_CONFIG&lt;br /&gt;
// -------------------&lt;br /&gt;
&lt;br /&gt;
typedef union {&lt;br /&gt;
 	uint8_t byte;&lt;br /&gt;
	struct {&lt;br /&gt;
		unsigned int1   :1;				// INT1  XBUS Pin 8&lt;br /&gt;
		unsigned int2   :1;				// INT2  XBUS Pin 11&lt;br /&gt;
		unsigned int3   :1;				// INT3  XBUS Pin 9&lt;br /&gt;
		unsigned intu   :1;				// INTU  XBUS Pin 7&lt;br /&gt;
		unsigned unused :4;&lt;br /&gt;
	};&lt;br /&gt;
	struct {&lt;br /&gt;
		unsigned magacc1     :1;		// INT1: LSM303DLHC INT1&lt;br /&gt;
		unsigned portexp     :1;		// INT2: MAX7311 INT_N&lt;br /&gt;
		unsigned magacc2_rtc :1;		// INT3: LSM303DLHC INT2&lt;br /&gt;
		unsigned noname      :5;		//       OR DS1339 SQW/INT_N&lt;br /&gt;
	};&lt;br /&gt;
} interrupt_RP6SBstatus_t;&lt;br /&gt;
extern interrupt_RP6SBstatus_t interrupt_RP6SBstatus;&lt;br /&gt;
&lt;br /&gt;
typedef union {&lt;br /&gt;
	uint16_t word;&lt;br /&gt;
	struct {&lt;br /&gt;
		unsigned pwr_i2c     :1;		// I/O 0.0 (Output)&lt;br /&gt;
		unsigned pwr_sharp_f :1;		// I/O 0.1 (Output)&lt;br /&gt;
		unsigned pwr_sharp_r :1;		// I/O 0.2 (Output)&lt;br /&gt;
		unsigned rdy_busbuff :1;		// I/O 0.3 (Input)&lt;br /&gt;
		unsigned en_leddriv  :1;		// I/O 0.4 (Output)&lt;br /&gt;
		unsigned pwr_cam_if  :1;		// I/O 0.5 (Output)&lt;br /&gt;
		unsigned pd_gyro     :1;		// I/O 0.6 (Output)&lt;br /&gt;
		unsigned st_gyro     :1;		// I/O 0.7 (Output)&lt;br /&gt;
		unsigned en_busbuff  :1;		// I/O 1.0 (Output)&lt;br /&gt;
		unsigned io_k19_3    :1;		// I/O 1.1 (Input)&lt;br /&gt;
		unsigned io_k19_1    :1;		// I/O 1.2 (Input)&lt;br /&gt;
		unsigned oen_servo   :1;		// I/O 1.3 (Output)&lt;br /&gt;
		unsigned pwr_servo   :1;		// I/O 1.4 (Output)&lt;br /&gt;
		unsigned drdy_magacc :1;		// I/O 1.5 (Input)&lt;br /&gt;
		unsigned io1_i2c     :1;		// I/O 1.6 (Output)&lt;br /&gt;
		unsigned io2_i2c     :1;		// I/O 1.7 (Input)&lt;br /&gt;
	};&lt;br /&gt;
} max7311IOs_t;&lt;br /&gt;
extern max7311IOs_t inport;&lt;br /&gt;
extern max7311IOs_t outport;&lt;br /&gt;
extern uint8_t readyBusbuff;&lt;br /&gt;
extern uint8_t pressedButton;&lt;br /&gt;
&lt;br /&gt;
void MAX7311_write_cfg(uint16_t);&lt;br /&gt;
void task_checkINTs(void);&lt;br /&gt;
void task_RP6SensorBoard(void);&lt;br /&gt;
void MAX7311_update(void);&lt;br /&gt;
void MAX7311_write(uint16_t);&lt;br /&gt;
void MAX7311_init(void);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Real Time Clock (RTC DS1339):&lt;br /&gt;
&lt;br /&gt;
// Registers:&lt;br /&gt;
#define DS1339_SECONDS					0&lt;br /&gt;
#define DS1339_MINUTES					1&lt;br /&gt;
#define DS1339_HOURS					2&lt;br /&gt;
#define DS1339_DAY						3&lt;br /&gt;
#define DS1339_DATE						4&lt;br /&gt;
#define DS1339_MONTH_CENTURY			5&lt;br /&gt;
#define DS1339_YEAR						6&lt;br /&gt;
#define DS1339_ALARM1_SECONDS			7&lt;br /&gt;
#define DS1339_ALARM1_MINUTES			8&lt;br /&gt;
#define DS1339_ALARM1_HOURS				9&lt;br /&gt;
#define DS1339_ALARM1_DAY_DATE			10&lt;br /&gt;
#define DS1339_ALARM2_MINUTES			11&lt;br /&gt;
#define DS1339_ALARM2_HOURS				12&lt;br /&gt;
#define DS1339_ALARM2_DAY_DATE			13&lt;br /&gt;
#define DS1339_CONTROL					14&lt;br /&gt;
#define DS1339_STATUS					15&lt;br /&gt;
#define DS1339_TRICKLE_CHARGER			16&lt;br /&gt;
&lt;br /&gt;
// Control register bitmasks:&lt;br /&gt;
#define DS1339_CONTROL_DEFAULT			0		// Power on default&lt;br /&gt;
#define DS1339_CONTROL_A1IE				1&lt;br /&gt;
#define DS1339_CONTROL_A2IE				2&lt;br /&gt;
#define DS1339_CONTROL_INTCN			4&lt;br /&gt;
#define DS1339_CONTROL_RS1				8&lt;br /&gt;
#define DS1339_CONTROL_RS2				16&lt;br /&gt;
#define DS1339_CONTROL_BBSQI			32&lt;br /&gt;
#define DS1339_CONTROL_EOSC				128&lt;br /&gt;
&lt;br /&gt;
// Trickle Charger register bitmasks:&lt;br /&gt;
#define DS1339_TRICKLE_CHARGER_DEFAULT	0b10101010 // One diode, 2k resistor&lt;br /&gt;
#define DS1339_TRICKLE_CHARGER_ROUT0	1&lt;br /&gt;
#define DS1339_TRICKLE_CHARGER_ROUT1	2&lt;br /&gt;
#define DS1339_TRICKLE_CHARGER_DS0		4&lt;br /&gt;
#define DS1339_TRICKLE_CHARGER_DS1		8&lt;br /&gt;
#define DS1339_TRICKLE_CHARGER_TCS0		16&lt;br /&gt;
#define DS1339_TRICKLE_CHARGER_TCS1		32&lt;br /&gt;
#define DS1339_TRICKLE_CHARGER_TCS2		64&lt;br /&gt;
#define DS1339_TRICKLE_CHARGER_TCS3		128&lt;br /&gt;
&lt;br /&gt;
enum RTCWEEKDAYS {&lt;br /&gt;
	R_MO = 1, R_TU, R_WE, R_TH, R_FR, R_SA, R_SU&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
typedef struct {&lt;br /&gt;
	uint16_t         year;				// Year&lt;br /&gt;
	uint8_t          month;				// Month   [1..12]&lt;br /&gt;
	enum RTCWEEKDAYS weekday;			// Weekday [1..7 = R_MO..R_SU]&lt;br /&gt;
	uint8_t          day;				// Day     [1..31]&lt;br /&gt;
} rtcdate_t;&lt;br /&gt;
rtcdate_t rtc_date;&lt;br /&gt;
&lt;br /&gt;
typedef struct {&lt;br /&gt;
	uint8_t dst;						// Daylight-saving-time (time zone)&lt;br /&gt;
	uint8_t hour;						// Hour    [0..23]&lt;br /&gt;
	uint8_t minute;						// Minute  [0..59]&lt;br /&gt;
	uint8_t second;						// Second  [0..59]&lt;br /&gt;
} rtctime_t;&lt;br /&gt;
rtctime_t rtc_time;&lt;br /&gt;
&lt;br /&gt;
uint8_t BCD2DEC(uint8_t);&lt;br /&gt;
uint8_t DEC2BCD(uint8_t);&lt;br /&gt;
void DS1339_write_cfg(uint8_t);&lt;br /&gt;
void DS1339_init(void);&lt;br /&gt;
#define CALC_DST						// Time zone will be calculated&lt;br /&gt;
void DS1339_read(void);&lt;br /&gt;
void DS1339_write(void);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Temperature Sensor (LM75B):&lt;br /&gt;
&lt;br /&gt;
// Registers:&lt;br /&gt;
#define LM75B_TEMP						0&lt;br /&gt;
#define LM75B_CONF						1&lt;br /&gt;
#define LM75B_THYST						2&lt;br /&gt;
#define LM75B_TOS						3&lt;br /&gt;
&lt;br /&gt;
// Conf register bitmasks:&lt;br /&gt;
#define LM75B_CONF_DEFAULT				0		// Power on default&lt;br /&gt;
#define LM75B_CONF_SHUTDOWN				1&lt;br /&gt;
#define LM75B_CONF_OS_COMP_INT			2&lt;br /&gt;
#define LM75B_CONF_OS_POL				4&lt;br /&gt;
#define LM75B_CONF_OS_F_QUE0			8&lt;br /&gt;
#define LM75B_CONF_OS_F_QUE1			16&lt;br /&gt;
&lt;br /&gt;
extern double temperature;&lt;br /&gt;
&lt;br /&gt;
void LM75B_write_cfg(uint8_t);&lt;br /&gt;
#define LM75B_shutdown() {LM75B_write_cfg(LM75B_CONF_SHUTDOWN);}&lt;br /&gt;
#define LM75B_init() {LM75B_write_cfg(LM75B_CONF_DEFAULT);}&lt;br /&gt;
extern uint8_t temperature_low;&lt;br /&gt;
extern uint8_t temperature_high;&lt;br /&gt;
#define getTemperatureHigh() (temperature_high)&lt;br /&gt;
#define getTemperatureLow() (temperature_low)&lt;br /&gt;
void LM75B_read(void);&lt;br /&gt;
double LM75B_calculate(void);&lt;br /&gt;
double LM75B_measure(void);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Servo Controller (PCA9685):&lt;br /&gt;
&lt;br /&gt;
// Registers:&lt;br /&gt;
#define PCA9685_MODE1					0&lt;br /&gt;
#define PCA9685_MODE2					1&lt;br /&gt;
#define PCA9685_SUBADR1					2&lt;br /&gt;
#define PCA9685_SUBADR2					3&lt;br /&gt;
#define PCA9685_SUBADR3					4&lt;br /&gt;
#define PCA9685_ALLCALLADR				5&lt;br /&gt;
#define PCA9685_LED0_ON_L				6&lt;br /&gt;
#define PCA9685_LED0_ON_H				7&lt;br /&gt;
#define PCA9685_LED0_OFF_L				8&lt;br /&gt;
#define PCA9685_LED0_OFF_H				9&lt;br /&gt;
#define PCA9685_LED1_ON_L				10&lt;br /&gt;
#define PCA9685_LED1_ON_H				11&lt;br /&gt;
#define PCA9685_LED1_OFF_L				12&lt;br /&gt;
#define PCA9685_LED1_OFF_H				13&lt;br /&gt;
#define PCA9685_LED2_ON_L				14&lt;br /&gt;
#define PCA9685_LED2_ON_H				15&lt;br /&gt;
#define PCA9685_LED2_OFF_L				16&lt;br /&gt;
#define PCA9685_LED2_OFF_H				17&lt;br /&gt;
#define PCA9685_LED3_ON_L				18&lt;br /&gt;
#define PCA9685_LED3_ON_H				19&lt;br /&gt;
#define PCA9685_LED3_OFF_L				20&lt;br /&gt;
#define PCA9685_LED3_OFF_H				21&lt;br /&gt;
#define PCA9685_LED4_ON_L				22&lt;br /&gt;
#define PCA9685_LED4_ON_H				23&lt;br /&gt;
#define PCA9685_LED4_OFF_L				24&lt;br /&gt;
#define PCA9685_LED4_OFF_H				25&lt;br /&gt;
#define PCA9685_LED5_ON_L				26&lt;br /&gt;
#define PCA9685_LED5_ON_H				27&lt;br /&gt;
#define PCA9685_LED5_OFF_L				28&lt;br /&gt;
#define PCA9685_LED5_OFF_H				29&lt;br /&gt;
#define PCA9685_LED6_ON_L				30&lt;br /&gt;
#define PCA9685_LED6_ON_H				31&lt;br /&gt;
#define PCA9685_LED6_OFF_L				32&lt;br /&gt;
#define PCA9685_LED6_OFF_H				33&lt;br /&gt;
#define PCA9685_LED7_ON_L				34&lt;br /&gt;
#define PCA9685_LED7_ON_H				35&lt;br /&gt;
#define PCA9685_LED7_OFF_L				36&lt;br /&gt;
#define PCA9685_LED7_OFF_H				37&lt;br /&gt;
#define PCA9685_LED8_ON_L				38&lt;br /&gt;
#define PCA9685_LED8_ON_H				39&lt;br /&gt;
#define PCA9685_LED8_OFF_L				40&lt;br /&gt;
#define PCA9685_LED8_OFF_H				41&lt;br /&gt;
#define PCA9685_LED9_ON_L				42&lt;br /&gt;
#define PCA9685_LED9_ON_H				43&lt;br /&gt;
#define PCA9685_LED9_OFF_L				44&lt;br /&gt;
#define PCA9685_LED9_OFF_H				45&lt;br /&gt;
#define PCA9685_LED10_ON_L				46&lt;br /&gt;
#define PCA9685_LED10_ON_H				47&lt;br /&gt;
#define PCA9685_LED10_OFF_L				48&lt;br /&gt;
#define PCA9685_LED10_OFF_H				49&lt;br /&gt;
#define PCA9685_LED11_ON_L				50&lt;br /&gt;
#define PCA9685_LED11_ON_H				51&lt;br /&gt;
#define PCA9685_LED11_OFF_L				52&lt;br /&gt;
#define PCA9685_LED11_OFF_H				53&lt;br /&gt;
#define PCA9685_LED12_ON_L				54&lt;br /&gt;
#define PCA9685_LED12_ON_H				55&lt;br /&gt;
#define PCA9685_LED12_OFF_L				56&lt;br /&gt;
#define PCA9685_LED12_OFF_H				57&lt;br /&gt;
#define PCA9685_LED13_ON_L				58&lt;br /&gt;
#define PCA9685_LED13_ON_H				59&lt;br /&gt;
#define PCA9685_LED13_OFF_L				60&lt;br /&gt;
#define PCA9685_LED13_OFF_H				61&lt;br /&gt;
#define PCA9685_LED14_ON_L				62&lt;br /&gt;
#define PCA9685_LED14_ON_H				63&lt;br /&gt;
#define PCA9685_LED14_OFF_L				64&lt;br /&gt;
#define PCA9685_LED14_OFF_H				65&lt;br /&gt;
#define PCA9685_LED15_ON_L				66&lt;br /&gt;
#define PCA9685_LED15_ON_H				67&lt;br /&gt;
#define PCA9685_LED15_OFF_L				68&lt;br /&gt;
#define PCA9685_LED15_OFF_H				69&lt;br /&gt;
#define PCA9685_ALL_LED_ON_L			250&lt;br /&gt;
#define PCA9685_ALL_LED_ON_H			251&lt;br /&gt;
#define PCA9685_ALL_LED_OFF_L			252&lt;br /&gt;
#define PCA9685_ALL_LED_OFF_H			253&lt;br /&gt;
#define PCA9685_PRE_SCALE				254&lt;br /&gt;
#define PCA9685_TESTMODE				255&lt;br /&gt;
&lt;br /&gt;
// Mode1 register bitmasks:&lt;br /&gt;
#define PCA9685_MODE1_ALLCALL			1&lt;br /&gt;
#define PCA9685_MODE1_SUB3				2&lt;br /&gt;
#define PCA9685_MODE1_SUB2				4&lt;br /&gt;
#define PCA9685_MODE1_SUB1				8&lt;br /&gt;
#define PCA9685_MODE1_SLEEP				16&lt;br /&gt;
#define PCA9685_MODE1_AI				32&lt;br /&gt;
#define PCA9685_MODE1_EXTCLK			64&lt;br /&gt;
#define PCA9685_MODE1_RESTART			128&lt;br /&gt;
&lt;br /&gt;
// Mode2 register bitmasks:&lt;br /&gt;
#define PCA9685_MODE2_OUTNE01_DEFAULT	0&lt;br /&gt;
#define PCA9685_MODE2_OUTDRV			4&lt;br /&gt;
#define PCA9685_MODE2_OCH				8&lt;br /&gt;
#define PCA9685_MODE2_INVRT				16&lt;br /&gt;
&lt;br /&gt;
#define F_PCA9685						25000000.0	// Int. Clock: 25 MHz&lt;br /&gt;
&lt;br /&gt;
void PCA9685_init(uint16_t);&lt;br /&gt;
#define initServo(__FREQ__) {PCA9685_init(__FREQ__);}&lt;br /&gt;
uint8_t servo(uint8_t);&lt;br /&gt;
void PCA9685_set(uint8_t, uint16_t);&lt;br /&gt;
#define setServo(__SERVO__,__POS__) {PCA9685_set(servo(__SERVO__),__POS__);}&lt;br /&gt;
void PCA9685_shutdown(void);&lt;br /&gt;
void PCA9685_restart(void);&lt;br /&gt;
void setServoPower(uint8_t);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C LED Driver (TCA6507):&lt;br /&gt;
&lt;br /&gt;
// Registers:&lt;br /&gt;
#define TCA6507_SELECT0				0&lt;br /&gt;
#define TCA6507_SELECT1				1&lt;br /&gt;
#define TCA6507_SELECT2				2&lt;br /&gt;
#define TCA6507_FADEON_TIME			3&lt;br /&gt;
#define TCA6507_FULLYON_TIME		4&lt;br /&gt;
#define TCA6507_FADEOFF_TIME		5&lt;br /&gt;
#define TCA6507_1ST_FULLYOFF_TIME	6&lt;br /&gt;
#define TCA6507_2ND_FULLYOFF_TIME	7&lt;br /&gt;
#define TCA6507_MAXIMUM_INTENSITY	8&lt;br /&gt;
#define TCA6507_MASTER_INTENSITY	9&lt;br /&gt;
#define TCA6507_INITIALIZATION		10&lt;br /&gt;
&lt;br /&gt;
// Output states:&lt;br /&gt;
#define STATE_OFF					0&lt;br /&gt;
#define STATE_PWM0					2&lt;br /&gt;
#define STATE_PWM1					3&lt;br /&gt;
#define STATE_ON					4&lt;br /&gt;
#define STATE_MINT					5&lt;br /&gt;
#define STATE_BLINK0				6&lt;br /&gt;
#define STATE_BLINK1				7&lt;br /&gt;
&lt;br /&gt;
extern uint8_t select[3];&lt;br /&gt;
&lt;br /&gt;
void TCA6507_write_cfg(uint8_t, uint8_t);&lt;br /&gt;
void TCA6507_update(void);&lt;br /&gt;
void TCA6507_set(uint8_t, uint8_t);&lt;br /&gt;
#define setLED(__LED__,__STATE__) {TCA6507_set(__LED__,__STATE__);}&lt;br /&gt;
void TCA6507_shutdown(void);&lt;br /&gt;
void TCA6507_restart(void);&lt;br /&gt;
void TCA6507_init(void);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C 3D Magnetometer &amp;amp; Accelerometer (LSM303DLHC):&lt;br /&gt;
&lt;br /&gt;
// LSM303DLHC accelerometer internal registers:&lt;br /&gt;
#define CTRL_REG1_A					0x20&lt;br /&gt;
#define CTRL_REG2_A					0x21&lt;br /&gt;
#define CTRL_REG3_A					0x22&lt;br /&gt;
#define CTRL_REG4_A					0x23&lt;br /&gt;
#define CTRL_REG5_A					0x24&lt;br /&gt;
#define CTRL_REG6_A					0x25&lt;br /&gt;
#define REFERENCE_A					0x26&lt;br /&gt;
#define STATUS_REG_A				0x27&lt;br /&gt;
#define OUT_X_L_A					0x28&lt;br /&gt;
#define OUT_X_H_A					0x29&lt;br /&gt;
#define OUT_Y_L_A					0x2a&lt;br /&gt;
#define OUT_Y_H_A					0x2b&lt;br /&gt;
#define OUT_Z_L_A					0x2c&lt;br /&gt;
#define OUT_Z_H_A					0x2d&lt;br /&gt;
#define FIFO_CTRL_REG_A				0x2e&lt;br /&gt;
#define FIFO_SRC_REG_A				0x2f&lt;br /&gt;
#define INT1_CFG_A					0x30&lt;br /&gt;
#define INT1_SOURCE_A				0x31&lt;br /&gt;
#define INT1_THS_A					0x32&lt;br /&gt;
#define INT1_DURATION_A				0x33&lt;br /&gt;
#define INT2_CFG_A					0x34&lt;br /&gt;
#define INT2_SOURCE_A				0x35&lt;br /&gt;
#define INT2_THS_A					0x36&lt;br /&gt;
#define INT2_DURATION_A				0x37&lt;br /&gt;
#define CLICK_CFG_A					0x38&lt;br /&gt;
#define CLICK_SRC_A					0x39&lt;br /&gt;
#define CLICK_THS_A					0x3a&lt;br /&gt;
#define TIME_LIMIT_A				0x3b&lt;br /&gt;
#define TIME_LATENCY_A				0x3c&lt;br /&gt;
#define TIME_WINDOW_A				0x3d&lt;br /&gt;
&lt;br /&gt;
// LSM303DLHC accelerometer register settings:&lt;br /&gt;
#define CTRL_REG1_A_10HZ			0b00100111	// 10Hz &amp;amp; all axes enable&lt;br /&gt;
#define CTRL_REG1_A_50HZ			0b01000111	// 50Hz &amp;amp; all axes enable&lt;br /&gt;
#define CTRL_REG4_A_DEFAULT			0b00000000	// Default (Normal mode)&lt;br /&gt;
#define CTRL_REG4_A_HR				0b00001000	// HR output mode&lt;br /&gt;
&lt;br /&gt;
// LSM303DLHC magnetometer internal registers:&lt;br /&gt;
#define CRA_REG_M					0x00&lt;br /&gt;
#define CRB_REG_M					0x01&lt;br /&gt;
#define MR_REG_M					0x02&lt;br /&gt;
#define OUT_X_H_M					0x03&lt;br /&gt;
#define OUT_X_L_M					0x04&lt;br /&gt;
#define OUT_Z_H_M					0x05&lt;br /&gt;
#define OUT_Z_L_M					0x06&lt;br /&gt;
#define OUT_Y_H_M					0x07&lt;br /&gt;
#define OUT_Y_L_M					0x08&lt;br /&gt;
#define SR_REG_MG					0x09&lt;br /&gt;
#define IRA_REG_M					0x0a&lt;br /&gt;
#define IRB_REG_M					0x0b&lt;br /&gt;
#define IRC_REG_M					0x0c&lt;br /&gt;
#define TEMP_OUT_H_M				0x31&lt;br /&gt;
#define TEMP_OUT_L_M				0x32&lt;br /&gt;
&lt;br /&gt;
// LSM303DLHC magnetometer register settings:&lt;br /&gt;
#define CRA_REG_M_15HZ				0b00010000	// Default (Data rate 15Hz)&lt;br /&gt;
#define CRA_REG_M_15HZ_T_EN			0b10010000	// 15Hz &amp;amp; temperature enable&lt;br /&gt;
#define CRB_REG_M_13GAUSS			0b00100000	// Gain +-1.3Gauss&lt;br /&gt;
#define MR_REG_M_CCM				0b00000000	// Continuous-conversion mode&lt;br /&gt;
#define MR_REG_M_SCM				0b00000001	// Single-conversion mode&lt;br /&gt;
#define MR_REG_M_SLEEP				0b00000011	// Default (Sleep-mode)&lt;br /&gt;
&lt;br /&gt;
extern int16_t x_axisa, y_axisa, z_axisa;&lt;br /&gt;
extern double pitch, roll;&lt;br /&gt;
extern double xa, ya, za;&lt;br /&gt;
extern double the, phi;&lt;br /&gt;
&lt;br /&gt;
extern int16_t x_axism, y_axism, z_axism;&lt;br /&gt;
extern int16_t headingm;&lt;br /&gt;
extern double xm, ym, zm;&lt;br /&gt;
#ifdef GET_TEMP_M&lt;br /&gt;
extern int16_t temperaturem;&lt;br /&gt;
extern double temperature_mag;&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
extern int16_t headingtc;&lt;br /&gt;
&lt;br /&gt;
void LSM303DLHC_A_init(void);&lt;br /&gt;
void readLSM303DLHC_A(void);&lt;br /&gt;
void normalizeLSM303DLHC_A(void);&lt;br /&gt;
void positionLSM303DLHC_A(void);&lt;br /&gt;
&lt;br /&gt;
void LSM303DLHC_M_init(void);&lt;br /&gt;
void readLSM303DLHC_M(void);&lt;br /&gt;
void normalizeLSM303DLHC_M(void);&lt;br /&gt;
int16_t headingLSM303DLHC_M(void);&lt;br /&gt;
&lt;br /&gt;
int16_t headingLSM303DLHC_TC(void);&lt;br /&gt;
&lt;br /&gt;
void LSM303DLHC_init(void);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Analog Yaw-Rate Gyroscope (LY330ALH):&lt;br /&gt;
&lt;br /&gt;
#define LY330ALH_MODE_NORMAL		0			// Power on default&lt;br /&gt;
#define LY330ALH_MODE_SLEEP			1&lt;br /&gt;
#define LY330ALH_MODE_SELFTEST		2&lt;br /&gt;
#define LY330ALH_MODE_POWERDOWN		3			// Shutdown mode&lt;br /&gt;
&lt;br /&gt;
extern int16_t z_axisg;&lt;br /&gt;
&lt;br /&gt;
void LY330ALH_set_mode(uint8_t);&lt;br /&gt;
uint16_t getRP6Base_ADC1(void);&lt;br /&gt;
int16_t LY330ALH_measure(void);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Hot Swappable 2-Wire Bus Buffer (TCA4311A):&lt;br /&gt;
&lt;br /&gt;
//extern uint8_t readyBusbuff;			// See &amp;quot;I2C I/O Port Expander&amp;quot; section&lt;br /&gt;
extern uint8_t errorBusbuff;&lt;br /&gt;
&lt;br /&gt;
#define getReadyBusbuff() (readyBusbuff)&lt;br /&gt;
uint8_t readReadyBusbuff(void);&lt;br /&gt;
void TCA4311A_shutdown(void);&lt;br /&gt;
void TCA4311A_reconnect(void);&lt;br /&gt;
void setRP6Base_PWR(uint8_t);&lt;br /&gt;
void setI2CModulePower(uint8_t);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Button:&lt;br /&gt;
&lt;br /&gt;
//extern uint8_t pressedButton;			// See &amp;quot;I2C I/O Port Expander&amp;quot; section&lt;br /&gt;
&lt;br /&gt;
#define getPressedButton() (pressedButton)&lt;br /&gt;
uint8_t readButton(void);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Status LED:&lt;br /&gt;
&lt;br /&gt;
void setStatusLED(uint8_t);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// RP6 Sensor Board initialisation and shutdown:&lt;br /&gt;
&lt;br /&gt;
void sensor_board_init(void);&lt;br /&gt;
void sensor_board_shutdown(void);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
/******************************************************************************&lt;br /&gt;
 * Additional info&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Changelog:&lt;br /&gt;
 * &lt;br /&gt;
 *  ---&amp;gt; changes are documented in the file &amp;quot;RP6M256_Sensor_BoardLib.c&amp;quot;&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=====Library Source=====&lt;br /&gt;
Datei: RP6M256_Sensor_BoardLib.c&lt;br /&gt;
&amp;lt;pre&amp;gt;/* ****************************************************************************&lt;br /&gt;
 *                           _______________________&lt;br /&gt;
 *                           \| RP6  ROBOT SYSTEM |/&lt;br /&gt;
 *                            \_-_-_-_-_-_-_-_-_-_/           &amp;gt;&amp;gt;&amp;gt; RP6 M256 WIFI&lt;br /&gt;
 * ----------------------------------------------------------------------------&lt;br /&gt;
 * ----------------------------- [c]2014 - Dirk -------------------------------&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * File: RP6M256_Sensor_BoardLib.c&lt;br /&gt;
 * Version: 1.0&lt;br /&gt;
 * Target: RP6 M256 WIFI - ATMEGA2560 @16.00MHz&lt;br /&gt;
 *         and a RP6 Sensor Board (CONRAD 1082384)&lt;br /&gt;
 * Author(s): Dirk&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Description:&lt;br /&gt;
 * This is our new Library that contains basic routines and functions for&lt;br /&gt;
 * accessing the hardwired components of the RP6 Sensor Board (CONRAD 1082384).&lt;br /&gt;
 * This library assumes the RP6 Sensor Board Revision 2.0 (04.07.13).&lt;br /&gt;
 *&lt;br /&gt;
 * There are more sensors and actors, that may be connected to the RP6 Sensor&lt;br /&gt;
 * Board: Many I2C components including a GPS module (CONRAD 1082385), servo&lt;br /&gt;
 *        motors, SHARP IR distance sensors, LEDs, a camera ...&lt;br /&gt;
 * This library doesn't contain functions for these sensors/actors, because&lt;br /&gt;
 * they are not HARDWIRED to the RP6 Sensor Board and may be connected&lt;br /&gt;
 * OPTIONALLY.&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// RP6 Sensor Board hardwired components:&lt;br /&gt;
// - I2C I/O Port Expander (MAX7311)&lt;br /&gt;
// - I2C Real Time Clock (RTC DS1339)&lt;br /&gt;
// - I2C Temperature Sensor (LM75B)&lt;br /&gt;
// - I2C Servo Controller (PCA9685)&lt;br /&gt;
// - I2C LED Driver (TCA6507)&lt;br /&gt;
// - I2C 3D Magnetometer &amp;amp; Accelerometer (LSM303DLHC)&lt;br /&gt;
// - Analog Yaw-Rate Gyroscope (LY330ALH)&lt;br /&gt;
// - Hot Swappable 2-Wire Bus Buffer (TCA4311A)&lt;br /&gt;
// - Button&lt;br /&gt;
// - Status LED&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Includes:&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6M256_Sensor_BoardLib.h&amp;quot; 		&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Variables:&lt;br /&gt;
&lt;br /&gt;
uint8_t registerBuf[13]; &lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C I/O Port Expander (MAX7311):&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Sends the configuration word to a MAX7311.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: config -&amp;gt; Config word for control&lt;br /&gt;
 *                  registers&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void MAX7311_write_cfg(uint16_t config)&lt;br /&gt;
{&lt;br /&gt;
#ifdef SAFE_CONFIG&lt;br /&gt;
	config |= 0b1010000000001000;&lt;br /&gt;
#endif&lt;br /&gt;
	I2CTWI_transmit3Bytes(I2C_SENSOR_PORTEXP_ADR, MAX7311_PORT1_CONFIG, config, (config&amp;gt;&amp;gt;8));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
interrupt_RP6SBstatus_t interrupt_RP6SBstatus;&lt;br /&gt;
&lt;br /&gt;
/** &lt;br /&gt;
 * This function checks all interrupt pins on&lt;br /&gt;
 * the XBUS (INT1..3, INTU).&lt;br /&gt;
 * This function must be called VERY frequently&lt;br /&gt;
 * out of the main loop.&lt;br /&gt;
 * Bigger delays result in slower reaction to&lt;br /&gt;
 * interrupt requests of the RP6 Sensor Board.&lt;br /&gt;
 * Interrupt function table:&lt;br /&gt;
 *   Int. : Function 1      IRQ  Function 2       IRQ&lt;br /&gt;
 *   -------------------------------------------------&lt;br /&gt;
 *   INT1 : LSM303DLHC INT1  H&lt;br /&gt;
 *   INT2 : MAX7311   INT_N  L&lt;br /&gt;
 *   INT3 : LSM303DLHC INT2  H   DS1339 SQW/INT_N  L&lt;br /&gt;
 *   INTU : not used&lt;br /&gt;
 * You can see in the &amp;quot;IRQ&amp;quot; column, which level&lt;br /&gt;
 * (H/L) means an ACTIVE INTERRUPT signal.&lt;br /&gt;
 * The interrupt pin levels (H=true/L=false) are&lt;br /&gt;
 * read into the global interrupt_RP6SBstatus&lt;br /&gt;
 * variable.&lt;br /&gt;
 *&lt;br /&gt;
 * Hints: - This function checks the interrupt&lt;br /&gt;
 *          signals by polling. This is NOT the&lt;br /&gt;
 *          best way to to this job. You will&lt;br /&gt;
 *          have to write your own task, if you&lt;br /&gt;
 *          want to use the Pin Change Interrupt&lt;br /&gt;
 *          function of the ATmega2560&lt;br /&gt;
 *          microcontroller.&lt;br /&gt;
 *        - You cannot use both interrupt sources&lt;br /&gt;
 *          for INT3! So you should not use INT2&lt;br /&gt;
 *          of the LSM303DLHC together with the&lt;br /&gt;
 *          alarm function of the DS1339 (RTC)!&lt;br /&gt;
 *        - Every interrupt signal of the Sensor&lt;br /&gt;
 *          Board may be cut off from the XBUS&lt;br /&gt;
 *          by opening a jumper (Jx):&lt;br /&gt;
 *          INT1 -&amp;gt; J3 (LSM303DLHC INT1)&lt;br /&gt;
 *          INT2 -&amp;gt; J4 (MAX7311 INT_N)&lt;br /&gt;
 *          INT3 -&amp;gt; J2 (DS1339 SQW/INT_N)&lt;br /&gt;
 *          INT3 -&amp;gt; J5 (LSM303DLHC INT2)&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *&lt;br /&gt;
 *   if (!interrupt_RP6SBstatus.portexp)&lt;br /&gt;
 *        writeString_P(&amp;quot;==&amp;gt; MAX7311 INT_N!!!&amp;quot;);&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void task_checkINTs(void)&lt;br /&gt;
{&lt;br /&gt;
	if(IO_SENSOR_INT1_PIN &amp;amp; IO_SENSOR_INT1_IN)	// XBUS INT1 -&amp;gt; PJ3 (PCINT12)&lt;br /&gt;
		interrupt_RP6SBstatus.int1 = true;&lt;br /&gt;
	else&lt;br /&gt;
		interrupt_RP6SBstatus.int1 = false;&lt;br /&gt;
	if(IO_SENSOR_INT2_PIN &amp;amp; IO_SENSOR_INT2_IN)	// XBUS INT2 -&amp;gt; PJ6 (PCINT15)&lt;br /&gt;
		interrupt_RP6SBstatus.int2 = true;&lt;br /&gt;
	else&lt;br /&gt;
		interrupt_RP6SBstatus.int2 = false;&lt;br /&gt;
	if(IO_SENSOR_INT3_PIN &amp;amp; IO_SENSOR_INT3_IN)	// XBUS INT3 -&amp;gt; PJ5 (PCINT14)&lt;br /&gt;
		interrupt_RP6SBstatus.int3 = true;&lt;br /&gt;
	else&lt;br /&gt;
		interrupt_RP6SBstatus.int3 = false;&lt;br /&gt;
//	if(IO_SENSOR_INTU_PIN &amp;amp; IO_SENSOR_INTU_IN)	// XBUS INTU -&amp;gt; PJ4 (PCINT13)&lt;br /&gt;
//		interrupt_RP6SBstatus.intu = true;&lt;br /&gt;
//	else&lt;br /&gt;
//		interrupt_RP6SBstatus.intu = false;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
max7311IOs_t inport;&lt;br /&gt;
uint8_t readyBusbuff;&lt;br /&gt;
uint8_t pressedButton;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function checks all I/O ports (I/O 0.0..1.7)&lt;br /&gt;
 * of the MAX7311 sequentially!&lt;br /&gt;
 * You must call this function frequently out of&lt;br /&gt;
 * the main loop.&lt;br /&gt;
 * The I/O port values (true/false) are read into&lt;br /&gt;
 * the global inport variable.&lt;br /&gt;
 * The global variables readyBusbuff (2-Wire Bus&lt;br /&gt;
 * Buffer: Enable) and pressedButton (Button S1:&lt;br /&gt;
 * Pressed) contain actual values (true/false)&lt;br /&gt;
 * after execution of this task.&lt;br /&gt;
 *&lt;br /&gt;
 * Examples:&lt;br /&gt;
 *&lt;br /&gt;
 *   if (inport.rdy_busbuff)&lt;br /&gt;
 *        writeString_P(&amp;quot;I/O 0.3: High&amp;quot;);&lt;br /&gt;
 *   else writeString_P(&amp;quot;I/O 0.3: Low&amp;quot;);&lt;br /&gt;
 *   if (!inport.drdy_magacc)&lt;br /&gt;
 *        writeString_P(&amp;quot;I/O 1.5: Low&amp;quot;);&lt;br /&gt;
 *   if (pressedButton)&lt;br /&gt;
 *        writeString_P(&amp;quot;Button pressed!&amp;quot;);&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void task_RP6SensorBoard(void)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmitByte(I2C_SENSOR_PORTEXP_ADR, MAX7311_INPUT_PORT1);&lt;br /&gt;
	I2CTWI_readBytes(I2C_SENSOR_PORTEXP_ADR, registerBuf, 2);&lt;br /&gt;
	inport.word = (registerBuf[1] &amp;lt;&amp;lt; 8) + registerBuf[0];&lt;br /&gt;
	readyBusbuff = inport.rdy_busbuff;&lt;br /&gt;
	pressedButton = inport.io2_i2c;&lt;br /&gt;
	pressedButton = !pressedButton;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
max7311IOs_t outport;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Updates the I/O ports with current value from&lt;br /&gt;
 * the global outport variable!&lt;br /&gt;
 * If one or more port pins were configured as&lt;br /&gt;
 * output before, they will be set (high) or&lt;br /&gt;
 * cleared (low).&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *&lt;br /&gt;
 *   outport.word = 0b0000000000001001;&lt;br /&gt;
 *   MAX7311_update();&lt;br /&gt;
 *   // This clears all I/O ports and sets&lt;br /&gt;
 *   // the ports I/O 0.0 and I/O 0.3!&lt;br /&gt;
 *&lt;br /&gt;
 *   // Other possibility:&lt;br /&gt;
 *   outport.pwr_sharp_f = true;&lt;br /&gt;
 *   MAX7311_update();&lt;br /&gt;
 *   // This sets I/O 0.1 and does not&lt;br /&gt;
 *   // affect any other I/O port!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void MAX7311_update(void)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmit3Bytes(I2C_SENSOR_PORTEXP_ADR, MAX7311_OUTPUT_PORT1, outport.word, (outport.word&amp;gt;&amp;gt;8));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Writes the 16-bit data to a MAX7311.&lt;br /&gt;
 * The data are output with those I/O ports that&lt;br /&gt;
 * were configured as output before.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: data -&amp;gt; Data word&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void MAX7311_write(uint16_t data)&lt;br /&gt;
{&lt;br /&gt;
	outport.word = data;&lt;br /&gt;
	MAX7311_update();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Initializes the I/O Port Expander after power&lt;br /&gt;
 * on.&lt;br /&gt;
 *&lt;br /&gt;
 * Hint: If USE_PD5 is defined in the&lt;br /&gt;
 *       configuration header file, this&lt;br /&gt;
 *       function uses the RP6M256 portpin,&lt;br /&gt;
 *       that is connected to plug I/O: Pin 9&lt;br /&gt;
 *       instead of MAX7311 I/O 1.0!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void MAX7311_init(void)&lt;br /&gt;
{&lt;br /&gt;
#ifdef USE_PD5&lt;br /&gt;
	MAX7311_write_cfg(MAX7311_CONFIG_USE_PD5);&lt;br /&gt;
	IO_SENSOR_TCA4311A_EN_DDR |= IO_SENSOR_TCA4311A_EN_IN;		// Output&lt;br /&gt;
	IO_SENSOR_TCA4311A_EN_PORT |= IO_SENSOR_TCA4311A_EN_IN;		// High&lt;br /&gt;
#else&lt;br /&gt;
	MAX7311_write_cfg(MAX7311_CONFIG_DEFAULT);&lt;br /&gt;
#endif&lt;br /&gt;
	MAX7311_write(MAX7311_OUTPUT_DEFAULT);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Real Time Clock (RTC DS1339):&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function converts a BCD to a DEC value.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
uint8_t BCD2DEC(uint8_t bcd)&lt;br /&gt;
{&lt;br /&gt;
	return ((bcd &amp;gt;&amp;gt; 4) * 10 + (bcd &amp;amp; 0x0f));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function converts a DEC to a BCD value.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
uint8_t DEC2BCD(uint8_t dec)&lt;br /&gt;
{uint8_t units = dec % 10;&lt;br /&gt;
	if (dec /= 10) {&lt;br /&gt;
		return (units + (DEC2BCD(dec) &amp;lt;&amp;lt; 4));&lt;br /&gt;
	}&lt;br /&gt;
	else {&lt;br /&gt;
		return units;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Sends the configuration byte to a DS1339.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: Config byte for control register&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void DS1339_write_cfg(uint8_t config)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_RTC_ADR, DS1339_CONTROL, config);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Initializes the DS1339 Trickle Charger&lt;br /&gt;
 * function to the default for the RP6 Sensor&lt;br /&gt;
 * Board: One diode and 2kOhm resistor.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void DS1339_init(void)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_RTC_ADR, DS1339_TRICKLE_CHARGER, DS1339_TRICKLE_CHARGER_DEFAULT);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Reads all data registers of the Real Time Clock (RTC).&lt;br /&gt;
 * They are stored in the time &amp;amp; date variables defined in&lt;br /&gt;
 * the library header.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void DS1339_read(void)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmitByte(I2C_SENSOR_RTC_ADR, DS1339_SECONDS);&lt;br /&gt;
	I2CTWI_readBytes(I2C_SENSOR_RTC_ADR, registerBuf, 7);&lt;br /&gt;
	rtc_time.second = BCD2DEC(registerBuf[0]);&lt;br /&gt;
	rtc_time.minute = BCD2DEC(registerBuf[1]);&lt;br /&gt;
	rtc_time.hour = BCD2DEC(registerBuf[2] &amp;amp; 0x3f);&lt;br /&gt;
	rtc_date.weekday = (registerBuf[3] &amp;amp; 0x07);&lt;br /&gt;
	rtc_date.day = BCD2DEC(registerBuf[4]);&lt;br /&gt;
	rtc_date.month = BCD2DEC(registerBuf[5] &amp;amp; 0x7f);&lt;br /&gt;
	if(registerBuf[5] &amp;amp; 0x80) rtc_date.year = 100;&lt;br /&gt;
	else rtc_date.year = 0;&lt;br /&gt;
	rtc_date.year += BCD2DEC(registerBuf[6]);&lt;br /&gt;
	rtc_date.year += 2000;&lt;br /&gt;
	rtc_time.dst = 0;&lt;br /&gt;
#ifdef CALC_DST&lt;br /&gt;
	// Calculate MESZ (DST):&lt;br /&gt;
	uint8_t wday = rtc_date.weekday;			// Weekday [1..7 = R_MO..R_SU]&lt;br /&gt;
	if(wday == 7) wday = 0;&lt;br /&gt;
	if(rtc_date.month &amp;lt; 3 || rtc_date.month &amp;gt; 10) {&lt;br /&gt;
		return;&lt;br /&gt;
	}&lt;br /&gt;
	if((rtc_date.day - wday &amp;gt;= 25)&lt;br /&gt;
	 &amp;amp;&amp;amp; (wday || rtc_time.hour &amp;gt;= 2)) {&lt;br /&gt;
		if(rtc_date.month == 10)&lt;br /&gt;
			return;&lt;br /&gt;
	}&lt;br /&gt;
	else {&lt;br /&gt;
		if(rtc_date.month == 3) {&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	rtc_time.dst = 1;&lt;br /&gt;
#endif&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Writes the time &amp;amp; date infos in the variables defined in&lt;br /&gt;
 * the library header to the Real Time Clock (RTC).&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void DS1339_write(void)&lt;br /&gt;
{&lt;br /&gt;
	registerBuf[0] = DS1339_SECONDS;&lt;br /&gt;
	registerBuf[1] = DEC2BCD(rtc_time.second);&lt;br /&gt;
	registerBuf[2] = DEC2BCD(rtc_time.minute);&lt;br /&gt;
	registerBuf[3] = DEC2BCD(rtc_time.hour);&lt;br /&gt;
	registerBuf[4] = rtc_date.weekday;&lt;br /&gt;
	registerBuf[5] = DEC2BCD(rtc_date.day);&lt;br /&gt;
	registerBuf[6] = DEC2BCD(rtc_date.month);&lt;br /&gt;
	registerBuf[7] = DEC2BCD(rtc_date.year - 2000);&lt;br /&gt;
	I2CTWI_transmitBytes(I2C_SENSOR_RTC_ADR, &amp;amp;registerBuf[0], 8);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Temperature Sensor (LM75B):&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Sends the configuration byte to a LM75B.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: Config byte for Conf register&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void LM75B_write_cfg(uint8_t config)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_TEMP_ADR, LM75B_CONF, config);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
uint8_t temperature_low;&lt;br /&gt;
uint8_t temperature_high;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Reads the two data registers of the temperature&lt;br /&gt;
 * sensor's Temp register.&lt;br /&gt;
 * They are stored in the variables temperature_low&lt;br /&gt;
 * and _high.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void LM75B_read(void)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmitByte(I2C_SENSOR_TEMP_ADR, LM75B_TEMP);&lt;br /&gt;
	I2CTWI_readBytes(I2C_SENSOR_TEMP_ADR, registerBuf, 2);&lt;br /&gt;
	temperature_high = registerBuf[0];&lt;br /&gt;
	temperature_low = registerBuf[1];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
double temperature;						// Temperature [°C]&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Calculates and returns the temperature value&lt;br /&gt;
 * by using the data read from the LM75B with&lt;br /&gt;
 * the function LM75B_read(). The sensor is&lt;br /&gt;
 * designed for 11 bit measurement and 0.125°C&lt;br /&gt;
 * resolution.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
double LM75B_calculate(void)&lt;br /&gt;
{&lt;br /&gt;
	int16_t tempraw = 0;&lt;br /&gt;
	double temp;&lt;br /&gt;
&lt;br /&gt;
	tempraw = (getTemperatureHigh() &amp;lt;&amp;lt; 8) | getTemperatureLow();&lt;br /&gt;
	tempraw &amp;gt;&amp;gt;= 5;&lt;br /&gt;
	if (tempraw &amp;amp; 1024)							// Calculate temperature&lt;br /&gt;
		tempraw = (tempraw &amp;amp; 1023) - 1024;&lt;br /&gt;
	else&lt;br /&gt;
		tempraw = tempraw &amp;amp; 1023;&lt;br /&gt;
	temp = tempraw * 0.125;&lt;br /&gt;
	return temp;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Performs a 11 bit measurement and returns the&lt;br /&gt;
 * temperature [°C]. The sensor has a measuring&lt;br /&gt;
 * cycle of 100ms. So it makes no sense calling&lt;br /&gt;
 * this function at a frequency above 10Hz.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
double LM75B_measure(void)&lt;br /&gt;
{&lt;br /&gt;
//	LM75B_init();&lt;br /&gt;
	LM75B_read();								// Read data&lt;br /&gt;
	return (LM75B_calculate());					// Calculate value&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Servo Controller (PCA9685):&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Call this once before using the servo function.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: PWM frequency [40..1000 Hz]&lt;br /&gt;
 *&lt;br /&gt;
 * Hints: - Default servo frequency is 50 Hz!&lt;br /&gt;
 *        - The servo power is NOT switched on by&lt;br /&gt;
 *          this function!&lt;br /&gt;
 *&lt;br /&gt;
 * There is also a macro initServo(freq), which&lt;br /&gt;
 * does exactly the same as this function.&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *   initServo(50);&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void PCA9685_init(uint16_t freq)&lt;br /&gt;
{&lt;br /&gt;
	outport.oen_servo = false;					// I/O 1.3: Low&lt;br /&gt;
	MAX7311_update();&lt;br /&gt;
	if ((freq &amp;lt; 40) || (freq &amp;gt; 1000)) freq = 50;&lt;br /&gt;
	I2CTWI_transmitByte(I2C_SENSOR_SERVO_ADR, PCA9685_MODE2);&lt;br /&gt;
	uint8_t last_mode = I2CTWI_readByte(I2C_SENSOR_SERVO_ADR);&lt;br /&gt;
	last_mode &amp;amp;= ~PCA9685_MODE2_INVRT;			// Clear INVRT bit&lt;br /&gt;
	last_mode |= PCA9685_MODE2_OUTDRV;			// Set OUTDRV bit&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_SERVO_ADR, PCA9685_MODE2, last_mode);&lt;br /&gt;
	I2CTWI_transmitByte(I2C_SENSOR_SERVO_ADR, PCA9685_MODE1);&lt;br /&gt;
	last_mode = I2CTWI_readByte(I2C_SENSOR_SERVO_ADR);&lt;br /&gt;
	last_mode |= PCA9685_MODE1_AI;				// Set AI bit&lt;br /&gt;
	uint8_t mode1 = last_mode;&lt;br /&gt;
	mode1 |= PCA9685_MODE1_SLEEP;				// Set SLEEP bit&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_SERVO_ADR, PCA9685_MODE1, mode1);&lt;br /&gt;
	uint8_t prescale = (uint8_t) (F_PCA9685 / 4096 / freq - 0.5);&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_SERVO_ADR, PCA9685_PRE_SCALE, prescale);&lt;br /&gt;
	last_mode &amp;amp;= ~PCA9685_MODE1_SLEEP;			// Clear SLEEP bit&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_SERVO_ADR, PCA9685_MODE1, last_mode);&lt;br /&gt;
	mSleep(1);&lt;br /&gt;
	last_mode |= PCA9685_MODE1_RESTART;			// Clear RESTART bit&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_SERVO_ADR, PCA9685_MODE1, last_mode);&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_SERVO_ADR, PCA9685_LED8_ON_H, 0x10);&lt;br /&gt;
	return;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/** &lt;br /&gt;
 * Returns the channel belonging to a servo number.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: number -&amp;gt; Servo number [1..8]&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
uint8_t servo(uint8_t number)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t channel;&lt;br /&gt;
&lt;br /&gt;
	switch (number) {&lt;br /&gt;
		case 1 :&lt;br /&gt;
			channel = CH_SERVO_1; break;&lt;br /&gt;
		case 2 :&lt;br /&gt;
			channel = CH_SERVO_2; break;&lt;br /&gt;
		case 3 :&lt;br /&gt;
			channel = CH_SERVO_3; break;&lt;br /&gt;
		case 4 :&lt;br /&gt;
			channel = CH_SERVO_4; break;&lt;br /&gt;
		case 5 :&lt;br /&gt;
			channel = CH_SERVO_5; break;&lt;br /&gt;
		case 6 :&lt;br /&gt;
			channel = CH_SERVO_6; break;&lt;br /&gt;
		case 7 :&lt;br /&gt;
			channel = CH_SERVO_7; break;&lt;br /&gt;
		case 8 :&lt;br /&gt;
			channel = CH_SERVO_8; break;&lt;br /&gt;
		default : channel = CH_SERVO_1;&lt;br /&gt;
	}&lt;br /&gt;
	return channel;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This is the servo position set function.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: channel -&amp;gt; Channel number [1..16]&lt;br /&gt;
 *        pos     -&amp;gt; Servo position [SERVOx_LT..SERVOx_RT]&lt;br /&gt;
 *&lt;br /&gt;
 * Hints: - A servo position of 205 means 1 ms servo impulse,&lt;br /&gt;
 *          a position of 410 means a 2 ms servo impulse!&lt;br /&gt;
 *          You may calculate the servo impulse length by:&lt;br /&gt;
 *          ==&amp;gt; Impulse [ms] = servo position / 204.8 &amp;lt;==&lt;br /&gt;
 *          (Formula only valid for a PWM of 50 Hz!)&lt;br /&gt;
 *&lt;br /&gt;
 * There is also a macro setServo(servo, pos), which&lt;br /&gt;
 * does nearly the same as this function, but the first&lt;br /&gt;
 * parameter is the servo and NOT the channel number.&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *   setServo(2,300);&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void PCA9685_set(uint8_t channel, uint16_t pos)&lt;br /&gt;
{&lt;br /&gt;
	if ((channel == 0) || (channel &amp;gt; 16))&lt;br /&gt;
		return;&lt;br /&gt;
	uint8_t reg = channel * 4 + 4;				// Register LEDx_OFF_L&lt;br /&gt;
	I2CTWI_transmit3Bytes(I2C_SENSOR_SERVO_ADR, reg, (pos &amp;amp; 0x00ff), (pos &amp;gt;&amp;gt; 8));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * If the servos are not moving for a while, the&lt;br /&gt;
 * servo function can be stopped with this&lt;br /&gt;
 * function (PCA9685 set to sleep mode).&lt;br /&gt;
 *&lt;br /&gt;
 * Hint: The servo power is NOT switched off by&lt;br /&gt;
 *       this function!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void PCA9685_shutdown(void)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_SERVO_ADR, PCA9685_ALL_LED_OFF_H, 0x10);&lt;br /&gt;
	I2CTWI_transmitByte(I2C_SENSOR_SERVO_ADR, PCA9685_MODE1);&lt;br /&gt;
	uint8_t mode1 = I2CTWI_readByte(I2C_SENSOR_SERVO_ADR);&lt;br /&gt;
	mode1 |= PCA9685_MODE1_SLEEP;				// Set SLEEP bit&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_SERVO_ADR, PCA9685_MODE1, mode1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * If the servo function was stopped with the&lt;br /&gt;
 * function PCA9685_shutdown() before, it can be&lt;br /&gt;
 * (re)started again with this function.&lt;br /&gt;
 *&lt;br /&gt;
 * Hint: The servo power is NOT switched on by&lt;br /&gt;
 *       this function!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void PCA9685_restart(void)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmitByte(I2C_SENSOR_SERVO_ADR, PCA9685_MODE1);&lt;br /&gt;
	uint8_t mode1 = I2CTWI_readByte(I2C_SENSOR_SERVO_ADR);&lt;br /&gt;
	if (mode1 &amp;amp; PCA9685_MODE1_RESTART) {		// RESTART bit set?&lt;br /&gt;
		mode1 &amp;amp;= ~PCA9685_MODE1_SLEEP;			// Clear SLEEP bit&lt;br /&gt;
		I2CTWI_transmit2Bytes(I2C_SENSOR_SERVO_ADR, PCA9685_MODE1, mode1);&lt;br /&gt;
		mSleep(1);&lt;br /&gt;
		mode1 |= PCA9685_MODE1_RESTART;			// Clear RESTART bit&lt;br /&gt;
		I2CTWI_transmit2Bytes(I2C_SENSOR_SERVO_ADR, PCA9685_MODE1, mode1);&lt;br /&gt;
		I2CTWI_transmit2Bytes(I2C_SENSOR_SERVO_ADR, PCA9685_ALL_LED_OFF_H, 0);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/** &lt;br /&gt;
 * With this function you can switch the servo&lt;br /&gt;
 * power on or off.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: pwr -&amp;gt; 0 (false) = servo power off&lt;br /&gt;
 *               &amp;gt;0 (true) = servo power on&lt;br /&gt;
 *&lt;br /&gt;
 * Hints: - If connected servos are not used, you&lt;br /&gt;
 *          should always switch the servo power off&lt;br /&gt;
 *          (default) to save energy!&lt;br /&gt;
 *        - The PCA9685 is NOT restarted or put into&lt;br /&gt;
 *          shutdown mode by this function!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void setServoPower(uint8_t pwr)&lt;br /&gt;
{&lt;br /&gt;
	if(pwr &amp;gt; 0)&lt;br /&gt;
		outport.pwr_servo = true;				// I/O 1.4: High&lt;br /&gt;
	else&lt;br /&gt;
		outport.pwr_servo = false;				// I/O 1.4: Low&lt;br /&gt;
	MAX7311_update();&lt;br /&gt;
}	&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C LED Driver (TCA6507):&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Sends the configuration byte to TCA6507's&lt;br /&gt;
 * internal registers.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: reg    -&amp;gt; Register address [0..10]&lt;br /&gt;
 *        config -&amp;gt; Config byte for internal&lt;br /&gt;
 *                  registers&lt;br /&gt;
 *&lt;br /&gt;
 * Hints: - With this function you can write to&lt;br /&gt;
 *          all internal registers of the LED&lt;br /&gt;
 *          driver, see &amp;quot;Registers:&amp;quot; in the&lt;br /&gt;
 *          library header file!&lt;br /&gt;
 *        - Mainly you will use this function&lt;br /&gt;
 *          for setting time (regs 3..7) and&lt;br /&gt;
 *          intensity (regs 8, 9) values.&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *   TCA6507_write_cfg(TCA6507_MAXIMUM_INTENSITY,0x77);&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void TCA6507_write_cfg(uint8_t reg, uint8_t config)&lt;br /&gt;
{&lt;br /&gt;
	if(reg &amp;gt; 10) reg = 0;&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_LEDDRIVER_ADR, reg, config);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
uint8_t select[3];&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Updates the LED driver select registers (0..2)&lt;br /&gt;
 * with the global select array!&lt;br /&gt;
 *&lt;br /&gt;
 * Hint: - Also have a look at Table 4 in the&lt;br /&gt;
 *         TCA6507 datasheet!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void TCA6507_update(void)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmit4Bytes(I2C_SENSOR_LEDDRIVER_ADR, (TCA6507_SELECT0 | 0x10), select[0], select[1], select[2]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This is the LED state set function.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: led   -&amp;gt; LED number [0..6]&lt;br /&gt;
 *        state -&amp;gt; LED state  [0..7]&lt;br /&gt;
 *&lt;br /&gt;
 * Hints: - Possible driver states [0..7] see&lt;br /&gt;
 *          &amp;quot;Output states:&amp;quot; in the library&lt;br /&gt;
 *          header file!&lt;br /&gt;
 *        - Also have a look at Table 4 in the&lt;br /&gt;
 *          TCA6507 datasheet!&lt;br /&gt;
 *&lt;br /&gt;
 * There is also a macro setLED(led, state), which&lt;br /&gt;
 * does exactly the same as this function.&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *   setLED(1,4);&lt;br /&gt;
 *   // Switches LED1 ON&lt;br /&gt;
 *   // ... OR ...&lt;br /&gt;
 *   setLED(LED1,STATE_ON);&lt;br /&gt;
 *   // does the same.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void TCA6507_set(uint8_t led, uint8_t state)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t i, mask;&lt;br /&gt;
&lt;br /&gt;
	if(led &amp;gt; 6) led = 0;&lt;br /&gt;
	led = 1 &amp;lt;&amp;lt; led;&lt;br /&gt;
	mask = 1;&lt;br /&gt;
	for(i = 0; i &amp;lt; 3; i++) {&lt;br /&gt;
		select[i] &amp;amp;= ~led;&lt;br /&gt;
		if(state &amp;amp; mask)&lt;br /&gt;
			select[i] |= led;&lt;br /&gt;
		mask &amp;lt;&amp;lt;= 1;&lt;br /&gt;
	}&lt;br /&gt;
	TCA6507_update();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * If the LEDs are not needed for a while, the&lt;br /&gt;
 * LED driver can be stopped with this function&lt;br /&gt;
 * (TCA6507 set to shutdown mode).&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void TCA6507_shutdown(void)&lt;br /&gt;
{&lt;br /&gt;
	outport.en_leddriv = false;					// I/O 0.4: Low&lt;br /&gt;
	MAX7311_update();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * If the LED driver was stopped with the&lt;br /&gt;
 * function TCA6507_shutdown() before, it can be&lt;br /&gt;
 * (re)started again with this function.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void TCA6507_restart(void)&lt;br /&gt;
{&lt;br /&gt;
	outport.en_leddriv = true;					// I/O 0.4: High&lt;br /&gt;
	MAX7311_update();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Initializes the LED driver after power on by&lt;br /&gt;
 * switching all LEDs off.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void TCA6507_init(void)&lt;br /&gt;
{&lt;br /&gt;
	select[0] = 0;&lt;br /&gt;
	select[1] = 0;&lt;br /&gt;
	select[2] = 0;&lt;br /&gt;
	TCA6507_update();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C 3D Magnetometer &amp;amp; Accelerometer (LSM303DLHC):&lt;br /&gt;
&lt;br /&gt;
// --------------------------------------------&lt;br /&gt;
// LSM303DLHC accelerometer functions:&lt;br /&gt;
int16_t x_axisa, y_axisa, z_axisa;&lt;br /&gt;
double pitch, roll;&lt;br /&gt;
double xa, ya, za;&lt;br /&gt;
double the, phi;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Call this once before using the 3D-Accelerometer.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void LSM303DLHC_A_init(void)&lt;br /&gt;
{&lt;br /&gt;
	// Set normal power mode, 10 Hz data rate, all axes enabled:&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_LSM303DLHC_A_ADR, CTRL_REG1_A, CTRL_REG1_A_10HZ);&lt;br /&gt;
	mSleep(10);&lt;br /&gt;
	// Set HD mode:&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_LSM303DLHC_A_ADR, CTRL_REG4_A, CTRL_REG4_A_HR);&lt;br /&gt;
	mSleep(10);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function reads the X-axis, Y-axis and Z-axis values&lt;br /&gt;
 * from the LSM303DLHC accelerometer and stores them in the&lt;br /&gt;
 * global variables x_axisa, y_axisa and z_axisa.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void readLSM303DLHC_A(void)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t readBuf[6];&lt;br /&gt;
&lt;br /&gt;
	I2CTWI_transmitByte(I2C_SENSOR_LSM303DLHC_A_ADR, (OUT_X_L_A | 0x80));&lt;br /&gt;
	I2CTWI_readBytes(I2C_SENSOR_LSM303DLHC_A_ADR, readBuf, 6); // Read  X-/Y-/Z-axis&lt;br /&gt;
	// xb = y:&lt;br /&gt;
	x_axisa = ((readBuf[OUT_Y_H_A - OUT_X_L_A] &amp;lt;&amp;lt; 8) + readBuf[OUT_Y_L_A - OUT_X_L_A]) / 16;&lt;br /&gt;
	// yb = x:&lt;br /&gt;
	y_axisa = ((readBuf[OUT_X_H_A - OUT_X_L_A] &amp;lt;&amp;lt; 8) + readBuf[OUT_X_L_A - OUT_X_L_A]) / 16;&lt;br /&gt;
	// zb = z:&lt;br /&gt;
	z_axisa = ((readBuf[OUT_Z_H_A - OUT_X_L_A] &amp;lt;&amp;lt; 8) + readBuf[OUT_Z_L_A - OUT_X_L_A]) / 16;&lt;br /&gt;
	mSleep(10);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function limits and normalizes the x-axisa,&lt;br /&gt;
 * y-axisa and z-axisa values read from the LSM303DLHC&lt;br /&gt;
 * accelerometer with the function readLSM303DLHC_A() and&lt;br /&gt;
 * stores them in the global double variables xa, ya and&lt;br /&gt;
 * za.&lt;br /&gt;
 * It also calculates the position in space in form of the&lt;br /&gt;
 * tilt angles (the = pitch, phi = roll) and stores them&lt;br /&gt;
 * in the global double variables the and phi.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void normalizeLSM303DLHC_A(void)&lt;br /&gt;
{&lt;br /&gt;
	// Limit raw values:&lt;br /&gt;
	if (x_axisa &amp;lt; MIN_X_A) x_axisa = MIN_X_A;&lt;br /&gt;
	if (x_axisa &amp;gt; MAX_X_A) x_axisa = MAX_X_A;&lt;br /&gt;
	if (y_axisa &amp;lt; MIN_Y_A) y_axisa = MIN_Y_A;&lt;br /&gt;
	if (y_axisa &amp;gt; MAX_Y_A) y_axisa = MAX_Y_A;&lt;br /&gt;
	if (z_axisa &amp;lt; MIN_Z_A) z_axisa = MIN_Z_A;&lt;br /&gt;
	if (z_axisa &amp;gt; MAX_Z_A) z_axisa = MAX_Z_A;&lt;br /&gt;
	xa = (double) x_axisa / 1000.0;&lt;br /&gt;
	ya = (double) y_axisa / 1000.0;&lt;br /&gt;
	za = (double) z_axisa / 1000.0;&lt;br /&gt;
	// Calculate Pitch and Roll:&lt;br /&gt;
	phi = asin(xa);								// Calculate the and phi&lt;br /&gt;
	the = asin(ya / cos(the));					//  from the raw values&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function calculates the position in space by&lt;br /&gt;
 * using the the and phi values (see function&lt;br /&gt;
 * normalizeLSM303DLHC_A()!). It stores the position&lt;br /&gt;
 * in the global double variables pitch and roll. &lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void positionLSM303DLHC_A(void)&lt;br /&gt;
{&lt;br /&gt;
	pitch = the * 180 / M_PI + OFFSET_PITCH_A;&lt;br /&gt;
	roll = phi * 180 / M_PI + OFFSET_ROLL_A;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// LSM303DLHC magnetometer functions:&lt;br /&gt;
int16_t x_axism, y_axism, z_axism;&lt;br /&gt;
int16_t headingm;&lt;br /&gt;
double xm, ym, zm;&lt;br /&gt;
#ifdef GET_TEMP_M&lt;br /&gt;
int16_t temperaturem;&lt;br /&gt;
double temperature_mag;&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
int16_t headingtc;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Call this once before using the 3D-Compass.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void LSM303DLHC_M_init(void)&lt;br /&gt;
{&lt;br /&gt;
#ifdef GET_TEMP_M&lt;br /&gt;
	// Set Data output rate to 15Hz, enable temperature sensor:&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_LSM303DLHC_M_ADR, CRA_REG_M, CRA_REG_M_15HZ_T_EN);&lt;br /&gt;
#else&lt;br /&gt;
	// Set Data output rate to 15Hz:&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_LSM303DLHC_M_ADR, CRA_REG_M, CRA_REG_M_15HZ);&lt;br /&gt;
#endif&lt;br /&gt;
	mSleep(10);&lt;br /&gt;
	// Set Gain to +-1.3Gauss:&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_LSM303DLHC_M_ADR, CRB_REG_M, CRB_REG_M_13GAUSS);&lt;br /&gt;
	mSleep(10);&lt;br /&gt;
	// Set Continuous-conversion mode:&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_LSM303DLHC_M_ADR, MR_REG_M, MR_REG_M_CCM);&lt;br /&gt;
	mSleep(10);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function reads the X-axis, Y-axis, Z-axis and&lt;br /&gt;
 * temperature values from the LSM303DLHC magnetometer&lt;br /&gt;
 * and stores them in the global variables x_axism,&lt;br /&gt;
 * y_axism, z_axism and temperaturem.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void readLSM303DLHC_M(void)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t readBuf[6];&lt;br /&gt;
&lt;br /&gt;
	I2CTWI_transmitByte(I2C_SENSOR_LSM303DLHC_M_ADR, OUT_X_H_M);&lt;br /&gt;
	I2CTWI_readBytes(I2C_SENSOR_LSM303DLHC_M_ADR, readBuf, 6); // Read  X-/Y-/Z-axis&lt;br /&gt;
	// xb = x:&lt;br /&gt;
	x_axism = (readBuf[OUT_X_H_M - OUT_X_H_M] &amp;lt;&amp;lt; 8) + readBuf[OUT_X_L_M - OUT_X_H_M];&lt;br /&gt;
	// yb = y:&lt;br /&gt;
	y_axism = (readBuf[OUT_Y_H_M - OUT_X_H_M] &amp;lt;&amp;lt; 8) + readBuf[OUT_Y_L_M - OUT_X_H_M];&lt;br /&gt;
	// zb = z:&lt;br /&gt;
	z_axism = (readBuf[OUT_Z_H_M - OUT_X_H_M] &amp;lt;&amp;lt; 8) + readBuf[OUT_Z_L_M - OUT_X_H_M];&lt;br /&gt;
	mSleep(10);&lt;br /&gt;
#ifdef GET_TEMP_M&lt;br /&gt;
	// Read temperature raw value:&lt;br /&gt;
	I2CTWI_transmitByte(I2C_SENSOR_LSM303DLHC_M_ADR, TEMP_OUT_H_M);&lt;br /&gt;
	readBuf[0] = I2CTWI_readByte(I2C_SENSOR_LSM303DLHC_M_ADR);&lt;br /&gt;
	I2CTWI_transmitByte(I2C_SENSOR_LSM303DLHC_M_ADR, TEMP_OUT_L_M);&lt;br /&gt;
	readBuf[1] = I2CTWI_readByte(I2C_SENSOR_LSM303DLHC_M_ADR);&lt;br /&gt;
	temperaturem = (readBuf[0] &amp;lt;&amp;lt; 8) | readBuf[1];&lt;br /&gt;
	temperaturem &amp;gt;&amp;gt;= 4;&lt;br /&gt;
	if (temperaturem &amp;amp; 2048)					// Calculate temperature&lt;br /&gt;
		temperaturem = (temperaturem &amp;amp; 2047) - 2048;&lt;br /&gt;
	else&lt;br /&gt;
		temperaturem = temperaturem &amp;amp; 2047;&lt;br /&gt;
	mSleep(10);&lt;br /&gt;
#endif&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function compensates hard iron effects and&lt;br /&gt;
 * scales the x-axism, y-axism and z-axism values read&lt;br /&gt;
 * from the LSM303DLHC magnetometer with the function&lt;br /&gt;
 * readLSM303DLHC_M() and stores them in the global&lt;br /&gt;
 * double variables xm, ym and zm.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void normalizeLSM303DLHC_M(void)&lt;br /&gt;
{&lt;br /&gt;
	// Add hard iron offsets:&lt;br /&gt;
	x_axism += OFFSET_X_M;&lt;br /&gt;
	y_axism += OFFSET_Y_M;&lt;br /&gt;
	z_axism += OFFSET_Z_M;&lt;br /&gt;
	// Scale raw values:&lt;br /&gt;
	xm = (x_axism - MIN_X_M) / (MAX_X_M - MIN_X_M) * 2 - 1;&lt;br /&gt;
	ym = (y_axism - MIN_Y_M) / (MAX_Y_M - MIN_Y_M) * 2 - 1;&lt;br /&gt;
	zm = (z_axism - MIN_Z_M) / (MAX_Z_M - MIN_Z_M) * 2 - 1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function calculates the heading by using the&lt;br /&gt;
 * normalized sensor values xm and ym (see function&lt;br /&gt;
 * normalizeLSM303DLHC_M()!). The heading is a value&lt;br /&gt;
 * from 0° to 359°. If the robot's front (and the&lt;br /&gt;
 * RP6 Sensor Board's front edge with the two&lt;br /&gt;
 * headlights) points to ...&lt;br /&gt;
 *   north -&amp;gt; heading is 0°,&lt;br /&gt;
 *   east  -&amp;gt; heading is 90°,&lt;br /&gt;
 *   south -&amp;gt; heading is 180°,&lt;br /&gt;
 *   west  -&amp;gt; heading is 270°.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
int16_t headingLSM303DLHC_M(void)&lt;br /&gt;
{&lt;br /&gt;
	double hdg = atan2(ym, xm) * 180 / M_PI + DECLINATION_M;&lt;br /&gt;
	if(hdg &amp;lt; 0.0) hdg += 360.0;&lt;br /&gt;
	return ((int16_t) hdg);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// --------------------------------------------&lt;br /&gt;
/**&lt;br /&gt;
 * This function calculates the TILT COMPENSATED&lt;br /&gt;
 * heading by using accelerometer (the, phi) AND&lt;br /&gt;
 * magnetometer (xm, ym, zm) data. The heading is a&lt;br /&gt;
 * value from 0° to 359°. If the robot's front (and&lt;br /&gt;
 * the RP6 Sensor Board's front edge with the two&lt;br /&gt;
 * headlights) points to ...&lt;br /&gt;
 *   north -&amp;gt; heading is 0°,&lt;br /&gt;
 *   east  -&amp;gt; heading is 90°,&lt;br /&gt;
 *   south -&amp;gt; heading is 180°,&lt;br /&gt;
 *   west  -&amp;gt; heading is 270°.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
int16_t headingLSM303DLHC_TC(void)&lt;br /&gt;
{&lt;br /&gt;
	double hdgtc, xh, yh;&lt;br /&gt;
&lt;br /&gt;
	xh = xm * cos(the) + zm * sin(the);&lt;br /&gt;
	yh = xm * sin(phi) * sin(the) + ym * cos(phi) - zm * sin(phi) * cos(the);&lt;br /&gt;
//	zh = -xm * cos(phi) * sin(the) + ym * sin(phi) + zm * cos(phi) * cos(the);&lt;br /&gt;
	hdgtc = atan2(yh, xh) * 180 / M_PI + DECLINATION_M;&lt;br /&gt;
	if(hdgtc &amp;lt; 0.0) hdgtc += 360.0;&lt;br /&gt;
	return ((int16_t) hdgtc);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// --------------------------------------------&lt;br /&gt;
/**&lt;br /&gt;
 * Call this once before using the LSM303DLHC.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void LSM303DLHC_init(void)&lt;br /&gt;
{&lt;br /&gt;
	LSM303DLHC_A_init();						// Accelerometer init&lt;br /&gt;
	LSM303DLHC_M_init();						// Magnetometer init&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Analog Yaw-Rate Gyroscope (LY330ALH):&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Sets the LY330ALH mode of operation.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: mode -&amp;gt; Mode [0..3]&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void LY330ALH_set_mode(uint8_t mode)&lt;br /&gt;
{&lt;br /&gt;
	outport.pd_gyro = false;					// I/O 0.6: Low&lt;br /&gt;
	outport.st_gyro = false;					// I/O 0.7: Low&lt;br /&gt;
	if(mode &amp;amp; 1) outport.pd_gyro = true;&lt;br /&gt;
	if(mode &amp;amp; 2) outport.st_gyro = true;&lt;br /&gt;
	MAX7311_update();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Reads the ADC1 value from the RP6Base.&lt;br /&gt;
 *&lt;br /&gt;
 * Hints: - The RP6Base input ADC1 has to be&lt;br /&gt;
 *          connected to the USRBUS: Pin 2 on&lt;br /&gt;
 *          the RP6 mainboard!&lt;br /&gt;
 *        - The RP6Base_I2CSlave program has to&lt;br /&gt;
 *          be loaded into the RP6Base&lt;br /&gt;
 *          microcontroller!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
uint16_t getRP6Base_ADC1(void)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_readRegisters(I2C_RP6_BASE_ADR, I2C_REG_ADC_ADC1_L, registerBuf, 2);&lt;br /&gt;
	return (registerBuf[0] + (registerBuf[1] &amp;lt;&amp;lt; 8));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int16_t z_axisg;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Performs a LY330ALH gyroscope measurement and&lt;br /&gt;
 * returns the angular rate (velocity).&lt;br /&gt;
 * Positive values mean an angular rate while&lt;br /&gt;
 * rotating LEFT and negative values while&lt;br /&gt;
 * rotating RIGHT!&lt;br /&gt;
 * The global integer variable z_axisg also&lt;br /&gt;
 * contains the measurement result.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
int16_t LY330ALH_measure(void)&lt;br /&gt;
{&lt;br /&gt;
	z_axisg = getRP6Base_ADC1();				// Read raw data&lt;br /&gt;
	z_axisg -= ADCVAL_ZERORATE_LEVEL;			// Calculate value&lt;br /&gt;
	return (z_axisg);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Hot Swappable 2-Wire Bus Buffer (TCA4311A):&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Reads the TCA4311A Ready output. &lt;br /&gt;
 * The function returns the state (true/false).&lt;br /&gt;
 * The global variable readyBusbuff is also&lt;br /&gt;
 * filled with the Ready output state.&lt;br /&gt;
 *&lt;br /&gt;
 * Hint: You don't have to use this function,&lt;br /&gt;
 *       if the task task_RP6SensorBoard() is&lt;br /&gt;
 *       called frequently out of the main&lt;br /&gt;
 *       loop, because readyBusbuff will be&lt;br /&gt;
 *       updated by this task!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
uint8_t readReadyBusbuff(void)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmitByte(I2C_SENSOR_PORTEXP_ADR, MAX7311_INPUT_PORT1);&lt;br /&gt;
	readyBusbuff = I2CTWI_readByte(I2C_SENSOR_PORTEXP_ADR);&lt;br /&gt;
	readyBusbuff &amp;amp;= RDY_BUSBUFF;&lt;br /&gt;
	return readyBusbuff;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
uint8_t errorBusbuff;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * If the I2C bus for the I2C-MODULE (SCLOUT,&lt;br /&gt;
 * SDAOUT) is not used or shall be isolated from&lt;br /&gt;
 * the RP6 I2C bus, this can be done with this&lt;br /&gt;
 * function.&lt;br /&gt;
 *&lt;br /&gt;
 * Hints: - The I2C-MODULE power is NOT switched&lt;br /&gt;
 *          off by this function!&lt;br /&gt;
 *        - If USE_PD5 is defined in the&lt;br /&gt;
 *          configuration header file, this&lt;br /&gt;
 *          function uses the RP6M256 portpin,&lt;br /&gt;
 *          that is connected to plug I/O: Pin 9&lt;br /&gt;
 *          instead of MAX7311 I/O 1.0!&lt;br /&gt;
 *        - If the global variable errorBusbuff&lt;br /&gt;
 *          returns true, the bus buffer could&lt;br /&gt;
 *          not be switched to shutdown mode!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void TCA4311A_shutdown(void)&lt;br /&gt;
{&lt;br /&gt;
	// Wait until the I2C bus is idle:&lt;br /&gt;
	while(I2CTWI_isBusy() || TWI_operation != I2CTWI_NO_OPERATION) task_I2CTWI();&lt;br /&gt;
#ifdef USE_PD5&lt;br /&gt;
	IO_SENSOR_TCA4311A_EN_PORT &amp;amp;= ~IO_SENSOR_TCA4311A_EN_IN; // Low&lt;br /&gt;
#else&lt;br /&gt;
	outport.en_busbuff = false;					// I/O 1.0: Low&lt;br /&gt;
	MAX7311_update();&lt;br /&gt;
#endif&lt;br /&gt;
	errorBusbuff = readReadyBusbuff();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * If the I2C bus for the I2C-MODULE (SCLOUT,&lt;br /&gt;
 * SDAOUT) was isolated from the RP6 I2C bus with&lt;br /&gt;
 * the function TCA4311A_shutdown() before, it&lt;br /&gt;
 * can be connected again with this function.&lt;br /&gt;
 *&lt;br /&gt;
 * Hints: - The I2C-MODULE power is NOT switched&lt;br /&gt;
 *          on by this function!&lt;br /&gt;
 *        - If USE_PD5 is defined in the&lt;br /&gt;
 *          configuration header file, this&lt;br /&gt;
 *          function uses the RP6M256 portpin,&lt;br /&gt;
 *          that is connected to plug I/O: Pin 9&lt;br /&gt;
 *          instead of MAX7311 I/O 1.0!&lt;br /&gt;
 *        - If the global variable errorBusbuff&lt;br /&gt;
 *          returns true, the bus buffer could&lt;br /&gt;
 *          not be switched to normal operation!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void TCA4311A_reconnect(void)&lt;br /&gt;
{&lt;br /&gt;
	// Wait until the I2C bus is idle:&lt;br /&gt;
	while(I2CTWI_isBusy() || TWI_operation != I2CTWI_NO_OPERATION) task_I2CTWI();&lt;br /&gt;
#ifdef USE_PD5&lt;br /&gt;
	IO_SENSOR_TCA4311A_EN_PORT |= IO_SENSOR_TCA4311A_EN_IN; // High&lt;br /&gt;
#else&lt;br /&gt;
	outport.en_busbuff = true;					// I/O 1.0: High&lt;br /&gt;
	MAX7311_update();&lt;br /&gt;
#endif&lt;br /&gt;
	errorBusbuff = !readReadyBusbuff();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Sets/clears the RP6Base signal PWR.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: pwr -&amp;gt; 0 (false) = PWR off&lt;br /&gt;
 *               &amp;gt;0 (true) = PWR on&lt;br /&gt;
 *&lt;br /&gt;
 * Hints: - The RP6Base signal PWR has to be&lt;br /&gt;
 *          connected to the USRBUS: Pin 3 on&lt;br /&gt;
 *          the RP6 mainboard!&lt;br /&gt;
 *        - The RP6Base_I2CSlave program has to&lt;br /&gt;
 *          be loaded into the RP6Base&lt;br /&gt;
 *          microcontroller!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void setRP6Base_PWR(uint8_t pwr)&lt;br /&gt;
{&lt;br /&gt;
	if(pwr &amp;gt; 0)&lt;br /&gt;
		I2CTWI_transmit2Bytes(I2C_RP6_BASE_ADR, 0, CMD_POWER_ON);&lt;br /&gt;
	else&lt;br /&gt;
		I2CTWI_transmit2Bytes(I2C_RP6_BASE_ADR, 0, CMD_POWER_OFF);&lt;br /&gt;
	while(I2CTWI_isBusy() || TWI_operation != I2CTWI_NO_OPERATION) task_I2CTWI();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/** &lt;br /&gt;
 * With this function you can switch the I2C-&lt;br /&gt;
 * MODULE (plug M1) power on or off.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: pwr -&amp;gt; 0 (false) = I2C-MODULE power off&lt;br /&gt;
 *               &amp;gt;0 (true) = I2C-MODULE power on&lt;br /&gt;
 *&lt;br /&gt;
 * Hints: - If the I2C-MODULE plug is not used,&lt;br /&gt;
 *          you should always switch the&lt;br /&gt;
 *          I2C-MODULE power off (default)!&lt;br /&gt;
 *        - The TCA4311A is NOT switched to&lt;br /&gt;
 *          normal operation (default) or&lt;br /&gt;
 *          shutdown mode by this function!&lt;br /&gt;
 *        - The RP6Base signal PWR has to be&lt;br /&gt;
 *          connected to the USRBUS: Pin 3 on&lt;br /&gt;
 *          the RP6 mainboard!&lt;br /&gt;
 *        - The RP6Base_I2CSlave program has to&lt;br /&gt;
 *          be loaded into the RP6Base&lt;br /&gt;
 *          microcontroller!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void setI2CModulePower(uint8_t pwr)&lt;br /&gt;
{&lt;br /&gt;
	if(pwr &amp;gt; 0) {&lt;br /&gt;
		setRP6Base_PWR(1);						// RP6Base PWR on&lt;br /&gt;
		outport.pwr_i2c = true;					// I/O 0.0: High&lt;br /&gt;
	}&lt;br /&gt;
	else&lt;br /&gt;
		outport.pwr_i2c = false;				// I/O 0.0: Low&lt;br /&gt;
	MAX7311_update();&lt;br /&gt;
}	&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Button:&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Reads the MAX7311 I/O port 1.7. &lt;br /&gt;
 * The function returns true, if  button S1 is&lt;br /&gt;
 * pressed (I/O 1.7: Low!) and false, if it is&lt;br /&gt;
 * not pressed (I/O 1.7: High!).&lt;br /&gt;
 * The global variable pressedButton is also&lt;br /&gt;
 * filled with the I/O 1.7 output state.&lt;br /&gt;
 *&lt;br /&gt;
 * Hint: You don't have to use this function,&lt;br /&gt;
 *       if the task task_RP6SensorBoard() is&lt;br /&gt;
 *       called frequently out of the main&lt;br /&gt;
 *       loop, because pressedButton will be&lt;br /&gt;
 *       updated by this task!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
uint8_t readButton(void)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmitByte(I2C_SENSOR_PORTEXP_ADR, MAX7311_INPUT_PORT2);&lt;br /&gt;
	pressedButton = I2CTWI_readByte(I2C_SENSOR_PORTEXP_ADR);&lt;br /&gt;
	pressedButton &amp;amp;= IO2_I2C;&lt;br /&gt;
	pressedButton = !pressedButton;&lt;br /&gt;
	return pressedButton;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Status LED:&lt;br /&gt;
&lt;br /&gt;
/** &lt;br /&gt;
 * Sets the status LED (D2) of the RP6 Sensor&lt;br /&gt;
 * Board.&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *   setStatusLED(1);&lt;br /&gt;
 *   // This switches the status LED on!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void setStatusLED(uint8_t on)&lt;br /&gt;
{&lt;br /&gt;
	if(on &amp;gt; 0)&lt;br /&gt;
		outport.io1_i2c = false;				// I/O 1.6: Low&lt;br /&gt;
	else&lt;br /&gt;
		outport.io1_i2c = true;					// I/O 1.6: High&lt;br /&gt;
	MAX7311_update();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// RP6 Sensor Board initialisation and shutdown:&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * You MUST call this function at the beginning of a&lt;br /&gt;
 * main program, that uses the RP6 Sensor Board. &lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void sensor_board_init(void)&lt;br /&gt;
{&lt;br /&gt;
	// I/O Port Expander:&lt;br /&gt;
	MAX7311_init();&lt;br /&gt;
	// RTC:&lt;br /&gt;
	DS1339_init();&lt;br /&gt;
	// Temperature Sensor:&lt;br /&gt;
	LM75B_init();&lt;br /&gt;
	// Servo Controller:&lt;br /&gt;
	PCA9685_init(50);							// Init PWM 50 Hz&lt;br /&gt;
	// LED Driver:&lt;br /&gt;
	TCA6507_init();&lt;br /&gt;
	// 3D Magnetometer &amp;amp; Accelerometer:&lt;br /&gt;
	LSM303DLHC_init();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * If you don't use any function of the RP6&lt;br /&gt;
 * Sensor Board, you can put the board into&lt;br /&gt;
 * &amp;quot;SHUTDOWN MODE&amp;quot;. In this mode the electric&lt;br /&gt;
 * power consumption is very low to save energy.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void sensor_board_shutdown(void)&lt;br /&gt;
{&lt;br /&gt;
	// Servo Controller:&lt;br /&gt;
	PCA9685_shutdown();							// Shutdown PCA9685&lt;br /&gt;
	// Temperature Sensor:&lt;br /&gt;
	LM75B_shutdown();							// Shutdown LM75B&lt;br /&gt;
	// I/O Port Expander:&lt;br /&gt;
	MAX7311_write(MAX7311_OUTPUT_SHUTDOWN);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&lt;br /&gt;
/******************************************************************************&lt;br /&gt;
 * Additional info&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Changelog:&lt;br /&gt;
 * - v. 1.0 TCA4311A reconnect problem fixed 10.04.2014 by Dirk&lt;br /&gt;
 * - v. 0.9 Interrupt status functions added 09.04.2014 by Dirk&lt;br /&gt;
 * - v. 0.8 (initial release) 17.03.2014 by Dirk&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Erklärung&lt;br /&gt;
&lt;br /&gt;
=====Demo=====&lt;br /&gt;
makefile:&lt;br /&gt;
&amp;lt;pre&amp;gt;...&lt;br /&gt;
TARGET = RP6M256_Sensor_Board_01&lt;br /&gt;
...&lt;br /&gt;
SRC += $(RP6_LIB_PATH)/RP6common/RP6I2CmasterTWI.c&lt;br /&gt;
&lt;br /&gt;
SRC += $(RP6_LIB_PATH)/RP6control_M256_WIFI/RP6M256_Sensor_BoardLib.c&lt;br /&gt;
...&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Datei: RP6M256_Sensor_Board_01.c&lt;br /&gt;
&amp;lt;pre&amp;gt;/* &lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * RP6 ROBOT SYSTEM - RP6 CONTROL M256 Examples&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Example: RP6M256 Sensor Board&lt;br /&gt;
 * Author(s): Dirk&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Description:&lt;br /&gt;
 * In this example we show a first test for the RP6 Sensor Board.&lt;br /&gt;
 * &lt;br /&gt;
 * ############################################################################&lt;br /&gt;
 * The Robot does NOT move in this example! You can simply put it on a table&lt;br /&gt;
 * next to your PC and you should connect it to the PC via the USB Interface!&lt;br /&gt;
 * You should also connect to it via WIFI.&lt;br /&gt;
 * ############################################################################&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Includes:&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6M256Lib.h&amp;quot; 				// The RP6 M256 Library. &lt;br /&gt;
										// Always needs to be included!&lt;br /&gt;
#include &amp;quot;RP6I2CmasterTWI.h&amp;quot;			// Include the I2C-Bus Master Library&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Include our new &amp;quot;RP6M256 Sensor Board library&amp;quot;:&lt;br /&gt;
// (This is the library for accessing the RP6 Sensor Board!)&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6M256_Sensor_BoardLib.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Variables:&lt;br /&gt;
&lt;br /&gt;
char dir[3];&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Returns a 2 character string for the eighth&lt;br /&gt;
 * parts of the direction calculated from the&lt;br /&gt;
 * heading value.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: heading -&amp;gt; Heading value [0..359]&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void calculateDir(char *dir, uint16_t heading)&lt;br /&gt;
{&lt;br /&gt;
	dir[1] = ' ';&lt;br /&gt;
	dir[2] = '\0';&lt;br /&gt;
	if ((heading &amp;lt;= 22) || (heading &amp;gt;=338)) dir[0] = 'N';&lt;br /&gt;
	if ((heading &amp;gt;= 23) &amp;amp;&amp;amp; (heading &amp;lt;= 67)) {dir[0] = 'N'; dir[1] = 'E';} &lt;br /&gt;
	if ((heading &amp;gt;= 68) &amp;amp;&amp;amp; (heading &amp;lt;= 112)) dir[0] = 'E';&lt;br /&gt;
	if ((heading &amp;gt;= 113) &amp;amp;&amp;amp; (heading &amp;lt;= 157)) {dir[0] = 'S'; dir[1] = 'E';}&lt;br /&gt;
	if ((heading &amp;gt;= 158) &amp;amp;&amp;amp; (heading &amp;lt;= 202)) dir[0] = 'S';&lt;br /&gt;
	if ((heading &amp;gt;= 203) &amp;amp;&amp;amp; (heading &amp;lt;= 247)) {dir[0] = 'S'; dir[1] = 'W';}&lt;br /&gt;
	if ((heading &amp;gt;= 248) &amp;amp;&amp;amp; (heading &amp;lt;= 292)) dir[0] = 'W';&lt;br /&gt;
	if ((heading &amp;gt;= 293) &amp;amp;&amp;amp; (heading &amp;lt;= 337)) {dir[0] = 'N'; dir[1] = 'W';}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Write a floating point number to the WIFI.&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *&lt;br /&gt;
 *			// Write a floating point number to the WIFI (no exponent):&lt;br /&gt;
 *			writeDouble_WIFI(1234567.890, 11, 3);&lt;br /&gt;
 *&lt;br /&gt;
 * The value of prec (precision) defines the number of decimal places.&lt;br /&gt;
 * For 32 bit floating point variables (float, double ...) 6 is&lt;br /&gt;
 * the max. value for prec (7 relevant digits).&lt;br /&gt;
 * The value of width defines the overall number of characters in the&lt;br /&gt;
 * floating point number including the decimal point. The number of&lt;br /&gt;
 * pre-decimal positions is: (width - prec - 1).&lt;br /&gt;
 */&lt;br /&gt;
void writeDouble_WIFI(double number, uint8_t width, uint8_t prec)&lt;br /&gt;
{char buffer[width + 1];&lt;br /&gt;
	dtostrf(number, width, prec, &amp;amp;buffer[0]);&lt;br /&gt;
	writeString_WIFI(&amp;amp;buffer[0]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Write a floating point number to the LCD.&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *&lt;br /&gt;
 *			// Write a floating point number to the LCD (no exponent):&lt;br /&gt;
 *			writeDoubleLCD(1234567.890, 11, 3);&lt;br /&gt;
 *&lt;br /&gt;
 * The value of prec (precision) defines the number of decimal places.&lt;br /&gt;
 * For 32 bit floating point variables (float, double ...) 6 is&lt;br /&gt;
 * the max. value for prec (7 relevant digits).&lt;br /&gt;
 * The value of width defines the overall number of characters in the&lt;br /&gt;
 * floating point number including the decimal point. The number of&lt;br /&gt;
 * pre-decimal positions is: (width - prec - 1).&lt;br /&gt;
 */&lt;br /&gt;
void writeDoubleLCD(double number, uint8_t width, uint8_t prec)&lt;br /&gt;
{char buffer[width + 1];&lt;br /&gt;
	dtostrf(number, width, prec, &amp;amp;buffer[0]);&lt;br /&gt;
	writeStringLCD(&amp;amp;buffer[0]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Error handler&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function gets called automatically if there was an I2C Error like&lt;br /&gt;
 * the slave sent a &amp;quot;not acknowledge&amp;quot; (NACK, error codes e.g. 0x20 or 0x30).&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void I2C_transmissionError(uint8_t errorState)&lt;br /&gt;
{&lt;br /&gt;
	writeString_P_WIFI(&amp;quot;\nI2C ERROR - TWI STATE: 0x&amp;quot;);&lt;br /&gt;
	writeInteger_WIFI(errorState, HEX);&lt;br /&gt;
	writeChar_WIFI('\n');&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Main function - The program starts here:&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
	initRP6M256();    // Always call this first! The Processor will not work&lt;br /&gt;
					  // correctly otherwise. &lt;br /&gt;
&lt;br /&gt;
	initLCD(); // Initialize the LC-Display (LCD)&lt;br /&gt;
			   // Always call this before using the LCD!&lt;br /&gt;
&lt;br /&gt;
	setLEDs(0b1111);&lt;br /&gt;
	mSleep(500);&lt;br /&gt;
	setLEDs(0b0000);&lt;br /&gt;
&lt;br /&gt;
	writeString_P_WIFI(&amp;quot;\n\nRP6 Sensor Board Selftest 1!\n&amp;quot;); &lt;br /&gt;
&lt;br /&gt;
	// IMPORTANT:&lt;br /&gt;
	I2CTWI_initMaster(100); // Initialize the TWI Module for Master operation&lt;br /&gt;
							// with 100kHz SCL Frequency&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	// Register the event handler:&lt;br /&gt;
	I2CTWI_setTransmissionErrorHandler(I2C_transmissionError);&lt;br /&gt;
&lt;br /&gt;
	setLEDs(0b1111);&lt;br /&gt;
&lt;br /&gt;
	// Write a text message to the LCD:&lt;br /&gt;
	showScreenLCD(&amp;quot;################&amp;quot;, &amp;quot;################&amp;quot;);&lt;br /&gt;
	mSleep(1500);&lt;br /&gt;
	showScreenLCD(&amp;quot;RP6v2-M256-WIFI &amp;quot;, &amp;quot;Example Program&amp;quot;);&lt;br /&gt;
	mSleep(2500); &lt;br /&gt;
	showScreenLCD(&amp;quot;RP6 Sensor Board&amp;quot;, &amp;quot;   Selftest 1&amp;quot;);&lt;br /&gt;
	mSleep(2500);&lt;br /&gt;
	clearLCD();&lt;br /&gt;
&lt;br /&gt;
	setLEDs(0b0000);&lt;br /&gt;
&lt;br /&gt;
	// ---------------------------------------&lt;br /&gt;
&lt;br /&gt;
	uint8_t onoff = 0;&lt;br /&gt;
	uint16_t servopos = SERVO1_LT;&lt;br /&gt;
	int16_t rate;&lt;br /&gt;
&lt;br /&gt;
	startStopwatch1();&lt;br /&gt;
	startStopwatch2();&lt;br /&gt;
&lt;br /&gt;
	// IMPORTANT:&lt;br /&gt;
	sensor_board_init();						// RP6 Sensor Board init!!!&lt;br /&gt;
	setServoPower(1);							// Servo power ON!&lt;br /&gt;
/*&lt;br /&gt;
	// ----------------------------------------------&lt;br /&gt;
	// Set RTC once (battery empty or not existing:&lt;br /&gt;
	rtc_time.second = 0;&lt;br /&gt;
	rtc_time.minute = 15;&lt;br /&gt;
	rtc_time.hour = 20;				// 20:15&lt;br /&gt;
	rtc_date.weekday = R_SU;&lt;br /&gt;
	rtc_date.day = 20;&lt;br /&gt;
	rtc_date.month = 4;&lt;br /&gt;
	rtc_date.year = 2014;			// Su, 20.4.2014&lt;br /&gt;
	DS1339_write();&lt;br /&gt;
	// Remove this, if RTC is set and running!!!&lt;br /&gt;
	// ----------------------------------------------&lt;br /&gt;
*/&lt;br /&gt;
	while(true) &lt;br /&gt;
	{&lt;br /&gt;
		if(getStopwatch1() &amp;gt; 1000) // 1s&lt;br /&gt;
		{&lt;br /&gt;
			if (onoff) onoff = 0;&lt;br /&gt;
			else onoff = 1;&lt;br /&gt;
&lt;br /&gt;
			// Interrupt status:&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nInterrupt Status:      &amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(interrupt_RP6SBstatus.byte, BIN, 8);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			// Inport status:&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;Inport Status: &amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(inport.word, BIN, 16);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			// Temperature sensor test:&lt;br /&gt;
			temperature = LM75B_measure();		// Measure&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;Temperature: &amp;quot;);&lt;br /&gt;
			writeDouble_WIFI(temperature, 7, 3);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;°\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			// LED driver test:&lt;br /&gt;
			if (onoff) {&lt;br /&gt;
				setLED(HEADLIGHT_R, STATE_ON);&lt;br /&gt;
				setLED(HEADLIGHT_L, STATE_OFF);&lt;br /&gt;
			}&lt;br /&gt;
			else {&lt;br /&gt;
				setLED(HEADLIGHT_L, STATE_ON);&lt;br /&gt;
				setLED(HEADLIGHT_R, STATE_OFF);&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			// Servo controller test (SERVO_1):&lt;br /&gt;
			setServo(1, servopos);&lt;br /&gt;
			servopos += 10;&lt;br /&gt;
			if (servopos &amp;gt; SERVO1_RT) servopos = SERVO1_LT;&lt;br /&gt;
&lt;br /&gt;
			// RTC test:&lt;br /&gt;
			DS1339_read();&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;RTC: &amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(rtc_time.hour, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;:&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(rtc_time.minute, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;:&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(rtc_time.second, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;  &amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(rtc_date.day, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;.&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(rtc_date.month, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;.&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(rtc_date.year, DEC, 4);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			// 3D Magnetometer &amp;amp; Accelerometer test:&lt;br /&gt;
			//  LSM303DLHC accelerometer:&lt;br /&gt;
			task_I2CTWI();&lt;br /&gt;
			readLSM303DLHC_A();					// Get sensor values&lt;br /&gt;
			task_I2CTWI();&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\n3D-Acceleration SENSOR -&amp;gt;\n&amp;quot;);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;X-axis: &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(x_axisa, DEC);&lt;br /&gt;
			writeChar_WIFI('\n');&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;Y-axis: &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(y_axisa, DEC);&lt;br /&gt;
			writeChar_WIFI('\n');&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;Z-axis: &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(z_axisa, DEC);&lt;br /&gt;
			writeChar_WIFI('\n');&lt;br /&gt;
			normalizeLSM303DLHC_A();			// Normalize data&lt;br /&gt;
			positionLSM303DLHC_A();				// Calculate position&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;POSITION: \n&amp;quot;);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;  Pitch [°]: &amp;quot;);&lt;br /&gt;
			writeDouble_WIFI(pitch, 6, 1);&lt;br /&gt;
			writeChar_WIFI('\n');&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;  Roll [°]:  &amp;quot;);&lt;br /&gt;
			writeDouble_WIFI(roll, 6, 1);&lt;br /&gt;
			writeChar_WIFI('\n');&lt;br /&gt;
&lt;br /&gt;
			//  LSM303DLHC magnetometer:&lt;br /&gt;
			task_I2CTWI();&lt;br /&gt;
			readLSM303DLHC_M();					// Get sensor values&lt;br /&gt;
			task_I2CTWI();&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\n3D-Compass SENSOR -&amp;gt;\n&amp;quot;);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;X-axis: &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(x_axism, DEC);&lt;br /&gt;
			writeChar_WIFI('\n');&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;Y-axis: &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(y_axism, DEC);&lt;br /&gt;
			writeChar_WIFI('\n');&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;Z-axis: &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(z_axism, DEC);&lt;br /&gt;
			writeChar_WIFI('\n');&lt;br /&gt;
			normalizeLSM303DLHC_M();			// Normalize data&lt;br /&gt;
			headingm = headingLSM303DLHC_M();	// Calculate heading&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;                 Heading [°]: &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(headingm, DEC);&lt;br /&gt;
			calculateDir(dir, headingm);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;  Direction: &amp;quot;);&lt;br /&gt;
			writeString_WIFI(dir);&lt;br /&gt;
			writeChar_WIFI('\n');&lt;br /&gt;
			headingtc = headingLSM303DLHC_TC();	// Calculate TILT COMPENSATED&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;TILT COMPENSATED heading [°]: &amp;quot;); // heading&lt;br /&gt;
			writeInteger_WIFI(headingtc, DEC);&lt;br /&gt;
			calculateDir(dir, headingtc);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;  Direction: &amp;quot;);&lt;br /&gt;
			writeString_WIFI(dir);&lt;br /&gt;
			writeChar_WIFI('\n');&lt;br /&gt;
#ifdef GET_TEMP_M&lt;br /&gt;
			temperature_mag = (double) temperaturem / 8.0 + OFFSET_TEMP_M;&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;Temperature [°]: &amp;quot;);&lt;br /&gt;
			writeDouble_WIFI(temperature_mag, 7, 2);&lt;br /&gt;
			writeChar_WIFI('\n');&lt;br /&gt;
#endif&lt;br /&gt;
			// Yaw-Rate Gyroscope test:&lt;br /&gt;
			rate = LY330ALH_measure();&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\n1D-Gyro SENSOR -&amp;gt;\n&amp;quot;);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;Z-axis: &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(rate, DEC);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			// RP6 Sensor Board shutdown (button &amp;amp; status LED test):&lt;br /&gt;
			if (pressedButton) {&lt;br /&gt;
				setStatusLED(1);&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;\nPress button again for RP6 Sensor Board SHUTDOWN!\n&amp;quot;);&lt;br /&gt;
				mSleep(2000);&lt;br /&gt;
				do {&lt;br /&gt;
					if(getStopwatch2() &amp;gt; 200) { // 0.2s&lt;br /&gt;
						if (onoff) onoff = 0;&lt;br /&gt;
						else onoff = 1;&lt;br /&gt;
						if (onoff) setStatusLED(1);&lt;br /&gt;
						else setStatusLED(0);&lt;br /&gt;
						setStopwatch2(0);&lt;br /&gt;
					}&lt;br /&gt;
					mSleep(1);&lt;br /&gt;
					task_I2CTWI();&lt;br /&gt;
				} while (!readButton());&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;\n\n\n\n\nPlease wait for RP6 Sensor Board SHUTDOWN...\n&amp;quot;);&lt;br /&gt;
				sensor_board_shutdown();&lt;br /&gt;
				mSleep(3000);&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;\n\n\nThe RP6 Sensor Board now is in SHUTDOWN MODE!!!\n&amp;quot;);&lt;br /&gt;
				mSleep(1000);&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;\nRESET the M256 microcontroller now...\n\n&amp;quot;);&lt;br /&gt;
				while(true) {};&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			setStopwatch1(0);&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		task_checkINTs();						// Read interrupt signals&lt;br /&gt;
		task_RP6SensorBoard();					// RP6 Sensor Board task&lt;br /&gt;
&lt;br /&gt;
		task_I2CTWI();&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Erklärung&lt;br /&gt;
&lt;br /&gt;
====Projekte====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===RP6 Xtra Module===&lt;br /&gt;
Die Dokumentation zu den RP6 Xtra Modulen befindet sich auf der mitgelieferten ''&amp;quot;RP6 Robot System Xtra Modules CD-ROM&amp;quot;''. Auf der CD-ROM sind auch Software-Beispiele zu finden.&lt;br /&gt;
&lt;br /&gt;
Die hier veröffentlichte Software zu den Xtra Modulen ist eine Eigenentwicklung in GCC:&lt;br /&gt;
* Arexx [[RP6_Sensor_Board_und_Xtra_Module#I2C_GPS_Empf.C3.A4nger_JM3-GPS_2|I2C GPS Empfänger JM3-GPS]]&lt;br /&gt;
* Arexx [[RP6_Sensor_Board_und_Xtra_Module#Gyro_Modul_JM3-GYRO_2|Gyro Modul JM3-GYRO]]&lt;br /&gt;
* Arexx [[RP6_Sensor_Board_und_Xtra_Module#3D_Accelerometer_Modul_JM3-3DA_2|3D Accelerometer Modul JM3-3DA]]&lt;br /&gt;
&lt;br /&gt;
====I2C GPS Empfänger JM3-GPS====&lt;br /&gt;
=====RP6M256 WiFi: I2C_GPS Library=====&lt;br /&gt;
Die nachfolgende RP6M256_I2C_GPSLib (GCC) dient zur Ansteuerung des I2C GPS Empfängers durch die RP6M256 WiFi.&lt;br /&gt;
 &lt;br /&gt;
======Libary Header======&lt;br /&gt;
Datei: RP6M256_I2C_GPSLib.h&lt;br /&gt;
&amp;lt;pre&amp;gt;/* ****************************************************************************&lt;br /&gt;
 *                           _______________________&lt;br /&gt;
 *                           \| RP6  ROBOT SYSTEM |/&lt;br /&gt;
 *                            \_-_-_-_-_-_-_-_-_-_/           &amp;gt;&amp;gt;&amp;gt; RP6 M256 WIFI&lt;br /&gt;
 * ----------------------------------------------------------------------------&lt;br /&gt;
 * ----------------------------- [c]2014 - Dirk -------------------------------&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * File: RP6M256_I2C_GPSLib.h&lt;br /&gt;
 * Version: 1.0&lt;br /&gt;
 * Target: RP6 M256 WIFI - ATMEGA2560 @16.00MHz&lt;br /&gt;
 * Author(s): Dirk&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Description:&lt;br /&gt;
 * Header file for new RP6 I2C GPS Receiver library.&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
#ifndef RP6M256_I2C_GPSLIB_H&lt;br /&gt;
#define RP6M256_I2C_GPSLIB_H&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// RP6 Sensor Board:&lt;br /&gt;
&lt;br /&gt;
// If you want to use the RP6 I2C GPS Receiver on the RP6 Sensor Board, you&lt;br /&gt;
// have to define SENSOR_BOARD (default)!&lt;br /&gt;
// If SENSOR_BOARD is NOT defined, this library assumes that the RP6 I2C GPS&lt;br /&gt;
// Receiver is used stand-alone.&lt;br /&gt;
// ------------------&lt;br /&gt;
#define SENSOR_BOARD&lt;br /&gt;
// ------------------&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Includes:&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6M256Lib.h&amp;quot;&lt;br /&gt;
#include &amp;quot;RP6I2CmasterTWI.h&amp;quot;&lt;br /&gt;
#ifdef SENSOR_BOARD&lt;br /&gt;
	#include &amp;quot;RP6M256_Sensor_BoardLib.h&amp;quot;&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// RP6 I2C GPS Receiver:&lt;br /&gt;
#define I2C_GPS_RECEIVER_ADR			0xc8	// Default&lt;br /&gt;
//#define I2C_GPS_RECEIVER_ADR			0xca&lt;br /&gt;
//#define I2C_GPS_RECEIVER_ADR			0xcc&lt;br /&gt;
//#define I2C_GPS_RECEIVER_ADR			0xce&lt;br /&gt;
//#define I2C_GPS_RECEIVER_ADR			0xd0	// DO NOT USE on Sensor Board!&lt;br /&gt;
//#define I2C_GPS_RECEIVER_ADR			0xd2&lt;br /&gt;
//#define I2C_GPS_RECEIVER_ADR			0xd4&lt;br /&gt;
//#define I2C_GPS_RECEIVER_ADR			0xd6&lt;br /&gt;
//#define I2C_GPS_RECEIVER_ADR			0xd8&lt;br /&gt;
//#define I2C_GPS_RECEIVER_ADR			0xda&lt;br /&gt;
//#define I2C_GPS_RECEIVER_ADR			0xdc&lt;br /&gt;
//#define I2C_GPS_RECEIVER_ADR			0xde&lt;br /&gt;
&lt;br /&gt;
// Read registers:&lt;br /&gt;
#define WHO_AM_I						0x20	// I2C address [0xc8..0xde]&lt;br /&gt;
#define LAT_DEG							0x21	// Degrees&lt;br /&gt;
#define LAT_MIN							0x22	// Minutes&lt;br /&gt;
#define LAT_MIN_D_L						0x23	// Minutes decimal part low&lt;br /&gt;
#define LAT_MIN_D_H						0x24	// Minutes decimal part high&lt;br /&gt;
#define LON_DEG							0x25	// Degrees&lt;br /&gt;
#define LON_MIN							0x26	// Minutes&lt;br /&gt;
#define LON_MIN_D_L						0x27	// Minutes decimal part low&lt;br /&gt;
#define LON_MIN_D_H						0x28	// Minutes decimal part high&lt;br /&gt;
#define STATUS							0x29	// Status flags&lt;br /&gt;
#define FIX_IND							0x2a	// FIX_IND&lt;br /&gt;
#define HDOP							0x2b	// HDOP&lt;br /&gt;
#define HDOP_D							0x2c	// HDOP_D&lt;br /&gt;
#define SAT_N							0x2d	// Number of satellites&lt;br /&gt;
#define COURSE_T_L						0x2e	// True heading low byte&lt;br /&gt;
#define COURSE_T_H						0x2f	// True heading high byte&lt;br /&gt;
#define COURSE_T_D						0x30	// Decimal part of course&lt;br /&gt;
#define SPEED_L							0x31	// Speed low byte&lt;br /&gt;
#define SPEED_H							0x32	// Speed high byte&lt;br /&gt;
#define SPEED_D							0x33	// Speed decimal part&lt;br /&gt;
#define ALT_L							0x34	// Altitude low byte&lt;br /&gt;
#define ALT_H							0x35	// Altitude high byte&lt;br /&gt;
#define ALT_DIF_L						0x36	// Differ. WGS-84 MSL low byte&lt;br /&gt;
#define ALT_DIF_H						0x37	// Differ. WGS-84 MSL high byte&lt;br /&gt;
#define UTC_H							0x38	// UTC hour&lt;br /&gt;
#define UTC_MIN							0x39	// UTC minute&lt;br /&gt;
#define UTC_S							0x3a	// UTC second&lt;br /&gt;
#define DAY								0x3b	// Day&lt;br /&gt;
#define YEAR_L							0x3c	// Year low byte&lt;br /&gt;
#define YEAR_H							0x3d	// Year high byte&lt;br /&gt;
#define MONTH							0x3e	// Month&lt;br /&gt;
#define PDOP							0x3f	// PDOP&lt;br /&gt;
#define PDOP_D							0x40	// PDOP_D&lt;br /&gt;
#define VDOP							0x41	// VDOP&lt;br /&gt;
#define VDOP_D							0x42	// VDOP_D&lt;br /&gt;
#define SAT_1							0x43	// SAT # 1&lt;br /&gt;
#define SAT_2							0x44	// SAT # 2&lt;br /&gt;
#define SAT_3							0x45	// SAT # 3&lt;br /&gt;
#define SAT_4							0x46	// SAT # 4&lt;br /&gt;
#define SAT_5							0x47	// SAT # 5&lt;br /&gt;
#define SAT_6							0x48	// SAT # 6&lt;br /&gt;
#define SAT_7							0x49	// SAT # 7&lt;br /&gt;
#define SAT_8							0x4a	// SAT # 8&lt;br /&gt;
#define SAT_9							0x4b	// SAT # 9&lt;br /&gt;
#define SAT_A							0x4c	// SAT # 10&lt;br /&gt;
#define SAT_B							0x4d	// SAT # 11&lt;br /&gt;
#define SAT_C							0x4e	// SAT # 12&lt;br /&gt;
#define SW_VERSION						0x4f	// SW_Version&lt;br /&gt;
#define HEARTBEAT						0x50	// Heartbeat&lt;br /&gt;
&lt;br /&gt;
// Status and Fix_Ind register bitmasks:&lt;br /&gt;
#define STATUS_NS						0b00000001&lt;br /&gt;
#define STATUS_EW						0b00000010&lt;br /&gt;
#define STATUS_SPU						0b00000100&lt;br /&gt;
#define STATUS_AUTON					0b00001000&lt;br /&gt;
#define FIX_IND_UI_FIX					0b10000000&lt;br /&gt;
&lt;br /&gt;
// Write registers:&lt;br /&gt;
#define INIT_CFG						0x90	// INIT CFG&lt;br /&gt;
#define SET_FIX_TIME					0x91	// Pos_Fix_Time&lt;br /&gt;
#define STBY							0x92	// STBY&lt;br /&gt;
#define FAC_RES							0x93	// Factory Reset&lt;br /&gt;
#define EN_JAM							0x94	// Jamming Remover&lt;br /&gt;
#define TEST_MODE						0x96	// Test Mode&lt;br /&gt;
&lt;br /&gt;
// Write register values (commands):&lt;br /&gt;
#define INIT_CFG_HOT_START				1		// Hot Start&lt;br /&gt;
#define INIT_CFG_WARM_START				2		// Warm Start init data loaded&lt;br /&gt;
#define INIT_CFG_WARM_START_EPH_CLR		3		// Warm Start Ephemeris cleared&lt;br /&gt;
#define INIT_CFG_COLD_START				4		// Cold Start&lt;br /&gt;
#define SET_FIX_TIME_1S					1		// Pos Fix Time 1 second&lt;br /&gt;
#define SET_FIX_TIME_2S					2		// Pos Fix Time 2 seconds&lt;br /&gt;
#define STBY_ENTER						1		// Standby (cleared after write)&lt;br /&gt;
#define FAC_RES_ENTER					1		// Factory Reset&lt;br /&gt;
#define EN_JAM_DISABLE					0		// Jamming Remover disable&lt;br /&gt;
#define EN_JAM_ENABLE					1		// Jamming Remover enable&lt;br /&gt;
#define TEST_MODE_INACTIVE				0		// Test Mode inactive&lt;br /&gt;
#define TEST_MODE_ACTIVE				0x15	// Test Mode active&lt;br /&gt;
&lt;br /&gt;
// Data structure (starts at LAT_DEG):&lt;br /&gt;
#define DATA_STRUCT						LAT_DEG	// Start&lt;br /&gt;
// All data from LAT_DEG to HEARTBEAT (48 bytes):&lt;br /&gt;
#define DATA_LENGTH						(HEARTBEAT - LAT_DEG + 1)&lt;br /&gt;
// Basic data from LAT_DEG to SAT_N (13 bytes):&lt;br /&gt;
#define DATA_BASIC						(SAT_N - LAT_DEG + 1)&lt;br /&gt;
&lt;br /&gt;
typedef union {&lt;br /&gt;
 	uint8_t byte;&lt;br /&gt;
	struct {&lt;br /&gt;
		unsigned ns    :1;				// 1: North 0: South&lt;br /&gt;
		unsigned ew    :1;				// 1: East 0: West&lt;br /&gt;
		unsigned spu   :1;				// 1: km/h 0: kn&lt;br /&gt;
		unsigned auton :1;				// 1: Data not valid 0: Autonomous&lt;br /&gt;
		unsigned fix0  :1;&lt;br /&gt;
		unsigned fix1  :1;&lt;br /&gt;
		unsigned stat0 :1;				// Invalid&lt;br /&gt;
		unsigned stat1 :1;				// GPS Com Error&lt;br /&gt;
	};&lt;br /&gt;
	struct {&lt;br /&gt;
		unsigned ns    :1;				// 1: North 0: South&lt;br /&gt;
		unsigned ew    :1;				// 1: East 0: West&lt;br /&gt;
		unsigned spu   :1;				// 1: km/h 0: kn&lt;br /&gt;
		unsigned auton :1;				// 1: Data not valid 0: Autonomous&lt;br /&gt;
		unsigned fix   :2;&lt;br /&gt;
		unsigned stat  :2;				// 00 -&amp;gt; Valid&lt;br /&gt;
										// 01 -&amp;gt; Invalid&lt;br /&gt;
										// 10 -&amp;gt; GPS Com Error&lt;br /&gt;
										// 11 -&amp;gt; n. def.&lt;br /&gt;
	};&lt;br /&gt;
} status_t;&lt;br /&gt;
&lt;br /&gt;
typedef union {&lt;br /&gt;
 	uint8_t byte;&lt;br /&gt;
	struct {							// Fix indicator:&lt;br /&gt;
		unsigned fix_0  :1;				//  1: GPS fix          2: DGPS fix&lt;br /&gt;
		unsigned fix_1  :1;				//  3: PPS fix          4: RTK&lt;br /&gt;
		unsigned fix_2  :1;				//  5: Float RTK        6: Dead reck.&lt;br /&gt;
		unsigned fix_3  :1;				//  7: Manual inp. mode 8: Simul. mode&lt;br /&gt;
		unsigned unused :3;&lt;br /&gt;
		unsigned ui_fix :1;				// HW signal from UC530&lt;br /&gt;
	};&lt;br /&gt;
	struct {&lt;br /&gt;
		unsigned fix    :4;				// See above &amp;quot;Fix indicator&amp;quot;!&lt;br /&gt;
		unsigned unused :3;&lt;br /&gt;
		unsigned ui_fix :1;				// HW signal from UC530&lt;br /&gt;
	};&lt;br /&gt;
} fix_ind_t;&lt;br /&gt;
&lt;br /&gt;
typedef union {&lt;br /&gt;
	struct {&lt;br /&gt;
		uint8_t   latDeg;&lt;br /&gt;
		uint8_t   latMin;&lt;br /&gt;
		uint16_t  latMinDec;&lt;br /&gt;
		uint8_t   lonDeg;&lt;br /&gt;
		uint8_t   lonMin;&lt;br /&gt;
		uint16_t  lonMinDec;&lt;br /&gt;
		status_t  status;&lt;br /&gt;
		fix_ind_t fixInd;&lt;br /&gt;
		uint8_t   hdop;&lt;br /&gt;
		uint8_t   hdopDec;&lt;br /&gt;
		uint8_t   satCount;&lt;br /&gt;
		uint16_t  course;&lt;br /&gt;
		uint8_t   courseDec;&lt;br /&gt;
		uint16_t  speed;&lt;br /&gt;
		uint8_t   speedDec;&lt;br /&gt;
		uint16_t  altitude;&lt;br /&gt;
		uint16_t  altDif;&lt;br /&gt;
		uint8_t   utcHour;&lt;br /&gt;
		uint8_t   utcMinute;&lt;br /&gt;
		uint8_t   utcSec;&lt;br /&gt;
		uint8_t   day;&lt;br /&gt;
		uint16_t  year;&lt;br /&gt;
		uint8_t   month;&lt;br /&gt;
		uint8_t   pdop;&lt;br /&gt;
		uint8_t   pdopDec;&lt;br /&gt;
		uint8_t   vdop;&lt;br /&gt;
		uint8_t   vdopDec;&lt;br /&gt;
		uint8_t   sat[12];&lt;br /&gt;
		uint8_t   swVersion;&lt;br /&gt;
		uint8_t   heartbeat;&lt;br /&gt;
	};&lt;br /&gt;
} gpsdata_t;&lt;br /&gt;
extern gpsdata_t gpsdata;&lt;br /&gt;
&lt;br /&gt;
void I2C_GPS_reset(void);&lt;br /&gt;
void I2C_GPS_write_cmd(uint8_t, uint8_t);&lt;br /&gt;
uint8_t I2C_GPS_read_reg(uint8_t);&lt;br /&gt;
void I2C_GPS_read(uint8_t);&lt;br /&gt;
void I2C_GPS_init(void);&lt;br /&gt;
void I2C_GPS_new_addr(uint8_t);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
/******************************************************************************&lt;br /&gt;
 * Additional info&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Changelog:&lt;br /&gt;
 * &lt;br /&gt;
 *  ---&amp;gt; changes are documented in the file &amp;quot;RP6M256_I2C_GPSLib.c&amp;quot;&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
======Libary Source======&lt;br /&gt;
Datei: RP6M256_I2C_GPSLib.c&lt;br /&gt;
&amp;lt;pre&amp;gt;/* ****************************************************************************&lt;br /&gt;
 *                           _______________________&lt;br /&gt;
 *                           \| RP6  ROBOT SYSTEM |/&lt;br /&gt;
 *                            \_-_-_-_-_-_-_-_-_-_/           &amp;gt;&amp;gt;&amp;gt; RP6 M256 WIFI&lt;br /&gt;
 * ----------------------------------------------------------------------------&lt;br /&gt;
 * ----------------------------- [c]2014 - Dirk -------------------------------&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * File: RP6M256_I2C_GPSLib.c&lt;br /&gt;
 * Version: 1.0&lt;br /&gt;
 * Target: RP6 M256 WIFI - ATMEGA2560 @16.00MHz&lt;br /&gt;
 *         and a RP6 I2C GPS Receiver (CONRAD 1082385)&lt;br /&gt;
 *         optionally on a RP6 Sensor Board (CONRAD 1082384)&lt;br /&gt;
 * Author(s): Dirk&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Description:&lt;br /&gt;
 * &lt;br /&gt;
 * This is our new Library that contains basic routines and functions for&lt;br /&gt;
 * accessing the RP6 I2C GPS Receiver JM3-GPS (CONRAD 1082385).&lt;br /&gt;
 * The library assumes the I2C GPS Receiver software (firmware) v1.2.&lt;br /&gt;
 * If the I2C GPS Receiver is located on the RP6 Sensor Board (CONRAD 1082384)&lt;br /&gt;
 * and connected to the I2C-MODULE plug M1, the RP6M256_Sensor_BoardLib has to&lt;br /&gt;
 * be included!&lt;br /&gt;
 * &lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Includes:&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6M256_I2C_GPSLib.h&amp;quot; 		&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Variables:&lt;br /&gt;
&lt;br /&gt;
uint8_t gpsdataBuf[DATA_LENGTH + 1]; &lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Software reset for the I2C GPS Receiver.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void I2C_GPS_reset(void)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_GPS_RECEIVER_ADR, 0, 0x06);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Writes a command cmd to a register reg of the&lt;br /&gt;
 * I2C GPS Receiver.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: reg -&amp;gt; Write register [0x90..0x96]&lt;br /&gt;
 *        cmd -&amp;gt; Command&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void I2C_GPS_write_cmd(uint8_t reg, uint8_t cmd)&lt;br /&gt;
{&lt;br /&gt;
	if((reg &amp;lt; INIT_CFG) || (reg &amp;gt; TEST_MODE)) return;&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_GPS_RECEIVER_ADR, reg, cmd);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Reads a single register reg from the I2C GPS&lt;br /&gt;
 * Receiver.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: reg -&amp;gt; Read register [0x20..0x50]&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
uint8_t I2C_GPS_read_reg(uint8_t reg)&lt;br /&gt;
{&lt;br /&gt;
	if((reg &amp;lt; WHO_AM_I) || (reg &amp;gt; HEARTBEAT)) reg = WHO_AM_I;&lt;br /&gt;
	I2CTWI_transmitByte(I2C_GPS_RECEIVER_ADR, reg);&lt;br /&gt;
	return (I2CTWI_readByte(I2C_GPS_RECEIVER_ADR));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
gpsdata_t gpsdata;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Reads the GPS data from the I2C GPS Receiver.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: length -&amp;gt; Number of data bytes [1..48]&lt;br /&gt;
 *&lt;br /&gt;
 * Hint: If length = DATA_BASIC, only basic GPS&lt;br /&gt;
 *       data are read. If length = DATA_LENGTH,&lt;br /&gt;
 *       ALL GPS data are read.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void I2C_GPS_read(uint8_t length)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t i;&lt;br /&gt;
&lt;br /&gt;
	if(length &amp;gt; DATA_LENGTH) length = DATA_LENGTH;&lt;br /&gt;
	I2CTWI_readRegisters(I2C_GPS_RECEIVER_ADR, DATA_STRUCT, gpsdataBuf, length);&lt;br /&gt;
	for(i = length; i &amp;lt; DATA_LENGTH; i++) {&lt;br /&gt;
		gpsdataBuf[i] = 0;&lt;br /&gt;
	}&lt;br /&gt;
	gpsdata.latDeg = gpsdataBuf[0];&lt;br /&gt;
	gpsdata.latMin = gpsdataBuf[1];&lt;br /&gt;
	gpsdata.latMinDec = gpsdataBuf[2] + (gpsdataBuf[3] &amp;lt;&amp;lt; 8);&lt;br /&gt;
	gpsdata.lonDeg = gpsdataBuf[4];&lt;br /&gt;
	gpsdata.lonMin = gpsdataBuf[5];&lt;br /&gt;
	gpsdata.lonMinDec = gpsdataBuf[6] + (gpsdataBuf[7] &amp;lt;&amp;lt; 8);&lt;br /&gt;
	gpsdata.status.byte = gpsdataBuf[8];&lt;br /&gt;
	gpsdata.fixInd.byte = gpsdataBuf[9];&lt;br /&gt;
	gpsdata.hdop = gpsdataBuf[10];&lt;br /&gt;
	gpsdata.hdopDec = gpsdataBuf[11];&lt;br /&gt;
	gpsdata.satCount = gpsdataBuf[12];&lt;br /&gt;
	if(length == DATA_BASIC) return;&lt;br /&gt;
	gpsdata.course = gpsdataBuf[13] + (gpsdataBuf[14] &amp;lt;&amp;lt; 8);&lt;br /&gt;
	gpsdata.courseDec = gpsdataBuf[15];&lt;br /&gt;
	gpsdata.speed = gpsdataBuf[16] + (gpsdataBuf[17] &amp;lt;&amp;lt; 8);&lt;br /&gt;
	gpsdata.speedDec = gpsdataBuf[18];&lt;br /&gt;
	gpsdata.altitude = gpsdataBuf[19] + (gpsdataBuf[20] &amp;lt;&amp;lt; 8);&lt;br /&gt;
	gpsdata.altDif = gpsdataBuf[21] + (gpsdataBuf[22] &amp;lt;&amp;lt; 8);&lt;br /&gt;
	gpsdata.utcHour = gpsdataBuf[23];&lt;br /&gt;
	gpsdata.utcMinute = gpsdataBuf[24];&lt;br /&gt;
	gpsdata.utcSec = gpsdataBuf[25];&lt;br /&gt;
	gpsdata.day = gpsdataBuf[26];&lt;br /&gt;
	gpsdata.year = gpsdataBuf[27] + (gpsdataBuf[28] * 100);&lt;br /&gt;
	gpsdata.month = gpsdataBuf[29];&lt;br /&gt;
	gpsdata.pdop = gpsdataBuf[30];&lt;br /&gt;
	gpsdata.pdopDec = gpsdataBuf[31];&lt;br /&gt;
	gpsdata.vdop = gpsdataBuf[32];&lt;br /&gt;
	gpsdata.vdopDec = gpsdataBuf[33];&lt;br /&gt;
	for(i = 34; i &amp;lt; 46; i++) {&lt;br /&gt;
		gpsdata.sat[i - 34] = gpsdataBuf[i];&lt;br /&gt;
	}&lt;br /&gt;
	gpsdata.swVersion = gpsdataBuf[46];&lt;br /&gt;
	gpsdata.heartbeat = gpsdataBuf[47];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * You MUST call this function at the beginning of a&lt;br /&gt;
 * main program, that uses the RP6 I2C GPS Receiver. &lt;br /&gt;
 * If SENSOR_BOARD is defined, the I2C-MODULE power&lt;br /&gt;
 * will be switched on with the function&lt;br /&gt;
 * setI2CModulePower() defined in the&lt;br /&gt;
 * RP6M256_Sensor_BoardLib, which will be included&lt;br /&gt;
 * then.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void I2C_GPS_init(void)&lt;br /&gt;
{&lt;br /&gt;
#ifdef SENSOR_BOARD&lt;br /&gt;
	// I2C-MODULE (plug M1) power on: &lt;br /&gt;
	setI2CModulePower(1);&lt;br /&gt;
#endif&lt;br /&gt;
	// Other init procedures here!&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Writes a new I2C address to the I2C GPS Receiver.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: addr -&amp;gt; New I2C address [0xc8..0xde]&lt;br /&gt;
 *&lt;br /&gt;
 * Hints: - Default I2C address is 0xc8.&lt;br /&gt;
 *        - You may choose a new I2C address in&lt;br /&gt;
 *          the range 0xc8..0xde.&lt;br /&gt;
 *        - After writing a new address you have&lt;br /&gt;
 *          to switch the I2C GPS Receiver off&lt;br /&gt;
 *          and on again.&lt;br /&gt;
 *        - Definition I2C_GPS_RECEIVER_ADR must&lt;br /&gt;
 *          be adapted to the new I2C address!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void I2C_GPS_new_addr(uint8_t addr)&lt;br /&gt;
{&lt;br /&gt;
	if((addr &amp;lt; 0xc8) || (addr &amp;gt; 0xde)) return;&lt;br /&gt;
	addr &amp;amp;= 0xfe;								// Clear R/W bit&lt;br /&gt;
	I2CTWI_transmit3Bytes(I2C_GPS_RECEIVER_ADR, 0, 0x04, addr);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&lt;br /&gt;
/******************************************************************************&lt;br /&gt;
 * Additional info&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Changelog:&lt;br /&gt;
 * - v. 1.0 (initial release) 21.04.2014 by Dirk&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Erklärung&lt;br /&gt;
&lt;br /&gt;
======Demo======&lt;br /&gt;
makefile:&lt;br /&gt;
&amp;lt;pre&amp;gt;...&lt;br /&gt;
TARGET = RP6M256_Sensor_Board_02&lt;br /&gt;
...&lt;br /&gt;
SRC += $(RP6_LIB_PATH)/RP6common/RP6I2CmasterTWI.c&lt;br /&gt;
&lt;br /&gt;
SRC += $(RP6_LIB_PATH)/RP6control_M256_WIFI/RP6M256_Sensor_BoardLib.c&lt;br /&gt;
SRC += $(RP6_LIB_PATH)/RP6control_M256_WIFI/RP6M256_I2C_GPSLib.c&lt;br /&gt;
...&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Datei: RP6M256_Sensor_Board_02.c&lt;br /&gt;
&amp;lt;pre&amp;gt;/* &lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * RP6 ROBOT SYSTEM - RP6 CONTROL M256 Examples&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Example: RP6M256 Sensor Board&lt;br /&gt;
 * Author(s): Dirk&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Description:&lt;br /&gt;
 * In this example we show a second test for the RP6 Sensor Board.&lt;br /&gt;
 * &lt;br /&gt;
 * ############################################################################&lt;br /&gt;
 * The Robot does NOT move in this example! You can simply put it on a table&lt;br /&gt;
 * next to your PC and you should connect it to the PC via the USB Interface!&lt;br /&gt;
 * You should also connect to it via WIFI.&lt;br /&gt;
 * ############################################################################&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Includes:&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6M256Lib.h&amp;quot; 				// The RP6 M256 Library. &lt;br /&gt;
										// Always needs to be included!&lt;br /&gt;
#include &amp;quot;RP6I2CmasterTWI.h&amp;quot;			// Include the I2C-Bus Master Library&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Include our new &amp;quot;RP6M256 I2C GPS Receiver library&amp;quot;:&lt;br /&gt;
// (This is the library for accessing the RP6 I2C GPS Receiver!)&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6M256_I2C_GPSLib.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Write a floating point number to the WIFI.&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *&lt;br /&gt;
 *			// Write a floating point number to the WIFI (no exponent):&lt;br /&gt;
 *			writeDouble_WIFI(1234567.890, 11, 3);&lt;br /&gt;
 *&lt;br /&gt;
 * The value of prec (precision) defines the number of decimal places.&lt;br /&gt;
 * For 32 bit floating point variables (float, double ...) 6 is&lt;br /&gt;
 * the max. value for prec (7 relevant digits).&lt;br /&gt;
 * The value of width defines the overall number of characters in the&lt;br /&gt;
 * floating point number including the decimal point. The number of&lt;br /&gt;
 * pre-decimal positions is: (width - prec - 1).&lt;br /&gt;
 */&lt;br /&gt;
void writeDouble_WIFI(double number, uint8_t width, uint8_t prec)&lt;br /&gt;
{char buffer[width + 1];&lt;br /&gt;
	dtostrf(number, width, prec, &amp;amp;buffer[0]);&lt;br /&gt;
	writeString_WIFI(&amp;amp;buffer[0]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Write a floating point number to the LCD.&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *&lt;br /&gt;
 *			// Write a floating point number to the LCD (no exponent):&lt;br /&gt;
 *			writeDoubleLCD(1234567.890, 11, 3);&lt;br /&gt;
 *&lt;br /&gt;
 * The value of prec (precision) defines the number of decimal places.&lt;br /&gt;
 * For 32 bit floating point variables (float, double ...) 6 is&lt;br /&gt;
 * the max. value for prec (7 relevant digits).&lt;br /&gt;
 * The value of width defines the overall number of characters in the&lt;br /&gt;
 * floating point number including the decimal point. The number of&lt;br /&gt;
 * pre-decimal positions is: (width - prec - 1).&lt;br /&gt;
 */&lt;br /&gt;
void writeDoubleLCD(double number, uint8_t width, uint8_t prec)&lt;br /&gt;
{char buffer[width + 1];&lt;br /&gt;
	dtostrf(number, width, prec, &amp;amp;buffer[0]);&lt;br /&gt;
	writeStringLCD(&amp;amp;buffer[0]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Error handler&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function gets called automatically if there was an I2C Error like&lt;br /&gt;
 * the slave sent a &amp;quot;not acknowledge&amp;quot; (NACK, error codes e.g. 0x20 or 0x30).&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void I2C_transmissionError(uint8_t errorState)&lt;br /&gt;
{&lt;br /&gt;
	writeString_P_WIFI(&amp;quot;\nI2C ERROR - TWI STATE: 0x&amp;quot;);&lt;br /&gt;
	writeInteger_WIFI(errorState, HEX);&lt;br /&gt;
	writeChar_WIFI('\n');&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Main function - The program starts here:&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
	initRP6M256();    // Always call this first! The Processor will not work&lt;br /&gt;
					  // correctly otherwise. &lt;br /&gt;
&lt;br /&gt;
	initLCD(); // Initialize the LC-Display (LCD)&lt;br /&gt;
			   // Always call this before using the LCD!&lt;br /&gt;
&lt;br /&gt;
	setLEDs(0b1111);&lt;br /&gt;
	mSleep(500);&lt;br /&gt;
	setLEDs(0b0000);&lt;br /&gt;
&lt;br /&gt;
	writeString_P_WIFI(&amp;quot;\n\nRP6 Sensor Board Selftest 2!\n&amp;quot;); &lt;br /&gt;
&lt;br /&gt;
	// IMPORTANT:&lt;br /&gt;
	I2CTWI_initMaster(100); // Initialize the TWI Module for Master operation&lt;br /&gt;
							// with 100kHz SCL Frequency&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	// Register the event handler:&lt;br /&gt;
	I2CTWI_setTransmissionErrorHandler(I2C_transmissionError);&lt;br /&gt;
&lt;br /&gt;
	setLEDs(0b1111);&lt;br /&gt;
&lt;br /&gt;
	// Write a text message to the LCD:&lt;br /&gt;
	showScreenLCD(&amp;quot;################&amp;quot;, &amp;quot;################&amp;quot;);&lt;br /&gt;
	mSleep(1500);&lt;br /&gt;
	showScreenLCD(&amp;quot;RP6v2-M256-WIFI &amp;quot;, &amp;quot;Example Program&amp;quot;);&lt;br /&gt;
	mSleep(2500); &lt;br /&gt;
	showScreenLCD(&amp;quot;RP6 Sensor Board&amp;quot;, &amp;quot;   Selftest 2&amp;quot;);&lt;br /&gt;
	mSleep(2500);&lt;br /&gt;
	clearLCD();&lt;br /&gt;
&lt;br /&gt;
	setLEDs(0b0000);&lt;br /&gt;
&lt;br /&gt;
	// ---------------------------------------&lt;br /&gt;
&lt;br /&gt;
	uint8_t onoff = 0;&lt;br /&gt;
	uint8_t i;&lt;br /&gt;
&lt;br /&gt;
	startStopwatch1();&lt;br /&gt;
	startStopwatch2();&lt;br /&gt;
&lt;br /&gt;
	// IMPORTANT:&lt;br /&gt;
	sensor_board_init();						// RP6 Sensor Board init!!!&lt;br /&gt;
	I2C_GPS_init();								// RP6 I2C GPS Receiver init&lt;br /&gt;
&lt;br /&gt;
	while(true) &lt;br /&gt;
	{&lt;br /&gt;
		if(getStopwatch1() &amp;gt; 1000) // 1s&lt;br /&gt;
		{&lt;br /&gt;
			if (onoff) onoff = 0;&lt;br /&gt;
			else onoff = 1;&lt;br /&gt;
&lt;br /&gt;
			// Show GPS data:&lt;br /&gt;
			I2C_GPS_read(DATA_LENGTH);			// Read data&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nLAT_DEG:     &amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.latDeg, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;° &amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.latMin, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;.&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.latMinDec, DEC, 4);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;' &amp;quot;);&lt;br /&gt;
			if(gpsdata.status.ns)&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;N&amp;quot;);&lt;br /&gt;
			else&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;S&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nLON_DEG:    &amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.lonDeg, DEC, 3);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;° &amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.lonMin, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;.&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.lonMinDec, DEC, 4);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;' &amp;quot;);&lt;br /&gt;
			if(gpsdata.status.ew)&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;E&amp;quot;);&lt;br /&gt;
			else&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;W&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nSTATUS:     &amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.status.byte, BIN, 8);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nFIX_IND:    &amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.fixInd.byte, BIN, 8);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nHDOP:       &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(gpsdata.hdop, DEC);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;.&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.hdopDec, DEC, 2);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nSAT_N:      &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(gpsdata.satCount, DEC);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nCOURSE_T:   &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(gpsdata.course, DEC);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;.&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.courseDec, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;°&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nSPEED:      &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(gpsdata.speed, DEC);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;.&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.speedDec, DEC, 2);&lt;br /&gt;
			if(gpsdata.status.spu)&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;km/h&amp;quot;);&lt;br /&gt;
			else&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;kn&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nALT:        &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(gpsdata.altitude, DEC);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;m\nALT_DIF:    &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(gpsdata.altDif, DEC);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;m\nUTC:        &amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.utcHour, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;:&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.utcMinute, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;:&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.utcSec, DEC, 2);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nDATE:       &amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.day, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;.&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.month, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;.&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.year, DEC, 4);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nPDOP:       &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(gpsdata.pdop, DEC);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;.&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.pdopDec, DEC, 2);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nVDOP:       &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(gpsdata.vdop, DEC);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;.&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.vdopDec, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			for(i = 0; i &amp;lt; gpsdata.satCount; i++) {&lt;br /&gt;
				if(i == 8) writeString_P_WIFI(&amp;quot;\n&amp;quot;);&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;  SAT_&amp;quot;);&lt;br /&gt;
				writeIntegerLength_WIFI(i + 1, HEX, 1);&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;: &amp;quot;);&lt;br /&gt;
				writeInteger_WIFI(gpsdata.sat[i], DEC);&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nSW_VERSION: &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(gpsdata.swVersion, DEC);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nHEARTBEAT:  &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(gpsdata.heartbeat, DEC);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			// RP6 Sensor Board shutdown (button &amp;amp; status LED test):&lt;br /&gt;
			if (pressedButton) {&lt;br /&gt;
				setStatusLED(1);&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;\nPress button again for RP6 Sensor Board SHUTDOWN!\n&amp;quot;);&lt;br /&gt;
				mSleep(2000);&lt;br /&gt;
				do {&lt;br /&gt;
					if(getStopwatch2() &amp;gt; 200) { // 0.2s&lt;br /&gt;
						if (onoff) onoff = 0;&lt;br /&gt;
						else onoff = 1;&lt;br /&gt;
						if (onoff) setStatusLED(1);&lt;br /&gt;
						else setStatusLED(0);&lt;br /&gt;
						setStopwatch2(0);&lt;br /&gt;
					}&lt;br /&gt;
					mSleep(1);&lt;br /&gt;
					task_I2CTWI();&lt;br /&gt;
				} while (!readButton());&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;\n\n\n\n\nPlease wait for RP6 Sensor Board SHUTDOWN...\n&amp;quot;);&lt;br /&gt;
				sensor_board_shutdown();&lt;br /&gt;
				mSleep(3000);&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;\n\n\nThe RP6 Sensor Board now is in SHUTDOWN MODE!!!\n&amp;quot;);&lt;br /&gt;
				mSleep(1000);&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;\nRESET the M256 microcontroller now...\n\n&amp;quot;);&lt;br /&gt;
				while(true) {};&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			setStopwatch1(0);&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		task_RP6SensorBoard();					// RP6 Sensor Board task&lt;br /&gt;
&lt;br /&gt;
		task_I2CTWI();&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Erklärung&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Gyro Modul JM3-GYRO====&lt;br /&gt;
=====Analoge Auswertung=====&lt;br /&gt;
Am Pin ''OUT'' des Gyro Moduls (siehe [http://www.rn-wissen.de/index.php/RP6_Sensor_Board_und_Xtra_Module#Anschluss-Schema Anschluss-Schema]!) liegt die Ausgangsspannung des Sensors (0..5V) an. Sie kann mit einem ADC-Eingang eines Microcontrollers gemessen werden.&lt;br /&gt;
Syntax mit den Libraries der RP6Base, M32 oder M256 WiFi (ADC Kanal 0):&lt;br /&gt;
 uint16_t result = readADC(0);&lt;br /&gt;
In der C-Control-Pro Umgebung der M128 sieht das z.B. in CompactC so aus (ADC Kanal 0):&lt;br /&gt;
 word result;&lt;br /&gt;
 ADC_Set(ADC_VREF_VCC, 0);&lt;br /&gt;
 ...&lt;br /&gt;
 result = ADC_Read();&lt;br /&gt;
Das Ergebnis ''result'' kann noch zur Weiterverarbeitung angepasst werden:&lt;br /&gt;
 #define ADCVAL_ZERORATE_LEVEL			511		// Zero rate Level&lt;br /&gt;
 ...&lt;br /&gt;
 int16_t z_axisg = result - ADCVAL_ZERORATE_LEVEL;&lt;br /&gt;
Dadurch zeigt ''z_axisg'' Null an, wenn keine Rotation anliegt und wird positiv, wenn nach LINKS gedreht wird und negativ bei RECHTS-Drehung. Die Definition ADCVAL_ZERORATE_LEVEL muss natürlich an den eigenen Sensor-Nullwert angepasst werden.&lt;br /&gt;
&lt;br /&gt;
Aus dem Absolutwert von ''z_axisg'' kann man die Drehrate (Drehgeschwindigkeit) auch bestimmen:&lt;br /&gt;
&lt;br /&gt;
In den [[RP6_Sensor_Board_und_Xtra_Module#Technische_Daten_3|Technischen Daten]] ist die Empfindlichkeit des Sensors mit '''10mV/dps''' (0,01V pro Grad und Sekunde) angegeben. Damit errechnet sich die Drehrate als:&lt;br /&gt;
 Drehrate [dps] = abs(z_axisg) * (5 / 1024 / 0.01) = abs(z_axisg) * 0.48828125&lt;br /&gt;
&lt;br /&gt;
=====Optionale Ansteuerung=====&lt;br /&gt;
Im [http://www.rn-wissen.de/index.php/RP6_Sensor_Board_und_Xtra_Module#Anschluss-Schema Anschluss-Schema] ist erkennbar, dass es noch 2 Steuerleitungen ''SLEEP/PD'' und ''ST'' gibt. Mit diesen Anschlüssen kann die Betriebsart des Gyro Moduls festgelegt werden, siehe nachfolgende Tabelle:&lt;br /&gt;
{|  {{Blauetabelle}} &lt;br /&gt;
|Betriebsart&lt;br /&gt;
|ST&lt;br /&gt;
|SLEEP/PD&lt;br /&gt;
|Stromverbrauch&lt;br /&gt;
|-&lt;br /&gt;
|Normal&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|4,2mA&lt;br /&gt;
|-&lt;br /&gt;
|Sleep&lt;br /&gt;
|0&lt;br /&gt;
|1&lt;br /&gt;
|2,2mA&lt;br /&gt;
|-&lt;br /&gt;
|Self-test&lt;br /&gt;
|1&lt;br /&gt;
|0&lt;br /&gt;
|4,2mA&lt;br /&gt;
|-&lt;br /&gt;
|Power-down&lt;br /&gt;
|1&lt;br /&gt;
|1&lt;br /&gt;
|'''5µA'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
Will man zwischen den Betriebsarten per Software umschalten, muss man die beiden Steuerleitungen mit I/O Portpins des Microcontrollers verbinden, die als Ausgänge konfiguriert sind. Braucht man diese Funktion nicht, reicht es, ''ST'' und ''SLEEP/PD'' mit GND zu verbinden (Betriebsart &amp;quot;Normal&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====3D Accelerometer Modul JM3-3DA====&lt;br /&gt;
Das 3D Accelerometer Modul kann über den I2C- oder den SPI-Bus angesteuert werden. Wird das Modul auf der RP6 CONTROL M32 Platine betrieben (es sitzt also auf dem Sockel IC5 für das 2. SPI-EEPROM), dann erfolgt die Ansteuerung über den SPI-Bus. Die SPI-Grundfunktionen befinden sich in der RP6ControlLib, die daher eingebunden werden muss.&lt;br /&gt;
&lt;br /&gt;
=====RP6 CONTROL M32: ACCSENS Library=====&lt;br /&gt;
Die nachfolgende RP6ControlACCSENSLib (GCC) dient zur Ansteuerung des 3D Accelerometer Moduls durch die RP6 CONTROL M32.&lt;br /&gt;
&lt;br /&gt;
======Configuration Header======&lt;br /&gt;
Vor dem Kompilieren der Library muss eine Anpassung des Configuration Headers an die eigenen Hardware-Voraussetzungen erfolgen.&lt;br /&gt;
Dazu gibt es im Configuration Header eine Definition:&lt;br /&gt;
* EXP_STACK_1 -&amp;gt; Die RP6 CONTROL M32 sitzt auf dem vorderen Platinenstapel 1 des RP6&lt;br /&gt;
Im nachfolgenden Listing ist die Definition EXP_STACK_1 NICHT aktiv (d.h. die M32 sitzt auf dem hinteren Platinenstapel 2!). Dies muss an die eigene Hardware angepaßt werden. Wenn die RP6 CONTROL M32 auf dem vorderen Platinenstapel 1 des RP6 sitzt, muss die Zeile mit &amp;quot;EXP_STACK_1&amp;quot; &amp;quot;aktiviert&amp;quot; werden. Dazu entfernt man &amp;quot;//&amp;quot; am Zeilenanfang:&lt;br /&gt;
 #define EXP_STACK_1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Bevor man den Beschleunigungssensor nutzen kann, muss man ihn kalibrieren:&lt;br /&gt;
&lt;br /&gt;
'''Accelerometer:'''&lt;br /&gt;
* Die X-Achse wird kalibriert, indem man den RP6 mit der rechten Seite nach unten hält und den Maximalwert in MAX_X_A einträgt. Dann neigt man ihn auf seine linke Seite und trägt den negativen Maximalwert in MIN_X_A ein.&lt;br /&gt;
* Die Y-Achse wird kalibriert, indem man den RP6 mit der Vorderseite nach oben hält und den Maximalwert in MAX_Y_A einträgt. Dann kippt man die Vorderseite nach unten und trägt den negativen Maximalwert in MIN_Y_A ein.&lt;br /&gt;
* Die Z-Achse wird kalibriert, indem man den RP6 normal waagerecht hält und den Maximalwert in MAX_Z_A einträgt. Dann dreht man den RP6 &amp;quot;auf den Kopf&amp;quot; und trägt den negativen Maximalwert in MIN_Z_A ein.&lt;br /&gt;
* Sollten die angezeigten Pitch- und Roll-Werte nach der Kalibrierung der Achsen und genau waagerecht stehendem Sensor bzw. RP6 vom Nullwert deutlich abweichen, kann man sie mithilfe der Definitionen OFFSET_PITCH_A und OFFSET_ROLL_A &amp;quot;nullen&amp;quot;. Die Einheit dieser Definitionen ist °.&lt;br /&gt;
Nach dem Eintragen der Kalibrierungswerte muss das Programm neu kompiliert werden!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Datei: RP6ControlACCSENS.h&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;/* ****************************************************************************&lt;br /&gt;
 *                           _______________________&lt;br /&gt;
 *                           \| RP6  ROBOT SYSTEM |/&lt;br /&gt;
 *                            \_-_-_-_-_-_-_-_-_-_/             &amp;gt;&amp;gt;&amp;gt; RP6 CONTROL&lt;br /&gt;
 * ----------------------------------------------------------------------------&lt;br /&gt;
 * ----------------------------- [c]2014 - Dirk -------------------------------&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * File: RP6ControlACCSENS.h&lt;br /&gt;
 * Version: 1.0&lt;br /&gt;
 * Target: RP6 CONTROL - ATMEGA32 @16.00MHz&lt;br /&gt;
 * Author(s): Dirk&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Description:&lt;br /&gt;
 * Configuration header file for new ACCSENS library.&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * THE CHANGELOG CAN BE FOUND AT THE END OF THIS FILE!&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
#ifndef RP6CONTROLACCSENS_H&lt;br /&gt;
#define RP6CONTROLACCSENS_H&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Sensor position on the RP6 robot:&lt;br /&gt;
// (If EXP_STACK_1 is defined, the RP6 CONTROL M32 is located on the front&lt;br /&gt;
//  stack for addon boards on the RP6 robot. If EXP_STACK_1 is NOT defined&lt;br /&gt;
//  (default), the RP6 CONTROL M32 is mounted on the rear stack.)&lt;br /&gt;
// -------------------&lt;br /&gt;
//#define EXP_STACK_1&lt;br /&gt;
// -------------------&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// The following sensor is used:&lt;br /&gt;
// - 3D Accelerometer Modul (CONRAD 1082387-62) with LIS302DLH 3-axis&lt;br /&gt;
//   accelerometer&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// LIS302DLH accelerometer calibration data:&lt;br /&gt;
#define MAX_X_A						32767		// Max. X-axis value&lt;br /&gt;
#define MIN_X_A						-32768		// Min. X-axis value&lt;br /&gt;
#define MAX_Y_A						32767		// Max. Y-axis value&lt;br /&gt;
#define MIN_Y_A						-32768		// Min. Y-axis value&lt;br /&gt;
#define MAX_Z_A						32767		// Max. Z-axis value&lt;br /&gt;
#define MIN_Z_A						-32768		// Min. Z-axis value&lt;br /&gt;
#define OFFSET_PITCH_A				0.0			// Offset Pitch [°]&lt;br /&gt;
#define OFFSET_ROLL_A				0.0			// Offset Roll [°]&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
/******************************************************************************&lt;br /&gt;
 * Additional info&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Changelog:&lt;br /&gt;
 * &lt;br /&gt;
 *  ---&amp;gt; changes are documented in the file &amp;quot;RP6ControlACCSENSLib.c&amp;quot;&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
======Library Header======&lt;br /&gt;
Datei: RP6ControlACCSENSLib.h&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;/* ****************************************************************************&lt;br /&gt;
 *                           _______________________&lt;br /&gt;
 *                           \| RP6  ROBOT SYSTEM |/&lt;br /&gt;
 *                            \_-_-_-_-_-_-_-_-_-_/             &amp;gt;&amp;gt;&amp;gt; RP6 CONTROL&lt;br /&gt;
 * ----------------------------------------------------------------------------&lt;br /&gt;
 * ----------------------------- [c]2014 - Dirk -------------------------------&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * File: RP6ControlACCSENSLib.h&lt;br /&gt;
 * Version: 1.0&lt;br /&gt;
 * Target: RP6 CONTROL - ATMEGA32 @16.00MHz&lt;br /&gt;
 * Author(s): Dirk&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Description:&lt;br /&gt;
 * This is the RP6ControlACCSENSLib header file.&lt;br /&gt;
 * You have to include this file, if you want to use the library&lt;br /&gt;
 * RP6ControlACCSENSLib.c in your own projects.&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * THE CHANGELOG CAN BE FOUND AT THE END OF THIS FILE!&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
#ifndef RP6CONTROLACCSENSLIB_H&lt;br /&gt;
#define RP6CONTROLACCSENSLIB_H&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Includes:&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6ControlLib.h&amp;quot; 		// The RP6 Control Library (v. 1.1 or higher). &lt;br /&gt;
#include &amp;quot;RP6ControlACCSENS.h&amp;quot;&lt;br /&gt;
#include &amp;lt;math.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&lt;br /&gt;
#define ACC_CS							MEM_CS2&lt;br /&gt;
#define DEVICE_IDENTIFIER				0x32&lt;br /&gt;
&lt;br /&gt;
// Registers:&lt;br /&gt;
#define WHO_AM_I						0x0f&lt;br /&gt;
#define CTRL_REG1						0x20&lt;br /&gt;
#define CTRL_REG2						0x21&lt;br /&gt;
#define CTRL_REG3						0x22&lt;br /&gt;
#define CTRL_REG4						0x23&lt;br /&gt;
#define CTRL_REG5						0x24&lt;br /&gt;
#define HP_FILTER_RESET					0x25&lt;br /&gt;
#define REFERENCE						0x26&lt;br /&gt;
#define STATUS_REG						0x27&lt;br /&gt;
#define OUT_X_L							0x28&lt;br /&gt;
#define OUT_X_H							0x29&lt;br /&gt;
#define OUT_Y_L							0x2a&lt;br /&gt;
#define OUT_Y_H							0x2b&lt;br /&gt;
#define OUT_Z_L							0x2c&lt;br /&gt;
#define OUT_Z_H							0x2d&lt;br /&gt;
#define INT1_CFG						0x30&lt;br /&gt;
#define INT1_SOURCE						0x31&lt;br /&gt;
#define INT1_THS						0x32&lt;br /&gt;
#define INT1_DURATION					0x33&lt;br /&gt;
#define INT2_CFG						0x34&lt;br /&gt;
#define INT2_SOURCE						0x35&lt;br /&gt;
#define INT2_THS						0x36&lt;br /&gt;
#define INT2_DURATION					0x37&lt;br /&gt;
&lt;br /&gt;
// Control Register bitmasks:&lt;br /&gt;
#define CTRL_REG1_POWERDOWN				0b00000000&lt;br /&gt;
#define CTRL_REG1_3D_DEFAULT			0b00000111&lt;br /&gt;
#define CTRL_REG1_3D_LOPWR_10HZ			0b11000111&lt;br /&gt;
#define CTRL_REG2_DEFAULT				0b00000000&lt;br /&gt;
#define CTRL_REG3_DEFAULT				0b00000000&lt;br /&gt;
#define CTRL_REG4_DEFAULT				0b00000000&lt;br /&gt;
#define CTRL_REG4_BDU_2G				0b10000000&lt;br /&gt;
#define CTRL_REG4_BDU_2G_STSIGN			0b10001000&lt;br /&gt;
#define CTRL_REG4_BDU_BLE_2G			0b11000000&lt;br /&gt;
#define CTRL_REG4_BDU_BLE_2G_STSIGN		0b11001000&lt;br /&gt;
#define CTRL_REG5_DEFAULT				0b00000000&lt;br /&gt;
&lt;br /&gt;
// Read/write address bitmasks:&lt;br /&gt;
#define READ_MASK						0b10000000&lt;br /&gt;
#define READ_AUTOINC_MASK				0b11000000&lt;br /&gt;
#define WRITE_MASK						0b01111111&lt;br /&gt;
&lt;br /&gt;
extern int16_t x_axisa, y_axisa, z_axisa;&lt;br /&gt;
extern double pitch, roll;&lt;br /&gt;
extern double xa, ya, za;&lt;br /&gt;
extern double the, phi;&lt;br /&gt;
&lt;br /&gt;
uint8_t SPI_ACCSENS_readByte(uint8_t regAddr);&lt;br /&gt;
void SPI_ACCSENS_readBytes(uint8_t startAddr, uint8_t *buffer, uint8_t length);&lt;br /&gt;
void SPI_ACCSENS_writeByte(uint8_t regAddr, uint8_t data);&lt;br /&gt;
uint8_t SPI_ACCSENS_getStatus(void);&lt;br /&gt;
&lt;br /&gt;
void SPI_ACCSENS_init(void);&lt;br /&gt;
void SPI_ACCSENS_shutdown(void);&lt;br /&gt;
void SPI_ACCSENS_read(void);&lt;br /&gt;
void SPI_ACCSENS_normalize(void);&lt;br /&gt;
void SPI_ACCSENS_position(void);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
/******************************************************************************&lt;br /&gt;
 * Additional info&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Changelog:&lt;br /&gt;
 * &lt;br /&gt;
 *  ---&amp;gt; changes are documented in the file &amp;quot;RP6ControlACCSENSLib.c&amp;quot;&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
======Library Source======&lt;br /&gt;
Datei: RP6ControlACCSENSLib.c&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;/* ****************************************************************************&lt;br /&gt;
 *                           _______________________&lt;br /&gt;
 *                           \| RP6  ROBOT SYSTEM |/&lt;br /&gt;
 *                            \_-_-_-_-_-_-_-_-_-_/             &amp;gt;&amp;gt;&amp;gt; RP6 CONTROL&lt;br /&gt;
 * ----------------------------------------------------------------------------&lt;br /&gt;
 * ----------------------------- [c]2014 - Dirk -------------------------------&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * File: RP6ControlACCSENSLib.c&lt;br /&gt;
 * Version: 1.0&lt;br /&gt;
 * Target: RP6 CONTROL - ATMEGA32 @16.00MHz&lt;br /&gt;
 *         with optional LC-Display 16x2 chars (CONRAD 190911-62)&lt;br /&gt;
 *         and a 3D Accelerometer Modul (CONRAD 1082387-62) (IC5)&lt;br /&gt;
 * Author(s): Dirk&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Description:&lt;br /&gt;
 * This is my RP6 Control ACCSENS Library. This library may be used to access&lt;br /&gt;
 * the basic functions of the 3D Accelerometer Modul. This RP6 Xtra module may&lt;br /&gt;
 * be placed on the IC5 socket on the RP6 CONTROL M32 instead of a second&lt;br /&gt;
 * EEPROM.&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * THE CHANGELOG CAN BE FOUND AT THE END OF THIS FILE!&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
 &lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Includes:&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6ControlACCSENSLib.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// SPI functions:&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Reads a single register from the 3D Accelerometer&lt;br /&gt;
 * Modul (ACCSENS).&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
uint8_t SPI_ACCSENS_readByte(uint8_t regAddr)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t data;&lt;br /&gt;
	regAddr |= READ_MASK;						// Read byte&lt;br /&gt;
	PORTB &amp;amp;= ~ACC_CS;&lt;br /&gt;
	writeSPI(regAddr);&lt;br /&gt;
	data = readSPI();&lt;br /&gt;
	PORTB |= ACC_CS;&lt;br /&gt;
	return data;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Reads &amp;quot;length&amp;quot; bytes into the buffer &amp;quot;buffer&amp;quot;&lt;br /&gt;
 * from startAddr on. &lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void SPI_ACCSENS_readBytes(uint8_t startAddr, uint8_t *buffer, uint8_t length)&lt;br /&gt;
{&lt;br /&gt;
	startAddr |= READ_AUTOINC_MASK;				// Read byte, auto increment&lt;br /&gt;
	PORTB &amp;amp;= ~ACC_CS;&lt;br /&gt;
	writeSPI(startAddr);&lt;br /&gt;
	readBufferSPI(&amp;amp;buffer[0], length);&lt;br /&gt;
	PORTB |= ACC_CS;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Write a single data byte to the specified sensor&lt;br /&gt;
 * address.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void SPI_ACCSENS_writeByte(uint8_t regAddr, uint8_t data)&lt;br /&gt;
{&lt;br /&gt;
	PORTB &amp;amp;= ~ACC_CS;&lt;br /&gt;
	writeSPI(regAddr);&lt;br /&gt;
	writeSPI(data);&lt;br /&gt;
	PORTB |= ACC_CS;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Returns sensor status register - for checking if&lt;br /&gt;
 * sensor is busy. &lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
uint8_t SPI_ACCSENS_getStatus(void)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t status;&lt;br /&gt;
	PORTB &amp;amp;= ~ACC_CS;&lt;br /&gt;
	writeSPI(STATUS_REG);&lt;br /&gt;
	status = readSPI();&lt;br /&gt;
	PORTB |= ACC_CS;&lt;br /&gt;
	return status;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// 3D accelerometer functions:&lt;br /&gt;
&lt;br /&gt;
int16_t x_axisa, y_axisa, z_axisa;&lt;br /&gt;
double pitch, roll;&lt;br /&gt;
double xa, ya, za;&lt;br /&gt;
double the, phi;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Initializes the sensor. You must call this&lt;br /&gt;
 * function at the beginning of a program, that&lt;br /&gt;
 * uses the 3D Accelerometer Modul.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void SPI_ACCSENS_init(void)&lt;br /&gt;
{&lt;br /&gt;
	// All axes enable, low power, 10Hz output data rate:&lt;br /&gt;
	SPI_ACCSENS_writeByte(CTRL_REG1, CTRL_REG1_3D_LOPWR_10HZ);&lt;br /&gt;
	// No update while reading, +- 2g, self-test minus:&lt;br /&gt;
	SPI_ACCSENS_writeByte(CTRL_REG4, CTRL_REG4_BDU_2G_STSIGN);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Sets the LIS302DLH power-down mode. If you&lt;br /&gt;
 * do not need the sensor, you can save energy&lt;br /&gt;
 * by using the sensor power-down mode.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void SPI_ACCSENS_shutdown(void)&lt;br /&gt;
{&lt;br /&gt;
	// LIS302DLH in power-down mode:&lt;br /&gt;
	SPI_ACCSENS_writeByte(CTRL_REG1, CTRL_REG1_POWERDOWN);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function reads the X-axis, Y-axis and Z-axis&lt;br /&gt;
 * values from the LIS302DLH accelerometer and stores&lt;br /&gt;
 * them in the global variables x_axisa, y_axisa and&lt;br /&gt;
 * z_axisa.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void SPI_ACCSENS_read(void)&lt;br /&gt;
{&lt;br /&gt;
#ifndef EXP_STACK_1&lt;br /&gt;
	// Default sensor position (M32 located on the RP6 rear stack):&lt;br /&gt;
	// xb = -y:&lt;br /&gt;
	x_axisa = SPI_ACCSENS_readByte(OUT_Y_L) | (SPI_ACCSENS_readByte(OUT_Y_H) &amp;lt;&amp;lt; 8);&lt;br /&gt;
	x_axisa *= -1;&lt;br /&gt;
	// yb = -x:&lt;br /&gt;
	y_axisa = SPI_ACCSENS_readByte(OUT_X_L) | (SPI_ACCSENS_readByte(OUT_X_H) &amp;lt;&amp;lt; 8);&lt;br /&gt;
	y_axisa *= -1;&lt;br /&gt;
	// zb = z:&lt;br /&gt;
	z_axisa = SPI_ACCSENS_readByte(OUT_Z_L) | (SPI_ACCSENS_readByte(OUT_Z_H) &amp;lt;&amp;lt; 8);&lt;br /&gt;
#else&lt;br /&gt;
	// Other sensor position (M32 located on the RP6 front stack):&lt;br /&gt;
	// xb = y:&lt;br /&gt;
	x_axisa = SPI_ACCSENS_readByte(OUT_Y_L) | (SPI_ACCSENS_readByte(OUT_Y_H) &amp;lt;&amp;lt; 8);&lt;br /&gt;
	// yb = x:&lt;br /&gt;
	y_axisa = SPI_ACCSENS_readByte(OUT_X_L) | (SPI_ACCSENS_readByte(OUT_X_H) &amp;lt;&amp;lt; 8);&lt;br /&gt;
	// zb = z:&lt;br /&gt;
	z_axisa = SPI_ACCSENS_readByte(OUT_Z_L) | (SPI_ACCSENS_readByte(OUT_Z_H) &amp;lt;&amp;lt; 8);&lt;br /&gt;
#endif&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function limits and normalizes the x-axisa,&lt;br /&gt;
 * y-axisa and z-axisa values read from the LIS302DLH&lt;br /&gt;
 * accelerometer with the function SPI_ACCSENS_read() and&lt;br /&gt;
 * stores them in the global double variables xa, ya and&lt;br /&gt;
 * za.&lt;br /&gt;
 * It also calculates the position in space in form of the&lt;br /&gt;
 * tilt angles (the = pitch, phi = roll) and stores them&lt;br /&gt;
 * in the global double variables the and phi.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void SPI_ACCSENS_normalize(void)&lt;br /&gt;
{&lt;br /&gt;
	// Limit raw values:&lt;br /&gt;
	if (x_axisa &amp;lt; MIN_X_A) x_axisa = MIN_X_A;&lt;br /&gt;
	if (x_axisa &amp;gt; MAX_X_A) x_axisa = MAX_X_A;&lt;br /&gt;
	if (y_axisa &amp;lt; MIN_Y_A) y_axisa = MIN_Y_A;&lt;br /&gt;
	if (y_axisa &amp;gt; MAX_Y_A) y_axisa = MAX_Y_A;&lt;br /&gt;
	if (z_axisa &amp;lt; MIN_Z_A) z_axisa = MIN_Z_A;&lt;br /&gt;
	if (z_axisa &amp;gt; MAX_Z_A) z_axisa = MAX_Z_A;&lt;br /&gt;
	xa = (double) x_axisa / 10000.0;&lt;br /&gt;
	ya = (double) y_axisa / 10000.0;&lt;br /&gt;
	za = (double) z_axisa / 10000.0;&lt;br /&gt;
	// Calculate Pitch and Roll:&lt;br /&gt;
	phi = asin(xa);								// Calculate the and phi&lt;br /&gt;
	the = asin(ya / cos(the));					//  from the raw values&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function calculates the position in space by&lt;br /&gt;
 * using the the and phi values (see function&lt;br /&gt;
 * SPI_ACCSENS_normalize()!). It stores the position&lt;br /&gt;
 * in the global double variables pitch and roll. &lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void SPI_ACCSENS_position(void)&lt;br /&gt;
{&lt;br /&gt;
	pitch = the * 180 / M_PI + OFFSET_PITCH_A;&lt;br /&gt;
	roll = phi * 180 / M_PI + OFFSET_ROLL_A;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/******************************************************************************&lt;br /&gt;
 * Additional info&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Changelog:&lt;br /&gt;
 * - v. 1.0 (initial release) 04.04.2014 by Dirk&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Erklärung&lt;br /&gt;
&lt;br /&gt;
======Demo======&lt;br /&gt;
makefile:&lt;br /&gt;
&amp;lt;pre&amp;gt;...&lt;br /&gt;
TARGET = RP6Control_01_ACCSENS&lt;br /&gt;
...&lt;br /&gt;
SRC += $(RP6_LIB_PATH)/RP6control/RP6ControlLib.c&lt;br /&gt;
SRC += $(RP6_LIB_PATH)/RP6common/RP6uart.c&lt;br /&gt;
SRC += $(RP6_LIB_PATH)/RP6control/RP6ControlACCSENSLib.c&lt;br /&gt;
...&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Datei: RP6Control_01_ACCSENS.c&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;// Uncommented Version of RP6Control_01_ACCSENS.c&lt;br /&gt;
// written by Dirk&lt;br /&gt;
// ------------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6ControlACCSENSLib.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void writeDouble(double number, uint8_t width, uint8_t prec)&lt;br /&gt;
{char buffer[width + 1];&lt;br /&gt;
	dtostrf(number, width, prec, &amp;amp;buffer[0]);&lt;br /&gt;
	writeString(&amp;amp;buffer[0]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void writeDoubleLCD(double number, uint8_t width, uint8_t prec)&lt;br /&gt;
{char buffer[width + 1];&lt;br /&gt;
	dtostrf(number, width, prec, &amp;amp;buffer[0]);&lt;br /&gt;
	writeStringLCD(&amp;amp;buffer[0]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
	initRP6Control();&lt;br /&gt;
&lt;br /&gt;
	writeString_P(&amp;quot;\n\nRP6Control SPI ACCSENS Test Program!\n&amp;quot;); &lt;br /&gt;
	setLEDs(0b1111);&lt;br /&gt;
	mSleep(50);&lt;br /&gt;
	initLCD(); &lt;br /&gt;
	showScreenLCD(&amp;quot;################&amp;quot;, &amp;quot;################&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
	showScreenLCD(&amp;quot;  SPI ACCSENS&amp;quot;, &amp;quot;  Test Program&amp;quot;);&lt;br /&gt;
	mSleep(1000);&lt;br /&gt;
	setLEDs(0b0000);&lt;br /&gt;
&lt;br /&gt;
	SPI_ACCSENS_init();&lt;br /&gt;
&lt;br /&gt;
	uint8_t whoami = SPI_ACCSENS_readByte(WHO_AM_I);&lt;br /&gt;
	writeString_P(&amp;quot;\nWHO AM I: &amp;quot;);&lt;br /&gt;
	writeInteger(whoami, HEX);&lt;br /&gt;
	writeChar('\n');&lt;br /&gt;
	mSleep(2000);&lt;br /&gt;
	&lt;br /&gt;
	startStopwatch1();&lt;br /&gt;
&lt;br /&gt;
	while(true) &lt;br /&gt;
	{&lt;br /&gt;
		if(getStopwatch1() &amp;gt; 1000)&lt;br /&gt;
		{&lt;br /&gt;
			SPI_ACCSENS_read();&lt;br /&gt;
			writeString_P(&amp;quot;\n3D Accelerometer SENSOR -&amp;gt;\n&amp;quot;);&lt;br /&gt;
			writeString_P(&amp;quot;X-axis: &amp;quot;);&lt;br /&gt;
			writeInteger(x_axisa, DEC);&lt;br /&gt;
			writeChar('\n');&lt;br /&gt;
			writeString_P(&amp;quot;Y-axis: &amp;quot;);&lt;br /&gt;
			writeInteger(y_axisa, DEC);&lt;br /&gt;
			writeChar('\n');&lt;br /&gt;
			writeString_P(&amp;quot;Z-axis: &amp;quot;);&lt;br /&gt;
			writeInteger(z_axisa, DEC);&lt;br /&gt;
			writeChar('\n');&lt;br /&gt;
			SPI_ACCSENS_normalize();&lt;br /&gt;
			SPI_ACCSENS_position();&lt;br /&gt;
			writeString_P(&amp;quot;POSITION: \n&amp;quot;);&lt;br /&gt;
			writeString_P(&amp;quot;  Pitch [°]: &amp;quot;);&lt;br /&gt;
			writeDouble(pitch, 6, 1);&lt;br /&gt;
			writeChar('\n');&lt;br /&gt;
			writeString_P(&amp;quot;  Roll [°]:  &amp;quot;);&lt;br /&gt;
			writeDouble(roll, 6, 1);&lt;br /&gt;
			writeChar('\n');&lt;br /&gt;
			setCursorPosLCD(0, 0);&lt;br /&gt;
			writeStringLCD_P(&amp;quot;P&amp;quot;);&lt;br /&gt;
			writeDoubleLCD(pitch, 6, 1);&lt;br /&gt;
			writeStringLCD_P(&amp;quot; &amp;quot;);&lt;br /&gt;
			setCursorPosLCD(0, 8);&lt;br /&gt;
			writeStringLCD_P(&amp;quot;R&amp;quot;);&lt;br /&gt;
			writeDoubleLCD(roll, 6, 1);&lt;br /&gt;
			writeStringLCD_P(&amp;quot; &amp;quot;);&lt;br /&gt;
			setCursorPosLCD(1, 0);&lt;br /&gt;
			writeStringLCD_P(&amp;quot;X&amp;quot;);&lt;br /&gt;
			writeIntegerLCD(x_axisa, DEC);&lt;br /&gt;
			writeStringLCD_P(&amp;quot;   &amp;quot;);&lt;br /&gt;
			setCursorPosLCD(1, 5);&lt;br /&gt;
			writeStringLCD_P(&amp;quot;Y&amp;quot;);&lt;br /&gt;
			writeIntegerLCD(y_axisa, DEC);&lt;br /&gt;
			writeStringLCD_P(&amp;quot;   &amp;quot;);&lt;br /&gt;
			setCursorPosLCD(1, 10);&lt;br /&gt;
			writeStringLCD_P(&amp;quot;Z&amp;quot;);&lt;br /&gt;
			writeIntegerLCD(z_axisa, DEC);&lt;br /&gt;
			writeStringLCD_P(&amp;quot;    &amp;quot;);&lt;br /&gt;
			mSleep(2000);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Erklärung&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Erfahrungsberichte==&lt;br /&gt;
&lt;br /&gt;
...in Arbeit...(kann aber gerne ergänzt werden)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Siehe auch==&lt;br /&gt;
* [[RP6v2]]&lt;br /&gt;
* [[RP6]]&lt;br /&gt;
* [[RP6 - Programmierung]]&lt;br /&gt;
* [[RP6 Kamera - Mitmach-Projekt]]&lt;br /&gt;
* [[RP6v2 I2C-Portexpander]]&lt;br /&gt;
* [[RP6v2 USB-RS232-Adapter]]&lt;br /&gt;
* [[RP6v2 Orientierung]]&lt;br /&gt;
* [[RP6 Multi IO Projekt]]&lt;br /&gt;
* [[RP6 Multi IO Projekt - Software]]&lt;br /&gt;
* [[Induktive_Ladestation_f%C3%BCr_den_RP6|Induktive Ladestation für den RP6]]&lt;br /&gt;
* [[IR-bake_f%C3%BCr_den_RP6|IR-bake für den RP6]]&lt;br /&gt;
* [[CCRP5]]&lt;br /&gt;
* [[Yeti]]&lt;br /&gt;
* [[Asuro]]&lt;br /&gt;
* [[C't-Bot]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Weblinks==&lt;br /&gt;
'''Siehe auch die Weblinks im [http://www.rn-wissen.de/index.php/RP6v2#Weblinks RP6v2] und im [http://www.rn-wissen.de/index.php/RP6#Weblinks RP6] Artikel!'''&lt;br /&gt;
&lt;br /&gt;
* [http://www.conrad.de/ce/de/product/1082384/Arexx-RP6-Sensor-Board-RP6-JM03-61 RP6 Sensor Board bei CONRAD]&lt;br /&gt;
* JM3 Engeneering: [http://www.jm3-engineering.com/rp6.htm RP6 Roboter Erweiterung]&lt;br /&gt;
* Ankündigung einer Sensorerweiterungsplatine für die RP6v2 M256 WiFi im [http://www.roboternetz.de/community/threads/63595-Neue-Hardware-f%C3%BCr-RP6%28v2%29?p=590129&amp;amp;viewfull=1#post590129 Roboternetz RP6 Forum]&lt;br /&gt;
* Erfahrungsbericht zum Sensor Board im [http://www.arexx.com/forum/viewtopic.php?f=19&amp;amp;t=2498 AREXX Support Forum] und im [http://www.roboternetz.de/community/threads/64414-RP6-Sensor-Board-Erster-Eindruck Roboternetz RP6 Forum]&lt;br /&gt;
* Erfahrungsbericht zum I2C GPS Empfänger im [http://www.arexx.com/forum/viewtopic.php?f=19&amp;amp;t=2509 AREXX Support Forum]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Kategorie:Robotikeinstieg]]	 &lt;br /&gt;
[[Kategorie:Praxis]]&lt;br /&gt;
&lt;br /&gt;
==Autoren==&lt;br /&gt;
--[[Benutzer:Dirk_NO2|Dirk]] 17:27, 8. Jul 2014 (CET)&lt;/div&gt;</summary>
		<author><name>Dirk NO2</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=RP6_Sensor_Board_und_Xtra_Module&amp;diff=24817</id>
		<title>RP6 Sensor Board und Xtra Module</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=RP6_Sensor_Board_und_Xtra_Module&amp;diff=24817"/>
				<updated>2014-07-08T15:26:14Z</updated>
		
		<summary type="html">&lt;p&gt;Dirk NO2: /* Autoren */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Bild:RP6_Sensor_Board.jpg|Das RP6 Sensor Board|right|500px]]&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_Xtra_module.JPG|RP6 Xtra module|right|500px]]&lt;br /&gt;
==Was bisher geschah==&lt;br /&gt;
'''Siehe auch &amp;quot;Was bisher geschah&amp;quot; im [http://www.rn-wissen.de/index.php/RP6v2#Was_bisher_geschah RP6v2] und im [http://www.rn-wissen.de/index.php/RP6#Was_bisher_geschah RP6] Artikel!'''&lt;br /&gt;
&lt;br /&gt;
Mit, 27. Nov 2013 - Ankündigung einer Sensorerweiterungsplatine, die an die RP6v2-M256-WIFI angeschlossen werden kann&amp;lt;br/&amp;gt;&lt;br /&gt;
Sam, 22. Feb 2014 - Auslieferungsbeginn des RP6 Sensor Boards, des I2C GPS Empfängers, des 3D Accelerometer Moduls und des Gyro Moduls&amp;lt;br/&amp;gt;&lt;br /&gt;
Mon, 17. Mär 2014 - Das RP6 Sensor Board ist &amp;quot;nicht lieferbar&amp;quot;, neuer Liefertermin angekündigt für den 12.06.2014 (!?)&amp;lt;br/&amp;gt;&lt;br /&gt;
Die, 25. Mär 2014 - Das RP6 Sensor Board ist wieder &amp;quot;sofort lieferbar&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Allgemein==&lt;br /&gt;
Dieser Artikel beschreibt die Grundlagen und Programmierung des RP6 Sensor Boards und der RP6 Xtra Module. Dieses Erweiterungs-Modul und die Xtra Module sind Teile des RP6-Systems, das in den RN-Wissen-Artikeln [[RP6]], [[RP6v2]] und [[RP6_-_Programmierung|RP6 - Programmierung]] ausführlich beschrieben wird. Ausgegliedert aus den &amp;quot;Haupt-Artikeln&amp;quot; habe ich diese Module, da sie m.E. zu einer neuen &amp;quot;Ära&amp;quot; des RP6-Systems gehören:&lt;br /&gt;
&lt;br /&gt;
Sie wurden nicht mehr von '''[[Benutzer:SlyD|SlyD]] (Dominik S. Herwald)''' in Zusammenarbeit mit '''[http://www.arexx.com/ AREXX]''' entwickelt, sondern nun von '''[http://jm3-engineering.com/ JM3 Engeneering] (Dipl.-Ing. Jürgen Maisel)'''. Ab Februar 2014 waren dann das '''RP6 Sensor Board RP6-JM03-61''' ([http://www.conrad.de/ce/de/product/1082384/Arexx-RP6-Sensor-Board-RP6-JM03-61 1082384]) und die drei RP6 Xtra Module '''I2C GPS Empfänger JM3-GPS''' ([http://www.conrad.de/ce/de/product/1082385/Arexx-IC-GPS-Empfaenger-JM3-GPS 1082385]), '''Gyro Modul JM3-GYRO''' ([http://www.conrad.de/ce/de/product/1082386/Arexx-Gyro-Modul-JM3-GYRO 1082386]) und '''3D Accelerometer Modul JM3-3DA''' ([http://www.conrad.de/ce/de/product/1082387/Arexx-3D-Accelerometer-Modul-JM3-3DA 1082387]) bei CONRAD lieferbar. Einen ersten Eindruck vom Sensor Board kann man im RoboterNetz und AREXX Support Forum bekommen,- siehe unter [[RP6_Sensor_Board_und_Xtra_Module#Weblinks|Weblinks]]!&lt;br /&gt;
&lt;br /&gt;
===RP6 Sensor Board===&lt;br /&gt;
Das [[RP6_Sensor_Board_und_Xtra_Module#RP6_Sensor_Board_2|RP6 Sensor Board]] gehört zu den &amp;quot;Erweiterungs-Modulen&amp;quot; des RP6-Systems. '''Andere &amp;quot;Erweiterungs-Module&amp;quot; werden im [[RP6v2#Erweiterungs-Module|RP6v2]] und im [[RP6#Erweiterungs-Module|RP6]] Artikel beschrieben!'''&lt;br /&gt;
&lt;br /&gt;
Das ''RP6 Sensor Board'' ist das erste &amp;quot;Erweiterungs-Modul&amp;quot;, das nicht über einen eigenen Microprozessor verfügt,- es ist also ein ''passives Modul'', das von einem Microprozessor-System (z.B. RP6v2, M32, M128, M256 Wifi) angesteuert werden muss. Es ist ebenfalls das erste Modul, das nicht mehr über die rautenförmige Einbuchtung an der Vorderkante verfügt, sondern komplett rechteckig ist. Damit passt es (montiert auf den Standard-Abstandbolzen) nur auf den vorderen Platinenstapel 1 des RP6.&lt;br /&gt;
&lt;br /&gt;
===RP6 Xtra Module===&lt;br /&gt;
Die [[RP6_Sensor_Board_und_Xtra_Module#RP6_Xtra_Module_2|RP6 Xtra Module]] gehören zu den &amp;quot;Zubehör- und Ersatzteilen&amp;quot; des RP6-Systems. '''Über die weiteren &amp;quot;Zubehör- und Ersatzteile&amp;quot; zum RP6 informiert der entsprechende Abschnitt im [[RP6v2#Zubeh.C3.B6r_und_Ersatzteile|RP6v2]] und im [[RP6#Zubehör und Ersatzteile|RP6]] Artikel!'''&lt;br /&gt;
&lt;br /&gt;
Die ''RP6 Xtra Module'' unterscheiden sich von den weiteren &amp;quot;Zubehör- und Ersatzteilen&amp;quot; dadurch, dass sie selbstständige Sensor-Platinen sind, die ideal zum RP6-System passen, aber auch mit anderen Microcontroller-Plattformen nutzbar sind.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==RP6 Sensor Board==&lt;br /&gt;
Das RP6 Sensor Board RP6-JM03-61 ([http://www.conrad.de/ce/de/product/1082384/Arexx-RP6-Sensor-Board-RP6-JM03-61 1082384]) wurde am 27.11.2013 von [[Benutzer:SlyD|SlyD]] angekündigt (siehe Weblink!).&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_Sensor_Board.jpg|Das RP6 Sensor Board]]&lt;br /&gt;
&lt;br /&gt;
===Beschreibung===&lt;br /&gt;
(Laut Online-Katalog der Firma CONRAD!)&lt;br /&gt;
&lt;br /&gt;
''&amp;quot;Das RP6 Sensor Board erweitert die Möglichkeiten aller RP6 Roboter um wesentliche Sensorsignale für Robotik-Anwendungen wie zum Beispiel Dreharten (Yaw-Gyro), Kipp- und Neigewinkel, Kompassrichtung oder aber auch Zeit und Datum.&lt;br /&gt;
Sie können einfach mit zusätzlichen Sharp Sensoren Abstände genau messen, z.B. für autonome Fahrrouten oder falls der Sensor nach unten gerichtet ist, kann er Treppenstufen oder ähnliches entdecken. Außerdem gibt es die Möglichkeit z.B. die Sharp Sensoren ein- bzw. auszuschalten um Strom zu sparen. Zusätzlich können bis zu 8 Servos angesteuert werden um z.B. einen Roboterarm zu bewegen, der auch mechanisch einfach zu montieren ist. Um die Möglichkeiten des RP6 Sensor Boards komplett ausnutzen zu können, wird ein RP6V2 und RP6Wifi Control Board empfohlen. Die ermöglicht den Roboter über Wifi fernzusteuern oder Sensordaten auf dem Kommandozentrum (PC) z.B Kompassdaten, Temperatur oder Kipp- und Neigewinkel anzeigen zu lassen.&amp;quot;''&lt;br /&gt;
&lt;br /&gt;
'''Ausstattung'''&lt;br /&gt;
* Magnetometer- und Accelerometer für Kompassfunktion&lt;br /&gt;
* Gyro Sensor (Yaw)&lt;br /&gt;
* Sharp-Sensor Schnittstelle&lt;br /&gt;
* LED Scheinwerfer&lt;br /&gt;
* LED Treiber mit Smart Funktionen&lt;br /&gt;
* I²C Bus mit max. 400 kHz Übertragungsrate; Hot Swap I²C-Bus Buffer&lt;br /&gt;
* Taster mit LED&lt;br /&gt;
* Echtzeit-Uhr RTC&lt;br /&gt;
* Backupbatterie (Aufladung während des Betriebs)&lt;br /&gt;
* Expansion Port z.B. für GPS-I²C Bus Modul&lt;br /&gt;
* 8 Servo-Ausgänge mit eigenem Schaltregler&lt;br /&gt;
* 8 PWM Ausgänge&lt;br /&gt;
* 5 LED Ausgänge und 2 Digital-I/O Ausgänge.&lt;br /&gt;
&lt;br /&gt;
'''Lieferumfang'''&lt;br /&gt;
* RP6 Sensor Board&lt;br /&gt;
* Montage-Kit&lt;br /&gt;
* Kabel&lt;br /&gt;
* Anleitung und CD mit Dokumentation.&lt;br /&gt;
&lt;br /&gt;
====Blockschaltbild====&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_Sensor_Board_BSP.png|RP6 Sensor Board Blockschaltbild]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Technische Daten===&lt;br /&gt;
{|  {{Blauetabelle}} &lt;br /&gt;
|'''Mikrocontroller:'''&lt;br /&gt;
|kein&lt;br /&gt;
|-&lt;br /&gt;
|'''Speicher:'''&lt;br /&gt;
|kein&amp;lt;br/&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|'''Programmierung:'''&lt;br /&gt;
|C++ (GCC, u.a.) über externes µC-System&lt;br /&gt;
|-&lt;br /&gt;
|'''Vorhandene Sensoren:'''&lt;br /&gt;
|Temperatur, 3D Magnetfeld (Kompass), 3D Beschleunigung, Yaw-Gyro&amp;lt;br/&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|'''Vorhandene Aktoren:'''&lt;br /&gt;
|LED Controller (2 LEDs on board, 5 freie LED Ports), Status LED,&amp;lt;br/&amp;gt;Button, Servo (PWM) Controller für 8 Servos und 8 PWM-Kanäle,&amp;lt;br/&amp;gt;Real Time Clock (RTC), 2 freie I/O Ports&lt;br /&gt;
|-&lt;br /&gt;
|'''Abmessungen:'''&lt;br /&gt;
|(L &amp;amp;times; B &amp;amp;times; H) 112 &amp;amp;times; 90 &amp;amp;times; 19 mm&amp;lt;br/&amp;gt;(B + 5 mm durch Scheinwerfer vorn)&lt;br /&gt;
|-&lt;br /&gt;
|'''Ausführung:'''&lt;br /&gt;
|Fertig aufgebautes Erweiterungsmodul&lt;br /&gt;
|-&lt;br /&gt;
|'''Stromversorgung:'''&lt;br /&gt;
|6 AA NiMH Akkus (über die RP6v2 Base)&amp;lt;br/&amp;gt;und optionaler Zusatzakku 7,2..10 V für Servo Power&lt;br /&gt;
|-&lt;br /&gt;
|'''Hersteller:'''&lt;br /&gt;
|Arexx Niederlande&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Umbau-Optionen===&lt;br /&gt;
Hier soll beschrieben werden, welche Umbau-Optionen es für das RP6 Sensor Board gibt. Im Text gibt es Verweise auf den Schaltplan des RP6 Sensor Boards (RP6_Sensor_Board_Rev2_Schema.pdf) in der Form: (SP2: Bauteil). Dies bedeutet, dass man das Bauteil auf Blatt 2 des Schaltplans finden kann. Beispielhaft sind im folgenden Text Bestell-Nummern der Firma [http://www.conrad.de/ce/ CONRAD] genannt. Natürlich kann man die Teile auch bei anderen Versendern beziehen.&lt;br /&gt;
&lt;br /&gt;
====USRBUS- und XBUS-Wannenstecker====&lt;br /&gt;
Der zweite Wannenstecker für den XBUS (SP3: K14) und USRBUS (SP3: K16) kann nachbestückt werden.&lt;br /&gt;
Man braucht dazu: &lt;br /&gt;
* 2 Wannenstecker 2x5-polig gerade RM 2,54mm (CONRAD [http://www.conrad.de/ce/de/product/741648/Stiftleiste-Print-Montage-gerade-Rastermass-254-mm-Pole-2-x-5-10120554-BKL-Electronic-Inhalt-1-St/ 741648])&lt;br /&gt;
Die Wannenstecker lötet man auf die eingezeichneten Positionen.&lt;br /&gt;
&lt;br /&gt;
'''USRBUS-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''USRBUS''' || '''Sensor Board-Funktion''' || '''Verwendung''' || '''I/O'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Y1 || &amp;quot;ADC0&amp;quot; || SHARP vorn || I&lt;br /&gt;
|-&lt;br /&gt;
| 2 || Y2 || &amp;quot;ADC1&amp;quot; || Yaw-Gyro || I&lt;br /&gt;
|-&lt;br /&gt;
| 3 || Y3 || PWR || Power für&amp;lt;br/&amp;gt;SHARPs, CAM_IF,&amp;lt;br/&amp;gt;I2C-MODULE || O&lt;br /&gt;
|-&lt;br /&gt;
| 4 || Y4 || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 5 || Y5 || &amp;quot;ADC4&amp;quot; || SHARP hinten ||I&lt;br /&gt;
|-&lt;br /&gt;
| 6..14 || Y6..Y14 || || keine ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
'''XBUS-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''XBUS''' || '''M256-Port''' ||'''M256-Funktion''' || '''Sensor Board-Funktion''' || '''Jumper''' || '''Verwendung''' || '''I/O'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || GND || || GND || GND || || ||&lt;br /&gt;
|-&lt;br /&gt;
| 2 || GND || || GND || GND || || ||&lt;br /&gt;
|-&lt;br /&gt;
| 3 || VDD || || VDD|| VDD_1 || || VDD +5V ||&lt;br /&gt;
|-&lt;br /&gt;
| 4 || +UB || || +UB || VSS_1 || || CAM_IF Power ||&lt;br /&gt;
|-&lt;br /&gt;
| 5 || VDD || || VDD || VDD_1 || || VDD +5V ||&lt;br /&gt;
|-&lt;br /&gt;
| 6 || +UB || || +UB || VSS_1 || || CAM_IF Power ||&lt;br /&gt;
|-&lt;br /&gt;
| 7 || INTU || PJ4 || PCINT13 || INTU || || keine || I&lt;br /&gt;
|-&lt;br /&gt;
| 8 || INT1 || PJ3 || PCINT12 || INT1 || 3 || LSM303DLHC: INT1 || I&lt;br /&gt;
|-&lt;br /&gt;
| 9 || INT3 || PJ5 || PCINT14 || INT3 || 2&amp;lt;br/&amp;gt;5 || DS1339: SQW/INT_N&amp;lt;br/&amp;gt;LSM303DLHC: INT2 || I&amp;lt;br/&amp;gt;I&lt;br /&gt;
|-&lt;br /&gt;
| 10 || SCL || PD0 || SCL || SCL_M || || I2C-Bus || O&lt;br /&gt;
|-&lt;br /&gt;
| 11 || INT2 || PJ6 || PCINT15 || INT2 || 4 || MAX7311: INT_N || I&lt;br /&gt;
|-&lt;br /&gt;
| 12 || SDA || PD1 || SDA || SDA_M || || I2C-Bus || I/O&lt;br /&gt;
|-&lt;br /&gt;
| 13 || MRESET || || MRESET || MRESET || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 14 || GND || || GND || GND || || ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====I/O-Patchfield_1====&lt;br /&gt;
Dieses 2x 5-polige &amp;quot;Patchfield_1&amp;quot; (SP3: K8), beschriftet mit &amp;quot;I/O&amp;quot; liegt neben dem Wannenstecker I/O und weist dieselbe Belegung auf. Möchte man auf dem Sensor Board Verbindungen über den Wannenstecker I/O zu einer angeschlossenen Microprozessor-Platine herstellen, dann kann man auf das &amp;quot;Patchfield_1&amp;quot; eine Stiftleiste löten.&lt;br /&gt;
Man braucht dazu: &lt;br /&gt;
* 2-reihige Stiftleiste RM 2,54mm (z.B. 2x40-polig [http://www.conrad.de/ce/de/product/741306/Doppelreihige-Stiftleiste-RM-254-gerade-Pole-2-x-40-10120173-BKL-Electronic-Inhalt-1-St 741306]) &lt;br /&gt;
Man trennt von der 2-reihigen Stiftleiste 2x5 Kontakte ab und lötet sie auf die Lötpunkte &amp;quot;I/O&amp;quot;. Zuvor muss man u.U. Lötzinnreste aus den Lötpunkten mit Entlötlitze bzw. Entlötsaugpumpe entfernen.&lt;br /&gt;
&lt;br /&gt;
'''Stecker I/O an M256 IO_PWM/T0/T1:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''M256-Port''' ||'''M256-Funktion''' || '''Sensor Board-Funktion''' || '''Verwendung''' || '''I/O'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || PD4 || ICP1 || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 2 || || GND || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 3 || PD6 || T1 || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 4 || PB7 || OC0A || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 5 || PG5 || OC0B || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 6 || PD7 || T0 || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 7 || PB5 || OC1A || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 8 || PK5 || ADC13 || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 9 || PB6 || OC1B || &amp;quot;PD5&amp;quot; || I2C Bus Buffer Enable || O&lt;br /&gt;
|-&lt;br /&gt;
| 10 || || VDD || || keine ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====ADC-Patchfield_2====&lt;br /&gt;
Dieses 2x 5-polige &amp;quot;Patchfield_2&amp;quot; (SP3: K9), beschriftet mit &amp;quot;ADC&amp;quot; liegt neben dem Wannenstecker ADC und weist dieselbe Belegung auf. Möchte man auf dem Sensor Board Verbindungen über den Wannenstecker ADC zu einer angeschlossenen Microprozessor-Platine herstellen, dann kann man auf das &amp;quot;Patchfield_2&amp;quot; eine Stiftleiste löten.&lt;br /&gt;
Man braucht dazu: &lt;br /&gt;
* 2-reihige Stiftleiste RM 2,54mm (z.B. 2x40-polig [http://www.conrad.de/ce/de/product/741306/Doppelreihige-Stiftleiste-RM-254-gerade-Pole-2-x-40-10120173-BKL-Electronic-Inhalt-1-St 741306]) &lt;br /&gt;
Man trennt von der 2-reihigen Stiftleiste 2x5 Kontakte ab und lötet sie auf die Lötpunkte &amp;quot;ADC&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
'''Stecker ADC an M256 ADC_IO2/CMP:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''M256-Port''' ||'''M256-Funktion''' || '''Sensor Board-Funktion''' || '''Jumper''' || '''Verwendung''' || '''I/O'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || PK0 || ADC8 || || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 2 || || GND || || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 3 || PK1 || ADC9 || &amp;quot;ADC4&amp;quot; || 6 || SHARP hinten || I&lt;br /&gt;
|-&lt;br /&gt;
| 4 || PE3 || OC3A/AIN1 || || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 5 || PK2 || ADC10 || || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 6 || || GND || || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 7 || PK3 || ADC11 || || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 8 || PE2 || XCK0/AIN0 || || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 9 || PK4 || ADC12 || || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 10 || || VDD || || || keine ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Anschluss-Optionen===&lt;br /&gt;
Hier soll beschrieben werden, welche Anschluss-Optionen es für das RP6 Sensor Board gibt. In erster Linie geht es dabei um die Belegung der vorhandenen Stecker bzw. Stiftleisten.&lt;br /&gt;
&lt;br /&gt;
Allgemein kann man Anschlüsse an Stiftleisten mit entsprechenden Steckbuchsen erreichen. Solche Steckbuchsen sind z.B. bei ELV erhältlich:&lt;br /&gt;
* Steckbuchse, 2-polig, RM 2,54mm ([http://www.elv.de/steckbuchse-2-polig.html ELV 68-016635])&lt;br /&gt;
* Steckbuchse, 3-polig, RM 2,54mm ([http://www.elv.de/steckbuchse-3-polig.html ELV 68-022503])&lt;br /&gt;
* Steckbuchse, 5-polig, RM 2,54mm ([http://www.elv.de/steckbuchse-5-polig.html ELV 68-023073])&lt;br /&gt;
Die Crimpkontakte dieser Steckbuchse werden an Litzen angequetscht (oder angelötet) und zum entsprechenden Sensor bzw. Aktor geführt. &lt;br /&gt;
&lt;br /&gt;
====I2C-MODULE====&lt;br /&gt;
Der I2C-MODULE Anschluss (SP1: M1) auf dem Sensor Board besteht aus einer 9-poligen Präzisions-Buchsenleiste RM 2,54mm (z.B. [http://www.conrad.de/ce/de/product/741360/Praezisions-Buchsenleiste-RM-254-gerade-Pole-1-x-20-10120832-BKL-Electronic-Inhalt-1-St 741360]). Wenn man eigene I2C-Module hier anschliessen will, braucht man zur Kontaktierung:&lt;br /&gt;
* Präzisions-Stiftleiste, 9-polig, RM 2,54mm (z.B. [http://www.conrad.de/ce/de/product/741307/Praezisions-Stiftleiste-RM-254-gerade-Pole-1-x-20-10120536-BKL-Electronic-Inhalt-1-St 741307])&lt;br /&gt;
&lt;br /&gt;
'''I2C-MODULE-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''Sensor Board&amp;lt;br/&amp;gt;-Funktion (M1)''' || '''Verwendung''' || '''I/O''' |||| [[RP6_Sensor_Board_und_Xtra_Module#I2C_GPS_Empf.C3.A4nger_JM3-GPS|'''I2C GPS Empfänger]]&amp;lt;br/&amp;gt;-Funktion (K1)'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || VCC || +5V || |||| VCC_1&lt;br /&gt;
|-&lt;br /&gt;
| 2 || SCLOUT || Buffered I2C-Bus || O |||| SCL/SCK&lt;br /&gt;
|-&lt;br /&gt;
| 3 || SDAOUT || Buffered I2C-Bus || I/O |||| SDA/MOSI&lt;br /&gt;
|-&lt;br /&gt;
| 4 || NC || keine || ||||&lt;br /&gt;
|-&lt;br /&gt;
| 5 || I/O1 || Status LED || O ||||&lt;br /&gt;
|-&lt;br /&gt;
| 6 || I/O2 || Taster || I ||||&lt;br /&gt;
|-&lt;br /&gt;
| 7 || NC || keine || ||||&lt;br /&gt;
|-&lt;br /&gt;
| 8 || GND || GND (geschaltet!) || |||| GND&lt;br /&gt;
|-&lt;br /&gt;
| 9 || GND || GND (geschaltet!) || |||| GND&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====CAM_IF====&lt;br /&gt;
Der CAM_IF Anschluss (SP1: K28) ist eine 2x 3-polige Stiftleiste mit der folgenden Belegung:&lt;br /&gt;
&lt;br /&gt;
'''CAM_IF-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''Sensor Board&amp;lt;br/&amp;gt;-Funktion (K28)''' || '''Verwendung''' || '''I/O'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || GND || GND (geschaltet!) ||&lt;br /&gt;
|-&lt;br /&gt;
| 2 || VSS_1 || +7,2..10V (RP6: +UB) ||&lt;br /&gt;
|-&lt;br /&gt;
| 3 || SCLOUT || Buffered I2C-Bus || O&lt;br /&gt;
|-&lt;br /&gt;
| 4 || SDAOUT || Buffered I2C-Bus || I/O&lt;br /&gt;
|-&lt;br /&gt;
| 5 || SCL_M || I2C-Bus || O&lt;br /&gt;
|-&lt;br /&gt;
| 6 || SDA_M || I2C-Bus || I/O&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====IO_EXT====&lt;br /&gt;
Der IO_EXT Anschluss (SP1: K19) ist eine 2x 2-polige Stiftleiste mit der folgenden Belegung:&lt;br /&gt;
&lt;br /&gt;
'''IO_EXT-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''Sensor Board&amp;lt;br/&amp;gt;-Funktion (K19)''' || '''Verwendung''' || '''I/O'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || MAX7311: I/O1.2 || freier I/O Port || I/O&lt;br /&gt;
|-&lt;br /&gt;
| 2 || GND || ||&lt;br /&gt;
|-&lt;br /&gt;
| 3 || MAX7311: I/O1.1 || freier I/O Port || I/O&lt;br /&gt;
|-&lt;br /&gt;
| 4 || GND || ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====PWM_OUT====&lt;br /&gt;
Der PWM_OUT Anschluss (SP5: K12) ist eine 2x 4-polige Stiftleiste mit der folgenden Belegung:&lt;br /&gt;
&lt;br /&gt;
'''PWM_OUT-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''Sensor Board&amp;lt;br/&amp;gt;-Funktion (K12)''' || '''Verwendung''' || '''I/O'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || PCA9685: PWM0 || freier PWM Port || O&lt;br /&gt;
|-&lt;br /&gt;
| 2 || PCA9685: PWM1 || freier PWM Port || O&lt;br /&gt;
|-&lt;br /&gt;
| 3 || PCA9685: PWM2 || freier PWM Port || O&lt;br /&gt;
|-&lt;br /&gt;
| 4 || PCA9685: PWM3 || freier PWM Port || O&lt;br /&gt;
|-&lt;br /&gt;
| 5 || PCA9685: PWM4 || freier PWM Port || O&lt;br /&gt;
|-&lt;br /&gt;
| 6 || PCA9685: PWM5 || freier PWM Port || O&lt;br /&gt;
|-&lt;br /&gt;
| 7 || PCA9685: PWM6 || freier PWM Port || O&lt;br /&gt;
|-&lt;br /&gt;
| 8 || PCA9685: PWM7 || freier PWM Port || O&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====TP1====&lt;br /&gt;
Am Testpunkt TP1 (SP4: TP1) kann man das Signal SQW/INT_N der RTC (DS1339) prüfen/messen.&lt;br /&gt;
&lt;br /&gt;
====LEDs====&lt;br /&gt;
=====Rücklichter=====&lt;br /&gt;
Der Rücklichter Anschluss (SP1: K10) ist eine 2-polige Stiftleiste mit der folgenden Belegung:&lt;br /&gt;
&lt;br /&gt;
'''Rücklichter-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''Sensor Board&amp;lt;br/&amp;gt;-Funktion (K10)''' || '''Verwendung''' || '''I/O'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || TCA6507: P3 || Rücklicht rechts || O&lt;br /&gt;
|-&lt;br /&gt;
| 2 || TCA6507: P4 || Rücklicht links || O&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=====Display-Hintergrundbeleuchtung=====&lt;br /&gt;
Der Display-Hintergrundbeleuchtung Anschluss (SP1: K7) ist eine 2-polige Stiftleiste mit der folgenden Belegung:&lt;br /&gt;
&lt;br /&gt;
'''Display-Hintergrundbeleuchtung-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''Sensor Board&amp;lt;br/&amp;gt;-Funktion (K7)''' || '''Verwendung''' || '''I/O'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || TCA6507: P0 || Display-Hintergrundbeleuchtung || O&lt;br /&gt;
|-&lt;br /&gt;
| 2 || VDD_1 || +5V ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=====Freie Ausgänge=====&lt;br /&gt;
Der freie Ausgang 1 Anschluss (SP1: K4) ist eine 2-polige Stiftleiste mit der folgenden Belegung:&lt;br /&gt;
&lt;br /&gt;
'''Freier Ausgang 1-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''Sensor Board&amp;lt;br/&amp;gt;-Funktion (K4)''' || '''Verwendung''' || '''I/O'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || TCA6507: P1 || freier LED Port || O&lt;br /&gt;
|-&lt;br /&gt;
| 2 || VDD_1 || +5V ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Der freie Ausgang 2 Anschluss (SP1: K2) ist eine 2-polige Stiftleiste mit der folgenden Belegung:&lt;br /&gt;
&lt;br /&gt;
'''Freier Ausgang 2-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''Sensor Board&amp;lt;br/&amp;gt;-Funktion (K2)''' || '''Verwendung''' || '''I/O'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || TCA6507: P2 || freier LED Port || O&lt;br /&gt;
|-&lt;br /&gt;
| 2 || VDD_1 || +5V ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====SHARP Sensoren====&lt;br /&gt;
Das RP6 Sensor Board verfügt über zwei Stecker SHARP_F (SP1: K5) und SHARP_R (SP1: K3) zum Anschluß von analogen SHARP Infrarot-Distanz-Sensoren. Folgende SHARP Sensoren sind anschließbar:&lt;br /&gt;
* 1. SHARP Distanz-Sensor GP2Y0A41SK0F ([http://www.conrad.de/ce/de/product/504596/Distanz-Sensor-GP2Y0A41SK0F-Sharp-GP2Y0A41SK0F-Messbereiche-Erfassungsbereich-4-30-cm-5-VDC 504596]), Messbereich 4..30cm&lt;br /&gt;
* 2. SHARP Distanz-Sensor GP2Y0A21YK0F ([http://www.conrad.de/ce/de/product/504591/Distanz-Sensor-GP2Y0A21YK0F-Sharp-GP2Y0A21YK0F-Messbereiche-Erfassungsbereich-10-80-cm-5-VDC 504591]), Messbereich 10..80cm&lt;br /&gt;
* 3. SHARP Distanz-Sensor GP2Y0A02YK ([http://www.conrad.de/ce/de/product/185364/Distanz-Sensor-GP-2-Y0A-02-YK-Sharp-GP-2-Y0A-02-YK-Messbereiche-Erfassungsbereich-20-150-cm-5-VDC 185364]), Messbereich 20..150cm&lt;br /&gt;
* 4. SHARP Distanz-Sensor GP2Y0A710K0F ([http://www.conrad.de/ce/de/product/504597/Distanz-Sensor-GP2Y0A710K0F-Sharp-GP2Y0A710K0F-Messbereiche-Erfassungsbereich-100-550-cm-5-VDC 504597]), Messbereich 100..550cm&lt;br /&gt;
''Die Auswahl der geeigneten SHARP Sensoren hängt von der gewünschten Funktion ab: Zur Erkundung großer Räume eignet sich insbesondere der Typ 4 mit einer hohen Reichweite von 5,5m. Er ist aber ungeeignet, die Distanz von Objekten zu erkennen, die sich näher als 1m vor dem Sensor befinden. Ein guter Kompromiss zwischen Nahbereichsmessung und &amp;quot;Fernsicht&amp;quot; sind die Typen 2 (10..80cm) und 3 (20..150cm). Will man den Distanz-Sensor vor allem zur Vermeidung eins Sturzes von einer Treppe (Tiefenerkennung) oder nur zur Erkennung von Hindernissen direkt vor dem Roboter (Kollisionserkennung) benutzen, dann eignet sich insbesondere für den vorderen Sensor (SHARP_F) der Typ 1, da er im Nahbereich von 4 bis 30cm messen kann.''&lt;br /&gt;
&lt;br /&gt;
Für die Verbindung zwischen den beiden 3-poligen JST XH Steckern (K3, 5) auf dem Sensor Board und den SHARP-Sensoren braucht man auf der Sensor Board Seite folgende Stecker-/buchsenteile:&lt;br /&gt;
* 2x JST XH Gehäuse, 3-polig, RM 2,5mm ([http://www.conrad.de/ce/de/product/740583/Gehaeuse-RM-25-mm-Serie-XH-Rastermass-25-mm-Pole-3-Nennstrom-3-A-XHP-3-JST-Inhalt-1-St 740583])&lt;br /&gt;
* 6x JST XH Crimpkontakt f. RM 2,5mm ([http://www.conrad.de/ce/de/product/741112/Crimpkontakt-fuer-RM-25-mm-Serie-XH-Rastermass-25-mm-BXH-001T-P06-JST-Inhalt-1-St 741112])&lt;br /&gt;
Die Crimpkontakte dieser Steckbuchse werden an die meist 3-adrige Litze des Sensors angequetscht (oder angelötet). Zur Belegung des Sensor Anschlusses siehe das jeweilige Datenblatt!&lt;br /&gt;
&lt;br /&gt;
=====Vorn=====&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_Sensor_Board_SHARP_F.JPG|RP6 Sensor Board SHARP Sensor vorn|thumb]]&lt;br /&gt;
&lt;br /&gt;
Der vordere SHARP Sensor kann auch mechanisch am Sensor Board befestigt werden. Dazu gibt es an der Vorderkante der Platine zwei Befestigungslöcher.&lt;br /&gt;
&lt;br /&gt;
Das Bild rechts zeigt den SHARP Distanzsensor GP2Y0A02YK montiert vorn auf dem Sensor Board mit zwei M3 Gelenkbolzen ([http://www.conrad.de/ce/de/product/521043/Gelenkbolzen-1-x-Aussengewinde1-x-Innengewinde-Messing-vernickelt-Schluesselweite-55-mm/ 521043]) und passenden Schrauben/Muttern.&lt;br /&gt;
&lt;br /&gt;
'''Vorn-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''RP6v2-Port''' ||'''RP6v2-Funktion''' || '''Sensor Board&amp;lt;br/&amp;gt;-Funktion (K5)''' || '''Verwendung''' || '''I/O''' |||| '''SHARP Sensor&amp;lt;br/&amp;gt;-Funktion''' &lt;br /&gt;
|-&lt;br /&gt;
| 1 || PA0 || ADC0 || &amp;quot;ADC0&amp;quot; || SHARP vorn || I |||| Vo&lt;br /&gt;
|-&lt;br /&gt;
| 2 || || || VDD_1 || +5V || |||| Vcc&lt;br /&gt;
|-&lt;br /&gt;
| 3 || || || GND || GND (geschaltet!) || |||| GND&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=====Hinten=====&lt;br /&gt;
Der hintere SHARP Sensor kann z.B. an der Rückseite des RP6v2 Fahrgestells befestigt werden.&lt;br /&gt;
&lt;br /&gt;
'''Hinten-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''M256-Port''' ||'''M256-Funktion''' || '''Sensor Board&amp;lt;br/&amp;gt;-Funktion (K3)''' || '''Verwendung''' || '''I/O''' |||| '''SHARP Sensor&amp;lt;br/&amp;gt;-Funktion''' &lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| 1 || PK1 || ADC9 || &amp;quot;ADC4&amp;quot; || SHARP hinten || I |||| Vo&lt;br /&gt;
|-&lt;br /&gt;
| 2 || || || VDD_1 || +5V || |||| Vcc&lt;br /&gt;
|-&lt;br /&gt;
| 3 || || || GND || GND (geschaltet!) || |||| GND&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Servos====&lt;br /&gt;
=====Power=====&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_Sensor_Board_Servo-PWR.jpg|RP6 Sensor Board Servo-PWR Stecker|thumb]]&lt;br /&gt;
&lt;br /&gt;
An den SERVO_PWR Stecker (SP5: K1) muss ein Akku zur Stromversorgung der mit dem Sensor Board verbundenen Servos angeschlossen werden. Der Stecker hat folgende Belegung:&lt;br /&gt;
 &lt;br /&gt;
'''SERVO_PWR-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''Sensor Board&amp;lt;br/&amp;gt;-Funktion (K1)''' || '''Verwendung'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || GND_POWER || Servo Power GND&lt;br /&gt;
|-&lt;br /&gt;
| 2 || VSS_POWER || Servo Power Eingang +7,2..10V&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Der Akku zur Versorgung der Servos muss eine Nennspannung von 7,2..10V aufweisen. Der Schaltregler auf dem Sensor Board kann bei einer 5,0V Servo-Spannung Ströme bis 3,0A (Spitzen bis 5,0A) liefern. '''Die Polung des Akkus darf am Stecker SERVO_PWR nicht vertauscht werden.''' Siehe den oberen Teil der nebenstehende Abbildung! Ratsam ist es, eine Sicherung 3,15A in die Plusleitung zwischen Akku und SERVO_PWR Stecker zu legen.&lt;br /&gt;
&lt;br /&gt;
Für die Verbindung zwischen dem 2-poligen JST XH Stecker (SERVO_PWR, K1) auf dem Sensor Board und dem Akku braucht man auf der Sensor Board Seite folgende Stecker-/buchsenteile:&lt;br /&gt;
* JST XH Gehäuse, 2-polig, RM 2,5mm ([http://www.conrad.de/ce/de/product/740549/Gehaeuse-RM-25-mm-Serie-XH-Rastermass-25-mm-Pole-2-Nennstrom-3-A-XHP-2-JST-Inhalt-1-St 740549])&lt;br /&gt;
* 2x JST XH Crimpkontakt f. RM 2,5mm ([http://www.conrad.de/ce/de/product/741112/Crimpkontakt-fuer-RM-25-mm-Serie-XH-Rastermass-25-mm-BXH-001T-P06-JST-Inhalt-1-St 741112])&lt;br /&gt;
Die Crimpkontakte dieser Steckbuchse werden an die 2-adrige Litze zum Akku angequetscht (oder angelötet).&lt;br /&gt;
&lt;br /&gt;
Wenn man keinen separaten Akku zur Versorgung der Servos nehmen will, kann man auch +UB der RP6v2 Base dafür nutzen. An +UB liegt die Akkuspannung der Base (Nennspannung 7,2V) über eine Sicherung F1 3,15A (RP6v2) bzw. 2,5A (RP6) auf dem Mainboard an. +UB kann man z.B. am [[RP6#EXT_Anschlu.C3.9F|EXT Anschluß der Base]] entnehmen. Die nebenstehende Abbildung zeigt im unteren Teil, an welchen Pins man dort +UB kontaktieren kann!&lt;br /&gt;
&lt;br /&gt;
Dabei ist zu beachten, dass die Sicherung F1 auf dem RP6(v2) Mainboard den nutzbaren Strom für die Servos deutlich begrenzt: Durch diese Sicherung fließt ja nicht nur der Servo-Strom, sondern auch der Strom für den RP6 und alle darauf montierten Zusatzplatinen. Wenn der RP6 also herumfährt und z.B. noch die IRCOMM-Sendedioden nutzt, bleibt kaum noch Stromreserve für die Servos auf dem Sensor Board übrig.&lt;br /&gt;
'''Das bedeutet: Man sollte unbedingt einen separaten Akku für die Servos auf dem Sensor Board benutzen!'''&lt;br /&gt;
&lt;br /&gt;
======SERVO_PWR-EXT Verbindung======&lt;br /&gt;
Für die Verbindung zwischen dem 2-poligen JST XH Stecker (SERVO_PWR, K1) auf dem Sensor Board und dem 8-poligen JST XH Stecker (EXT) auf dem RP6v2 Mainboard braucht man folgende Stecker-/buchsenteile:&lt;br /&gt;
* JST XH Gehäuse, 2-polig, RM 2,5mm ([http://www.conrad.de/ce/de/product/740549/Gehaeuse-RM-25-mm-Serie-XH-Rastermass-25-mm-Pole-2-Nennstrom-3-A-XHP-2-JST-Inhalt-1-St 740549])&lt;br /&gt;
* JST XH Gehäuse, 8-polig, RM 2,5mm ([http://www.conrad.de/ce/de/product/740928/Gehaeuse-RM-25-mm-Serie-XH-Rastermass-25-mm-Pole-8-Nennstrom-3-A-XHP-8-JST-Inhalt-1-St 740928])&lt;br /&gt;
* 10x JST XH Crimpkontakt f. RM 2,5mm ([http://www.conrad.de/ce/de/product/741112/Crimpkontakt-fuer-RM-25-mm-Serie-XH-Rastermass-25-mm-BXH-001T-P06-JST-Inhalt-1-St 741112])&lt;br /&gt;
Mit einer 2-adrigen Litze, die beidseits mit den Crimpkontakten verquetscht (oder verlötet) wird, verbindet man dann den SERVO_PWR Stecker mit dem EXT Stecker, wie in der Abbildung oben gezeigt. ''Achtung: Plus (+) und Minus (-) nicht vertauschen!''&lt;br /&gt;
 Ein passendes Kabel soll zukünftig (*) mitgeliefert werden.&lt;br /&gt;
&lt;br /&gt;
Auf dem RP6 Mainboard ist der 8-polige EXT Stecker noch nicht bestückt. Wenn man ihn nachrüsten will, muss man noch bestellen:&lt;br /&gt;
* JST XH Stiftleiste gerade, 8-polig, RM 2,5mm ([http://www.conrad.de/ce/de/product/740105/Stiftleiste-gerade-RM-25-mm-Serie-XH-Rastermass-25-mm-Pole-8-Nennstrom-3-A-B8B-XH-A-LFSN-JST-Inhalt-1-St 740105])&lt;br /&gt;
Die Stiftleiste wird auf das RP6 Mainboard gelötet, dabei weisen die beiden Einkerbungen an einer Längsseite der Stiftleiste nach hinten zum Rand des Mainboards.&lt;br /&gt;
 Auch diese Stiftleiste soll zukünftig (*) zum Lieferumfang gehören.&lt;br /&gt;
'''Zu *)''' Meinem RP6 Sensor Board (bestellt am 1.3.2014) lag das konfektionierte Kabel und die Stiftleiste noch nicht bei!&lt;br /&gt;
&lt;br /&gt;
=====Stecker=====&lt;br /&gt;
An die acht 3-poligen Stiftleisten SERVO_1 bis SERVO_8 (SP5: K6, 11, 29..34) können Servos angeschlossen werden. Direkt aufstecken kann man Servo-Steckbuchsen mit der Belegung von CONRAD, Graupner/JR und Robbe/Futaba (Versorgungsspannung Plus am mittleren Pin). Auf der Sensor Board Platine kann man den Pin 3 (Servo Power GND) der 3-poligen Stiftleisten daran erkennen, dass er näher zum rechten Platinenrand (Seite mit dem XBUS Stecker) angeordnet ist als der zugehörige Pin 1 (Servo Signal).&lt;br /&gt;
&lt;br /&gt;
Wenn Servos mit nicht passender Steckbuchse angeschlossen werden sollen, dann braucht man auf der Sensor Board Seite folgende Stecker-/buchsenteile für jedes Servo:&lt;br /&gt;
* Steckbuchse, 3-polig, RM 2,54mm ([http://www.elv.de/steckbuchse-3-polig.html ELV 68-022503])&lt;br /&gt;
Die Crimpkontakte dieser Steckbuchse werden an die 3-adrige Litze des Servos angequetscht (oder angelötet). &lt;br /&gt;
&lt;br /&gt;
'''SERVO_1..8-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''Sensor Board&amp;lt;br/&amp;gt;-Funktion (K6,11,29..34)''' || '''Verwendung''' || '''I/O''' |||| '''Servo-&amp;lt;br/&amp;gt;Kabelfarben'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || PCA9685: PWM15..8 || Servo Signal || O |||| Weiß, Orange&lt;br /&gt;
|-&lt;br /&gt;
| 2 || Servo_PWR || Servo Power +5V (geschaltet!) || |||| Rot&lt;br /&gt;
|-&lt;br /&gt;
| 3 || GND_POWER || Servo Power GND || |||| Schwarz, Braun&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Roboterarm RA2-HOBBY====&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_Sensor_Board_RA2-MINI.JPG|RP6 Sensor Board mit Roboterarm RA2-MINI|thumb]]&lt;br /&gt;
&lt;br /&gt;
In der Anleitung zum RP6 Sensor Board ist der Arexx Roboterarm RA2-HOBBY bzw. RA2-MINI [http://www.conrad.de/ce/de/product/191534/Arexx-Mini-Roboterarm-RA2-MINI (191534)] abgebildet. Er ist dort ohne Grundgestell und Controller-Platine auf dem Sensor Board befestigt.&lt;br /&gt;
Das Sensor Board eignet sich sehr gut zur Ansteuerung der 6 Servos des Roboterarms.&lt;br /&gt;
&lt;br /&gt;
Zur Montage des RA2-MINI auf dem Sensor Board geht man so vor:&lt;br /&gt;
* Lösen der 4 Rundkopfschrauben M3x6, die die Servobodenplatte mit den Abstandbolzen M3x30 auf der Controller-Platine verbinden (siehe Anleitung zum RA2-MINI, Seite 19!)&lt;br /&gt;
* Lösen der Servobodenplatte vom Bodenservo (siehe Anleitung zum RA2-MINI, Seite 8!)&lt;br /&gt;
* Bohren der Befestigungslöcher in die Servobodenplatte:&lt;br /&gt;
** Rechts-Links Lochabstand 4,75cm, Vorn-Hinten Lochabstand 4,1cm&lt;br /&gt;
** Ungefähre Lage der Löcher siehe Abbildung in der Anleitung zum Sensor Board, Seite 4!&lt;br /&gt;
** Markierung der Bohrlöcher auf der Rückseite der Servobodenplatte:&lt;br /&gt;
*** 1. Mit einer Hilfslinie die Hinterkante des Servoausschnitts (das ist die kürzere Kante, die näher am Rand der Bodenplatte liegt!) nach beiden Seiten verlängern&lt;br /&gt;
*** 2. Eine 2. Hilfslinie parallel zur ersten im Abstand von 1,4cm zur Mitte der Servobodenplatte hin einzeichnen&lt;br /&gt;
*** 3. Auf dieser Linie jetzt die beiden hinteren Bohrlöcher symmetrisch im Abstand von 4,75cm markieren&lt;br /&gt;
*** 4. Für die vorderen Bohrlöcher eine 3. Hilfslinie im Abstand von 4,1cm parallel zur 2. Linie einzeichnen&lt;br /&gt;
*** 5. Auf dieser Linie die beiden vorderen Bohrlöcher symmetrisch im Abstand von 4,75cm markieren&lt;br /&gt;
*** 6. Kontrolle: Die 4 markierten Bohrlochpositionen bilden ein Rechteck mit 4,1cm seitlicher und 4,75cm vorderer/hinterer Kantenlänge&lt;br /&gt;
** Bohren der 4 Löcher (D = 3,2mm) in die Servobodenplatte&lt;br /&gt;
* Befestigen des Bodenservos auf der Servobodenplatte (siehe Anleitung zum RA2-MINI, Seite 8!)&lt;br /&gt;
* Anbringen des Roboterarms auf dem Sensor Board mit 4 Abstandbolzen M3 (L = 30..50mm) und passenden Schrauben/Muttern&lt;br /&gt;
&lt;br /&gt;
Die Servo-Steckbuchsen werden dann ''in der selben Reihenfolge (S1..S6) wie vorher auf der Controller-Platine des Roboterarms'' auf die Stiftleisten SERVO_1 bis SERVO_6 des Sensor Boards gesteckt.&lt;br /&gt;
'''Man sollte unbedingt einen separaten Akku für die Servos auf dem Sensor Board benutzen!'''&lt;br /&gt;
&lt;br /&gt;
====Grafik-Display====&lt;br /&gt;
Ob es mal ein Grafik-Display für das RP6 Sensor Board geben wird, ist ''pure Spekulation''. Allerdings gibt es drei Hinweise darauf, dass eine solche Hardware-Ergänzung kommen könnte:&lt;br /&gt;
* 1. Der vorbereitete Anschluss für eine [[RP6_Sensor_Board_und_Xtra_Module#Display-Hintergrundbeleuchtung|Display-Hintergrundbeleuchtung]]&lt;br /&gt;
* 2. Die 4 Befestigungslöcher in der Mitte des Sensor Boards&lt;br /&gt;
* 3. Eine Abbildung '''Grafik-Display 128x64''' bei JM3-Engeneering (siehe [[RP6_Sensor_Board_und_Xtra_Module#Weblinks|Weblinks]]!)&lt;br /&gt;
Wir werden sehen ...&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==RP6 Xtra Module==&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_Xtra_module.JPG|RP6 Xtra module|right|500px]]&lt;br /&gt;
&lt;br /&gt;
Von den '''AREXX RP6 Xtra Modulen''' sind bei [http://www.conrad.de/ce/ CONRAD] für den RP6v2 erhältlich:&lt;br /&gt;
* Arexx [[RP6_Sensor_Board_und_Xtra_Module#I2C_GPS_Empf.C3.A4nger_JM3-GPS|I2C GPS Empfänger JM3-GPS]] ([http://www.conrad.de/ce/de/product/1082385/Arexx-IC-GPS-Empfaenger-JM3-GPS 1082385])&lt;br /&gt;
* Arexx [[RP6_Sensor_Board_und_Xtra_Module#Gyro_Modul_JM3-GYRO|Gyro Modul JM3-GYRO]] ([http://www.conrad.de/ce/de/product/1082386/Arexx-Gyro-Modul-JM3-GYRO 1082386])&lt;br /&gt;
* Arexx [[RP6_Sensor_Board_und_Xtra_Module#3D_Accelerometer_Modul_JM3-3DA|3D Accelerometer Modul JM3-3DA]] ([http://www.conrad.de/ce/de/product/1082387/Arexx-3D-Accelerometer-Modul-JM3-3DA 1082387])&lt;br /&gt;
&lt;br /&gt;
===I2C GPS Empfänger JM3-GPS===&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_I2C_GPS_Empfänger.JPG|RP6 I2C GPS Empfänger|right|400px]]&lt;br /&gt;
&lt;br /&gt;
(Laut Online-Katalog der Firma CONRAD!)&lt;br /&gt;
&lt;br /&gt;
''&amp;quot;Universelles GPS-I²C-Bus Modul für RP6 Roboter. Der GPS Empfänger stellt die NMEA-0183 Datensätze GGA, RMC, GSA und VTG in den veschiedenen Registern zur Verfügung. Damit ist eine einfache Weiterverarbeitung möglich.&amp;quot;''&lt;br /&gt;
&lt;br /&gt;
====Beschreibung====&lt;br /&gt;
Der I2C GPS Empfänger ist eine kleine (38 x 23 mm) Zusatzplatine (RP6 Xtra Modul), die direkt auf das [[RP6_Sensor_Board_und_Xtra_Module#RP6_Sensor_Board_2|RP6 Sensor Board]] aufgesteckt werden kann. Sie kann aber auch überall eingesetzt werden, wo eine stabilisierte 5V Versorgungsspannung und ein 5V-I2C-Bus bis 400 kHz zur Verfügung steht.&lt;br /&gt;
&lt;br /&gt;
Die Platine ist bestückt mit dem &amp;quot;Fastrax GPS antenna module&amp;quot; [https://www.u-blox.com/de/positioning-antennas/gnss-antenna-modules/uc530.html UC530]. Als Backup-Batterie dient eine wieder aufladbare Lithium-Batterie ([http://www.farnell.com/datasheets/321180.pdf MS621FE]). Zur Kommunikation zwischen dem UC530 und dem I2C-Bus ist ein [http://www.atmel.com/Images/Atmel-8303-8-bit-AVR-Microcontroller-tinyAVR-ATtiny1634_Datasheet.pdf ATtiny1634] an Bord, der auch die Auswertung des [http://de.wikipedia.org/wiki/NMEA_0183 NMEA Protokolls] übernimmt. Die 3,3 V Versorgungsspannung wird auf der Platine durch einen Spannungsregler ([http://www.mouser.com/ds/2/405/lm3480-316799.pdf LM3480IM3-3.3]) erzeugt. Über den I2C-Bus können folgende Daten der NMEA-0183 Datensätze GGA, RMC, GSA und VTG auf einfache Weise gelesen werden:&lt;br /&gt;
&lt;br /&gt;
* Geograf. Breite&lt;br /&gt;
* Geograf. Länge&lt;br /&gt;
* GPS Status&lt;br /&gt;
* HDOP&lt;br /&gt;
* Satellitenzahl&lt;br /&gt;
* Kurs&lt;br /&gt;
* Geschwindigkeit&lt;br /&gt;
* Höhe&lt;br /&gt;
* UTC-Zeit&lt;br /&gt;
* Datum&lt;br /&gt;
* PDOP&lt;br /&gt;
* VDOP&lt;br /&gt;
* Satellit 1..12&lt;br /&gt;
&lt;br /&gt;
Der ATtiny1634 ist natürlich vorprogrammiert, kann aber über eine vorbereitete 6-polige ISP-Schnittstelle auf der Platine auch umprogrammiert werden.&lt;br /&gt;
&lt;br /&gt;
'''Lieferumfang'''&lt;br /&gt;
* I2C GPS Empfänger&lt;br /&gt;
* CD mit Anleitung und Software-Beispielen.&lt;br /&gt;
&lt;br /&gt;
====Technische Daten====&lt;br /&gt;
* Versorgungsspannung: 5,0 V +/- 5%&lt;br /&gt;
* Stromverbrauch: &amp;lt;= 20 mA (typ.)&lt;br /&gt;
* I2C-Bus Geschwindigkeit: &amp;lt;= 400 kHz&lt;br /&gt;
* GPS Antenne: eingebaut&lt;br /&gt;
* Backup Batterie: Lithium, im Betrieb wieder aufladbar&lt;br /&gt;
* Temperatur Bereich: -10 bis 65 °C&lt;br /&gt;
* Form Faktor: 38 x 23 mm&lt;br /&gt;
* Gewicht: ca. 6 g&lt;br /&gt;
* Empfänger Spezifikationen (UC530):&lt;br /&gt;
** Empfänger: GPS L1 C/A-Code, SPS&lt;br /&gt;
** Kanäle: 66/22 (Suche/Track)&lt;br /&gt;
** Tracking Empfindlichkeit: -165 dBm typ.&lt;br /&gt;
** Navigations Empfindlichkeit: -148 dbm typ (Kaltstart)&lt;br /&gt;
** Update Rate: 1 Sek.&lt;br /&gt;
** Positions Genauigkeit:&lt;br /&gt;
*** 3,0m (67%) typ. horizontal&lt;br /&gt;
*** 5,0m (67%) typ. vertikal&lt;br /&gt;
*** 0,02 m/s (50%) typ. Geschwindigkeit&lt;br /&gt;
** Zeit bis zum ersten Fix: typ. 31 Sek.&lt;br /&gt;
** Protokoll: NMEA-0183 Rev. 3.01&lt;br /&gt;
&lt;br /&gt;
====Anschluss-Schema====&lt;br /&gt;
Belegung des 9-poligen Anschluss-Steckers (K1) siehe in [[RP6_Sensor_Board_und_Xtra_Module#I2C-MODULE|dieser]] Tabelle!&lt;br /&gt;
&lt;br /&gt;
====Umbau-Optionen====&lt;br /&gt;
Wenn man den ATtiny1634 selbst programmieren will, muss man Stiftleisten auf die Platine löten.&lt;br /&gt;
&lt;br /&gt;
Man braucht dazu: &lt;br /&gt;
* 2-reihige Stiftleiste RM 2,54mm (z.B. 2x40-polig 741306) &lt;br /&gt;
&lt;br /&gt;
Man trennt von der 2-reihigen Stiftleiste 2x3 Kontakte ab und lötet sie auf die Punkte &amp;quot;ISP6&amp;quot;.&lt;br /&gt;
Mit einem ISP-Programmer kann dann eine neue Firmware geflasht werden. Die aktuelle Firmware des ATtiny1634 (Version 1.2) wird als .HEX mitgeliefert, leider ohne Source-Code.&lt;br /&gt;
&lt;br /&gt;
Vorsicht: Dabei kann der Prozessor im schlimmsten Fall nicht mehr ansprechbar sein oder der GPS Empfänger UC530 beschädigt werden. Man sollte diesen Umbau und die ISP-Programmierung nur machen, wenn man genau weiß, was man macht! &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Gyro Modul JM3-GYRO===&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_Gyro_Modul.JPG|RP6 Gyro Modul|right|200px]]&lt;br /&gt;
&lt;br /&gt;
(Laut Online-Katalog der Firma CONRAD!)&lt;br /&gt;
&lt;br /&gt;
''&amp;quot;Das universelle Gyro-Sensor Modul für RP6, RP6 V2, RP6 ATMEGA32 und das RP6 V2 Control M256 Wifi-Kit ist ideal zur Erkennung der Blockierung des Roboters in seiner Drehbewegung, sowie der Stabilisierung der Geradeausfahrt.&amp;quot;''&lt;br /&gt;
&lt;br /&gt;
====Beschreibung====&lt;br /&gt;
Das Gyro Modul ist eine kleine (19 x 17 mm) Zusatzplatine (RP6 Xtra Modul), die im RP6-System genutzt werden kann. Es gibt zwar keinen direkt passenden &amp;quot;Steckplatz&amp;quot; auf einer der Microcontroller-Plattformen (RP6v2, M32, M128, M256 Wifi), jedoch ist der Anschluß einfach:&lt;br /&gt;
Benötigt werden +5V und GND, sowie ein freier ADC-Kanal, der bis 5V messen kann. Damit kann das Gyro Modul sehr universell eingesetzt werden. Es misst die Drehrate um die Z-Achse (Hochachse oder Yaw).&lt;br /&gt;
&lt;br /&gt;
Die Platine ist bestückt mit dem analogen Gyro-Sensor [http://www.st.com/web/en/resource/technical/document/datasheet/CD00254111.pdf LY330ALH], dessen Ausgangsspannung durch zwei OP-Amps ([http://www.ti.com.cn/cn/lit/ds/symlink/lm321.pdf LM321], [http://www.produktinfo.conrad.com/datenblaetter/00000-24999/001072615-da-01-en-IC_AMP_PREC_LMP7731MF_NOPB_SOT_23_5_TID.pdf LMP7731MF]) in Ruhe bei 2,5 V liegt. Höhere Ausgangsspannungen (bis 5 V) bedeuten eine Drehgeschwindigkeit nach LINKS, niedrigere (bis 0 V) eine Drehgeschwindigkeit nach RECHTS. Die 3,3 V Versorgungsspannung des LY330ALH wird auf der Platine durch einen Spannungsregler ([http://www.mouser.com/ds/2/405/lm3480-316799.pdf LM3480IM3-3.3]) erzeugt.&lt;br /&gt;
&lt;br /&gt;
'''Lieferumfang'''&lt;br /&gt;
* Gyro Modul&lt;br /&gt;
* CD mit Anleitung und Software-Beispielen.&lt;br /&gt;
&lt;br /&gt;
====Technische Daten====&lt;br /&gt;
&lt;br /&gt;
* VDD: 5,0 V +/- 5%&lt;br /&gt;
* Vout(0): 2,5 V +/- 2% (ohne Bewegung)&lt;br /&gt;
* Vout: Vout(0) + 10mV / dps +/- 2%&lt;br /&gt;
* Messbereich: ca. 200 dps max.&lt;br /&gt;
&lt;br /&gt;
====Anschluss-Schema====&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_Gyro_Modul_SP.JPG|RP6 Gyro Modul - Anschluss-Schema]]&lt;br /&gt;
&lt;br /&gt;
====Umbau-Optionen====&lt;br /&gt;
Am Gyro Modul gibt es nichts umzubauen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===3D Accelerometer Modul JM3-3DA===&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_3D_Accelerometer_Modul.JPG|RP6 3D Accelerometer Modul|right|105px]]&lt;br /&gt;
&lt;br /&gt;
(Laut Online-Katalog der Firma CONRAD!)&lt;br /&gt;
&lt;br /&gt;
''&amp;quot;Universeller 3-Achsen Beschleunigungssensor für RP6, RP6 V2, RP6 ATMEGA32 und das RP6 V2 Control M256 WIFI-Kit. Ideal zur Winkelmessung (Neigung-, Kipp-Winkel) und vieles mehr.&amp;quot;''&lt;br /&gt;
&lt;br /&gt;
====Beschreibung====&lt;br /&gt;
&lt;br /&gt;
Das 3D Accelerometer Modul ist eine kleine (15 x 10 mm) Zusatzplatine (RP6 Xtra Modul), die direkt auf den EEPROM-Sockel (IC5) der Zusatzplatine [[RP6#RP6_CONTROL_M32_Platine|RP6 CONTROL M32]] gesteckt und über den SPI-Bus angesteuert werden kann. Das Accelerometer Modul kann aber auch mit allen Microcontroller-Plattformen betrieben werden, die eine stabilisierte 5V-Versorgungsspannung und einen SPI- oder I2C-Bus bieten.&lt;br /&gt;
&lt;br /&gt;
Die Platine ist bestückt mit dem 3D Beschleunigungs-Sensor [http://www.farnell.com/datasheets/1691680.pdf LIS302DLH]. Die 3,3 V Versorgungsspannung des LIS302DLH wird auf der Platine durch einen Spannungsregler ([http://www.mouser.com/ds/2/405/lm3480-316799.pdf LM3480IM3-3.3]) erzeugt.&lt;br /&gt;
&lt;br /&gt;
'''Lieferumfang'''&lt;br /&gt;
* 3D Accelerometer Modul&lt;br /&gt;
* CD mit Anleitung und Software-Beispielen.&lt;br /&gt;
&lt;br /&gt;
====Technische Daten====&lt;br /&gt;
&lt;br /&gt;
* VDD: 5,0 V +/- 5%&lt;br /&gt;
* Messbereiche: +-2 g, +-4 g, +-8 g&lt;br /&gt;
* Datenausgabe: 16 Bit&lt;br /&gt;
* Schnittstellen: I2C, SPI&lt;br /&gt;
&lt;br /&gt;
====Anschluss-Schema====&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_3D_Accelerometer_Modul_SP.JPG|RP6 3D Accelerometer Modul - Anschluss-Schema|350px]]&lt;br /&gt;
&lt;br /&gt;
====Umbau-Optionen====&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_3D_Accelerometer_Modul_M32.JPG|RP6 3D Accelerometer Modul auf der M32|right|500px]]&lt;br /&gt;
&lt;br /&gt;
'''Will man das Modul auf der M32 einsetzen, muss man auf dem 3D Accelerometer Modul die Widerstände R2 und R3 (falls vorhanden!) auslöten (siehe Anleitung zum Modul, Seiten 4/5!)''' und einen IC-Sockel an Position IC5 und einen Kondensator an Position C19 auf der M32 einlöten, siehe [[RP6#Zweites_SPI-EEPROM|hier]]!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die Abbildung rechts zeigt das 3D Accelerometer Modul auf der M32.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Programmierung==&lt;br /&gt;
In diesem Abschnitt geht es um die Programmierung der Sensoren und Aktoren auf dem [[RP6_Sensor_Board_und_Xtra_Module#RP6_Sensor_Board_3|RP6 Sensor Board]] und auf den [[RP6_Sensor_Board_und_Xtra_Module#RP6_Xtra_Module_3|Xtra Modulen]]. Die hier veröffentlichte Software baut NICHT auf die mitgelieferten C++ Software-Beispiele auf der ''&amp;quot;RP6 Robot System Xtra Modules CD-ROM&amp;quot;'' auf, sondern basiert auf Eigenentwicklungen in GCC.&lt;br /&gt;
&lt;br /&gt;
===RP6 Sensor Board===&lt;br /&gt;
Das RP6 Sensor Board RP6-JM03-61 verfügt nicht über einen eigenen Microprozessor. Daher geht es hier eigentlich nicht um die Programmierung des Sensor Boards, sondern um die Programmierung der Microcontroller-Plattform, an die das Sensor Board angeschlossen ist. In der Regel wird das die RP6 M256 WiFi Zusatzplatine sein, aber auch die RP6v2 Base steuert (als I2C-Slave) in der vorgesehenen Konfiguration gewisse Funktionen des Sensor Boards an.&lt;br /&gt;
Prinzipiell kann das Sensor Board aber auch an der RP6 CONTROL M32 (''passende Library auf Anfrage beim Autor!'') oder der RP6 CCPRO M128 Zusatzplatine betrieben werden.&lt;br /&gt;
&lt;br /&gt;
====Dokumentation====&lt;br /&gt;
Die Dokumentation zum RP6 Sensor Board befindet sich auf der mitgelieferten ''&amp;quot;RP6 Robot System Xtra Modules CD-ROM&amp;quot;''.&lt;br /&gt;
&lt;br /&gt;
=====Manuals=====&lt;br /&gt;
Das Handbuch kann auch [http://www.produktinfo.conrad.com/datenblaetter/00000-24999/001082384-an-01-de-RP6_SENSOR_BOARD.pdf hier] eingesehen werden.&lt;br /&gt;
 ACHTUNG: Das Manual enthält aktuell noch teils irreführende Beschreibungen!&lt;br /&gt;
&lt;br /&gt;
=====Schematics=====&lt;br /&gt;
=====Datasheets=====&lt;br /&gt;
&lt;br /&gt;
====Demo-Programmme====&lt;br /&gt;
Demo-Programme zum RP6 Sensor Board befinden sich auf der mitgelieferten ''&amp;quot;RP6 Robot System Xtra Modules CD-ROM&amp;quot;''.&lt;br /&gt;
&lt;br /&gt;
====RP6 M256 WiFi: Sensor Board Library====&lt;br /&gt;
Die nachfolgende RP6M256_Sensor_BoardLib (GCC) dient zur Ansteuerung des Sensor Boards durch die RP6M256 WiFi.&lt;br /&gt;
&lt;br /&gt;
=====Configuration Header=====&lt;br /&gt;
Vor dem Kompilieren der Library muss eine Anpassung des Configuration Headers an die eigenen Hardware-Voraussetzungen erfolgen.&lt;br /&gt;
Dazu gibt es im Configuration Header eine Definition:&lt;br /&gt;
* USE_PD5 -&amp;gt; Die Sensor Board Funktion &amp;quot;PD5&amp;quot; steuert den TCA4311A Enable Pin (EN).&lt;br /&gt;
Im nachfolgenden Listing ist die Definition USE_PD5 NICHT aktiv (d.h. der TCA4311A Enable Pin (EN) wird vom MAX7311 I/O 1.0 Pin angesteuert!). Dies muss an die eigene Hardware angepaßt werden. Wenn &amp;quot;PD5&amp;quot; den TCA4311A Enable Pin (EN) steuern soll, muss die Zeile mit &amp;quot;USE_PD5&amp;quot; &amp;quot;aktiviert&amp;quot; werden. Dazu entfernt man &amp;quot;//&amp;quot; am Zeilenanfang:&lt;br /&gt;
 #define USE_PD5&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Bevor man Beschleunigungs-, Magnetfeldsensor und Gyroskop nutzen kann, muss man sie kalibrieren:&lt;br /&gt;
&lt;br /&gt;
* '''Accelerometer:'''&lt;br /&gt;
** Die X-Achse wird kalibriert, indem man den RP6 mit der rechten Seite nach unten hält und den Maximalwert in MAX_X_A einträgt. Dann neigt man ihn auf seine linke Seite und trägt den negativen Maximalwert in MIN_X_A ein.&lt;br /&gt;
** Die Y-Achse wird kalibriert, indem man den RP6 mit der Vorderseite nach oben hält und den Maximalwert in MAX_Y_A einträgt. Dann kippt man die Vorderseite nach unten und trägt den negativen Maximalwert in MIN_Y_A ein.&lt;br /&gt;
** Die Z-Achse wird kalibriert, indem man den RP6 normal waagerecht hält und den Maximalwert in MAX_Z_A einträgt. Dann dreht man den RP6 &amp;quot;auf den Kopf&amp;quot; und trägt den negativen Maximalwert in MIN_Z_A ein.&lt;br /&gt;
** Sollten die angezeigten Pitch- und Roll-Werte nach der Kalibrierung der Achsen und genau waagerecht stehendem Sensor bzw. RP6 vom Nullwert deutlich abweichen, kann man sie mithilfe der Definitionen OFFSET_PITCH_A und OFFSET_ROLL_A &amp;quot;nullen&amp;quot;. Die Einheit dieser Definitionen ist °.&lt;br /&gt;
 ''HINWEIS: Die internen Berechnungen werden durch diese Offset-Korrektur&lt;br /&gt;
 NICHT beeinflußt. Die Offset-Werte können also nicht dazu benutzt werden,&lt;br /&gt;
 eine Achsenabweichung zwischen Sensor und RP6 zu kompensieren!''&lt;br /&gt;
* '''Magnetometer:'''&lt;br /&gt;
** Zur Kalibrierung des Magnetfeldsensors stellt man den RP6 auf eine waagerechte Fläche. Es dürfen keine Elektrogeräte, Metallteile und stromführende Leitungen in der Nähe sein, die das Magnetfeld verändern können.&lt;br /&gt;
** Zunächst ist es möglich, die sogenannten &amp;quot;hard iron&amp;quot; Effekte auszugleichen. Dies sind feste Magnetfeldabweichungen, die durch das &amp;quot;Gerät&amp;quot; (in unserem Fall also durch den kompletten RP6) verursacht werden, in oder auf dem der Sensor angebracht ist. Mit den Definitionen OFFSET_X_M, OFFSET_Y_M und OFFSET_Z_M können diese Effekte ausgeglichen werden. Diese Kalibrierung wird hier aktuell (noch) nicht beschrieben, so dass man die Werte für diese Definitionen zunächst bei 0 belassen sollte.&lt;br /&gt;
** Die X-Achse und Y-Achse wird kalibriert, indem man den RP6 langsam mehrfach um die eigene (Z-)Achse dreht und die Maximalwerte in MAX_X_M und MAX_Y_M einträgt. Die negativen Maximalwerte trägt man in MIN_X_M und MIN_Y_M ein.&lt;br /&gt;
** Die Z-Achse wird kalibriert, indem man den RP6 auf die rechte oder linke Seite legt, ihn dann langsam mehrfach auf der Stelle (um seine Y-Achse) dreht und den Maximalwert in MAX_Z_M und den negativen Maximalwert in MIN_Z_M einträgt.&lt;br /&gt;
** Mit der Definition DECLINATION_M kann man zur Verbesserung der Genauigkeit der Richtungsangaben den magnetischen Deklinationswert [°] (d.h. die magnetische Missweisung) am aktuellen Standort festlegen. [http://www.ngdc.noaa.gov/geomag-web/#declination Hier] befindet sich ein &amp;quot;Deklinations-Rechner&amp;quot;, mit dem man den Deklinationswert für den eigenen Standort ermitteln kann. &lt;br /&gt;
** Wenn man den Temperaturwert des LSM303DLHC nutzen will, muss man die Definition GET_TEMP_M aktivieren (Standard!). Den Temperaturwert kann man noch eichen, indem man die Definition OFFSET_TEMP_M anpasst. Die Einheit von OFFSET_TEMP_M ist °C.&lt;br /&gt;
* '''Gyroskop:'''&lt;br /&gt;
** In Ruhelage des RP6 wird ein ADC-Wert von ca. 511 angezeigt, wenn die Definition ADCVAL_ZERORATE_LEVEL im Configuration Header (RP6M256_Sensor_Board.h) vor der ersten Kompilierung zunächst auf 0 gesetzt wurde. Die Kalibrierung des Gyroskops ist abgeschlossen, nachdem man den in Ruhelage angezeigten ADC-Wert als ADCVAL_ZERORATE_LEVEL eingetragen hat.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''HINWEISE ZUR KALIBRIERUNG:'''&lt;br /&gt;
* Das Demo-Programm ist nicht sehr gut geeignet, um die Kalibrierungen durchzuführen.&lt;br /&gt;
* Man sollte mit einem eigenen kurzen ''Kalibrierungs-Programm'' nur die Rohwerte der jeweiligen X-, Y- und Z-Achse z.B. zweimal pro Sekunde ausgeben.&lt;br /&gt;
* Die Rohwerte sind in Variablen x_axis..., y_axis..., z_axis... enthalten. Da die Rohwerte in den Funktionen normalizeLSM303DLHC_A() bzw. normalizeLSM303DLHC_M() ggf. verändert werden, müssen die Rohwerte VOR Durchlaufen dieser Funktionen ausgegeben werden.&lt;br /&gt;
* '''Ohne eine sorgfältige Kalibrierung wird die Kompass-Funktion (insbesondere die neigungskompensierte Ausgabe der Himmelsrichtung) nicht funktionieren!'''&lt;br /&gt;
* Nach dem Eintragen der Kalibrierungs-Werte in den Configuration Header (RP6M256_Sensor_Board.h) muss die ''Demo'' neu kompiliert werden. Vorher sollten die Compiler-Hilfsdateien der Sensor Board-Library (Dateiendungen .st und .o) im Programmverzeichnis gelöscht werden.&lt;br /&gt;
* Getestet wird das Ergebnis der Kalibrierung, indem die Ausgabewerte (Temperatur, Pitch, Roll, Heading, Neigungs-kompensiertes Heading) der ''Demo'' überprüft werden. Dazu kann man Vergleichswerte (Thermometer, Winkelmesser für Pitch, Roll und externer Kompass für Heading) heranziehen.&lt;br /&gt;
* Wenn die Ausgabewerte nicht den Erwartungen entsprechen, muss die Kalibrierung wiederholt werden.&lt;br /&gt;
* Eine Kalibrierung der Sensoren ist nur zuverlässig, solange die Position des jeweiligen Sensors und seine komplette Hardware-Umgebung (also der RP6 mit allen seinen Teilen!) nicht verändert wird. Gibt es trotzdem Veränderungen, z.B. durch weitere Aufbauten auf dem RP6, müssen diese Sensoren neu kalibriert werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Datei: RP6M256_Sensor_Board.h&lt;br /&gt;
&amp;lt;pre&amp;gt;/* ****************************************************************************&lt;br /&gt;
 *                           _______________________&lt;br /&gt;
 *                           \| RP6  ROBOT SYSTEM |/&lt;br /&gt;
 *                            \_-_-_-_-_-_-_-_-_-_/           &amp;gt;&amp;gt;&amp;gt; RP6 M256 WIFI&lt;br /&gt;
 * ----------------------------------------------------------------------------&lt;br /&gt;
 * ----------------------------- [c]2014 - Dirk -------------------------------&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * File: RP6M256_Sensor_Board.h&lt;br /&gt;
 * Version: 1.0&lt;br /&gt;
 * Target: RP6 M256 WIFI - ATMEGA2560 @16.00MHz&lt;br /&gt;
 * Author(s): Dirk&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Description:&lt;br /&gt;
 * Configuration header file for new RP6 Sensor Board library.&lt;br /&gt;
 * The RP6 Sensor Board (CONRAD 1082384) is connected to the RP6M256 with the&lt;br /&gt;
 * two plugs:&lt;br /&gt;
 *   Sensor Board &amp;lt;---&amp;gt; RP6M256&lt;br /&gt;
 *   --------------------------------&lt;br /&gt;
 *   I/O (K17)    &amp;lt;---&amp;gt; IO_PWM/T0/T1&lt;br /&gt;
 *   ADC (K18)    &amp;lt;---&amp;gt; ADC_IO2/CMP&lt;br /&gt;
 * The RP6 Sensor Board function &amp;quot;PD5&amp;quot; (IC6: EN) is now connected to RP6M256&lt;br /&gt;
 * OC1B (PB6) and the RP6 Sensor Board function &amp;quot;ADC4&amp;quot; (SHARP_R) to RP6M256&lt;br /&gt;
 * ADC9 (PK1).&lt;br /&gt;
 * On the RP6 Sensor Board the functions &amp;quot;ADC0&amp;quot;, &amp;quot;ADC1&amp;quot;, &amp;quot;PWR&amp;quot; and &amp;quot;ADC4&amp;quot; are&lt;br /&gt;
 * connected to the USRBUS. The USRBUS may be wired on the RP6 mainboard like&lt;br /&gt;
 * this:&lt;br /&gt;
 *   Function : Sensor Board - USRBUS: * &amp;lt;---&amp;gt; RP6 Mainboard&lt;br /&gt;
 *   --------------------------------------------------------&lt;br /&gt;
 *   SHARP_F  : &amp;quot;ADC0&amp;quot;       - Pin 1     &amp;lt;---&amp;gt; ADC0: Pin 3&lt;br /&gt;
 *   GYRO     : &amp;quot;ADC1&amp;quot;       - Pin 2     &amp;lt;---&amp;gt; ADC1: Pin 3&lt;br /&gt;
 *   PWRON ²  : &amp;quot;PWR&amp;quot;        - Pin 3     &amp;lt;---&amp;gt; PWR&lt;br /&gt;
 *   SHARP_R  : &amp;quot;ADC4&amp;quot;       - Pin 5     &amp;lt;---&amp;gt; Not connected!&lt;br /&gt;
 * At *) It is also possible not to use the USRBUS, but to connect the RP6&lt;br /&gt;
 *       Sensor Board directly to the RP6 mainboard with 3 single cables.&lt;br /&gt;
 * At ²) See RP6 manual &amp;quot;4.6.8. Stromsparfunktionen&amp;quot;! &lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
#ifndef RP6M256_SENSOR_BOARD_H&lt;br /&gt;
#define RP6M256_SENSOR_BOARD_H&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// RP6 Sensor Board hardwired components:&lt;br /&gt;
// - I2C I/O Port Expander (MAX7311)&lt;br /&gt;
// - I2C Real Time Clock (RTC DS1339)&lt;br /&gt;
// - I2C Temperature Sensor (LM75B)&lt;br /&gt;
// - I2C Servo Controller (PCA9685)&lt;br /&gt;
// - I2C LED Driver (TCA6507)&lt;br /&gt;
// - I2C 3D Magnetometer &amp;amp; Accelerometer (LSM303DLHC)&lt;br /&gt;
// - Analog Yaw-Rate Gyroscope (LY330ALH)&lt;br /&gt;
// - Hot Swappable 2-Wire Bus Buffer (TCA4311A)&lt;br /&gt;
// - Button&lt;br /&gt;
// - Status LED&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C I/O Port Expander (MAX7311):&lt;br /&gt;
#define I2C_SENSOR_PORTEXP_ADR			0x40	// Default&lt;br /&gt;
&lt;br /&gt;
// Interrupt I/O portpin definitions (RP6M256):&lt;br /&gt;
#define IO_SENSOR_INT1_IN				INT1_PI12 // PCINT12 PJ3  XBUS Pin 8&lt;br /&gt;
#define IO_SENSOR_INT1_DDR				DDRJ&lt;br /&gt;
#define IO_SENSOR_INT1_PIN				PINJ&lt;br /&gt;
#define IO_SENSOR_INT1_PORT				PORTJ&lt;br /&gt;
#define IO_SENSOR_INT2_IN				INT2_PI15 // PCINT15 PJ6  XBUS Pin 11&lt;br /&gt;
#define IO_SENSOR_INT2_DDR				DDRJ&lt;br /&gt;
#define IO_SENSOR_INT2_PIN				PINJ&lt;br /&gt;
#define IO_SENSOR_INT2_PORT				PORTJ&lt;br /&gt;
#define IO_SENSOR_INT3_IN				INT3_PI14 // PCINT14 PJ5  XBUS Pin 9&lt;br /&gt;
#define IO_SENSOR_INT3_DDR				DDRJ&lt;br /&gt;
#define IO_SENSOR_INT3_PIN				PINJ&lt;br /&gt;
#define IO_SENSOR_INT3_PORT				PORTJ&lt;br /&gt;
#define IO_SENSOR_INTU_IN				INTU_PI13 // PCINT13 PJ4  XBUS Pin 7&lt;br /&gt;
#define IO_SENSOR_INTU_DDR				DDRJ&lt;br /&gt;
#define IO_SENSOR_INTU_PIN				PINJ&lt;br /&gt;
#define IO_SENSOR_INTU_PORT				PORTJ&lt;br /&gt;
&lt;br /&gt;
// I/O PORT pin numbers:&lt;br /&gt;
#define PIN7							7&lt;br /&gt;
#define PIN6							6&lt;br /&gt;
#define PIN5							5&lt;br /&gt;
#define PIN4							4&lt;br /&gt;
#define PIN3							3&lt;br /&gt;
#define PIN2							2&lt;br /&gt;
#define PIN1							1&lt;br /&gt;
#define PIN0							0&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Real Time Clock (RTC DS1339):&lt;br /&gt;
#define I2C_SENSOR_RTC_ADR				0xd0	// Default&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Temperature Sensor (LM75B):&lt;br /&gt;
#define I2C_SENSOR_TEMP_ADR				0x90	// Default&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Servo Controller (PCA9685):&lt;br /&gt;
#define I2C_SENSOR_SERVO_ADR			0x88	// Default&lt;br /&gt;
&lt;br /&gt;
// Servo and PWM channels:&lt;br /&gt;
#define CH_SERVO_1						16		// At K6: 1  &amp;quot;SERVO_1&amp;quot;&lt;br /&gt;
#define CH_SERVO_2						15		// At K11: 1 &amp;quot;SERVO_2&amp;quot;&lt;br /&gt;
#define CH_SERVO_3						13		// At K29: 1 &amp;quot;SERVO_3&amp;quot;&lt;br /&gt;
#define CH_SERVO_4						14		// At K30: 1 &amp;quot;SERVO_4&amp;quot;&lt;br /&gt;
#define CH_SERVO_5						11		// At K31: 1 &amp;quot;SERVO_5&amp;quot;&lt;br /&gt;
#define CH_SERVO_6						12		// At K32: 1 &amp;quot;SERVO_6&amp;quot;&lt;br /&gt;
#define CH_SERVO_7						9		// At K33: 1 &amp;quot;SERVO_7&amp;quot;&lt;br /&gt;
#define CH_SERVO_8						10		// At K34: 1 &amp;quot;SERVO_8&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#define CH_PWM_OUT_1					1		// At K12: 1 &amp;quot;PWM_OUT&amp;quot;&lt;br /&gt;
#define CH_PWM_OUT_2					2		// At K12: 2&lt;br /&gt;
#define CH_PWM_OUT_3					3		// At K12: 3&lt;br /&gt;
#define CH_PWM_OUT_4					4		// At K12: 4&lt;br /&gt;
#define CH_PWM_OUT_5					5		// At K12: 5&lt;br /&gt;
#define CH_PWM_OUT_6					6		// At K12: 6&lt;br /&gt;
#define CH_PWM_OUT_7					7		// At K12: 7&lt;br /&gt;
#define CH_PWM_OUT_8					8		// At K12: 8&lt;br /&gt;
&lt;br /&gt;
// Servo left touch (LT), right touch (RT), middle position (MP) constants:&lt;br /&gt;
// (Hints: - Servo impulse length [ms] = Servo position value / 204.8&lt;br /&gt;
//           (Formula only valid for a PWM of 50 Hz!)&lt;br /&gt;
//         - Min. servo impulse (0,7 ms) = Servo position 143&lt;br /&gt;
//         - Mid. servo impulse (1,5 ms) = Servo position 307&lt;br /&gt;
//         - Max. servo impulse (2,3 ms) = Servo position 471&lt;br /&gt;
//         - !!! You should NOT use servo position values &amp;lt; 143 or &amp;gt; 471 !!!)&lt;br /&gt;
#define SERVO1_LT						205		// Servo impulse ~1ms&lt;br /&gt;
#define SERVO1_RT						410		// Servo impulse ~2ms&lt;br /&gt;
#define SERVO1_MP						((SERVO1_RT - SERVO1_LT) / 2 + SERVO1_LT)&lt;br /&gt;
#define SERVO2_LT						205&lt;br /&gt;
#define SERVO2_RT						410&lt;br /&gt;
#define SERVO2_MP						((SERVO2_RT - SERVO2_LT) / 2 + SERVO2_LT)&lt;br /&gt;
#define SERVO3_LT						205&lt;br /&gt;
#define SERVO3_RT						410&lt;br /&gt;
#define SERVO3_MP						((SERVO3_RT - SERVO3_LT) / 2 + SERVO3_LT)&lt;br /&gt;
#define SERVO4_LT						205&lt;br /&gt;
#define SERVO4_RT						410&lt;br /&gt;
#define SERVO4_MP						((SERVO4_RT - SERVO4_LT) / 2 + SERVO4_LT)&lt;br /&gt;
#define SERVO5_LT						205&lt;br /&gt;
#define SERVO5_RT						410&lt;br /&gt;
#define SERVO5_MP						((SERVO5_RT - SERVO5_LT) / 2 + SERVO5_LT)&lt;br /&gt;
#define SERVO6_LT						205&lt;br /&gt;
#define SERVO6_RT						410&lt;br /&gt;
#define SERVO6_MP						((SERVO6_RT - SERVO6_LT) / 2 + SERVO6_LT)&lt;br /&gt;
#define SERVO7_LT						205&lt;br /&gt;
#define SERVO7_RT						410&lt;br /&gt;
#define SERVO7_MP						((SERVO7_RT - SERVO7_LT) / 2 + SERVO7_LT)&lt;br /&gt;
#define SERVO8_LT						205&lt;br /&gt;
#define SERVO8_RT						410&lt;br /&gt;
#define SERVO8_MP						((SERVO8_RT - SERVO8_LT) / 2 + SERVO8_LT)&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C LED Driver (TCA6507):&lt;br /&gt;
#define I2C_SENSOR_LEDDRIVER_ADR		0x8a	// Default&lt;br /&gt;
&lt;br /&gt;
// LED numbers:&lt;br /&gt;
#define LED0							0		// At K7&lt;br /&gt;
#define DISPLAY_BACKLIGHT				0		// Display background light&lt;br /&gt;
#define LED1							1		// At K4&lt;br /&gt;
#define LED2							2		// At K2&lt;br /&gt;
#define LED3							3		// At K10: 1&lt;br /&gt;
#define BACKLIGHT_R						3		// Right backlight&lt;br /&gt;
#define LED4							4		// At K10: 2&lt;br /&gt;
#define BACKLIGHT_L						4		// Left backlight&lt;br /&gt;
#define LED5							5		// White LED (D3)&lt;br /&gt;
#define HEADLIGHT_R						5		// Right headlight&lt;br /&gt;
#define LED6							6		// White LED (D1)&lt;br /&gt;
#define HEADLIGHT_L						6		// Left headlight&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C 3D Magnetometer &amp;amp; Accelerometer (LSM303DLHC):&lt;br /&gt;
&lt;br /&gt;
// LSM303DLHC accelerometer:&lt;br /&gt;
#define I2C_SENSOR_LSM303DLHC_A_ADR 	0x32	// Default&lt;br /&gt;
&lt;br /&gt;
// LSM303DLHC accelerometer calibration data:&lt;br /&gt;
#define MAX_X_A						1037		// Max. X-axis value&lt;br /&gt;
#define MIN_X_A						-1030		// Min. X-axis value&lt;br /&gt;
#define MAX_Y_A						1030		// Max. Y-axis value&lt;br /&gt;
#define MIN_Y_A						-1019		// Min. Y-axis value&lt;br /&gt;
#define MAX_Z_A						1062		// Max. Z-axis value&lt;br /&gt;
#define MIN_Z_A						-1056		// Min. Z-axis value&lt;br /&gt;
#define OFFSET_PITCH_A				0.0			// Offset Pitch [°]&lt;br /&gt;
#define OFFSET_ROLL_A				0.0			// Offset Roll [°]&lt;br /&gt;
&lt;br /&gt;
// LSM303DLHC magnetometer:&lt;br /&gt;
#define I2C_SENSOR_LSM303DLHC_M_ADR		0x3c	// Default&lt;br /&gt;
&lt;br /&gt;
// LSM303DLHC magnetometer calibration data:&lt;br /&gt;
#define MAX_X_M						-111.0		// Max. X-axis value&lt;br /&gt;
#define MIN_X_M						-634.0		// Min. X-axis value&lt;br /&gt;
#define OFFSET_X_M					0			// Hard iron X-axis offset&lt;br /&gt;
#define MAX_Y_M						297.0		// Max. Y-axis value&lt;br /&gt;
#define MIN_Y_M						-215.0		// Min. Y-axis value&lt;br /&gt;
#define OFFSET_Y_M					0			// Hard iron Y-axis offset&lt;br /&gt;
#define MAX_Z_M						183.0		// Max. Z-axis value&lt;br /&gt;
#define MIN_Z_M						-214.0		// Min. Z-axis value&lt;br /&gt;
#define OFFSET_Z_M					0			// Hard iron Z-axis offset&lt;br /&gt;
#define DECLINATION_M				0.0			// E at local position [°]&lt;br /&gt;
&lt;br /&gt;
// LSM303DLHC temperature sensor definitions:&lt;br /&gt;
#define GET_TEMP_M								// Enable temperature sensor&lt;br /&gt;
#define OFFSET_TEMP_M				0.0			// Temperature offset [°C]&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Analog Yaw-Rate Gyroscope (LY330ALH):&lt;br /&gt;
&lt;br /&gt;
// LY330ALH gyroscope:&lt;br /&gt;
#define ADC_SENSOR_LY330ALH				ADC_1	// At USRBUS: 2 (RP6BASE)&lt;br /&gt;
&lt;br /&gt;
// LY330ALH gyroscope calibration data:&lt;br /&gt;
// (Higher values [505..1023] mean an angular velocity while rotating LEFT&lt;br /&gt;
//  and lower values [503..0] while rotating RIGHT!)&lt;br /&gt;
#define ADCVAL_MINRATE					0		// Min. rate value&lt;br /&gt;
#define ADCVAL_ZERORATE_LEVEL			504		// Zero rate level&lt;br /&gt;
#define ADCVAL_MAXRATE					1023	// Max. rate value&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Hot Swappable 2-Wire Bus Buffer (TCA4311A):&lt;br /&gt;
&lt;br /&gt;
// Define USE_PD5, if you want to control the TCA4311A enable pin (EN) with&lt;br /&gt;
// the RP6 Sensor Board function &amp;quot;PD5&amp;quot;. If USE_PD5 is NOT defined (default),&lt;br /&gt;
// the TCA4311A EN pin is controlled by the MAX7311 I/O 1.0 pin.&lt;br /&gt;
// ---------------&lt;br /&gt;
//#define USE_PD5&lt;br /&gt;
// ---------------&lt;br /&gt;
&lt;br /&gt;
#define IO_SENSOR_TCA4311A_EN_IN		OC1B_PI6 // At I/O: 9 (RP6M256)&lt;br /&gt;
#define IO_SENSOR_TCA4311A_EN_DDR		DDRB&lt;br /&gt;
#define IO_SENSOR_TCA4311A_EN_PIN		PINB&lt;br /&gt;
#define IO_SENSOR_TCA4311A_EN_PORT		PORTB&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Button:&lt;br /&gt;
&lt;br /&gt;
// (Button is connected to I/O 1.7 of the MAX7311!)&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Status LED:&lt;br /&gt;
&lt;br /&gt;
// (Status LED is connected to I/O 1.6 of the MAX7311!)&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Other ADC channel definitions:&lt;br /&gt;
&lt;br /&gt;
// (Depending on connections on the RP6 Sensor Board!)&lt;br /&gt;
#define ADC_SENSOR_SHARP_F				ADC_0	// At USRBUS: 1 (RP6BASE)&lt;br /&gt;
#define ADC_SENSOR_SHARP_R				ADC_9	// At ADC: 3    (RP6M256)&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
/******************************************************************************&lt;br /&gt;
 * Additional info&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Changelog:&lt;br /&gt;
 * &lt;br /&gt;
 *  ---&amp;gt; changes are documented in the file &amp;quot;RP6M256_Sensor_BoardLib.c&amp;quot;&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=====Library Header=====&lt;br /&gt;
Datei: RP6M256_Sensor_BoardLib.h&lt;br /&gt;
&amp;lt;pre&amp;gt;/* ****************************************************************************&lt;br /&gt;
 *                           _______________________&lt;br /&gt;
 *                           \| RP6  ROBOT SYSTEM |/&lt;br /&gt;
 *                            \_-_-_-_-_-_-_-_-_-_/           &amp;gt;&amp;gt;&amp;gt; RP6 M256 WIFI&lt;br /&gt;
 * ----------------------------------------------------------------------------&lt;br /&gt;
 * ----------------------------- [c]2014 - Dirk -------------------------------&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * File: RP6M256_Sensor_BoardLib.h&lt;br /&gt;
 * Version: 1.0&lt;br /&gt;
 * Target: RP6 M256 WIFI - ATMEGA2560 @16.00MHz&lt;br /&gt;
 * Author(s): Dirk&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Description:&lt;br /&gt;
 * Header file for new RP6 Sensor Board library.&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
#ifndef RP6M256_SENSOR_BOARDLIB_H&lt;br /&gt;
#define RP6M256_SENSOR_BOARDLIB_H&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// RP6 Sensor Board hardwired components:&lt;br /&gt;
// - I2C I/O Port Expander (MAX7311)&lt;br /&gt;
// - I2C Real Time Clock (RTC DS1339)&lt;br /&gt;
// - I2C Temperature Sensor (LM75B)&lt;br /&gt;
// - I2C Servo Controller (PCA9685)&lt;br /&gt;
// - I2C LED Driver (TCA6507)&lt;br /&gt;
// - I2C 3D Magnetometer &amp;amp; Accelerometer (LSM303DLHC)&lt;br /&gt;
// - Analog Yaw-Rate Gyroscope (LY330ALH)&lt;br /&gt;
// - Hot Swappable 2-Wire Bus Buffer (TCA4311A)&lt;br /&gt;
// - Button&lt;br /&gt;
// - Status LED&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Includes:&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6M256Lib.h&amp;quot;&lt;br /&gt;
#include &amp;quot;RP6I2CmasterTWI.h&amp;quot;&lt;br /&gt;
#include &amp;quot;RP6M256_Sensor_Board.h&amp;quot;&lt;br /&gt;
#include &amp;lt;math.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// RP6M256_I2CMasterLib definitions:&lt;br /&gt;
&lt;br /&gt;
#ifndef I2C_RP6_BASE_ADR&lt;br /&gt;
	#define I2C_RP6_BASE_ADR			10&lt;br /&gt;
#endif&lt;br /&gt;
#ifndef I2C_REG_ADC_ADC0_L&lt;br /&gt;
	#define I2C_REG_ADC_ADC0_L			23&lt;br /&gt;
#endif&lt;br /&gt;
#ifndef I2C_REG_ADC_ADC1_L&lt;br /&gt;
	#define I2C_REG_ADC_ADC1_L			25&lt;br /&gt;
#endif&lt;br /&gt;
#ifndef CMD_POWER_OFF&lt;br /&gt;
	#define CMD_POWER_OFF				0&lt;br /&gt;
#endif&lt;br /&gt;
#ifndef CMD_POWER_ON&lt;br /&gt;
	#define CMD_POWER_ON				1&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C I/O Port Expander (MAX7311):&lt;br /&gt;
&lt;br /&gt;
// Registers:&lt;br /&gt;
#define MAX7311_INPUT_PORT1				0&lt;br /&gt;
#define MAX7311_INPUT_PORT2				1&lt;br /&gt;
#define MAX7311_OUTPUT_PORT1			2&lt;br /&gt;
#define MAX7311_OUTPUT_PORT2			3&lt;br /&gt;
#define MAX7311_PORT1_POL_INV			4&lt;br /&gt;
#define MAX7311_PORT2_POL_INV			5&lt;br /&gt;
#define MAX7311_PORT1_CONFIG			6&lt;br /&gt;
#define MAX7311_PORT2_CONFIG			7&lt;br /&gt;
#define MAX7311_TIMEOUT					8&lt;br /&gt;
&lt;br /&gt;
// Port 1 configuration register bitmasks:&lt;br /&gt;
#define ST_GYRO							(1 &amp;lt;&amp;lt; PIN7)	// I/O 0.7 (Output)&lt;br /&gt;
#define PD_GYRO							(1 &amp;lt;&amp;lt; PIN6)	// I/O 0.6 (Output)&lt;br /&gt;
#define PWR_CAM_IF						(1 &amp;lt;&amp;lt; PIN5)	// I/O 0.5 (Output)&lt;br /&gt;
#define EN_LEDDRIV						(1 &amp;lt;&amp;lt; PIN4)	// I/O 0.4 (Output)&lt;br /&gt;
#define RDY_BUSBUFF						(1 &amp;lt;&amp;lt; PIN3)	// I/O 0.3 (Input)&lt;br /&gt;
#define PWR_SHARP_R						(1 &amp;lt;&amp;lt; PIN2)	// I/O 0.2 (Output)&lt;br /&gt;
#define PWR_SHARP_F						(1 &amp;lt;&amp;lt; PIN1)	// I/O 0.1 (Output)&lt;br /&gt;
#define PWR_I2C							(1 &amp;lt;&amp;lt; PIN0)	// I/O 0.0 (Output)&lt;br /&gt;
&lt;br /&gt;
// Port 2 configuration register bitmasks:&lt;br /&gt;
#define IO2_I2C							(1 &amp;lt;&amp;lt; PIN7)	// I/O 1.7 (Input)&lt;br /&gt;
#define IO1_I2C							(1 &amp;lt;&amp;lt; PIN6)	// I/O 1.6 (Output)&lt;br /&gt;
#define DRDY_MAGACC						(1 &amp;lt;&amp;lt; PIN5)	// I/O 1.5 (Input)&lt;br /&gt;
#define PWR_SERVO						(1 &amp;lt;&amp;lt; PIN4)	// I/O 1.4 (Output)&lt;br /&gt;
#define OEN_SERVO						(1 &amp;lt;&amp;lt; PIN3)	// I/O 1.3 (Output)&lt;br /&gt;
#define IO_K19_1						(1 &amp;lt;&amp;lt; PIN2)	// I/O 1.2 (Input)&lt;br /&gt;
#define IO_K19_3						(1 &amp;lt;&amp;lt; PIN1)	// I/O 1.1 (Input)&lt;br /&gt;
#define EN_BUSBUFF						(1 &amp;lt;&amp;lt; PIN0)	// I/O 1.0 (Output)&lt;br /&gt;
&lt;br /&gt;
// Port 1 &amp;amp; 2 register 16-bit bitmasks:&lt;br /&gt;
// (CONFIG: 1 = Input, 0 = Output)&lt;br /&gt;
#define MAX7311_CONFIG_DEFAULT			0b1010011000001000&lt;br /&gt;
#define MAX7311_CONFIG_USE_PD5			0b1010011100001000&lt;br /&gt;
// (OUTPUT: 1 = High/True, 0 = Low/False)&lt;br /&gt;
#define MAX7311_OUTPUT_DEFAULT			0b0100000100010000&lt;br /&gt;
#define MAX7311_OUTPUT_FULLPOWER		0b0001000100110111&lt;br /&gt;
#define MAX7311_OUTPUT_SHUTDOWN			0b0100100011000000&lt;br /&gt;
&lt;br /&gt;
// Safe configuration:&lt;br /&gt;
// (Ensures if activated, that I/Os 0.3, 1.5 and 1.7 cannot be configured&lt;br /&gt;
//  as output with the function MAX7311_write_cfg(). This may protect the&lt;br /&gt;
//  RP6 Sensor Board from hardware damage.)&lt;br /&gt;
// -------------------&lt;br /&gt;
#define SAFE_CONFIG&lt;br /&gt;
// -------------------&lt;br /&gt;
&lt;br /&gt;
typedef union {&lt;br /&gt;
 	uint8_t byte;&lt;br /&gt;
	struct {&lt;br /&gt;
		unsigned int1   :1;				// INT1  XBUS Pin 8&lt;br /&gt;
		unsigned int2   :1;				// INT2  XBUS Pin 11&lt;br /&gt;
		unsigned int3   :1;				// INT3  XBUS Pin 9&lt;br /&gt;
		unsigned intu   :1;				// INTU  XBUS Pin 7&lt;br /&gt;
		unsigned unused :4;&lt;br /&gt;
	};&lt;br /&gt;
	struct {&lt;br /&gt;
		unsigned magacc1     :1;		// INT1: LSM303DLHC INT1&lt;br /&gt;
		unsigned portexp     :1;		// INT2: MAX7311 INT_N&lt;br /&gt;
		unsigned magacc2_rtc :1;		// INT3: LSM303DLHC INT2&lt;br /&gt;
		unsigned noname      :5;		//       OR DS1339 SQW/INT_N&lt;br /&gt;
	};&lt;br /&gt;
} interrupt_RP6SBstatus_t;&lt;br /&gt;
extern interrupt_RP6SBstatus_t interrupt_RP6SBstatus;&lt;br /&gt;
&lt;br /&gt;
typedef union {&lt;br /&gt;
	uint16_t word;&lt;br /&gt;
	struct {&lt;br /&gt;
		unsigned pwr_i2c     :1;		// I/O 0.0 (Output)&lt;br /&gt;
		unsigned pwr_sharp_f :1;		// I/O 0.1 (Output)&lt;br /&gt;
		unsigned pwr_sharp_r :1;		// I/O 0.2 (Output)&lt;br /&gt;
		unsigned rdy_busbuff :1;		// I/O 0.3 (Input)&lt;br /&gt;
		unsigned en_leddriv  :1;		// I/O 0.4 (Output)&lt;br /&gt;
		unsigned pwr_cam_if  :1;		// I/O 0.5 (Output)&lt;br /&gt;
		unsigned pd_gyro     :1;		// I/O 0.6 (Output)&lt;br /&gt;
		unsigned st_gyro     :1;		// I/O 0.7 (Output)&lt;br /&gt;
		unsigned en_busbuff  :1;		// I/O 1.0 (Output)&lt;br /&gt;
		unsigned io_k19_3    :1;		// I/O 1.1 (Input)&lt;br /&gt;
		unsigned io_k19_1    :1;		// I/O 1.2 (Input)&lt;br /&gt;
		unsigned oen_servo   :1;		// I/O 1.3 (Output)&lt;br /&gt;
		unsigned pwr_servo   :1;		// I/O 1.4 (Output)&lt;br /&gt;
		unsigned drdy_magacc :1;		// I/O 1.5 (Input)&lt;br /&gt;
		unsigned io1_i2c     :1;		// I/O 1.6 (Output)&lt;br /&gt;
		unsigned io2_i2c     :1;		// I/O 1.7 (Input)&lt;br /&gt;
	};&lt;br /&gt;
} max7311IOs_t;&lt;br /&gt;
extern max7311IOs_t inport;&lt;br /&gt;
extern max7311IOs_t outport;&lt;br /&gt;
extern uint8_t readyBusbuff;&lt;br /&gt;
extern uint8_t pressedButton;&lt;br /&gt;
&lt;br /&gt;
void MAX7311_write_cfg(uint16_t);&lt;br /&gt;
void task_checkINTs(void);&lt;br /&gt;
void task_RP6SensorBoard(void);&lt;br /&gt;
void MAX7311_update(void);&lt;br /&gt;
void MAX7311_write(uint16_t);&lt;br /&gt;
void MAX7311_init(void);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Real Time Clock (RTC DS1339):&lt;br /&gt;
&lt;br /&gt;
// Registers:&lt;br /&gt;
#define DS1339_SECONDS					0&lt;br /&gt;
#define DS1339_MINUTES					1&lt;br /&gt;
#define DS1339_HOURS					2&lt;br /&gt;
#define DS1339_DAY						3&lt;br /&gt;
#define DS1339_DATE						4&lt;br /&gt;
#define DS1339_MONTH_CENTURY			5&lt;br /&gt;
#define DS1339_YEAR						6&lt;br /&gt;
#define DS1339_ALARM1_SECONDS			7&lt;br /&gt;
#define DS1339_ALARM1_MINUTES			8&lt;br /&gt;
#define DS1339_ALARM1_HOURS				9&lt;br /&gt;
#define DS1339_ALARM1_DAY_DATE			10&lt;br /&gt;
#define DS1339_ALARM2_MINUTES			11&lt;br /&gt;
#define DS1339_ALARM2_HOURS				12&lt;br /&gt;
#define DS1339_ALARM2_DAY_DATE			13&lt;br /&gt;
#define DS1339_CONTROL					14&lt;br /&gt;
#define DS1339_STATUS					15&lt;br /&gt;
#define DS1339_TRICKLE_CHARGER			16&lt;br /&gt;
&lt;br /&gt;
// Control register bitmasks:&lt;br /&gt;
#define DS1339_CONTROL_DEFAULT			0		// Power on default&lt;br /&gt;
#define DS1339_CONTROL_A1IE				1&lt;br /&gt;
#define DS1339_CONTROL_A2IE				2&lt;br /&gt;
#define DS1339_CONTROL_INTCN			4&lt;br /&gt;
#define DS1339_CONTROL_RS1				8&lt;br /&gt;
#define DS1339_CONTROL_RS2				16&lt;br /&gt;
#define DS1339_CONTROL_BBSQI			32&lt;br /&gt;
#define DS1339_CONTROL_EOSC				128&lt;br /&gt;
&lt;br /&gt;
// Trickle Charger register bitmasks:&lt;br /&gt;
#define DS1339_TRICKLE_CHARGER_DEFAULT	0b10101010 // One diode, 2k resistor&lt;br /&gt;
#define DS1339_TRICKLE_CHARGER_ROUT0	1&lt;br /&gt;
#define DS1339_TRICKLE_CHARGER_ROUT1	2&lt;br /&gt;
#define DS1339_TRICKLE_CHARGER_DS0		4&lt;br /&gt;
#define DS1339_TRICKLE_CHARGER_DS1		8&lt;br /&gt;
#define DS1339_TRICKLE_CHARGER_TCS0		16&lt;br /&gt;
#define DS1339_TRICKLE_CHARGER_TCS1		32&lt;br /&gt;
#define DS1339_TRICKLE_CHARGER_TCS2		64&lt;br /&gt;
#define DS1339_TRICKLE_CHARGER_TCS3		128&lt;br /&gt;
&lt;br /&gt;
enum RTCWEEKDAYS {&lt;br /&gt;
	R_MO = 1, R_TU, R_WE, R_TH, R_FR, R_SA, R_SU&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
typedef struct {&lt;br /&gt;
	uint16_t         year;				// Year&lt;br /&gt;
	uint8_t          month;				// Month   [1..12]&lt;br /&gt;
	enum RTCWEEKDAYS weekday;			// Weekday [1..7 = R_MO..R_SU]&lt;br /&gt;
	uint8_t          day;				// Day     [1..31]&lt;br /&gt;
} rtcdate_t;&lt;br /&gt;
rtcdate_t rtc_date;&lt;br /&gt;
&lt;br /&gt;
typedef struct {&lt;br /&gt;
	uint8_t dst;						// Daylight-saving-time (time zone)&lt;br /&gt;
	uint8_t hour;						// Hour    [0..23]&lt;br /&gt;
	uint8_t minute;						// Minute  [0..59]&lt;br /&gt;
	uint8_t second;						// Second  [0..59]&lt;br /&gt;
} rtctime_t;&lt;br /&gt;
rtctime_t rtc_time;&lt;br /&gt;
&lt;br /&gt;
uint8_t BCD2DEC(uint8_t);&lt;br /&gt;
uint8_t DEC2BCD(uint8_t);&lt;br /&gt;
void DS1339_write_cfg(uint8_t);&lt;br /&gt;
void DS1339_init(void);&lt;br /&gt;
#define CALC_DST						// Time zone will be calculated&lt;br /&gt;
void DS1339_read(void);&lt;br /&gt;
void DS1339_write(void);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Temperature Sensor (LM75B):&lt;br /&gt;
&lt;br /&gt;
// Registers:&lt;br /&gt;
#define LM75B_TEMP						0&lt;br /&gt;
#define LM75B_CONF						1&lt;br /&gt;
#define LM75B_THYST						2&lt;br /&gt;
#define LM75B_TOS						3&lt;br /&gt;
&lt;br /&gt;
// Conf register bitmasks:&lt;br /&gt;
#define LM75B_CONF_DEFAULT				0		// Power on default&lt;br /&gt;
#define LM75B_CONF_SHUTDOWN				1&lt;br /&gt;
#define LM75B_CONF_OS_COMP_INT			2&lt;br /&gt;
#define LM75B_CONF_OS_POL				4&lt;br /&gt;
#define LM75B_CONF_OS_F_QUE0			8&lt;br /&gt;
#define LM75B_CONF_OS_F_QUE1			16&lt;br /&gt;
&lt;br /&gt;
extern double temperature;&lt;br /&gt;
&lt;br /&gt;
void LM75B_write_cfg(uint8_t);&lt;br /&gt;
#define LM75B_shutdown() {LM75B_write_cfg(LM75B_CONF_SHUTDOWN);}&lt;br /&gt;
#define LM75B_init() {LM75B_write_cfg(LM75B_CONF_DEFAULT);}&lt;br /&gt;
extern uint8_t temperature_low;&lt;br /&gt;
extern uint8_t temperature_high;&lt;br /&gt;
#define getTemperatureHigh() (temperature_high)&lt;br /&gt;
#define getTemperatureLow() (temperature_low)&lt;br /&gt;
void LM75B_read(void);&lt;br /&gt;
double LM75B_calculate(void);&lt;br /&gt;
double LM75B_measure(void);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Servo Controller (PCA9685):&lt;br /&gt;
&lt;br /&gt;
// Registers:&lt;br /&gt;
#define PCA9685_MODE1					0&lt;br /&gt;
#define PCA9685_MODE2					1&lt;br /&gt;
#define PCA9685_SUBADR1					2&lt;br /&gt;
#define PCA9685_SUBADR2					3&lt;br /&gt;
#define PCA9685_SUBADR3					4&lt;br /&gt;
#define PCA9685_ALLCALLADR				5&lt;br /&gt;
#define PCA9685_LED0_ON_L				6&lt;br /&gt;
#define PCA9685_LED0_ON_H				7&lt;br /&gt;
#define PCA9685_LED0_OFF_L				8&lt;br /&gt;
#define PCA9685_LED0_OFF_H				9&lt;br /&gt;
#define PCA9685_LED1_ON_L				10&lt;br /&gt;
#define PCA9685_LED1_ON_H				11&lt;br /&gt;
#define PCA9685_LED1_OFF_L				12&lt;br /&gt;
#define PCA9685_LED1_OFF_H				13&lt;br /&gt;
#define PCA9685_LED2_ON_L				14&lt;br /&gt;
#define PCA9685_LED2_ON_H				15&lt;br /&gt;
#define PCA9685_LED2_OFF_L				16&lt;br /&gt;
#define PCA9685_LED2_OFF_H				17&lt;br /&gt;
#define PCA9685_LED3_ON_L				18&lt;br /&gt;
#define PCA9685_LED3_ON_H				19&lt;br /&gt;
#define PCA9685_LED3_OFF_L				20&lt;br /&gt;
#define PCA9685_LED3_OFF_H				21&lt;br /&gt;
#define PCA9685_LED4_ON_L				22&lt;br /&gt;
#define PCA9685_LED4_ON_H				23&lt;br /&gt;
#define PCA9685_LED4_OFF_L				24&lt;br /&gt;
#define PCA9685_LED4_OFF_H				25&lt;br /&gt;
#define PCA9685_LED5_ON_L				26&lt;br /&gt;
#define PCA9685_LED5_ON_H				27&lt;br /&gt;
#define PCA9685_LED5_OFF_L				28&lt;br /&gt;
#define PCA9685_LED5_OFF_H				29&lt;br /&gt;
#define PCA9685_LED6_ON_L				30&lt;br /&gt;
#define PCA9685_LED6_ON_H				31&lt;br /&gt;
#define PCA9685_LED6_OFF_L				32&lt;br /&gt;
#define PCA9685_LED6_OFF_H				33&lt;br /&gt;
#define PCA9685_LED7_ON_L				34&lt;br /&gt;
#define PCA9685_LED7_ON_H				35&lt;br /&gt;
#define PCA9685_LED7_OFF_L				36&lt;br /&gt;
#define PCA9685_LED7_OFF_H				37&lt;br /&gt;
#define PCA9685_LED8_ON_L				38&lt;br /&gt;
#define PCA9685_LED8_ON_H				39&lt;br /&gt;
#define PCA9685_LED8_OFF_L				40&lt;br /&gt;
#define PCA9685_LED8_OFF_H				41&lt;br /&gt;
#define PCA9685_LED9_ON_L				42&lt;br /&gt;
#define PCA9685_LED9_ON_H				43&lt;br /&gt;
#define PCA9685_LED9_OFF_L				44&lt;br /&gt;
#define PCA9685_LED9_OFF_H				45&lt;br /&gt;
#define PCA9685_LED10_ON_L				46&lt;br /&gt;
#define PCA9685_LED10_ON_H				47&lt;br /&gt;
#define PCA9685_LED10_OFF_L				48&lt;br /&gt;
#define PCA9685_LED10_OFF_H				49&lt;br /&gt;
#define PCA9685_LED11_ON_L				50&lt;br /&gt;
#define PCA9685_LED11_ON_H				51&lt;br /&gt;
#define PCA9685_LED11_OFF_L				52&lt;br /&gt;
#define PCA9685_LED11_OFF_H				53&lt;br /&gt;
#define PCA9685_LED12_ON_L				54&lt;br /&gt;
#define PCA9685_LED12_ON_H				55&lt;br /&gt;
#define PCA9685_LED12_OFF_L				56&lt;br /&gt;
#define PCA9685_LED12_OFF_H				57&lt;br /&gt;
#define PCA9685_LED13_ON_L				58&lt;br /&gt;
#define PCA9685_LED13_ON_H				59&lt;br /&gt;
#define PCA9685_LED13_OFF_L				60&lt;br /&gt;
#define PCA9685_LED13_OFF_H				61&lt;br /&gt;
#define PCA9685_LED14_ON_L				62&lt;br /&gt;
#define PCA9685_LED14_ON_H				63&lt;br /&gt;
#define PCA9685_LED14_OFF_L				64&lt;br /&gt;
#define PCA9685_LED14_OFF_H				65&lt;br /&gt;
#define PCA9685_LED15_ON_L				66&lt;br /&gt;
#define PCA9685_LED15_ON_H				67&lt;br /&gt;
#define PCA9685_LED15_OFF_L				68&lt;br /&gt;
#define PCA9685_LED15_OFF_H				69&lt;br /&gt;
#define PCA9685_ALL_LED_ON_L			250&lt;br /&gt;
#define PCA9685_ALL_LED_ON_H			251&lt;br /&gt;
#define PCA9685_ALL_LED_OFF_L			252&lt;br /&gt;
#define PCA9685_ALL_LED_OFF_H			253&lt;br /&gt;
#define PCA9685_PRE_SCALE				254&lt;br /&gt;
#define PCA9685_TESTMODE				255&lt;br /&gt;
&lt;br /&gt;
// Mode1 register bitmasks:&lt;br /&gt;
#define PCA9685_MODE1_ALLCALL			1&lt;br /&gt;
#define PCA9685_MODE1_SUB3				2&lt;br /&gt;
#define PCA9685_MODE1_SUB2				4&lt;br /&gt;
#define PCA9685_MODE1_SUB1				8&lt;br /&gt;
#define PCA9685_MODE1_SLEEP				16&lt;br /&gt;
#define PCA9685_MODE1_AI				32&lt;br /&gt;
#define PCA9685_MODE1_EXTCLK			64&lt;br /&gt;
#define PCA9685_MODE1_RESTART			128&lt;br /&gt;
&lt;br /&gt;
// Mode2 register bitmasks:&lt;br /&gt;
#define PCA9685_MODE2_OUTNE01_DEFAULT	0&lt;br /&gt;
#define PCA9685_MODE2_OUTDRV			4&lt;br /&gt;
#define PCA9685_MODE2_OCH				8&lt;br /&gt;
#define PCA9685_MODE2_INVRT				16&lt;br /&gt;
&lt;br /&gt;
#define F_PCA9685						25000000.0	// Int. Clock: 25 MHz&lt;br /&gt;
&lt;br /&gt;
void PCA9685_init(uint16_t);&lt;br /&gt;
#define initServo(__FREQ__) {PCA9685_init(__FREQ__);}&lt;br /&gt;
uint8_t servo(uint8_t);&lt;br /&gt;
void PCA9685_set(uint8_t, uint16_t);&lt;br /&gt;
#define setServo(__SERVO__,__POS__) {PCA9685_set(servo(__SERVO__),__POS__);}&lt;br /&gt;
void PCA9685_shutdown(void);&lt;br /&gt;
void PCA9685_restart(void);&lt;br /&gt;
void setServoPower(uint8_t);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C LED Driver (TCA6507):&lt;br /&gt;
&lt;br /&gt;
// Registers:&lt;br /&gt;
#define TCA6507_SELECT0				0&lt;br /&gt;
#define TCA6507_SELECT1				1&lt;br /&gt;
#define TCA6507_SELECT2				2&lt;br /&gt;
#define TCA6507_FADEON_TIME			3&lt;br /&gt;
#define TCA6507_FULLYON_TIME		4&lt;br /&gt;
#define TCA6507_FADEOFF_TIME		5&lt;br /&gt;
#define TCA6507_1ST_FULLYOFF_TIME	6&lt;br /&gt;
#define TCA6507_2ND_FULLYOFF_TIME	7&lt;br /&gt;
#define TCA6507_MAXIMUM_INTENSITY	8&lt;br /&gt;
#define TCA6507_MASTER_INTENSITY	9&lt;br /&gt;
#define TCA6507_INITIALIZATION		10&lt;br /&gt;
&lt;br /&gt;
// Output states:&lt;br /&gt;
#define STATE_OFF					0&lt;br /&gt;
#define STATE_PWM0					2&lt;br /&gt;
#define STATE_PWM1					3&lt;br /&gt;
#define STATE_ON					4&lt;br /&gt;
#define STATE_MINT					5&lt;br /&gt;
#define STATE_BLINK0				6&lt;br /&gt;
#define STATE_BLINK1				7&lt;br /&gt;
&lt;br /&gt;
extern uint8_t select[3];&lt;br /&gt;
&lt;br /&gt;
void TCA6507_write_cfg(uint8_t, uint8_t);&lt;br /&gt;
void TCA6507_update(void);&lt;br /&gt;
void TCA6507_set(uint8_t, uint8_t);&lt;br /&gt;
#define setLED(__LED__,__STATE__) {TCA6507_set(__LED__,__STATE__);}&lt;br /&gt;
void TCA6507_shutdown(void);&lt;br /&gt;
void TCA6507_restart(void);&lt;br /&gt;
void TCA6507_init(void);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C 3D Magnetometer &amp;amp; Accelerometer (LSM303DLHC):&lt;br /&gt;
&lt;br /&gt;
// LSM303DLHC accelerometer internal registers:&lt;br /&gt;
#define CTRL_REG1_A					0x20&lt;br /&gt;
#define CTRL_REG2_A					0x21&lt;br /&gt;
#define CTRL_REG3_A					0x22&lt;br /&gt;
#define CTRL_REG4_A					0x23&lt;br /&gt;
#define CTRL_REG5_A					0x24&lt;br /&gt;
#define CTRL_REG6_A					0x25&lt;br /&gt;
#define REFERENCE_A					0x26&lt;br /&gt;
#define STATUS_REG_A				0x27&lt;br /&gt;
#define OUT_X_L_A					0x28&lt;br /&gt;
#define OUT_X_H_A					0x29&lt;br /&gt;
#define OUT_Y_L_A					0x2a&lt;br /&gt;
#define OUT_Y_H_A					0x2b&lt;br /&gt;
#define OUT_Z_L_A					0x2c&lt;br /&gt;
#define OUT_Z_H_A					0x2d&lt;br /&gt;
#define FIFO_CTRL_REG_A				0x2e&lt;br /&gt;
#define FIFO_SRC_REG_A				0x2f&lt;br /&gt;
#define INT1_CFG_A					0x30&lt;br /&gt;
#define INT1_SOURCE_A				0x31&lt;br /&gt;
#define INT1_THS_A					0x32&lt;br /&gt;
#define INT1_DURATION_A				0x33&lt;br /&gt;
#define INT2_CFG_A					0x34&lt;br /&gt;
#define INT2_SOURCE_A				0x35&lt;br /&gt;
#define INT2_THS_A					0x36&lt;br /&gt;
#define INT2_DURATION_A				0x37&lt;br /&gt;
#define CLICK_CFG_A					0x38&lt;br /&gt;
#define CLICK_SRC_A					0x39&lt;br /&gt;
#define CLICK_THS_A					0x3a&lt;br /&gt;
#define TIME_LIMIT_A				0x3b&lt;br /&gt;
#define TIME_LATENCY_A				0x3c&lt;br /&gt;
#define TIME_WINDOW_A				0x3d&lt;br /&gt;
&lt;br /&gt;
// LSM303DLHC accelerometer register settings:&lt;br /&gt;
#define CTRL_REG1_A_10HZ			0b00100111	// 10Hz &amp;amp; all axes enable&lt;br /&gt;
#define CTRL_REG1_A_50HZ			0b01000111	// 50Hz &amp;amp; all axes enable&lt;br /&gt;
#define CTRL_REG4_A_DEFAULT			0b00000000	// Default (Normal mode)&lt;br /&gt;
#define CTRL_REG4_A_HR				0b00001000	// HR output mode&lt;br /&gt;
&lt;br /&gt;
// LSM303DLHC magnetometer internal registers:&lt;br /&gt;
#define CRA_REG_M					0x00&lt;br /&gt;
#define CRB_REG_M					0x01&lt;br /&gt;
#define MR_REG_M					0x02&lt;br /&gt;
#define OUT_X_H_M					0x03&lt;br /&gt;
#define OUT_X_L_M					0x04&lt;br /&gt;
#define OUT_Z_H_M					0x05&lt;br /&gt;
#define OUT_Z_L_M					0x06&lt;br /&gt;
#define OUT_Y_H_M					0x07&lt;br /&gt;
#define OUT_Y_L_M					0x08&lt;br /&gt;
#define SR_REG_MG					0x09&lt;br /&gt;
#define IRA_REG_M					0x0a&lt;br /&gt;
#define IRB_REG_M					0x0b&lt;br /&gt;
#define IRC_REG_M					0x0c&lt;br /&gt;
#define TEMP_OUT_H_M				0x31&lt;br /&gt;
#define TEMP_OUT_L_M				0x32&lt;br /&gt;
&lt;br /&gt;
// LSM303DLHC magnetometer register settings:&lt;br /&gt;
#define CRA_REG_M_15HZ				0b00010000	// Default (Data rate 15Hz)&lt;br /&gt;
#define CRA_REG_M_15HZ_T_EN			0b10010000	// 15Hz &amp;amp; temperature enable&lt;br /&gt;
#define CRB_REG_M_13GAUSS			0b00100000	// Gain +-1.3Gauss&lt;br /&gt;
#define MR_REG_M_CCM				0b00000000	// Continuous-conversion mode&lt;br /&gt;
#define MR_REG_M_SCM				0b00000001	// Single-conversion mode&lt;br /&gt;
#define MR_REG_M_SLEEP				0b00000011	// Default (Sleep-mode)&lt;br /&gt;
&lt;br /&gt;
extern int16_t x_axisa, y_axisa, z_axisa;&lt;br /&gt;
extern double pitch, roll;&lt;br /&gt;
extern double xa, ya, za;&lt;br /&gt;
extern double the, phi;&lt;br /&gt;
&lt;br /&gt;
extern int16_t x_axism, y_axism, z_axism;&lt;br /&gt;
extern int16_t headingm;&lt;br /&gt;
extern double xm, ym, zm;&lt;br /&gt;
#ifdef GET_TEMP_M&lt;br /&gt;
extern int16_t temperaturem;&lt;br /&gt;
extern double temperature_mag;&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
extern int16_t headingtc;&lt;br /&gt;
&lt;br /&gt;
void LSM303DLHC_A_init(void);&lt;br /&gt;
void readLSM303DLHC_A(void);&lt;br /&gt;
void normalizeLSM303DLHC_A(void);&lt;br /&gt;
void positionLSM303DLHC_A(void);&lt;br /&gt;
&lt;br /&gt;
void LSM303DLHC_M_init(void);&lt;br /&gt;
void readLSM303DLHC_M(void);&lt;br /&gt;
void normalizeLSM303DLHC_M(void);&lt;br /&gt;
int16_t headingLSM303DLHC_M(void);&lt;br /&gt;
&lt;br /&gt;
int16_t headingLSM303DLHC_TC(void);&lt;br /&gt;
&lt;br /&gt;
void LSM303DLHC_init(void);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Analog Yaw-Rate Gyroscope (LY330ALH):&lt;br /&gt;
&lt;br /&gt;
#define LY330ALH_MODE_NORMAL		0			// Power on default&lt;br /&gt;
#define LY330ALH_MODE_SLEEP			1&lt;br /&gt;
#define LY330ALH_MODE_SELFTEST		2&lt;br /&gt;
#define LY330ALH_MODE_POWERDOWN		3			// Shutdown mode&lt;br /&gt;
&lt;br /&gt;
extern int16_t z_axisg;&lt;br /&gt;
&lt;br /&gt;
void LY330ALH_set_mode(uint8_t);&lt;br /&gt;
uint16_t getRP6Base_ADC1(void);&lt;br /&gt;
int16_t LY330ALH_measure(void);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Hot Swappable 2-Wire Bus Buffer (TCA4311A):&lt;br /&gt;
&lt;br /&gt;
//extern uint8_t readyBusbuff;			// See &amp;quot;I2C I/O Port Expander&amp;quot; section&lt;br /&gt;
extern uint8_t errorBusbuff;&lt;br /&gt;
&lt;br /&gt;
#define getReadyBusbuff() (readyBusbuff)&lt;br /&gt;
uint8_t readReadyBusbuff(void);&lt;br /&gt;
void TCA4311A_shutdown(void);&lt;br /&gt;
void TCA4311A_reconnect(void);&lt;br /&gt;
void setRP6Base_PWR(uint8_t);&lt;br /&gt;
void setI2CModulePower(uint8_t);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Button:&lt;br /&gt;
&lt;br /&gt;
//extern uint8_t pressedButton;			// See &amp;quot;I2C I/O Port Expander&amp;quot; section&lt;br /&gt;
&lt;br /&gt;
#define getPressedButton() (pressedButton)&lt;br /&gt;
uint8_t readButton(void);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Status LED:&lt;br /&gt;
&lt;br /&gt;
void setStatusLED(uint8_t);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// RP6 Sensor Board initialisation and shutdown:&lt;br /&gt;
&lt;br /&gt;
void sensor_board_init(void);&lt;br /&gt;
void sensor_board_shutdown(void);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
/******************************************************************************&lt;br /&gt;
 * Additional info&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Changelog:&lt;br /&gt;
 * &lt;br /&gt;
 *  ---&amp;gt; changes are documented in the file &amp;quot;RP6M256_Sensor_BoardLib.c&amp;quot;&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=====Library Source=====&lt;br /&gt;
Datei: RP6M256_Sensor_BoardLib.c&lt;br /&gt;
&amp;lt;pre&amp;gt;/* ****************************************************************************&lt;br /&gt;
 *                           _______________________&lt;br /&gt;
 *                           \| RP6  ROBOT SYSTEM |/&lt;br /&gt;
 *                            \_-_-_-_-_-_-_-_-_-_/           &amp;gt;&amp;gt;&amp;gt; RP6 M256 WIFI&lt;br /&gt;
 * ----------------------------------------------------------------------------&lt;br /&gt;
 * ----------------------------- [c]2014 - Dirk -------------------------------&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * File: RP6M256_Sensor_BoardLib.c&lt;br /&gt;
 * Version: 1.0&lt;br /&gt;
 * Target: RP6 M256 WIFI - ATMEGA2560 @16.00MHz&lt;br /&gt;
 *         and a RP6 Sensor Board (CONRAD 1082384)&lt;br /&gt;
 * Author(s): Dirk&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Description:&lt;br /&gt;
 * This is our new Library that contains basic routines and functions for&lt;br /&gt;
 * accessing the hardwired components of the RP6 Sensor Board (CONRAD 1082384).&lt;br /&gt;
 * This library assumes the RP6 Sensor Board Revision 2.0 (04.07.13).&lt;br /&gt;
 *&lt;br /&gt;
 * There are more sensors and actors, that may be connected to the RP6 Sensor&lt;br /&gt;
 * Board: Many I2C components including a GPS module (CONRAD 1082385), servo&lt;br /&gt;
 *        motors, SHARP IR distance sensors, LEDs, a camera ...&lt;br /&gt;
 * This library doesn't contain functions for these sensors/actors, because&lt;br /&gt;
 * they are not HARDWIRED to the RP6 Sensor Board and may be connected&lt;br /&gt;
 * OPTIONALLY.&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// RP6 Sensor Board hardwired components:&lt;br /&gt;
// - I2C I/O Port Expander (MAX7311)&lt;br /&gt;
// - I2C Real Time Clock (RTC DS1339)&lt;br /&gt;
// - I2C Temperature Sensor (LM75B)&lt;br /&gt;
// - I2C Servo Controller (PCA9685)&lt;br /&gt;
// - I2C LED Driver (TCA6507)&lt;br /&gt;
// - I2C 3D Magnetometer &amp;amp; Accelerometer (LSM303DLHC)&lt;br /&gt;
// - Analog Yaw-Rate Gyroscope (LY330ALH)&lt;br /&gt;
// - Hot Swappable 2-Wire Bus Buffer (TCA4311A)&lt;br /&gt;
// - Button&lt;br /&gt;
// - Status LED&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Includes:&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6M256_Sensor_BoardLib.h&amp;quot; 		&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Variables:&lt;br /&gt;
&lt;br /&gt;
uint8_t registerBuf[13]; &lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C I/O Port Expander (MAX7311):&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Sends the configuration word to a MAX7311.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: config -&amp;gt; Config word for control&lt;br /&gt;
 *                  registers&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void MAX7311_write_cfg(uint16_t config)&lt;br /&gt;
{&lt;br /&gt;
#ifdef SAFE_CONFIG&lt;br /&gt;
	config |= 0b1010000000001000;&lt;br /&gt;
#endif&lt;br /&gt;
	I2CTWI_transmit3Bytes(I2C_SENSOR_PORTEXP_ADR, MAX7311_PORT1_CONFIG, config, (config&amp;gt;&amp;gt;8));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
interrupt_RP6SBstatus_t interrupt_RP6SBstatus;&lt;br /&gt;
&lt;br /&gt;
/** &lt;br /&gt;
 * This function checks all interrupt pins on&lt;br /&gt;
 * the XBUS (INT1..3, INTU).&lt;br /&gt;
 * This function must be called VERY frequently&lt;br /&gt;
 * out of the main loop.&lt;br /&gt;
 * Bigger delays result in slower reaction to&lt;br /&gt;
 * interrupt requests of the RP6 Sensor Board.&lt;br /&gt;
 * Interrupt function table:&lt;br /&gt;
 *   Int. : Function 1      IRQ  Function 2       IRQ&lt;br /&gt;
 *   -------------------------------------------------&lt;br /&gt;
 *   INT1 : LSM303DLHC INT1  H&lt;br /&gt;
 *   INT2 : MAX7311   INT_N  L&lt;br /&gt;
 *   INT3 : LSM303DLHC INT2  H   DS1339 SQW/INT_N  L&lt;br /&gt;
 *   INTU : not used&lt;br /&gt;
 * You can see in the &amp;quot;IRQ&amp;quot; column, which level&lt;br /&gt;
 * (H/L) means an ACTIVE INTERRUPT signal.&lt;br /&gt;
 * The interrupt pin levels (H=true/L=false) are&lt;br /&gt;
 * read into the global interrupt_RP6SBstatus&lt;br /&gt;
 * variable.&lt;br /&gt;
 *&lt;br /&gt;
 * Hints: - This function checks the interrupt&lt;br /&gt;
 *          signals by polling. This is NOT the&lt;br /&gt;
 *          best way to to this job. You will&lt;br /&gt;
 *          have to write your own task, if you&lt;br /&gt;
 *          want to use the Pin Change Interrupt&lt;br /&gt;
 *          function of the ATmega2560&lt;br /&gt;
 *          microcontroller.&lt;br /&gt;
 *        - You cannot use both interrupt sources&lt;br /&gt;
 *          for INT3! So you should not use INT2&lt;br /&gt;
 *          of the LSM303DLHC together with the&lt;br /&gt;
 *          alarm function of the DS1339 (RTC)!&lt;br /&gt;
 *        - Every interrupt signal of the Sensor&lt;br /&gt;
 *          Board may be cut off from the XBUS&lt;br /&gt;
 *          by opening a jumper (Jx):&lt;br /&gt;
 *          INT1 -&amp;gt; J3 (LSM303DLHC INT1)&lt;br /&gt;
 *          INT2 -&amp;gt; J4 (MAX7311 INT_N)&lt;br /&gt;
 *          INT3 -&amp;gt; J2 (DS1339 SQW/INT_N)&lt;br /&gt;
 *          INT3 -&amp;gt; J5 (LSM303DLHC INT2)&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *&lt;br /&gt;
 *   if (!interrupt_RP6SBstatus.portexp)&lt;br /&gt;
 *        writeString_P(&amp;quot;==&amp;gt; MAX7311 INT_N!!!&amp;quot;);&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void task_checkINTs(void)&lt;br /&gt;
{&lt;br /&gt;
	if(IO_SENSOR_INT1_PIN &amp;amp; IO_SENSOR_INT1_IN)	// XBUS INT1 -&amp;gt; PJ3 (PCINT12)&lt;br /&gt;
		interrupt_RP6SBstatus.int1 = true;&lt;br /&gt;
	else&lt;br /&gt;
		interrupt_RP6SBstatus.int1 = false;&lt;br /&gt;
	if(IO_SENSOR_INT2_PIN &amp;amp; IO_SENSOR_INT2_IN)	// XBUS INT2 -&amp;gt; PJ6 (PCINT15)&lt;br /&gt;
		interrupt_RP6SBstatus.int2 = true;&lt;br /&gt;
	else&lt;br /&gt;
		interrupt_RP6SBstatus.int2 = false;&lt;br /&gt;
	if(IO_SENSOR_INT3_PIN &amp;amp; IO_SENSOR_INT3_IN)	// XBUS INT3 -&amp;gt; PJ5 (PCINT14)&lt;br /&gt;
		interrupt_RP6SBstatus.int3 = true;&lt;br /&gt;
	else&lt;br /&gt;
		interrupt_RP6SBstatus.int3 = false;&lt;br /&gt;
//	if(IO_SENSOR_INTU_PIN &amp;amp; IO_SENSOR_INTU_IN)	// XBUS INTU -&amp;gt; PJ4 (PCINT13)&lt;br /&gt;
//		interrupt_RP6SBstatus.intu = true;&lt;br /&gt;
//	else&lt;br /&gt;
//		interrupt_RP6SBstatus.intu = false;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
max7311IOs_t inport;&lt;br /&gt;
uint8_t readyBusbuff;&lt;br /&gt;
uint8_t pressedButton;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function checks all I/O ports (I/O 0.0..1.7)&lt;br /&gt;
 * of the MAX7311 sequentially!&lt;br /&gt;
 * You must call this function frequently out of&lt;br /&gt;
 * the main loop.&lt;br /&gt;
 * The I/O port values (true/false) are read into&lt;br /&gt;
 * the global inport variable.&lt;br /&gt;
 * The global variables readyBusbuff (2-Wire Bus&lt;br /&gt;
 * Buffer: Enable) and pressedButton (Button S1:&lt;br /&gt;
 * Pressed) contain actual values (true/false)&lt;br /&gt;
 * after execution of this task.&lt;br /&gt;
 *&lt;br /&gt;
 * Examples:&lt;br /&gt;
 *&lt;br /&gt;
 *   if (inport.rdy_busbuff)&lt;br /&gt;
 *        writeString_P(&amp;quot;I/O 0.3: High&amp;quot;);&lt;br /&gt;
 *   else writeString_P(&amp;quot;I/O 0.3: Low&amp;quot;);&lt;br /&gt;
 *   if (!inport.drdy_magacc)&lt;br /&gt;
 *        writeString_P(&amp;quot;I/O 1.5: Low&amp;quot;);&lt;br /&gt;
 *   if (pressedButton)&lt;br /&gt;
 *        writeString_P(&amp;quot;Button pressed!&amp;quot;);&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void task_RP6SensorBoard(void)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmitByte(I2C_SENSOR_PORTEXP_ADR, MAX7311_INPUT_PORT1);&lt;br /&gt;
	I2CTWI_readBytes(I2C_SENSOR_PORTEXP_ADR, registerBuf, 2);&lt;br /&gt;
	inport.word = (registerBuf[1] &amp;lt;&amp;lt; 8) + registerBuf[0];&lt;br /&gt;
	readyBusbuff = inport.rdy_busbuff;&lt;br /&gt;
	pressedButton = inport.io2_i2c;&lt;br /&gt;
	pressedButton = !pressedButton;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
max7311IOs_t outport;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Updates the I/O ports with current value from&lt;br /&gt;
 * the global outport variable!&lt;br /&gt;
 * If one or more port pins were configured as&lt;br /&gt;
 * output before, they will be set (high) or&lt;br /&gt;
 * cleared (low).&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *&lt;br /&gt;
 *   outport.word = 0b0000000000001001;&lt;br /&gt;
 *   MAX7311_update();&lt;br /&gt;
 *   // This clears all I/O ports and sets&lt;br /&gt;
 *   // the ports I/O 0.0 and I/O 0.3!&lt;br /&gt;
 *&lt;br /&gt;
 *   // Other possibility:&lt;br /&gt;
 *   outport.pwr_sharp_f = true;&lt;br /&gt;
 *   MAX7311_update();&lt;br /&gt;
 *   // This sets I/O 0.1 and does not&lt;br /&gt;
 *   // affect any other I/O port!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void MAX7311_update(void)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmit3Bytes(I2C_SENSOR_PORTEXP_ADR, MAX7311_OUTPUT_PORT1, outport.word, (outport.word&amp;gt;&amp;gt;8));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Writes the 16-bit data to a MAX7311.&lt;br /&gt;
 * The data are output with those I/O ports that&lt;br /&gt;
 * were configured as output before.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: data -&amp;gt; Data word&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void MAX7311_write(uint16_t data)&lt;br /&gt;
{&lt;br /&gt;
	outport.word = data;&lt;br /&gt;
	MAX7311_update();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Initializes the I/O Port Expander after power&lt;br /&gt;
 * on.&lt;br /&gt;
 *&lt;br /&gt;
 * Hint: If USE_PD5 is defined in the&lt;br /&gt;
 *       configuration header file, this&lt;br /&gt;
 *       function uses the RP6M256 portpin,&lt;br /&gt;
 *       that is connected to plug I/O: Pin 9&lt;br /&gt;
 *       instead of MAX7311 I/O 1.0!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void MAX7311_init(void)&lt;br /&gt;
{&lt;br /&gt;
#ifdef USE_PD5&lt;br /&gt;
	MAX7311_write_cfg(MAX7311_CONFIG_USE_PD5);&lt;br /&gt;
	IO_SENSOR_TCA4311A_EN_DDR |= IO_SENSOR_TCA4311A_EN_IN;		// Output&lt;br /&gt;
	IO_SENSOR_TCA4311A_EN_PORT |= IO_SENSOR_TCA4311A_EN_IN;		// High&lt;br /&gt;
#else&lt;br /&gt;
	MAX7311_write_cfg(MAX7311_CONFIG_DEFAULT);&lt;br /&gt;
#endif&lt;br /&gt;
	MAX7311_write(MAX7311_OUTPUT_DEFAULT);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Real Time Clock (RTC DS1339):&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function converts a BCD to a DEC value.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
uint8_t BCD2DEC(uint8_t bcd)&lt;br /&gt;
{&lt;br /&gt;
	return ((bcd &amp;gt;&amp;gt; 4) * 10 + (bcd &amp;amp; 0x0f));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function converts a DEC to a BCD value.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
uint8_t DEC2BCD(uint8_t dec)&lt;br /&gt;
{uint8_t units = dec % 10;&lt;br /&gt;
	if (dec /= 10) {&lt;br /&gt;
		return (units + (DEC2BCD(dec) &amp;lt;&amp;lt; 4));&lt;br /&gt;
	}&lt;br /&gt;
	else {&lt;br /&gt;
		return units;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Sends the configuration byte to a DS1339.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: Config byte for control register&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void DS1339_write_cfg(uint8_t config)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_RTC_ADR, DS1339_CONTROL, config);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Initializes the DS1339 Trickle Charger&lt;br /&gt;
 * function to the default for the RP6 Sensor&lt;br /&gt;
 * Board: One diode and 2kOhm resistor.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void DS1339_init(void)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_RTC_ADR, DS1339_TRICKLE_CHARGER, DS1339_TRICKLE_CHARGER_DEFAULT);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Reads all data registers of the Real Time Clock (RTC).&lt;br /&gt;
 * They are stored in the time &amp;amp; date variables defined in&lt;br /&gt;
 * the library header.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void DS1339_read(void)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmitByte(I2C_SENSOR_RTC_ADR, DS1339_SECONDS);&lt;br /&gt;
	I2CTWI_readBytes(I2C_SENSOR_RTC_ADR, registerBuf, 7);&lt;br /&gt;
	rtc_time.second = BCD2DEC(registerBuf[0]);&lt;br /&gt;
	rtc_time.minute = BCD2DEC(registerBuf[1]);&lt;br /&gt;
	rtc_time.hour = BCD2DEC(registerBuf[2] &amp;amp; 0x3f);&lt;br /&gt;
	rtc_date.weekday = (registerBuf[3] &amp;amp; 0x07);&lt;br /&gt;
	rtc_date.day = BCD2DEC(registerBuf[4]);&lt;br /&gt;
	rtc_date.month = BCD2DEC(registerBuf[5] &amp;amp; 0x7f);&lt;br /&gt;
	if(registerBuf[5] &amp;amp; 0x80) rtc_date.year = 100;&lt;br /&gt;
	else rtc_date.year = 0;&lt;br /&gt;
	rtc_date.year += BCD2DEC(registerBuf[6]);&lt;br /&gt;
	rtc_date.year += 2000;&lt;br /&gt;
	rtc_time.dst = 0;&lt;br /&gt;
#ifdef CALC_DST&lt;br /&gt;
	// Calculate MESZ (DST):&lt;br /&gt;
	uint8_t wday = rtc_date.weekday;			// Weekday [1..7 = R_MO..R_SU]&lt;br /&gt;
	if(wday == 7) wday = 0;&lt;br /&gt;
	if(rtc_date.month &amp;lt; 3 || rtc_date.month &amp;gt; 10) {&lt;br /&gt;
		return;&lt;br /&gt;
	}&lt;br /&gt;
	if((rtc_date.day - wday &amp;gt;= 25)&lt;br /&gt;
	 &amp;amp;&amp;amp; (wday || rtc_time.hour &amp;gt;= 2)) {&lt;br /&gt;
		if(rtc_date.month == 10)&lt;br /&gt;
			return;&lt;br /&gt;
	}&lt;br /&gt;
	else {&lt;br /&gt;
		if(rtc_date.month == 3) {&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	rtc_time.dst = 1;&lt;br /&gt;
#endif&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Writes the time &amp;amp; date infos in the variables defined in&lt;br /&gt;
 * the library header to the Real Time Clock (RTC).&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void DS1339_write(void)&lt;br /&gt;
{&lt;br /&gt;
	registerBuf[0] = DS1339_SECONDS;&lt;br /&gt;
	registerBuf[1] = DEC2BCD(rtc_time.second);&lt;br /&gt;
	registerBuf[2] = DEC2BCD(rtc_time.minute);&lt;br /&gt;
	registerBuf[3] = DEC2BCD(rtc_time.hour);&lt;br /&gt;
	registerBuf[4] = rtc_date.weekday;&lt;br /&gt;
	registerBuf[5] = DEC2BCD(rtc_date.day);&lt;br /&gt;
	registerBuf[6] = DEC2BCD(rtc_date.month);&lt;br /&gt;
	registerBuf[7] = DEC2BCD(rtc_date.year - 2000);&lt;br /&gt;
	I2CTWI_transmitBytes(I2C_SENSOR_RTC_ADR, &amp;amp;registerBuf[0], 8);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Temperature Sensor (LM75B):&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Sends the configuration byte to a LM75B.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: Config byte for Conf register&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void LM75B_write_cfg(uint8_t config)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_TEMP_ADR, LM75B_CONF, config);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
uint8_t temperature_low;&lt;br /&gt;
uint8_t temperature_high;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Reads the two data registers of the temperature&lt;br /&gt;
 * sensor's Temp register.&lt;br /&gt;
 * They are stored in the variables temperature_low&lt;br /&gt;
 * and _high.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void LM75B_read(void)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmitByte(I2C_SENSOR_TEMP_ADR, LM75B_TEMP);&lt;br /&gt;
	I2CTWI_readBytes(I2C_SENSOR_TEMP_ADR, registerBuf, 2);&lt;br /&gt;
	temperature_high = registerBuf[0];&lt;br /&gt;
	temperature_low = registerBuf[1];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
double temperature;						// Temperature [°C]&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Calculates and returns the temperature value&lt;br /&gt;
 * by using the data read from the LM75B with&lt;br /&gt;
 * the function LM75B_read(). The sensor is&lt;br /&gt;
 * designed for 11 bit measurement and 0.125°C&lt;br /&gt;
 * resolution.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
double LM75B_calculate(void)&lt;br /&gt;
{&lt;br /&gt;
	int16_t tempraw = 0;&lt;br /&gt;
	double temp;&lt;br /&gt;
&lt;br /&gt;
	tempraw = (getTemperatureHigh() &amp;lt;&amp;lt; 8) | getTemperatureLow();&lt;br /&gt;
	tempraw &amp;gt;&amp;gt;= 5;&lt;br /&gt;
	if (tempraw &amp;amp; 1024)							// Calculate temperature&lt;br /&gt;
		tempraw = (tempraw &amp;amp; 1023) - 1024;&lt;br /&gt;
	else&lt;br /&gt;
		tempraw = tempraw &amp;amp; 1023;&lt;br /&gt;
	temp = tempraw * 0.125;&lt;br /&gt;
	return temp;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Performs a 11 bit measurement and returns the&lt;br /&gt;
 * temperature [°C]. The sensor has a measuring&lt;br /&gt;
 * cycle of 100ms. So it makes no sense calling&lt;br /&gt;
 * this function at a frequency above 10Hz.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
double LM75B_measure(void)&lt;br /&gt;
{&lt;br /&gt;
//	LM75B_init();&lt;br /&gt;
	LM75B_read();								// Read data&lt;br /&gt;
	return (LM75B_calculate());					// Calculate value&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Servo Controller (PCA9685):&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Call this once before using the servo function.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: PWM frequency [40..1000 Hz]&lt;br /&gt;
 *&lt;br /&gt;
 * Hints: - Default servo frequency is 50 Hz!&lt;br /&gt;
 *        - The servo power is NOT switched on by&lt;br /&gt;
 *          this function!&lt;br /&gt;
 *&lt;br /&gt;
 * There is also a macro initServo(freq), which&lt;br /&gt;
 * does exactly the same as this function.&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *   initServo(50);&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void PCA9685_init(uint16_t freq)&lt;br /&gt;
{&lt;br /&gt;
	outport.oen_servo = false;					// I/O 1.3: Low&lt;br /&gt;
	MAX7311_update();&lt;br /&gt;
	if ((freq &amp;lt; 40) || (freq &amp;gt; 1000)) freq = 50;&lt;br /&gt;
	I2CTWI_transmitByte(I2C_SENSOR_SERVO_ADR, PCA9685_MODE2);&lt;br /&gt;
	uint8_t last_mode = I2CTWI_readByte(I2C_SENSOR_SERVO_ADR);&lt;br /&gt;
	last_mode &amp;amp;= ~PCA9685_MODE2_INVRT;			// Clear INVRT bit&lt;br /&gt;
	last_mode |= PCA9685_MODE2_OUTDRV;			// Set OUTDRV bit&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_SERVO_ADR, PCA9685_MODE2, last_mode);&lt;br /&gt;
	I2CTWI_transmitByte(I2C_SENSOR_SERVO_ADR, PCA9685_MODE1);&lt;br /&gt;
	last_mode = I2CTWI_readByte(I2C_SENSOR_SERVO_ADR);&lt;br /&gt;
	last_mode |= PCA9685_MODE1_AI;				// Set AI bit&lt;br /&gt;
	uint8_t mode1 = last_mode;&lt;br /&gt;
	mode1 |= PCA9685_MODE1_SLEEP;				// Set SLEEP bit&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_SERVO_ADR, PCA9685_MODE1, mode1);&lt;br /&gt;
	uint8_t prescale = (uint8_t) (F_PCA9685 / 4096 / freq - 0.5);&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_SERVO_ADR, PCA9685_PRE_SCALE, prescale);&lt;br /&gt;
	last_mode &amp;amp;= ~PCA9685_MODE1_SLEEP;			// Clear SLEEP bit&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_SERVO_ADR, PCA9685_MODE1, last_mode);&lt;br /&gt;
	mSleep(1);&lt;br /&gt;
	last_mode |= PCA9685_MODE1_RESTART;			// Clear RESTART bit&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_SERVO_ADR, PCA9685_MODE1, last_mode);&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_SERVO_ADR, PCA9685_LED8_ON_H, 0x10);&lt;br /&gt;
	return;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/** &lt;br /&gt;
 * Returns the channel belonging to a servo number.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: number -&amp;gt; Servo number [1..8]&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
uint8_t servo(uint8_t number)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t channel;&lt;br /&gt;
&lt;br /&gt;
	switch (number) {&lt;br /&gt;
		case 1 :&lt;br /&gt;
			channel = CH_SERVO_1; break;&lt;br /&gt;
		case 2 :&lt;br /&gt;
			channel = CH_SERVO_2; break;&lt;br /&gt;
		case 3 :&lt;br /&gt;
			channel = CH_SERVO_3; break;&lt;br /&gt;
		case 4 :&lt;br /&gt;
			channel = CH_SERVO_4; break;&lt;br /&gt;
		case 5 :&lt;br /&gt;
			channel = CH_SERVO_5; break;&lt;br /&gt;
		case 6 :&lt;br /&gt;
			channel = CH_SERVO_6; break;&lt;br /&gt;
		case 7 :&lt;br /&gt;
			channel = CH_SERVO_7; break;&lt;br /&gt;
		case 8 :&lt;br /&gt;
			channel = CH_SERVO_8; break;&lt;br /&gt;
		default : channel = CH_SERVO_1;&lt;br /&gt;
	}&lt;br /&gt;
	return channel;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This is the servo position set function.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: channel -&amp;gt; Channel number [1..16]&lt;br /&gt;
 *        pos     -&amp;gt; Servo position [SERVOx_LT..SERVOx_RT]&lt;br /&gt;
 *&lt;br /&gt;
 * Hints: - A servo position of 205 means 1 ms servo impulse,&lt;br /&gt;
 *          a position of 410 means a 2 ms servo impulse!&lt;br /&gt;
 *          You may calculate the servo impulse length by:&lt;br /&gt;
 *          ==&amp;gt; Impulse [ms] = servo position / 204.8 &amp;lt;==&lt;br /&gt;
 *          (Formula only valid for a PWM of 50 Hz!)&lt;br /&gt;
 *&lt;br /&gt;
 * There is also a macro setServo(servo, pos), which&lt;br /&gt;
 * does nearly the same as this function, but the first&lt;br /&gt;
 * parameter is the servo and NOT the channel number.&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *   setServo(2,300);&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void PCA9685_set(uint8_t channel, uint16_t pos)&lt;br /&gt;
{&lt;br /&gt;
	if ((channel == 0) || (channel &amp;gt; 16))&lt;br /&gt;
		return;&lt;br /&gt;
	uint8_t reg = channel * 4 + 4;				// Register LEDx_OFF_L&lt;br /&gt;
	I2CTWI_transmit3Bytes(I2C_SENSOR_SERVO_ADR, reg, (pos &amp;amp; 0x00ff), (pos &amp;gt;&amp;gt; 8));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * If the servos are not moving for a while, the&lt;br /&gt;
 * servo function can be stopped with this&lt;br /&gt;
 * function (PCA9685 set to sleep mode).&lt;br /&gt;
 *&lt;br /&gt;
 * Hint: The servo power is NOT switched off by&lt;br /&gt;
 *       this function!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void PCA9685_shutdown(void)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_SERVO_ADR, PCA9685_ALL_LED_OFF_H, 0x10);&lt;br /&gt;
	I2CTWI_transmitByte(I2C_SENSOR_SERVO_ADR, PCA9685_MODE1);&lt;br /&gt;
	uint8_t mode1 = I2CTWI_readByte(I2C_SENSOR_SERVO_ADR);&lt;br /&gt;
	mode1 |= PCA9685_MODE1_SLEEP;				// Set SLEEP bit&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_SERVO_ADR, PCA9685_MODE1, mode1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * If the servo function was stopped with the&lt;br /&gt;
 * function PCA9685_shutdown() before, it can be&lt;br /&gt;
 * (re)started again with this function.&lt;br /&gt;
 *&lt;br /&gt;
 * Hint: The servo power is NOT switched on by&lt;br /&gt;
 *       this function!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void PCA9685_restart(void)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmitByte(I2C_SENSOR_SERVO_ADR, PCA9685_MODE1);&lt;br /&gt;
	uint8_t mode1 = I2CTWI_readByte(I2C_SENSOR_SERVO_ADR);&lt;br /&gt;
	if (mode1 &amp;amp; PCA9685_MODE1_RESTART) {		// RESTART bit set?&lt;br /&gt;
		mode1 &amp;amp;= ~PCA9685_MODE1_SLEEP;			// Clear SLEEP bit&lt;br /&gt;
		I2CTWI_transmit2Bytes(I2C_SENSOR_SERVO_ADR, PCA9685_MODE1, mode1);&lt;br /&gt;
		mSleep(1);&lt;br /&gt;
		mode1 |= PCA9685_MODE1_RESTART;			// Clear RESTART bit&lt;br /&gt;
		I2CTWI_transmit2Bytes(I2C_SENSOR_SERVO_ADR, PCA9685_MODE1, mode1);&lt;br /&gt;
		I2CTWI_transmit2Bytes(I2C_SENSOR_SERVO_ADR, PCA9685_ALL_LED_OFF_H, 0);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/** &lt;br /&gt;
 * With this function you can switch the servo&lt;br /&gt;
 * power on or off.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: pwr -&amp;gt; 0 (false) = servo power off&lt;br /&gt;
 *               &amp;gt;0 (true) = servo power on&lt;br /&gt;
 *&lt;br /&gt;
 * Hints: - If connected servos are not used, you&lt;br /&gt;
 *          should always switch the servo power off&lt;br /&gt;
 *          (default) to save energy!&lt;br /&gt;
 *        - The PCA9685 is NOT restarted or put into&lt;br /&gt;
 *          shutdown mode by this function!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void setServoPower(uint8_t pwr)&lt;br /&gt;
{&lt;br /&gt;
	if(pwr &amp;gt; 0)&lt;br /&gt;
		outport.pwr_servo = true;				// I/O 1.4: High&lt;br /&gt;
	else&lt;br /&gt;
		outport.pwr_servo = false;				// I/O 1.4: Low&lt;br /&gt;
	MAX7311_update();&lt;br /&gt;
}	&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C LED Driver (TCA6507):&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Sends the configuration byte to TCA6507's&lt;br /&gt;
 * internal registers.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: reg    -&amp;gt; Register address [0..10]&lt;br /&gt;
 *        config -&amp;gt; Config byte for internal&lt;br /&gt;
 *                  registers&lt;br /&gt;
 *&lt;br /&gt;
 * Hints: - With this function you can write to&lt;br /&gt;
 *          all internal registers of the LED&lt;br /&gt;
 *          driver, see &amp;quot;Registers:&amp;quot; in the&lt;br /&gt;
 *          library header file!&lt;br /&gt;
 *        - Mainly you will use this function&lt;br /&gt;
 *          for setting time (regs 3..7) and&lt;br /&gt;
 *          intensity (regs 8, 9) values.&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *   TCA6507_write_cfg(TCA6507_MAXIMUM_INTENSITY,0x77);&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void TCA6507_write_cfg(uint8_t reg, uint8_t config)&lt;br /&gt;
{&lt;br /&gt;
	if(reg &amp;gt; 10) reg = 0;&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_LEDDRIVER_ADR, reg, config);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
uint8_t select[3];&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Updates the LED driver select registers (0..2)&lt;br /&gt;
 * with the global select array!&lt;br /&gt;
 *&lt;br /&gt;
 * Hint: - Also have a look at Table 4 in the&lt;br /&gt;
 *         TCA6507 datasheet!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void TCA6507_update(void)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmit4Bytes(I2C_SENSOR_LEDDRIVER_ADR, (TCA6507_SELECT0 | 0x10), select[0], select[1], select[2]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This is the LED state set function.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: led   -&amp;gt; LED number [0..6]&lt;br /&gt;
 *        state -&amp;gt; LED state  [0..7]&lt;br /&gt;
 *&lt;br /&gt;
 * Hints: - Possible driver states [0..7] see&lt;br /&gt;
 *          &amp;quot;Output states:&amp;quot; in the library&lt;br /&gt;
 *          header file!&lt;br /&gt;
 *        - Also have a look at Table 4 in the&lt;br /&gt;
 *          TCA6507 datasheet!&lt;br /&gt;
 *&lt;br /&gt;
 * There is also a macro setLED(led, state), which&lt;br /&gt;
 * does exactly the same as this function.&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *   setLED(1,4);&lt;br /&gt;
 *   // Switches LED1 ON&lt;br /&gt;
 *   // ... OR ...&lt;br /&gt;
 *   setLED(LED1,STATE_ON);&lt;br /&gt;
 *   // does the same.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void TCA6507_set(uint8_t led, uint8_t state)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t i, mask;&lt;br /&gt;
&lt;br /&gt;
	if(led &amp;gt; 6) led = 0;&lt;br /&gt;
	led = 1 &amp;lt;&amp;lt; led;&lt;br /&gt;
	mask = 1;&lt;br /&gt;
	for(i = 0; i &amp;lt; 3; i++) {&lt;br /&gt;
		select[i] &amp;amp;= ~led;&lt;br /&gt;
		if(state &amp;amp; mask)&lt;br /&gt;
			select[i] |= led;&lt;br /&gt;
		mask &amp;lt;&amp;lt;= 1;&lt;br /&gt;
	}&lt;br /&gt;
	TCA6507_update();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * If the LEDs are not needed for a while, the&lt;br /&gt;
 * LED driver can be stopped with this function&lt;br /&gt;
 * (TCA6507 set to shutdown mode).&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void TCA6507_shutdown(void)&lt;br /&gt;
{&lt;br /&gt;
	outport.en_leddriv = false;					// I/O 0.4: Low&lt;br /&gt;
	MAX7311_update();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * If the LED driver was stopped with the&lt;br /&gt;
 * function TCA6507_shutdown() before, it can be&lt;br /&gt;
 * (re)started again with this function.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void TCA6507_restart(void)&lt;br /&gt;
{&lt;br /&gt;
	outport.en_leddriv = true;					// I/O 0.4: High&lt;br /&gt;
	MAX7311_update();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Initializes the LED driver after power on by&lt;br /&gt;
 * switching all LEDs off.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void TCA6507_init(void)&lt;br /&gt;
{&lt;br /&gt;
	select[0] = 0;&lt;br /&gt;
	select[1] = 0;&lt;br /&gt;
	select[2] = 0;&lt;br /&gt;
	TCA6507_update();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C 3D Magnetometer &amp;amp; Accelerometer (LSM303DLHC):&lt;br /&gt;
&lt;br /&gt;
// --------------------------------------------&lt;br /&gt;
// LSM303DLHC accelerometer functions:&lt;br /&gt;
int16_t x_axisa, y_axisa, z_axisa;&lt;br /&gt;
double pitch, roll;&lt;br /&gt;
double xa, ya, za;&lt;br /&gt;
double the, phi;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Call this once before using the 3D-Accelerometer.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void LSM303DLHC_A_init(void)&lt;br /&gt;
{&lt;br /&gt;
	// Set normal power mode, 10 Hz data rate, all axes enabled:&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_LSM303DLHC_A_ADR, CTRL_REG1_A, CTRL_REG1_A_10HZ);&lt;br /&gt;
	mSleep(10);&lt;br /&gt;
	// Set HD mode:&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_LSM303DLHC_A_ADR, CTRL_REG4_A, CTRL_REG4_A_HR);&lt;br /&gt;
	mSleep(10);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function reads the X-axis, Y-axis and Z-axis values&lt;br /&gt;
 * from the LSM303DLHC accelerometer and stores them in the&lt;br /&gt;
 * global variables x_axisa, y_axisa and z_axisa.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void readLSM303DLHC_A(void)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t readBuf[6];&lt;br /&gt;
&lt;br /&gt;
	I2CTWI_transmitByte(I2C_SENSOR_LSM303DLHC_A_ADR, (OUT_X_L_A | 0x80));&lt;br /&gt;
	I2CTWI_readBytes(I2C_SENSOR_LSM303DLHC_A_ADR, readBuf, 6); // Read  X-/Y-/Z-axis&lt;br /&gt;
	// xb = y:&lt;br /&gt;
	x_axisa = ((readBuf[OUT_Y_H_A - OUT_X_L_A] &amp;lt;&amp;lt; 8) + readBuf[OUT_Y_L_A - OUT_X_L_A]) / 16;&lt;br /&gt;
	// yb = x:&lt;br /&gt;
	y_axisa = ((readBuf[OUT_X_H_A - OUT_X_L_A] &amp;lt;&amp;lt; 8) + readBuf[OUT_X_L_A - OUT_X_L_A]) / 16;&lt;br /&gt;
	// zb = z:&lt;br /&gt;
	z_axisa = ((readBuf[OUT_Z_H_A - OUT_X_L_A] &amp;lt;&amp;lt; 8) + readBuf[OUT_Z_L_A - OUT_X_L_A]) / 16;&lt;br /&gt;
	mSleep(10);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function limits and normalizes the x-axisa,&lt;br /&gt;
 * y-axisa and z-axisa values read from the LSM303DLHC&lt;br /&gt;
 * accelerometer with the function readLSM303DLHC_A() and&lt;br /&gt;
 * stores them in the global double variables xa, ya and&lt;br /&gt;
 * za.&lt;br /&gt;
 * It also calculates the position in space in form of the&lt;br /&gt;
 * tilt angles (the = pitch, phi = roll) and stores them&lt;br /&gt;
 * in the global double variables the and phi.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void normalizeLSM303DLHC_A(void)&lt;br /&gt;
{&lt;br /&gt;
	// Limit raw values:&lt;br /&gt;
	if (x_axisa &amp;lt; MIN_X_A) x_axisa = MIN_X_A;&lt;br /&gt;
	if (x_axisa &amp;gt; MAX_X_A) x_axisa = MAX_X_A;&lt;br /&gt;
	if (y_axisa &amp;lt; MIN_Y_A) y_axisa = MIN_Y_A;&lt;br /&gt;
	if (y_axisa &amp;gt; MAX_Y_A) y_axisa = MAX_Y_A;&lt;br /&gt;
	if (z_axisa &amp;lt; MIN_Z_A) z_axisa = MIN_Z_A;&lt;br /&gt;
	if (z_axisa &amp;gt; MAX_Z_A) z_axisa = MAX_Z_A;&lt;br /&gt;
	xa = (double) x_axisa / 1000.0;&lt;br /&gt;
	ya = (double) y_axisa / 1000.0;&lt;br /&gt;
	za = (double) z_axisa / 1000.0;&lt;br /&gt;
	// Calculate Pitch and Roll:&lt;br /&gt;
	phi = asin(xa);								// Calculate the and phi&lt;br /&gt;
	the = asin(ya / cos(the));					//  from the raw values&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function calculates the position in space by&lt;br /&gt;
 * using the the and phi values (see function&lt;br /&gt;
 * normalizeLSM303DLHC_A()!). It stores the position&lt;br /&gt;
 * in the global double variables pitch and roll. &lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void positionLSM303DLHC_A(void)&lt;br /&gt;
{&lt;br /&gt;
	pitch = the * 180 / M_PI + OFFSET_PITCH_A;&lt;br /&gt;
	roll = phi * 180 / M_PI + OFFSET_ROLL_A;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// LSM303DLHC magnetometer functions:&lt;br /&gt;
int16_t x_axism, y_axism, z_axism;&lt;br /&gt;
int16_t headingm;&lt;br /&gt;
double xm, ym, zm;&lt;br /&gt;
#ifdef GET_TEMP_M&lt;br /&gt;
int16_t temperaturem;&lt;br /&gt;
double temperature_mag;&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
int16_t headingtc;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Call this once before using the 3D-Compass.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void LSM303DLHC_M_init(void)&lt;br /&gt;
{&lt;br /&gt;
#ifdef GET_TEMP_M&lt;br /&gt;
	// Set Data output rate to 15Hz, enable temperature sensor:&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_LSM303DLHC_M_ADR, CRA_REG_M, CRA_REG_M_15HZ_T_EN);&lt;br /&gt;
#else&lt;br /&gt;
	// Set Data output rate to 15Hz:&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_LSM303DLHC_M_ADR, CRA_REG_M, CRA_REG_M_15HZ);&lt;br /&gt;
#endif&lt;br /&gt;
	mSleep(10);&lt;br /&gt;
	// Set Gain to +-1.3Gauss:&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_LSM303DLHC_M_ADR, CRB_REG_M, CRB_REG_M_13GAUSS);&lt;br /&gt;
	mSleep(10);&lt;br /&gt;
	// Set Continuous-conversion mode:&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_LSM303DLHC_M_ADR, MR_REG_M, MR_REG_M_CCM);&lt;br /&gt;
	mSleep(10);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function reads the X-axis, Y-axis, Z-axis and&lt;br /&gt;
 * temperature values from the LSM303DLHC magnetometer&lt;br /&gt;
 * and stores them in the global variables x_axism,&lt;br /&gt;
 * y_axism, z_axism and temperaturem.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void readLSM303DLHC_M(void)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t readBuf[6];&lt;br /&gt;
&lt;br /&gt;
	I2CTWI_transmitByte(I2C_SENSOR_LSM303DLHC_M_ADR, OUT_X_H_M);&lt;br /&gt;
	I2CTWI_readBytes(I2C_SENSOR_LSM303DLHC_M_ADR, readBuf, 6); // Read  X-/Y-/Z-axis&lt;br /&gt;
	// xb = x:&lt;br /&gt;
	x_axism = (readBuf[OUT_X_H_M - OUT_X_H_M] &amp;lt;&amp;lt; 8) + readBuf[OUT_X_L_M - OUT_X_H_M];&lt;br /&gt;
	// yb = y:&lt;br /&gt;
	y_axism = (readBuf[OUT_Y_H_M - OUT_X_H_M] &amp;lt;&amp;lt; 8) + readBuf[OUT_Y_L_M - OUT_X_H_M];&lt;br /&gt;
	// zb = z:&lt;br /&gt;
	z_axism = (readBuf[OUT_Z_H_M - OUT_X_H_M] &amp;lt;&amp;lt; 8) + readBuf[OUT_Z_L_M - OUT_X_H_M];&lt;br /&gt;
	mSleep(10);&lt;br /&gt;
#ifdef GET_TEMP_M&lt;br /&gt;
	// Read temperature raw value:&lt;br /&gt;
	I2CTWI_transmitByte(I2C_SENSOR_LSM303DLHC_M_ADR, TEMP_OUT_H_M);&lt;br /&gt;
	readBuf[0] = I2CTWI_readByte(I2C_SENSOR_LSM303DLHC_M_ADR);&lt;br /&gt;
	I2CTWI_transmitByte(I2C_SENSOR_LSM303DLHC_M_ADR, TEMP_OUT_L_M);&lt;br /&gt;
	readBuf[1] = I2CTWI_readByte(I2C_SENSOR_LSM303DLHC_M_ADR);&lt;br /&gt;
	temperaturem = (readBuf[0] &amp;lt;&amp;lt; 8) | readBuf[1];&lt;br /&gt;
	temperaturem &amp;gt;&amp;gt;= 4;&lt;br /&gt;
	if (temperaturem &amp;amp; 2048)					// Calculate temperature&lt;br /&gt;
		temperaturem = (temperaturem &amp;amp; 2047) - 2048;&lt;br /&gt;
	else&lt;br /&gt;
		temperaturem = temperaturem &amp;amp; 2047;&lt;br /&gt;
	mSleep(10);&lt;br /&gt;
#endif&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function compensates hard iron effects and&lt;br /&gt;
 * scales the x-axism, y-axism and z-axism values read&lt;br /&gt;
 * from the LSM303DLHC magnetometer with the function&lt;br /&gt;
 * readLSM303DLHC_M() and stores them in the global&lt;br /&gt;
 * double variables xm, ym and zm.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void normalizeLSM303DLHC_M(void)&lt;br /&gt;
{&lt;br /&gt;
	// Add hard iron offsets:&lt;br /&gt;
	x_axism += OFFSET_X_M;&lt;br /&gt;
	y_axism += OFFSET_Y_M;&lt;br /&gt;
	z_axism += OFFSET_Z_M;&lt;br /&gt;
	// Scale raw values:&lt;br /&gt;
	xm = (x_axism - MIN_X_M) / (MAX_X_M - MIN_X_M) * 2 - 1;&lt;br /&gt;
	ym = (y_axism - MIN_Y_M) / (MAX_Y_M - MIN_Y_M) * 2 - 1;&lt;br /&gt;
	zm = (z_axism - MIN_Z_M) / (MAX_Z_M - MIN_Z_M) * 2 - 1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function calculates the heading by using the&lt;br /&gt;
 * normalized sensor values xm and ym (see function&lt;br /&gt;
 * normalizeLSM303DLHC_M()!). The heading is a value&lt;br /&gt;
 * from 0° to 359°. If the robot's front (and the&lt;br /&gt;
 * RP6 Sensor Board's front edge with the two&lt;br /&gt;
 * headlights) points to ...&lt;br /&gt;
 *   north -&amp;gt; heading is 0°,&lt;br /&gt;
 *   east  -&amp;gt; heading is 90°,&lt;br /&gt;
 *   south -&amp;gt; heading is 180°,&lt;br /&gt;
 *   west  -&amp;gt; heading is 270°.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
int16_t headingLSM303DLHC_M(void)&lt;br /&gt;
{&lt;br /&gt;
	double hdg = atan2(ym, xm) * 180 / M_PI + DECLINATION_M;&lt;br /&gt;
	if(hdg &amp;lt; 0.0) hdg += 360.0;&lt;br /&gt;
	return ((int16_t) hdg);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// --------------------------------------------&lt;br /&gt;
/**&lt;br /&gt;
 * This function calculates the TILT COMPENSATED&lt;br /&gt;
 * heading by using accelerometer (the, phi) AND&lt;br /&gt;
 * magnetometer (xm, ym, zm) data. The heading is a&lt;br /&gt;
 * value from 0° to 359°. If the robot's front (and&lt;br /&gt;
 * the RP6 Sensor Board's front edge with the two&lt;br /&gt;
 * headlights) points to ...&lt;br /&gt;
 *   north -&amp;gt; heading is 0°,&lt;br /&gt;
 *   east  -&amp;gt; heading is 90°,&lt;br /&gt;
 *   south -&amp;gt; heading is 180°,&lt;br /&gt;
 *   west  -&amp;gt; heading is 270°.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
int16_t headingLSM303DLHC_TC(void)&lt;br /&gt;
{&lt;br /&gt;
	double hdgtc, xh, yh;&lt;br /&gt;
&lt;br /&gt;
	xh = xm * cos(the) + zm * sin(the);&lt;br /&gt;
	yh = xm * sin(phi) * sin(the) + ym * cos(phi) - zm * sin(phi) * cos(the);&lt;br /&gt;
//	zh = -xm * cos(phi) * sin(the) + ym * sin(phi) + zm * cos(phi) * cos(the);&lt;br /&gt;
	hdgtc = atan2(yh, xh) * 180 / M_PI + DECLINATION_M;&lt;br /&gt;
	if(hdgtc &amp;lt; 0.0) hdgtc += 360.0;&lt;br /&gt;
	return ((int16_t) hdgtc);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// --------------------------------------------&lt;br /&gt;
/**&lt;br /&gt;
 * Call this once before using the LSM303DLHC.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void LSM303DLHC_init(void)&lt;br /&gt;
{&lt;br /&gt;
	LSM303DLHC_A_init();						// Accelerometer init&lt;br /&gt;
	LSM303DLHC_M_init();						// Magnetometer init&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Analog Yaw-Rate Gyroscope (LY330ALH):&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Sets the LY330ALH mode of operation.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: mode -&amp;gt; Mode [0..3]&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void LY330ALH_set_mode(uint8_t mode)&lt;br /&gt;
{&lt;br /&gt;
	outport.pd_gyro = false;					// I/O 0.6: Low&lt;br /&gt;
	outport.st_gyro = false;					// I/O 0.7: Low&lt;br /&gt;
	if(mode &amp;amp; 1) outport.pd_gyro = true;&lt;br /&gt;
	if(mode &amp;amp; 2) outport.st_gyro = true;&lt;br /&gt;
	MAX7311_update();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Reads the ADC1 value from the RP6Base.&lt;br /&gt;
 *&lt;br /&gt;
 * Hints: - The RP6Base input ADC1 has to be&lt;br /&gt;
 *          connected to the USRBUS: Pin 2 on&lt;br /&gt;
 *          the RP6 mainboard!&lt;br /&gt;
 *        - The RP6Base_I2CSlave program has to&lt;br /&gt;
 *          be loaded into the RP6Base&lt;br /&gt;
 *          microcontroller!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
uint16_t getRP6Base_ADC1(void)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_readRegisters(I2C_RP6_BASE_ADR, I2C_REG_ADC_ADC1_L, registerBuf, 2);&lt;br /&gt;
	return (registerBuf[0] + (registerBuf[1] &amp;lt;&amp;lt; 8));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int16_t z_axisg;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Performs a LY330ALH gyroscope measurement and&lt;br /&gt;
 * returns the angular rate (velocity).&lt;br /&gt;
 * Positive values mean an angular rate while&lt;br /&gt;
 * rotating LEFT and negative values while&lt;br /&gt;
 * rotating RIGHT!&lt;br /&gt;
 * The global integer variable z_axisg also&lt;br /&gt;
 * contains the measurement result.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
int16_t LY330ALH_measure(void)&lt;br /&gt;
{&lt;br /&gt;
	z_axisg = getRP6Base_ADC1();				// Read raw data&lt;br /&gt;
	z_axisg -= ADCVAL_ZERORATE_LEVEL;			// Calculate value&lt;br /&gt;
	return (z_axisg);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Hot Swappable 2-Wire Bus Buffer (TCA4311A):&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Reads the TCA4311A Ready output. &lt;br /&gt;
 * The function returns the state (true/false).&lt;br /&gt;
 * The global variable readyBusbuff is also&lt;br /&gt;
 * filled with the Ready output state.&lt;br /&gt;
 *&lt;br /&gt;
 * Hint: You don't have to use this function,&lt;br /&gt;
 *       if the task task_RP6SensorBoard() is&lt;br /&gt;
 *       called frequently out of the main&lt;br /&gt;
 *       loop, because readyBusbuff will be&lt;br /&gt;
 *       updated by this task!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
uint8_t readReadyBusbuff(void)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmitByte(I2C_SENSOR_PORTEXP_ADR, MAX7311_INPUT_PORT1);&lt;br /&gt;
	readyBusbuff = I2CTWI_readByte(I2C_SENSOR_PORTEXP_ADR);&lt;br /&gt;
	readyBusbuff &amp;amp;= RDY_BUSBUFF;&lt;br /&gt;
	return readyBusbuff;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
uint8_t errorBusbuff;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * If the I2C bus for the I2C-MODULE (SCLOUT,&lt;br /&gt;
 * SDAOUT) is not used or shall be isolated from&lt;br /&gt;
 * the RP6 I2C bus, this can be done with this&lt;br /&gt;
 * function.&lt;br /&gt;
 *&lt;br /&gt;
 * Hints: - The I2C-MODULE power is NOT switched&lt;br /&gt;
 *          off by this function!&lt;br /&gt;
 *        - If USE_PD5 is defined in the&lt;br /&gt;
 *          configuration header file, this&lt;br /&gt;
 *          function uses the RP6M256 portpin,&lt;br /&gt;
 *          that is connected to plug I/O: Pin 9&lt;br /&gt;
 *          instead of MAX7311 I/O 1.0!&lt;br /&gt;
 *        - If the global variable errorBusbuff&lt;br /&gt;
 *          returns true, the bus buffer could&lt;br /&gt;
 *          not be switched to shutdown mode!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void TCA4311A_shutdown(void)&lt;br /&gt;
{&lt;br /&gt;
	// Wait until the I2C bus is idle:&lt;br /&gt;
	while(I2CTWI_isBusy() || TWI_operation != I2CTWI_NO_OPERATION) task_I2CTWI();&lt;br /&gt;
#ifdef USE_PD5&lt;br /&gt;
	IO_SENSOR_TCA4311A_EN_PORT &amp;amp;= ~IO_SENSOR_TCA4311A_EN_IN; // Low&lt;br /&gt;
#else&lt;br /&gt;
	outport.en_busbuff = false;					// I/O 1.0: Low&lt;br /&gt;
	MAX7311_update();&lt;br /&gt;
#endif&lt;br /&gt;
	errorBusbuff = readReadyBusbuff();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * If the I2C bus for the I2C-MODULE (SCLOUT,&lt;br /&gt;
 * SDAOUT) was isolated from the RP6 I2C bus with&lt;br /&gt;
 * the function TCA4311A_shutdown() before, it&lt;br /&gt;
 * can be connected again with this function.&lt;br /&gt;
 *&lt;br /&gt;
 * Hints: - The I2C-MODULE power is NOT switched&lt;br /&gt;
 *          on by this function!&lt;br /&gt;
 *        - If USE_PD5 is defined in the&lt;br /&gt;
 *          configuration header file, this&lt;br /&gt;
 *          function uses the RP6M256 portpin,&lt;br /&gt;
 *          that is connected to plug I/O: Pin 9&lt;br /&gt;
 *          instead of MAX7311 I/O 1.0!&lt;br /&gt;
 *        - If the global variable errorBusbuff&lt;br /&gt;
 *          returns true, the bus buffer could&lt;br /&gt;
 *          not be switched to normal operation!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void TCA4311A_reconnect(void)&lt;br /&gt;
{&lt;br /&gt;
	// Wait until the I2C bus is idle:&lt;br /&gt;
	while(I2CTWI_isBusy() || TWI_operation != I2CTWI_NO_OPERATION) task_I2CTWI();&lt;br /&gt;
#ifdef USE_PD5&lt;br /&gt;
	IO_SENSOR_TCA4311A_EN_PORT |= IO_SENSOR_TCA4311A_EN_IN; // High&lt;br /&gt;
#else&lt;br /&gt;
	outport.en_busbuff = true;					// I/O 1.0: High&lt;br /&gt;
	MAX7311_update();&lt;br /&gt;
#endif&lt;br /&gt;
	errorBusbuff = !readReadyBusbuff();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Sets/clears the RP6Base signal PWR.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: pwr -&amp;gt; 0 (false) = PWR off&lt;br /&gt;
 *               &amp;gt;0 (true) = PWR on&lt;br /&gt;
 *&lt;br /&gt;
 * Hints: - The RP6Base signal PWR has to be&lt;br /&gt;
 *          connected to the USRBUS: Pin 3 on&lt;br /&gt;
 *          the RP6 mainboard!&lt;br /&gt;
 *        - The RP6Base_I2CSlave program has to&lt;br /&gt;
 *          be loaded into the RP6Base&lt;br /&gt;
 *          microcontroller!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void setRP6Base_PWR(uint8_t pwr)&lt;br /&gt;
{&lt;br /&gt;
	if(pwr &amp;gt; 0)&lt;br /&gt;
		I2CTWI_transmit2Bytes(I2C_RP6_BASE_ADR, 0, CMD_POWER_ON);&lt;br /&gt;
	else&lt;br /&gt;
		I2CTWI_transmit2Bytes(I2C_RP6_BASE_ADR, 0, CMD_POWER_OFF);&lt;br /&gt;
	while(I2CTWI_isBusy() || TWI_operation != I2CTWI_NO_OPERATION) task_I2CTWI();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/** &lt;br /&gt;
 * With this function you can switch the I2C-&lt;br /&gt;
 * MODULE (plug M1) power on or off.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: pwr -&amp;gt; 0 (false) = I2C-MODULE power off&lt;br /&gt;
 *               &amp;gt;0 (true) = I2C-MODULE power on&lt;br /&gt;
 *&lt;br /&gt;
 * Hints: - If the I2C-MODULE plug is not used,&lt;br /&gt;
 *          you should always switch the&lt;br /&gt;
 *          I2C-MODULE power off (default)!&lt;br /&gt;
 *        - The TCA4311A is NOT switched to&lt;br /&gt;
 *          normal operation (default) or&lt;br /&gt;
 *          shutdown mode by this function!&lt;br /&gt;
 *        - The RP6Base signal PWR has to be&lt;br /&gt;
 *          connected to the USRBUS: Pin 3 on&lt;br /&gt;
 *          the RP6 mainboard!&lt;br /&gt;
 *        - The RP6Base_I2CSlave program has to&lt;br /&gt;
 *          be loaded into the RP6Base&lt;br /&gt;
 *          microcontroller!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void setI2CModulePower(uint8_t pwr)&lt;br /&gt;
{&lt;br /&gt;
	if(pwr &amp;gt; 0) {&lt;br /&gt;
		setRP6Base_PWR(1);						// RP6Base PWR on&lt;br /&gt;
		outport.pwr_i2c = true;					// I/O 0.0: High&lt;br /&gt;
	}&lt;br /&gt;
	else&lt;br /&gt;
		outport.pwr_i2c = false;				// I/O 0.0: Low&lt;br /&gt;
	MAX7311_update();&lt;br /&gt;
}	&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Button:&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Reads the MAX7311 I/O port 1.7. &lt;br /&gt;
 * The function returns true, if  button S1 is&lt;br /&gt;
 * pressed (I/O 1.7: Low!) and false, if it is&lt;br /&gt;
 * not pressed (I/O 1.7: High!).&lt;br /&gt;
 * The global variable pressedButton is also&lt;br /&gt;
 * filled with the I/O 1.7 output state.&lt;br /&gt;
 *&lt;br /&gt;
 * Hint: You don't have to use this function,&lt;br /&gt;
 *       if the task task_RP6SensorBoard() is&lt;br /&gt;
 *       called frequently out of the main&lt;br /&gt;
 *       loop, because pressedButton will be&lt;br /&gt;
 *       updated by this task!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
uint8_t readButton(void)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmitByte(I2C_SENSOR_PORTEXP_ADR, MAX7311_INPUT_PORT2);&lt;br /&gt;
	pressedButton = I2CTWI_readByte(I2C_SENSOR_PORTEXP_ADR);&lt;br /&gt;
	pressedButton &amp;amp;= IO2_I2C;&lt;br /&gt;
	pressedButton = !pressedButton;&lt;br /&gt;
	return pressedButton;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Status LED:&lt;br /&gt;
&lt;br /&gt;
/** &lt;br /&gt;
 * Sets the status LED (D2) of the RP6 Sensor&lt;br /&gt;
 * Board.&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *   setStatusLED(1);&lt;br /&gt;
 *   // This switches the status LED on!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void setStatusLED(uint8_t on)&lt;br /&gt;
{&lt;br /&gt;
	if(on &amp;gt; 0)&lt;br /&gt;
		outport.io1_i2c = false;				// I/O 1.6: Low&lt;br /&gt;
	else&lt;br /&gt;
		outport.io1_i2c = true;					// I/O 1.6: High&lt;br /&gt;
	MAX7311_update();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// RP6 Sensor Board initialisation and shutdown:&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * You MUST call this function at the beginning of a&lt;br /&gt;
 * main program, that uses the RP6 Sensor Board. &lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void sensor_board_init(void)&lt;br /&gt;
{&lt;br /&gt;
	// I/O Port Expander:&lt;br /&gt;
	MAX7311_init();&lt;br /&gt;
	// RTC:&lt;br /&gt;
	DS1339_init();&lt;br /&gt;
	// Temperature Sensor:&lt;br /&gt;
	LM75B_init();&lt;br /&gt;
	// Servo Controller:&lt;br /&gt;
	PCA9685_init(50);							// Init PWM 50 Hz&lt;br /&gt;
	// LED Driver:&lt;br /&gt;
	TCA6507_init();&lt;br /&gt;
	// 3D Magnetometer &amp;amp; Accelerometer:&lt;br /&gt;
	LSM303DLHC_init();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * If you don't use any function of the RP6&lt;br /&gt;
 * Sensor Board, you can put the board into&lt;br /&gt;
 * &amp;quot;SHUTDOWN MODE&amp;quot;. In this mode the electric&lt;br /&gt;
 * power consumption is very low to save energy.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void sensor_board_shutdown(void)&lt;br /&gt;
{&lt;br /&gt;
	// Servo Controller:&lt;br /&gt;
	PCA9685_shutdown();							// Shutdown PCA9685&lt;br /&gt;
	// Temperature Sensor:&lt;br /&gt;
	LM75B_shutdown();							// Shutdown LM75B&lt;br /&gt;
	// I/O Port Expander:&lt;br /&gt;
	MAX7311_write(MAX7311_OUTPUT_SHUTDOWN);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&lt;br /&gt;
/******************************************************************************&lt;br /&gt;
 * Additional info&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Changelog:&lt;br /&gt;
 * - v. 1.0 TCA4311A reconnect problem fixed 10.04.2014 by Dirk&lt;br /&gt;
 * - v. 0.9 Interrupt status functions added 09.04.2014 by Dirk&lt;br /&gt;
 * - v. 0.8 (initial release) 17.03.2014 by Dirk&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Erklärung&lt;br /&gt;
&lt;br /&gt;
=====Demo=====&lt;br /&gt;
makefile:&lt;br /&gt;
&amp;lt;pre&amp;gt;...&lt;br /&gt;
TARGET = RP6M256_Sensor_Board_01&lt;br /&gt;
...&lt;br /&gt;
SRC += $(RP6_LIB_PATH)/RP6common/RP6I2CmasterTWI.c&lt;br /&gt;
&lt;br /&gt;
SRC += $(RP6_LIB_PATH)/RP6control_M256_WIFI/RP6M256_Sensor_BoardLib.c&lt;br /&gt;
...&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Datei: RP6M256_Sensor_Board_01.c&lt;br /&gt;
&amp;lt;pre&amp;gt;/* &lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * RP6 ROBOT SYSTEM - RP6 CONTROL M256 Examples&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Example: RP6M256 Sensor Board&lt;br /&gt;
 * Author(s): Dirk&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Description:&lt;br /&gt;
 * In this example we show a first test for the RP6 Sensor Board.&lt;br /&gt;
 * &lt;br /&gt;
 * ############################################################################&lt;br /&gt;
 * The Robot does NOT move in this example! You can simply put it on a table&lt;br /&gt;
 * next to your PC and you should connect it to the PC via the USB Interface!&lt;br /&gt;
 * You should also connect to it via WIFI.&lt;br /&gt;
 * ############################################################################&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Includes:&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6M256Lib.h&amp;quot; 				// The RP6 M256 Library. &lt;br /&gt;
										// Always needs to be included!&lt;br /&gt;
#include &amp;quot;RP6I2CmasterTWI.h&amp;quot;			// Include the I2C-Bus Master Library&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Include our new &amp;quot;RP6M256 Sensor Board library&amp;quot;:&lt;br /&gt;
// (This is the library for accessing the RP6 Sensor Board!)&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6M256_Sensor_BoardLib.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Variables:&lt;br /&gt;
&lt;br /&gt;
char dir[3];&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Returns a 2 character string for the eighth&lt;br /&gt;
 * parts of the direction calculated from the&lt;br /&gt;
 * heading value.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: heading -&amp;gt; Heading value [0..359]&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void calculateDir(char *dir, uint16_t heading)&lt;br /&gt;
{&lt;br /&gt;
	dir[1] = ' ';&lt;br /&gt;
	dir[2] = '\0';&lt;br /&gt;
	if ((heading &amp;lt;= 22) || (heading &amp;gt;=338)) dir[0] = 'N';&lt;br /&gt;
	if ((heading &amp;gt;= 23) &amp;amp;&amp;amp; (heading &amp;lt;= 67)) {dir[0] = 'N'; dir[1] = 'E';} &lt;br /&gt;
	if ((heading &amp;gt;= 68) &amp;amp;&amp;amp; (heading &amp;lt;= 112)) dir[0] = 'E';&lt;br /&gt;
	if ((heading &amp;gt;= 113) &amp;amp;&amp;amp; (heading &amp;lt;= 157)) {dir[0] = 'S'; dir[1] = 'E';}&lt;br /&gt;
	if ((heading &amp;gt;= 158) &amp;amp;&amp;amp; (heading &amp;lt;= 202)) dir[0] = 'S';&lt;br /&gt;
	if ((heading &amp;gt;= 203) &amp;amp;&amp;amp; (heading &amp;lt;= 247)) {dir[0] = 'S'; dir[1] = 'W';}&lt;br /&gt;
	if ((heading &amp;gt;= 248) &amp;amp;&amp;amp; (heading &amp;lt;= 292)) dir[0] = 'W';&lt;br /&gt;
	if ((heading &amp;gt;= 293) &amp;amp;&amp;amp; (heading &amp;lt;= 337)) {dir[0] = 'N'; dir[1] = 'W';}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Write a floating point number to the WIFI.&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *&lt;br /&gt;
 *			// Write a floating point number to the WIFI (no exponent):&lt;br /&gt;
 *			writeDouble_WIFI(1234567.890, 11, 3);&lt;br /&gt;
 *&lt;br /&gt;
 * The value of prec (precision) defines the number of decimal places.&lt;br /&gt;
 * For 32 bit floating point variables (float, double ...) 6 is&lt;br /&gt;
 * the max. value for prec (7 relevant digits).&lt;br /&gt;
 * The value of width defines the overall number of characters in the&lt;br /&gt;
 * floating point number including the decimal point. The number of&lt;br /&gt;
 * pre-decimal positions is: (width - prec - 1).&lt;br /&gt;
 */&lt;br /&gt;
void writeDouble_WIFI(double number, uint8_t width, uint8_t prec)&lt;br /&gt;
{char buffer[width + 1];&lt;br /&gt;
	dtostrf(number, width, prec, &amp;amp;buffer[0]);&lt;br /&gt;
	writeString_WIFI(&amp;amp;buffer[0]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Write a floating point number to the LCD.&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *&lt;br /&gt;
 *			// Write a floating point number to the LCD (no exponent):&lt;br /&gt;
 *			writeDoubleLCD(1234567.890, 11, 3);&lt;br /&gt;
 *&lt;br /&gt;
 * The value of prec (precision) defines the number of decimal places.&lt;br /&gt;
 * For 32 bit floating point variables (float, double ...) 6 is&lt;br /&gt;
 * the max. value for prec (7 relevant digits).&lt;br /&gt;
 * The value of width defines the overall number of characters in the&lt;br /&gt;
 * floating point number including the decimal point. The number of&lt;br /&gt;
 * pre-decimal positions is: (width - prec - 1).&lt;br /&gt;
 */&lt;br /&gt;
void writeDoubleLCD(double number, uint8_t width, uint8_t prec)&lt;br /&gt;
{char buffer[width + 1];&lt;br /&gt;
	dtostrf(number, width, prec, &amp;amp;buffer[0]);&lt;br /&gt;
	writeStringLCD(&amp;amp;buffer[0]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Error handler&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function gets called automatically if there was an I2C Error like&lt;br /&gt;
 * the slave sent a &amp;quot;not acknowledge&amp;quot; (NACK, error codes e.g. 0x20 or 0x30).&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void I2C_transmissionError(uint8_t errorState)&lt;br /&gt;
{&lt;br /&gt;
	writeString_P_WIFI(&amp;quot;\nI2C ERROR - TWI STATE: 0x&amp;quot;);&lt;br /&gt;
	writeInteger_WIFI(errorState, HEX);&lt;br /&gt;
	writeChar_WIFI('\n');&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Main function - The program starts here:&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
	initRP6M256();    // Always call this first! The Processor will not work&lt;br /&gt;
					  // correctly otherwise. &lt;br /&gt;
&lt;br /&gt;
	initLCD(); // Initialize the LC-Display (LCD)&lt;br /&gt;
			   // Always call this before using the LCD!&lt;br /&gt;
&lt;br /&gt;
	setLEDs(0b1111);&lt;br /&gt;
	mSleep(500);&lt;br /&gt;
	setLEDs(0b0000);&lt;br /&gt;
&lt;br /&gt;
	writeString_P_WIFI(&amp;quot;\n\nRP6 Sensor Board Selftest 1!\n&amp;quot;); &lt;br /&gt;
&lt;br /&gt;
	// IMPORTANT:&lt;br /&gt;
	I2CTWI_initMaster(100); // Initialize the TWI Module for Master operation&lt;br /&gt;
							// with 100kHz SCL Frequency&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	// Register the event handler:&lt;br /&gt;
	I2CTWI_setTransmissionErrorHandler(I2C_transmissionError);&lt;br /&gt;
&lt;br /&gt;
	setLEDs(0b1111);&lt;br /&gt;
&lt;br /&gt;
	// Write a text message to the LCD:&lt;br /&gt;
	showScreenLCD(&amp;quot;################&amp;quot;, &amp;quot;################&amp;quot;);&lt;br /&gt;
	mSleep(1500);&lt;br /&gt;
	showScreenLCD(&amp;quot;RP6v2-M256-WIFI &amp;quot;, &amp;quot;Example Program&amp;quot;);&lt;br /&gt;
	mSleep(2500); &lt;br /&gt;
	showScreenLCD(&amp;quot;RP6 Sensor Board&amp;quot;, &amp;quot;   Selftest 1&amp;quot;);&lt;br /&gt;
	mSleep(2500);&lt;br /&gt;
	clearLCD();&lt;br /&gt;
&lt;br /&gt;
	setLEDs(0b0000);&lt;br /&gt;
&lt;br /&gt;
	// ---------------------------------------&lt;br /&gt;
&lt;br /&gt;
	uint8_t onoff = 0;&lt;br /&gt;
	uint16_t servopos = SERVO1_LT;&lt;br /&gt;
	int16_t rate;&lt;br /&gt;
&lt;br /&gt;
	startStopwatch1();&lt;br /&gt;
	startStopwatch2();&lt;br /&gt;
&lt;br /&gt;
	// IMPORTANT:&lt;br /&gt;
	sensor_board_init();						// RP6 Sensor Board init!!!&lt;br /&gt;
	setServoPower(1);							// Servo power ON!&lt;br /&gt;
/*&lt;br /&gt;
	// ----------------------------------------------&lt;br /&gt;
	// Set RTC once (battery empty or not existing:&lt;br /&gt;
	rtc_time.second = 0;&lt;br /&gt;
	rtc_time.minute = 15;&lt;br /&gt;
	rtc_time.hour = 20;				// 20:15&lt;br /&gt;
	rtc_date.weekday = R_SU;&lt;br /&gt;
	rtc_date.day = 20;&lt;br /&gt;
	rtc_date.month = 4;&lt;br /&gt;
	rtc_date.year = 2014;			// Su, 20.4.2014&lt;br /&gt;
	DS1339_write();&lt;br /&gt;
	// Remove this, if RTC is set and running!!!&lt;br /&gt;
	// ----------------------------------------------&lt;br /&gt;
*/&lt;br /&gt;
	while(true) &lt;br /&gt;
	{&lt;br /&gt;
		if(getStopwatch1() &amp;gt; 1000) // 1s&lt;br /&gt;
		{&lt;br /&gt;
			if (onoff) onoff = 0;&lt;br /&gt;
			else onoff = 1;&lt;br /&gt;
&lt;br /&gt;
			// Interrupt status:&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nInterrupt Status:      &amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(interrupt_RP6SBstatus.byte, BIN, 8);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			// Inport status:&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;Inport Status: &amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(inport.word, BIN, 16);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			// Temperature sensor test:&lt;br /&gt;
			temperature = LM75B_measure();		// Measure&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;Temperature: &amp;quot;);&lt;br /&gt;
			writeDouble_WIFI(temperature, 7, 3);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;°\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			// LED driver test:&lt;br /&gt;
			if (onoff) {&lt;br /&gt;
				setLED(HEADLIGHT_R, STATE_ON);&lt;br /&gt;
				setLED(HEADLIGHT_L, STATE_OFF);&lt;br /&gt;
			}&lt;br /&gt;
			else {&lt;br /&gt;
				setLED(HEADLIGHT_L, STATE_ON);&lt;br /&gt;
				setLED(HEADLIGHT_R, STATE_OFF);&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			// Servo controller test (SERVO_1):&lt;br /&gt;
			setServo(1, servopos);&lt;br /&gt;
			servopos += 10;&lt;br /&gt;
			if (servopos &amp;gt; SERVO1_RT) servopos = SERVO1_LT;&lt;br /&gt;
&lt;br /&gt;
			// RTC test:&lt;br /&gt;
			DS1339_read();&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;RTC: &amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(rtc_time.hour, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;:&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(rtc_time.minute, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;:&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(rtc_time.second, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;  &amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(rtc_date.day, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;.&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(rtc_date.month, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;.&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(rtc_date.year, DEC, 4);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			// 3D Magnetometer &amp;amp; Accelerometer test:&lt;br /&gt;
			//  LSM303DLHC accelerometer:&lt;br /&gt;
			task_I2CTWI();&lt;br /&gt;
			readLSM303DLHC_A();					// Get sensor values&lt;br /&gt;
			task_I2CTWI();&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\n3D-Acceleration SENSOR -&amp;gt;\n&amp;quot;);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;X-axis: &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(x_axisa, DEC);&lt;br /&gt;
			writeChar_WIFI('\n');&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;Y-axis: &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(y_axisa, DEC);&lt;br /&gt;
			writeChar_WIFI('\n');&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;Z-axis: &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(z_axisa, DEC);&lt;br /&gt;
			writeChar_WIFI('\n');&lt;br /&gt;
			normalizeLSM303DLHC_A();			// Normalize data&lt;br /&gt;
			positionLSM303DLHC_A();				// Calculate position&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;POSITION: \n&amp;quot;);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;  Pitch [°]: &amp;quot;);&lt;br /&gt;
			writeDouble_WIFI(pitch, 6, 1);&lt;br /&gt;
			writeChar_WIFI('\n');&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;  Roll [°]:  &amp;quot;);&lt;br /&gt;
			writeDouble_WIFI(roll, 6, 1);&lt;br /&gt;
			writeChar_WIFI('\n');&lt;br /&gt;
&lt;br /&gt;
			//  LSM303DLHC magnetometer:&lt;br /&gt;
			task_I2CTWI();&lt;br /&gt;
			readLSM303DLHC_M();					// Get sensor values&lt;br /&gt;
			task_I2CTWI();&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\n3D-Compass SENSOR -&amp;gt;\n&amp;quot;);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;X-axis: &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(x_axism, DEC);&lt;br /&gt;
			writeChar_WIFI('\n');&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;Y-axis: &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(y_axism, DEC);&lt;br /&gt;
			writeChar_WIFI('\n');&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;Z-axis: &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(z_axism, DEC);&lt;br /&gt;
			writeChar_WIFI('\n');&lt;br /&gt;
			normalizeLSM303DLHC_M();			// Normalize data&lt;br /&gt;
			headingm = headingLSM303DLHC_M();	// Calculate heading&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;                 Heading [°]: &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(headingm, DEC);&lt;br /&gt;
			calculateDir(dir, headingm);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;  Direction: &amp;quot;);&lt;br /&gt;
			writeString_WIFI(dir);&lt;br /&gt;
			writeChar_WIFI('\n');&lt;br /&gt;
			headingtc = headingLSM303DLHC_TC();	// Calculate TILT COMPENSATED&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;TILT COMPENSATED heading [°]: &amp;quot;); // heading&lt;br /&gt;
			writeInteger_WIFI(headingtc, DEC);&lt;br /&gt;
			calculateDir(dir, headingtc);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;  Direction: &amp;quot;);&lt;br /&gt;
			writeString_WIFI(dir);&lt;br /&gt;
			writeChar_WIFI('\n');&lt;br /&gt;
#ifdef GET_TEMP_M&lt;br /&gt;
			temperature_mag = (double) temperaturem / 8.0 + OFFSET_TEMP_M;&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;Temperature [°]: &amp;quot;);&lt;br /&gt;
			writeDouble_WIFI(temperature_mag, 7, 2);&lt;br /&gt;
			writeChar_WIFI('\n');&lt;br /&gt;
#endif&lt;br /&gt;
			// Yaw-Rate Gyroscope test:&lt;br /&gt;
			rate = LY330ALH_measure();&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\n1D-Gyro SENSOR -&amp;gt;\n&amp;quot;);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;Z-axis: &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(rate, DEC);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			// RP6 Sensor Board shutdown (button &amp;amp; status LED test):&lt;br /&gt;
			if (pressedButton) {&lt;br /&gt;
				setStatusLED(1);&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;\nPress button again for RP6 Sensor Board SHUTDOWN!\n&amp;quot;);&lt;br /&gt;
				mSleep(2000);&lt;br /&gt;
				do {&lt;br /&gt;
					if(getStopwatch2() &amp;gt; 200) { // 0.2s&lt;br /&gt;
						if (onoff) onoff = 0;&lt;br /&gt;
						else onoff = 1;&lt;br /&gt;
						if (onoff) setStatusLED(1);&lt;br /&gt;
						else setStatusLED(0);&lt;br /&gt;
						setStopwatch2(0);&lt;br /&gt;
					}&lt;br /&gt;
					mSleep(1);&lt;br /&gt;
					task_I2CTWI();&lt;br /&gt;
				} while (!readButton());&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;\n\n\n\n\nPlease wait for RP6 Sensor Board SHUTDOWN...\n&amp;quot;);&lt;br /&gt;
				sensor_board_shutdown();&lt;br /&gt;
				mSleep(3000);&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;\n\n\nThe RP6 Sensor Board now is in SHUTDOWN MODE!!!\n&amp;quot;);&lt;br /&gt;
				mSleep(1000);&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;\nRESET the M256 microcontroller now...\n\n&amp;quot;);&lt;br /&gt;
				while(true) {};&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			setStopwatch1(0);&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		task_checkINTs();						// Read interrupt signals&lt;br /&gt;
		task_RP6SensorBoard();					// RP6 Sensor Board task&lt;br /&gt;
&lt;br /&gt;
		task_I2CTWI();&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Erklärung&lt;br /&gt;
&lt;br /&gt;
====Projekte====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===RP6 Xtra Module===&lt;br /&gt;
Die Dokumentation zu den RP6 Xtra Modulen befindet sich auf der mitgelieferten ''&amp;quot;RP6 Robot System Xtra Modules CD-ROM&amp;quot;''. Auf der CD-ROM sind auch Software-Beispiele zu finden.&lt;br /&gt;
&lt;br /&gt;
Die hier veröffentlichte Software zu den Xtra Modulen ist eine Eigenentwicklung in GCC:&lt;br /&gt;
* Arexx [[RP6_Sensor_Board_und_Xtra_Module#I2C_GPS_Empf.C3.A4nger_JM3-GPS_2|I2C GPS Empfänger JM3-GPS]]&lt;br /&gt;
* Arexx [[RP6_Sensor_Board_und_Xtra_Module#Gyro_Modul_JM3-GYRO_2|Gyro Modul JM3-GYRO]]&lt;br /&gt;
* Arexx [[RP6_Sensor_Board_und_Xtra_Module#3D_Accelerometer_Modul_JM3-3DA_2|3D Accelerometer Modul JM3-3DA]]&lt;br /&gt;
&lt;br /&gt;
====I2C GPS Empfänger JM3-GPS====&lt;br /&gt;
=====RP6M256 WiFi: I2C_GPS Library=====&lt;br /&gt;
Die nachfolgende RP6M256_I2C_GPSLib (GCC) dient zur Ansteuerung des I2C GPS Empfängers durch die RP6M256 WiFi.&lt;br /&gt;
 &lt;br /&gt;
======Libary Header======&lt;br /&gt;
Datei: RP6M256_I2C_GPSLib.h&lt;br /&gt;
&amp;lt;pre&amp;gt;/* ****************************************************************************&lt;br /&gt;
 *                           _______________________&lt;br /&gt;
 *                           \| RP6  ROBOT SYSTEM |/&lt;br /&gt;
 *                            \_-_-_-_-_-_-_-_-_-_/           &amp;gt;&amp;gt;&amp;gt; RP6 M256 WIFI&lt;br /&gt;
 * ----------------------------------------------------------------------------&lt;br /&gt;
 * ----------------------------- [c]2014 - Dirk -------------------------------&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * File: RP6M256_I2C_GPSLib.h&lt;br /&gt;
 * Version: 1.0&lt;br /&gt;
 * Target: RP6 M256 WIFI - ATMEGA2560 @16.00MHz&lt;br /&gt;
 * Author(s): Dirk&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Description:&lt;br /&gt;
 * Header file for new RP6 I2C GPS Receiver library.&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
#ifndef RP6M256_I2C_GPSLIB_H&lt;br /&gt;
#define RP6M256_I2C_GPSLIB_H&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// RP6 Sensor Board:&lt;br /&gt;
&lt;br /&gt;
// If you want to use the RP6 I2C GPS Receiver on the RP6 Sensor Board, you&lt;br /&gt;
// have to define SENSOR_BOARD (default)!&lt;br /&gt;
// If SENSOR_BOARD is NOT defined, this library assumes that the RP6 I2C GPS&lt;br /&gt;
// Receiver is used stand-alone.&lt;br /&gt;
// ------------------&lt;br /&gt;
#define SENSOR_BOARD&lt;br /&gt;
// ------------------&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Includes:&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6M256Lib.h&amp;quot;&lt;br /&gt;
#include &amp;quot;RP6I2CmasterTWI.h&amp;quot;&lt;br /&gt;
#ifdef SENSOR_BOARD&lt;br /&gt;
	#include &amp;quot;RP6M256_Sensor_BoardLib.h&amp;quot;&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// RP6 I2C GPS Receiver:&lt;br /&gt;
#define I2C_GPS_RECEIVER_ADR			0xc8	// Default&lt;br /&gt;
//#define I2C_GPS_RECEIVER_ADR			0xca&lt;br /&gt;
//#define I2C_GPS_RECEIVER_ADR			0xcc&lt;br /&gt;
//#define I2C_GPS_RECEIVER_ADR			0xce&lt;br /&gt;
//#define I2C_GPS_RECEIVER_ADR			0xd0	// DO NOT USE on Sensor Board!&lt;br /&gt;
//#define I2C_GPS_RECEIVER_ADR			0xd2&lt;br /&gt;
//#define I2C_GPS_RECEIVER_ADR			0xd4&lt;br /&gt;
//#define I2C_GPS_RECEIVER_ADR			0xd6&lt;br /&gt;
//#define I2C_GPS_RECEIVER_ADR			0xd8&lt;br /&gt;
//#define I2C_GPS_RECEIVER_ADR			0xda&lt;br /&gt;
//#define I2C_GPS_RECEIVER_ADR			0xdc&lt;br /&gt;
//#define I2C_GPS_RECEIVER_ADR			0xde&lt;br /&gt;
&lt;br /&gt;
// Read registers:&lt;br /&gt;
#define WHO_AM_I						0x20	// I2C address [0xc8..0xde]&lt;br /&gt;
#define LAT_DEG							0x21	// Degrees&lt;br /&gt;
#define LAT_MIN							0x22	// Minutes&lt;br /&gt;
#define LAT_MIN_D_L						0x23	// Minutes decimal part low&lt;br /&gt;
#define LAT_MIN_D_H						0x24	// Minutes decimal part high&lt;br /&gt;
#define LON_DEG							0x25	// Degrees&lt;br /&gt;
#define LON_MIN							0x26	// Minutes&lt;br /&gt;
#define LON_MIN_D_L						0x27	// Minutes decimal part low&lt;br /&gt;
#define LON_MIN_D_H						0x28	// Minutes decimal part high&lt;br /&gt;
#define STATUS							0x29	// Status flags&lt;br /&gt;
#define FIX_IND							0x2a	// FIX_IND&lt;br /&gt;
#define HDOP							0x2b	// HDOP&lt;br /&gt;
#define HDOP_D							0x2c	// HDOP_D&lt;br /&gt;
#define SAT_N							0x2d	// Number of satellites&lt;br /&gt;
#define COURSE_T_L						0x2e	// True heading low byte&lt;br /&gt;
#define COURSE_T_H						0x2f	// True heading high byte&lt;br /&gt;
#define COURSE_T_D						0x30	// Decimal part of course&lt;br /&gt;
#define SPEED_L							0x31	// Speed low byte&lt;br /&gt;
#define SPEED_H							0x32	// Speed high byte&lt;br /&gt;
#define SPEED_D							0x33	// Speed decimal part&lt;br /&gt;
#define ALT_L							0x34	// Altitude low byte&lt;br /&gt;
#define ALT_H							0x35	// Altitude high byte&lt;br /&gt;
#define ALT_DIF_L						0x36	// Differ. WGS-84 MSL low byte&lt;br /&gt;
#define ALT_DIF_H						0x37	// Differ. WGS-84 MSL high byte&lt;br /&gt;
#define UTC_H							0x38	// UTC hour&lt;br /&gt;
#define UTC_MIN							0x39	// UTC minute&lt;br /&gt;
#define UTC_S							0x3a	// UTC second&lt;br /&gt;
#define DAY								0x3b	// Day&lt;br /&gt;
#define YEAR_L							0x3c	// Year low byte&lt;br /&gt;
#define YEAR_H							0x3d	// Year high byte&lt;br /&gt;
#define MONTH							0x3e	// Month&lt;br /&gt;
#define PDOP							0x3f	// PDOP&lt;br /&gt;
#define PDOP_D							0x40	// PDOP_D&lt;br /&gt;
#define VDOP							0x41	// VDOP&lt;br /&gt;
#define VDOP_D							0x42	// VDOP_D&lt;br /&gt;
#define SAT_1							0x43	// SAT # 1&lt;br /&gt;
#define SAT_2							0x44	// SAT # 2&lt;br /&gt;
#define SAT_3							0x45	// SAT # 3&lt;br /&gt;
#define SAT_4							0x46	// SAT # 4&lt;br /&gt;
#define SAT_5							0x47	// SAT # 5&lt;br /&gt;
#define SAT_6							0x48	// SAT # 6&lt;br /&gt;
#define SAT_7							0x49	// SAT # 7&lt;br /&gt;
#define SAT_8							0x4a	// SAT # 8&lt;br /&gt;
#define SAT_9							0x4b	// SAT # 9&lt;br /&gt;
#define SAT_A							0x4c	// SAT # 10&lt;br /&gt;
#define SAT_B							0x4d	// SAT # 11&lt;br /&gt;
#define SAT_C							0x4e	// SAT # 12&lt;br /&gt;
#define SW_VERSION						0x4f	// SW_Version&lt;br /&gt;
#define HEARTBEAT						0x50	// Heartbeat&lt;br /&gt;
&lt;br /&gt;
// Status and Fix_Ind register bitmasks:&lt;br /&gt;
#define STATUS_NS						0b00000001&lt;br /&gt;
#define STATUS_EW						0b00000010&lt;br /&gt;
#define STATUS_SPU						0b00000100&lt;br /&gt;
#define STATUS_AUTON					0b00001000&lt;br /&gt;
#define FIX_IND_UI_FIX					0b10000000&lt;br /&gt;
&lt;br /&gt;
// Write registers:&lt;br /&gt;
#define INIT_CFG						0x90	// INIT CFG&lt;br /&gt;
#define SET_FIX_TIME					0x91	// Pos_Fix_Time&lt;br /&gt;
#define STBY							0x92	// STBY&lt;br /&gt;
#define FAC_RES							0x93	// Factory Reset&lt;br /&gt;
#define EN_JAM							0x94	// Jamming Remover&lt;br /&gt;
#define TEST_MODE						0x96	// Test Mode&lt;br /&gt;
&lt;br /&gt;
// Write register values (commands):&lt;br /&gt;
#define INIT_CFG_HOT_START				1		// Hot Start&lt;br /&gt;
#define INIT_CFG_WARM_START				2		// Warm Start init data loaded&lt;br /&gt;
#define INIT_CFG_WARM_START_EPH_CLR		3		// Warm Start Ephemeris cleared&lt;br /&gt;
#define INIT_CFG_COLD_START				4		// Cold Start&lt;br /&gt;
#define SET_FIX_TIME_1S					1		// Pos Fix Time 1 second&lt;br /&gt;
#define SET_FIX_TIME_2S					2		// Pos Fix Time 2 seconds&lt;br /&gt;
#define STBY_ENTER						1		// Standby (cleared after write)&lt;br /&gt;
#define FAC_RES_ENTER					1		// Factory Reset&lt;br /&gt;
#define EN_JAM_DISABLE					0		// Jamming Remover disable&lt;br /&gt;
#define EN_JAM_ENABLE					1		// Jamming Remover enable&lt;br /&gt;
#define TEST_MODE_INACTIVE				0		// Test Mode inactive&lt;br /&gt;
#define TEST_MODE_ACTIVE				0x15	// Test Mode active&lt;br /&gt;
&lt;br /&gt;
// Data structure (starts at LAT_DEG):&lt;br /&gt;
#define DATA_STRUCT						LAT_DEG	// Start&lt;br /&gt;
// All data from LAT_DEG to HEARTBEAT (48 bytes):&lt;br /&gt;
#define DATA_LENGTH						(HEARTBEAT - LAT_DEG + 1)&lt;br /&gt;
// Basic data from LAT_DEG to SAT_N (13 bytes):&lt;br /&gt;
#define DATA_BASIC						(SAT_N - LAT_DEG + 1)&lt;br /&gt;
&lt;br /&gt;
typedef union {&lt;br /&gt;
 	uint8_t byte;&lt;br /&gt;
	struct {&lt;br /&gt;
		unsigned ns    :1;				// 1: North 0: South&lt;br /&gt;
		unsigned ew    :1;				// 1: East 0: West&lt;br /&gt;
		unsigned spu   :1;				// 1: km/h 0: kn&lt;br /&gt;
		unsigned auton :1;				// 1: Data not valid 0: Autonomous&lt;br /&gt;
		unsigned fix0  :1;&lt;br /&gt;
		unsigned fix1  :1;&lt;br /&gt;
		unsigned stat0 :1;				// Invalid&lt;br /&gt;
		unsigned stat1 :1;				// GPS Com Error&lt;br /&gt;
	};&lt;br /&gt;
	struct {&lt;br /&gt;
		unsigned ns    :1;				// 1: North 0: South&lt;br /&gt;
		unsigned ew    :1;				// 1: East 0: West&lt;br /&gt;
		unsigned spu   :1;				// 1: km/h 0: kn&lt;br /&gt;
		unsigned auton :1;				// 1: Data not valid 0: Autonomous&lt;br /&gt;
		unsigned fix   :2;&lt;br /&gt;
		unsigned stat  :2;				// 00 -&amp;gt; Valid&lt;br /&gt;
										// 01 -&amp;gt; Invalid&lt;br /&gt;
										// 10 -&amp;gt; GPS Com Error&lt;br /&gt;
										// 11 -&amp;gt; n. def.&lt;br /&gt;
	};&lt;br /&gt;
} status_t;&lt;br /&gt;
&lt;br /&gt;
typedef union {&lt;br /&gt;
 	uint8_t byte;&lt;br /&gt;
	struct {							// Fix indicator:&lt;br /&gt;
		unsigned fix_0  :1;				//  1: GPS fix          2: DGPS fix&lt;br /&gt;
		unsigned fix_1  :1;				//  3: PPS fix          4: RTK&lt;br /&gt;
		unsigned fix_2  :1;				//  5: Float RTK        6: Dead reck.&lt;br /&gt;
		unsigned fix_3  :1;				//  7: Manual inp. mode 8: Simul. mode&lt;br /&gt;
		unsigned unused :3;&lt;br /&gt;
		unsigned ui_fix :1;				// HW signal from UC530&lt;br /&gt;
	};&lt;br /&gt;
	struct {&lt;br /&gt;
		unsigned fix    :4;				// See above &amp;quot;Fix indicator&amp;quot;!&lt;br /&gt;
		unsigned unused :3;&lt;br /&gt;
		unsigned ui_fix :1;				// HW signal from UC530&lt;br /&gt;
	};&lt;br /&gt;
} fix_ind_t;&lt;br /&gt;
&lt;br /&gt;
typedef union {&lt;br /&gt;
	struct {&lt;br /&gt;
		uint8_t   latDeg;&lt;br /&gt;
		uint8_t   latMin;&lt;br /&gt;
		uint16_t  latMinDec;&lt;br /&gt;
		uint8_t   lonDeg;&lt;br /&gt;
		uint8_t   lonMin;&lt;br /&gt;
		uint16_t  lonMinDec;&lt;br /&gt;
		status_t  status;&lt;br /&gt;
		fix_ind_t fixInd;&lt;br /&gt;
		uint8_t   hdop;&lt;br /&gt;
		uint8_t   hdopDec;&lt;br /&gt;
		uint8_t   satCount;&lt;br /&gt;
		uint16_t  course;&lt;br /&gt;
		uint8_t   courseDec;&lt;br /&gt;
		uint16_t  speed;&lt;br /&gt;
		uint8_t   speedDec;&lt;br /&gt;
		uint16_t  altitude;&lt;br /&gt;
		uint16_t  altDif;&lt;br /&gt;
		uint8_t   utcHour;&lt;br /&gt;
		uint8_t   utcMinute;&lt;br /&gt;
		uint8_t   utcSec;&lt;br /&gt;
		uint8_t   day;&lt;br /&gt;
		uint16_t  year;&lt;br /&gt;
		uint8_t   month;&lt;br /&gt;
		uint8_t   pdop;&lt;br /&gt;
		uint8_t   pdopDec;&lt;br /&gt;
		uint8_t   vdop;&lt;br /&gt;
		uint8_t   vdopDec;&lt;br /&gt;
		uint8_t   sat[12];&lt;br /&gt;
		uint8_t   swVersion;&lt;br /&gt;
		uint8_t   heartbeat;&lt;br /&gt;
	};&lt;br /&gt;
} gpsdata_t;&lt;br /&gt;
extern gpsdata_t gpsdata;&lt;br /&gt;
&lt;br /&gt;
void I2C_GPS_reset(void);&lt;br /&gt;
void I2C_GPS_write_cmd(uint8_t, uint8_t);&lt;br /&gt;
uint8_t I2C_GPS_read_reg(uint8_t);&lt;br /&gt;
void I2C_GPS_read(uint8_t);&lt;br /&gt;
void I2C_GPS_init(void);&lt;br /&gt;
void I2C_GPS_new_addr(uint8_t);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
/******************************************************************************&lt;br /&gt;
 * Additional info&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Changelog:&lt;br /&gt;
 * &lt;br /&gt;
 *  ---&amp;gt; changes are documented in the file &amp;quot;RP6M256_I2C_GPSLib.c&amp;quot;&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
======Libary Source======&lt;br /&gt;
Datei: RP6M256_I2C_GPSLib.c&lt;br /&gt;
&amp;lt;pre&amp;gt;/* ****************************************************************************&lt;br /&gt;
 *                           _______________________&lt;br /&gt;
 *                           \| RP6  ROBOT SYSTEM |/&lt;br /&gt;
 *                            \_-_-_-_-_-_-_-_-_-_/           &amp;gt;&amp;gt;&amp;gt; RP6 M256 WIFI&lt;br /&gt;
 * ----------------------------------------------------------------------------&lt;br /&gt;
 * ----------------------------- [c]2014 - Dirk -------------------------------&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * File: RP6M256_I2C_GPSLib.c&lt;br /&gt;
 * Version: 1.0&lt;br /&gt;
 * Target: RP6 M256 WIFI - ATMEGA2560 @16.00MHz&lt;br /&gt;
 *         and a RP6 I2C GPS Receiver (CONRAD 1082385)&lt;br /&gt;
 *         optionally on a RP6 Sensor Board (CONRAD 1082384)&lt;br /&gt;
 * Author(s): Dirk&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Description:&lt;br /&gt;
 * &lt;br /&gt;
 * This is our new Library that contains basic routines and functions for&lt;br /&gt;
 * accessing the RP6 I2C GPS Receiver JM3-GPS (CONRAD 1082385).&lt;br /&gt;
 * The library assumes the I2C GPS Receiver software (firmware) v1.2.&lt;br /&gt;
 * If the I2C GPS Receiver is located on the RP6 Sensor Board (CONRAD 1082384)&lt;br /&gt;
 * and connected to the I2C-MODULE plug M1, the RP6M256_Sensor_BoardLib has to&lt;br /&gt;
 * be included!&lt;br /&gt;
 * &lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Includes:&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6M256_I2C_GPSLib.h&amp;quot; 		&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Variables:&lt;br /&gt;
&lt;br /&gt;
uint8_t gpsdataBuf[DATA_LENGTH + 1]; &lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Software reset for the I2C GPS Receiver.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void I2C_GPS_reset(void)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_GPS_RECEIVER_ADR, 0, 0x06);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Writes a command cmd to a register reg of the&lt;br /&gt;
 * I2C GPS Receiver.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: reg -&amp;gt; Write register [0x90..0x96]&lt;br /&gt;
 *        cmd -&amp;gt; Command&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void I2C_GPS_write_cmd(uint8_t reg, uint8_t cmd)&lt;br /&gt;
{&lt;br /&gt;
	if((reg &amp;lt; INIT_CFG) || (reg &amp;gt; TEST_MODE)) return;&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_GPS_RECEIVER_ADR, reg, cmd);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Reads a single register reg from the I2C GPS&lt;br /&gt;
 * Receiver.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: reg -&amp;gt; Read register [0x20..0x50]&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
uint8_t I2C_GPS_read_reg(uint8_t reg)&lt;br /&gt;
{&lt;br /&gt;
	if((reg &amp;lt; WHO_AM_I) || (reg &amp;gt; HEARTBEAT)) reg = WHO_AM_I;&lt;br /&gt;
	I2CTWI_transmitByte(I2C_GPS_RECEIVER_ADR, reg);&lt;br /&gt;
	return (I2CTWI_readByte(I2C_GPS_RECEIVER_ADR));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
gpsdata_t gpsdata;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Reads the GPS data from the I2C GPS Receiver.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: length -&amp;gt; Number of data bytes [1..48]&lt;br /&gt;
 *&lt;br /&gt;
 * Hint: If length = DATA_BASIC, only basic GPS&lt;br /&gt;
 *       data are read. If length = DATA_LENGTH,&lt;br /&gt;
 *       ALL GPS data are read.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void I2C_GPS_read(uint8_t length)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t i;&lt;br /&gt;
&lt;br /&gt;
	if(length &amp;gt; DATA_LENGTH) length = DATA_LENGTH;&lt;br /&gt;
	I2CTWI_readRegisters(I2C_GPS_RECEIVER_ADR, DATA_STRUCT, gpsdataBuf, length);&lt;br /&gt;
	for(i = length; i &amp;lt; DATA_LENGTH; i++) {&lt;br /&gt;
		gpsdataBuf[i] = 0;&lt;br /&gt;
	}&lt;br /&gt;
	gpsdata.latDeg = gpsdataBuf[0];&lt;br /&gt;
	gpsdata.latMin = gpsdataBuf[1];&lt;br /&gt;
	gpsdata.latMinDec = gpsdataBuf[2] + (gpsdataBuf[3] &amp;lt;&amp;lt; 8);&lt;br /&gt;
	gpsdata.lonDeg = gpsdataBuf[4];&lt;br /&gt;
	gpsdata.lonMin = gpsdataBuf[5];&lt;br /&gt;
	gpsdata.lonMinDec = gpsdataBuf[6] + (gpsdataBuf[7] &amp;lt;&amp;lt; 8);&lt;br /&gt;
	gpsdata.status.byte = gpsdataBuf[8];&lt;br /&gt;
	gpsdata.fixInd.byte = gpsdataBuf[9];&lt;br /&gt;
	gpsdata.hdop = gpsdataBuf[10];&lt;br /&gt;
	gpsdata.hdopDec = gpsdataBuf[11];&lt;br /&gt;
	gpsdata.satCount = gpsdataBuf[12];&lt;br /&gt;
	if(length == DATA_BASIC) return;&lt;br /&gt;
	gpsdata.course = gpsdataBuf[13] + (gpsdataBuf[14] &amp;lt;&amp;lt; 8);&lt;br /&gt;
	gpsdata.courseDec = gpsdataBuf[15];&lt;br /&gt;
	gpsdata.speed = gpsdataBuf[16] + (gpsdataBuf[17] &amp;lt;&amp;lt; 8);&lt;br /&gt;
	gpsdata.speedDec = gpsdataBuf[18];&lt;br /&gt;
	gpsdata.altitude = gpsdataBuf[19] + (gpsdataBuf[20] &amp;lt;&amp;lt; 8);&lt;br /&gt;
	gpsdata.altDif = gpsdataBuf[21] + (gpsdataBuf[22] &amp;lt;&amp;lt; 8);&lt;br /&gt;
	gpsdata.utcHour = gpsdataBuf[23];&lt;br /&gt;
	gpsdata.utcMinute = gpsdataBuf[24];&lt;br /&gt;
	gpsdata.utcSec = gpsdataBuf[25];&lt;br /&gt;
	gpsdata.day = gpsdataBuf[26];&lt;br /&gt;
	gpsdata.year = gpsdataBuf[27] + (gpsdataBuf[28] * 100);&lt;br /&gt;
	gpsdata.month = gpsdataBuf[29];&lt;br /&gt;
	gpsdata.pdop = gpsdataBuf[30];&lt;br /&gt;
	gpsdata.pdopDec = gpsdataBuf[31];&lt;br /&gt;
	gpsdata.vdop = gpsdataBuf[32];&lt;br /&gt;
	gpsdata.vdopDec = gpsdataBuf[33];&lt;br /&gt;
	for(i = 34; i &amp;lt; 46; i++) {&lt;br /&gt;
		gpsdata.sat[i - 34] = gpsdataBuf[i];&lt;br /&gt;
	}&lt;br /&gt;
	gpsdata.swVersion = gpsdataBuf[46];&lt;br /&gt;
	gpsdata.heartbeat = gpsdataBuf[47];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * You MUST call this function at the beginning of a&lt;br /&gt;
 * main program, that uses the RP6 I2C GPS Receiver. &lt;br /&gt;
 * If SENSOR_BOARD is defined, the I2C-MODULE power&lt;br /&gt;
 * will be switched on with the function&lt;br /&gt;
 * setI2CModulePower() defined in the&lt;br /&gt;
 * RP6M256_Sensor_BoardLib, which will be included&lt;br /&gt;
 * then.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void I2C_GPS_init(void)&lt;br /&gt;
{&lt;br /&gt;
#ifdef SENSOR_BOARD&lt;br /&gt;
	// I2C-MODULE (plug M1) power on: &lt;br /&gt;
	setI2CModulePower(1);&lt;br /&gt;
#endif&lt;br /&gt;
	// Other init procedures here!&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Writes a new I2C address to the I2C GPS Receiver.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: addr -&amp;gt; New I2C address [0xc8..0xde]&lt;br /&gt;
 *&lt;br /&gt;
 * Hints: - Default I2C address is 0xc8.&lt;br /&gt;
 *        - You may choose a new I2C address in&lt;br /&gt;
 *          the range 0xc8..0xde.&lt;br /&gt;
 *        - After writing a new address you have&lt;br /&gt;
 *          to switch the I2C GPS Receiver off&lt;br /&gt;
 *          and on again.&lt;br /&gt;
 *        - Definition I2C_GPS_RECEIVER_ADR must&lt;br /&gt;
 *          be adapted to the new I2C address!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void I2C_GPS_new_addr(uint8_t addr)&lt;br /&gt;
{&lt;br /&gt;
	if((addr &amp;lt; 0xc8) || (addr &amp;gt; 0xde)) return;&lt;br /&gt;
	addr &amp;amp;= 0xfe;								// Clear R/W bit&lt;br /&gt;
	I2CTWI_transmit3Bytes(I2C_GPS_RECEIVER_ADR, 0, 0x04, addr);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&lt;br /&gt;
/******************************************************************************&lt;br /&gt;
 * Additional info&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Changelog:&lt;br /&gt;
 * - v. 1.0 (initial release) 21.04.2014 by Dirk&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Erklärung&lt;br /&gt;
&lt;br /&gt;
======Demo======&lt;br /&gt;
makefile:&lt;br /&gt;
&amp;lt;pre&amp;gt;...&lt;br /&gt;
TARGET = RP6M256_Sensor_Board_02&lt;br /&gt;
...&lt;br /&gt;
SRC += $(RP6_LIB_PATH)/RP6common/RP6I2CmasterTWI.c&lt;br /&gt;
&lt;br /&gt;
SRC += $(RP6_LIB_PATH)/RP6control_M256_WIFI/RP6M256_Sensor_BoardLib.c&lt;br /&gt;
SRC += $(RP6_LIB_PATH)/RP6control_M256_WIFI/RP6M256_I2C_GPSLib.c&lt;br /&gt;
...&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Datei: RP6M256_Sensor_Board_02.c&lt;br /&gt;
&amp;lt;pre&amp;gt;/* &lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * RP6 ROBOT SYSTEM - RP6 CONTROL M256 Examples&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Example: RP6M256 Sensor Board&lt;br /&gt;
 * Author(s): Dirk&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Description:&lt;br /&gt;
 * In this example we show a second test for the RP6 Sensor Board.&lt;br /&gt;
 * &lt;br /&gt;
 * ############################################################################&lt;br /&gt;
 * The Robot does NOT move in this example! You can simply put it on a table&lt;br /&gt;
 * next to your PC and you should connect it to the PC via the USB Interface!&lt;br /&gt;
 * You should also connect to it via WIFI.&lt;br /&gt;
 * ############################################################################&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Includes:&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6M256Lib.h&amp;quot; 				// The RP6 M256 Library. &lt;br /&gt;
										// Always needs to be included!&lt;br /&gt;
#include &amp;quot;RP6I2CmasterTWI.h&amp;quot;			// Include the I2C-Bus Master Library&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Include our new &amp;quot;RP6M256 I2C GPS Receiver library&amp;quot;:&lt;br /&gt;
// (This is the library for accessing the RP6 I2C GPS Receiver!)&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6M256_I2C_GPSLib.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Write a floating point number to the WIFI.&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *&lt;br /&gt;
 *			// Write a floating point number to the WIFI (no exponent):&lt;br /&gt;
 *			writeDouble_WIFI(1234567.890, 11, 3);&lt;br /&gt;
 *&lt;br /&gt;
 * The value of prec (precision) defines the number of decimal places.&lt;br /&gt;
 * For 32 bit floating point variables (float, double ...) 6 is&lt;br /&gt;
 * the max. value for prec (7 relevant digits).&lt;br /&gt;
 * The value of width defines the overall number of characters in the&lt;br /&gt;
 * floating point number including the decimal point. The number of&lt;br /&gt;
 * pre-decimal positions is: (width - prec - 1).&lt;br /&gt;
 */&lt;br /&gt;
void writeDouble_WIFI(double number, uint8_t width, uint8_t prec)&lt;br /&gt;
{char buffer[width + 1];&lt;br /&gt;
	dtostrf(number, width, prec, &amp;amp;buffer[0]);&lt;br /&gt;
	writeString_WIFI(&amp;amp;buffer[0]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Write a floating point number to the LCD.&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *&lt;br /&gt;
 *			// Write a floating point number to the LCD (no exponent):&lt;br /&gt;
 *			writeDoubleLCD(1234567.890, 11, 3);&lt;br /&gt;
 *&lt;br /&gt;
 * The value of prec (precision) defines the number of decimal places.&lt;br /&gt;
 * For 32 bit floating point variables (float, double ...) 6 is&lt;br /&gt;
 * the max. value for prec (7 relevant digits).&lt;br /&gt;
 * The value of width defines the overall number of characters in the&lt;br /&gt;
 * floating point number including the decimal point. The number of&lt;br /&gt;
 * pre-decimal positions is: (width - prec - 1).&lt;br /&gt;
 */&lt;br /&gt;
void writeDoubleLCD(double number, uint8_t width, uint8_t prec)&lt;br /&gt;
{char buffer[width + 1];&lt;br /&gt;
	dtostrf(number, width, prec, &amp;amp;buffer[0]);&lt;br /&gt;
	writeStringLCD(&amp;amp;buffer[0]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Error handler&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function gets called automatically if there was an I2C Error like&lt;br /&gt;
 * the slave sent a &amp;quot;not acknowledge&amp;quot; (NACK, error codes e.g. 0x20 or 0x30).&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void I2C_transmissionError(uint8_t errorState)&lt;br /&gt;
{&lt;br /&gt;
	writeString_P_WIFI(&amp;quot;\nI2C ERROR - TWI STATE: 0x&amp;quot;);&lt;br /&gt;
	writeInteger_WIFI(errorState, HEX);&lt;br /&gt;
	writeChar_WIFI('\n');&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Main function - The program starts here:&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
	initRP6M256();    // Always call this first! The Processor will not work&lt;br /&gt;
					  // correctly otherwise. &lt;br /&gt;
&lt;br /&gt;
	initLCD(); // Initialize the LC-Display (LCD)&lt;br /&gt;
			   // Always call this before using the LCD!&lt;br /&gt;
&lt;br /&gt;
	setLEDs(0b1111);&lt;br /&gt;
	mSleep(500);&lt;br /&gt;
	setLEDs(0b0000);&lt;br /&gt;
&lt;br /&gt;
	writeString_P_WIFI(&amp;quot;\n\nRP6 Sensor Board Selftest 2!\n&amp;quot;); &lt;br /&gt;
&lt;br /&gt;
	// IMPORTANT:&lt;br /&gt;
	I2CTWI_initMaster(100); // Initialize the TWI Module for Master operation&lt;br /&gt;
							// with 100kHz SCL Frequency&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	// Register the event handler:&lt;br /&gt;
	I2CTWI_setTransmissionErrorHandler(I2C_transmissionError);&lt;br /&gt;
&lt;br /&gt;
	setLEDs(0b1111);&lt;br /&gt;
&lt;br /&gt;
	// Write a text message to the LCD:&lt;br /&gt;
	showScreenLCD(&amp;quot;################&amp;quot;, &amp;quot;################&amp;quot;);&lt;br /&gt;
	mSleep(1500);&lt;br /&gt;
	showScreenLCD(&amp;quot;RP6v2-M256-WIFI &amp;quot;, &amp;quot;Example Program&amp;quot;);&lt;br /&gt;
	mSleep(2500); &lt;br /&gt;
	showScreenLCD(&amp;quot;RP6 Sensor Board&amp;quot;, &amp;quot;   Selftest 2&amp;quot;);&lt;br /&gt;
	mSleep(2500);&lt;br /&gt;
	clearLCD();&lt;br /&gt;
&lt;br /&gt;
	setLEDs(0b0000);&lt;br /&gt;
&lt;br /&gt;
	// ---------------------------------------&lt;br /&gt;
&lt;br /&gt;
	uint8_t onoff = 0;&lt;br /&gt;
	uint8_t i;&lt;br /&gt;
&lt;br /&gt;
	startStopwatch1();&lt;br /&gt;
	startStopwatch2();&lt;br /&gt;
&lt;br /&gt;
	// IMPORTANT:&lt;br /&gt;
	sensor_board_init();						// RP6 Sensor Board init!!!&lt;br /&gt;
	I2C_GPS_init();								// RP6 I2C GPS Receiver init&lt;br /&gt;
&lt;br /&gt;
	while(true) &lt;br /&gt;
	{&lt;br /&gt;
		if(getStopwatch1() &amp;gt; 1000) // 1s&lt;br /&gt;
		{&lt;br /&gt;
			if (onoff) onoff = 0;&lt;br /&gt;
			else onoff = 1;&lt;br /&gt;
&lt;br /&gt;
			// Show GPS data:&lt;br /&gt;
			I2C_GPS_read(DATA_LENGTH);			// Read data&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nLAT_DEG:     &amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.latDeg, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;° &amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.latMin, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;.&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.latMinDec, DEC, 4);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;' &amp;quot;);&lt;br /&gt;
			if(gpsdata.status.ns)&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;N&amp;quot;);&lt;br /&gt;
			else&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;S&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nLON_DEG:    &amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.lonDeg, DEC, 3);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;° &amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.lonMin, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;.&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.lonMinDec, DEC, 4);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;' &amp;quot;);&lt;br /&gt;
			if(gpsdata.status.ew)&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;E&amp;quot;);&lt;br /&gt;
			else&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;W&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nSTATUS:     &amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.status.byte, BIN, 8);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nFIX_IND:    &amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.fixInd.byte, BIN, 8);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nHDOP:       &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(gpsdata.hdop, DEC);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;.&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.hdopDec, DEC, 2);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nSAT_N:      &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(gpsdata.satCount, DEC);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nCOURSE_T:   &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(gpsdata.course, DEC);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;.&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.courseDec, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;°&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nSPEED:      &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(gpsdata.speed, DEC);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;.&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.speedDec, DEC, 2);&lt;br /&gt;
			if(gpsdata.status.spu)&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;km/h&amp;quot;);&lt;br /&gt;
			else&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;kn&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nALT:        &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(gpsdata.altitude, DEC);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;m\nALT_DIF:    &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(gpsdata.altDif, DEC);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;m\nUTC:        &amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.utcHour, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;:&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.utcMinute, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;:&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.utcSec, DEC, 2);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nDATE:       &amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.day, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;.&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.month, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;.&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.year, DEC, 4);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nPDOP:       &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(gpsdata.pdop, DEC);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;.&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.pdopDec, DEC, 2);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nVDOP:       &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(gpsdata.vdop, DEC);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;.&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.vdopDec, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			for(i = 0; i &amp;lt; gpsdata.satCount; i++) {&lt;br /&gt;
				if(i == 8) writeString_P_WIFI(&amp;quot;\n&amp;quot;);&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;  SAT_&amp;quot;);&lt;br /&gt;
				writeIntegerLength_WIFI(i + 1, HEX, 1);&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;: &amp;quot;);&lt;br /&gt;
				writeInteger_WIFI(gpsdata.sat[i], DEC);&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nSW_VERSION: &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(gpsdata.swVersion, DEC);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nHEARTBEAT:  &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(gpsdata.heartbeat, DEC);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			// RP6 Sensor Board shutdown (button &amp;amp; status LED test):&lt;br /&gt;
			if (pressedButton) {&lt;br /&gt;
				setStatusLED(1);&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;\nPress button again for RP6 Sensor Board SHUTDOWN!\n&amp;quot;);&lt;br /&gt;
				mSleep(2000);&lt;br /&gt;
				do {&lt;br /&gt;
					if(getStopwatch2() &amp;gt; 200) { // 0.2s&lt;br /&gt;
						if (onoff) onoff = 0;&lt;br /&gt;
						else onoff = 1;&lt;br /&gt;
						if (onoff) setStatusLED(1);&lt;br /&gt;
						else setStatusLED(0);&lt;br /&gt;
						setStopwatch2(0);&lt;br /&gt;
					}&lt;br /&gt;
					mSleep(1);&lt;br /&gt;
					task_I2CTWI();&lt;br /&gt;
				} while (!readButton());&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;\n\n\n\n\nPlease wait for RP6 Sensor Board SHUTDOWN...\n&amp;quot;);&lt;br /&gt;
				sensor_board_shutdown();&lt;br /&gt;
				mSleep(3000);&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;\n\n\nThe RP6 Sensor Board now is in SHUTDOWN MODE!!!\n&amp;quot;);&lt;br /&gt;
				mSleep(1000);&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;\nRESET the M256 microcontroller now...\n\n&amp;quot;);&lt;br /&gt;
				while(true) {};&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			setStopwatch1(0);&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		task_RP6SensorBoard();					// RP6 Sensor Board task&lt;br /&gt;
&lt;br /&gt;
		task_I2CTWI();&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Erklärung&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Gyro Modul JM3-GYRO====&lt;br /&gt;
=====Analoge Auswertung=====&lt;br /&gt;
Am Pin ''OUT'' des Gyro Moduls (siehe [http://www.rn-wissen.de/index.php/RP6_Sensor_Board_und_Xtra_Module#Anschluss-Schema Anschluss-Schema]!) liegt die Ausgangsspannung des Sensors (0..5V) an. Sie kann mit einem ADC-Eingang eines Microcontrollers gemessen werden.&lt;br /&gt;
Syntax mit den Libraries der RP6Base, M32 oder M256 WiFi (ADC Kanal 0):&lt;br /&gt;
 uint16_t result = readADC(0);&lt;br /&gt;
In der C-Control-Pro Umgebung der M128 sieht das z.B. in CompactC so aus (ADC Kanal 0):&lt;br /&gt;
 word result;&lt;br /&gt;
 ADC_Set(ADC_VREF_VCC, 0);&lt;br /&gt;
 ...&lt;br /&gt;
 result = ADC_Read();&lt;br /&gt;
Das Ergebnis ''result'' kann noch zur Weiterverarbeitung angepasst werden:&lt;br /&gt;
 #define ADCVAL_ZERORATE_LEVEL			511		// Zero rate Level&lt;br /&gt;
 ...&lt;br /&gt;
 int16_t z_axisg = result - ADCVAL_ZERORATE_LEVEL;&lt;br /&gt;
Dadurch zeigt ''z_axisg'' Null an, wenn keine Rotation anliegt und wird positiv, wenn nach LINKS gedreht wird und negativ bei RECHTS-Drehung. Die Definition ADCVAL_ZERORATE_LEVEL muss natürlich an den eigenen Sensor-Nullwert angepasst werden.&lt;br /&gt;
&lt;br /&gt;
Aus dem Absolutwert von ''z_axisg'' kann man die Drehrate (Drehgeschwindigkeit) auch bestimmen:&lt;br /&gt;
&lt;br /&gt;
In den [[RP6_Sensor_Board_und_Xtra_Module#Technische_Daten_3|Technischen Daten]] ist die Empfindlichkeit des Sensors mit '''10mV/dps''' (0,01V pro Grad und Sekunde) angegeben. Damit errechnet sich die Drehrate als:&lt;br /&gt;
 Drehrate [dps] = abs(z_axisg) * (5 / 1024 / 0.01) = abs(z_axisg) * 0.48828125&lt;br /&gt;
&lt;br /&gt;
=====Optionale Ansteuerung=====&lt;br /&gt;
Im [http://www.rn-wissen.de/index.php/RP6_Sensor_Board_und_Xtra_Module#Anschluss-Schema Anschluss-Schema] ist erkennbar, dass es noch 2 Steuerleitungen ''SLEEP/PD'' und ''ST'' gibt. Mit diesen Anschlüssen kann die Betriebsart des Gyro Moduls festgelegt werden, siehe nachfolgende Tabelle:&lt;br /&gt;
{|  {{Blauetabelle}} &lt;br /&gt;
|Betriebsart&lt;br /&gt;
|ST&lt;br /&gt;
|SLEEP/PD&lt;br /&gt;
|Stromverbrauch&lt;br /&gt;
|-&lt;br /&gt;
|Normal&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|4,2mA&lt;br /&gt;
|-&lt;br /&gt;
|Sleep&lt;br /&gt;
|0&lt;br /&gt;
|1&lt;br /&gt;
|2,2mA&lt;br /&gt;
|-&lt;br /&gt;
|Self-test&lt;br /&gt;
|1&lt;br /&gt;
|0&lt;br /&gt;
|4,2mA&lt;br /&gt;
|-&lt;br /&gt;
|Power-down&lt;br /&gt;
|1&lt;br /&gt;
|1&lt;br /&gt;
|'''5µA'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
Will man zwischen den Betriebsarten per Software umschalten, muss man die beiden Steuerleitungen mit I/O Portpins des Microcontrollers verbinden, die als Ausgänge konfiguriert sind. Braucht man diese Funktion nicht, reicht es, ''ST'' und ''SLEEP/PD'' mit GND zu verbinden (Betriebsart &amp;quot;Normal&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====3D Accelerometer Modul JM3-3DA====&lt;br /&gt;
Das 3D Accelerometer Modul kann über den I2C- oder den SPI-Bus angesteuert werden. Wird das Modul auf der RP6 CONTROL M32 Platine betrieben (es sitzt also auf dem Sockel IC5 für das 2. SPI-EEPROM), dann erfolgt die Ansteuerung über den SPI-Bus. Die SPI-Grundfunktionen befinden sich in der RP6ControlLib, die daher eingebunden werden muss.&lt;br /&gt;
&lt;br /&gt;
=====RP6 CONTROL M32: ACCSENS Library=====&lt;br /&gt;
Die nachfolgende RP6ControlACCSENSLib (GCC) dient zur Ansteuerung des 3D Accelerometer Moduls durch die RP6 CONTROL M32.&lt;br /&gt;
&lt;br /&gt;
======Configuration Header======&lt;br /&gt;
Vor dem Kompilieren der Library muss eine Anpassung des Configuration Headers an die eigenen Hardware-Voraussetzungen erfolgen.&lt;br /&gt;
Dazu gibt es im Configuration Header eine Definition:&lt;br /&gt;
* EXP_STACK_1 -&amp;gt; Die RP6 CONTROL M32 sitzt auf dem vorderen Platinenstapel 1 des RP6&lt;br /&gt;
Im nachfolgenden Listing ist die Definition EXP_STACK_1 NICHT aktiv (d.h. die M32 sitzt auf dem hinteren Platinenstapel 2!). Dies muss an die eigene Hardware angepaßt werden. Wenn die RP6 CONTROL M32 auf dem vorderen Platinenstapel 1 des RP6 sitzt, muss die Zeile mit &amp;quot;EXP_STACK_1&amp;quot; &amp;quot;aktiviert&amp;quot; werden. Dazu entfernt man &amp;quot;//&amp;quot; am Zeilenanfang:&lt;br /&gt;
 #define EXP_STACK_1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Bevor man den Beschleunigungssensor nutzen kann, muss man ihn kalibrieren:&lt;br /&gt;
&lt;br /&gt;
'''Accelerometer:'''&lt;br /&gt;
* Die X-Achse wird kalibriert, indem man den RP6 mit der rechten Seite nach unten hält und den Maximalwert in MAX_X_A einträgt. Dann neigt man ihn auf seine linke Seite und trägt den negativen Maximalwert in MIN_X_A ein.&lt;br /&gt;
* Die Y-Achse wird kalibriert, indem man den RP6 mit der Vorderseite nach oben hält und den Maximalwert in MAX_Y_A einträgt. Dann kippt man die Vorderseite nach unten und trägt den negativen Maximalwert in MIN_Y_A ein.&lt;br /&gt;
* Die Z-Achse wird kalibriert, indem man den RP6 normal waagerecht hält und den Maximalwert in MAX_Z_A einträgt. Dann dreht man den RP6 &amp;quot;auf den Kopf&amp;quot; und trägt den negativen Maximalwert in MIN_Z_A ein.&lt;br /&gt;
* Sollten die angezeigten Pitch- und Roll-Werte nach der Kalibrierung der Achsen und genau waagerecht stehendem Sensor bzw. RP6 vom Nullwert deutlich abweichen, kann man sie mithilfe der Definitionen OFFSET_PITCH_A und OFFSET_ROLL_A &amp;quot;nullen&amp;quot;. Die Einheit dieser Definitionen ist °.&lt;br /&gt;
Nach dem Eintragen der Kalibrierungswerte muss das Programm neu kompiliert werden!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Datei: RP6ControlACCSENS.h&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;/* ****************************************************************************&lt;br /&gt;
 *                           _______________________&lt;br /&gt;
 *                           \| RP6  ROBOT SYSTEM |/&lt;br /&gt;
 *                            \_-_-_-_-_-_-_-_-_-_/             &amp;gt;&amp;gt;&amp;gt; RP6 CONTROL&lt;br /&gt;
 * ----------------------------------------------------------------------------&lt;br /&gt;
 * ----------------------------- [c]2014 - Dirk -------------------------------&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * File: RP6ControlACCSENS.h&lt;br /&gt;
 * Version: 1.0&lt;br /&gt;
 * Target: RP6 CONTROL - ATMEGA32 @16.00MHz&lt;br /&gt;
 * Author(s): Dirk&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Description:&lt;br /&gt;
 * Configuration header file for new ACCSENS library.&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * THE CHANGELOG CAN BE FOUND AT THE END OF THIS FILE!&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
#ifndef RP6CONTROLACCSENS_H&lt;br /&gt;
#define RP6CONTROLACCSENS_H&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Sensor position on the RP6 robot:&lt;br /&gt;
// (If EXP_STACK_1 is defined, the RP6 CONTROL M32 is located on the front&lt;br /&gt;
//  stack for addon boards on the RP6 robot. If EXP_STACK_1 is NOT defined&lt;br /&gt;
//  (default), the RP6 CONTROL M32 is mounted on the rear stack.)&lt;br /&gt;
// -------------------&lt;br /&gt;
//#define EXP_STACK_1&lt;br /&gt;
// -------------------&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// The following sensor is used:&lt;br /&gt;
// - 3D Accelerometer Modul (CONRAD 1082387-62) with LIS302DLH 3-axis&lt;br /&gt;
//   accelerometer&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// LIS302DLH accelerometer calibration data:&lt;br /&gt;
#define MAX_X_A						32767		// Max. X-axis value&lt;br /&gt;
#define MIN_X_A						-32768		// Min. X-axis value&lt;br /&gt;
#define MAX_Y_A						32767		// Max. Y-axis value&lt;br /&gt;
#define MIN_Y_A						-32768		// Min. Y-axis value&lt;br /&gt;
#define MAX_Z_A						32767		// Max. Z-axis value&lt;br /&gt;
#define MIN_Z_A						-32768		// Min. Z-axis value&lt;br /&gt;
#define OFFSET_PITCH_A				0.0			// Offset Pitch [°]&lt;br /&gt;
#define OFFSET_ROLL_A				0.0			// Offset Roll [°]&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
/******************************************************************************&lt;br /&gt;
 * Additional info&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Changelog:&lt;br /&gt;
 * &lt;br /&gt;
 *  ---&amp;gt; changes are documented in the file &amp;quot;RP6ControlACCSENSLib.c&amp;quot;&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
======Library Header======&lt;br /&gt;
Datei: RP6ControlACCSENSLib.h&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;/* ****************************************************************************&lt;br /&gt;
 *                           _______________________&lt;br /&gt;
 *                           \| RP6  ROBOT SYSTEM |/&lt;br /&gt;
 *                            \_-_-_-_-_-_-_-_-_-_/             &amp;gt;&amp;gt;&amp;gt; RP6 CONTROL&lt;br /&gt;
 * ----------------------------------------------------------------------------&lt;br /&gt;
 * ----------------------------- [c]2014 - Dirk -------------------------------&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * File: RP6ControlACCSENSLib.h&lt;br /&gt;
 * Version: 1.0&lt;br /&gt;
 * Target: RP6 CONTROL - ATMEGA32 @16.00MHz&lt;br /&gt;
 * Author(s): Dirk&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Description:&lt;br /&gt;
 * This is the RP6ControlACCSENSLib header file.&lt;br /&gt;
 * You have to include this file, if you want to use the library&lt;br /&gt;
 * RP6ControlACCSENSLib.c in your own projects.&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * THE CHANGELOG CAN BE FOUND AT THE END OF THIS FILE!&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
#ifndef RP6CONTROLACCSENSLIB_H&lt;br /&gt;
#define RP6CONTROLACCSENSLIB_H&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Includes:&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6ControlLib.h&amp;quot; 		// The RP6 Control Library (v. 1.1 or higher). &lt;br /&gt;
#include &amp;quot;RP6ControlACCSENS.h&amp;quot;&lt;br /&gt;
#include &amp;lt;math.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&lt;br /&gt;
#define ACC_CS							MEM_CS2&lt;br /&gt;
#define DEVICE_IDENTIFIER				0x32&lt;br /&gt;
&lt;br /&gt;
// Registers:&lt;br /&gt;
#define WHO_AM_I						0x0f&lt;br /&gt;
#define CTRL_REG1						0x20&lt;br /&gt;
#define CTRL_REG2						0x21&lt;br /&gt;
#define CTRL_REG3						0x22&lt;br /&gt;
#define CTRL_REG4						0x23&lt;br /&gt;
#define CTRL_REG5						0x24&lt;br /&gt;
#define HP_FILTER_RESET					0x25&lt;br /&gt;
#define REFERENCE						0x26&lt;br /&gt;
#define STATUS_REG						0x27&lt;br /&gt;
#define OUT_X_L							0x28&lt;br /&gt;
#define OUT_X_H							0x29&lt;br /&gt;
#define OUT_Y_L							0x2a&lt;br /&gt;
#define OUT_Y_H							0x2b&lt;br /&gt;
#define OUT_Z_L							0x2c&lt;br /&gt;
#define OUT_Z_H							0x2d&lt;br /&gt;
#define INT1_CFG						0x30&lt;br /&gt;
#define INT1_SOURCE						0x31&lt;br /&gt;
#define INT1_THS						0x32&lt;br /&gt;
#define INT1_DURATION					0x33&lt;br /&gt;
#define INT2_CFG						0x34&lt;br /&gt;
#define INT2_SOURCE						0x35&lt;br /&gt;
#define INT2_THS						0x36&lt;br /&gt;
#define INT2_DURATION					0x37&lt;br /&gt;
&lt;br /&gt;
// Control Register bitmasks:&lt;br /&gt;
#define CTRL_REG1_POWERDOWN				0b00000000&lt;br /&gt;
#define CTRL_REG1_3D_DEFAULT			0b00000111&lt;br /&gt;
#define CTRL_REG1_3D_LOPWR_10HZ			0b11000111&lt;br /&gt;
#define CTRL_REG2_DEFAULT				0b00000000&lt;br /&gt;
#define CTRL_REG3_DEFAULT				0b00000000&lt;br /&gt;
#define CTRL_REG4_DEFAULT				0b00000000&lt;br /&gt;
#define CTRL_REG4_BDU_2G				0b10000000&lt;br /&gt;
#define CTRL_REG4_BDU_2G_STSIGN			0b10001000&lt;br /&gt;
#define CTRL_REG4_BDU_BLE_2G			0b11000000&lt;br /&gt;
#define CTRL_REG4_BDU_BLE_2G_STSIGN		0b11001000&lt;br /&gt;
#define CTRL_REG5_DEFAULT				0b00000000&lt;br /&gt;
&lt;br /&gt;
// Read/write address bitmasks:&lt;br /&gt;
#define READ_MASK						0b10000000&lt;br /&gt;
#define READ_AUTOINC_MASK				0b11000000&lt;br /&gt;
#define WRITE_MASK						0b01111111&lt;br /&gt;
&lt;br /&gt;
extern int16_t x_axisa, y_axisa, z_axisa;&lt;br /&gt;
extern double pitch, roll;&lt;br /&gt;
extern double xa, ya, za;&lt;br /&gt;
extern double the, phi;&lt;br /&gt;
&lt;br /&gt;
uint8_t SPI_ACCSENS_readByte(uint8_t regAddr);&lt;br /&gt;
void SPI_ACCSENS_readBytes(uint8_t startAddr, uint8_t *buffer, uint8_t length);&lt;br /&gt;
void SPI_ACCSENS_writeByte(uint8_t regAddr, uint8_t data);&lt;br /&gt;
uint8_t SPI_ACCSENS_getStatus(void);&lt;br /&gt;
&lt;br /&gt;
void SPI_ACCSENS_init(void);&lt;br /&gt;
void SPI_ACCSENS_shutdown(void);&lt;br /&gt;
void SPI_ACCSENS_read(void);&lt;br /&gt;
void SPI_ACCSENS_normalize(void);&lt;br /&gt;
void SPI_ACCSENS_position(void);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
/******************************************************************************&lt;br /&gt;
 * Additional info&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Changelog:&lt;br /&gt;
 * &lt;br /&gt;
 *  ---&amp;gt; changes are documented in the file &amp;quot;RP6ControlACCSENSLib.c&amp;quot;&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
======Library Source======&lt;br /&gt;
Datei: RP6ControlACCSENSLib.c&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;/* ****************************************************************************&lt;br /&gt;
 *                           _______________________&lt;br /&gt;
 *                           \| RP6  ROBOT SYSTEM |/&lt;br /&gt;
 *                            \_-_-_-_-_-_-_-_-_-_/             &amp;gt;&amp;gt;&amp;gt; RP6 CONTROL&lt;br /&gt;
 * ----------------------------------------------------------------------------&lt;br /&gt;
 * ----------------------------- [c]2014 - Dirk -------------------------------&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * File: RP6ControlACCSENSLib.c&lt;br /&gt;
 * Version: 1.0&lt;br /&gt;
 * Target: RP6 CONTROL - ATMEGA32 @16.00MHz&lt;br /&gt;
 *         with optional LC-Display 16x2 chars (CONRAD 190911-62)&lt;br /&gt;
 *         and a 3D Accelerometer Modul (CONRAD 1082387-62) (IC5)&lt;br /&gt;
 * Author(s): Dirk&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Description:&lt;br /&gt;
 * This is my RP6 Control ACCSENS Library. This library may be used to access&lt;br /&gt;
 * the basic functions of the 3D Accelerometer Modul. This RP6 Xtra module may&lt;br /&gt;
 * be placed on the IC5 socket on the RP6 CONTROL M32 instead of a second&lt;br /&gt;
 * EEPROM.&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * THE CHANGELOG CAN BE FOUND AT THE END OF THIS FILE!&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
 &lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Includes:&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6ControlACCSENSLib.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// SPI functions:&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Reads a single register from the 3D Accelerometer&lt;br /&gt;
 * Modul (ACCSENS).&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
uint8_t SPI_ACCSENS_readByte(uint8_t regAddr)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t data;&lt;br /&gt;
	regAddr |= READ_MASK;						// Read byte&lt;br /&gt;
	PORTB &amp;amp;= ~ACC_CS;&lt;br /&gt;
	writeSPI(regAddr);&lt;br /&gt;
	data = readSPI();&lt;br /&gt;
	PORTB |= ACC_CS;&lt;br /&gt;
	return data;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Reads &amp;quot;length&amp;quot; bytes into the buffer &amp;quot;buffer&amp;quot;&lt;br /&gt;
 * from startAddr on. &lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void SPI_ACCSENS_readBytes(uint8_t startAddr, uint8_t *buffer, uint8_t length)&lt;br /&gt;
{&lt;br /&gt;
	startAddr |= READ_AUTOINC_MASK;				// Read byte, auto increment&lt;br /&gt;
	PORTB &amp;amp;= ~ACC_CS;&lt;br /&gt;
	writeSPI(startAddr);&lt;br /&gt;
	readBufferSPI(&amp;amp;buffer[0], length);&lt;br /&gt;
	PORTB |= ACC_CS;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Write a single data byte to the specified sensor&lt;br /&gt;
 * address.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void SPI_ACCSENS_writeByte(uint8_t regAddr, uint8_t data)&lt;br /&gt;
{&lt;br /&gt;
	PORTB &amp;amp;= ~ACC_CS;&lt;br /&gt;
	writeSPI(regAddr);&lt;br /&gt;
	writeSPI(data);&lt;br /&gt;
	PORTB |= ACC_CS;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Returns sensor status register - for checking if&lt;br /&gt;
 * sensor is busy. &lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
uint8_t SPI_ACCSENS_getStatus(void)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t status;&lt;br /&gt;
	PORTB &amp;amp;= ~ACC_CS;&lt;br /&gt;
	writeSPI(STATUS_REG);&lt;br /&gt;
	status = readSPI();&lt;br /&gt;
	PORTB |= ACC_CS;&lt;br /&gt;
	return status;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// 3D accelerometer functions:&lt;br /&gt;
&lt;br /&gt;
int16_t x_axisa, y_axisa, z_axisa;&lt;br /&gt;
double pitch, roll;&lt;br /&gt;
double xa, ya, za;&lt;br /&gt;
double the, phi;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Initializes the sensor. You must call this&lt;br /&gt;
 * function at the beginning of a program, that&lt;br /&gt;
 * uses the 3D Accelerometer Modul.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void SPI_ACCSENS_init(void)&lt;br /&gt;
{&lt;br /&gt;
	// All axes enable, low power, 10Hz output data rate:&lt;br /&gt;
	SPI_ACCSENS_writeByte(CTRL_REG1, CTRL_REG1_3D_LOPWR_10HZ);&lt;br /&gt;
	// No update while reading, +- 2g, self-test minus:&lt;br /&gt;
	SPI_ACCSENS_writeByte(CTRL_REG4, CTRL_REG4_BDU_2G_STSIGN);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Sets the LIS302DLH power-down mode. If you&lt;br /&gt;
 * do not need the sensor, you can save energy&lt;br /&gt;
 * by using the sensor power-down mode.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void SPI_ACCSENS_shutdown(void)&lt;br /&gt;
{&lt;br /&gt;
	// LIS302DLH in power-down mode:&lt;br /&gt;
	SPI_ACCSENS_writeByte(CTRL_REG1, CTRL_REG1_POWERDOWN);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function reads the X-axis, Y-axis and Z-axis&lt;br /&gt;
 * values from the LIS302DLH accelerometer and stores&lt;br /&gt;
 * them in the global variables x_axisa, y_axisa and&lt;br /&gt;
 * z_axisa.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void SPI_ACCSENS_read(void)&lt;br /&gt;
{&lt;br /&gt;
#ifndef EXP_STACK_1&lt;br /&gt;
	// Default sensor position (M32 located on the RP6 rear stack):&lt;br /&gt;
	// xb = -y:&lt;br /&gt;
	x_axisa = SPI_ACCSENS_readByte(OUT_Y_L) | (SPI_ACCSENS_readByte(OUT_Y_H) &amp;lt;&amp;lt; 8);&lt;br /&gt;
	x_axisa *= -1;&lt;br /&gt;
	// yb = -x:&lt;br /&gt;
	y_axisa = SPI_ACCSENS_readByte(OUT_X_L) | (SPI_ACCSENS_readByte(OUT_X_H) &amp;lt;&amp;lt; 8);&lt;br /&gt;
	y_axisa *= -1;&lt;br /&gt;
	// zb = z:&lt;br /&gt;
	z_axisa = SPI_ACCSENS_readByte(OUT_Z_L) | (SPI_ACCSENS_readByte(OUT_Z_H) &amp;lt;&amp;lt; 8);&lt;br /&gt;
#else&lt;br /&gt;
	// Other sensor position (M32 located on the RP6 front stack):&lt;br /&gt;
	// xb = y:&lt;br /&gt;
	x_axisa = SPI_ACCSENS_readByte(OUT_Y_L) | (SPI_ACCSENS_readByte(OUT_Y_H) &amp;lt;&amp;lt; 8);&lt;br /&gt;
	// yb = x:&lt;br /&gt;
	y_axisa = SPI_ACCSENS_readByte(OUT_X_L) | (SPI_ACCSENS_readByte(OUT_X_H) &amp;lt;&amp;lt; 8);&lt;br /&gt;
	// zb = z:&lt;br /&gt;
	z_axisa = SPI_ACCSENS_readByte(OUT_Z_L) | (SPI_ACCSENS_readByte(OUT_Z_H) &amp;lt;&amp;lt; 8);&lt;br /&gt;
#endif&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function limits and normalizes the x-axisa,&lt;br /&gt;
 * y-axisa and z-axisa values read from the LIS302DLH&lt;br /&gt;
 * accelerometer with the function SPI_ACCSENS_read() and&lt;br /&gt;
 * stores them in the global double variables xa, ya and&lt;br /&gt;
 * za.&lt;br /&gt;
 * It also calculates the position in space in form of the&lt;br /&gt;
 * tilt angles (the = pitch, phi = roll) and stores them&lt;br /&gt;
 * in the global double variables the and phi.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void SPI_ACCSENS_normalize(void)&lt;br /&gt;
{&lt;br /&gt;
	// Limit raw values:&lt;br /&gt;
	if (x_axisa &amp;lt; MIN_X_A) x_axisa = MIN_X_A;&lt;br /&gt;
	if (x_axisa &amp;gt; MAX_X_A) x_axisa = MAX_X_A;&lt;br /&gt;
	if (y_axisa &amp;lt; MIN_Y_A) y_axisa = MIN_Y_A;&lt;br /&gt;
	if (y_axisa &amp;gt; MAX_Y_A) y_axisa = MAX_Y_A;&lt;br /&gt;
	if (z_axisa &amp;lt; MIN_Z_A) z_axisa = MIN_Z_A;&lt;br /&gt;
	if (z_axisa &amp;gt; MAX_Z_A) z_axisa = MAX_Z_A;&lt;br /&gt;
	xa = (double) x_axisa / 10000.0;&lt;br /&gt;
	ya = (double) y_axisa / 10000.0;&lt;br /&gt;
	za = (double) z_axisa / 10000.0;&lt;br /&gt;
	// Calculate Pitch and Roll:&lt;br /&gt;
	phi = asin(xa);								// Calculate the and phi&lt;br /&gt;
	the = asin(ya / cos(the));					//  from the raw values&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function calculates the position in space by&lt;br /&gt;
 * using the the and phi values (see function&lt;br /&gt;
 * SPI_ACCSENS_normalize()!). It stores the position&lt;br /&gt;
 * in the global double variables pitch and roll. &lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void SPI_ACCSENS_position(void)&lt;br /&gt;
{&lt;br /&gt;
	pitch = the * 180 / M_PI + OFFSET_PITCH_A;&lt;br /&gt;
	roll = phi * 180 / M_PI + OFFSET_ROLL_A;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/******************************************************************************&lt;br /&gt;
 * Additional info&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Changelog:&lt;br /&gt;
 * - v. 1.0 (initial release) 04.04.2014 by Dirk&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Erklärung&lt;br /&gt;
&lt;br /&gt;
======Demo======&lt;br /&gt;
makefile:&lt;br /&gt;
&amp;lt;pre&amp;gt;...&lt;br /&gt;
TARGET = RP6Control_01_ACCSENS&lt;br /&gt;
...&lt;br /&gt;
SRC += $(RP6_LIB_PATH)/RP6control/RP6ControlLib.c&lt;br /&gt;
SRC += $(RP6_LIB_PATH)/RP6common/RP6uart.c&lt;br /&gt;
SRC += $(RP6_LIB_PATH)/RP6control/RP6ControlACCSENSLib.c&lt;br /&gt;
...&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Datei: RP6Control_01_ACCSENS.c&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;// Uncommented Version of RP6Control_01_ACCSENS.c&lt;br /&gt;
// written by Dirk&lt;br /&gt;
// ------------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6ControlACCSENSLib.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void writeDouble(double number, uint8_t width, uint8_t prec)&lt;br /&gt;
{char buffer[width + 1];&lt;br /&gt;
	dtostrf(number, width, prec, &amp;amp;buffer[0]);&lt;br /&gt;
	writeString(&amp;amp;buffer[0]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void writeDoubleLCD(double number, uint8_t width, uint8_t prec)&lt;br /&gt;
{char buffer[width + 1];&lt;br /&gt;
	dtostrf(number, width, prec, &amp;amp;buffer[0]);&lt;br /&gt;
	writeStringLCD(&amp;amp;buffer[0]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
	initRP6Control();&lt;br /&gt;
&lt;br /&gt;
	writeString_P(&amp;quot;\n\nRP6Control SPI ACCSENS Test Program!\n&amp;quot;); &lt;br /&gt;
	setLEDs(0b1111);&lt;br /&gt;
	mSleep(50);&lt;br /&gt;
	initLCD(); &lt;br /&gt;
	showScreenLCD(&amp;quot;################&amp;quot;, &amp;quot;################&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
	showScreenLCD(&amp;quot;  SPI ACCSENS&amp;quot;, &amp;quot;  Test Program&amp;quot;);&lt;br /&gt;
	mSleep(1000);&lt;br /&gt;
	setLEDs(0b0000);&lt;br /&gt;
&lt;br /&gt;
	SPI_ACCSENS_init();&lt;br /&gt;
&lt;br /&gt;
	uint8_t whoami = SPI_ACCSENS_readByte(WHO_AM_I);&lt;br /&gt;
	writeString_P(&amp;quot;\nWHO AM I: &amp;quot;);&lt;br /&gt;
	writeInteger(whoami, HEX);&lt;br /&gt;
	writeChar('\n');&lt;br /&gt;
	mSleep(2000);&lt;br /&gt;
	&lt;br /&gt;
	startStopwatch1();&lt;br /&gt;
&lt;br /&gt;
	while(true) &lt;br /&gt;
	{&lt;br /&gt;
		if(getStopwatch1() &amp;gt; 1000)&lt;br /&gt;
		{&lt;br /&gt;
			SPI_ACCSENS_read();&lt;br /&gt;
			writeString_P(&amp;quot;\n3D Accelerometer SENSOR -&amp;gt;\n&amp;quot;);&lt;br /&gt;
			writeString_P(&amp;quot;X-axis: &amp;quot;);&lt;br /&gt;
			writeInteger(x_axisa, DEC);&lt;br /&gt;
			writeChar('\n');&lt;br /&gt;
			writeString_P(&amp;quot;Y-axis: &amp;quot;);&lt;br /&gt;
			writeInteger(y_axisa, DEC);&lt;br /&gt;
			writeChar('\n');&lt;br /&gt;
			writeString_P(&amp;quot;Z-axis: &amp;quot;);&lt;br /&gt;
			writeInteger(z_axisa, DEC);&lt;br /&gt;
			writeChar('\n');&lt;br /&gt;
			SPI_ACCSENS_normalize();&lt;br /&gt;
			SPI_ACCSENS_position();&lt;br /&gt;
			writeString_P(&amp;quot;POSITION: \n&amp;quot;);&lt;br /&gt;
			writeString_P(&amp;quot;  Pitch [°]: &amp;quot;);&lt;br /&gt;
			writeDouble(pitch, 6, 1);&lt;br /&gt;
			writeChar('\n');&lt;br /&gt;
			writeString_P(&amp;quot;  Roll [°]:  &amp;quot;);&lt;br /&gt;
			writeDouble(roll, 6, 1);&lt;br /&gt;
			writeChar('\n');&lt;br /&gt;
			setCursorPosLCD(0, 0);&lt;br /&gt;
			writeStringLCD_P(&amp;quot;P&amp;quot;);&lt;br /&gt;
			writeDoubleLCD(pitch, 6, 1);&lt;br /&gt;
			writeStringLCD_P(&amp;quot; &amp;quot;);&lt;br /&gt;
			setCursorPosLCD(0, 8);&lt;br /&gt;
			writeStringLCD_P(&amp;quot;R&amp;quot;);&lt;br /&gt;
			writeDoubleLCD(roll, 6, 1);&lt;br /&gt;
			writeStringLCD_P(&amp;quot; &amp;quot;);&lt;br /&gt;
			setCursorPosLCD(1, 0);&lt;br /&gt;
			writeStringLCD_P(&amp;quot;X&amp;quot;);&lt;br /&gt;
			writeIntegerLCD(x_axisa, DEC);&lt;br /&gt;
			writeStringLCD_P(&amp;quot;   &amp;quot;);&lt;br /&gt;
			setCursorPosLCD(1, 5);&lt;br /&gt;
			writeStringLCD_P(&amp;quot;Y&amp;quot;);&lt;br /&gt;
			writeIntegerLCD(y_axisa, DEC);&lt;br /&gt;
			writeStringLCD_P(&amp;quot;   &amp;quot;);&lt;br /&gt;
			setCursorPosLCD(1, 10);&lt;br /&gt;
			writeStringLCD_P(&amp;quot;Z&amp;quot;);&lt;br /&gt;
			writeIntegerLCD(z_axisa, DEC);&lt;br /&gt;
			writeStringLCD_P(&amp;quot;    &amp;quot;);&lt;br /&gt;
			mSleep(2000);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Erklärung&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Erfahrungsberichte==&lt;br /&gt;
&lt;br /&gt;
...in Arbeit...(kann aber gerne ergänzt werden)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Siehe auch==&lt;br /&gt;
* [[RP6v2]]&lt;br /&gt;
* [[RP6]]&lt;br /&gt;
* [[RP6 - Programmierung]]&lt;br /&gt;
* [[RP6 Kamera - Mitmach-Projekt]]&lt;br /&gt;
* [[RP6v2 I2C-Portexpander]]&lt;br /&gt;
* [[RP6v2 USB-RS232-Adapter]]&lt;br /&gt;
* [[RP6v2 Orientierung]]&lt;br /&gt;
* [[RP6 Multi IO Projekt]]&lt;br /&gt;
* [[RP6 Multi IO Projekt - Software]]&lt;br /&gt;
* [[Induktive_Ladestation_f%C3%BCr_den_RP6|Induktive Ladestation für den RP6]]&lt;br /&gt;
* [[IR-bake_f%C3%BCr_den_RP6|IR-bake für den RP6]]&lt;br /&gt;
* [[CCRP5]]&lt;br /&gt;
* [[Yeti]]&lt;br /&gt;
* [[Asuro]]&lt;br /&gt;
* [[C't-Bot]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Weblinks==&lt;br /&gt;
'''Siehe auch die Weblinks im [http://www.rn-wissen.de/index.php/RP6v2#Weblinks RP6v2] und im [http://www.rn-wissen.de/index.php/RP6#Weblinks RP6] Artikel!'''&lt;br /&gt;
&lt;br /&gt;
* [http://www.conrad.de/ce/de/product/1082384/Arexx-RP6-Sensor-Board-RP6-JM03-61 RP6 Sensor Board bei CONRAD]&lt;br /&gt;
* JM3 Engeneering: [http://www.jm3-engineering.com/rp6.htm RP6 Roboter Erweiterung]&lt;br /&gt;
* Ankündigung einer Sensorerweiterungsplatine für die RP6v2 M256 WiFi im [http://www.roboternetz.de/community/threads/63595-Neue-Hardware-f%C3%BCr-RP6%28v2%29?p=590129&amp;amp;viewfull=1#post590129 Roboternetz RP6 Forum]&lt;br /&gt;
* Erfahrungsbericht zum Sensor Board im [http://www.arexx.com/forum/viewtopic.php?f=19&amp;amp;t=2498 AREXX Support Forum] und im [http://www.roboternetz.de/community/threads/64414-RP6-Sensor-Board-Erster-Eindruck Roboternetz RP6 Forum]&lt;br /&gt;
* Erfahrungsbericht zum I2C GPS Empfänger im [http://www.arexx.com/forum/viewtopic.php?f=19&amp;amp;t=2509 AREXX Support Forum]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Kategorie:Robotikeinstieg]]	 &lt;br /&gt;
[[Kategorie:Praxis]]&lt;br /&gt;
&lt;br /&gt;
==Autoren==&lt;br /&gt;
--[[Benutzer:Dirk|Dirk]] 17:21, 8. Jul 2014 (CET)&lt;/div&gt;</summary>
		<author><name>Dirk NO2</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=RP6_Sensor_Board_und_Xtra_Module&amp;diff=24816</id>
		<title>RP6 Sensor Board und Xtra Module</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=RP6_Sensor_Board_und_Xtra_Module&amp;diff=24816"/>
				<updated>2014-07-08T15:24:33Z</updated>
		
		<summary type="html">&lt;p&gt;Dirk NO2: /* Autoren */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Bild:RP6_Sensor_Board.jpg|Das RP6 Sensor Board|right|500px]]&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_Xtra_module.JPG|RP6 Xtra module|right|500px]]&lt;br /&gt;
==Was bisher geschah==&lt;br /&gt;
'''Siehe auch &amp;quot;Was bisher geschah&amp;quot; im [http://www.rn-wissen.de/index.php/RP6v2#Was_bisher_geschah RP6v2] und im [http://www.rn-wissen.de/index.php/RP6#Was_bisher_geschah RP6] Artikel!'''&lt;br /&gt;
&lt;br /&gt;
Mit, 27. Nov 2013 - Ankündigung einer Sensorerweiterungsplatine, die an die RP6v2-M256-WIFI angeschlossen werden kann&amp;lt;br/&amp;gt;&lt;br /&gt;
Sam, 22. Feb 2014 - Auslieferungsbeginn des RP6 Sensor Boards, des I2C GPS Empfängers, des 3D Accelerometer Moduls und des Gyro Moduls&amp;lt;br/&amp;gt;&lt;br /&gt;
Mon, 17. Mär 2014 - Das RP6 Sensor Board ist &amp;quot;nicht lieferbar&amp;quot;, neuer Liefertermin angekündigt für den 12.06.2014 (!?)&amp;lt;br/&amp;gt;&lt;br /&gt;
Die, 25. Mär 2014 - Das RP6 Sensor Board ist wieder &amp;quot;sofort lieferbar&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Allgemein==&lt;br /&gt;
Dieser Artikel beschreibt die Grundlagen und Programmierung des RP6 Sensor Boards und der RP6 Xtra Module. Dieses Erweiterungs-Modul und die Xtra Module sind Teile des RP6-Systems, das in den RN-Wissen-Artikeln [[RP6]], [[RP6v2]] und [[RP6_-_Programmierung|RP6 - Programmierung]] ausführlich beschrieben wird. Ausgegliedert aus den &amp;quot;Haupt-Artikeln&amp;quot; habe ich diese Module, da sie m.E. zu einer neuen &amp;quot;Ära&amp;quot; des RP6-Systems gehören:&lt;br /&gt;
&lt;br /&gt;
Sie wurden nicht mehr von '''[[Benutzer:SlyD|SlyD]] (Dominik S. Herwald)''' in Zusammenarbeit mit '''[http://www.arexx.com/ AREXX]''' entwickelt, sondern nun von '''[http://jm3-engineering.com/ JM3 Engeneering] (Dipl.-Ing. Jürgen Maisel)'''. Ab Februar 2014 waren dann das '''RP6 Sensor Board RP6-JM03-61''' ([http://www.conrad.de/ce/de/product/1082384/Arexx-RP6-Sensor-Board-RP6-JM03-61 1082384]) und die drei RP6 Xtra Module '''I2C GPS Empfänger JM3-GPS''' ([http://www.conrad.de/ce/de/product/1082385/Arexx-IC-GPS-Empfaenger-JM3-GPS 1082385]), '''Gyro Modul JM3-GYRO''' ([http://www.conrad.de/ce/de/product/1082386/Arexx-Gyro-Modul-JM3-GYRO 1082386]) und '''3D Accelerometer Modul JM3-3DA''' ([http://www.conrad.de/ce/de/product/1082387/Arexx-3D-Accelerometer-Modul-JM3-3DA 1082387]) bei CONRAD lieferbar. Einen ersten Eindruck vom Sensor Board kann man im RoboterNetz und AREXX Support Forum bekommen,- siehe unter [[RP6_Sensor_Board_und_Xtra_Module#Weblinks|Weblinks]]!&lt;br /&gt;
&lt;br /&gt;
===RP6 Sensor Board===&lt;br /&gt;
Das [[RP6_Sensor_Board_und_Xtra_Module#RP6_Sensor_Board_2|RP6 Sensor Board]] gehört zu den &amp;quot;Erweiterungs-Modulen&amp;quot; des RP6-Systems. '''Andere &amp;quot;Erweiterungs-Module&amp;quot; werden im [[RP6v2#Erweiterungs-Module|RP6v2]] und im [[RP6#Erweiterungs-Module|RP6]] Artikel beschrieben!'''&lt;br /&gt;
&lt;br /&gt;
Das ''RP6 Sensor Board'' ist das erste &amp;quot;Erweiterungs-Modul&amp;quot;, das nicht über einen eigenen Microprozessor verfügt,- es ist also ein ''passives Modul'', das von einem Microprozessor-System (z.B. RP6v2, M32, M128, M256 Wifi) angesteuert werden muss. Es ist ebenfalls das erste Modul, das nicht mehr über die rautenförmige Einbuchtung an der Vorderkante verfügt, sondern komplett rechteckig ist. Damit passt es (montiert auf den Standard-Abstandbolzen) nur auf den vorderen Platinenstapel 1 des RP6.&lt;br /&gt;
&lt;br /&gt;
===RP6 Xtra Module===&lt;br /&gt;
Die [[RP6_Sensor_Board_und_Xtra_Module#RP6_Xtra_Module_2|RP6 Xtra Module]] gehören zu den &amp;quot;Zubehör- und Ersatzteilen&amp;quot; des RP6-Systems. '''Über die weiteren &amp;quot;Zubehör- und Ersatzteile&amp;quot; zum RP6 informiert der entsprechende Abschnitt im [[RP6v2#Zubeh.C3.B6r_und_Ersatzteile|RP6v2]] und im [[RP6#Zubehör und Ersatzteile|RP6]] Artikel!'''&lt;br /&gt;
&lt;br /&gt;
Die ''RP6 Xtra Module'' unterscheiden sich von den weiteren &amp;quot;Zubehör- und Ersatzteilen&amp;quot; dadurch, dass sie selbstständige Sensor-Platinen sind, die ideal zum RP6-System passen, aber auch mit anderen Microcontroller-Plattformen nutzbar sind.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==RP6 Sensor Board==&lt;br /&gt;
Das RP6 Sensor Board RP6-JM03-61 ([http://www.conrad.de/ce/de/product/1082384/Arexx-RP6-Sensor-Board-RP6-JM03-61 1082384]) wurde am 27.11.2013 von [[Benutzer:SlyD|SlyD]] angekündigt (siehe Weblink!).&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_Sensor_Board.jpg|Das RP6 Sensor Board]]&lt;br /&gt;
&lt;br /&gt;
===Beschreibung===&lt;br /&gt;
(Laut Online-Katalog der Firma CONRAD!)&lt;br /&gt;
&lt;br /&gt;
''&amp;quot;Das RP6 Sensor Board erweitert die Möglichkeiten aller RP6 Roboter um wesentliche Sensorsignale für Robotik-Anwendungen wie zum Beispiel Dreharten (Yaw-Gyro), Kipp- und Neigewinkel, Kompassrichtung oder aber auch Zeit und Datum.&lt;br /&gt;
Sie können einfach mit zusätzlichen Sharp Sensoren Abstände genau messen, z.B. für autonome Fahrrouten oder falls der Sensor nach unten gerichtet ist, kann er Treppenstufen oder ähnliches entdecken. Außerdem gibt es die Möglichkeit z.B. die Sharp Sensoren ein- bzw. auszuschalten um Strom zu sparen. Zusätzlich können bis zu 8 Servos angesteuert werden um z.B. einen Roboterarm zu bewegen, der auch mechanisch einfach zu montieren ist. Um die Möglichkeiten des RP6 Sensor Boards komplett ausnutzen zu können, wird ein RP6V2 und RP6Wifi Control Board empfohlen. Die ermöglicht den Roboter über Wifi fernzusteuern oder Sensordaten auf dem Kommandozentrum (PC) z.B Kompassdaten, Temperatur oder Kipp- und Neigewinkel anzeigen zu lassen.&amp;quot;''&lt;br /&gt;
&lt;br /&gt;
'''Ausstattung'''&lt;br /&gt;
* Magnetometer- und Accelerometer für Kompassfunktion&lt;br /&gt;
* Gyro Sensor (Yaw)&lt;br /&gt;
* Sharp-Sensor Schnittstelle&lt;br /&gt;
* LED Scheinwerfer&lt;br /&gt;
* LED Treiber mit Smart Funktionen&lt;br /&gt;
* I²C Bus mit max. 400 kHz Übertragungsrate; Hot Swap I²C-Bus Buffer&lt;br /&gt;
* Taster mit LED&lt;br /&gt;
* Echtzeit-Uhr RTC&lt;br /&gt;
* Backupbatterie (Aufladung während des Betriebs)&lt;br /&gt;
* Expansion Port z.B. für GPS-I²C Bus Modul&lt;br /&gt;
* 8 Servo-Ausgänge mit eigenem Schaltregler&lt;br /&gt;
* 8 PWM Ausgänge&lt;br /&gt;
* 5 LED Ausgänge und 2 Digital-I/O Ausgänge.&lt;br /&gt;
&lt;br /&gt;
'''Lieferumfang'''&lt;br /&gt;
* RP6 Sensor Board&lt;br /&gt;
* Montage-Kit&lt;br /&gt;
* Kabel&lt;br /&gt;
* Anleitung und CD mit Dokumentation.&lt;br /&gt;
&lt;br /&gt;
====Blockschaltbild====&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_Sensor_Board_BSP.png|RP6 Sensor Board Blockschaltbild]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Technische Daten===&lt;br /&gt;
{|  {{Blauetabelle}} &lt;br /&gt;
|'''Mikrocontroller:'''&lt;br /&gt;
|kein&lt;br /&gt;
|-&lt;br /&gt;
|'''Speicher:'''&lt;br /&gt;
|kein&amp;lt;br/&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|'''Programmierung:'''&lt;br /&gt;
|C++ (GCC, u.a.) über externes µC-System&lt;br /&gt;
|-&lt;br /&gt;
|'''Vorhandene Sensoren:'''&lt;br /&gt;
|Temperatur, 3D Magnetfeld (Kompass), 3D Beschleunigung, Yaw-Gyro&amp;lt;br/&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|'''Vorhandene Aktoren:'''&lt;br /&gt;
|LED Controller (2 LEDs on board, 5 freie LED Ports), Status LED,&amp;lt;br/&amp;gt;Button, Servo (PWM) Controller für 8 Servos und 8 PWM-Kanäle,&amp;lt;br/&amp;gt;Real Time Clock (RTC), 2 freie I/O Ports&lt;br /&gt;
|-&lt;br /&gt;
|'''Abmessungen:'''&lt;br /&gt;
|(L &amp;amp;times; B &amp;amp;times; H) 112 &amp;amp;times; 90 &amp;amp;times; 19 mm&amp;lt;br/&amp;gt;(B + 5 mm durch Scheinwerfer vorn)&lt;br /&gt;
|-&lt;br /&gt;
|'''Ausführung:'''&lt;br /&gt;
|Fertig aufgebautes Erweiterungsmodul&lt;br /&gt;
|-&lt;br /&gt;
|'''Stromversorgung:'''&lt;br /&gt;
|6 AA NiMH Akkus (über die RP6v2 Base)&amp;lt;br/&amp;gt;und optionaler Zusatzakku 7,2..10 V für Servo Power&lt;br /&gt;
|-&lt;br /&gt;
|'''Hersteller:'''&lt;br /&gt;
|Arexx Niederlande&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Umbau-Optionen===&lt;br /&gt;
Hier soll beschrieben werden, welche Umbau-Optionen es für das RP6 Sensor Board gibt. Im Text gibt es Verweise auf den Schaltplan des RP6 Sensor Boards (RP6_Sensor_Board_Rev2_Schema.pdf) in der Form: (SP2: Bauteil). Dies bedeutet, dass man das Bauteil auf Blatt 2 des Schaltplans finden kann. Beispielhaft sind im folgenden Text Bestell-Nummern der Firma [http://www.conrad.de/ce/ CONRAD] genannt. Natürlich kann man die Teile auch bei anderen Versendern beziehen.&lt;br /&gt;
&lt;br /&gt;
====USRBUS- und XBUS-Wannenstecker====&lt;br /&gt;
Der zweite Wannenstecker für den XBUS (SP3: K14) und USRBUS (SP3: K16) kann nachbestückt werden.&lt;br /&gt;
Man braucht dazu: &lt;br /&gt;
* 2 Wannenstecker 2x5-polig gerade RM 2,54mm (CONRAD [http://www.conrad.de/ce/de/product/741648/Stiftleiste-Print-Montage-gerade-Rastermass-254-mm-Pole-2-x-5-10120554-BKL-Electronic-Inhalt-1-St/ 741648])&lt;br /&gt;
Die Wannenstecker lötet man auf die eingezeichneten Positionen.&lt;br /&gt;
&lt;br /&gt;
'''USRBUS-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''USRBUS''' || '''Sensor Board-Funktion''' || '''Verwendung''' || '''I/O'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Y1 || &amp;quot;ADC0&amp;quot; || SHARP vorn || I&lt;br /&gt;
|-&lt;br /&gt;
| 2 || Y2 || &amp;quot;ADC1&amp;quot; || Yaw-Gyro || I&lt;br /&gt;
|-&lt;br /&gt;
| 3 || Y3 || PWR || Power für&amp;lt;br/&amp;gt;SHARPs, CAM_IF,&amp;lt;br/&amp;gt;I2C-MODULE || O&lt;br /&gt;
|-&lt;br /&gt;
| 4 || Y4 || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 5 || Y5 || &amp;quot;ADC4&amp;quot; || SHARP hinten ||I&lt;br /&gt;
|-&lt;br /&gt;
| 6..14 || Y6..Y14 || || keine ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
'''XBUS-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''XBUS''' || '''M256-Port''' ||'''M256-Funktion''' || '''Sensor Board-Funktion''' || '''Jumper''' || '''Verwendung''' || '''I/O'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || GND || || GND || GND || || ||&lt;br /&gt;
|-&lt;br /&gt;
| 2 || GND || || GND || GND || || ||&lt;br /&gt;
|-&lt;br /&gt;
| 3 || VDD || || VDD|| VDD_1 || || VDD +5V ||&lt;br /&gt;
|-&lt;br /&gt;
| 4 || +UB || || +UB || VSS_1 || || CAM_IF Power ||&lt;br /&gt;
|-&lt;br /&gt;
| 5 || VDD || || VDD || VDD_1 || || VDD +5V ||&lt;br /&gt;
|-&lt;br /&gt;
| 6 || +UB || || +UB || VSS_1 || || CAM_IF Power ||&lt;br /&gt;
|-&lt;br /&gt;
| 7 || INTU || PJ4 || PCINT13 || INTU || || keine || I&lt;br /&gt;
|-&lt;br /&gt;
| 8 || INT1 || PJ3 || PCINT12 || INT1 || 3 || LSM303DLHC: INT1 || I&lt;br /&gt;
|-&lt;br /&gt;
| 9 || INT3 || PJ5 || PCINT14 || INT3 || 2&amp;lt;br/&amp;gt;5 || DS1339: SQW/INT_N&amp;lt;br/&amp;gt;LSM303DLHC: INT2 || I&amp;lt;br/&amp;gt;I&lt;br /&gt;
|-&lt;br /&gt;
| 10 || SCL || PD0 || SCL || SCL_M || || I2C-Bus || O&lt;br /&gt;
|-&lt;br /&gt;
| 11 || INT2 || PJ6 || PCINT15 || INT2 || 4 || MAX7311: INT_N || I&lt;br /&gt;
|-&lt;br /&gt;
| 12 || SDA || PD1 || SDA || SDA_M || || I2C-Bus || I/O&lt;br /&gt;
|-&lt;br /&gt;
| 13 || MRESET || || MRESET || MRESET || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 14 || GND || || GND || GND || || ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====I/O-Patchfield_1====&lt;br /&gt;
Dieses 2x 5-polige &amp;quot;Patchfield_1&amp;quot; (SP3: K8), beschriftet mit &amp;quot;I/O&amp;quot; liegt neben dem Wannenstecker I/O und weist dieselbe Belegung auf. Möchte man auf dem Sensor Board Verbindungen über den Wannenstecker I/O zu einer angeschlossenen Microprozessor-Platine herstellen, dann kann man auf das &amp;quot;Patchfield_1&amp;quot; eine Stiftleiste löten.&lt;br /&gt;
Man braucht dazu: &lt;br /&gt;
* 2-reihige Stiftleiste RM 2,54mm (z.B. 2x40-polig [http://www.conrad.de/ce/de/product/741306/Doppelreihige-Stiftleiste-RM-254-gerade-Pole-2-x-40-10120173-BKL-Electronic-Inhalt-1-St 741306]) &lt;br /&gt;
Man trennt von der 2-reihigen Stiftleiste 2x5 Kontakte ab und lötet sie auf die Lötpunkte &amp;quot;I/O&amp;quot;. Zuvor muss man u.U. Lötzinnreste aus den Lötpunkten mit Entlötlitze bzw. Entlötsaugpumpe entfernen.&lt;br /&gt;
&lt;br /&gt;
'''Stecker I/O an M256 IO_PWM/T0/T1:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''M256-Port''' ||'''M256-Funktion''' || '''Sensor Board-Funktion''' || '''Verwendung''' || '''I/O'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || PD4 || ICP1 || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 2 || || GND || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 3 || PD6 || T1 || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 4 || PB7 || OC0A || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 5 || PG5 || OC0B || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 6 || PD7 || T0 || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 7 || PB5 || OC1A || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 8 || PK5 || ADC13 || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 9 || PB6 || OC1B || &amp;quot;PD5&amp;quot; || I2C Bus Buffer Enable || O&lt;br /&gt;
|-&lt;br /&gt;
| 10 || || VDD || || keine ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====ADC-Patchfield_2====&lt;br /&gt;
Dieses 2x 5-polige &amp;quot;Patchfield_2&amp;quot; (SP3: K9), beschriftet mit &amp;quot;ADC&amp;quot; liegt neben dem Wannenstecker ADC und weist dieselbe Belegung auf. Möchte man auf dem Sensor Board Verbindungen über den Wannenstecker ADC zu einer angeschlossenen Microprozessor-Platine herstellen, dann kann man auf das &amp;quot;Patchfield_2&amp;quot; eine Stiftleiste löten.&lt;br /&gt;
Man braucht dazu: &lt;br /&gt;
* 2-reihige Stiftleiste RM 2,54mm (z.B. 2x40-polig [http://www.conrad.de/ce/de/product/741306/Doppelreihige-Stiftleiste-RM-254-gerade-Pole-2-x-40-10120173-BKL-Electronic-Inhalt-1-St 741306]) &lt;br /&gt;
Man trennt von der 2-reihigen Stiftleiste 2x5 Kontakte ab und lötet sie auf die Lötpunkte &amp;quot;ADC&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
'''Stecker ADC an M256 ADC_IO2/CMP:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''M256-Port''' ||'''M256-Funktion''' || '''Sensor Board-Funktion''' || '''Jumper''' || '''Verwendung''' || '''I/O'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || PK0 || ADC8 || || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 2 || || GND || || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 3 || PK1 || ADC9 || &amp;quot;ADC4&amp;quot; || 6 || SHARP hinten || I&lt;br /&gt;
|-&lt;br /&gt;
| 4 || PE3 || OC3A/AIN1 || || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 5 || PK2 || ADC10 || || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 6 || || GND || || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 7 || PK3 || ADC11 || || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 8 || PE2 || XCK0/AIN0 || || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 9 || PK4 || ADC12 || || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 10 || || VDD || || || keine ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Anschluss-Optionen===&lt;br /&gt;
Hier soll beschrieben werden, welche Anschluss-Optionen es für das RP6 Sensor Board gibt. In erster Linie geht es dabei um die Belegung der vorhandenen Stecker bzw. Stiftleisten.&lt;br /&gt;
&lt;br /&gt;
Allgemein kann man Anschlüsse an Stiftleisten mit entsprechenden Steckbuchsen erreichen. Solche Steckbuchsen sind z.B. bei ELV erhältlich:&lt;br /&gt;
* Steckbuchse, 2-polig, RM 2,54mm ([http://www.elv.de/steckbuchse-2-polig.html ELV 68-016635])&lt;br /&gt;
* Steckbuchse, 3-polig, RM 2,54mm ([http://www.elv.de/steckbuchse-3-polig.html ELV 68-022503])&lt;br /&gt;
* Steckbuchse, 5-polig, RM 2,54mm ([http://www.elv.de/steckbuchse-5-polig.html ELV 68-023073])&lt;br /&gt;
Die Crimpkontakte dieser Steckbuchse werden an Litzen angequetscht (oder angelötet) und zum entsprechenden Sensor bzw. Aktor geführt. &lt;br /&gt;
&lt;br /&gt;
====I2C-MODULE====&lt;br /&gt;
Der I2C-MODULE Anschluss (SP1: M1) auf dem Sensor Board besteht aus einer 9-poligen Präzisions-Buchsenleiste RM 2,54mm (z.B. [http://www.conrad.de/ce/de/product/741360/Praezisions-Buchsenleiste-RM-254-gerade-Pole-1-x-20-10120832-BKL-Electronic-Inhalt-1-St 741360]). Wenn man eigene I2C-Module hier anschliessen will, braucht man zur Kontaktierung:&lt;br /&gt;
* Präzisions-Stiftleiste, 9-polig, RM 2,54mm (z.B. [http://www.conrad.de/ce/de/product/741307/Praezisions-Stiftleiste-RM-254-gerade-Pole-1-x-20-10120536-BKL-Electronic-Inhalt-1-St 741307])&lt;br /&gt;
&lt;br /&gt;
'''I2C-MODULE-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''Sensor Board&amp;lt;br/&amp;gt;-Funktion (M1)''' || '''Verwendung''' || '''I/O''' |||| [[RP6_Sensor_Board_und_Xtra_Module#I2C_GPS_Empf.C3.A4nger_JM3-GPS|'''I2C GPS Empfänger]]&amp;lt;br/&amp;gt;-Funktion (K1)'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || VCC || +5V || |||| VCC_1&lt;br /&gt;
|-&lt;br /&gt;
| 2 || SCLOUT || Buffered I2C-Bus || O |||| SCL/SCK&lt;br /&gt;
|-&lt;br /&gt;
| 3 || SDAOUT || Buffered I2C-Bus || I/O |||| SDA/MOSI&lt;br /&gt;
|-&lt;br /&gt;
| 4 || NC || keine || ||||&lt;br /&gt;
|-&lt;br /&gt;
| 5 || I/O1 || Status LED || O ||||&lt;br /&gt;
|-&lt;br /&gt;
| 6 || I/O2 || Taster || I ||||&lt;br /&gt;
|-&lt;br /&gt;
| 7 || NC || keine || ||||&lt;br /&gt;
|-&lt;br /&gt;
| 8 || GND || GND (geschaltet!) || |||| GND&lt;br /&gt;
|-&lt;br /&gt;
| 9 || GND || GND (geschaltet!) || |||| GND&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====CAM_IF====&lt;br /&gt;
Der CAM_IF Anschluss (SP1: K28) ist eine 2x 3-polige Stiftleiste mit der folgenden Belegung:&lt;br /&gt;
&lt;br /&gt;
'''CAM_IF-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''Sensor Board&amp;lt;br/&amp;gt;-Funktion (K28)''' || '''Verwendung''' || '''I/O'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || GND || GND (geschaltet!) ||&lt;br /&gt;
|-&lt;br /&gt;
| 2 || VSS_1 || +7,2..10V (RP6: +UB) ||&lt;br /&gt;
|-&lt;br /&gt;
| 3 || SCLOUT || Buffered I2C-Bus || O&lt;br /&gt;
|-&lt;br /&gt;
| 4 || SDAOUT || Buffered I2C-Bus || I/O&lt;br /&gt;
|-&lt;br /&gt;
| 5 || SCL_M || I2C-Bus || O&lt;br /&gt;
|-&lt;br /&gt;
| 6 || SDA_M || I2C-Bus || I/O&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====IO_EXT====&lt;br /&gt;
Der IO_EXT Anschluss (SP1: K19) ist eine 2x 2-polige Stiftleiste mit der folgenden Belegung:&lt;br /&gt;
&lt;br /&gt;
'''IO_EXT-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''Sensor Board&amp;lt;br/&amp;gt;-Funktion (K19)''' || '''Verwendung''' || '''I/O'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || MAX7311: I/O1.2 || freier I/O Port || I/O&lt;br /&gt;
|-&lt;br /&gt;
| 2 || GND || ||&lt;br /&gt;
|-&lt;br /&gt;
| 3 || MAX7311: I/O1.1 || freier I/O Port || I/O&lt;br /&gt;
|-&lt;br /&gt;
| 4 || GND || ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====PWM_OUT====&lt;br /&gt;
Der PWM_OUT Anschluss (SP5: K12) ist eine 2x 4-polige Stiftleiste mit der folgenden Belegung:&lt;br /&gt;
&lt;br /&gt;
'''PWM_OUT-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''Sensor Board&amp;lt;br/&amp;gt;-Funktion (K12)''' || '''Verwendung''' || '''I/O'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || PCA9685: PWM0 || freier PWM Port || O&lt;br /&gt;
|-&lt;br /&gt;
| 2 || PCA9685: PWM1 || freier PWM Port || O&lt;br /&gt;
|-&lt;br /&gt;
| 3 || PCA9685: PWM2 || freier PWM Port || O&lt;br /&gt;
|-&lt;br /&gt;
| 4 || PCA9685: PWM3 || freier PWM Port || O&lt;br /&gt;
|-&lt;br /&gt;
| 5 || PCA9685: PWM4 || freier PWM Port || O&lt;br /&gt;
|-&lt;br /&gt;
| 6 || PCA9685: PWM5 || freier PWM Port || O&lt;br /&gt;
|-&lt;br /&gt;
| 7 || PCA9685: PWM6 || freier PWM Port || O&lt;br /&gt;
|-&lt;br /&gt;
| 8 || PCA9685: PWM7 || freier PWM Port || O&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====TP1====&lt;br /&gt;
Am Testpunkt TP1 (SP4: TP1) kann man das Signal SQW/INT_N der RTC (DS1339) prüfen/messen.&lt;br /&gt;
&lt;br /&gt;
====LEDs====&lt;br /&gt;
=====Rücklichter=====&lt;br /&gt;
Der Rücklichter Anschluss (SP1: K10) ist eine 2-polige Stiftleiste mit der folgenden Belegung:&lt;br /&gt;
&lt;br /&gt;
'''Rücklichter-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''Sensor Board&amp;lt;br/&amp;gt;-Funktion (K10)''' || '''Verwendung''' || '''I/O'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || TCA6507: P3 || Rücklicht rechts || O&lt;br /&gt;
|-&lt;br /&gt;
| 2 || TCA6507: P4 || Rücklicht links || O&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=====Display-Hintergrundbeleuchtung=====&lt;br /&gt;
Der Display-Hintergrundbeleuchtung Anschluss (SP1: K7) ist eine 2-polige Stiftleiste mit der folgenden Belegung:&lt;br /&gt;
&lt;br /&gt;
'''Display-Hintergrundbeleuchtung-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''Sensor Board&amp;lt;br/&amp;gt;-Funktion (K7)''' || '''Verwendung''' || '''I/O'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || TCA6507: P0 || Display-Hintergrundbeleuchtung || O&lt;br /&gt;
|-&lt;br /&gt;
| 2 || VDD_1 || +5V ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=====Freie Ausgänge=====&lt;br /&gt;
Der freie Ausgang 1 Anschluss (SP1: K4) ist eine 2-polige Stiftleiste mit der folgenden Belegung:&lt;br /&gt;
&lt;br /&gt;
'''Freier Ausgang 1-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''Sensor Board&amp;lt;br/&amp;gt;-Funktion (K4)''' || '''Verwendung''' || '''I/O'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || TCA6507: P1 || freier LED Port || O&lt;br /&gt;
|-&lt;br /&gt;
| 2 || VDD_1 || +5V ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Der freie Ausgang 2 Anschluss (SP1: K2) ist eine 2-polige Stiftleiste mit der folgenden Belegung:&lt;br /&gt;
&lt;br /&gt;
'''Freier Ausgang 2-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''Sensor Board&amp;lt;br/&amp;gt;-Funktion (K2)''' || '''Verwendung''' || '''I/O'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || TCA6507: P2 || freier LED Port || O&lt;br /&gt;
|-&lt;br /&gt;
| 2 || VDD_1 || +5V ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====SHARP Sensoren====&lt;br /&gt;
Das RP6 Sensor Board verfügt über zwei Stecker SHARP_F (SP1: K5) und SHARP_R (SP1: K3) zum Anschluß von analogen SHARP Infrarot-Distanz-Sensoren. Folgende SHARP Sensoren sind anschließbar:&lt;br /&gt;
* 1. SHARP Distanz-Sensor GP2Y0A41SK0F ([http://www.conrad.de/ce/de/product/504596/Distanz-Sensor-GP2Y0A41SK0F-Sharp-GP2Y0A41SK0F-Messbereiche-Erfassungsbereich-4-30-cm-5-VDC 504596]), Messbereich 4..30cm&lt;br /&gt;
* 2. SHARP Distanz-Sensor GP2Y0A21YK0F ([http://www.conrad.de/ce/de/product/504591/Distanz-Sensor-GP2Y0A21YK0F-Sharp-GP2Y0A21YK0F-Messbereiche-Erfassungsbereich-10-80-cm-5-VDC 504591]), Messbereich 10..80cm&lt;br /&gt;
* 3. SHARP Distanz-Sensor GP2Y0A02YK ([http://www.conrad.de/ce/de/product/185364/Distanz-Sensor-GP-2-Y0A-02-YK-Sharp-GP-2-Y0A-02-YK-Messbereiche-Erfassungsbereich-20-150-cm-5-VDC 185364]), Messbereich 20..150cm&lt;br /&gt;
* 4. SHARP Distanz-Sensor GP2Y0A710K0F ([http://www.conrad.de/ce/de/product/504597/Distanz-Sensor-GP2Y0A710K0F-Sharp-GP2Y0A710K0F-Messbereiche-Erfassungsbereich-100-550-cm-5-VDC 504597]), Messbereich 100..550cm&lt;br /&gt;
''Die Auswahl der geeigneten SHARP Sensoren hängt von der gewünschten Funktion ab: Zur Erkundung großer Räume eignet sich insbesondere der Typ 4 mit einer hohen Reichweite von 5,5m. Er ist aber ungeeignet, die Distanz von Objekten zu erkennen, die sich näher als 1m vor dem Sensor befinden. Ein guter Kompromiss zwischen Nahbereichsmessung und &amp;quot;Fernsicht&amp;quot; sind die Typen 2 (10..80cm) und 3 (20..150cm). Will man den Distanz-Sensor vor allem zur Vermeidung eins Sturzes von einer Treppe (Tiefenerkennung) oder nur zur Erkennung von Hindernissen direkt vor dem Roboter (Kollisionserkennung) benutzen, dann eignet sich insbesondere für den vorderen Sensor (SHARP_F) der Typ 1, da er im Nahbereich von 4 bis 30cm messen kann.''&lt;br /&gt;
&lt;br /&gt;
Für die Verbindung zwischen den beiden 3-poligen JST XH Steckern (K3, 5) auf dem Sensor Board und den SHARP-Sensoren braucht man auf der Sensor Board Seite folgende Stecker-/buchsenteile:&lt;br /&gt;
* 2x JST XH Gehäuse, 3-polig, RM 2,5mm ([http://www.conrad.de/ce/de/product/740583/Gehaeuse-RM-25-mm-Serie-XH-Rastermass-25-mm-Pole-3-Nennstrom-3-A-XHP-3-JST-Inhalt-1-St 740583])&lt;br /&gt;
* 6x JST XH Crimpkontakt f. RM 2,5mm ([http://www.conrad.de/ce/de/product/741112/Crimpkontakt-fuer-RM-25-mm-Serie-XH-Rastermass-25-mm-BXH-001T-P06-JST-Inhalt-1-St 741112])&lt;br /&gt;
Die Crimpkontakte dieser Steckbuchse werden an die meist 3-adrige Litze des Sensors angequetscht (oder angelötet). Zur Belegung des Sensor Anschlusses siehe das jeweilige Datenblatt!&lt;br /&gt;
&lt;br /&gt;
=====Vorn=====&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_Sensor_Board_SHARP_F.JPG|RP6 Sensor Board SHARP Sensor vorn|thumb]]&lt;br /&gt;
&lt;br /&gt;
Der vordere SHARP Sensor kann auch mechanisch am Sensor Board befestigt werden. Dazu gibt es an der Vorderkante der Platine zwei Befestigungslöcher.&lt;br /&gt;
&lt;br /&gt;
Das Bild rechts zeigt den SHARP Distanzsensor GP2Y0A02YK montiert vorn auf dem Sensor Board mit zwei M3 Gelenkbolzen ([http://www.conrad.de/ce/de/product/521043/Gelenkbolzen-1-x-Aussengewinde1-x-Innengewinde-Messing-vernickelt-Schluesselweite-55-mm/ 521043]) und passenden Schrauben/Muttern.&lt;br /&gt;
&lt;br /&gt;
'''Vorn-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''RP6v2-Port''' ||'''RP6v2-Funktion''' || '''Sensor Board&amp;lt;br/&amp;gt;-Funktion (K5)''' || '''Verwendung''' || '''I/O''' |||| '''SHARP Sensor&amp;lt;br/&amp;gt;-Funktion''' &lt;br /&gt;
|-&lt;br /&gt;
| 1 || PA0 || ADC0 || &amp;quot;ADC0&amp;quot; || SHARP vorn || I |||| Vo&lt;br /&gt;
|-&lt;br /&gt;
| 2 || || || VDD_1 || +5V || |||| Vcc&lt;br /&gt;
|-&lt;br /&gt;
| 3 || || || GND || GND (geschaltet!) || |||| GND&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=====Hinten=====&lt;br /&gt;
Der hintere SHARP Sensor kann z.B. an der Rückseite des RP6v2 Fahrgestells befestigt werden.&lt;br /&gt;
&lt;br /&gt;
'''Hinten-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''M256-Port''' ||'''M256-Funktion''' || '''Sensor Board&amp;lt;br/&amp;gt;-Funktion (K3)''' || '''Verwendung''' || '''I/O''' |||| '''SHARP Sensor&amp;lt;br/&amp;gt;-Funktion''' &lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| 1 || PK1 || ADC9 || &amp;quot;ADC4&amp;quot; || SHARP hinten || I |||| Vo&lt;br /&gt;
|-&lt;br /&gt;
| 2 || || || VDD_1 || +5V || |||| Vcc&lt;br /&gt;
|-&lt;br /&gt;
| 3 || || || GND || GND (geschaltet!) || |||| GND&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Servos====&lt;br /&gt;
=====Power=====&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_Sensor_Board_Servo-PWR.jpg|RP6 Sensor Board Servo-PWR Stecker|thumb]]&lt;br /&gt;
&lt;br /&gt;
An den SERVO_PWR Stecker (SP5: K1) muss ein Akku zur Stromversorgung der mit dem Sensor Board verbundenen Servos angeschlossen werden. Der Stecker hat folgende Belegung:&lt;br /&gt;
 &lt;br /&gt;
'''SERVO_PWR-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''Sensor Board&amp;lt;br/&amp;gt;-Funktion (K1)''' || '''Verwendung'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || GND_POWER || Servo Power GND&lt;br /&gt;
|-&lt;br /&gt;
| 2 || VSS_POWER || Servo Power Eingang +7,2..10V&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Der Akku zur Versorgung der Servos muss eine Nennspannung von 7,2..10V aufweisen. Der Schaltregler auf dem Sensor Board kann bei einer 5,0V Servo-Spannung Ströme bis 3,0A (Spitzen bis 5,0A) liefern. '''Die Polung des Akkus darf am Stecker SERVO_PWR nicht vertauscht werden.''' Siehe den oberen Teil der nebenstehende Abbildung! Ratsam ist es, eine Sicherung 3,15A in die Plusleitung zwischen Akku und SERVO_PWR Stecker zu legen.&lt;br /&gt;
&lt;br /&gt;
Für die Verbindung zwischen dem 2-poligen JST XH Stecker (SERVO_PWR, K1) auf dem Sensor Board und dem Akku braucht man auf der Sensor Board Seite folgende Stecker-/buchsenteile:&lt;br /&gt;
* JST XH Gehäuse, 2-polig, RM 2,5mm ([http://www.conrad.de/ce/de/product/740549/Gehaeuse-RM-25-mm-Serie-XH-Rastermass-25-mm-Pole-2-Nennstrom-3-A-XHP-2-JST-Inhalt-1-St 740549])&lt;br /&gt;
* 2x JST XH Crimpkontakt f. RM 2,5mm ([http://www.conrad.de/ce/de/product/741112/Crimpkontakt-fuer-RM-25-mm-Serie-XH-Rastermass-25-mm-BXH-001T-P06-JST-Inhalt-1-St 741112])&lt;br /&gt;
Die Crimpkontakte dieser Steckbuchse werden an die 2-adrige Litze zum Akku angequetscht (oder angelötet).&lt;br /&gt;
&lt;br /&gt;
Wenn man keinen separaten Akku zur Versorgung der Servos nehmen will, kann man auch +UB der RP6v2 Base dafür nutzen. An +UB liegt die Akkuspannung der Base (Nennspannung 7,2V) über eine Sicherung F1 3,15A (RP6v2) bzw. 2,5A (RP6) auf dem Mainboard an. +UB kann man z.B. am [[RP6#EXT_Anschlu.C3.9F|EXT Anschluß der Base]] entnehmen. Die nebenstehende Abbildung zeigt im unteren Teil, an welchen Pins man dort +UB kontaktieren kann!&lt;br /&gt;
&lt;br /&gt;
Dabei ist zu beachten, dass die Sicherung F1 auf dem RP6(v2) Mainboard den nutzbaren Strom für die Servos deutlich begrenzt: Durch diese Sicherung fließt ja nicht nur der Servo-Strom, sondern auch der Strom für den RP6 und alle darauf montierten Zusatzplatinen. Wenn der RP6 also herumfährt und z.B. noch die IRCOMM-Sendedioden nutzt, bleibt kaum noch Stromreserve für die Servos auf dem Sensor Board übrig.&lt;br /&gt;
'''Das bedeutet: Man sollte unbedingt einen separaten Akku für die Servos auf dem Sensor Board benutzen!'''&lt;br /&gt;
&lt;br /&gt;
======SERVO_PWR-EXT Verbindung======&lt;br /&gt;
Für die Verbindung zwischen dem 2-poligen JST XH Stecker (SERVO_PWR, K1) auf dem Sensor Board und dem 8-poligen JST XH Stecker (EXT) auf dem RP6v2 Mainboard braucht man folgende Stecker-/buchsenteile:&lt;br /&gt;
* JST XH Gehäuse, 2-polig, RM 2,5mm ([http://www.conrad.de/ce/de/product/740549/Gehaeuse-RM-25-mm-Serie-XH-Rastermass-25-mm-Pole-2-Nennstrom-3-A-XHP-2-JST-Inhalt-1-St 740549])&lt;br /&gt;
* JST XH Gehäuse, 8-polig, RM 2,5mm ([http://www.conrad.de/ce/de/product/740928/Gehaeuse-RM-25-mm-Serie-XH-Rastermass-25-mm-Pole-8-Nennstrom-3-A-XHP-8-JST-Inhalt-1-St 740928])&lt;br /&gt;
* 10x JST XH Crimpkontakt f. RM 2,5mm ([http://www.conrad.de/ce/de/product/741112/Crimpkontakt-fuer-RM-25-mm-Serie-XH-Rastermass-25-mm-BXH-001T-P06-JST-Inhalt-1-St 741112])&lt;br /&gt;
Mit einer 2-adrigen Litze, die beidseits mit den Crimpkontakten verquetscht (oder verlötet) wird, verbindet man dann den SERVO_PWR Stecker mit dem EXT Stecker, wie in der Abbildung oben gezeigt. ''Achtung: Plus (+) und Minus (-) nicht vertauschen!''&lt;br /&gt;
 Ein passendes Kabel soll zukünftig (*) mitgeliefert werden.&lt;br /&gt;
&lt;br /&gt;
Auf dem RP6 Mainboard ist der 8-polige EXT Stecker noch nicht bestückt. Wenn man ihn nachrüsten will, muss man noch bestellen:&lt;br /&gt;
* JST XH Stiftleiste gerade, 8-polig, RM 2,5mm ([http://www.conrad.de/ce/de/product/740105/Stiftleiste-gerade-RM-25-mm-Serie-XH-Rastermass-25-mm-Pole-8-Nennstrom-3-A-B8B-XH-A-LFSN-JST-Inhalt-1-St 740105])&lt;br /&gt;
Die Stiftleiste wird auf das RP6 Mainboard gelötet, dabei weisen die beiden Einkerbungen an einer Längsseite der Stiftleiste nach hinten zum Rand des Mainboards.&lt;br /&gt;
 Auch diese Stiftleiste soll zukünftig (*) zum Lieferumfang gehören.&lt;br /&gt;
'''Zu *)''' Meinem RP6 Sensor Board (bestellt am 1.3.2014) lag das konfektionierte Kabel und die Stiftleiste noch nicht bei!&lt;br /&gt;
&lt;br /&gt;
=====Stecker=====&lt;br /&gt;
An die acht 3-poligen Stiftleisten SERVO_1 bis SERVO_8 (SP5: K6, 11, 29..34) können Servos angeschlossen werden. Direkt aufstecken kann man Servo-Steckbuchsen mit der Belegung von CONRAD, Graupner/JR und Robbe/Futaba (Versorgungsspannung Plus am mittleren Pin). Auf der Sensor Board Platine kann man den Pin 3 (Servo Power GND) der 3-poligen Stiftleisten daran erkennen, dass er näher zum rechten Platinenrand (Seite mit dem XBUS Stecker) angeordnet ist als der zugehörige Pin 1 (Servo Signal).&lt;br /&gt;
&lt;br /&gt;
Wenn Servos mit nicht passender Steckbuchse angeschlossen werden sollen, dann braucht man auf der Sensor Board Seite folgende Stecker-/buchsenteile für jedes Servo:&lt;br /&gt;
* Steckbuchse, 3-polig, RM 2,54mm ([http://www.elv.de/steckbuchse-3-polig.html ELV 68-022503])&lt;br /&gt;
Die Crimpkontakte dieser Steckbuchse werden an die 3-adrige Litze des Servos angequetscht (oder angelötet). &lt;br /&gt;
&lt;br /&gt;
'''SERVO_1..8-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''Sensor Board&amp;lt;br/&amp;gt;-Funktion (K6,11,29..34)''' || '''Verwendung''' || '''I/O''' |||| '''Servo-&amp;lt;br/&amp;gt;Kabelfarben'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || PCA9685: PWM15..8 || Servo Signal || O |||| Weiß, Orange&lt;br /&gt;
|-&lt;br /&gt;
| 2 || Servo_PWR || Servo Power +5V (geschaltet!) || |||| Rot&lt;br /&gt;
|-&lt;br /&gt;
| 3 || GND_POWER || Servo Power GND || |||| Schwarz, Braun&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Roboterarm RA2-HOBBY====&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_Sensor_Board_RA2-MINI.JPG|RP6 Sensor Board mit Roboterarm RA2-MINI|thumb]]&lt;br /&gt;
&lt;br /&gt;
In der Anleitung zum RP6 Sensor Board ist der Arexx Roboterarm RA2-HOBBY bzw. RA2-MINI [http://www.conrad.de/ce/de/product/191534/Arexx-Mini-Roboterarm-RA2-MINI (191534)] abgebildet. Er ist dort ohne Grundgestell und Controller-Platine auf dem Sensor Board befestigt.&lt;br /&gt;
Das Sensor Board eignet sich sehr gut zur Ansteuerung der 6 Servos des Roboterarms.&lt;br /&gt;
&lt;br /&gt;
Zur Montage des RA2-MINI auf dem Sensor Board geht man so vor:&lt;br /&gt;
* Lösen der 4 Rundkopfschrauben M3x6, die die Servobodenplatte mit den Abstandbolzen M3x30 auf der Controller-Platine verbinden (siehe Anleitung zum RA2-MINI, Seite 19!)&lt;br /&gt;
* Lösen der Servobodenplatte vom Bodenservo (siehe Anleitung zum RA2-MINI, Seite 8!)&lt;br /&gt;
* Bohren der Befestigungslöcher in die Servobodenplatte:&lt;br /&gt;
** Rechts-Links Lochabstand 4,75cm, Vorn-Hinten Lochabstand 4,1cm&lt;br /&gt;
** Ungefähre Lage der Löcher siehe Abbildung in der Anleitung zum Sensor Board, Seite 4!&lt;br /&gt;
** Markierung der Bohrlöcher auf der Rückseite der Servobodenplatte:&lt;br /&gt;
*** 1. Mit einer Hilfslinie die Hinterkante des Servoausschnitts (das ist die kürzere Kante, die näher am Rand der Bodenplatte liegt!) nach beiden Seiten verlängern&lt;br /&gt;
*** 2. Eine 2. Hilfslinie parallel zur ersten im Abstand von 1,4cm zur Mitte der Servobodenplatte hin einzeichnen&lt;br /&gt;
*** 3. Auf dieser Linie jetzt die beiden hinteren Bohrlöcher symmetrisch im Abstand von 4,75cm markieren&lt;br /&gt;
*** 4. Für die vorderen Bohrlöcher eine 3. Hilfslinie im Abstand von 4,1cm parallel zur 2. Linie einzeichnen&lt;br /&gt;
*** 5. Auf dieser Linie die beiden vorderen Bohrlöcher symmetrisch im Abstand von 4,75cm markieren&lt;br /&gt;
*** 6. Kontrolle: Die 4 markierten Bohrlochpositionen bilden ein Rechteck mit 4,1cm seitlicher und 4,75cm vorderer/hinterer Kantenlänge&lt;br /&gt;
** Bohren der 4 Löcher (D = 3,2mm) in die Servobodenplatte&lt;br /&gt;
* Befestigen des Bodenservos auf der Servobodenplatte (siehe Anleitung zum RA2-MINI, Seite 8!)&lt;br /&gt;
* Anbringen des Roboterarms auf dem Sensor Board mit 4 Abstandbolzen M3 (L = 30..50mm) und passenden Schrauben/Muttern&lt;br /&gt;
&lt;br /&gt;
Die Servo-Steckbuchsen werden dann ''in der selben Reihenfolge (S1..S6) wie vorher auf der Controller-Platine des Roboterarms'' auf die Stiftleisten SERVO_1 bis SERVO_6 des Sensor Boards gesteckt.&lt;br /&gt;
'''Man sollte unbedingt einen separaten Akku für die Servos auf dem Sensor Board benutzen!'''&lt;br /&gt;
&lt;br /&gt;
====Grafik-Display====&lt;br /&gt;
Ob es mal ein Grafik-Display für das RP6 Sensor Board geben wird, ist ''pure Spekulation''. Allerdings gibt es drei Hinweise darauf, dass eine solche Hardware-Ergänzung kommen könnte:&lt;br /&gt;
* 1. Der vorbereitete Anschluss für eine [[RP6_Sensor_Board_und_Xtra_Module#Display-Hintergrundbeleuchtung|Display-Hintergrundbeleuchtung]]&lt;br /&gt;
* 2. Die 4 Befestigungslöcher in der Mitte des Sensor Boards&lt;br /&gt;
* 3. Eine Abbildung '''Grafik-Display 128x64''' bei JM3-Engeneering (siehe [[RP6_Sensor_Board_und_Xtra_Module#Weblinks|Weblinks]]!)&lt;br /&gt;
Wir werden sehen ...&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==RP6 Xtra Module==&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_Xtra_module.JPG|RP6 Xtra module|right|500px]]&lt;br /&gt;
&lt;br /&gt;
Von den '''AREXX RP6 Xtra Modulen''' sind bei [http://www.conrad.de/ce/ CONRAD] für den RP6v2 erhältlich:&lt;br /&gt;
* Arexx [[RP6_Sensor_Board_und_Xtra_Module#I2C_GPS_Empf.C3.A4nger_JM3-GPS|I2C GPS Empfänger JM3-GPS]] ([http://www.conrad.de/ce/de/product/1082385/Arexx-IC-GPS-Empfaenger-JM3-GPS 1082385])&lt;br /&gt;
* Arexx [[RP6_Sensor_Board_und_Xtra_Module#Gyro_Modul_JM3-GYRO|Gyro Modul JM3-GYRO]] ([http://www.conrad.de/ce/de/product/1082386/Arexx-Gyro-Modul-JM3-GYRO 1082386])&lt;br /&gt;
* Arexx [[RP6_Sensor_Board_und_Xtra_Module#3D_Accelerometer_Modul_JM3-3DA|3D Accelerometer Modul JM3-3DA]] ([http://www.conrad.de/ce/de/product/1082387/Arexx-3D-Accelerometer-Modul-JM3-3DA 1082387])&lt;br /&gt;
&lt;br /&gt;
===I2C GPS Empfänger JM3-GPS===&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_I2C_GPS_Empfänger.JPG|RP6 I2C GPS Empfänger|right|400px]]&lt;br /&gt;
&lt;br /&gt;
(Laut Online-Katalog der Firma CONRAD!)&lt;br /&gt;
&lt;br /&gt;
''&amp;quot;Universelles GPS-I²C-Bus Modul für RP6 Roboter. Der GPS Empfänger stellt die NMEA-0183 Datensätze GGA, RMC, GSA und VTG in den veschiedenen Registern zur Verfügung. Damit ist eine einfache Weiterverarbeitung möglich.&amp;quot;''&lt;br /&gt;
&lt;br /&gt;
====Beschreibung====&lt;br /&gt;
Der I2C GPS Empfänger ist eine kleine (38 x 23 mm) Zusatzplatine (RP6 Xtra Modul), die direkt auf das [[RP6_Sensor_Board_und_Xtra_Module#RP6_Sensor_Board_2|RP6 Sensor Board]] aufgesteckt werden kann. Sie kann aber auch überall eingesetzt werden, wo eine stabilisierte 5V Versorgungsspannung und ein 5V-I2C-Bus bis 400 kHz zur Verfügung steht.&lt;br /&gt;
&lt;br /&gt;
Die Platine ist bestückt mit dem &amp;quot;Fastrax GPS antenna module&amp;quot; [https://www.u-blox.com/de/positioning-antennas/gnss-antenna-modules/uc530.html UC530]. Als Backup-Batterie dient eine wieder aufladbare Lithium-Batterie ([http://www.farnell.com/datasheets/321180.pdf MS621FE]). Zur Kommunikation zwischen dem UC530 und dem I2C-Bus ist ein [http://www.atmel.com/Images/Atmel-8303-8-bit-AVR-Microcontroller-tinyAVR-ATtiny1634_Datasheet.pdf ATtiny1634] an Bord, der auch die Auswertung des [http://de.wikipedia.org/wiki/NMEA_0183 NMEA Protokolls] übernimmt. Die 3,3 V Versorgungsspannung wird auf der Platine durch einen Spannungsregler ([http://www.mouser.com/ds/2/405/lm3480-316799.pdf LM3480IM3-3.3]) erzeugt. Über den I2C-Bus können folgende Daten der NMEA-0183 Datensätze GGA, RMC, GSA und VTG auf einfache Weise gelesen werden:&lt;br /&gt;
&lt;br /&gt;
* Geograf. Breite&lt;br /&gt;
* Geograf. Länge&lt;br /&gt;
* GPS Status&lt;br /&gt;
* HDOP&lt;br /&gt;
* Satellitenzahl&lt;br /&gt;
* Kurs&lt;br /&gt;
* Geschwindigkeit&lt;br /&gt;
* Höhe&lt;br /&gt;
* UTC-Zeit&lt;br /&gt;
* Datum&lt;br /&gt;
* PDOP&lt;br /&gt;
* VDOP&lt;br /&gt;
* Satellit 1..12&lt;br /&gt;
&lt;br /&gt;
Der ATtiny1634 ist natürlich vorprogrammiert, kann aber über eine vorbereitete 6-polige ISP-Schnittstelle auf der Platine auch umprogrammiert werden.&lt;br /&gt;
&lt;br /&gt;
'''Lieferumfang'''&lt;br /&gt;
* I2C GPS Empfänger&lt;br /&gt;
* CD mit Anleitung und Software-Beispielen.&lt;br /&gt;
&lt;br /&gt;
====Technische Daten====&lt;br /&gt;
* Versorgungsspannung: 5,0 V +/- 5%&lt;br /&gt;
* Stromverbrauch: &amp;lt;= 20 mA (typ.)&lt;br /&gt;
* I2C-Bus Geschwindigkeit: &amp;lt;= 400 kHz&lt;br /&gt;
* GPS Antenne: eingebaut&lt;br /&gt;
* Backup Batterie: Lithium, im Betrieb wieder aufladbar&lt;br /&gt;
* Temperatur Bereich: -10 bis 65 °C&lt;br /&gt;
* Form Faktor: 38 x 23 mm&lt;br /&gt;
* Gewicht: ca. 6 g&lt;br /&gt;
* Empfänger Spezifikationen (UC530):&lt;br /&gt;
** Empfänger: GPS L1 C/A-Code, SPS&lt;br /&gt;
** Kanäle: 66/22 (Suche/Track)&lt;br /&gt;
** Tracking Empfindlichkeit: -165 dBm typ.&lt;br /&gt;
** Navigations Empfindlichkeit: -148 dbm typ (Kaltstart)&lt;br /&gt;
** Update Rate: 1 Sek.&lt;br /&gt;
** Positions Genauigkeit:&lt;br /&gt;
*** 3,0m (67%) typ. horizontal&lt;br /&gt;
*** 5,0m (67%) typ. vertikal&lt;br /&gt;
*** 0,02 m/s (50%) typ. Geschwindigkeit&lt;br /&gt;
** Zeit bis zum ersten Fix: typ. 31 Sek.&lt;br /&gt;
** Protokoll: NMEA-0183 Rev. 3.01&lt;br /&gt;
&lt;br /&gt;
====Anschluss-Schema====&lt;br /&gt;
Belegung des 9-poligen Anschluss-Steckers (K1) siehe in [[RP6_Sensor_Board_und_Xtra_Module#I2C-MODULE|dieser]] Tabelle!&lt;br /&gt;
&lt;br /&gt;
====Umbau-Optionen====&lt;br /&gt;
Wenn man den ATtiny1634 selbst programmieren will, muss man Stiftleisten auf die Platine löten.&lt;br /&gt;
&lt;br /&gt;
Man braucht dazu: &lt;br /&gt;
* 2-reihige Stiftleiste RM 2,54mm (z.B. 2x40-polig 741306) &lt;br /&gt;
&lt;br /&gt;
Man trennt von der 2-reihigen Stiftleiste 2x3 Kontakte ab und lötet sie auf die Punkte &amp;quot;ISP6&amp;quot;.&lt;br /&gt;
Mit einem ISP-Programmer kann dann eine neue Firmware geflasht werden. Die aktuelle Firmware des ATtiny1634 (Version 1.2) wird als .HEX mitgeliefert, leider ohne Source-Code.&lt;br /&gt;
&lt;br /&gt;
Vorsicht: Dabei kann der Prozessor im schlimmsten Fall nicht mehr ansprechbar sein oder der GPS Empfänger UC530 beschädigt werden. Man sollte diesen Umbau und die ISP-Programmierung nur machen, wenn man genau weiß, was man macht! &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Gyro Modul JM3-GYRO===&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_Gyro_Modul.JPG|RP6 Gyro Modul|right|200px]]&lt;br /&gt;
&lt;br /&gt;
(Laut Online-Katalog der Firma CONRAD!)&lt;br /&gt;
&lt;br /&gt;
''&amp;quot;Das universelle Gyro-Sensor Modul für RP6, RP6 V2, RP6 ATMEGA32 und das RP6 V2 Control M256 Wifi-Kit ist ideal zur Erkennung der Blockierung des Roboters in seiner Drehbewegung, sowie der Stabilisierung der Geradeausfahrt.&amp;quot;''&lt;br /&gt;
&lt;br /&gt;
====Beschreibung====&lt;br /&gt;
Das Gyro Modul ist eine kleine (19 x 17 mm) Zusatzplatine (RP6 Xtra Modul), die im RP6-System genutzt werden kann. Es gibt zwar keinen direkt passenden &amp;quot;Steckplatz&amp;quot; auf einer der Microcontroller-Plattformen (RP6v2, M32, M128, M256 Wifi), jedoch ist der Anschluß einfach:&lt;br /&gt;
Benötigt werden +5V und GND, sowie ein freier ADC-Kanal, der bis 5V messen kann. Damit kann das Gyro Modul sehr universell eingesetzt werden. Es misst die Drehrate um die Z-Achse (Hochachse oder Yaw).&lt;br /&gt;
&lt;br /&gt;
Die Platine ist bestückt mit dem analogen Gyro-Sensor [http://www.st.com/web/en/resource/technical/document/datasheet/CD00254111.pdf LY330ALH], dessen Ausgangsspannung durch zwei OP-Amps ([http://www.ti.com.cn/cn/lit/ds/symlink/lm321.pdf LM321], [http://www.produktinfo.conrad.com/datenblaetter/00000-24999/001072615-da-01-en-IC_AMP_PREC_LMP7731MF_NOPB_SOT_23_5_TID.pdf LMP7731MF]) in Ruhe bei 2,5 V liegt. Höhere Ausgangsspannungen (bis 5 V) bedeuten eine Drehgeschwindigkeit nach LINKS, niedrigere (bis 0 V) eine Drehgeschwindigkeit nach RECHTS. Die 3,3 V Versorgungsspannung des LY330ALH wird auf der Platine durch einen Spannungsregler ([http://www.mouser.com/ds/2/405/lm3480-316799.pdf LM3480IM3-3.3]) erzeugt.&lt;br /&gt;
&lt;br /&gt;
'''Lieferumfang'''&lt;br /&gt;
* Gyro Modul&lt;br /&gt;
* CD mit Anleitung und Software-Beispielen.&lt;br /&gt;
&lt;br /&gt;
====Technische Daten====&lt;br /&gt;
&lt;br /&gt;
* VDD: 5,0 V +/- 5%&lt;br /&gt;
* Vout(0): 2,5 V +/- 2% (ohne Bewegung)&lt;br /&gt;
* Vout: Vout(0) + 10mV / dps +/- 2%&lt;br /&gt;
* Messbereich: ca. 200 dps max.&lt;br /&gt;
&lt;br /&gt;
====Anschluss-Schema====&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_Gyro_Modul_SP.JPG|RP6 Gyro Modul - Anschluss-Schema]]&lt;br /&gt;
&lt;br /&gt;
====Umbau-Optionen====&lt;br /&gt;
Am Gyro Modul gibt es nichts umzubauen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===3D Accelerometer Modul JM3-3DA===&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_3D_Accelerometer_Modul.JPG|RP6 3D Accelerometer Modul|right|105px]]&lt;br /&gt;
&lt;br /&gt;
(Laut Online-Katalog der Firma CONRAD!)&lt;br /&gt;
&lt;br /&gt;
''&amp;quot;Universeller 3-Achsen Beschleunigungssensor für RP6, RP6 V2, RP6 ATMEGA32 und das RP6 V2 Control M256 WIFI-Kit. Ideal zur Winkelmessung (Neigung-, Kipp-Winkel) und vieles mehr.&amp;quot;''&lt;br /&gt;
&lt;br /&gt;
====Beschreibung====&lt;br /&gt;
&lt;br /&gt;
Das 3D Accelerometer Modul ist eine kleine (15 x 10 mm) Zusatzplatine (RP6 Xtra Modul), die direkt auf den EEPROM-Sockel (IC5) der Zusatzplatine [[RP6#RP6_CONTROL_M32_Platine|RP6 CONTROL M32]] gesteckt und über den SPI-Bus angesteuert werden kann. Das Accelerometer Modul kann aber auch mit allen Microcontroller-Plattformen betrieben werden, die eine stabilisierte 5V-Versorgungsspannung und einen SPI- oder I2C-Bus bieten.&lt;br /&gt;
&lt;br /&gt;
Die Platine ist bestückt mit dem 3D Beschleunigungs-Sensor [http://www.farnell.com/datasheets/1691680.pdf LIS302DLH]. Die 3,3 V Versorgungsspannung des LIS302DLH wird auf der Platine durch einen Spannungsregler ([http://www.mouser.com/ds/2/405/lm3480-316799.pdf LM3480IM3-3.3]) erzeugt.&lt;br /&gt;
&lt;br /&gt;
'''Lieferumfang'''&lt;br /&gt;
* 3D Accelerometer Modul&lt;br /&gt;
* CD mit Anleitung und Software-Beispielen.&lt;br /&gt;
&lt;br /&gt;
====Technische Daten====&lt;br /&gt;
&lt;br /&gt;
* VDD: 5,0 V +/- 5%&lt;br /&gt;
* Messbereiche: +-2 g, +-4 g, +-8 g&lt;br /&gt;
* Datenausgabe: 16 Bit&lt;br /&gt;
* Schnittstellen: I2C, SPI&lt;br /&gt;
&lt;br /&gt;
====Anschluss-Schema====&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_3D_Accelerometer_Modul_SP.JPG|RP6 3D Accelerometer Modul - Anschluss-Schema|350px]]&lt;br /&gt;
&lt;br /&gt;
====Umbau-Optionen====&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_3D_Accelerometer_Modul_M32.JPG|RP6 3D Accelerometer Modul auf der M32|right|500px]]&lt;br /&gt;
&lt;br /&gt;
'''Will man das Modul auf der M32 einsetzen, muss man auf dem 3D Accelerometer Modul die Widerstände R2 und R3 (falls vorhanden!) auslöten (siehe Anleitung zum Modul, Seiten 4/5!)''' und einen IC-Sockel an Position IC5 und einen Kondensator an Position C19 auf der M32 einlöten, siehe [[RP6#Zweites_SPI-EEPROM|hier]]!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die Abbildung rechts zeigt das 3D Accelerometer Modul auf der M32.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Programmierung==&lt;br /&gt;
In diesem Abschnitt geht es um die Programmierung der Sensoren und Aktoren auf dem [[RP6_Sensor_Board_und_Xtra_Module#RP6_Sensor_Board_3|RP6 Sensor Board]] und auf den [[RP6_Sensor_Board_und_Xtra_Module#RP6_Xtra_Module_3|Xtra Modulen]]. Die hier veröffentlichte Software baut NICHT auf die mitgelieferten C++ Software-Beispiele auf der ''&amp;quot;RP6 Robot System Xtra Modules CD-ROM&amp;quot;'' auf, sondern basiert auf Eigenentwicklungen in GCC.&lt;br /&gt;
&lt;br /&gt;
===RP6 Sensor Board===&lt;br /&gt;
Das RP6 Sensor Board RP6-JM03-61 verfügt nicht über einen eigenen Microprozessor. Daher geht es hier eigentlich nicht um die Programmierung des Sensor Boards, sondern um die Programmierung der Microcontroller-Plattform, an die das Sensor Board angeschlossen ist. In der Regel wird das die RP6 M256 WiFi Zusatzplatine sein, aber auch die RP6v2 Base steuert (als I2C-Slave) in der vorgesehenen Konfiguration gewisse Funktionen des Sensor Boards an.&lt;br /&gt;
Prinzipiell kann das Sensor Board aber auch an der RP6 CONTROL M32 (''passende Library auf Anfrage beim Autor!'') oder der RP6 CCPRO M128 Zusatzplatine betrieben werden.&lt;br /&gt;
&lt;br /&gt;
====Dokumentation====&lt;br /&gt;
Die Dokumentation zum RP6 Sensor Board befindet sich auf der mitgelieferten ''&amp;quot;RP6 Robot System Xtra Modules CD-ROM&amp;quot;''.&lt;br /&gt;
&lt;br /&gt;
=====Manuals=====&lt;br /&gt;
Das Handbuch kann auch [http://www.produktinfo.conrad.com/datenblaetter/00000-24999/001082384-an-01-de-RP6_SENSOR_BOARD.pdf hier] eingesehen werden.&lt;br /&gt;
 ACHTUNG: Das Manual enthält aktuell noch teils irreführende Beschreibungen!&lt;br /&gt;
&lt;br /&gt;
=====Schematics=====&lt;br /&gt;
=====Datasheets=====&lt;br /&gt;
&lt;br /&gt;
====Demo-Programmme====&lt;br /&gt;
Demo-Programme zum RP6 Sensor Board befinden sich auf der mitgelieferten ''&amp;quot;RP6 Robot System Xtra Modules CD-ROM&amp;quot;''.&lt;br /&gt;
&lt;br /&gt;
====RP6 M256 WiFi: Sensor Board Library====&lt;br /&gt;
Die nachfolgende RP6M256_Sensor_BoardLib (GCC) dient zur Ansteuerung des Sensor Boards durch die RP6M256 WiFi.&lt;br /&gt;
&lt;br /&gt;
=====Configuration Header=====&lt;br /&gt;
Vor dem Kompilieren der Library muss eine Anpassung des Configuration Headers an die eigenen Hardware-Voraussetzungen erfolgen.&lt;br /&gt;
Dazu gibt es im Configuration Header eine Definition:&lt;br /&gt;
* USE_PD5 -&amp;gt; Die Sensor Board Funktion &amp;quot;PD5&amp;quot; steuert den TCA4311A Enable Pin (EN).&lt;br /&gt;
Im nachfolgenden Listing ist die Definition USE_PD5 NICHT aktiv (d.h. der TCA4311A Enable Pin (EN) wird vom MAX7311 I/O 1.0 Pin angesteuert!). Dies muss an die eigene Hardware angepaßt werden. Wenn &amp;quot;PD5&amp;quot; den TCA4311A Enable Pin (EN) steuern soll, muss die Zeile mit &amp;quot;USE_PD5&amp;quot; &amp;quot;aktiviert&amp;quot; werden. Dazu entfernt man &amp;quot;//&amp;quot; am Zeilenanfang:&lt;br /&gt;
 #define USE_PD5&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Bevor man Beschleunigungs-, Magnetfeldsensor und Gyroskop nutzen kann, muss man sie kalibrieren:&lt;br /&gt;
&lt;br /&gt;
* '''Accelerometer:'''&lt;br /&gt;
** Die X-Achse wird kalibriert, indem man den RP6 mit der rechten Seite nach unten hält und den Maximalwert in MAX_X_A einträgt. Dann neigt man ihn auf seine linke Seite und trägt den negativen Maximalwert in MIN_X_A ein.&lt;br /&gt;
** Die Y-Achse wird kalibriert, indem man den RP6 mit der Vorderseite nach oben hält und den Maximalwert in MAX_Y_A einträgt. Dann kippt man die Vorderseite nach unten und trägt den negativen Maximalwert in MIN_Y_A ein.&lt;br /&gt;
** Die Z-Achse wird kalibriert, indem man den RP6 normal waagerecht hält und den Maximalwert in MAX_Z_A einträgt. Dann dreht man den RP6 &amp;quot;auf den Kopf&amp;quot; und trägt den negativen Maximalwert in MIN_Z_A ein.&lt;br /&gt;
** Sollten die angezeigten Pitch- und Roll-Werte nach der Kalibrierung der Achsen und genau waagerecht stehendem Sensor bzw. RP6 vom Nullwert deutlich abweichen, kann man sie mithilfe der Definitionen OFFSET_PITCH_A und OFFSET_ROLL_A &amp;quot;nullen&amp;quot;. Die Einheit dieser Definitionen ist °.&lt;br /&gt;
 ''HINWEIS: Die internen Berechnungen werden durch diese Offset-Korrektur&lt;br /&gt;
 NICHT beeinflußt. Die Offset-Werte können also nicht dazu benutzt werden,&lt;br /&gt;
 eine Achsenabweichung zwischen Sensor und RP6 zu kompensieren!''&lt;br /&gt;
* '''Magnetometer:'''&lt;br /&gt;
** Zur Kalibrierung des Magnetfeldsensors stellt man den RP6 auf eine waagerechte Fläche. Es dürfen keine Elektrogeräte, Metallteile und stromführende Leitungen in der Nähe sein, die das Magnetfeld verändern können.&lt;br /&gt;
** Zunächst ist es möglich, die sogenannten &amp;quot;hard iron&amp;quot; Effekte auszugleichen. Dies sind feste Magnetfeldabweichungen, die durch das &amp;quot;Gerät&amp;quot; (in unserem Fall also durch den kompletten RP6) verursacht werden, in oder auf dem der Sensor angebracht ist. Mit den Definitionen OFFSET_X_M, OFFSET_Y_M und OFFSET_Z_M können diese Effekte ausgeglichen werden. Diese Kalibrierung wird hier aktuell (noch) nicht beschrieben, so dass man die Werte für diese Definitionen zunächst bei 0 belassen sollte.&lt;br /&gt;
** Die X-Achse und Y-Achse wird kalibriert, indem man den RP6 langsam mehrfach um die eigene (Z-)Achse dreht und die Maximalwerte in MAX_X_M und MAX_Y_M einträgt. Die negativen Maximalwerte trägt man in MIN_X_M und MIN_Y_M ein.&lt;br /&gt;
** Die Z-Achse wird kalibriert, indem man den RP6 auf die rechte oder linke Seite legt, ihn dann langsam mehrfach auf der Stelle (um seine Y-Achse) dreht und den Maximalwert in MAX_Z_M und den negativen Maximalwert in MIN_Z_M einträgt.&lt;br /&gt;
** Mit der Definition DECLINATION_M kann man zur Verbesserung der Genauigkeit der Richtungsangaben den magnetischen Deklinationswert [°] (d.h. die magnetische Missweisung) am aktuellen Standort festlegen. [http://www.ngdc.noaa.gov/geomag-web/#declination Hier] befindet sich ein &amp;quot;Deklinations-Rechner&amp;quot;, mit dem man den Deklinationswert für den eigenen Standort ermitteln kann. &lt;br /&gt;
** Wenn man den Temperaturwert des LSM303DLHC nutzen will, muss man die Definition GET_TEMP_M aktivieren (Standard!). Den Temperaturwert kann man noch eichen, indem man die Definition OFFSET_TEMP_M anpasst. Die Einheit von OFFSET_TEMP_M ist °C.&lt;br /&gt;
* '''Gyroskop:'''&lt;br /&gt;
** In Ruhelage des RP6 wird ein ADC-Wert von ca. 511 angezeigt, wenn die Definition ADCVAL_ZERORATE_LEVEL im Configuration Header (RP6M256_Sensor_Board.h) vor der ersten Kompilierung zunächst auf 0 gesetzt wurde. Die Kalibrierung des Gyroskops ist abgeschlossen, nachdem man den in Ruhelage angezeigten ADC-Wert als ADCVAL_ZERORATE_LEVEL eingetragen hat.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''HINWEISE ZUR KALIBRIERUNG:'''&lt;br /&gt;
* Das Demo-Programm ist nicht sehr gut geeignet, um die Kalibrierungen durchzuführen.&lt;br /&gt;
* Man sollte mit einem eigenen kurzen ''Kalibrierungs-Programm'' nur die Rohwerte der jeweiligen X-, Y- und Z-Achse z.B. zweimal pro Sekunde ausgeben.&lt;br /&gt;
* Die Rohwerte sind in Variablen x_axis..., y_axis..., z_axis... enthalten. Da die Rohwerte in den Funktionen normalizeLSM303DLHC_A() bzw. normalizeLSM303DLHC_M() ggf. verändert werden, müssen die Rohwerte VOR Durchlaufen dieser Funktionen ausgegeben werden.&lt;br /&gt;
* '''Ohne eine sorgfältige Kalibrierung wird die Kompass-Funktion (insbesondere die neigungskompensierte Ausgabe der Himmelsrichtung) nicht funktionieren!'''&lt;br /&gt;
* Nach dem Eintragen der Kalibrierungs-Werte in den Configuration Header (RP6M256_Sensor_Board.h) muss die ''Demo'' neu kompiliert werden. Vorher sollten die Compiler-Hilfsdateien der Sensor Board-Library (Dateiendungen .st und .o) im Programmverzeichnis gelöscht werden.&lt;br /&gt;
* Getestet wird das Ergebnis der Kalibrierung, indem die Ausgabewerte (Temperatur, Pitch, Roll, Heading, Neigungs-kompensiertes Heading) der ''Demo'' überprüft werden. Dazu kann man Vergleichswerte (Thermometer, Winkelmesser für Pitch, Roll und externer Kompass für Heading) heranziehen.&lt;br /&gt;
* Wenn die Ausgabewerte nicht den Erwartungen entsprechen, muss die Kalibrierung wiederholt werden.&lt;br /&gt;
* Eine Kalibrierung der Sensoren ist nur zuverlässig, solange die Position des jeweiligen Sensors und seine komplette Hardware-Umgebung (also der RP6 mit allen seinen Teilen!) nicht verändert wird. Gibt es trotzdem Veränderungen, z.B. durch weitere Aufbauten auf dem RP6, müssen diese Sensoren neu kalibriert werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Datei: RP6M256_Sensor_Board.h&lt;br /&gt;
&amp;lt;pre&amp;gt;/* ****************************************************************************&lt;br /&gt;
 *                           _______________________&lt;br /&gt;
 *                           \| RP6  ROBOT SYSTEM |/&lt;br /&gt;
 *                            \_-_-_-_-_-_-_-_-_-_/           &amp;gt;&amp;gt;&amp;gt; RP6 M256 WIFI&lt;br /&gt;
 * ----------------------------------------------------------------------------&lt;br /&gt;
 * ----------------------------- [c]2014 - Dirk -------------------------------&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * File: RP6M256_Sensor_Board.h&lt;br /&gt;
 * Version: 1.0&lt;br /&gt;
 * Target: RP6 M256 WIFI - ATMEGA2560 @16.00MHz&lt;br /&gt;
 * Author(s): Dirk&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Description:&lt;br /&gt;
 * Configuration header file for new RP6 Sensor Board library.&lt;br /&gt;
 * The RP6 Sensor Board (CONRAD 1082384) is connected to the RP6M256 with the&lt;br /&gt;
 * two plugs:&lt;br /&gt;
 *   Sensor Board &amp;lt;---&amp;gt; RP6M256&lt;br /&gt;
 *   --------------------------------&lt;br /&gt;
 *   I/O (K17)    &amp;lt;---&amp;gt; IO_PWM/T0/T1&lt;br /&gt;
 *   ADC (K18)    &amp;lt;---&amp;gt; ADC_IO2/CMP&lt;br /&gt;
 * The RP6 Sensor Board function &amp;quot;PD5&amp;quot; (IC6: EN) is now connected to RP6M256&lt;br /&gt;
 * OC1B (PB6) and the RP6 Sensor Board function &amp;quot;ADC4&amp;quot; (SHARP_R) to RP6M256&lt;br /&gt;
 * ADC9 (PK1).&lt;br /&gt;
 * On the RP6 Sensor Board the functions &amp;quot;ADC0&amp;quot;, &amp;quot;ADC1&amp;quot;, &amp;quot;PWR&amp;quot; and &amp;quot;ADC4&amp;quot; are&lt;br /&gt;
 * connected to the USRBUS. The USRBUS may be wired on the RP6 mainboard like&lt;br /&gt;
 * this:&lt;br /&gt;
 *   Function : Sensor Board - USRBUS: * &amp;lt;---&amp;gt; RP6 Mainboard&lt;br /&gt;
 *   --------------------------------------------------------&lt;br /&gt;
 *   SHARP_F  : &amp;quot;ADC0&amp;quot;       - Pin 1     &amp;lt;---&amp;gt; ADC0: Pin 3&lt;br /&gt;
 *   GYRO     : &amp;quot;ADC1&amp;quot;       - Pin 2     &amp;lt;---&amp;gt; ADC1: Pin 3&lt;br /&gt;
 *   PWRON ²  : &amp;quot;PWR&amp;quot;        - Pin 3     &amp;lt;---&amp;gt; PWR&lt;br /&gt;
 *   SHARP_R  : &amp;quot;ADC4&amp;quot;       - Pin 5     &amp;lt;---&amp;gt; Not connected!&lt;br /&gt;
 * At *) It is also possible not to use the USRBUS, but to connect the RP6&lt;br /&gt;
 *       Sensor Board directly to the RP6 mainboard with 3 single cables.&lt;br /&gt;
 * At ²) See RP6 manual &amp;quot;4.6.8. Stromsparfunktionen&amp;quot;! &lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
#ifndef RP6M256_SENSOR_BOARD_H&lt;br /&gt;
#define RP6M256_SENSOR_BOARD_H&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// RP6 Sensor Board hardwired components:&lt;br /&gt;
// - I2C I/O Port Expander (MAX7311)&lt;br /&gt;
// - I2C Real Time Clock (RTC DS1339)&lt;br /&gt;
// - I2C Temperature Sensor (LM75B)&lt;br /&gt;
// - I2C Servo Controller (PCA9685)&lt;br /&gt;
// - I2C LED Driver (TCA6507)&lt;br /&gt;
// - I2C 3D Magnetometer &amp;amp; Accelerometer (LSM303DLHC)&lt;br /&gt;
// - Analog Yaw-Rate Gyroscope (LY330ALH)&lt;br /&gt;
// - Hot Swappable 2-Wire Bus Buffer (TCA4311A)&lt;br /&gt;
// - Button&lt;br /&gt;
// - Status LED&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C I/O Port Expander (MAX7311):&lt;br /&gt;
#define I2C_SENSOR_PORTEXP_ADR			0x40	// Default&lt;br /&gt;
&lt;br /&gt;
// Interrupt I/O portpin definitions (RP6M256):&lt;br /&gt;
#define IO_SENSOR_INT1_IN				INT1_PI12 // PCINT12 PJ3  XBUS Pin 8&lt;br /&gt;
#define IO_SENSOR_INT1_DDR				DDRJ&lt;br /&gt;
#define IO_SENSOR_INT1_PIN				PINJ&lt;br /&gt;
#define IO_SENSOR_INT1_PORT				PORTJ&lt;br /&gt;
#define IO_SENSOR_INT2_IN				INT2_PI15 // PCINT15 PJ6  XBUS Pin 11&lt;br /&gt;
#define IO_SENSOR_INT2_DDR				DDRJ&lt;br /&gt;
#define IO_SENSOR_INT2_PIN				PINJ&lt;br /&gt;
#define IO_SENSOR_INT2_PORT				PORTJ&lt;br /&gt;
#define IO_SENSOR_INT3_IN				INT3_PI14 // PCINT14 PJ5  XBUS Pin 9&lt;br /&gt;
#define IO_SENSOR_INT3_DDR				DDRJ&lt;br /&gt;
#define IO_SENSOR_INT3_PIN				PINJ&lt;br /&gt;
#define IO_SENSOR_INT3_PORT				PORTJ&lt;br /&gt;
#define IO_SENSOR_INTU_IN				INTU_PI13 // PCINT13 PJ4  XBUS Pin 7&lt;br /&gt;
#define IO_SENSOR_INTU_DDR				DDRJ&lt;br /&gt;
#define IO_SENSOR_INTU_PIN				PINJ&lt;br /&gt;
#define IO_SENSOR_INTU_PORT				PORTJ&lt;br /&gt;
&lt;br /&gt;
// I/O PORT pin numbers:&lt;br /&gt;
#define PIN7							7&lt;br /&gt;
#define PIN6							6&lt;br /&gt;
#define PIN5							5&lt;br /&gt;
#define PIN4							4&lt;br /&gt;
#define PIN3							3&lt;br /&gt;
#define PIN2							2&lt;br /&gt;
#define PIN1							1&lt;br /&gt;
#define PIN0							0&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Real Time Clock (RTC DS1339):&lt;br /&gt;
#define I2C_SENSOR_RTC_ADR				0xd0	// Default&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Temperature Sensor (LM75B):&lt;br /&gt;
#define I2C_SENSOR_TEMP_ADR				0x90	// Default&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Servo Controller (PCA9685):&lt;br /&gt;
#define I2C_SENSOR_SERVO_ADR			0x88	// Default&lt;br /&gt;
&lt;br /&gt;
// Servo and PWM channels:&lt;br /&gt;
#define CH_SERVO_1						16		// At K6: 1  &amp;quot;SERVO_1&amp;quot;&lt;br /&gt;
#define CH_SERVO_2						15		// At K11: 1 &amp;quot;SERVO_2&amp;quot;&lt;br /&gt;
#define CH_SERVO_3						13		// At K29: 1 &amp;quot;SERVO_3&amp;quot;&lt;br /&gt;
#define CH_SERVO_4						14		// At K30: 1 &amp;quot;SERVO_4&amp;quot;&lt;br /&gt;
#define CH_SERVO_5						11		// At K31: 1 &amp;quot;SERVO_5&amp;quot;&lt;br /&gt;
#define CH_SERVO_6						12		// At K32: 1 &amp;quot;SERVO_6&amp;quot;&lt;br /&gt;
#define CH_SERVO_7						9		// At K33: 1 &amp;quot;SERVO_7&amp;quot;&lt;br /&gt;
#define CH_SERVO_8						10		// At K34: 1 &amp;quot;SERVO_8&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#define CH_PWM_OUT_1					1		// At K12: 1 &amp;quot;PWM_OUT&amp;quot;&lt;br /&gt;
#define CH_PWM_OUT_2					2		// At K12: 2&lt;br /&gt;
#define CH_PWM_OUT_3					3		// At K12: 3&lt;br /&gt;
#define CH_PWM_OUT_4					4		// At K12: 4&lt;br /&gt;
#define CH_PWM_OUT_5					5		// At K12: 5&lt;br /&gt;
#define CH_PWM_OUT_6					6		// At K12: 6&lt;br /&gt;
#define CH_PWM_OUT_7					7		// At K12: 7&lt;br /&gt;
#define CH_PWM_OUT_8					8		// At K12: 8&lt;br /&gt;
&lt;br /&gt;
// Servo left touch (LT), right touch (RT), middle position (MP) constants:&lt;br /&gt;
// (Hints: - Servo impulse length [ms] = Servo position value / 204.8&lt;br /&gt;
//           (Formula only valid for a PWM of 50 Hz!)&lt;br /&gt;
//         - Min. servo impulse (0,7 ms) = Servo position 143&lt;br /&gt;
//         - Mid. servo impulse (1,5 ms) = Servo position 307&lt;br /&gt;
//         - Max. servo impulse (2,3 ms) = Servo position 471&lt;br /&gt;
//         - !!! You should NOT use servo position values &amp;lt; 143 or &amp;gt; 471 !!!)&lt;br /&gt;
#define SERVO1_LT						205		// Servo impulse ~1ms&lt;br /&gt;
#define SERVO1_RT						410		// Servo impulse ~2ms&lt;br /&gt;
#define SERVO1_MP						((SERVO1_RT - SERVO1_LT) / 2 + SERVO1_LT)&lt;br /&gt;
#define SERVO2_LT						205&lt;br /&gt;
#define SERVO2_RT						410&lt;br /&gt;
#define SERVO2_MP						((SERVO2_RT - SERVO2_LT) / 2 + SERVO2_LT)&lt;br /&gt;
#define SERVO3_LT						205&lt;br /&gt;
#define SERVO3_RT						410&lt;br /&gt;
#define SERVO3_MP						((SERVO3_RT - SERVO3_LT) / 2 + SERVO3_LT)&lt;br /&gt;
#define SERVO4_LT						205&lt;br /&gt;
#define SERVO4_RT						410&lt;br /&gt;
#define SERVO4_MP						((SERVO4_RT - SERVO4_LT) / 2 + SERVO4_LT)&lt;br /&gt;
#define SERVO5_LT						205&lt;br /&gt;
#define SERVO5_RT						410&lt;br /&gt;
#define SERVO5_MP						((SERVO5_RT - SERVO5_LT) / 2 + SERVO5_LT)&lt;br /&gt;
#define SERVO6_LT						205&lt;br /&gt;
#define SERVO6_RT						410&lt;br /&gt;
#define SERVO6_MP						((SERVO6_RT - SERVO6_LT) / 2 + SERVO6_LT)&lt;br /&gt;
#define SERVO7_LT						205&lt;br /&gt;
#define SERVO7_RT						410&lt;br /&gt;
#define SERVO7_MP						((SERVO7_RT - SERVO7_LT) / 2 + SERVO7_LT)&lt;br /&gt;
#define SERVO8_LT						205&lt;br /&gt;
#define SERVO8_RT						410&lt;br /&gt;
#define SERVO8_MP						((SERVO8_RT - SERVO8_LT) / 2 + SERVO8_LT)&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C LED Driver (TCA6507):&lt;br /&gt;
#define I2C_SENSOR_LEDDRIVER_ADR		0x8a	// Default&lt;br /&gt;
&lt;br /&gt;
// LED numbers:&lt;br /&gt;
#define LED0							0		// At K7&lt;br /&gt;
#define DISPLAY_BACKLIGHT				0		// Display background light&lt;br /&gt;
#define LED1							1		// At K4&lt;br /&gt;
#define LED2							2		// At K2&lt;br /&gt;
#define LED3							3		// At K10: 1&lt;br /&gt;
#define BACKLIGHT_R						3		// Right backlight&lt;br /&gt;
#define LED4							4		// At K10: 2&lt;br /&gt;
#define BACKLIGHT_L						4		// Left backlight&lt;br /&gt;
#define LED5							5		// White LED (D3)&lt;br /&gt;
#define HEADLIGHT_R						5		// Right headlight&lt;br /&gt;
#define LED6							6		// White LED (D1)&lt;br /&gt;
#define HEADLIGHT_L						6		// Left headlight&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C 3D Magnetometer &amp;amp; Accelerometer (LSM303DLHC):&lt;br /&gt;
&lt;br /&gt;
// LSM303DLHC accelerometer:&lt;br /&gt;
#define I2C_SENSOR_LSM303DLHC_A_ADR 	0x32	// Default&lt;br /&gt;
&lt;br /&gt;
// LSM303DLHC accelerometer calibration data:&lt;br /&gt;
#define MAX_X_A						1037		// Max. X-axis value&lt;br /&gt;
#define MIN_X_A						-1030		// Min. X-axis value&lt;br /&gt;
#define MAX_Y_A						1030		// Max. Y-axis value&lt;br /&gt;
#define MIN_Y_A						-1019		// Min. Y-axis value&lt;br /&gt;
#define MAX_Z_A						1062		// Max. Z-axis value&lt;br /&gt;
#define MIN_Z_A						-1056		// Min. Z-axis value&lt;br /&gt;
#define OFFSET_PITCH_A				0.0			// Offset Pitch [°]&lt;br /&gt;
#define OFFSET_ROLL_A				0.0			// Offset Roll [°]&lt;br /&gt;
&lt;br /&gt;
// LSM303DLHC magnetometer:&lt;br /&gt;
#define I2C_SENSOR_LSM303DLHC_M_ADR		0x3c	// Default&lt;br /&gt;
&lt;br /&gt;
// LSM303DLHC magnetometer calibration data:&lt;br /&gt;
#define MAX_X_M						-111.0		// Max. X-axis value&lt;br /&gt;
#define MIN_X_M						-634.0		// Min. X-axis value&lt;br /&gt;
#define OFFSET_X_M					0			// Hard iron X-axis offset&lt;br /&gt;
#define MAX_Y_M						297.0		// Max. Y-axis value&lt;br /&gt;
#define MIN_Y_M						-215.0		// Min. Y-axis value&lt;br /&gt;
#define OFFSET_Y_M					0			// Hard iron Y-axis offset&lt;br /&gt;
#define MAX_Z_M						183.0		// Max. Z-axis value&lt;br /&gt;
#define MIN_Z_M						-214.0		// Min. Z-axis value&lt;br /&gt;
#define OFFSET_Z_M					0			// Hard iron Z-axis offset&lt;br /&gt;
#define DECLINATION_M				0.0			// E at local position [°]&lt;br /&gt;
&lt;br /&gt;
// LSM303DLHC temperature sensor definitions:&lt;br /&gt;
#define GET_TEMP_M								// Enable temperature sensor&lt;br /&gt;
#define OFFSET_TEMP_M				0.0			// Temperature offset [°C]&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Analog Yaw-Rate Gyroscope (LY330ALH):&lt;br /&gt;
&lt;br /&gt;
// LY330ALH gyroscope:&lt;br /&gt;
#define ADC_SENSOR_LY330ALH				ADC_1	// At USRBUS: 2 (RP6BASE)&lt;br /&gt;
&lt;br /&gt;
// LY330ALH gyroscope calibration data:&lt;br /&gt;
// (Higher values [505..1023] mean an angular velocity while rotating LEFT&lt;br /&gt;
//  and lower values [503..0] while rotating RIGHT!)&lt;br /&gt;
#define ADCVAL_MINRATE					0		// Min. rate value&lt;br /&gt;
#define ADCVAL_ZERORATE_LEVEL			504		// Zero rate level&lt;br /&gt;
#define ADCVAL_MAXRATE					1023	// Max. rate value&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Hot Swappable 2-Wire Bus Buffer (TCA4311A):&lt;br /&gt;
&lt;br /&gt;
// Define USE_PD5, if you want to control the TCA4311A enable pin (EN) with&lt;br /&gt;
// the RP6 Sensor Board function &amp;quot;PD5&amp;quot;. If USE_PD5 is NOT defined (default),&lt;br /&gt;
// the TCA4311A EN pin is controlled by the MAX7311 I/O 1.0 pin.&lt;br /&gt;
// ---------------&lt;br /&gt;
//#define USE_PD5&lt;br /&gt;
// ---------------&lt;br /&gt;
&lt;br /&gt;
#define IO_SENSOR_TCA4311A_EN_IN		OC1B_PI6 // At I/O: 9 (RP6M256)&lt;br /&gt;
#define IO_SENSOR_TCA4311A_EN_DDR		DDRB&lt;br /&gt;
#define IO_SENSOR_TCA4311A_EN_PIN		PINB&lt;br /&gt;
#define IO_SENSOR_TCA4311A_EN_PORT		PORTB&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Button:&lt;br /&gt;
&lt;br /&gt;
// (Button is connected to I/O 1.7 of the MAX7311!)&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Status LED:&lt;br /&gt;
&lt;br /&gt;
// (Status LED is connected to I/O 1.6 of the MAX7311!)&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Other ADC channel definitions:&lt;br /&gt;
&lt;br /&gt;
// (Depending on connections on the RP6 Sensor Board!)&lt;br /&gt;
#define ADC_SENSOR_SHARP_F				ADC_0	// At USRBUS: 1 (RP6BASE)&lt;br /&gt;
#define ADC_SENSOR_SHARP_R				ADC_9	// At ADC: 3    (RP6M256)&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
/******************************************************************************&lt;br /&gt;
 * Additional info&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Changelog:&lt;br /&gt;
 * &lt;br /&gt;
 *  ---&amp;gt; changes are documented in the file &amp;quot;RP6M256_Sensor_BoardLib.c&amp;quot;&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=====Library Header=====&lt;br /&gt;
Datei: RP6M256_Sensor_BoardLib.h&lt;br /&gt;
&amp;lt;pre&amp;gt;/* ****************************************************************************&lt;br /&gt;
 *                           _______________________&lt;br /&gt;
 *                           \| RP6  ROBOT SYSTEM |/&lt;br /&gt;
 *                            \_-_-_-_-_-_-_-_-_-_/           &amp;gt;&amp;gt;&amp;gt; RP6 M256 WIFI&lt;br /&gt;
 * ----------------------------------------------------------------------------&lt;br /&gt;
 * ----------------------------- [c]2014 - Dirk -------------------------------&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * File: RP6M256_Sensor_BoardLib.h&lt;br /&gt;
 * Version: 1.0&lt;br /&gt;
 * Target: RP6 M256 WIFI - ATMEGA2560 @16.00MHz&lt;br /&gt;
 * Author(s): Dirk&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Description:&lt;br /&gt;
 * Header file for new RP6 Sensor Board library.&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
#ifndef RP6M256_SENSOR_BOARDLIB_H&lt;br /&gt;
#define RP6M256_SENSOR_BOARDLIB_H&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// RP6 Sensor Board hardwired components:&lt;br /&gt;
// - I2C I/O Port Expander (MAX7311)&lt;br /&gt;
// - I2C Real Time Clock (RTC DS1339)&lt;br /&gt;
// - I2C Temperature Sensor (LM75B)&lt;br /&gt;
// - I2C Servo Controller (PCA9685)&lt;br /&gt;
// - I2C LED Driver (TCA6507)&lt;br /&gt;
// - I2C 3D Magnetometer &amp;amp; Accelerometer (LSM303DLHC)&lt;br /&gt;
// - Analog Yaw-Rate Gyroscope (LY330ALH)&lt;br /&gt;
// - Hot Swappable 2-Wire Bus Buffer (TCA4311A)&lt;br /&gt;
// - Button&lt;br /&gt;
// - Status LED&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Includes:&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6M256Lib.h&amp;quot;&lt;br /&gt;
#include &amp;quot;RP6I2CmasterTWI.h&amp;quot;&lt;br /&gt;
#include &amp;quot;RP6M256_Sensor_Board.h&amp;quot;&lt;br /&gt;
#include &amp;lt;math.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// RP6M256_I2CMasterLib definitions:&lt;br /&gt;
&lt;br /&gt;
#ifndef I2C_RP6_BASE_ADR&lt;br /&gt;
	#define I2C_RP6_BASE_ADR			10&lt;br /&gt;
#endif&lt;br /&gt;
#ifndef I2C_REG_ADC_ADC0_L&lt;br /&gt;
	#define I2C_REG_ADC_ADC0_L			23&lt;br /&gt;
#endif&lt;br /&gt;
#ifndef I2C_REG_ADC_ADC1_L&lt;br /&gt;
	#define I2C_REG_ADC_ADC1_L			25&lt;br /&gt;
#endif&lt;br /&gt;
#ifndef CMD_POWER_OFF&lt;br /&gt;
	#define CMD_POWER_OFF				0&lt;br /&gt;
#endif&lt;br /&gt;
#ifndef CMD_POWER_ON&lt;br /&gt;
	#define CMD_POWER_ON				1&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C I/O Port Expander (MAX7311):&lt;br /&gt;
&lt;br /&gt;
// Registers:&lt;br /&gt;
#define MAX7311_INPUT_PORT1				0&lt;br /&gt;
#define MAX7311_INPUT_PORT2				1&lt;br /&gt;
#define MAX7311_OUTPUT_PORT1			2&lt;br /&gt;
#define MAX7311_OUTPUT_PORT2			3&lt;br /&gt;
#define MAX7311_PORT1_POL_INV			4&lt;br /&gt;
#define MAX7311_PORT2_POL_INV			5&lt;br /&gt;
#define MAX7311_PORT1_CONFIG			6&lt;br /&gt;
#define MAX7311_PORT2_CONFIG			7&lt;br /&gt;
#define MAX7311_TIMEOUT					8&lt;br /&gt;
&lt;br /&gt;
// Port 1 configuration register bitmasks:&lt;br /&gt;
#define ST_GYRO							(1 &amp;lt;&amp;lt; PIN7)	// I/O 0.7 (Output)&lt;br /&gt;
#define PD_GYRO							(1 &amp;lt;&amp;lt; PIN6)	// I/O 0.6 (Output)&lt;br /&gt;
#define PWR_CAM_IF						(1 &amp;lt;&amp;lt; PIN5)	// I/O 0.5 (Output)&lt;br /&gt;
#define EN_LEDDRIV						(1 &amp;lt;&amp;lt; PIN4)	// I/O 0.4 (Output)&lt;br /&gt;
#define RDY_BUSBUFF						(1 &amp;lt;&amp;lt; PIN3)	// I/O 0.3 (Input)&lt;br /&gt;
#define PWR_SHARP_R						(1 &amp;lt;&amp;lt; PIN2)	// I/O 0.2 (Output)&lt;br /&gt;
#define PWR_SHARP_F						(1 &amp;lt;&amp;lt; PIN1)	// I/O 0.1 (Output)&lt;br /&gt;
#define PWR_I2C							(1 &amp;lt;&amp;lt; PIN0)	// I/O 0.0 (Output)&lt;br /&gt;
&lt;br /&gt;
// Port 2 configuration register bitmasks:&lt;br /&gt;
#define IO2_I2C							(1 &amp;lt;&amp;lt; PIN7)	// I/O 1.7 (Input)&lt;br /&gt;
#define IO1_I2C							(1 &amp;lt;&amp;lt; PIN6)	// I/O 1.6 (Output)&lt;br /&gt;
#define DRDY_MAGACC						(1 &amp;lt;&amp;lt; PIN5)	// I/O 1.5 (Input)&lt;br /&gt;
#define PWR_SERVO						(1 &amp;lt;&amp;lt; PIN4)	// I/O 1.4 (Output)&lt;br /&gt;
#define OEN_SERVO						(1 &amp;lt;&amp;lt; PIN3)	// I/O 1.3 (Output)&lt;br /&gt;
#define IO_K19_1						(1 &amp;lt;&amp;lt; PIN2)	// I/O 1.2 (Input)&lt;br /&gt;
#define IO_K19_3						(1 &amp;lt;&amp;lt; PIN1)	// I/O 1.1 (Input)&lt;br /&gt;
#define EN_BUSBUFF						(1 &amp;lt;&amp;lt; PIN0)	// I/O 1.0 (Output)&lt;br /&gt;
&lt;br /&gt;
// Port 1 &amp;amp; 2 register 16-bit bitmasks:&lt;br /&gt;
// (CONFIG: 1 = Input, 0 = Output)&lt;br /&gt;
#define MAX7311_CONFIG_DEFAULT			0b1010011000001000&lt;br /&gt;
#define MAX7311_CONFIG_USE_PD5			0b1010011100001000&lt;br /&gt;
// (OUTPUT: 1 = High/True, 0 = Low/False)&lt;br /&gt;
#define MAX7311_OUTPUT_DEFAULT			0b0100000100010000&lt;br /&gt;
#define MAX7311_OUTPUT_FULLPOWER		0b0001000100110111&lt;br /&gt;
#define MAX7311_OUTPUT_SHUTDOWN			0b0100100011000000&lt;br /&gt;
&lt;br /&gt;
// Safe configuration:&lt;br /&gt;
// (Ensures if activated, that I/Os 0.3, 1.5 and 1.7 cannot be configured&lt;br /&gt;
//  as output with the function MAX7311_write_cfg(). This may protect the&lt;br /&gt;
//  RP6 Sensor Board from hardware damage.)&lt;br /&gt;
// -------------------&lt;br /&gt;
#define SAFE_CONFIG&lt;br /&gt;
// -------------------&lt;br /&gt;
&lt;br /&gt;
typedef union {&lt;br /&gt;
 	uint8_t byte;&lt;br /&gt;
	struct {&lt;br /&gt;
		unsigned int1   :1;				// INT1  XBUS Pin 8&lt;br /&gt;
		unsigned int2   :1;				// INT2  XBUS Pin 11&lt;br /&gt;
		unsigned int3   :1;				// INT3  XBUS Pin 9&lt;br /&gt;
		unsigned intu   :1;				// INTU  XBUS Pin 7&lt;br /&gt;
		unsigned unused :4;&lt;br /&gt;
	};&lt;br /&gt;
	struct {&lt;br /&gt;
		unsigned magacc1     :1;		// INT1: LSM303DLHC INT1&lt;br /&gt;
		unsigned portexp     :1;		// INT2: MAX7311 INT_N&lt;br /&gt;
		unsigned magacc2_rtc :1;		// INT3: LSM303DLHC INT2&lt;br /&gt;
		unsigned noname      :5;		//       OR DS1339 SQW/INT_N&lt;br /&gt;
	};&lt;br /&gt;
} interrupt_RP6SBstatus_t;&lt;br /&gt;
extern interrupt_RP6SBstatus_t interrupt_RP6SBstatus;&lt;br /&gt;
&lt;br /&gt;
typedef union {&lt;br /&gt;
	uint16_t word;&lt;br /&gt;
	struct {&lt;br /&gt;
		unsigned pwr_i2c     :1;		// I/O 0.0 (Output)&lt;br /&gt;
		unsigned pwr_sharp_f :1;		// I/O 0.1 (Output)&lt;br /&gt;
		unsigned pwr_sharp_r :1;		// I/O 0.2 (Output)&lt;br /&gt;
		unsigned rdy_busbuff :1;		// I/O 0.3 (Input)&lt;br /&gt;
		unsigned en_leddriv  :1;		// I/O 0.4 (Output)&lt;br /&gt;
		unsigned pwr_cam_if  :1;		// I/O 0.5 (Output)&lt;br /&gt;
		unsigned pd_gyro     :1;		// I/O 0.6 (Output)&lt;br /&gt;
		unsigned st_gyro     :1;		// I/O 0.7 (Output)&lt;br /&gt;
		unsigned en_busbuff  :1;		// I/O 1.0 (Output)&lt;br /&gt;
		unsigned io_k19_3    :1;		// I/O 1.1 (Input)&lt;br /&gt;
		unsigned io_k19_1    :1;		// I/O 1.2 (Input)&lt;br /&gt;
		unsigned oen_servo   :1;		// I/O 1.3 (Output)&lt;br /&gt;
		unsigned pwr_servo   :1;		// I/O 1.4 (Output)&lt;br /&gt;
		unsigned drdy_magacc :1;		// I/O 1.5 (Input)&lt;br /&gt;
		unsigned io1_i2c     :1;		// I/O 1.6 (Output)&lt;br /&gt;
		unsigned io2_i2c     :1;		// I/O 1.7 (Input)&lt;br /&gt;
	};&lt;br /&gt;
} max7311IOs_t;&lt;br /&gt;
extern max7311IOs_t inport;&lt;br /&gt;
extern max7311IOs_t outport;&lt;br /&gt;
extern uint8_t readyBusbuff;&lt;br /&gt;
extern uint8_t pressedButton;&lt;br /&gt;
&lt;br /&gt;
void MAX7311_write_cfg(uint16_t);&lt;br /&gt;
void task_checkINTs(void);&lt;br /&gt;
void task_RP6SensorBoard(void);&lt;br /&gt;
void MAX7311_update(void);&lt;br /&gt;
void MAX7311_write(uint16_t);&lt;br /&gt;
void MAX7311_init(void);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Real Time Clock (RTC DS1339):&lt;br /&gt;
&lt;br /&gt;
// Registers:&lt;br /&gt;
#define DS1339_SECONDS					0&lt;br /&gt;
#define DS1339_MINUTES					1&lt;br /&gt;
#define DS1339_HOURS					2&lt;br /&gt;
#define DS1339_DAY						3&lt;br /&gt;
#define DS1339_DATE						4&lt;br /&gt;
#define DS1339_MONTH_CENTURY			5&lt;br /&gt;
#define DS1339_YEAR						6&lt;br /&gt;
#define DS1339_ALARM1_SECONDS			7&lt;br /&gt;
#define DS1339_ALARM1_MINUTES			8&lt;br /&gt;
#define DS1339_ALARM1_HOURS				9&lt;br /&gt;
#define DS1339_ALARM1_DAY_DATE			10&lt;br /&gt;
#define DS1339_ALARM2_MINUTES			11&lt;br /&gt;
#define DS1339_ALARM2_HOURS				12&lt;br /&gt;
#define DS1339_ALARM2_DAY_DATE			13&lt;br /&gt;
#define DS1339_CONTROL					14&lt;br /&gt;
#define DS1339_STATUS					15&lt;br /&gt;
#define DS1339_TRICKLE_CHARGER			16&lt;br /&gt;
&lt;br /&gt;
// Control register bitmasks:&lt;br /&gt;
#define DS1339_CONTROL_DEFAULT			0		// Power on default&lt;br /&gt;
#define DS1339_CONTROL_A1IE				1&lt;br /&gt;
#define DS1339_CONTROL_A2IE				2&lt;br /&gt;
#define DS1339_CONTROL_INTCN			4&lt;br /&gt;
#define DS1339_CONTROL_RS1				8&lt;br /&gt;
#define DS1339_CONTROL_RS2				16&lt;br /&gt;
#define DS1339_CONTROL_BBSQI			32&lt;br /&gt;
#define DS1339_CONTROL_EOSC				128&lt;br /&gt;
&lt;br /&gt;
// Trickle Charger register bitmasks:&lt;br /&gt;
#define DS1339_TRICKLE_CHARGER_DEFAULT	0b10101010 // One diode, 2k resistor&lt;br /&gt;
#define DS1339_TRICKLE_CHARGER_ROUT0	1&lt;br /&gt;
#define DS1339_TRICKLE_CHARGER_ROUT1	2&lt;br /&gt;
#define DS1339_TRICKLE_CHARGER_DS0		4&lt;br /&gt;
#define DS1339_TRICKLE_CHARGER_DS1		8&lt;br /&gt;
#define DS1339_TRICKLE_CHARGER_TCS0		16&lt;br /&gt;
#define DS1339_TRICKLE_CHARGER_TCS1		32&lt;br /&gt;
#define DS1339_TRICKLE_CHARGER_TCS2		64&lt;br /&gt;
#define DS1339_TRICKLE_CHARGER_TCS3		128&lt;br /&gt;
&lt;br /&gt;
enum RTCWEEKDAYS {&lt;br /&gt;
	R_MO = 1, R_TU, R_WE, R_TH, R_FR, R_SA, R_SU&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
typedef struct {&lt;br /&gt;
	uint16_t         year;				// Year&lt;br /&gt;
	uint8_t          month;				// Month   [1..12]&lt;br /&gt;
	enum RTCWEEKDAYS weekday;			// Weekday [1..7 = R_MO..R_SU]&lt;br /&gt;
	uint8_t          day;				// Day     [1..31]&lt;br /&gt;
} rtcdate_t;&lt;br /&gt;
rtcdate_t rtc_date;&lt;br /&gt;
&lt;br /&gt;
typedef struct {&lt;br /&gt;
	uint8_t dst;						// Daylight-saving-time (time zone)&lt;br /&gt;
	uint8_t hour;						// Hour    [0..23]&lt;br /&gt;
	uint8_t minute;						// Minute  [0..59]&lt;br /&gt;
	uint8_t second;						// Second  [0..59]&lt;br /&gt;
} rtctime_t;&lt;br /&gt;
rtctime_t rtc_time;&lt;br /&gt;
&lt;br /&gt;
uint8_t BCD2DEC(uint8_t);&lt;br /&gt;
uint8_t DEC2BCD(uint8_t);&lt;br /&gt;
void DS1339_write_cfg(uint8_t);&lt;br /&gt;
void DS1339_init(void);&lt;br /&gt;
#define CALC_DST						// Time zone will be calculated&lt;br /&gt;
void DS1339_read(void);&lt;br /&gt;
void DS1339_write(void);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Temperature Sensor (LM75B):&lt;br /&gt;
&lt;br /&gt;
// Registers:&lt;br /&gt;
#define LM75B_TEMP						0&lt;br /&gt;
#define LM75B_CONF						1&lt;br /&gt;
#define LM75B_THYST						2&lt;br /&gt;
#define LM75B_TOS						3&lt;br /&gt;
&lt;br /&gt;
// Conf register bitmasks:&lt;br /&gt;
#define LM75B_CONF_DEFAULT				0		// Power on default&lt;br /&gt;
#define LM75B_CONF_SHUTDOWN				1&lt;br /&gt;
#define LM75B_CONF_OS_COMP_INT			2&lt;br /&gt;
#define LM75B_CONF_OS_POL				4&lt;br /&gt;
#define LM75B_CONF_OS_F_QUE0			8&lt;br /&gt;
#define LM75B_CONF_OS_F_QUE1			16&lt;br /&gt;
&lt;br /&gt;
extern double temperature;&lt;br /&gt;
&lt;br /&gt;
void LM75B_write_cfg(uint8_t);&lt;br /&gt;
#define LM75B_shutdown() {LM75B_write_cfg(LM75B_CONF_SHUTDOWN);}&lt;br /&gt;
#define LM75B_init() {LM75B_write_cfg(LM75B_CONF_DEFAULT);}&lt;br /&gt;
extern uint8_t temperature_low;&lt;br /&gt;
extern uint8_t temperature_high;&lt;br /&gt;
#define getTemperatureHigh() (temperature_high)&lt;br /&gt;
#define getTemperatureLow() (temperature_low)&lt;br /&gt;
void LM75B_read(void);&lt;br /&gt;
double LM75B_calculate(void);&lt;br /&gt;
double LM75B_measure(void);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Servo Controller (PCA9685):&lt;br /&gt;
&lt;br /&gt;
// Registers:&lt;br /&gt;
#define PCA9685_MODE1					0&lt;br /&gt;
#define PCA9685_MODE2					1&lt;br /&gt;
#define PCA9685_SUBADR1					2&lt;br /&gt;
#define PCA9685_SUBADR2					3&lt;br /&gt;
#define PCA9685_SUBADR3					4&lt;br /&gt;
#define PCA9685_ALLCALLADR				5&lt;br /&gt;
#define PCA9685_LED0_ON_L				6&lt;br /&gt;
#define PCA9685_LED0_ON_H				7&lt;br /&gt;
#define PCA9685_LED0_OFF_L				8&lt;br /&gt;
#define PCA9685_LED0_OFF_H				9&lt;br /&gt;
#define PCA9685_LED1_ON_L				10&lt;br /&gt;
#define PCA9685_LED1_ON_H				11&lt;br /&gt;
#define PCA9685_LED1_OFF_L				12&lt;br /&gt;
#define PCA9685_LED1_OFF_H				13&lt;br /&gt;
#define PCA9685_LED2_ON_L				14&lt;br /&gt;
#define PCA9685_LED2_ON_H				15&lt;br /&gt;
#define PCA9685_LED2_OFF_L				16&lt;br /&gt;
#define PCA9685_LED2_OFF_H				17&lt;br /&gt;
#define PCA9685_LED3_ON_L				18&lt;br /&gt;
#define PCA9685_LED3_ON_H				19&lt;br /&gt;
#define PCA9685_LED3_OFF_L				20&lt;br /&gt;
#define PCA9685_LED3_OFF_H				21&lt;br /&gt;
#define PCA9685_LED4_ON_L				22&lt;br /&gt;
#define PCA9685_LED4_ON_H				23&lt;br /&gt;
#define PCA9685_LED4_OFF_L				24&lt;br /&gt;
#define PCA9685_LED4_OFF_H				25&lt;br /&gt;
#define PCA9685_LED5_ON_L				26&lt;br /&gt;
#define PCA9685_LED5_ON_H				27&lt;br /&gt;
#define PCA9685_LED5_OFF_L				28&lt;br /&gt;
#define PCA9685_LED5_OFF_H				29&lt;br /&gt;
#define PCA9685_LED6_ON_L				30&lt;br /&gt;
#define PCA9685_LED6_ON_H				31&lt;br /&gt;
#define PCA9685_LED6_OFF_L				32&lt;br /&gt;
#define PCA9685_LED6_OFF_H				33&lt;br /&gt;
#define PCA9685_LED7_ON_L				34&lt;br /&gt;
#define PCA9685_LED7_ON_H				35&lt;br /&gt;
#define PCA9685_LED7_OFF_L				36&lt;br /&gt;
#define PCA9685_LED7_OFF_H				37&lt;br /&gt;
#define PCA9685_LED8_ON_L				38&lt;br /&gt;
#define PCA9685_LED8_ON_H				39&lt;br /&gt;
#define PCA9685_LED8_OFF_L				40&lt;br /&gt;
#define PCA9685_LED8_OFF_H				41&lt;br /&gt;
#define PCA9685_LED9_ON_L				42&lt;br /&gt;
#define PCA9685_LED9_ON_H				43&lt;br /&gt;
#define PCA9685_LED9_OFF_L				44&lt;br /&gt;
#define PCA9685_LED9_OFF_H				45&lt;br /&gt;
#define PCA9685_LED10_ON_L				46&lt;br /&gt;
#define PCA9685_LED10_ON_H				47&lt;br /&gt;
#define PCA9685_LED10_OFF_L				48&lt;br /&gt;
#define PCA9685_LED10_OFF_H				49&lt;br /&gt;
#define PCA9685_LED11_ON_L				50&lt;br /&gt;
#define PCA9685_LED11_ON_H				51&lt;br /&gt;
#define PCA9685_LED11_OFF_L				52&lt;br /&gt;
#define PCA9685_LED11_OFF_H				53&lt;br /&gt;
#define PCA9685_LED12_ON_L				54&lt;br /&gt;
#define PCA9685_LED12_ON_H				55&lt;br /&gt;
#define PCA9685_LED12_OFF_L				56&lt;br /&gt;
#define PCA9685_LED12_OFF_H				57&lt;br /&gt;
#define PCA9685_LED13_ON_L				58&lt;br /&gt;
#define PCA9685_LED13_ON_H				59&lt;br /&gt;
#define PCA9685_LED13_OFF_L				60&lt;br /&gt;
#define PCA9685_LED13_OFF_H				61&lt;br /&gt;
#define PCA9685_LED14_ON_L				62&lt;br /&gt;
#define PCA9685_LED14_ON_H				63&lt;br /&gt;
#define PCA9685_LED14_OFF_L				64&lt;br /&gt;
#define PCA9685_LED14_OFF_H				65&lt;br /&gt;
#define PCA9685_LED15_ON_L				66&lt;br /&gt;
#define PCA9685_LED15_ON_H				67&lt;br /&gt;
#define PCA9685_LED15_OFF_L				68&lt;br /&gt;
#define PCA9685_LED15_OFF_H				69&lt;br /&gt;
#define PCA9685_ALL_LED_ON_L			250&lt;br /&gt;
#define PCA9685_ALL_LED_ON_H			251&lt;br /&gt;
#define PCA9685_ALL_LED_OFF_L			252&lt;br /&gt;
#define PCA9685_ALL_LED_OFF_H			253&lt;br /&gt;
#define PCA9685_PRE_SCALE				254&lt;br /&gt;
#define PCA9685_TESTMODE				255&lt;br /&gt;
&lt;br /&gt;
// Mode1 register bitmasks:&lt;br /&gt;
#define PCA9685_MODE1_ALLCALL			1&lt;br /&gt;
#define PCA9685_MODE1_SUB3				2&lt;br /&gt;
#define PCA9685_MODE1_SUB2				4&lt;br /&gt;
#define PCA9685_MODE1_SUB1				8&lt;br /&gt;
#define PCA9685_MODE1_SLEEP				16&lt;br /&gt;
#define PCA9685_MODE1_AI				32&lt;br /&gt;
#define PCA9685_MODE1_EXTCLK			64&lt;br /&gt;
#define PCA9685_MODE1_RESTART			128&lt;br /&gt;
&lt;br /&gt;
// Mode2 register bitmasks:&lt;br /&gt;
#define PCA9685_MODE2_OUTNE01_DEFAULT	0&lt;br /&gt;
#define PCA9685_MODE2_OUTDRV			4&lt;br /&gt;
#define PCA9685_MODE2_OCH				8&lt;br /&gt;
#define PCA9685_MODE2_INVRT				16&lt;br /&gt;
&lt;br /&gt;
#define F_PCA9685						25000000.0	// Int. Clock: 25 MHz&lt;br /&gt;
&lt;br /&gt;
void PCA9685_init(uint16_t);&lt;br /&gt;
#define initServo(__FREQ__) {PCA9685_init(__FREQ__);}&lt;br /&gt;
uint8_t servo(uint8_t);&lt;br /&gt;
void PCA9685_set(uint8_t, uint16_t);&lt;br /&gt;
#define setServo(__SERVO__,__POS__) {PCA9685_set(servo(__SERVO__),__POS__);}&lt;br /&gt;
void PCA9685_shutdown(void);&lt;br /&gt;
void PCA9685_restart(void);&lt;br /&gt;
void setServoPower(uint8_t);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C LED Driver (TCA6507):&lt;br /&gt;
&lt;br /&gt;
// Registers:&lt;br /&gt;
#define TCA6507_SELECT0				0&lt;br /&gt;
#define TCA6507_SELECT1				1&lt;br /&gt;
#define TCA6507_SELECT2				2&lt;br /&gt;
#define TCA6507_FADEON_TIME			3&lt;br /&gt;
#define TCA6507_FULLYON_TIME		4&lt;br /&gt;
#define TCA6507_FADEOFF_TIME		5&lt;br /&gt;
#define TCA6507_1ST_FULLYOFF_TIME	6&lt;br /&gt;
#define TCA6507_2ND_FULLYOFF_TIME	7&lt;br /&gt;
#define TCA6507_MAXIMUM_INTENSITY	8&lt;br /&gt;
#define TCA6507_MASTER_INTENSITY	9&lt;br /&gt;
#define TCA6507_INITIALIZATION		10&lt;br /&gt;
&lt;br /&gt;
// Output states:&lt;br /&gt;
#define STATE_OFF					0&lt;br /&gt;
#define STATE_PWM0					2&lt;br /&gt;
#define STATE_PWM1					3&lt;br /&gt;
#define STATE_ON					4&lt;br /&gt;
#define STATE_MINT					5&lt;br /&gt;
#define STATE_BLINK0				6&lt;br /&gt;
#define STATE_BLINK1				7&lt;br /&gt;
&lt;br /&gt;
extern uint8_t select[3];&lt;br /&gt;
&lt;br /&gt;
void TCA6507_write_cfg(uint8_t, uint8_t);&lt;br /&gt;
void TCA6507_update(void);&lt;br /&gt;
void TCA6507_set(uint8_t, uint8_t);&lt;br /&gt;
#define setLED(__LED__,__STATE__) {TCA6507_set(__LED__,__STATE__);}&lt;br /&gt;
void TCA6507_shutdown(void);&lt;br /&gt;
void TCA6507_restart(void);&lt;br /&gt;
void TCA6507_init(void);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C 3D Magnetometer &amp;amp; Accelerometer (LSM303DLHC):&lt;br /&gt;
&lt;br /&gt;
// LSM303DLHC accelerometer internal registers:&lt;br /&gt;
#define CTRL_REG1_A					0x20&lt;br /&gt;
#define CTRL_REG2_A					0x21&lt;br /&gt;
#define CTRL_REG3_A					0x22&lt;br /&gt;
#define CTRL_REG4_A					0x23&lt;br /&gt;
#define CTRL_REG5_A					0x24&lt;br /&gt;
#define CTRL_REG6_A					0x25&lt;br /&gt;
#define REFERENCE_A					0x26&lt;br /&gt;
#define STATUS_REG_A				0x27&lt;br /&gt;
#define OUT_X_L_A					0x28&lt;br /&gt;
#define OUT_X_H_A					0x29&lt;br /&gt;
#define OUT_Y_L_A					0x2a&lt;br /&gt;
#define OUT_Y_H_A					0x2b&lt;br /&gt;
#define OUT_Z_L_A					0x2c&lt;br /&gt;
#define OUT_Z_H_A					0x2d&lt;br /&gt;
#define FIFO_CTRL_REG_A				0x2e&lt;br /&gt;
#define FIFO_SRC_REG_A				0x2f&lt;br /&gt;
#define INT1_CFG_A					0x30&lt;br /&gt;
#define INT1_SOURCE_A				0x31&lt;br /&gt;
#define INT1_THS_A					0x32&lt;br /&gt;
#define INT1_DURATION_A				0x33&lt;br /&gt;
#define INT2_CFG_A					0x34&lt;br /&gt;
#define INT2_SOURCE_A				0x35&lt;br /&gt;
#define INT2_THS_A					0x36&lt;br /&gt;
#define INT2_DURATION_A				0x37&lt;br /&gt;
#define CLICK_CFG_A					0x38&lt;br /&gt;
#define CLICK_SRC_A					0x39&lt;br /&gt;
#define CLICK_THS_A					0x3a&lt;br /&gt;
#define TIME_LIMIT_A				0x3b&lt;br /&gt;
#define TIME_LATENCY_A				0x3c&lt;br /&gt;
#define TIME_WINDOW_A				0x3d&lt;br /&gt;
&lt;br /&gt;
// LSM303DLHC accelerometer register settings:&lt;br /&gt;
#define CTRL_REG1_A_10HZ			0b00100111	// 10Hz &amp;amp; all axes enable&lt;br /&gt;
#define CTRL_REG1_A_50HZ			0b01000111	// 50Hz &amp;amp; all axes enable&lt;br /&gt;
#define CTRL_REG4_A_DEFAULT			0b00000000	// Default (Normal mode)&lt;br /&gt;
#define CTRL_REG4_A_HR				0b00001000	// HR output mode&lt;br /&gt;
&lt;br /&gt;
// LSM303DLHC magnetometer internal registers:&lt;br /&gt;
#define CRA_REG_M					0x00&lt;br /&gt;
#define CRB_REG_M					0x01&lt;br /&gt;
#define MR_REG_M					0x02&lt;br /&gt;
#define OUT_X_H_M					0x03&lt;br /&gt;
#define OUT_X_L_M					0x04&lt;br /&gt;
#define OUT_Z_H_M					0x05&lt;br /&gt;
#define OUT_Z_L_M					0x06&lt;br /&gt;
#define OUT_Y_H_M					0x07&lt;br /&gt;
#define OUT_Y_L_M					0x08&lt;br /&gt;
#define SR_REG_MG					0x09&lt;br /&gt;
#define IRA_REG_M					0x0a&lt;br /&gt;
#define IRB_REG_M					0x0b&lt;br /&gt;
#define IRC_REG_M					0x0c&lt;br /&gt;
#define TEMP_OUT_H_M				0x31&lt;br /&gt;
#define TEMP_OUT_L_M				0x32&lt;br /&gt;
&lt;br /&gt;
// LSM303DLHC magnetometer register settings:&lt;br /&gt;
#define CRA_REG_M_15HZ				0b00010000	// Default (Data rate 15Hz)&lt;br /&gt;
#define CRA_REG_M_15HZ_T_EN			0b10010000	// 15Hz &amp;amp; temperature enable&lt;br /&gt;
#define CRB_REG_M_13GAUSS			0b00100000	// Gain +-1.3Gauss&lt;br /&gt;
#define MR_REG_M_CCM				0b00000000	// Continuous-conversion mode&lt;br /&gt;
#define MR_REG_M_SCM				0b00000001	// Single-conversion mode&lt;br /&gt;
#define MR_REG_M_SLEEP				0b00000011	// Default (Sleep-mode)&lt;br /&gt;
&lt;br /&gt;
extern int16_t x_axisa, y_axisa, z_axisa;&lt;br /&gt;
extern double pitch, roll;&lt;br /&gt;
extern double xa, ya, za;&lt;br /&gt;
extern double the, phi;&lt;br /&gt;
&lt;br /&gt;
extern int16_t x_axism, y_axism, z_axism;&lt;br /&gt;
extern int16_t headingm;&lt;br /&gt;
extern double xm, ym, zm;&lt;br /&gt;
#ifdef GET_TEMP_M&lt;br /&gt;
extern int16_t temperaturem;&lt;br /&gt;
extern double temperature_mag;&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
extern int16_t headingtc;&lt;br /&gt;
&lt;br /&gt;
void LSM303DLHC_A_init(void);&lt;br /&gt;
void readLSM303DLHC_A(void);&lt;br /&gt;
void normalizeLSM303DLHC_A(void);&lt;br /&gt;
void positionLSM303DLHC_A(void);&lt;br /&gt;
&lt;br /&gt;
void LSM303DLHC_M_init(void);&lt;br /&gt;
void readLSM303DLHC_M(void);&lt;br /&gt;
void normalizeLSM303DLHC_M(void);&lt;br /&gt;
int16_t headingLSM303DLHC_M(void);&lt;br /&gt;
&lt;br /&gt;
int16_t headingLSM303DLHC_TC(void);&lt;br /&gt;
&lt;br /&gt;
void LSM303DLHC_init(void);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Analog Yaw-Rate Gyroscope (LY330ALH):&lt;br /&gt;
&lt;br /&gt;
#define LY330ALH_MODE_NORMAL		0			// Power on default&lt;br /&gt;
#define LY330ALH_MODE_SLEEP			1&lt;br /&gt;
#define LY330ALH_MODE_SELFTEST		2&lt;br /&gt;
#define LY330ALH_MODE_POWERDOWN		3			// Shutdown mode&lt;br /&gt;
&lt;br /&gt;
extern int16_t z_axisg;&lt;br /&gt;
&lt;br /&gt;
void LY330ALH_set_mode(uint8_t);&lt;br /&gt;
uint16_t getRP6Base_ADC1(void);&lt;br /&gt;
int16_t LY330ALH_measure(void);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Hot Swappable 2-Wire Bus Buffer (TCA4311A):&lt;br /&gt;
&lt;br /&gt;
//extern uint8_t readyBusbuff;			// See &amp;quot;I2C I/O Port Expander&amp;quot; section&lt;br /&gt;
extern uint8_t errorBusbuff;&lt;br /&gt;
&lt;br /&gt;
#define getReadyBusbuff() (readyBusbuff)&lt;br /&gt;
uint8_t readReadyBusbuff(void);&lt;br /&gt;
void TCA4311A_shutdown(void);&lt;br /&gt;
void TCA4311A_reconnect(void);&lt;br /&gt;
void setRP6Base_PWR(uint8_t);&lt;br /&gt;
void setI2CModulePower(uint8_t);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Button:&lt;br /&gt;
&lt;br /&gt;
//extern uint8_t pressedButton;			// See &amp;quot;I2C I/O Port Expander&amp;quot; section&lt;br /&gt;
&lt;br /&gt;
#define getPressedButton() (pressedButton)&lt;br /&gt;
uint8_t readButton(void);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Status LED:&lt;br /&gt;
&lt;br /&gt;
void setStatusLED(uint8_t);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// RP6 Sensor Board initialisation and shutdown:&lt;br /&gt;
&lt;br /&gt;
void sensor_board_init(void);&lt;br /&gt;
void sensor_board_shutdown(void);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
/******************************************************************************&lt;br /&gt;
 * Additional info&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Changelog:&lt;br /&gt;
 * &lt;br /&gt;
 *  ---&amp;gt; changes are documented in the file &amp;quot;RP6M256_Sensor_BoardLib.c&amp;quot;&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=====Library Source=====&lt;br /&gt;
Datei: RP6M256_Sensor_BoardLib.c&lt;br /&gt;
&amp;lt;pre&amp;gt;/* ****************************************************************************&lt;br /&gt;
 *                           _______________________&lt;br /&gt;
 *                           \| RP6  ROBOT SYSTEM |/&lt;br /&gt;
 *                            \_-_-_-_-_-_-_-_-_-_/           &amp;gt;&amp;gt;&amp;gt; RP6 M256 WIFI&lt;br /&gt;
 * ----------------------------------------------------------------------------&lt;br /&gt;
 * ----------------------------- [c]2014 - Dirk -------------------------------&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * File: RP6M256_Sensor_BoardLib.c&lt;br /&gt;
 * Version: 1.0&lt;br /&gt;
 * Target: RP6 M256 WIFI - ATMEGA2560 @16.00MHz&lt;br /&gt;
 *         and a RP6 Sensor Board (CONRAD 1082384)&lt;br /&gt;
 * Author(s): Dirk&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Description:&lt;br /&gt;
 * This is our new Library that contains basic routines and functions for&lt;br /&gt;
 * accessing the hardwired components of the RP6 Sensor Board (CONRAD 1082384).&lt;br /&gt;
 * This library assumes the RP6 Sensor Board Revision 2.0 (04.07.13).&lt;br /&gt;
 *&lt;br /&gt;
 * There are more sensors and actors, that may be connected to the RP6 Sensor&lt;br /&gt;
 * Board: Many I2C components including a GPS module (CONRAD 1082385), servo&lt;br /&gt;
 *        motors, SHARP IR distance sensors, LEDs, a camera ...&lt;br /&gt;
 * This library doesn't contain functions for these sensors/actors, because&lt;br /&gt;
 * they are not HARDWIRED to the RP6 Sensor Board and may be connected&lt;br /&gt;
 * OPTIONALLY.&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// RP6 Sensor Board hardwired components:&lt;br /&gt;
// - I2C I/O Port Expander (MAX7311)&lt;br /&gt;
// - I2C Real Time Clock (RTC DS1339)&lt;br /&gt;
// - I2C Temperature Sensor (LM75B)&lt;br /&gt;
// - I2C Servo Controller (PCA9685)&lt;br /&gt;
// - I2C LED Driver (TCA6507)&lt;br /&gt;
// - I2C 3D Magnetometer &amp;amp; Accelerometer (LSM303DLHC)&lt;br /&gt;
// - Analog Yaw-Rate Gyroscope (LY330ALH)&lt;br /&gt;
// - Hot Swappable 2-Wire Bus Buffer (TCA4311A)&lt;br /&gt;
// - Button&lt;br /&gt;
// - Status LED&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Includes:&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6M256_Sensor_BoardLib.h&amp;quot; 		&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Variables:&lt;br /&gt;
&lt;br /&gt;
uint8_t registerBuf[13]; &lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C I/O Port Expander (MAX7311):&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Sends the configuration word to a MAX7311.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: config -&amp;gt; Config word for control&lt;br /&gt;
 *                  registers&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void MAX7311_write_cfg(uint16_t config)&lt;br /&gt;
{&lt;br /&gt;
#ifdef SAFE_CONFIG&lt;br /&gt;
	config |= 0b1010000000001000;&lt;br /&gt;
#endif&lt;br /&gt;
	I2CTWI_transmit3Bytes(I2C_SENSOR_PORTEXP_ADR, MAX7311_PORT1_CONFIG, config, (config&amp;gt;&amp;gt;8));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
interrupt_RP6SBstatus_t interrupt_RP6SBstatus;&lt;br /&gt;
&lt;br /&gt;
/** &lt;br /&gt;
 * This function checks all interrupt pins on&lt;br /&gt;
 * the XBUS (INT1..3, INTU).&lt;br /&gt;
 * This function must be called VERY frequently&lt;br /&gt;
 * out of the main loop.&lt;br /&gt;
 * Bigger delays result in slower reaction to&lt;br /&gt;
 * interrupt requests of the RP6 Sensor Board.&lt;br /&gt;
 * Interrupt function table:&lt;br /&gt;
 *   Int. : Function 1      IRQ  Function 2       IRQ&lt;br /&gt;
 *   -------------------------------------------------&lt;br /&gt;
 *   INT1 : LSM303DLHC INT1  H&lt;br /&gt;
 *   INT2 : MAX7311   INT_N  L&lt;br /&gt;
 *   INT3 : LSM303DLHC INT2  H   DS1339 SQW/INT_N  L&lt;br /&gt;
 *   INTU : not used&lt;br /&gt;
 * You can see in the &amp;quot;IRQ&amp;quot; column, which level&lt;br /&gt;
 * (H/L) means an ACTIVE INTERRUPT signal.&lt;br /&gt;
 * The interrupt pin levels (H=true/L=false) are&lt;br /&gt;
 * read into the global interrupt_RP6SBstatus&lt;br /&gt;
 * variable.&lt;br /&gt;
 *&lt;br /&gt;
 * Hints: - This function checks the interrupt&lt;br /&gt;
 *          signals by polling. This is NOT the&lt;br /&gt;
 *          best way to to this job. You will&lt;br /&gt;
 *          have to write your own task, if you&lt;br /&gt;
 *          want to use the Pin Change Interrupt&lt;br /&gt;
 *          function of the ATmega2560&lt;br /&gt;
 *          microcontroller.&lt;br /&gt;
 *        - You cannot use both interrupt sources&lt;br /&gt;
 *          for INT3! So you should not use INT2&lt;br /&gt;
 *          of the LSM303DLHC together with the&lt;br /&gt;
 *          alarm function of the DS1339 (RTC)!&lt;br /&gt;
 *        - Every interrupt signal of the Sensor&lt;br /&gt;
 *          Board may be cut off from the XBUS&lt;br /&gt;
 *          by opening a jumper (Jx):&lt;br /&gt;
 *          INT1 -&amp;gt; J3 (LSM303DLHC INT1)&lt;br /&gt;
 *          INT2 -&amp;gt; J4 (MAX7311 INT_N)&lt;br /&gt;
 *          INT3 -&amp;gt; J2 (DS1339 SQW/INT_N)&lt;br /&gt;
 *          INT3 -&amp;gt; J5 (LSM303DLHC INT2)&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *&lt;br /&gt;
 *   if (!interrupt_RP6SBstatus.portexp)&lt;br /&gt;
 *        writeString_P(&amp;quot;==&amp;gt; MAX7311 INT_N!!!&amp;quot;);&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void task_checkINTs(void)&lt;br /&gt;
{&lt;br /&gt;
	if(IO_SENSOR_INT1_PIN &amp;amp; IO_SENSOR_INT1_IN)	// XBUS INT1 -&amp;gt; PJ3 (PCINT12)&lt;br /&gt;
		interrupt_RP6SBstatus.int1 = true;&lt;br /&gt;
	else&lt;br /&gt;
		interrupt_RP6SBstatus.int1 = false;&lt;br /&gt;
	if(IO_SENSOR_INT2_PIN &amp;amp; IO_SENSOR_INT2_IN)	// XBUS INT2 -&amp;gt; PJ6 (PCINT15)&lt;br /&gt;
		interrupt_RP6SBstatus.int2 = true;&lt;br /&gt;
	else&lt;br /&gt;
		interrupt_RP6SBstatus.int2 = false;&lt;br /&gt;
	if(IO_SENSOR_INT3_PIN &amp;amp; IO_SENSOR_INT3_IN)	// XBUS INT3 -&amp;gt; PJ5 (PCINT14)&lt;br /&gt;
		interrupt_RP6SBstatus.int3 = true;&lt;br /&gt;
	else&lt;br /&gt;
		interrupt_RP6SBstatus.int3 = false;&lt;br /&gt;
//	if(IO_SENSOR_INTU_PIN &amp;amp; IO_SENSOR_INTU_IN)	// XBUS INTU -&amp;gt; PJ4 (PCINT13)&lt;br /&gt;
//		interrupt_RP6SBstatus.intu = true;&lt;br /&gt;
//	else&lt;br /&gt;
//		interrupt_RP6SBstatus.intu = false;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
max7311IOs_t inport;&lt;br /&gt;
uint8_t readyBusbuff;&lt;br /&gt;
uint8_t pressedButton;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function checks all I/O ports (I/O 0.0..1.7)&lt;br /&gt;
 * of the MAX7311 sequentially!&lt;br /&gt;
 * You must call this function frequently out of&lt;br /&gt;
 * the main loop.&lt;br /&gt;
 * The I/O port values (true/false) are read into&lt;br /&gt;
 * the global inport variable.&lt;br /&gt;
 * The global variables readyBusbuff (2-Wire Bus&lt;br /&gt;
 * Buffer: Enable) and pressedButton (Button S1:&lt;br /&gt;
 * Pressed) contain actual values (true/false)&lt;br /&gt;
 * after execution of this task.&lt;br /&gt;
 *&lt;br /&gt;
 * Examples:&lt;br /&gt;
 *&lt;br /&gt;
 *   if (inport.rdy_busbuff)&lt;br /&gt;
 *        writeString_P(&amp;quot;I/O 0.3: High&amp;quot;);&lt;br /&gt;
 *   else writeString_P(&amp;quot;I/O 0.3: Low&amp;quot;);&lt;br /&gt;
 *   if (!inport.drdy_magacc)&lt;br /&gt;
 *        writeString_P(&amp;quot;I/O 1.5: Low&amp;quot;);&lt;br /&gt;
 *   if (pressedButton)&lt;br /&gt;
 *        writeString_P(&amp;quot;Button pressed!&amp;quot;);&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void task_RP6SensorBoard(void)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmitByte(I2C_SENSOR_PORTEXP_ADR, MAX7311_INPUT_PORT1);&lt;br /&gt;
	I2CTWI_readBytes(I2C_SENSOR_PORTEXP_ADR, registerBuf, 2);&lt;br /&gt;
	inport.word = (registerBuf[1] &amp;lt;&amp;lt; 8) + registerBuf[0];&lt;br /&gt;
	readyBusbuff = inport.rdy_busbuff;&lt;br /&gt;
	pressedButton = inport.io2_i2c;&lt;br /&gt;
	pressedButton = !pressedButton;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
max7311IOs_t outport;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Updates the I/O ports with current value from&lt;br /&gt;
 * the global outport variable!&lt;br /&gt;
 * If one or more port pins were configured as&lt;br /&gt;
 * output before, they will be set (high) or&lt;br /&gt;
 * cleared (low).&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *&lt;br /&gt;
 *   outport.word = 0b0000000000001001;&lt;br /&gt;
 *   MAX7311_update();&lt;br /&gt;
 *   // This clears all I/O ports and sets&lt;br /&gt;
 *   // the ports I/O 0.0 and I/O 0.3!&lt;br /&gt;
 *&lt;br /&gt;
 *   // Other possibility:&lt;br /&gt;
 *   outport.pwr_sharp_f = true;&lt;br /&gt;
 *   MAX7311_update();&lt;br /&gt;
 *   // This sets I/O 0.1 and does not&lt;br /&gt;
 *   // affect any other I/O port!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void MAX7311_update(void)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmit3Bytes(I2C_SENSOR_PORTEXP_ADR, MAX7311_OUTPUT_PORT1, outport.word, (outport.word&amp;gt;&amp;gt;8));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Writes the 16-bit data to a MAX7311.&lt;br /&gt;
 * The data are output with those I/O ports that&lt;br /&gt;
 * were configured as output before.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: data -&amp;gt; Data word&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void MAX7311_write(uint16_t data)&lt;br /&gt;
{&lt;br /&gt;
	outport.word = data;&lt;br /&gt;
	MAX7311_update();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Initializes the I/O Port Expander after power&lt;br /&gt;
 * on.&lt;br /&gt;
 *&lt;br /&gt;
 * Hint: If USE_PD5 is defined in the&lt;br /&gt;
 *       configuration header file, this&lt;br /&gt;
 *       function uses the RP6M256 portpin,&lt;br /&gt;
 *       that is connected to plug I/O: Pin 9&lt;br /&gt;
 *       instead of MAX7311 I/O 1.0!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void MAX7311_init(void)&lt;br /&gt;
{&lt;br /&gt;
#ifdef USE_PD5&lt;br /&gt;
	MAX7311_write_cfg(MAX7311_CONFIG_USE_PD5);&lt;br /&gt;
	IO_SENSOR_TCA4311A_EN_DDR |= IO_SENSOR_TCA4311A_EN_IN;		// Output&lt;br /&gt;
	IO_SENSOR_TCA4311A_EN_PORT |= IO_SENSOR_TCA4311A_EN_IN;		// High&lt;br /&gt;
#else&lt;br /&gt;
	MAX7311_write_cfg(MAX7311_CONFIG_DEFAULT);&lt;br /&gt;
#endif&lt;br /&gt;
	MAX7311_write(MAX7311_OUTPUT_DEFAULT);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Real Time Clock (RTC DS1339):&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function converts a BCD to a DEC value.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
uint8_t BCD2DEC(uint8_t bcd)&lt;br /&gt;
{&lt;br /&gt;
	return ((bcd &amp;gt;&amp;gt; 4) * 10 + (bcd &amp;amp; 0x0f));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function converts a DEC to a BCD value.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
uint8_t DEC2BCD(uint8_t dec)&lt;br /&gt;
{uint8_t units = dec % 10;&lt;br /&gt;
	if (dec /= 10) {&lt;br /&gt;
		return (units + (DEC2BCD(dec) &amp;lt;&amp;lt; 4));&lt;br /&gt;
	}&lt;br /&gt;
	else {&lt;br /&gt;
		return units;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Sends the configuration byte to a DS1339.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: Config byte for control register&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void DS1339_write_cfg(uint8_t config)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_RTC_ADR, DS1339_CONTROL, config);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Initializes the DS1339 Trickle Charger&lt;br /&gt;
 * function to the default for the RP6 Sensor&lt;br /&gt;
 * Board: One diode and 2kOhm resistor.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void DS1339_init(void)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_RTC_ADR, DS1339_TRICKLE_CHARGER, DS1339_TRICKLE_CHARGER_DEFAULT);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Reads all data registers of the Real Time Clock (RTC).&lt;br /&gt;
 * They are stored in the time &amp;amp; date variables defined in&lt;br /&gt;
 * the library header.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void DS1339_read(void)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmitByte(I2C_SENSOR_RTC_ADR, DS1339_SECONDS);&lt;br /&gt;
	I2CTWI_readBytes(I2C_SENSOR_RTC_ADR, registerBuf, 7);&lt;br /&gt;
	rtc_time.second = BCD2DEC(registerBuf[0]);&lt;br /&gt;
	rtc_time.minute = BCD2DEC(registerBuf[1]);&lt;br /&gt;
	rtc_time.hour = BCD2DEC(registerBuf[2] &amp;amp; 0x3f);&lt;br /&gt;
	rtc_date.weekday = (registerBuf[3] &amp;amp; 0x07);&lt;br /&gt;
	rtc_date.day = BCD2DEC(registerBuf[4]);&lt;br /&gt;
	rtc_date.month = BCD2DEC(registerBuf[5] &amp;amp; 0x7f);&lt;br /&gt;
	if(registerBuf[5] &amp;amp; 0x80) rtc_date.year = 100;&lt;br /&gt;
	else rtc_date.year = 0;&lt;br /&gt;
	rtc_date.year += BCD2DEC(registerBuf[6]);&lt;br /&gt;
	rtc_date.year += 2000;&lt;br /&gt;
	rtc_time.dst = 0;&lt;br /&gt;
#ifdef CALC_DST&lt;br /&gt;
	// Calculate MESZ (DST):&lt;br /&gt;
	uint8_t wday = rtc_date.weekday;			// Weekday [1..7 = R_MO..R_SU]&lt;br /&gt;
	if(wday == 7) wday = 0;&lt;br /&gt;
	if(rtc_date.month &amp;lt; 3 || rtc_date.month &amp;gt; 10) {&lt;br /&gt;
		return;&lt;br /&gt;
	}&lt;br /&gt;
	if((rtc_date.day - wday &amp;gt;= 25)&lt;br /&gt;
	 &amp;amp;&amp;amp; (wday || rtc_time.hour &amp;gt;= 2)) {&lt;br /&gt;
		if(rtc_date.month == 10)&lt;br /&gt;
			return;&lt;br /&gt;
	}&lt;br /&gt;
	else {&lt;br /&gt;
		if(rtc_date.month == 3) {&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	rtc_time.dst = 1;&lt;br /&gt;
#endif&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Writes the time &amp;amp; date infos in the variables defined in&lt;br /&gt;
 * the library header to the Real Time Clock (RTC).&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void DS1339_write(void)&lt;br /&gt;
{&lt;br /&gt;
	registerBuf[0] = DS1339_SECONDS;&lt;br /&gt;
	registerBuf[1] = DEC2BCD(rtc_time.second);&lt;br /&gt;
	registerBuf[2] = DEC2BCD(rtc_time.minute);&lt;br /&gt;
	registerBuf[3] = DEC2BCD(rtc_time.hour);&lt;br /&gt;
	registerBuf[4] = rtc_date.weekday;&lt;br /&gt;
	registerBuf[5] = DEC2BCD(rtc_date.day);&lt;br /&gt;
	registerBuf[6] = DEC2BCD(rtc_date.month);&lt;br /&gt;
	registerBuf[7] = DEC2BCD(rtc_date.year - 2000);&lt;br /&gt;
	I2CTWI_transmitBytes(I2C_SENSOR_RTC_ADR, &amp;amp;registerBuf[0], 8);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Temperature Sensor (LM75B):&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Sends the configuration byte to a LM75B.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: Config byte for Conf register&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void LM75B_write_cfg(uint8_t config)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_TEMP_ADR, LM75B_CONF, config);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
uint8_t temperature_low;&lt;br /&gt;
uint8_t temperature_high;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Reads the two data registers of the temperature&lt;br /&gt;
 * sensor's Temp register.&lt;br /&gt;
 * They are stored in the variables temperature_low&lt;br /&gt;
 * and _high.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void LM75B_read(void)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmitByte(I2C_SENSOR_TEMP_ADR, LM75B_TEMP);&lt;br /&gt;
	I2CTWI_readBytes(I2C_SENSOR_TEMP_ADR, registerBuf, 2);&lt;br /&gt;
	temperature_high = registerBuf[0];&lt;br /&gt;
	temperature_low = registerBuf[1];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
double temperature;						// Temperature [°C]&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Calculates and returns the temperature value&lt;br /&gt;
 * by using the data read from the LM75B with&lt;br /&gt;
 * the function LM75B_read(). The sensor is&lt;br /&gt;
 * designed for 11 bit measurement and 0.125°C&lt;br /&gt;
 * resolution.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
double LM75B_calculate(void)&lt;br /&gt;
{&lt;br /&gt;
	int16_t tempraw = 0;&lt;br /&gt;
	double temp;&lt;br /&gt;
&lt;br /&gt;
	tempraw = (getTemperatureHigh() &amp;lt;&amp;lt; 8) | getTemperatureLow();&lt;br /&gt;
	tempraw &amp;gt;&amp;gt;= 5;&lt;br /&gt;
	if (tempraw &amp;amp; 1024)							// Calculate temperature&lt;br /&gt;
		tempraw = (tempraw &amp;amp; 1023) - 1024;&lt;br /&gt;
	else&lt;br /&gt;
		tempraw = tempraw &amp;amp; 1023;&lt;br /&gt;
	temp = tempraw * 0.125;&lt;br /&gt;
	return temp;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Performs a 11 bit measurement and returns the&lt;br /&gt;
 * temperature [°C]. The sensor has a measuring&lt;br /&gt;
 * cycle of 100ms. So it makes no sense calling&lt;br /&gt;
 * this function at a frequency above 10Hz.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
double LM75B_measure(void)&lt;br /&gt;
{&lt;br /&gt;
//	LM75B_init();&lt;br /&gt;
	LM75B_read();								// Read data&lt;br /&gt;
	return (LM75B_calculate());					// Calculate value&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Servo Controller (PCA9685):&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Call this once before using the servo function.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: PWM frequency [40..1000 Hz]&lt;br /&gt;
 *&lt;br /&gt;
 * Hints: - Default servo frequency is 50 Hz!&lt;br /&gt;
 *        - The servo power is NOT switched on by&lt;br /&gt;
 *          this function!&lt;br /&gt;
 *&lt;br /&gt;
 * There is also a macro initServo(freq), which&lt;br /&gt;
 * does exactly the same as this function.&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *   initServo(50);&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void PCA9685_init(uint16_t freq)&lt;br /&gt;
{&lt;br /&gt;
	outport.oen_servo = false;					// I/O 1.3: Low&lt;br /&gt;
	MAX7311_update();&lt;br /&gt;
	if ((freq &amp;lt; 40) || (freq &amp;gt; 1000)) freq = 50;&lt;br /&gt;
	I2CTWI_transmitByte(I2C_SENSOR_SERVO_ADR, PCA9685_MODE2);&lt;br /&gt;
	uint8_t last_mode = I2CTWI_readByte(I2C_SENSOR_SERVO_ADR);&lt;br /&gt;
	last_mode &amp;amp;= ~PCA9685_MODE2_INVRT;			// Clear INVRT bit&lt;br /&gt;
	last_mode |= PCA9685_MODE2_OUTDRV;			// Set OUTDRV bit&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_SERVO_ADR, PCA9685_MODE2, last_mode);&lt;br /&gt;
	I2CTWI_transmitByte(I2C_SENSOR_SERVO_ADR, PCA9685_MODE1);&lt;br /&gt;
	last_mode = I2CTWI_readByte(I2C_SENSOR_SERVO_ADR);&lt;br /&gt;
	last_mode |= PCA9685_MODE1_AI;				// Set AI bit&lt;br /&gt;
	uint8_t mode1 = last_mode;&lt;br /&gt;
	mode1 |= PCA9685_MODE1_SLEEP;				// Set SLEEP bit&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_SERVO_ADR, PCA9685_MODE1, mode1);&lt;br /&gt;
	uint8_t prescale = (uint8_t) (F_PCA9685 / 4096 / freq - 0.5);&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_SERVO_ADR, PCA9685_PRE_SCALE, prescale);&lt;br /&gt;
	last_mode &amp;amp;= ~PCA9685_MODE1_SLEEP;			// Clear SLEEP bit&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_SERVO_ADR, PCA9685_MODE1, last_mode);&lt;br /&gt;
	mSleep(1);&lt;br /&gt;
	last_mode |= PCA9685_MODE1_RESTART;			// Clear RESTART bit&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_SERVO_ADR, PCA9685_MODE1, last_mode);&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_SERVO_ADR, PCA9685_LED8_ON_H, 0x10);&lt;br /&gt;
	return;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/** &lt;br /&gt;
 * Returns the channel belonging to a servo number.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: number -&amp;gt; Servo number [1..8]&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
uint8_t servo(uint8_t number)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t channel;&lt;br /&gt;
&lt;br /&gt;
	switch (number) {&lt;br /&gt;
		case 1 :&lt;br /&gt;
			channel = CH_SERVO_1; break;&lt;br /&gt;
		case 2 :&lt;br /&gt;
			channel = CH_SERVO_2; break;&lt;br /&gt;
		case 3 :&lt;br /&gt;
			channel = CH_SERVO_3; break;&lt;br /&gt;
		case 4 :&lt;br /&gt;
			channel = CH_SERVO_4; break;&lt;br /&gt;
		case 5 :&lt;br /&gt;
			channel = CH_SERVO_5; break;&lt;br /&gt;
		case 6 :&lt;br /&gt;
			channel = CH_SERVO_6; break;&lt;br /&gt;
		case 7 :&lt;br /&gt;
			channel = CH_SERVO_7; break;&lt;br /&gt;
		case 8 :&lt;br /&gt;
			channel = CH_SERVO_8; break;&lt;br /&gt;
		default : channel = CH_SERVO_1;&lt;br /&gt;
	}&lt;br /&gt;
	return channel;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This is the servo position set function.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: channel -&amp;gt; Channel number [1..16]&lt;br /&gt;
 *        pos     -&amp;gt; Servo position [SERVOx_LT..SERVOx_RT]&lt;br /&gt;
 *&lt;br /&gt;
 * Hints: - A servo position of 205 means 1 ms servo impulse,&lt;br /&gt;
 *          a position of 410 means a 2 ms servo impulse!&lt;br /&gt;
 *          You may calculate the servo impulse length by:&lt;br /&gt;
 *          ==&amp;gt; Impulse [ms] = servo position / 204.8 &amp;lt;==&lt;br /&gt;
 *          (Formula only valid for a PWM of 50 Hz!)&lt;br /&gt;
 *&lt;br /&gt;
 * There is also a macro setServo(servo, pos), which&lt;br /&gt;
 * does nearly the same as this function, but the first&lt;br /&gt;
 * parameter is the servo and NOT the channel number.&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *   setServo(2,300);&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void PCA9685_set(uint8_t channel, uint16_t pos)&lt;br /&gt;
{&lt;br /&gt;
	if ((channel == 0) || (channel &amp;gt; 16))&lt;br /&gt;
		return;&lt;br /&gt;
	uint8_t reg = channel * 4 + 4;				// Register LEDx_OFF_L&lt;br /&gt;
	I2CTWI_transmit3Bytes(I2C_SENSOR_SERVO_ADR, reg, (pos &amp;amp; 0x00ff), (pos &amp;gt;&amp;gt; 8));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * If the servos are not moving for a while, the&lt;br /&gt;
 * servo function can be stopped with this&lt;br /&gt;
 * function (PCA9685 set to sleep mode).&lt;br /&gt;
 *&lt;br /&gt;
 * Hint: The servo power is NOT switched off by&lt;br /&gt;
 *       this function!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void PCA9685_shutdown(void)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_SERVO_ADR, PCA9685_ALL_LED_OFF_H, 0x10);&lt;br /&gt;
	I2CTWI_transmitByte(I2C_SENSOR_SERVO_ADR, PCA9685_MODE1);&lt;br /&gt;
	uint8_t mode1 = I2CTWI_readByte(I2C_SENSOR_SERVO_ADR);&lt;br /&gt;
	mode1 |= PCA9685_MODE1_SLEEP;				// Set SLEEP bit&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_SERVO_ADR, PCA9685_MODE1, mode1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * If the servo function was stopped with the&lt;br /&gt;
 * function PCA9685_shutdown() before, it can be&lt;br /&gt;
 * (re)started again with this function.&lt;br /&gt;
 *&lt;br /&gt;
 * Hint: The servo power is NOT switched on by&lt;br /&gt;
 *       this function!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void PCA9685_restart(void)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmitByte(I2C_SENSOR_SERVO_ADR, PCA9685_MODE1);&lt;br /&gt;
	uint8_t mode1 = I2CTWI_readByte(I2C_SENSOR_SERVO_ADR);&lt;br /&gt;
	if (mode1 &amp;amp; PCA9685_MODE1_RESTART) {		// RESTART bit set?&lt;br /&gt;
		mode1 &amp;amp;= ~PCA9685_MODE1_SLEEP;			// Clear SLEEP bit&lt;br /&gt;
		I2CTWI_transmit2Bytes(I2C_SENSOR_SERVO_ADR, PCA9685_MODE1, mode1);&lt;br /&gt;
		mSleep(1);&lt;br /&gt;
		mode1 |= PCA9685_MODE1_RESTART;			// Clear RESTART bit&lt;br /&gt;
		I2CTWI_transmit2Bytes(I2C_SENSOR_SERVO_ADR, PCA9685_MODE1, mode1);&lt;br /&gt;
		I2CTWI_transmit2Bytes(I2C_SENSOR_SERVO_ADR, PCA9685_ALL_LED_OFF_H, 0);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/** &lt;br /&gt;
 * With this function you can switch the servo&lt;br /&gt;
 * power on or off.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: pwr -&amp;gt; 0 (false) = servo power off&lt;br /&gt;
 *               &amp;gt;0 (true) = servo power on&lt;br /&gt;
 *&lt;br /&gt;
 * Hints: - If connected servos are not used, you&lt;br /&gt;
 *          should always switch the servo power off&lt;br /&gt;
 *          (default) to save energy!&lt;br /&gt;
 *        - The PCA9685 is NOT restarted or put into&lt;br /&gt;
 *          shutdown mode by this function!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void setServoPower(uint8_t pwr)&lt;br /&gt;
{&lt;br /&gt;
	if(pwr &amp;gt; 0)&lt;br /&gt;
		outport.pwr_servo = true;				// I/O 1.4: High&lt;br /&gt;
	else&lt;br /&gt;
		outport.pwr_servo = false;				// I/O 1.4: Low&lt;br /&gt;
	MAX7311_update();&lt;br /&gt;
}	&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C LED Driver (TCA6507):&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Sends the configuration byte to TCA6507's&lt;br /&gt;
 * internal registers.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: reg    -&amp;gt; Register address [0..10]&lt;br /&gt;
 *        config -&amp;gt; Config byte for internal&lt;br /&gt;
 *                  registers&lt;br /&gt;
 *&lt;br /&gt;
 * Hints: - With this function you can write to&lt;br /&gt;
 *          all internal registers of the LED&lt;br /&gt;
 *          driver, see &amp;quot;Registers:&amp;quot; in the&lt;br /&gt;
 *          library header file!&lt;br /&gt;
 *        - Mainly you will use this function&lt;br /&gt;
 *          for setting time (regs 3..7) and&lt;br /&gt;
 *          intensity (regs 8, 9) values.&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *   TCA6507_write_cfg(TCA6507_MAXIMUM_INTENSITY,0x77);&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void TCA6507_write_cfg(uint8_t reg, uint8_t config)&lt;br /&gt;
{&lt;br /&gt;
	if(reg &amp;gt; 10) reg = 0;&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_LEDDRIVER_ADR, reg, config);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
uint8_t select[3];&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Updates the LED driver select registers (0..2)&lt;br /&gt;
 * with the global select array!&lt;br /&gt;
 *&lt;br /&gt;
 * Hint: - Also have a look at Table 4 in the&lt;br /&gt;
 *         TCA6507 datasheet!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void TCA6507_update(void)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmit4Bytes(I2C_SENSOR_LEDDRIVER_ADR, (TCA6507_SELECT0 | 0x10), select[0], select[1], select[2]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This is the LED state set function.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: led   -&amp;gt; LED number [0..6]&lt;br /&gt;
 *        state -&amp;gt; LED state  [0..7]&lt;br /&gt;
 *&lt;br /&gt;
 * Hints: - Possible driver states [0..7] see&lt;br /&gt;
 *          &amp;quot;Output states:&amp;quot; in the library&lt;br /&gt;
 *          header file!&lt;br /&gt;
 *        - Also have a look at Table 4 in the&lt;br /&gt;
 *          TCA6507 datasheet!&lt;br /&gt;
 *&lt;br /&gt;
 * There is also a macro setLED(led, state), which&lt;br /&gt;
 * does exactly the same as this function.&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *   setLED(1,4);&lt;br /&gt;
 *   // Switches LED1 ON&lt;br /&gt;
 *   // ... OR ...&lt;br /&gt;
 *   setLED(LED1,STATE_ON);&lt;br /&gt;
 *   // does the same.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void TCA6507_set(uint8_t led, uint8_t state)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t i, mask;&lt;br /&gt;
&lt;br /&gt;
	if(led &amp;gt; 6) led = 0;&lt;br /&gt;
	led = 1 &amp;lt;&amp;lt; led;&lt;br /&gt;
	mask = 1;&lt;br /&gt;
	for(i = 0; i &amp;lt; 3; i++) {&lt;br /&gt;
		select[i] &amp;amp;= ~led;&lt;br /&gt;
		if(state &amp;amp; mask)&lt;br /&gt;
			select[i] |= led;&lt;br /&gt;
		mask &amp;lt;&amp;lt;= 1;&lt;br /&gt;
	}&lt;br /&gt;
	TCA6507_update();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * If the LEDs are not needed for a while, the&lt;br /&gt;
 * LED driver can be stopped with this function&lt;br /&gt;
 * (TCA6507 set to shutdown mode).&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void TCA6507_shutdown(void)&lt;br /&gt;
{&lt;br /&gt;
	outport.en_leddriv = false;					// I/O 0.4: Low&lt;br /&gt;
	MAX7311_update();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * If the LED driver was stopped with the&lt;br /&gt;
 * function TCA6507_shutdown() before, it can be&lt;br /&gt;
 * (re)started again with this function.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void TCA6507_restart(void)&lt;br /&gt;
{&lt;br /&gt;
	outport.en_leddriv = true;					// I/O 0.4: High&lt;br /&gt;
	MAX7311_update();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Initializes the LED driver after power on by&lt;br /&gt;
 * switching all LEDs off.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void TCA6507_init(void)&lt;br /&gt;
{&lt;br /&gt;
	select[0] = 0;&lt;br /&gt;
	select[1] = 0;&lt;br /&gt;
	select[2] = 0;&lt;br /&gt;
	TCA6507_update();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C 3D Magnetometer &amp;amp; Accelerometer (LSM303DLHC):&lt;br /&gt;
&lt;br /&gt;
// --------------------------------------------&lt;br /&gt;
// LSM303DLHC accelerometer functions:&lt;br /&gt;
int16_t x_axisa, y_axisa, z_axisa;&lt;br /&gt;
double pitch, roll;&lt;br /&gt;
double xa, ya, za;&lt;br /&gt;
double the, phi;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Call this once before using the 3D-Accelerometer.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void LSM303DLHC_A_init(void)&lt;br /&gt;
{&lt;br /&gt;
	// Set normal power mode, 10 Hz data rate, all axes enabled:&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_LSM303DLHC_A_ADR, CTRL_REG1_A, CTRL_REG1_A_10HZ);&lt;br /&gt;
	mSleep(10);&lt;br /&gt;
	// Set HD mode:&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_LSM303DLHC_A_ADR, CTRL_REG4_A, CTRL_REG4_A_HR);&lt;br /&gt;
	mSleep(10);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function reads the X-axis, Y-axis and Z-axis values&lt;br /&gt;
 * from the LSM303DLHC accelerometer and stores them in the&lt;br /&gt;
 * global variables x_axisa, y_axisa and z_axisa.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void readLSM303DLHC_A(void)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t readBuf[6];&lt;br /&gt;
&lt;br /&gt;
	I2CTWI_transmitByte(I2C_SENSOR_LSM303DLHC_A_ADR, (OUT_X_L_A | 0x80));&lt;br /&gt;
	I2CTWI_readBytes(I2C_SENSOR_LSM303DLHC_A_ADR, readBuf, 6); // Read  X-/Y-/Z-axis&lt;br /&gt;
	// xb = y:&lt;br /&gt;
	x_axisa = ((readBuf[OUT_Y_H_A - OUT_X_L_A] &amp;lt;&amp;lt; 8) + readBuf[OUT_Y_L_A - OUT_X_L_A]) / 16;&lt;br /&gt;
	// yb = x:&lt;br /&gt;
	y_axisa = ((readBuf[OUT_X_H_A - OUT_X_L_A] &amp;lt;&amp;lt; 8) + readBuf[OUT_X_L_A - OUT_X_L_A]) / 16;&lt;br /&gt;
	// zb = z:&lt;br /&gt;
	z_axisa = ((readBuf[OUT_Z_H_A - OUT_X_L_A] &amp;lt;&amp;lt; 8) + readBuf[OUT_Z_L_A - OUT_X_L_A]) / 16;&lt;br /&gt;
	mSleep(10);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function limits and normalizes the x-axisa,&lt;br /&gt;
 * y-axisa and z-axisa values read from the LSM303DLHC&lt;br /&gt;
 * accelerometer with the function readLSM303DLHC_A() and&lt;br /&gt;
 * stores them in the global double variables xa, ya and&lt;br /&gt;
 * za.&lt;br /&gt;
 * It also calculates the position in space in form of the&lt;br /&gt;
 * tilt angles (the = pitch, phi = roll) and stores them&lt;br /&gt;
 * in the global double variables the and phi.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void normalizeLSM303DLHC_A(void)&lt;br /&gt;
{&lt;br /&gt;
	// Limit raw values:&lt;br /&gt;
	if (x_axisa &amp;lt; MIN_X_A) x_axisa = MIN_X_A;&lt;br /&gt;
	if (x_axisa &amp;gt; MAX_X_A) x_axisa = MAX_X_A;&lt;br /&gt;
	if (y_axisa &amp;lt; MIN_Y_A) y_axisa = MIN_Y_A;&lt;br /&gt;
	if (y_axisa &amp;gt; MAX_Y_A) y_axisa = MAX_Y_A;&lt;br /&gt;
	if (z_axisa &amp;lt; MIN_Z_A) z_axisa = MIN_Z_A;&lt;br /&gt;
	if (z_axisa &amp;gt; MAX_Z_A) z_axisa = MAX_Z_A;&lt;br /&gt;
	xa = (double) x_axisa / 1000.0;&lt;br /&gt;
	ya = (double) y_axisa / 1000.0;&lt;br /&gt;
	za = (double) z_axisa / 1000.0;&lt;br /&gt;
	// Calculate Pitch and Roll:&lt;br /&gt;
	phi = asin(xa);								// Calculate the and phi&lt;br /&gt;
	the = asin(ya / cos(the));					//  from the raw values&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function calculates the position in space by&lt;br /&gt;
 * using the the and phi values (see function&lt;br /&gt;
 * normalizeLSM303DLHC_A()!). It stores the position&lt;br /&gt;
 * in the global double variables pitch and roll. &lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void positionLSM303DLHC_A(void)&lt;br /&gt;
{&lt;br /&gt;
	pitch = the * 180 / M_PI + OFFSET_PITCH_A;&lt;br /&gt;
	roll = phi * 180 / M_PI + OFFSET_ROLL_A;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// LSM303DLHC magnetometer functions:&lt;br /&gt;
int16_t x_axism, y_axism, z_axism;&lt;br /&gt;
int16_t headingm;&lt;br /&gt;
double xm, ym, zm;&lt;br /&gt;
#ifdef GET_TEMP_M&lt;br /&gt;
int16_t temperaturem;&lt;br /&gt;
double temperature_mag;&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
int16_t headingtc;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Call this once before using the 3D-Compass.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void LSM303DLHC_M_init(void)&lt;br /&gt;
{&lt;br /&gt;
#ifdef GET_TEMP_M&lt;br /&gt;
	// Set Data output rate to 15Hz, enable temperature sensor:&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_LSM303DLHC_M_ADR, CRA_REG_M, CRA_REG_M_15HZ_T_EN);&lt;br /&gt;
#else&lt;br /&gt;
	// Set Data output rate to 15Hz:&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_LSM303DLHC_M_ADR, CRA_REG_M, CRA_REG_M_15HZ);&lt;br /&gt;
#endif&lt;br /&gt;
	mSleep(10);&lt;br /&gt;
	// Set Gain to +-1.3Gauss:&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_LSM303DLHC_M_ADR, CRB_REG_M, CRB_REG_M_13GAUSS);&lt;br /&gt;
	mSleep(10);&lt;br /&gt;
	// Set Continuous-conversion mode:&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_LSM303DLHC_M_ADR, MR_REG_M, MR_REG_M_CCM);&lt;br /&gt;
	mSleep(10);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function reads the X-axis, Y-axis, Z-axis and&lt;br /&gt;
 * temperature values from the LSM303DLHC magnetometer&lt;br /&gt;
 * and stores them in the global variables x_axism,&lt;br /&gt;
 * y_axism, z_axism and temperaturem.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void readLSM303DLHC_M(void)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t readBuf[6];&lt;br /&gt;
&lt;br /&gt;
	I2CTWI_transmitByte(I2C_SENSOR_LSM303DLHC_M_ADR, OUT_X_H_M);&lt;br /&gt;
	I2CTWI_readBytes(I2C_SENSOR_LSM303DLHC_M_ADR, readBuf, 6); // Read  X-/Y-/Z-axis&lt;br /&gt;
	// xb = x:&lt;br /&gt;
	x_axism = (readBuf[OUT_X_H_M - OUT_X_H_M] &amp;lt;&amp;lt; 8) + readBuf[OUT_X_L_M - OUT_X_H_M];&lt;br /&gt;
	// yb = y:&lt;br /&gt;
	y_axism = (readBuf[OUT_Y_H_M - OUT_X_H_M] &amp;lt;&amp;lt; 8) + readBuf[OUT_Y_L_M - OUT_X_H_M];&lt;br /&gt;
	// zb = z:&lt;br /&gt;
	z_axism = (readBuf[OUT_Z_H_M - OUT_X_H_M] &amp;lt;&amp;lt; 8) + readBuf[OUT_Z_L_M - OUT_X_H_M];&lt;br /&gt;
	mSleep(10);&lt;br /&gt;
#ifdef GET_TEMP_M&lt;br /&gt;
	// Read temperature raw value:&lt;br /&gt;
	I2CTWI_transmitByte(I2C_SENSOR_LSM303DLHC_M_ADR, TEMP_OUT_H_M);&lt;br /&gt;
	readBuf[0] = I2CTWI_readByte(I2C_SENSOR_LSM303DLHC_M_ADR);&lt;br /&gt;
	I2CTWI_transmitByte(I2C_SENSOR_LSM303DLHC_M_ADR, TEMP_OUT_L_M);&lt;br /&gt;
	readBuf[1] = I2CTWI_readByte(I2C_SENSOR_LSM303DLHC_M_ADR);&lt;br /&gt;
	temperaturem = (readBuf[0] &amp;lt;&amp;lt; 8) | readBuf[1];&lt;br /&gt;
	temperaturem &amp;gt;&amp;gt;= 4;&lt;br /&gt;
	if (temperaturem &amp;amp; 2048)					// Calculate temperature&lt;br /&gt;
		temperaturem = (temperaturem &amp;amp; 2047) - 2048;&lt;br /&gt;
	else&lt;br /&gt;
		temperaturem = temperaturem &amp;amp; 2047;&lt;br /&gt;
	mSleep(10);&lt;br /&gt;
#endif&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function compensates hard iron effects and&lt;br /&gt;
 * scales the x-axism, y-axism and z-axism values read&lt;br /&gt;
 * from the LSM303DLHC magnetometer with the function&lt;br /&gt;
 * readLSM303DLHC_M() and stores them in the global&lt;br /&gt;
 * double variables xm, ym and zm.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void normalizeLSM303DLHC_M(void)&lt;br /&gt;
{&lt;br /&gt;
	// Add hard iron offsets:&lt;br /&gt;
	x_axism += OFFSET_X_M;&lt;br /&gt;
	y_axism += OFFSET_Y_M;&lt;br /&gt;
	z_axism += OFFSET_Z_M;&lt;br /&gt;
	// Scale raw values:&lt;br /&gt;
	xm = (x_axism - MIN_X_M) / (MAX_X_M - MIN_X_M) * 2 - 1;&lt;br /&gt;
	ym = (y_axism - MIN_Y_M) / (MAX_Y_M - MIN_Y_M) * 2 - 1;&lt;br /&gt;
	zm = (z_axism - MIN_Z_M) / (MAX_Z_M - MIN_Z_M) * 2 - 1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function calculates the heading by using the&lt;br /&gt;
 * normalized sensor values xm and ym (see function&lt;br /&gt;
 * normalizeLSM303DLHC_M()!). The heading is a value&lt;br /&gt;
 * from 0° to 359°. If the robot's front (and the&lt;br /&gt;
 * RP6 Sensor Board's front edge with the two&lt;br /&gt;
 * headlights) points to ...&lt;br /&gt;
 *   north -&amp;gt; heading is 0°,&lt;br /&gt;
 *   east  -&amp;gt; heading is 90°,&lt;br /&gt;
 *   south -&amp;gt; heading is 180°,&lt;br /&gt;
 *   west  -&amp;gt; heading is 270°.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
int16_t headingLSM303DLHC_M(void)&lt;br /&gt;
{&lt;br /&gt;
	double hdg = atan2(ym, xm) * 180 / M_PI + DECLINATION_M;&lt;br /&gt;
	if(hdg &amp;lt; 0.0) hdg += 360.0;&lt;br /&gt;
	return ((int16_t) hdg);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// --------------------------------------------&lt;br /&gt;
/**&lt;br /&gt;
 * This function calculates the TILT COMPENSATED&lt;br /&gt;
 * heading by using accelerometer (the, phi) AND&lt;br /&gt;
 * magnetometer (xm, ym, zm) data. The heading is a&lt;br /&gt;
 * value from 0° to 359°. If the robot's front (and&lt;br /&gt;
 * the RP6 Sensor Board's front edge with the two&lt;br /&gt;
 * headlights) points to ...&lt;br /&gt;
 *   north -&amp;gt; heading is 0°,&lt;br /&gt;
 *   east  -&amp;gt; heading is 90°,&lt;br /&gt;
 *   south -&amp;gt; heading is 180°,&lt;br /&gt;
 *   west  -&amp;gt; heading is 270°.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
int16_t headingLSM303DLHC_TC(void)&lt;br /&gt;
{&lt;br /&gt;
	double hdgtc, xh, yh;&lt;br /&gt;
&lt;br /&gt;
	xh = xm * cos(the) + zm * sin(the);&lt;br /&gt;
	yh = xm * sin(phi) * sin(the) + ym * cos(phi) - zm * sin(phi) * cos(the);&lt;br /&gt;
//	zh = -xm * cos(phi) * sin(the) + ym * sin(phi) + zm * cos(phi) * cos(the);&lt;br /&gt;
	hdgtc = atan2(yh, xh) * 180 / M_PI + DECLINATION_M;&lt;br /&gt;
	if(hdgtc &amp;lt; 0.0) hdgtc += 360.0;&lt;br /&gt;
	return ((int16_t) hdgtc);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// --------------------------------------------&lt;br /&gt;
/**&lt;br /&gt;
 * Call this once before using the LSM303DLHC.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void LSM303DLHC_init(void)&lt;br /&gt;
{&lt;br /&gt;
	LSM303DLHC_A_init();						// Accelerometer init&lt;br /&gt;
	LSM303DLHC_M_init();						// Magnetometer init&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Analog Yaw-Rate Gyroscope (LY330ALH):&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Sets the LY330ALH mode of operation.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: mode -&amp;gt; Mode [0..3]&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void LY330ALH_set_mode(uint8_t mode)&lt;br /&gt;
{&lt;br /&gt;
	outport.pd_gyro = false;					// I/O 0.6: Low&lt;br /&gt;
	outport.st_gyro = false;					// I/O 0.7: Low&lt;br /&gt;
	if(mode &amp;amp; 1) outport.pd_gyro = true;&lt;br /&gt;
	if(mode &amp;amp; 2) outport.st_gyro = true;&lt;br /&gt;
	MAX7311_update();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Reads the ADC1 value from the RP6Base.&lt;br /&gt;
 *&lt;br /&gt;
 * Hints: - The RP6Base input ADC1 has to be&lt;br /&gt;
 *          connected to the USRBUS: Pin 2 on&lt;br /&gt;
 *          the RP6 mainboard!&lt;br /&gt;
 *        - The RP6Base_I2CSlave program has to&lt;br /&gt;
 *          be loaded into the RP6Base&lt;br /&gt;
 *          microcontroller!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
uint16_t getRP6Base_ADC1(void)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_readRegisters(I2C_RP6_BASE_ADR, I2C_REG_ADC_ADC1_L, registerBuf, 2);&lt;br /&gt;
	return (registerBuf[0] + (registerBuf[1] &amp;lt;&amp;lt; 8));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int16_t z_axisg;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Performs a LY330ALH gyroscope measurement and&lt;br /&gt;
 * returns the angular rate (velocity).&lt;br /&gt;
 * Positive values mean an angular rate while&lt;br /&gt;
 * rotating LEFT and negative values while&lt;br /&gt;
 * rotating RIGHT!&lt;br /&gt;
 * The global integer variable z_axisg also&lt;br /&gt;
 * contains the measurement result.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
int16_t LY330ALH_measure(void)&lt;br /&gt;
{&lt;br /&gt;
	z_axisg = getRP6Base_ADC1();				// Read raw data&lt;br /&gt;
	z_axisg -= ADCVAL_ZERORATE_LEVEL;			// Calculate value&lt;br /&gt;
	return (z_axisg);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Hot Swappable 2-Wire Bus Buffer (TCA4311A):&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Reads the TCA4311A Ready output. &lt;br /&gt;
 * The function returns the state (true/false).&lt;br /&gt;
 * The global variable readyBusbuff is also&lt;br /&gt;
 * filled with the Ready output state.&lt;br /&gt;
 *&lt;br /&gt;
 * Hint: You don't have to use this function,&lt;br /&gt;
 *       if the task task_RP6SensorBoard() is&lt;br /&gt;
 *       called frequently out of the main&lt;br /&gt;
 *       loop, because readyBusbuff will be&lt;br /&gt;
 *       updated by this task!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
uint8_t readReadyBusbuff(void)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmitByte(I2C_SENSOR_PORTEXP_ADR, MAX7311_INPUT_PORT1);&lt;br /&gt;
	readyBusbuff = I2CTWI_readByte(I2C_SENSOR_PORTEXP_ADR);&lt;br /&gt;
	readyBusbuff &amp;amp;= RDY_BUSBUFF;&lt;br /&gt;
	return readyBusbuff;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
uint8_t errorBusbuff;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * If the I2C bus for the I2C-MODULE (SCLOUT,&lt;br /&gt;
 * SDAOUT) is not used or shall be isolated from&lt;br /&gt;
 * the RP6 I2C bus, this can be done with this&lt;br /&gt;
 * function.&lt;br /&gt;
 *&lt;br /&gt;
 * Hints: - The I2C-MODULE power is NOT switched&lt;br /&gt;
 *          off by this function!&lt;br /&gt;
 *        - If USE_PD5 is defined in the&lt;br /&gt;
 *          configuration header file, this&lt;br /&gt;
 *          function uses the RP6M256 portpin,&lt;br /&gt;
 *          that is connected to plug I/O: Pin 9&lt;br /&gt;
 *          instead of MAX7311 I/O 1.0!&lt;br /&gt;
 *        - If the global variable errorBusbuff&lt;br /&gt;
 *          returns true, the bus buffer could&lt;br /&gt;
 *          not be switched to shutdown mode!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void TCA4311A_shutdown(void)&lt;br /&gt;
{&lt;br /&gt;
	// Wait until the I2C bus is idle:&lt;br /&gt;
	while(I2CTWI_isBusy() || TWI_operation != I2CTWI_NO_OPERATION) task_I2CTWI();&lt;br /&gt;
#ifdef USE_PD5&lt;br /&gt;
	IO_SENSOR_TCA4311A_EN_PORT &amp;amp;= ~IO_SENSOR_TCA4311A_EN_IN; // Low&lt;br /&gt;
#else&lt;br /&gt;
	outport.en_busbuff = false;					// I/O 1.0: Low&lt;br /&gt;
	MAX7311_update();&lt;br /&gt;
#endif&lt;br /&gt;
	errorBusbuff = readReadyBusbuff();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * If the I2C bus for the I2C-MODULE (SCLOUT,&lt;br /&gt;
 * SDAOUT) was isolated from the RP6 I2C bus with&lt;br /&gt;
 * the function TCA4311A_shutdown() before, it&lt;br /&gt;
 * can be connected again with this function.&lt;br /&gt;
 *&lt;br /&gt;
 * Hints: - The I2C-MODULE power is NOT switched&lt;br /&gt;
 *          on by this function!&lt;br /&gt;
 *        - If USE_PD5 is defined in the&lt;br /&gt;
 *          configuration header file, this&lt;br /&gt;
 *          function uses the RP6M256 portpin,&lt;br /&gt;
 *          that is connected to plug I/O: Pin 9&lt;br /&gt;
 *          instead of MAX7311 I/O 1.0!&lt;br /&gt;
 *        - If the global variable errorBusbuff&lt;br /&gt;
 *          returns true, the bus buffer could&lt;br /&gt;
 *          not be switched to normal operation!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void TCA4311A_reconnect(void)&lt;br /&gt;
{&lt;br /&gt;
	// Wait until the I2C bus is idle:&lt;br /&gt;
	while(I2CTWI_isBusy() || TWI_operation != I2CTWI_NO_OPERATION) task_I2CTWI();&lt;br /&gt;
#ifdef USE_PD5&lt;br /&gt;
	IO_SENSOR_TCA4311A_EN_PORT |= IO_SENSOR_TCA4311A_EN_IN; // High&lt;br /&gt;
#else&lt;br /&gt;
	outport.en_busbuff = true;					// I/O 1.0: High&lt;br /&gt;
	MAX7311_update();&lt;br /&gt;
#endif&lt;br /&gt;
	errorBusbuff = !readReadyBusbuff();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Sets/clears the RP6Base signal PWR.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: pwr -&amp;gt; 0 (false) = PWR off&lt;br /&gt;
 *               &amp;gt;0 (true) = PWR on&lt;br /&gt;
 *&lt;br /&gt;
 * Hints: - The RP6Base signal PWR has to be&lt;br /&gt;
 *          connected to the USRBUS: Pin 3 on&lt;br /&gt;
 *          the RP6 mainboard!&lt;br /&gt;
 *        - The RP6Base_I2CSlave program has to&lt;br /&gt;
 *          be loaded into the RP6Base&lt;br /&gt;
 *          microcontroller!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void setRP6Base_PWR(uint8_t pwr)&lt;br /&gt;
{&lt;br /&gt;
	if(pwr &amp;gt; 0)&lt;br /&gt;
		I2CTWI_transmit2Bytes(I2C_RP6_BASE_ADR, 0, CMD_POWER_ON);&lt;br /&gt;
	else&lt;br /&gt;
		I2CTWI_transmit2Bytes(I2C_RP6_BASE_ADR, 0, CMD_POWER_OFF);&lt;br /&gt;
	while(I2CTWI_isBusy() || TWI_operation != I2CTWI_NO_OPERATION) task_I2CTWI();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/** &lt;br /&gt;
 * With this function you can switch the I2C-&lt;br /&gt;
 * MODULE (plug M1) power on or off.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: pwr -&amp;gt; 0 (false) = I2C-MODULE power off&lt;br /&gt;
 *               &amp;gt;0 (true) = I2C-MODULE power on&lt;br /&gt;
 *&lt;br /&gt;
 * Hints: - If the I2C-MODULE plug is not used,&lt;br /&gt;
 *          you should always switch the&lt;br /&gt;
 *          I2C-MODULE power off (default)!&lt;br /&gt;
 *        - The TCA4311A is NOT switched to&lt;br /&gt;
 *          normal operation (default) or&lt;br /&gt;
 *          shutdown mode by this function!&lt;br /&gt;
 *        - The RP6Base signal PWR has to be&lt;br /&gt;
 *          connected to the USRBUS: Pin 3 on&lt;br /&gt;
 *          the RP6 mainboard!&lt;br /&gt;
 *        - The RP6Base_I2CSlave program has to&lt;br /&gt;
 *          be loaded into the RP6Base&lt;br /&gt;
 *          microcontroller!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void setI2CModulePower(uint8_t pwr)&lt;br /&gt;
{&lt;br /&gt;
	if(pwr &amp;gt; 0) {&lt;br /&gt;
		setRP6Base_PWR(1);						// RP6Base PWR on&lt;br /&gt;
		outport.pwr_i2c = true;					// I/O 0.0: High&lt;br /&gt;
	}&lt;br /&gt;
	else&lt;br /&gt;
		outport.pwr_i2c = false;				// I/O 0.0: Low&lt;br /&gt;
	MAX7311_update();&lt;br /&gt;
}	&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Button:&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Reads the MAX7311 I/O port 1.7. &lt;br /&gt;
 * The function returns true, if  button S1 is&lt;br /&gt;
 * pressed (I/O 1.7: Low!) and false, if it is&lt;br /&gt;
 * not pressed (I/O 1.7: High!).&lt;br /&gt;
 * The global variable pressedButton is also&lt;br /&gt;
 * filled with the I/O 1.7 output state.&lt;br /&gt;
 *&lt;br /&gt;
 * Hint: You don't have to use this function,&lt;br /&gt;
 *       if the task task_RP6SensorBoard() is&lt;br /&gt;
 *       called frequently out of the main&lt;br /&gt;
 *       loop, because pressedButton will be&lt;br /&gt;
 *       updated by this task!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
uint8_t readButton(void)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmitByte(I2C_SENSOR_PORTEXP_ADR, MAX7311_INPUT_PORT2);&lt;br /&gt;
	pressedButton = I2CTWI_readByte(I2C_SENSOR_PORTEXP_ADR);&lt;br /&gt;
	pressedButton &amp;amp;= IO2_I2C;&lt;br /&gt;
	pressedButton = !pressedButton;&lt;br /&gt;
	return pressedButton;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Status LED:&lt;br /&gt;
&lt;br /&gt;
/** &lt;br /&gt;
 * Sets the status LED (D2) of the RP6 Sensor&lt;br /&gt;
 * Board.&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *   setStatusLED(1);&lt;br /&gt;
 *   // This switches the status LED on!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void setStatusLED(uint8_t on)&lt;br /&gt;
{&lt;br /&gt;
	if(on &amp;gt; 0)&lt;br /&gt;
		outport.io1_i2c = false;				// I/O 1.6: Low&lt;br /&gt;
	else&lt;br /&gt;
		outport.io1_i2c = true;					// I/O 1.6: High&lt;br /&gt;
	MAX7311_update();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// RP6 Sensor Board initialisation and shutdown:&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * You MUST call this function at the beginning of a&lt;br /&gt;
 * main program, that uses the RP6 Sensor Board. &lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void sensor_board_init(void)&lt;br /&gt;
{&lt;br /&gt;
	// I/O Port Expander:&lt;br /&gt;
	MAX7311_init();&lt;br /&gt;
	// RTC:&lt;br /&gt;
	DS1339_init();&lt;br /&gt;
	// Temperature Sensor:&lt;br /&gt;
	LM75B_init();&lt;br /&gt;
	// Servo Controller:&lt;br /&gt;
	PCA9685_init(50);							// Init PWM 50 Hz&lt;br /&gt;
	// LED Driver:&lt;br /&gt;
	TCA6507_init();&lt;br /&gt;
	// 3D Magnetometer &amp;amp; Accelerometer:&lt;br /&gt;
	LSM303DLHC_init();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * If you don't use any function of the RP6&lt;br /&gt;
 * Sensor Board, you can put the board into&lt;br /&gt;
 * &amp;quot;SHUTDOWN MODE&amp;quot;. In this mode the electric&lt;br /&gt;
 * power consumption is very low to save energy.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void sensor_board_shutdown(void)&lt;br /&gt;
{&lt;br /&gt;
	// Servo Controller:&lt;br /&gt;
	PCA9685_shutdown();							// Shutdown PCA9685&lt;br /&gt;
	// Temperature Sensor:&lt;br /&gt;
	LM75B_shutdown();							// Shutdown LM75B&lt;br /&gt;
	// I/O Port Expander:&lt;br /&gt;
	MAX7311_write(MAX7311_OUTPUT_SHUTDOWN);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&lt;br /&gt;
/******************************************************************************&lt;br /&gt;
 * Additional info&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Changelog:&lt;br /&gt;
 * - v. 1.0 TCA4311A reconnect problem fixed 10.04.2014 by Dirk&lt;br /&gt;
 * - v. 0.9 Interrupt status functions added 09.04.2014 by Dirk&lt;br /&gt;
 * - v. 0.8 (initial release) 17.03.2014 by Dirk&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Erklärung&lt;br /&gt;
&lt;br /&gt;
=====Demo=====&lt;br /&gt;
makefile:&lt;br /&gt;
&amp;lt;pre&amp;gt;...&lt;br /&gt;
TARGET = RP6M256_Sensor_Board_01&lt;br /&gt;
...&lt;br /&gt;
SRC += $(RP6_LIB_PATH)/RP6common/RP6I2CmasterTWI.c&lt;br /&gt;
&lt;br /&gt;
SRC += $(RP6_LIB_PATH)/RP6control_M256_WIFI/RP6M256_Sensor_BoardLib.c&lt;br /&gt;
...&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Datei: RP6M256_Sensor_Board_01.c&lt;br /&gt;
&amp;lt;pre&amp;gt;/* &lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * RP6 ROBOT SYSTEM - RP6 CONTROL M256 Examples&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Example: RP6M256 Sensor Board&lt;br /&gt;
 * Author(s): Dirk&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Description:&lt;br /&gt;
 * In this example we show a first test for the RP6 Sensor Board.&lt;br /&gt;
 * &lt;br /&gt;
 * ############################################################################&lt;br /&gt;
 * The Robot does NOT move in this example! You can simply put it on a table&lt;br /&gt;
 * next to your PC and you should connect it to the PC via the USB Interface!&lt;br /&gt;
 * You should also connect to it via WIFI.&lt;br /&gt;
 * ############################################################################&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Includes:&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6M256Lib.h&amp;quot; 				// The RP6 M256 Library. &lt;br /&gt;
										// Always needs to be included!&lt;br /&gt;
#include &amp;quot;RP6I2CmasterTWI.h&amp;quot;			// Include the I2C-Bus Master Library&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Include our new &amp;quot;RP6M256 Sensor Board library&amp;quot;:&lt;br /&gt;
// (This is the library for accessing the RP6 Sensor Board!)&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6M256_Sensor_BoardLib.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Variables:&lt;br /&gt;
&lt;br /&gt;
char dir[3];&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Returns a 2 character string for the eighth&lt;br /&gt;
 * parts of the direction calculated from the&lt;br /&gt;
 * heading value.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: heading -&amp;gt; Heading value [0..359]&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void calculateDir(char *dir, uint16_t heading)&lt;br /&gt;
{&lt;br /&gt;
	dir[1] = ' ';&lt;br /&gt;
	dir[2] = '\0';&lt;br /&gt;
	if ((heading &amp;lt;= 22) || (heading &amp;gt;=338)) dir[0] = 'N';&lt;br /&gt;
	if ((heading &amp;gt;= 23) &amp;amp;&amp;amp; (heading &amp;lt;= 67)) {dir[0] = 'N'; dir[1] = 'E';} &lt;br /&gt;
	if ((heading &amp;gt;= 68) &amp;amp;&amp;amp; (heading &amp;lt;= 112)) dir[0] = 'E';&lt;br /&gt;
	if ((heading &amp;gt;= 113) &amp;amp;&amp;amp; (heading &amp;lt;= 157)) {dir[0] = 'S'; dir[1] = 'E';}&lt;br /&gt;
	if ((heading &amp;gt;= 158) &amp;amp;&amp;amp; (heading &amp;lt;= 202)) dir[0] = 'S';&lt;br /&gt;
	if ((heading &amp;gt;= 203) &amp;amp;&amp;amp; (heading &amp;lt;= 247)) {dir[0] = 'S'; dir[1] = 'W';}&lt;br /&gt;
	if ((heading &amp;gt;= 248) &amp;amp;&amp;amp; (heading &amp;lt;= 292)) dir[0] = 'W';&lt;br /&gt;
	if ((heading &amp;gt;= 293) &amp;amp;&amp;amp; (heading &amp;lt;= 337)) {dir[0] = 'N'; dir[1] = 'W';}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Write a floating point number to the WIFI.&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *&lt;br /&gt;
 *			// Write a floating point number to the WIFI (no exponent):&lt;br /&gt;
 *			writeDouble_WIFI(1234567.890, 11, 3);&lt;br /&gt;
 *&lt;br /&gt;
 * The value of prec (precision) defines the number of decimal places.&lt;br /&gt;
 * For 32 bit floating point variables (float, double ...) 6 is&lt;br /&gt;
 * the max. value for prec (7 relevant digits).&lt;br /&gt;
 * The value of width defines the overall number of characters in the&lt;br /&gt;
 * floating point number including the decimal point. The number of&lt;br /&gt;
 * pre-decimal positions is: (width - prec - 1).&lt;br /&gt;
 */&lt;br /&gt;
void writeDouble_WIFI(double number, uint8_t width, uint8_t prec)&lt;br /&gt;
{char buffer[width + 1];&lt;br /&gt;
	dtostrf(number, width, prec, &amp;amp;buffer[0]);&lt;br /&gt;
	writeString_WIFI(&amp;amp;buffer[0]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Write a floating point number to the LCD.&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *&lt;br /&gt;
 *			// Write a floating point number to the LCD (no exponent):&lt;br /&gt;
 *			writeDoubleLCD(1234567.890, 11, 3);&lt;br /&gt;
 *&lt;br /&gt;
 * The value of prec (precision) defines the number of decimal places.&lt;br /&gt;
 * For 32 bit floating point variables (float, double ...) 6 is&lt;br /&gt;
 * the max. value for prec (7 relevant digits).&lt;br /&gt;
 * The value of width defines the overall number of characters in the&lt;br /&gt;
 * floating point number including the decimal point. The number of&lt;br /&gt;
 * pre-decimal positions is: (width - prec - 1).&lt;br /&gt;
 */&lt;br /&gt;
void writeDoubleLCD(double number, uint8_t width, uint8_t prec)&lt;br /&gt;
{char buffer[width + 1];&lt;br /&gt;
	dtostrf(number, width, prec, &amp;amp;buffer[0]);&lt;br /&gt;
	writeStringLCD(&amp;amp;buffer[0]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Error handler&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function gets called automatically if there was an I2C Error like&lt;br /&gt;
 * the slave sent a &amp;quot;not acknowledge&amp;quot; (NACK, error codes e.g. 0x20 or 0x30).&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void I2C_transmissionError(uint8_t errorState)&lt;br /&gt;
{&lt;br /&gt;
	writeString_P_WIFI(&amp;quot;\nI2C ERROR - TWI STATE: 0x&amp;quot;);&lt;br /&gt;
	writeInteger_WIFI(errorState, HEX);&lt;br /&gt;
	writeChar_WIFI('\n');&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Main function - The program starts here:&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
	initRP6M256();    // Always call this first! The Processor will not work&lt;br /&gt;
					  // correctly otherwise. &lt;br /&gt;
&lt;br /&gt;
	initLCD(); // Initialize the LC-Display (LCD)&lt;br /&gt;
			   // Always call this before using the LCD!&lt;br /&gt;
&lt;br /&gt;
	setLEDs(0b1111);&lt;br /&gt;
	mSleep(500);&lt;br /&gt;
	setLEDs(0b0000);&lt;br /&gt;
&lt;br /&gt;
	writeString_P_WIFI(&amp;quot;\n\nRP6 Sensor Board Selftest 1!\n&amp;quot;); &lt;br /&gt;
&lt;br /&gt;
	// IMPORTANT:&lt;br /&gt;
	I2CTWI_initMaster(100); // Initialize the TWI Module for Master operation&lt;br /&gt;
							// with 100kHz SCL Frequency&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	// Register the event handler:&lt;br /&gt;
	I2CTWI_setTransmissionErrorHandler(I2C_transmissionError);&lt;br /&gt;
&lt;br /&gt;
	setLEDs(0b1111);&lt;br /&gt;
&lt;br /&gt;
	// Write a text message to the LCD:&lt;br /&gt;
	showScreenLCD(&amp;quot;################&amp;quot;, &amp;quot;################&amp;quot;);&lt;br /&gt;
	mSleep(1500);&lt;br /&gt;
	showScreenLCD(&amp;quot;RP6v2-M256-WIFI &amp;quot;, &amp;quot;Example Program&amp;quot;);&lt;br /&gt;
	mSleep(2500); &lt;br /&gt;
	showScreenLCD(&amp;quot;RP6 Sensor Board&amp;quot;, &amp;quot;   Selftest 1&amp;quot;);&lt;br /&gt;
	mSleep(2500);&lt;br /&gt;
	clearLCD();&lt;br /&gt;
&lt;br /&gt;
	setLEDs(0b0000);&lt;br /&gt;
&lt;br /&gt;
	// ---------------------------------------&lt;br /&gt;
&lt;br /&gt;
	uint8_t onoff = 0;&lt;br /&gt;
	uint16_t servopos = SERVO1_LT;&lt;br /&gt;
	int16_t rate;&lt;br /&gt;
&lt;br /&gt;
	startStopwatch1();&lt;br /&gt;
	startStopwatch2();&lt;br /&gt;
&lt;br /&gt;
	// IMPORTANT:&lt;br /&gt;
	sensor_board_init();						// RP6 Sensor Board init!!!&lt;br /&gt;
	setServoPower(1);							// Servo power ON!&lt;br /&gt;
/*&lt;br /&gt;
	// ----------------------------------------------&lt;br /&gt;
	// Set RTC once (battery empty or not existing:&lt;br /&gt;
	rtc_time.second = 0;&lt;br /&gt;
	rtc_time.minute = 15;&lt;br /&gt;
	rtc_time.hour = 20;				// 20:15&lt;br /&gt;
	rtc_date.weekday = R_SU;&lt;br /&gt;
	rtc_date.day = 20;&lt;br /&gt;
	rtc_date.month = 4;&lt;br /&gt;
	rtc_date.year = 2014;			// Su, 20.4.2014&lt;br /&gt;
	DS1339_write();&lt;br /&gt;
	// Remove this, if RTC is set and running!!!&lt;br /&gt;
	// ----------------------------------------------&lt;br /&gt;
*/&lt;br /&gt;
	while(true) &lt;br /&gt;
	{&lt;br /&gt;
		if(getStopwatch1() &amp;gt; 1000) // 1s&lt;br /&gt;
		{&lt;br /&gt;
			if (onoff) onoff = 0;&lt;br /&gt;
			else onoff = 1;&lt;br /&gt;
&lt;br /&gt;
			// Interrupt status:&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nInterrupt Status:      &amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(interrupt_RP6SBstatus.byte, BIN, 8);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			// Inport status:&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;Inport Status: &amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(inport.word, BIN, 16);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			// Temperature sensor test:&lt;br /&gt;
			temperature = LM75B_measure();		// Measure&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;Temperature: &amp;quot;);&lt;br /&gt;
			writeDouble_WIFI(temperature, 7, 3);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;°\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			// LED driver test:&lt;br /&gt;
			if (onoff) {&lt;br /&gt;
				setLED(HEADLIGHT_R, STATE_ON);&lt;br /&gt;
				setLED(HEADLIGHT_L, STATE_OFF);&lt;br /&gt;
			}&lt;br /&gt;
			else {&lt;br /&gt;
				setLED(HEADLIGHT_L, STATE_ON);&lt;br /&gt;
				setLED(HEADLIGHT_R, STATE_OFF);&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			// Servo controller test (SERVO_1):&lt;br /&gt;
			setServo(1, servopos);&lt;br /&gt;
			servopos += 10;&lt;br /&gt;
			if (servopos &amp;gt; SERVO1_RT) servopos = SERVO1_LT;&lt;br /&gt;
&lt;br /&gt;
			// RTC test:&lt;br /&gt;
			DS1339_read();&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;RTC: &amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(rtc_time.hour, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;:&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(rtc_time.minute, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;:&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(rtc_time.second, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;  &amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(rtc_date.day, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;.&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(rtc_date.month, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;.&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(rtc_date.year, DEC, 4);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			// 3D Magnetometer &amp;amp; Accelerometer test:&lt;br /&gt;
			//  LSM303DLHC accelerometer:&lt;br /&gt;
			task_I2CTWI();&lt;br /&gt;
			readLSM303DLHC_A();					// Get sensor values&lt;br /&gt;
			task_I2CTWI();&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\n3D-Acceleration SENSOR -&amp;gt;\n&amp;quot;);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;X-axis: &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(x_axisa, DEC);&lt;br /&gt;
			writeChar_WIFI('\n');&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;Y-axis: &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(y_axisa, DEC);&lt;br /&gt;
			writeChar_WIFI('\n');&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;Z-axis: &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(z_axisa, DEC);&lt;br /&gt;
			writeChar_WIFI('\n');&lt;br /&gt;
			normalizeLSM303DLHC_A();			// Normalize data&lt;br /&gt;
			positionLSM303DLHC_A();				// Calculate position&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;POSITION: \n&amp;quot;);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;  Pitch [°]: &amp;quot;);&lt;br /&gt;
			writeDouble_WIFI(pitch, 6, 1);&lt;br /&gt;
			writeChar_WIFI('\n');&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;  Roll [°]:  &amp;quot;);&lt;br /&gt;
			writeDouble_WIFI(roll, 6, 1);&lt;br /&gt;
			writeChar_WIFI('\n');&lt;br /&gt;
&lt;br /&gt;
			//  LSM303DLHC magnetometer:&lt;br /&gt;
			task_I2CTWI();&lt;br /&gt;
			readLSM303DLHC_M();					// Get sensor values&lt;br /&gt;
			task_I2CTWI();&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\n3D-Compass SENSOR -&amp;gt;\n&amp;quot;);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;X-axis: &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(x_axism, DEC);&lt;br /&gt;
			writeChar_WIFI('\n');&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;Y-axis: &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(y_axism, DEC);&lt;br /&gt;
			writeChar_WIFI('\n');&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;Z-axis: &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(z_axism, DEC);&lt;br /&gt;
			writeChar_WIFI('\n');&lt;br /&gt;
			normalizeLSM303DLHC_M();			// Normalize data&lt;br /&gt;
			headingm = headingLSM303DLHC_M();	// Calculate heading&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;                 Heading [°]: &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(headingm, DEC);&lt;br /&gt;
			calculateDir(dir, headingm);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;  Direction: &amp;quot;);&lt;br /&gt;
			writeString_WIFI(dir);&lt;br /&gt;
			writeChar_WIFI('\n');&lt;br /&gt;
			headingtc = headingLSM303DLHC_TC();	// Calculate TILT COMPENSATED&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;TILT COMPENSATED heading [°]: &amp;quot;); // heading&lt;br /&gt;
			writeInteger_WIFI(headingtc, DEC);&lt;br /&gt;
			calculateDir(dir, headingtc);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;  Direction: &amp;quot;);&lt;br /&gt;
			writeString_WIFI(dir);&lt;br /&gt;
			writeChar_WIFI('\n');&lt;br /&gt;
#ifdef GET_TEMP_M&lt;br /&gt;
			temperature_mag = (double) temperaturem / 8.0 + OFFSET_TEMP_M;&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;Temperature [°]: &amp;quot;);&lt;br /&gt;
			writeDouble_WIFI(temperature_mag, 7, 2);&lt;br /&gt;
			writeChar_WIFI('\n');&lt;br /&gt;
#endif&lt;br /&gt;
			// Yaw-Rate Gyroscope test:&lt;br /&gt;
			rate = LY330ALH_measure();&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\n1D-Gyro SENSOR -&amp;gt;\n&amp;quot;);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;Z-axis: &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(rate, DEC);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			// RP6 Sensor Board shutdown (button &amp;amp; status LED test):&lt;br /&gt;
			if (pressedButton) {&lt;br /&gt;
				setStatusLED(1);&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;\nPress button again for RP6 Sensor Board SHUTDOWN!\n&amp;quot;);&lt;br /&gt;
				mSleep(2000);&lt;br /&gt;
				do {&lt;br /&gt;
					if(getStopwatch2() &amp;gt; 200) { // 0.2s&lt;br /&gt;
						if (onoff) onoff = 0;&lt;br /&gt;
						else onoff = 1;&lt;br /&gt;
						if (onoff) setStatusLED(1);&lt;br /&gt;
						else setStatusLED(0);&lt;br /&gt;
						setStopwatch2(0);&lt;br /&gt;
					}&lt;br /&gt;
					mSleep(1);&lt;br /&gt;
					task_I2CTWI();&lt;br /&gt;
				} while (!readButton());&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;\n\n\n\n\nPlease wait for RP6 Sensor Board SHUTDOWN...\n&amp;quot;);&lt;br /&gt;
				sensor_board_shutdown();&lt;br /&gt;
				mSleep(3000);&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;\n\n\nThe RP6 Sensor Board now is in SHUTDOWN MODE!!!\n&amp;quot;);&lt;br /&gt;
				mSleep(1000);&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;\nRESET the M256 microcontroller now...\n\n&amp;quot;);&lt;br /&gt;
				while(true) {};&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			setStopwatch1(0);&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		task_checkINTs();						// Read interrupt signals&lt;br /&gt;
		task_RP6SensorBoard();					// RP6 Sensor Board task&lt;br /&gt;
&lt;br /&gt;
		task_I2CTWI();&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Erklärung&lt;br /&gt;
&lt;br /&gt;
====Projekte====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===RP6 Xtra Module===&lt;br /&gt;
Die Dokumentation zu den RP6 Xtra Modulen befindet sich auf der mitgelieferten ''&amp;quot;RP6 Robot System Xtra Modules CD-ROM&amp;quot;''. Auf der CD-ROM sind auch Software-Beispiele zu finden.&lt;br /&gt;
&lt;br /&gt;
Die hier veröffentlichte Software zu den Xtra Modulen ist eine Eigenentwicklung in GCC:&lt;br /&gt;
* Arexx [[RP6_Sensor_Board_und_Xtra_Module#I2C_GPS_Empf.C3.A4nger_JM3-GPS_2|I2C GPS Empfänger JM3-GPS]]&lt;br /&gt;
* Arexx [[RP6_Sensor_Board_und_Xtra_Module#Gyro_Modul_JM3-GYRO_2|Gyro Modul JM3-GYRO]]&lt;br /&gt;
* Arexx [[RP6_Sensor_Board_und_Xtra_Module#3D_Accelerometer_Modul_JM3-3DA_2|3D Accelerometer Modul JM3-3DA]]&lt;br /&gt;
&lt;br /&gt;
====I2C GPS Empfänger JM3-GPS====&lt;br /&gt;
=====RP6M256 WiFi: I2C_GPS Library=====&lt;br /&gt;
Die nachfolgende RP6M256_I2C_GPSLib (GCC) dient zur Ansteuerung des I2C GPS Empfängers durch die RP6M256 WiFi.&lt;br /&gt;
 &lt;br /&gt;
======Libary Header======&lt;br /&gt;
Datei: RP6M256_I2C_GPSLib.h&lt;br /&gt;
&amp;lt;pre&amp;gt;/* ****************************************************************************&lt;br /&gt;
 *                           _______________________&lt;br /&gt;
 *                           \| RP6  ROBOT SYSTEM |/&lt;br /&gt;
 *                            \_-_-_-_-_-_-_-_-_-_/           &amp;gt;&amp;gt;&amp;gt; RP6 M256 WIFI&lt;br /&gt;
 * ----------------------------------------------------------------------------&lt;br /&gt;
 * ----------------------------- [c]2014 - Dirk -------------------------------&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * File: RP6M256_I2C_GPSLib.h&lt;br /&gt;
 * Version: 1.0&lt;br /&gt;
 * Target: RP6 M256 WIFI - ATMEGA2560 @16.00MHz&lt;br /&gt;
 * Author(s): Dirk&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Description:&lt;br /&gt;
 * Header file for new RP6 I2C GPS Receiver library.&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
#ifndef RP6M256_I2C_GPSLIB_H&lt;br /&gt;
#define RP6M256_I2C_GPSLIB_H&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// RP6 Sensor Board:&lt;br /&gt;
&lt;br /&gt;
// If you want to use the RP6 I2C GPS Receiver on the RP6 Sensor Board, you&lt;br /&gt;
// have to define SENSOR_BOARD (default)!&lt;br /&gt;
// If SENSOR_BOARD is NOT defined, this library assumes that the RP6 I2C GPS&lt;br /&gt;
// Receiver is used stand-alone.&lt;br /&gt;
// ------------------&lt;br /&gt;
#define SENSOR_BOARD&lt;br /&gt;
// ------------------&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Includes:&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6M256Lib.h&amp;quot;&lt;br /&gt;
#include &amp;quot;RP6I2CmasterTWI.h&amp;quot;&lt;br /&gt;
#ifdef SENSOR_BOARD&lt;br /&gt;
	#include &amp;quot;RP6M256_Sensor_BoardLib.h&amp;quot;&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// RP6 I2C GPS Receiver:&lt;br /&gt;
#define I2C_GPS_RECEIVER_ADR			0xc8	// Default&lt;br /&gt;
//#define I2C_GPS_RECEIVER_ADR			0xca&lt;br /&gt;
//#define I2C_GPS_RECEIVER_ADR			0xcc&lt;br /&gt;
//#define I2C_GPS_RECEIVER_ADR			0xce&lt;br /&gt;
//#define I2C_GPS_RECEIVER_ADR			0xd0	// DO NOT USE on Sensor Board!&lt;br /&gt;
//#define I2C_GPS_RECEIVER_ADR			0xd2&lt;br /&gt;
//#define I2C_GPS_RECEIVER_ADR			0xd4&lt;br /&gt;
//#define I2C_GPS_RECEIVER_ADR			0xd6&lt;br /&gt;
//#define I2C_GPS_RECEIVER_ADR			0xd8&lt;br /&gt;
//#define I2C_GPS_RECEIVER_ADR			0xda&lt;br /&gt;
//#define I2C_GPS_RECEIVER_ADR			0xdc&lt;br /&gt;
//#define I2C_GPS_RECEIVER_ADR			0xde&lt;br /&gt;
&lt;br /&gt;
// Read registers:&lt;br /&gt;
#define WHO_AM_I						0x20	// I2C address [0xc8..0xde]&lt;br /&gt;
#define LAT_DEG							0x21	// Degrees&lt;br /&gt;
#define LAT_MIN							0x22	// Minutes&lt;br /&gt;
#define LAT_MIN_D_L						0x23	// Minutes decimal part low&lt;br /&gt;
#define LAT_MIN_D_H						0x24	// Minutes decimal part high&lt;br /&gt;
#define LON_DEG							0x25	// Degrees&lt;br /&gt;
#define LON_MIN							0x26	// Minutes&lt;br /&gt;
#define LON_MIN_D_L						0x27	// Minutes decimal part low&lt;br /&gt;
#define LON_MIN_D_H						0x28	// Minutes decimal part high&lt;br /&gt;
#define STATUS							0x29	// Status flags&lt;br /&gt;
#define FIX_IND							0x2a	// FIX_IND&lt;br /&gt;
#define HDOP							0x2b	// HDOP&lt;br /&gt;
#define HDOP_D							0x2c	// HDOP_D&lt;br /&gt;
#define SAT_N							0x2d	// Number of satellites&lt;br /&gt;
#define COURSE_T_L						0x2e	// True heading low byte&lt;br /&gt;
#define COURSE_T_H						0x2f	// True heading high byte&lt;br /&gt;
#define COURSE_T_D						0x30	// Decimal part of course&lt;br /&gt;
#define SPEED_L							0x31	// Speed low byte&lt;br /&gt;
#define SPEED_H							0x32	// Speed high byte&lt;br /&gt;
#define SPEED_D							0x33	// Speed decimal part&lt;br /&gt;
#define ALT_L							0x34	// Altitude low byte&lt;br /&gt;
#define ALT_H							0x35	// Altitude high byte&lt;br /&gt;
#define ALT_DIF_L						0x36	// Differ. WGS-84 MSL low byte&lt;br /&gt;
#define ALT_DIF_H						0x37	// Differ. WGS-84 MSL high byte&lt;br /&gt;
#define UTC_H							0x38	// UTC hour&lt;br /&gt;
#define UTC_MIN							0x39	// UTC minute&lt;br /&gt;
#define UTC_S							0x3a	// UTC second&lt;br /&gt;
#define DAY								0x3b	// Day&lt;br /&gt;
#define YEAR_L							0x3c	// Year low byte&lt;br /&gt;
#define YEAR_H							0x3d	// Year high byte&lt;br /&gt;
#define MONTH							0x3e	// Month&lt;br /&gt;
#define PDOP							0x3f	// PDOP&lt;br /&gt;
#define PDOP_D							0x40	// PDOP_D&lt;br /&gt;
#define VDOP							0x41	// VDOP&lt;br /&gt;
#define VDOP_D							0x42	// VDOP_D&lt;br /&gt;
#define SAT_1							0x43	// SAT # 1&lt;br /&gt;
#define SAT_2							0x44	// SAT # 2&lt;br /&gt;
#define SAT_3							0x45	// SAT # 3&lt;br /&gt;
#define SAT_4							0x46	// SAT # 4&lt;br /&gt;
#define SAT_5							0x47	// SAT # 5&lt;br /&gt;
#define SAT_6							0x48	// SAT # 6&lt;br /&gt;
#define SAT_7							0x49	// SAT # 7&lt;br /&gt;
#define SAT_8							0x4a	// SAT # 8&lt;br /&gt;
#define SAT_9							0x4b	// SAT # 9&lt;br /&gt;
#define SAT_A							0x4c	// SAT # 10&lt;br /&gt;
#define SAT_B							0x4d	// SAT # 11&lt;br /&gt;
#define SAT_C							0x4e	// SAT # 12&lt;br /&gt;
#define SW_VERSION						0x4f	// SW_Version&lt;br /&gt;
#define HEARTBEAT						0x50	// Heartbeat&lt;br /&gt;
&lt;br /&gt;
// Status and Fix_Ind register bitmasks:&lt;br /&gt;
#define STATUS_NS						0b00000001&lt;br /&gt;
#define STATUS_EW						0b00000010&lt;br /&gt;
#define STATUS_SPU						0b00000100&lt;br /&gt;
#define STATUS_AUTON					0b00001000&lt;br /&gt;
#define FIX_IND_UI_FIX					0b10000000&lt;br /&gt;
&lt;br /&gt;
// Write registers:&lt;br /&gt;
#define INIT_CFG						0x90	// INIT CFG&lt;br /&gt;
#define SET_FIX_TIME					0x91	// Pos_Fix_Time&lt;br /&gt;
#define STBY							0x92	// STBY&lt;br /&gt;
#define FAC_RES							0x93	// Factory Reset&lt;br /&gt;
#define EN_JAM							0x94	// Jamming Remover&lt;br /&gt;
#define TEST_MODE						0x96	// Test Mode&lt;br /&gt;
&lt;br /&gt;
// Write register values (commands):&lt;br /&gt;
#define INIT_CFG_HOT_START				1		// Hot Start&lt;br /&gt;
#define INIT_CFG_WARM_START				2		// Warm Start init data loaded&lt;br /&gt;
#define INIT_CFG_WARM_START_EPH_CLR		3		// Warm Start Ephemeris cleared&lt;br /&gt;
#define INIT_CFG_COLD_START				4		// Cold Start&lt;br /&gt;
#define SET_FIX_TIME_1S					1		// Pos Fix Time 1 second&lt;br /&gt;
#define SET_FIX_TIME_2S					2		// Pos Fix Time 2 seconds&lt;br /&gt;
#define STBY_ENTER						1		// Standby (cleared after write)&lt;br /&gt;
#define FAC_RES_ENTER					1		// Factory Reset&lt;br /&gt;
#define EN_JAM_DISABLE					0		// Jamming Remover disable&lt;br /&gt;
#define EN_JAM_ENABLE					1		// Jamming Remover enable&lt;br /&gt;
#define TEST_MODE_INACTIVE				0		// Test Mode inactive&lt;br /&gt;
#define TEST_MODE_ACTIVE				0x15	// Test Mode active&lt;br /&gt;
&lt;br /&gt;
// Data structure (starts at LAT_DEG):&lt;br /&gt;
#define DATA_STRUCT						LAT_DEG	// Start&lt;br /&gt;
// All data from LAT_DEG to HEARTBEAT (48 bytes):&lt;br /&gt;
#define DATA_LENGTH						(HEARTBEAT - LAT_DEG + 1)&lt;br /&gt;
// Basic data from LAT_DEG to SAT_N (13 bytes):&lt;br /&gt;
#define DATA_BASIC						(SAT_N - LAT_DEG + 1)&lt;br /&gt;
&lt;br /&gt;
typedef union {&lt;br /&gt;
 	uint8_t byte;&lt;br /&gt;
	struct {&lt;br /&gt;
		unsigned ns    :1;				// 1: North 0: South&lt;br /&gt;
		unsigned ew    :1;				// 1: East 0: West&lt;br /&gt;
		unsigned spu   :1;				// 1: km/h 0: kn&lt;br /&gt;
		unsigned auton :1;				// 1: Data not valid 0: Autonomous&lt;br /&gt;
		unsigned fix0  :1;&lt;br /&gt;
		unsigned fix1  :1;&lt;br /&gt;
		unsigned stat0 :1;				// Invalid&lt;br /&gt;
		unsigned stat1 :1;				// GPS Com Error&lt;br /&gt;
	};&lt;br /&gt;
	struct {&lt;br /&gt;
		unsigned ns    :1;				// 1: North 0: South&lt;br /&gt;
		unsigned ew    :1;				// 1: East 0: West&lt;br /&gt;
		unsigned spu   :1;				// 1: km/h 0: kn&lt;br /&gt;
		unsigned auton :1;				// 1: Data not valid 0: Autonomous&lt;br /&gt;
		unsigned fix   :2;&lt;br /&gt;
		unsigned stat  :2;				// 00 -&amp;gt; Valid&lt;br /&gt;
										// 01 -&amp;gt; Invalid&lt;br /&gt;
										// 10 -&amp;gt; GPS Com Error&lt;br /&gt;
										// 11 -&amp;gt; n. def.&lt;br /&gt;
	};&lt;br /&gt;
} status_t;&lt;br /&gt;
&lt;br /&gt;
typedef union {&lt;br /&gt;
 	uint8_t byte;&lt;br /&gt;
	struct {							// Fix indicator:&lt;br /&gt;
		unsigned fix_0  :1;				//  1: GPS fix          2: DGPS fix&lt;br /&gt;
		unsigned fix_1  :1;				//  3: PPS fix          4: RTK&lt;br /&gt;
		unsigned fix_2  :1;				//  5: Float RTK        6: Dead reck.&lt;br /&gt;
		unsigned fix_3  :1;				//  7: Manual inp. mode 8: Simul. mode&lt;br /&gt;
		unsigned unused :3;&lt;br /&gt;
		unsigned ui_fix :1;				// HW signal from UC530&lt;br /&gt;
	};&lt;br /&gt;
	struct {&lt;br /&gt;
		unsigned fix    :4;				// See above &amp;quot;Fix indicator&amp;quot;!&lt;br /&gt;
		unsigned unused :3;&lt;br /&gt;
		unsigned ui_fix :1;				// HW signal from UC530&lt;br /&gt;
	};&lt;br /&gt;
} fix_ind_t;&lt;br /&gt;
&lt;br /&gt;
typedef union {&lt;br /&gt;
	struct {&lt;br /&gt;
		uint8_t   latDeg;&lt;br /&gt;
		uint8_t   latMin;&lt;br /&gt;
		uint16_t  latMinDec;&lt;br /&gt;
		uint8_t   lonDeg;&lt;br /&gt;
		uint8_t   lonMin;&lt;br /&gt;
		uint16_t  lonMinDec;&lt;br /&gt;
		status_t  status;&lt;br /&gt;
		fix_ind_t fixInd;&lt;br /&gt;
		uint8_t   hdop;&lt;br /&gt;
		uint8_t   hdopDec;&lt;br /&gt;
		uint8_t   satCount;&lt;br /&gt;
		uint16_t  course;&lt;br /&gt;
		uint8_t   courseDec;&lt;br /&gt;
		uint16_t  speed;&lt;br /&gt;
		uint8_t   speedDec;&lt;br /&gt;
		uint16_t  altitude;&lt;br /&gt;
		uint16_t  altDif;&lt;br /&gt;
		uint8_t   utcHour;&lt;br /&gt;
		uint8_t   utcMinute;&lt;br /&gt;
		uint8_t   utcSec;&lt;br /&gt;
		uint8_t   day;&lt;br /&gt;
		uint16_t  year;&lt;br /&gt;
		uint8_t   month;&lt;br /&gt;
		uint8_t   pdop;&lt;br /&gt;
		uint8_t   pdopDec;&lt;br /&gt;
		uint8_t   vdop;&lt;br /&gt;
		uint8_t   vdopDec;&lt;br /&gt;
		uint8_t   sat[12];&lt;br /&gt;
		uint8_t   swVersion;&lt;br /&gt;
		uint8_t   heartbeat;&lt;br /&gt;
	};&lt;br /&gt;
} gpsdata_t;&lt;br /&gt;
extern gpsdata_t gpsdata;&lt;br /&gt;
&lt;br /&gt;
void I2C_GPS_reset(void);&lt;br /&gt;
void I2C_GPS_write_cmd(uint8_t, uint8_t);&lt;br /&gt;
uint8_t I2C_GPS_read_reg(uint8_t);&lt;br /&gt;
void I2C_GPS_read(uint8_t);&lt;br /&gt;
void I2C_GPS_init(void);&lt;br /&gt;
void I2C_GPS_new_addr(uint8_t);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
/******************************************************************************&lt;br /&gt;
 * Additional info&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Changelog:&lt;br /&gt;
 * &lt;br /&gt;
 *  ---&amp;gt; changes are documented in the file &amp;quot;RP6M256_I2C_GPSLib.c&amp;quot;&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
======Libary Source======&lt;br /&gt;
Datei: RP6M256_I2C_GPSLib.c&lt;br /&gt;
&amp;lt;pre&amp;gt;/* ****************************************************************************&lt;br /&gt;
 *                           _______________________&lt;br /&gt;
 *                           \| RP6  ROBOT SYSTEM |/&lt;br /&gt;
 *                            \_-_-_-_-_-_-_-_-_-_/           &amp;gt;&amp;gt;&amp;gt; RP6 M256 WIFI&lt;br /&gt;
 * ----------------------------------------------------------------------------&lt;br /&gt;
 * ----------------------------- [c]2014 - Dirk -------------------------------&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * File: RP6M256_I2C_GPSLib.c&lt;br /&gt;
 * Version: 1.0&lt;br /&gt;
 * Target: RP6 M256 WIFI - ATMEGA2560 @16.00MHz&lt;br /&gt;
 *         and a RP6 I2C GPS Receiver (CONRAD 1082385)&lt;br /&gt;
 *         optionally on a RP6 Sensor Board (CONRAD 1082384)&lt;br /&gt;
 * Author(s): Dirk&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Description:&lt;br /&gt;
 * &lt;br /&gt;
 * This is our new Library that contains basic routines and functions for&lt;br /&gt;
 * accessing the RP6 I2C GPS Receiver JM3-GPS (CONRAD 1082385).&lt;br /&gt;
 * The library assumes the I2C GPS Receiver software (firmware) v1.2.&lt;br /&gt;
 * If the I2C GPS Receiver is located on the RP6 Sensor Board (CONRAD 1082384)&lt;br /&gt;
 * and connected to the I2C-MODULE plug M1, the RP6M256_Sensor_BoardLib has to&lt;br /&gt;
 * be included!&lt;br /&gt;
 * &lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Includes:&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6M256_I2C_GPSLib.h&amp;quot; 		&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Variables:&lt;br /&gt;
&lt;br /&gt;
uint8_t gpsdataBuf[DATA_LENGTH + 1]; &lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Software reset for the I2C GPS Receiver.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void I2C_GPS_reset(void)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_GPS_RECEIVER_ADR, 0, 0x06);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Writes a command cmd to a register reg of the&lt;br /&gt;
 * I2C GPS Receiver.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: reg -&amp;gt; Write register [0x90..0x96]&lt;br /&gt;
 *        cmd -&amp;gt; Command&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void I2C_GPS_write_cmd(uint8_t reg, uint8_t cmd)&lt;br /&gt;
{&lt;br /&gt;
	if((reg &amp;lt; INIT_CFG) || (reg &amp;gt; TEST_MODE)) return;&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_GPS_RECEIVER_ADR, reg, cmd);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Reads a single register reg from the I2C GPS&lt;br /&gt;
 * Receiver.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: reg -&amp;gt; Read register [0x20..0x50]&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
uint8_t I2C_GPS_read_reg(uint8_t reg)&lt;br /&gt;
{&lt;br /&gt;
	if((reg &amp;lt; WHO_AM_I) || (reg &amp;gt; HEARTBEAT)) reg = WHO_AM_I;&lt;br /&gt;
	I2CTWI_transmitByte(I2C_GPS_RECEIVER_ADR, reg);&lt;br /&gt;
	return (I2CTWI_readByte(I2C_GPS_RECEIVER_ADR));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
gpsdata_t gpsdata;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Reads the GPS data from the I2C GPS Receiver.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: length -&amp;gt; Number of data bytes [1..48]&lt;br /&gt;
 *&lt;br /&gt;
 * Hint: If length = DATA_BASIC, only basic GPS&lt;br /&gt;
 *       data are read. If length = DATA_LENGTH,&lt;br /&gt;
 *       ALL GPS data are read.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void I2C_GPS_read(uint8_t length)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t i;&lt;br /&gt;
&lt;br /&gt;
	if(length &amp;gt; DATA_LENGTH) length = DATA_LENGTH;&lt;br /&gt;
	I2CTWI_readRegisters(I2C_GPS_RECEIVER_ADR, DATA_STRUCT, gpsdataBuf, length);&lt;br /&gt;
	for(i = length; i &amp;lt; DATA_LENGTH; i++) {&lt;br /&gt;
		gpsdataBuf[i] = 0;&lt;br /&gt;
	}&lt;br /&gt;
	gpsdata.latDeg = gpsdataBuf[0];&lt;br /&gt;
	gpsdata.latMin = gpsdataBuf[1];&lt;br /&gt;
	gpsdata.latMinDec = gpsdataBuf[2] + (gpsdataBuf[3] &amp;lt;&amp;lt; 8);&lt;br /&gt;
	gpsdata.lonDeg = gpsdataBuf[4];&lt;br /&gt;
	gpsdata.lonMin = gpsdataBuf[5];&lt;br /&gt;
	gpsdata.lonMinDec = gpsdataBuf[6] + (gpsdataBuf[7] &amp;lt;&amp;lt; 8);&lt;br /&gt;
	gpsdata.status.byte = gpsdataBuf[8];&lt;br /&gt;
	gpsdata.fixInd.byte = gpsdataBuf[9];&lt;br /&gt;
	gpsdata.hdop = gpsdataBuf[10];&lt;br /&gt;
	gpsdata.hdopDec = gpsdataBuf[11];&lt;br /&gt;
	gpsdata.satCount = gpsdataBuf[12];&lt;br /&gt;
	if(length == DATA_BASIC) return;&lt;br /&gt;
	gpsdata.course = gpsdataBuf[13] + (gpsdataBuf[14] &amp;lt;&amp;lt; 8);&lt;br /&gt;
	gpsdata.courseDec = gpsdataBuf[15];&lt;br /&gt;
	gpsdata.speed = gpsdataBuf[16] + (gpsdataBuf[17] &amp;lt;&amp;lt; 8);&lt;br /&gt;
	gpsdata.speedDec = gpsdataBuf[18];&lt;br /&gt;
	gpsdata.altitude = gpsdataBuf[19] + (gpsdataBuf[20] &amp;lt;&amp;lt; 8);&lt;br /&gt;
	gpsdata.altDif = gpsdataBuf[21] + (gpsdataBuf[22] &amp;lt;&amp;lt; 8);&lt;br /&gt;
	gpsdata.utcHour = gpsdataBuf[23];&lt;br /&gt;
	gpsdata.utcMinute = gpsdataBuf[24];&lt;br /&gt;
	gpsdata.utcSec = gpsdataBuf[25];&lt;br /&gt;
	gpsdata.day = gpsdataBuf[26];&lt;br /&gt;
	gpsdata.year = gpsdataBuf[27] + (gpsdataBuf[28] * 100);&lt;br /&gt;
	gpsdata.month = gpsdataBuf[29];&lt;br /&gt;
	gpsdata.pdop = gpsdataBuf[30];&lt;br /&gt;
	gpsdata.pdopDec = gpsdataBuf[31];&lt;br /&gt;
	gpsdata.vdop = gpsdataBuf[32];&lt;br /&gt;
	gpsdata.vdopDec = gpsdataBuf[33];&lt;br /&gt;
	for(i = 34; i &amp;lt; 46; i++) {&lt;br /&gt;
		gpsdata.sat[i - 34] = gpsdataBuf[i];&lt;br /&gt;
	}&lt;br /&gt;
	gpsdata.swVersion = gpsdataBuf[46];&lt;br /&gt;
	gpsdata.heartbeat = gpsdataBuf[47];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * You MUST call this function at the beginning of a&lt;br /&gt;
 * main program, that uses the RP6 I2C GPS Receiver. &lt;br /&gt;
 * If SENSOR_BOARD is defined, the I2C-MODULE power&lt;br /&gt;
 * will be switched on with the function&lt;br /&gt;
 * setI2CModulePower() defined in the&lt;br /&gt;
 * RP6M256_Sensor_BoardLib, which will be included&lt;br /&gt;
 * then.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void I2C_GPS_init(void)&lt;br /&gt;
{&lt;br /&gt;
#ifdef SENSOR_BOARD&lt;br /&gt;
	// I2C-MODULE (plug M1) power on: &lt;br /&gt;
	setI2CModulePower(1);&lt;br /&gt;
#endif&lt;br /&gt;
	// Other init procedures here!&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Writes a new I2C address to the I2C GPS Receiver.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: addr -&amp;gt; New I2C address [0xc8..0xde]&lt;br /&gt;
 *&lt;br /&gt;
 * Hints: - Default I2C address is 0xc8.&lt;br /&gt;
 *        - You may choose a new I2C address in&lt;br /&gt;
 *          the range 0xc8..0xde.&lt;br /&gt;
 *        - After writing a new address you have&lt;br /&gt;
 *          to switch the I2C GPS Receiver off&lt;br /&gt;
 *          and on again.&lt;br /&gt;
 *        - Definition I2C_GPS_RECEIVER_ADR must&lt;br /&gt;
 *          be adapted to the new I2C address!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void I2C_GPS_new_addr(uint8_t addr)&lt;br /&gt;
{&lt;br /&gt;
	if((addr &amp;lt; 0xc8) || (addr &amp;gt; 0xde)) return;&lt;br /&gt;
	addr &amp;amp;= 0xfe;								// Clear R/W bit&lt;br /&gt;
	I2CTWI_transmit3Bytes(I2C_GPS_RECEIVER_ADR, 0, 0x04, addr);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&lt;br /&gt;
/******************************************************************************&lt;br /&gt;
 * Additional info&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Changelog:&lt;br /&gt;
 * - v. 1.0 (initial release) 21.04.2014 by Dirk&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Erklärung&lt;br /&gt;
&lt;br /&gt;
======Demo======&lt;br /&gt;
makefile:&lt;br /&gt;
&amp;lt;pre&amp;gt;...&lt;br /&gt;
TARGET = RP6M256_Sensor_Board_02&lt;br /&gt;
...&lt;br /&gt;
SRC += $(RP6_LIB_PATH)/RP6common/RP6I2CmasterTWI.c&lt;br /&gt;
&lt;br /&gt;
SRC += $(RP6_LIB_PATH)/RP6control_M256_WIFI/RP6M256_Sensor_BoardLib.c&lt;br /&gt;
SRC += $(RP6_LIB_PATH)/RP6control_M256_WIFI/RP6M256_I2C_GPSLib.c&lt;br /&gt;
...&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Datei: RP6M256_Sensor_Board_02.c&lt;br /&gt;
&amp;lt;pre&amp;gt;/* &lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * RP6 ROBOT SYSTEM - RP6 CONTROL M256 Examples&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Example: RP6M256 Sensor Board&lt;br /&gt;
 * Author(s): Dirk&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Description:&lt;br /&gt;
 * In this example we show a second test for the RP6 Sensor Board.&lt;br /&gt;
 * &lt;br /&gt;
 * ############################################################################&lt;br /&gt;
 * The Robot does NOT move in this example! You can simply put it on a table&lt;br /&gt;
 * next to your PC and you should connect it to the PC via the USB Interface!&lt;br /&gt;
 * You should also connect to it via WIFI.&lt;br /&gt;
 * ############################################################################&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Includes:&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6M256Lib.h&amp;quot; 				// The RP6 M256 Library. &lt;br /&gt;
										// Always needs to be included!&lt;br /&gt;
#include &amp;quot;RP6I2CmasterTWI.h&amp;quot;			// Include the I2C-Bus Master Library&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Include our new &amp;quot;RP6M256 I2C GPS Receiver library&amp;quot;:&lt;br /&gt;
// (This is the library for accessing the RP6 I2C GPS Receiver!)&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6M256_I2C_GPSLib.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Write a floating point number to the WIFI.&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *&lt;br /&gt;
 *			// Write a floating point number to the WIFI (no exponent):&lt;br /&gt;
 *			writeDouble_WIFI(1234567.890, 11, 3);&lt;br /&gt;
 *&lt;br /&gt;
 * The value of prec (precision) defines the number of decimal places.&lt;br /&gt;
 * For 32 bit floating point variables (float, double ...) 6 is&lt;br /&gt;
 * the max. value for prec (7 relevant digits).&lt;br /&gt;
 * The value of width defines the overall number of characters in the&lt;br /&gt;
 * floating point number including the decimal point. The number of&lt;br /&gt;
 * pre-decimal positions is: (width - prec - 1).&lt;br /&gt;
 */&lt;br /&gt;
void writeDouble_WIFI(double number, uint8_t width, uint8_t prec)&lt;br /&gt;
{char buffer[width + 1];&lt;br /&gt;
	dtostrf(number, width, prec, &amp;amp;buffer[0]);&lt;br /&gt;
	writeString_WIFI(&amp;amp;buffer[0]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Write a floating point number to the LCD.&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *&lt;br /&gt;
 *			// Write a floating point number to the LCD (no exponent):&lt;br /&gt;
 *			writeDoubleLCD(1234567.890, 11, 3);&lt;br /&gt;
 *&lt;br /&gt;
 * The value of prec (precision) defines the number of decimal places.&lt;br /&gt;
 * For 32 bit floating point variables (float, double ...) 6 is&lt;br /&gt;
 * the max. value for prec (7 relevant digits).&lt;br /&gt;
 * The value of width defines the overall number of characters in the&lt;br /&gt;
 * floating point number including the decimal point. The number of&lt;br /&gt;
 * pre-decimal positions is: (width - prec - 1).&lt;br /&gt;
 */&lt;br /&gt;
void writeDoubleLCD(double number, uint8_t width, uint8_t prec)&lt;br /&gt;
{char buffer[width + 1];&lt;br /&gt;
	dtostrf(number, width, prec, &amp;amp;buffer[0]);&lt;br /&gt;
	writeStringLCD(&amp;amp;buffer[0]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Error handler&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function gets called automatically if there was an I2C Error like&lt;br /&gt;
 * the slave sent a &amp;quot;not acknowledge&amp;quot; (NACK, error codes e.g. 0x20 or 0x30).&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void I2C_transmissionError(uint8_t errorState)&lt;br /&gt;
{&lt;br /&gt;
	writeString_P_WIFI(&amp;quot;\nI2C ERROR - TWI STATE: 0x&amp;quot;);&lt;br /&gt;
	writeInteger_WIFI(errorState, HEX);&lt;br /&gt;
	writeChar_WIFI('\n');&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Main function - The program starts here:&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
	initRP6M256();    // Always call this first! The Processor will not work&lt;br /&gt;
					  // correctly otherwise. &lt;br /&gt;
&lt;br /&gt;
	initLCD(); // Initialize the LC-Display (LCD)&lt;br /&gt;
			   // Always call this before using the LCD!&lt;br /&gt;
&lt;br /&gt;
	setLEDs(0b1111);&lt;br /&gt;
	mSleep(500);&lt;br /&gt;
	setLEDs(0b0000);&lt;br /&gt;
&lt;br /&gt;
	writeString_P_WIFI(&amp;quot;\n\nRP6 Sensor Board Selftest 2!\n&amp;quot;); &lt;br /&gt;
&lt;br /&gt;
	// IMPORTANT:&lt;br /&gt;
	I2CTWI_initMaster(100); // Initialize the TWI Module for Master operation&lt;br /&gt;
							// with 100kHz SCL Frequency&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	// Register the event handler:&lt;br /&gt;
	I2CTWI_setTransmissionErrorHandler(I2C_transmissionError);&lt;br /&gt;
&lt;br /&gt;
	setLEDs(0b1111);&lt;br /&gt;
&lt;br /&gt;
	// Write a text message to the LCD:&lt;br /&gt;
	showScreenLCD(&amp;quot;################&amp;quot;, &amp;quot;################&amp;quot;);&lt;br /&gt;
	mSleep(1500);&lt;br /&gt;
	showScreenLCD(&amp;quot;RP6v2-M256-WIFI &amp;quot;, &amp;quot;Example Program&amp;quot;);&lt;br /&gt;
	mSleep(2500); &lt;br /&gt;
	showScreenLCD(&amp;quot;RP6 Sensor Board&amp;quot;, &amp;quot;   Selftest 2&amp;quot;);&lt;br /&gt;
	mSleep(2500);&lt;br /&gt;
	clearLCD();&lt;br /&gt;
&lt;br /&gt;
	setLEDs(0b0000);&lt;br /&gt;
&lt;br /&gt;
	// ---------------------------------------&lt;br /&gt;
&lt;br /&gt;
	uint8_t onoff = 0;&lt;br /&gt;
	uint8_t i;&lt;br /&gt;
&lt;br /&gt;
	startStopwatch1();&lt;br /&gt;
	startStopwatch2();&lt;br /&gt;
&lt;br /&gt;
	// IMPORTANT:&lt;br /&gt;
	sensor_board_init();						// RP6 Sensor Board init!!!&lt;br /&gt;
	I2C_GPS_init();								// RP6 I2C GPS Receiver init&lt;br /&gt;
&lt;br /&gt;
	while(true) &lt;br /&gt;
	{&lt;br /&gt;
		if(getStopwatch1() &amp;gt; 1000) // 1s&lt;br /&gt;
		{&lt;br /&gt;
			if (onoff) onoff = 0;&lt;br /&gt;
			else onoff = 1;&lt;br /&gt;
&lt;br /&gt;
			// Show GPS data:&lt;br /&gt;
			I2C_GPS_read(DATA_LENGTH);			// Read data&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nLAT_DEG:     &amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.latDeg, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;° &amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.latMin, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;.&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.latMinDec, DEC, 4);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;' &amp;quot;);&lt;br /&gt;
			if(gpsdata.status.ns)&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;N&amp;quot;);&lt;br /&gt;
			else&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;S&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nLON_DEG:    &amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.lonDeg, DEC, 3);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;° &amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.lonMin, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;.&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.lonMinDec, DEC, 4);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;' &amp;quot;);&lt;br /&gt;
			if(gpsdata.status.ew)&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;E&amp;quot;);&lt;br /&gt;
			else&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;W&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nSTATUS:     &amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.status.byte, BIN, 8);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nFIX_IND:    &amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.fixInd.byte, BIN, 8);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nHDOP:       &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(gpsdata.hdop, DEC);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;.&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.hdopDec, DEC, 2);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nSAT_N:      &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(gpsdata.satCount, DEC);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nCOURSE_T:   &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(gpsdata.course, DEC);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;.&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.courseDec, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;°&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nSPEED:      &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(gpsdata.speed, DEC);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;.&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.speedDec, DEC, 2);&lt;br /&gt;
			if(gpsdata.status.spu)&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;km/h&amp;quot;);&lt;br /&gt;
			else&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;kn&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nALT:        &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(gpsdata.altitude, DEC);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;m\nALT_DIF:    &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(gpsdata.altDif, DEC);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;m\nUTC:        &amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.utcHour, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;:&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.utcMinute, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;:&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.utcSec, DEC, 2);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nDATE:       &amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.day, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;.&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.month, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;.&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.year, DEC, 4);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nPDOP:       &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(gpsdata.pdop, DEC);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;.&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.pdopDec, DEC, 2);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nVDOP:       &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(gpsdata.vdop, DEC);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;.&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.vdopDec, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			for(i = 0; i &amp;lt; gpsdata.satCount; i++) {&lt;br /&gt;
				if(i == 8) writeString_P_WIFI(&amp;quot;\n&amp;quot;);&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;  SAT_&amp;quot;);&lt;br /&gt;
				writeIntegerLength_WIFI(i + 1, HEX, 1);&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;: &amp;quot;);&lt;br /&gt;
				writeInteger_WIFI(gpsdata.sat[i], DEC);&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nSW_VERSION: &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(gpsdata.swVersion, DEC);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nHEARTBEAT:  &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(gpsdata.heartbeat, DEC);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			// RP6 Sensor Board shutdown (button &amp;amp; status LED test):&lt;br /&gt;
			if (pressedButton) {&lt;br /&gt;
				setStatusLED(1);&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;\nPress button again for RP6 Sensor Board SHUTDOWN!\n&amp;quot;);&lt;br /&gt;
				mSleep(2000);&lt;br /&gt;
				do {&lt;br /&gt;
					if(getStopwatch2() &amp;gt; 200) { // 0.2s&lt;br /&gt;
						if (onoff) onoff = 0;&lt;br /&gt;
						else onoff = 1;&lt;br /&gt;
						if (onoff) setStatusLED(1);&lt;br /&gt;
						else setStatusLED(0);&lt;br /&gt;
						setStopwatch2(0);&lt;br /&gt;
					}&lt;br /&gt;
					mSleep(1);&lt;br /&gt;
					task_I2CTWI();&lt;br /&gt;
				} while (!readButton());&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;\n\n\n\n\nPlease wait for RP6 Sensor Board SHUTDOWN...\n&amp;quot;);&lt;br /&gt;
				sensor_board_shutdown();&lt;br /&gt;
				mSleep(3000);&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;\n\n\nThe RP6 Sensor Board now is in SHUTDOWN MODE!!!\n&amp;quot;);&lt;br /&gt;
				mSleep(1000);&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;\nRESET the M256 microcontroller now...\n\n&amp;quot;);&lt;br /&gt;
				while(true) {};&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			setStopwatch1(0);&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		task_RP6SensorBoard();					// RP6 Sensor Board task&lt;br /&gt;
&lt;br /&gt;
		task_I2CTWI();&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Erklärung&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Gyro Modul JM3-GYRO====&lt;br /&gt;
=====Analoge Auswertung=====&lt;br /&gt;
Am Pin ''OUT'' des Gyro Moduls (siehe [http://www.rn-wissen.de/index.php/RP6_Sensor_Board_und_Xtra_Module#Anschluss-Schema Anschluss-Schema]!) liegt die Ausgangsspannung des Sensors (0..5V) an. Sie kann mit einem ADC-Eingang eines Microcontrollers gemessen werden.&lt;br /&gt;
Syntax mit den Libraries der RP6Base, M32 oder M256 WiFi (ADC Kanal 0):&lt;br /&gt;
 uint16_t result = readADC(0);&lt;br /&gt;
In der C-Control-Pro Umgebung der M128 sieht das z.B. in CompactC so aus (ADC Kanal 0):&lt;br /&gt;
 word result;&lt;br /&gt;
 ADC_Set(ADC_VREF_VCC, 0);&lt;br /&gt;
 ...&lt;br /&gt;
 result = ADC_Read();&lt;br /&gt;
Das Ergebnis ''result'' kann noch zur Weiterverarbeitung angepasst werden:&lt;br /&gt;
 #define ADCVAL_ZERORATE_LEVEL			511		// Zero rate Level&lt;br /&gt;
 ...&lt;br /&gt;
 int16_t z_axisg = result - ADCVAL_ZERORATE_LEVEL;&lt;br /&gt;
Dadurch zeigt ''z_axisg'' Null an, wenn keine Rotation anliegt und wird positiv, wenn nach LINKS gedreht wird und negativ bei RECHTS-Drehung. Die Definition ADCVAL_ZERORATE_LEVEL muss natürlich an den eigenen Sensor-Nullwert angepasst werden.&lt;br /&gt;
&lt;br /&gt;
Aus dem Absolutwert von ''z_axisg'' kann man die Drehrate (Drehgeschwindigkeit) auch bestimmen:&lt;br /&gt;
&lt;br /&gt;
In den [[RP6_Sensor_Board_und_Xtra_Module#Technische_Daten_3|Technischen Daten]] ist die Empfindlichkeit des Sensors mit '''10mV/dps''' (0,01V pro Grad und Sekunde) angegeben. Damit errechnet sich die Drehrate als:&lt;br /&gt;
 Drehrate [dps] = abs(z_axisg) * (5 / 1024 / 0.01) = abs(z_axisg) * 0.48828125&lt;br /&gt;
&lt;br /&gt;
=====Optionale Ansteuerung=====&lt;br /&gt;
Im [http://www.rn-wissen.de/index.php/RP6_Sensor_Board_und_Xtra_Module#Anschluss-Schema Anschluss-Schema] ist erkennbar, dass es noch 2 Steuerleitungen ''SLEEP/PD'' und ''ST'' gibt. Mit diesen Anschlüssen kann die Betriebsart des Gyro Moduls festgelegt werden, siehe nachfolgende Tabelle:&lt;br /&gt;
{|  {{Blauetabelle}} &lt;br /&gt;
|Betriebsart&lt;br /&gt;
|ST&lt;br /&gt;
|SLEEP/PD&lt;br /&gt;
|Stromverbrauch&lt;br /&gt;
|-&lt;br /&gt;
|Normal&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|4,2mA&lt;br /&gt;
|-&lt;br /&gt;
|Sleep&lt;br /&gt;
|0&lt;br /&gt;
|1&lt;br /&gt;
|2,2mA&lt;br /&gt;
|-&lt;br /&gt;
|Self-test&lt;br /&gt;
|1&lt;br /&gt;
|0&lt;br /&gt;
|4,2mA&lt;br /&gt;
|-&lt;br /&gt;
|Power-down&lt;br /&gt;
|1&lt;br /&gt;
|1&lt;br /&gt;
|'''5µA'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
Will man zwischen den Betriebsarten per Software umschalten, muss man die beiden Steuerleitungen mit I/O Portpins des Microcontrollers verbinden, die als Ausgänge konfiguriert sind. Braucht man diese Funktion nicht, reicht es, ''ST'' und ''SLEEP/PD'' mit GND zu verbinden (Betriebsart &amp;quot;Normal&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====3D Accelerometer Modul JM3-3DA====&lt;br /&gt;
Das 3D Accelerometer Modul kann über den I2C- oder den SPI-Bus angesteuert werden. Wird das Modul auf der RP6 CONTROL M32 Platine betrieben (es sitzt also auf dem Sockel IC5 für das 2. SPI-EEPROM), dann erfolgt die Ansteuerung über den SPI-Bus. Die SPI-Grundfunktionen befinden sich in der RP6ControlLib, die daher eingebunden werden muss.&lt;br /&gt;
&lt;br /&gt;
=====RP6 CONTROL M32: ACCSENS Library=====&lt;br /&gt;
Die nachfolgende RP6ControlACCSENSLib (GCC) dient zur Ansteuerung des 3D Accelerometer Moduls durch die RP6 CONTROL M32.&lt;br /&gt;
&lt;br /&gt;
======Configuration Header======&lt;br /&gt;
Vor dem Kompilieren der Library muss eine Anpassung des Configuration Headers an die eigenen Hardware-Voraussetzungen erfolgen.&lt;br /&gt;
Dazu gibt es im Configuration Header eine Definition:&lt;br /&gt;
* EXP_STACK_1 -&amp;gt; Die RP6 CONTROL M32 sitzt auf dem vorderen Platinenstapel 1 des RP6&lt;br /&gt;
Im nachfolgenden Listing ist die Definition EXP_STACK_1 NICHT aktiv (d.h. die M32 sitzt auf dem hinteren Platinenstapel 2!). Dies muss an die eigene Hardware angepaßt werden. Wenn die RP6 CONTROL M32 auf dem vorderen Platinenstapel 1 des RP6 sitzt, muss die Zeile mit &amp;quot;EXP_STACK_1&amp;quot; &amp;quot;aktiviert&amp;quot; werden. Dazu entfernt man &amp;quot;//&amp;quot; am Zeilenanfang:&lt;br /&gt;
 #define EXP_STACK_1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Bevor man den Beschleunigungssensor nutzen kann, muss man ihn kalibrieren:&lt;br /&gt;
&lt;br /&gt;
'''Accelerometer:'''&lt;br /&gt;
* Die X-Achse wird kalibriert, indem man den RP6 mit der rechten Seite nach unten hält und den Maximalwert in MAX_X_A einträgt. Dann neigt man ihn auf seine linke Seite und trägt den negativen Maximalwert in MIN_X_A ein.&lt;br /&gt;
* Die Y-Achse wird kalibriert, indem man den RP6 mit der Vorderseite nach oben hält und den Maximalwert in MAX_Y_A einträgt. Dann kippt man die Vorderseite nach unten und trägt den negativen Maximalwert in MIN_Y_A ein.&lt;br /&gt;
* Die Z-Achse wird kalibriert, indem man den RP6 normal waagerecht hält und den Maximalwert in MAX_Z_A einträgt. Dann dreht man den RP6 &amp;quot;auf den Kopf&amp;quot; und trägt den negativen Maximalwert in MIN_Z_A ein.&lt;br /&gt;
* Sollten die angezeigten Pitch- und Roll-Werte nach der Kalibrierung der Achsen und genau waagerecht stehendem Sensor bzw. RP6 vom Nullwert deutlich abweichen, kann man sie mithilfe der Definitionen OFFSET_PITCH_A und OFFSET_ROLL_A &amp;quot;nullen&amp;quot;. Die Einheit dieser Definitionen ist °.&lt;br /&gt;
Nach dem Eintragen der Kalibrierungswerte muss das Programm neu kompiliert werden!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Datei: RP6ControlACCSENS.h&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;/* ****************************************************************************&lt;br /&gt;
 *                           _______________________&lt;br /&gt;
 *                           \| RP6  ROBOT SYSTEM |/&lt;br /&gt;
 *                            \_-_-_-_-_-_-_-_-_-_/             &amp;gt;&amp;gt;&amp;gt; RP6 CONTROL&lt;br /&gt;
 * ----------------------------------------------------------------------------&lt;br /&gt;
 * ----------------------------- [c]2014 - Dirk -------------------------------&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * File: RP6ControlACCSENS.h&lt;br /&gt;
 * Version: 1.0&lt;br /&gt;
 * Target: RP6 CONTROL - ATMEGA32 @16.00MHz&lt;br /&gt;
 * Author(s): Dirk&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Description:&lt;br /&gt;
 * Configuration header file for new ACCSENS library.&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * THE CHANGELOG CAN BE FOUND AT THE END OF THIS FILE!&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
#ifndef RP6CONTROLACCSENS_H&lt;br /&gt;
#define RP6CONTROLACCSENS_H&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Sensor position on the RP6 robot:&lt;br /&gt;
// (If EXP_STACK_1 is defined, the RP6 CONTROL M32 is located on the front&lt;br /&gt;
//  stack for addon boards on the RP6 robot. If EXP_STACK_1 is NOT defined&lt;br /&gt;
//  (default), the RP6 CONTROL M32 is mounted on the rear stack.)&lt;br /&gt;
// -------------------&lt;br /&gt;
//#define EXP_STACK_1&lt;br /&gt;
// -------------------&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// The following sensor is used:&lt;br /&gt;
// - 3D Accelerometer Modul (CONRAD 1082387-62) with LIS302DLH 3-axis&lt;br /&gt;
//   accelerometer&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// LIS302DLH accelerometer calibration data:&lt;br /&gt;
#define MAX_X_A						32767		// Max. X-axis value&lt;br /&gt;
#define MIN_X_A						-32768		// Min. X-axis value&lt;br /&gt;
#define MAX_Y_A						32767		// Max. Y-axis value&lt;br /&gt;
#define MIN_Y_A						-32768		// Min. Y-axis value&lt;br /&gt;
#define MAX_Z_A						32767		// Max. Z-axis value&lt;br /&gt;
#define MIN_Z_A						-32768		// Min. Z-axis value&lt;br /&gt;
#define OFFSET_PITCH_A				0.0			// Offset Pitch [°]&lt;br /&gt;
#define OFFSET_ROLL_A				0.0			// Offset Roll [°]&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
/******************************************************************************&lt;br /&gt;
 * Additional info&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Changelog:&lt;br /&gt;
 * &lt;br /&gt;
 *  ---&amp;gt; changes are documented in the file &amp;quot;RP6ControlACCSENSLib.c&amp;quot;&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
======Library Header======&lt;br /&gt;
Datei: RP6ControlACCSENSLib.h&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;/* ****************************************************************************&lt;br /&gt;
 *                           _______________________&lt;br /&gt;
 *                           \| RP6  ROBOT SYSTEM |/&lt;br /&gt;
 *                            \_-_-_-_-_-_-_-_-_-_/             &amp;gt;&amp;gt;&amp;gt; RP6 CONTROL&lt;br /&gt;
 * ----------------------------------------------------------------------------&lt;br /&gt;
 * ----------------------------- [c]2014 - Dirk -------------------------------&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * File: RP6ControlACCSENSLib.h&lt;br /&gt;
 * Version: 1.0&lt;br /&gt;
 * Target: RP6 CONTROL - ATMEGA32 @16.00MHz&lt;br /&gt;
 * Author(s): Dirk&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Description:&lt;br /&gt;
 * This is the RP6ControlACCSENSLib header file.&lt;br /&gt;
 * You have to include this file, if you want to use the library&lt;br /&gt;
 * RP6ControlACCSENSLib.c in your own projects.&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * THE CHANGELOG CAN BE FOUND AT THE END OF THIS FILE!&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
#ifndef RP6CONTROLACCSENSLIB_H&lt;br /&gt;
#define RP6CONTROLACCSENSLIB_H&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Includes:&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6ControlLib.h&amp;quot; 		// The RP6 Control Library (v. 1.1 or higher). &lt;br /&gt;
#include &amp;quot;RP6ControlACCSENS.h&amp;quot;&lt;br /&gt;
#include &amp;lt;math.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&lt;br /&gt;
#define ACC_CS							MEM_CS2&lt;br /&gt;
#define DEVICE_IDENTIFIER				0x32&lt;br /&gt;
&lt;br /&gt;
// Registers:&lt;br /&gt;
#define WHO_AM_I						0x0f&lt;br /&gt;
#define CTRL_REG1						0x20&lt;br /&gt;
#define CTRL_REG2						0x21&lt;br /&gt;
#define CTRL_REG3						0x22&lt;br /&gt;
#define CTRL_REG4						0x23&lt;br /&gt;
#define CTRL_REG5						0x24&lt;br /&gt;
#define HP_FILTER_RESET					0x25&lt;br /&gt;
#define REFERENCE						0x26&lt;br /&gt;
#define STATUS_REG						0x27&lt;br /&gt;
#define OUT_X_L							0x28&lt;br /&gt;
#define OUT_X_H							0x29&lt;br /&gt;
#define OUT_Y_L							0x2a&lt;br /&gt;
#define OUT_Y_H							0x2b&lt;br /&gt;
#define OUT_Z_L							0x2c&lt;br /&gt;
#define OUT_Z_H							0x2d&lt;br /&gt;
#define INT1_CFG						0x30&lt;br /&gt;
#define INT1_SOURCE						0x31&lt;br /&gt;
#define INT1_THS						0x32&lt;br /&gt;
#define INT1_DURATION					0x33&lt;br /&gt;
#define INT2_CFG						0x34&lt;br /&gt;
#define INT2_SOURCE						0x35&lt;br /&gt;
#define INT2_THS						0x36&lt;br /&gt;
#define INT2_DURATION					0x37&lt;br /&gt;
&lt;br /&gt;
// Control Register bitmasks:&lt;br /&gt;
#define CTRL_REG1_POWERDOWN				0b00000000&lt;br /&gt;
#define CTRL_REG1_3D_DEFAULT			0b00000111&lt;br /&gt;
#define CTRL_REG1_3D_LOPWR_10HZ			0b11000111&lt;br /&gt;
#define CTRL_REG2_DEFAULT				0b00000000&lt;br /&gt;
#define CTRL_REG3_DEFAULT				0b00000000&lt;br /&gt;
#define CTRL_REG4_DEFAULT				0b00000000&lt;br /&gt;
#define CTRL_REG4_BDU_2G				0b10000000&lt;br /&gt;
#define CTRL_REG4_BDU_2G_STSIGN			0b10001000&lt;br /&gt;
#define CTRL_REG4_BDU_BLE_2G			0b11000000&lt;br /&gt;
#define CTRL_REG4_BDU_BLE_2G_STSIGN		0b11001000&lt;br /&gt;
#define CTRL_REG5_DEFAULT				0b00000000&lt;br /&gt;
&lt;br /&gt;
// Read/write address bitmasks:&lt;br /&gt;
#define READ_MASK						0b10000000&lt;br /&gt;
#define READ_AUTOINC_MASK				0b11000000&lt;br /&gt;
#define WRITE_MASK						0b01111111&lt;br /&gt;
&lt;br /&gt;
extern int16_t x_axisa, y_axisa, z_axisa;&lt;br /&gt;
extern double pitch, roll;&lt;br /&gt;
extern double xa, ya, za;&lt;br /&gt;
extern double the, phi;&lt;br /&gt;
&lt;br /&gt;
uint8_t SPI_ACCSENS_readByte(uint8_t regAddr);&lt;br /&gt;
void SPI_ACCSENS_readBytes(uint8_t startAddr, uint8_t *buffer, uint8_t length);&lt;br /&gt;
void SPI_ACCSENS_writeByte(uint8_t regAddr, uint8_t data);&lt;br /&gt;
uint8_t SPI_ACCSENS_getStatus(void);&lt;br /&gt;
&lt;br /&gt;
void SPI_ACCSENS_init(void);&lt;br /&gt;
void SPI_ACCSENS_shutdown(void);&lt;br /&gt;
void SPI_ACCSENS_read(void);&lt;br /&gt;
void SPI_ACCSENS_normalize(void);&lt;br /&gt;
void SPI_ACCSENS_position(void);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
/******************************************************************************&lt;br /&gt;
 * Additional info&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Changelog:&lt;br /&gt;
 * &lt;br /&gt;
 *  ---&amp;gt; changes are documented in the file &amp;quot;RP6ControlACCSENSLib.c&amp;quot;&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
======Library Source======&lt;br /&gt;
Datei: RP6ControlACCSENSLib.c&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;/* ****************************************************************************&lt;br /&gt;
 *                           _______________________&lt;br /&gt;
 *                           \| RP6  ROBOT SYSTEM |/&lt;br /&gt;
 *                            \_-_-_-_-_-_-_-_-_-_/             &amp;gt;&amp;gt;&amp;gt; RP6 CONTROL&lt;br /&gt;
 * ----------------------------------------------------------------------------&lt;br /&gt;
 * ----------------------------- [c]2014 - Dirk -------------------------------&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * File: RP6ControlACCSENSLib.c&lt;br /&gt;
 * Version: 1.0&lt;br /&gt;
 * Target: RP6 CONTROL - ATMEGA32 @16.00MHz&lt;br /&gt;
 *         with optional LC-Display 16x2 chars (CONRAD 190911-62)&lt;br /&gt;
 *         and a 3D Accelerometer Modul (CONRAD 1082387-62) (IC5)&lt;br /&gt;
 * Author(s): Dirk&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Description:&lt;br /&gt;
 * This is my RP6 Control ACCSENS Library. This library may be used to access&lt;br /&gt;
 * the basic functions of the 3D Accelerometer Modul. This RP6 Xtra module may&lt;br /&gt;
 * be placed on the IC5 socket on the RP6 CONTROL M32 instead of a second&lt;br /&gt;
 * EEPROM.&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * THE CHANGELOG CAN BE FOUND AT THE END OF THIS FILE!&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
 &lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Includes:&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6ControlACCSENSLib.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// SPI functions:&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Reads a single register from the 3D Accelerometer&lt;br /&gt;
 * Modul (ACCSENS).&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
uint8_t SPI_ACCSENS_readByte(uint8_t regAddr)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t data;&lt;br /&gt;
	regAddr |= READ_MASK;						// Read byte&lt;br /&gt;
	PORTB &amp;amp;= ~ACC_CS;&lt;br /&gt;
	writeSPI(regAddr);&lt;br /&gt;
	data = readSPI();&lt;br /&gt;
	PORTB |= ACC_CS;&lt;br /&gt;
	return data;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Reads &amp;quot;length&amp;quot; bytes into the buffer &amp;quot;buffer&amp;quot;&lt;br /&gt;
 * from startAddr on. &lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void SPI_ACCSENS_readBytes(uint8_t startAddr, uint8_t *buffer, uint8_t length)&lt;br /&gt;
{&lt;br /&gt;
	startAddr |= READ_AUTOINC_MASK;				// Read byte, auto increment&lt;br /&gt;
	PORTB &amp;amp;= ~ACC_CS;&lt;br /&gt;
	writeSPI(startAddr);&lt;br /&gt;
	readBufferSPI(&amp;amp;buffer[0], length);&lt;br /&gt;
	PORTB |= ACC_CS;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Write a single data byte to the specified sensor&lt;br /&gt;
 * address.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void SPI_ACCSENS_writeByte(uint8_t regAddr, uint8_t data)&lt;br /&gt;
{&lt;br /&gt;
	PORTB &amp;amp;= ~ACC_CS;&lt;br /&gt;
	writeSPI(regAddr);&lt;br /&gt;
	writeSPI(data);&lt;br /&gt;
	PORTB |= ACC_CS;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Returns sensor status register - for checking if&lt;br /&gt;
 * sensor is busy. &lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
uint8_t SPI_ACCSENS_getStatus(void)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t status;&lt;br /&gt;
	PORTB &amp;amp;= ~ACC_CS;&lt;br /&gt;
	writeSPI(STATUS_REG);&lt;br /&gt;
	status = readSPI();&lt;br /&gt;
	PORTB |= ACC_CS;&lt;br /&gt;
	return status;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// 3D accelerometer functions:&lt;br /&gt;
&lt;br /&gt;
int16_t x_axisa, y_axisa, z_axisa;&lt;br /&gt;
double pitch, roll;&lt;br /&gt;
double xa, ya, za;&lt;br /&gt;
double the, phi;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Initializes the sensor. You must call this&lt;br /&gt;
 * function at the beginning of a program, that&lt;br /&gt;
 * uses the 3D Accelerometer Modul.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void SPI_ACCSENS_init(void)&lt;br /&gt;
{&lt;br /&gt;
	// All axes enable, low power, 10Hz output data rate:&lt;br /&gt;
	SPI_ACCSENS_writeByte(CTRL_REG1, CTRL_REG1_3D_LOPWR_10HZ);&lt;br /&gt;
	// No update while reading, +- 2g, self-test minus:&lt;br /&gt;
	SPI_ACCSENS_writeByte(CTRL_REG4, CTRL_REG4_BDU_2G_STSIGN);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Sets the LIS302DLH power-down mode. If you&lt;br /&gt;
 * do not need the sensor, you can save energy&lt;br /&gt;
 * by using the sensor power-down mode.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void SPI_ACCSENS_shutdown(void)&lt;br /&gt;
{&lt;br /&gt;
	// LIS302DLH in power-down mode:&lt;br /&gt;
	SPI_ACCSENS_writeByte(CTRL_REG1, CTRL_REG1_POWERDOWN);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function reads the X-axis, Y-axis and Z-axis&lt;br /&gt;
 * values from the LIS302DLH accelerometer and stores&lt;br /&gt;
 * them in the global variables x_axisa, y_axisa and&lt;br /&gt;
 * z_axisa.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void SPI_ACCSENS_read(void)&lt;br /&gt;
{&lt;br /&gt;
#ifndef EXP_STACK_1&lt;br /&gt;
	// Default sensor position (M32 located on the RP6 rear stack):&lt;br /&gt;
	// xb = -y:&lt;br /&gt;
	x_axisa = SPI_ACCSENS_readByte(OUT_Y_L) | (SPI_ACCSENS_readByte(OUT_Y_H) &amp;lt;&amp;lt; 8);&lt;br /&gt;
	x_axisa *= -1;&lt;br /&gt;
	// yb = -x:&lt;br /&gt;
	y_axisa = SPI_ACCSENS_readByte(OUT_X_L) | (SPI_ACCSENS_readByte(OUT_X_H) &amp;lt;&amp;lt; 8);&lt;br /&gt;
	y_axisa *= -1;&lt;br /&gt;
	// zb = z:&lt;br /&gt;
	z_axisa = SPI_ACCSENS_readByte(OUT_Z_L) | (SPI_ACCSENS_readByte(OUT_Z_H) &amp;lt;&amp;lt; 8);&lt;br /&gt;
#else&lt;br /&gt;
	// Other sensor position (M32 located on the RP6 front stack):&lt;br /&gt;
	// xb = y:&lt;br /&gt;
	x_axisa = SPI_ACCSENS_readByte(OUT_Y_L) | (SPI_ACCSENS_readByte(OUT_Y_H) &amp;lt;&amp;lt; 8);&lt;br /&gt;
	// yb = x:&lt;br /&gt;
	y_axisa = SPI_ACCSENS_readByte(OUT_X_L) | (SPI_ACCSENS_readByte(OUT_X_H) &amp;lt;&amp;lt; 8);&lt;br /&gt;
	// zb = z:&lt;br /&gt;
	z_axisa = SPI_ACCSENS_readByte(OUT_Z_L) | (SPI_ACCSENS_readByte(OUT_Z_H) &amp;lt;&amp;lt; 8);&lt;br /&gt;
#endif&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function limits and normalizes the x-axisa,&lt;br /&gt;
 * y-axisa and z-axisa values read from the LIS302DLH&lt;br /&gt;
 * accelerometer with the function SPI_ACCSENS_read() and&lt;br /&gt;
 * stores them in the global double variables xa, ya and&lt;br /&gt;
 * za.&lt;br /&gt;
 * It also calculates the position in space in form of the&lt;br /&gt;
 * tilt angles (the = pitch, phi = roll) and stores them&lt;br /&gt;
 * in the global double variables the and phi.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void SPI_ACCSENS_normalize(void)&lt;br /&gt;
{&lt;br /&gt;
	// Limit raw values:&lt;br /&gt;
	if (x_axisa &amp;lt; MIN_X_A) x_axisa = MIN_X_A;&lt;br /&gt;
	if (x_axisa &amp;gt; MAX_X_A) x_axisa = MAX_X_A;&lt;br /&gt;
	if (y_axisa &amp;lt; MIN_Y_A) y_axisa = MIN_Y_A;&lt;br /&gt;
	if (y_axisa &amp;gt; MAX_Y_A) y_axisa = MAX_Y_A;&lt;br /&gt;
	if (z_axisa &amp;lt; MIN_Z_A) z_axisa = MIN_Z_A;&lt;br /&gt;
	if (z_axisa &amp;gt; MAX_Z_A) z_axisa = MAX_Z_A;&lt;br /&gt;
	xa = (double) x_axisa / 10000.0;&lt;br /&gt;
	ya = (double) y_axisa / 10000.0;&lt;br /&gt;
	za = (double) z_axisa / 10000.0;&lt;br /&gt;
	// Calculate Pitch and Roll:&lt;br /&gt;
	phi = asin(xa);								// Calculate the and phi&lt;br /&gt;
	the = asin(ya / cos(the));					//  from the raw values&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function calculates the position in space by&lt;br /&gt;
 * using the the and phi values (see function&lt;br /&gt;
 * SPI_ACCSENS_normalize()!). It stores the position&lt;br /&gt;
 * in the global double variables pitch and roll. &lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void SPI_ACCSENS_position(void)&lt;br /&gt;
{&lt;br /&gt;
	pitch = the * 180 / M_PI + OFFSET_PITCH_A;&lt;br /&gt;
	roll = phi * 180 / M_PI + OFFSET_ROLL_A;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/******************************************************************************&lt;br /&gt;
 * Additional info&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Changelog:&lt;br /&gt;
 * - v. 1.0 (initial release) 04.04.2014 by Dirk&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Erklärung&lt;br /&gt;
&lt;br /&gt;
======Demo======&lt;br /&gt;
makefile:&lt;br /&gt;
&amp;lt;pre&amp;gt;...&lt;br /&gt;
TARGET = RP6Control_01_ACCSENS&lt;br /&gt;
...&lt;br /&gt;
SRC += $(RP6_LIB_PATH)/RP6control/RP6ControlLib.c&lt;br /&gt;
SRC += $(RP6_LIB_PATH)/RP6common/RP6uart.c&lt;br /&gt;
SRC += $(RP6_LIB_PATH)/RP6control/RP6ControlACCSENSLib.c&lt;br /&gt;
...&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Datei: RP6Control_01_ACCSENS.c&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;// Uncommented Version of RP6Control_01_ACCSENS.c&lt;br /&gt;
// written by Dirk&lt;br /&gt;
// ------------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6ControlACCSENSLib.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void writeDouble(double number, uint8_t width, uint8_t prec)&lt;br /&gt;
{char buffer[width + 1];&lt;br /&gt;
	dtostrf(number, width, prec, &amp;amp;buffer[0]);&lt;br /&gt;
	writeString(&amp;amp;buffer[0]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void writeDoubleLCD(double number, uint8_t width, uint8_t prec)&lt;br /&gt;
{char buffer[width + 1];&lt;br /&gt;
	dtostrf(number, width, prec, &amp;amp;buffer[0]);&lt;br /&gt;
	writeStringLCD(&amp;amp;buffer[0]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
	initRP6Control();&lt;br /&gt;
&lt;br /&gt;
	writeString_P(&amp;quot;\n\nRP6Control SPI ACCSENS Test Program!\n&amp;quot;); &lt;br /&gt;
	setLEDs(0b1111);&lt;br /&gt;
	mSleep(50);&lt;br /&gt;
	initLCD(); &lt;br /&gt;
	showScreenLCD(&amp;quot;################&amp;quot;, &amp;quot;################&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
	showScreenLCD(&amp;quot;  SPI ACCSENS&amp;quot;, &amp;quot;  Test Program&amp;quot;);&lt;br /&gt;
	mSleep(1000);&lt;br /&gt;
	setLEDs(0b0000);&lt;br /&gt;
&lt;br /&gt;
	SPI_ACCSENS_init();&lt;br /&gt;
&lt;br /&gt;
	uint8_t whoami = SPI_ACCSENS_readByte(WHO_AM_I);&lt;br /&gt;
	writeString_P(&amp;quot;\nWHO AM I: &amp;quot;);&lt;br /&gt;
	writeInteger(whoami, HEX);&lt;br /&gt;
	writeChar('\n');&lt;br /&gt;
	mSleep(2000);&lt;br /&gt;
	&lt;br /&gt;
	startStopwatch1();&lt;br /&gt;
&lt;br /&gt;
	while(true) &lt;br /&gt;
	{&lt;br /&gt;
		if(getStopwatch1() &amp;gt; 1000)&lt;br /&gt;
		{&lt;br /&gt;
			SPI_ACCSENS_read();&lt;br /&gt;
			writeString_P(&amp;quot;\n3D Accelerometer SENSOR -&amp;gt;\n&amp;quot;);&lt;br /&gt;
			writeString_P(&amp;quot;X-axis: &amp;quot;);&lt;br /&gt;
			writeInteger(x_axisa, DEC);&lt;br /&gt;
			writeChar('\n');&lt;br /&gt;
			writeString_P(&amp;quot;Y-axis: &amp;quot;);&lt;br /&gt;
			writeInteger(y_axisa, DEC);&lt;br /&gt;
			writeChar('\n');&lt;br /&gt;
			writeString_P(&amp;quot;Z-axis: &amp;quot;);&lt;br /&gt;
			writeInteger(z_axisa, DEC);&lt;br /&gt;
			writeChar('\n');&lt;br /&gt;
			SPI_ACCSENS_normalize();&lt;br /&gt;
			SPI_ACCSENS_position();&lt;br /&gt;
			writeString_P(&amp;quot;POSITION: \n&amp;quot;);&lt;br /&gt;
			writeString_P(&amp;quot;  Pitch [°]: &amp;quot;);&lt;br /&gt;
			writeDouble(pitch, 6, 1);&lt;br /&gt;
			writeChar('\n');&lt;br /&gt;
			writeString_P(&amp;quot;  Roll [°]:  &amp;quot;);&lt;br /&gt;
			writeDouble(roll, 6, 1);&lt;br /&gt;
			writeChar('\n');&lt;br /&gt;
			setCursorPosLCD(0, 0);&lt;br /&gt;
			writeStringLCD_P(&amp;quot;P&amp;quot;);&lt;br /&gt;
			writeDoubleLCD(pitch, 6, 1);&lt;br /&gt;
			writeStringLCD_P(&amp;quot; &amp;quot;);&lt;br /&gt;
			setCursorPosLCD(0, 8);&lt;br /&gt;
			writeStringLCD_P(&amp;quot;R&amp;quot;);&lt;br /&gt;
			writeDoubleLCD(roll, 6, 1);&lt;br /&gt;
			writeStringLCD_P(&amp;quot; &amp;quot;);&lt;br /&gt;
			setCursorPosLCD(1, 0);&lt;br /&gt;
			writeStringLCD_P(&amp;quot;X&amp;quot;);&lt;br /&gt;
			writeIntegerLCD(x_axisa, DEC);&lt;br /&gt;
			writeStringLCD_P(&amp;quot;   &amp;quot;);&lt;br /&gt;
			setCursorPosLCD(1, 5);&lt;br /&gt;
			writeStringLCD_P(&amp;quot;Y&amp;quot;);&lt;br /&gt;
			writeIntegerLCD(y_axisa, DEC);&lt;br /&gt;
			writeStringLCD_P(&amp;quot;   &amp;quot;);&lt;br /&gt;
			setCursorPosLCD(1, 10);&lt;br /&gt;
			writeStringLCD_P(&amp;quot;Z&amp;quot;);&lt;br /&gt;
			writeIntegerLCD(z_axisa, DEC);&lt;br /&gt;
			writeStringLCD_P(&amp;quot;    &amp;quot;);&lt;br /&gt;
			mSleep(2000);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Erklärung&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Erfahrungsberichte==&lt;br /&gt;
&lt;br /&gt;
...in Arbeit...(kann aber gerne ergänzt werden)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Siehe auch==&lt;br /&gt;
* [[RP6v2]]&lt;br /&gt;
* [[RP6]]&lt;br /&gt;
* [[RP6 - Programmierung]]&lt;br /&gt;
* [[RP6 Kamera - Mitmach-Projekt]]&lt;br /&gt;
* [[RP6v2 I2C-Portexpander]]&lt;br /&gt;
* [[RP6v2 USB-RS232-Adapter]]&lt;br /&gt;
* [[RP6v2 Orientierung]]&lt;br /&gt;
* [[RP6 Multi IO Projekt]]&lt;br /&gt;
* [[RP6 Multi IO Projekt - Software]]&lt;br /&gt;
* [[Induktive_Ladestation_f%C3%BCr_den_RP6|Induktive Ladestation für den RP6]]&lt;br /&gt;
* [[IR-bake_f%C3%BCr_den_RP6|IR-bake für den RP6]]&lt;br /&gt;
* [[CCRP5]]&lt;br /&gt;
* [[Yeti]]&lt;br /&gt;
* [[Asuro]]&lt;br /&gt;
* [[C't-Bot]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Weblinks==&lt;br /&gt;
'''Siehe auch die Weblinks im [http://www.rn-wissen.de/index.php/RP6v2#Weblinks RP6v2] und im [http://www.rn-wissen.de/index.php/RP6#Weblinks RP6] Artikel!'''&lt;br /&gt;
&lt;br /&gt;
* [http://www.conrad.de/ce/de/product/1082384/Arexx-RP6-Sensor-Board-RP6-JM03-61 RP6 Sensor Board bei CONRAD]&lt;br /&gt;
* JM3 Engeneering: [http://www.jm3-engineering.com/rp6.htm RP6 Roboter Erweiterung]&lt;br /&gt;
* Ankündigung einer Sensorerweiterungsplatine für die RP6v2 M256 WiFi im [http://www.roboternetz.de/community/threads/63595-Neue-Hardware-f%C3%BCr-RP6%28v2%29?p=590129&amp;amp;viewfull=1#post590129 Roboternetz RP6 Forum]&lt;br /&gt;
* Erfahrungsbericht zum Sensor Board im [http://www.arexx.com/forum/viewtopic.php?f=19&amp;amp;t=2498 AREXX Support Forum] und im [http://www.roboternetz.de/community/threads/64414-RP6-Sensor-Board-Erster-Eindruck Roboternetz RP6 Forum]&lt;br /&gt;
* Erfahrungsbericht zum I2C GPS Empfänger im [http://www.arexx.com/forum/viewtopic.php?f=19&amp;amp;t=2509 AREXX Support Forum]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Kategorie:Robotikeinstieg]]	 &lt;br /&gt;
[[Kategorie:Praxis]]&lt;br /&gt;
&lt;br /&gt;
==Autoren==&lt;br /&gt;
..&lt;/div&gt;</summary>
		<author><name>Dirk NO2</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=RP6_Sensor_Board_und_Xtra_Module&amp;diff=24815</id>
		<title>RP6 Sensor Board und Xtra Module</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=RP6_Sensor_Board_und_Xtra_Module&amp;diff=24815"/>
				<updated>2014-07-08T15:21:22Z</updated>
		
		<summary type="html">&lt;p&gt;Dirk NO2: /* Autoren */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Bild:RP6_Sensor_Board.jpg|Das RP6 Sensor Board|right|500px]]&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_Xtra_module.JPG|RP6 Xtra module|right|500px]]&lt;br /&gt;
==Was bisher geschah==&lt;br /&gt;
'''Siehe auch &amp;quot;Was bisher geschah&amp;quot; im [http://www.rn-wissen.de/index.php/RP6v2#Was_bisher_geschah RP6v2] und im [http://www.rn-wissen.de/index.php/RP6#Was_bisher_geschah RP6] Artikel!'''&lt;br /&gt;
&lt;br /&gt;
Mit, 27. Nov 2013 - Ankündigung einer Sensorerweiterungsplatine, die an die RP6v2-M256-WIFI angeschlossen werden kann&amp;lt;br/&amp;gt;&lt;br /&gt;
Sam, 22. Feb 2014 - Auslieferungsbeginn des RP6 Sensor Boards, des I2C GPS Empfängers, des 3D Accelerometer Moduls und des Gyro Moduls&amp;lt;br/&amp;gt;&lt;br /&gt;
Mon, 17. Mär 2014 - Das RP6 Sensor Board ist &amp;quot;nicht lieferbar&amp;quot;, neuer Liefertermin angekündigt für den 12.06.2014 (!?)&amp;lt;br/&amp;gt;&lt;br /&gt;
Die, 25. Mär 2014 - Das RP6 Sensor Board ist wieder &amp;quot;sofort lieferbar&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Allgemein==&lt;br /&gt;
Dieser Artikel beschreibt die Grundlagen und Programmierung des RP6 Sensor Boards und der RP6 Xtra Module. Dieses Erweiterungs-Modul und die Xtra Module sind Teile des RP6-Systems, das in den RN-Wissen-Artikeln [[RP6]], [[RP6v2]] und [[RP6_-_Programmierung|RP6 - Programmierung]] ausführlich beschrieben wird. Ausgegliedert aus den &amp;quot;Haupt-Artikeln&amp;quot; habe ich diese Module, da sie m.E. zu einer neuen &amp;quot;Ära&amp;quot; des RP6-Systems gehören:&lt;br /&gt;
&lt;br /&gt;
Sie wurden nicht mehr von '''[[Benutzer:SlyD|SlyD]] (Dominik S. Herwald)''' in Zusammenarbeit mit '''[http://www.arexx.com/ AREXX]''' entwickelt, sondern nun von '''[http://jm3-engineering.com/ JM3 Engeneering] (Dipl.-Ing. Jürgen Maisel)'''. Ab Februar 2014 waren dann das '''RP6 Sensor Board RP6-JM03-61''' ([http://www.conrad.de/ce/de/product/1082384/Arexx-RP6-Sensor-Board-RP6-JM03-61 1082384]) und die drei RP6 Xtra Module '''I2C GPS Empfänger JM3-GPS''' ([http://www.conrad.de/ce/de/product/1082385/Arexx-IC-GPS-Empfaenger-JM3-GPS 1082385]), '''Gyro Modul JM3-GYRO''' ([http://www.conrad.de/ce/de/product/1082386/Arexx-Gyro-Modul-JM3-GYRO 1082386]) und '''3D Accelerometer Modul JM3-3DA''' ([http://www.conrad.de/ce/de/product/1082387/Arexx-3D-Accelerometer-Modul-JM3-3DA 1082387]) bei CONRAD lieferbar. Einen ersten Eindruck vom Sensor Board kann man im RoboterNetz und AREXX Support Forum bekommen,- siehe unter [[RP6_Sensor_Board_und_Xtra_Module#Weblinks|Weblinks]]!&lt;br /&gt;
&lt;br /&gt;
===RP6 Sensor Board===&lt;br /&gt;
Das [[RP6_Sensor_Board_und_Xtra_Module#RP6_Sensor_Board_2|RP6 Sensor Board]] gehört zu den &amp;quot;Erweiterungs-Modulen&amp;quot; des RP6-Systems. '''Andere &amp;quot;Erweiterungs-Module&amp;quot; werden im [[RP6v2#Erweiterungs-Module|RP6v2]] und im [[RP6#Erweiterungs-Module|RP6]] Artikel beschrieben!'''&lt;br /&gt;
&lt;br /&gt;
Das ''RP6 Sensor Board'' ist das erste &amp;quot;Erweiterungs-Modul&amp;quot;, das nicht über einen eigenen Microprozessor verfügt,- es ist also ein ''passives Modul'', das von einem Microprozessor-System (z.B. RP6v2, M32, M128, M256 Wifi) angesteuert werden muss. Es ist ebenfalls das erste Modul, das nicht mehr über die rautenförmige Einbuchtung an der Vorderkante verfügt, sondern komplett rechteckig ist. Damit passt es (montiert auf den Standard-Abstandbolzen) nur auf den vorderen Platinenstapel 1 des RP6.&lt;br /&gt;
&lt;br /&gt;
===RP6 Xtra Module===&lt;br /&gt;
Die [[RP6_Sensor_Board_und_Xtra_Module#RP6_Xtra_Module_2|RP6 Xtra Module]] gehören zu den &amp;quot;Zubehör- und Ersatzteilen&amp;quot; des RP6-Systems. '''Über die weiteren &amp;quot;Zubehör- und Ersatzteile&amp;quot; zum RP6 informiert der entsprechende Abschnitt im [[RP6v2#Zubeh.C3.B6r_und_Ersatzteile|RP6v2]] und im [[RP6#Zubehör und Ersatzteile|RP6]] Artikel!'''&lt;br /&gt;
&lt;br /&gt;
Die ''RP6 Xtra Module'' unterscheiden sich von den weiteren &amp;quot;Zubehör- und Ersatzteilen&amp;quot; dadurch, dass sie selbstständige Sensor-Platinen sind, die ideal zum RP6-System passen, aber auch mit anderen Microcontroller-Plattformen nutzbar sind.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==RP6 Sensor Board==&lt;br /&gt;
Das RP6 Sensor Board RP6-JM03-61 ([http://www.conrad.de/ce/de/product/1082384/Arexx-RP6-Sensor-Board-RP6-JM03-61 1082384]) wurde am 27.11.2013 von [[Benutzer:SlyD|SlyD]] angekündigt (siehe Weblink!).&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_Sensor_Board.jpg|Das RP6 Sensor Board]]&lt;br /&gt;
&lt;br /&gt;
===Beschreibung===&lt;br /&gt;
(Laut Online-Katalog der Firma CONRAD!)&lt;br /&gt;
&lt;br /&gt;
''&amp;quot;Das RP6 Sensor Board erweitert die Möglichkeiten aller RP6 Roboter um wesentliche Sensorsignale für Robotik-Anwendungen wie zum Beispiel Dreharten (Yaw-Gyro), Kipp- und Neigewinkel, Kompassrichtung oder aber auch Zeit und Datum.&lt;br /&gt;
Sie können einfach mit zusätzlichen Sharp Sensoren Abstände genau messen, z.B. für autonome Fahrrouten oder falls der Sensor nach unten gerichtet ist, kann er Treppenstufen oder ähnliches entdecken. Außerdem gibt es die Möglichkeit z.B. die Sharp Sensoren ein- bzw. auszuschalten um Strom zu sparen. Zusätzlich können bis zu 8 Servos angesteuert werden um z.B. einen Roboterarm zu bewegen, der auch mechanisch einfach zu montieren ist. Um die Möglichkeiten des RP6 Sensor Boards komplett ausnutzen zu können, wird ein RP6V2 und RP6Wifi Control Board empfohlen. Die ermöglicht den Roboter über Wifi fernzusteuern oder Sensordaten auf dem Kommandozentrum (PC) z.B Kompassdaten, Temperatur oder Kipp- und Neigewinkel anzeigen zu lassen.&amp;quot;''&lt;br /&gt;
&lt;br /&gt;
'''Ausstattung'''&lt;br /&gt;
* Magnetometer- und Accelerometer für Kompassfunktion&lt;br /&gt;
* Gyro Sensor (Yaw)&lt;br /&gt;
* Sharp-Sensor Schnittstelle&lt;br /&gt;
* LED Scheinwerfer&lt;br /&gt;
* LED Treiber mit Smart Funktionen&lt;br /&gt;
* I²C Bus mit max. 400 kHz Übertragungsrate; Hot Swap I²C-Bus Buffer&lt;br /&gt;
* Taster mit LED&lt;br /&gt;
* Echtzeit-Uhr RTC&lt;br /&gt;
* Backupbatterie (Aufladung während des Betriebs)&lt;br /&gt;
* Expansion Port z.B. für GPS-I²C Bus Modul&lt;br /&gt;
* 8 Servo-Ausgänge mit eigenem Schaltregler&lt;br /&gt;
* 8 PWM Ausgänge&lt;br /&gt;
* 5 LED Ausgänge und 2 Digital-I/O Ausgänge.&lt;br /&gt;
&lt;br /&gt;
'''Lieferumfang'''&lt;br /&gt;
* RP6 Sensor Board&lt;br /&gt;
* Montage-Kit&lt;br /&gt;
* Kabel&lt;br /&gt;
* Anleitung und CD mit Dokumentation.&lt;br /&gt;
&lt;br /&gt;
====Blockschaltbild====&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_Sensor_Board_BSP.png|RP6 Sensor Board Blockschaltbild]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Technische Daten===&lt;br /&gt;
{|  {{Blauetabelle}} &lt;br /&gt;
|'''Mikrocontroller:'''&lt;br /&gt;
|kein&lt;br /&gt;
|-&lt;br /&gt;
|'''Speicher:'''&lt;br /&gt;
|kein&amp;lt;br/&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|'''Programmierung:'''&lt;br /&gt;
|C++ (GCC, u.a.) über externes µC-System&lt;br /&gt;
|-&lt;br /&gt;
|'''Vorhandene Sensoren:'''&lt;br /&gt;
|Temperatur, 3D Magnetfeld (Kompass), 3D Beschleunigung, Yaw-Gyro&amp;lt;br/&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|'''Vorhandene Aktoren:'''&lt;br /&gt;
|LED Controller (2 LEDs on board, 5 freie LED Ports), Status LED,&amp;lt;br/&amp;gt;Button, Servo (PWM) Controller für 8 Servos und 8 PWM-Kanäle,&amp;lt;br/&amp;gt;Real Time Clock (RTC), 2 freie I/O Ports&lt;br /&gt;
|-&lt;br /&gt;
|'''Abmessungen:'''&lt;br /&gt;
|(L &amp;amp;times; B &amp;amp;times; H) 112 &amp;amp;times; 90 &amp;amp;times; 19 mm&amp;lt;br/&amp;gt;(B + 5 mm durch Scheinwerfer vorn)&lt;br /&gt;
|-&lt;br /&gt;
|'''Ausführung:'''&lt;br /&gt;
|Fertig aufgebautes Erweiterungsmodul&lt;br /&gt;
|-&lt;br /&gt;
|'''Stromversorgung:'''&lt;br /&gt;
|6 AA NiMH Akkus (über die RP6v2 Base)&amp;lt;br/&amp;gt;und optionaler Zusatzakku 7,2..10 V für Servo Power&lt;br /&gt;
|-&lt;br /&gt;
|'''Hersteller:'''&lt;br /&gt;
|Arexx Niederlande&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Umbau-Optionen===&lt;br /&gt;
Hier soll beschrieben werden, welche Umbau-Optionen es für das RP6 Sensor Board gibt. Im Text gibt es Verweise auf den Schaltplan des RP6 Sensor Boards (RP6_Sensor_Board_Rev2_Schema.pdf) in der Form: (SP2: Bauteil). Dies bedeutet, dass man das Bauteil auf Blatt 2 des Schaltplans finden kann. Beispielhaft sind im folgenden Text Bestell-Nummern der Firma [http://www.conrad.de/ce/ CONRAD] genannt. Natürlich kann man die Teile auch bei anderen Versendern beziehen.&lt;br /&gt;
&lt;br /&gt;
====USRBUS- und XBUS-Wannenstecker====&lt;br /&gt;
Der zweite Wannenstecker für den XBUS (SP3: K14) und USRBUS (SP3: K16) kann nachbestückt werden.&lt;br /&gt;
Man braucht dazu: &lt;br /&gt;
* 2 Wannenstecker 2x5-polig gerade RM 2,54mm (CONRAD [http://www.conrad.de/ce/de/product/741648/Stiftleiste-Print-Montage-gerade-Rastermass-254-mm-Pole-2-x-5-10120554-BKL-Electronic-Inhalt-1-St/ 741648])&lt;br /&gt;
Die Wannenstecker lötet man auf die eingezeichneten Positionen.&lt;br /&gt;
&lt;br /&gt;
'''USRBUS-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''USRBUS''' || '''Sensor Board-Funktion''' || '''Verwendung''' || '''I/O'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Y1 || &amp;quot;ADC0&amp;quot; || SHARP vorn || I&lt;br /&gt;
|-&lt;br /&gt;
| 2 || Y2 || &amp;quot;ADC1&amp;quot; || Yaw-Gyro || I&lt;br /&gt;
|-&lt;br /&gt;
| 3 || Y3 || PWR || Power für&amp;lt;br/&amp;gt;SHARPs, CAM_IF,&amp;lt;br/&amp;gt;I2C-MODULE || O&lt;br /&gt;
|-&lt;br /&gt;
| 4 || Y4 || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 5 || Y5 || &amp;quot;ADC4&amp;quot; || SHARP hinten ||I&lt;br /&gt;
|-&lt;br /&gt;
| 6..14 || Y6..Y14 || || keine ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
'''XBUS-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''XBUS''' || '''M256-Port''' ||'''M256-Funktion''' || '''Sensor Board-Funktion''' || '''Jumper''' || '''Verwendung''' || '''I/O'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || GND || || GND || GND || || ||&lt;br /&gt;
|-&lt;br /&gt;
| 2 || GND || || GND || GND || || ||&lt;br /&gt;
|-&lt;br /&gt;
| 3 || VDD || || VDD|| VDD_1 || || VDD +5V ||&lt;br /&gt;
|-&lt;br /&gt;
| 4 || +UB || || +UB || VSS_1 || || CAM_IF Power ||&lt;br /&gt;
|-&lt;br /&gt;
| 5 || VDD || || VDD || VDD_1 || || VDD +5V ||&lt;br /&gt;
|-&lt;br /&gt;
| 6 || +UB || || +UB || VSS_1 || || CAM_IF Power ||&lt;br /&gt;
|-&lt;br /&gt;
| 7 || INTU || PJ4 || PCINT13 || INTU || || keine || I&lt;br /&gt;
|-&lt;br /&gt;
| 8 || INT1 || PJ3 || PCINT12 || INT1 || 3 || LSM303DLHC: INT1 || I&lt;br /&gt;
|-&lt;br /&gt;
| 9 || INT3 || PJ5 || PCINT14 || INT3 || 2&amp;lt;br/&amp;gt;5 || DS1339: SQW/INT_N&amp;lt;br/&amp;gt;LSM303DLHC: INT2 || I&amp;lt;br/&amp;gt;I&lt;br /&gt;
|-&lt;br /&gt;
| 10 || SCL || PD0 || SCL || SCL_M || || I2C-Bus || O&lt;br /&gt;
|-&lt;br /&gt;
| 11 || INT2 || PJ6 || PCINT15 || INT2 || 4 || MAX7311: INT_N || I&lt;br /&gt;
|-&lt;br /&gt;
| 12 || SDA || PD1 || SDA || SDA_M || || I2C-Bus || I/O&lt;br /&gt;
|-&lt;br /&gt;
| 13 || MRESET || || MRESET || MRESET || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 14 || GND || || GND || GND || || ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====I/O-Patchfield_1====&lt;br /&gt;
Dieses 2x 5-polige &amp;quot;Patchfield_1&amp;quot; (SP3: K8), beschriftet mit &amp;quot;I/O&amp;quot; liegt neben dem Wannenstecker I/O und weist dieselbe Belegung auf. Möchte man auf dem Sensor Board Verbindungen über den Wannenstecker I/O zu einer angeschlossenen Microprozessor-Platine herstellen, dann kann man auf das &amp;quot;Patchfield_1&amp;quot; eine Stiftleiste löten.&lt;br /&gt;
Man braucht dazu: &lt;br /&gt;
* 2-reihige Stiftleiste RM 2,54mm (z.B. 2x40-polig [http://www.conrad.de/ce/de/product/741306/Doppelreihige-Stiftleiste-RM-254-gerade-Pole-2-x-40-10120173-BKL-Electronic-Inhalt-1-St 741306]) &lt;br /&gt;
Man trennt von der 2-reihigen Stiftleiste 2x5 Kontakte ab und lötet sie auf die Lötpunkte &amp;quot;I/O&amp;quot;. Zuvor muss man u.U. Lötzinnreste aus den Lötpunkten mit Entlötlitze bzw. Entlötsaugpumpe entfernen.&lt;br /&gt;
&lt;br /&gt;
'''Stecker I/O an M256 IO_PWM/T0/T1:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''M256-Port''' ||'''M256-Funktion''' || '''Sensor Board-Funktion''' || '''Verwendung''' || '''I/O'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || PD4 || ICP1 || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 2 || || GND || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 3 || PD6 || T1 || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 4 || PB7 || OC0A || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 5 || PG5 || OC0B || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 6 || PD7 || T0 || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 7 || PB5 || OC1A || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 8 || PK5 || ADC13 || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 9 || PB6 || OC1B || &amp;quot;PD5&amp;quot; || I2C Bus Buffer Enable || O&lt;br /&gt;
|-&lt;br /&gt;
| 10 || || VDD || || keine ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====ADC-Patchfield_2====&lt;br /&gt;
Dieses 2x 5-polige &amp;quot;Patchfield_2&amp;quot; (SP3: K9), beschriftet mit &amp;quot;ADC&amp;quot; liegt neben dem Wannenstecker ADC und weist dieselbe Belegung auf. Möchte man auf dem Sensor Board Verbindungen über den Wannenstecker ADC zu einer angeschlossenen Microprozessor-Platine herstellen, dann kann man auf das &amp;quot;Patchfield_2&amp;quot; eine Stiftleiste löten.&lt;br /&gt;
Man braucht dazu: &lt;br /&gt;
* 2-reihige Stiftleiste RM 2,54mm (z.B. 2x40-polig [http://www.conrad.de/ce/de/product/741306/Doppelreihige-Stiftleiste-RM-254-gerade-Pole-2-x-40-10120173-BKL-Electronic-Inhalt-1-St 741306]) &lt;br /&gt;
Man trennt von der 2-reihigen Stiftleiste 2x5 Kontakte ab und lötet sie auf die Lötpunkte &amp;quot;ADC&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
'''Stecker ADC an M256 ADC_IO2/CMP:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''M256-Port''' ||'''M256-Funktion''' || '''Sensor Board-Funktion''' || '''Jumper''' || '''Verwendung''' || '''I/O'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || PK0 || ADC8 || || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 2 || || GND || || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 3 || PK1 || ADC9 || &amp;quot;ADC4&amp;quot; || 6 || SHARP hinten || I&lt;br /&gt;
|-&lt;br /&gt;
| 4 || PE3 || OC3A/AIN1 || || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 5 || PK2 || ADC10 || || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 6 || || GND || || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 7 || PK3 || ADC11 || || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 8 || PE2 || XCK0/AIN0 || || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 9 || PK4 || ADC12 || || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 10 || || VDD || || || keine ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Anschluss-Optionen===&lt;br /&gt;
Hier soll beschrieben werden, welche Anschluss-Optionen es für das RP6 Sensor Board gibt. In erster Linie geht es dabei um die Belegung der vorhandenen Stecker bzw. Stiftleisten.&lt;br /&gt;
&lt;br /&gt;
Allgemein kann man Anschlüsse an Stiftleisten mit entsprechenden Steckbuchsen erreichen. Solche Steckbuchsen sind z.B. bei ELV erhältlich:&lt;br /&gt;
* Steckbuchse, 2-polig, RM 2,54mm ([http://www.elv.de/steckbuchse-2-polig.html ELV 68-016635])&lt;br /&gt;
* Steckbuchse, 3-polig, RM 2,54mm ([http://www.elv.de/steckbuchse-3-polig.html ELV 68-022503])&lt;br /&gt;
* Steckbuchse, 5-polig, RM 2,54mm ([http://www.elv.de/steckbuchse-5-polig.html ELV 68-023073])&lt;br /&gt;
Die Crimpkontakte dieser Steckbuchse werden an Litzen angequetscht (oder angelötet) und zum entsprechenden Sensor bzw. Aktor geführt. &lt;br /&gt;
&lt;br /&gt;
====I2C-MODULE====&lt;br /&gt;
Der I2C-MODULE Anschluss (SP1: M1) auf dem Sensor Board besteht aus einer 9-poligen Präzisions-Buchsenleiste RM 2,54mm (z.B. [http://www.conrad.de/ce/de/product/741360/Praezisions-Buchsenleiste-RM-254-gerade-Pole-1-x-20-10120832-BKL-Electronic-Inhalt-1-St 741360]). Wenn man eigene I2C-Module hier anschliessen will, braucht man zur Kontaktierung:&lt;br /&gt;
* Präzisions-Stiftleiste, 9-polig, RM 2,54mm (z.B. [http://www.conrad.de/ce/de/product/741307/Praezisions-Stiftleiste-RM-254-gerade-Pole-1-x-20-10120536-BKL-Electronic-Inhalt-1-St 741307])&lt;br /&gt;
&lt;br /&gt;
'''I2C-MODULE-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''Sensor Board&amp;lt;br/&amp;gt;-Funktion (M1)''' || '''Verwendung''' || '''I/O''' |||| [[RP6_Sensor_Board_und_Xtra_Module#I2C_GPS_Empf.C3.A4nger_JM3-GPS|'''I2C GPS Empfänger]]&amp;lt;br/&amp;gt;-Funktion (K1)'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || VCC || +5V || |||| VCC_1&lt;br /&gt;
|-&lt;br /&gt;
| 2 || SCLOUT || Buffered I2C-Bus || O |||| SCL/SCK&lt;br /&gt;
|-&lt;br /&gt;
| 3 || SDAOUT || Buffered I2C-Bus || I/O |||| SDA/MOSI&lt;br /&gt;
|-&lt;br /&gt;
| 4 || NC || keine || ||||&lt;br /&gt;
|-&lt;br /&gt;
| 5 || I/O1 || Status LED || O ||||&lt;br /&gt;
|-&lt;br /&gt;
| 6 || I/O2 || Taster || I ||||&lt;br /&gt;
|-&lt;br /&gt;
| 7 || NC || keine || ||||&lt;br /&gt;
|-&lt;br /&gt;
| 8 || GND || GND (geschaltet!) || |||| GND&lt;br /&gt;
|-&lt;br /&gt;
| 9 || GND || GND (geschaltet!) || |||| GND&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====CAM_IF====&lt;br /&gt;
Der CAM_IF Anschluss (SP1: K28) ist eine 2x 3-polige Stiftleiste mit der folgenden Belegung:&lt;br /&gt;
&lt;br /&gt;
'''CAM_IF-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''Sensor Board&amp;lt;br/&amp;gt;-Funktion (K28)''' || '''Verwendung''' || '''I/O'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || GND || GND (geschaltet!) ||&lt;br /&gt;
|-&lt;br /&gt;
| 2 || VSS_1 || +7,2..10V (RP6: +UB) ||&lt;br /&gt;
|-&lt;br /&gt;
| 3 || SCLOUT || Buffered I2C-Bus || O&lt;br /&gt;
|-&lt;br /&gt;
| 4 || SDAOUT || Buffered I2C-Bus || I/O&lt;br /&gt;
|-&lt;br /&gt;
| 5 || SCL_M || I2C-Bus || O&lt;br /&gt;
|-&lt;br /&gt;
| 6 || SDA_M || I2C-Bus || I/O&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====IO_EXT====&lt;br /&gt;
Der IO_EXT Anschluss (SP1: K19) ist eine 2x 2-polige Stiftleiste mit der folgenden Belegung:&lt;br /&gt;
&lt;br /&gt;
'''IO_EXT-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''Sensor Board&amp;lt;br/&amp;gt;-Funktion (K19)''' || '''Verwendung''' || '''I/O'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || MAX7311: I/O1.2 || freier I/O Port || I/O&lt;br /&gt;
|-&lt;br /&gt;
| 2 || GND || ||&lt;br /&gt;
|-&lt;br /&gt;
| 3 || MAX7311: I/O1.1 || freier I/O Port || I/O&lt;br /&gt;
|-&lt;br /&gt;
| 4 || GND || ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====PWM_OUT====&lt;br /&gt;
Der PWM_OUT Anschluss (SP5: K12) ist eine 2x 4-polige Stiftleiste mit der folgenden Belegung:&lt;br /&gt;
&lt;br /&gt;
'''PWM_OUT-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''Sensor Board&amp;lt;br/&amp;gt;-Funktion (K12)''' || '''Verwendung''' || '''I/O'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || PCA9685: PWM0 || freier PWM Port || O&lt;br /&gt;
|-&lt;br /&gt;
| 2 || PCA9685: PWM1 || freier PWM Port || O&lt;br /&gt;
|-&lt;br /&gt;
| 3 || PCA9685: PWM2 || freier PWM Port || O&lt;br /&gt;
|-&lt;br /&gt;
| 4 || PCA9685: PWM3 || freier PWM Port || O&lt;br /&gt;
|-&lt;br /&gt;
| 5 || PCA9685: PWM4 || freier PWM Port || O&lt;br /&gt;
|-&lt;br /&gt;
| 6 || PCA9685: PWM5 || freier PWM Port || O&lt;br /&gt;
|-&lt;br /&gt;
| 7 || PCA9685: PWM6 || freier PWM Port || O&lt;br /&gt;
|-&lt;br /&gt;
| 8 || PCA9685: PWM7 || freier PWM Port || O&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====TP1====&lt;br /&gt;
Am Testpunkt TP1 (SP4: TP1) kann man das Signal SQW/INT_N der RTC (DS1339) prüfen/messen.&lt;br /&gt;
&lt;br /&gt;
====LEDs====&lt;br /&gt;
=====Rücklichter=====&lt;br /&gt;
Der Rücklichter Anschluss (SP1: K10) ist eine 2-polige Stiftleiste mit der folgenden Belegung:&lt;br /&gt;
&lt;br /&gt;
'''Rücklichter-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''Sensor Board&amp;lt;br/&amp;gt;-Funktion (K10)''' || '''Verwendung''' || '''I/O'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || TCA6507: P3 || Rücklicht rechts || O&lt;br /&gt;
|-&lt;br /&gt;
| 2 || TCA6507: P4 || Rücklicht links || O&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=====Display-Hintergrundbeleuchtung=====&lt;br /&gt;
Der Display-Hintergrundbeleuchtung Anschluss (SP1: K7) ist eine 2-polige Stiftleiste mit der folgenden Belegung:&lt;br /&gt;
&lt;br /&gt;
'''Display-Hintergrundbeleuchtung-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''Sensor Board&amp;lt;br/&amp;gt;-Funktion (K7)''' || '''Verwendung''' || '''I/O'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || TCA6507: P0 || Display-Hintergrundbeleuchtung || O&lt;br /&gt;
|-&lt;br /&gt;
| 2 || VDD_1 || +5V ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=====Freie Ausgänge=====&lt;br /&gt;
Der freie Ausgang 1 Anschluss (SP1: K4) ist eine 2-polige Stiftleiste mit der folgenden Belegung:&lt;br /&gt;
&lt;br /&gt;
'''Freier Ausgang 1-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''Sensor Board&amp;lt;br/&amp;gt;-Funktion (K4)''' || '''Verwendung''' || '''I/O'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || TCA6507: P1 || freier LED Port || O&lt;br /&gt;
|-&lt;br /&gt;
| 2 || VDD_1 || +5V ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Der freie Ausgang 2 Anschluss (SP1: K2) ist eine 2-polige Stiftleiste mit der folgenden Belegung:&lt;br /&gt;
&lt;br /&gt;
'''Freier Ausgang 2-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''Sensor Board&amp;lt;br/&amp;gt;-Funktion (K2)''' || '''Verwendung''' || '''I/O'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || TCA6507: P2 || freier LED Port || O&lt;br /&gt;
|-&lt;br /&gt;
| 2 || VDD_1 || +5V ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====SHARP Sensoren====&lt;br /&gt;
Das RP6 Sensor Board verfügt über zwei Stecker SHARP_F (SP1: K5) und SHARP_R (SP1: K3) zum Anschluß von analogen SHARP Infrarot-Distanz-Sensoren. Folgende SHARP Sensoren sind anschließbar:&lt;br /&gt;
* 1. SHARP Distanz-Sensor GP2Y0A41SK0F ([http://www.conrad.de/ce/de/product/504596/Distanz-Sensor-GP2Y0A41SK0F-Sharp-GP2Y0A41SK0F-Messbereiche-Erfassungsbereich-4-30-cm-5-VDC 504596]), Messbereich 4..30cm&lt;br /&gt;
* 2. SHARP Distanz-Sensor GP2Y0A21YK0F ([http://www.conrad.de/ce/de/product/504591/Distanz-Sensor-GP2Y0A21YK0F-Sharp-GP2Y0A21YK0F-Messbereiche-Erfassungsbereich-10-80-cm-5-VDC 504591]), Messbereich 10..80cm&lt;br /&gt;
* 3. SHARP Distanz-Sensor GP2Y0A02YK ([http://www.conrad.de/ce/de/product/185364/Distanz-Sensor-GP-2-Y0A-02-YK-Sharp-GP-2-Y0A-02-YK-Messbereiche-Erfassungsbereich-20-150-cm-5-VDC 185364]), Messbereich 20..150cm&lt;br /&gt;
* 4. SHARP Distanz-Sensor GP2Y0A710K0F ([http://www.conrad.de/ce/de/product/504597/Distanz-Sensor-GP2Y0A710K0F-Sharp-GP2Y0A710K0F-Messbereiche-Erfassungsbereich-100-550-cm-5-VDC 504597]), Messbereich 100..550cm&lt;br /&gt;
''Die Auswahl der geeigneten SHARP Sensoren hängt von der gewünschten Funktion ab: Zur Erkundung großer Räume eignet sich insbesondere der Typ 4 mit einer hohen Reichweite von 5,5m. Er ist aber ungeeignet, die Distanz von Objekten zu erkennen, die sich näher als 1m vor dem Sensor befinden. Ein guter Kompromiss zwischen Nahbereichsmessung und &amp;quot;Fernsicht&amp;quot; sind die Typen 2 (10..80cm) und 3 (20..150cm). Will man den Distanz-Sensor vor allem zur Vermeidung eins Sturzes von einer Treppe (Tiefenerkennung) oder nur zur Erkennung von Hindernissen direkt vor dem Roboter (Kollisionserkennung) benutzen, dann eignet sich insbesondere für den vorderen Sensor (SHARP_F) der Typ 1, da er im Nahbereich von 4 bis 30cm messen kann.''&lt;br /&gt;
&lt;br /&gt;
Für die Verbindung zwischen den beiden 3-poligen JST XH Steckern (K3, 5) auf dem Sensor Board und den SHARP-Sensoren braucht man auf der Sensor Board Seite folgende Stecker-/buchsenteile:&lt;br /&gt;
* 2x JST XH Gehäuse, 3-polig, RM 2,5mm ([http://www.conrad.de/ce/de/product/740583/Gehaeuse-RM-25-mm-Serie-XH-Rastermass-25-mm-Pole-3-Nennstrom-3-A-XHP-3-JST-Inhalt-1-St 740583])&lt;br /&gt;
* 6x JST XH Crimpkontakt f. RM 2,5mm ([http://www.conrad.de/ce/de/product/741112/Crimpkontakt-fuer-RM-25-mm-Serie-XH-Rastermass-25-mm-BXH-001T-P06-JST-Inhalt-1-St 741112])&lt;br /&gt;
Die Crimpkontakte dieser Steckbuchse werden an die meist 3-adrige Litze des Sensors angequetscht (oder angelötet). Zur Belegung des Sensor Anschlusses siehe das jeweilige Datenblatt!&lt;br /&gt;
&lt;br /&gt;
=====Vorn=====&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_Sensor_Board_SHARP_F.JPG|RP6 Sensor Board SHARP Sensor vorn|thumb]]&lt;br /&gt;
&lt;br /&gt;
Der vordere SHARP Sensor kann auch mechanisch am Sensor Board befestigt werden. Dazu gibt es an der Vorderkante der Platine zwei Befestigungslöcher.&lt;br /&gt;
&lt;br /&gt;
Das Bild rechts zeigt den SHARP Distanzsensor GP2Y0A02YK montiert vorn auf dem Sensor Board mit zwei M3 Gelenkbolzen ([http://www.conrad.de/ce/de/product/521043/Gelenkbolzen-1-x-Aussengewinde1-x-Innengewinde-Messing-vernickelt-Schluesselweite-55-mm/ 521043]) und passenden Schrauben/Muttern.&lt;br /&gt;
&lt;br /&gt;
'''Vorn-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''RP6v2-Port''' ||'''RP6v2-Funktion''' || '''Sensor Board&amp;lt;br/&amp;gt;-Funktion (K5)''' || '''Verwendung''' || '''I/O''' |||| '''SHARP Sensor&amp;lt;br/&amp;gt;-Funktion''' &lt;br /&gt;
|-&lt;br /&gt;
| 1 || PA0 || ADC0 || &amp;quot;ADC0&amp;quot; || SHARP vorn || I |||| Vo&lt;br /&gt;
|-&lt;br /&gt;
| 2 || || || VDD_1 || +5V || |||| Vcc&lt;br /&gt;
|-&lt;br /&gt;
| 3 || || || GND || GND (geschaltet!) || |||| GND&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=====Hinten=====&lt;br /&gt;
Der hintere SHARP Sensor kann z.B. an der Rückseite des RP6v2 Fahrgestells befestigt werden.&lt;br /&gt;
&lt;br /&gt;
'''Hinten-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''M256-Port''' ||'''M256-Funktion''' || '''Sensor Board&amp;lt;br/&amp;gt;-Funktion (K3)''' || '''Verwendung''' || '''I/O''' |||| '''SHARP Sensor&amp;lt;br/&amp;gt;-Funktion''' &lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| 1 || PK1 || ADC9 || &amp;quot;ADC4&amp;quot; || SHARP hinten || I |||| Vo&lt;br /&gt;
|-&lt;br /&gt;
| 2 || || || VDD_1 || +5V || |||| Vcc&lt;br /&gt;
|-&lt;br /&gt;
| 3 || || || GND || GND (geschaltet!) || |||| GND&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Servos====&lt;br /&gt;
=====Power=====&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_Sensor_Board_Servo-PWR.jpg|RP6 Sensor Board Servo-PWR Stecker|thumb]]&lt;br /&gt;
&lt;br /&gt;
An den SERVO_PWR Stecker (SP5: K1) muss ein Akku zur Stromversorgung der mit dem Sensor Board verbundenen Servos angeschlossen werden. Der Stecker hat folgende Belegung:&lt;br /&gt;
 &lt;br /&gt;
'''SERVO_PWR-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''Sensor Board&amp;lt;br/&amp;gt;-Funktion (K1)''' || '''Verwendung'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || GND_POWER || Servo Power GND&lt;br /&gt;
|-&lt;br /&gt;
| 2 || VSS_POWER || Servo Power Eingang +7,2..10V&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Der Akku zur Versorgung der Servos muss eine Nennspannung von 7,2..10V aufweisen. Der Schaltregler auf dem Sensor Board kann bei einer 5,0V Servo-Spannung Ströme bis 3,0A (Spitzen bis 5,0A) liefern. '''Die Polung des Akkus darf am Stecker SERVO_PWR nicht vertauscht werden.''' Siehe den oberen Teil der nebenstehende Abbildung! Ratsam ist es, eine Sicherung 3,15A in die Plusleitung zwischen Akku und SERVO_PWR Stecker zu legen.&lt;br /&gt;
&lt;br /&gt;
Für die Verbindung zwischen dem 2-poligen JST XH Stecker (SERVO_PWR, K1) auf dem Sensor Board und dem Akku braucht man auf der Sensor Board Seite folgende Stecker-/buchsenteile:&lt;br /&gt;
* JST XH Gehäuse, 2-polig, RM 2,5mm ([http://www.conrad.de/ce/de/product/740549/Gehaeuse-RM-25-mm-Serie-XH-Rastermass-25-mm-Pole-2-Nennstrom-3-A-XHP-2-JST-Inhalt-1-St 740549])&lt;br /&gt;
* 2x JST XH Crimpkontakt f. RM 2,5mm ([http://www.conrad.de/ce/de/product/741112/Crimpkontakt-fuer-RM-25-mm-Serie-XH-Rastermass-25-mm-BXH-001T-P06-JST-Inhalt-1-St 741112])&lt;br /&gt;
Die Crimpkontakte dieser Steckbuchse werden an die 2-adrige Litze zum Akku angequetscht (oder angelötet).&lt;br /&gt;
&lt;br /&gt;
Wenn man keinen separaten Akku zur Versorgung der Servos nehmen will, kann man auch +UB der RP6v2 Base dafür nutzen. An +UB liegt die Akkuspannung der Base (Nennspannung 7,2V) über eine Sicherung F1 3,15A (RP6v2) bzw. 2,5A (RP6) auf dem Mainboard an. +UB kann man z.B. am [[RP6#EXT_Anschlu.C3.9F|EXT Anschluß der Base]] entnehmen. Die nebenstehende Abbildung zeigt im unteren Teil, an welchen Pins man dort +UB kontaktieren kann!&lt;br /&gt;
&lt;br /&gt;
Dabei ist zu beachten, dass die Sicherung F1 auf dem RP6(v2) Mainboard den nutzbaren Strom für die Servos deutlich begrenzt: Durch diese Sicherung fließt ja nicht nur der Servo-Strom, sondern auch der Strom für den RP6 und alle darauf montierten Zusatzplatinen. Wenn der RP6 also herumfährt und z.B. noch die IRCOMM-Sendedioden nutzt, bleibt kaum noch Stromreserve für die Servos auf dem Sensor Board übrig.&lt;br /&gt;
'''Das bedeutet: Man sollte unbedingt einen separaten Akku für die Servos auf dem Sensor Board benutzen!'''&lt;br /&gt;
&lt;br /&gt;
======SERVO_PWR-EXT Verbindung======&lt;br /&gt;
Für die Verbindung zwischen dem 2-poligen JST XH Stecker (SERVO_PWR, K1) auf dem Sensor Board und dem 8-poligen JST XH Stecker (EXT) auf dem RP6v2 Mainboard braucht man folgende Stecker-/buchsenteile:&lt;br /&gt;
* JST XH Gehäuse, 2-polig, RM 2,5mm ([http://www.conrad.de/ce/de/product/740549/Gehaeuse-RM-25-mm-Serie-XH-Rastermass-25-mm-Pole-2-Nennstrom-3-A-XHP-2-JST-Inhalt-1-St 740549])&lt;br /&gt;
* JST XH Gehäuse, 8-polig, RM 2,5mm ([http://www.conrad.de/ce/de/product/740928/Gehaeuse-RM-25-mm-Serie-XH-Rastermass-25-mm-Pole-8-Nennstrom-3-A-XHP-8-JST-Inhalt-1-St 740928])&lt;br /&gt;
* 10x JST XH Crimpkontakt f. RM 2,5mm ([http://www.conrad.de/ce/de/product/741112/Crimpkontakt-fuer-RM-25-mm-Serie-XH-Rastermass-25-mm-BXH-001T-P06-JST-Inhalt-1-St 741112])&lt;br /&gt;
Mit einer 2-adrigen Litze, die beidseits mit den Crimpkontakten verquetscht (oder verlötet) wird, verbindet man dann den SERVO_PWR Stecker mit dem EXT Stecker, wie in der Abbildung oben gezeigt. ''Achtung: Plus (+) und Minus (-) nicht vertauschen!''&lt;br /&gt;
 Ein passendes Kabel soll zukünftig (*) mitgeliefert werden.&lt;br /&gt;
&lt;br /&gt;
Auf dem RP6 Mainboard ist der 8-polige EXT Stecker noch nicht bestückt. Wenn man ihn nachrüsten will, muss man noch bestellen:&lt;br /&gt;
* JST XH Stiftleiste gerade, 8-polig, RM 2,5mm ([http://www.conrad.de/ce/de/product/740105/Stiftleiste-gerade-RM-25-mm-Serie-XH-Rastermass-25-mm-Pole-8-Nennstrom-3-A-B8B-XH-A-LFSN-JST-Inhalt-1-St 740105])&lt;br /&gt;
Die Stiftleiste wird auf das RP6 Mainboard gelötet, dabei weisen die beiden Einkerbungen an einer Längsseite der Stiftleiste nach hinten zum Rand des Mainboards.&lt;br /&gt;
 Auch diese Stiftleiste soll zukünftig (*) zum Lieferumfang gehören.&lt;br /&gt;
'''Zu *)''' Meinem RP6 Sensor Board (bestellt am 1.3.2014) lag das konfektionierte Kabel und die Stiftleiste noch nicht bei!&lt;br /&gt;
&lt;br /&gt;
=====Stecker=====&lt;br /&gt;
An die acht 3-poligen Stiftleisten SERVO_1 bis SERVO_8 (SP5: K6, 11, 29..34) können Servos angeschlossen werden. Direkt aufstecken kann man Servo-Steckbuchsen mit der Belegung von CONRAD, Graupner/JR und Robbe/Futaba (Versorgungsspannung Plus am mittleren Pin). Auf der Sensor Board Platine kann man den Pin 3 (Servo Power GND) der 3-poligen Stiftleisten daran erkennen, dass er näher zum rechten Platinenrand (Seite mit dem XBUS Stecker) angeordnet ist als der zugehörige Pin 1 (Servo Signal).&lt;br /&gt;
&lt;br /&gt;
Wenn Servos mit nicht passender Steckbuchse angeschlossen werden sollen, dann braucht man auf der Sensor Board Seite folgende Stecker-/buchsenteile für jedes Servo:&lt;br /&gt;
* Steckbuchse, 3-polig, RM 2,54mm ([http://www.elv.de/steckbuchse-3-polig.html ELV 68-022503])&lt;br /&gt;
Die Crimpkontakte dieser Steckbuchse werden an die 3-adrige Litze des Servos angequetscht (oder angelötet). &lt;br /&gt;
&lt;br /&gt;
'''SERVO_1..8-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''Sensor Board&amp;lt;br/&amp;gt;-Funktion (K6,11,29..34)''' || '''Verwendung''' || '''I/O''' |||| '''Servo-&amp;lt;br/&amp;gt;Kabelfarben'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || PCA9685: PWM15..8 || Servo Signal || O |||| Weiß, Orange&lt;br /&gt;
|-&lt;br /&gt;
| 2 || Servo_PWR || Servo Power +5V (geschaltet!) || |||| Rot&lt;br /&gt;
|-&lt;br /&gt;
| 3 || GND_POWER || Servo Power GND || |||| Schwarz, Braun&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Roboterarm RA2-HOBBY====&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_Sensor_Board_RA2-MINI.JPG|RP6 Sensor Board mit Roboterarm RA2-MINI|thumb]]&lt;br /&gt;
&lt;br /&gt;
In der Anleitung zum RP6 Sensor Board ist der Arexx Roboterarm RA2-HOBBY bzw. RA2-MINI [http://www.conrad.de/ce/de/product/191534/Arexx-Mini-Roboterarm-RA2-MINI (191534)] abgebildet. Er ist dort ohne Grundgestell und Controller-Platine auf dem Sensor Board befestigt.&lt;br /&gt;
Das Sensor Board eignet sich sehr gut zur Ansteuerung der 6 Servos des Roboterarms.&lt;br /&gt;
&lt;br /&gt;
Zur Montage des RA2-MINI auf dem Sensor Board geht man so vor:&lt;br /&gt;
* Lösen der 4 Rundkopfschrauben M3x6, die die Servobodenplatte mit den Abstandbolzen M3x30 auf der Controller-Platine verbinden (siehe Anleitung zum RA2-MINI, Seite 19!)&lt;br /&gt;
* Lösen der Servobodenplatte vom Bodenservo (siehe Anleitung zum RA2-MINI, Seite 8!)&lt;br /&gt;
* Bohren der Befestigungslöcher in die Servobodenplatte:&lt;br /&gt;
** Rechts-Links Lochabstand 4,75cm, Vorn-Hinten Lochabstand 4,1cm&lt;br /&gt;
** Ungefähre Lage der Löcher siehe Abbildung in der Anleitung zum Sensor Board, Seite 4!&lt;br /&gt;
** Markierung der Bohrlöcher auf der Rückseite der Servobodenplatte:&lt;br /&gt;
*** 1. Mit einer Hilfslinie die Hinterkante des Servoausschnitts (das ist die kürzere Kante, die näher am Rand der Bodenplatte liegt!) nach beiden Seiten verlängern&lt;br /&gt;
*** 2. Eine 2. Hilfslinie parallel zur ersten im Abstand von 1,4cm zur Mitte der Servobodenplatte hin einzeichnen&lt;br /&gt;
*** 3. Auf dieser Linie jetzt die beiden hinteren Bohrlöcher symmetrisch im Abstand von 4,75cm markieren&lt;br /&gt;
*** 4. Für die vorderen Bohrlöcher eine 3. Hilfslinie im Abstand von 4,1cm parallel zur 2. Linie einzeichnen&lt;br /&gt;
*** 5. Auf dieser Linie die beiden vorderen Bohrlöcher symmetrisch im Abstand von 4,75cm markieren&lt;br /&gt;
*** 6. Kontrolle: Die 4 markierten Bohrlochpositionen bilden ein Rechteck mit 4,1cm seitlicher und 4,75cm vorderer/hinterer Kantenlänge&lt;br /&gt;
** Bohren der 4 Löcher (D = 3,2mm) in die Servobodenplatte&lt;br /&gt;
* Befestigen des Bodenservos auf der Servobodenplatte (siehe Anleitung zum RA2-MINI, Seite 8!)&lt;br /&gt;
* Anbringen des Roboterarms auf dem Sensor Board mit 4 Abstandbolzen M3 (L = 30..50mm) und passenden Schrauben/Muttern&lt;br /&gt;
&lt;br /&gt;
Die Servo-Steckbuchsen werden dann ''in der selben Reihenfolge (S1..S6) wie vorher auf der Controller-Platine des Roboterarms'' auf die Stiftleisten SERVO_1 bis SERVO_6 des Sensor Boards gesteckt.&lt;br /&gt;
'''Man sollte unbedingt einen separaten Akku für die Servos auf dem Sensor Board benutzen!'''&lt;br /&gt;
&lt;br /&gt;
====Grafik-Display====&lt;br /&gt;
Ob es mal ein Grafik-Display für das RP6 Sensor Board geben wird, ist ''pure Spekulation''. Allerdings gibt es drei Hinweise darauf, dass eine solche Hardware-Ergänzung kommen könnte:&lt;br /&gt;
* 1. Der vorbereitete Anschluss für eine [[RP6_Sensor_Board_und_Xtra_Module#Display-Hintergrundbeleuchtung|Display-Hintergrundbeleuchtung]]&lt;br /&gt;
* 2. Die 4 Befestigungslöcher in der Mitte des Sensor Boards&lt;br /&gt;
* 3. Eine Abbildung '''Grafik-Display 128x64''' bei JM3-Engeneering (siehe [[RP6_Sensor_Board_und_Xtra_Module#Weblinks|Weblinks]]!)&lt;br /&gt;
Wir werden sehen ...&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==RP6 Xtra Module==&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_Xtra_module.JPG|RP6 Xtra module|right|500px]]&lt;br /&gt;
&lt;br /&gt;
Von den '''AREXX RP6 Xtra Modulen''' sind bei [http://www.conrad.de/ce/ CONRAD] für den RP6v2 erhältlich:&lt;br /&gt;
* Arexx [[RP6_Sensor_Board_und_Xtra_Module#I2C_GPS_Empf.C3.A4nger_JM3-GPS|I2C GPS Empfänger JM3-GPS]] ([http://www.conrad.de/ce/de/product/1082385/Arexx-IC-GPS-Empfaenger-JM3-GPS 1082385])&lt;br /&gt;
* Arexx [[RP6_Sensor_Board_und_Xtra_Module#Gyro_Modul_JM3-GYRO|Gyro Modul JM3-GYRO]] ([http://www.conrad.de/ce/de/product/1082386/Arexx-Gyro-Modul-JM3-GYRO 1082386])&lt;br /&gt;
* Arexx [[RP6_Sensor_Board_und_Xtra_Module#3D_Accelerometer_Modul_JM3-3DA|3D Accelerometer Modul JM3-3DA]] ([http://www.conrad.de/ce/de/product/1082387/Arexx-3D-Accelerometer-Modul-JM3-3DA 1082387])&lt;br /&gt;
&lt;br /&gt;
===I2C GPS Empfänger JM3-GPS===&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_I2C_GPS_Empfänger.JPG|RP6 I2C GPS Empfänger|right|400px]]&lt;br /&gt;
&lt;br /&gt;
(Laut Online-Katalog der Firma CONRAD!)&lt;br /&gt;
&lt;br /&gt;
''&amp;quot;Universelles GPS-I²C-Bus Modul für RP6 Roboter. Der GPS Empfänger stellt die NMEA-0183 Datensätze GGA, RMC, GSA und VTG in den veschiedenen Registern zur Verfügung. Damit ist eine einfache Weiterverarbeitung möglich.&amp;quot;''&lt;br /&gt;
&lt;br /&gt;
====Beschreibung====&lt;br /&gt;
Der I2C GPS Empfänger ist eine kleine (38 x 23 mm) Zusatzplatine (RP6 Xtra Modul), die direkt auf das [[RP6_Sensor_Board_und_Xtra_Module#RP6_Sensor_Board_2|RP6 Sensor Board]] aufgesteckt werden kann. Sie kann aber auch überall eingesetzt werden, wo eine stabilisierte 5V Versorgungsspannung und ein 5V-I2C-Bus bis 400 kHz zur Verfügung steht.&lt;br /&gt;
&lt;br /&gt;
Die Platine ist bestückt mit dem &amp;quot;Fastrax GPS antenna module&amp;quot; [https://www.u-blox.com/de/positioning-antennas/gnss-antenna-modules/uc530.html UC530]. Als Backup-Batterie dient eine wieder aufladbare Lithium-Batterie ([http://www.farnell.com/datasheets/321180.pdf MS621FE]). Zur Kommunikation zwischen dem UC530 und dem I2C-Bus ist ein [http://www.atmel.com/Images/Atmel-8303-8-bit-AVR-Microcontroller-tinyAVR-ATtiny1634_Datasheet.pdf ATtiny1634] an Bord, der auch die Auswertung des [http://de.wikipedia.org/wiki/NMEA_0183 NMEA Protokolls] übernimmt. Die 3,3 V Versorgungsspannung wird auf der Platine durch einen Spannungsregler ([http://www.mouser.com/ds/2/405/lm3480-316799.pdf LM3480IM3-3.3]) erzeugt. Über den I2C-Bus können folgende Daten der NMEA-0183 Datensätze GGA, RMC, GSA und VTG auf einfache Weise gelesen werden:&lt;br /&gt;
&lt;br /&gt;
* Geograf. Breite&lt;br /&gt;
* Geograf. Länge&lt;br /&gt;
* GPS Status&lt;br /&gt;
* HDOP&lt;br /&gt;
* Satellitenzahl&lt;br /&gt;
* Kurs&lt;br /&gt;
* Geschwindigkeit&lt;br /&gt;
* Höhe&lt;br /&gt;
* UTC-Zeit&lt;br /&gt;
* Datum&lt;br /&gt;
* PDOP&lt;br /&gt;
* VDOP&lt;br /&gt;
* Satellit 1..12&lt;br /&gt;
&lt;br /&gt;
Der ATtiny1634 ist natürlich vorprogrammiert, kann aber über eine vorbereitete 6-polige ISP-Schnittstelle auf der Platine auch umprogrammiert werden.&lt;br /&gt;
&lt;br /&gt;
'''Lieferumfang'''&lt;br /&gt;
* I2C GPS Empfänger&lt;br /&gt;
* CD mit Anleitung und Software-Beispielen.&lt;br /&gt;
&lt;br /&gt;
====Technische Daten====&lt;br /&gt;
* Versorgungsspannung: 5,0 V +/- 5%&lt;br /&gt;
* Stromverbrauch: &amp;lt;= 20 mA (typ.)&lt;br /&gt;
* I2C-Bus Geschwindigkeit: &amp;lt;= 400 kHz&lt;br /&gt;
* GPS Antenne: eingebaut&lt;br /&gt;
* Backup Batterie: Lithium, im Betrieb wieder aufladbar&lt;br /&gt;
* Temperatur Bereich: -10 bis 65 °C&lt;br /&gt;
* Form Faktor: 38 x 23 mm&lt;br /&gt;
* Gewicht: ca. 6 g&lt;br /&gt;
* Empfänger Spezifikationen (UC530):&lt;br /&gt;
** Empfänger: GPS L1 C/A-Code, SPS&lt;br /&gt;
** Kanäle: 66/22 (Suche/Track)&lt;br /&gt;
** Tracking Empfindlichkeit: -165 dBm typ.&lt;br /&gt;
** Navigations Empfindlichkeit: -148 dbm typ (Kaltstart)&lt;br /&gt;
** Update Rate: 1 Sek.&lt;br /&gt;
** Positions Genauigkeit:&lt;br /&gt;
*** 3,0m (67%) typ. horizontal&lt;br /&gt;
*** 5,0m (67%) typ. vertikal&lt;br /&gt;
*** 0,02 m/s (50%) typ. Geschwindigkeit&lt;br /&gt;
** Zeit bis zum ersten Fix: typ. 31 Sek.&lt;br /&gt;
** Protokoll: NMEA-0183 Rev. 3.01&lt;br /&gt;
&lt;br /&gt;
====Anschluss-Schema====&lt;br /&gt;
Belegung des 9-poligen Anschluss-Steckers (K1) siehe in [[RP6_Sensor_Board_und_Xtra_Module#I2C-MODULE|dieser]] Tabelle!&lt;br /&gt;
&lt;br /&gt;
====Umbau-Optionen====&lt;br /&gt;
Wenn man den ATtiny1634 selbst programmieren will, muss man Stiftleisten auf die Platine löten.&lt;br /&gt;
&lt;br /&gt;
Man braucht dazu: &lt;br /&gt;
* 2-reihige Stiftleiste RM 2,54mm (z.B. 2x40-polig 741306) &lt;br /&gt;
&lt;br /&gt;
Man trennt von der 2-reihigen Stiftleiste 2x3 Kontakte ab und lötet sie auf die Punkte &amp;quot;ISP6&amp;quot;.&lt;br /&gt;
Mit einem ISP-Programmer kann dann eine neue Firmware geflasht werden. Die aktuelle Firmware des ATtiny1634 (Version 1.2) wird als .HEX mitgeliefert, leider ohne Source-Code.&lt;br /&gt;
&lt;br /&gt;
Vorsicht: Dabei kann der Prozessor im schlimmsten Fall nicht mehr ansprechbar sein oder der GPS Empfänger UC530 beschädigt werden. Man sollte diesen Umbau und die ISP-Programmierung nur machen, wenn man genau weiß, was man macht! &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Gyro Modul JM3-GYRO===&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_Gyro_Modul.JPG|RP6 Gyro Modul|right|200px]]&lt;br /&gt;
&lt;br /&gt;
(Laut Online-Katalog der Firma CONRAD!)&lt;br /&gt;
&lt;br /&gt;
''&amp;quot;Das universelle Gyro-Sensor Modul für RP6, RP6 V2, RP6 ATMEGA32 und das RP6 V2 Control M256 Wifi-Kit ist ideal zur Erkennung der Blockierung des Roboters in seiner Drehbewegung, sowie der Stabilisierung der Geradeausfahrt.&amp;quot;''&lt;br /&gt;
&lt;br /&gt;
====Beschreibung====&lt;br /&gt;
Das Gyro Modul ist eine kleine (19 x 17 mm) Zusatzplatine (RP6 Xtra Modul), die im RP6-System genutzt werden kann. Es gibt zwar keinen direkt passenden &amp;quot;Steckplatz&amp;quot; auf einer der Microcontroller-Plattformen (RP6v2, M32, M128, M256 Wifi), jedoch ist der Anschluß einfach:&lt;br /&gt;
Benötigt werden +5V und GND, sowie ein freier ADC-Kanal, der bis 5V messen kann. Damit kann das Gyro Modul sehr universell eingesetzt werden. Es misst die Drehrate um die Z-Achse (Hochachse oder Yaw).&lt;br /&gt;
&lt;br /&gt;
Die Platine ist bestückt mit dem analogen Gyro-Sensor [http://www.st.com/web/en/resource/technical/document/datasheet/CD00254111.pdf LY330ALH], dessen Ausgangsspannung durch zwei OP-Amps ([http://www.ti.com.cn/cn/lit/ds/symlink/lm321.pdf LM321], [http://www.produktinfo.conrad.com/datenblaetter/00000-24999/001072615-da-01-en-IC_AMP_PREC_LMP7731MF_NOPB_SOT_23_5_TID.pdf LMP7731MF]) in Ruhe bei 2,5 V liegt. Höhere Ausgangsspannungen (bis 5 V) bedeuten eine Drehgeschwindigkeit nach LINKS, niedrigere (bis 0 V) eine Drehgeschwindigkeit nach RECHTS. Die 3,3 V Versorgungsspannung des LY330ALH wird auf der Platine durch einen Spannungsregler ([http://www.mouser.com/ds/2/405/lm3480-316799.pdf LM3480IM3-3.3]) erzeugt.&lt;br /&gt;
&lt;br /&gt;
'''Lieferumfang'''&lt;br /&gt;
* Gyro Modul&lt;br /&gt;
* CD mit Anleitung und Software-Beispielen.&lt;br /&gt;
&lt;br /&gt;
====Technische Daten====&lt;br /&gt;
&lt;br /&gt;
* VDD: 5,0 V +/- 5%&lt;br /&gt;
* Vout(0): 2,5 V +/- 2% (ohne Bewegung)&lt;br /&gt;
* Vout: Vout(0) + 10mV / dps +/- 2%&lt;br /&gt;
* Messbereich: ca. 200 dps max.&lt;br /&gt;
&lt;br /&gt;
====Anschluss-Schema====&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_Gyro_Modul_SP.JPG|RP6 Gyro Modul - Anschluss-Schema]]&lt;br /&gt;
&lt;br /&gt;
====Umbau-Optionen====&lt;br /&gt;
Am Gyro Modul gibt es nichts umzubauen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===3D Accelerometer Modul JM3-3DA===&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_3D_Accelerometer_Modul.JPG|RP6 3D Accelerometer Modul|right|105px]]&lt;br /&gt;
&lt;br /&gt;
(Laut Online-Katalog der Firma CONRAD!)&lt;br /&gt;
&lt;br /&gt;
''&amp;quot;Universeller 3-Achsen Beschleunigungssensor für RP6, RP6 V2, RP6 ATMEGA32 und das RP6 V2 Control M256 WIFI-Kit. Ideal zur Winkelmessung (Neigung-, Kipp-Winkel) und vieles mehr.&amp;quot;''&lt;br /&gt;
&lt;br /&gt;
====Beschreibung====&lt;br /&gt;
&lt;br /&gt;
Das 3D Accelerometer Modul ist eine kleine (15 x 10 mm) Zusatzplatine (RP6 Xtra Modul), die direkt auf den EEPROM-Sockel (IC5) der Zusatzplatine [[RP6#RP6_CONTROL_M32_Platine|RP6 CONTROL M32]] gesteckt und über den SPI-Bus angesteuert werden kann. Das Accelerometer Modul kann aber auch mit allen Microcontroller-Plattformen betrieben werden, die eine stabilisierte 5V-Versorgungsspannung und einen SPI- oder I2C-Bus bieten.&lt;br /&gt;
&lt;br /&gt;
Die Platine ist bestückt mit dem 3D Beschleunigungs-Sensor [http://www.farnell.com/datasheets/1691680.pdf LIS302DLH]. Die 3,3 V Versorgungsspannung des LIS302DLH wird auf der Platine durch einen Spannungsregler ([http://www.mouser.com/ds/2/405/lm3480-316799.pdf LM3480IM3-3.3]) erzeugt.&lt;br /&gt;
&lt;br /&gt;
'''Lieferumfang'''&lt;br /&gt;
* 3D Accelerometer Modul&lt;br /&gt;
* CD mit Anleitung und Software-Beispielen.&lt;br /&gt;
&lt;br /&gt;
====Technische Daten====&lt;br /&gt;
&lt;br /&gt;
* VDD: 5,0 V +/- 5%&lt;br /&gt;
* Messbereiche: +-2 g, +-4 g, +-8 g&lt;br /&gt;
* Datenausgabe: 16 Bit&lt;br /&gt;
* Schnittstellen: I2C, SPI&lt;br /&gt;
&lt;br /&gt;
====Anschluss-Schema====&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_3D_Accelerometer_Modul_SP.JPG|RP6 3D Accelerometer Modul - Anschluss-Schema|350px]]&lt;br /&gt;
&lt;br /&gt;
====Umbau-Optionen====&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_3D_Accelerometer_Modul_M32.JPG|RP6 3D Accelerometer Modul auf der M32|right|500px]]&lt;br /&gt;
&lt;br /&gt;
'''Will man das Modul auf der M32 einsetzen, muss man auf dem 3D Accelerometer Modul die Widerstände R2 und R3 (falls vorhanden!) auslöten (siehe Anleitung zum Modul, Seiten 4/5!)''' und einen IC-Sockel an Position IC5 und einen Kondensator an Position C19 auf der M32 einlöten, siehe [[RP6#Zweites_SPI-EEPROM|hier]]!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die Abbildung rechts zeigt das 3D Accelerometer Modul auf der M32.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Programmierung==&lt;br /&gt;
In diesem Abschnitt geht es um die Programmierung der Sensoren und Aktoren auf dem [[RP6_Sensor_Board_und_Xtra_Module#RP6_Sensor_Board_3|RP6 Sensor Board]] und auf den [[RP6_Sensor_Board_und_Xtra_Module#RP6_Xtra_Module_3|Xtra Modulen]]. Die hier veröffentlichte Software baut NICHT auf die mitgelieferten C++ Software-Beispiele auf der ''&amp;quot;RP6 Robot System Xtra Modules CD-ROM&amp;quot;'' auf, sondern basiert auf Eigenentwicklungen in GCC.&lt;br /&gt;
&lt;br /&gt;
===RP6 Sensor Board===&lt;br /&gt;
Das RP6 Sensor Board RP6-JM03-61 verfügt nicht über einen eigenen Microprozessor. Daher geht es hier eigentlich nicht um die Programmierung des Sensor Boards, sondern um die Programmierung der Microcontroller-Plattform, an die das Sensor Board angeschlossen ist. In der Regel wird das die RP6 M256 WiFi Zusatzplatine sein, aber auch die RP6v2 Base steuert (als I2C-Slave) in der vorgesehenen Konfiguration gewisse Funktionen des Sensor Boards an.&lt;br /&gt;
Prinzipiell kann das Sensor Board aber auch an der RP6 CONTROL M32 (''passende Library auf Anfrage beim Autor!'') oder der RP6 CCPRO M128 Zusatzplatine betrieben werden.&lt;br /&gt;
&lt;br /&gt;
====Dokumentation====&lt;br /&gt;
Die Dokumentation zum RP6 Sensor Board befindet sich auf der mitgelieferten ''&amp;quot;RP6 Robot System Xtra Modules CD-ROM&amp;quot;''.&lt;br /&gt;
&lt;br /&gt;
=====Manuals=====&lt;br /&gt;
Das Handbuch kann auch [http://www.produktinfo.conrad.com/datenblaetter/00000-24999/001082384-an-01-de-RP6_SENSOR_BOARD.pdf hier] eingesehen werden.&lt;br /&gt;
 ACHTUNG: Das Manual enthält aktuell noch teils irreführende Beschreibungen!&lt;br /&gt;
&lt;br /&gt;
=====Schematics=====&lt;br /&gt;
=====Datasheets=====&lt;br /&gt;
&lt;br /&gt;
====Demo-Programmme====&lt;br /&gt;
Demo-Programme zum RP6 Sensor Board befinden sich auf der mitgelieferten ''&amp;quot;RP6 Robot System Xtra Modules CD-ROM&amp;quot;''.&lt;br /&gt;
&lt;br /&gt;
====RP6 M256 WiFi: Sensor Board Library====&lt;br /&gt;
Die nachfolgende RP6M256_Sensor_BoardLib (GCC) dient zur Ansteuerung des Sensor Boards durch die RP6M256 WiFi.&lt;br /&gt;
&lt;br /&gt;
=====Configuration Header=====&lt;br /&gt;
Vor dem Kompilieren der Library muss eine Anpassung des Configuration Headers an die eigenen Hardware-Voraussetzungen erfolgen.&lt;br /&gt;
Dazu gibt es im Configuration Header eine Definition:&lt;br /&gt;
* USE_PD5 -&amp;gt; Die Sensor Board Funktion &amp;quot;PD5&amp;quot; steuert den TCA4311A Enable Pin (EN).&lt;br /&gt;
Im nachfolgenden Listing ist die Definition USE_PD5 NICHT aktiv (d.h. der TCA4311A Enable Pin (EN) wird vom MAX7311 I/O 1.0 Pin angesteuert!). Dies muss an die eigene Hardware angepaßt werden. Wenn &amp;quot;PD5&amp;quot; den TCA4311A Enable Pin (EN) steuern soll, muss die Zeile mit &amp;quot;USE_PD5&amp;quot; &amp;quot;aktiviert&amp;quot; werden. Dazu entfernt man &amp;quot;//&amp;quot; am Zeilenanfang:&lt;br /&gt;
 #define USE_PD5&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Bevor man Beschleunigungs-, Magnetfeldsensor und Gyroskop nutzen kann, muss man sie kalibrieren:&lt;br /&gt;
&lt;br /&gt;
* '''Accelerometer:'''&lt;br /&gt;
** Die X-Achse wird kalibriert, indem man den RP6 mit der rechten Seite nach unten hält und den Maximalwert in MAX_X_A einträgt. Dann neigt man ihn auf seine linke Seite und trägt den negativen Maximalwert in MIN_X_A ein.&lt;br /&gt;
** Die Y-Achse wird kalibriert, indem man den RP6 mit der Vorderseite nach oben hält und den Maximalwert in MAX_Y_A einträgt. Dann kippt man die Vorderseite nach unten und trägt den negativen Maximalwert in MIN_Y_A ein.&lt;br /&gt;
** Die Z-Achse wird kalibriert, indem man den RP6 normal waagerecht hält und den Maximalwert in MAX_Z_A einträgt. Dann dreht man den RP6 &amp;quot;auf den Kopf&amp;quot; und trägt den negativen Maximalwert in MIN_Z_A ein.&lt;br /&gt;
** Sollten die angezeigten Pitch- und Roll-Werte nach der Kalibrierung der Achsen und genau waagerecht stehendem Sensor bzw. RP6 vom Nullwert deutlich abweichen, kann man sie mithilfe der Definitionen OFFSET_PITCH_A und OFFSET_ROLL_A &amp;quot;nullen&amp;quot;. Die Einheit dieser Definitionen ist °.&lt;br /&gt;
 ''HINWEIS: Die internen Berechnungen werden durch diese Offset-Korrektur&lt;br /&gt;
 NICHT beeinflußt. Die Offset-Werte können also nicht dazu benutzt werden,&lt;br /&gt;
 eine Achsenabweichung zwischen Sensor und RP6 zu kompensieren!''&lt;br /&gt;
* '''Magnetometer:'''&lt;br /&gt;
** Zur Kalibrierung des Magnetfeldsensors stellt man den RP6 auf eine waagerechte Fläche. Es dürfen keine Elektrogeräte, Metallteile und stromführende Leitungen in der Nähe sein, die das Magnetfeld verändern können.&lt;br /&gt;
** Zunächst ist es möglich, die sogenannten &amp;quot;hard iron&amp;quot; Effekte auszugleichen. Dies sind feste Magnetfeldabweichungen, die durch das &amp;quot;Gerät&amp;quot; (in unserem Fall also durch den kompletten RP6) verursacht werden, in oder auf dem der Sensor angebracht ist. Mit den Definitionen OFFSET_X_M, OFFSET_Y_M und OFFSET_Z_M können diese Effekte ausgeglichen werden. Diese Kalibrierung wird hier aktuell (noch) nicht beschrieben, so dass man die Werte für diese Definitionen zunächst bei 0 belassen sollte.&lt;br /&gt;
** Die X-Achse und Y-Achse wird kalibriert, indem man den RP6 langsam mehrfach um die eigene (Z-)Achse dreht und die Maximalwerte in MAX_X_M und MAX_Y_M einträgt. Die negativen Maximalwerte trägt man in MIN_X_M und MIN_Y_M ein.&lt;br /&gt;
** Die Z-Achse wird kalibriert, indem man den RP6 auf die rechte oder linke Seite legt, ihn dann langsam mehrfach auf der Stelle (um seine Y-Achse) dreht und den Maximalwert in MAX_Z_M und den negativen Maximalwert in MIN_Z_M einträgt.&lt;br /&gt;
** Mit der Definition DECLINATION_M kann man zur Verbesserung der Genauigkeit der Richtungsangaben den magnetischen Deklinationswert [°] (d.h. die magnetische Missweisung) am aktuellen Standort festlegen. [http://www.ngdc.noaa.gov/geomag-web/#declination Hier] befindet sich ein &amp;quot;Deklinations-Rechner&amp;quot;, mit dem man den Deklinationswert für den eigenen Standort ermitteln kann. &lt;br /&gt;
** Wenn man den Temperaturwert des LSM303DLHC nutzen will, muss man die Definition GET_TEMP_M aktivieren (Standard!). Den Temperaturwert kann man noch eichen, indem man die Definition OFFSET_TEMP_M anpasst. Die Einheit von OFFSET_TEMP_M ist °C.&lt;br /&gt;
* '''Gyroskop:'''&lt;br /&gt;
** In Ruhelage des RP6 wird ein ADC-Wert von ca. 511 angezeigt, wenn die Definition ADCVAL_ZERORATE_LEVEL im Configuration Header (RP6M256_Sensor_Board.h) vor der ersten Kompilierung zunächst auf 0 gesetzt wurde. Die Kalibrierung des Gyroskops ist abgeschlossen, nachdem man den in Ruhelage angezeigten ADC-Wert als ADCVAL_ZERORATE_LEVEL eingetragen hat.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''HINWEISE ZUR KALIBRIERUNG:'''&lt;br /&gt;
* Das Demo-Programm ist nicht sehr gut geeignet, um die Kalibrierungen durchzuführen.&lt;br /&gt;
* Man sollte mit einem eigenen kurzen ''Kalibrierungs-Programm'' nur die Rohwerte der jeweiligen X-, Y- und Z-Achse z.B. zweimal pro Sekunde ausgeben.&lt;br /&gt;
* Die Rohwerte sind in Variablen x_axis..., y_axis..., z_axis... enthalten. Da die Rohwerte in den Funktionen normalizeLSM303DLHC_A() bzw. normalizeLSM303DLHC_M() ggf. verändert werden, müssen die Rohwerte VOR Durchlaufen dieser Funktionen ausgegeben werden.&lt;br /&gt;
* '''Ohne eine sorgfältige Kalibrierung wird die Kompass-Funktion (insbesondere die neigungskompensierte Ausgabe der Himmelsrichtung) nicht funktionieren!'''&lt;br /&gt;
* Nach dem Eintragen der Kalibrierungs-Werte in den Configuration Header (RP6M256_Sensor_Board.h) muss die ''Demo'' neu kompiliert werden. Vorher sollten die Compiler-Hilfsdateien der Sensor Board-Library (Dateiendungen .st und .o) im Programmverzeichnis gelöscht werden.&lt;br /&gt;
* Getestet wird das Ergebnis der Kalibrierung, indem die Ausgabewerte (Temperatur, Pitch, Roll, Heading, Neigungs-kompensiertes Heading) der ''Demo'' überprüft werden. Dazu kann man Vergleichswerte (Thermometer, Winkelmesser für Pitch, Roll und externer Kompass für Heading) heranziehen.&lt;br /&gt;
* Wenn die Ausgabewerte nicht den Erwartungen entsprechen, muss die Kalibrierung wiederholt werden.&lt;br /&gt;
* Eine Kalibrierung der Sensoren ist nur zuverlässig, solange die Position des jeweiligen Sensors und seine komplette Hardware-Umgebung (also der RP6 mit allen seinen Teilen!) nicht verändert wird. Gibt es trotzdem Veränderungen, z.B. durch weitere Aufbauten auf dem RP6, müssen diese Sensoren neu kalibriert werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Datei: RP6M256_Sensor_Board.h&lt;br /&gt;
&amp;lt;pre&amp;gt;/* ****************************************************************************&lt;br /&gt;
 *                           _______________________&lt;br /&gt;
 *                           \| RP6  ROBOT SYSTEM |/&lt;br /&gt;
 *                            \_-_-_-_-_-_-_-_-_-_/           &amp;gt;&amp;gt;&amp;gt; RP6 M256 WIFI&lt;br /&gt;
 * ----------------------------------------------------------------------------&lt;br /&gt;
 * ----------------------------- [c]2014 - Dirk -------------------------------&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * File: RP6M256_Sensor_Board.h&lt;br /&gt;
 * Version: 1.0&lt;br /&gt;
 * Target: RP6 M256 WIFI - ATMEGA2560 @16.00MHz&lt;br /&gt;
 * Author(s): Dirk&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Description:&lt;br /&gt;
 * Configuration header file for new RP6 Sensor Board library.&lt;br /&gt;
 * The RP6 Sensor Board (CONRAD 1082384) is connected to the RP6M256 with the&lt;br /&gt;
 * two plugs:&lt;br /&gt;
 *   Sensor Board &amp;lt;---&amp;gt; RP6M256&lt;br /&gt;
 *   --------------------------------&lt;br /&gt;
 *   I/O (K17)    &amp;lt;---&amp;gt; IO_PWM/T0/T1&lt;br /&gt;
 *   ADC (K18)    &amp;lt;---&amp;gt; ADC_IO2/CMP&lt;br /&gt;
 * The RP6 Sensor Board function &amp;quot;PD5&amp;quot; (IC6: EN) is now connected to RP6M256&lt;br /&gt;
 * OC1B (PB6) and the RP6 Sensor Board function &amp;quot;ADC4&amp;quot; (SHARP_R) to RP6M256&lt;br /&gt;
 * ADC9 (PK1).&lt;br /&gt;
 * On the RP6 Sensor Board the functions &amp;quot;ADC0&amp;quot;, &amp;quot;ADC1&amp;quot;, &amp;quot;PWR&amp;quot; and &amp;quot;ADC4&amp;quot; are&lt;br /&gt;
 * connected to the USRBUS. The USRBUS may be wired on the RP6 mainboard like&lt;br /&gt;
 * this:&lt;br /&gt;
 *   Function : Sensor Board - USRBUS: * &amp;lt;---&amp;gt; RP6 Mainboard&lt;br /&gt;
 *   --------------------------------------------------------&lt;br /&gt;
 *   SHARP_F  : &amp;quot;ADC0&amp;quot;       - Pin 1     &amp;lt;---&amp;gt; ADC0: Pin 3&lt;br /&gt;
 *   GYRO     : &amp;quot;ADC1&amp;quot;       - Pin 2     &amp;lt;---&amp;gt; ADC1: Pin 3&lt;br /&gt;
 *   PWRON ²  : &amp;quot;PWR&amp;quot;        - Pin 3     &amp;lt;---&amp;gt; PWR&lt;br /&gt;
 *   SHARP_R  : &amp;quot;ADC4&amp;quot;       - Pin 5     &amp;lt;---&amp;gt; Not connected!&lt;br /&gt;
 * At *) It is also possible not to use the USRBUS, but to connect the RP6&lt;br /&gt;
 *       Sensor Board directly to the RP6 mainboard with 3 single cables.&lt;br /&gt;
 * At ²) See RP6 manual &amp;quot;4.6.8. Stromsparfunktionen&amp;quot;! &lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
#ifndef RP6M256_SENSOR_BOARD_H&lt;br /&gt;
#define RP6M256_SENSOR_BOARD_H&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// RP6 Sensor Board hardwired components:&lt;br /&gt;
// - I2C I/O Port Expander (MAX7311)&lt;br /&gt;
// - I2C Real Time Clock (RTC DS1339)&lt;br /&gt;
// - I2C Temperature Sensor (LM75B)&lt;br /&gt;
// - I2C Servo Controller (PCA9685)&lt;br /&gt;
// - I2C LED Driver (TCA6507)&lt;br /&gt;
// - I2C 3D Magnetometer &amp;amp; Accelerometer (LSM303DLHC)&lt;br /&gt;
// - Analog Yaw-Rate Gyroscope (LY330ALH)&lt;br /&gt;
// - Hot Swappable 2-Wire Bus Buffer (TCA4311A)&lt;br /&gt;
// - Button&lt;br /&gt;
// - Status LED&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C I/O Port Expander (MAX7311):&lt;br /&gt;
#define I2C_SENSOR_PORTEXP_ADR			0x40	// Default&lt;br /&gt;
&lt;br /&gt;
// Interrupt I/O portpin definitions (RP6M256):&lt;br /&gt;
#define IO_SENSOR_INT1_IN				INT1_PI12 // PCINT12 PJ3  XBUS Pin 8&lt;br /&gt;
#define IO_SENSOR_INT1_DDR				DDRJ&lt;br /&gt;
#define IO_SENSOR_INT1_PIN				PINJ&lt;br /&gt;
#define IO_SENSOR_INT1_PORT				PORTJ&lt;br /&gt;
#define IO_SENSOR_INT2_IN				INT2_PI15 // PCINT15 PJ6  XBUS Pin 11&lt;br /&gt;
#define IO_SENSOR_INT2_DDR				DDRJ&lt;br /&gt;
#define IO_SENSOR_INT2_PIN				PINJ&lt;br /&gt;
#define IO_SENSOR_INT2_PORT				PORTJ&lt;br /&gt;
#define IO_SENSOR_INT3_IN				INT3_PI14 // PCINT14 PJ5  XBUS Pin 9&lt;br /&gt;
#define IO_SENSOR_INT3_DDR				DDRJ&lt;br /&gt;
#define IO_SENSOR_INT3_PIN				PINJ&lt;br /&gt;
#define IO_SENSOR_INT3_PORT				PORTJ&lt;br /&gt;
#define IO_SENSOR_INTU_IN				INTU_PI13 // PCINT13 PJ4  XBUS Pin 7&lt;br /&gt;
#define IO_SENSOR_INTU_DDR				DDRJ&lt;br /&gt;
#define IO_SENSOR_INTU_PIN				PINJ&lt;br /&gt;
#define IO_SENSOR_INTU_PORT				PORTJ&lt;br /&gt;
&lt;br /&gt;
// I/O PORT pin numbers:&lt;br /&gt;
#define PIN7							7&lt;br /&gt;
#define PIN6							6&lt;br /&gt;
#define PIN5							5&lt;br /&gt;
#define PIN4							4&lt;br /&gt;
#define PIN3							3&lt;br /&gt;
#define PIN2							2&lt;br /&gt;
#define PIN1							1&lt;br /&gt;
#define PIN0							0&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Real Time Clock (RTC DS1339):&lt;br /&gt;
#define I2C_SENSOR_RTC_ADR				0xd0	// Default&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Temperature Sensor (LM75B):&lt;br /&gt;
#define I2C_SENSOR_TEMP_ADR				0x90	// Default&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Servo Controller (PCA9685):&lt;br /&gt;
#define I2C_SENSOR_SERVO_ADR			0x88	// Default&lt;br /&gt;
&lt;br /&gt;
// Servo and PWM channels:&lt;br /&gt;
#define CH_SERVO_1						16		// At K6: 1  &amp;quot;SERVO_1&amp;quot;&lt;br /&gt;
#define CH_SERVO_2						15		// At K11: 1 &amp;quot;SERVO_2&amp;quot;&lt;br /&gt;
#define CH_SERVO_3						13		// At K29: 1 &amp;quot;SERVO_3&amp;quot;&lt;br /&gt;
#define CH_SERVO_4						14		// At K30: 1 &amp;quot;SERVO_4&amp;quot;&lt;br /&gt;
#define CH_SERVO_5						11		// At K31: 1 &amp;quot;SERVO_5&amp;quot;&lt;br /&gt;
#define CH_SERVO_6						12		// At K32: 1 &amp;quot;SERVO_6&amp;quot;&lt;br /&gt;
#define CH_SERVO_7						9		// At K33: 1 &amp;quot;SERVO_7&amp;quot;&lt;br /&gt;
#define CH_SERVO_8						10		// At K34: 1 &amp;quot;SERVO_8&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#define CH_PWM_OUT_1					1		// At K12: 1 &amp;quot;PWM_OUT&amp;quot;&lt;br /&gt;
#define CH_PWM_OUT_2					2		// At K12: 2&lt;br /&gt;
#define CH_PWM_OUT_3					3		// At K12: 3&lt;br /&gt;
#define CH_PWM_OUT_4					4		// At K12: 4&lt;br /&gt;
#define CH_PWM_OUT_5					5		// At K12: 5&lt;br /&gt;
#define CH_PWM_OUT_6					6		// At K12: 6&lt;br /&gt;
#define CH_PWM_OUT_7					7		// At K12: 7&lt;br /&gt;
#define CH_PWM_OUT_8					8		// At K12: 8&lt;br /&gt;
&lt;br /&gt;
// Servo left touch (LT), right touch (RT), middle position (MP) constants:&lt;br /&gt;
// (Hints: - Servo impulse length [ms] = Servo position value / 204.8&lt;br /&gt;
//           (Formula only valid for a PWM of 50 Hz!)&lt;br /&gt;
//         - Min. servo impulse (0,7 ms) = Servo position 143&lt;br /&gt;
//         - Mid. servo impulse (1,5 ms) = Servo position 307&lt;br /&gt;
//         - Max. servo impulse (2,3 ms) = Servo position 471&lt;br /&gt;
//         - !!! You should NOT use servo position values &amp;lt; 143 or &amp;gt; 471 !!!)&lt;br /&gt;
#define SERVO1_LT						205		// Servo impulse ~1ms&lt;br /&gt;
#define SERVO1_RT						410		// Servo impulse ~2ms&lt;br /&gt;
#define SERVO1_MP						((SERVO1_RT - SERVO1_LT) / 2 + SERVO1_LT)&lt;br /&gt;
#define SERVO2_LT						205&lt;br /&gt;
#define SERVO2_RT						410&lt;br /&gt;
#define SERVO2_MP						((SERVO2_RT - SERVO2_LT) / 2 + SERVO2_LT)&lt;br /&gt;
#define SERVO3_LT						205&lt;br /&gt;
#define SERVO3_RT						410&lt;br /&gt;
#define SERVO3_MP						((SERVO3_RT - SERVO3_LT) / 2 + SERVO3_LT)&lt;br /&gt;
#define SERVO4_LT						205&lt;br /&gt;
#define SERVO4_RT						410&lt;br /&gt;
#define SERVO4_MP						((SERVO4_RT - SERVO4_LT) / 2 + SERVO4_LT)&lt;br /&gt;
#define SERVO5_LT						205&lt;br /&gt;
#define SERVO5_RT						410&lt;br /&gt;
#define SERVO5_MP						((SERVO5_RT - SERVO5_LT) / 2 + SERVO5_LT)&lt;br /&gt;
#define SERVO6_LT						205&lt;br /&gt;
#define SERVO6_RT						410&lt;br /&gt;
#define SERVO6_MP						((SERVO6_RT - SERVO6_LT) / 2 + SERVO6_LT)&lt;br /&gt;
#define SERVO7_LT						205&lt;br /&gt;
#define SERVO7_RT						410&lt;br /&gt;
#define SERVO7_MP						((SERVO7_RT - SERVO7_LT) / 2 + SERVO7_LT)&lt;br /&gt;
#define SERVO8_LT						205&lt;br /&gt;
#define SERVO8_RT						410&lt;br /&gt;
#define SERVO8_MP						((SERVO8_RT - SERVO8_LT) / 2 + SERVO8_LT)&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C LED Driver (TCA6507):&lt;br /&gt;
#define I2C_SENSOR_LEDDRIVER_ADR		0x8a	// Default&lt;br /&gt;
&lt;br /&gt;
// LED numbers:&lt;br /&gt;
#define LED0							0		// At K7&lt;br /&gt;
#define DISPLAY_BACKLIGHT				0		// Display background light&lt;br /&gt;
#define LED1							1		// At K4&lt;br /&gt;
#define LED2							2		// At K2&lt;br /&gt;
#define LED3							3		// At K10: 1&lt;br /&gt;
#define BACKLIGHT_R						3		// Right backlight&lt;br /&gt;
#define LED4							4		// At K10: 2&lt;br /&gt;
#define BACKLIGHT_L						4		// Left backlight&lt;br /&gt;
#define LED5							5		// White LED (D3)&lt;br /&gt;
#define HEADLIGHT_R						5		// Right headlight&lt;br /&gt;
#define LED6							6		// White LED (D1)&lt;br /&gt;
#define HEADLIGHT_L						6		// Left headlight&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C 3D Magnetometer &amp;amp; Accelerometer (LSM303DLHC):&lt;br /&gt;
&lt;br /&gt;
// LSM303DLHC accelerometer:&lt;br /&gt;
#define I2C_SENSOR_LSM303DLHC_A_ADR 	0x32	// Default&lt;br /&gt;
&lt;br /&gt;
// LSM303DLHC accelerometer calibration data:&lt;br /&gt;
#define MAX_X_A						1037		// Max. X-axis value&lt;br /&gt;
#define MIN_X_A						-1030		// Min. X-axis value&lt;br /&gt;
#define MAX_Y_A						1030		// Max. Y-axis value&lt;br /&gt;
#define MIN_Y_A						-1019		// Min. Y-axis value&lt;br /&gt;
#define MAX_Z_A						1062		// Max. Z-axis value&lt;br /&gt;
#define MIN_Z_A						-1056		// Min. Z-axis value&lt;br /&gt;
#define OFFSET_PITCH_A				0.0			// Offset Pitch [°]&lt;br /&gt;
#define OFFSET_ROLL_A				0.0			// Offset Roll [°]&lt;br /&gt;
&lt;br /&gt;
// LSM303DLHC magnetometer:&lt;br /&gt;
#define I2C_SENSOR_LSM303DLHC_M_ADR		0x3c	// Default&lt;br /&gt;
&lt;br /&gt;
// LSM303DLHC magnetometer calibration data:&lt;br /&gt;
#define MAX_X_M						-111.0		// Max. X-axis value&lt;br /&gt;
#define MIN_X_M						-634.0		// Min. X-axis value&lt;br /&gt;
#define OFFSET_X_M					0			// Hard iron X-axis offset&lt;br /&gt;
#define MAX_Y_M						297.0		// Max. Y-axis value&lt;br /&gt;
#define MIN_Y_M						-215.0		// Min. Y-axis value&lt;br /&gt;
#define OFFSET_Y_M					0			// Hard iron Y-axis offset&lt;br /&gt;
#define MAX_Z_M						183.0		// Max. Z-axis value&lt;br /&gt;
#define MIN_Z_M						-214.0		// Min. Z-axis value&lt;br /&gt;
#define OFFSET_Z_M					0			// Hard iron Z-axis offset&lt;br /&gt;
#define DECLINATION_M				0.0			// E at local position [°]&lt;br /&gt;
&lt;br /&gt;
// LSM303DLHC temperature sensor definitions:&lt;br /&gt;
#define GET_TEMP_M								// Enable temperature sensor&lt;br /&gt;
#define OFFSET_TEMP_M				0.0			// Temperature offset [°C]&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Analog Yaw-Rate Gyroscope (LY330ALH):&lt;br /&gt;
&lt;br /&gt;
// LY330ALH gyroscope:&lt;br /&gt;
#define ADC_SENSOR_LY330ALH				ADC_1	// At USRBUS: 2 (RP6BASE)&lt;br /&gt;
&lt;br /&gt;
// LY330ALH gyroscope calibration data:&lt;br /&gt;
// (Higher values [505..1023] mean an angular velocity while rotating LEFT&lt;br /&gt;
//  and lower values [503..0] while rotating RIGHT!)&lt;br /&gt;
#define ADCVAL_MINRATE					0		// Min. rate value&lt;br /&gt;
#define ADCVAL_ZERORATE_LEVEL			504		// Zero rate level&lt;br /&gt;
#define ADCVAL_MAXRATE					1023	// Max. rate value&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Hot Swappable 2-Wire Bus Buffer (TCA4311A):&lt;br /&gt;
&lt;br /&gt;
// Define USE_PD5, if you want to control the TCA4311A enable pin (EN) with&lt;br /&gt;
// the RP6 Sensor Board function &amp;quot;PD5&amp;quot;. If USE_PD5 is NOT defined (default),&lt;br /&gt;
// the TCA4311A EN pin is controlled by the MAX7311 I/O 1.0 pin.&lt;br /&gt;
// ---------------&lt;br /&gt;
//#define USE_PD5&lt;br /&gt;
// ---------------&lt;br /&gt;
&lt;br /&gt;
#define IO_SENSOR_TCA4311A_EN_IN		OC1B_PI6 // At I/O: 9 (RP6M256)&lt;br /&gt;
#define IO_SENSOR_TCA4311A_EN_DDR		DDRB&lt;br /&gt;
#define IO_SENSOR_TCA4311A_EN_PIN		PINB&lt;br /&gt;
#define IO_SENSOR_TCA4311A_EN_PORT		PORTB&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Button:&lt;br /&gt;
&lt;br /&gt;
// (Button is connected to I/O 1.7 of the MAX7311!)&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Status LED:&lt;br /&gt;
&lt;br /&gt;
// (Status LED is connected to I/O 1.6 of the MAX7311!)&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Other ADC channel definitions:&lt;br /&gt;
&lt;br /&gt;
// (Depending on connections on the RP6 Sensor Board!)&lt;br /&gt;
#define ADC_SENSOR_SHARP_F				ADC_0	// At USRBUS: 1 (RP6BASE)&lt;br /&gt;
#define ADC_SENSOR_SHARP_R				ADC_9	// At ADC: 3    (RP6M256)&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
/******************************************************************************&lt;br /&gt;
 * Additional info&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Changelog:&lt;br /&gt;
 * &lt;br /&gt;
 *  ---&amp;gt; changes are documented in the file &amp;quot;RP6M256_Sensor_BoardLib.c&amp;quot;&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=====Library Header=====&lt;br /&gt;
Datei: RP6M256_Sensor_BoardLib.h&lt;br /&gt;
&amp;lt;pre&amp;gt;/* ****************************************************************************&lt;br /&gt;
 *                           _______________________&lt;br /&gt;
 *                           \| RP6  ROBOT SYSTEM |/&lt;br /&gt;
 *                            \_-_-_-_-_-_-_-_-_-_/           &amp;gt;&amp;gt;&amp;gt; RP6 M256 WIFI&lt;br /&gt;
 * ----------------------------------------------------------------------------&lt;br /&gt;
 * ----------------------------- [c]2014 - Dirk -------------------------------&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * File: RP6M256_Sensor_BoardLib.h&lt;br /&gt;
 * Version: 1.0&lt;br /&gt;
 * Target: RP6 M256 WIFI - ATMEGA2560 @16.00MHz&lt;br /&gt;
 * Author(s): Dirk&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Description:&lt;br /&gt;
 * Header file for new RP6 Sensor Board library.&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
#ifndef RP6M256_SENSOR_BOARDLIB_H&lt;br /&gt;
#define RP6M256_SENSOR_BOARDLIB_H&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// RP6 Sensor Board hardwired components:&lt;br /&gt;
// - I2C I/O Port Expander (MAX7311)&lt;br /&gt;
// - I2C Real Time Clock (RTC DS1339)&lt;br /&gt;
// - I2C Temperature Sensor (LM75B)&lt;br /&gt;
// - I2C Servo Controller (PCA9685)&lt;br /&gt;
// - I2C LED Driver (TCA6507)&lt;br /&gt;
// - I2C 3D Magnetometer &amp;amp; Accelerometer (LSM303DLHC)&lt;br /&gt;
// - Analog Yaw-Rate Gyroscope (LY330ALH)&lt;br /&gt;
// - Hot Swappable 2-Wire Bus Buffer (TCA4311A)&lt;br /&gt;
// - Button&lt;br /&gt;
// - Status LED&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Includes:&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6M256Lib.h&amp;quot;&lt;br /&gt;
#include &amp;quot;RP6I2CmasterTWI.h&amp;quot;&lt;br /&gt;
#include &amp;quot;RP6M256_Sensor_Board.h&amp;quot;&lt;br /&gt;
#include &amp;lt;math.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// RP6M256_I2CMasterLib definitions:&lt;br /&gt;
&lt;br /&gt;
#ifndef I2C_RP6_BASE_ADR&lt;br /&gt;
	#define I2C_RP6_BASE_ADR			10&lt;br /&gt;
#endif&lt;br /&gt;
#ifndef I2C_REG_ADC_ADC0_L&lt;br /&gt;
	#define I2C_REG_ADC_ADC0_L			23&lt;br /&gt;
#endif&lt;br /&gt;
#ifndef I2C_REG_ADC_ADC1_L&lt;br /&gt;
	#define I2C_REG_ADC_ADC1_L			25&lt;br /&gt;
#endif&lt;br /&gt;
#ifndef CMD_POWER_OFF&lt;br /&gt;
	#define CMD_POWER_OFF				0&lt;br /&gt;
#endif&lt;br /&gt;
#ifndef CMD_POWER_ON&lt;br /&gt;
	#define CMD_POWER_ON				1&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C I/O Port Expander (MAX7311):&lt;br /&gt;
&lt;br /&gt;
// Registers:&lt;br /&gt;
#define MAX7311_INPUT_PORT1				0&lt;br /&gt;
#define MAX7311_INPUT_PORT2				1&lt;br /&gt;
#define MAX7311_OUTPUT_PORT1			2&lt;br /&gt;
#define MAX7311_OUTPUT_PORT2			3&lt;br /&gt;
#define MAX7311_PORT1_POL_INV			4&lt;br /&gt;
#define MAX7311_PORT2_POL_INV			5&lt;br /&gt;
#define MAX7311_PORT1_CONFIG			6&lt;br /&gt;
#define MAX7311_PORT2_CONFIG			7&lt;br /&gt;
#define MAX7311_TIMEOUT					8&lt;br /&gt;
&lt;br /&gt;
// Port 1 configuration register bitmasks:&lt;br /&gt;
#define ST_GYRO							(1 &amp;lt;&amp;lt; PIN7)	// I/O 0.7 (Output)&lt;br /&gt;
#define PD_GYRO							(1 &amp;lt;&amp;lt; PIN6)	// I/O 0.6 (Output)&lt;br /&gt;
#define PWR_CAM_IF						(1 &amp;lt;&amp;lt; PIN5)	// I/O 0.5 (Output)&lt;br /&gt;
#define EN_LEDDRIV						(1 &amp;lt;&amp;lt; PIN4)	// I/O 0.4 (Output)&lt;br /&gt;
#define RDY_BUSBUFF						(1 &amp;lt;&amp;lt; PIN3)	// I/O 0.3 (Input)&lt;br /&gt;
#define PWR_SHARP_R						(1 &amp;lt;&amp;lt; PIN2)	// I/O 0.2 (Output)&lt;br /&gt;
#define PWR_SHARP_F						(1 &amp;lt;&amp;lt; PIN1)	// I/O 0.1 (Output)&lt;br /&gt;
#define PWR_I2C							(1 &amp;lt;&amp;lt; PIN0)	// I/O 0.0 (Output)&lt;br /&gt;
&lt;br /&gt;
// Port 2 configuration register bitmasks:&lt;br /&gt;
#define IO2_I2C							(1 &amp;lt;&amp;lt; PIN7)	// I/O 1.7 (Input)&lt;br /&gt;
#define IO1_I2C							(1 &amp;lt;&amp;lt; PIN6)	// I/O 1.6 (Output)&lt;br /&gt;
#define DRDY_MAGACC						(1 &amp;lt;&amp;lt; PIN5)	// I/O 1.5 (Input)&lt;br /&gt;
#define PWR_SERVO						(1 &amp;lt;&amp;lt; PIN4)	// I/O 1.4 (Output)&lt;br /&gt;
#define OEN_SERVO						(1 &amp;lt;&amp;lt; PIN3)	// I/O 1.3 (Output)&lt;br /&gt;
#define IO_K19_1						(1 &amp;lt;&amp;lt; PIN2)	// I/O 1.2 (Input)&lt;br /&gt;
#define IO_K19_3						(1 &amp;lt;&amp;lt; PIN1)	// I/O 1.1 (Input)&lt;br /&gt;
#define EN_BUSBUFF						(1 &amp;lt;&amp;lt; PIN0)	// I/O 1.0 (Output)&lt;br /&gt;
&lt;br /&gt;
// Port 1 &amp;amp; 2 register 16-bit bitmasks:&lt;br /&gt;
// (CONFIG: 1 = Input, 0 = Output)&lt;br /&gt;
#define MAX7311_CONFIG_DEFAULT			0b1010011000001000&lt;br /&gt;
#define MAX7311_CONFIG_USE_PD5			0b1010011100001000&lt;br /&gt;
// (OUTPUT: 1 = High/True, 0 = Low/False)&lt;br /&gt;
#define MAX7311_OUTPUT_DEFAULT			0b0100000100010000&lt;br /&gt;
#define MAX7311_OUTPUT_FULLPOWER		0b0001000100110111&lt;br /&gt;
#define MAX7311_OUTPUT_SHUTDOWN			0b0100100011000000&lt;br /&gt;
&lt;br /&gt;
// Safe configuration:&lt;br /&gt;
// (Ensures if activated, that I/Os 0.3, 1.5 and 1.7 cannot be configured&lt;br /&gt;
//  as output with the function MAX7311_write_cfg(). This may protect the&lt;br /&gt;
//  RP6 Sensor Board from hardware damage.)&lt;br /&gt;
// -------------------&lt;br /&gt;
#define SAFE_CONFIG&lt;br /&gt;
// -------------------&lt;br /&gt;
&lt;br /&gt;
typedef union {&lt;br /&gt;
 	uint8_t byte;&lt;br /&gt;
	struct {&lt;br /&gt;
		unsigned int1   :1;				// INT1  XBUS Pin 8&lt;br /&gt;
		unsigned int2   :1;				// INT2  XBUS Pin 11&lt;br /&gt;
		unsigned int3   :1;				// INT3  XBUS Pin 9&lt;br /&gt;
		unsigned intu   :1;				// INTU  XBUS Pin 7&lt;br /&gt;
		unsigned unused :4;&lt;br /&gt;
	};&lt;br /&gt;
	struct {&lt;br /&gt;
		unsigned magacc1     :1;		// INT1: LSM303DLHC INT1&lt;br /&gt;
		unsigned portexp     :1;		// INT2: MAX7311 INT_N&lt;br /&gt;
		unsigned magacc2_rtc :1;		// INT3: LSM303DLHC INT2&lt;br /&gt;
		unsigned noname      :5;		//       OR DS1339 SQW/INT_N&lt;br /&gt;
	};&lt;br /&gt;
} interrupt_RP6SBstatus_t;&lt;br /&gt;
extern interrupt_RP6SBstatus_t interrupt_RP6SBstatus;&lt;br /&gt;
&lt;br /&gt;
typedef union {&lt;br /&gt;
	uint16_t word;&lt;br /&gt;
	struct {&lt;br /&gt;
		unsigned pwr_i2c     :1;		// I/O 0.0 (Output)&lt;br /&gt;
		unsigned pwr_sharp_f :1;		// I/O 0.1 (Output)&lt;br /&gt;
		unsigned pwr_sharp_r :1;		// I/O 0.2 (Output)&lt;br /&gt;
		unsigned rdy_busbuff :1;		// I/O 0.3 (Input)&lt;br /&gt;
		unsigned en_leddriv  :1;		// I/O 0.4 (Output)&lt;br /&gt;
		unsigned pwr_cam_if  :1;		// I/O 0.5 (Output)&lt;br /&gt;
		unsigned pd_gyro     :1;		// I/O 0.6 (Output)&lt;br /&gt;
		unsigned st_gyro     :1;		// I/O 0.7 (Output)&lt;br /&gt;
		unsigned en_busbuff  :1;		// I/O 1.0 (Output)&lt;br /&gt;
		unsigned io_k19_3    :1;		// I/O 1.1 (Input)&lt;br /&gt;
		unsigned io_k19_1    :1;		// I/O 1.2 (Input)&lt;br /&gt;
		unsigned oen_servo   :1;		// I/O 1.3 (Output)&lt;br /&gt;
		unsigned pwr_servo   :1;		// I/O 1.4 (Output)&lt;br /&gt;
		unsigned drdy_magacc :1;		// I/O 1.5 (Input)&lt;br /&gt;
		unsigned io1_i2c     :1;		// I/O 1.6 (Output)&lt;br /&gt;
		unsigned io2_i2c     :1;		// I/O 1.7 (Input)&lt;br /&gt;
	};&lt;br /&gt;
} max7311IOs_t;&lt;br /&gt;
extern max7311IOs_t inport;&lt;br /&gt;
extern max7311IOs_t outport;&lt;br /&gt;
extern uint8_t readyBusbuff;&lt;br /&gt;
extern uint8_t pressedButton;&lt;br /&gt;
&lt;br /&gt;
void MAX7311_write_cfg(uint16_t);&lt;br /&gt;
void task_checkINTs(void);&lt;br /&gt;
void task_RP6SensorBoard(void);&lt;br /&gt;
void MAX7311_update(void);&lt;br /&gt;
void MAX7311_write(uint16_t);&lt;br /&gt;
void MAX7311_init(void);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Real Time Clock (RTC DS1339):&lt;br /&gt;
&lt;br /&gt;
// Registers:&lt;br /&gt;
#define DS1339_SECONDS					0&lt;br /&gt;
#define DS1339_MINUTES					1&lt;br /&gt;
#define DS1339_HOURS					2&lt;br /&gt;
#define DS1339_DAY						3&lt;br /&gt;
#define DS1339_DATE						4&lt;br /&gt;
#define DS1339_MONTH_CENTURY			5&lt;br /&gt;
#define DS1339_YEAR						6&lt;br /&gt;
#define DS1339_ALARM1_SECONDS			7&lt;br /&gt;
#define DS1339_ALARM1_MINUTES			8&lt;br /&gt;
#define DS1339_ALARM1_HOURS				9&lt;br /&gt;
#define DS1339_ALARM1_DAY_DATE			10&lt;br /&gt;
#define DS1339_ALARM2_MINUTES			11&lt;br /&gt;
#define DS1339_ALARM2_HOURS				12&lt;br /&gt;
#define DS1339_ALARM2_DAY_DATE			13&lt;br /&gt;
#define DS1339_CONTROL					14&lt;br /&gt;
#define DS1339_STATUS					15&lt;br /&gt;
#define DS1339_TRICKLE_CHARGER			16&lt;br /&gt;
&lt;br /&gt;
// Control register bitmasks:&lt;br /&gt;
#define DS1339_CONTROL_DEFAULT			0		// Power on default&lt;br /&gt;
#define DS1339_CONTROL_A1IE				1&lt;br /&gt;
#define DS1339_CONTROL_A2IE				2&lt;br /&gt;
#define DS1339_CONTROL_INTCN			4&lt;br /&gt;
#define DS1339_CONTROL_RS1				8&lt;br /&gt;
#define DS1339_CONTROL_RS2				16&lt;br /&gt;
#define DS1339_CONTROL_BBSQI			32&lt;br /&gt;
#define DS1339_CONTROL_EOSC				128&lt;br /&gt;
&lt;br /&gt;
// Trickle Charger register bitmasks:&lt;br /&gt;
#define DS1339_TRICKLE_CHARGER_DEFAULT	0b10101010 // One diode, 2k resistor&lt;br /&gt;
#define DS1339_TRICKLE_CHARGER_ROUT0	1&lt;br /&gt;
#define DS1339_TRICKLE_CHARGER_ROUT1	2&lt;br /&gt;
#define DS1339_TRICKLE_CHARGER_DS0		4&lt;br /&gt;
#define DS1339_TRICKLE_CHARGER_DS1		8&lt;br /&gt;
#define DS1339_TRICKLE_CHARGER_TCS0		16&lt;br /&gt;
#define DS1339_TRICKLE_CHARGER_TCS1		32&lt;br /&gt;
#define DS1339_TRICKLE_CHARGER_TCS2		64&lt;br /&gt;
#define DS1339_TRICKLE_CHARGER_TCS3		128&lt;br /&gt;
&lt;br /&gt;
enum RTCWEEKDAYS {&lt;br /&gt;
	R_MO = 1, R_TU, R_WE, R_TH, R_FR, R_SA, R_SU&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
typedef struct {&lt;br /&gt;
	uint16_t         year;				// Year&lt;br /&gt;
	uint8_t          month;				// Month   [1..12]&lt;br /&gt;
	enum RTCWEEKDAYS weekday;			// Weekday [1..7 = R_MO..R_SU]&lt;br /&gt;
	uint8_t          day;				// Day     [1..31]&lt;br /&gt;
} rtcdate_t;&lt;br /&gt;
rtcdate_t rtc_date;&lt;br /&gt;
&lt;br /&gt;
typedef struct {&lt;br /&gt;
	uint8_t dst;						// Daylight-saving-time (time zone)&lt;br /&gt;
	uint8_t hour;						// Hour    [0..23]&lt;br /&gt;
	uint8_t minute;						// Minute  [0..59]&lt;br /&gt;
	uint8_t second;						// Second  [0..59]&lt;br /&gt;
} rtctime_t;&lt;br /&gt;
rtctime_t rtc_time;&lt;br /&gt;
&lt;br /&gt;
uint8_t BCD2DEC(uint8_t);&lt;br /&gt;
uint8_t DEC2BCD(uint8_t);&lt;br /&gt;
void DS1339_write_cfg(uint8_t);&lt;br /&gt;
void DS1339_init(void);&lt;br /&gt;
#define CALC_DST						// Time zone will be calculated&lt;br /&gt;
void DS1339_read(void);&lt;br /&gt;
void DS1339_write(void);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Temperature Sensor (LM75B):&lt;br /&gt;
&lt;br /&gt;
// Registers:&lt;br /&gt;
#define LM75B_TEMP						0&lt;br /&gt;
#define LM75B_CONF						1&lt;br /&gt;
#define LM75B_THYST						2&lt;br /&gt;
#define LM75B_TOS						3&lt;br /&gt;
&lt;br /&gt;
// Conf register bitmasks:&lt;br /&gt;
#define LM75B_CONF_DEFAULT				0		// Power on default&lt;br /&gt;
#define LM75B_CONF_SHUTDOWN				1&lt;br /&gt;
#define LM75B_CONF_OS_COMP_INT			2&lt;br /&gt;
#define LM75B_CONF_OS_POL				4&lt;br /&gt;
#define LM75B_CONF_OS_F_QUE0			8&lt;br /&gt;
#define LM75B_CONF_OS_F_QUE1			16&lt;br /&gt;
&lt;br /&gt;
extern double temperature;&lt;br /&gt;
&lt;br /&gt;
void LM75B_write_cfg(uint8_t);&lt;br /&gt;
#define LM75B_shutdown() {LM75B_write_cfg(LM75B_CONF_SHUTDOWN);}&lt;br /&gt;
#define LM75B_init() {LM75B_write_cfg(LM75B_CONF_DEFAULT);}&lt;br /&gt;
extern uint8_t temperature_low;&lt;br /&gt;
extern uint8_t temperature_high;&lt;br /&gt;
#define getTemperatureHigh() (temperature_high)&lt;br /&gt;
#define getTemperatureLow() (temperature_low)&lt;br /&gt;
void LM75B_read(void);&lt;br /&gt;
double LM75B_calculate(void);&lt;br /&gt;
double LM75B_measure(void);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Servo Controller (PCA9685):&lt;br /&gt;
&lt;br /&gt;
// Registers:&lt;br /&gt;
#define PCA9685_MODE1					0&lt;br /&gt;
#define PCA9685_MODE2					1&lt;br /&gt;
#define PCA9685_SUBADR1					2&lt;br /&gt;
#define PCA9685_SUBADR2					3&lt;br /&gt;
#define PCA9685_SUBADR3					4&lt;br /&gt;
#define PCA9685_ALLCALLADR				5&lt;br /&gt;
#define PCA9685_LED0_ON_L				6&lt;br /&gt;
#define PCA9685_LED0_ON_H				7&lt;br /&gt;
#define PCA9685_LED0_OFF_L				8&lt;br /&gt;
#define PCA9685_LED0_OFF_H				9&lt;br /&gt;
#define PCA9685_LED1_ON_L				10&lt;br /&gt;
#define PCA9685_LED1_ON_H				11&lt;br /&gt;
#define PCA9685_LED1_OFF_L				12&lt;br /&gt;
#define PCA9685_LED1_OFF_H				13&lt;br /&gt;
#define PCA9685_LED2_ON_L				14&lt;br /&gt;
#define PCA9685_LED2_ON_H				15&lt;br /&gt;
#define PCA9685_LED2_OFF_L				16&lt;br /&gt;
#define PCA9685_LED2_OFF_H				17&lt;br /&gt;
#define PCA9685_LED3_ON_L				18&lt;br /&gt;
#define PCA9685_LED3_ON_H				19&lt;br /&gt;
#define PCA9685_LED3_OFF_L				20&lt;br /&gt;
#define PCA9685_LED3_OFF_H				21&lt;br /&gt;
#define PCA9685_LED4_ON_L				22&lt;br /&gt;
#define PCA9685_LED4_ON_H				23&lt;br /&gt;
#define PCA9685_LED4_OFF_L				24&lt;br /&gt;
#define PCA9685_LED4_OFF_H				25&lt;br /&gt;
#define PCA9685_LED5_ON_L				26&lt;br /&gt;
#define PCA9685_LED5_ON_H				27&lt;br /&gt;
#define PCA9685_LED5_OFF_L				28&lt;br /&gt;
#define PCA9685_LED5_OFF_H				29&lt;br /&gt;
#define PCA9685_LED6_ON_L				30&lt;br /&gt;
#define PCA9685_LED6_ON_H				31&lt;br /&gt;
#define PCA9685_LED6_OFF_L				32&lt;br /&gt;
#define PCA9685_LED6_OFF_H				33&lt;br /&gt;
#define PCA9685_LED7_ON_L				34&lt;br /&gt;
#define PCA9685_LED7_ON_H				35&lt;br /&gt;
#define PCA9685_LED7_OFF_L				36&lt;br /&gt;
#define PCA9685_LED7_OFF_H				37&lt;br /&gt;
#define PCA9685_LED8_ON_L				38&lt;br /&gt;
#define PCA9685_LED8_ON_H				39&lt;br /&gt;
#define PCA9685_LED8_OFF_L				40&lt;br /&gt;
#define PCA9685_LED8_OFF_H				41&lt;br /&gt;
#define PCA9685_LED9_ON_L				42&lt;br /&gt;
#define PCA9685_LED9_ON_H				43&lt;br /&gt;
#define PCA9685_LED9_OFF_L				44&lt;br /&gt;
#define PCA9685_LED9_OFF_H				45&lt;br /&gt;
#define PCA9685_LED10_ON_L				46&lt;br /&gt;
#define PCA9685_LED10_ON_H				47&lt;br /&gt;
#define PCA9685_LED10_OFF_L				48&lt;br /&gt;
#define PCA9685_LED10_OFF_H				49&lt;br /&gt;
#define PCA9685_LED11_ON_L				50&lt;br /&gt;
#define PCA9685_LED11_ON_H				51&lt;br /&gt;
#define PCA9685_LED11_OFF_L				52&lt;br /&gt;
#define PCA9685_LED11_OFF_H				53&lt;br /&gt;
#define PCA9685_LED12_ON_L				54&lt;br /&gt;
#define PCA9685_LED12_ON_H				55&lt;br /&gt;
#define PCA9685_LED12_OFF_L				56&lt;br /&gt;
#define PCA9685_LED12_OFF_H				57&lt;br /&gt;
#define PCA9685_LED13_ON_L				58&lt;br /&gt;
#define PCA9685_LED13_ON_H				59&lt;br /&gt;
#define PCA9685_LED13_OFF_L				60&lt;br /&gt;
#define PCA9685_LED13_OFF_H				61&lt;br /&gt;
#define PCA9685_LED14_ON_L				62&lt;br /&gt;
#define PCA9685_LED14_ON_H				63&lt;br /&gt;
#define PCA9685_LED14_OFF_L				64&lt;br /&gt;
#define PCA9685_LED14_OFF_H				65&lt;br /&gt;
#define PCA9685_LED15_ON_L				66&lt;br /&gt;
#define PCA9685_LED15_ON_H				67&lt;br /&gt;
#define PCA9685_LED15_OFF_L				68&lt;br /&gt;
#define PCA9685_LED15_OFF_H				69&lt;br /&gt;
#define PCA9685_ALL_LED_ON_L			250&lt;br /&gt;
#define PCA9685_ALL_LED_ON_H			251&lt;br /&gt;
#define PCA9685_ALL_LED_OFF_L			252&lt;br /&gt;
#define PCA9685_ALL_LED_OFF_H			253&lt;br /&gt;
#define PCA9685_PRE_SCALE				254&lt;br /&gt;
#define PCA9685_TESTMODE				255&lt;br /&gt;
&lt;br /&gt;
// Mode1 register bitmasks:&lt;br /&gt;
#define PCA9685_MODE1_ALLCALL			1&lt;br /&gt;
#define PCA9685_MODE1_SUB3				2&lt;br /&gt;
#define PCA9685_MODE1_SUB2				4&lt;br /&gt;
#define PCA9685_MODE1_SUB1				8&lt;br /&gt;
#define PCA9685_MODE1_SLEEP				16&lt;br /&gt;
#define PCA9685_MODE1_AI				32&lt;br /&gt;
#define PCA9685_MODE1_EXTCLK			64&lt;br /&gt;
#define PCA9685_MODE1_RESTART			128&lt;br /&gt;
&lt;br /&gt;
// Mode2 register bitmasks:&lt;br /&gt;
#define PCA9685_MODE2_OUTNE01_DEFAULT	0&lt;br /&gt;
#define PCA9685_MODE2_OUTDRV			4&lt;br /&gt;
#define PCA9685_MODE2_OCH				8&lt;br /&gt;
#define PCA9685_MODE2_INVRT				16&lt;br /&gt;
&lt;br /&gt;
#define F_PCA9685						25000000.0	// Int. Clock: 25 MHz&lt;br /&gt;
&lt;br /&gt;
void PCA9685_init(uint16_t);&lt;br /&gt;
#define initServo(__FREQ__) {PCA9685_init(__FREQ__);}&lt;br /&gt;
uint8_t servo(uint8_t);&lt;br /&gt;
void PCA9685_set(uint8_t, uint16_t);&lt;br /&gt;
#define setServo(__SERVO__,__POS__) {PCA9685_set(servo(__SERVO__),__POS__);}&lt;br /&gt;
void PCA9685_shutdown(void);&lt;br /&gt;
void PCA9685_restart(void);&lt;br /&gt;
void setServoPower(uint8_t);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C LED Driver (TCA6507):&lt;br /&gt;
&lt;br /&gt;
// Registers:&lt;br /&gt;
#define TCA6507_SELECT0				0&lt;br /&gt;
#define TCA6507_SELECT1				1&lt;br /&gt;
#define TCA6507_SELECT2				2&lt;br /&gt;
#define TCA6507_FADEON_TIME			3&lt;br /&gt;
#define TCA6507_FULLYON_TIME		4&lt;br /&gt;
#define TCA6507_FADEOFF_TIME		5&lt;br /&gt;
#define TCA6507_1ST_FULLYOFF_TIME	6&lt;br /&gt;
#define TCA6507_2ND_FULLYOFF_TIME	7&lt;br /&gt;
#define TCA6507_MAXIMUM_INTENSITY	8&lt;br /&gt;
#define TCA6507_MASTER_INTENSITY	9&lt;br /&gt;
#define TCA6507_INITIALIZATION		10&lt;br /&gt;
&lt;br /&gt;
// Output states:&lt;br /&gt;
#define STATE_OFF					0&lt;br /&gt;
#define STATE_PWM0					2&lt;br /&gt;
#define STATE_PWM1					3&lt;br /&gt;
#define STATE_ON					4&lt;br /&gt;
#define STATE_MINT					5&lt;br /&gt;
#define STATE_BLINK0				6&lt;br /&gt;
#define STATE_BLINK1				7&lt;br /&gt;
&lt;br /&gt;
extern uint8_t select[3];&lt;br /&gt;
&lt;br /&gt;
void TCA6507_write_cfg(uint8_t, uint8_t);&lt;br /&gt;
void TCA6507_update(void);&lt;br /&gt;
void TCA6507_set(uint8_t, uint8_t);&lt;br /&gt;
#define setLED(__LED__,__STATE__) {TCA6507_set(__LED__,__STATE__);}&lt;br /&gt;
void TCA6507_shutdown(void);&lt;br /&gt;
void TCA6507_restart(void);&lt;br /&gt;
void TCA6507_init(void);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C 3D Magnetometer &amp;amp; Accelerometer (LSM303DLHC):&lt;br /&gt;
&lt;br /&gt;
// LSM303DLHC accelerometer internal registers:&lt;br /&gt;
#define CTRL_REG1_A					0x20&lt;br /&gt;
#define CTRL_REG2_A					0x21&lt;br /&gt;
#define CTRL_REG3_A					0x22&lt;br /&gt;
#define CTRL_REG4_A					0x23&lt;br /&gt;
#define CTRL_REG5_A					0x24&lt;br /&gt;
#define CTRL_REG6_A					0x25&lt;br /&gt;
#define REFERENCE_A					0x26&lt;br /&gt;
#define STATUS_REG_A				0x27&lt;br /&gt;
#define OUT_X_L_A					0x28&lt;br /&gt;
#define OUT_X_H_A					0x29&lt;br /&gt;
#define OUT_Y_L_A					0x2a&lt;br /&gt;
#define OUT_Y_H_A					0x2b&lt;br /&gt;
#define OUT_Z_L_A					0x2c&lt;br /&gt;
#define OUT_Z_H_A					0x2d&lt;br /&gt;
#define FIFO_CTRL_REG_A				0x2e&lt;br /&gt;
#define FIFO_SRC_REG_A				0x2f&lt;br /&gt;
#define INT1_CFG_A					0x30&lt;br /&gt;
#define INT1_SOURCE_A				0x31&lt;br /&gt;
#define INT1_THS_A					0x32&lt;br /&gt;
#define INT1_DURATION_A				0x33&lt;br /&gt;
#define INT2_CFG_A					0x34&lt;br /&gt;
#define INT2_SOURCE_A				0x35&lt;br /&gt;
#define INT2_THS_A					0x36&lt;br /&gt;
#define INT2_DURATION_A				0x37&lt;br /&gt;
#define CLICK_CFG_A					0x38&lt;br /&gt;
#define CLICK_SRC_A					0x39&lt;br /&gt;
#define CLICK_THS_A					0x3a&lt;br /&gt;
#define TIME_LIMIT_A				0x3b&lt;br /&gt;
#define TIME_LATENCY_A				0x3c&lt;br /&gt;
#define TIME_WINDOW_A				0x3d&lt;br /&gt;
&lt;br /&gt;
// LSM303DLHC accelerometer register settings:&lt;br /&gt;
#define CTRL_REG1_A_10HZ			0b00100111	// 10Hz &amp;amp; all axes enable&lt;br /&gt;
#define CTRL_REG1_A_50HZ			0b01000111	// 50Hz &amp;amp; all axes enable&lt;br /&gt;
#define CTRL_REG4_A_DEFAULT			0b00000000	// Default (Normal mode)&lt;br /&gt;
#define CTRL_REG4_A_HR				0b00001000	// HR output mode&lt;br /&gt;
&lt;br /&gt;
// LSM303DLHC magnetometer internal registers:&lt;br /&gt;
#define CRA_REG_M					0x00&lt;br /&gt;
#define CRB_REG_M					0x01&lt;br /&gt;
#define MR_REG_M					0x02&lt;br /&gt;
#define OUT_X_H_M					0x03&lt;br /&gt;
#define OUT_X_L_M					0x04&lt;br /&gt;
#define OUT_Z_H_M					0x05&lt;br /&gt;
#define OUT_Z_L_M					0x06&lt;br /&gt;
#define OUT_Y_H_M					0x07&lt;br /&gt;
#define OUT_Y_L_M					0x08&lt;br /&gt;
#define SR_REG_MG					0x09&lt;br /&gt;
#define IRA_REG_M					0x0a&lt;br /&gt;
#define IRB_REG_M					0x0b&lt;br /&gt;
#define IRC_REG_M					0x0c&lt;br /&gt;
#define TEMP_OUT_H_M				0x31&lt;br /&gt;
#define TEMP_OUT_L_M				0x32&lt;br /&gt;
&lt;br /&gt;
// LSM303DLHC magnetometer register settings:&lt;br /&gt;
#define CRA_REG_M_15HZ				0b00010000	// Default (Data rate 15Hz)&lt;br /&gt;
#define CRA_REG_M_15HZ_T_EN			0b10010000	// 15Hz &amp;amp; temperature enable&lt;br /&gt;
#define CRB_REG_M_13GAUSS			0b00100000	// Gain +-1.3Gauss&lt;br /&gt;
#define MR_REG_M_CCM				0b00000000	// Continuous-conversion mode&lt;br /&gt;
#define MR_REG_M_SCM				0b00000001	// Single-conversion mode&lt;br /&gt;
#define MR_REG_M_SLEEP				0b00000011	// Default (Sleep-mode)&lt;br /&gt;
&lt;br /&gt;
extern int16_t x_axisa, y_axisa, z_axisa;&lt;br /&gt;
extern double pitch, roll;&lt;br /&gt;
extern double xa, ya, za;&lt;br /&gt;
extern double the, phi;&lt;br /&gt;
&lt;br /&gt;
extern int16_t x_axism, y_axism, z_axism;&lt;br /&gt;
extern int16_t headingm;&lt;br /&gt;
extern double xm, ym, zm;&lt;br /&gt;
#ifdef GET_TEMP_M&lt;br /&gt;
extern int16_t temperaturem;&lt;br /&gt;
extern double temperature_mag;&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
extern int16_t headingtc;&lt;br /&gt;
&lt;br /&gt;
void LSM303DLHC_A_init(void);&lt;br /&gt;
void readLSM303DLHC_A(void);&lt;br /&gt;
void normalizeLSM303DLHC_A(void);&lt;br /&gt;
void positionLSM303DLHC_A(void);&lt;br /&gt;
&lt;br /&gt;
void LSM303DLHC_M_init(void);&lt;br /&gt;
void readLSM303DLHC_M(void);&lt;br /&gt;
void normalizeLSM303DLHC_M(void);&lt;br /&gt;
int16_t headingLSM303DLHC_M(void);&lt;br /&gt;
&lt;br /&gt;
int16_t headingLSM303DLHC_TC(void);&lt;br /&gt;
&lt;br /&gt;
void LSM303DLHC_init(void);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Analog Yaw-Rate Gyroscope (LY330ALH):&lt;br /&gt;
&lt;br /&gt;
#define LY330ALH_MODE_NORMAL		0			// Power on default&lt;br /&gt;
#define LY330ALH_MODE_SLEEP			1&lt;br /&gt;
#define LY330ALH_MODE_SELFTEST		2&lt;br /&gt;
#define LY330ALH_MODE_POWERDOWN		3			// Shutdown mode&lt;br /&gt;
&lt;br /&gt;
extern int16_t z_axisg;&lt;br /&gt;
&lt;br /&gt;
void LY330ALH_set_mode(uint8_t);&lt;br /&gt;
uint16_t getRP6Base_ADC1(void);&lt;br /&gt;
int16_t LY330ALH_measure(void);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Hot Swappable 2-Wire Bus Buffer (TCA4311A):&lt;br /&gt;
&lt;br /&gt;
//extern uint8_t readyBusbuff;			// See &amp;quot;I2C I/O Port Expander&amp;quot; section&lt;br /&gt;
extern uint8_t errorBusbuff;&lt;br /&gt;
&lt;br /&gt;
#define getReadyBusbuff() (readyBusbuff)&lt;br /&gt;
uint8_t readReadyBusbuff(void);&lt;br /&gt;
void TCA4311A_shutdown(void);&lt;br /&gt;
void TCA4311A_reconnect(void);&lt;br /&gt;
void setRP6Base_PWR(uint8_t);&lt;br /&gt;
void setI2CModulePower(uint8_t);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Button:&lt;br /&gt;
&lt;br /&gt;
//extern uint8_t pressedButton;			// See &amp;quot;I2C I/O Port Expander&amp;quot; section&lt;br /&gt;
&lt;br /&gt;
#define getPressedButton() (pressedButton)&lt;br /&gt;
uint8_t readButton(void);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Status LED:&lt;br /&gt;
&lt;br /&gt;
void setStatusLED(uint8_t);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// RP6 Sensor Board initialisation and shutdown:&lt;br /&gt;
&lt;br /&gt;
void sensor_board_init(void);&lt;br /&gt;
void sensor_board_shutdown(void);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
/******************************************************************************&lt;br /&gt;
 * Additional info&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Changelog:&lt;br /&gt;
 * &lt;br /&gt;
 *  ---&amp;gt; changes are documented in the file &amp;quot;RP6M256_Sensor_BoardLib.c&amp;quot;&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=====Library Source=====&lt;br /&gt;
Datei: RP6M256_Sensor_BoardLib.c&lt;br /&gt;
&amp;lt;pre&amp;gt;/* ****************************************************************************&lt;br /&gt;
 *                           _______________________&lt;br /&gt;
 *                           \| RP6  ROBOT SYSTEM |/&lt;br /&gt;
 *                            \_-_-_-_-_-_-_-_-_-_/           &amp;gt;&amp;gt;&amp;gt; RP6 M256 WIFI&lt;br /&gt;
 * ----------------------------------------------------------------------------&lt;br /&gt;
 * ----------------------------- [c]2014 - Dirk -------------------------------&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * File: RP6M256_Sensor_BoardLib.c&lt;br /&gt;
 * Version: 1.0&lt;br /&gt;
 * Target: RP6 M256 WIFI - ATMEGA2560 @16.00MHz&lt;br /&gt;
 *         and a RP6 Sensor Board (CONRAD 1082384)&lt;br /&gt;
 * Author(s): Dirk&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Description:&lt;br /&gt;
 * This is our new Library that contains basic routines and functions for&lt;br /&gt;
 * accessing the hardwired components of the RP6 Sensor Board (CONRAD 1082384).&lt;br /&gt;
 * This library assumes the RP6 Sensor Board Revision 2.0 (04.07.13).&lt;br /&gt;
 *&lt;br /&gt;
 * There are more sensors and actors, that may be connected to the RP6 Sensor&lt;br /&gt;
 * Board: Many I2C components including a GPS module (CONRAD 1082385), servo&lt;br /&gt;
 *        motors, SHARP IR distance sensors, LEDs, a camera ...&lt;br /&gt;
 * This library doesn't contain functions for these sensors/actors, because&lt;br /&gt;
 * they are not HARDWIRED to the RP6 Sensor Board and may be connected&lt;br /&gt;
 * OPTIONALLY.&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// RP6 Sensor Board hardwired components:&lt;br /&gt;
// - I2C I/O Port Expander (MAX7311)&lt;br /&gt;
// - I2C Real Time Clock (RTC DS1339)&lt;br /&gt;
// - I2C Temperature Sensor (LM75B)&lt;br /&gt;
// - I2C Servo Controller (PCA9685)&lt;br /&gt;
// - I2C LED Driver (TCA6507)&lt;br /&gt;
// - I2C 3D Magnetometer &amp;amp; Accelerometer (LSM303DLHC)&lt;br /&gt;
// - Analog Yaw-Rate Gyroscope (LY330ALH)&lt;br /&gt;
// - Hot Swappable 2-Wire Bus Buffer (TCA4311A)&lt;br /&gt;
// - Button&lt;br /&gt;
// - Status LED&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Includes:&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6M256_Sensor_BoardLib.h&amp;quot; 		&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Variables:&lt;br /&gt;
&lt;br /&gt;
uint8_t registerBuf[13]; &lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C I/O Port Expander (MAX7311):&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Sends the configuration word to a MAX7311.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: config -&amp;gt; Config word for control&lt;br /&gt;
 *                  registers&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void MAX7311_write_cfg(uint16_t config)&lt;br /&gt;
{&lt;br /&gt;
#ifdef SAFE_CONFIG&lt;br /&gt;
	config |= 0b1010000000001000;&lt;br /&gt;
#endif&lt;br /&gt;
	I2CTWI_transmit3Bytes(I2C_SENSOR_PORTEXP_ADR, MAX7311_PORT1_CONFIG, config, (config&amp;gt;&amp;gt;8));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
interrupt_RP6SBstatus_t interrupt_RP6SBstatus;&lt;br /&gt;
&lt;br /&gt;
/** &lt;br /&gt;
 * This function checks all interrupt pins on&lt;br /&gt;
 * the XBUS (INT1..3, INTU).&lt;br /&gt;
 * This function must be called VERY frequently&lt;br /&gt;
 * out of the main loop.&lt;br /&gt;
 * Bigger delays result in slower reaction to&lt;br /&gt;
 * interrupt requests of the RP6 Sensor Board.&lt;br /&gt;
 * Interrupt function table:&lt;br /&gt;
 *   Int. : Function 1      IRQ  Function 2       IRQ&lt;br /&gt;
 *   -------------------------------------------------&lt;br /&gt;
 *   INT1 : LSM303DLHC INT1  H&lt;br /&gt;
 *   INT2 : MAX7311   INT_N  L&lt;br /&gt;
 *   INT3 : LSM303DLHC INT2  H   DS1339 SQW/INT_N  L&lt;br /&gt;
 *   INTU : not used&lt;br /&gt;
 * You can see in the &amp;quot;IRQ&amp;quot; column, which level&lt;br /&gt;
 * (H/L) means an ACTIVE INTERRUPT signal.&lt;br /&gt;
 * The interrupt pin levels (H=true/L=false) are&lt;br /&gt;
 * read into the global interrupt_RP6SBstatus&lt;br /&gt;
 * variable.&lt;br /&gt;
 *&lt;br /&gt;
 * Hints: - This function checks the interrupt&lt;br /&gt;
 *          signals by polling. This is NOT the&lt;br /&gt;
 *          best way to to this job. You will&lt;br /&gt;
 *          have to write your own task, if you&lt;br /&gt;
 *          want to use the Pin Change Interrupt&lt;br /&gt;
 *          function of the ATmega2560&lt;br /&gt;
 *          microcontroller.&lt;br /&gt;
 *        - You cannot use both interrupt sources&lt;br /&gt;
 *          for INT3! So you should not use INT2&lt;br /&gt;
 *          of the LSM303DLHC together with the&lt;br /&gt;
 *          alarm function of the DS1339 (RTC)!&lt;br /&gt;
 *        - Every interrupt signal of the Sensor&lt;br /&gt;
 *          Board may be cut off from the XBUS&lt;br /&gt;
 *          by opening a jumper (Jx):&lt;br /&gt;
 *          INT1 -&amp;gt; J3 (LSM303DLHC INT1)&lt;br /&gt;
 *          INT2 -&amp;gt; J4 (MAX7311 INT_N)&lt;br /&gt;
 *          INT3 -&amp;gt; J2 (DS1339 SQW/INT_N)&lt;br /&gt;
 *          INT3 -&amp;gt; J5 (LSM303DLHC INT2)&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *&lt;br /&gt;
 *   if (!interrupt_RP6SBstatus.portexp)&lt;br /&gt;
 *        writeString_P(&amp;quot;==&amp;gt; MAX7311 INT_N!!!&amp;quot;);&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void task_checkINTs(void)&lt;br /&gt;
{&lt;br /&gt;
	if(IO_SENSOR_INT1_PIN &amp;amp; IO_SENSOR_INT1_IN)	// XBUS INT1 -&amp;gt; PJ3 (PCINT12)&lt;br /&gt;
		interrupt_RP6SBstatus.int1 = true;&lt;br /&gt;
	else&lt;br /&gt;
		interrupt_RP6SBstatus.int1 = false;&lt;br /&gt;
	if(IO_SENSOR_INT2_PIN &amp;amp; IO_SENSOR_INT2_IN)	// XBUS INT2 -&amp;gt; PJ6 (PCINT15)&lt;br /&gt;
		interrupt_RP6SBstatus.int2 = true;&lt;br /&gt;
	else&lt;br /&gt;
		interrupt_RP6SBstatus.int2 = false;&lt;br /&gt;
	if(IO_SENSOR_INT3_PIN &amp;amp; IO_SENSOR_INT3_IN)	// XBUS INT3 -&amp;gt; PJ5 (PCINT14)&lt;br /&gt;
		interrupt_RP6SBstatus.int3 = true;&lt;br /&gt;
	else&lt;br /&gt;
		interrupt_RP6SBstatus.int3 = false;&lt;br /&gt;
//	if(IO_SENSOR_INTU_PIN &amp;amp; IO_SENSOR_INTU_IN)	// XBUS INTU -&amp;gt; PJ4 (PCINT13)&lt;br /&gt;
//		interrupt_RP6SBstatus.intu = true;&lt;br /&gt;
//	else&lt;br /&gt;
//		interrupt_RP6SBstatus.intu = false;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
max7311IOs_t inport;&lt;br /&gt;
uint8_t readyBusbuff;&lt;br /&gt;
uint8_t pressedButton;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function checks all I/O ports (I/O 0.0..1.7)&lt;br /&gt;
 * of the MAX7311 sequentially!&lt;br /&gt;
 * You must call this function frequently out of&lt;br /&gt;
 * the main loop.&lt;br /&gt;
 * The I/O port values (true/false) are read into&lt;br /&gt;
 * the global inport variable.&lt;br /&gt;
 * The global variables readyBusbuff (2-Wire Bus&lt;br /&gt;
 * Buffer: Enable) and pressedButton (Button S1:&lt;br /&gt;
 * Pressed) contain actual values (true/false)&lt;br /&gt;
 * after execution of this task.&lt;br /&gt;
 *&lt;br /&gt;
 * Examples:&lt;br /&gt;
 *&lt;br /&gt;
 *   if (inport.rdy_busbuff)&lt;br /&gt;
 *        writeString_P(&amp;quot;I/O 0.3: High&amp;quot;);&lt;br /&gt;
 *   else writeString_P(&amp;quot;I/O 0.3: Low&amp;quot;);&lt;br /&gt;
 *   if (!inport.drdy_magacc)&lt;br /&gt;
 *        writeString_P(&amp;quot;I/O 1.5: Low&amp;quot;);&lt;br /&gt;
 *   if (pressedButton)&lt;br /&gt;
 *        writeString_P(&amp;quot;Button pressed!&amp;quot;);&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void task_RP6SensorBoard(void)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmitByte(I2C_SENSOR_PORTEXP_ADR, MAX7311_INPUT_PORT1);&lt;br /&gt;
	I2CTWI_readBytes(I2C_SENSOR_PORTEXP_ADR, registerBuf, 2);&lt;br /&gt;
	inport.word = (registerBuf[1] &amp;lt;&amp;lt; 8) + registerBuf[0];&lt;br /&gt;
	readyBusbuff = inport.rdy_busbuff;&lt;br /&gt;
	pressedButton = inport.io2_i2c;&lt;br /&gt;
	pressedButton = !pressedButton;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
max7311IOs_t outport;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Updates the I/O ports with current value from&lt;br /&gt;
 * the global outport variable!&lt;br /&gt;
 * If one or more port pins were configured as&lt;br /&gt;
 * output before, they will be set (high) or&lt;br /&gt;
 * cleared (low).&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *&lt;br /&gt;
 *   outport.word = 0b0000000000001001;&lt;br /&gt;
 *   MAX7311_update();&lt;br /&gt;
 *   // This clears all I/O ports and sets&lt;br /&gt;
 *   // the ports I/O 0.0 and I/O 0.3!&lt;br /&gt;
 *&lt;br /&gt;
 *   // Other possibility:&lt;br /&gt;
 *   outport.pwr_sharp_f = true;&lt;br /&gt;
 *   MAX7311_update();&lt;br /&gt;
 *   // This sets I/O 0.1 and does not&lt;br /&gt;
 *   // affect any other I/O port!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void MAX7311_update(void)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmit3Bytes(I2C_SENSOR_PORTEXP_ADR, MAX7311_OUTPUT_PORT1, outport.word, (outport.word&amp;gt;&amp;gt;8));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Writes the 16-bit data to a MAX7311.&lt;br /&gt;
 * The data are output with those I/O ports that&lt;br /&gt;
 * were configured as output before.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: data -&amp;gt; Data word&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void MAX7311_write(uint16_t data)&lt;br /&gt;
{&lt;br /&gt;
	outport.word = data;&lt;br /&gt;
	MAX7311_update();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Initializes the I/O Port Expander after power&lt;br /&gt;
 * on.&lt;br /&gt;
 *&lt;br /&gt;
 * Hint: If USE_PD5 is defined in the&lt;br /&gt;
 *       configuration header file, this&lt;br /&gt;
 *       function uses the RP6M256 portpin,&lt;br /&gt;
 *       that is connected to plug I/O: Pin 9&lt;br /&gt;
 *       instead of MAX7311 I/O 1.0!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void MAX7311_init(void)&lt;br /&gt;
{&lt;br /&gt;
#ifdef USE_PD5&lt;br /&gt;
	MAX7311_write_cfg(MAX7311_CONFIG_USE_PD5);&lt;br /&gt;
	IO_SENSOR_TCA4311A_EN_DDR |= IO_SENSOR_TCA4311A_EN_IN;		// Output&lt;br /&gt;
	IO_SENSOR_TCA4311A_EN_PORT |= IO_SENSOR_TCA4311A_EN_IN;		// High&lt;br /&gt;
#else&lt;br /&gt;
	MAX7311_write_cfg(MAX7311_CONFIG_DEFAULT);&lt;br /&gt;
#endif&lt;br /&gt;
	MAX7311_write(MAX7311_OUTPUT_DEFAULT);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Real Time Clock (RTC DS1339):&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function converts a BCD to a DEC value.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
uint8_t BCD2DEC(uint8_t bcd)&lt;br /&gt;
{&lt;br /&gt;
	return ((bcd &amp;gt;&amp;gt; 4) * 10 + (bcd &amp;amp; 0x0f));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function converts a DEC to a BCD value.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
uint8_t DEC2BCD(uint8_t dec)&lt;br /&gt;
{uint8_t units = dec % 10;&lt;br /&gt;
	if (dec /= 10) {&lt;br /&gt;
		return (units + (DEC2BCD(dec) &amp;lt;&amp;lt; 4));&lt;br /&gt;
	}&lt;br /&gt;
	else {&lt;br /&gt;
		return units;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Sends the configuration byte to a DS1339.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: Config byte for control register&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void DS1339_write_cfg(uint8_t config)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_RTC_ADR, DS1339_CONTROL, config);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Initializes the DS1339 Trickle Charger&lt;br /&gt;
 * function to the default for the RP6 Sensor&lt;br /&gt;
 * Board: One diode and 2kOhm resistor.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void DS1339_init(void)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_RTC_ADR, DS1339_TRICKLE_CHARGER, DS1339_TRICKLE_CHARGER_DEFAULT);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Reads all data registers of the Real Time Clock (RTC).&lt;br /&gt;
 * They are stored in the time &amp;amp; date variables defined in&lt;br /&gt;
 * the library header.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void DS1339_read(void)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmitByte(I2C_SENSOR_RTC_ADR, DS1339_SECONDS);&lt;br /&gt;
	I2CTWI_readBytes(I2C_SENSOR_RTC_ADR, registerBuf, 7);&lt;br /&gt;
	rtc_time.second = BCD2DEC(registerBuf[0]);&lt;br /&gt;
	rtc_time.minute = BCD2DEC(registerBuf[1]);&lt;br /&gt;
	rtc_time.hour = BCD2DEC(registerBuf[2] &amp;amp; 0x3f);&lt;br /&gt;
	rtc_date.weekday = (registerBuf[3] &amp;amp; 0x07);&lt;br /&gt;
	rtc_date.day = BCD2DEC(registerBuf[4]);&lt;br /&gt;
	rtc_date.month = BCD2DEC(registerBuf[5] &amp;amp; 0x7f);&lt;br /&gt;
	if(registerBuf[5] &amp;amp; 0x80) rtc_date.year = 100;&lt;br /&gt;
	else rtc_date.year = 0;&lt;br /&gt;
	rtc_date.year += BCD2DEC(registerBuf[6]);&lt;br /&gt;
	rtc_date.year += 2000;&lt;br /&gt;
	rtc_time.dst = 0;&lt;br /&gt;
#ifdef CALC_DST&lt;br /&gt;
	// Calculate MESZ (DST):&lt;br /&gt;
	uint8_t wday = rtc_date.weekday;			// Weekday [1..7 = R_MO..R_SU]&lt;br /&gt;
	if(wday == 7) wday = 0;&lt;br /&gt;
	if(rtc_date.month &amp;lt; 3 || rtc_date.month &amp;gt; 10) {&lt;br /&gt;
		return;&lt;br /&gt;
	}&lt;br /&gt;
	if((rtc_date.day - wday &amp;gt;= 25)&lt;br /&gt;
	 &amp;amp;&amp;amp; (wday || rtc_time.hour &amp;gt;= 2)) {&lt;br /&gt;
		if(rtc_date.month == 10)&lt;br /&gt;
			return;&lt;br /&gt;
	}&lt;br /&gt;
	else {&lt;br /&gt;
		if(rtc_date.month == 3) {&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	rtc_time.dst = 1;&lt;br /&gt;
#endif&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Writes the time &amp;amp; date infos in the variables defined in&lt;br /&gt;
 * the library header to the Real Time Clock (RTC).&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void DS1339_write(void)&lt;br /&gt;
{&lt;br /&gt;
	registerBuf[0] = DS1339_SECONDS;&lt;br /&gt;
	registerBuf[1] = DEC2BCD(rtc_time.second);&lt;br /&gt;
	registerBuf[2] = DEC2BCD(rtc_time.minute);&lt;br /&gt;
	registerBuf[3] = DEC2BCD(rtc_time.hour);&lt;br /&gt;
	registerBuf[4] = rtc_date.weekday;&lt;br /&gt;
	registerBuf[5] = DEC2BCD(rtc_date.day);&lt;br /&gt;
	registerBuf[6] = DEC2BCD(rtc_date.month);&lt;br /&gt;
	registerBuf[7] = DEC2BCD(rtc_date.year - 2000);&lt;br /&gt;
	I2CTWI_transmitBytes(I2C_SENSOR_RTC_ADR, &amp;amp;registerBuf[0], 8);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Temperature Sensor (LM75B):&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Sends the configuration byte to a LM75B.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: Config byte for Conf register&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void LM75B_write_cfg(uint8_t config)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_TEMP_ADR, LM75B_CONF, config);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
uint8_t temperature_low;&lt;br /&gt;
uint8_t temperature_high;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Reads the two data registers of the temperature&lt;br /&gt;
 * sensor's Temp register.&lt;br /&gt;
 * They are stored in the variables temperature_low&lt;br /&gt;
 * and _high.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void LM75B_read(void)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmitByte(I2C_SENSOR_TEMP_ADR, LM75B_TEMP);&lt;br /&gt;
	I2CTWI_readBytes(I2C_SENSOR_TEMP_ADR, registerBuf, 2);&lt;br /&gt;
	temperature_high = registerBuf[0];&lt;br /&gt;
	temperature_low = registerBuf[1];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
double temperature;						// Temperature [°C]&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Calculates and returns the temperature value&lt;br /&gt;
 * by using the data read from the LM75B with&lt;br /&gt;
 * the function LM75B_read(). The sensor is&lt;br /&gt;
 * designed for 11 bit measurement and 0.125°C&lt;br /&gt;
 * resolution.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
double LM75B_calculate(void)&lt;br /&gt;
{&lt;br /&gt;
	int16_t tempraw = 0;&lt;br /&gt;
	double temp;&lt;br /&gt;
&lt;br /&gt;
	tempraw = (getTemperatureHigh() &amp;lt;&amp;lt; 8) | getTemperatureLow();&lt;br /&gt;
	tempraw &amp;gt;&amp;gt;= 5;&lt;br /&gt;
	if (tempraw &amp;amp; 1024)							// Calculate temperature&lt;br /&gt;
		tempraw = (tempraw &amp;amp; 1023) - 1024;&lt;br /&gt;
	else&lt;br /&gt;
		tempraw = tempraw &amp;amp; 1023;&lt;br /&gt;
	temp = tempraw * 0.125;&lt;br /&gt;
	return temp;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Performs a 11 bit measurement and returns the&lt;br /&gt;
 * temperature [°C]. The sensor has a measuring&lt;br /&gt;
 * cycle of 100ms. So it makes no sense calling&lt;br /&gt;
 * this function at a frequency above 10Hz.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
double LM75B_measure(void)&lt;br /&gt;
{&lt;br /&gt;
//	LM75B_init();&lt;br /&gt;
	LM75B_read();								// Read data&lt;br /&gt;
	return (LM75B_calculate());					// Calculate value&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Servo Controller (PCA9685):&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Call this once before using the servo function.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: PWM frequency [40..1000 Hz]&lt;br /&gt;
 *&lt;br /&gt;
 * Hints: - Default servo frequency is 50 Hz!&lt;br /&gt;
 *        - The servo power is NOT switched on by&lt;br /&gt;
 *          this function!&lt;br /&gt;
 *&lt;br /&gt;
 * There is also a macro initServo(freq), which&lt;br /&gt;
 * does exactly the same as this function.&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *   initServo(50);&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void PCA9685_init(uint16_t freq)&lt;br /&gt;
{&lt;br /&gt;
	outport.oen_servo = false;					// I/O 1.3: Low&lt;br /&gt;
	MAX7311_update();&lt;br /&gt;
	if ((freq &amp;lt; 40) || (freq &amp;gt; 1000)) freq = 50;&lt;br /&gt;
	I2CTWI_transmitByte(I2C_SENSOR_SERVO_ADR, PCA9685_MODE2);&lt;br /&gt;
	uint8_t last_mode = I2CTWI_readByte(I2C_SENSOR_SERVO_ADR);&lt;br /&gt;
	last_mode &amp;amp;= ~PCA9685_MODE2_INVRT;			// Clear INVRT bit&lt;br /&gt;
	last_mode |= PCA9685_MODE2_OUTDRV;			// Set OUTDRV bit&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_SERVO_ADR, PCA9685_MODE2, last_mode);&lt;br /&gt;
	I2CTWI_transmitByte(I2C_SENSOR_SERVO_ADR, PCA9685_MODE1);&lt;br /&gt;
	last_mode = I2CTWI_readByte(I2C_SENSOR_SERVO_ADR);&lt;br /&gt;
	last_mode |= PCA9685_MODE1_AI;				// Set AI bit&lt;br /&gt;
	uint8_t mode1 = last_mode;&lt;br /&gt;
	mode1 |= PCA9685_MODE1_SLEEP;				// Set SLEEP bit&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_SERVO_ADR, PCA9685_MODE1, mode1);&lt;br /&gt;
	uint8_t prescale = (uint8_t) (F_PCA9685 / 4096 / freq - 0.5);&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_SERVO_ADR, PCA9685_PRE_SCALE, prescale);&lt;br /&gt;
	last_mode &amp;amp;= ~PCA9685_MODE1_SLEEP;			// Clear SLEEP bit&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_SERVO_ADR, PCA9685_MODE1, last_mode);&lt;br /&gt;
	mSleep(1);&lt;br /&gt;
	last_mode |= PCA9685_MODE1_RESTART;			// Clear RESTART bit&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_SERVO_ADR, PCA9685_MODE1, last_mode);&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_SERVO_ADR, PCA9685_LED8_ON_H, 0x10);&lt;br /&gt;
	return;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/** &lt;br /&gt;
 * Returns the channel belonging to a servo number.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: number -&amp;gt; Servo number [1..8]&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
uint8_t servo(uint8_t number)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t channel;&lt;br /&gt;
&lt;br /&gt;
	switch (number) {&lt;br /&gt;
		case 1 :&lt;br /&gt;
			channel = CH_SERVO_1; break;&lt;br /&gt;
		case 2 :&lt;br /&gt;
			channel = CH_SERVO_2; break;&lt;br /&gt;
		case 3 :&lt;br /&gt;
			channel = CH_SERVO_3; break;&lt;br /&gt;
		case 4 :&lt;br /&gt;
			channel = CH_SERVO_4; break;&lt;br /&gt;
		case 5 :&lt;br /&gt;
			channel = CH_SERVO_5; break;&lt;br /&gt;
		case 6 :&lt;br /&gt;
			channel = CH_SERVO_6; break;&lt;br /&gt;
		case 7 :&lt;br /&gt;
			channel = CH_SERVO_7; break;&lt;br /&gt;
		case 8 :&lt;br /&gt;
			channel = CH_SERVO_8; break;&lt;br /&gt;
		default : channel = CH_SERVO_1;&lt;br /&gt;
	}&lt;br /&gt;
	return channel;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This is the servo position set function.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: channel -&amp;gt; Channel number [1..16]&lt;br /&gt;
 *        pos     -&amp;gt; Servo position [SERVOx_LT..SERVOx_RT]&lt;br /&gt;
 *&lt;br /&gt;
 * Hints: - A servo position of 205 means 1 ms servo impulse,&lt;br /&gt;
 *          a position of 410 means a 2 ms servo impulse!&lt;br /&gt;
 *          You may calculate the servo impulse length by:&lt;br /&gt;
 *          ==&amp;gt; Impulse [ms] = servo position / 204.8 &amp;lt;==&lt;br /&gt;
 *          (Formula only valid for a PWM of 50 Hz!)&lt;br /&gt;
 *&lt;br /&gt;
 * There is also a macro setServo(servo, pos), which&lt;br /&gt;
 * does nearly the same as this function, but the first&lt;br /&gt;
 * parameter is the servo and NOT the channel number.&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *   setServo(2,300);&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void PCA9685_set(uint8_t channel, uint16_t pos)&lt;br /&gt;
{&lt;br /&gt;
	if ((channel == 0) || (channel &amp;gt; 16))&lt;br /&gt;
		return;&lt;br /&gt;
	uint8_t reg = channel * 4 + 4;				// Register LEDx_OFF_L&lt;br /&gt;
	I2CTWI_transmit3Bytes(I2C_SENSOR_SERVO_ADR, reg, (pos &amp;amp; 0x00ff), (pos &amp;gt;&amp;gt; 8));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * If the servos are not moving for a while, the&lt;br /&gt;
 * servo function can be stopped with this&lt;br /&gt;
 * function (PCA9685 set to sleep mode).&lt;br /&gt;
 *&lt;br /&gt;
 * Hint: The servo power is NOT switched off by&lt;br /&gt;
 *       this function!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void PCA9685_shutdown(void)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_SERVO_ADR, PCA9685_ALL_LED_OFF_H, 0x10);&lt;br /&gt;
	I2CTWI_transmitByte(I2C_SENSOR_SERVO_ADR, PCA9685_MODE1);&lt;br /&gt;
	uint8_t mode1 = I2CTWI_readByte(I2C_SENSOR_SERVO_ADR);&lt;br /&gt;
	mode1 |= PCA9685_MODE1_SLEEP;				// Set SLEEP bit&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_SERVO_ADR, PCA9685_MODE1, mode1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * If the servo function was stopped with the&lt;br /&gt;
 * function PCA9685_shutdown() before, it can be&lt;br /&gt;
 * (re)started again with this function.&lt;br /&gt;
 *&lt;br /&gt;
 * Hint: The servo power is NOT switched on by&lt;br /&gt;
 *       this function!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void PCA9685_restart(void)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmitByte(I2C_SENSOR_SERVO_ADR, PCA9685_MODE1);&lt;br /&gt;
	uint8_t mode1 = I2CTWI_readByte(I2C_SENSOR_SERVO_ADR);&lt;br /&gt;
	if (mode1 &amp;amp; PCA9685_MODE1_RESTART) {		// RESTART bit set?&lt;br /&gt;
		mode1 &amp;amp;= ~PCA9685_MODE1_SLEEP;			// Clear SLEEP bit&lt;br /&gt;
		I2CTWI_transmit2Bytes(I2C_SENSOR_SERVO_ADR, PCA9685_MODE1, mode1);&lt;br /&gt;
		mSleep(1);&lt;br /&gt;
		mode1 |= PCA9685_MODE1_RESTART;			// Clear RESTART bit&lt;br /&gt;
		I2CTWI_transmit2Bytes(I2C_SENSOR_SERVO_ADR, PCA9685_MODE1, mode1);&lt;br /&gt;
		I2CTWI_transmit2Bytes(I2C_SENSOR_SERVO_ADR, PCA9685_ALL_LED_OFF_H, 0);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/** &lt;br /&gt;
 * With this function you can switch the servo&lt;br /&gt;
 * power on or off.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: pwr -&amp;gt; 0 (false) = servo power off&lt;br /&gt;
 *               &amp;gt;0 (true) = servo power on&lt;br /&gt;
 *&lt;br /&gt;
 * Hints: - If connected servos are not used, you&lt;br /&gt;
 *          should always switch the servo power off&lt;br /&gt;
 *          (default) to save energy!&lt;br /&gt;
 *        - The PCA9685 is NOT restarted or put into&lt;br /&gt;
 *          shutdown mode by this function!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void setServoPower(uint8_t pwr)&lt;br /&gt;
{&lt;br /&gt;
	if(pwr &amp;gt; 0)&lt;br /&gt;
		outport.pwr_servo = true;				// I/O 1.4: High&lt;br /&gt;
	else&lt;br /&gt;
		outport.pwr_servo = false;				// I/O 1.4: Low&lt;br /&gt;
	MAX7311_update();&lt;br /&gt;
}	&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C LED Driver (TCA6507):&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Sends the configuration byte to TCA6507's&lt;br /&gt;
 * internal registers.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: reg    -&amp;gt; Register address [0..10]&lt;br /&gt;
 *        config -&amp;gt; Config byte for internal&lt;br /&gt;
 *                  registers&lt;br /&gt;
 *&lt;br /&gt;
 * Hints: - With this function you can write to&lt;br /&gt;
 *          all internal registers of the LED&lt;br /&gt;
 *          driver, see &amp;quot;Registers:&amp;quot; in the&lt;br /&gt;
 *          library header file!&lt;br /&gt;
 *        - Mainly you will use this function&lt;br /&gt;
 *          for setting time (regs 3..7) and&lt;br /&gt;
 *          intensity (regs 8, 9) values.&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *   TCA6507_write_cfg(TCA6507_MAXIMUM_INTENSITY,0x77);&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void TCA6507_write_cfg(uint8_t reg, uint8_t config)&lt;br /&gt;
{&lt;br /&gt;
	if(reg &amp;gt; 10) reg = 0;&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_LEDDRIVER_ADR, reg, config);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
uint8_t select[3];&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Updates the LED driver select registers (0..2)&lt;br /&gt;
 * with the global select array!&lt;br /&gt;
 *&lt;br /&gt;
 * Hint: - Also have a look at Table 4 in the&lt;br /&gt;
 *         TCA6507 datasheet!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void TCA6507_update(void)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmit4Bytes(I2C_SENSOR_LEDDRIVER_ADR, (TCA6507_SELECT0 | 0x10), select[0], select[1], select[2]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This is the LED state set function.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: led   -&amp;gt; LED number [0..6]&lt;br /&gt;
 *        state -&amp;gt; LED state  [0..7]&lt;br /&gt;
 *&lt;br /&gt;
 * Hints: - Possible driver states [0..7] see&lt;br /&gt;
 *          &amp;quot;Output states:&amp;quot; in the library&lt;br /&gt;
 *          header file!&lt;br /&gt;
 *        - Also have a look at Table 4 in the&lt;br /&gt;
 *          TCA6507 datasheet!&lt;br /&gt;
 *&lt;br /&gt;
 * There is also a macro setLED(led, state), which&lt;br /&gt;
 * does exactly the same as this function.&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *   setLED(1,4);&lt;br /&gt;
 *   // Switches LED1 ON&lt;br /&gt;
 *   // ... OR ...&lt;br /&gt;
 *   setLED(LED1,STATE_ON);&lt;br /&gt;
 *   // does the same.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void TCA6507_set(uint8_t led, uint8_t state)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t i, mask;&lt;br /&gt;
&lt;br /&gt;
	if(led &amp;gt; 6) led = 0;&lt;br /&gt;
	led = 1 &amp;lt;&amp;lt; led;&lt;br /&gt;
	mask = 1;&lt;br /&gt;
	for(i = 0; i &amp;lt; 3; i++) {&lt;br /&gt;
		select[i] &amp;amp;= ~led;&lt;br /&gt;
		if(state &amp;amp; mask)&lt;br /&gt;
			select[i] |= led;&lt;br /&gt;
		mask &amp;lt;&amp;lt;= 1;&lt;br /&gt;
	}&lt;br /&gt;
	TCA6507_update();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * If the LEDs are not needed for a while, the&lt;br /&gt;
 * LED driver can be stopped with this function&lt;br /&gt;
 * (TCA6507 set to shutdown mode).&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void TCA6507_shutdown(void)&lt;br /&gt;
{&lt;br /&gt;
	outport.en_leddriv = false;					// I/O 0.4: Low&lt;br /&gt;
	MAX7311_update();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * If the LED driver was stopped with the&lt;br /&gt;
 * function TCA6507_shutdown() before, it can be&lt;br /&gt;
 * (re)started again with this function.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void TCA6507_restart(void)&lt;br /&gt;
{&lt;br /&gt;
	outport.en_leddriv = true;					// I/O 0.4: High&lt;br /&gt;
	MAX7311_update();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Initializes the LED driver after power on by&lt;br /&gt;
 * switching all LEDs off.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void TCA6507_init(void)&lt;br /&gt;
{&lt;br /&gt;
	select[0] = 0;&lt;br /&gt;
	select[1] = 0;&lt;br /&gt;
	select[2] = 0;&lt;br /&gt;
	TCA6507_update();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C 3D Magnetometer &amp;amp; Accelerometer (LSM303DLHC):&lt;br /&gt;
&lt;br /&gt;
// --------------------------------------------&lt;br /&gt;
// LSM303DLHC accelerometer functions:&lt;br /&gt;
int16_t x_axisa, y_axisa, z_axisa;&lt;br /&gt;
double pitch, roll;&lt;br /&gt;
double xa, ya, za;&lt;br /&gt;
double the, phi;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Call this once before using the 3D-Accelerometer.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void LSM303DLHC_A_init(void)&lt;br /&gt;
{&lt;br /&gt;
	// Set normal power mode, 10 Hz data rate, all axes enabled:&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_LSM303DLHC_A_ADR, CTRL_REG1_A, CTRL_REG1_A_10HZ);&lt;br /&gt;
	mSleep(10);&lt;br /&gt;
	// Set HD mode:&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_LSM303DLHC_A_ADR, CTRL_REG4_A, CTRL_REG4_A_HR);&lt;br /&gt;
	mSleep(10);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function reads the X-axis, Y-axis and Z-axis values&lt;br /&gt;
 * from the LSM303DLHC accelerometer and stores them in the&lt;br /&gt;
 * global variables x_axisa, y_axisa and z_axisa.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void readLSM303DLHC_A(void)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t readBuf[6];&lt;br /&gt;
&lt;br /&gt;
	I2CTWI_transmitByte(I2C_SENSOR_LSM303DLHC_A_ADR, (OUT_X_L_A | 0x80));&lt;br /&gt;
	I2CTWI_readBytes(I2C_SENSOR_LSM303DLHC_A_ADR, readBuf, 6); // Read  X-/Y-/Z-axis&lt;br /&gt;
	// xb = y:&lt;br /&gt;
	x_axisa = ((readBuf[OUT_Y_H_A - OUT_X_L_A] &amp;lt;&amp;lt; 8) + readBuf[OUT_Y_L_A - OUT_X_L_A]) / 16;&lt;br /&gt;
	// yb = x:&lt;br /&gt;
	y_axisa = ((readBuf[OUT_X_H_A - OUT_X_L_A] &amp;lt;&amp;lt; 8) + readBuf[OUT_X_L_A - OUT_X_L_A]) / 16;&lt;br /&gt;
	// zb = z:&lt;br /&gt;
	z_axisa = ((readBuf[OUT_Z_H_A - OUT_X_L_A] &amp;lt;&amp;lt; 8) + readBuf[OUT_Z_L_A - OUT_X_L_A]) / 16;&lt;br /&gt;
	mSleep(10);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function limits and normalizes the x-axisa,&lt;br /&gt;
 * y-axisa and z-axisa values read from the LSM303DLHC&lt;br /&gt;
 * accelerometer with the function readLSM303DLHC_A() and&lt;br /&gt;
 * stores them in the global double variables xa, ya and&lt;br /&gt;
 * za.&lt;br /&gt;
 * It also calculates the position in space in form of the&lt;br /&gt;
 * tilt angles (the = pitch, phi = roll) and stores them&lt;br /&gt;
 * in the global double variables the and phi.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void normalizeLSM303DLHC_A(void)&lt;br /&gt;
{&lt;br /&gt;
	// Limit raw values:&lt;br /&gt;
	if (x_axisa &amp;lt; MIN_X_A) x_axisa = MIN_X_A;&lt;br /&gt;
	if (x_axisa &amp;gt; MAX_X_A) x_axisa = MAX_X_A;&lt;br /&gt;
	if (y_axisa &amp;lt; MIN_Y_A) y_axisa = MIN_Y_A;&lt;br /&gt;
	if (y_axisa &amp;gt; MAX_Y_A) y_axisa = MAX_Y_A;&lt;br /&gt;
	if (z_axisa &amp;lt; MIN_Z_A) z_axisa = MIN_Z_A;&lt;br /&gt;
	if (z_axisa &amp;gt; MAX_Z_A) z_axisa = MAX_Z_A;&lt;br /&gt;
	xa = (double) x_axisa / 1000.0;&lt;br /&gt;
	ya = (double) y_axisa / 1000.0;&lt;br /&gt;
	za = (double) z_axisa / 1000.0;&lt;br /&gt;
	// Calculate Pitch and Roll:&lt;br /&gt;
	phi = asin(xa);								// Calculate the and phi&lt;br /&gt;
	the = asin(ya / cos(the));					//  from the raw values&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function calculates the position in space by&lt;br /&gt;
 * using the the and phi values (see function&lt;br /&gt;
 * normalizeLSM303DLHC_A()!). It stores the position&lt;br /&gt;
 * in the global double variables pitch and roll. &lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void positionLSM303DLHC_A(void)&lt;br /&gt;
{&lt;br /&gt;
	pitch = the * 180 / M_PI + OFFSET_PITCH_A;&lt;br /&gt;
	roll = phi * 180 / M_PI + OFFSET_ROLL_A;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// LSM303DLHC magnetometer functions:&lt;br /&gt;
int16_t x_axism, y_axism, z_axism;&lt;br /&gt;
int16_t headingm;&lt;br /&gt;
double xm, ym, zm;&lt;br /&gt;
#ifdef GET_TEMP_M&lt;br /&gt;
int16_t temperaturem;&lt;br /&gt;
double temperature_mag;&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
int16_t headingtc;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Call this once before using the 3D-Compass.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void LSM303DLHC_M_init(void)&lt;br /&gt;
{&lt;br /&gt;
#ifdef GET_TEMP_M&lt;br /&gt;
	// Set Data output rate to 15Hz, enable temperature sensor:&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_LSM303DLHC_M_ADR, CRA_REG_M, CRA_REG_M_15HZ_T_EN);&lt;br /&gt;
#else&lt;br /&gt;
	// Set Data output rate to 15Hz:&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_LSM303DLHC_M_ADR, CRA_REG_M, CRA_REG_M_15HZ);&lt;br /&gt;
#endif&lt;br /&gt;
	mSleep(10);&lt;br /&gt;
	// Set Gain to +-1.3Gauss:&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_LSM303DLHC_M_ADR, CRB_REG_M, CRB_REG_M_13GAUSS);&lt;br /&gt;
	mSleep(10);&lt;br /&gt;
	// Set Continuous-conversion mode:&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_LSM303DLHC_M_ADR, MR_REG_M, MR_REG_M_CCM);&lt;br /&gt;
	mSleep(10);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function reads the X-axis, Y-axis, Z-axis and&lt;br /&gt;
 * temperature values from the LSM303DLHC magnetometer&lt;br /&gt;
 * and stores them in the global variables x_axism,&lt;br /&gt;
 * y_axism, z_axism and temperaturem.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void readLSM303DLHC_M(void)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t readBuf[6];&lt;br /&gt;
&lt;br /&gt;
	I2CTWI_transmitByte(I2C_SENSOR_LSM303DLHC_M_ADR, OUT_X_H_M);&lt;br /&gt;
	I2CTWI_readBytes(I2C_SENSOR_LSM303DLHC_M_ADR, readBuf, 6); // Read  X-/Y-/Z-axis&lt;br /&gt;
	// xb = x:&lt;br /&gt;
	x_axism = (readBuf[OUT_X_H_M - OUT_X_H_M] &amp;lt;&amp;lt; 8) + readBuf[OUT_X_L_M - OUT_X_H_M];&lt;br /&gt;
	// yb = y:&lt;br /&gt;
	y_axism = (readBuf[OUT_Y_H_M - OUT_X_H_M] &amp;lt;&amp;lt; 8) + readBuf[OUT_Y_L_M - OUT_X_H_M];&lt;br /&gt;
	// zb = z:&lt;br /&gt;
	z_axism = (readBuf[OUT_Z_H_M - OUT_X_H_M] &amp;lt;&amp;lt; 8) + readBuf[OUT_Z_L_M - OUT_X_H_M];&lt;br /&gt;
	mSleep(10);&lt;br /&gt;
#ifdef GET_TEMP_M&lt;br /&gt;
	// Read temperature raw value:&lt;br /&gt;
	I2CTWI_transmitByte(I2C_SENSOR_LSM303DLHC_M_ADR, TEMP_OUT_H_M);&lt;br /&gt;
	readBuf[0] = I2CTWI_readByte(I2C_SENSOR_LSM303DLHC_M_ADR);&lt;br /&gt;
	I2CTWI_transmitByte(I2C_SENSOR_LSM303DLHC_M_ADR, TEMP_OUT_L_M);&lt;br /&gt;
	readBuf[1] = I2CTWI_readByte(I2C_SENSOR_LSM303DLHC_M_ADR);&lt;br /&gt;
	temperaturem = (readBuf[0] &amp;lt;&amp;lt; 8) | readBuf[1];&lt;br /&gt;
	temperaturem &amp;gt;&amp;gt;= 4;&lt;br /&gt;
	if (temperaturem &amp;amp; 2048)					// Calculate temperature&lt;br /&gt;
		temperaturem = (temperaturem &amp;amp; 2047) - 2048;&lt;br /&gt;
	else&lt;br /&gt;
		temperaturem = temperaturem &amp;amp; 2047;&lt;br /&gt;
	mSleep(10);&lt;br /&gt;
#endif&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function compensates hard iron effects and&lt;br /&gt;
 * scales the x-axism, y-axism and z-axism values read&lt;br /&gt;
 * from the LSM303DLHC magnetometer with the function&lt;br /&gt;
 * readLSM303DLHC_M() and stores them in the global&lt;br /&gt;
 * double variables xm, ym and zm.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void normalizeLSM303DLHC_M(void)&lt;br /&gt;
{&lt;br /&gt;
	// Add hard iron offsets:&lt;br /&gt;
	x_axism += OFFSET_X_M;&lt;br /&gt;
	y_axism += OFFSET_Y_M;&lt;br /&gt;
	z_axism += OFFSET_Z_M;&lt;br /&gt;
	// Scale raw values:&lt;br /&gt;
	xm = (x_axism - MIN_X_M) / (MAX_X_M - MIN_X_M) * 2 - 1;&lt;br /&gt;
	ym = (y_axism - MIN_Y_M) / (MAX_Y_M - MIN_Y_M) * 2 - 1;&lt;br /&gt;
	zm = (z_axism - MIN_Z_M) / (MAX_Z_M - MIN_Z_M) * 2 - 1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function calculates the heading by using the&lt;br /&gt;
 * normalized sensor values xm and ym (see function&lt;br /&gt;
 * normalizeLSM303DLHC_M()!). The heading is a value&lt;br /&gt;
 * from 0° to 359°. If the robot's front (and the&lt;br /&gt;
 * RP6 Sensor Board's front edge with the two&lt;br /&gt;
 * headlights) points to ...&lt;br /&gt;
 *   north -&amp;gt; heading is 0°,&lt;br /&gt;
 *   east  -&amp;gt; heading is 90°,&lt;br /&gt;
 *   south -&amp;gt; heading is 180°,&lt;br /&gt;
 *   west  -&amp;gt; heading is 270°.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
int16_t headingLSM303DLHC_M(void)&lt;br /&gt;
{&lt;br /&gt;
	double hdg = atan2(ym, xm) * 180 / M_PI + DECLINATION_M;&lt;br /&gt;
	if(hdg &amp;lt; 0.0) hdg += 360.0;&lt;br /&gt;
	return ((int16_t) hdg);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// --------------------------------------------&lt;br /&gt;
/**&lt;br /&gt;
 * This function calculates the TILT COMPENSATED&lt;br /&gt;
 * heading by using accelerometer (the, phi) AND&lt;br /&gt;
 * magnetometer (xm, ym, zm) data. The heading is a&lt;br /&gt;
 * value from 0° to 359°. If the robot's front (and&lt;br /&gt;
 * the RP6 Sensor Board's front edge with the two&lt;br /&gt;
 * headlights) points to ...&lt;br /&gt;
 *   north -&amp;gt; heading is 0°,&lt;br /&gt;
 *   east  -&amp;gt; heading is 90°,&lt;br /&gt;
 *   south -&amp;gt; heading is 180°,&lt;br /&gt;
 *   west  -&amp;gt; heading is 270°.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
int16_t headingLSM303DLHC_TC(void)&lt;br /&gt;
{&lt;br /&gt;
	double hdgtc, xh, yh;&lt;br /&gt;
&lt;br /&gt;
	xh = xm * cos(the) + zm * sin(the);&lt;br /&gt;
	yh = xm * sin(phi) * sin(the) + ym * cos(phi) - zm * sin(phi) * cos(the);&lt;br /&gt;
//	zh = -xm * cos(phi) * sin(the) + ym * sin(phi) + zm * cos(phi) * cos(the);&lt;br /&gt;
	hdgtc = atan2(yh, xh) * 180 / M_PI + DECLINATION_M;&lt;br /&gt;
	if(hdgtc &amp;lt; 0.0) hdgtc += 360.0;&lt;br /&gt;
	return ((int16_t) hdgtc);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// --------------------------------------------&lt;br /&gt;
/**&lt;br /&gt;
 * Call this once before using the LSM303DLHC.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void LSM303DLHC_init(void)&lt;br /&gt;
{&lt;br /&gt;
	LSM303DLHC_A_init();						// Accelerometer init&lt;br /&gt;
	LSM303DLHC_M_init();						// Magnetometer init&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Analog Yaw-Rate Gyroscope (LY330ALH):&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Sets the LY330ALH mode of operation.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: mode -&amp;gt; Mode [0..3]&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void LY330ALH_set_mode(uint8_t mode)&lt;br /&gt;
{&lt;br /&gt;
	outport.pd_gyro = false;					// I/O 0.6: Low&lt;br /&gt;
	outport.st_gyro = false;					// I/O 0.7: Low&lt;br /&gt;
	if(mode &amp;amp; 1) outport.pd_gyro = true;&lt;br /&gt;
	if(mode &amp;amp; 2) outport.st_gyro = true;&lt;br /&gt;
	MAX7311_update();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Reads the ADC1 value from the RP6Base.&lt;br /&gt;
 *&lt;br /&gt;
 * Hints: - The RP6Base input ADC1 has to be&lt;br /&gt;
 *          connected to the USRBUS: Pin 2 on&lt;br /&gt;
 *          the RP6 mainboard!&lt;br /&gt;
 *        - The RP6Base_I2CSlave program has to&lt;br /&gt;
 *          be loaded into the RP6Base&lt;br /&gt;
 *          microcontroller!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
uint16_t getRP6Base_ADC1(void)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_readRegisters(I2C_RP6_BASE_ADR, I2C_REG_ADC_ADC1_L, registerBuf, 2);&lt;br /&gt;
	return (registerBuf[0] + (registerBuf[1] &amp;lt;&amp;lt; 8));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int16_t z_axisg;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Performs a LY330ALH gyroscope measurement and&lt;br /&gt;
 * returns the angular rate (velocity).&lt;br /&gt;
 * Positive values mean an angular rate while&lt;br /&gt;
 * rotating LEFT and negative values while&lt;br /&gt;
 * rotating RIGHT!&lt;br /&gt;
 * The global integer variable z_axisg also&lt;br /&gt;
 * contains the measurement result.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
int16_t LY330ALH_measure(void)&lt;br /&gt;
{&lt;br /&gt;
	z_axisg = getRP6Base_ADC1();				// Read raw data&lt;br /&gt;
	z_axisg -= ADCVAL_ZERORATE_LEVEL;			// Calculate value&lt;br /&gt;
	return (z_axisg);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Hot Swappable 2-Wire Bus Buffer (TCA4311A):&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Reads the TCA4311A Ready output. &lt;br /&gt;
 * The function returns the state (true/false).&lt;br /&gt;
 * The global variable readyBusbuff is also&lt;br /&gt;
 * filled with the Ready output state.&lt;br /&gt;
 *&lt;br /&gt;
 * Hint: You don't have to use this function,&lt;br /&gt;
 *       if the task task_RP6SensorBoard() is&lt;br /&gt;
 *       called frequently out of the main&lt;br /&gt;
 *       loop, because readyBusbuff will be&lt;br /&gt;
 *       updated by this task!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
uint8_t readReadyBusbuff(void)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmitByte(I2C_SENSOR_PORTEXP_ADR, MAX7311_INPUT_PORT1);&lt;br /&gt;
	readyBusbuff = I2CTWI_readByte(I2C_SENSOR_PORTEXP_ADR);&lt;br /&gt;
	readyBusbuff &amp;amp;= RDY_BUSBUFF;&lt;br /&gt;
	return readyBusbuff;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
uint8_t errorBusbuff;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * If the I2C bus for the I2C-MODULE (SCLOUT,&lt;br /&gt;
 * SDAOUT) is not used or shall be isolated from&lt;br /&gt;
 * the RP6 I2C bus, this can be done with this&lt;br /&gt;
 * function.&lt;br /&gt;
 *&lt;br /&gt;
 * Hints: - The I2C-MODULE power is NOT switched&lt;br /&gt;
 *          off by this function!&lt;br /&gt;
 *        - If USE_PD5 is defined in the&lt;br /&gt;
 *          configuration header file, this&lt;br /&gt;
 *          function uses the RP6M256 portpin,&lt;br /&gt;
 *          that is connected to plug I/O: Pin 9&lt;br /&gt;
 *          instead of MAX7311 I/O 1.0!&lt;br /&gt;
 *        - If the global variable errorBusbuff&lt;br /&gt;
 *          returns true, the bus buffer could&lt;br /&gt;
 *          not be switched to shutdown mode!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void TCA4311A_shutdown(void)&lt;br /&gt;
{&lt;br /&gt;
	// Wait until the I2C bus is idle:&lt;br /&gt;
	while(I2CTWI_isBusy() || TWI_operation != I2CTWI_NO_OPERATION) task_I2CTWI();&lt;br /&gt;
#ifdef USE_PD5&lt;br /&gt;
	IO_SENSOR_TCA4311A_EN_PORT &amp;amp;= ~IO_SENSOR_TCA4311A_EN_IN; // Low&lt;br /&gt;
#else&lt;br /&gt;
	outport.en_busbuff = false;					// I/O 1.0: Low&lt;br /&gt;
	MAX7311_update();&lt;br /&gt;
#endif&lt;br /&gt;
	errorBusbuff = readReadyBusbuff();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * If the I2C bus for the I2C-MODULE (SCLOUT,&lt;br /&gt;
 * SDAOUT) was isolated from the RP6 I2C bus with&lt;br /&gt;
 * the function TCA4311A_shutdown() before, it&lt;br /&gt;
 * can be connected again with this function.&lt;br /&gt;
 *&lt;br /&gt;
 * Hints: - The I2C-MODULE power is NOT switched&lt;br /&gt;
 *          on by this function!&lt;br /&gt;
 *        - If USE_PD5 is defined in the&lt;br /&gt;
 *          configuration header file, this&lt;br /&gt;
 *          function uses the RP6M256 portpin,&lt;br /&gt;
 *          that is connected to plug I/O: Pin 9&lt;br /&gt;
 *          instead of MAX7311 I/O 1.0!&lt;br /&gt;
 *        - If the global variable errorBusbuff&lt;br /&gt;
 *          returns true, the bus buffer could&lt;br /&gt;
 *          not be switched to normal operation!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void TCA4311A_reconnect(void)&lt;br /&gt;
{&lt;br /&gt;
	// Wait until the I2C bus is idle:&lt;br /&gt;
	while(I2CTWI_isBusy() || TWI_operation != I2CTWI_NO_OPERATION) task_I2CTWI();&lt;br /&gt;
#ifdef USE_PD5&lt;br /&gt;
	IO_SENSOR_TCA4311A_EN_PORT |= IO_SENSOR_TCA4311A_EN_IN; // High&lt;br /&gt;
#else&lt;br /&gt;
	outport.en_busbuff = true;					// I/O 1.0: High&lt;br /&gt;
	MAX7311_update();&lt;br /&gt;
#endif&lt;br /&gt;
	errorBusbuff = !readReadyBusbuff();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Sets/clears the RP6Base signal PWR.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: pwr -&amp;gt; 0 (false) = PWR off&lt;br /&gt;
 *               &amp;gt;0 (true) = PWR on&lt;br /&gt;
 *&lt;br /&gt;
 * Hints: - The RP6Base signal PWR has to be&lt;br /&gt;
 *          connected to the USRBUS: Pin 3 on&lt;br /&gt;
 *          the RP6 mainboard!&lt;br /&gt;
 *        - The RP6Base_I2CSlave program has to&lt;br /&gt;
 *          be loaded into the RP6Base&lt;br /&gt;
 *          microcontroller!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void setRP6Base_PWR(uint8_t pwr)&lt;br /&gt;
{&lt;br /&gt;
	if(pwr &amp;gt; 0)&lt;br /&gt;
		I2CTWI_transmit2Bytes(I2C_RP6_BASE_ADR, 0, CMD_POWER_ON);&lt;br /&gt;
	else&lt;br /&gt;
		I2CTWI_transmit2Bytes(I2C_RP6_BASE_ADR, 0, CMD_POWER_OFF);&lt;br /&gt;
	while(I2CTWI_isBusy() || TWI_operation != I2CTWI_NO_OPERATION) task_I2CTWI();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/** &lt;br /&gt;
 * With this function you can switch the I2C-&lt;br /&gt;
 * MODULE (plug M1) power on or off.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: pwr -&amp;gt; 0 (false) = I2C-MODULE power off&lt;br /&gt;
 *               &amp;gt;0 (true) = I2C-MODULE power on&lt;br /&gt;
 *&lt;br /&gt;
 * Hints: - If the I2C-MODULE plug is not used,&lt;br /&gt;
 *          you should always switch the&lt;br /&gt;
 *          I2C-MODULE power off (default)!&lt;br /&gt;
 *        - The TCA4311A is NOT switched to&lt;br /&gt;
 *          normal operation (default) or&lt;br /&gt;
 *          shutdown mode by this function!&lt;br /&gt;
 *        - The RP6Base signal PWR has to be&lt;br /&gt;
 *          connected to the USRBUS: Pin 3 on&lt;br /&gt;
 *          the RP6 mainboard!&lt;br /&gt;
 *        - The RP6Base_I2CSlave program has to&lt;br /&gt;
 *          be loaded into the RP6Base&lt;br /&gt;
 *          microcontroller!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void setI2CModulePower(uint8_t pwr)&lt;br /&gt;
{&lt;br /&gt;
	if(pwr &amp;gt; 0) {&lt;br /&gt;
		setRP6Base_PWR(1);						// RP6Base PWR on&lt;br /&gt;
		outport.pwr_i2c = true;					// I/O 0.0: High&lt;br /&gt;
	}&lt;br /&gt;
	else&lt;br /&gt;
		outport.pwr_i2c = false;				// I/O 0.0: Low&lt;br /&gt;
	MAX7311_update();&lt;br /&gt;
}	&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Button:&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Reads the MAX7311 I/O port 1.7. &lt;br /&gt;
 * The function returns true, if  button S1 is&lt;br /&gt;
 * pressed (I/O 1.7: Low!) and false, if it is&lt;br /&gt;
 * not pressed (I/O 1.7: High!).&lt;br /&gt;
 * The global variable pressedButton is also&lt;br /&gt;
 * filled with the I/O 1.7 output state.&lt;br /&gt;
 *&lt;br /&gt;
 * Hint: You don't have to use this function,&lt;br /&gt;
 *       if the task task_RP6SensorBoard() is&lt;br /&gt;
 *       called frequently out of the main&lt;br /&gt;
 *       loop, because pressedButton will be&lt;br /&gt;
 *       updated by this task!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
uint8_t readButton(void)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmitByte(I2C_SENSOR_PORTEXP_ADR, MAX7311_INPUT_PORT2);&lt;br /&gt;
	pressedButton = I2CTWI_readByte(I2C_SENSOR_PORTEXP_ADR);&lt;br /&gt;
	pressedButton &amp;amp;= IO2_I2C;&lt;br /&gt;
	pressedButton = !pressedButton;&lt;br /&gt;
	return pressedButton;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Status LED:&lt;br /&gt;
&lt;br /&gt;
/** &lt;br /&gt;
 * Sets the status LED (D2) of the RP6 Sensor&lt;br /&gt;
 * Board.&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *   setStatusLED(1);&lt;br /&gt;
 *   // This switches the status LED on!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void setStatusLED(uint8_t on)&lt;br /&gt;
{&lt;br /&gt;
	if(on &amp;gt; 0)&lt;br /&gt;
		outport.io1_i2c = false;				// I/O 1.6: Low&lt;br /&gt;
	else&lt;br /&gt;
		outport.io1_i2c = true;					// I/O 1.6: High&lt;br /&gt;
	MAX7311_update();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// RP6 Sensor Board initialisation and shutdown:&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * You MUST call this function at the beginning of a&lt;br /&gt;
 * main program, that uses the RP6 Sensor Board. &lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void sensor_board_init(void)&lt;br /&gt;
{&lt;br /&gt;
	// I/O Port Expander:&lt;br /&gt;
	MAX7311_init();&lt;br /&gt;
	// RTC:&lt;br /&gt;
	DS1339_init();&lt;br /&gt;
	// Temperature Sensor:&lt;br /&gt;
	LM75B_init();&lt;br /&gt;
	// Servo Controller:&lt;br /&gt;
	PCA9685_init(50);							// Init PWM 50 Hz&lt;br /&gt;
	// LED Driver:&lt;br /&gt;
	TCA6507_init();&lt;br /&gt;
	// 3D Magnetometer &amp;amp; Accelerometer:&lt;br /&gt;
	LSM303DLHC_init();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * If you don't use any function of the RP6&lt;br /&gt;
 * Sensor Board, you can put the board into&lt;br /&gt;
 * &amp;quot;SHUTDOWN MODE&amp;quot;. In this mode the electric&lt;br /&gt;
 * power consumption is very low to save energy.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void sensor_board_shutdown(void)&lt;br /&gt;
{&lt;br /&gt;
	// Servo Controller:&lt;br /&gt;
	PCA9685_shutdown();							// Shutdown PCA9685&lt;br /&gt;
	// Temperature Sensor:&lt;br /&gt;
	LM75B_shutdown();							// Shutdown LM75B&lt;br /&gt;
	// I/O Port Expander:&lt;br /&gt;
	MAX7311_write(MAX7311_OUTPUT_SHUTDOWN);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&lt;br /&gt;
/******************************************************************************&lt;br /&gt;
 * Additional info&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Changelog:&lt;br /&gt;
 * - v. 1.0 TCA4311A reconnect problem fixed 10.04.2014 by Dirk&lt;br /&gt;
 * - v. 0.9 Interrupt status functions added 09.04.2014 by Dirk&lt;br /&gt;
 * - v. 0.8 (initial release) 17.03.2014 by Dirk&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Erklärung&lt;br /&gt;
&lt;br /&gt;
=====Demo=====&lt;br /&gt;
makefile:&lt;br /&gt;
&amp;lt;pre&amp;gt;...&lt;br /&gt;
TARGET = RP6M256_Sensor_Board_01&lt;br /&gt;
...&lt;br /&gt;
SRC += $(RP6_LIB_PATH)/RP6common/RP6I2CmasterTWI.c&lt;br /&gt;
&lt;br /&gt;
SRC += $(RP6_LIB_PATH)/RP6control_M256_WIFI/RP6M256_Sensor_BoardLib.c&lt;br /&gt;
...&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Datei: RP6M256_Sensor_Board_01.c&lt;br /&gt;
&amp;lt;pre&amp;gt;/* &lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * RP6 ROBOT SYSTEM - RP6 CONTROL M256 Examples&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Example: RP6M256 Sensor Board&lt;br /&gt;
 * Author(s): Dirk&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Description:&lt;br /&gt;
 * In this example we show a first test for the RP6 Sensor Board.&lt;br /&gt;
 * &lt;br /&gt;
 * ############################################################################&lt;br /&gt;
 * The Robot does NOT move in this example! You can simply put it on a table&lt;br /&gt;
 * next to your PC and you should connect it to the PC via the USB Interface!&lt;br /&gt;
 * You should also connect to it via WIFI.&lt;br /&gt;
 * ############################################################################&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Includes:&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6M256Lib.h&amp;quot; 				// The RP6 M256 Library. &lt;br /&gt;
										// Always needs to be included!&lt;br /&gt;
#include &amp;quot;RP6I2CmasterTWI.h&amp;quot;			// Include the I2C-Bus Master Library&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Include our new &amp;quot;RP6M256 Sensor Board library&amp;quot;:&lt;br /&gt;
// (This is the library for accessing the RP6 Sensor Board!)&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6M256_Sensor_BoardLib.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Variables:&lt;br /&gt;
&lt;br /&gt;
char dir[3];&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Returns a 2 character string for the eighth&lt;br /&gt;
 * parts of the direction calculated from the&lt;br /&gt;
 * heading value.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: heading -&amp;gt; Heading value [0..359]&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void calculateDir(char *dir, uint16_t heading)&lt;br /&gt;
{&lt;br /&gt;
	dir[1] = ' ';&lt;br /&gt;
	dir[2] = '\0';&lt;br /&gt;
	if ((heading &amp;lt;= 22) || (heading &amp;gt;=338)) dir[0] = 'N';&lt;br /&gt;
	if ((heading &amp;gt;= 23) &amp;amp;&amp;amp; (heading &amp;lt;= 67)) {dir[0] = 'N'; dir[1] = 'E';} &lt;br /&gt;
	if ((heading &amp;gt;= 68) &amp;amp;&amp;amp; (heading &amp;lt;= 112)) dir[0] = 'E';&lt;br /&gt;
	if ((heading &amp;gt;= 113) &amp;amp;&amp;amp; (heading &amp;lt;= 157)) {dir[0] = 'S'; dir[1] = 'E';}&lt;br /&gt;
	if ((heading &amp;gt;= 158) &amp;amp;&amp;amp; (heading &amp;lt;= 202)) dir[0] = 'S';&lt;br /&gt;
	if ((heading &amp;gt;= 203) &amp;amp;&amp;amp; (heading &amp;lt;= 247)) {dir[0] = 'S'; dir[1] = 'W';}&lt;br /&gt;
	if ((heading &amp;gt;= 248) &amp;amp;&amp;amp; (heading &amp;lt;= 292)) dir[0] = 'W';&lt;br /&gt;
	if ((heading &amp;gt;= 293) &amp;amp;&amp;amp; (heading &amp;lt;= 337)) {dir[0] = 'N'; dir[1] = 'W';}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Write a floating point number to the WIFI.&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *&lt;br /&gt;
 *			// Write a floating point number to the WIFI (no exponent):&lt;br /&gt;
 *			writeDouble_WIFI(1234567.890, 11, 3);&lt;br /&gt;
 *&lt;br /&gt;
 * The value of prec (precision) defines the number of decimal places.&lt;br /&gt;
 * For 32 bit floating point variables (float, double ...) 6 is&lt;br /&gt;
 * the max. value for prec (7 relevant digits).&lt;br /&gt;
 * The value of width defines the overall number of characters in the&lt;br /&gt;
 * floating point number including the decimal point. The number of&lt;br /&gt;
 * pre-decimal positions is: (width - prec - 1).&lt;br /&gt;
 */&lt;br /&gt;
void writeDouble_WIFI(double number, uint8_t width, uint8_t prec)&lt;br /&gt;
{char buffer[width + 1];&lt;br /&gt;
	dtostrf(number, width, prec, &amp;amp;buffer[0]);&lt;br /&gt;
	writeString_WIFI(&amp;amp;buffer[0]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Write a floating point number to the LCD.&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *&lt;br /&gt;
 *			// Write a floating point number to the LCD (no exponent):&lt;br /&gt;
 *			writeDoubleLCD(1234567.890, 11, 3);&lt;br /&gt;
 *&lt;br /&gt;
 * The value of prec (precision) defines the number of decimal places.&lt;br /&gt;
 * For 32 bit floating point variables (float, double ...) 6 is&lt;br /&gt;
 * the max. value for prec (7 relevant digits).&lt;br /&gt;
 * The value of width defines the overall number of characters in the&lt;br /&gt;
 * floating point number including the decimal point. The number of&lt;br /&gt;
 * pre-decimal positions is: (width - prec - 1).&lt;br /&gt;
 */&lt;br /&gt;
void writeDoubleLCD(double number, uint8_t width, uint8_t prec)&lt;br /&gt;
{char buffer[width + 1];&lt;br /&gt;
	dtostrf(number, width, prec, &amp;amp;buffer[0]);&lt;br /&gt;
	writeStringLCD(&amp;amp;buffer[0]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Error handler&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function gets called automatically if there was an I2C Error like&lt;br /&gt;
 * the slave sent a &amp;quot;not acknowledge&amp;quot; (NACK, error codes e.g. 0x20 or 0x30).&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void I2C_transmissionError(uint8_t errorState)&lt;br /&gt;
{&lt;br /&gt;
	writeString_P_WIFI(&amp;quot;\nI2C ERROR - TWI STATE: 0x&amp;quot;);&lt;br /&gt;
	writeInteger_WIFI(errorState, HEX);&lt;br /&gt;
	writeChar_WIFI('\n');&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Main function - The program starts here:&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
	initRP6M256();    // Always call this first! The Processor will not work&lt;br /&gt;
					  // correctly otherwise. &lt;br /&gt;
&lt;br /&gt;
	initLCD(); // Initialize the LC-Display (LCD)&lt;br /&gt;
			   // Always call this before using the LCD!&lt;br /&gt;
&lt;br /&gt;
	setLEDs(0b1111);&lt;br /&gt;
	mSleep(500);&lt;br /&gt;
	setLEDs(0b0000);&lt;br /&gt;
&lt;br /&gt;
	writeString_P_WIFI(&amp;quot;\n\nRP6 Sensor Board Selftest 1!\n&amp;quot;); &lt;br /&gt;
&lt;br /&gt;
	// IMPORTANT:&lt;br /&gt;
	I2CTWI_initMaster(100); // Initialize the TWI Module for Master operation&lt;br /&gt;
							// with 100kHz SCL Frequency&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	// Register the event handler:&lt;br /&gt;
	I2CTWI_setTransmissionErrorHandler(I2C_transmissionError);&lt;br /&gt;
&lt;br /&gt;
	setLEDs(0b1111);&lt;br /&gt;
&lt;br /&gt;
	// Write a text message to the LCD:&lt;br /&gt;
	showScreenLCD(&amp;quot;################&amp;quot;, &amp;quot;################&amp;quot;);&lt;br /&gt;
	mSleep(1500);&lt;br /&gt;
	showScreenLCD(&amp;quot;RP6v2-M256-WIFI &amp;quot;, &amp;quot;Example Program&amp;quot;);&lt;br /&gt;
	mSleep(2500); &lt;br /&gt;
	showScreenLCD(&amp;quot;RP6 Sensor Board&amp;quot;, &amp;quot;   Selftest 1&amp;quot;);&lt;br /&gt;
	mSleep(2500);&lt;br /&gt;
	clearLCD();&lt;br /&gt;
&lt;br /&gt;
	setLEDs(0b0000);&lt;br /&gt;
&lt;br /&gt;
	// ---------------------------------------&lt;br /&gt;
&lt;br /&gt;
	uint8_t onoff = 0;&lt;br /&gt;
	uint16_t servopos = SERVO1_LT;&lt;br /&gt;
	int16_t rate;&lt;br /&gt;
&lt;br /&gt;
	startStopwatch1();&lt;br /&gt;
	startStopwatch2();&lt;br /&gt;
&lt;br /&gt;
	// IMPORTANT:&lt;br /&gt;
	sensor_board_init();						// RP6 Sensor Board init!!!&lt;br /&gt;
	setServoPower(1);							// Servo power ON!&lt;br /&gt;
/*&lt;br /&gt;
	// ----------------------------------------------&lt;br /&gt;
	// Set RTC once (battery empty or not existing:&lt;br /&gt;
	rtc_time.second = 0;&lt;br /&gt;
	rtc_time.minute = 15;&lt;br /&gt;
	rtc_time.hour = 20;				// 20:15&lt;br /&gt;
	rtc_date.weekday = R_SU;&lt;br /&gt;
	rtc_date.day = 20;&lt;br /&gt;
	rtc_date.month = 4;&lt;br /&gt;
	rtc_date.year = 2014;			// Su, 20.4.2014&lt;br /&gt;
	DS1339_write();&lt;br /&gt;
	// Remove this, if RTC is set and running!!!&lt;br /&gt;
	// ----------------------------------------------&lt;br /&gt;
*/&lt;br /&gt;
	while(true) &lt;br /&gt;
	{&lt;br /&gt;
		if(getStopwatch1() &amp;gt; 1000) // 1s&lt;br /&gt;
		{&lt;br /&gt;
			if (onoff) onoff = 0;&lt;br /&gt;
			else onoff = 1;&lt;br /&gt;
&lt;br /&gt;
			// Interrupt status:&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nInterrupt Status:      &amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(interrupt_RP6SBstatus.byte, BIN, 8);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			// Inport status:&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;Inport Status: &amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(inport.word, BIN, 16);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			// Temperature sensor test:&lt;br /&gt;
			temperature = LM75B_measure();		// Measure&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;Temperature: &amp;quot;);&lt;br /&gt;
			writeDouble_WIFI(temperature, 7, 3);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;°\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			// LED driver test:&lt;br /&gt;
			if (onoff) {&lt;br /&gt;
				setLED(HEADLIGHT_R, STATE_ON);&lt;br /&gt;
				setLED(HEADLIGHT_L, STATE_OFF);&lt;br /&gt;
			}&lt;br /&gt;
			else {&lt;br /&gt;
				setLED(HEADLIGHT_L, STATE_ON);&lt;br /&gt;
				setLED(HEADLIGHT_R, STATE_OFF);&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			// Servo controller test (SERVO_1):&lt;br /&gt;
			setServo(1, servopos);&lt;br /&gt;
			servopos += 10;&lt;br /&gt;
			if (servopos &amp;gt; SERVO1_RT) servopos = SERVO1_LT;&lt;br /&gt;
&lt;br /&gt;
			// RTC test:&lt;br /&gt;
			DS1339_read();&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;RTC: &amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(rtc_time.hour, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;:&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(rtc_time.minute, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;:&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(rtc_time.second, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;  &amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(rtc_date.day, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;.&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(rtc_date.month, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;.&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(rtc_date.year, DEC, 4);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			// 3D Magnetometer &amp;amp; Accelerometer test:&lt;br /&gt;
			//  LSM303DLHC accelerometer:&lt;br /&gt;
			task_I2CTWI();&lt;br /&gt;
			readLSM303DLHC_A();					// Get sensor values&lt;br /&gt;
			task_I2CTWI();&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\n3D-Acceleration SENSOR -&amp;gt;\n&amp;quot;);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;X-axis: &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(x_axisa, DEC);&lt;br /&gt;
			writeChar_WIFI('\n');&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;Y-axis: &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(y_axisa, DEC);&lt;br /&gt;
			writeChar_WIFI('\n');&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;Z-axis: &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(z_axisa, DEC);&lt;br /&gt;
			writeChar_WIFI('\n');&lt;br /&gt;
			normalizeLSM303DLHC_A();			// Normalize data&lt;br /&gt;
			positionLSM303DLHC_A();				// Calculate position&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;POSITION: \n&amp;quot;);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;  Pitch [°]: &amp;quot;);&lt;br /&gt;
			writeDouble_WIFI(pitch, 6, 1);&lt;br /&gt;
			writeChar_WIFI('\n');&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;  Roll [°]:  &amp;quot;);&lt;br /&gt;
			writeDouble_WIFI(roll, 6, 1);&lt;br /&gt;
			writeChar_WIFI('\n');&lt;br /&gt;
&lt;br /&gt;
			//  LSM303DLHC magnetometer:&lt;br /&gt;
			task_I2CTWI();&lt;br /&gt;
			readLSM303DLHC_M();					// Get sensor values&lt;br /&gt;
			task_I2CTWI();&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\n3D-Compass SENSOR -&amp;gt;\n&amp;quot;);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;X-axis: &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(x_axism, DEC);&lt;br /&gt;
			writeChar_WIFI('\n');&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;Y-axis: &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(y_axism, DEC);&lt;br /&gt;
			writeChar_WIFI('\n');&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;Z-axis: &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(z_axism, DEC);&lt;br /&gt;
			writeChar_WIFI('\n');&lt;br /&gt;
			normalizeLSM303DLHC_M();			// Normalize data&lt;br /&gt;
			headingm = headingLSM303DLHC_M();	// Calculate heading&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;                 Heading [°]: &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(headingm, DEC);&lt;br /&gt;
			calculateDir(dir, headingm);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;  Direction: &amp;quot;);&lt;br /&gt;
			writeString_WIFI(dir);&lt;br /&gt;
			writeChar_WIFI('\n');&lt;br /&gt;
			headingtc = headingLSM303DLHC_TC();	// Calculate TILT COMPENSATED&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;TILT COMPENSATED heading [°]: &amp;quot;); // heading&lt;br /&gt;
			writeInteger_WIFI(headingtc, DEC);&lt;br /&gt;
			calculateDir(dir, headingtc);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;  Direction: &amp;quot;);&lt;br /&gt;
			writeString_WIFI(dir);&lt;br /&gt;
			writeChar_WIFI('\n');&lt;br /&gt;
#ifdef GET_TEMP_M&lt;br /&gt;
			temperature_mag = (double) temperaturem / 8.0 + OFFSET_TEMP_M;&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;Temperature [°]: &amp;quot;);&lt;br /&gt;
			writeDouble_WIFI(temperature_mag, 7, 2);&lt;br /&gt;
			writeChar_WIFI('\n');&lt;br /&gt;
#endif&lt;br /&gt;
			// Yaw-Rate Gyroscope test:&lt;br /&gt;
			rate = LY330ALH_measure();&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\n1D-Gyro SENSOR -&amp;gt;\n&amp;quot;);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;Z-axis: &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(rate, DEC);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			// RP6 Sensor Board shutdown (button &amp;amp; status LED test):&lt;br /&gt;
			if (pressedButton) {&lt;br /&gt;
				setStatusLED(1);&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;\nPress button again for RP6 Sensor Board SHUTDOWN!\n&amp;quot;);&lt;br /&gt;
				mSleep(2000);&lt;br /&gt;
				do {&lt;br /&gt;
					if(getStopwatch2() &amp;gt; 200) { // 0.2s&lt;br /&gt;
						if (onoff) onoff = 0;&lt;br /&gt;
						else onoff = 1;&lt;br /&gt;
						if (onoff) setStatusLED(1);&lt;br /&gt;
						else setStatusLED(0);&lt;br /&gt;
						setStopwatch2(0);&lt;br /&gt;
					}&lt;br /&gt;
					mSleep(1);&lt;br /&gt;
					task_I2CTWI();&lt;br /&gt;
				} while (!readButton());&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;\n\n\n\n\nPlease wait for RP6 Sensor Board SHUTDOWN...\n&amp;quot;);&lt;br /&gt;
				sensor_board_shutdown();&lt;br /&gt;
				mSleep(3000);&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;\n\n\nThe RP6 Sensor Board now is in SHUTDOWN MODE!!!\n&amp;quot;);&lt;br /&gt;
				mSleep(1000);&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;\nRESET the M256 microcontroller now...\n\n&amp;quot;);&lt;br /&gt;
				while(true) {};&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			setStopwatch1(0);&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		task_checkINTs();						// Read interrupt signals&lt;br /&gt;
		task_RP6SensorBoard();					// RP6 Sensor Board task&lt;br /&gt;
&lt;br /&gt;
		task_I2CTWI();&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Erklärung&lt;br /&gt;
&lt;br /&gt;
====Projekte====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===RP6 Xtra Module===&lt;br /&gt;
Die Dokumentation zu den RP6 Xtra Modulen befindet sich auf der mitgelieferten ''&amp;quot;RP6 Robot System Xtra Modules CD-ROM&amp;quot;''. Auf der CD-ROM sind auch Software-Beispiele zu finden.&lt;br /&gt;
&lt;br /&gt;
Die hier veröffentlichte Software zu den Xtra Modulen ist eine Eigenentwicklung in GCC:&lt;br /&gt;
* Arexx [[RP6_Sensor_Board_und_Xtra_Module#I2C_GPS_Empf.C3.A4nger_JM3-GPS_2|I2C GPS Empfänger JM3-GPS]]&lt;br /&gt;
* Arexx [[RP6_Sensor_Board_und_Xtra_Module#Gyro_Modul_JM3-GYRO_2|Gyro Modul JM3-GYRO]]&lt;br /&gt;
* Arexx [[RP6_Sensor_Board_und_Xtra_Module#3D_Accelerometer_Modul_JM3-3DA_2|3D Accelerometer Modul JM3-3DA]]&lt;br /&gt;
&lt;br /&gt;
====I2C GPS Empfänger JM3-GPS====&lt;br /&gt;
=====RP6M256 WiFi: I2C_GPS Library=====&lt;br /&gt;
Die nachfolgende RP6M256_I2C_GPSLib (GCC) dient zur Ansteuerung des I2C GPS Empfängers durch die RP6M256 WiFi.&lt;br /&gt;
 &lt;br /&gt;
======Libary Header======&lt;br /&gt;
Datei: RP6M256_I2C_GPSLib.h&lt;br /&gt;
&amp;lt;pre&amp;gt;/* ****************************************************************************&lt;br /&gt;
 *                           _______________________&lt;br /&gt;
 *                           \| RP6  ROBOT SYSTEM |/&lt;br /&gt;
 *                            \_-_-_-_-_-_-_-_-_-_/           &amp;gt;&amp;gt;&amp;gt; RP6 M256 WIFI&lt;br /&gt;
 * ----------------------------------------------------------------------------&lt;br /&gt;
 * ----------------------------- [c]2014 - Dirk -------------------------------&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * File: RP6M256_I2C_GPSLib.h&lt;br /&gt;
 * Version: 1.0&lt;br /&gt;
 * Target: RP6 M256 WIFI - ATMEGA2560 @16.00MHz&lt;br /&gt;
 * Author(s): Dirk&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Description:&lt;br /&gt;
 * Header file for new RP6 I2C GPS Receiver library.&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
#ifndef RP6M256_I2C_GPSLIB_H&lt;br /&gt;
#define RP6M256_I2C_GPSLIB_H&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// RP6 Sensor Board:&lt;br /&gt;
&lt;br /&gt;
// If you want to use the RP6 I2C GPS Receiver on the RP6 Sensor Board, you&lt;br /&gt;
// have to define SENSOR_BOARD (default)!&lt;br /&gt;
// If SENSOR_BOARD is NOT defined, this library assumes that the RP6 I2C GPS&lt;br /&gt;
// Receiver is used stand-alone.&lt;br /&gt;
// ------------------&lt;br /&gt;
#define SENSOR_BOARD&lt;br /&gt;
// ------------------&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Includes:&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6M256Lib.h&amp;quot;&lt;br /&gt;
#include &amp;quot;RP6I2CmasterTWI.h&amp;quot;&lt;br /&gt;
#ifdef SENSOR_BOARD&lt;br /&gt;
	#include &amp;quot;RP6M256_Sensor_BoardLib.h&amp;quot;&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// RP6 I2C GPS Receiver:&lt;br /&gt;
#define I2C_GPS_RECEIVER_ADR			0xc8	// Default&lt;br /&gt;
//#define I2C_GPS_RECEIVER_ADR			0xca&lt;br /&gt;
//#define I2C_GPS_RECEIVER_ADR			0xcc&lt;br /&gt;
//#define I2C_GPS_RECEIVER_ADR			0xce&lt;br /&gt;
//#define I2C_GPS_RECEIVER_ADR			0xd0	// DO NOT USE on Sensor Board!&lt;br /&gt;
//#define I2C_GPS_RECEIVER_ADR			0xd2&lt;br /&gt;
//#define I2C_GPS_RECEIVER_ADR			0xd4&lt;br /&gt;
//#define I2C_GPS_RECEIVER_ADR			0xd6&lt;br /&gt;
//#define I2C_GPS_RECEIVER_ADR			0xd8&lt;br /&gt;
//#define I2C_GPS_RECEIVER_ADR			0xda&lt;br /&gt;
//#define I2C_GPS_RECEIVER_ADR			0xdc&lt;br /&gt;
//#define I2C_GPS_RECEIVER_ADR			0xde&lt;br /&gt;
&lt;br /&gt;
// Read registers:&lt;br /&gt;
#define WHO_AM_I						0x20	// I2C address [0xc8..0xde]&lt;br /&gt;
#define LAT_DEG							0x21	// Degrees&lt;br /&gt;
#define LAT_MIN							0x22	// Minutes&lt;br /&gt;
#define LAT_MIN_D_L						0x23	// Minutes decimal part low&lt;br /&gt;
#define LAT_MIN_D_H						0x24	// Minutes decimal part high&lt;br /&gt;
#define LON_DEG							0x25	// Degrees&lt;br /&gt;
#define LON_MIN							0x26	// Minutes&lt;br /&gt;
#define LON_MIN_D_L						0x27	// Minutes decimal part low&lt;br /&gt;
#define LON_MIN_D_H						0x28	// Minutes decimal part high&lt;br /&gt;
#define STATUS							0x29	// Status flags&lt;br /&gt;
#define FIX_IND							0x2a	// FIX_IND&lt;br /&gt;
#define HDOP							0x2b	// HDOP&lt;br /&gt;
#define HDOP_D							0x2c	// HDOP_D&lt;br /&gt;
#define SAT_N							0x2d	// Number of satellites&lt;br /&gt;
#define COURSE_T_L						0x2e	// True heading low byte&lt;br /&gt;
#define COURSE_T_H						0x2f	// True heading high byte&lt;br /&gt;
#define COURSE_T_D						0x30	// Decimal part of course&lt;br /&gt;
#define SPEED_L							0x31	// Speed low byte&lt;br /&gt;
#define SPEED_H							0x32	// Speed high byte&lt;br /&gt;
#define SPEED_D							0x33	// Speed decimal part&lt;br /&gt;
#define ALT_L							0x34	// Altitude low byte&lt;br /&gt;
#define ALT_H							0x35	// Altitude high byte&lt;br /&gt;
#define ALT_DIF_L						0x36	// Differ. WGS-84 MSL low byte&lt;br /&gt;
#define ALT_DIF_H						0x37	// Differ. WGS-84 MSL high byte&lt;br /&gt;
#define UTC_H							0x38	// UTC hour&lt;br /&gt;
#define UTC_MIN							0x39	// UTC minute&lt;br /&gt;
#define UTC_S							0x3a	// UTC second&lt;br /&gt;
#define DAY								0x3b	// Day&lt;br /&gt;
#define YEAR_L							0x3c	// Year low byte&lt;br /&gt;
#define YEAR_H							0x3d	// Year high byte&lt;br /&gt;
#define MONTH							0x3e	// Month&lt;br /&gt;
#define PDOP							0x3f	// PDOP&lt;br /&gt;
#define PDOP_D							0x40	// PDOP_D&lt;br /&gt;
#define VDOP							0x41	// VDOP&lt;br /&gt;
#define VDOP_D							0x42	// VDOP_D&lt;br /&gt;
#define SAT_1							0x43	// SAT # 1&lt;br /&gt;
#define SAT_2							0x44	// SAT # 2&lt;br /&gt;
#define SAT_3							0x45	// SAT # 3&lt;br /&gt;
#define SAT_4							0x46	// SAT # 4&lt;br /&gt;
#define SAT_5							0x47	// SAT # 5&lt;br /&gt;
#define SAT_6							0x48	// SAT # 6&lt;br /&gt;
#define SAT_7							0x49	// SAT # 7&lt;br /&gt;
#define SAT_8							0x4a	// SAT # 8&lt;br /&gt;
#define SAT_9							0x4b	// SAT # 9&lt;br /&gt;
#define SAT_A							0x4c	// SAT # 10&lt;br /&gt;
#define SAT_B							0x4d	// SAT # 11&lt;br /&gt;
#define SAT_C							0x4e	// SAT # 12&lt;br /&gt;
#define SW_VERSION						0x4f	// SW_Version&lt;br /&gt;
#define HEARTBEAT						0x50	// Heartbeat&lt;br /&gt;
&lt;br /&gt;
// Status and Fix_Ind register bitmasks:&lt;br /&gt;
#define STATUS_NS						0b00000001&lt;br /&gt;
#define STATUS_EW						0b00000010&lt;br /&gt;
#define STATUS_SPU						0b00000100&lt;br /&gt;
#define STATUS_AUTON					0b00001000&lt;br /&gt;
#define FIX_IND_UI_FIX					0b10000000&lt;br /&gt;
&lt;br /&gt;
// Write registers:&lt;br /&gt;
#define INIT_CFG						0x90	// INIT CFG&lt;br /&gt;
#define SET_FIX_TIME					0x91	// Pos_Fix_Time&lt;br /&gt;
#define STBY							0x92	// STBY&lt;br /&gt;
#define FAC_RES							0x93	// Factory Reset&lt;br /&gt;
#define EN_JAM							0x94	// Jamming Remover&lt;br /&gt;
#define TEST_MODE						0x96	// Test Mode&lt;br /&gt;
&lt;br /&gt;
// Write register values (commands):&lt;br /&gt;
#define INIT_CFG_HOT_START				1		// Hot Start&lt;br /&gt;
#define INIT_CFG_WARM_START				2		// Warm Start init data loaded&lt;br /&gt;
#define INIT_CFG_WARM_START_EPH_CLR		3		// Warm Start Ephemeris cleared&lt;br /&gt;
#define INIT_CFG_COLD_START				4		// Cold Start&lt;br /&gt;
#define SET_FIX_TIME_1S					1		// Pos Fix Time 1 second&lt;br /&gt;
#define SET_FIX_TIME_2S					2		// Pos Fix Time 2 seconds&lt;br /&gt;
#define STBY_ENTER						1		// Standby (cleared after write)&lt;br /&gt;
#define FAC_RES_ENTER					1		// Factory Reset&lt;br /&gt;
#define EN_JAM_DISABLE					0		// Jamming Remover disable&lt;br /&gt;
#define EN_JAM_ENABLE					1		// Jamming Remover enable&lt;br /&gt;
#define TEST_MODE_INACTIVE				0		// Test Mode inactive&lt;br /&gt;
#define TEST_MODE_ACTIVE				0x15	// Test Mode active&lt;br /&gt;
&lt;br /&gt;
// Data structure (starts at LAT_DEG):&lt;br /&gt;
#define DATA_STRUCT						LAT_DEG	// Start&lt;br /&gt;
// All data from LAT_DEG to HEARTBEAT (48 bytes):&lt;br /&gt;
#define DATA_LENGTH						(HEARTBEAT - LAT_DEG + 1)&lt;br /&gt;
// Basic data from LAT_DEG to SAT_N (13 bytes):&lt;br /&gt;
#define DATA_BASIC						(SAT_N - LAT_DEG + 1)&lt;br /&gt;
&lt;br /&gt;
typedef union {&lt;br /&gt;
 	uint8_t byte;&lt;br /&gt;
	struct {&lt;br /&gt;
		unsigned ns    :1;				// 1: North 0: South&lt;br /&gt;
		unsigned ew    :1;				// 1: East 0: West&lt;br /&gt;
		unsigned spu   :1;				// 1: km/h 0: kn&lt;br /&gt;
		unsigned auton :1;				// 1: Data not valid 0: Autonomous&lt;br /&gt;
		unsigned fix0  :1;&lt;br /&gt;
		unsigned fix1  :1;&lt;br /&gt;
		unsigned stat0 :1;				// Invalid&lt;br /&gt;
		unsigned stat1 :1;				// GPS Com Error&lt;br /&gt;
	};&lt;br /&gt;
	struct {&lt;br /&gt;
		unsigned ns    :1;				// 1: North 0: South&lt;br /&gt;
		unsigned ew    :1;				// 1: East 0: West&lt;br /&gt;
		unsigned spu   :1;				// 1: km/h 0: kn&lt;br /&gt;
		unsigned auton :1;				// 1: Data not valid 0: Autonomous&lt;br /&gt;
		unsigned fix   :2;&lt;br /&gt;
		unsigned stat  :2;				// 00 -&amp;gt; Valid&lt;br /&gt;
										// 01 -&amp;gt; Invalid&lt;br /&gt;
										// 10 -&amp;gt; GPS Com Error&lt;br /&gt;
										// 11 -&amp;gt; n. def.&lt;br /&gt;
	};&lt;br /&gt;
} status_t;&lt;br /&gt;
&lt;br /&gt;
typedef union {&lt;br /&gt;
 	uint8_t byte;&lt;br /&gt;
	struct {							// Fix indicator:&lt;br /&gt;
		unsigned fix_0  :1;				//  1: GPS fix          2: DGPS fix&lt;br /&gt;
		unsigned fix_1  :1;				//  3: PPS fix          4: RTK&lt;br /&gt;
		unsigned fix_2  :1;				//  5: Float RTK        6: Dead reck.&lt;br /&gt;
		unsigned fix_3  :1;				//  7: Manual inp. mode 8: Simul. mode&lt;br /&gt;
		unsigned unused :3;&lt;br /&gt;
		unsigned ui_fix :1;				// HW signal from UC530&lt;br /&gt;
	};&lt;br /&gt;
	struct {&lt;br /&gt;
		unsigned fix    :4;				// See above &amp;quot;Fix indicator&amp;quot;!&lt;br /&gt;
		unsigned unused :3;&lt;br /&gt;
		unsigned ui_fix :1;				// HW signal from UC530&lt;br /&gt;
	};&lt;br /&gt;
} fix_ind_t;&lt;br /&gt;
&lt;br /&gt;
typedef union {&lt;br /&gt;
	struct {&lt;br /&gt;
		uint8_t   latDeg;&lt;br /&gt;
		uint8_t   latMin;&lt;br /&gt;
		uint16_t  latMinDec;&lt;br /&gt;
		uint8_t   lonDeg;&lt;br /&gt;
		uint8_t   lonMin;&lt;br /&gt;
		uint16_t  lonMinDec;&lt;br /&gt;
		status_t  status;&lt;br /&gt;
		fix_ind_t fixInd;&lt;br /&gt;
		uint8_t   hdop;&lt;br /&gt;
		uint8_t   hdopDec;&lt;br /&gt;
		uint8_t   satCount;&lt;br /&gt;
		uint16_t  course;&lt;br /&gt;
		uint8_t   courseDec;&lt;br /&gt;
		uint16_t  speed;&lt;br /&gt;
		uint8_t   speedDec;&lt;br /&gt;
		uint16_t  altitude;&lt;br /&gt;
		uint16_t  altDif;&lt;br /&gt;
		uint8_t   utcHour;&lt;br /&gt;
		uint8_t   utcMinute;&lt;br /&gt;
		uint8_t   utcSec;&lt;br /&gt;
		uint8_t   day;&lt;br /&gt;
		uint16_t  year;&lt;br /&gt;
		uint8_t   month;&lt;br /&gt;
		uint8_t   pdop;&lt;br /&gt;
		uint8_t   pdopDec;&lt;br /&gt;
		uint8_t   vdop;&lt;br /&gt;
		uint8_t   vdopDec;&lt;br /&gt;
		uint8_t   sat[12];&lt;br /&gt;
		uint8_t   swVersion;&lt;br /&gt;
		uint8_t   heartbeat;&lt;br /&gt;
	};&lt;br /&gt;
} gpsdata_t;&lt;br /&gt;
extern gpsdata_t gpsdata;&lt;br /&gt;
&lt;br /&gt;
void I2C_GPS_reset(void);&lt;br /&gt;
void I2C_GPS_write_cmd(uint8_t, uint8_t);&lt;br /&gt;
uint8_t I2C_GPS_read_reg(uint8_t);&lt;br /&gt;
void I2C_GPS_read(uint8_t);&lt;br /&gt;
void I2C_GPS_init(void);&lt;br /&gt;
void I2C_GPS_new_addr(uint8_t);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
/******************************************************************************&lt;br /&gt;
 * Additional info&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Changelog:&lt;br /&gt;
 * &lt;br /&gt;
 *  ---&amp;gt; changes are documented in the file &amp;quot;RP6M256_I2C_GPSLib.c&amp;quot;&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
======Libary Source======&lt;br /&gt;
Datei: RP6M256_I2C_GPSLib.c&lt;br /&gt;
&amp;lt;pre&amp;gt;/* ****************************************************************************&lt;br /&gt;
 *                           _______________________&lt;br /&gt;
 *                           \| RP6  ROBOT SYSTEM |/&lt;br /&gt;
 *                            \_-_-_-_-_-_-_-_-_-_/           &amp;gt;&amp;gt;&amp;gt; RP6 M256 WIFI&lt;br /&gt;
 * ----------------------------------------------------------------------------&lt;br /&gt;
 * ----------------------------- [c]2014 - Dirk -------------------------------&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * File: RP6M256_I2C_GPSLib.c&lt;br /&gt;
 * Version: 1.0&lt;br /&gt;
 * Target: RP6 M256 WIFI - ATMEGA2560 @16.00MHz&lt;br /&gt;
 *         and a RP6 I2C GPS Receiver (CONRAD 1082385)&lt;br /&gt;
 *         optionally on a RP6 Sensor Board (CONRAD 1082384)&lt;br /&gt;
 * Author(s): Dirk&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Description:&lt;br /&gt;
 * &lt;br /&gt;
 * This is our new Library that contains basic routines and functions for&lt;br /&gt;
 * accessing the RP6 I2C GPS Receiver JM3-GPS (CONRAD 1082385).&lt;br /&gt;
 * The library assumes the I2C GPS Receiver software (firmware) v1.2.&lt;br /&gt;
 * If the I2C GPS Receiver is located on the RP6 Sensor Board (CONRAD 1082384)&lt;br /&gt;
 * and connected to the I2C-MODULE plug M1, the RP6M256_Sensor_BoardLib has to&lt;br /&gt;
 * be included!&lt;br /&gt;
 * &lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Includes:&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6M256_I2C_GPSLib.h&amp;quot; 		&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Variables:&lt;br /&gt;
&lt;br /&gt;
uint8_t gpsdataBuf[DATA_LENGTH + 1]; &lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Software reset for the I2C GPS Receiver.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void I2C_GPS_reset(void)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_GPS_RECEIVER_ADR, 0, 0x06);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Writes a command cmd to a register reg of the&lt;br /&gt;
 * I2C GPS Receiver.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: reg -&amp;gt; Write register [0x90..0x96]&lt;br /&gt;
 *        cmd -&amp;gt; Command&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void I2C_GPS_write_cmd(uint8_t reg, uint8_t cmd)&lt;br /&gt;
{&lt;br /&gt;
	if((reg &amp;lt; INIT_CFG) || (reg &amp;gt; TEST_MODE)) return;&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_GPS_RECEIVER_ADR, reg, cmd);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Reads a single register reg from the I2C GPS&lt;br /&gt;
 * Receiver.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: reg -&amp;gt; Read register [0x20..0x50]&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
uint8_t I2C_GPS_read_reg(uint8_t reg)&lt;br /&gt;
{&lt;br /&gt;
	if((reg &amp;lt; WHO_AM_I) || (reg &amp;gt; HEARTBEAT)) reg = WHO_AM_I;&lt;br /&gt;
	I2CTWI_transmitByte(I2C_GPS_RECEIVER_ADR, reg);&lt;br /&gt;
	return (I2CTWI_readByte(I2C_GPS_RECEIVER_ADR));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
gpsdata_t gpsdata;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Reads the GPS data from the I2C GPS Receiver.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: length -&amp;gt; Number of data bytes [1..48]&lt;br /&gt;
 *&lt;br /&gt;
 * Hint: If length = DATA_BASIC, only basic GPS&lt;br /&gt;
 *       data are read. If length = DATA_LENGTH,&lt;br /&gt;
 *       ALL GPS data are read.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void I2C_GPS_read(uint8_t length)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t i;&lt;br /&gt;
&lt;br /&gt;
	if(length &amp;gt; DATA_LENGTH) length = DATA_LENGTH;&lt;br /&gt;
	I2CTWI_readRegisters(I2C_GPS_RECEIVER_ADR, DATA_STRUCT, gpsdataBuf, length);&lt;br /&gt;
	for(i = length; i &amp;lt; DATA_LENGTH; i++) {&lt;br /&gt;
		gpsdataBuf[i] = 0;&lt;br /&gt;
	}&lt;br /&gt;
	gpsdata.latDeg = gpsdataBuf[0];&lt;br /&gt;
	gpsdata.latMin = gpsdataBuf[1];&lt;br /&gt;
	gpsdata.latMinDec = gpsdataBuf[2] + (gpsdataBuf[3] &amp;lt;&amp;lt; 8);&lt;br /&gt;
	gpsdata.lonDeg = gpsdataBuf[4];&lt;br /&gt;
	gpsdata.lonMin = gpsdataBuf[5];&lt;br /&gt;
	gpsdata.lonMinDec = gpsdataBuf[6] + (gpsdataBuf[7] &amp;lt;&amp;lt; 8);&lt;br /&gt;
	gpsdata.status.byte = gpsdataBuf[8];&lt;br /&gt;
	gpsdata.fixInd.byte = gpsdataBuf[9];&lt;br /&gt;
	gpsdata.hdop = gpsdataBuf[10];&lt;br /&gt;
	gpsdata.hdopDec = gpsdataBuf[11];&lt;br /&gt;
	gpsdata.satCount = gpsdataBuf[12];&lt;br /&gt;
	if(length == DATA_BASIC) return;&lt;br /&gt;
	gpsdata.course = gpsdataBuf[13] + (gpsdataBuf[14] &amp;lt;&amp;lt; 8);&lt;br /&gt;
	gpsdata.courseDec = gpsdataBuf[15];&lt;br /&gt;
	gpsdata.speed = gpsdataBuf[16] + (gpsdataBuf[17] &amp;lt;&amp;lt; 8);&lt;br /&gt;
	gpsdata.speedDec = gpsdataBuf[18];&lt;br /&gt;
	gpsdata.altitude = gpsdataBuf[19] + (gpsdataBuf[20] &amp;lt;&amp;lt; 8);&lt;br /&gt;
	gpsdata.altDif = gpsdataBuf[21] + (gpsdataBuf[22] &amp;lt;&amp;lt; 8);&lt;br /&gt;
	gpsdata.utcHour = gpsdataBuf[23];&lt;br /&gt;
	gpsdata.utcMinute = gpsdataBuf[24];&lt;br /&gt;
	gpsdata.utcSec = gpsdataBuf[25];&lt;br /&gt;
	gpsdata.day = gpsdataBuf[26];&lt;br /&gt;
	gpsdata.year = gpsdataBuf[27] + (gpsdataBuf[28] * 100);&lt;br /&gt;
	gpsdata.month = gpsdataBuf[29];&lt;br /&gt;
	gpsdata.pdop = gpsdataBuf[30];&lt;br /&gt;
	gpsdata.pdopDec = gpsdataBuf[31];&lt;br /&gt;
	gpsdata.vdop = gpsdataBuf[32];&lt;br /&gt;
	gpsdata.vdopDec = gpsdataBuf[33];&lt;br /&gt;
	for(i = 34; i &amp;lt; 46; i++) {&lt;br /&gt;
		gpsdata.sat[i - 34] = gpsdataBuf[i];&lt;br /&gt;
	}&lt;br /&gt;
	gpsdata.swVersion = gpsdataBuf[46];&lt;br /&gt;
	gpsdata.heartbeat = gpsdataBuf[47];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * You MUST call this function at the beginning of a&lt;br /&gt;
 * main program, that uses the RP6 I2C GPS Receiver. &lt;br /&gt;
 * If SENSOR_BOARD is defined, the I2C-MODULE power&lt;br /&gt;
 * will be switched on with the function&lt;br /&gt;
 * setI2CModulePower() defined in the&lt;br /&gt;
 * RP6M256_Sensor_BoardLib, which will be included&lt;br /&gt;
 * then.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void I2C_GPS_init(void)&lt;br /&gt;
{&lt;br /&gt;
#ifdef SENSOR_BOARD&lt;br /&gt;
	// I2C-MODULE (plug M1) power on: &lt;br /&gt;
	setI2CModulePower(1);&lt;br /&gt;
#endif&lt;br /&gt;
	// Other init procedures here!&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Writes a new I2C address to the I2C GPS Receiver.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: addr -&amp;gt; New I2C address [0xc8..0xde]&lt;br /&gt;
 *&lt;br /&gt;
 * Hints: - Default I2C address is 0xc8.&lt;br /&gt;
 *        - You may choose a new I2C address in&lt;br /&gt;
 *          the range 0xc8..0xde.&lt;br /&gt;
 *        - After writing a new address you have&lt;br /&gt;
 *          to switch the I2C GPS Receiver off&lt;br /&gt;
 *          and on again.&lt;br /&gt;
 *        - Definition I2C_GPS_RECEIVER_ADR must&lt;br /&gt;
 *          be adapted to the new I2C address!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void I2C_GPS_new_addr(uint8_t addr)&lt;br /&gt;
{&lt;br /&gt;
	if((addr &amp;lt; 0xc8) || (addr &amp;gt; 0xde)) return;&lt;br /&gt;
	addr &amp;amp;= 0xfe;								// Clear R/W bit&lt;br /&gt;
	I2CTWI_transmit3Bytes(I2C_GPS_RECEIVER_ADR, 0, 0x04, addr);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&lt;br /&gt;
/******************************************************************************&lt;br /&gt;
 * Additional info&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Changelog:&lt;br /&gt;
 * - v. 1.0 (initial release) 21.04.2014 by Dirk&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Erklärung&lt;br /&gt;
&lt;br /&gt;
======Demo======&lt;br /&gt;
makefile:&lt;br /&gt;
&amp;lt;pre&amp;gt;...&lt;br /&gt;
TARGET = RP6M256_Sensor_Board_02&lt;br /&gt;
...&lt;br /&gt;
SRC += $(RP6_LIB_PATH)/RP6common/RP6I2CmasterTWI.c&lt;br /&gt;
&lt;br /&gt;
SRC += $(RP6_LIB_PATH)/RP6control_M256_WIFI/RP6M256_Sensor_BoardLib.c&lt;br /&gt;
SRC += $(RP6_LIB_PATH)/RP6control_M256_WIFI/RP6M256_I2C_GPSLib.c&lt;br /&gt;
...&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Datei: RP6M256_Sensor_Board_02.c&lt;br /&gt;
&amp;lt;pre&amp;gt;/* &lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * RP6 ROBOT SYSTEM - RP6 CONTROL M256 Examples&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Example: RP6M256 Sensor Board&lt;br /&gt;
 * Author(s): Dirk&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Description:&lt;br /&gt;
 * In this example we show a second test for the RP6 Sensor Board.&lt;br /&gt;
 * &lt;br /&gt;
 * ############################################################################&lt;br /&gt;
 * The Robot does NOT move in this example! You can simply put it on a table&lt;br /&gt;
 * next to your PC and you should connect it to the PC via the USB Interface!&lt;br /&gt;
 * You should also connect to it via WIFI.&lt;br /&gt;
 * ############################################################################&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Includes:&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6M256Lib.h&amp;quot; 				// The RP6 M256 Library. &lt;br /&gt;
										// Always needs to be included!&lt;br /&gt;
#include &amp;quot;RP6I2CmasterTWI.h&amp;quot;			// Include the I2C-Bus Master Library&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Include our new &amp;quot;RP6M256 I2C GPS Receiver library&amp;quot;:&lt;br /&gt;
// (This is the library for accessing the RP6 I2C GPS Receiver!)&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6M256_I2C_GPSLib.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Write a floating point number to the WIFI.&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *&lt;br /&gt;
 *			// Write a floating point number to the WIFI (no exponent):&lt;br /&gt;
 *			writeDouble_WIFI(1234567.890, 11, 3);&lt;br /&gt;
 *&lt;br /&gt;
 * The value of prec (precision) defines the number of decimal places.&lt;br /&gt;
 * For 32 bit floating point variables (float, double ...) 6 is&lt;br /&gt;
 * the max. value for prec (7 relevant digits).&lt;br /&gt;
 * The value of width defines the overall number of characters in the&lt;br /&gt;
 * floating point number including the decimal point. The number of&lt;br /&gt;
 * pre-decimal positions is: (width - prec - 1).&lt;br /&gt;
 */&lt;br /&gt;
void writeDouble_WIFI(double number, uint8_t width, uint8_t prec)&lt;br /&gt;
{char buffer[width + 1];&lt;br /&gt;
	dtostrf(number, width, prec, &amp;amp;buffer[0]);&lt;br /&gt;
	writeString_WIFI(&amp;amp;buffer[0]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Write a floating point number to the LCD.&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *&lt;br /&gt;
 *			// Write a floating point number to the LCD (no exponent):&lt;br /&gt;
 *			writeDoubleLCD(1234567.890, 11, 3);&lt;br /&gt;
 *&lt;br /&gt;
 * The value of prec (precision) defines the number of decimal places.&lt;br /&gt;
 * For 32 bit floating point variables (float, double ...) 6 is&lt;br /&gt;
 * the max. value for prec (7 relevant digits).&lt;br /&gt;
 * The value of width defines the overall number of characters in the&lt;br /&gt;
 * floating point number including the decimal point. The number of&lt;br /&gt;
 * pre-decimal positions is: (width - prec - 1).&lt;br /&gt;
 */&lt;br /&gt;
void writeDoubleLCD(double number, uint8_t width, uint8_t prec)&lt;br /&gt;
{char buffer[width + 1];&lt;br /&gt;
	dtostrf(number, width, prec, &amp;amp;buffer[0]);&lt;br /&gt;
	writeStringLCD(&amp;amp;buffer[0]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Error handler&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function gets called automatically if there was an I2C Error like&lt;br /&gt;
 * the slave sent a &amp;quot;not acknowledge&amp;quot; (NACK, error codes e.g. 0x20 or 0x30).&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void I2C_transmissionError(uint8_t errorState)&lt;br /&gt;
{&lt;br /&gt;
	writeString_P_WIFI(&amp;quot;\nI2C ERROR - TWI STATE: 0x&amp;quot;);&lt;br /&gt;
	writeInteger_WIFI(errorState, HEX);&lt;br /&gt;
	writeChar_WIFI('\n');&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Main function - The program starts here:&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
	initRP6M256();    // Always call this first! The Processor will not work&lt;br /&gt;
					  // correctly otherwise. &lt;br /&gt;
&lt;br /&gt;
	initLCD(); // Initialize the LC-Display (LCD)&lt;br /&gt;
			   // Always call this before using the LCD!&lt;br /&gt;
&lt;br /&gt;
	setLEDs(0b1111);&lt;br /&gt;
	mSleep(500);&lt;br /&gt;
	setLEDs(0b0000);&lt;br /&gt;
&lt;br /&gt;
	writeString_P_WIFI(&amp;quot;\n\nRP6 Sensor Board Selftest 2!\n&amp;quot;); &lt;br /&gt;
&lt;br /&gt;
	// IMPORTANT:&lt;br /&gt;
	I2CTWI_initMaster(100); // Initialize the TWI Module for Master operation&lt;br /&gt;
							// with 100kHz SCL Frequency&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	// Register the event handler:&lt;br /&gt;
	I2CTWI_setTransmissionErrorHandler(I2C_transmissionError);&lt;br /&gt;
&lt;br /&gt;
	setLEDs(0b1111);&lt;br /&gt;
&lt;br /&gt;
	// Write a text message to the LCD:&lt;br /&gt;
	showScreenLCD(&amp;quot;################&amp;quot;, &amp;quot;################&amp;quot;);&lt;br /&gt;
	mSleep(1500);&lt;br /&gt;
	showScreenLCD(&amp;quot;RP6v2-M256-WIFI &amp;quot;, &amp;quot;Example Program&amp;quot;);&lt;br /&gt;
	mSleep(2500); &lt;br /&gt;
	showScreenLCD(&amp;quot;RP6 Sensor Board&amp;quot;, &amp;quot;   Selftest 2&amp;quot;);&lt;br /&gt;
	mSleep(2500);&lt;br /&gt;
	clearLCD();&lt;br /&gt;
&lt;br /&gt;
	setLEDs(0b0000);&lt;br /&gt;
&lt;br /&gt;
	// ---------------------------------------&lt;br /&gt;
&lt;br /&gt;
	uint8_t onoff = 0;&lt;br /&gt;
	uint8_t i;&lt;br /&gt;
&lt;br /&gt;
	startStopwatch1();&lt;br /&gt;
	startStopwatch2();&lt;br /&gt;
&lt;br /&gt;
	// IMPORTANT:&lt;br /&gt;
	sensor_board_init();						// RP6 Sensor Board init!!!&lt;br /&gt;
	I2C_GPS_init();								// RP6 I2C GPS Receiver init&lt;br /&gt;
&lt;br /&gt;
	while(true) &lt;br /&gt;
	{&lt;br /&gt;
		if(getStopwatch1() &amp;gt; 1000) // 1s&lt;br /&gt;
		{&lt;br /&gt;
			if (onoff) onoff = 0;&lt;br /&gt;
			else onoff = 1;&lt;br /&gt;
&lt;br /&gt;
			// Show GPS data:&lt;br /&gt;
			I2C_GPS_read(DATA_LENGTH);			// Read data&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nLAT_DEG:     &amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.latDeg, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;° &amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.latMin, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;.&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.latMinDec, DEC, 4);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;' &amp;quot;);&lt;br /&gt;
			if(gpsdata.status.ns)&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;N&amp;quot;);&lt;br /&gt;
			else&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;S&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nLON_DEG:    &amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.lonDeg, DEC, 3);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;° &amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.lonMin, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;.&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.lonMinDec, DEC, 4);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;' &amp;quot;);&lt;br /&gt;
			if(gpsdata.status.ew)&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;E&amp;quot;);&lt;br /&gt;
			else&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;W&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nSTATUS:     &amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.status.byte, BIN, 8);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nFIX_IND:    &amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.fixInd.byte, BIN, 8);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nHDOP:       &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(gpsdata.hdop, DEC);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;.&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.hdopDec, DEC, 2);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nSAT_N:      &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(gpsdata.satCount, DEC);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nCOURSE_T:   &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(gpsdata.course, DEC);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;.&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.courseDec, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;°&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nSPEED:      &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(gpsdata.speed, DEC);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;.&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.speedDec, DEC, 2);&lt;br /&gt;
			if(gpsdata.status.spu)&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;km/h&amp;quot;);&lt;br /&gt;
			else&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;kn&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nALT:        &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(gpsdata.altitude, DEC);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;m\nALT_DIF:    &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(gpsdata.altDif, DEC);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;m\nUTC:        &amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.utcHour, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;:&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.utcMinute, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;:&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.utcSec, DEC, 2);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nDATE:       &amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.day, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;.&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.month, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;.&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.year, DEC, 4);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nPDOP:       &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(gpsdata.pdop, DEC);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;.&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.pdopDec, DEC, 2);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nVDOP:       &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(gpsdata.vdop, DEC);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;.&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.vdopDec, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			for(i = 0; i &amp;lt; gpsdata.satCount; i++) {&lt;br /&gt;
				if(i == 8) writeString_P_WIFI(&amp;quot;\n&amp;quot;);&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;  SAT_&amp;quot;);&lt;br /&gt;
				writeIntegerLength_WIFI(i + 1, HEX, 1);&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;: &amp;quot;);&lt;br /&gt;
				writeInteger_WIFI(gpsdata.sat[i], DEC);&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nSW_VERSION: &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(gpsdata.swVersion, DEC);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nHEARTBEAT:  &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(gpsdata.heartbeat, DEC);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			// RP6 Sensor Board shutdown (button &amp;amp; status LED test):&lt;br /&gt;
			if (pressedButton) {&lt;br /&gt;
				setStatusLED(1);&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;\nPress button again for RP6 Sensor Board SHUTDOWN!\n&amp;quot;);&lt;br /&gt;
				mSleep(2000);&lt;br /&gt;
				do {&lt;br /&gt;
					if(getStopwatch2() &amp;gt; 200) { // 0.2s&lt;br /&gt;
						if (onoff) onoff = 0;&lt;br /&gt;
						else onoff = 1;&lt;br /&gt;
						if (onoff) setStatusLED(1);&lt;br /&gt;
						else setStatusLED(0);&lt;br /&gt;
						setStopwatch2(0);&lt;br /&gt;
					}&lt;br /&gt;
					mSleep(1);&lt;br /&gt;
					task_I2CTWI();&lt;br /&gt;
				} while (!readButton());&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;\n\n\n\n\nPlease wait for RP6 Sensor Board SHUTDOWN...\n&amp;quot;);&lt;br /&gt;
				sensor_board_shutdown();&lt;br /&gt;
				mSleep(3000);&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;\n\n\nThe RP6 Sensor Board now is in SHUTDOWN MODE!!!\n&amp;quot;);&lt;br /&gt;
				mSleep(1000);&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;\nRESET the M256 microcontroller now...\n\n&amp;quot;);&lt;br /&gt;
				while(true) {};&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			setStopwatch1(0);&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		task_RP6SensorBoard();					// RP6 Sensor Board task&lt;br /&gt;
&lt;br /&gt;
		task_I2CTWI();&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Erklärung&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Gyro Modul JM3-GYRO====&lt;br /&gt;
=====Analoge Auswertung=====&lt;br /&gt;
Am Pin ''OUT'' des Gyro Moduls (siehe [http://www.rn-wissen.de/index.php/RP6_Sensor_Board_und_Xtra_Module#Anschluss-Schema Anschluss-Schema]!) liegt die Ausgangsspannung des Sensors (0..5V) an. Sie kann mit einem ADC-Eingang eines Microcontrollers gemessen werden.&lt;br /&gt;
Syntax mit den Libraries der RP6Base, M32 oder M256 WiFi (ADC Kanal 0):&lt;br /&gt;
 uint16_t result = readADC(0);&lt;br /&gt;
In der C-Control-Pro Umgebung der M128 sieht das z.B. in CompactC so aus (ADC Kanal 0):&lt;br /&gt;
 word result;&lt;br /&gt;
 ADC_Set(ADC_VREF_VCC, 0);&lt;br /&gt;
 ...&lt;br /&gt;
 result = ADC_Read();&lt;br /&gt;
Das Ergebnis ''result'' kann noch zur Weiterverarbeitung angepasst werden:&lt;br /&gt;
 #define ADCVAL_ZERORATE_LEVEL			511		// Zero rate Level&lt;br /&gt;
 ...&lt;br /&gt;
 int16_t z_axisg = result - ADCVAL_ZERORATE_LEVEL;&lt;br /&gt;
Dadurch zeigt ''z_axisg'' Null an, wenn keine Rotation anliegt und wird positiv, wenn nach LINKS gedreht wird und negativ bei RECHTS-Drehung. Die Definition ADCVAL_ZERORATE_LEVEL muss natürlich an den eigenen Sensor-Nullwert angepasst werden.&lt;br /&gt;
&lt;br /&gt;
Aus dem Absolutwert von ''z_axisg'' kann man die Drehrate (Drehgeschwindigkeit) auch bestimmen:&lt;br /&gt;
&lt;br /&gt;
In den [[RP6_Sensor_Board_und_Xtra_Module#Technische_Daten_3|Technischen Daten]] ist die Empfindlichkeit des Sensors mit '''10mV/dps''' (0,01V pro Grad und Sekunde) angegeben. Damit errechnet sich die Drehrate als:&lt;br /&gt;
 Drehrate [dps] = abs(z_axisg) * (5 / 1024 / 0.01) = abs(z_axisg) * 0.48828125&lt;br /&gt;
&lt;br /&gt;
=====Optionale Ansteuerung=====&lt;br /&gt;
Im [http://www.rn-wissen.de/index.php/RP6_Sensor_Board_und_Xtra_Module#Anschluss-Schema Anschluss-Schema] ist erkennbar, dass es noch 2 Steuerleitungen ''SLEEP/PD'' und ''ST'' gibt. Mit diesen Anschlüssen kann die Betriebsart des Gyro Moduls festgelegt werden, siehe nachfolgende Tabelle:&lt;br /&gt;
{|  {{Blauetabelle}} &lt;br /&gt;
|Betriebsart&lt;br /&gt;
|ST&lt;br /&gt;
|SLEEP/PD&lt;br /&gt;
|Stromverbrauch&lt;br /&gt;
|-&lt;br /&gt;
|Normal&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|4,2mA&lt;br /&gt;
|-&lt;br /&gt;
|Sleep&lt;br /&gt;
|0&lt;br /&gt;
|1&lt;br /&gt;
|2,2mA&lt;br /&gt;
|-&lt;br /&gt;
|Self-test&lt;br /&gt;
|1&lt;br /&gt;
|0&lt;br /&gt;
|4,2mA&lt;br /&gt;
|-&lt;br /&gt;
|Power-down&lt;br /&gt;
|1&lt;br /&gt;
|1&lt;br /&gt;
|'''5µA'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
Will man zwischen den Betriebsarten per Software umschalten, muss man die beiden Steuerleitungen mit I/O Portpins des Microcontrollers verbinden, die als Ausgänge konfiguriert sind. Braucht man diese Funktion nicht, reicht es, ''ST'' und ''SLEEP/PD'' mit GND zu verbinden (Betriebsart &amp;quot;Normal&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====3D Accelerometer Modul JM3-3DA====&lt;br /&gt;
Das 3D Accelerometer Modul kann über den I2C- oder den SPI-Bus angesteuert werden. Wird das Modul auf der RP6 CONTROL M32 Platine betrieben (es sitzt also auf dem Sockel IC5 für das 2. SPI-EEPROM), dann erfolgt die Ansteuerung über den SPI-Bus. Die SPI-Grundfunktionen befinden sich in der RP6ControlLib, die daher eingebunden werden muss.&lt;br /&gt;
&lt;br /&gt;
=====RP6 CONTROL M32: ACCSENS Library=====&lt;br /&gt;
Die nachfolgende RP6ControlACCSENSLib (GCC) dient zur Ansteuerung des 3D Accelerometer Moduls durch die RP6 CONTROL M32.&lt;br /&gt;
&lt;br /&gt;
======Configuration Header======&lt;br /&gt;
Vor dem Kompilieren der Library muss eine Anpassung des Configuration Headers an die eigenen Hardware-Voraussetzungen erfolgen.&lt;br /&gt;
Dazu gibt es im Configuration Header eine Definition:&lt;br /&gt;
* EXP_STACK_1 -&amp;gt; Die RP6 CONTROL M32 sitzt auf dem vorderen Platinenstapel 1 des RP6&lt;br /&gt;
Im nachfolgenden Listing ist die Definition EXP_STACK_1 NICHT aktiv (d.h. die M32 sitzt auf dem hinteren Platinenstapel 2!). Dies muss an die eigene Hardware angepaßt werden. Wenn die RP6 CONTROL M32 auf dem vorderen Platinenstapel 1 des RP6 sitzt, muss die Zeile mit &amp;quot;EXP_STACK_1&amp;quot; &amp;quot;aktiviert&amp;quot; werden. Dazu entfernt man &amp;quot;//&amp;quot; am Zeilenanfang:&lt;br /&gt;
 #define EXP_STACK_1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Bevor man den Beschleunigungssensor nutzen kann, muss man ihn kalibrieren:&lt;br /&gt;
&lt;br /&gt;
'''Accelerometer:'''&lt;br /&gt;
* Die X-Achse wird kalibriert, indem man den RP6 mit der rechten Seite nach unten hält und den Maximalwert in MAX_X_A einträgt. Dann neigt man ihn auf seine linke Seite und trägt den negativen Maximalwert in MIN_X_A ein.&lt;br /&gt;
* Die Y-Achse wird kalibriert, indem man den RP6 mit der Vorderseite nach oben hält und den Maximalwert in MAX_Y_A einträgt. Dann kippt man die Vorderseite nach unten und trägt den negativen Maximalwert in MIN_Y_A ein.&lt;br /&gt;
* Die Z-Achse wird kalibriert, indem man den RP6 normal waagerecht hält und den Maximalwert in MAX_Z_A einträgt. Dann dreht man den RP6 &amp;quot;auf den Kopf&amp;quot; und trägt den negativen Maximalwert in MIN_Z_A ein.&lt;br /&gt;
* Sollten die angezeigten Pitch- und Roll-Werte nach der Kalibrierung der Achsen und genau waagerecht stehendem Sensor bzw. RP6 vom Nullwert deutlich abweichen, kann man sie mithilfe der Definitionen OFFSET_PITCH_A und OFFSET_ROLL_A &amp;quot;nullen&amp;quot;. Die Einheit dieser Definitionen ist °.&lt;br /&gt;
Nach dem Eintragen der Kalibrierungswerte muss das Programm neu kompiliert werden!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Datei: RP6ControlACCSENS.h&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;/* ****************************************************************************&lt;br /&gt;
 *                           _______________________&lt;br /&gt;
 *                           \| RP6  ROBOT SYSTEM |/&lt;br /&gt;
 *                            \_-_-_-_-_-_-_-_-_-_/             &amp;gt;&amp;gt;&amp;gt; RP6 CONTROL&lt;br /&gt;
 * ----------------------------------------------------------------------------&lt;br /&gt;
 * ----------------------------- [c]2014 - Dirk -------------------------------&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * File: RP6ControlACCSENS.h&lt;br /&gt;
 * Version: 1.0&lt;br /&gt;
 * Target: RP6 CONTROL - ATMEGA32 @16.00MHz&lt;br /&gt;
 * Author(s): Dirk&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Description:&lt;br /&gt;
 * Configuration header file for new ACCSENS library.&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * THE CHANGELOG CAN BE FOUND AT THE END OF THIS FILE!&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
#ifndef RP6CONTROLACCSENS_H&lt;br /&gt;
#define RP6CONTROLACCSENS_H&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Sensor position on the RP6 robot:&lt;br /&gt;
// (If EXP_STACK_1 is defined, the RP6 CONTROL M32 is located on the front&lt;br /&gt;
//  stack for addon boards on the RP6 robot. If EXP_STACK_1 is NOT defined&lt;br /&gt;
//  (default), the RP6 CONTROL M32 is mounted on the rear stack.)&lt;br /&gt;
// -------------------&lt;br /&gt;
//#define EXP_STACK_1&lt;br /&gt;
// -------------------&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// The following sensor is used:&lt;br /&gt;
// - 3D Accelerometer Modul (CONRAD 1082387-62) with LIS302DLH 3-axis&lt;br /&gt;
//   accelerometer&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// LIS302DLH accelerometer calibration data:&lt;br /&gt;
#define MAX_X_A						32767		// Max. X-axis value&lt;br /&gt;
#define MIN_X_A						-32768		// Min. X-axis value&lt;br /&gt;
#define MAX_Y_A						32767		// Max. Y-axis value&lt;br /&gt;
#define MIN_Y_A						-32768		// Min. Y-axis value&lt;br /&gt;
#define MAX_Z_A						32767		// Max. Z-axis value&lt;br /&gt;
#define MIN_Z_A						-32768		// Min. Z-axis value&lt;br /&gt;
#define OFFSET_PITCH_A				0.0			// Offset Pitch [°]&lt;br /&gt;
#define OFFSET_ROLL_A				0.0			// Offset Roll [°]&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
/******************************************************************************&lt;br /&gt;
 * Additional info&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Changelog:&lt;br /&gt;
 * &lt;br /&gt;
 *  ---&amp;gt; changes are documented in the file &amp;quot;RP6ControlACCSENSLib.c&amp;quot;&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
======Library Header======&lt;br /&gt;
Datei: RP6ControlACCSENSLib.h&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;/* ****************************************************************************&lt;br /&gt;
 *                           _______________________&lt;br /&gt;
 *                           \| RP6  ROBOT SYSTEM |/&lt;br /&gt;
 *                            \_-_-_-_-_-_-_-_-_-_/             &amp;gt;&amp;gt;&amp;gt; RP6 CONTROL&lt;br /&gt;
 * ----------------------------------------------------------------------------&lt;br /&gt;
 * ----------------------------- [c]2014 - Dirk -------------------------------&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * File: RP6ControlACCSENSLib.h&lt;br /&gt;
 * Version: 1.0&lt;br /&gt;
 * Target: RP6 CONTROL - ATMEGA32 @16.00MHz&lt;br /&gt;
 * Author(s): Dirk&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Description:&lt;br /&gt;
 * This is the RP6ControlACCSENSLib header file.&lt;br /&gt;
 * You have to include this file, if you want to use the library&lt;br /&gt;
 * RP6ControlACCSENSLib.c in your own projects.&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * THE CHANGELOG CAN BE FOUND AT THE END OF THIS FILE!&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
#ifndef RP6CONTROLACCSENSLIB_H&lt;br /&gt;
#define RP6CONTROLACCSENSLIB_H&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Includes:&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6ControlLib.h&amp;quot; 		// The RP6 Control Library (v. 1.1 or higher). &lt;br /&gt;
#include &amp;quot;RP6ControlACCSENS.h&amp;quot;&lt;br /&gt;
#include &amp;lt;math.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&lt;br /&gt;
#define ACC_CS							MEM_CS2&lt;br /&gt;
#define DEVICE_IDENTIFIER				0x32&lt;br /&gt;
&lt;br /&gt;
// Registers:&lt;br /&gt;
#define WHO_AM_I						0x0f&lt;br /&gt;
#define CTRL_REG1						0x20&lt;br /&gt;
#define CTRL_REG2						0x21&lt;br /&gt;
#define CTRL_REG3						0x22&lt;br /&gt;
#define CTRL_REG4						0x23&lt;br /&gt;
#define CTRL_REG5						0x24&lt;br /&gt;
#define HP_FILTER_RESET					0x25&lt;br /&gt;
#define REFERENCE						0x26&lt;br /&gt;
#define STATUS_REG						0x27&lt;br /&gt;
#define OUT_X_L							0x28&lt;br /&gt;
#define OUT_X_H							0x29&lt;br /&gt;
#define OUT_Y_L							0x2a&lt;br /&gt;
#define OUT_Y_H							0x2b&lt;br /&gt;
#define OUT_Z_L							0x2c&lt;br /&gt;
#define OUT_Z_H							0x2d&lt;br /&gt;
#define INT1_CFG						0x30&lt;br /&gt;
#define INT1_SOURCE						0x31&lt;br /&gt;
#define INT1_THS						0x32&lt;br /&gt;
#define INT1_DURATION					0x33&lt;br /&gt;
#define INT2_CFG						0x34&lt;br /&gt;
#define INT2_SOURCE						0x35&lt;br /&gt;
#define INT2_THS						0x36&lt;br /&gt;
#define INT2_DURATION					0x37&lt;br /&gt;
&lt;br /&gt;
// Control Register bitmasks:&lt;br /&gt;
#define CTRL_REG1_POWERDOWN				0b00000000&lt;br /&gt;
#define CTRL_REG1_3D_DEFAULT			0b00000111&lt;br /&gt;
#define CTRL_REG1_3D_LOPWR_10HZ			0b11000111&lt;br /&gt;
#define CTRL_REG2_DEFAULT				0b00000000&lt;br /&gt;
#define CTRL_REG3_DEFAULT				0b00000000&lt;br /&gt;
#define CTRL_REG4_DEFAULT				0b00000000&lt;br /&gt;
#define CTRL_REG4_BDU_2G				0b10000000&lt;br /&gt;
#define CTRL_REG4_BDU_2G_STSIGN			0b10001000&lt;br /&gt;
#define CTRL_REG4_BDU_BLE_2G			0b11000000&lt;br /&gt;
#define CTRL_REG4_BDU_BLE_2G_STSIGN		0b11001000&lt;br /&gt;
#define CTRL_REG5_DEFAULT				0b00000000&lt;br /&gt;
&lt;br /&gt;
// Read/write address bitmasks:&lt;br /&gt;
#define READ_MASK						0b10000000&lt;br /&gt;
#define READ_AUTOINC_MASK				0b11000000&lt;br /&gt;
#define WRITE_MASK						0b01111111&lt;br /&gt;
&lt;br /&gt;
extern int16_t x_axisa, y_axisa, z_axisa;&lt;br /&gt;
extern double pitch, roll;&lt;br /&gt;
extern double xa, ya, za;&lt;br /&gt;
extern double the, phi;&lt;br /&gt;
&lt;br /&gt;
uint8_t SPI_ACCSENS_readByte(uint8_t regAddr);&lt;br /&gt;
void SPI_ACCSENS_readBytes(uint8_t startAddr, uint8_t *buffer, uint8_t length);&lt;br /&gt;
void SPI_ACCSENS_writeByte(uint8_t regAddr, uint8_t data);&lt;br /&gt;
uint8_t SPI_ACCSENS_getStatus(void);&lt;br /&gt;
&lt;br /&gt;
void SPI_ACCSENS_init(void);&lt;br /&gt;
void SPI_ACCSENS_shutdown(void);&lt;br /&gt;
void SPI_ACCSENS_read(void);&lt;br /&gt;
void SPI_ACCSENS_normalize(void);&lt;br /&gt;
void SPI_ACCSENS_position(void);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
/******************************************************************************&lt;br /&gt;
 * Additional info&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Changelog:&lt;br /&gt;
 * &lt;br /&gt;
 *  ---&amp;gt; changes are documented in the file &amp;quot;RP6ControlACCSENSLib.c&amp;quot;&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
======Library Source======&lt;br /&gt;
Datei: RP6ControlACCSENSLib.c&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;/* ****************************************************************************&lt;br /&gt;
 *                           _______________________&lt;br /&gt;
 *                           \| RP6  ROBOT SYSTEM |/&lt;br /&gt;
 *                            \_-_-_-_-_-_-_-_-_-_/             &amp;gt;&amp;gt;&amp;gt; RP6 CONTROL&lt;br /&gt;
 * ----------------------------------------------------------------------------&lt;br /&gt;
 * ----------------------------- [c]2014 - Dirk -------------------------------&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * File: RP6ControlACCSENSLib.c&lt;br /&gt;
 * Version: 1.0&lt;br /&gt;
 * Target: RP6 CONTROL - ATMEGA32 @16.00MHz&lt;br /&gt;
 *         with optional LC-Display 16x2 chars (CONRAD 190911-62)&lt;br /&gt;
 *         and a 3D Accelerometer Modul (CONRAD 1082387-62) (IC5)&lt;br /&gt;
 * Author(s): Dirk&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Description:&lt;br /&gt;
 * This is my RP6 Control ACCSENS Library. This library may be used to access&lt;br /&gt;
 * the basic functions of the 3D Accelerometer Modul. This RP6 Xtra module may&lt;br /&gt;
 * be placed on the IC5 socket on the RP6 CONTROL M32 instead of a second&lt;br /&gt;
 * EEPROM.&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * THE CHANGELOG CAN BE FOUND AT THE END OF THIS FILE!&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
 &lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Includes:&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6ControlACCSENSLib.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// SPI functions:&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Reads a single register from the 3D Accelerometer&lt;br /&gt;
 * Modul (ACCSENS).&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
uint8_t SPI_ACCSENS_readByte(uint8_t regAddr)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t data;&lt;br /&gt;
	regAddr |= READ_MASK;						// Read byte&lt;br /&gt;
	PORTB &amp;amp;= ~ACC_CS;&lt;br /&gt;
	writeSPI(regAddr);&lt;br /&gt;
	data = readSPI();&lt;br /&gt;
	PORTB |= ACC_CS;&lt;br /&gt;
	return data;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Reads &amp;quot;length&amp;quot; bytes into the buffer &amp;quot;buffer&amp;quot;&lt;br /&gt;
 * from startAddr on. &lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void SPI_ACCSENS_readBytes(uint8_t startAddr, uint8_t *buffer, uint8_t length)&lt;br /&gt;
{&lt;br /&gt;
	startAddr |= READ_AUTOINC_MASK;				// Read byte, auto increment&lt;br /&gt;
	PORTB &amp;amp;= ~ACC_CS;&lt;br /&gt;
	writeSPI(startAddr);&lt;br /&gt;
	readBufferSPI(&amp;amp;buffer[0], length);&lt;br /&gt;
	PORTB |= ACC_CS;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Write a single data byte to the specified sensor&lt;br /&gt;
 * address.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void SPI_ACCSENS_writeByte(uint8_t regAddr, uint8_t data)&lt;br /&gt;
{&lt;br /&gt;
	PORTB &amp;amp;= ~ACC_CS;&lt;br /&gt;
	writeSPI(regAddr);&lt;br /&gt;
	writeSPI(data);&lt;br /&gt;
	PORTB |= ACC_CS;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Returns sensor status register - for checking if&lt;br /&gt;
 * sensor is busy. &lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
uint8_t SPI_ACCSENS_getStatus(void)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t status;&lt;br /&gt;
	PORTB &amp;amp;= ~ACC_CS;&lt;br /&gt;
	writeSPI(STATUS_REG);&lt;br /&gt;
	status = readSPI();&lt;br /&gt;
	PORTB |= ACC_CS;&lt;br /&gt;
	return status;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// 3D accelerometer functions:&lt;br /&gt;
&lt;br /&gt;
int16_t x_axisa, y_axisa, z_axisa;&lt;br /&gt;
double pitch, roll;&lt;br /&gt;
double xa, ya, za;&lt;br /&gt;
double the, phi;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Initializes the sensor. You must call this&lt;br /&gt;
 * function at the beginning of a program, that&lt;br /&gt;
 * uses the 3D Accelerometer Modul.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void SPI_ACCSENS_init(void)&lt;br /&gt;
{&lt;br /&gt;
	// All axes enable, low power, 10Hz output data rate:&lt;br /&gt;
	SPI_ACCSENS_writeByte(CTRL_REG1, CTRL_REG1_3D_LOPWR_10HZ);&lt;br /&gt;
	// No update while reading, +- 2g, self-test minus:&lt;br /&gt;
	SPI_ACCSENS_writeByte(CTRL_REG4, CTRL_REG4_BDU_2G_STSIGN);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Sets the LIS302DLH power-down mode. If you&lt;br /&gt;
 * do not need the sensor, you can save energy&lt;br /&gt;
 * by using the sensor power-down mode.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void SPI_ACCSENS_shutdown(void)&lt;br /&gt;
{&lt;br /&gt;
	// LIS302DLH in power-down mode:&lt;br /&gt;
	SPI_ACCSENS_writeByte(CTRL_REG1, CTRL_REG1_POWERDOWN);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function reads the X-axis, Y-axis and Z-axis&lt;br /&gt;
 * values from the LIS302DLH accelerometer and stores&lt;br /&gt;
 * them in the global variables x_axisa, y_axisa and&lt;br /&gt;
 * z_axisa.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void SPI_ACCSENS_read(void)&lt;br /&gt;
{&lt;br /&gt;
#ifndef EXP_STACK_1&lt;br /&gt;
	// Default sensor position (M32 located on the RP6 rear stack):&lt;br /&gt;
	// xb = -y:&lt;br /&gt;
	x_axisa = SPI_ACCSENS_readByte(OUT_Y_L) | (SPI_ACCSENS_readByte(OUT_Y_H) &amp;lt;&amp;lt; 8);&lt;br /&gt;
	x_axisa *= -1;&lt;br /&gt;
	// yb = -x:&lt;br /&gt;
	y_axisa = SPI_ACCSENS_readByte(OUT_X_L) | (SPI_ACCSENS_readByte(OUT_X_H) &amp;lt;&amp;lt; 8);&lt;br /&gt;
	y_axisa *= -1;&lt;br /&gt;
	// zb = z:&lt;br /&gt;
	z_axisa = SPI_ACCSENS_readByte(OUT_Z_L) | (SPI_ACCSENS_readByte(OUT_Z_H) &amp;lt;&amp;lt; 8);&lt;br /&gt;
#else&lt;br /&gt;
	// Other sensor position (M32 located on the RP6 front stack):&lt;br /&gt;
	// xb = y:&lt;br /&gt;
	x_axisa = SPI_ACCSENS_readByte(OUT_Y_L) | (SPI_ACCSENS_readByte(OUT_Y_H) &amp;lt;&amp;lt; 8);&lt;br /&gt;
	// yb = x:&lt;br /&gt;
	y_axisa = SPI_ACCSENS_readByte(OUT_X_L) | (SPI_ACCSENS_readByte(OUT_X_H) &amp;lt;&amp;lt; 8);&lt;br /&gt;
	// zb = z:&lt;br /&gt;
	z_axisa = SPI_ACCSENS_readByte(OUT_Z_L) | (SPI_ACCSENS_readByte(OUT_Z_H) &amp;lt;&amp;lt; 8);&lt;br /&gt;
#endif&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function limits and normalizes the x-axisa,&lt;br /&gt;
 * y-axisa and z-axisa values read from the LIS302DLH&lt;br /&gt;
 * accelerometer with the function SPI_ACCSENS_read() and&lt;br /&gt;
 * stores them in the global double variables xa, ya and&lt;br /&gt;
 * za.&lt;br /&gt;
 * It also calculates the position in space in form of the&lt;br /&gt;
 * tilt angles (the = pitch, phi = roll) and stores them&lt;br /&gt;
 * in the global double variables the and phi.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void SPI_ACCSENS_normalize(void)&lt;br /&gt;
{&lt;br /&gt;
	// Limit raw values:&lt;br /&gt;
	if (x_axisa &amp;lt; MIN_X_A) x_axisa = MIN_X_A;&lt;br /&gt;
	if (x_axisa &amp;gt; MAX_X_A) x_axisa = MAX_X_A;&lt;br /&gt;
	if (y_axisa &amp;lt; MIN_Y_A) y_axisa = MIN_Y_A;&lt;br /&gt;
	if (y_axisa &amp;gt; MAX_Y_A) y_axisa = MAX_Y_A;&lt;br /&gt;
	if (z_axisa &amp;lt; MIN_Z_A) z_axisa = MIN_Z_A;&lt;br /&gt;
	if (z_axisa &amp;gt; MAX_Z_A) z_axisa = MAX_Z_A;&lt;br /&gt;
	xa = (double) x_axisa / 10000.0;&lt;br /&gt;
	ya = (double) y_axisa / 10000.0;&lt;br /&gt;
	za = (double) z_axisa / 10000.0;&lt;br /&gt;
	// Calculate Pitch and Roll:&lt;br /&gt;
	phi = asin(xa);								// Calculate the and phi&lt;br /&gt;
	the = asin(ya / cos(the));					//  from the raw values&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function calculates the position in space by&lt;br /&gt;
 * using the the and phi values (see function&lt;br /&gt;
 * SPI_ACCSENS_normalize()!). It stores the position&lt;br /&gt;
 * in the global double variables pitch and roll. &lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void SPI_ACCSENS_position(void)&lt;br /&gt;
{&lt;br /&gt;
	pitch = the * 180 / M_PI + OFFSET_PITCH_A;&lt;br /&gt;
	roll = phi * 180 / M_PI + OFFSET_ROLL_A;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/******************************************************************************&lt;br /&gt;
 * Additional info&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Changelog:&lt;br /&gt;
 * - v. 1.0 (initial release) 04.04.2014 by Dirk&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Erklärung&lt;br /&gt;
&lt;br /&gt;
======Demo======&lt;br /&gt;
makefile:&lt;br /&gt;
&amp;lt;pre&amp;gt;...&lt;br /&gt;
TARGET = RP6Control_01_ACCSENS&lt;br /&gt;
...&lt;br /&gt;
SRC += $(RP6_LIB_PATH)/RP6control/RP6ControlLib.c&lt;br /&gt;
SRC += $(RP6_LIB_PATH)/RP6common/RP6uart.c&lt;br /&gt;
SRC += $(RP6_LIB_PATH)/RP6control/RP6ControlACCSENSLib.c&lt;br /&gt;
...&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Datei: RP6Control_01_ACCSENS.c&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;// Uncommented Version of RP6Control_01_ACCSENS.c&lt;br /&gt;
// written by Dirk&lt;br /&gt;
// ------------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6ControlACCSENSLib.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void writeDouble(double number, uint8_t width, uint8_t prec)&lt;br /&gt;
{char buffer[width + 1];&lt;br /&gt;
	dtostrf(number, width, prec, &amp;amp;buffer[0]);&lt;br /&gt;
	writeString(&amp;amp;buffer[0]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void writeDoubleLCD(double number, uint8_t width, uint8_t prec)&lt;br /&gt;
{char buffer[width + 1];&lt;br /&gt;
	dtostrf(number, width, prec, &amp;amp;buffer[0]);&lt;br /&gt;
	writeStringLCD(&amp;amp;buffer[0]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
	initRP6Control();&lt;br /&gt;
&lt;br /&gt;
	writeString_P(&amp;quot;\n\nRP6Control SPI ACCSENS Test Program!\n&amp;quot;); &lt;br /&gt;
	setLEDs(0b1111);&lt;br /&gt;
	mSleep(50);&lt;br /&gt;
	initLCD(); &lt;br /&gt;
	showScreenLCD(&amp;quot;################&amp;quot;, &amp;quot;################&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
	showScreenLCD(&amp;quot;  SPI ACCSENS&amp;quot;, &amp;quot;  Test Program&amp;quot;);&lt;br /&gt;
	mSleep(1000);&lt;br /&gt;
	setLEDs(0b0000);&lt;br /&gt;
&lt;br /&gt;
	SPI_ACCSENS_init();&lt;br /&gt;
&lt;br /&gt;
	uint8_t whoami = SPI_ACCSENS_readByte(WHO_AM_I);&lt;br /&gt;
	writeString_P(&amp;quot;\nWHO AM I: &amp;quot;);&lt;br /&gt;
	writeInteger(whoami, HEX);&lt;br /&gt;
	writeChar('\n');&lt;br /&gt;
	mSleep(2000);&lt;br /&gt;
	&lt;br /&gt;
	startStopwatch1();&lt;br /&gt;
&lt;br /&gt;
	while(true) &lt;br /&gt;
	{&lt;br /&gt;
		if(getStopwatch1() &amp;gt; 1000)&lt;br /&gt;
		{&lt;br /&gt;
			SPI_ACCSENS_read();&lt;br /&gt;
			writeString_P(&amp;quot;\n3D Accelerometer SENSOR -&amp;gt;\n&amp;quot;);&lt;br /&gt;
			writeString_P(&amp;quot;X-axis: &amp;quot;);&lt;br /&gt;
			writeInteger(x_axisa, DEC);&lt;br /&gt;
			writeChar('\n');&lt;br /&gt;
			writeString_P(&amp;quot;Y-axis: &amp;quot;);&lt;br /&gt;
			writeInteger(y_axisa, DEC);&lt;br /&gt;
			writeChar('\n');&lt;br /&gt;
			writeString_P(&amp;quot;Z-axis: &amp;quot;);&lt;br /&gt;
			writeInteger(z_axisa, DEC);&lt;br /&gt;
			writeChar('\n');&lt;br /&gt;
			SPI_ACCSENS_normalize();&lt;br /&gt;
			SPI_ACCSENS_position();&lt;br /&gt;
			writeString_P(&amp;quot;POSITION: \n&amp;quot;);&lt;br /&gt;
			writeString_P(&amp;quot;  Pitch [°]: &amp;quot;);&lt;br /&gt;
			writeDouble(pitch, 6, 1);&lt;br /&gt;
			writeChar('\n');&lt;br /&gt;
			writeString_P(&amp;quot;  Roll [°]:  &amp;quot;);&lt;br /&gt;
			writeDouble(roll, 6, 1);&lt;br /&gt;
			writeChar('\n');&lt;br /&gt;
			setCursorPosLCD(0, 0);&lt;br /&gt;
			writeStringLCD_P(&amp;quot;P&amp;quot;);&lt;br /&gt;
			writeDoubleLCD(pitch, 6, 1);&lt;br /&gt;
			writeStringLCD_P(&amp;quot; &amp;quot;);&lt;br /&gt;
			setCursorPosLCD(0, 8);&lt;br /&gt;
			writeStringLCD_P(&amp;quot;R&amp;quot;);&lt;br /&gt;
			writeDoubleLCD(roll, 6, 1);&lt;br /&gt;
			writeStringLCD_P(&amp;quot; &amp;quot;);&lt;br /&gt;
			setCursorPosLCD(1, 0);&lt;br /&gt;
			writeStringLCD_P(&amp;quot;X&amp;quot;);&lt;br /&gt;
			writeIntegerLCD(x_axisa, DEC);&lt;br /&gt;
			writeStringLCD_P(&amp;quot;   &amp;quot;);&lt;br /&gt;
			setCursorPosLCD(1, 5);&lt;br /&gt;
			writeStringLCD_P(&amp;quot;Y&amp;quot;);&lt;br /&gt;
			writeIntegerLCD(y_axisa, DEC);&lt;br /&gt;
			writeStringLCD_P(&amp;quot;   &amp;quot;);&lt;br /&gt;
			setCursorPosLCD(1, 10);&lt;br /&gt;
			writeStringLCD_P(&amp;quot;Z&amp;quot;);&lt;br /&gt;
			writeIntegerLCD(z_axisa, DEC);&lt;br /&gt;
			writeStringLCD_P(&amp;quot;    &amp;quot;);&lt;br /&gt;
			mSleep(2000);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Erklärung&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Erfahrungsberichte==&lt;br /&gt;
&lt;br /&gt;
...in Arbeit...(kann aber gerne ergänzt werden)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Siehe auch==&lt;br /&gt;
* [[RP6v2]]&lt;br /&gt;
* [[RP6]]&lt;br /&gt;
* [[RP6 - Programmierung]]&lt;br /&gt;
* [[RP6 Kamera - Mitmach-Projekt]]&lt;br /&gt;
* [[RP6v2 I2C-Portexpander]]&lt;br /&gt;
* [[RP6v2 USB-RS232-Adapter]]&lt;br /&gt;
* [[RP6v2 Orientierung]]&lt;br /&gt;
* [[RP6 Multi IO Projekt]]&lt;br /&gt;
* [[RP6 Multi IO Projekt - Software]]&lt;br /&gt;
* [[Induktive_Ladestation_f%C3%BCr_den_RP6|Induktive Ladestation für den RP6]]&lt;br /&gt;
* [[IR-bake_f%C3%BCr_den_RP6|IR-bake für den RP6]]&lt;br /&gt;
* [[CCRP5]]&lt;br /&gt;
* [[Yeti]]&lt;br /&gt;
* [[Asuro]]&lt;br /&gt;
* [[C't-Bot]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Weblinks==&lt;br /&gt;
'''Siehe auch die Weblinks im [http://www.rn-wissen.de/index.php/RP6v2#Weblinks RP6v2] und im [http://www.rn-wissen.de/index.php/RP6#Weblinks RP6] Artikel!'''&lt;br /&gt;
&lt;br /&gt;
* [http://www.conrad.de/ce/de/product/1082384/Arexx-RP6-Sensor-Board-RP6-JM03-61 RP6 Sensor Board bei CONRAD]&lt;br /&gt;
* JM3 Engeneering: [http://www.jm3-engineering.com/rp6.htm RP6 Roboter Erweiterung]&lt;br /&gt;
* Ankündigung einer Sensorerweiterungsplatine für die RP6v2 M256 WiFi im [http://www.roboternetz.de/community/threads/63595-Neue-Hardware-f%C3%BCr-RP6%28v2%29?p=590129&amp;amp;viewfull=1#post590129 Roboternetz RP6 Forum]&lt;br /&gt;
* Erfahrungsbericht zum Sensor Board im [http://www.arexx.com/forum/viewtopic.php?f=19&amp;amp;t=2498 AREXX Support Forum] und im [http://www.roboternetz.de/community/threads/64414-RP6-Sensor-Board-Erster-Eindruck Roboternetz RP6 Forum]&lt;br /&gt;
* Erfahrungsbericht zum I2C GPS Empfänger im [http://www.arexx.com/forum/viewtopic.php?f=19&amp;amp;t=2509 AREXX Support Forum]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Kategorie:Robotikeinstieg]]	 &lt;br /&gt;
[[Kategorie:Praxis]]&lt;br /&gt;
&lt;br /&gt;
==Autoren==&lt;br /&gt;
[[Benutzer:Dirk|Dirk]] 17:21, 8. Jul 2014 (CET)&lt;/div&gt;</summary>
		<author><name>Dirk NO2</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=RP6_Sensor_Board_und_Xtra_Module&amp;diff=24814</id>
		<title>RP6 Sensor Board und Xtra Module</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=RP6_Sensor_Board_und_Xtra_Module&amp;diff=24814"/>
				<updated>2014-07-08T15:16:47Z</updated>
		
		<summary type="html">&lt;p&gt;Dirk NO2: /* Autoren */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Bild:RP6_Sensor_Board.jpg|Das RP6 Sensor Board|right|500px]]&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_Xtra_module.JPG|RP6 Xtra module|right|500px]]&lt;br /&gt;
==Was bisher geschah==&lt;br /&gt;
'''Siehe auch &amp;quot;Was bisher geschah&amp;quot; im [http://www.rn-wissen.de/index.php/RP6v2#Was_bisher_geschah RP6v2] und im [http://www.rn-wissen.de/index.php/RP6#Was_bisher_geschah RP6] Artikel!'''&lt;br /&gt;
&lt;br /&gt;
Mit, 27. Nov 2013 - Ankündigung einer Sensorerweiterungsplatine, die an die RP6v2-M256-WIFI angeschlossen werden kann&amp;lt;br/&amp;gt;&lt;br /&gt;
Sam, 22. Feb 2014 - Auslieferungsbeginn des RP6 Sensor Boards, des I2C GPS Empfängers, des 3D Accelerometer Moduls und des Gyro Moduls&amp;lt;br/&amp;gt;&lt;br /&gt;
Mon, 17. Mär 2014 - Das RP6 Sensor Board ist &amp;quot;nicht lieferbar&amp;quot;, neuer Liefertermin angekündigt für den 12.06.2014 (!?)&amp;lt;br/&amp;gt;&lt;br /&gt;
Die, 25. Mär 2014 - Das RP6 Sensor Board ist wieder &amp;quot;sofort lieferbar&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Allgemein==&lt;br /&gt;
Dieser Artikel beschreibt die Grundlagen und Programmierung des RP6 Sensor Boards und der RP6 Xtra Module. Dieses Erweiterungs-Modul und die Xtra Module sind Teile des RP6-Systems, das in den RN-Wissen-Artikeln [[RP6]], [[RP6v2]] und [[RP6_-_Programmierung|RP6 - Programmierung]] ausführlich beschrieben wird. Ausgegliedert aus den &amp;quot;Haupt-Artikeln&amp;quot; habe ich diese Module, da sie m.E. zu einer neuen &amp;quot;Ära&amp;quot; des RP6-Systems gehören:&lt;br /&gt;
&lt;br /&gt;
Sie wurden nicht mehr von '''[[Benutzer:SlyD|SlyD]] (Dominik S. Herwald)''' in Zusammenarbeit mit '''[http://www.arexx.com/ AREXX]''' entwickelt, sondern nun von '''[http://jm3-engineering.com/ JM3 Engeneering] (Dipl.-Ing. Jürgen Maisel)'''. Ab Februar 2014 waren dann das '''RP6 Sensor Board RP6-JM03-61''' ([http://www.conrad.de/ce/de/product/1082384/Arexx-RP6-Sensor-Board-RP6-JM03-61 1082384]) und die drei RP6 Xtra Module '''I2C GPS Empfänger JM3-GPS''' ([http://www.conrad.de/ce/de/product/1082385/Arexx-IC-GPS-Empfaenger-JM3-GPS 1082385]), '''Gyro Modul JM3-GYRO''' ([http://www.conrad.de/ce/de/product/1082386/Arexx-Gyro-Modul-JM3-GYRO 1082386]) und '''3D Accelerometer Modul JM3-3DA''' ([http://www.conrad.de/ce/de/product/1082387/Arexx-3D-Accelerometer-Modul-JM3-3DA 1082387]) bei CONRAD lieferbar. Einen ersten Eindruck vom Sensor Board kann man im RoboterNetz und AREXX Support Forum bekommen,- siehe unter [[RP6_Sensor_Board_und_Xtra_Module#Weblinks|Weblinks]]!&lt;br /&gt;
&lt;br /&gt;
===RP6 Sensor Board===&lt;br /&gt;
Das [[RP6_Sensor_Board_und_Xtra_Module#RP6_Sensor_Board_2|RP6 Sensor Board]] gehört zu den &amp;quot;Erweiterungs-Modulen&amp;quot; des RP6-Systems. '''Andere &amp;quot;Erweiterungs-Module&amp;quot; werden im [[RP6v2#Erweiterungs-Module|RP6v2]] und im [[RP6#Erweiterungs-Module|RP6]] Artikel beschrieben!'''&lt;br /&gt;
&lt;br /&gt;
Das ''RP6 Sensor Board'' ist das erste &amp;quot;Erweiterungs-Modul&amp;quot;, das nicht über einen eigenen Microprozessor verfügt,- es ist also ein ''passives Modul'', das von einem Microprozessor-System (z.B. RP6v2, M32, M128, M256 Wifi) angesteuert werden muss. Es ist ebenfalls das erste Modul, das nicht mehr über die rautenförmige Einbuchtung an der Vorderkante verfügt, sondern komplett rechteckig ist. Damit passt es (montiert auf den Standard-Abstandbolzen) nur auf den vorderen Platinenstapel 1 des RP6.&lt;br /&gt;
&lt;br /&gt;
===RP6 Xtra Module===&lt;br /&gt;
Die [[RP6_Sensor_Board_und_Xtra_Module#RP6_Xtra_Module_2|RP6 Xtra Module]] gehören zu den &amp;quot;Zubehör- und Ersatzteilen&amp;quot; des RP6-Systems. '''Über die weiteren &amp;quot;Zubehör- und Ersatzteile&amp;quot; zum RP6 informiert der entsprechende Abschnitt im [[RP6v2#Zubeh.C3.B6r_und_Ersatzteile|RP6v2]] und im [[RP6#Zubehör und Ersatzteile|RP6]] Artikel!'''&lt;br /&gt;
&lt;br /&gt;
Die ''RP6 Xtra Module'' unterscheiden sich von den weiteren &amp;quot;Zubehör- und Ersatzteilen&amp;quot; dadurch, dass sie selbstständige Sensor-Platinen sind, die ideal zum RP6-System passen, aber auch mit anderen Microcontroller-Plattformen nutzbar sind.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==RP6 Sensor Board==&lt;br /&gt;
Das RP6 Sensor Board RP6-JM03-61 ([http://www.conrad.de/ce/de/product/1082384/Arexx-RP6-Sensor-Board-RP6-JM03-61 1082384]) wurde am 27.11.2013 von [[Benutzer:SlyD|SlyD]] angekündigt (siehe Weblink!).&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_Sensor_Board.jpg|Das RP6 Sensor Board]]&lt;br /&gt;
&lt;br /&gt;
===Beschreibung===&lt;br /&gt;
(Laut Online-Katalog der Firma CONRAD!)&lt;br /&gt;
&lt;br /&gt;
''&amp;quot;Das RP6 Sensor Board erweitert die Möglichkeiten aller RP6 Roboter um wesentliche Sensorsignale für Robotik-Anwendungen wie zum Beispiel Dreharten (Yaw-Gyro), Kipp- und Neigewinkel, Kompassrichtung oder aber auch Zeit und Datum.&lt;br /&gt;
Sie können einfach mit zusätzlichen Sharp Sensoren Abstände genau messen, z.B. für autonome Fahrrouten oder falls der Sensor nach unten gerichtet ist, kann er Treppenstufen oder ähnliches entdecken. Außerdem gibt es die Möglichkeit z.B. die Sharp Sensoren ein- bzw. auszuschalten um Strom zu sparen. Zusätzlich können bis zu 8 Servos angesteuert werden um z.B. einen Roboterarm zu bewegen, der auch mechanisch einfach zu montieren ist. Um die Möglichkeiten des RP6 Sensor Boards komplett ausnutzen zu können, wird ein RP6V2 und RP6Wifi Control Board empfohlen. Die ermöglicht den Roboter über Wifi fernzusteuern oder Sensordaten auf dem Kommandozentrum (PC) z.B Kompassdaten, Temperatur oder Kipp- und Neigewinkel anzeigen zu lassen.&amp;quot;''&lt;br /&gt;
&lt;br /&gt;
'''Ausstattung'''&lt;br /&gt;
* Magnetometer- und Accelerometer für Kompassfunktion&lt;br /&gt;
* Gyro Sensor (Yaw)&lt;br /&gt;
* Sharp-Sensor Schnittstelle&lt;br /&gt;
* LED Scheinwerfer&lt;br /&gt;
* LED Treiber mit Smart Funktionen&lt;br /&gt;
* I²C Bus mit max. 400 kHz Übertragungsrate; Hot Swap I²C-Bus Buffer&lt;br /&gt;
* Taster mit LED&lt;br /&gt;
* Echtzeit-Uhr RTC&lt;br /&gt;
* Backupbatterie (Aufladung während des Betriebs)&lt;br /&gt;
* Expansion Port z.B. für GPS-I²C Bus Modul&lt;br /&gt;
* 8 Servo-Ausgänge mit eigenem Schaltregler&lt;br /&gt;
* 8 PWM Ausgänge&lt;br /&gt;
* 5 LED Ausgänge und 2 Digital-I/O Ausgänge.&lt;br /&gt;
&lt;br /&gt;
'''Lieferumfang'''&lt;br /&gt;
* RP6 Sensor Board&lt;br /&gt;
* Montage-Kit&lt;br /&gt;
* Kabel&lt;br /&gt;
* Anleitung und CD mit Dokumentation.&lt;br /&gt;
&lt;br /&gt;
====Blockschaltbild====&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_Sensor_Board_BSP.png|RP6 Sensor Board Blockschaltbild]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Technische Daten===&lt;br /&gt;
{|  {{Blauetabelle}} &lt;br /&gt;
|'''Mikrocontroller:'''&lt;br /&gt;
|kein&lt;br /&gt;
|-&lt;br /&gt;
|'''Speicher:'''&lt;br /&gt;
|kein&amp;lt;br/&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|'''Programmierung:'''&lt;br /&gt;
|C++ (GCC, u.a.) über externes µC-System&lt;br /&gt;
|-&lt;br /&gt;
|'''Vorhandene Sensoren:'''&lt;br /&gt;
|Temperatur, 3D Magnetfeld (Kompass), 3D Beschleunigung, Yaw-Gyro&amp;lt;br/&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|'''Vorhandene Aktoren:'''&lt;br /&gt;
|LED Controller (2 LEDs on board, 5 freie LED Ports), Status LED,&amp;lt;br/&amp;gt;Button, Servo (PWM) Controller für 8 Servos und 8 PWM-Kanäle,&amp;lt;br/&amp;gt;Real Time Clock (RTC), 2 freie I/O Ports&lt;br /&gt;
|-&lt;br /&gt;
|'''Abmessungen:'''&lt;br /&gt;
|(L &amp;amp;times; B &amp;amp;times; H) 112 &amp;amp;times; 90 &amp;amp;times; 19 mm&amp;lt;br/&amp;gt;(B + 5 mm durch Scheinwerfer vorn)&lt;br /&gt;
|-&lt;br /&gt;
|'''Ausführung:'''&lt;br /&gt;
|Fertig aufgebautes Erweiterungsmodul&lt;br /&gt;
|-&lt;br /&gt;
|'''Stromversorgung:'''&lt;br /&gt;
|6 AA NiMH Akkus (über die RP6v2 Base)&amp;lt;br/&amp;gt;und optionaler Zusatzakku 7,2..10 V für Servo Power&lt;br /&gt;
|-&lt;br /&gt;
|'''Hersteller:'''&lt;br /&gt;
|Arexx Niederlande&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Umbau-Optionen===&lt;br /&gt;
Hier soll beschrieben werden, welche Umbau-Optionen es für das RP6 Sensor Board gibt. Im Text gibt es Verweise auf den Schaltplan des RP6 Sensor Boards (RP6_Sensor_Board_Rev2_Schema.pdf) in der Form: (SP2: Bauteil). Dies bedeutet, dass man das Bauteil auf Blatt 2 des Schaltplans finden kann. Beispielhaft sind im folgenden Text Bestell-Nummern der Firma [http://www.conrad.de/ce/ CONRAD] genannt. Natürlich kann man die Teile auch bei anderen Versendern beziehen.&lt;br /&gt;
&lt;br /&gt;
====USRBUS- und XBUS-Wannenstecker====&lt;br /&gt;
Der zweite Wannenstecker für den XBUS (SP3: K14) und USRBUS (SP3: K16) kann nachbestückt werden.&lt;br /&gt;
Man braucht dazu: &lt;br /&gt;
* 2 Wannenstecker 2x5-polig gerade RM 2,54mm (CONRAD [http://www.conrad.de/ce/de/product/741648/Stiftleiste-Print-Montage-gerade-Rastermass-254-mm-Pole-2-x-5-10120554-BKL-Electronic-Inhalt-1-St/ 741648])&lt;br /&gt;
Die Wannenstecker lötet man auf die eingezeichneten Positionen.&lt;br /&gt;
&lt;br /&gt;
'''USRBUS-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''USRBUS''' || '''Sensor Board-Funktion''' || '''Verwendung''' || '''I/O'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Y1 || &amp;quot;ADC0&amp;quot; || SHARP vorn || I&lt;br /&gt;
|-&lt;br /&gt;
| 2 || Y2 || &amp;quot;ADC1&amp;quot; || Yaw-Gyro || I&lt;br /&gt;
|-&lt;br /&gt;
| 3 || Y3 || PWR || Power für&amp;lt;br/&amp;gt;SHARPs, CAM_IF,&amp;lt;br/&amp;gt;I2C-MODULE || O&lt;br /&gt;
|-&lt;br /&gt;
| 4 || Y4 || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 5 || Y5 || &amp;quot;ADC4&amp;quot; || SHARP hinten ||I&lt;br /&gt;
|-&lt;br /&gt;
| 6..14 || Y6..Y14 || || keine ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
'''XBUS-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''XBUS''' || '''M256-Port''' ||'''M256-Funktion''' || '''Sensor Board-Funktion''' || '''Jumper''' || '''Verwendung''' || '''I/O'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || GND || || GND || GND || || ||&lt;br /&gt;
|-&lt;br /&gt;
| 2 || GND || || GND || GND || || ||&lt;br /&gt;
|-&lt;br /&gt;
| 3 || VDD || || VDD|| VDD_1 || || VDD +5V ||&lt;br /&gt;
|-&lt;br /&gt;
| 4 || +UB || || +UB || VSS_1 || || CAM_IF Power ||&lt;br /&gt;
|-&lt;br /&gt;
| 5 || VDD || || VDD || VDD_1 || || VDD +5V ||&lt;br /&gt;
|-&lt;br /&gt;
| 6 || +UB || || +UB || VSS_1 || || CAM_IF Power ||&lt;br /&gt;
|-&lt;br /&gt;
| 7 || INTU || PJ4 || PCINT13 || INTU || || keine || I&lt;br /&gt;
|-&lt;br /&gt;
| 8 || INT1 || PJ3 || PCINT12 || INT1 || 3 || LSM303DLHC: INT1 || I&lt;br /&gt;
|-&lt;br /&gt;
| 9 || INT3 || PJ5 || PCINT14 || INT3 || 2&amp;lt;br/&amp;gt;5 || DS1339: SQW/INT_N&amp;lt;br/&amp;gt;LSM303DLHC: INT2 || I&amp;lt;br/&amp;gt;I&lt;br /&gt;
|-&lt;br /&gt;
| 10 || SCL || PD0 || SCL || SCL_M || || I2C-Bus || O&lt;br /&gt;
|-&lt;br /&gt;
| 11 || INT2 || PJ6 || PCINT15 || INT2 || 4 || MAX7311: INT_N || I&lt;br /&gt;
|-&lt;br /&gt;
| 12 || SDA || PD1 || SDA || SDA_M || || I2C-Bus || I/O&lt;br /&gt;
|-&lt;br /&gt;
| 13 || MRESET || || MRESET || MRESET || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 14 || GND || || GND || GND || || ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====I/O-Patchfield_1====&lt;br /&gt;
Dieses 2x 5-polige &amp;quot;Patchfield_1&amp;quot; (SP3: K8), beschriftet mit &amp;quot;I/O&amp;quot; liegt neben dem Wannenstecker I/O und weist dieselbe Belegung auf. Möchte man auf dem Sensor Board Verbindungen über den Wannenstecker I/O zu einer angeschlossenen Microprozessor-Platine herstellen, dann kann man auf das &amp;quot;Patchfield_1&amp;quot; eine Stiftleiste löten.&lt;br /&gt;
Man braucht dazu: &lt;br /&gt;
* 2-reihige Stiftleiste RM 2,54mm (z.B. 2x40-polig [http://www.conrad.de/ce/de/product/741306/Doppelreihige-Stiftleiste-RM-254-gerade-Pole-2-x-40-10120173-BKL-Electronic-Inhalt-1-St 741306]) &lt;br /&gt;
Man trennt von der 2-reihigen Stiftleiste 2x5 Kontakte ab und lötet sie auf die Lötpunkte &amp;quot;I/O&amp;quot;. Zuvor muss man u.U. Lötzinnreste aus den Lötpunkten mit Entlötlitze bzw. Entlötsaugpumpe entfernen.&lt;br /&gt;
&lt;br /&gt;
'''Stecker I/O an M256 IO_PWM/T0/T1:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''M256-Port''' ||'''M256-Funktion''' || '''Sensor Board-Funktion''' || '''Verwendung''' || '''I/O'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || PD4 || ICP1 || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 2 || || GND || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 3 || PD6 || T1 || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 4 || PB7 || OC0A || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 5 || PG5 || OC0B || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 6 || PD7 || T0 || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 7 || PB5 || OC1A || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 8 || PK5 || ADC13 || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 9 || PB6 || OC1B || &amp;quot;PD5&amp;quot; || I2C Bus Buffer Enable || O&lt;br /&gt;
|-&lt;br /&gt;
| 10 || || VDD || || keine ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====ADC-Patchfield_2====&lt;br /&gt;
Dieses 2x 5-polige &amp;quot;Patchfield_2&amp;quot; (SP3: K9), beschriftet mit &amp;quot;ADC&amp;quot; liegt neben dem Wannenstecker ADC und weist dieselbe Belegung auf. Möchte man auf dem Sensor Board Verbindungen über den Wannenstecker ADC zu einer angeschlossenen Microprozessor-Platine herstellen, dann kann man auf das &amp;quot;Patchfield_2&amp;quot; eine Stiftleiste löten.&lt;br /&gt;
Man braucht dazu: &lt;br /&gt;
* 2-reihige Stiftleiste RM 2,54mm (z.B. 2x40-polig [http://www.conrad.de/ce/de/product/741306/Doppelreihige-Stiftleiste-RM-254-gerade-Pole-2-x-40-10120173-BKL-Electronic-Inhalt-1-St 741306]) &lt;br /&gt;
Man trennt von der 2-reihigen Stiftleiste 2x5 Kontakte ab und lötet sie auf die Lötpunkte &amp;quot;ADC&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
'''Stecker ADC an M256 ADC_IO2/CMP:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''M256-Port''' ||'''M256-Funktion''' || '''Sensor Board-Funktion''' || '''Jumper''' || '''Verwendung''' || '''I/O'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || PK0 || ADC8 || || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 2 || || GND || || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 3 || PK1 || ADC9 || &amp;quot;ADC4&amp;quot; || 6 || SHARP hinten || I&lt;br /&gt;
|-&lt;br /&gt;
| 4 || PE3 || OC3A/AIN1 || || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 5 || PK2 || ADC10 || || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 6 || || GND || || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 7 || PK3 || ADC11 || || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 8 || PE2 || XCK0/AIN0 || || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 9 || PK4 || ADC12 || || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 10 || || VDD || || || keine ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Anschluss-Optionen===&lt;br /&gt;
Hier soll beschrieben werden, welche Anschluss-Optionen es für das RP6 Sensor Board gibt. In erster Linie geht es dabei um die Belegung der vorhandenen Stecker bzw. Stiftleisten.&lt;br /&gt;
&lt;br /&gt;
Allgemein kann man Anschlüsse an Stiftleisten mit entsprechenden Steckbuchsen erreichen. Solche Steckbuchsen sind z.B. bei ELV erhältlich:&lt;br /&gt;
* Steckbuchse, 2-polig, RM 2,54mm ([http://www.elv.de/steckbuchse-2-polig.html ELV 68-016635])&lt;br /&gt;
* Steckbuchse, 3-polig, RM 2,54mm ([http://www.elv.de/steckbuchse-3-polig.html ELV 68-022503])&lt;br /&gt;
* Steckbuchse, 5-polig, RM 2,54mm ([http://www.elv.de/steckbuchse-5-polig.html ELV 68-023073])&lt;br /&gt;
Die Crimpkontakte dieser Steckbuchse werden an Litzen angequetscht (oder angelötet) und zum entsprechenden Sensor bzw. Aktor geführt. &lt;br /&gt;
&lt;br /&gt;
====I2C-MODULE====&lt;br /&gt;
Der I2C-MODULE Anschluss (SP1: M1) auf dem Sensor Board besteht aus einer 9-poligen Präzisions-Buchsenleiste RM 2,54mm (z.B. [http://www.conrad.de/ce/de/product/741360/Praezisions-Buchsenleiste-RM-254-gerade-Pole-1-x-20-10120832-BKL-Electronic-Inhalt-1-St 741360]). Wenn man eigene I2C-Module hier anschliessen will, braucht man zur Kontaktierung:&lt;br /&gt;
* Präzisions-Stiftleiste, 9-polig, RM 2,54mm (z.B. [http://www.conrad.de/ce/de/product/741307/Praezisions-Stiftleiste-RM-254-gerade-Pole-1-x-20-10120536-BKL-Electronic-Inhalt-1-St 741307])&lt;br /&gt;
&lt;br /&gt;
'''I2C-MODULE-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''Sensor Board&amp;lt;br/&amp;gt;-Funktion (M1)''' || '''Verwendung''' || '''I/O''' |||| [[RP6_Sensor_Board_und_Xtra_Module#I2C_GPS_Empf.C3.A4nger_JM3-GPS|'''I2C GPS Empfänger]]&amp;lt;br/&amp;gt;-Funktion (K1)'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || VCC || +5V || |||| VCC_1&lt;br /&gt;
|-&lt;br /&gt;
| 2 || SCLOUT || Buffered I2C-Bus || O |||| SCL/SCK&lt;br /&gt;
|-&lt;br /&gt;
| 3 || SDAOUT || Buffered I2C-Bus || I/O |||| SDA/MOSI&lt;br /&gt;
|-&lt;br /&gt;
| 4 || NC || keine || ||||&lt;br /&gt;
|-&lt;br /&gt;
| 5 || I/O1 || Status LED || O ||||&lt;br /&gt;
|-&lt;br /&gt;
| 6 || I/O2 || Taster || I ||||&lt;br /&gt;
|-&lt;br /&gt;
| 7 || NC || keine || ||||&lt;br /&gt;
|-&lt;br /&gt;
| 8 || GND || GND (geschaltet!) || |||| GND&lt;br /&gt;
|-&lt;br /&gt;
| 9 || GND || GND (geschaltet!) || |||| GND&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====CAM_IF====&lt;br /&gt;
Der CAM_IF Anschluss (SP1: K28) ist eine 2x 3-polige Stiftleiste mit der folgenden Belegung:&lt;br /&gt;
&lt;br /&gt;
'''CAM_IF-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''Sensor Board&amp;lt;br/&amp;gt;-Funktion (K28)''' || '''Verwendung''' || '''I/O'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || GND || GND (geschaltet!) ||&lt;br /&gt;
|-&lt;br /&gt;
| 2 || VSS_1 || +7,2..10V (RP6: +UB) ||&lt;br /&gt;
|-&lt;br /&gt;
| 3 || SCLOUT || Buffered I2C-Bus || O&lt;br /&gt;
|-&lt;br /&gt;
| 4 || SDAOUT || Buffered I2C-Bus || I/O&lt;br /&gt;
|-&lt;br /&gt;
| 5 || SCL_M || I2C-Bus || O&lt;br /&gt;
|-&lt;br /&gt;
| 6 || SDA_M || I2C-Bus || I/O&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====IO_EXT====&lt;br /&gt;
Der IO_EXT Anschluss (SP1: K19) ist eine 2x 2-polige Stiftleiste mit der folgenden Belegung:&lt;br /&gt;
&lt;br /&gt;
'''IO_EXT-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''Sensor Board&amp;lt;br/&amp;gt;-Funktion (K19)''' || '''Verwendung''' || '''I/O'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || MAX7311: I/O1.2 || freier I/O Port || I/O&lt;br /&gt;
|-&lt;br /&gt;
| 2 || GND || ||&lt;br /&gt;
|-&lt;br /&gt;
| 3 || MAX7311: I/O1.1 || freier I/O Port || I/O&lt;br /&gt;
|-&lt;br /&gt;
| 4 || GND || ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====PWM_OUT====&lt;br /&gt;
Der PWM_OUT Anschluss (SP5: K12) ist eine 2x 4-polige Stiftleiste mit der folgenden Belegung:&lt;br /&gt;
&lt;br /&gt;
'''PWM_OUT-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''Sensor Board&amp;lt;br/&amp;gt;-Funktion (K12)''' || '''Verwendung''' || '''I/O'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || PCA9685: PWM0 || freier PWM Port || O&lt;br /&gt;
|-&lt;br /&gt;
| 2 || PCA9685: PWM1 || freier PWM Port || O&lt;br /&gt;
|-&lt;br /&gt;
| 3 || PCA9685: PWM2 || freier PWM Port || O&lt;br /&gt;
|-&lt;br /&gt;
| 4 || PCA9685: PWM3 || freier PWM Port || O&lt;br /&gt;
|-&lt;br /&gt;
| 5 || PCA9685: PWM4 || freier PWM Port || O&lt;br /&gt;
|-&lt;br /&gt;
| 6 || PCA9685: PWM5 || freier PWM Port || O&lt;br /&gt;
|-&lt;br /&gt;
| 7 || PCA9685: PWM6 || freier PWM Port || O&lt;br /&gt;
|-&lt;br /&gt;
| 8 || PCA9685: PWM7 || freier PWM Port || O&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====TP1====&lt;br /&gt;
Am Testpunkt TP1 (SP4: TP1) kann man das Signal SQW/INT_N der RTC (DS1339) prüfen/messen.&lt;br /&gt;
&lt;br /&gt;
====LEDs====&lt;br /&gt;
=====Rücklichter=====&lt;br /&gt;
Der Rücklichter Anschluss (SP1: K10) ist eine 2-polige Stiftleiste mit der folgenden Belegung:&lt;br /&gt;
&lt;br /&gt;
'''Rücklichter-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''Sensor Board&amp;lt;br/&amp;gt;-Funktion (K10)''' || '''Verwendung''' || '''I/O'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || TCA6507: P3 || Rücklicht rechts || O&lt;br /&gt;
|-&lt;br /&gt;
| 2 || TCA6507: P4 || Rücklicht links || O&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=====Display-Hintergrundbeleuchtung=====&lt;br /&gt;
Der Display-Hintergrundbeleuchtung Anschluss (SP1: K7) ist eine 2-polige Stiftleiste mit der folgenden Belegung:&lt;br /&gt;
&lt;br /&gt;
'''Display-Hintergrundbeleuchtung-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''Sensor Board&amp;lt;br/&amp;gt;-Funktion (K7)''' || '''Verwendung''' || '''I/O'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || TCA6507: P0 || Display-Hintergrundbeleuchtung || O&lt;br /&gt;
|-&lt;br /&gt;
| 2 || VDD_1 || +5V ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=====Freie Ausgänge=====&lt;br /&gt;
Der freie Ausgang 1 Anschluss (SP1: K4) ist eine 2-polige Stiftleiste mit der folgenden Belegung:&lt;br /&gt;
&lt;br /&gt;
'''Freier Ausgang 1-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''Sensor Board&amp;lt;br/&amp;gt;-Funktion (K4)''' || '''Verwendung''' || '''I/O'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || TCA6507: P1 || freier LED Port || O&lt;br /&gt;
|-&lt;br /&gt;
| 2 || VDD_1 || +5V ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Der freie Ausgang 2 Anschluss (SP1: K2) ist eine 2-polige Stiftleiste mit der folgenden Belegung:&lt;br /&gt;
&lt;br /&gt;
'''Freier Ausgang 2-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''Sensor Board&amp;lt;br/&amp;gt;-Funktion (K2)''' || '''Verwendung''' || '''I/O'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || TCA6507: P2 || freier LED Port || O&lt;br /&gt;
|-&lt;br /&gt;
| 2 || VDD_1 || +5V ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====SHARP Sensoren====&lt;br /&gt;
Das RP6 Sensor Board verfügt über zwei Stecker SHARP_F (SP1: K5) und SHARP_R (SP1: K3) zum Anschluß von analogen SHARP Infrarot-Distanz-Sensoren. Folgende SHARP Sensoren sind anschließbar:&lt;br /&gt;
* 1. SHARP Distanz-Sensor GP2Y0A41SK0F ([http://www.conrad.de/ce/de/product/504596/Distanz-Sensor-GP2Y0A41SK0F-Sharp-GP2Y0A41SK0F-Messbereiche-Erfassungsbereich-4-30-cm-5-VDC 504596]), Messbereich 4..30cm&lt;br /&gt;
* 2. SHARP Distanz-Sensor GP2Y0A21YK0F ([http://www.conrad.de/ce/de/product/504591/Distanz-Sensor-GP2Y0A21YK0F-Sharp-GP2Y0A21YK0F-Messbereiche-Erfassungsbereich-10-80-cm-5-VDC 504591]), Messbereich 10..80cm&lt;br /&gt;
* 3. SHARP Distanz-Sensor GP2Y0A02YK ([http://www.conrad.de/ce/de/product/185364/Distanz-Sensor-GP-2-Y0A-02-YK-Sharp-GP-2-Y0A-02-YK-Messbereiche-Erfassungsbereich-20-150-cm-5-VDC 185364]), Messbereich 20..150cm&lt;br /&gt;
* 4. SHARP Distanz-Sensor GP2Y0A710K0F ([http://www.conrad.de/ce/de/product/504597/Distanz-Sensor-GP2Y0A710K0F-Sharp-GP2Y0A710K0F-Messbereiche-Erfassungsbereich-100-550-cm-5-VDC 504597]), Messbereich 100..550cm&lt;br /&gt;
''Die Auswahl der geeigneten SHARP Sensoren hängt von der gewünschten Funktion ab: Zur Erkundung großer Räume eignet sich insbesondere der Typ 4 mit einer hohen Reichweite von 5,5m. Er ist aber ungeeignet, die Distanz von Objekten zu erkennen, die sich näher als 1m vor dem Sensor befinden. Ein guter Kompromiss zwischen Nahbereichsmessung und &amp;quot;Fernsicht&amp;quot; sind die Typen 2 (10..80cm) und 3 (20..150cm). Will man den Distanz-Sensor vor allem zur Vermeidung eins Sturzes von einer Treppe (Tiefenerkennung) oder nur zur Erkennung von Hindernissen direkt vor dem Roboter (Kollisionserkennung) benutzen, dann eignet sich insbesondere für den vorderen Sensor (SHARP_F) der Typ 1, da er im Nahbereich von 4 bis 30cm messen kann.''&lt;br /&gt;
&lt;br /&gt;
Für die Verbindung zwischen den beiden 3-poligen JST XH Steckern (K3, 5) auf dem Sensor Board und den SHARP-Sensoren braucht man auf der Sensor Board Seite folgende Stecker-/buchsenteile:&lt;br /&gt;
* 2x JST XH Gehäuse, 3-polig, RM 2,5mm ([http://www.conrad.de/ce/de/product/740583/Gehaeuse-RM-25-mm-Serie-XH-Rastermass-25-mm-Pole-3-Nennstrom-3-A-XHP-3-JST-Inhalt-1-St 740583])&lt;br /&gt;
* 6x JST XH Crimpkontakt f. RM 2,5mm ([http://www.conrad.de/ce/de/product/741112/Crimpkontakt-fuer-RM-25-mm-Serie-XH-Rastermass-25-mm-BXH-001T-P06-JST-Inhalt-1-St 741112])&lt;br /&gt;
Die Crimpkontakte dieser Steckbuchse werden an die meist 3-adrige Litze des Sensors angequetscht (oder angelötet). Zur Belegung des Sensor Anschlusses siehe das jeweilige Datenblatt!&lt;br /&gt;
&lt;br /&gt;
=====Vorn=====&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_Sensor_Board_SHARP_F.JPG|RP6 Sensor Board SHARP Sensor vorn|thumb]]&lt;br /&gt;
&lt;br /&gt;
Der vordere SHARP Sensor kann auch mechanisch am Sensor Board befestigt werden. Dazu gibt es an der Vorderkante der Platine zwei Befestigungslöcher.&lt;br /&gt;
&lt;br /&gt;
Das Bild rechts zeigt den SHARP Distanzsensor GP2Y0A02YK montiert vorn auf dem Sensor Board mit zwei M3 Gelenkbolzen ([http://www.conrad.de/ce/de/product/521043/Gelenkbolzen-1-x-Aussengewinde1-x-Innengewinde-Messing-vernickelt-Schluesselweite-55-mm/ 521043]) und passenden Schrauben/Muttern.&lt;br /&gt;
&lt;br /&gt;
'''Vorn-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''RP6v2-Port''' ||'''RP6v2-Funktion''' || '''Sensor Board&amp;lt;br/&amp;gt;-Funktion (K5)''' || '''Verwendung''' || '''I/O''' |||| '''SHARP Sensor&amp;lt;br/&amp;gt;-Funktion''' &lt;br /&gt;
|-&lt;br /&gt;
| 1 || PA0 || ADC0 || &amp;quot;ADC0&amp;quot; || SHARP vorn || I |||| Vo&lt;br /&gt;
|-&lt;br /&gt;
| 2 || || || VDD_1 || +5V || |||| Vcc&lt;br /&gt;
|-&lt;br /&gt;
| 3 || || || GND || GND (geschaltet!) || |||| GND&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=====Hinten=====&lt;br /&gt;
Der hintere SHARP Sensor kann z.B. an der Rückseite des RP6v2 Fahrgestells befestigt werden.&lt;br /&gt;
&lt;br /&gt;
'''Hinten-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''M256-Port''' ||'''M256-Funktion''' || '''Sensor Board&amp;lt;br/&amp;gt;-Funktion (K3)''' || '''Verwendung''' || '''I/O''' |||| '''SHARP Sensor&amp;lt;br/&amp;gt;-Funktion''' &lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| 1 || PK1 || ADC9 || &amp;quot;ADC4&amp;quot; || SHARP hinten || I |||| Vo&lt;br /&gt;
|-&lt;br /&gt;
| 2 || || || VDD_1 || +5V || |||| Vcc&lt;br /&gt;
|-&lt;br /&gt;
| 3 || || || GND || GND (geschaltet!) || |||| GND&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Servos====&lt;br /&gt;
=====Power=====&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_Sensor_Board_Servo-PWR.jpg|RP6 Sensor Board Servo-PWR Stecker|thumb]]&lt;br /&gt;
&lt;br /&gt;
An den SERVO_PWR Stecker (SP5: K1) muss ein Akku zur Stromversorgung der mit dem Sensor Board verbundenen Servos angeschlossen werden. Der Stecker hat folgende Belegung:&lt;br /&gt;
 &lt;br /&gt;
'''SERVO_PWR-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''Sensor Board&amp;lt;br/&amp;gt;-Funktion (K1)''' || '''Verwendung'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || GND_POWER || Servo Power GND&lt;br /&gt;
|-&lt;br /&gt;
| 2 || VSS_POWER || Servo Power Eingang +7,2..10V&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Der Akku zur Versorgung der Servos muss eine Nennspannung von 7,2..10V aufweisen. Der Schaltregler auf dem Sensor Board kann bei einer 5,0V Servo-Spannung Ströme bis 3,0A (Spitzen bis 5,0A) liefern. '''Die Polung des Akkus darf am Stecker SERVO_PWR nicht vertauscht werden.''' Siehe den oberen Teil der nebenstehende Abbildung! Ratsam ist es, eine Sicherung 3,15A in die Plusleitung zwischen Akku und SERVO_PWR Stecker zu legen.&lt;br /&gt;
&lt;br /&gt;
Für die Verbindung zwischen dem 2-poligen JST XH Stecker (SERVO_PWR, K1) auf dem Sensor Board und dem Akku braucht man auf der Sensor Board Seite folgende Stecker-/buchsenteile:&lt;br /&gt;
* JST XH Gehäuse, 2-polig, RM 2,5mm ([http://www.conrad.de/ce/de/product/740549/Gehaeuse-RM-25-mm-Serie-XH-Rastermass-25-mm-Pole-2-Nennstrom-3-A-XHP-2-JST-Inhalt-1-St 740549])&lt;br /&gt;
* 2x JST XH Crimpkontakt f. RM 2,5mm ([http://www.conrad.de/ce/de/product/741112/Crimpkontakt-fuer-RM-25-mm-Serie-XH-Rastermass-25-mm-BXH-001T-P06-JST-Inhalt-1-St 741112])&lt;br /&gt;
Die Crimpkontakte dieser Steckbuchse werden an die 2-adrige Litze zum Akku angequetscht (oder angelötet).&lt;br /&gt;
&lt;br /&gt;
Wenn man keinen separaten Akku zur Versorgung der Servos nehmen will, kann man auch +UB der RP6v2 Base dafür nutzen. An +UB liegt die Akkuspannung der Base (Nennspannung 7,2V) über eine Sicherung F1 3,15A (RP6v2) bzw. 2,5A (RP6) auf dem Mainboard an. +UB kann man z.B. am [[RP6#EXT_Anschlu.C3.9F|EXT Anschluß der Base]] entnehmen. Die nebenstehende Abbildung zeigt im unteren Teil, an welchen Pins man dort +UB kontaktieren kann!&lt;br /&gt;
&lt;br /&gt;
Dabei ist zu beachten, dass die Sicherung F1 auf dem RP6(v2) Mainboard den nutzbaren Strom für die Servos deutlich begrenzt: Durch diese Sicherung fließt ja nicht nur der Servo-Strom, sondern auch der Strom für den RP6 und alle darauf montierten Zusatzplatinen. Wenn der RP6 also herumfährt und z.B. noch die IRCOMM-Sendedioden nutzt, bleibt kaum noch Stromreserve für die Servos auf dem Sensor Board übrig.&lt;br /&gt;
'''Das bedeutet: Man sollte unbedingt einen separaten Akku für die Servos auf dem Sensor Board benutzen!'''&lt;br /&gt;
&lt;br /&gt;
======SERVO_PWR-EXT Verbindung======&lt;br /&gt;
Für die Verbindung zwischen dem 2-poligen JST XH Stecker (SERVO_PWR, K1) auf dem Sensor Board und dem 8-poligen JST XH Stecker (EXT) auf dem RP6v2 Mainboard braucht man folgende Stecker-/buchsenteile:&lt;br /&gt;
* JST XH Gehäuse, 2-polig, RM 2,5mm ([http://www.conrad.de/ce/de/product/740549/Gehaeuse-RM-25-mm-Serie-XH-Rastermass-25-mm-Pole-2-Nennstrom-3-A-XHP-2-JST-Inhalt-1-St 740549])&lt;br /&gt;
* JST XH Gehäuse, 8-polig, RM 2,5mm ([http://www.conrad.de/ce/de/product/740928/Gehaeuse-RM-25-mm-Serie-XH-Rastermass-25-mm-Pole-8-Nennstrom-3-A-XHP-8-JST-Inhalt-1-St 740928])&lt;br /&gt;
* 10x JST XH Crimpkontakt f. RM 2,5mm ([http://www.conrad.de/ce/de/product/741112/Crimpkontakt-fuer-RM-25-mm-Serie-XH-Rastermass-25-mm-BXH-001T-P06-JST-Inhalt-1-St 741112])&lt;br /&gt;
Mit einer 2-adrigen Litze, die beidseits mit den Crimpkontakten verquetscht (oder verlötet) wird, verbindet man dann den SERVO_PWR Stecker mit dem EXT Stecker, wie in der Abbildung oben gezeigt. ''Achtung: Plus (+) und Minus (-) nicht vertauschen!''&lt;br /&gt;
 Ein passendes Kabel soll zukünftig (*) mitgeliefert werden.&lt;br /&gt;
&lt;br /&gt;
Auf dem RP6 Mainboard ist der 8-polige EXT Stecker noch nicht bestückt. Wenn man ihn nachrüsten will, muss man noch bestellen:&lt;br /&gt;
* JST XH Stiftleiste gerade, 8-polig, RM 2,5mm ([http://www.conrad.de/ce/de/product/740105/Stiftleiste-gerade-RM-25-mm-Serie-XH-Rastermass-25-mm-Pole-8-Nennstrom-3-A-B8B-XH-A-LFSN-JST-Inhalt-1-St 740105])&lt;br /&gt;
Die Stiftleiste wird auf das RP6 Mainboard gelötet, dabei weisen die beiden Einkerbungen an einer Längsseite der Stiftleiste nach hinten zum Rand des Mainboards.&lt;br /&gt;
 Auch diese Stiftleiste soll zukünftig (*) zum Lieferumfang gehören.&lt;br /&gt;
'''Zu *)''' Meinem RP6 Sensor Board (bestellt am 1.3.2014) lag das konfektionierte Kabel und die Stiftleiste noch nicht bei!&lt;br /&gt;
&lt;br /&gt;
=====Stecker=====&lt;br /&gt;
An die acht 3-poligen Stiftleisten SERVO_1 bis SERVO_8 (SP5: K6, 11, 29..34) können Servos angeschlossen werden. Direkt aufstecken kann man Servo-Steckbuchsen mit der Belegung von CONRAD, Graupner/JR und Robbe/Futaba (Versorgungsspannung Plus am mittleren Pin). Auf der Sensor Board Platine kann man den Pin 3 (Servo Power GND) der 3-poligen Stiftleisten daran erkennen, dass er näher zum rechten Platinenrand (Seite mit dem XBUS Stecker) angeordnet ist als der zugehörige Pin 1 (Servo Signal).&lt;br /&gt;
&lt;br /&gt;
Wenn Servos mit nicht passender Steckbuchse angeschlossen werden sollen, dann braucht man auf der Sensor Board Seite folgende Stecker-/buchsenteile für jedes Servo:&lt;br /&gt;
* Steckbuchse, 3-polig, RM 2,54mm ([http://www.elv.de/steckbuchse-3-polig.html ELV 68-022503])&lt;br /&gt;
Die Crimpkontakte dieser Steckbuchse werden an die 3-adrige Litze des Servos angequetscht (oder angelötet). &lt;br /&gt;
&lt;br /&gt;
'''SERVO_1..8-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''Sensor Board&amp;lt;br/&amp;gt;-Funktion (K6,11,29..34)''' || '''Verwendung''' || '''I/O''' |||| '''Servo-&amp;lt;br/&amp;gt;Kabelfarben'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || PCA9685: PWM15..8 || Servo Signal || O |||| Weiß, Orange&lt;br /&gt;
|-&lt;br /&gt;
| 2 || Servo_PWR || Servo Power +5V (geschaltet!) || |||| Rot&lt;br /&gt;
|-&lt;br /&gt;
| 3 || GND_POWER || Servo Power GND || |||| Schwarz, Braun&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Roboterarm RA2-HOBBY====&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_Sensor_Board_RA2-MINI.JPG|RP6 Sensor Board mit Roboterarm RA2-MINI|thumb]]&lt;br /&gt;
&lt;br /&gt;
In der Anleitung zum RP6 Sensor Board ist der Arexx Roboterarm RA2-HOBBY bzw. RA2-MINI [http://www.conrad.de/ce/de/product/191534/Arexx-Mini-Roboterarm-RA2-MINI (191534)] abgebildet. Er ist dort ohne Grundgestell und Controller-Platine auf dem Sensor Board befestigt.&lt;br /&gt;
Das Sensor Board eignet sich sehr gut zur Ansteuerung der 6 Servos des Roboterarms.&lt;br /&gt;
&lt;br /&gt;
Zur Montage des RA2-MINI auf dem Sensor Board geht man so vor:&lt;br /&gt;
* Lösen der 4 Rundkopfschrauben M3x6, die die Servobodenplatte mit den Abstandbolzen M3x30 auf der Controller-Platine verbinden (siehe Anleitung zum RA2-MINI, Seite 19!)&lt;br /&gt;
* Lösen der Servobodenplatte vom Bodenservo (siehe Anleitung zum RA2-MINI, Seite 8!)&lt;br /&gt;
* Bohren der Befestigungslöcher in die Servobodenplatte:&lt;br /&gt;
** Rechts-Links Lochabstand 4,75cm, Vorn-Hinten Lochabstand 4,1cm&lt;br /&gt;
** Ungefähre Lage der Löcher siehe Abbildung in der Anleitung zum Sensor Board, Seite 4!&lt;br /&gt;
** Markierung der Bohrlöcher auf der Rückseite der Servobodenplatte:&lt;br /&gt;
*** 1. Mit einer Hilfslinie die Hinterkante des Servoausschnitts (das ist die kürzere Kante, die näher am Rand der Bodenplatte liegt!) nach beiden Seiten verlängern&lt;br /&gt;
*** 2. Eine 2. Hilfslinie parallel zur ersten im Abstand von 1,4cm zur Mitte der Servobodenplatte hin einzeichnen&lt;br /&gt;
*** 3. Auf dieser Linie jetzt die beiden hinteren Bohrlöcher symmetrisch im Abstand von 4,75cm markieren&lt;br /&gt;
*** 4. Für die vorderen Bohrlöcher eine 3. Hilfslinie im Abstand von 4,1cm parallel zur 2. Linie einzeichnen&lt;br /&gt;
*** 5. Auf dieser Linie die beiden vorderen Bohrlöcher symmetrisch im Abstand von 4,75cm markieren&lt;br /&gt;
*** 6. Kontrolle: Die 4 markierten Bohrlochpositionen bilden ein Rechteck mit 4,1cm seitlicher und 4,75cm vorderer/hinterer Kantenlänge&lt;br /&gt;
** Bohren der 4 Löcher (D = 3,2mm) in die Servobodenplatte&lt;br /&gt;
* Befestigen des Bodenservos auf der Servobodenplatte (siehe Anleitung zum RA2-MINI, Seite 8!)&lt;br /&gt;
* Anbringen des Roboterarms auf dem Sensor Board mit 4 Abstandbolzen M3 (L = 30..50mm) und passenden Schrauben/Muttern&lt;br /&gt;
&lt;br /&gt;
Die Servo-Steckbuchsen werden dann ''in der selben Reihenfolge (S1..S6) wie vorher auf der Controller-Platine des Roboterarms'' auf die Stiftleisten SERVO_1 bis SERVO_6 des Sensor Boards gesteckt.&lt;br /&gt;
'''Man sollte unbedingt einen separaten Akku für die Servos auf dem Sensor Board benutzen!'''&lt;br /&gt;
&lt;br /&gt;
====Grafik-Display====&lt;br /&gt;
Ob es mal ein Grafik-Display für das RP6 Sensor Board geben wird, ist ''pure Spekulation''. Allerdings gibt es drei Hinweise darauf, dass eine solche Hardware-Ergänzung kommen könnte:&lt;br /&gt;
* 1. Der vorbereitete Anschluss für eine [[RP6_Sensor_Board_und_Xtra_Module#Display-Hintergrundbeleuchtung|Display-Hintergrundbeleuchtung]]&lt;br /&gt;
* 2. Die 4 Befestigungslöcher in der Mitte des Sensor Boards&lt;br /&gt;
* 3. Eine Abbildung '''Grafik-Display 128x64''' bei JM3-Engeneering (siehe [[RP6_Sensor_Board_und_Xtra_Module#Weblinks|Weblinks]]!)&lt;br /&gt;
Wir werden sehen ...&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==RP6 Xtra Module==&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_Xtra_module.JPG|RP6 Xtra module|right|500px]]&lt;br /&gt;
&lt;br /&gt;
Von den '''AREXX RP6 Xtra Modulen''' sind bei [http://www.conrad.de/ce/ CONRAD] für den RP6v2 erhältlich:&lt;br /&gt;
* Arexx [[RP6_Sensor_Board_und_Xtra_Module#I2C_GPS_Empf.C3.A4nger_JM3-GPS|I2C GPS Empfänger JM3-GPS]] ([http://www.conrad.de/ce/de/product/1082385/Arexx-IC-GPS-Empfaenger-JM3-GPS 1082385])&lt;br /&gt;
* Arexx [[RP6_Sensor_Board_und_Xtra_Module#Gyro_Modul_JM3-GYRO|Gyro Modul JM3-GYRO]] ([http://www.conrad.de/ce/de/product/1082386/Arexx-Gyro-Modul-JM3-GYRO 1082386])&lt;br /&gt;
* Arexx [[RP6_Sensor_Board_und_Xtra_Module#3D_Accelerometer_Modul_JM3-3DA|3D Accelerometer Modul JM3-3DA]] ([http://www.conrad.de/ce/de/product/1082387/Arexx-3D-Accelerometer-Modul-JM3-3DA 1082387])&lt;br /&gt;
&lt;br /&gt;
===I2C GPS Empfänger JM3-GPS===&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_I2C_GPS_Empfänger.JPG|RP6 I2C GPS Empfänger|right|400px]]&lt;br /&gt;
&lt;br /&gt;
(Laut Online-Katalog der Firma CONRAD!)&lt;br /&gt;
&lt;br /&gt;
''&amp;quot;Universelles GPS-I²C-Bus Modul für RP6 Roboter. Der GPS Empfänger stellt die NMEA-0183 Datensätze GGA, RMC, GSA und VTG in den veschiedenen Registern zur Verfügung. Damit ist eine einfache Weiterverarbeitung möglich.&amp;quot;''&lt;br /&gt;
&lt;br /&gt;
====Beschreibung====&lt;br /&gt;
Der I2C GPS Empfänger ist eine kleine (38 x 23 mm) Zusatzplatine (RP6 Xtra Modul), die direkt auf das [[RP6_Sensor_Board_und_Xtra_Module#RP6_Sensor_Board_2|RP6 Sensor Board]] aufgesteckt werden kann. Sie kann aber auch überall eingesetzt werden, wo eine stabilisierte 5V Versorgungsspannung und ein 5V-I2C-Bus bis 400 kHz zur Verfügung steht.&lt;br /&gt;
&lt;br /&gt;
Die Platine ist bestückt mit dem &amp;quot;Fastrax GPS antenna module&amp;quot; [https://www.u-blox.com/de/positioning-antennas/gnss-antenna-modules/uc530.html UC530]. Als Backup-Batterie dient eine wieder aufladbare Lithium-Batterie ([http://www.farnell.com/datasheets/321180.pdf MS621FE]). Zur Kommunikation zwischen dem UC530 und dem I2C-Bus ist ein [http://www.atmel.com/Images/Atmel-8303-8-bit-AVR-Microcontroller-tinyAVR-ATtiny1634_Datasheet.pdf ATtiny1634] an Bord, der auch die Auswertung des [http://de.wikipedia.org/wiki/NMEA_0183 NMEA Protokolls] übernimmt. Die 3,3 V Versorgungsspannung wird auf der Platine durch einen Spannungsregler ([http://www.mouser.com/ds/2/405/lm3480-316799.pdf LM3480IM3-3.3]) erzeugt. Über den I2C-Bus können folgende Daten der NMEA-0183 Datensätze GGA, RMC, GSA und VTG auf einfache Weise gelesen werden:&lt;br /&gt;
&lt;br /&gt;
* Geograf. Breite&lt;br /&gt;
* Geograf. Länge&lt;br /&gt;
* GPS Status&lt;br /&gt;
* HDOP&lt;br /&gt;
* Satellitenzahl&lt;br /&gt;
* Kurs&lt;br /&gt;
* Geschwindigkeit&lt;br /&gt;
* Höhe&lt;br /&gt;
* UTC-Zeit&lt;br /&gt;
* Datum&lt;br /&gt;
* PDOP&lt;br /&gt;
* VDOP&lt;br /&gt;
* Satellit 1..12&lt;br /&gt;
&lt;br /&gt;
Der ATtiny1634 ist natürlich vorprogrammiert, kann aber über eine vorbereitete 6-polige ISP-Schnittstelle auf der Platine auch umprogrammiert werden.&lt;br /&gt;
&lt;br /&gt;
'''Lieferumfang'''&lt;br /&gt;
* I2C GPS Empfänger&lt;br /&gt;
* CD mit Anleitung und Software-Beispielen.&lt;br /&gt;
&lt;br /&gt;
====Technische Daten====&lt;br /&gt;
* Versorgungsspannung: 5,0 V +/- 5%&lt;br /&gt;
* Stromverbrauch: &amp;lt;= 20 mA (typ.)&lt;br /&gt;
* I2C-Bus Geschwindigkeit: &amp;lt;= 400 kHz&lt;br /&gt;
* GPS Antenne: eingebaut&lt;br /&gt;
* Backup Batterie: Lithium, im Betrieb wieder aufladbar&lt;br /&gt;
* Temperatur Bereich: -10 bis 65 °C&lt;br /&gt;
* Form Faktor: 38 x 23 mm&lt;br /&gt;
* Gewicht: ca. 6 g&lt;br /&gt;
* Empfänger Spezifikationen (UC530):&lt;br /&gt;
** Empfänger: GPS L1 C/A-Code, SPS&lt;br /&gt;
** Kanäle: 66/22 (Suche/Track)&lt;br /&gt;
** Tracking Empfindlichkeit: -165 dBm typ.&lt;br /&gt;
** Navigations Empfindlichkeit: -148 dbm typ (Kaltstart)&lt;br /&gt;
** Update Rate: 1 Sek.&lt;br /&gt;
** Positions Genauigkeit:&lt;br /&gt;
*** 3,0m (67%) typ. horizontal&lt;br /&gt;
*** 5,0m (67%) typ. vertikal&lt;br /&gt;
*** 0,02 m/s (50%) typ. Geschwindigkeit&lt;br /&gt;
** Zeit bis zum ersten Fix: typ. 31 Sek.&lt;br /&gt;
** Protokoll: NMEA-0183 Rev. 3.01&lt;br /&gt;
&lt;br /&gt;
====Anschluss-Schema====&lt;br /&gt;
Belegung des 9-poligen Anschluss-Steckers (K1) siehe in [[RP6_Sensor_Board_und_Xtra_Module#I2C-MODULE|dieser]] Tabelle!&lt;br /&gt;
&lt;br /&gt;
====Umbau-Optionen====&lt;br /&gt;
Wenn man den ATtiny1634 selbst programmieren will, muss man Stiftleisten auf die Platine löten.&lt;br /&gt;
&lt;br /&gt;
Man braucht dazu: &lt;br /&gt;
* 2-reihige Stiftleiste RM 2,54mm (z.B. 2x40-polig 741306) &lt;br /&gt;
&lt;br /&gt;
Man trennt von der 2-reihigen Stiftleiste 2x3 Kontakte ab und lötet sie auf die Punkte &amp;quot;ISP6&amp;quot;.&lt;br /&gt;
Mit einem ISP-Programmer kann dann eine neue Firmware geflasht werden. Die aktuelle Firmware des ATtiny1634 (Version 1.2) wird als .HEX mitgeliefert, leider ohne Source-Code.&lt;br /&gt;
&lt;br /&gt;
Vorsicht: Dabei kann der Prozessor im schlimmsten Fall nicht mehr ansprechbar sein oder der GPS Empfänger UC530 beschädigt werden. Man sollte diesen Umbau und die ISP-Programmierung nur machen, wenn man genau weiß, was man macht! &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Gyro Modul JM3-GYRO===&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_Gyro_Modul.JPG|RP6 Gyro Modul|right|200px]]&lt;br /&gt;
&lt;br /&gt;
(Laut Online-Katalog der Firma CONRAD!)&lt;br /&gt;
&lt;br /&gt;
''&amp;quot;Das universelle Gyro-Sensor Modul für RP6, RP6 V2, RP6 ATMEGA32 und das RP6 V2 Control M256 Wifi-Kit ist ideal zur Erkennung der Blockierung des Roboters in seiner Drehbewegung, sowie der Stabilisierung der Geradeausfahrt.&amp;quot;''&lt;br /&gt;
&lt;br /&gt;
====Beschreibung====&lt;br /&gt;
Das Gyro Modul ist eine kleine (19 x 17 mm) Zusatzplatine (RP6 Xtra Modul), die im RP6-System genutzt werden kann. Es gibt zwar keinen direkt passenden &amp;quot;Steckplatz&amp;quot; auf einer der Microcontroller-Plattformen (RP6v2, M32, M128, M256 Wifi), jedoch ist der Anschluß einfach:&lt;br /&gt;
Benötigt werden +5V und GND, sowie ein freier ADC-Kanal, der bis 5V messen kann. Damit kann das Gyro Modul sehr universell eingesetzt werden. Es misst die Drehrate um die Z-Achse (Hochachse oder Yaw).&lt;br /&gt;
&lt;br /&gt;
Die Platine ist bestückt mit dem analogen Gyro-Sensor [http://www.st.com/web/en/resource/technical/document/datasheet/CD00254111.pdf LY330ALH], dessen Ausgangsspannung durch zwei OP-Amps ([http://www.ti.com.cn/cn/lit/ds/symlink/lm321.pdf LM321], [http://www.produktinfo.conrad.com/datenblaetter/00000-24999/001072615-da-01-en-IC_AMP_PREC_LMP7731MF_NOPB_SOT_23_5_TID.pdf LMP7731MF]) in Ruhe bei 2,5 V liegt. Höhere Ausgangsspannungen (bis 5 V) bedeuten eine Drehgeschwindigkeit nach LINKS, niedrigere (bis 0 V) eine Drehgeschwindigkeit nach RECHTS. Die 3,3 V Versorgungsspannung des LY330ALH wird auf der Platine durch einen Spannungsregler ([http://www.mouser.com/ds/2/405/lm3480-316799.pdf LM3480IM3-3.3]) erzeugt.&lt;br /&gt;
&lt;br /&gt;
'''Lieferumfang'''&lt;br /&gt;
* Gyro Modul&lt;br /&gt;
* CD mit Anleitung und Software-Beispielen.&lt;br /&gt;
&lt;br /&gt;
====Technische Daten====&lt;br /&gt;
&lt;br /&gt;
* VDD: 5,0 V +/- 5%&lt;br /&gt;
* Vout(0): 2,5 V +/- 2% (ohne Bewegung)&lt;br /&gt;
* Vout: Vout(0) + 10mV / dps +/- 2%&lt;br /&gt;
* Messbereich: ca. 200 dps max.&lt;br /&gt;
&lt;br /&gt;
====Anschluss-Schema====&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_Gyro_Modul_SP.JPG|RP6 Gyro Modul - Anschluss-Schema]]&lt;br /&gt;
&lt;br /&gt;
====Umbau-Optionen====&lt;br /&gt;
Am Gyro Modul gibt es nichts umzubauen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===3D Accelerometer Modul JM3-3DA===&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_3D_Accelerometer_Modul.JPG|RP6 3D Accelerometer Modul|right|105px]]&lt;br /&gt;
&lt;br /&gt;
(Laut Online-Katalog der Firma CONRAD!)&lt;br /&gt;
&lt;br /&gt;
''&amp;quot;Universeller 3-Achsen Beschleunigungssensor für RP6, RP6 V2, RP6 ATMEGA32 und das RP6 V2 Control M256 WIFI-Kit. Ideal zur Winkelmessung (Neigung-, Kipp-Winkel) und vieles mehr.&amp;quot;''&lt;br /&gt;
&lt;br /&gt;
====Beschreibung====&lt;br /&gt;
&lt;br /&gt;
Das 3D Accelerometer Modul ist eine kleine (15 x 10 mm) Zusatzplatine (RP6 Xtra Modul), die direkt auf den EEPROM-Sockel (IC5) der Zusatzplatine [[RP6#RP6_CONTROL_M32_Platine|RP6 CONTROL M32]] gesteckt und über den SPI-Bus angesteuert werden kann. Das Accelerometer Modul kann aber auch mit allen Microcontroller-Plattformen betrieben werden, die eine stabilisierte 5V-Versorgungsspannung und einen SPI- oder I2C-Bus bieten.&lt;br /&gt;
&lt;br /&gt;
Die Platine ist bestückt mit dem 3D Beschleunigungs-Sensor [http://www.farnell.com/datasheets/1691680.pdf LIS302DLH]. Die 3,3 V Versorgungsspannung des LIS302DLH wird auf der Platine durch einen Spannungsregler ([http://www.mouser.com/ds/2/405/lm3480-316799.pdf LM3480IM3-3.3]) erzeugt.&lt;br /&gt;
&lt;br /&gt;
'''Lieferumfang'''&lt;br /&gt;
* 3D Accelerometer Modul&lt;br /&gt;
* CD mit Anleitung und Software-Beispielen.&lt;br /&gt;
&lt;br /&gt;
====Technische Daten====&lt;br /&gt;
&lt;br /&gt;
* VDD: 5,0 V +/- 5%&lt;br /&gt;
* Messbereiche: +-2 g, +-4 g, +-8 g&lt;br /&gt;
* Datenausgabe: 16 Bit&lt;br /&gt;
* Schnittstellen: I2C, SPI&lt;br /&gt;
&lt;br /&gt;
====Anschluss-Schema====&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_3D_Accelerometer_Modul_SP.JPG|RP6 3D Accelerometer Modul - Anschluss-Schema|350px]]&lt;br /&gt;
&lt;br /&gt;
====Umbau-Optionen====&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_3D_Accelerometer_Modul_M32.JPG|RP6 3D Accelerometer Modul auf der M32|right|500px]]&lt;br /&gt;
&lt;br /&gt;
'''Will man das Modul auf der M32 einsetzen, muss man auf dem 3D Accelerometer Modul die Widerstände R2 und R3 (falls vorhanden!) auslöten (siehe Anleitung zum Modul, Seiten 4/5!)''' und einen IC-Sockel an Position IC5 und einen Kondensator an Position C19 auf der M32 einlöten, siehe [[RP6#Zweites_SPI-EEPROM|hier]]!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die Abbildung rechts zeigt das 3D Accelerometer Modul auf der M32.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Programmierung==&lt;br /&gt;
In diesem Abschnitt geht es um die Programmierung der Sensoren und Aktoren auf dem [[RP6_Sensor_Board_und_Xtra_Module#RP6_Sensor_Board_3|RP6 Sensor Board]] und auf den [[RP6_Sensor_Board_und_Xtra_Module#RP6_Xtra_Module_3|Xtra Modulen]]. Die hier veröffentlichte Software baut NICHT auf die mitgelieferten C++ Software-Beispiele auf der ''&amp;quot;RP6 Robot System Xtra Modules CD-ROM&amp;quot;'' auf, sondern basiert auf Eigenentwicklungen in GCC.&lt;br /&gt;
&lt;br /&gt;
===RP6 Sensor Board===&lt;br /&gt;
Das RP6 Sensor Board RP6-JM03-61 verfügt nicht über einen eigenen Microprozessor. Daher geht es hier eigentlich nicht um die Programmierung des Sensor Boards, sondern um die Programmierung der Microcontroller-Plattform, an die das Sensor Board angeschlossen ist. In der Regel wird das die RP6 M256 WiFi Zusatzplatine sein, aber auch die RP6v2 Base steuert (als I2C-Slave) in der vorgesehenen Konfiguration gewisse Funktionen des Sensor Boards an.&lt;br /&gt;
Prinzipiell kann das Sensor Board aber auch an der RP6 CONTROL M32 (''passende Library auf Anfrage beim Autor!'') oder der RP6 CCPRO M128 Zusatzplatine betrieben werden.&lt;br /&gt;
&lt;br /&gt;
====Dokumentation====&lt;br /&gt;
Die Dokumentation zum RP6 Sensor Board befindet sich auf der mitgelieferten ''&amp;quot;RP6 Robot System Xtra Modules CD-ROM&amp;quot;''.&lt;br /&gt;
&lt;br /&gt;
=====Manuals=====&lt;br /&gt;
Das Handbuch kann auch [http://www.produktinfo.conrad.com/datenblaetter/00000-24999/001082384-an-01-de-RP6_SENSOR_BOARD.pdf hier] eingesehen werden.&lt;br /&gt;
 ACHTUNG: Das Manual enthält aktuell noch teils irreführende Beschreibungen!&lt;br /&gt;
&lt;br /&gt;
=====Schematics=====&lt;br /&gt;
=====Datasheets=====&lt;br /&gt;
&lt;br /&gt;
====Demo-Programmme====&lt;br /&gt;
Demo-Programme zum RP6 Sensor Board befinden sich auf der mitgelieferten ''&amp;quot;RP6 Robot System Xtra Modules CD-ROM&amp;quot;''.&lt;br /&gt;
&lt;br /&gt;
====RP6 M256 WiFi: Sensor Board Library====&lt;br /&gt;
Die nachfolgende RP6M256_Sensor_BoardLib (GCC) dient zur Ansteuerung des Sensor Boards durch die RP6M256 WiFi.&lt;br /&gt;
&lt;br /&gt;
=====Configuration Header=====&lt;br /&gt;
Vor dem Kompilieren der Library muss eine Anpassung des Configuration Headers an die eigenen Hardware-Voraussetzungen erfolgen.&lt;br /&gt;
Dazu gibt es im Configuration Header eine Definition:&lt;br /&gt;
* USE_PD5 -&amp;gt; Die Sensor Board Funktion &amp;quot;PD5&amp;quot; steuert den TCA4311A Enable Pin (EN).&lt;br /&gt;
Im nachfolgenden Listing ist die Definition USE_PD5 NICHT aktiv (d.h. der TCA4311A Enable Pin (EN) wird vom MAX7311 I/O 1.0 Pin angesteuert!). Dies muss an die eigene Hardware angepaßt werden. Wenn &amp;quot;PD5&amp;quot; den TCA4311A Enable Pin (EN) steuern soll, muss die Zeile mit &amp;quot;USE_PD5&amp;quot; &amp;quot;aktiviert&amp;quot; werden. Dazu entfernt man &amp;quot;//&amp;quot; am Zeilenanfang:&lt;br /&gt;
 #define USE_PD5&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Bevor man Beschleunigungs-, Magnetfeldsensor und Gyroskop nutzen kann, muss man sie kalibrieren:&lt;br /&gt;
&lt;br /&gt;
* '''Accelerometer:'''&lt;br /&gt;
** Die X-Achse wird kalibriert, indem man den RP6 mit der rechten Seite nach unten hält und den Maximalwert in MAX_X_A einträgt. Dann neigt man ihn auf seine linke Seite und trägt den negativen Maximalwert in MIN_X_A ein.&lt;br /&gt;
** Die Y-Achse wird kalibriert, indem man den RP6 mit der Vorderseite nach oben hält und den Maximalwert in MAX_Y_A einträgt. Dann kippt man die Vorderseite nach unten und trägt den negativen Maximalwert in MIN_Y_A ein.&lt;br /&gt;
** Die Z-Achse wird kalibriert, indem man den RP6 normal waagerecht hält und den Maximalwert in MAX_Z_A einträgt. Dann dreht man den RP6 &amp;quot;auf den Kopf&amp;quot; und trägt den negativen Maximalwert in MIN_Z_A ein.&lt;br /&gt;
** Sollten die angezeigten Pitch- und Roll-Werte nach der Kalibrierung der Achsen und genau waagerecht stehendem Sensor bzw. RP6 vom Nullwert deutlich abweichen, kann man sie mithilfe der Definitionen OFFSET_PITCH_A und OFFSET_ROLL_A &amp;quot;nullen&amp;quot;. Die Einheit dieser Definitionen ist °.&lt;br /&gt;
 ''HINWEIS: Die internen Berechnungen werden durch diese Offset-Korrektur&lt;br /&gt;
 NICHT beeinflußt. Die Offset-Werte können also nicht dazu benutzt werden,&lt;br /&gt;
 eine Achsenabweichung zwischen Sensor und RP6 zu kompensieren!''&lt;br /&gt;
* '''Magnetometer:'''&lt;br /&gt;
** Zur Kalibrierung des Magnetfeldsensors stellt man den RP6 auf eine waagerechte Fläche. Es dürfen keine Elektrogeräte, Metallteile und stromführende Leitungen in der Nähe sein, die das Magnetfeld verändern können.&lt;br /&gt;
** Zunächst ist es möglich, die sogenannten &amp;quot;hard iron&amp;quot; Effekte auszugleichen. Dies sind feste Magnetfeldabweichungen, die durch das &amp;quot;Gerät&amp;quot; (in unserem Fall also durch den kompletten RP6) verursacht werden, in oder auf dem der Sensor angebracht ist. Mit den Definitionen OFFSET_X_M, OFFSET_Y_M und OFFSET_Z_M können diese Effekte ausgeglichen werden. Diese Kalibrierung wird hier aktuell (noch) nicht beschrieben, so dass man die Werte für diese Definitionen zunächst bei 0 belassen sollte.&lt;br /&gt;
** Die X-Achse und Y-Achse wird kalibriert, indem man den RP6 langsam mehrfach um die eigene (Z-)Achse dreht und die Maximalwerte in MAX_X_M und MAX_Y_M einträgt. Die negativen Maximalwerte trägt man in MIN_X_M und MIN_Y_M ein.&lt;br /&gt;
** Die Z-Achse wird kalibriert, indem man den RP6 auf die rechte oder linke Seite legt, ihn dann langsam mehrfach auf der Stelle (um seine Y-Achse) dreht und den Maximalwert in MAX_Z_M und den negativen Maximalwert in MIN_Z_M einträgt.&lt;br /&gt;
** Mit der Definition DECLINATION_M kann man zur Verbesserung der Genauigkeit der Richtungsangaben den magnetischen Deklinationswert [°] (d.h. die magnetische Missweisung) am aktuellen Standort festlegen. [http://www.ngdc.noaa.gov/geomag-web/#declination Hier] befindet sich ein &amp;quot;Deklinations-Rechner&amp;quot;, mit dem man den Deklinationswert für den eigenen Standort ermitteln kann. &lt;br /&gt;
** Wenn man den Temperaturwert des LSM303DLHC nutzen will, muss man die Definition GET_TEMP_M aktivieren (Standard!). Den Temperaturwert kann man noch eichen, indem man die Definition OFFSET_TEMP_M anpasst. Die Einheit von OFFSET_TEMP_M ist °C.&lt;br /&gt;
* '''Gyroskop:'''&lt;br /&gt;
** In Ruhelage des RP6 wird ein ADC-Wert von ca. 511 angezeigt, wenn die Definition ADCVAL_ZERORATE_LEVEL im Configuration Header (RP6M256_Sensor_Board.h) vor der ersten Kompilierung zunächst auf 0 gesetzt wurde. Die Kalibrierung des Gyroskops ist abgeschlossen, nachdem man den in Ruhelage angezeigten ADC-Wert als ADCVAL_ZERORATE_LEVEL eingetragen hat.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''HINWEISE ZUR KALIBRIERUNG:'''&lt;br /&gt;
* Das Demo-Programm ist nicht sehr gut geeignet, um die Kalibrierungen durchzuführen.&lt;br /&gt;
* Man sollte mit einem eigenen kurzen ''Kalibrierungs-Programm'' nur die Rohwerte der jeweiligen X-, Y- und Z-Achse z.B. zweimal pro Sekunde ausgeben.&lt;br /&gt;
* Die Rohwerte sind in Variablen x_axis..., y_axis..., z_axis... enthalten. Da die Rohwerte in den Funktionen normalizeLSM303DLHC_A() bzw. normalizeLSM303DLHC_M() ggf. verändert werden, müssen die Rohwerte VOR Durchlaufen dieser Funktionen ausgegeben werden.&lt;br /&gt;
* '''Ohne eine sorgfältige Kalibrierung wird die Kompass-Funktion (insbesondere die neigungskompensierte Ausgabe der Himmelsrichtung) nicht funktionieren!'''&lt;br /&gt;
* Nach dem Eintragen der Kalibrierungs-Werte in den Configuration Header (RP6M256_Sensor_Board.h) muss die ''Demo'' neu kompiliert werden. Vorher sollten die Compiler-Hilfsdateien der Sensor Board-Library (Dateiendungen .st und .o) im Programmverzeichnis gelöscht werden.&lt;br /&gt;
* Getestet wird das Ergebnis der Kalibrierung, indem die Ausgabewerte (Temperatur, Pitch, Roll, Heading, Neigungs-kompensiertes Heading) der ''Demo'' überprüft werden. Dazu kann man Vergleichswerte (Thermometer, Winkelmesser für Pitch, Roll und externer Kompass für Heading) heranziehen.&lt;br /&gt;
* Wenn die Ausgabewerte nicht den Erwartungen entsprechen, muss die Kalibrierung wiederholt werden.&lt;br /&gt;
* Eine Kalibrierung der Sensoren ist nur zuverlässig, solange die Position des jeweiligen Sensors und seine komplette Hardware-Umgebung (also der RP6 mit allen seinen Teilen!) nicht verändert wird. Gibt es trotzdem Veränderungen, z.B. durch weitere Aufbauten auf dem RP6, müssen diese Sensoren neu kalibriert werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Datei: RP6M256_Sensor_Board.h&lt;br /&gt;
&amp;lt;pre&amp;gt;/* ****************************************************************************&lt;br /&gt;
 *                           _______________________&lt;br /&gt;
 *                           \| RP6  ROBOT SYSTEM |/&lt;br /&gt;
 *                            \_-_-_-_-_-_-_-_-_-_/           &amp;gt;&amp;gt;&amp;gt; RP6 M256 WIFI&lt;br /&gt;
 * ----------------------------------------------------------------------------&lt;br /&gt;
 * ----------------------------- [c]2014 - Dirk -------------------------------&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * File: RP6M256_Sensor_Board.h&lt;br /&gt;
 * Version: 1.0&lt;br /&gt;
 * Target: RP6 M256 WIFI - ATMEGA2560 @16.00MHz&lt;br /&gt;
 * Author(s): Dirk&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Description:&lt;br /&gt;
 * Configuration header file for new RP6 Sensor Board library.&lt;br /&gt;
 * The RP6 Sensor Board (CONRAD 1082384) is connected to the RP6M256 with the&lt;br /&gt;
 * two plugs:&lt;br /&gt;
 *   Sensor Board &amp;lt;---&amp;gt; RP6M256&lt;br /&gt;
 *   --------------------------------&lt;br /&gt;
 *   I/O (K17)    &amp;lt;---&amp;gt; IO_PWM/T0/T1&lt;br /&gt;
 *   ADC (K18)    &amp;lt;---&amp;gt; ADC_IO2/CMP&lt;br /&gt;
 * The RP6 Sensor Board function &amp;quot;PD5&amp;quot; (IC6: EN) is now connected to RP6M256&lt;br /&gt;
 * OC1B (PB6) and the RP6 Sensor Board function &amp;quot;ADC4&amp;quot; (SHARP_R) to RP6M256&lt;br /&gt;
 * ADC9 (PK1).&lt;br /&gt;
 * On the RP6 Sensor Board the functions &amp;quot;ADC0&amp;quot;, &amp;quot;ADC1&amp;quot;, &amp;quot;PWR&amp;quot; and &amp;quot;ADC4&amp;quot; are&lt;br /&gt;
 * connected to the USRBUS. The USRBUS may be wired on the RP6 mainboard like&lt;br /&gt;
 * this:&lt;br /&gt;
 *   Function : Sensor Board - USRBUS: * &amp;lt;---&amp;gt; RP6 Mainboard&lt;br /&gt;
 *   --------------------------------------------------------&lt;br /&gt;
 *   SHARP_F  : &amp;quot;ADC0&amp;quot;       - Pin 1     &amp;lt;---&amp;gt; ADC0: Pin 3&lt;br /&gt;
 *   GYRO     : &amp;quot;ADC1&amp;quot;       - Pin 2     &amp;lt;---&amp;gt; ADC1: Pin 3&lt;br /&gt;
 *   PWRON ²  : &amp;quot;PWR&amp;quot;        - Pin 3     &amp;lt;---&amp;gt; PWR&lt;br /&gt;
 *   SHARP_R  : &amp;quot;ADC4&amp;quot;       - Pin 5     &amp;lt;---&amp;gt; Not connected!&lt;br /&gt;
 * At *) It is also possible not to use the USRBUS, but to connect the RP6&lt;br /&gt;
 *       Sensor Board directly to the RP6 mainboard with 3 single cables.&lt;br /&gt;
 * At ²) See RP6 manual &amp;quot;4.6.8. Stromsparfunktionen&amp;quot;! &lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
#ifndef RP6M256_SENSOR_BOARD_H&lt;br /&gt;
#define RP6M256_SENSOR_BOARD_H&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// RP6 Sensor Board hardwired components:&lt;br /&gt;
// - I2C I/O Port Expander (MAX7311)&lt;br /&gt;
// - I2C Real Time Clock (RTC DS1339)&lt;br /&gt;
// - I2C Temperature Sensor (LM75B)&lt;br /&gt;
// - I2C Servo Controller (PCA9685)&lt;br /&gt;
// - I2C LED Driver (TCA6507)&lt;br /&gt;
// - I2C 3D Magnetometer &amp;amp; Accelerometer (LSM303DLHC)&lt;br /&gt;
// - Analog Yaw-Rate Gyroscope (LY330ALH)&lt;br /&gt;
// - Hot Swappable 2-Wire Bus Buffer (TCA4311A)&lt;br /&gt;
// - Button&lt;br /&gt;
// - Status LED&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C I/O Port Expander (MAX7311):&lt;br /&gt;
#define I2C_SENSOR_PORTEXP_ADR			0x40	// Default&lt;br /&gt;
&lt;br /&gt;
// Interrupt I/O portpin definitions (RP6M256):&lt;br /&gt;
#define IO_SENSOR_INT1_IN				INT1_PI12 // PCINT12 PJ3  XBUS Pin 8&lt;br /&gt;
#define IO_SENSOR_INT1_DDR				DDRJ&lt;br /&gt;
#define IO_SENSOR_INT1_PIN				PINJ&lt;br /&gt;
#define IO_SENSOR_INT1_PORT				PORTJ&lt;br /&gt;
#define IO_SENSOR_INT2_IN				INT2_PI15 // PCINT15 PJ6  XBUS Pin 11&lt;br /&gt;
#define IO_SENSOR_INT2_DDR				DDRJ&lt;br /&gt;
#define IO_SENSOR_INT2_PIN				PINJ&lt;br /&gt;
#define IO_SENSOR_INT2_PORT				PORTJ&lt;br /&gt;
#define IO_SENSOR_INT3_IN				INT3_PI14 // PCINT14 PJ5  XBUS Pin 9&lt;br /&gt;
#define IO_SENSOR_INT3_DDR				DDRJ&lt;br /&gt;
#define IO_SENSOR_INT3_PIN				PINJ&lt;br /&gt;
#define IO_SENSOR_INT3_PORT				PORTJ&lt;br /&gt;
#define IO_SENSOR_INTU_IN				INTU_PI13 // PCINT13 PJ4  XBUS Pin 7&lt;br /&gt;
#define IO_SENSOR_INTU_DDR				DDRJ&lt;br /&gt;
#define IO_SENSOR_INTU_PIN				PINJ&lt;br /&gt;
#define IO_SENSOR_INTU_PORT				PORTJ&lt;br /&gt;
&lt;br /&gt;
// I/O PORT pin numbers:&lt;br /&gt;
#define PIN7							7&lt;br /&gt;
#define PIN6							6&lt;br /&gt;
#define PIN5							5&lt;br /&gt;
#define PIN4							4&lt;br /&gt;
#define PIN3							3&lt;br /&gt;
#define PIN2							2&lt;br /&gt;
#define PIN1							1&lt;br /&gt;
#define PIN0							0&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Real Time Clock (RTC DS1339):&lt;br /&gt;
#define I2C_SENSOR_RTC_ADR				0xd0	// Default&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Temperature Sensor (LM75B):&lt;br /&gt;
#define I2C_SENSOR_TEMP_ADR				0x90	// Default&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Servo Controller (PCA9685):&lt;br /&gt;
#define I2C_SENSOR_SERVO_ADR			0x88	// Default&lt;br /&gt;
&lt;br /&gt;
// Servo and PWM channels:&lt;br /&gt;
#define CH_SERVO_1						16		// At K6: 1  &amp;quot;SERVO_1&amp;quot;&lt;br /&gt;
#define CH_SERVO_2						15		// At K11: 1 &amp;quot;SERVO_2&amp;quot;&lt;br /&gt;
#define CH_SERVO_3						13		// At K29: 1 &amp;quot;SERVO_3&amp;quot;&lt;br /&gt;
#define CH_SERVO_4						14		// At K30: 1 &amp;quot;SERVO_4&amp;quot;&lt;br /&gt;
#define CH_SERVO_5						11		// At K31: 1 &amp;quot;SERVO_5&amp;quot;&lt;br /&gt;
#define CH_SERVO_6						12		// At K32: 1 &amp;quot;SERVO_6&amp;quot;&lt;br /&gt;
#define CH_SERVO_7						9		// At K33: 1 &amp;quot;SERVO_7&amp;quot;&lt;br /&gt;
#define CH_SERVO_8						10		// At K34: 1 &amp;quot;SERVO_8&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#define CH_PWM_OUT_1					1		// At K12: 1 &amp;quot;PWM_OUT&amp;quot;&lt;br /&gt;
#define CH_PWM_OUT_2					2		// At K12: 2&lt;br /&gt;
#define CH_PWM_OUT_3					3		// At K12: 3&lt;br /&gt;
#define CH_PWM_OUT_4					4		// At K12: 4&lt;br /&gt;
#define CH_PWM_OUT_5					5		// At K12: 5&lt;br /&gt;
#define CH_PWM_OUT_6					6		// At K12: 6&lt;br /&gt;
#define CH_PWM_OUT_7					7		// At K12: 7&lt;br /&gt;
#define CH_PWM_OUT_8					8		// At K12: 8&lt;br /&gt;
&lt;br /&gt;
// Servo left touch (LT), right touch (RT), middle position (MP) constants:&lt;br /&gt;
// (Hints: - Servo impulse length [ms] = Servo position value / 204.8&lt;br /&gt;
//           (Formula only valid for a PWM of 50 Hz!)&lt;br /&gt;
//         - Min. servo impulse (0,7 ms) = Servo position 143&lt;br /&gt;
//         - Mid. servo impulse (1,5 ms) = Servo position 307&lt;br /&gt;
//         - Max. servo impulse (2,3 ms) = Servo position 471&lt;br /&gt;
//         - !!! You should NOT use servo position values &amp;lt; 143 or &amp;gt; 471 !!!)&lt;br /&gt;
#define SERVO1_LT						205		// Servo impulse ~1ms&lt;br /&gt;
#define SERVO1_RT						410		// Servo impulse ~2ms&lt;br /&gt;
#define SERVO1_MP						((SERVO1_RT - SERVO1_LT) / 2 + SERVO1_LT)&lt;br /&gt;
#define SERVO2_LT						205&lt;br /&gt;
#define SERVO2_RT						410&lt;br /&gt;
#define SERVO2_MP						((SERVO2_RT - SERVO2_LT) / 2 + SERVO2_LT)&lt;br /&gt;
#define SERVO3_LT						205&lt;br /&gt;
#define SERVO3_RT						410&lt;br /&gt;
#define SERVO3_MP						((SERVO3_RT - SERVO3_LT) / 2 + SERVO3_LT)&lt;br /&gt;
#define SERVO4_LT						205&lt;br /&gt;
#define SERVO4_RT						410&lt;br /&gt;
#define SERVO4_MP						((SERVO4_RT - SERVO4_LT) / 2 + SERVO4_LT)&lt;br /&gt;
#define SERVO5_LT						205&lt;br /&gt;
#define SERVO5_RT						410&lt;br /&gt;
#define SERVO5_MP						((SERVO5_RT - SERVO5_LT) / 2 + SERVO5_LT)&lt;br /&gt;
#define SERVO6_LT						205&lt;br /&gt;
#define SERVO6_RT						410&lt;br /&gt;
#define SERVO6_MP						((SERVO6_RT - SERVO6_LT) / 2 + SERVO6_LT)&lt;br /&gt;
#define SERVO7_LT						205&lt;br /&gt;
#define SERVO7_RT						410&lt;br /&gt;
#define SERVO7_MP						((SERVO7_RT - SERVO7_LT) / 2 + SERVO7_LT)&lt;br /&gt;
#define SERVO8_LT						205&lt;br /&gt;
#define SERVO8_RT						410&lt;br /&gt;
#define SERVO8_MP						((SERVO8_RT - SERVO8_LT) / 2 + SERVO8_LT)&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C LED Driver (TCA6507):&lt;br /&gt;
#define I2C_SENSOR_LEDDRIVER_ADR		0x8a	// Default&lt;br /&gt;
&lt;br /&gt;
// LED numbers:&lt;br /&gt;
#define LED0							0		// At K7&lt;br /&gt;
#define DISPLAY_BACKLIGHT				0		// Display background light&lt;br /&gt;
#define LED1							1		// At K4&lt;br /&gt;
#define LED2							2		// At K2&lt;br /&gt;
#define LED3							3		// At K10: 1&lt;br /&gt;
#define BACKLIGHT_R						3		// Right backlight&lt;br /&gt;
#define LED4							4		// At K10: 2&lt;br /&gt;
#define BACKLIGHT_L						4		// Left backlight&lt;br /&gt;
#define LED5							5		// White LED (D3)&lt;br /&gt;
#define HEADLIGHT_R						5		// Right headlight&lt;br /&gt;
#define LED6							6		// White LED (D1)&lt;br /&gt;
#define HEADLIGHT_L						6		// Left headlight&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C 3D Magnetometer &amp;amp; Accelerometer (LSM303DLHC):&lt;br /&gt;
&lt;br /&gt;
// LSM303DLHC accelerometer:&lt;br /&gt;
#define I2C_SENSOR_LSM303DLHC_A_ADR 	0x32	// Default&lt;br /&gt;
&lt;br /&gt;
// LSM303DLHC accelerometer calibration data:&lt;br /&gt;
#define MAX_X_A						1037		// Max. X-axis value&lt;br /&gt;
#define MIN_X_A						-1030		// Min. X-axis value&lt;br /&gt;
#define MAX_Y_A						1030		// Max. Y-axis value&lt;br /&gt;
#define MIN_Y_A						-1019		// Min. Y-axis value&lt;br /&gt;
#define MAX_Z_A						1062		// Max. Z-axis value&lt;br /&gt;
#define MIN_Z_A						-1056		// Min. Z-axis value&lt;br /&gt;
#define OFFSET_PITCH_A				0.0			// Offset Pitch [°]&lt;br /&gt;
#define OFFSET_ROLL_A				0.0			// Offset Roll [°]&lt;br /&gt;
&lt;br /&gt;
// LSM303DLHC magnetometer:&lt;br /&gt;
#define I2C_SENSOR_LSM303DLHC_M_ADR		0x3c	// Default&lt;br /&gt;
&lt;br /&gt;
// LSM303DLHC magnetometer calibration data:&lt;br /&gt;
#define MAX_X_M						-111.0		// Max. X-axis value&lt;br /&gt;
#define MIN_X_M						-634.0		// Min. X-axis value&lt;br /&gt;
#define OFFSET_X_M					0			// Hard iron X-axis offset&lt;br /&gt;
#define MAX_Y_M						297.0		// Max. Y-axis value&lt;br /&gt;
#define MIN_Y_M						-215.0		// Min. Y-axis value&lt;br /&gt;
#define OFFSET_Y_M					0			// Hard iron Y-axis offset&lt;br /&gt;
#define MAX_Z_M						183.0		// Max. Z-axis value&lt;br /&gt;
#define MIN_Z_M						-214.0		// Min. Z-axis value&lt;br /&gt;
#define OFFSET_Z_M					0			// Hard iron Z-axis offset&lt;br /&gt;
#define DECLINATION_M				0.0			// E at local position [°]&lt;br /&gt;
&lt;br /&gt;
// LSM303DLHC temperature sensor definitions:&lt;br /&gt;
#define GET_TEMP_M								// Enable temperature sensor&lt;br /&gt;
#define OFFSET_TEMP_M				0.0			// Temperature offset [°C]&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Analog Yaw-Rate Gyroscope (LY330ALH):&lt;br /&gt;
&lt;br /&gt;
// LY330ALH gyroscope:&lt;br /&gt;
#define ADC_SENSOR_LY330ALH				ADC_1	// At USRBUS: 2 (RP6BASE)&lt;br /&gt;
&lt;br /&gt;
// LY330ALH gyroscope calibration data:&lt;br /&gt;
// (Higher values [505..1023] mean an angular velocity while rotating LEFT&lt;br /&gt;
//  and lower values [503..0] while rotating RIGHT!)&lt;br /&gt;
#define ADCVAL_MINRATE					0		// Min. rate value&lt;br /&gt;
#define ADCVAL_ZERORATE_LEVEL			504		// Zero rate level&lt;br /&gt;
#define ADCVAL_MAXRATE					1023	// Max. rate value&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Hot Swappable 2-Wire Bus Buffer (TCA4311A):&lt;br /&gt;
&lt;br /&gt;
// Define USE_PD5, if you want to control the TCA4311A enable pin (EN) with&lt;br /&gt;
// the RP6 Sensor Board function &amp;quot;PD5&amp;quot;. If USE_PD5 is NOT defined (default),&lt;br /&gt;
// the TCA4311A EN pin is controlled by the MAX7311 I/O 1.0 pin.&lt;br /&gt;
// ---------------&lt;br /&gt;
//#define USE_PD5&lt;br /&gt;
// ---------------&lt;br /&gt;
&lt;br /&gt;
#define IO_SENSOR_TCA4311A_EN_IN		OC1B_PI6 // At I/O: 9 (RP6M256)&lt;br /&gt;
#define IO_SENSOR_TCA4311A_EN_DDR		DDRB&lt;br /&gt;
#define IO_SENSOR_TCA4311A_EN_PIN		PINB&lt;br /&gt;
#define IO_SENSOR_TCA4311A_EN_PORT		PORTB&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Button:&lt;br /&gt;
&lt;br /&gt;
// (Button is connected to I/O 1.7 of the MAX7311!)&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Status LED:&lt;br /&gt;
&lt;br /&gt;
// (Status LED is connected to I/O 1.6 of the MAX7311!)&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Other ADC channel definitions:&lt;br /&gt;
&lt;br /&gt;
// (Depending on connections on the RP6 Sensor Board!)&lt;br /&gt;
#define ADC_SENSOR_SHARP_F				ADC_0	// At USRBUS: 1 (RP6BASE)&lt;br /&gt;
#define ADC_SENSOR_SHARP_R				ADC_9	// At ADC: 3    (RP6M256)&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
/******************************************************************************&lt;br /&gt;
 * Additional info&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Changelog:&lt;br /&gt;
 * &lt;br /&gt;
 *  ---&amp;gt; changes are documented in the file &amp;quot;RP6M256_Sensor_BoardLib.c&amp;quot;&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=====Library Header=====&lt;br /&gt;
Datei: RP6M256_Sensor_BoardLib.h&lt;br /&gt;
&amp;lt;pre&amp;gt;/* ****************************************************************************&lt;br /&gt;
 *                           _______________________&lt;br /&gt;
 *                           \| RP6  ROBOT SYSTEM |/&lt;br /&gt;
 *                            \_-_-_-_-_-_-_-_-_-_/           &amp;gt;&amp;gt;&amp;gt; RP6 M256 WIFI&lt;br /&gt;
 * ----------------------------------------------------------------------------&lt;br /&gt;
 * ----------------------------- [c]2014 - Dirk -------------------------------&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * File: RP6M256_Sensor_BoardLib.h&lt;br /&gt;
 * Version: 1.0&lt;br /&gt;
 * Target: RP6 M256 WIFI - ATMEGA2560 @16.00MHz&lt;br /&gt;
 * Author(s): Dirk&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Description:&lt;br /&gt;
 * Header file for new RP6 Sensor Board library.&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
#ifndef RP6M256_SENSOR_BOARDLIB_H&lt;br /&gt;
#define RP6M256_SENSOR_BOARDLIB_H&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// RP6 Sensor Board hardwired components:&lt;br /&gt;
// - I2C I/O Port Expander (MAX7311)&lt;br /&gt;
// - I2C Real Time Clock (RTC DS1339)&lt;br /&gt;
// - I2C Temperature Sensor (LM75B)&lt;br /&gt;
// - I2C Servo Controller (PCA9685)&lt;br /&gt;
// - I2C LED Driver (TCA6507)&lt;br /&gt;
// - I2C 3D Magnetometer &amp;amp; Accelerometer (LSM303DLHC)&lt;br /&gt;
// - Analog Yaw-Rate Gyroscope (LY330ALH)&lt;br /&gt;
// - Hot Swappable 2-Wire Bus Buffer (TCA4311A)&lt;br /&gt;
// - Button&lt;br /&gt;
// - Status LED&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Includes:&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6M256Lib.h&amp;quot;&lt;br /&gt;
#include &amp;quot;RP6I2CmasterTWI.h&amp;quot;&lt;br /&gt;
#include &amp;quot;RP6M256_Sensor_Board.h&amp;quot;&lt;br /&gt;
#include &amp;lt;math.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// RP6M256_I2CMasterLib definitions:&lt;br /&gt;
&lt;br /&gt;
#ifndef I2C_RP6_BASE_ADR&lt;br /&gt;
	#define I2C_RP6_BASE_ADR			10&lt;br /&gt;
#endif&lt;br /&gt;
#ifndef I2C_REG_ADC_ADC0_L&lt;br /&gt;
	#define I2C_REG_ADC_ADC0_L			23&lt;br /&gt;
#endif&lt;br /&gt;
#ifndef I2C_REG_ADC_ADC1_L&lt;br /&gt;
	#define I2C_REG_ADC_ADC1_L			25&lt;br /&gt;
#endif&lt;br /&gt;
#ifndef CMD_POWER_OFF&lt;br /&gt;
	#define CMD_POWER_OFF				0&lt;br /&gt;
#endif&lt;br /&gt;
#ifndef CMD_POWER_ON&lt;br /&gt;
	#define CMD_POWER_ON				1&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C I/O Port Expander (MAX7311):&lt;br /&gt;
&lt;br /&gt;
// Registers:&lt;br /&gt;
#define MAX7311_INPUT_PORT1				0&lt;br /&gt;
#define MAX7311_INPUT_PORT2				1&lt;br /&gt;
#define MAX7311_OUTPUT_PORT1			2&lt;br /&gt;
#define MAX7311_OUTPUT_PORT2			3&lt;br /&gt;
#define MAX7311_PORT1_POL_INV			4&lt;br /&gt;
#define MAX7311_PORT2_POL_INV			5&lt;br /&gt;
#define MAX7311_PORT1_CONFIG			6&lt;br /&gt;
#define MAX7311_PORT2_CONFIG			7&lt;br /&gt;
#define MAX7311_TIMEOUT					8&lt;br /&gt;
&lt;br /&gt;
// Port 1 configuration register bitmasks:&lt;br /&gt;
#define ST_GYRO							(1 &amp;lt;&amp;lt; PIN7)	// I/O 0.7 (Output)&lt;br /&gt;
#define PD_GYRO							(1 &amp;lt;&amp;lt; PIN6)	// I/O 0.6 (Output)&lt;br /&gt;
#define PWR_CAM_IF						(1 &amp;lt;&amp;lt; PIN5)	// I/O 0.5 (Output)&lt;br /&gt;
#define EN_LEDDRIV						(1 &amp;lt;&amp;lt; PIN4)	// I/O 0.4 (Output)&lt;br /&gt;
#define RDY_BUSBUFF						(1 &amp;lt;&amp;lt; PIN3)	// I/O 0.3 (Input)&lt;br /&gt;
#define PWR_SHARP_R						(1 &amp;lt;&amp;lt; PIN2)	// I/O 0.2 (Output)&lt;br /&gt;
#define PWR_SHARP_F						(1 &amp;lt;&amp;lt; PIN1)	// I/O 0.1 (Output)&lt;br /&gt;
#define PWR_I2C							(1 &amp;lt;&amp;lt; PIN0)	// I/O 0.0 (Output)&lt;br /&gt;
&lt;br /&gt;
// Port 2 configuration register bitmasks:&lt;br /&gt;
#define IO2_I2C							(1 &amp;lt;&amp;lt; PIN7)	// I/O 1.7 (Input)&lt;br /&gt;
#define IO1_I2C							(1 &amp;lt;&amp;lt; PIN6)	// I/O 1.6 (Output)&lt;br /&gt;
#define DRDY_MAGACC						(1 &amp;lt;&amp;lt; PIN5)	// I/O 1.5 (Input)&lt;br /&gt;
#define PWR_SERVO						(1 &amp;lt;&amp;lt; PIN4)	// I/O 1.4 (Output)&lt;br /&gt;
#define OEN_SERVO						(1 &amp;lt;&amp;lt; PIN3)	// I/O 1.3 (Output)&lt;br /&gt;
#define IO_K19_1						(1 &amp;lt;&amp;lt; PIN2)	// I/O 1.2 (Input)&lt;br /&gt;
#define IO_K19_3						(1 &amp;lt;&amp;lt; PIN1)	// I/O 1.1 (Input)&lt;br /&gt;
#define EN_BUSBUFF						(1 &amp;lt;&amp;lt; PIN0)	// I/O 1.0 (Output)&lt;br /&gt;
&lt;br /&gt;
// Port 1 &amp;amp; 2 register 16-bit bitmasks:&lt;br /&gt;
// (CONFIG: 1 = Input, 0 = Output)&lt;br /&gt;
#define MAX7311_CONFIG_DEFAULT			0b1010011000001000&lt;br /&gt;
#define MAX7311_CONFIG_USE_PD5			0b1010011100001000&lt;br /&gt;
// (OUTPUT: 1 = High/True, 0 = Low/False)&lt;br /&gt;
#define MAX7311_OUTPUT_DEFAULT			0b0100000100010000&lt;br /&gt;
#define MAX7311_OUTPUT_FULLPOWER		0b0001000100110111&lt;br /&gt;
#define MAX7311_OUTPUT_SHUTDOWN			0b0100100011000000&lt;br /&gt;
&lt;br /&gt;
// Safe configuration:&lt;br /&gt;
// (Ensures if activated, that I/Os 0.3, 1.5 and 1.7 cannot be configured&lt;br /&gt;
//  as output with the function MAX7311_write_cfg(). This may protect the&lt;br /&gt;
//  RP6 Sensor Board from hardware damage.)&lt;br /&gt;
// -------------------&lt;br /&gt;
#define SAFE_CONFIG&lt;br /&gt;
// -------------------&lt;br /&gt;
&lt;br /&gt;
typedef union {&lt;br /&gt;
 	uint8_t byte;&lt;br /&gt;
	struct {&lt;br /&gt;
		unsigned int1   :1;				// INT1  XBUS Pin 8&lt;br /&gt;
		unsigned int2   :1;				// INT2  XBUS Pin 11&lt;br /&gt;
		unsigned int3   :1;				// INT3  XBUS Pin 9&lt;br /&gt;
		unsigned intu   :1;				// INTU  XBUS Pin 7&lt;br /&gt;
		unsigned unused :4;&lt;br /&gt;
	};&lt;br /&gt;
	struct {&lt;br /&gt;
		unsigned magacc1     :1;		// INT1: LSM303DLHC INT1&lt;br /&gt;
		unsigned portexp     :1;		// INT2: MAX7311 INT_N&lt;br /&gt;
		unsigned magacc2_rtc :1;		// INT3: LSM303DLHC INT2&lt;br /&gt;
		unsigned noname      :5;		//       OR DS1339 SQW/INT_N&lt;br /&gt;
	};&lt;br /&gt;
} interrupt_RP6SBstatus_t;&lt;br /&gt;
extern interrupt_RP6SBstatus_t interrupt_RP6SBstatus;&lt;br /&gt;
&lt;br /&gt;
typedef union {&lt;br /&gt;
	uint16_t word;&lt;br /&gt;
	struct {&lt;br /&gt;
		unsigned pwr_i2c     :1;		// I/O 0.0 (Output)&lt;br /&gt;
		unsigned pwr_sharp_f :1;		// I/O 0.1 (Output)&lt;br /&gt;
		unsigned pwr_sharp_r :1;		// I/O 0.2 (Output)&lt;br /&gt;
		unsigned rdy_busbuff :1;		// I/O 0.3 (Input)&lt;br /&gt;
		unsigned en_leddriv  :1;		// I/O 0.4 (Output)&lt;br /&gt;
		unsigned pwr_cam_if  :1;		// I/O 0.5 (Output)&lt;br /&gt;
		unsigned pd_gyro     :1;		// I/O 0.6 (Output)&lt;br /&gt;
		unsigned st_gyro     :1;		// I/O 0.7 (Output)&lt;br /&gt;
		unsigned en_busbuff  :1;		// I/O 1.0 (Output)&lt;br /&gt;
		unsigned io_k19_3    :1;		// I/O 1.1 (Input)&lt;br /&gt;
		unsigned io_k19_1    :1;		// I/O 1.2 (Input)&lt;br /&gt;
		unsigned oen_servo   :1;		// I/O 1.3 (Output)&lt;br /&gt;
		unsigned pwr_servo   :1;		// I/O 1.4 (Output)&lt;br /&gt;
		unsigned drdy_magacc :1;		// I/O 1.5 (Input)&lt;br /&gt;
		unsigned io1_i2c     :1;		// I/O 1.6 (Output)&lt;br /&gt;
		unsigned io2_i2c     :1;		// I/O 1.7 (Input)&lt;br /&gt;
	};&lt;br /&gt;
} max7311IOs_t;&lt;br /&gt;
extern max7311IOs_t inport;&lt;br /&gt;
extern max7311IOs_t outport;&lt;br /&gt;
extern uint8_t readyBusbuff;&lt;br /&gt;
extern uint8_t pressedButton;&lt;br /&gt;
&lt;br /&gt;
void MAX7311_write_cfg(uint16_t);&lt;br /&gt;
void task_checkINTs(void);&lt;br /&gt;
void task_RP6SensorBoard(void);&lt;br /&gt;
void MAX7311_update(void);&lt;br /&gt;
void MAX7311_write(uint16_t);&lt;br /&gt;
void MAX7311_init(void);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Real Time Clock (RTC DS1339):&lt;br /&gt;
&lt;br /&gt;
// Registers:&lt;br /&gt;
#define DS1339_SECONDS					0&lt;br /&gt;
#define DS1339_MINUTES					1&lt;br /&gt;
#define DS1339_HOURS					2&lt;br /&gt;
#define DS1339_DAY						3&lt;br /&gt;
#define DS1339_DATE						4&lt;br /&gt;
#define DS1339_MONTH_CENTURY			5&lt;br /&gt;
#define DS1339_YEAR						6&lt;br /&gt;
#define DS1339_ALARM1_SECONDS			7&lt;br /&gt;
#define DS1339_ALARM1_MINUTES			8&lt;br /&gt;
#define DS1339_ALARM1_HOURS				9&lt;br /&gt;
#define DS1339_ALARM1_DAY_DATE			10&lt;br /&gt;
#define DS1339_ALARM2_MINUTES			11&lt;br /&gt;
#define DS1339_ALARM2_HOURS				12&lt;br /&gt;
#define DS1339_ALARM2_DAY_DATE			13&lt;br /&gt;
#define DS1339_CONTROL					14&lt;br /&gt;
#define DS1339_STATUS					15&lt;br /&gt;
#define DS1339_TRICKLE_CHARGER			16&lt;br /&gt;
&lt;br /&gt;
// Control register bitmasks:&lt;br /&gt;
#define DS1339_CONTROL_DEFAULT			0		// Power on default&lt;br /&gt;
#define DS1339_CONTROL_A1IE				1&lt;br /&gt;
#define DS1339_CONTROL_A2IE				2&lt;br /&gt;
#define DS1339_CONTROL_INTCN			4&lt;br /&gt;
#define DS1339_CONTROL_RS1				8&lt;br /&gt;
#define DS1339_CONTROL_RS2				16&lt;br /&gt;
#define DS1339_CONTROL_BBSQI			32&lt;br /&gt;
#define DS1339_CONTROL_EOSC				128&lt;br /&gt;
&lt;br /&gt;
// Trickle Charger register bitmasks:&lt;br /&gt;
#define DS1339_TRICKLE_CHARGER_DEFAULT	0b10101010 // One diode, 2k resistor&lt;br /&gt;
#define DS1339_TRICKLE_CHARGER_ROUT0	1&lt;br /&gt;
#define DS1339_TRICKLE_CHARGER_ROUT1	2&lt;br /&gt;
#define DS1339_TRICKLE_CHARGER_DS0		4&lt;br /&gt;
#define DS1339_TRICKLE_CHARGER_DS1		8&lt;br /&gt;
#define DS1339_TRICKLE_CHARGER_TCS0		16&lt;br /&gt;
#define DS1339_TRICKLE_CHARGER_TCS1		32&lt;br /&gt;
#define DS1339_TRICKLE_CHARGER_TCS2		64&lt;br /&gt;
#define DS1339_TRICKLE_CHARGER_TCS3		128&lt;br /&gt;
&lt;br /&gt;
enum RTCWEEKDAYS {&lt;br /&gt;
	R_MO = 1, R_TU, R_WE, R_TH, R_FR, R_SA, R_SU&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
typedef struct {&lt;br /&gt;
	uint16_t         year;				// Year&lt;br /&gt;
	uint8_t          month;				// Month   [1..12]&lt;br /&gt;
	enum RTCWEEKDAYS weekday;			// Weekday [1..7 = R_MO..R_SU]&lt;br /&gt;
	uint8_t          day;				// Day     [1..31]&lt;br /&gt;
} rtcdate_t;&lt;br /&gt;
rtcdate_t rtc_date;&lt;br /&gt;
&lt;br /&gt;
typedef struct {&lt;br /&gt;
	uint8_t dst;						// Daylight-saving-time (time zone)&lt;br /&gt;
	uint8_t hour;						// Hour    [0..23]&lt;br /&gt;
	uint8_t minute;						// Minute  [0..59]&lt;br /&gt;
	uint8_t second;						// Second  [0..59]&lt;br /&gt;
} rtctime_t;&lt;br /&gt;
rtctime_t rtc_time;&lt;br /&gt;
&lt;br /&gt;
uint8_t BCD2DEC(uint8_t);&lt;br /&gt;
uint8_t DEC2BCD(uint8_t);&lt;br /&gt;
void DS1339_write_cfg(uint8_t);&lt;br /&gt;
void DS1339_init(void);&lt;br /&gt;
#define CALC_DST						// Time zone will be calculated&lt;br /&gt;
void DS1339_read(void);&lt;br /&gt;
void DS1339_write(void);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Temperature Sensor (LM75B):&lt;br /&gt;
&lt;br /&gt;
// Registers:&lt;br /&gt;
#define LM75B_TEMP						0&lt;br /&gt;
#define LM75B_CONF						1&lt;br /&gt;
#define LM75B_THYST						2&lt;br /&gt;
#define LM75B_TOS						3&lt;br /&gt;
&lt;br /&gt;
// Conf register bitmasks:&lt;br /&gt;
#define LM75B_CONF_DEFAULT				0		// Power on default&lt;br /&gt;
#define LM75B_CONF_SHUTDOWN				1&lt;br /&gt;
#define LM75B_CONF_OS_COMP_INT			2&lt;br /&gt;
#define LM75B_CONF_OS_POL				4&lt;br /&gt;
#define LM75B_CONF_OS_F_QUE0			8&lt;br /&gt;
#define LM75B_CONF_OS_F_QUE1			16&lt;br /&gt;
&lt;br /&gt;
extern double temperature;&lt;br /&gt;
&lt;br /&gt;
void LM75B_write_cfg(uint8_t);&lt;br /&gt;
#define LM75B_shutdown() {LM75B_write_cfg(LM75B_CONF_SHUTDOWN);}&lt;br /&gt;
#define LM75B_init() {LM75B_write_cfg(LM75B_CONF_DEFAULT);}&lt;br /&gt;
extern uint8_t temperature_low;&lt;br /&gt;
extern uint8_t temperature_high;&lt;br /&gt;
#define getTemperatureHigh() (temperature_high)&lt;br /&gt;
#define getTemperatureLow() (temperature_low)&lt;br /&gt;
void LM75B_read(void);&lt;br /&gt;
double LM75B_calculate(void);&lt;br /&gt;
double LM75B_measure(void);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Servo Controller (PCA9685):&lt;br /&gt;
&lt;br /&gt;
// Registers:&lt;br /&gt;
#define PCA9685_MODE1					0&lt;br /&gt;
#define PCA9685_MODE2					1&lt;br /&gt;
#define PCA9685_SUBADR1					2&lt;br /&gt;
#define PCA9685_SUBADR2					3&lt;br /&gt;
#define PCA9685_SUBADR3					4&lt;br /&gt;
#define PCA9685_ALLCALLADR				5&lt;br /&gt;
#define PCA9685_LED0_ON_L				6&lt;br /&gt;
#define PCA9685_LED0_ON_H				7&lt;br /&gt;
#define PCA9685_LED0_OFF_L				8&lt;br /&gt;
#define PCA9685_LED0_OFF_H				9&lt;br /&gt;
#define PCA9685_LED1_ON_L				10&lt;br /&gt;
#define PCA9685_LED1_ON_H				11&lt;br /&gt;
#define PCA9685_LED1_OFF_L				12&lt;br /&gt;
#define PCA9685_LED1_OFF_H				13&lt;br /&gt;
#define PCA9685_LED2_ON_L				14&lt;br /&gt;
#define PCA9685_LED2_ON_H				15&lt;br /&gt;
#define PCA9685_LED2_OFF_L				16&lt;br /&gt;
#define PCA9685_LED2_OFF_H				17&lt;br /&gt;
#define PCA9685_LED3_ON_L				18&lt;br /&gt;
#define PCA9685_LED3_ON_H				19&lt;br /&gt;
#define PCA9685_LED3_OFF_L				20&lt;br /&gt;
#define PCA9685_LED3_OFF_H				21&lt;br /&gt;
#define PCA9685_LED4_ON_L				22&lt;br /&gt;
#define PCA9685_LED4_ON_H				23&lt;br /&gt;
#define PCA9685_LED4_OFF_L				24&lt;br /&gt;
#define PCA9685_LED4_OFF_H				25&lt;br /&gt;
#define PCA9685_LED5_ON_L				26&lt;br /&gt;
#define PCA9685_LED5_ON_H				27&lt;br /&gt;
#define PCA9685_LED5_OFF_L				28&lt;br /&gt;
#define PCA9685_LED5_OFF_H				29&lt;br /&gt;
#define PCA9685_LED6_ON_L				30&lt;br /&gt;
#define PCA9685_LED6_ON_H				31&lt;br /&gt;
#define PCA9685_LED6_OFF_L				32&lt;br /&gt;
#define PCA9685_LED6_OFF_H				33&lt;br /&gt;
#define PCA9685_LED7_ON_L				34&lt;br /&gt;
#define PCA9685_LED7_ON_H				35&lt;br /&gt;
#define PCA9685_LED7_OFF_L				36&lt;br /&gt;
#define PCA9685_LED7_OFF_H				37&lt;br /&gt;
#define PCA9685_LED8_ON_L				38&lt;br /&gt;
#define PCA9685_LED8_ON_H				39&lt;br /&gt;
#define PCA9685_LED8_OFF_L				40&lt;br /&gt;
#define PCA9685_LED8_OFF_H				41&lt;br /&gt;
#define PCA9685_LED9_ON_L				42&lt;br /&gt;
#define PCA9685_LED9_ON_H				43&lt;br /&gt;
#define PCA9685_LED9_OFF_L				44&lt;br /&gt;
#define PCA9685_LED9_OFF_H				45&lt;br /&gt;
#define PCA9685_LED10_ON_L				46&lt;br /&gt;
#define PCA9685_LED10_ON_H				47&lt;br /&gt;
#define PCA9685_LED10_OFF_L				48&lt;br /&gt;
#define PCA9685_LED10_OFF_H				49&lt;br /&gt;
#define PCA9685_LED11_ON_L				50&lt;br /&gt;
#define PCA9685_LED11_ON_H				51&lt;br /&gt;
#define PCA9685_LED11_OFF_L				52&lt;br /&gt;
#define PCA9685_LED11_OFF_H				53&lt;br /&gt;
#define PCA9685_LED12_ON_L				54&lt;br /&gt;
#define PCA9685_LED12_ON_H				55&lt;br /&gt;
#define PCA9685_LED12_OFF_L				56&lt;br /&gt;
#define PCA9685_LED12_OFF_H				57&lt;br /&gt;
#define PCA9685_LED13_ON_L				58&lt;br /&gt;
#define PCA9685_LED13_ON_H				59&lt;br /&gt;
#define PCA9685_LED13_OFF_L				60&lt;br /&gt;
#define PCA9685_LED13_OFF_H				61&lt;br /&gt;
#define PCA9685_LED14_ON_L				62&lt;br /&gt;
#define PCA9685_LED14_ON_H				63&lt;br /&gt;
#define PCA9685_LED14_OFF_L				64&lt;br /&gt;
#define PCA9685_LED14_OFF_H				65&lt;br /&gt;
#define PCA9685_LED15_ON_L				66&lt;br /&gt;
#define PCA9685_LED15_ON_H				67&lt;br /&gt;
#define PCA9685_LED15_OFF_L				68&lt;br /&gt;
#define PCA9685_LED15_OFF_H				69&lt;br /&gt;
#define PCA9685_ALL_LED_ON_L			250&lt;br /&gt;
#define PCA9685_ALL_LED_ON_H			251&lt;br /&gt;
#define PCA9685_ALL_LED_OFF_L			252&lt;br /&gt;
#define PCA9685_ALL_LED_OFF_H			253&lt;br /&gt;
#define PCA9685_PRE_SCALE				254&lt;br /&gt;
#define PCA9685_TESTMODE				255&lt;br /&gt;
&lt;br /&gt;
// Mode1 register bitmasks:&lt;br /&gt;
#define PCA9685_MODE1_ALLCALL			1&lt;br /&gt;
#define PCA9685_MODE1_SUB3				2&lt;br /&gt;
#define PCA9685_MODE1_SUB2				4&lt;br /&gt;
#define PCA9685_MODE1_SUB1				8&lt;br /&gt;
#define PCA9685_MODE1_SLEEP				16&lt;br /&gt;
#define PCA9685_MODE1_AI				32&lt;br /&gt;
#define PCA9685_MODE1_EXTCLK			64&lt;br /&gt;
#define PCA9685_MODE1_RESTART			128&lt;br /&gt;
&lt;br /&gt;
// Mode2 register bitmasks:&lt;br /&gt;
#define PCA9685_MODE2_OUTNE01_DEFAULT	0&lt;br /&gt;
#define PCA9685_MODE2_OUTDRV			4&lt;br /&gt;
#define PCA9685_MODE2_OCH				8&lt;br /&gt;
#define PCA9685_MODE2_INVRT				16&lt;br /&gt;
&lt;br /&gt;
#define F_PCA9685						25000000.0	// Int. Clock: 25 MHz&lt;br /&gt;
&lt;br /&gt;
void PCA9685_init(uint16_t);&lt;br /&gt;
#define initServo(__FREQ__) {PCA9685_init(__FREQ__);}&lt;br /&gt;
uint8_t servo(uint8_t);&lt;br /&gt;
void PCA9685_set(uint8_t, uint16_t);&lt;br /&gt;
#define setServo(__SERVO__,__POS__) {PCA9685_set(servo(__SERVO__),__POS__);}&lt;br /&gt;
void PCA9685_shutdown(void);&lt;br /&gt;
void PCA9685_restart(void);&lt;br /&gt;
void setServoPower(uint8_t);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C LED Driver (TCA6507):&lt;br /&gt;
&lt;br /&gt;
// Registers:&lt;br /&gt;
#define TCA6507_SELECT0				0&lt;br /&gt;
#define TCA6507_SELECT1				1&lt;br /&gt;
#define TCA6507_SELECT2				2&lt;br /&gt;
#define TCA6507_FADEON_TIME			3&lt;br /&gt;
#define TCA6507_FULLYON_TIME		4&lt;br /&gt;
#define TCA6507_FADEOFF_TIME		5&lt;br /&gt;
#define TCA6507_1ST_FULLYOFF_TIME	6&lt;br /&gt;
#define TCA6507_2ND_FULLYOFF_TIME	7&lt;br /&gt;
#define TCA6507_MAXIMUM_INTENSITY	8&lt;br /&gt;
#define TCA6507_MASTER_INTENSITY	9&lt;br /&gt;
#define TCA6507_INITIALIZATION		10&lt;br /&gt;
&lt;br /&gt;
// Output states:&lt;br /&gt;
#define STATE_OFF					0&lt;br /&gt;
#define STATE_PWM0					2&lt;br /&gt;
#define STATE_PWM1					3&lt;br /&gt;
#define STATE_ON					4&lt;br /&gt;
#define STATE_MINT					5&lt;br /&gt;
#define STATE_BLINK0				6&lt;br /&gt;
#define STATE_BLINK1				7&lt;br /&gt;
&lt;br /&gt;
extern uint8_t select[3];&lt;br /&gt;
&lt;br /&gt;
void TCA6507_write_cfg(uint8_t, uint8_t);&lt;br /&gt;
void TCA6507_update(void);&lt;br /&gt;
void TCA6507_set(uint8_t, uint8_t);&lt;br /&gt;
#define setLED(__LED__,__STATE__) {TCA6507_set(__LED__,__STATE__);}&lt;br /&gt;
void TCA6507_shutdown(void);&lt;br /&gt;
void TCA6507_restart(void);&lt;br /&gt;
void TCA6507_init(void);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C 3D Magnetometer &amp;amp; Accelerometer (LSM303DLHC):&lt;br /&gt;
&lt;br /&gt;
// LSM303DLHC accelerometer internal registers:&lt;br /&gt;
#define CTRL_REG1_A					0x20&lt;br /&gt;
#define CTRL_REG2_A					0x21&lt;br /&gt;
#define CTRL_REG3_A					0x22&lt;br /&gt;
#define CTRL_REG4_A					0x23&lt;br /&gt;
#define CTRL_REG5_A					0x24&lt;br /&gt;
#define CTRL_REG6_A					0x25&lt;br /&gt;
#define REFERENCE_A					0x26&lt;br /&gt;
#define STATUS_REG_A				0x27&lt;br /&gt;
#define OUT_X_L_A					0x28&lt;br /&gt;
#define OUT_X_H_A					0x29&lt;br /&gt;
#define OUT_Y_L_A					0x2a&lt;br /&gt;
#define OUT_Y_H_A					0x2b&lt;br /&gt;
#define OUT_Z_L_A					0x2c&lt;br /&gt;
#define OUT_Z_H_A					0x2d&lt;br /&gt;
#define FIFO_CTRL_REG_A				0x2e&lt;br /&gt;
#define FIFO_SRC_REG_A				0x2f&lt;br /&gt;
#define INT1_CFG_A					0x30&lt;br /&gt;
#define INT1_SOURCE_A				0x31&lt;br /&gt;
#define INT1_THS_A					0x32&lt;br /&gt;
#define INT1_DURATION_A				0x33&lt;br /&gt;
#define INT2_CFG_A					0x34&lt;br /&gt;
#define INT2_SOURCE_A				0x35&lt;br /&gt;
#define INT2_THS_A					0x36&lt;br /&gt;
#define INT2_DURATION_A				0x37&lt;br /&gt;
#define CLICK_CFG_A					0x38&lt;br /&gt;
#define CLICK_SRC_A					0x39&lt;br /&gt;
#define CLICK_THS_A					0x3a&lt;br /&gt;
#define TIME_LIMIT_A				0x3b&lt;br /&gt;
#define TIME_LATENCY_A				0x3c&lt;br /&gt;
#define TIME_WINDOW_A				0x3d&lt;br /&gt;
&lt;br /&gt;
// LSM303DLHC accelerometer register settings:&lt;br /&gt;
#define CTRL_REG1_A_10HZ			0b00100111	// 10Hz &amp;amp; all axes enable&lt;br /&gt;
#define CTRL_REG1_A_50HZ			0b01000111	// 50Hz &amp;amp; all axes enable&lt;br /&gt;
#define CTRL_REG4_A_DEFAULT			0b00000000	// Default (Normal mode)&lt;br /&gt;
#define CTRL_REG4_A_HR				0b00001000	// HR output mode&lt;br /&gt;
&lt;br /&gt;
// LSM303DLHC magnetometer internal registers:&lt;br /&gt;
#define CRA_REG_M					0x00&lt;br /&gt;
#define CRB_REG_M					0x01&lt;br /&gt;
#define MR_REG_M					0x02&lt;br /&gt;
#define OUT_X_H_M					0x03&lt;br /&gt;
#define OUT_X_L_M					0x04&lt;br /&gt;
#define OUT_Z_H_M					0x05&lt;br /&gt;
#define OUT_Z_L_M					0x06&lt;br /&gt;
#define OUT_Y_H_M					0x07&lt;br /&gt;
#define OUT_Y_L_M					0x08&lt;br /&gt;
#define SR_REG_MG					0x09&lt;br /&gt;
#define IRA_REG_M					0x0a&lt;br /&gt;
#define IRB_REG_M					0x0b&lt;br /&gt;
#define IRC_REG_M					0x0c&lt;br /&gt;
#define TEMP_OUT_H_M				0x31&lt;br /&gt;
#define TEMP_OUT_L_M				0x32&lt;br /&gt;
&lt;br /&gt;
// LSM303DLHC magnetometer register settings:&lt;br /&gt;
#define CRA_REG_M_15HZ				0b00010000	// Default (Data rate 15Hz)&lt;br /&gt;
#define CRA_REG_M_15HZ_T_EN			0b10010000	// 15Hz &amp;amp; temperature enable&lt;br /&gt;
#define CRB_REG_M_13GAUSS			0b00100000	// Gain +-1.3Gauss&lt;br /&gt;
#define MR_REG_M_CCM				0b00000000	// Continuous-conversion mode&lt;br /&gt;
#define MR_REG_M_SCM				0b00000001	// Single-conversion mode&lt;br /&gt;
#define MR_REG_M_SLEEP				0b00000011	// Default (Sleep-mode)&lt;br /&gt;
&lt;br /&gt;
extern int16_t x_axisa, y_axisa, z_axisa;&lt;br /&gt;
extern double pitch, roll;&lt;br /&gt;
extern double xa, ya, za;&lt;br /&gt;
extern double the, phi;&lt;br /&gt;
&lt;br /&gt;
extern int16_t x_axism, y_axism, z_axism;&lt;br /&gt;
extern int16_t headingm;&lt;br /&gt;
extern double xm, ym, zm;&lt;br /&gt;
#ifdef GET_TEMP_M&lt;br /&gt;
extern int16_t temperaturem;&lt;br /&gt;
extern double temperature_mag;&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
extern int16_t headingtc;&lt;br /&gt;
&lt;br /&gt;
void LSM303DLHC_A_init(void);&lt;br /&gt;
void readLSM303DLHC_A(void);&lt;br /&gt;
void normalizeLSM303DLHC_A(void);&lt;br /&gt;
void positionLSM303DLHC_A(void);&lt;br /&gt;
&lt;br /&gt;
void LSM303DLHC_M_init(void);&lt;br /&gt;
void readLSM303DLHC_M(void);&lt;br /&gt;
void normalizeLSM303DLHC_M(void);&lt;br /&gt;
int16_t headingLSM303DLHC_M(void);&lt;br /&gt;
&lt;br /&gt;
int16_t headingLSM303DLHC_TC(void);&lt;br /&gt;
&lt;br /&gt;
void LSM303DLHC_init(void);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Analog Yaw-Rate Gyroscope (LY330ALH):&lt;br /&gt;
&lt;br /&gt;
#define LY330ALH_MODE_NORMAL		0			// Power on default&lt;br /&gt;
#define LY330ALH_MODE_SLEEP			1&lt;br /&gt;
#define LY330ALH_MODE_SELFTEST		2&lt;br /&gt;
#define LY330ALH_MODE_POWERDOWN		3			// Shutdown mode&lt;br /&gt;
&lt;br /&gt;
extern int16_t z_axisg;&lt;br /&gt;
&lt;br /&gt;
void LY330ALH_set_mode(uint8_t);&lt;br /&gt;
uint16_t getRP6Base_ADC1(void);&lt;br /&gt;
int16_t LY330ALH_measure(void);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Hot Swappable 2-Wire Bus Buffer (TCA4311A):&lt;br /&gt;
&lt;br /&gt;
//extern uint8_t readyBusbuff;			// See &amp;quot;I2C I/O Port Expander&amp;quot; section&lt;br /&gt;
extern uint8_t errorBusbuff;&lt;br /&gt;
&lt;br /&gt;
#define getReadyBusbuff() (readyBusbuff)&lt;br /&gt;
uint8_t readReadyBusbuff(void);&lt;br /&gt;
void TCA4311A_shutdown(void);&lt;br /&gt;
void TCA4311A_reconnect(void);&lt;br /&gt;
void setRP6Base_PWR(uint8_t);&lt;br /&gt;
void setI2CModulePower(uint8_t);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Button:&lt;br /&gt;
&lt;br /&gt;
//extern uint8_t pressedButton;			// See &amp;quot;I2C I/O Port Expander&amp;quot; section&lt;br /&gt;
&lt;br /&gt;
#define getPressedButton() (pressedButton)&lt;br /&gt;
uint8_t readButton(void);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Status LED:&lt;br /&gt;
&lt;br /&gt;
void setStatusLED(uint8_t);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// RP6 Sensor Board initialisation and shutdown:&lt;br /&gt;
&lt;br /&gt;
void sensor_board_init(void);&lt;br /&gt;
void sensor_board_shutdown(void);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
/******************************************************************************&lt;br /&gt;
 * Additional info&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Changelog:&lt;br /&gt;
 * &lt;br /&gt;
 *  ---&amp;gt; changes are documented in the file &amp;quot;RP6M256_Sensor_BoardLib.c&amp;quot;&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=====Library Source=====&lt;br /&gt;
Datei: RP6M256_Sensor_BoardLib.c&lt;br /&gt;
&amp;lt;pre&amp;gt;/* ****************************************************************************&lt;br /&gt;
 *                           _______________________&lt;br /&gt;
 *                           \| RP6  ROBOT SYSTEM |/&lt;br /&gt;
 *                            \_-_-_-_-_-_-_-_-_-_/           &amp;gt;&amp;gt;&amp;gt; RP6 M256 WIFI&lt;br /&gt;
 * ----------------------------------------------------------------------------&lt;br /&gt;
 * ----------------------------- [c]2014 - Dirk -------------------------------&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * File: RP6M256_Sensor_BoardLib.c&lt;br /&gt;
 * Version: 1.0&lt;br /&gt;
 * Target: RP6 M256 WIFI - ATMEGA2560 @16.00MHz&lt;br /&gt;
 *         and a RP6 Sensor Board (CONRAD 1082384)&lt;br /&gt;
 * Author(s): Dirk&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Description:&lt;br /&gt;
 * This is our new Library that contains basic routines and functions for&lt;br /&gt;
 * accessing the hardwired components of the RP6 Sensor Board (CONRAD 1082384).&lt;br /&gt;
 * This library assumes the RP6 Sensor Board Revision 2.0 (04.07.13).&lt;br /&gt;
 *&lt;br /&gt;
 * There are more sensors and actors, that may be connected to the RP6 Sensor&lt;br /&gt;
 * Board: Many I2C components including a GPS module (CONRAD 1082385), servo&lt;br /&gt;
 *        motors, SHARP IR distance sensors, LEDs, a camera ...&lt;br /&gt;
 * This library doesn't contain functions for these sensors/actors, because&lt;br /&gt;
 * they are not HARDWIRED to the RP6 Sensor Board and may be connected&lt;br /&gt;
 * OPTIONALLY.&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// RP6 Sensor Board hardwired components:&lt;br /&gt;
// - I2C I/O Port Expander (MAX7311)&lt;br /&gt;
// - I2C Real Time Clock (RTC DS1339)&lt;br /&gt;
// - I2C Temperature Sensor (LM75B)&lt;br /&gt;
// - I2C Servo Controller (PCA9685)&lt;br /&gt;
// - I2C LED Driver (TCA6507)&lt;br /&gt;
// - I2C 3D Magnetometer &amp;amp; Accelerometer (LSM303DLHC)&lt;br /&gt;
// - Analog Yaw-Rate Gyroscope (LY330ALH)&lt;br /&gt;
// - Hot Swappable 2-Wire Bus Buffer (TCA4311A)&lt;br /&gt;
// - Button&lt;br /&gt;
// - Status LED&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Includes:&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6M256_Sensor_BoardLib.h&amp;quot; 		&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Variables:&lt;br /&gt;
&lt;br /&gt;
uint8_t registerBuf[13]; &lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C I/O Port Expander (MAX7311):&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Sends the configuration word to a MAX7311.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: config -&amp;gt; Config word for control&lt;br /&gt;
 *                  registers&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void MAX7311_write_cfg(uint16_t config)&lt;br /&gt;
{&lt;br /&gt;
#ifdef SAFE_CONFIG&lt;br /&gt;
	config |= 0b1010000000001000;&lt;br /&gt;
#endif&lt;br /&gt;
	I2CTWI_transmit3Bytes(I2C_SENSOR_PORTEXP_ADR, MAX7311_PORT1_CONFIG, config, (config&amp;gt;&amp;gt;8));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
interrupt_RP6SBstatus_t interrupt_RP6SBstatus;&lt;br /&gt;
&lt;br /&gt;
/** &lt;br /&gt;
 * This function checks all interrupt pins on&lt;br /&gt;
 * the XBUS (INT1..3, INTU).&lt;br /&gt;
 * This function must be called VERY frequently&lt;br /&gt;
 * out of the main loop.&lt;br /&gt;
 * Bigger delays result in slower reaction to&lt;br /&gt;
 * interrupt requests of the RP6 Sensor Board.&lt;br /&gt;
 * Interrupt function table:&lt;br /&gt;
 *   Int. : Function 1      IRQ  Function 2       IRQ&lt;br /&gt;
 *   -------------------------------------------------&lt;br /&gt;
 *   INT1 : LSM303DLHC INT1  H&lt;br /&gt;
 *   INT2 : MAX7311   INT_N  L&lt;br /&gt;
 *   INT3 : LSM303DLHC INT2  H   DS1339 SQW/INT_N  L&lt;br /&gt;
 *   INTU : not used&lt;br /&gt;
 * You can see in the &amp;quot;IRQ&amp;quot; column, which level&lt;br /&gt;
 * (H/L) means an ACTIVE INTERRUPT signal.&lt;br /&gt;
 * The interrupt pin levels (H=true/L=false) are&lt;br /&gt;
 * read into the global interrupt_RP6SBstatus&lt;br /&gt;
 * variable.&lt;br /&gt;
 *&lt;br /&gt;
 * Hints: - This function checks the interrupt&lt;br /&gt;
 *          signals by polling. This is NOT the&lt;br /&gt;
 *          best way to to this job. You will&lt;br /&gt;
 *          have to write your own task, if you&lt;br /&gt;
 *          want to use the Pin Change Interrupt&lt;br /&gt;
 *          function of the ATmega2560&lt;br /&gt;
 *          microcontroller.&lt;br /&gt;
 *        - You cannot use both interrupt sources&lt;br /&gt;
 *          for INT3! So you should not use INT2&lt;br /&gt;
 *          of the LSM303DLHC together with the&lt;br /&gt;
 *          alarm function of the DS1339 (RTC)!&lt;br /&gt;
 *        - Every interrupt signal of the Sensor&lt;br /&gt;
 *          Board may be cut off from the XBUS&lt;br /&gt;
 *          by opening a jumper (Jx):&lt;br /&gt;
 *          INT1 -&amp;gt; J3 (LSM303DLHC INT1)&lt;br /&gt;
 *          INT2 -&amp;gt; J4 (MAX7311 INT_N)&lt;br /&gt;
 *          INT3 -&amp;gt; J2 (DS1339 SQW/INT_N)&lt;br /&gt;
 *          INT3 -&amp;gt; J5 (LSM303DLHC INT2)&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *&lt;br /&gt;
 *   if (!interrupt_RP6SBstatus.portexp)&lt;br /&gt;
 *        writeString_P(&amp;quot;==&amp;gt; MAX7311 INT_N!!!&amp;quot;);&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void task_checkINTs(void)&lt;br /&gt;
{&lt;br /&gt;
	if(IO_SENSOR_INT1_PIN &amp;amp; IO_SENSOR_INT1_IN)	// XBUS INT1 -&amp;gt; PJ3 (PCINT12)&lt;br /&gt;
		interrupt_RP6SBstatus.int1 = true;&lt;br /&gt;
	else&lt;br /&gt;
		interrupt_RP6SBstatus.int1 = false;&lt;br /&gt;
	if(IO_SENSOR_INT2_PIN &amp;amp; IO_SENSOR_INT2_IN)	// XBUS INT2 -&amp;gt; PJ6 (PCINT15)&lt;br /&gt;
		interrupt_RP6SBstatus.int2 = true;&lt;br /&gt;
	else&lt;br /&gt;
		interrupt_RP6SBstatus.int2 = false;&lt;br /&gt;
	if(IO_SENSOR_INT3_PIN &amp;amp; IO_SENSOR_INT3_IN)	// XBUS INT3 -&amp;gt; PJ5 (PCINT14)&lt;br /&gt;
		interrupt_RP6SBstatus.int3 = true;&lt;br /&gt;
	else&lt;br /&gt;
		interrupt_RP6SBstatus.int3 = false;&lt;br /&gt;
//	if(IO_SENSOR_INTU_PIN &amp;amp; IO_SENSOR_INTU_IN)	// XBUS INTU -&amp;gt; PJ4 (PCINT13)&lt;br /&gt;
//		interrupt_RP6SBstatus.intu = true;&lt;br /&gt;
//	else&lt;br /&gt;
//		interrupt_RP6SBstatus.intu = false;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
max7311IOs_t inport;&lt;br /&gt;
uint8_t readyBusbuff;&lt;br /&gt;
uint8_t pressedButton;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function checks all I/O ports (I/O 0.0..1.7)&lt;br /&gt;
 * of the MAX7311 sequentially!&lt;br /&gt;
 * You must call this function frequently out of&lt;br /&gt;
 * the main loop.&lt;br /&gt;
 * The I/O port values (true/false) are read into&lt;br /&gt;
 * the global inport variable.&lt;br /&gt;
 * The global variables readyBusbuff (2-Wire Bus&lt;br /&gt;
 * Buffer: Enable) and pressedButton (Button S1:&lt;br /&gt;
 * Pressed) contain actual values (true/false)&lt;br /&gt;
 * after execution of this task.&lt;br /&gt;
 *&lt;br /&gt;
 * Examples:&lt;br /&gt;
 *&lt;br /&gt;
 *   if (inport.rdy_busbuff)&lt;br /&gt;
 *        writeString_P(&amp;quot;I/O 0.3: High&amp;quot;);&lt;br /&gt;
 *   else writeString_P(&amp;quot;I/O 0.3: Low&amp;quot;);&lt;br /&gt;
 *   if (!inport.drdy_magacc)&lt;br /&gt;
 *        writeString_P(&amp;quot;I/O 1.5: Low&amp;quot;);&lt;br /&gt;
 *   if (pressedButton)&lt;br /&gt;
 *        writeString_P(&amp;quot;Button pressed!&amp;quot;);&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void task_RP6SensorBoard(void)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmitByte(I2C_SENSOR_PORTEXP_ADR, MAX7311_INPUT_PORT1);&lt;br /&gt;
	I2CTWI_readBytes(I2C_SENSOR_PORTEXP_ADR, registerBuf, 2);&lt;br /&gt;
	inport.word = (registerBuf[1] &amp;lt;&amp;lt; 8) + registerBuf[0];&lt;br /&gt;
	readyBusbuff = inport.rdy_busbuff;&lt;br /&gt;
	pressedButton = inport.io2_i2c;&lt;br /&gt;
	pressedButton = !pressedButton;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
max7311IOs_t outport;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Updates the I/O ports with current value from&lt;br /&gt;
 * the global outport variable!&lt;br /&gt;
 * If one or more port pins were configured as&lt;br /&gt;
 * output before, they will be set (high) or&lt;br /&gt;
 * cleared (low).&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *&lt;br /&gt;
 *   outport.word = 0b0000000000001001;&lt;br /&gt;
 *   MAX7311_update();&lt;br /&gt;
 *   // This clears all I/O ports and sets&lt;br /&gt;
 *   // the ports I/O 0.0 and I/O 0.3!&lt;br /&gt;
 *&lt;br /&gt;
 *   // Other possibility:&lt;br /&gt;
 *   outport.pwr_sharp_f = true;&lt;br /&gt;
 *   MAX7311_update();&lt;br /&gt;
 *   // This sets I/O 0.1 and does not&lt;br /&gt;
 *   // affect any other I/O port!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void MAX7311_update(void)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmit3Bytes(I2C_SENSOR_PORTEXP_ADR, MAX7311_OUTPUT_PORT1, outport.word, (outport.word&amp;gt;&amp;gt;8));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Writes the 16-bit data to a MAX7311.&lt;br /&gt;
 * The data are output with those I/O ports that&lt;br /&gt;
 * were configured as output before.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: data -&amp;gt; Data word&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void MAX7311_write(uint16_t data)&lt;br /&gt;
{&lt;br /&gt;
	outport.word = data;&lt;br /&gt;
	MAX7311_update();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Initializes the I/O Port Expander after power&lt;br /&gt;
 * on.&lt;br /&gt;
 *&lt;br /&gt;
 * Hint: If USE_PD5 is defined in the&lt;br /&gt;
 *       configuration header file, this&lt;br /&gt;
 *       function uses the RP6M256 portpin,&lt;br /&gt;
 *       that is connected to plug I/O: Pin 9&lt;br /&gt;
 *       instead of MAX7311 I/O 1.0!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void MAX7311_init(void)&lt;br /&gt;
{&lt;br /&gt;
#ifdef USE_PD5&lt;br /&gt;
	MAX7311_write_cfg(MAX7311_CONFIG_USE_PD5);&lt;br /&gt;
	IO_SENSOR_TCA4311A_EN_DDR |= IO_SENSOR_TCA4311A_EN_IN;		// Output&lt;br /&gt;
	IO_SENSOR_TCA4311A_EN_PORT |= IO_SENSOR_TCA4311A_EN_IN;		// High&lt;br /&gt;
#else&lt;br /&gt;
	MAX7311_write_cfg(MAX7311_CONFIG_DEFAULT);&lt;br /&gt;
#endif&lt;br /&gt;
	MAX7311_write(MAX7311_OUTPUT_DEFAULT);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Real Time Clock (RTC DS1339):&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function converts a BCD to a DEC value.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
uint8_t BCD2DEC(uint8_t bcd)&lt;br /&gt;
{&lt;br /&gt;
	return ((bcd &amp;gt;&amp;gt; 4) * 10 + (bcd &amp;amp; 0x0f));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function converts a DEC to a BCD value.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
uint8_t DEC2BCD(uint8_t dec)&lt;br /&gt;
{uint8_t units = dec % 10;&lt;br /&gt;
	if (dec /= 10) {&lt;br /&gt;
		return (units + (DEC2BCD(dec) &amp;lt;&amp;lt; 4));&lt;br /&gt;
	}&lt;br /&gt;
	else {&lt;br /&gt;
		return units;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Sends the configuration byte to a DS1339.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: Config byte for control register&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void DS1339_write_cfg(uint8_t config)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_RTC_ADR, DS1339_CONTROL, config);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Initializes the DS1339 Trickle Charger&lt;br /&gt;
 * function to the default for the RP6 Sensor&lt;br /&gt;
 * Board: One diode and 2kOhm resistor.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void DS1339_init(void)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_RTC_ADR, DS1339_TRICKLE_CHARGER, DS1339_TRICKLE_CHARGER_DEFAULT);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Reads all data registers of the Real Time Clock (RTC).&lt;br /&gt;
 * They are stored in the time &amp;amp; date variables defined in&lt;br /&gt;
 * the library header.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void DS1339_read(void)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmitByte(I2C_SENSOR_RTC_ADR, DS1339_SECONDS);&lt;br /&gt;
	I2CTWI_readBytes(I2C_SENSOR_RTC_ADR, registerBuf, 7);&lt;br /&gt;
	rtc_time.second = BCD2DEC(registerBuf[0]);&lt;br /&gt;
	rtc_time.minute = BCD2DEC(registerBuf[1]);&lt;br /&gt;
	rtc_time.hour = BCD2DEC(registerBuf[2] &amp;amp; 0x3f);&lt;br /&gt;
	rtc_date.weekday = (registerBuf[3] &amp;amp; 0x07);&lt;br /&gt;
	rtc_date.day = BCD2DEC(registerBuf[4]);&lt;br /&gt;
	rtc_date.month = BCD2DEC(registerBuf[5] &amp;amp; 0x7f);&lt;br /&gt;
	if(registerBuf[5] &amp;amp; 0x80) rtc_date.year = 100;&lt;br /&gt;
	else rtc_date.year = 0;&lt;br /&gt;
	rtc_date.year += BCD2DEC(registerBuf[6]);&lt;br /&gt;
	rtc_date.year += 2000;&lt;br /&gt;
	rtc_time.dst = 0;&lt;br /&gt;
#ifdef CALC_DST&lt;br /&gt;
	// Calculate MESZ (DST):&lt;br /&gt;
	uint8_t wday = rtc_date.weekday;			// Weekday [1..7 = R_MO..R_SU]&lt;br /&gt;
	if(wday == 7) wday = 0;&lt;br /&gt;
	if(rtc_date.month &amp;lt; 3 || rtc_date.month &amp;gt; 10) {&lt;br /&gt;
		return;&lt;br /&gt;
	}&lt;br /&gt;
	if((rtc_date.day - wday &amp;gt;= 25)&lt;br /&gt;
	 &amp;amp;&amp;amp; (wday || rtc_time.hour &amp;gt;= 2)) {&lt;br /&gt;
		if(rtc_date.month == 10)&lt;br /&gt;
			return;&lt;br /&gt;
	}&lt;br /&gt;
	else {&lt;br /&gt;
		if(rtc_date.month == 3) {&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	rtc_time.dst = 1;&lt;br /&gt;
#endif&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Writes the time &amp;amp; date infos in the variables defined in&lt;br /&gt;
 * the library header to the Real Time Clock (RTC).&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void DS1339_write(void)&lt;br /&gt;
{&lt;br /&gt;
	registerBuf[0] = DS1339_SECONDS;&lt;br /&gt;
	registerBuf[1] = DEC2BCD(rtc_time.second);&lt;br /&gt;
	registerBuf[2] = DEC2BCD(rtc_time.minute);&lt;br /&gt;
	registerBuf[3] = DEC2BCD(rtc_time.hour);&lt;br /&gt;
	registerBuf[4] = rtc_date.weekday;&lt;br /&gt;
	registerBuf[5] = DEC2BCD(rtc_date.day);&lt;br /&gt;
	registerBuf[6] = DEC2BCD(rtc_date.month);&lt;br /&gt;
	registerBuf[7] = DEC2BCD(rtc_date.year - 2000);&lt;br /&gt;
	I2CTWI_transmitBytes(I2C_SENSOR_RTC_ADR, &amp;amp;registerBuf[0], 8);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Temperature Sensor (LM75B):&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Sends the configuration byte to a LM75B.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: Config byte for Conf register&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void LM75B_write_cfg(uint8_t config)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_TEMP_ADR, LM75B_CONF, config);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
uint8_t temperature_low;&lt;br /&gt;
uint8_t temperature_high;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Reads the two data registers of the temperature&lt;br /&gt;
 * sensor's Temp register.&lt;br /&gt;
 * They are stored in the variables temperature_low&lt;br /&gt;
 * and _high.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void LM75B_read(void)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmitByte(I2C_SENSOR_TEMP_ADR, LM75B_TEMP);&lt;br /&gt;
	I2CTWI_readBytes(I2C_SENSOR_TEMP_ADR, registerBuf, 2);&lt;br /&gt;
	temperature_high = registerBuf[0];&lt;br /&gt;
	temperature_low = registerBuf[1];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
double temperature;						// Temperature [°C]&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Calculates and returns the temperature value&lt;br /&gt;
 * by using the data read from the LM75B with&lt;br /&gt;
 * the function LM75B_read(). The sensor is&lt;br /&gt;
 * designed for 11 bit measurement and 0.125°C&lt;br /&gt;
 * resolution.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
double LM75B_calculate(void)&lt;br /&gt;
{&lt;br /&gt;
	int16_t tempraw = 0;&lt;br /&gt;
	double temp;&lt;br /&gt;
&lt;br /&gt;
	tempraw = (getTemperatureHigh() &amp;lt;&amp;lt; 8) | getTemperatureLow();&lt;br /&gt;
	tempraw &amp;gt;&amp;gt;= 5;&lt;br /&gt;
	if (tempraw &amp;amp; 1024)							// Calculate temperature&lt;br /&gt;
		tempraw = (tempraw &amp;amp; 1023) - 1024;&lt;br /&gt;
	else&lt;br /&gt;
		tempraw = tempraw &amp;amp; 1023;&lt;br /&gt;
	temp = tempraw * 0.125;&lt;br /&gt;
	return temp;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Performs a 11 bit measurement and returns the&lt;br /&gt;
 * temperature [°C]. The sensor has a measuring&lt;br /&gt;
 * cycle of 100ms. So it makes no sense calling&lt;br /&gt;
 * this function at a frequency above 10Hz.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
double LM75B_measure(void)&lt;br /&gt;
{&lt;br /&gt;
//	LM75B_init();&lt;br /&gt;
	LM75B_read();								// Read data&lt;br /&gt;
	return (LM75B_calculate());					// Calculate value&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Servo Controller (PCA9685):&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Call this once before using the servo function.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: PWM frequency [40..1000 Hz]&lt;br /&gt;
 *&lt;br /&gt;
 * Hints: - Default servo frequency is 50 Hz!&lt;br /&gt;
 *        - The servo power is NOT switched on by&lt;br /&gt;
 *          this function!&lt;br /&gt;
 *&lt;br /&gt;
 * There is also a macro initServo(freq), which&lt;br /&gt;
 * does exactly the same as this function.&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *   initServo(50);&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void PCA9685_init(uint16_t freq)&lt;br /&gt;
{&lt;br /&gt;
	outport.oen_servo = false;					// I/O 1.3: Low&lt;br /&gt;
	MAX7311_update();&lt;br /&gt;
	if ((freq &amp;lt; 40) || (freq &amp;gt; 1000)) freq = 50;&lt;br /&gt;
	I2CTWI_transmitByte(I2C_SENSOR_SERVO_ADR, PCA9685_MODE2);&lt;br /&gt;
	uint8_t last_mode = I2CTWI_readByte(I2C_SENSOR_SERVO_ADR);&lt;br /&gt;
	last_mode &amp;amp;= ~PCA9685_MODE2_INVRT;			// Clear INVRT bit&lt;br /&gt;
	last_mode |= PCA9685_MODE2_OUTDRV;			// Set OUTDRV bit&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_SERVO_ADR, PCA9685_MODE2, last_mode);&lt;br /&gt;
	I2CTWI_transmitByte(I2C_SENSOR_SERVO_ADR, PCA9685_MODE1);&lt;br /&gt;
	last_mode = I2CTWI_readByte(I2C_SENSOR_SERVO_ADR);&lt;br /&gt;
	last_mode |= PCA9685_MODE1_AI;				// Set AI bit&lt;br /&gt;
	uint8_t mode1 = last_mode;&lt;br /&gt;
	mode1 |= PCA9685_MODE1_SLEEP;				// Set SLEEP bit&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_SERVO_ADR, PCA9685_MODE1, mode1);&lt;br /&gt;
	uint8_t prescale = (uint8_t) (F_PCA9685 / 4096 / freq - 0.5);&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_SERVO_ADR, PCA9685_PRE_SCALE, prescale);&lt;br /&gt;
	last_mode &amp;amp;= ~PCA9685_MODE1_SLEEP;			// Clear SLEEP bit&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_SERVO_ADR, PCA9685_MODE1, last_mode);&lt;br /&gt;
	mSleep(1);&lt;br /&gt;
	last_mode |= PCA9685_MODE1_RESTART;			// Clear RESTART bit&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_SERVO_ADR, PCA9685_MODE1, last_mode);&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_SERVO_ADR, PCA9685_LED8_ON_H, 0x10);&lt;br /&gt;
	return;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/** &lt;br /&gt;
 * Returns the channel belonging to a servo number.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: number -&amp;gt; Servo number [1..8]&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
uint8_t servo(uint8_t number)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t channel;&lt;br /&gt;
&lt;br /&gt;
	switch (number) {&lt;br /&gt;
		case 1 :&lt;br /&gt;
			channel = CH_SERVO_1; break;&lt;br /&gt;
		case 2 :&lt;br /&gt;
			channel = CH_SERVO_2; break;&lt;br /&gt;
		case 3 :&lt;br /&gt;
			channel = CH_SERVO_3; break;&lt;br /&gt;
		case 4 :&lt;br /&gt;
			channel = CH_SERVO_4; break;&lt;br /&gt;
		case 5 :&lt;br /&gt;
			channel = CH_SERVO_5; break;&lt;br /&gt;
		case 6 :&lt;br /&gt;
			channel = CH_SERVO_6; break;&lt;br /&gt;
		case 7 :&lt;br /&gt;
			channel = CH_SERVO_7; break;&lt;br /&gt;
		case 8 :&lt;br /&gt;
			channel = CH_SERVO_8; break;&lt;br /&gt;
		default : channel = CH_SERVO_1;&lt;br /&gt;
	}&lt;br /&gt;
	return channel;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This is the servo position set function.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: channel -&amp;gt; Channel number [1..16]&lt;br /&gt;
 *        pos     -&amp;gt; Servo position [SERVOx_LT..SERVOx_RT]&lt;br /&gt;
 *&lt;br /&gt;
 * Hints: - A servo position of 205 means 1 ms servo impulse,&lt;br /&gt;
 *          a position of 410 means a 2 ms servo impulse!&lt;br /&gt;
 *          You may calculate the servo impulse length by:&lt;br /&gt;
 *          ==&amp;gt; Impulse [ms] = servo position / 204.8 &amp;lt;==&lt;br /&gt;
 *          (Formula only valid for a PWM of 50 Hz!)&lt;br /&gt;
 *&lt;br /&gt;
 * There is also a macro setServo(servo, pos), which&lt;br /&gt;
 * does nearly the same as this function, but the first&lt;br /&gt;
 * parameter is the servo and NOT the channel number.&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *   setServo(2,300);&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void PCA9685_set(uint8_t channel, uint16_t pos)&lt;br /&gt;
{&lt;br /&gt;
	if ((channel == 0) || (channel &amp;gt; 16))&lt;br /&gt;
		return;&lt;br /&gt;
	uint8_t reg = channel * 4 + 4;				// Register LEDx_OFF_L&lt;br /&gt;
	I2CTWI_transmit3Bytes(I2C_SENSOR_SERVO_ADR, reg, (pos &amp;amp; 0x00ff), (pos &amp;gt;&amp;gt; 8));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * If the servos are not moving for a while, the&lt;br /&gt;
 * servo function can be stopped with this&lt;br /&gt;
 * function (PCA9685 set to sleep mode).&lt;br /&gt;
 *&lt;br /&gt;
 * Hint: The servo power is NOT switched off by&lt;br /&gt;
 *       this function!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void PCA9685_shutdown(void)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_SERVO_ADR, PCA9685_ALL_LED_OFF_H, 0x10);&lt;br /&gt;
	I2CTWI_transmitByte(I2C_SENSOR_SERVO_ADR, PCA9685_MODE1);&lt;br /&gt;
	uint8_t mode1 = I2CTWI_readByte(I2C_SENSOR_SERVO_ADR);&lt;br /&gt;
	mode1 |= PCA9685_MODE1_SLEEP;				// Set SLEEP bit&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_SERVO_ADR, PCA9685_MODE1, mode1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * If the servo function was stopped with the&lt;br /&gt;
 * function PCA9685_shutdown() before, it can be&lt;br /&gt;
 * (re)started again with this function.&lt;br /&gt;
 *&lt;br /&gt;
 * Hint: The servo power is NOT switched on by&lt;br /&gt;
 *       this function!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void PCA9685_restart(void)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmitByte(I2C_SENSOR_SERVO_ADR, PCA9685_MODE1);&lt;br /&gt;
	uint8_t mode1 = I2CTWI_readByte(I2C_SENSOR_SERVO_ADR);&lt;br /&gt;
	if (mode1 &amp;amp; PCA9685_MODE1_RESTART) {		// RESTART bit set?&lt;br /&gt;
		mode1 &amp;amp;= ~PCA9685_MODE1_SLEEP;			// Clear SLEEP bit&lt;br /&gt;
		I2CTWI_transmit2Bytes(I2C_SENSOR_SERVO_ADR, PCA9685_MODE1, mode1);&lt;br /&gt;
		mSleep(1);&lt;br /&gt;
		mode1 |= PCA9685_MODE1_RESTART;			// Clear RESTART bit&lt;br /&gt;
		I2CTWI_transmit2Bytes(I2C_SENSOR_SERVO_ADR, PCA9685_MODE1, mode1);&lt;br /&gt;
		I2CTWI_transmit2Bytes(I2C_SENSOR_SERVO_ADR, PCA9685_ALL_LED_OFF_H, 0);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/** &lt;br /&gt;
 * With this function you can switch the servo&lt;br /&gt;
 * power on or off.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: pwr -&amp;gt; 0 (false) = servo power off&lt;br /&gt;
 *               &amp;gt;0 (true) = servo power on&lt;br /&gt;
 *&lt;br /&gt;
 * Hints: - If connected servos are not used, you&lt;br /&gt;
 *          should always switch the servo power off&lt;br /&gt;
 *          (default) to save energy!&lt;br /&gt;
 *        - The PCA9685 is NOT restarted or put into&lt;br /&gt;
 *          shutdown mode by this function!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void setServoPower(uint8_t pwr)&lt;br /&gt;
{&lt;br /&gt;
	if(pwr &amp;gt; 0)&lt;br /&gt;
		outport.pwr_servo = true;				// I/O 1.4: High&lt;br /&gt;
	else&lt;br /&gt;
		outport.pwr_servo = false;				// I/O 1.4: Low&lt;br /&gt;
	MAX7311_update();&lt;br /&gt;
}	&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C LED Driver (TCA6507):&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Sends the configuration byte to TCA6507's&lt;br /&gt;
 * internal registers.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: reg    -&amp;gt; Register address [0..10]&lt;br /&gt;
 *        config -&amp;gt; Config byte for internal&lt;br /&gt;
 *                  registers&lt;br /&gt;
 *&lt;br /&gt;
 * Hints: - With this function you can write to&lt;br /&gt;
 *          all internal registers of the LED&lt;br /&gt;
 *          driver, see &amp;quot;Registers:&amp;quot; in the&lt;br /&gt;
 *          library header file!&lt;br /&gt;
 *        - Mainly you will use this function&lt;br /&gt;
 *          for setting time (regs 3..7) and&lt;br /&gt;
 *          intensity (regs 8, 9) values.&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *   TCA6507_write_cfg(TCA6507_MAXIMUM_INTENSITY,0x77);&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void TCA6507_write_cfg(uint8_t reg, uint8_t config)&lt;br /&gt;
{&lt;br /&gt;
	if(reg &amp;gt; 10) reg = 0;&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_LEDDRIVER_ADR, reg, config);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
uint8_t select[3];&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Updates the LED driver select registers (0..2)&lt;br /&gt;
 * with the global select array!&lt;br /&gt;
 *&lt;br /&gt;
 * Hint: - Also have a look at Table 4 in the&lt;br /&gt;
 *         TCA6507 datasheet!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void TCA6507_update(void)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmit4Bytes(I2C_SENSOR_LEDDRIVER_ADR, (TCA6507_SELECT0 | 0x10), select[0], select[1], select[2]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This is the LED state set function.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: led   -&amp;gt; LED number [0..6]&lt;br /&gt;
 *        state -&amp;gt; LED state  [0..7]&lt;br /&gt;
 *&lt;br /&gt;
 * Hints: - Possible driver states [0..7] see&lt;br /&gt;
 *          &amp;quot;Output states:&amp;quot; in the library&lt;br /&gt;
 *          header file!&lt;br /&gt;
 *        - Also have a look at Table 4 in the&lt;br /&gt;
 *          TCA6507 datasheet!&lt;br /&gt;
 *&lt;br /&gt;
 * There is also a macro setLED(led, state), which&lt;br /&gt;
 * does exactly the same as this function.&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *   setLED(1,4);&lt;br /&gt;
 *   // Switches LED1 ON&lt;br /&gt;
 *   // ... OR ...&lt;br /&gt;
 *   setLED(LED1,STATE_ON);&lt;br /&gt;
 *   // does the same.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void TCA6507_set(uint8_t led, uint8_t state)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t i, mask;&lt;br /&gt;
&lt;br /&gt;
	if(led &amp;gt; 6) led = 0;&lt;br /&gt;
	led = 1 &amp;lt;&amp;lt; led;&lt;br /&gt;
	mask = 1;&lt;br /&gt;
	for(i = 0; i &amp;lt; 3; i++) {&lt;br /&gt;
		select[i] &amp;amp;= ~led;&lt;br /&gt;
		if(state &amp;amp; mask)&lt;br /&gt;
			select[i] |= led;&lt;br /&gt;
		mask &amp;lt;&amp;lt;= 1;&lt;br /&gt;
	}&lt;br /&gt;
	TCA6507_update();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * If the LEDs are not needed for a while, the&lt;br /&gt;
 * LED driver can be stopped with this function&lt;br /&gt;
 * (TCA6507 set to shutdown mode).&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void TCA6507_shutdown(void)&lt;br /&gt;
{&lt;br /&gt;
	outport.en_leddriv = false;					// I/O 0.4: Low&lt;br /&gt;
	MAX7311_update();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * If the LED driver was stopped with the&lt;br /&gt;
 * function TCA6507_shutdown() before, it can be&lt;br /&gt;
 * (re)started again with this function.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void TCA6507_restart(void)&lt;br /&gt;
{&lt;br /&gt;
	outport.en_leddriv = true;					// I/O 0.4: High&lt;br /&gt;
	MAX7311_update();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Initializes the LED driver after power on by&lt;br /&gt;
 * switching all LEDs off.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void TCA6507_init(void)&lt;br /&gt;
{&lt;br /&gt;
	select[0] = 0;&lt;br /&gt;
	select[1] = 0;&lt;br /&gt;
	select[2] = 0;&lt;br /&gt;
	TCA6507_update();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C 3D Magnetometer &amp;amp; Accelerometer (LSM303DLHC):&lt;br /&gt;
&lt;br /&gt;
// --------------------------------------------&lt;br /&gt;
// LSM303DLHC accelerometer functions:&lt;br /&gt;
int16_t x_axisa, y_axisa, z_axisa;&lt;br /&gt;
double pitch, roll;&lt;br /&gt;
double xa, ya, za;&lt;br /&gt;
double the, phi;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Call this once before using the 3D-Accelerometer.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void LSM303DLHC_A_init(void)&lt;br /&gt;
{&lt;br /&gt;
	// Set normal power mode, 10 Hz data rate, all axes enabled:&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_LSM303DLHC_A_ADR, CTRL_REG1_A, CTRL_REG1_A_10HZ);&lt;br /&gt;
	mSleep(10);&lt;br /&gt;
	// Set HD mode:&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_LSM303DLHC_A_ADR, CTRL_REG4_A, CTRL_REG4_A_HR);&lt;br /&gt;
	mSleep(10);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function reads the X-axis, Y-axis and Z-axis values&lt;br /&gt;
 * from the LSM303DLHC accelerometer and stores them in the&lt;br /&gt;
 * global variables x_axisa, y_axisa and z_axisa.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void readLSM303DLHC_A(void)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t readBuf[6];&lt;br /&gt;
&lt;br /&gt;
	I2CTWI_transmitByte(I2C_SENSOR_LSM303DLHC_A_ADR, (OUT_X_L_A | 0x80));&lt;br /&gt;
	I2CTWI_readBytes(I2C_SENSOR_LSM303DLHC_A_ADR, readBuf, 6); // Read  X-/Y-/Z-axis&lt;br /&gt;
	// xb = y:&lt;br /&gt;
	x_axisa = ((readBuf[OUT_Y_H_A - OUT_X_L_A] &amp;lt;&amp;lt; 8) + readBuf[OUT_Y_L_A - OUT_X_L_A]) / 16;&lt;br /&gt;
	// yb = x:&lt;br /&gt;
	y_axisa = ((readBuf[OUT_X_H_A - OUT_X_L_A] &amp;lt;&amp;lt; 8) + readBuf[OUT_X_L_A - OUT_X_L_A]) / 16;&lt;br /&gt;
	// zb = z:&lt;br /&gt;
	z_axisa = ((readBuf[OUT_Z_H_A - OUT_X_L_A] &amp;lt;&amp;lt; 8) + readBuf[OUT_Z_L_A - OUT_X_L_A]) / 16;&lt;br /&gt;
	mSleep(10);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function limits and normalizes the x-axisa,&lt;br /&gt;
 * y-axisa and z-axisa values read from the LSM303DLHC&lt;br /&gt;
 * accelerometer with the function readLSM303DLHC_A() and&lt;br /&gt;
 * stores them in the global double variables xa, ya and&lt;br /&gt;
 * za.&lt;br /&gt;
 * It also calculates the position in space in form of the&lt;br /&gt;
 * tilt angles (the = pitch, phi = roll) and stores them&lt;br /&gt;
 * in the global double variables the and phi.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void normalizeLSM303DLHC_A(void)&lt;br /&gt;
{&lt;br /&gt;
	// Limit raw values:&lt;br /&gt;
	if (x_axisa &amp;lt; MIN_X_A) x_axisa = MIN_X_A;&lt;br /&gt;
	if (x_axisa &amp;gt; MAX_X_A) x_axisa = MAX_X_A;&lt;br /&gt;
	if (y_axisa &amp;lt; MIN_Y_A) y_axisa = MIN_Y_A;&lt;br /&gt;
	if (y_axisa &amp;gt; MAX_Y_A) y_axisa = MAX_Y_A;&lt;br /&gt;
	if (z_axisa &amp;lt; MIN_Z_A) z_axisa = MIN_Z_A;&lt;br /&gt;
	if (z_axisa &amp;gt; MAX_Z_A) z_axisa = MAX_Z_A;&lt;br /&gt;
	xa = (double) x_axisa / 1000.0;&lt;br /&gt;
	ya = (double) y_axisa / 1000.0;&lt;br /&gt;
	za = (double) z_axisa / 1000.0;&lt;br /&gt;
	// Calculate Pitch and Roll:&lt;br /&gt;
	phi = asin(xa);								// Calculate the and phi&lt;br /&gt;
	the = asin(ya / cos(the));					//  from the raw values&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function calculates the position in space by&lt;br /&gt;
 * using the the and phi values (see function&lt;br /&gt;
 * normalizeLSM303DLHC_A()!). It stores the position&lt;br /&gt;
 * in the global double variables pitch and roll. &lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void positionLSM303DLHC_A(void)&lt;br /&gt;
{&lt;br /&gt;
	pitch = the * 180 / M_PI + OFFSET_PITCH_A;&lt;br /&gt;
	roll = phi * 180 / M_PI + OFFSET_ROLL_A;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// LSM303DLHC magnetometer functions:&lt;br /&gt;
int16_t x_axism, y_axism, z_axism;&lt;br /&gt;
int16_t headingm;&lt;br /&gt;
double xm, ym, zm;&lt;br /&gt;
#ifdef GET_TEMP_M&lt;br /&gt;
int16_t temperaturem;&lt;br /&gt;
double temperature_mag;&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
int16_t headingtc;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Call this once before using the 3D-Compass.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void LSM303DLHC_M_init(void)&lt;br /&gt;
{&lt;br /&gt;
#ifdef GET_TEMP_M&lt;br /&gt;
	// Set Data output rate to 15Hz, enable temperature sensor:&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_LSM303DLHC_M_ADR, CRA_REG_M, CRA_REG_M_15HZ_T_EN);&lt;br /&gt;
#else&lt;br /&gt;
	// Set Data output rate to 15Hz:&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_LSM303DLHC_M_ADR, CRA_REG_M, CRA_REG_M_15HZ);&lt;br /&gt;
#endif&lt;br /&gt;
	mSleep(10);&lt;br /&gt;
	// Set Gain to +-1.3Gauss:&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_LSM303DLHC_M_ADR, CRB_REG_M, CRB_REG_M_13GAUSS);&lt;br /&gt;
	mSleep(10);&lt;br /&gt;
	// Set Continuous-conversion mode:&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_LSM303DLHC_M_ADR, MR_REG_M, MR_REG_M_CCM);&lt;br /&gt;
	mSleep(10);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function reads the X-axis, Y-axis, Z-axis and&lt;br /&gt;
 * temperature values from the LSM303DLHC magnetometer&lt;br /&gt;
 * and stores them in the global variables x_axism,&lt;br /&gt;
 * y_axism, z_axism and temperaturem.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void readLSM303DLHC_M(void)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t readBuf[6];&lt;br /&gt;
&lt;br /&gt;
	I2CTWI_transmitByte(I2C_SENSOR_LSM303DLHC_M_ADR, OUT_X_H_M);&lt;br /&gt;
	I2CTWI_readBytes(I2C_SENSOR_LSM303DLHC_M_ADR, readBuf, 6); // Read  X-/Y-/Z-axis&lt;br /&gt;
	// xb = x:&lt;br /&gt;
	x_axism = (readBuf[OUT_X_H_M - OUT_X_H_M] &amp;lt;&amp;lt; 8) + readBuf[OUT_X_L_M - OUT_X_H_M];&lt;br /&gt;
	// yb = y:&lt;br /&gt;
	y_axism = (readBuf[OUT_Y_H_M - OUT_X_H_M] &amp;lt;&amp;lt; 8) + readBuf[OUT_Y_L_M - OUT_X_H_M];&lt;br /&gt;
	// zb = z:&lt;br /&gt;
	z_axism = (readBuf[OUT_Z_H_M - OUT_X_H_M] &amp;lt;&amp;lt; 8) + readBuf[OUT_Z_L_M - OUT_X_H_M];&lt;br /&gt;
	mSleep(10);&lt;br /&gt;
#ifdef GET_TEMP_M&lt;br /&gt;
	// Read temperature raw value:&lt;br /&gt;
	I2CTWI_transmitByte(I2C_SENSOR_LSM303DLHC_M_ADR, TEMP_OUT_H_M);&lt;br /&gt;
	readBuf[0] = I2CTWI_readByte(I2C_SENSOR_LSM303DLHC_M_ADR);&lt;br /&gt;
	I2CTWI_transmitByte(I2C_SENSOR_LSM303DLHC_M_ADR, TEMP_OUT_L_M);&lt;br /&gt;
	readBuf[1] = I2CTWI_readByte(I2C_SENSOR_LSM303DLHC_M_ADR);&lt;br /&gt;
	temperaturem = (readBuf[0] &amp;lt;&amp;lt; 8) | readBuf[1];&lt;br /&gt;
	temperaturem &amp;gt;&amp;gt;= 4;&lt;br /&gt;
	if (temperaturem &amp;amp; 2048)					// Calculate temperature&lt;br /&gt;
		temperaturem = (temperaturem &amp;amp; 2047) - 2048;&lt;br /&gt;
	else&lt;br /&gt;
		temperaturem = temperaturem &amp;amp; 2047;&lt;br /&gt;
	mSleep(10);&lt;br /&gt;
#endif&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function compensates hard iron effects and&lt;br /&gt;
 * scales the x-axism, y-axism and z-axism values read&lt;br /&gt;
 * from the LSM303DLHC magnetometer with the function&lt;br /&gt;
 * readLSM303DLHC_M() and stores them in the global&lt;br /&gt;
 * double variables xm, ym and zm.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void normalizeLSM303DLHC_M(void)&lt;br /&gt;
{&lt;br /&gt;
	// Add hard iron offsets:&lt;br /&gt;
	x_axism += OFFSET_X_M;&lt;br /&gt;
	y_axism += OFFSET_Y_M;&lt;br /&gt;
	z_axism += OFFSET_Z_M;&lt;br /&gt;
	// Scale raw values:&lt;br /&gt;
	xm = (x_axism - MIN_X_M) / (MAX_X_M - MIN_X_M) * 2 - 1;&lt;br /&gt;
	ym = (y_axism - MIN_Y_M) / (MAX_Y_M - MIN_Y_M) * 2 - 1;&lt;br /&gt;
	zm = (z_axism - MIN_Z_M) / (MAX_Z_M - MIN_Z_M) * 2 - 1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function calculates the heading by using the&lt;br /&gt;
 * normalized sensor values xm and ym (see function&lt;br /&gt;
 * normalizeLSM303DLHC_M()!). The heading is a value&lt;br /&gt;
 * from 0° to 359°. If the robot's front (and the&lt;br /&gt;
 * RP6 Sensor Board's front edge with the two&lt;br /&gt;
 * headlights) points to ...&lt;br /&gt;
 *   north -&amp;gt; heading is 0°,&lt;br /&gt;
 *   east  -&amp;gt; heading is 90°,&lt;br /&gt;
 *   south -&amp;gt; heading is 180°,&lt;br /&gt;
 *   west  -&amp;gt; heading is 270°.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
int16_t headingLSM303DLHC_M(void)&lt;br /&gt;
{&lt;br /&gt;
	double hdg = atan2(ym, xm) * 180 / M_PI + DECLINATION_M;&lt;br /&gt;
	if(hdg &amp;lt; 0.0) hdg += 360.0;&lt;br /&gt;
	return ((int16_t) hdg);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// --------------------------------------------&lt;br /&gt;
/**&lt;br /&gt;
 * This function calculates the TILT COMPENSATED&lt;br /&gt;
 * heading by using accelerometer (the, phi) AND&lt;br /&gt;
 * magnetometer (xm, ym, zm) data. The heading is a&lt;br /&gt;
 * value from 0° to 359°. If the robot's front (and&lt;br /&gt;
 * the RP6 Sensor Board's front edge with the two&lt;br /&gt;
 * headlights) points to ...&lt;br /&gt;
 *   north -&amp;gt; heading is 0°,&lt;br /&gt;
 *   east  -&amp;gt; heading is 90°,&lt;br /&gt;
 *   south -&amp;gt; heading is 180°,&lt;br /&gt;
 *   west  -&amp;gt; heading is 270°.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
int16_t headingLSM303DLHC_TC(void)&lt;br /&gt;
{&lt;br /&gt;
	double hdgtc, xh, yh;&lt;br /&gt;
&lt;br /&gt;
	xh = xm * cos(the) + zm * sin(the);&lt;br /&gt;
	yh = xm * sin(phi) * sin(the) + ym * cos(phi) - zm * sin(phi) * cos(the);&lt;br /&gt;
//	zh = -xm * cos(phi) * sin(the) + ym * sin(phi) + zm * cos(phi) * cos(the);&lt;br /&gt;
	hdgtc = atan2(yh, xh) * 180 / M_PI + DECLINATION_M;&lt;br /&gt;
	if(hdgtc &amp;lt; 0.0) hdgtc += 360.0;&lt;br /&gt;
	return ((int16_t) hdgtc);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// --------------------------------------------&lt;br /&gt;
/**&lt;br /&gt;
 * Call this once before using the LSM303DLHC.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void LSM303DLHC_init(void)&lt;br /&gt;
{&lt;br /&gt;
	LSM303DLHC_A_init();						// Accelerometer init&lt;br /&gt;
	LSM303DLHC_M_init();						// Magnetometer init&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Analog Yaw-Rate Gyroscope (LY330ALH):&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Sets the LY330ALH mode of operation.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: mode -&amp;gt; Mode [0..3]&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void LY330ALH_set_mode(uint8_t mode)&lt;br /&gt;
{&lt;br /&gt;
	outport.pd_gyro = false;					// I/O 0.6: Low&lt;br /&gt;
	outport.st_gyro = false;					// I/O 0.7: Low&lt;br /&gt;
	if(mode &amp;amp; 1) outport.pd_gyro = true;&lt;br /&gt;
	if(mode &amp;amp; 2) outport.st_gyro = true;&lt;br /&gt;
	MAX7311_update();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Reads the ADC1 value from the RP6Base.&lt;br /&gt;
 *&lt;br /&gt;
 * Hints: - The RP6Base input ADC1 has to be&lt;br /&gt;
 *          connected to the USRBUS: Pin 2 on&lt;br /&gt;
 *          the RP6 mainboard!&lt;br /&gt;
 *        - The RP6Base_I2CSlave program has to&lt;br /&gt;
 *          be loaded into the RP6Base&lt;br /&gt;
 *          microcontroller!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
uint16_t getRP6Base_ADC1(void)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_readRegisters(I2C_RP6_BASE_ADR, I2C_REG_ADC_ADC1_L, registerBuf, 2);&lt;br /&gt;
	return (registerBuf[0] + (registerBuf[1] &amp;lt;&amp;lt; 8));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int16_t z_axisg;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Performs a LY330ALH gyroscope measurement and&lt;br /&gt;
 * returns the angular rate (velocity).&lt;br /&gt;
 * Positive values mean an angular rate while&lt;br /&gt;
 * rotating LEFT and negative values while&lt;br /&gt;
 * rotating RIGHT!&lt;br /&gt;
 * The global integer variable z_axisg also&lt;br /&gt;
 * contains the measurement result.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
int16_t LY330ALH_measure(void)&lt;br /&gt;
{&lt;br /&gt;
	z_axisg = getRP6Base_ADC1();				// Read raw data&lt;br /&gt;
	z_axisg -= ADCVAL_ZERORATE_LEVEL;			// Calculate value&lt;br /&gt;
	return (z_axisg);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Hot Swappable 2-Wire Bus Buffer (TCA4311A):&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Reads the TCA4311A Ready output. &lt;br /&gt;
 * The function returns the state (true/false).&lt;br /&gt;
 * The global variable readyBusbuff is also&lt;br /&gt;
 * filled with the Ready output state.&lt;br /&gt;
 *&lt;br /&gt;
 * Hint: You don't have to use this function,&lt;br /&gt;
 *       if the task task_RP6SensorBoard() is&lt;br /&gt;
 *       called frequently out of the main&lt;br /&gt;
 *       loop, because readyBusbuff will be&lt;br /&gt;
 *       updated by this task!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
uint8_t readReadyBusbuff(void)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmitByte(I2C_SENSOR_PORTEXP_ADR, MAX7311_INPUT_PORT1);&lt;br /&gt;
	readyBusbuff = I2CTWI_readByte(I2C_SENSOR_PORTEXP_ADR);&lt;br /&gt;
	readyBusbuff &amp;amp;= RDY_BUSBUFF;&lt;br /&gt;
	return readyBusbuff;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
uint8_t errorBusbuff;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * If the I2C bus for the I2C-MODULE (SCLOUT,&lt;br /&gt;
 * SDAOUT) is not used or shall be isolated from&lt;br /&gt;
 * the RP6 I2C bus, this can be done with this&lt;br /&gt;
 * function.&lt;br /&gt;
 *&lt;br /&gt;
 * Hints: - The I2C-MODULE power is NOT switched&lt;br /&gt;
 *          off by this function!&lt;br /&gt;
 *        - If USE_PD5 is defined in the&lt;br /&gt;
 *          configuration header file, this&lt;br /&gt;
 *          function uses the RP6M256 portpin,&lt;br /&gt;
 *          that is connected to plug I/O: Pin 9&lt;br /&gt;
 *          instead of MAX7311 I/O 1.0!&lt;br /&gt;
 *        - If the global variable errorBusbuff&lt;br /&gt;
 *          returns true, the bus buffer could&lt;br /&gt;
 *          not be switched to shutdown mode!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void TCA4311A_shutdown(void)&lt;br /&gt;
{&lt;br /&gt;
	// Wait until the I2C bus is idle:&lt;br /&gt;
	while(I2CTWI_isBusy() || TWI_operation != I2CTWI_NO_OPERATION) task_I2CTWI();&lt;br /&gt;
#ifdef USE_PD5&lt;br /&gt;
	IO_SENSOR_TCA4311A_EN_PORT &amp;amp;= ~IO_SENSOR_TCA4311A_EN_IN; // Low&lt;br /&gt;
#else&lt;br /&gt;
	outport.en_busbuff = false;					// I/O 1.0: Low&lt;br /&gt;
	MAX7311_update();&lt;br /&gt;
#endif&lt;br /&gt;
	errorBusbuff = readReadyBusbuff();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * If the I2C bus for the I2C-MODULE (SCLOUT,&lt;br /&gt;
 * SDAOUT) was isolated from the RP6 I2C bus with&lt;br /&gt;
 * the function TCA4311A_shutdown() before, it&lt;br /&gt;
 * can be connected again with this function.&lt;br /&gt;
 *&lt;br /&gt;
 * Hints: - The I2C-MODULE power is NOT switched&lt;br /&gt;
 *          on by this function!&lt;br /&gt;
 *        - If USE_PD5 is defined in the&lt;br /&gt;
 *          configuration header file, this&lt;br /&gt;
 *          function uses the RP6M256 portpin,&lt;br /&gt;
 *          that is connected to plug I/O: Pin 9&lt;br /&gt;
 *          instead of MAX7311 I/O 1.0!&lt;br /&gt;
 *        - If the global variable errorBusbuff&lt;br /&gt;
 *          returns true, the bus buffer could&lt;br /&gt;
 *          not be switched to normal operation!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void TCA4311A_reconnect(void)&lt;br /&gt;
{&lt;br /&gt;
	// Wait until the I2C bus is idle:&lt;br /&gt;
	while(I2CTWI_isBusy() || TWI_operation != I2CTWI_NO_OPERATION) task_I2CTWI();&lt;br /&gt;
#ifdef USE_PD5&lt;br /&gt;
	IO_SENSOR_TCA4311A_EN_PORT |= IO_SENSOR_TCA4311A_EN_IN; // High&lt;br /&gt;
#else&lt;br /&gt;
	outport.en_busbuff = true;					// I/O 1.0: High&lt;br /&gt;
	MAX7311_update();&lt;br /&gt;
#endif&lt;br /&gt;
	errorBusbuff = !readReadyBusbuff();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Sets/clears the RP6Base signal PWR.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: pwr -&amp;gt; 0 (false) = PWR off&lt;br /&gt;
 *               &amp;gt;0 (true) = PWR on&lt;br /&gt;
 *&lt;br /&gt;
 * Hints: - The RP6Base signal PWR has to be&lt;br /&gt;
 *          connected to the USRBUS: Pin 3 on&lt;br /&gt;
 *          the RP6 mainboard!&lt;br /&gt;
 *        - The RP6Base_I2CSlave program has to&lt;br /&gt;
 *          be loaded into the RP6Base&lt;br /&gt;
 *          microcontroller!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void setRP6Base_PWR(uint8_t pwr)&lt;br /&gt;
{&lt;br /&gt;
	if(pwr &amp;gt; 0)&lt;br /&gt;
		I2CTWI_transmit2Bytes(I2C_RP6_BASE_ADR, 0, CMD_POWER_ON);&lt;br /&gt;
	else&lt;br /&gt;
		I2CTWI_transmit2Bytes(I2C_RP6_BASE_ADR, 0, CMD_POWER_OFF);&lt;br /&gt;
	while(I2CTWI_isBusy() || TWI_operation != I2CTWI_NO_OPERATION) task_I2CTWI();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/** &lt;br /&gt;
 * With this function you can switch the I2C-&lt;br /&gt;
 * MODULE (plug M1) power on or off.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: pwr -&amp;gt; 0 (false) = I2C-MODULE power off&lt;br /&gt;
 *               &amp;gt;0 (true) = I2C-MODULE power on&lt;br /&gt;
 *&lt;br /&gt;
 * Hints: - If the I2C-MODULE plug is not used,&lt;br /&gt;
 *          you should always switch the&lt;br /&gt;
 *          I2C-MODULE power off (default)!&lt;br /&gt;
 *        - The TCA4311A is NOT switched to&lt;br /&gt;
 *          normal operation (default) or&lt;br /&gt;
 *          shutdown mode by this function!&lt;br /&gt;
 *        - The RP6Base signal PWR has to be&lt;br /&gt;
 *          connected to the USRBUS: Pin 3 on&lt;br /&gt;
 *          the RP6 mainboard!&lt;br /&gt;
 *        - The RP6Base_I2CSlave program has to&lt;br /&gt;
 *          be loaded into the RP6Base&lt;br /&gt;
 *          microcontroller!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void setI2CModulePower(uint8_t pwr)&lt;br /&gt;
{&lt;br /&gt;
	if(pwr &amp;gt; 0) {&lt;br /&gt;
		setRP6Base_PWR(1);						// RP6Base PWR on&lt;br /&gt;
		outport.pwr_i2c = true;					// I/O 0.0: High&lt;br /&gt;
	}&lt;br /&gt;
	else&lt;br /&gt;
		outport.pwr_i2c = false;				// I/O 0.0: Low&lt;br /&gt;
	MAX7311_update();&lt;br /&gt;
}	&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Button:&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Reads the MAX7311 I/O port 1.7. &lt;br /&gt;
 * The function returns true, if  button S1 is&lt;br /&gt;
 * pressed (I/O 1.7: Low!) and false, if it is&lt;br /&gt;
 * not pressed (I/O 1.7: High!).&lt;br /&gt;
 * The global variable pressedButton is also&lt;br /&gt;
 * filled with the I/O 1.7 output state.&lt;br /&gt;
 *&lt;br /&gt;
 * Hint: You don't have to use this function,&lt;br /&gt;
 *       if the task task_RP6SensorBoard() is&lt;br /&gt;
 *       called frequently out of the main&lt;br /&gt;
 *       loop, because pressedButton will be&lt;br /&gt;
 *       updated by this task!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
uint8_t readButton(void)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmitByte(I2C_SENSOR_PORTEXP_ADR, MAX7311_INPUT_PORT2);&lt;br /&gt;
	pressedButton = I2CTWI_readByte(I2C_SENSOR_PORTEXP_ADR);&lt;br /&gt;
	pressedButton &amp;amp;= IO2_I2C;&lt;br /&gt;
	pressedButton = !pressedButton;&lt;br /&gt;
	return pressedButton;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Status LED:&lt;br /&gt;
&lt;br /&gt;
/** &lt;br /&gt;
 * Sets the status LED (D2) of the RP6 Sensor&lt;br /&gt;
 * Board.&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *   setStatusLED(1);&lt;br /&gt;
 *   // This switches the status LED on!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void setStatusLED(uint8_t on)&lt;br /&gt;
{&lt;br /&gt;
	if(on &amp;gt; 0)&lt;br /&gt;
		outport.io1_i2c = false;				// I/O 1.6: Low&lt;br /&gt;
	else&lt;br /&gt;
		outport.io1_i2c = true;					// I/O 1.6: High&lt;br /&gt;
	MAX7311_update();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// RP6 Sensor Board initialisation and shutdown:&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * You MUST call this function at the beginning of a&lt;br /&gt;
 * main program, that uses the RP6 Sensor Board. &lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void sensor_board_init(void)&lt;br /&gt;
{&lt;br /&gt;
	// I/O Port Expander:&lt;br /&gt;
	MAX7311_init();&lt;br /&gt;
	// RTC:&lt;br /&gt;
	DS1339_init();&lt;br /&gt;
	// Temperature Sensor:&lt;br /&gt;
	LM75B_init();&lt;br /&gt;
	// Servo Controller:&lt;br /&gt;
	PCA9685_init(50);							// Init PWM 50 Hz&lt;br /&gt;
	// LED Driver:&lt;br /&gt;
	TCA6507_init();&lt;br /&gt;
	// 3D Magnetometer &amp;amp; Accelerometer:&lt;br /&gt;
	LSM303DLHC_init();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * If you don't use any function of the RP6&lt;br /&gt;
 * Sensor Board, you can put the board into&lt;br /&gt;
 * &amp;quot;SHUTDOWN MODE&amp;quot;. In this mode the electric&lt;br /&gt;
 * power consumption is very low to save energy.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void sensor_board_shutdown(void)&lt;br /&gt;
{&lt;br /&gt;
	// Servo Controller:&lt;br /&gt;
	PCA9685_shutdown();							// Shutdown PCA9685&lt;br /&gt;
	// Temperature Sensor:&lt;br /&gt;
	LM75B_shutdown();							// Shutdown LM75B&lt;br /&gt;
	// I/O Port Expander:&lt;br /&gt;
	MAX7311_write(MAX7311_OUTPUT_SHUTDOWN);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&lt;br /&gt;
/******************************************************************************&lt;br /&gt;
 * Additional info&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Changelog:&lt;br /&gt;
 * - v. 1.0 TCA4311A reconnect problem fixed 10.04.2014 by Dirk&lt;br /&gt;
 * - v. 0.9 Interrupt status functions added 09.04.2014 by Dirk&lt;br /&gt;
 * - v. 0.8 (initial release) 17.03.2014 by Dirk&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Erklärung&lt;br /&gt;
&lt;br /&gt;
=====Demo=====&lt;br /&gt;
makefile:&lt;br /&gt;
&amp;lt;pre&amp;gt;...&lt;br /&gt;
TARGET = RP6M256_Sensor_Board_01&lt;br /&gt;
...&lt;br /&gt;
SRC += $(RP6_LIB_PATH)/RP6common/RP6I2CmasterTWI.c&lt;br /&gt;
&lt;br /&gt;
SRC += $(RP6_LIB_PATH)/RP6control_M256_WIFI/RP6M256_Sensor_BoardLib.c&lt;br /&gt;
...&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Datei: RP6M256_Sensor_Board_01.c&lt;br /&gt;
&amp;lt;pre&amp;gt;/* &lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * RP6 ROBOT SYSTEM - RP6 CONTROL M256 Examples&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Example: RP6M256 Sensor Board&lt;br /&gt;
 * Author(s): Dirk&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Description:&lt;br /&gt;
 * In this example we show a first test for the RP6 Sensor Board.&lt;br /&gt;
 * &lt;br /&gt;
 * ############################################################################&lt;br /&gt;
 * The Robot does NOT move in this example! You can simply put it on a table&lt;br /&gt;
 * next to your PC and you should connect it to the PC via the USB Interface!&lt;br /&gt;
 * You should also connect to it via WIFI.&lt;br /&gt;
 * ############################################################################&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Includes:&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6M256Lib.h&amp;quot; 				// The RP6 M256 Library. &lt;br /&gt;
										// Always needs to be included!&lt;br /&gt;
#include &amp;quot;RP6I2CmasterTWI.h&amp;quot;			// Include the I2C-Bus Master Library&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Include our new &amp;quot;RP6M256 Sensor Board library&amp;quot;:&lt;br /&gt;
// (This is the library for accessing the RP6 Sensor Board!)&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6M256_Sensor_BoardLib.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Variables:&lt;br /&gt;
&lt;br /&gt;
char dir[3];&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Returns a 2 character string for the eighth&lt;br /&gt;
 * parts of the direction calculated from the&lt;br /&gt;
 * heading value.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: heading -&amp;gt; Heading value [0..359]&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void calculateDir(char *dir, uint16_t heading)&lt;br /&gt;
{&lt;br /&gt;
	dir[1] = ' ';&lt;br /&gt;
	dir[2] = '\0';&lt;br /&gt;
	if ((heading &amp;lt;= 22) || (heading &amp;gt;=338)) dir[0] = 'N';&lt;br /&gt;
	if ((heading &amp;gt;= 23) &amp;amp;&amp;amp; (heading &amp;lt;= 67)) {dir[0] = 'N'; dir[1] = 'E';} &lt;br /&gt;
	if ((heading &amp;gt;= 68) &amp;amp;&amp;amp; (heading &amp;lt;= 112)) dir[0] = 'E';&lt;br /&gt;
	if ((heading &amp;gt;= 113) &amp;amp;&amp;amp; (heading &amp;lt;= 157)) {dir[0] = 'S'; dir[1] = 'E';}&lt;br /&gt;
	if ((heading &amp;gt;= 158) &amp;amp;&amp;amp; (heading &amp;lt;= 202)) dir[0] = 'S';&lt;br /&gt;
	if ((heading &amp;gt;= 203) &amp;amp;&amp;amp; (heading &amp;lt;= 247)) {dir[0] = 'S'; dir[1] = 'W';}&lt;br /&gt;
	if ((heading &amp;gt;= 248) &amp;amp;&amp;amp; (heading &amp;lt;= 292)) dir[0] = 'W';&lt;br /&gt;
	if ((heading &amp;gt;= 293) &amp;amp;&amp;amp; (heading &amp;lt;= 337)) {dir[0] = 'N'; dir[1] = 'W';}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Write a floating point number to the WIFI.&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *&lt;br /&gt;
 *			// Write a floating point number to the WIFI (no exponent):&lt;br /&gt;
 *			writeDouble_WIFI(1234567.890, 11, 3);&lt;br /&gt;
 *&lt;br /&gt;
 * The value of prec (precision) defines the number of decimal places.&lt;br /&gt;
 * For 32 bit floating point variables (float, double ...) 6 is&lt;br /&gt;
 * the max. value for prec (7 relevant digits).&lt;br /&gt;
 * The value of width defines the overall number of characters in the&lt;br /&gt;
 * floating point number including the decimal point. The number of&lt;br /&gt;
 * pre-decimal positions is: (width - prec - 1).&lt;br /&gt;
 */&lt;br /&gt;
void writeDouble_WIFI(double number, uint8_t width, uint8_t prec)&lt;br /&gt;
{char buffer[width + 1];&lt;br /&gt;
	dtostrf(number, width, prec, &amp;amp;buffer[0]);&lt;br /&gt;
	writeString_WIFI(&amp;amp;buffer[0]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Write a floating point number to the LCD.&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *&lt;br /&gt;
 *			// Write a floating point number to the LCD (no exponent):&lt;br /&gt;
 *			writeDoubleLCD(1234567.890, 11, 3);&lt;br /&gt;
 *&lt;br /&gt;
 * The value of prec (precision) defines the number of decimal places.&lt;br /&gt;
 * For 32 bit floating point variables (float, double ...) 6 is&lt;br /&gt;
 * the max. value for prec (7 relevant digits).&lt;br /&gt;
 * The value of width defines the overall number of characters in the&lt;br /&gt;
 * floating point number including the decimal point. The number of&lt;br /&gt;
 * pre-decimal positions is: (width - prec - 1).&lt;br /&gt;
 */&lt;br /&gt;
void writeDoubleLCD(double number, uint8_t width, uint8_t prec)&lt;br /&gt;
{char buffer[width + 1];&lt;br /&gt;
	dtostrf(number, width, prec, &amp;amp;buffer[0]);&lt;br /&gt;
	writeStringLCD(&amp;amp;buffer[0]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Error handler&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function gets called automatically if there was an I2C Error like&lt;br /&gt;
 * the slave sent a &amp;quot;not acknowledge&amp;quot; (NACK, error codes e.g. 0x20 or 0x30).&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void I2C_transmissionError(uint8_t errorState)&lt;br /&gt;
{&lt;br /&gt;
	writeString_P_WIFI(&amp;quot;\nI2C ERROR - TWI STATE: 0x&amp;quot;);&lt;br /&gt;
	writeInteger_WIFI(errorState, HEX);&lt;br /&gt;
	writeChar_WIFI('\n');&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Main function - The program starts here:&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
	initRP6M256();    // Always call this first! The Processor will not work&lt;br /&gt;
					  // correctly otherwise. &lt;br /&gt;
&lt;br /&gt;
	initLCD(); // Initialize the LC-Display (LCD)&lt;br /&gt;
			   // Always call this before using the LCD!&lt;br /&gt;
&lt;br /&gt;
	setLEDs(0b1111);&lt;br /&gt;
	mSleep(500);&lt;br /&gt;
	setLEDs(0b0000);&lt;br /&gt;
&lt;br /&gt;
	writeString_P_WIFI(&amp;quot;\n\nRP6 Sensor Board Selftest 1!\n&amp;quot;); &lt;br /&gt;
&lt;br /&gt;
	// IMPORTANT:&lt;br /&gt;
	I2CTWI_initMaster(100); // Initialize the TWI Module for Master operation&lt;br /&gt;
							// with 100kHz SCL Frequency&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	// Register the event handler:&lt;br /&gt;
	I2CTWI_setTransmissionErrorHandler(I2C_transmissionError);&lt;br /&gt;
&lt;br /&gt;
	setLEDs(0b1111);&lt;br /&gt;
&lt;br /&gt;
	// Write a text message to the LCD:&lt;br /&gt;
	showScreenLCD(&amp;quot;################&amp;quot;, &amp;quot;################&amp;quot;);&lt;br /&gt;
	mSleep(1500);&lt;br /&gt;
	showScreenLCD(&amp;quot;RP6v2-M256-WIFI &amp;quot;, &amp;quot;Example Program&amp;quot;);&lt;br /&gt;
	mSleep(2500); &lt;br /&gt;
	showScreenLCD(&amp;quot;RP6 Sensor Board&amp;quot;, &amp;quot;   Selftest 1&amp;quot;);&lt;br /&gt;
	mSleep(2500);&lt;br /&gt;
	clearLCD();&lt;br /&gt;
&lt;br /&gt;
	setLEDs(0b0000);&lt;br /&gt;
&lt;br /&gt;
	// ---------------------------------------&lt;br /&gt;
&lt;br /&gt;
	uint8_t onoff = 0;&lt;br /&gt;
	uint16_t servopos = SERVO1_LT;&lt;br /&gt;
	int16_t rate;&lt;br /&gt;
&lt;br /&gt;
	startStopwatch1();&lt;br /&gt;
	startStopwatch2();&lt;br /&gt;
&lt;br /&gt;
	// IMPORTANT:&lt;br /&gt;
	sensor_board_init();						// RP6 Sensor Board init!!!&lt;br /&gt;
	setServoPower(1);							// Servo power ON!&lt;br /&gt;
/*&lt;br /&gt;
	// ----------------------------------------------&lt;br /&gt;
	// Set RTC once (battery empty or not existing:&lt;br /&gt;
	rtc_time.second = 0;&lt;br /&gt;
	rtc_time.minute = 15;&lt;br /&gt;
	rtc_time.hour = 20;				// 20:15&lt;br /&gt;
	rtc_date.weekday = R_SU;&lt;br /&gt;
	rtc_date.day = 20;&lt;br /&gt;
	rtc_date.month = 4;&lt;br /&gt;
	rtc_date.year = 2014;			// Su, 20.4.2014&lt;br /&gt;
	DS1339_write();&lt;br /&gt;
	// Remove this, if RTC is set and running!!!&lt;br /&gt;
	// ----------------------------------------------&lt;br /&gt;
*/&lt;br /&gt;
	while(true) &lt;br /&gt;
	{&lt;br /&gt;
		if(getStopwatch1() &amp;gt; 1000) // 1s&lt;br /&gt;
		{&lt;br /&gt;
			if (onoff) onoff = 0;&lt;br /&gt;
			else onoff = 1;&lt;br /&gt;
&lt;br /&gt;
			// Interrupt status:&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nInterrupt Status:      &amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(interrupt_RP6SBstatus.byte, BIN, 8);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			// Inport status:&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;Inport Status: &amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(inport.word, BIN, 16);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			// Temperature sensor test:&lt;br /&gt;
			temperature = LM75B_measure();		// Measure&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;Temperature: &amp;quot;);&lt;br /&gt;
			writeDouble_WIFI(temperature, 7, 3);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;°\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			// LED driver test:&lt;br /&gt;
			if (onoff) {&lt;br /&gt;
				setLED(HEADLIGHT_R, STATE_ON);&lt;br /&gt;
				setLED(HEADLIGHT_L, STATE_OFF);&lt;br /&gt;
			}&lt;br /&gt;
			else {&lt;br /&gt;
				setLED(HEADLIGHT_L, STATE_ON);&lt;br /&gt;
				setLED(HEADLIGHT_R, STATE_OFF);&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			// Servo controller test (SERVO_1):&lt;br /&gt;
			setServo(1, servopos);&lt;br /&gt;
			servopos += 10;&lt;br /&gt;
			if (servopos &amp;gt; SERVO1_RT) servopos = SERVO1_LT;&lt;br /&gt;
&lt;br /&gt;
			// RTC test:&lt;br /&gt;
			DS1339_read();&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;RTC: &amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(rtc_time.hour, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;:&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(rtc_time.minute, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;:&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(rtc_time.second, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;  &amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(rtc_date.day, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;.&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(rtc_date.month, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;.&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(rtc_date.year, DEC, 4);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			// 3D Magnetometer &amp;amp; Accelerometer test:&lt;br /&gt;
			//  LSM303DLHC accelerometer:&lt;br /&gt;
			task_I2CTWI();&lt;br /&gt;
			readLSM303DLHC_A();					// Get sensor values&lt;br /&gt;
			task_I2CTWI();&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\n3D-Acceleration SENSOR -&amp;gt;\n&amp;quot;);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;X-axis: &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(x_axisa, DEC);&lt;br /&gt;
			writeChar_WIFI('\n');&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;Y-axis: &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(y_axisa, DEC);&lt;br /&gt;
			writeChar_WIFI('\n');&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;Z-axis: &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(z_axisa, DEC);&lt;br /&gt;
			writeChar_WIFI('\n');&lt;br /&gt;
			normalizeLSM303DLHC_A();			// Normalize data&lt;br /&gt;
			positionLSM303DLHC_A();				// Calculate position&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;POSITION: \n&amp;quot;);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;  Pitch [°]: &amp;quot;);&lt;br /&gt;
			writeDouble_WIFI(pitch, 6, 1);&lt;br /&gt;
			writeChar_WIFI('\n');&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;  Roll [°]:  &amp;quot;);&lt;br /&gt;
			writeDouble_WIFI(roll, 6, 1);&lt;br /&gt;
			writeChar_WIFI('\n');&lt;br /&gt;
&lt;br /&gt;
			//  LSM303DLHC magnetometer:&lt;br /&gt;
			task_I2CTWI();&lt;br /&gt;
			readLSM303DLHC_M();					// Get sensor values&lt;br /&gt;
			task_I2CTWI();&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\n3D-Compass SENSOR -&amp;gt;\n&amp;quot;);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;X-axis: &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(x_axism, DEC);&lt;br /&gt;
			writeChar_WIFI('\n');&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;Y-axis: &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(y_axism, DEC);&lt;br /&gt;
			writeChar_WIFI('\n');&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;Z-axis: &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(z_axism, DEC);&lt;br /&gt;
			writeChar_WIFI('\n');&lt;br /&gt;
			normalizeLSM303DLHC_M();			// Normalize data&lt;br /&gt;
			headingm = headingLSM303DLHC_M();	// Calculate heading&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;                 Heading [°]: &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(headingm, DEC);&lt;br /&gt;
			calculateDir(dir, headingm);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;  Direction: &amp;quot;);&lt;br /&gt;
			writeString_WIFI(dir);&lt;br /&gt;
			writeChar_WIFI('\n');&lt;br /&gt;
			headingtc = headingLSM303DLHC_TC();	// Calculate TILT COMPENSATED&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;TILT COMPENSATED heading [°]: &amp;quot;); // heading&lt;br /&gt;
			writeInteger_WIFI(headingtc, DEC);&lt;br /&gt;
			calculateDir(dir, headingtc);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;  Direction: &amp;quot;);&lt;br /&gt;
			writeString_WIFI(dir);&lt;br /&gt;
			writeChar_WIFI('\n');&lt;br /&gt;
#ifdef GET_TEMP_M&lt;br /&gt;
			temperature_mag = (double) temperaturem / 8.0 + OFFSET_TEMP_M;&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;Temperature [°]: &amp;quot;);&lt;br /&gt;
			writeDouble_WIFI(temperature_mag, 7, 2);&lt;br /&gt;
			writeChar_WIFI('\n');&lt;br /&gt;
#endif&lt;br /&gt;
			// Yaw-Rate Gyroscope test:&lt;br /&gt;
			rate = LY330ALH_measure();&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\n1D-Gyro SENSOR -&amp;gt;\n&amp;quot;);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;Z-axis: &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(rate, DEC);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			// RP6 Sensor Board shutdown (button &amp;amp; status LED test):&lt;br /&gt;
			if (pressedButton) {&lt;br /&gt;
				setStatusLED(1);&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;\nPress button again for RP6 Sensor Board SHUTDOWN!\n&amp;quot;);&lt;br /&gt;
				mSleep(2000);&lt;br /&gt;
				do {&lt;br /&gt;
					if(getStopwatch2() &amp;gt; 200) { // 0.2s&lt;br /&gt;
						if (onoff) onoff = 0;&lt;br /&gt;
						else onoff = 1;&lt;br /&gt;
						if (onoff) setStatusLED(1);&lt;br /&gt;
						else setStatusLED(0);&lt;br /&gt;
						setStopwatch2(0);&lt;br /&gt;
					}&lt;br /&gt;
					mSleep(1);&lt;br /&gt;
					task_I2CTWI();&lt;br /&gt;
				} while (!readButton());&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;\n\n\n\n\nPlease wait for RP6 Sensor Board SHUTDOWN...\n&amp;quot;);&lt;br /&gt;
				sensor_board_shutdown();&lt;br /&gt;
				mSleep(3000);&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;\n\n\nThe RP6 Sensor Board now is in SHUTDOWN MODE!!!\n&amp;quot;);&lt;br /&gt;
				mSleep(1000);&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;\nRESET the M256 microcontroller now...\n\n&amp;quot;);&lt;br /&gt;
				while(true) {};&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			setStopwatch1(0);&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		task_checkINTs();						// Read interrupt signals&lt;br /&gt;
		task_RP6SensorBoard();					// RP6 Sensor Board task&lt;br /&gt;
&lt;br /&gt;
		task_I2CTWI();&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Erklärung&lt;br /&gt;
&lt;br /&gt;
====Projekte====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===RP6 Xtra Module===&lt;br /&gt;
Die Dokumentation zu den RP6 Xtra Modulen befindet sich auf der mitgelieferten ''&amp;quot;RP6 Robot System Xtra Modules CD-ROM&amp;quot;''. Auf der CD-ROM sind auch Software-Beispiele zu finden.&lt;br /&gt;
&lt;br /&gt;
Die hier veröffentlichte Software zu den Xtra Modulen ist eine Eigenentwicklung in GCC:&lt;br /&gt;
* Arexx [[RP6_Sensor_Board_und_Xtra_Module#I2C_GPS_Empf.C3.A4nger_JM3-GPS_2|I2C GPS Empfänger JM3-GPS]]&lt;br /&gt;
* Arexx [[RP6_Sensor_Board_und_Xtra_Module#Gyro_Modul_JM3-GYRO_2|Gyro Modul JM3-GYRO]]&lt;br /&gt;
* Arexx [[RP6_Sensor_Board_und_Xtra_Module#3D_Accelerometer_Modul_JM3-3DA_2|3D Accelerometer Modul JM3-3DA]]&lt;br /&gt;
&lt;br /&gt;
====I2C GPS Empfänger JM3-GPS====&lt;br /&gt;
=====RP6M256 WiFi: I2C_GPS Library=====&lt;br /&gt;
Die nachfolgende RP6M256_I2C_GPSLib (GCC) dient zur Ansteuerung des I2C GPS Empfängers durch die RP6M256 WiFi.&lt;br /&gt;
 &lt;br /&gt;
======Libary Header======&lt;br /&gt;
Datei: RP6M256_I2C_GPSLib.h&lt;br /&gt;
&amp;lt;pre&amp;gt;/* ****************************************************************************&lt;br /&gt;
 *                           _______________________&lt;br /&gt;
 *                           \| RP6  ROBOT SYSTEM |/&lt;br /&gt;
 *                            \_-_-_-_-_-_-_-_-_-_/           &amp;gt;&amp;gt;&amp;gt; RP6 M256 WIFI&lt;br /&gt;
 * ----------------------------------------------------------------------------&lt;br /&gt;
 * ----------------------------- [c]2014 - Dirk -------------------------------&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * File: RP6M256_I2C_GPSLib.h&lt;br /&gt;
 * Version: 1.0&lt;br /&gt;
 * Target: RP6 M256 WIFI - ATMEGA2560 @16.00MHz&lt;br /&gt;
 * Author(s): Dirk&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Description:&lt;br /&gt;
 * Header file for new RP6 I2C GPS Receiver library.&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
#ifndef RP6M256_I2C_GPSLIB_H&lt;br /&gt;
#define RP6M256_I2C_GPSLIB_H&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// RP6 Sensor Board:&lt;br /&gt;
&lt;br /&gt;
// If you want to use the RP6 I2C GPS Receiver on the RP6 Sensor Board, you&lt;br /&gt;
// have to define SENSOR_BOARD (default)!&lt;br /&gt;
// If SENSOR_BOARD is NOT defined, this library assumes that the RP6 I2C GPS&lt;br /&gt;
// Receiver is used stand-alone.&lt;br /&gt;
// ------------------&lt;br /&gt;
#define SENSOR_BOARD&lt;br /&gt;
// ------------------&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Includes:&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6M256Lib.h&amp;quot;&lt;br /&gt;
#include &amp;quot;RP6I2CmasterTWI.h&amp;quot;&lt;br /&gt;
#ifdef SENSOR_BOARD&lt;br /&gt;
	#include &amp;quot;RP6M256_Sensor_BoardLib.h&amp;quot;&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// RP6 I2C GPS Receiver:&lt;br /&gt;
#define I2C_GPS_RECEIVER_ADR			0xc8	// Default&lt;br /&gt;
//#define I2C_GPS_RECEIVER_ADR			0xca&lt;br /&gt;
//#define I2C_GPS_RECEIVER_ADR			0xcc&lt;br /&gt;
//#define I2C_GPS_RECEIVER_ADR			0xce&lt;br /&gt;
//#define I2C_GPS_RECEIVER_ADR			0xd0	// DO NOT USE on Sensor Board!&lt;br /&gt;
//#define I2C_GPS_RECEIVER_ADR			0xd2&lt;br /&gt;
//#define I2C_GPS_RECEIVER_ADR			0xd4&lt;br /&gt;
//#define I2C_GPS_RECEIVER_ADR			0xd6&lt;br /&gt;
//#define I2C_GPS_RECEIVER_ADR			0xd8&lt;br /&gt;
//#define I2C_GPS_RECEIVER_ADR			0xda&lt;br /&gt;
//#define I2C_GPS_RECEIVER_ADR			0xdc&lt;br /&gt;
//#define I2C_GPS_RECEIVER_ADR			0xde&lt;br /&gt;
&lt;br /&gt;
// Read registers:&lt;br /&gt;
#define WHO_AM_I						0x20	// I2C address [0xc8..0xde]&lt;br /&gt;
#define LAT_DEG							0x21	// Degrees&lt;br /&gt;
#define LAT_MIN							0x22	// Minutes&lt;br /&gt;
#define LAT_MIN_D_L						0x23	// Minutes decimal part low&lt;br /&gt;
#define LAT_MIN_D_H						0x24	// Minutes decimal part high&lt;br /&gt;
#define LON_DEG							0x25	// Degrees&lt;br /&gt;
#define LON_MIN							0x26	// Minutes&lt;br /&gt;
#define LON_MIN_D_L						0x27	// Minutes decimal part low&lt;br /&gt;
#define LON_MIN_D_H						0x28	// Minutes decimal part high&lt;br /&gt;
#define STATUS							0x29	// Status flags&lt;br /&gt;
#define FIX_IND							0x2a	// FIX_IND&lt;br /&gt;
#define HDOP							0x2b	// HDOP&lt;br /&gt;
#define HDOP_D							0x2c	// HDOP_D&lt;br /&gt;
#define SAT_N							0x2d	// Number of satellites&lt;br /&gt;
#define COURSE_T_L						0x2e	// True heading low byte&lt;br /&gt;
#define COURSE_T_H						0x2f	// True heading high byte&lt;br /&gt;
#define COURSE_T_D						0x30	// Decimal part of course&lt;br /&gt;
#define SPEED_L							0x31	// Speed low byte&lt;br /&gt;
#define SPEED_H							0x32	// Speed high byte&lt;br /&gt;
#define SPEED_D							0x33	// Speed decimal part&lt;br /&gt;
#define ALT_L							0x34	// Altitude low byte&lt;br /&gt;
#define ALT_H							0x35	// Altitude high byte&lt;br /&gt;
#define ALT_DIF_L						0x36	// Differ. WGS-84 MSL low byte&lt;br /&gt;
#define ALT_DIF_H						0x37	// Differ. WGS-84 MSL high byte&lt;br /&gt;
#define UTC_H							0x38	// UTC hour&lt;br /&gt;
#define UTC_MIN							0x39	// UTC minute&lt;br /&gt;
#define UTC_S							0x3a	// UTC second&lt;br /&gt;
#define DAY								0x3b	// Day&lt;br /&gt;
#define YEAR_L							0x3c	// Year low byte&lt;br /&gt;
#define YEAR_H							0x3d	// Year high byte&lt;br /&gt;
#define MONTH							0x3e	// Month&lt;br /&gt;
#define PDOP							0x3f	// PDOP&lt;br /&gt;
#define PDOP_D							0x40	// PDOP_D&lt;br /&gt;
#define VDOP							0x41	// VDOP&lt;br /&gt;
#define VDOP_D							0x42	// VDOP_D&lt;br /&gt;
#define SAT_1							0x43	// SAT # 1&lt;br /&gt;
#define SAT_2							0x44	// SAT # 2&lt;br /&gt;
#define SAT_3							0x45	// SAT # 3&lt;br /&gt;
#define SAT_4							0x46	// SAT # 4&lt;br /&gt;
#define SAT_5							0x47	// SAT # 5&lt;br /&gt;
#define SAT_6							0x48	// SAT # 6&lt;br /&gt;
#define SAT_7							0x49	// SAT # 7&lt;br /&gt;
#define SAT_8							0x4a	// SAT # 8&lt;br /&gt;
#define SAT_9							0x4b	// SAT # 9&lt;br /&gt;
#define SAT_A							0x4c	// SAT # 10&lt;br /&gt;
#define SAT_B							0x4d	// SAT # 11&lt;br /&gt;
#define SAT_C							0x4e	// SAT # 12&lt;br /&gt;
#define SW_VERSION						0x4f	// SW_Version&lt;br /&gt;
#define HEARTBEAT						0x50	// Heartbeat&lt;br /&gt;
&lt;br /&gt;
// Status and Fix_Ind register bitmasks:&lt;br /&gt;
#define STATUS_NS						0b00000001&lt;br /&gt;
#define STATUS_EW						0b00000010&lt;br /&gt;
#define STATUS_SPU						0b00000100&lt;br /&gt;
#define STATUS_AUTON					0b00001000&lt;br /&gt;
#define FIX_IND_UI_FIX					0b10000000&lt;br /&gt;
&lt;br /&gt;
// Write registers:&lt;br /&gt;
#define INIT_CFG						0x90	// INIT CFG&lt;br /&gt;
#define SET_FIX_TIME					0x91	// Pos_Fix_Time&lt;br /&gt;
#define STBY							0x92	// STBY&lt;br /&gt;
#define FAC_RES							0x93	// Factory Reset&lt;br /&gt;
#define EN_JAM							0x94	// Jamming Remover&lt;br /&gt;
#define TEST_MODE						0x96	// Test Mode&lt;br /&gt;
&lt;br /&gt;
// Write register values (commands):&lt;br /&gt;
#define INIT_CFG_HOT_START				1		// Hot Start&lt;br /&gt;
#define INIT_CFG_WARM_START				2		// Warm Start init data loaded&lt;br /&gt;
#define INIT_CFG_WARM_START_EPH_CLR		3		// Warm Start Ephemeris cleared&lt;br /&gt;
#define INIT_CFG_COLD_START				4		// Cold Start&lt;br /&gt;
#define SET_FIX_TIME_1S					1		// Pos Fix Time 1 second&lt;br /&gt;
#define SET_FIX_TIME_2S					2		// Pos Fix Time 2 seconds&lt;br /&gt;
#define STBY_ENTER						1		// Standby (cleared after write)&lt;br /&gt;
#define FAC_RES_ENTER					1		// Factory Reset&lt;br /&gt;
#define EN_JAM_DISABLE					0		// Jamming Remover disable&lt;br /&gt;
#define EN_JAM_ENABLE					1		// Jamming Remover enable&lt;br /&gt;
#define TEST_MODE_INACTIVE				0		// Test Mode inactive&lt;br /&gt;
#define TEST_MODE_ACTIVE				0x15	// Test Mode active&lt;br /&gt;
&lt;br /&gt;
// Data structure (starts at LAT_DEG):&lt;br /&gt;
#define DATA_STRUCT						LAT_DEG	// Start&lt;br /&gt;
// All data from LAT_DEG to HEARTBEAT (48 bytes):&lt;br /&gt;
#define DATA_LENGTH						(HEARTBEAT - LAT_DEG + 1)&lt;br /&gt;
// Basic data from LAT_DEG to SAT_N (13 bytes):&lt;br /&gt;
#define DATA_BASIC						(SAT_N - LAT_DEG + 1)&lt;br /&gt;
&lt;br /&gt;
typedef union {&lt;br /&gt;
 	uint8_t byte;&lt;br /&gt;
	struct {&lt;br /&gt;
		unsigned ns    :1;				// 1: North 0: South&lt;br /&gt;
		unsigned ew    :1;				// 1: East 0: West&lt;br /&gt;
		unsigned spu   :1;				// 1: km/h 0: kn&lt;br /&gt;
		unsigned auton :1;				// 1: Data not valid 0: Autonomous&lt;br /&gt;
		unsigned fix0  :1;&lt;br /&gt;
		unsigned fix1  :1;&lt;br /&gt;
		unsigned stat0 :1;				// Invalid&lt;br /&gt;
		unsigned stat1 :1;				// GPS Com Error&lt;br /&gt;
	};&lt;br /&gt;
	struct {&lt;br /&gt;
		unsigned ns    :1;				// 1: North 0: South&lt;br /&gt;
		unsigned ew    :1;				// 1: East 0: West&lt;br /&gt;
		unsigned spu   :1;				// 1: km/h 0: kn&lt;br /&gt;
		unsigned auton :1;				// 1: Data not valid 0: Autonomous&lt;br /&gt;
		unsigned fix   :2;&lt;br /&gt;
		unsigned stat  :2;				// 00 -&amp;gt; Valid&lt;br /&gt;
										// 01 -&amp;gt; Invalid&lt;br /&gt;
										// 10 -&amp;gt; GPS Com Error&lt;br /&gt;
										// 11 -&amp;gt; n. def.&lt;br /&gt;
	};&lt;br /&gt;
} status_t;&lt;br /&gt;
&lt;br /&gt;
typedef union {&lt;br /&gt;
 	uint8_t byte;&lt;br /&gt;
	struct {							// Fix indicator:&lt;br /&gt;
		unsigned fix_0  :1;				//  1: GPS fix          2: DGPS fix&lt;br /&gt;
		unsigned fix_1  :1;				//  3: PPS fix          4: RTK&lt;br /&gt;
		unsigned fix_2  :1;				//  5: Float RTK        6: Dead reck.&lt;br /&gt;
		unsigned fix_3  :1;				//  7: Manual inp. mode 8: Simul. mode&lt;br /&gt;
		unsigned unused :3;&lt;br /&gt;
		unsigned ui_fix :1;				// HW signal from UC530&lt;br /&gt;
	};&lt;br /&gt;
	struct {&lt;br /&gt;
		unsigned fix    :4;				// See above &amp;quot;Fix indicator&amp;quot;!&lt;br /&gt;
		unsigned unused :3;&lt;br /&gt;
		unsigned ui_fix :1;				// HW signal from UC530&lt;br /&gt;
	};&lt;br /&gt;
} fix_ind_t;&lt;br /&gt;
&lt;br /&gt;
typedef union {&lt;br /&gt;
	struct {&lt;br /&gt;
		uint8_t   latDeg;&lt;br /&gt;
		uint8_t   latMin;&lt;br /&gt;
		uint16_t  latMinDec;&lt;br /&gt;
		uint8_t   lonDeg;&lt;br /&gt;
		uint8_t   lonMin;&lt;br /&gt;
		uint16_t  lonMinDec;&lt;br /&gt;
		status_t  status;&lt;br /&gt;
		fix_ind_t fixInd;&lt;br /&gt;
		uint8_t   hdop;&lt;br /&gt;
		uint8_t   hdopDec;&lt;br /&gt;
		uint8_t   satCount;&lt;br /&gt;
		uint16_t  course;&lt;br /&gt;
		uint8_t   courseDec;&lt;br /&gt;
		uint16_t  speed;&lt;br /&gt;
		uint8_t   speedDec;&lt;br /&gt;
		uint16_t  altitude;&lt;br /&gt;
		uint16_t  altDif;&lt;br /&gt;
		uint8_t   utcHour;&lt;br /&gt;
		uint8_t   utcMinute;&lt;br /&gt;
		uint8_t   utcSec;&lt;br /&gt;
		uint8_t   day;&lt;br /&gt;
		uint16_t  year;&lt;br /&gt;
		uint8_t   month;&lt;br /&gt;
		uint8_t   pdop;&lt;br /&gt;
		uint8_t   pdopDec;&lt;br /&gt;
		uint8_t   vdop;&lt;br /&gt;
		uint8_t   vdopDec;&lt;br /&gt;
		uint8_t   sat[12];&lt;br /&gt;
		uint8_t   swVersion;&lt;br /&gt;
		uint8_t   heartbeat;&lt;br /&gt;
	};&lt;br /&gt;
} gpsdata_t;&lt;br /&gt;
extern gpsdata_t gpsdata;&lt;br /&gt;
&lt;br /&gt;
void I2C_GPS_reset(void);&lt;br /&gt;
void I2C_GPS_write_cmd(uint8_t, uint8_t);&lt;br /&gt;
uint8_t I2C_GPS_read_reg(uint8_t);&lt;br /&gt;
void I2C_GPS_read(uint8_t);&lt;br /&gt;
void I2C_GPS_init(void);&lt;br /&gt;
void I2C_GPS_new_addr(uint8_t);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
/******************************************************************************&lt;br /&gt;
 * Additional info&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Changelog:&lt;br /&gt;
 * &lt;br /&gt;
 *  ---&amp;gt; changes are documented in the file &amp;quot;RP6M256_I2C_GPSLib.c&amp;quot;&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
======Libary Source======&lt;br /&gt;
Datei: RP6M256_I2C_GPSLib.c&lt;br /&gt;
&amp;lt;pre&amp;gt;/* ****************************************************************************&lt;br /&gt;
 *                           _______________________&lt;br /&gt;
 *                           \| RP6  ROBOT SYSTEM |/&lt;br /&gt;
 *                            \_-_-_-_-_-_-_-_-_-_/           &amp;gt;&amp;gt;&amp;gt; RP6 M256 WIFI&lt;br /&gt;
 * ----------------------------------------------------------------------------&lt;br /&gt;
 * ----------------------------- [c]2014 - Dirk -------------------------------&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * File: RP6M256_I2C_GPSLib.c&lt;br /&gt;
 * Version: 1.0&lt;br /&gt;
 * Target: RP6 M256 WIFI - ATMEGA2560 @16.00MHz&lt;br /&gt;
 *         and a RP6 I2C GPS Receiver (CONRAD 1082385)&lt;br /&gt;
 *         optionally on a RP6 Sensor Board (CONRAD 1082384)&lt;br /&gt;
 * Author(s): Dirk&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Description:&lt;br /&gt;
 * &lt;br /&gt;
 * This is our new Library that contains basic routines and functions for&lt;br /&gt;
 * accessing the RP6 I2C GPS Receiver JM3-GPS (CONRAD 1082385).&lt;br /&gt;
 * The library assumes the I2C GPS Receiver software (firmware) v1.2.&lt;br /&gt;
 * If the I2C GPS Receiver is located on the RP6 Sensor Board (CONRAD 1082384)&lt;br /&gt;
 * and connected to the I2C-MODULE plug M1, the RP6M256_Sensor_BoardLib has to&lt;br /&gt;
 * be included!&lt;br /&gt;
 * &lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Includes:&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6M256_I2C_GPSLib.h&amp;quot; 		&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Variables:&lt;br /&gt;
&lt;br /&gt;
uint8_t gpsdataBuf[DATA_LENGTH + 1]; &lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Software reset for the I2C GPS Receiver.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void I2C_GPS_reset(void)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_GPS_RECEIVER_ADR, 0, 0x06);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Writes a command cmd to a register reg of the&lt;br /&gt;
 * I2C GPS Receiver.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: reg -&amp;gt; Write register [0x90..0x96]&lt;br /&gt;
 *        cmd -&amp;gt; Command&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void I2C_GPS_write_cmd(uint8_t reg, uint8_t cmd)&lt;br /&gt;
{&lt;br /&gt;
	if((reg &amp;lt; INIT_CFG) || (reg &amp;gt; TEST_MODE)) return;&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_GPS_RECEIVER_ADR, reg, cmd);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Reads a single register reg from the I2C GPS&lt;br /&gt;
 * Receiver.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: reg -&amp;gt; Read register [0x20..0x50]&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
uint8_t I2C_GPS_read_reg(uint8_t reg)&lt;br /&gt;
{&lt;br /&gt;
	if((reg &amp;lt; WHO_AM_I) || (reg &amp;gt; HEARTBEAT)) reg = WHO_AM_I;&lt;br /&gt;
	I2CTWI_transmitByte(I2C_GPS_RECEIVER_ADR, reg);&lt;br /&gt;
	return (I2CTWI_readByte(I2C_GPS_RECEIVER_ADR));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
gpsdata_t gpsdata;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Reads the GPS data from the I2C GPS Receiver.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: length -&amp;gt; Number of data bytes [1..48]&lt;br /&gt;
 *&lt;br /&gt;
 * Hint: If length = DATA_BASIC, only basic GPS&lt;br /&gt;
 *       data are read. If length = DATA_LENGTH,&lt;br /&gt;
 *       ALL GPS data are read.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void I2C_GPS_read(uint8_t length)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t i;&lt;br /&gt;
&lt;br /&gt;
	if(length &amp;gt; DATA_LENGTH) length = DATA_LENGTH;&lt;br /&gt;
	I2CTWI_readRegisters(I2C_GPS_RECEIVER_ADR, DATA_STRUCT, gpsdataBuf, length);&lt;br /&gt;
	for(i = length; i &amp;lt; DATA_LENGTH; i++) {&lt;br /&gt;
		gpsdataBuf[i] = 0;&lt;br /&gt;
	}&lt;br /&gt;
	gpsdata.latDeg = gpsdataBuf[0];&lt;br /&gt;
	gpsdata.latMin = gpsdataBuf[1];&lt;br /&gt;
	gpsdata.latMinDec = gpsdataBuf[2] + (gpsdataBuf[3] &amp;lt;&amp;lt; 8);&lt;br /&gt;
	gpsdata.lonDeg = gpsdataBuf[4];&lt;br /&gt;
	gpsdata.lonMin = gpsdataBuf[5];&lt;br /&gt;
	gpsdata.lonMinDec = gpsdataBuf[6] + (gpsdataBuf[7] &amp;lt;&amp;lt; 8);&lt;br /&gt;
	gpsdata.status.byte = gpsdataBuf[8];&lt;br /&gt;
	gpsdata.fixInd.byte = gpsdataBuf[9];&lt;br /&gt;
	gpsdata.hdop = gpsdataBuf[10];&lt;br /&gt;
	gpsdata.hdopDec = gpsdataBuf[11];&lt;br /&gt;
	gpsdata.satCount = gpsdataBuf[12];&lt;br /&gt;
	if(length == DATA_BASIC) return;&lt;br /&gt;
	gpsdata.course = gpsdataBuf[13] + (gpsdataBuf[14] &amp;lt;&amp;lt; 8);&lt;br /&gt;
	gpsdata.courseDec = gpsdataBuf[15];&lt;br /&gt;
	gpsdata.speed = gpsdataBuf[16] + (gpsdataBuf[17] &amp;lt;&amp;lt; 8);&lt;br /&gt;
	gpsdata.speedDec = gpsdataBuf[18];&lt;br /&gt;
	gpsdata.altitude = gpsdataBuf[19] + (gpsdataBuf[20] &amp;lt;&amp;lt; 8);&lt;br /&gt;
	gpsdata.altDif = gpsdataBuf[21] + (gpsdataBuf[22] &amp;lt;&amp;lt; 8);&lt;br /&gt;
	gpsdata.utcHour = gpsdataBuf[23];&lt;br /&gt;
	gpsdata.utcMinute = gpsdataBuf[24];&lt;br /&gt;
	gpsdata.utcSec = gpsdataBuf[25];&lt;br /&gt;
	gpsdata.day = gpsdataBuf[26];&lt;br /&gt;
	gpsdata.year = gpsdataBuf[27] + (gpsdataBuf[28] * 100);&lt;br /&gt;
	gpsdata.month = gpsdataBuf[29];&lt;br /&gt;
	gpsdata.pdop = gpsdataBuf[30];&lt;br /&gt;
	gpsdata.pdopDec = gpsdataBuf[31];&lt;br /&gt;
	gpsdata.vdop = gpsdataBuf[32];&lt;br /&gt;
	gpsdata.vdopDec = gpsdataBuf[33];&lt;br /&gt;
	for(i = 34; i &amp;lt; 46; i++) {&lt;br /&gt;
		gpsdata.sat[i - 34] = gpsdataBuf[i];&lt;br /&gt;
	}&lt;br /&gt;
	gpsdata.swVersion = gpsdataBuf[46];&lt;br /&gt;
	gpsdata.heartbeat = gpsdataBuf[47];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * You MUST call this function at the beginning of a&lt;br /&gt;
 * main program, that uses the RP6 I2C GPS Receiver. &lt;br /&gt;
 * If SENSOR_BOARD is defined, the I2C-MODULE power&lt;br /&gt;
 * will be switched on with the function&lt;br /&gt;
 * setI2CModulePower() defined in the&lt;br /&gt;
 * RP6M256_Sensor_BoardLib, which will be included&lt;br /&gt;
 * then.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void I2C_GPS_init(void)&lt;br /&gt;
{&lt;br /&gt;
#ifdef SENSOR_BOARD&lt;br /&gt;
	// I2C-MODULE (plug M1) power on: &lt;br /&gt;
	setI2CModulePower(1);&lt;br /&gt;
#endif&lt;br /&gt;
	// Other init procedures here!&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Writes a new I2C address to the I2C GPS Receiver.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: addr -&amp;gt; New I2C address [0xc8..0xde]&lt;br /&gt;
 *&lt;br /&gt;
 * Hints: - Default I2C address is 0xc8.&lt;br /&gt;
 *        - You may choose a new I2C address in&lt;br /&gt;
 *          the range 0xc8..0xde.&lt;br /&gt;
 *        - After writing a new address you have&lt;br /&gt;
 *          to switch the I2C GPS Receiver off&lt;br /&gt;
 *          and on again.&lt;br /&gt;
 *        - Definition I2C_GPS_RECEIVER_ADR must&lt;br /&gt;
 *          be adapted to the new I2C address!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void I2C_GPS_new_addr(uint8_t addr)&lt;br /&gt;
{&lt;br /&gt;
	if((addr &amp;lt; 0xc8) || (addr &amp;gt; 0xde)) return;&lt;br /&gt;
	addr &amp;amp;= 0xfe;								// Clear R/W bit&lt;br /&gt;
	I2CTWI_transmit3Bytes(I2C_GPS_RECEIVER_ADR, 0, 0x04, addr);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&lt;br /&gt;
/******************************************************************************&lt;br /&gt;
 * Additional info&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Changelog:&lt;br /&gt;
 * - v. 1.0 (initial release) 21.04.2014 by Dirk&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Erklärung&lt;br /&gt;
&lt;br /&gt;
======Demo======&lt;br /&gt;
makefile:&lt;br /&gt;
&amp;lt;pre&amp;gt;...&lt;br /&gt;
TARGET = RP6M256_Sensor_Board_02&lt;br /&gt;
...&lt;br /&gt;
SRC += $(RP6_LIB_PATH)/RP6common/RP6I2CmasterTWI.c&lt;br /&gt;
&lt;br /&gt;
SRC += $(RP6_LIB_PATH)/RP6control_M256_WIFI/RP6M256_Sensor_BoardLib.c&lt;br /&gt;
SRC += $(RP6_LIB_PATH)/RP6control_M256_WIFI/RP6M256_I2C_GPSLib.c&lt;br /&gt;
...&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Datei: RP6M256_Sensor_Board_02.c&lt;br /&gt;
&amp;lt;pre&amp;gt;/* &lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * RP6 ROBOT SYSTEM - RP6 CONTROL M256 Examples&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Example: RP6M256 Sensor Board&lt;br /&gt;
 * Author(s): Dirk&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Description:&lt;br /&gt;
 * In this example we show a second test for the RP6 Sensor Board.&lt;br /&gt;
 * &lt;br /&gt;
 * ############################################################################&lt;br /&gt;
 * The Robot does NOT move in this example! You can simply put it on a table&lt;br /&gt;
 * next to your PC and you should connect it to the PC via the USB Interface!&lt;br /&gt;
 * You should also connect to it via WIFI.&lt;br /&gt;
 * ############################################################################&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Includes:&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6M256Lib.h&amp;quot; 				// The RP6 M256 Library. &lt;br /&gt;
										// Always needs to be included!&lt;br /&gt;
#include &amp;quot;RP6I2CmasterTWI.h&amp;quot;			// Include the I2C-Bus Master Library&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Include our new &amp;quot;RP6M256 I2C GPS Receiver library&amp;quot;:&lt;br /&gt;
// (This is the library for accessing the RP6 I2C GPS Receiver!)&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6M256_I2C_GPSLib.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Write a floating point number to the WIFI.&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *&lt;br /&gt;
 *			// Write a floating point number to the WIFI (no exponent):&lt;br /&gt;
 *			writeDouble_WIFI(1234567.890, 11, 3);&lt;br /&gt;
 *&lt;br /&gt;
 * The value of prec (precision) defines the number of decimal places.&lt;br /&gt;
 * For 32 bit floating point variables (float, double ...) 6 is&lt;br /&gt;
 * the max. value for prec (7 relevant digits).&lt;br /&gt;
 * The value of width defines the overall number of characters in the&lt;br /&gt;
 * floating point number including the decimal point. The number of&lt;br /&gt;
 * pre-decimal positions is: (width - prec - 1).&lt;br /&gt;
 */&lt;br /&gt;
void writeDouble_WIFI(double number, uint8_t width, uint8_t prec)&lt;br /&gt;
{char buffer[width + 1];&lt;br /&gt;
	dtostrf(number, width, prec, &amp;amp;buffer[0]);&lt;br /&gt;
	writeString_WIFI(&amp;amp;buffer[0]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Write a floating point number to the LCD.&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *&lt;br /&gt;
 *			// Write a floating point number to the LCD (no exponent):&lt;br /&gt;
 *			writeDoubleLCD(1234567.890, 11, 3);&lt;br /&gt;
 *&lt;br /&gt;
 * The value of prec (precision) defines the number of decimal places.&lt;br /&gt;
 * For 32 bit floating point variables (float, double ...) 6 is&lt;br /&gt;
 * the max. value for prec (7 relevant digits).&lt;br /&gt;
 * The value of width defines the overall number of characters in the&lt;br /&gt;
 * floating point number including the decimal point. The number of&lt;br /&gt;
 * pre-decimal positions is: (width - prec - 1).&lt;br /&gt;
 */&lt;br /&gt;
void writeDoubleLCD(double number, uint8_t width, uint8_t prec)&lt;br /&gt;
{char buffer[width + 1];&lt;br /&gt;
	dtostrf(number, width, prec, &amp;amp;buffer[0]);&lt;br /&gt;
	writeStringLCD(&amp;amp;buffer[0]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Error handler&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function gets called automatically if there was an I2C Error like&lt;br /&gt;
 * the slave sent a &amp;quot;not acknowledge&amp;quot; (NACK, error codes e.g. 0x20 or 0x30).&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void I2C_transmissionError(uint8_t errorState)&lt;br /&gt;
{&lt;br /&gt;
	writeString_P_WIFI(&amp;quot;\nI2C ERROR - TWI STATE: 0x&amp;quot;);&lt;br /&gt;
	writeInteger_WIFI(errorState, HEX);&lt;br /&gt;
	writeChar_WIFI('\n');&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Main function - The program starts here:&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
	initRP6M256();    // Always call this first! The Processor will not work&lt;br /&gt;
					  // correctly otherwise. &lt;br /&gt;
&lt;br /&gt;
	initLCD(); // Initialize the LC-Display (LCD)&lt;br /&gt;
			   // Always call this before using the LCD!&lt;br /&gt;
&lt;br /&gt;
	setLEDs(0b1111);&lt;br /&gt;
	mSleep(500);&lt;br /&gt;
	setLEDs(0b0000);&lt;br /&gt;
&lt;br /&gt;
	writeString_P_WIFI(&amp;quot;\n\nRP6 Sensor Board Selftest 2!\n&amp;quot;); &lt;br /&gt;
&lt;br /&gt;
	// IMPORTANT:&lt;br /&gt;
	I2CTWI_initMaster(100); // Initialize the TWI Module for Master operation&lt;br /&gt;
							// with 100kHz SCL Frequency&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	// Register the event handler:&lt;br /&gt;
	I2CTWI_setTransmissionErrorHandler(I2C_transmissionError);&lt;br /&gt;
&lt;br /&gt;
	setLEDs(0b1111);&lt;br /&gt;
&lt;br /&gt;
	// Write a text message to the LCD:&lt;br /&gt;
	showScreenLCD(&amp;quot;################&amp;quot;, &amp;quot;################&amp;quot;);&lt;br /&gt;
	mSleep(1500);&lt;br /&gt;
	showScreenLCD(&amp;quot;RP6v2-M256-WIFI &amp;quot;, &amp;quot;Example Program&amp;quot;);&lt;br /&gt;
	mSleep(2500); &lt;br /&gt;
	showScreenLCD(&amp;quot;RP6 Sensor Board&amp;quot;, &amp;quot;   Selftest 2&amp;quot;);&lt;br /&gt;
	mSleep(2500);&lt;br /&gt;
	clearLCD();&lt;br /&gt;
&lt;br /&gt;
	setLEDs(0b0000);&lt;br /&gt;
&lt;br /&gt;
	// ---------------------------------------&lt;br /&gt;
&lt;br /&gt;
	uint8_t onoff = 0;&lt;br /&gt;
	uint8_t i;&lt;br /&gt;
&lt;br /&gt;
	startStopwatch1();&lt;br /&gt;
	startStopwatch2();&lt;br /&gt;
&lt;br /&gt;
	// IMPORTANT:&lt;br /&gt;
	sensor_board_init();						// RP6 Sensor Board init!!!&lt;br /&gt;
	I2C_GPS_init();								// RP6 I2C GPS Receiver init&lt;br /&gt;
&lt;br /&gt;
	while(true) &lt;br /&gt;
	{&lt;br /&gt;
		if(getStopwatch1() &amp;gt; 1000) // 1s&lt;br /&gt;
		{&lt;br /&gt;
			if (onoff) onoff = 0;&lt;br /&gt;
			else onoff = 1;&lt;br /&gt;
&lt;br /&gt;
			// Show GPS data:&lt;br /&gt;
			I2C_GPS_read(DATA_LENGTH);			// Read data&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nLAT_DEG:     &amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.latDeg, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;° &amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.latMin, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;.&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.latMinDec, DEC, 4);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;' &amp;quot;);&lt;br /&gt;
			if(gpsdata.status.ns)&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;N&amp;quot;);&lt;br /&gt;
			else&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;S&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nLON_DEG:    &amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.lonDeg, DEC, 3);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;° &amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.lonMin, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;.&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.lonMinDec, DEC, 4);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;' &amp;quot;);&lt;br /&gt;
			if(gpsdata.status.ew)&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;E&amp;quot;);&lt;br /&gt;
			else&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;W&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nSTATUS:     &amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.status.byte, BIN, 8);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nFIX_IND:    &amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.fixInd.byte, BIN, 8);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nHDOP:       &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(gpsdata.hdop, DEC);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;.&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.hdopDec, DEC, 2);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nSAT_N:      &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(gpsdata.satCount, DEC);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nCOURSE_T:   &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(gpsdata.course, DEC);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;.&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.courseDec, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;°&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nSPEED:      &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(gpsdata.speed, DEC);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;.&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.speedDec, DEC, 2);&lt;br /&gt;
			if(gpsdata.status.spu)&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;km/h&amp;quot;);&lt;br /&gt;
			else&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;kn&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nALT:        &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(gpsdata.altitude, DEC);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;m\nALT_DIF:    &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(gpsdata.altDif, DEC);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;m\nUTC:        &amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.utcHour, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;:&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.utcMinute, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;:&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.utcSec, DEC, 2);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nDATE:       &amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.day, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;.&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.month, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;.&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.year, DEC, 4);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nPDOP:       &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(gpsdata.pdop, DEC);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;.&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.pdopDec, DEC, 2);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nVDOP:       &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(gpsdata.vdop, DEC);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;.&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.vdopDec, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			for(i = 0; i &amp;lt; gpsdata.satCount; i++) {&lt;br /&gt;
				if(i == 8) writeString_P_WIFI(&amp;quot;\n&amp;quot;);&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;  SAT_&amp;quot;);&lt;br /&gt;
				writeIntegerLength_WIFI(i + 1, HEX, 1);&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;: &amp;quot;);&lt;br /&gt;
				writeInteger_WIFI(gpsdata.sat[i], DEC);&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nSW_VERSION: &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(gpsdata.swVersion, DEC);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nHEARTBEAT:  &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(gpsdata.heartbeat, DEC);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			// RP6 Sensor Board shutdown (button &amp;amp; status LED test):&lt;br /&gt;
			if (pressedButton) {&lt;br /&gt;
				setStatusLED(1);&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;\nPress button again for RP6 Sensor Board SHUTDOWN!\n&amp;quot;);&lt;br /&gt;
				mSleep(2000);&lt;br /&gt;
				do {&lt;br /&gt;
					if(getStopwatch2() &amp;gt; 200) { // 0.2s&lt;br /&gt;
						if (onoff) onoff = 0;&lt;br /&gt;
						else onoff = 1;&lt;br /&gt;
						if (onoff) setStatusLED(1);&lt;br /&gt;
						else setStatusLED(0);&lt;br /&gt;
						setStopwatch2(0);&lt;br /&gt;
					}&lt;br /&gt;
					mSleep(1);&lt;br /&gt;
					task_I2CTWI();&lt;br /&gt;
				} while (!readButton());&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;\n\n\n\n\nPlease wait for RP6 Sensor Board SHUTDOWN...\n&amp;quot;);&lt;br /&gt;
				sensor_board_shutdown();&lt;br /&gt;
				mSleep(3000);&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;\n\n\nThe RP6 Sensor Board now is in SHUTDOWN MODE!!!\n&amp;quot;);&lt;br /&gt;
				mSleep(1000);&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;\nRESET the M256 microcontroller now...\n\n&amp;quot;);&lt;br /&gt;
				while(true) {};&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			setStopwatch1(0);&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		task_RP6SensorBoard();					// RP6 Sensor Board task&lt;br /&gt;
&lt;br /&gt;
		task_I2CTWI();&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Erklärung&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Gyro Modul JM3-GYRO====&lt;br /&gt;
=====Analoge Auswertung=====&lt;br /&gt;
Am Pin ''OUT'' des Gyro Moduls (siehe [http://www.rn-wissen.de/index.php/RP6_Sensor_Board_und_Xtra_Module#Anschluss-Schema Anschluss-Schema]!) liegt die Ausgangsspannung des Sensors (0..5V) an. Sie kann mit einem ADC-Eingang eines Microcontrollers gemessen werden.&lt;br /&gt;
Syntax mit den Libraries der RP6Base, M32 oder M256 WiFi (ADC Kanal 0):&lt;br /&gt;
 uint16_t result = readADC(0);&lt;br /&gt;
In der C-Control-Pro Umgebung der M128 sieht das z.B. in CompactC so aus (ADC Kanal 0):&lt;br /&gt;
 word result;&lt;br /&gt;
 ADC_Set(ADC_VREF_VCC, 0);&lt;br /&gt;
 ...&lt;br /&gt;
 result = ADC_Read();&lt;br /&gt;
Das Ergebnis ''result'' kann noch zur Weiterverarbeitung angepasst werden:&lt;br /&gt;
 #define ADCVAL_ZERORATE_LEVEL			511		// Zero rate Level&lt;br /&gt;
 ...&lt;br /&gt;
 int16_t z_axisg = result - ADCVAL_ZERORATE_LEVEL;&lt;br /&gt;
Dadurch zeigt ''z_axisg'' Null an, wenn keine Rotation anliegt und wird positiv, wenn nach LINKS gedreht wird und negativ bei RECHTS-Drehung. Die Definition ADCVAL_ZERORATE_LEVEL muss natürlich an den eigenen Sensor-Nullwert angepasst werden.&lt;br /&gt;
&lt;br /&gt;
Aus dem Absolutwert von ''z_axisg'' kann man die Drehrate (Drehgeschwindigkeit) auch bestimmen:&lt;br /&gt;
&lt;br /&gt;
In den [[RP6_Sensor_Board_und_Xtra_Module#Technische_Daten_3|Technischen Daten]] ist die Empfindlichkeit des Sensors mit '''10mV/dps''' (0,01V pro Grad und Sekunde) angegeben. Damit errechnet sich die Drehrate als:&lt;br /&gt;
 Drehrate [dps] = abs(z_axisg) * (5 / 1024 / 0.01) = abs(z_axisg) * 0.48828125&lt;br /&gt;
&lt;br /&gt;
=====Optionale Ansteuerung=====&lt;br /&gt;
Im [http://www.rn-wissen.de/index.php/RP6_Sensor_Board_und_Xtra_Module#Anschluss-Schema Anschluss-Schema] ist erkennbar, dass es noch 2 Steuerleitungen ''SLEEP/PD'' und ''ST'' gibt. Mit diesen Anschlüssen kann die Betriebsart des Gyro Moduls festgelegt werden, siehe nachfolgende Tabelle:&lt;br /&gt;
{|  {{Blauetabelle}} &lt;br /&gt;
|Betriebsart&lt;br /&gt;
|ST&lt;br /&gt;
|SLEEP/PD&lt;br /&gt;
|Stromverbrauch&lt;br /&gt;
|-&lt;br /&gt;
|Normal&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|4,2mA&lt;br /&gt;
|-&lt;br /&gt;
|Sleep&lt;br /&gt;
|0&lt;br /&gt;
|1&lt;br /&gt;
|2,2mA&lt;br /&gt;
|-&lt;br /&gt;
|Self-test&lt;br /&gt;
|1&lt;br /&gt;
|0&lt;br /&gt;
|4,2mA&lt;br /&gt;
|-&lt;br /&gt;
|Power-down&lt;br /&gt;
|1&lt;br /&gt;
|1&lt;br /&gt;
|'''5µA'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
Will man zwischen den Betriebsarten per Software umschalten, muss man die beiden Steuerleitungen mit I/O Portpins des Microcontrollers verbinden, die als Ausgänge konfiguriert sind. Braucht man diese Funktion nicht, reicht es, ''ST'' und ''SLEEP/PD'' mit GND zu verbinden (Betriebsart &amp;quot;Normal&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====3D Accelerometer Modul JM3-3DA====&lt;br /&gt;
Das 3D Accelerometer Modul kann über den I2C- oder den SPI-Bus angesteuert werden. Wird das Modul auf der RP6 CONTROL M32 Platine betrieben (es sitzt also auf dem Sockel IC5 für das 2. SPI-EEPROM), dann erfolgt die Ansteuerung über den SPI-Bus. Die SPI-Grundfunktionen befinden sich in der RP6ControlLib, die daher eingebunden werden muss.&lt;br /&gt;
&lt;br /&gt;
=====RP6 CONTROL M32: ACCSENS Library=====&lt;br /&gt;
Die nachfolgende RP6ControlACCSENSLib (GCC) dient zur Ansteuerung des 3D Accelerometer Moduls durch die RP6 CONTROL M32.&lt;br /&gt;
&lt;br /&gt;
======Configuration Header======&lt;br /&gt;
Vor dem Kompilieren der Library muss eine Anpassung des Configuration Headers an die eigenen Hardware-Voraussetzungen erfolgen.&lt;br /&gt;
Dazu gibt es im Configuration Header eine Definition:&lt;br /&gt;
* EXP_STACK_1 -&amp;gt; Die RP6 CONTROL M32 sitzt auf dem vorderen Platinenstapel 1 des RP6&lt;br /&gt;
Im nachfolgenden Listing ist die Definition EXP_STACK_1 NICHT aktiv (d.h. die M32 sitzt auf dem hinteren Platinenstapel 2!). Dies muss an die eigene Hardware angepaßt werden. Wenn die RP6 CONTROL M32 auf dem vorderen Platinenstapel 1 des RP6 sitzt, muss die Zeile mit &amp;quot;EXP_STACK_1&amp;quot; &amp;quot;aktiviert&amp;quot; werden. Dazu entfernt man &amp;quot;//&amp;quot; am Zeilenanfang:&lt;br /&gt;
 #define EXP_STACK_1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Bevor man den Beschleunigungssensor nutzen kann, muss man ihn kalibrieren:&lt;br /&gt;
&lt;br /&gt;
'''Accelerometer:'''&lt;br /&gt;
* Die X-Achse wird kalibriert, indem man den RP6 mit der rechten Seite nach unten hält und den Maximalwert in MAX_X_A einträgt. Dann neigt man ihn auf seine linke Seite und trägt den negativen Maximalwert in MIN_X_A ein.&lt;br /&gt;
* Die Y-Achse wird kalibriert, indem man den RP6 mit der Vorderseite nach oben hält und den Maximalwert in MAX_Y_A einträgt. Dann kippt man die Vorderseite nach unten und trägt den negativen Maximalwert in MIN_Y_A ein.&lt;br /&gt;
* Die Z-Achse wird kalibriert, indem man den RP6 normal waagerecht hält und den Maximalwert in MAX_Z_A einträgt. Dann dreht man den RP6 &amp;quot;auf den Kopf&amp;quot; und trägt den negativen Maximalwert in MIN_Z_A ein.&lt;br /&gt;
* Sollten die angezeigten Pitch- und Roll-Werte nach der Kalibrierung der Achsen und genau waagerecht stehendem Sensor bzw. RP6 vom Nullwert deutlich abweichen, kann man sie mithilfe der Definitionen OFFSET_PITCH_A und OFFSET_ROLL_A &amp;quot;nullen&amp;quot;. Die Einheit dieser Definitionen ist °.&lt;br /&gt;
Nach dem Eintragen der Kalibrierungswerte muss das Programm neu kompiliert werden!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Datei: RP6ControlACCSENS.h&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;/* ****************************************************************************&lt;br /&gt;
 *                           _______________________&lt;br /&gt;
 *                           \| RP6  ROBOT SYSTEM |/&lt;br /&gt;
 *                            \_-_-_-_-_-_-_-_-_-_/             &amp;gt;&amp;gt;&amp;gt; RP6 CONTROL&lt;br /&gt;
 * ----------------------------------------------------------------------------&lt;br /&gt;
 * ----------------------------- [c]2014 - Dirk -------------------------------&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * File: RP6ControlACCSENS.h&lt;br /&gt;
 * Version: 1.0&lt;br /&gt;
 * Target: RP6 CONTROL - ATMEGA32 @16.00MHz&lt;br /&gt;
 * Author(s): Dirk&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Description:&lt;br /&gt;
 * Configuration header file for new ACCSENS library.&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * THE CHANGELOG CAN BE FOUND AT THE END OF THIS FILE!&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
#ifndef RP6CONTROLACCSENS_H&lt;br /&gt;
#define RP6CONTROLACCSENS_H&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Sensor position on the RP6 robot:&lt;br /&gt;
// (If EXP_STACK_1 is defined, the RP6 CONTROL M32 is located on the front&lt;br /&gt;
//  stack for addon boards on the RP6 robot. If EXP_STACK_1 is NOT defined&lt;br /&gt;
//  (default), the RP6 CONTROL M32 is mounted on the rear stack.)&lt;br /&gt;
// -------------------&lt;br /&gt;
//#define EXP_STACK_1&lt;br /&gt;
// -------------------&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// The following sensor is used:&lt;br /&gt;
// - 3D Accelerometer Modul (CONRAD 1082387-62) with LIS302DLH 3-axis&lt;br /&gt;
//   accelerometer&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// LIS302DLH accelerometer calibration data:&lt;br /&gt;
#define MAX_X_A						32767		// Max. X-axis value&lt;br /&gt;
#define MIN_X_A						-32768		// Min. X-axis value&lt;br /&gt;
#define MAX_Y_A						32767		// Max. Y-axis value&lt;br /&gt;
#define MIN_Y_A						-32768		// Min. Y-axis value&lt;br /&gt;
#define MAX_Z_A						32767		// Max. Z-axis value&lt;br /&gt;
#define MIN_Z_A						-32768		// Min. Z-axis value&lt;br /&gt;
#define OFFSET_PITCH_A				0.0			// Offset Pitch [°]&lt;br /&gt;
#define OFFSET_ROLL_A				0.0			// Offset Roll [°]&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
/******************************************************************************&lt;br /&gt;
 * Additional info&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Changelog:&lt;br /&gt;
 * &lt;br /&gt;
 *  ---&amp;gt; changes are documented in the file &amp;quot;RP6ControlACCSENSLib.c&amp;quot;&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
======Library Header======&lt;br /&gt;
Datei: RP6ControlACCSENSLib.h&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;/* ****************************************************************************&lt;br /&gt;
 *                           _______________________&lt;br /&gt;
 *                           \| RP6  ROBOT SYSTEM |/&lt;br /&gt;
 *                            \_-_-_-_-_-_-_-_-_-_/             &amp;gt;&amp;gt;&amp;gt; RP6 CONTROL&lt;br /&gt;
 * ----------------------------------------------------------------------------&lt;br /&gt;
 * ----------------------------- [c]2014 - Dirk -------------------------------&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * File: RP6ControlACCSENSLib.h&lt;br /&gt;
 * Version: 1.0&lt;br /&gt;
 * Target: RP6 CONTROL - ATMEGA32 @16.00MHz&lt;br /&gt;
 * Author(s): Dirk&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Description:&lt;br /&gt;
 * This is the RP6ControlACCSENSLib header file.&lt;br /&gt;
 * You have to include this file, if you want to use the library&lt;br /&gt;
 * RP6ControlACCSENSLib.c in your own projects.&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * THE CHANGELOG CAN BE FOUND AT THE END OF THIS FILE!&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
#ifndef RP6CONTROLACCSENSLIB_H&lt;br /&gt;
#define RP6CONTROLACCSENSLIB_H&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Includes:&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6ControlLib.h&amp;quot; 		// The RP6 Control Library (v. 1.1 or higher). &lt;br /&gt;
#include &amp;quot;RP6ControlACCSENS.h&amp;quot;&lt;br /&gt;
#include &amp;lt;math.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&lt;br /&gt;
#define ACC_CS							MEM_CS2&lt;br /&gt;
#define DEVICE_IDENTIFIER				0x32&lt;br /&gt;
&lt;br /&gt;
// Registers:&lt;br /&gt;
#define WHO_AM_I						0x0f&lt;br /&gt;
#define CTRL_REG1						0x20&lt;br /&gt;
#define CTRL_REG2						0x21&lt;br /&gt;
#define CTRL_REG3						0x22&lt;br /&gt;
#define CTRL_REG4						0x23&lt;br /&gt;
#define CTRL_REG5						0x24&lt;br /&gt;
#define HP_FILTER_RESET					0x25&lt;br /&gt;
#define REFERENCE						0x26&lt;br /&gt;
#define STATUS_REG						0x27&lt;br /&gt;
#define OUT_X_L							0x28&lt;br /&gt;
#define OUT_X_H							0x29&lt;br /&gt;
#define OUT_Y_L							0x2a&lt;br /&gt;
#define OUT_Y_H							0x2b&lt;br /&gt;
#define OUT_Z_L							0x2c&lt;br /&gt;
#define OUT_Z_H							0x2d&lt;br /&gt;
#define INT1_CFG						0x30&lt;br /&gt;
#define INT1_SOURCE						0x31&lt;br /&gt;
#define INT1_THS						0x32&lt;br /&gt;
#define INT1_DURATION					0x33&lt;br /&gt;
#define INT2_CFG						0x34&lt;br /&gt;
#define INT2_SOURCE						0x35&lt;br /&gt;
#define INT2_THS						0x36&lt;br /&gt;
#define INT2_DURATION					0x37&lt;br /&gt;
&lt;br /&gt;
// Control Register bitmasks:&lt;br /&gt;
#define CTRL_REG1_POWERDOWN				0b00000000&lt;br /&gt;
#define CTRL_REG1_3D_DEFAULT			0b00000111&lt;br /&gt;
#define CTRL_REG1_3D_LOPWR_10HZ			0b11000111&lt;br /&gt;
#define CTRL_REG2_DEFAULT				0b00000000&lt;br /&gt;
#define CTRL_REG3_DEFAULT				0b00000000&lt;br /&gt;
#define CTRL_REG4_DEFAULT				0b00000000&lt;br /&gt;
#define CTRL_REG4_BDU_2G				0b10000000&lt;br /&gt;
#define CTRL_REG4_BDU_2G_STSIGN			0b10001000&lt;br /&gt;
#define CTRL_REG4_BDU_BLE_2G			0b11000000&lt;br /&gt;
#define CTRL_REG4_BDU_BLE_2G_STSIGN		0b11001000&lt;br /&gt;
#define CTRL_REG5_DEFAULT				0b00000000&lt;br /&gt;
&lt;br /&gt;
// Read/write address bitmasks:&lt;br /&gt;
#define READ_MASK						0b10000000&lt;br /&gt;
#define READ_AUTOINC_MASK				0b11000000&lt;br /&gt;
#define WRITE_MASK						0b01111111&lt;br /&gt;
&lt;br /&gt;
extern int16_t x_axisa, y_axisa, z_axisa;&lt;br /&gt;
extern double pitch, roll;&lt;br /&gt;
extern double xa, ya, za;&lt;br /&gt;
extern double the, phi;&lt;br /&gt;
&lt;br /&gt;
uint8_t SPI_ACCSENS_readByte(uint8_t regAddr);&lt;br /&gt;
void SPI_ACCSENS_readBytes(uint8_t startAddr, uint8_t *buffer, uint8_t length);&lt;br /&gt;
void SPI_ACCSENS_writeByte(uint8_t regAddr, uint8_t data);&lt;br /&gt;
uint8_t SPI_ACCSENS_getStatus(void);&lt;br /&gt;
&lt;br /&gt;
void SPI_ACCSENS_init(void);&lt;br /&gt;
void SPI_ACCSENS_shutdown(void);&lt;br /&gt;
void SPI_ACCSENS_read(void);&lt;br /&gt;
void SPI_ACCSENS_normalize(void);&lt;br /&gt;
void SPI_ACCSENS_position(void);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
/******************************************************************************&lt;br /&gt;
 * Additional info&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Changelog:&lt;br /&gt;
 * &lt;br /&gt;
 *  ---&amp;gt; changes are documented in the file &amp;quot;RP6ControlACCSENSLib.c&amp;quot;&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
======Library Source======&lt;br /&gt;
Datei: RP6ControlACCSENSLib.c&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;/* ****************************************************************************&lt;br /&gt;
 *                           _______________________&lt;br /&gt;
 *                           \| RP6  ROBOT SYSTEM |/&lt;br /&gt;
 *                            \_-_-_-_-_-_-_-_-_-_/             &amp;gt;&amp;gt;&amp;gt; RP6 CONTROL&lt;br /&gt;
 * ----------------------------------------------------------------------------&lt;br /&gt;
 * ----------------------------- [c]2014 - Dirk -------------------------------&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * File: RP6ControlACCSENSLib.c&lt;br /&gt;
 * Version: 1.0&lt;br /&gt;
 * Target: RP6 CONTROL - ATMEGA32 @16.00MHz&lt;br /&gt;
 *         with optional LC-Display 16x2 chars (CONRAD 190911-62)&lt;br /&gt;
 *         and a 3D Accelerometer Modul (CONRAD 1082387-62) (IC5)&lt;br /&gt;
 * Author(s): Dirk&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Description:&lt;br /&gt;
 * This is my RP6 Control ACCSENS Library. This library may be used to access&lt;br /&gt;
 * the basic functions of the 3D Accelerometer Modul. This RP6 Xtra module may&lt;br /&gt;
 * be placed on the IC5 socket on the RP6 CONTROL M32 instead of a second&lt;br /&gt;
 * EEPROM.&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * THE CHANGELOG CAN BE FOUND AT THE END OF THIS FILE!&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
 &lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Includes:&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6ControlACCSENSLib.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// SPI functions:&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Reads a single register from the 3D Accelerometer&lt;br /&gt;
 * Modul (ACCSENS).&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
uint8_t SPI_ACCSENS_readByte(uint8_t regAddr)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t data;&lt;br /&gt;
	regAddr |= READ_MASK;						// Read byte&lt;br /&gt;
	PORTB &amp;amp;= ~ACC_CS;&lt;br /&gt;
	writeSPI(regAddr);&lt;br /&gt;
	data = readSPI();&lt;br /&gt;
	PORTB |= ACC_CS;&lt;br /&gt;
	return data;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Reads &amp;quot;length&amp;quot; bytes into the buffer &amp;quot;buffer&amp;quot;&lt;br /&gt;
 * from startAddr on. &lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void SPI_ACCSENS_readBytes(uint8_t startAddr, uint8_t *buffer, uint8_t length)&lt;br /&gt;
{&lt;br /&gt;
	startAddr |= READ_AUTOINC_MASK;				// Read byte, auto increment&lt;br /&gt;
	PORTB &amp;amp;= ~ACC_CS;&lt;br /&gt;
	writeSPI(startAddr);&lt;br /&gt;
	readBufferSPI(&amp;amp;buffer[0], length);&lt;br /&gt;
	PORTB |= ACC_CS;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Write a single data byte to the specified sensor&lt;br /&gt;
 * address.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void SPI_ACCSENS_writeByte(uint8_t regAddr, uint8_t data)&lt;br /&gt;
{&lt;br /&gt;
	PORTB &amp;amp;= ~ACC_CS;&lt;br /&gt;
	writeSPI(regAddr);&lt;br /&gt;
	writeSPI(data);&lt;br /&gt;
	PORTB |= ACC_CS;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Returns sensor status register - for checking if&lt;br /&gt;
 * sensor is busy. &lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
uint8_t SPI_ACCSENS_getStatus(void)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t status;&lt;br /&gt;
	PORTB &amp;amp;= ~ACC_CS;&lt;br /&gt;
	writeSPI(STATUS_REG);&lt;br /&gt;
	status = readSPI();&lt;br /&gt;
	PORTB |= ACC_CS;&lt;br /&gt;
	return status;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// 3D accelerometer functions:&lt;br /&gt;
&lt;br /&gt;
int16_t x_axisa, y_axisa, z_axisa;&lt;br /&gt;
double pitch, roll;&lt;br /&gt;
double xa, ya, za;&lt;br /&gt;
double the, phi;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Initializes the sensor. You must call this&lt;br /&gt;
 * function at the beginning of a program, that&lt;br /&gt;
 * uses the 3D Accelerometer Modul.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void SPI_ACCSENS_init(void)&lt;br /&gt;
{&lt;br /&gt;
	// All axes enable, low power, 10Hz output data rate:&lt;br /&gt;
	SPI_ACCSENS_writeByte(CTRL_REG1, CTRL_REG1_3D_LOPWR_10HZ);&lt;br /&gt;
	// No update while reading, +- 2g, self-test minus:&lt;br /&gt;
	SPI_ACCSENS_writeByte(CTRL_REG4, CTRL_REG4_BDU_2G_STSIGN);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Sets the LIS302DLH power-down mode. If you&lt;br /&gt;
 * do not need the sensor, you can save energy&lt;br /&gt;
 * by using the sensor power-down mode.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void SPI_ACCSENS_shutdown(void)&lt;br /&gt;
{&lt;br /&gt;
	// LIS302DLH in power-down mode:&lt;br /&gt;
	SPI_ACCSENS_writeByte(CTRL_REG1, CTRL_REG1_POWERDOWN);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function reads the X-axis, Y-axis and Z-axis&lt;br /&gt;
 * values from the LIS302DLH accelerometer and stores&lt;br /&gt;
 * them in the global variables x_axisa, y_axisa and&lt;br /&gt;
 * z_axisa.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void SPI_ACCSENS_read(void)&lt;br /&gt;
{&lt;br /&gt;
#ifndef EXP_STACK_1&lt;br /&gt;
	// Default sensor position (M32 located on the RP6 rear stack):&lt;br /&gt;
	// xb = -y:&lt;br /&gt;
	x_axisa = SPI_ACCSENS_readByte(OUT_Y_L) | (SPI_ACCSENS_readByte(OUT_Y_H) &amp;lt;&amp;lt; 8);&lt;br /&gt;
	x_axisa *= -1;&lt;br /&gt;
	// yb = -x:&lt;br /&gt;
	y_axisa = SPI_ACCSENS_readByte(OUT_X_L) | (SPI_ACCSENS_readByte(OUT_X_H) &amp;lt;&amp;lt; 8);&lt;br /&gt;
	y_axisa *= -1;&lt;br /&gt;
	// zb = z:&lt;br /&gt;
	z_axisa = SPI_ACCSENS_readByte(OUT_Z_L) | (SPI_ACCSENS_readByte(OUT_Z_H) &amp;lt;&amp;lt; 8);&lt;br /&gt;
#else&lt;br /&gt;
	// Other sensor position (M32 located on the RP6 front stack):&lt;br /&gt;
	// xb = y:&lt;br /&gt;
	x_axisa = SPI_ACCSENS_readByte(OUT_Y_L) | (SPI_ACCSENS_readByte(OUT_Y_H) &amp;lt;&amp;lt; 8);&lt;br /&gt;
	// yb = x:&lt;br /&gt;
	y_axisa = SPI_ACCSENS_readByte(OUT_X_L) | (SPI_ACCSENS_readByte(OUT_X_H) &amp;lt;&amp;lt; 8);&lt;br /&gt;
	// zb = z:&lt;br /&gt;
	z_axisa = SPI_ACCSENS_readByte(OUT_Z_L) | (SPI_ACCSENS_readByte(OUT_Z_H) &amp;lt;&amp;lt; 8);&lt;br /&gt;
#endif&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function limits and normalizes the x-axisa,&lt;br /&gt;
 * y-axisa and z-axisa values read from the LIS302DLH&lt;br /&gt;
 * accelerometer with the function SPI_ACCSENS_read() and&lt;br /&gt;
 * stores them in the global double variables xa, ya and&lt;br /&gt;
 * za.&lt;br /&gt;
 * It also calculates the position in space in form of the&lt;br /&gt;
 * tilt angles (the = pitch, phi = roll) and stores them&lt;br /&gt;
 * in the global double variables the and phi.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void SPI_ACCSENS_normalize(void)&lt;br /&gt;
{&lt;br /&gt;
	// Limit raw values:&lt;br /&gt;
	if (x_axisa &amp;lt; MIN_X_A) x_axisa = MIN_X_A;&lt;br /&gt;
	if (x_axisa &amp;gt; MAX_X_A) x_axisa = MAX_X_A;&lt;br /&gt;
	if (y_axisa &amp;lt; MIN_Y_A) y_axisa = MIN_Y_A;&lt;br /&gt;
	if (y_axisa &amp;gt; MAX_Y_A) y_axisa = MAX_Y_A;&lt;br /&gt;
	if (z_axisa &amp;lt; MIN_Z_A) z_axisa = MIN_Z_A;&lt;br /&gt;
	if (z_axisa &amp;gt; MAX_Z_A) z_axisa = MAX_Z_A;&lt;br /&gt;
	xa = (double) x_axisa / 10000.0;&lt;br /&gt;
	ya = (double) y_axisa / 10000.0;&lt;br /&gt;
	za = (double) z_axisa / 10000.0;&lt;br /&gt;
	// Calculate Pitch and Roll:&lt;br /&gt;
	phi = asin(xa);								// Calculate the and phi&lt;br /&gt;
	the = asin(ya / cos(the));					//  from the raw values&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function calculates the position in space by&lt;br /&gt;
 * using the the and phi values (see function&lt;br /&gt;
 * SPI_ACCSENS_normalize()!). It stores the position&lt;br /&gt;
 * in the global double variables pitch and roll. &lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void SPI_ACCSENS_position(void)&lt;br /&gt;
{&lt;br /&gt;
	pitch = the * 180 / M_PI + OFFSET_PITCH_A;&lt;br /&gt;
	roll = phi * 180 / M_PI + OFFSET_ROLL_A;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/******************************************************************************&lt;br /&gt;
 * Additional info&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Changelog:&lt;br /&gt;
 * - v. 1.0 (initial release) 04.04.2014 by Dirk&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Erklärung&lt;br /&gt;
&lt;br /&gt;
======Demo======&lt;br /&gt;
makefile:&lt;br /&gt;
&amp;lt;pre&amp;gt;...&lt;br /&gt;
TARGET = RP6Control_01_ACCSENS&lt;br /&gt;
...&lt;br /&gt;
SRC += $(RP6_LIB_PATH)/RP6control/RP6ControlLib.c&lt;br /&gt;
SRC += $(RP6_LIB_PATH)/RP6common/RP6uart.c&lt;br /&gt;
SRC += $(RP6_LIB_PATH)/RP6control/RP6ControlACCSENSLib.c&lt;br /&gt;
...&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Datei: RP6Control_01_ACCSENS.c&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;// Uncommented Version of RP6Control_01_ACCSENS.c&lt;br /&gt;
// written by Dirk&lt;br /&gt;
// ------------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6ControlACCSENSLib.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void writeDouble(double number, uint8_t width, uint8_t prec)&lt;br /&gt;
{char buffer[width + 1];&lt;br /&gt;
	dtostrf(number, width, prec, &amp;amp;buffer[0]);&lt;br /&gt;
	writeString(&amp;amp;buffer[0]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void writeDoubleLCD(double number, uint8_t width, uint8_t prec)&lt;br /&gt;
{char buffer[width + 1];&lt;br /&gt;
	dtostrf(number, width, prec, &amp;amp;buffer[0]);&lt;br /&gt;
	writeStringLCD(&amp;amp;buffer[0]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
	initRP6Control();&lt;br /&gt;
&lt;br /&gt;
	writeString_P(&amp;quot;\n\nRP6Control SPI ACCSENS Test Program!\n&amp;quot;); &lt;br /&gt;
	setLEDs(0b1111);&lt;br /&gt;
	mSleep(50);&lt;br /&gt;
	initLCD(); &lt;br /&gt;
	showScreenLCD(&amp;quot;################&amp;quot;, &amp;quot;################&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
	showScreenLCD(&amp;quot;  SPI ACCSENS&amp;quot;, &amp;quot;  Test Program&amp;quot;);&lt;br /&gt;
	mSleep(1000);&lt;br /&gt;
	setLEDs(0b0000);&lt;br /&gt;
&lt;br /&gt;
	SPI_ACCSENS_init();&lt;br /&gt;
&lt;br /&gt;
	uint8_t whoami = SPI_ACCSENS_readByte(WHO_AM_I);&lt;br /&gt;
	writeString_P(&amp;quot;\nWHO AM I: &amp;quot;);&lt;br /&gt;
	writeInteger(whoami, HEX);&lt;br /&gt;
	writeChar('\n');&lt;br /&gt;
	mSleep(2000);&lt;br /&gt;
	&lt;br /&gt;
	startStopwatch1();&lt;br /&gt;
&lt;br /&gt;
	while(true) &lt;br /&gt;
	{&lt;br /&gt;
		if(getStopwatch1() &amp;gt; 1000)&lt;br /&gt;
		{&lt;br /&gt;
			SPI_ACCSENS_read();&lt;br /&gt;
			writeString_P(&amp;quot;\n3D Accelerometer SENSOR -&amp;gt;\n&amp;quot;);&lt;br /&gt;
			writeString_P(&amp;quot;X-axis: &amp;quot;);&lt;br /&gt;
			writeInteger(x_axisa, DEC);&lt;br /&gt;
			writeChar('\n');&lt;br /&gt;
			writeString_P(&amp;quot;Y-axis: &amp;quot;);&lt;br /&gt;
			writeInteger(y_axisa, DEC);&lt;br /&gt;
			writeChar('\n');&lt;br /&gt;
			writeString_P(&amp;quot;Z-axis: &amp;quot;);&lt;br /&gt;
			writeInteger(z_axisa, DEC);&lt;br /&gt;
			writeChar('\n');&lt;br /&gt;
			SPI_ACCSENS_normalize();&lt;br /&gt;
			SPI_ACCSENS_position();&lt;br /&gt;
			writeString_P(&amp;quot;POSITION: \n&amp;quot;);&lt;br /&gt;
			writeString_P(&amp;quot;  Pitch [°]: &amp;quot;);&lt;br /&gt;
			writeDouble(pitch, 6, 1);&lt;br /&gt;
			writeChar('\n');&lt;br /&gt;
			writeString_P(&amp;quot;  Roll [°]:  &amp;quot;);&lt;br /&gt;
			writeDouble(roll, 6, 1);&lt;br /&gt;
			writeChar('\n');&lt;br /&gt;
			setCursorPosLCD(0, 0);&lt;br /&gt;
			writeStringLCD_P(&amp;quot;P&amp;quot;);&lt;br /&gt;
			writeDoubleLCD(pitch, 6, 1);&lt;br /&gt;
			writeStringLCD_P(&amp;quot; &amp;quot;);&lt;br /&gt;
			setCursorPosLCD(0, 8);&lt;br /&gt;
			writeStringLCD_P(&amp;quot;R&amp;quot;);&lt;br /&gt;
			writeDoubleLCD(roll, 6, 1);&lt;br /&gt;
			writeStringLCD_P(&amp;quot; &amp;quot;);&lt;br /&gt;
			setCursorPosLCD(1, 0);&lt;br /&gt;
			writeStringLCD_P(&amp;quot;X&amp;quot;);&lt;br /&gt;
			writeIntegerLCD(x_axisa, DEC);&lt;br /&gt;
			writeStringLCD_P(&amp;quot;   &amp;quot;);&lt;br /&gt;
			setCursorPosLCD(1, 5);&lt;br /&gt;
			writeStringLCD_P(&amp;quot;Y&amp;quot;);&lt;br /&gt;
			writeIntegerLCD(y_axisa, DEC);&lt;br /&gt;
			writeStringLCD_P(&amp;quot;   &amp;quot;);&lt;br /&gt;
			setCursorPosLCD(1, 10);&lt;br /&gt;
			writeStringLCD_P(&amp;quot;Z&amp;quot;);&lt;br /&gt;
			writeIntegerLCD(z_axisa, DEC);&lt;br /&gt;
			writeStringLCD_P(&amp;quot;    &amp;quot;);&lt;br /&gt;
			mSleep(2000);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Erklärung&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Erfahrungsberichte==&lt;br /&gt;
&lt;br /&gt;
...in Arbeit...(kann aber gerne ergänzt werden)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Siehe auch==&lt;br /&gt;
* [[RP6v2]]&lt;br /&gt;
* [[RP6]]&lt;br /&gt;
* [[RP6 - Programmierung]]&lt;br /&gt;
* [[RP6 Kamera - Mitmach-Projekt]]&lt;br /&gt;
* [[RP6v2 I2C-Portexpander]]&lt;br /&gt;
* [[RP6v2 USB-RS232-Adapter]]&lt;br /&gt;
* [[RP6v2 Orientierung]]&lt;br /&gt;
* [[RP6 Multi IO Projekt]]&lt;br /&gt;
* [[RP6 Multi IO Projekt - Software]]&lt;br /&gt;
* [[Induktive_Ladestation_f%C3%BCr_den_RP6|Induktive Ladestation für den RP6]]&lt;br /&gt;
* [[IR-bake_f%C3%BCr_den_RP6|IR-bake für den RP6]]&lt;br /&gt;
* [[CCRP5]]&lt;br /&gt;
* [[Yeti]]&lt;br /&gt;
* [[Asuro]]&lt;br /&gt;
* [[C't-Bot]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Weblinks==&lt;br /&gt;
'''Siehe auch die Weblinks im [http://www.rn-wissen.de/index.php/RP6v2#Weblinks RP6v2] und im [http://www.rn-wissen.de/index.php/RP6#Weblinks RP6] Artikel!'''&lt;br /&gt;
&lt;br /&gt;
* [http://www.conrad.de/ce/de/product/1082384/Arexx-RP6-Sensor-Board-RP6-JM03-61 RP6 Sensor Board bei CONRAD]&lt;br /&gt;
* JM3 Engeneering: [http://www.jm3-engineering.com/rp6.htm RP6 Roboter Erweiterung]&lt;br /&gt;
* Ankündigung einer Sensorerweiterungsplatine für die RP6v2 M256 WiFi im [http://www.roboternetz.de/community/threads/63595-Neue-Hardware-f%C3%BCr-RP6%28v2%29?p=590129&amp;amp;viewfull=1#post590129 Roboternetz RP6 Forum]&lt;br /&gt;
* Erfahrungsbericht zum Sensor Board im [http://www.arexx.com/forum/viewtopic.php?f=19&amp;amp;t=2498 AREXX Support Forum] und im [http://www.roboternetz.de/community/threads/64414-RP6-Sensor-Board-Erster-Eindruck Roboternetz RP6 Forum]&lt;br /&gt;
* Erfahrungsbericht zum I2C GPS Empfänger im [http://www.arexx.com/forum/viewtopic.php?f=19&amp;amp;t=2509 AREXX Support Forum]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Kategorie:Robotikeinstieg]]	 &lt;br /&gt;
[[Kategorie:Praxis]]&lt;br /&gt;
&lt;br /&gt;
==Autoren==&lt;br /&gt;
--[[Benutzer:Dirk|Dirk]] 17:16, 8. Jul 2014 (CET)&lt;/div&gt;</summary>
		<author><name>Dirk NO2</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=RP6_Sensor_Board_und_Xtra_Module&amp;diff=24813</id>
		<title>RP6 Sensor Board und Xtra Module</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=RP6_Sensor_Board_und_Xtra_Module&amp;diff=24813"/>
				<updated>2014-07-08T15:15:23Z</updated>
		
		<summary type="html">&lt;p&gt;Dirk NO2: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Bild:RP6_Sensor_Board.jpg|Das RP6 Sensor Board|right|500px]]&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_Xtra_module.JPG|RP6 Xtra module|right|500px]]&lt;br /&gt;
==Was bisher geschah==&lt;br /&gt;
'''Siehe auch &amp;quot;Was bisher geschah&amp;quot; im [http://www.rn-wissen.de/index.php/RP6v2#Was_bisher_geschah RP6v2] und im [http://www.rn-wissen.de/index.php/RP6#Was_bisher_geschah RP6] Artikel!'''&lt;br /&gt;
&lt;br /&gt;
Mit, 27. Nov 2013 - Ankündigung einer Sensorerweiterungsplatine, die an die RP6v2-M256-WIFI angeschlossen werden kann&amp;lt;br/&amp;gt;&lt;br /&gt;
Sam, 22. Feb 2014 - Auslieferungsbeginn des RP6 Sensor Boards, des I2C GPS Empfängers, des 3D Accelerometer Moduls und des Gyro Moduls&amp;lt;br/&amp;gt;&lt;br /&gt;
Mon, 17. Mär 2014 - Das RP6 Sensor Board ist &amp;quot;nicht lieferbar&amp;quot;, neuer Liefertermin angekündigt für den 12.06.2014 (!?)&amp;lt;br/&amp;gt;&lt;br /&gt;
Die, 25. Mär 2014 - Das RP6 Sensor Board ist wieder &amp;quot;sofort lieferbar&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Allgemein==&lt;br /&gt;
Dieser Artikel beschreibt die Grundlagen und Programmierung des RP6 Sensor Boards und der RP6 Xtra Module. Dieses Erweiterungs-Modul und die Xtra Module sind Teile des RP6-Systems, das in den RN-Wissen-Artikeln [[RP6]], [[RP6v2]] und [[RP6_-_Programmierung|RP6 - Programmierung]] ausführlich beschrieben wird. Ausgegliedert aus den &amp;quot;Haupt-Artikeln&amp;quot; habe ich diese Module, da sie m.E. zu einer neuen &amp;quot;Ära&amp;quot; des RP6-Systems gehören:&lt;br /&gt;
&lt;br /&gt;
Sie wurden nicht mehr von '''[[Benutzer:SlyD|SlyD]] (Dominik S. Herwald)''' in Zusammenarbeit mit '''[http://www.arexx.com/ AREXX]''' entwickelt, sondern nun von '''[http://jm3-engineering.com/ JM3 Engeneering] (Dipl.-Ing. Jürgen Maisel)'''. Ab Februar 2014 waren dann das '''RP6 Sensor Board RP6-JM03-61''' ([http://www.conrad.de/ce/de/product/1082384/Arexx-RP6-Sensor-Board-RP6-JM03-61 1082384]) und die drei RP6 Xtra Module '''I2C GPS Empfänger JM3-GPS''' ([http://www.conrad.de/ce/de/product/1082385/Arexx-IC-GPS-Empfaenger-JM3-GPS 1082385]), '''Gyro Modul JM3-GYRO''' ([http://www.conrad.de/ce/de/product/1082386/Arexx-Gyro-Modul-JM3-GYRO 1082386]) und '''3D Accelerometer Modul JM3-3DA''' ([http://www.conrad.de/ce/de/product/1082387/Arexx-3D-Accelerometer-Modul-JM3-3DA 1082387]) bei CONRAD lieferbar. Einen ersten Eindruck vom Sensor Board kann man im RoboterNetz und AREXX Support Forum bekommen,- siehe unter [[RP6_Sensor_Board_und_Xtra_Module#Weblinks|Weblinks]]!&lt;br /&gt;
&lt;br /&gt;
===RP6 Sensor Board===&lt;br /&gt;
Das [[RP6_Sensor_Board_und_Xtra_Module#RP6_Sensor_Board_2|RP6 Sensor Board]] gehört zu den &amp;quot;Erweiterungs-Modulen&amp;quot; des RP6-Systems. '''Andere &amp;quot;Erweiterungs-Module&amp;quot; werden im [[RP6v2#Erweiterungs-Module|RP6v2]] und im [[RP6#Erweiterungs-Module|RP6]] Artikel beschrieben!'''&lt;br /&gt;
&lt;br /&gt;
Das ''RP6 Sensor Board'' ist das erste &amp;quot;Erweiterungs-Modul&amp;quot;, das nicht über einen eigenen Microprozessor verfügt,- es ist also ein ''passives Modul'', das von einem Microprozessor-System (z.B. RP6v2, M32, M128, M256 Wifi) angesteuert werden muss. Es ist ebenfalls das erste Modul, das nicht mehr über die rautenförmige Einbuchtung an der Vorderkante verfügt, sondern komplett rechteckig ist. Damit passt es (montiert auf den Standard-Abstandbolzen) nur auf den vorderen Platinenstapel 1 des RP6.&lt;br /&gt;
&lt;br /&gt;
===RP6 Xtra Module===&lt;br /&gt;
Die [[RP6_Sensor_Board_und_Xtra_Module#RP6_Xtra_Module_2|RP6 Xtra Module]] gehören zu den &amp;quot;Zubehör- und Ersatzteilen&amp;quot; des RP6-Systems. '''Über die weiteren &amp;quot;Zubehör- und Ersatzteile&amp;quot; zum RP6 informiert der entsprechende Abschnitt im [[RP6v2#Zubeh.C3.B6r_und_Ersatzteile|RP6v2]] und im [[RP6#Zubehör und Ersatzteile|RP6]] Artikel!'''&lt;br /&gt;
&lt;br /&gt;
Die ''RP6 Xtra Module'' unterscheiden sich von den weiteren &amp;quot;Zubehör- und Ersatzteilen&amp;quot; dadurch, dass sie selbstständige Sensor-Platinen sind, die ideal zum RP6-System passen, aber auch mit anderen Microcontroller-Plattformen nutzbar sind.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==RP6 Sensor Board==&lt;br /&gt;
Das RP6 Sensor Board RP6-JM03-61 ([http://www.conrad.de/ce/de/product/1082384/Arexx-RP6-Sensor-Board-RP6-JM03-61 1082384]) wurde am 27.11.2013 von [[Benutzer:SlyD|SlyD]] angekündigt (siehe Weblink!).&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_Sensor_Board.jpg|Das RP6 Sensor Board]]&lt;br /&gt;
&lt;br /&gt;
===Beschreibung===&lt;br /&gt;
(Laut Online-Katalog der Firma CONRAD!)&lt;br /&gt;
&lt;br /&gt;
''&amp;quot;Das RP6 Sensor Board erweitert die Möglichkeiten aller RP6 Roboter um wesentliche Sensorsignale für Robotik-Anwendungen wie zum Beispiel Dreharten (Yaw-Gyro), Kipp- und Neigewinkel, Kompassrichtung oder aber auch Zeit und Datum.&lt;br /&gt;
Sie können einfach mit zusätzlichen Sharp Sensoren Abstände genau messen, z.B. für autonome Fahrrouten oder falls der Sensor nach unten gerichtet ist, kann er Treppenstufen oder ähnliches entdecken. Außerdem gibt es die Möglichkeit z.B. die Sharp Sensoren ein- bzw. auszuschalten um Strom zu sparen. Zusätzlich können bis zu 8 Servos angesteuert werden um z.B. einen Roboterarm zu bewegen, der auch mechanisch einfach zu montieren ist. Um die Möglichkeiten des RP6 Sensor Boards komplett ausnutzen zu können, wird ein RP6V2 und RP6Wifi Control Board empfohlen. Die ermöglicht den Roboter über Wifi fernzusteuern oder Sensordaten auf dem Kommandozentrum (PC) z.B Kompassdaten, Temperatur oder Kipp- und Neigewinkel anzeigen zu lassen.&amp;quot;''&lt;br /&gt;
&lt;br /&gt;
'''Ausstattung'''&lt;br /&gt;
* Magnetometer- und Accelerometer für Kompassfunktion&lt;br /&gt;
* Gyro Sensor (Yaw)&lt;br /&gt;
* Sharp-Sensor Schnittstelle&lt;br /&gt;
* LED Scheinwerfer&lt;br /&gt;
* LED Treiber mit Smart Funktionen&lt;br /&gt;
* I²C Bus mit max. 400 kHz Übertragungsrate; Hot Swap I²C-Bus Buffer&lt;br /&gt;
* Taster mit LED&lt;br /&gt;
* Echtzeit-Uhr RTC&lt;br /&gt;
* Backupbatterie (Aufladung während des Betriebs)&lt;br /&gt;
* Expansion Port z.B. für GPS-I²C Bus Modul&lt;br /&gt;
* 8 Servo-Ausgänge mit eigenem Schaltregler&lt;br /&gt;
* 8 PWM Ausgänge&lt;br /&gt;
* 5 LED Ausgänge und 2 Digital-I/O Ausgänge.&lt;br /&gt;
&lt;br /&gt;
'''Lieferumfang'''&lt;br /&gt;
* RP6 Sensor Board&lt;br /&gt;
* Montage-Kit&lt;br /&gt;
* Kabel&lt;br /&gt;
* Anleitung und CD mit Dokumentation.&lt;br /&gt;
&lt;br /&gt;
====Blockschaltbild====&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_Sensor_Board_BSP.png|RP6 Sensor Board Blockschaltbild]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Technische Daten===&lt;br /&gt;
{|  {{Blauetabelle}} &lt;br /&gt;
|'''Mikrocontroller:'''&lt;br /&gt;
|kein&lt;br /&gt;
|-&lt;br /&gt;
|'''Speicher:'''&lt;br /&gt;
|kein&amp;lt;br/&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|'''Programmierung:'''&lt;br /&gt;
|C++ (GCC, u.a.) über externes µC-System&lt;br /&gt;
|-&lt;br /&gt;
|'''Vorhandene Sensoren:'''&lt;br /&gt;
|Temperatur, 3D Magnetfeld (Kompass), 3D Beschleunigung, Yaw-Gyro&amp;lt;br/&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|'''Vorhandene Aktoren:'''&lt;br /&gt;
|LED Controller (2 LEDs on board, 5 freie LED Ports), Status LED,&amp;lt;br/&amp;gt;Button, Servo (PWM) Controller für 8 Servos und 8 PWM-Kanäle,&amp;lt;br/&amp;gt;Real Time Clock (RTC), 2 freie I/O Ports&lt;br /&gt;
|-&lt;br /&gt;
|'''Abmessungen:'''&lt;br /&gt;
|(L &amp;amp;times; B &amp;amp;times; H) 112 &amp;amp;times; 90 &amp;amp;times; 19 mm&amp;lt;br/&amp;gt;(B + 5 mm durch Scheinwerfer vorn)&lt;br /&gt;
|-&lt;br /&gt;
|'''Ausführung:'''&lt;br /&gt;
|Fertig aufgebautes Erweiterungsmodul&lt;br /&gt;
|-&lt;br /&gt;
|'''Stromversorgung:'''&lt;br /&gt;
|6 AA NiMH Akkus (über die RP6v2 Base)&amp;lt;br/&amp;gt;und optionaler Zusatzakku 7,2..10 V für Servo Power&lt;br /&gt;
|-&lt;br /&gt;
|'''Hersteller:'''&lt;br /&gt;
|Arexx Niederlande&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Umbau-Optionen===&lt;br /&gt;
Hier soll beschrieben werden, welche Umbau-Optionen es für das RP6 Sensor Board gibt. Im Text gibt es Verweise auf den Schaltplan des RP6 Sensor Boards (RP6_Sensor_Board_Rev2_Schema.pdf) in der Form: (SP2: Bauteil). Dies bedeutet, dass man das Bauteil auf Blatt 2 des Schaltplans finden kann. Beispielhaft sind im folgenden Text Bestell-Nummern der Firma [http://www.conrad.de/ce/ CONRAD] genannt. Natürlich kann man die Teile auch bei anderen Versendern beziehen.&lt;br /&gt;
&lt;br /&gt;
====USRBUS- und XBUS-Wannenstecker====&lt;br /&gt;
Der zweite Wannenstecker für den XBUS (SP3: K14) und USRBUS (SP3: K16) kann nachbestückt werden.&lt;br /&gt;
Man braucht dazu: &lt;br /&gt;
* 2 Wannenstecker 2x5-polig gerade RM 2,54mm (CONRAD [http://www.conrad.de/ce/de/product/741648/Stiftleiste-Print-Montage-gerade-Rastermass-254-mm-Pole-2-x-5-10120554-BKL-Electronic-Inhalt-1-St/ 741648])&lt;br /&gt;
Die Wannenstecker lötet man auf die eingezeichneten Positionen.&lt;br /&gt;
&lt;br /&gt;
'''USRBUS-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''USRBUS''' || '''Sensor Board-Funktion''' || '''Verwendung''' || '''I/O'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Y1 || &amp;quot;ADC0&amp;quot; || SHARP vorn || I&lt;br /&gt;
|-&lt;br /&gt;
| 2 || Y2 || &amp;quot;ADC1&amp;quot; || Yaw-Gyro || I&lt;br /&gt;
|-&lt;br /&gt;
| 3 || Y3 || PWR || Power für&amp;lt;br/&amp;gt;SHARPs, CAM_IF,&amp;lt;br/&amp;gt;I2C-MODULE || O&lt;br /&gt;
|-&lt;br /&gt;
| 4 || Y4 || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 5 || Y5 || &amp;quot;ADC4&amp;quot; || SHARP hinten ||I&lt;br /&gt;
|-&lt;br /&gt;
| 6..14 || Y6..Y14 || || keine ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
'''XBUS-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''XBUS''' || '''M256-Port''' ||'''M256-Funktion''' || '''Sensor Board-Funktion''' || '''Jumper''' || '''Verwendung''' || '''I/O'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || GND || || GND || GND || || ||&lt;br /&gt;
|-&lt;br /&gt;
| 2 || GND || || GND || GND || || ||&lt;br /&gt;
|-&lt;br /&gt;
| 3 || VDD || || VDD|| VDD_1 || || VDD +5V ||&lt;br /&gt;
|-&lt;br /&gt;
| 4 || +UB || || +UB || VSS_1 || || CAM_IF Power ||&lt;br /&gt;
|-&lt;br /&gt;
| 5 || VDD || || VDD || VDD_1 || || VDD +5V ||&lt;br /&gt;
|-&lt;br /&gt;
| 6 || +UB || || +UB || VSS_1 || || CAM_IF Power ||&lt;br /&gt;
|-&lt;br /&gt;
| 7 || INTU || PJ4 || PCINT13 || INTU || || keine || I&lt;br /&gt;
|-&lt;br /&gt;
| 8 || INT1 || PJ3 || PCINT12 || INT1 || 3 || LSM303DLHC: INT1 || I&lt;br /&gt;
|-&lt;br /&gt;
| 9 || INT3 || PJ5 || PCINT14 || INT3 || 2&amp;lt;br/&amp;gt;5 || DS1339: SQW/INT_N&amp;lt;br/&amp;gt;LSM303DLHC: INT2 || I&amp;lt;br/&amp;gt;I&lt;br /&gt;
|-&lt;br /&gt;
| 10 || SCL || PD0 || SCL || SCL_M || || I2C-Bus || O&lt;br /&gt;
|-&lt;br /&gt;
| 11 || INT2 || PJ6 || PCINT15 || INT2 || 4 || MAX7311: INT_N || I&lt;br /&gt;
|-&lt;br /&gt;
| 12 || SDA || PD1 || SDA || SDA_M || || I2C-Bus || I/O&lt;br /&gt;
|-&lt;br /&gt;
| 13 || MRESET || || MRESET || MRESET || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 14 || GND || || GND || GND || || ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====I/O-Patchfield_1====&lt;br /&gt;
Dieses 2x 5-polige &amp;quot;Patchfield_1&amp;quot; (SP3: K8), beschriftet mit &amp;quot;I/O&amp;quot; liegt neben dem Wannenstecker I/O und weist dieselbe Belegung auf. Möchte man auf dem Sensor Board Verbindungen über den Wannenstecker I/O zu einer angeschlossenen Microprozessor-Platine herstellen, dann kann man auf das &amp;quot;Patchfield_1&amp;quot; eine Stiftleiste löten.&lt;br /&gt;
Man braucht dazu: &lt;br /&gt;
* 2-reihige Stiftleiste RM 2,54mm (z.B. 2x40-polig [http://www.conrad.de/ce/de/product/741306/Doppelreihige-Stiftleiste-RM-254-gerade-Pole-2-x-40-10120173-BKL-Electronic-Inhalt-1-St 741306]) &lt;br /&gt;
Man trennt von der 2-reihigen Stiftleiste 2x5 Kontakte ab und lötet sie auf die Lötpunkte &amp;quot;I/O&amp;quot;. Zuvor muss man u.U. Lötzinnreste aus den Lötpunkten mit Entlötlitze bzw. Entlötsaugpumpe entfernen.&lt;br /&gt;
&lt;br /&gt;
'''Stecker I/O an M256 IO_PWM/T0/T1:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''M256-Port''' ||'''M256-Funktion''' || '''Sensor Board-Funktion''' || '''Verwendung''' || '''I/O'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || PD4 || ICP1 || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 2 || || GND || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 3 || PD6 || T1 || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 4 || PB7 || OC0A || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 5 || PG5 || OC0B || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 6 || PD7 || T0 || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 7 || PB5 || OC1A || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 8 || PK5 || ADC13 || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 9 || PB6 || OC1B || &amp;quot;PD5&amp;quot; || I2C Bus Buffer Enable || O&lt;br /&gt;
|-&lt;br /&gt;
| 10 || || VDD || || keine ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====ADC-Patchfield_2====&lt;br /&gt;
Dieses 2x 5-polige &amp;quot;Patchfield_2&amp;quot; (SP3: K9), beschriftet mit &amp;quot;ADC&amp;quot; liegt neben dem Wannenstecker ADC und weist dieselbe Belegung auf. Möchte man auf dem Sensor Board Verbindungen über den Wannenstecker ADC zu einer angeschlossenen Microprozessor-Platine herstellen, dann kann man auf das &amp;quot;Patchfield_2&amp;quot; eine Stiftleiste löten.&lt;br /&gt;
Man braucht dazu: &lt;br /&gt;
* 2-reihige Stiftleiste RM 2,54mm (z.B. 2x40-polig [http://www.conrad.de/ce/de/product/741306/Doppelreihige-Stiftleiste-RM-254-gerade-Pole-2-x-40-10120173-BKL-Electronic-Inhalt-1-St 741306]) &lt;br /&gt;
Man trennt von der 2-reihigen Stiftleiste 2x5 Kontakte ab und lötet sie auf die Lötpunkte &amp;quot;ADC&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
'''Stecker ADC an M256 ADC_IO2/CMP:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''M256-Port''' ||'''M256-Funktion''' || '''Sensor Board-Funktion''' || '''Jumper''' || '''Verwendung''' || '''I/O'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || PK0 || ADC8 || || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 2 || || GND || || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 3 || PK1 || ADC9 || &amp;quot;ADC4&amp;quot; || 6 || SHARP hinten || I&lt;br /&gt;
|-&lt;br /&gt;
| 4 || PE3 || OC3A/AIN1 || || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 5 || PK2 || ADC10 || || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 6 || || GND || || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 7 || PK3 || ADC11 || || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 8 || PE2 || XCK0/AIN0 || || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 9 || PK4 || ADC12 || || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 10 || || VDD || || || keine ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Anschluss-Optionen===&lt;br /&gt;
Hier soll beschrieben werden, welche Anschluss-Optionen es für das RP6 Sensor Board gibt. In erster Linie geht es dabei um die Belegung der vorhandenen Stecker bzw. Stiftleisten.&lt;br /&gt;
&lt;br /&gt;
Allgemein kann man Anschlüsse an Stiftleisten mit entsprechenden Steckbuchsen erreichen. Solche Steckbuchsen sind z.B. bei ELV erhältlich:&lt;br /&gt;
* Steckbuchse, 2-polig, RM 2,54mm ([http://www.elv.de/steckbuchse-2-polig.html ELV 68-016635])&lt;br /&gt;
* Steckbuchse, 3-polig, RM 2,54mm ([http://www.elv.de/steckbuchse-3-polig.html ELV 68-022503])&lt;br /&gt;
* Steckbuchse, 5-polig, RM 2,54mm ([http://www.elv.de/steckbuchse-5-polig.html ELV 68-023073])&lt;br /&gt;
Die Crimpkontakte dieser Steckbuchse werden an Litzen angequetscht (oder angelötet) und zum entsprechenden Sensor bzw. Aktor geführt. &lt;br /&gt;
&lt;br /&gt;
====I2C-MODULE====&lt;br /&gt;
Der I2C-MODULE Anschluss (SP1: M1) auf dem Sensor Board besteht aus einer 9-poligen Präzisions-Buchsenleiste RM 2,54mm (z.B. [http://www.conrad.de/ce/de/product/741360/Praezisions-Buchsenleiste-RM-254-gerade-Pole-1-x-20-10120832-BKL-Electronic-Inhalt-1-St 741360]). Wenn man eigene I2C-Module hier anschliessen will, braucht man zur Kontaktierung:&lt;br /&gt;
* Präzisions-Stiftleiste, 9-polig, RM 2,54mm (z.B. [http://www.conrad.de/ce/de/product/741307/Praezisions-Stiftleiste-RM-254-gerade-Pole-1-x-20-10120536-BKL-Electronic-Inhalt-1-St 741307])&lt;br /&gt;
&lt;br /&gt;
'''I2C-MODULE-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''Sensor Board&amp;lt;br/&amp;gt;-Funktion (M1)''' || '''Verwendung''' || '''I/O''' |||| [[RP6_Sensor_Board_und_Xtra_Module#I2C_GPS_Empf.C3.A4nger_JM3-GPS|'''I2C GPS Empfänger]]&amp;lt;br/&amp;gt;-Funktion (K1)'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || VCC || +5V || |||| VCC_1&lt;br /&gt;
|-&lt;br /&gt;
| 2 || SCLOUT || Buffered I2C-Bus || O |||| SCL/SCK&lt;br /&gt;
|-&lt;br /&gt;
| 3 || SDAOUT || Buffered I2C-Bus || I/O |||| SDA/MOSI&lt;br /&gt;
|-&lt;br /&gt;
| 4 || NC || keine || ||||&lt;br /&gt;
|-&lt;br /&gt;
| 5 || I/O1 || Status LED || O ||||&lt;br /&gt;
|-&lt;br /&gt;
| 6 || I/O2 || Taster || I ||||&lt;br /&gt;
|-&lt;br /&gt;
| 7 || NC || keine || ||||&lt;br /&gt;
|-&lt;br /&gt;
| 8 || GND || GND (geschaltet!) || |||| GND&lt;br /&gt;
|-&lt;br /&gt;
| 9 || GND || GND (geschaltet!) || |||| GND&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====CAM_IF====&lt;br /&gt;
Der CAM_IF Anschluss (SP1: K28) ist eine 2x 3-polige Stiftleiste mit der folgenden Belegung:&lt;br /&gt;
&lt;br /&gt;
'''CAM_IF-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''Sensor Board&amp;lt;br/&amp;gt;-Funktion (K28)''' || '''Verwendung''' || '''I/O'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || GND || GND (geschaltet!) ||&lt;br /&gt;
|-&lt;br /&gt;
| 2 || VSS_1 || +7,2..10V (RP6: +UB) ||&lt;br /&gt;
|-&lt;br /&gt;
| 3 || SCLOUT || Buffered I2C-Bus || O&lt;br /&gt;
|-&lt;br /&gt;
| 4 || SDAOUT || Buffered I2C-Bus || I/O&lt;br /&gt;
|-&lt;br /&gt;
| 5 || SCL_M || I2C-Bus || O&lt;br /&gt;
|-&lt;br /&gt;
| 6 || SDA_M || I2C-Bus || I/O&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====IO_EXT====&lt;br /&gt;
Der IO_EXT Anschluss (SP1: K19) ist eine 2x 2-polige Stiftleiste mit der folgenden Belegung:&lt;br /&gt;
&lt;br /&gt;
'''IO_EXT-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''Sensor Board&amp;lt;br/&amp;gt;-Funktion (K19)''' || '''Verwendung''' || '''I/O'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || MAX7311: I/O1.2 || freier I/O Port || I/O&lt;br /&gt;
|-&lt;br /&gt;
| 2 || GND || ||&lt;br /&gt;
|-&lt;br /&gt;
| 3 || MAX7311: I/O1.1 || freier I/O Port || I/O&lt;br /&gt;
|-&lt;br /&gt;
| 4 || GND || ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====PWM_OUT====&lt;br /&gt;
Der PWM_OUT Anschluss (SP5: K12) ist eine 2x 4-polige Stiftleiste mit der folgenden Belegung:&lt;br /&gt;
&lt;br /&gt;
'''PWM_OUT-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''Sensor Board&amp;lt;br/&amp;gt;-Funktion (K12)''' || '''Verwendung''' || '''I/O'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || PCA9685: PWM0 || freier PWM Port || O&lt;br /&gt;
|-&lt;br /&gt;
| 2 || PCA9685: PWM1 || freier PWM Port || O&lt;br /&gt;
|-&lt;br /&gt;
| 3 || PCA9685: PWM2 || freier PWM Port || O&lt;br /&gt;
|-&lt;br /&gt;
| 4 || PCA9685: PWM3 || freier PWM Port || O&lt;br /&gt;
|-&lt;br /&gt;
| 5 || PCA9685: PWM4 || freier PWM Port || O&lt;br /&gt;
|-&lt;br /&gt;
| 6 || PCA9685: PWM5 || freier PWM Port || O&lt;br /&gt;
|-&lt;br /&gt;
| 7 || PCA9685: PWM6 || freier PWM Port || O&lt;br /&gt;
|-&lt;br /&gt;
| 8 || PCA9685: PWM7 || freier PWM Port || O&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====TP1====&lt;br /&gt;
Am Testpunkt TP1 (SP4: TP1) kann man das Signal SQW/INT_N der RTC (DS1339) prüfen/messen.&lt;br /&gt;
&lt;br /&gt;
====LEDs====&lt;br /&gt;
=====Rücklichter=====&lt;br /&gt;
Der Rücklichter Anschluss (SP1: K10) ist eine 2-polige Stiftleiste mit der folgenden Belegung:&lt;br /&gt;
&lt;br /&gt;
'''Rücklichter-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''Sensor Board&amp;lt;br/&amp;gt;-Funktion (K10)''' || '''Verwendung''' || '''I/O'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || TCA6507: P3 || Rücklicht rechts || O&lt;br /&gt;
|-&lt;br /&gt;
| 2 || TCA6507: P4 || Rücklicht links || O&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=====Display-Hintergrundbeleuchtung=====&lt;br /&gt;
Der Display-Hintergrundbeleuchtung Anschluss (SP1: K7) ist eine 2-polige Stiftleiste mit der folgenden Belegung:&lt;br /&gt;
&lt;br /&gt;
'''Display-Hintergrundbeleuchtung-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''Sensor Board&amp;lt;br/&amp;gt;-Funktion (K7)''' || '''Verwendung''' || '''I/O'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || TCA6507: P0 || Display-Hintergrundbeleuchtung || O&lt;br /&gt;
|-&lt;br /&gt;
| 2 || VDD_1 || +5V ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=====Freie Ausgänge=====&lt;br /&gt;
Der freie Ausgang 1 Anschluss (SP1: K4) ist eine 2-polige Stiftleiste mit der folgenden Belegung:&lt;br /&gt;
&lt;br /&gt;
'''Freier Ausgang 1-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''Sensor Board&amp;lt;br/&amp;gt;-Funktion (K4)''' || '''Verwendung''' || '''I/O'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || TCA6507: P1 || freier LED Port || O&lt;br /&gt;
|-&lt;br /&gt;
| 2 || VDD_1 || +5V ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Der freie Ausgang 2 Anschluss (SP1: K2) ist eine 2-polige Stiftleiste mit der folgenden Belegung:&lt;br /&gt;
&lt;br /&gt;
'''Freier Ausgang 2-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''Sensor Board&amp;lt;br/&amp;gt;-Funktion (K2)''' || '''Verwendung''' || '''I/O'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || TCA6507: P2 || freier LED Port || O&lt;br /&gt;
|-&lt;br /&gt;
| 2 || VDD_1 || +5V ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====SHARP Sensoren====&lt;br /&gt;
Das RP6 Sensor Board verfügt über zwei Stecker SHARP_F (SP1: K5) und SHARP_R (SP1: K3) zum Anschluß von analogen SHARP Infrarot-Distanz-Sensoren. Folgende SHARP Sensoren sind anschließbar:&lt;br /&gt;
* 1. SHARP Distanz-Sensor GP2Y0A41SK0F ([http://www.conrad.de/ce/de/product/504596/Distanz-Sensor-GP2Y0A41SK0F-Sharp-GP2Y0A41SK0F-Messbereiche-Erfassungsbereich-4-30-cm-5-VDC 504596]), Messbereich 4..30cm&lt;br /&gt;
* 2. SHARP Distanz-Sensor GP2Y0A21YK0F ([http://www.conrad.de/ce/de/product/504591/Distanz-Sensor-GP2Y0A21YK0F-Sharp-GP2Y0A21YK0F-Messbereiche-Erfassungsbereich-10-80-cm-5-VDC 504591]), Messbereich 10..80cm&lt;br /&gt;
* 3. SHARP Distanz-Sensor GP2Y0A02YK ([http://www.conrad.de/ce/de/product/185364/Distanz-Sensor-GP-2-Y0A-02-YK-Sharp-GP-2-Y0A-02-YK-Messbereiche-Erfassungsbereich-20-150-cm-5-VDC 185364]), Messbereich 20..150cm&lt;br /&gt;
* 4. SHARP Distanz-Sensor GP2Y0A710K0F ([http://www.conrad.de/ce/de/product/504597/Distanz-Sensor-GP2Y0A710K0F-Sharp-GP2Y0A710K0F-Messbereiche-Erfassungsbereich-100-550-cm-5-VDC 504597]), Messbereich 100..550cm&lt;br /&gt;
''Die Auswahl der geeigneten SHARP Sensoren hängt von der gewünschten Funktion ab: Zur Erkundung großer Räume eignet sich insbesondere der Typ 4 mit einer hohen Reichweite von 5,5m. Er ist aber ungeeignet, die Distanz von Objekten zu erkennen, die sich näher als 1m vor dem Sensor befinden. Ein guter Kompromiss zwischen Nahbereichsmessung und &amp;quot;Fernsicht&amp;quot; sind die Typen 2 (10..80cm) und 3 (20..150cm). Will man den Distanz-Sensor vor allem zur Vermeidung eins Sturzes von einer Treppe (Tiefenerkennung) oder nur zur Erkennung von Hindernissen direkt vor dem Roboter (Kollisionserkennung) benutzen, dann eignet sich insbesondere für den vorderen Sensor (SHARP_F) der Typ 1, da er im Nahbereich von 4 bis 30cm messen kann.''&lt;br /&gt;
&lt;br /&gt;
Für die Verbindung zwischen den beiden 3-poligen JST XH Steckern (K3, 5) auf dem Sensor Board und den SHARP-Sensoren braucht man auf der Sensor Board Seite folgende Stecker-/buchsenteile:&lt;br /&gt;
* 2x JST XH Gehäuse, 3-polig, RM 2,5mm ([http://www.conrad.de/ce/de/product/740583/Gehaeuse-RM-25-mm-Serie-XH-Rastermass-25-mm-Pole-3-Nennstrom-3-A-XHP-3-JST-Inhalt-1-St 740583])&lt;br /&gt;
* 6x JST XH Crimpkontakt f. RM 2,5mm ([http://www.conrad.de/ce/de/product/741112/Crimpkontakt-fuer-RM-25-mm-Serie-XH-Rastermass-25-mm-BXH-001T-P06-JST-Inhalt-1-St 741112])&lt;br /&gt;
Die Crimpkontakte dieser Steckbuchse werden an die meist 3-adrige Litze des Sensors angequetscht (oder angelötet). Zur Belegung des Sensor Anschlusses siehe das jeweilige Datenblatt!&lt;br /&gt;
&lt;br /&gt;
=====Vorn=====&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_Sensor_Board_SHARP_F.JPG|RP6 Sensor Board SHARP Sensor vorn|thumb]]&lt;br /&gt;
&lt;br /&gt;
Der vordere SHARP Sensor kann auch mechanisch am Sensor Board befestigt werden. Dazu gibt es an der Vorderkante der Platine zwei Befestigungslöcher.&lt;br /&gt;
&lt;br /&gt;
Das Bild rechts zeigt den SHARP Distanzsensor GP2Y0A02YK montiert vorn auf dem Sensor Board mit zwei M3 Gelenkbolzen ([http://www.conrad.de/ce/de/product/521043/Gelenkbolzen-1-x-Aussengewinde1-x-Innengewinde-Messing-vernickelt-Schluesselweite-55-mm/ 521043]) und passenden Schrauben/Muttern.&lt;br /&gt;
&lt;br /&gt;
'''Vorn-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''RP6v2-Port''' ||'''RP6v2-Funktion''' || '''Sensor Board&amp;lt;br/&amp;gt;-Funktion (K5)''' || '''Verwendung''' || '''I/O''' |||| '''SHARP Sensor&amp;lt;br/&amp;gt;-Funktion''' &lt;br /&gt;
|-&lt;br /&gt;
| 1 || PA0 || ADC0 || &amp;quot;ADC0&amp;quot; || SHARP vorn || I |||| Vo&lt;br /&gt;
|-&lt;br /&gt;
| 2 || || || VDD_1 || +5V || |||| Vcc&lt;br /&gt;
|-&lt;br /&gt;
| 3 || || || GND || GND (geschaltet!) || |||| GND&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=====Hinten=====&lt;br /&gt;
Der hintere SHARP Sensor kann z.B. an der Rückseite des RP6v2 Fahrgestells befestigt werden.&lt;br /&gt;
&lt;br /&gt;
'''Hinten-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''M256-Port''' ||'''M256-Funktion''' || '''Sensor Board&amp;lt;br/&amp;gt;-Funktion (K3)''' || '''Verwendung''' || '''I/O''' |||| '''SHARP Sensor&amp;lt;br/&amp;gt;-Funktion''' &lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| 1 || PK1 || ADC9 || &amp;quot;ADC4&amp;quot; || SHARP hinten || I |||| Vo&lt;br /&gt;
|-&lt;br /&gt;
| 2 || || || VDD_1 || +5V || |||| Vcc&lt;br /&gt;
|-&lt;br /&gt;
| 3 || || || GND || GND (geschaltet!) || |||| GND&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Servos====&lt;br /&gt;
=====Power=====&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_Sensor_Board_Servo-PWR.jpg|RP6 Sensor Board Servo-PWR Stecker|thumb]]&lt;br /&gt;
&lt;br /&gt;
An den SERVO_PWR Stecker (SP5: K1) muss ein Akku zur Stromversorgung der mit dem Sensor Board verbundenen Servos angeschlossen werden. Der Stecker hat folgende Belegung:&lt;br /&gt;
 &lt;br /&gt;
'''SERVO_PWR-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''Sensor Board&amp;lt;br/&amp;gt;-Funktion (K1)''' || '''Verwendung'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || GND_POWER || Servo Power GND&lt;br /&gt;
|-&lt;br /&gt;
| 2 || VSS_POWER || Servo Power Eingang +7,2..10V&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Der Akku zur Versorgung der Servos muss eine Nennspannung von 7,2..10V aufweisen. Der Schaltregler auf dem Sensor Board kann bei einer 5,0V Servo-Spannung Ströme bis 3,0A (Spitzen bis 5,0A) liefern. '''Die Polung des Akkus darf am Stecker SERVO_PWR nicht vertauscht werden.''' Siehe den oberen Teil der nebenstehende Abbildung! Ratsam ist es, eine Sicherung 3,15A in die Plusleitung zwischen Akku und SERVO_PWR Stecker zu legen.&lt;br /&gt;
&lt;br /&gt;
Für die Verbindung zwischen dem 2-poligen JST XH Stecker (SERVO_PWR, K1) auf dem Sensor Board und dem Akku braucht man auf der Sensor Board Seite folgende Stecker-/buchsenteile:&lt;br /&gt;
* JST XH Gehäuse, 2-polig, RM 2,5mm ([http://www.conrad.de/ce/de/product/740549/Gehaeuse-RM-25-mm-Serie-XH-Rastermass-25-mm-Pole-2-Nennstrom-3-A-XHP-2-JST-Inhalt-1-St 740549])&lt;br /&gt;
* 2x JST XH Crimpkontakt f. RM 2,5mm ([http://www.conrad.de/ce/de/product/741112/Crimpkontakt-fuer-RM-25-mm-Serie-XH-Rastermass-25-mm-BXH-001T-P06-JST-Inhalt-1-St 741112])&lt;br /&gt;
Die Crimpkontakte dieser Steckbuchse werden an die 2-adrige Litze zum Akku angequetscht (oder angelötet).&lt;br /&gt;
&lt;br /&gt;
Wenn man keinen separaten Akku zur Versorgung der Servos nehmen will, kann man auch +UB der RP6v2 Base dafür nutzen. An +UB liegt die Akkuspannung der Base (Nennspannung 7,2V) über eine Sicherung F1 3,15A (RP6v2) bzw. 2,5A (RP6) auf dem Mainboard an. +UB kann man z.B. am [[RP6#EXT_Anschlu.C3.9F|EXT Anschluß der Base]] entnehmen. Die nebenstehende Abbildung zeigt im unteren Teil, an welchen Pins man dort +UB kontaktieren kann!&lt;br /&gt;
&lt;br /&gt;
Dabei ist zu beachten, dass die Sicherung F1 auf dem RP6(v2) Mainboard den nutzbaren Strom für die Servos deutlich begrenzt: Durch diese Sicherung fließt ja nicht nur der Servo-Strom, sondern auch der Strom für den RP6 und alle darauf montierten Zusatzplatinen. Wenn der RP6 also herumfährt und z.B. noch die IRCOMM-Sendedioden nutzt, bleibt kaum noch Stromreserve für die Servos auf dem Sensor Board übrig.&lt;br /&gt;
'''Das bedeutet: Man sollte unbedingt einen separaten Akku für die Servos auf dem Sensor Board benutzen!'''&lt;br /&gt;
&lt;br /&gt;
======SERVO_PWR-EXT Verbindung======&lt;br /&gt;
Für die Verbindung zwischen dem 2-poligen JST XH Stecker (SERVO_PWR, K1) auf dem Sensor Board und dem 8-poligen JST XH Stecker (EXT) auf dem RP6v2 Mainboard braucht man folgende Stecker-/buchsenteile:&lt;br /&gt;
* JST XH Gehäuse, 2-polig, RM 2,5mm ([http://www.conrad.de/ce/de/product/740549/Gehaeuse-RM-25-mm-Serie-XH-Rastermass-25-mm-Pole-2-Nennstrom-3-A-XHP-2-JST-Inhalt-1-St 740549])&lt;br /&gt;
* JST XH Gehäuse, 8-polig, RM 2,5mm ([http://www.conrad.de/ce/de/product/740928/Gehaeuse-RM-25-mm-Serie-XH-Rastermass-25-mm-Pole-8-Nennstrom-3-A-XHP-8-JST-Inhalt-1-St 740928])&lt;br /&gt;
* 10x JST XH Crimpkontakt f. RM 2,5mm ([http://www.conrad.de/ce/de/product/741112/Crimpkontakt-fuer-RM-25-mm-Serie-XH-Rastermass-25-mm-BXH-001T-P06-JST-Inhalt-1-St 741112])&lt;br /&gt;
Mit einer 2-adrigen Litze, die beidseits mit den Crimpkontakten verquetscht (oder verlötet) wird, verbindet man dann den SERVO_PWR Stecker mit dem EXT Stecker, wie in der Abbildung oben gezeigt. ''Achtung: Plus (+) und Minus (-) nicht vertauschen!''&lt;br /&gt;
 Ein passendes Kabel soll zukünftig (*) mitgeliefert werden.&lt;br /&gt;
&lt;br /&gt;
Auf dem RP6 Mainboard ist der 8-polige EXT Stecker noch nicht bestückt. Wenn man ihn nachrüsten will, muss man noch bestellen:&lt;br /&gt;
* JST XH Stiftleiste gerade, 8-polig, RM 2,5mm ([http://www.conrad.de/ce/de/product/740105/Stiftleiste-gerade-RM-25-mm-Serie-XH-Rastermass-25-mm-Pole-8-Nennstrom-3-A-B8B-XH-A-LFSN-JST-Inhalt-1-St 740105])&lt;br /&gt;
Die Stiftleiste wird auf das RP6 Mainboard gelötet, dabei weisen die beiden Einkerbungen an einer Längsseite der Stiftleiste nach hinten zum Rand des Mainboards.&lt;br /&gt;
 Auch diese Stiftleiste soll zukünftig (*) zum Lieferumfang gehören.&lt;br /&gt;
'''Zu *)''' Meinem RP6 Sensor Board (bestellt am 1.3.2014) lag das konfektionierte Kabel und die Stiftleiste noch nicht bei!&lt;br /&gt;
&lt;br /&gt;
=====Stecker=====&lt;br /&gt;
An die acht 3-poligen Stiftleisten SERVO_1 bis SERVO_8 (SP5: K6, 11, 29..34) können Servos angeschlossen werden. Direkt aufstecken kann man Servo-Steckbuchsen mit der Belegung von CONRAD, Graupner/JR und Robbe/Futaba (Versorgungsspannung Plus am mittleren Pin). Auf der Sensor Board Platine kann man den Pin 3 (Servo Power GND) der 3-poligen Stiftleisten daran erkennen, dass er näher zum rechten Platinenrand (Seite mit dem XBUS Stecker) angeordnet ist als der zugehörige Pin 1 (Servo Signal).&lt;br /&gt;
&lt;br /&gt;
Wenn Servos mit nicht passender Steckbuchse angeschlossen werden sollen, dann braucht man auf der Sensor Board Seite folgende Stecker-/buchsenteile für jedes Servo:&lt;br /&gt;
* Steckbuchse, 3-polig, RM 2,54mm ([http://www.elv.de/steckbuchse-3-polig.html ELV 68-022503])&lt;br /&gt;
Die Crimpkontakte dieser Steckbuchse werden an die 3-adrige Litze des Servos angequetscht (oder angelötet). &lt;br /&gt;
&lt;br /&gt;
'''SERVO_1..8-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''Sensor Board&amp;lt;br/&amp;gt;-Funktion (K6,11,29..34)''' || '''Verwendung''' || '''I/O''' |||| '''Servo-&amp;lt;br/&amp;gt;Kabelfarben'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || PCA9685: PWM15..8 || Servo Signal || O |||| Weiß, Orange&lt;br /&gt;
|-&lt;br /&gt;
| 2 || Servo_PWR || Servo Power +5V (geschaltet!) || |||| Rot&lt;br /&gt;
|-&lt;br /&gt;
| 3 || GND_POWER || Servo Power GND || |||| Schwarz, Braun&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Roboterarm RA2-HOBBY====&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_Sensor_Board_RA2-MINI.JPG|RP6 Sensor Board mit Roboterarm RA2-MINI|thumb]]&lt;br /&gt;
&lt;br /&gt;
In der Anleitung zum RP6 Sensor Board ist der Arexx Roboterarm RA2-HOBBY bzw. RA2-MINI [http://www.conrad.de/ce/de/product/191534/Arexx-Mini-Roboterarm-RA2-MINI (191534)] abgebildet. Er ist dort ohne Grundgestell und Controller-Platine auf dem Sensor Board befestigt.&lt;br /&gt;
Das Sensor Board eignet sich sehr gut zur Ansteuerung der 6 Servos des Roboterarms.&lt;br /&gt;
&lt;br /&gt;
Zur Montage des RA2-MINI auf dem Sensor Board geht man so vor:&lt;br /&gt;
* Lösen der 4 Rundkopfschrauben M3x6, die die Servobodenplatte mit den Abstandbolzen M3x30 auf der Controller-Platine verbinden (siehe Anleitung zum RA2-MINI, Seite 19!)&lt;br /&gt;
* Lösen der Servobodenplatte vom Bodenservo (siehe Anleitung zum RA2-MINI, Seite 8!)&lt;br /&gt;
* Bohren der Befestigungslöcher in die Servobodenplatte:&lt;br /&gt;
** Rechts-Links Lochabstand 4,75cm, Vorn-Hinten Lochabstand 4,1cm&lt;br /&gt;
** Ungefähre Lage der Löcher siehe Abbildung in der Anleitung zum Sensor Board, Seite 4!&lt;br /&gt;
** Markierung der Bohrlöcher auf der Rückseite der Servobodenplatte:&lt;br /&gt;
*** 1. Mit einer Hilfslinie die Hinterkante des Servoausschnitts (das ist die kürzere Kante, die näher am Rand der Bodenplatte liegt!) nach beiden Seiten verlängern&lt;br /&gt;
*** 2. Eine 2. Hilfslinie parallel zur ersten im Abstand von 1,4cm zur Mitte der Servobodenplatte hin einzeichnen&lt;br /&gt;
*** 3. Auf dieser Linie jetzt die beiden hinteren Bohrlöcher symmetrisch im Abstand von 4,75cm markieren&lt;br /&gt;
*** 4. Für die vorderen Bohrlöcher eine 3. Hilfslinie im Abstand von 4,1cm parallel zur 2. Linie einzeichnen&lt;br /&gt;
*** 5. Auf dieser Linie die beiden vorderen Bohrlöcher symmetrisch im Abstand von 4,75cm markieren&lt;br /&gt;
*** 6. Kontrolle: Die 4 markierten Bohrlochpositionen bilden ein Rechteck mit 4,1cm seitlicher und 4,75cm vorderer/hinterer Kantenlänge&lt;br /&gt;
** Bohren der 4 Löcher (D = 3,2mm) in die Servobodenplatte&lt;br /&gt;
* Befestigen des Bodenservos auf der Servobodenplatte (siehe Anleitung zum RA2-MINI, Seite 8!)&lt;br /&gt;
* Anbringen des Roboterarms auf dem Sensor Board mit 4 Abstandbolzen M3 (L = 30..50mm) und passenden Schrauben/Muttern&lt;br /&gt;
&lt;br /&gt;
Die Servo-Steckbuchsen werden dann ''in der selben Reihenfolge (S1..S6) wie vorher auf der Controller-Platine des Roboterarms'' auf die Stiftleisten SERVO_1 bis SERVO_6 des Sensor Boards gesteckt.&lt;br /&gt;
'''Man sollte unbedingt einen separaten Akku für die Servos auf dem Sensor Board benutzen!'''&lt;br /&gt;
&lt;br /&gt;
====Grafik-Display====&lt;br /&gt;
Ob es mal ein Grafik-Display für das RP6 Sensor Board geben wird, ist ''pure Spekulation''. Allerdings gibt es drei Hinweise darauf, dass eine solche Hardware-Ergänzung kommen könnte:&lt;br /&gt;
* 1. Der vorbereitete Anschluss für eine [[RP6_Sensor_Board_und_Xtra_Module#Display-Hintergrundbeleuchtung|Display-Hintergrundbeleuchtung]]&lt;br /&gt;
* 2. Die 4 Befestigungslöcher in der Mitte des Sensor Boards&lt;br /&gt;
* 3. Eine Abbildung '''Grafik-Display 128x64''' bei JM3-Engeneering (siehe [[RP6_Sensor_Board_und_Xtra_Module#Weblinks|Weblinks]]!)&lt;br /&gt;
Wir werden sehen ...&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==RP6 Xtra Module==&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_Xtra_module.JPG|RP6 Xtra module|right|500px]]&lt;br /&gt;
&lt;br /&gt;
Von den '''AREXX RP6 Xtra Modulen''' sind bei [http://www.conrad.de/ce/ CONRAD] für den RP6v2 erhältlich:&lt;br /&gt;
* Arexx [[RP6_Sensor_Board_und_Xtra_Module#I2C_GPS_Empf.C3.A4nger_JM3-GPS|I2C GPS Empfänger JM3-GPS]] ([http://www.conrad.de/ce/de/product/1082385/Arexx-IC-GPS-Empfaenger-JM3-GPS 1082385])&lt;br /&gt;
* Arexx [[RP6_Sensor_Board_und_Xtra_Module#Gyro_Modul_JM3-GYRO|Gyro Modul JM3-GYRO]] ([http://www.conrad.de/ce/de/product/1082386/Arexx-Gyro-Modul-JM3-GYRO 1082386])&lt;br /&gt;
* Arexx [[RP6_Sensor_Board_und_Xtra_Module#3D_Accelerometer_Modul_JM3-3DA|3D Accelerometer Modul JM3-3DA]] ([http://www.conrad.de/ce/de/product/1082387/Arexx-3D-Accelerometer-Modul-JM3-3DA 1082387])&lt;br /&gt;
&lt;br /&gt;
===I2C GPS Empfänger JM3-GPS===&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_I2C_GPS_Empfänger.JPG|RP6 I2C GPS Empfänger|right|400px]]&lt;br /&gt;
&lt;br /&gt;
(Laut Online-Katalog der Firma CONRAD!)&lt;br /&gt;
&lt;br /&gt;
''&amp;quot;Universelles GPS-I²C-Bus Modul für RP6 Roboter. Der GPS Empfänger stellt die NMEA-0183 Datensätze GGA, RMC, GSA und VTG in den veschiedenen Registern zur Verfügung. Damit ist eine einfache Weiterverarbeitung möglich.&amp;quot;''&lt;br /&gt;
&lt;br /&gt;
====Beschreibung====&lt;br /&gt;
Der I2C GPS Empfänger ist eine kleine (38 x 23 mm) Zusatzplatine (RP6 Xtra Modul), die direkt auf das [[RP6_Sensor_Board_und_Xtra_Module#RP6_Sensor_Board_2|RP6 Sensor Board]] aufgesteckt werden kann. Sie kann aber auch überall eingesetzt werden, wo eine stabilisierte 5V Versorgungsspannung und ein 5V-I2C-Bus bis 400 kHz zur Verfügung steht.&lt;br /&gt;
&lt;br /&gt;
Die Platine ist bestückt mit dem &amp;quot;Fastrax GPS antenna module&amp;quot; [https://www.u-blox.com/de/positioning-antennas/gnss-antenna-modules/uc530.html UC530]. Als Backup-Batterie dient eine wieder aufladbare Lithium-Batterie ([http://www.farnell.com/datasheets/321180.pdf MS621FE]). Zur Kommunikation zwischen dem UC530 und dem I2C-Bus ist ein [http://www.atmel.com/Images/Atmel-8303-8-bit-AVR-Microcontroller-tinyAVR-ATtiny1634_Datasheet.pdf ATtiny1634] an Bord, der auch die Auswertung des [http://de.wikipedia.org/wiki/NMEA_0183 NMEA Protokolls] übernimmt. Die 3,3 V Versorgungsspannung wird auf der Platine durch einen Spannungsregler ([http://www.mouser.com/ds/2/405/lm3480-316799.pdf LM3480IM3-3.3]) erzeugt. Über den I2C-Bus können folgende Daten der NMEA-0183 Datensätze GGA, RMC, GSA und VTG auf einfache Weise gelesen werden:&lt;br /&gt;
&lt;br /&gt;
* Geograf. Breite&lt;br /&gt;
* Geograf. Länge&lt;br /&gt;
* GPS Status&lt;br /&gt;
* HDOP&lt;br /&gt;
* Satellitenzahl&lt;br /&gt;
* Kurs&lt;br /&gt;
* Geschwindigkeit&lt;br /&gt;
* Höhe&lt;br /&gt;
* UTC-Zeit&lt;br /&gt;
* Datum&lt;br /&gt;
* PDOP&lt;br /&gt;
* VDOP&lt;br /&gt;
* Satellit 1..12&lt;br /&gt;
&lt;br /&gt;
Der ATtiny1634 ist natürlich vorprogrammiert, kann aber über eine vorbereitete 6-polige ISP-Schnittstelle auf der Platine auch umprogrammiert werden.&lt;br /&gt;
&lt;br /&gt;
'''Lieferumfang'''&lt;br /&gt;
* I2C GPS Empfänger&lt;br /&gt;
* CD mit Anleitung und Software-Beispielen.&lt;br /&gt;
&lt;br /&gt;
====Technische Daten====&lt;br /&gt;
* Versorgungsspannung: 5,0 V +/- 5%&lt;br /&gt;
* Stromverbrauch: &amp;lt;= 20 mA (typ.)&lt;br /&gt;
* I2C-Bus Geschwindigkeit: &amp;lt;= 400 kHz&lt;br /&gt;
* GPS Antenne: eingebaut&lt;br /&gt;
* Backup Batterie: Lithium, im Betrieb wieder aufladbar&lt;br /&gt;
* Temperatur Bereich: -10 bis 65 °C&lt;br /&gt;
* Form Faktor: 38 x 23 mm&lt;br /&gt;
* Gewicht: ca. 6 g&lt;br /&gt;
* Empfänger Spezifikationen (UC530):&lt;br /&gt;
** Empfänger: GPS L1 C/A-Code, SPS&lt;br /&gt;
** Kanäle: 66/22 (Suche/Track)&lt;br /&gt;
** Tracking Empfindlichkeit: -165 dBm typ.&lt;br /&gt;
** Navigations Empfindlichkeit: -148 dbm typ (Kaltstart)&lt;br /&gt;
** Update Rate: 1 Sek.&lt;br /&gt;
** Positions Genauigkeit:&lt;br /&gt;
*** 3,0m (67%) typ. horizontal&lt;br /&gt;
*** 5,0m (67%) typ. vertikal&lt;br /&gt;
*** 0,02 m/s (50%) typ. Geschwindigkeit&lt;br /&gt;
** Zeit bis zum ersten Fix: typ. 31 Sek.&lt;br /&gt;
** Protokoll: NMEA-0183 Rev. 3.01&lt;br /&gt;
&lt;br /&gt;
====Anschluss-Schema====&lt;br /&gt;
Belegung des 9-poligen Anschluss-Steckers (K1) siehe in [[RP6_Sensor_Board_und_Xtra_Module#I2C-MODULE|dieser]] Tabelle!&lt;br /&gt;
&lt;br /&gt;
====Umbau-Optionen====&lt;br /&gt;
Wenn man den ATtiny1634 selbst programmieren will, muss man Stiftleisten auf die Platine löten.&lt;br /&gt;
&lt;br /&gt;
Man braucht dazu: &lt;br /&gt;
* 2-reihige Stiftleiste RM 2,54mm (z.B. 2x40-polig 741306) &lt;br /&gt;
&lt;br /&gt;
Man trennt von der 2-reihigen Stiftleiste 2x3 Kontakte ab und lötet sie auf die Punkte &amp;quot;ISP6&amp;quot;.&lt;br /&gt;
Mit einem ISP-Programmer kann dann eine neue Firmware geflasht werden. Die aktuelle Firmware des ATtiny1634 (Version 1.2) wird als .HEX mitgeliefert, leider ohne Source-Code.&lt;br /&gt;
&lt;br /&gt;
Vorsicht: Dabei kann der Prozessor im schlimmsten Fall nicht mehr ansprechbar sein oder der GPS Empfänger UC530 beschädigt werden. Man sollte diesen Umbau und die ISP-Programmierung nur machen, wenn man genau weiß, was man macht! &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Gyro Modul JM3-GYRO===&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_Gyro_Modul.JPG|RP6 Gyro Modul|right|200px]]&lt;br /&gt;
&lt;br /&gt;
(Laut Online-Katalog der Firma CONRAD!)&lt;br /&gt;
&lt;br /&gt;
''&amp;quot;Das universelle Gyro-Sensor Modul für RP6, RP6 V2, RP6 ATMEGA32 und das RP6 V2 Control M256 Wifi-Kit ist ideal zur Erkennung der Blockierung des Roboters in seiner Drehbewegung, sowie der Stabilisierung der Geradeausfahrt.&amp;quot;''&lt;br /&gt;
&lt;br /&gt;
====Beschreibung====&lt;br /&gt;
Das Gyro Modul ist eine kleine (19 x 17 mm) Zusatzplatine (RP6 Xtra Modul), die im RP6-System genutzt werden kann. Es gibt zwar keinen direkt passenden &amp;quot;Steckplatz&amp;quot; auf einer der Microcontroller-Plattformen (RP6v2, M32, M128, M256 Wifi), jedoch ist der Anschluß einfach:&lt;br /&gt;
Benötigt werden +5V und GND, sowie ein freier ADC-Kanal, der bis 5V messen kann. Damit kann das Gyro Modul sehr universell eingesetzt werden. Es misst die Drehrate um die Z-Achse (Hochachse oder Yaw).&lt;br /&gt;
&lt;br /&gt;
Die Platine ist bestückt mit dem analogen Gyro-Sensor [http://www.st.com/web/en/resource/technical/document/datasheet/CD00254111.pdf LY330ALH], dessen Ausgangsspannung durch zwei OP-Amps ([http://www.ti.com.cn/cn/lit/ds/symlink/lm321.pdf LM321], [http://www.produktinfo.conrad.com/datenblaetter/00000-24999/001072615-da-01-en-IC_AMP_PREC_LMP7731MF_NOPB_SOT_23_5_TID.pdf LMP7731MF]) in Ruhe bei 2,5 V liegt. Höhere Ausgangsspannungen (bis 5 V) bedeuten eine Drehgeschwindigkeit nach LINKS, niedrigere (bis 0 V) eine Drehgeschwindigkeit nach RECHTS. Die 3,3 V Versorgungsspannung des LY330ALH wird auf der Platine durch einen Spannungsregler ([http://www.mouser.com/ds/2/405/lm3480-316799.pdf LM3480IM3-3.3]) erzeugt.&lt;br /&gt;
&lt;br /&gt;
'''Lieferumfang'''&lt;br /&gt;
* Gyro Modul&lt;br /&gt;
* CD mit Anleitung und Software-Beispielen.&lt;br /&gt;
&lt;br /&gt;
====Technische Daten====&lt;br /&gt;
&lt;br /&gt;
* VDD: 5,0 V +/- 5%&lt;br /&gt;
* Vout(0): 2,5 V +/- 2% (ohne Bewegung)&lt;br /&gt;
* Vout: Vout(0) + 10mV / dps +/- 2%&lt;br /&gt;
* Messbereich: ca. 200 dps max.&lt;br /&gt;
&lt;br /&gt;
====Anschluss-Schema====&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_Gyro_Modul_SP.JPG|RP6 Gyro Modul - Anschluss-Schema]]&lt;br /&gt;
&lt;br /&gt;
====Umbau-Optionen====&lt;br /&gt;
Am Gyro Modul gibt es nichts umzubauen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===3D Accelerometer Modul JM3-3DA===&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_3D_Accelerometer_Modul.JPG|RP6 3D Accelerometer Modul|right|105px]]&lt;br /&gt;
&lt;br /&gt;
(Laut Online-Katalog der Firma CONRAD!)&lt;br /&gt;
&lt;br /&gt;
''&amp;quot;Universeller 3-Achsen Beschleunigungssensor für RP6, RP6 V2, RP6 ATMEGA32 und das RP6 V2 Control M256 WIFI-Kit. Ideal zur Winkelmessung (Neigung-, Kipp-Winkel) und vieles mehr.&amp;quot;''&lt;br /&gt;
&lt;br /&gt;
====Beschreibung====&lt;br /&gt;
&lt;br /&gt;
Das 3D Accelerometer Modul ist eine kleine (15 x 10 mm) Zusatzplatine (RP6 Xtra Modul), die direkt auf den EEPROM-Sockel (IC5) der Zusatzplatine [[RP6#RP6_CONTROL_M32_Platine|RP6 CONTROL M32]] gesteckt und über den SPI-Bus angesteuert werden kann. Das Accelerometer Modul kann aber auch mit allen Microcontroller-Plattformen betrieben werden, die eine stabilisierte 5V-Versorgungsspannung und einen SPI- oder I2C-Bus bieten.&lt;br /&gt;
&lt;br /&gt;
Die Platine ist bestückt mit dem 3D Beschleunigungs-Sensor [http://www.farnell.com/datasheets/1691680.pdf LIS302DLH]. Die 3,3 V Versorgungsspannung des LIS302DLH wird auf der Platine durch einen Spannungsregler ([http://www.mouser.com/ds/2/405/lm3480-316799.pdf LM3480IM3-3.3]) erzeugt.&lt;br /&gt;
&lt;br /&gt;
'''Lieferumfang'''&lt;br /&gt;
* 3D Accelerometer Modul&lt;br /&gt;
* CD mit Anleitung und Software-Beispielen.&lt;br /&gt;
&lt;br /&gt;
====Technische Daten====&lt;br /&gt;
&lt;br /&gt;
* VDD: 5,0 V +/- 5%&lt;br /&gt;
* Messbereiche: +-2 g, +-4 g, +-8 g&lt;br /&gt;
* Datenausgabe: 16 Bit&lt;br /&gt;
* Schnittstellen: I2C, SPI&lt;br /&gt;
&lt;br /&gt;
====Anschluss-Schema====&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_3D_Accelerometer_Modul_SP.JPG|RP6 3D Accelerometer Modul - Anschluss-Schema|350px]]&lt;br /&gt;
&lt;br /&gt;
====Umbau-Optionen====&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_3D_Accelerometer_Modul_M32.JPG|RP6 3D Accelerometer Modul auf der M32|right|500px]]&lt;br /&gt;
&lt;br /&gt;
'''Will man das Modul auf der M32 einsetzen, muss man auf dem 3D Accelerometer Modul die Widerstände R2 und R3 (falls vorhanden!) auslöten (siehe Anleitung zum Modul, Seiten 4/5!)''' und einen IC-Sockel an Position IC5 und einen Kondensator an Position C19 auf der M32 einlöten, siehe [[RP6#Zweites_SPI-EEPROM|hier]]!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die Abbildung rechts zeigt das 3D Accelerometer Modul auf der M32.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Programmierung==&lt;br /&gt;
In diesem Abschnitt geht es um die Programmierung der Sensoren und Aktoren auf dem [[RP6_Sensor_Board_und_Xtra_Module#RP6_Sensor_Board_3|RP6 Sensor Board]] und auf den [[RP6_Sensor_Board_und_Xtra_Module#RP6_Xtra_Module_3|Xtra Modulen]]. Die hier veröffentlichte Software baut NICHT auf die mitgelieferten C++ Software-Beispiele auf der ''&amp;quot;RP6 Robot System Xtra Modules CD-ROM&amp;quot;'' auf, sondern basiert auf Eigenentwicklungen in GCC.&lt;br /&gt;
&lt;br /&gt;
===RP6 Sensor Board===&lt;br /&gt;
Das RP6 Sensor Board RP6-JM03-61 verfügt nicht über einen eigenen Microprozessor. Daher geht es hier eigentlich nicht um die Programmierung des Sensor Boards, sondern um die Programmierung der Microcontroller-Plattform, an die das Sensor Board angeschlossen ist. In der Regel wird das die RP6 M256 WiFi Zusatzplatine sein, aber auch die RP6v2 Base steuert (als I2C-Slave) in der vorgesehenen Konfiguration gewisse Funktionen des Sensor Boards an.&lt;br /&gt;
Prinzipiell kann das Sensor Board aber auch an der RP6 CONTROL M32 (''passende Library auf Anfrage beim Autor!'') oder der RP6 CCPRO M128 Zusatzplatine betrieben werden.&lt;br /&gt;
&lt;br /&gt;
====Dokumentation====&lt;br /&gt;
Die Dokumentation zum RP6 Sensor Board befindet sich auf der mitgelieferten ''&amp;quot;RP6 Robot System Xtra Modules CD-ROM&amp;quot;''.&lt;br /&gt;
&lt;br /&gt;
=====Manuals=====&lt;br /&gt;
Das Handbuch kann auch [http://www.produktinfo.conrad.com/datenblaetter/00000-24999/001082384-an-01-de-RP6_SENSOR_BOARD.pdf hier] eingesehen werden.&lt;br /&gt;
 ACHTUNG: Das Manual enthält aktuell noch teils irreführende Beschreibungen!&lt;br /&gt;
&lt;br /&gt;
=====Schematics=====&lt;br /&gt;
=====Datasheets=====&lt;br /&gt;
&lt;br /&gt;
====Demo-Programmme====&lt;br /&gt;
Demo-Programme zum RP6 Sensor Board befinden sich auf der mitgelieferten ''&amp;quot;RP6 Robot System Xtra Modules CD-ROM&amp;quot;''.&lt;br /&gt;
&lt;br /&gt;
====RP6 M256 WiFi: Sensor Board Library====&lt;br /&gt;
Die nachfolgende RP6M256_Sensor_BoardLib (GCC) dient zur Ansteuerung des Sensor Boards durch die RP6M256 WiFi.&lt;br /&gt;
&lt;br /&gt;
=====Configuration Header=====&lt;br /&gt;
Vor dem Kompilieren der Library muss eine Anpassung des Configuration Headers an die eigenen Hardware-Voraussetzungen erfolgen.&lt;br /&gt;
Dazu gibt es im Configuration Header eine Definition:&lt;br /&gt;
* USE_PD5 -&amp;gt; Die Sensor Board Funktion &amp;quot;PD5&amp;quot; steuert den TCA4311A Enable Pin (EN).&lt;br /&gt;
Im nachfolgenden Listing ist die Definition USE_PD5 NICHT aktiv (d.h. der TCA4311A Enable Pin (EN) wird vom MAX7311 I/O 1.0 Pin angesteuert!). Dies muss an die eigene Hardware angepaßt werden. Wenn &amp;quot;PD5&amp;quot; den TCA4311A Enable Pin (EN) steuern soll, muss die Zeile mit &amp;quot;USE_PD5&amp;quot; &amp;quot;aktiviert&amp;quot; werden. Dazu entfernt man &amp;quot;//&amp;quot; am Zeilenanfang:&lt;br /&gt;
 #define USE_PD5&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Bevor man Beschleunigungs-, Magnetfeldsensor und Gyroskop nutzen kann, muss man sie kalibrieren:&lt;br /&gt;
&lt;br /&gt;
* '''Accelerometer:'''&lt;br /&gt;
** Die X-Achse wird kalibriert, indem man den RP6 mit der rechten Seite nach unten hält und den Maximalwert in MAX_X_A einträgt. Dann neigt man ihn auf seine linke Seite und trägt den negativen Maximalwert in MIN_X_A ein.&lt;br /&gt;
** Die Y-Achse wird kalibriert, indem man den RP6 mit der Vorderseite nach oben hält und den Maximalwert in MAX_Y_A einträgt. Dann kippt man die Vorderseite nach unten und trägt den negativen Maximalwert in MIN_Y_A ein.&lt;br /&gt;
** Die Z-Achse wird kalibriert, indem man den RP6 normal waagerecht hält und den Maximalwert in MAX_Z_A einträgt. Dann dreht man den RP6 &amp;quot;auf den Kopf&amp;quot; und trägt den negativen Maximalwert in MIN_Z_A ein.&lt;br /&gt;
** Sollten die angezeigten Pitch- und Roll-Werte nach der Kalibrierung der Achsen und genau waagerecht stehendem Sensor bzw. RP6 vom Nullwert deutlich abweichen, kann man sie mithilfe der Definitionen OFFSET_PITCH_A und OFFSET_ROLL_A &amp;quot;nullen&amp;quot;. Die Einheit dieser Definitionen ist °.&lt;br /&gt;
 ''HINWEIS: Die internen Berechnungen werden durch diese Offset-Korrektur&lt;br /&gt;
 NICHT beeinflußt. Die Offset-Werte können also nicht dazu benutzt werden,&lt;br /&gt;
 eine Achsenabweichung zwischen Sensor und RP6 zu kompensieren!''&lt;br /&gt;
* '''Magnetometer:'''&lt;br /&gt;
** Zur Kalibrierung des Magnetfeldsensors stellt man den RP6 auf eine waagerechte Fläche. Es dürfen keine Elektrogeräte, Metallteile und stromführende Leitungen in der Nähe sein, die das Magnetfeld verändern können.&lt;br /&gt;
** Zunächst ist es möglich, die sogenannten &amp;quot;hard iron&amp;quot; Effekte auszugleichen. Dies sind feste Magnetfeldabweichungen, die durch das &amp;quot;Gerät&amp;quot; (in unserem Fall also durch den kompletten RP6) verursacht werden, in oder auf dem der Sensor angebracht ist. Mit den Definitionen OFFSET_X_M, OFFSET_Y_M und OFFSET_Z_M können diese Effekte ausgeglichen werden. Diese Kalibrierung wird hier aktuell (noch) nicht beschrieben, so dass man die Werte für diese Definitionen zunächst bei 0 belassen sollte.&lt;br /&gt;
** Die X-Achse und Y-Achse wird kalibriert, indem man den RP6 langsam mehrfach um die eigene (Z-)Achse dreht und die Maximalwerte in MAX_X_M und MAX_Y_M einträgt. Die negativen Maximalwerte trägt man in MIN_X_M und MIN_Y_M ein.&lt;br /&gt;
** Die Z-Achse wird kalibriert, indem man den RP6 auf die rechte oder linke Seite legt, ihn dann langsam mehrfach auf der Stelle (um seine Y-Achse) dreht und den Maximalwert in MAX_Z_M und den negativen Maximalwert in MIN_Z_M einträgt.&lt;br /&gt;
** Mit der Definition DECLINATION_M kann man zur Verbesserung der Genauigkeit der Richtungsangaben den magnetischen Deklinationswert [°] (d.h. die magnetische Missweisung) am aktuellen Standort festlegen. [http://www.ngdc.noaa.gov/geomag-web/#declination Hier] befindet sich ein &amp;quot;Deklinations-Rechner&amp;quot;, mit dem man den Deklinationswert für den eigenen Standort ermitteln kann. &lt;br /&gt;
** Wenn man den Temperaturwert des LSM303DLHC nutzen will, muss man die Definition GET_TEMP_M aktivieren (Standard!). Den Temperaturwert kann man noch eichen, indem man die Definition OFFSET_TEMP_M anpasst. Die Einheit von OFFSET_TEMP_M ist °C.&lt;br /&gt;
* '''Gyroskop:'''&lt;br /&gt;
** In Ruhelage des RP6 wird ein ADC-Wert von ca. 511 angezeigt, wenn die Definition ADCVAL_ZERORATE_LEVEL im Configuration Header (RP6M256_Sensor_Board.h) vor der ersten Kompilierung zunächst auf 0 gesetzt wurde. Die Kalibrierung des Gyroskops ist abgeschlossen, nachdem man den in Ruhelage angezeigten ADC-Wert als ADCVAL_ZERORATE_LEVEL eingetragen hat.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''HINWEISE ZUR KALIBRIERUNG:'''&lt;br /&gt;
* Das Demo-Programm ist nicht sehr gut geeignet, um die Kalibrierungen durchzuführen.&lt;br /&gt;
* Man sollte mit einem eigenen kurzen ''Kalibrierungs-Programm'' nur die Rohwerte der jeweiligen X-, Y- und Z-Achse z.B. zweimal pro Sekunde ausgeben.&lt;br /&gt;
* Die Rohwerte sind in Variablen x_axis..., y_axis..., z_axis... enthalten. Da die Rohwerte in den Funktionen normalizeLSM303DLHC_A() bzw. normalizeLSM303DLHC_M() ggf. verändert werden, müssen die Rohwerte VOR Durchlaufen dieser Funktionen ausgegeben werden.&lt;br /&gt;
* '''Ohne eine sorgfältige Kalibrierung wird die Kompass-Funktion (insbesondere die neigungskompensierte Ausgabe der Himmelsrichtung) nicht funktionieren!'''&lt;br /&gt;
* Nach dem Eintragen der Kalibrierungs-Werte in den Configuration Header (RP6M256_Sensor_Board.h) muss die ''Demo'' neu kompiliert werden. Vorher sollten die Compiler-Hilfsdateien der Sensor Board-Library (Dateiendungen .st und .o) im Programmverzeichnis gelöscht werden.&lt;br /&gt;
* Getestet wird das Ergebnis der Kalibrierung, indem die Ausgabewerte (Temperatur, Pitch, Roll, Heading, Neigungs-kompensiertes Heading) der ''Demo'' überprüft werden. Dazu kann man Vergleichswerte (Thermometer, Winkelmesser für Pitch, Roll und externer Kompass für Heading) heranziehen.&lt;br /&gt;
* Wenn die Ausgabewerte nicht den Erwartungen entsprechen, muss die Kalibrierung wiederholt werden.&lt;br /&gt;
* Eine Kalibrierung der Sensoren ist nur zuverlässig, solange die Position des jeweiligen Sensors und seine komplette Hardware-Umgebung (also der RP6 mit allen seinen Teilen!) nicht verändert wird. Gibt es trotzdem Veränderungen, z.B. durch weitere Aufbauten auf dem RP6, müssen diese Sensoren neu kalibriert werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Datei: RP6M256_Sensor_Board.h&lt;br /&gt;
&amp;lt;pre&amp;gt;/* ****************************************************************************&lt;br /&gt;
 *                           _______________________&lt;br /&gt;
 *                           \| RP6  ROBOT SYSTEM |/&lt;br /&gt;
 *                            \_-_-_-_-_-_-_-_-_-_/           &amp;gt;&amp;gt;&amp;gt; RP6 M256 WIFI&lt;br /&gt;
 * ----------------------------------------------------------------------------&lt;br /&gt;
 * ----------------------------- [c]2014 - Dirk -------------------------------&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * File: RP6M256_Sensor_Board.h&lt;br /&gt;
 * Version: 1.0&lt;br /&gt;
 * Target: RP6 M256 WIFI - ATMEGA2560 @16.00MHz&lt;br /&gt;
 * Author(s): Dirk&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Description:&lt;br /&gt;
 * Configuration header file for new RP6 Sensor Board library.&lt;br /&gt;
 * The RP6 Sensor Board (CONRAD 1082384) is connected to the RP6M256 with the&lt;br /&gt;
 * two plugs:&lt;br /&gt;
 *   Sensor Board &amp;lt;---&amp;gt; RP6M256&lt;br /&gt;
 *   --------------------------------&lt;br /&gt;
 *   I/O (K17)    &amp;lt;---&amp;gt; IO_PWM/T0/T1&lt;br /&gt;
 *   ADC (K18)    &amp;lt;---&amp;gt; ADC_IO2/CMP&lt;br /&gt;
 * The RP6 Sensor Board function &amp;quot;PD5&amp;quot; (IC6: EN) is now connected to RP6M256&lt;br /&gt;
 * OC1B (PB6) and the RP6 Sensor Board function &amp;quot;ADC4&amp;quot; (SHARP_R) to RP6M256&lt;br /&gt;
 * ADC9 (PK1).&lt;br /&gt;
 * On the RP6 Sensor Board the functions &amp;quot;ADC0&amp;quot;, &amp;quot;ADC1&amp;quot;, &amp;quot;PWR&amp;quot; and &amp;quot;ADC4&amp;quot; are&lt;br /&gt;
 * connected to the USRBUS. The USRBUS may be wired on the RP6 mainboard like&lt;br /&gt;
 * this:&lt;br /&gt;
 *   Function : Sensor Board - USRBUS: * &amp;lt;---&amp;gt; RP6 Mainboard&lt;br /&gt;
 *   --------------------------------------------------------&lt;br /&gt;
 *   SHARP_F  : &amp;quot;ADC0&amp;quot;       - Pin 1     &amp;lt;---&amp;gt; ADC0: Pin 3&lt;br /&gt;
 *   GYRO     : &amp;quot;ADC1&amp;quot;       - Pin 2     &amp;lt;---&amp;gt; ADC1: Pin 3&lt;br /&gt;
 *   PWRON ²  : &amp;quot;PWR&amp;quot;        - Pin 3     &amp;lt;---&amp;gt; PWR&lt;br /&gt;
 *   SHARP_R  : &amp;quot;ADC4&amp;quot;       - Pin 5     &amp;lt;---&amp;gt; Not connected!&lt;br /&gt;
 * At *) It is also possible not to use the USRBUS, but to connect the RP6&lt;br /&gt;
 *       Sensor Board directly to the RP6 mainboard with 3 single cables.&lt;br /&gt;
 * At ²) See RP6 manual &amp;quot;4.6.8. Stromsparfunktionen&amp;quot;! &lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
#ifndef RP6M256_SENSOR_BOARD_H&lt;br /&gt;
#define RP6M256_SENSOR_BOARD_H&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// RP6 Sensor Board hardwired components:&lt;br /&gt;
// - I2C I/O Port Expander (MAX7311)&lt;br /&gt;
// - I2C Real Time Clock (RTC DS1339)&lt;br /&gt;
// - I2C Temperature Sensor (LM75B)&lt;br /&gt;
// - I2C Servo Controller (PCA9685)&lt;br /&gt;
// - I2C LED Driver (TCA6507)&lt;br /&gt;
// - I2C 3D Magnetometer &amp;amp; Accelerometer (LSM303DLHC)&lt;br /&gt;
// - Analog Yaw-Rate Gyroscope (LY330ALH)&lt;br /&gt;
// - Hot Swappable 2-Wire Bus Buffer (TCA4311A)&lt;br /&gt;
// - Button&lt;br /&gt;
// - Status LED&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C I/O Port Expander (MAX7311):&lt;br /&gt;
#define I2C_SENSOR_PORTEXP_ADR			0x40	// Default&lt;br /&gt;
&lt;br /&gt;
// Interrupt I/O portpin definitions (RP6M256):&lt;br /&gt;
#define IO_SENSOR_INT1_IN				INT1_PI12 // PCINT12 PJ3  XBUS Pin 8&lt;br /&gt;
#define IO_SENSOR_INT1_DDR				DDRJ&lt;br /&gt;
#define IO_SENSOR_INT1_PIN				PINJ&lt;br /&gt;
#define IO_SENSOR_INT1_PORT				PORTJ&lt;br /&gt;
#define IO_SENSOR_INT2_IN				INT2_PI15 // PCINT15 PJ6  XBUS Pin 11&lt;br /&gt;
#define IO_SENSOR_INT2_DDR				DDRJ&lt;br /&gt;
#define IO_SENSOR_INT2_PIN				PINJ&lt;br /&gt;
#define IO_SENSOR_INT2_PORT				PORTJ&lt;br /&gt;
#define IO_SENSOR_INT3_IN				INT3_PI14 // PCINT14 PJ5  XBUS Pin 9&lt;br /&gt;
#define IO_SENSOR_INT3_DDR				DDRJ&lt;br /&gt;
#define IO_SENSOR_INT3_PIN				PINJ&lt;br /&gt;
#define IO_SENSOR_INT3_PORT				PORTJ&lt;br /&gt;
#define IO_SENSOR_INTU_IN				INTU_PI13 // PCINT13 PJ4  XBUS Pin 7&lt;br /&gt;
#define IO_SENSOR_INTU_DDR				DDRJ&lt;br /&gt;
#define IO_SENSOR_INTU_PIN				PINJ&lt;br /&gt;
#define IO_SENSOR_INTU_PORT				PORTJ&lt;br /&gt;
&lt;br /&gt;
// I/O PORT pin numbers:&lt;br /&gt;
#define PIN7							7&lt;br /&gt;
#define PIN6							6&lt;br /&gt;
#define PIN5							5&lt;br /&gt;
#define PIN4							4&lt;br /&gt;
#define PIN3							3&lt;br /&gt;
#define PIN2							2&lt;br /&gt;
#define PIN1							1&lt;br /&gt;
#define PIN0							0&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Real Time Clock (RTC DS1339):&lt;br /&gt;
#define I2C_SENSOR_RTC_ADR				0xd0	// Default&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Temperature Sensor (LM75B):&lt;br /&gt;
#define I2C_SENSOR_TEMP_ADR				0x90	// Default&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Servo Controller (PCA9685):&lt;br /&gt;
#define I2C_SENSOR_SERVO_ADR			0x88	// Default&lt;br /&gt;
&lt;br /&gt;
// Servo and PWM channels:&lt;br /&gt;
#define CH_SERVO_1						16		// At K6: 1  &amp;quot;SERVO_1&amp;quot;&lt;br /&gt;
#define CH_SERVO_2						15		// At K11: 1 &amp;quot;SERVO_2&amp;quot;&lt;br /&gt;
#define CH_SERVO_3						13		// At K29: 1 &amp;quot;SERVO_3&amp;quot;&lt;br /&gt;
#define CH_SERVO_4						14		// At K30: 1 &amp;quot;SERVO_4&amp;quot;&lt;br /&gt;
#define CH_SERVO_5						11		// At K31: 1 &amp;quot;SERVO_5&amp;quot;&lt;br /&gt;
#define CH_SERVO_6						12		// At K32: 1 &amp;quot;SERVO_6&amp;quot;&lt;br /&gt;
#define CH_SERVO_7						9		// At K33: 1 &amp;quot;SERVO_7&amp;quot;&lt;br /&gt;
#define CH_SERVO_8						10		// At K34: 1 &amp;quot;SERVO_8&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#define CH_PWM_OUT_1					1		// At K12: 1 &amp;quot;PWM_OUT&amp;quot;&lt;br /&gt;
#define CH_PWM_OUT_2					2		// At K12: 2&lt;br /&gt;
#define CH_PWM_OUT_3					3		// At K12: 3&lt;br /&gt;
#define CH_PWM_OUT_4					4		// At K12: 4&lt;br /&gt;
#define CH_PWM_OUT_5					5		// At K12: 5&lt;br /&gt;
#define CH_PWM_OUT_6					6		// At K12: 6&lt;br /&gt;
#define CH_PWM_OUT_7					7		// At K12: 7&lt;br /&gt;
#define CH_PWM_OUT_8					8		// At K12: 8&lt;br /&gt;
&lt;br /&gt;
// Servo left touch (LT), right touch (RT), middle position (MP) constants:&lt;br /&gt;
// (Hints: - Servo impulse length [ms] = Servo position value / 204.8&lt;br /&gt;
//           (Formula only valid for a PWM of 50 Hz!)&lt;br /&gt;
//         - Min. servo impulse (0,7 ms) = Servo position 143&lt;br /&gt;
//         - Mid. servo impulse (1,5 ms) = Servo position 307&lt;br /&gt;
//         - Max. servo impulse (2,3 ms) = Servo position 471&lt;br /&gt;
//         - !!! You should NOT use servo position values &amp;lt; 143 or &amp;gt; 471 !!!)&lt;br /&gt;
#define SERVO1_LT						205		// Servo impulse ~1ms&lt;br /&gt;
#define SERVO1_RT						410		// Servo impulse ~2ms&lt;br /&gt;
#define SERVO1_MP						((SERVO1_RT - SERVO1_LT) / 2 + SERVO1_LT)&lt;br /&gt;
#define SERVO2_LT						205&lt;br /&gt;
#define SERVO2_RT						410&lt;br /&gt;
#define SERVO2_MP						((SERVO2_RT - SERVO2_LT) / 2 + SERVO2_LT)&lt;br /&gt;
#define SERVO3_LT						205&lt;br /&gt;
#define SERVO3_RT						410&lt;br /&gt;
#define SERVO3_MP						((SERVO3_RT - SERVO3_LT) / 2 + SERVO3_LT)&lt;br /&gt;
#define SERVO4_LT						205&lt;br /&gt;
#define SERVO4_RT						410&lt;br /&gt;
#define SERVO4_MP						((SERVO4_RT - SERVO4_LT) / 2 + SERVO4_LT)&lt;br /&gt;
#define SERVO5_LT						205&lt;br /&gt;
#define SERVO5_RT						410&lt;br /&gt;
#define SERVO5_MP						((SERVO5_RT - SERVO5_LT) / 2 + SERVO5_LT)&lt;br /&gt;
#define SERVO6_LT						205&lt;br /&gt;
#define SERVO6_RT						410&lt;br /&gt;
#define SERVO6_MP						((SERVO6_RT - SERVO6_LT) / 2 + SERVO6_LT)&lt;br /&gt;
#define SERVO7_LT						205&lt;br /&gt;
#define SERVO7_RT						410&lt;br /&gt;
#define SERVO7_MP						((SERVO7_RT - SERVO7_LT) / 2 + SERVO7_LT)&lt;br /&gt;
#define SERVO8_LT						205&lt;br /&gt;
#define SERVO8_RT						410&lt;br /&gt;
#define SERVO8_MP						((SERVO8_RT - SERVO8_LT) / 2 + SERVO8_LT)&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C LED Driver (TCA6507):&lt;br /&gt;
#define I2C_SENSOR_LEDDRIVER_ADR		0x8a	// Default&lt;br /&gt;
&lt;br /&gt;
// LED numbers:&lt;br /&gt;
#define LED0							0		// At K7&lt;br /&gt;
#define DISPLAY_BACKLIGHT				0		// Display background light&lt;br /&gt;
#define LED1							1		// At K4&lt;br /&gt;
#define LED2							2		// At K2&lt;br /&gt;
#define LED3							3		// At K10: 1&lt;br /&gt;
#define BACKLIGHT_R						3		// Right backlight&lt;br /&gt;
#define LED4							4		// At K10: 2&lt;br /&gt;
#define BACKLIGHT_L						4		// Left backlight&lt;br /&gt;
#define LED5							5		// White LED (D3)&lt;br /&gt;
#define HEADLIGHT_R						5		// Right headlight&lt;br /&gt;
#define LED6							6		// White LED (D1)&lt;br /&gt;
#define HEADLIGHT_L						6		// Left headlight&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C 3D Magnetometer &amp;amp; Accelerometer (LSM303DLHC):&lt;br /&gt;
&lt;br /&gt;
// LSM303DLHC accelerometer:&lt;br /&gt;
#define I2C_SENSOR_LSM303DLHC_A_ADR 	0x32	// Default&lt;br /&gt;
&lt;br /&gt;
// LSM303DLHC accelerometer calibration data:&lt;br /&gt;
#define MAX_X_A						1037		// Max. X-axis value&lt;br /&gt;
#define MIN_X_A						-1030		// Min. X-axis value&lt;br /&gt;
#define MAX_Y_A						1030		// Max. Y-axis value&lt;br /&gt;
#define MIN_Y_A						-1019		// Min. Y-axis value&lt;br /&gt;
#define MAX_Z_A						1062		// Max. Z-axis value&lt;br /&gt;
#define MIN_Z_A						-1056		// Min. Z-axis value&lt;br /&gt;
#define OFFSET_PITCH_A				0.0			// Offset Pitch [°]&lt;br /&gt;
#define OFFSET_ROLL_A				0.0			// Offset Roll [°]&lt;br /&gt;
&lt;br /&gt;
// LSM303DLHC magnetometer:&lt;br /&gt;
#define I2C_SENSOR_LSM303DLHC_M_ADR		0x3c	// Default&lt;br /&gt;
&lt;br /&gt;
// LSM303DLHC magnetometer calibration data:&lt;br /&gt;
#define MAX_X_M						-111.0		// Max. X-axis value&lt;br /&gt;
#define MIN_X_M						-634.0		// Min. X-axis value&lt;br /&gt;
#define OFFSET_X_M					0			// Hard iron X-axis offset&lt;br /&gt;
#define MAX_Y_M						297.0		// Max. Y-axis value&lt;br /&gt;
#define MIN_Y_M						-215.0		// Min. Y-axis value&lt;br /&gt;
#define OFFSET_Y_M					0			// Hard iron Y-axis offset&lt;br /&gt;
#define MAX_Z_M						183.0		// Max. Z-axis value&lt;br /&gt;
#define MIN_Z_M						-214.0		// Min. Z-axis value&lt;br /&gt;
#define OFFSET_Z_M					0			// Hard iron Z-axis offset&lt;br /&gt;
#define DECLINATION_M				0.0			// E at local position [°]&lt;br /&gt;
&lt;br /&gt;
// LSM303DLHC temperature sensor definitions:&lt;br /&gt;
#define GET_TEMP_M								// Enable temperature sensor&lt;br /&gt;
#define OFFSET_TEMP_M				0.0			// Temperature offset [°C]&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Analog Yaw-Rate Gyroscope (LY330ALH):&lt;br /&gt;
&lt;br /&gt;
// LY330ALH gyroscope:&lt;br /&gt;
#define ADC_SENSOR_LY330ALH				ADC_1	// At USRBUS: 2 (RP6BASE)&lt;br /&gt;
&lt;br /&gt;
// LY330ALH gyroscope calibration data:&lt;br /&gt;
// (Higher values [505..1023] mean an angular velocity while rotating LEFT&lt;br /&gt;
//  and lower values [503..0] while rotating RIGHT!)&lt;br /&gt;
#define ADCVAL_MINRATE					0		// Min. rate value&lt;br /&gt;
#define ADCVAL_ZERORATE_LEVEL			504		// Zero rate level&lt;br /&gt;
#define ADCVAL_MAXRATE					1023	// Max. rate value&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Hot Swappable 2-Wire Bus Buffer (TCA4311A):&lt;br /&gt;
&lt;br /&gt;
// Define USE_PD5, if you want to control the TCA4311A enable pin (EN) with&lt;br /&gt;
// the RP6 Sensor Board function &amp;quot;PD5&amp;quot;. If USE_PD5 is NOT defined (default),&lt;br /&gt;
// the TCA4311A EN pin is controlled by the MAX7311 I/O 1.0 pin.&lt;br /&gt;
// ---------------&lt;br /&gt;
//#define USE_PD5&lt;br /&gt;
// ---------------&lt;br /&gt;
&lt;br /&gt;
#define IO_SENSOR_TCA4311A_EN_IN		OC1B_PI6 // At I/O: 9 (RP6M256)&lt;br /&gt;
#define IO_SENSOR_TCA4311A_EN_DDR		DDRB&lt;br /&gt;
#define IO_SENSOR_TCA4311A_EN_PIN		PINB&lt;br /&gt;
#define IO_SENSOR_TCA4311A_EN_PORT		PORTB&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Button:&lt;br /&gt;
&lt;br /&gt;
// (Button is connected to I/O 1.7 of the MAX7311!)&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Status LED:&lt;br /&gt;
&lt;br /&gt;
// (Status LED is connected to I/O 1.6 of the MAX7311!)&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Other ADC channel definitions:&lt;br /&gt;
&lt;br /&gt;
// (Depending on connections on the RP6 Sensor Board!)&lt;br /&gt;
#define ADC_SENSOR_SHARP_F				ADC_0	// At USRBUS: 1 (RP6BASE)&lt;br /&gt;
#define ADC_SENSOR_SHARP_R				ADC_9	// At ADC: 3    (RP6M256)&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
/******************************************************************************&lt;br /&gt;
 * Additional info&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Changelog:&lt;br /&gt;
 * &lt;br /&gt;
 *  ---&amp;gt; changes are documented in the file &amp;quot;RP6M256_Sensor_BoardLib.c&amp;quot;&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=====Library Header=====&lt;br /&gt;
Datei: RP6M256_Sensor_BoardLib.h&lt;br /&gt;
&amp;lt;pre&amp;gt;/* ****************************************************************************&lt;br /&gt;
 *                           _______________________&lt;br /&gt;
 *                           \| RP6  ROBOT SYSTEM |/&lt;br /&gt;
 *                            \_-_-_-_-_-_-_-_-_-_/           &amp;gt;&amp;gt;&amp;gt; RP6 M256 WIFI&lt;br /&gt;
 * ----------------------------------------------------------------------------&lt;br /&gt;
 * ----------------------------- [c]2014 - Dirk -------------------------------&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * File: RP6M256_Sensor_BoardLib.h&lt;br /&gt;
 * Version: 1.0&lt;br /&gt;
 * Target: RP6 M256 WIFI - ATMEGA2560 @16.00MHz&lt;br /&gt;
 * Author(s): Dirk&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Description:&lt;br /&gt;
 * Header file for new RP6 Sensor Board library.&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
#ifndef RP6M256_SENSOR_BOARDLIB_H&lt;br /&gt;
#define RP6M256_SENSOR_BOARDLIB_H&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// RP6 Sensor Board hardwired components:&lt;br /&gt;
// - I2C I/O Port Expander (MAX7311)&lt;br /&gt;
// - I2C Real Time Clock (RTC DS1339)&lt;br /&gt;
// - I2C Temperature Sensor (LM75B)&lt;br /&gt;
// - I2C Servo Controller (PCA9685)&lt;br /&gt;
// - I2C LED Driver (TCA6507)&lt;br /&gt;
// - I2C 3D Magnetometer &amp;amp; Accelerometer (LSM303DLHC)&lt;br /&gt;
// - Analog Yaw-Rate Gyroscope (LY330ALH)&lt;br /&gt;
// - Hot Swappable 2-Wire Bus Buffer (TCA4311A)&lt;br /&gt;
// - Button&lt;br /&gt;
// - Status LED&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Includes:&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6M256Lib.h&amp;quot;&lt;br /&gt;
#include &amp;quot;RP6I2CmasterTWI.h&amp;quot;&lt;br /&gt;
#include &amp;quot;RP6M256_Sensor_Board.h&amp;quot;&lt;br /&gt;
#include &amp;lt;math.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// RP6M256_I2CMasterLib definitions:&lt;br /&gt;
&lt;br /&gt;
#ifndef I2C_RP6_BASE_ADR&lt;br /&gt;
	#define I2C_RP6_BASE_ADR			10&lt;br /&gt;
#endif&lt;br /&gt;
#ifndef I2C_REG_ADC_ADC0_L&lt;br /&gt;
	#define I2C_REG_ADC_ADC0_L			23&lt;br /&gt;
#endif&lt;br /&gt;
#ifndef I2C_REG_ADC_ADC1_L&lt;br /&gt;
	#define I2C_REG_ADC_ADC1_L			25&lt;br /&gt;
#endif&lt;br /&gt;
#ifndef CMD_POWER_OFF&lt;br /&gt;
	#define CMD_POWER_OFF				0&lt;br /&gt;
#endif&lt;br /&gt;
#ifndef CMD_POWER_ON&lt;br /&gt;
	#define CMD_POWER_ON				1&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C I/O Port Expander (MAX7311):&lt;br /&gt;
&lt;br /&gt;
// Registers:&lt;br /&gt;
#define MAX7311_INPUT_PORT1				0&lt;br /&gt;
#define MAX7311_INPUT_PORT2				1&lt;br /&gt;
#define MAX7311_OUTPUT_PORT1			2&lt;br /&gt;
#define MAX7311_OUTPUT_PORT2			3&lt;br /&gt;
#define MAX7311_PORT1_POL_INV			4&lt;br /&gt;
#define MAX7311_PORT2_POL_INV			5&lt;br /&gt;
#define MAX7311_PORT1_CONFIG			6&lt;br /&gt;
#define MAX7311_PORT2_CONFIG			7&lt;br /&gt;
#define MAX7311_TIMEOUT					8&lt;br /&gt;
&lt;br /&gt;
// Port 1 configuration register bitmasks:&lt;br /&gt;
#define ST_GYRO							(1 &amp;lt;&amp;lt; PIN7)	// I/O 0.7 (Output)&lt;br /&gt;
#define PD_GYRO							(1 &amp;lt;&amp;lt; PIN6)	// I/O 0.6 (Output)&lt;br /&gt;
#define PWR_CAM_IF						(1 &amp;lt;&amp;lt; PIN5)	// I/O 0.5 (Output)&lt;br /&gt;
#define EN_LEDDRIV						(1 &amp;lt;&amp;lt; PIN4)	// I/O 0.4 (Output)&lt;br /&gt;
#define RDY_BUSBUFF						(1 &amp;lt;&amp;lt; PIN3)	// I/O 0.3 (Input)&lt;br /&gt;
#define PWR_SHARP_R						(1 &amp;lt;&amp;lt; PIN2)	// I/O 0.2 (Output)&lt;br /&gt;
#define PWR_SHARP_F						(1 &amp;lt;&amp;lt; PIN1)	// I/O 0.1 (Output)&lt;br /&gt;
#define PWR_I2C							(1 &amp;lt;&amp;lt; PIN0)	// I/O 0.0 (Output)&lt;br /&gt;
&lt;br /&gt;
// Port 2 configuration register bitmasks:&lt;br /&gt;
#define IO2_I2C							(1 &amp;lt;&amp;lt; PIN7)	// I/O 1.7 (Input)&lt;br /&gt;
#define IO1_I2C							(1 &amp;lt;&amp;lt; PIN6)	// I/O 1.6 (Output)&lt;br /&gt;
#define DRDY_MAGACC						(1 &amp;lt;&amp;lt; PIN5)	// I/O 1.5 (Input)&lt;br /&gt;
#define PWR_SERVO						(1 &amp;lt;&amp;lt; PIN4)	// I/O 1.4 (Output)&lt;br /&gt;
#define OEN_SERVO						(1 &amp;lt;&amp;lt; PIN3)	// I/O 1.3 (Output)&lt;br /&gt;
#define IO_K19_1						(1 &amp;lt;&amp;lt; PIN2)	// I/O 1.2 (Input)&lt;br /&gt;
#define IO_K19_3						(1 &amp;lt;&amp;lt; PIN1)	// I/O 1.1 (Input)&lt;br /&gt;
#define EN_BUSBUFF						(1 &amp;lt;&amp;lt; PIN0)	// I/O 1.0 (Output)&lt;br /&gt;
&lt;br /&gt;
// Port 1 &amp;amp; 2 register 16-bit bitmasks:&lt;br /&gt;
// (CONFIG: 1 = Input, 0 = Output)&lt;br /&gt;
#define MAX7311_CONFIG_DEFAULT			0b1010011000001000&lt;br /&gt;
#define MAX7311_CONFIG_USE_PD5			0b1010011100001000&lt;br /&gt;
// (OUTPUT: 1 = High/True, 0 = Low/False)&lt;br /&gt;
#define MAX7311_OUTPUT_DEFAULT			0b0100000100010000&lt;br /&gt;
#define MAX7311_OUTPUT_FULLPOWER		0b0001000100110111&lt;br /&gt;
#define MAX7311_OUTPUT_SHUTDOWN			0b0100100011000000&lt;br /&gt;
&lt;br /&gt;
// Safe configuration:&lt;br /&gt;
// (Ensures if activated, that I/Os 0.3, 1.5 and 1.7 cannot be configured&lt;br /&gt;
//  as output with the function MAX7311_write_cfg(). This may protect the&lt;br /&gt;
//  RP6 Sensor Board from hardware damage.)&lt;br /&gt;
// -------------------&lt;br /&gt;
#define SAFE_CONFIG&lt;br /&gt;
// -------------------&lt;br /&gt;
&lt;br /&gt;
typedef union {&lt;br /&gt;
 	uint8_t byte;&lt;br /&gt;
	struct {&lt;br /&gt;
		unsigned int1   :1;				// INT1  XBUS Pin 8&lt;br /&gt;
		unsigned int2   :1;				// INT2  XBUS Pin 11&lt;br /&gt;
		unsigned int3   :1;				// INT3  XBUS Pin 9&lt;br /&gt;
		unsigned intu   :1;				// INTU  XBUS Pin 7&lt;br /&gt;
		unsigned unused :4;&lt;br /&gt;
	};&lt;br /&gt;
	struct {&lt;br /&gt;
		unsigned magacc1     :1;		// INT1: LSM303DLHC INT1&lt;br /&gt;
		unsigned portexp     :1;		// INT2: MAX7311 INT_N&lt;br /&gt;
		unsigned magacc2_rtc :1;		// INT3: LSM303DLHC INT2&lt;br /&gt;
		unsigned noname      :5;		//       OR DS1339 SQW/INT_N&lt;br /&gt;
	};&lt;br /&gt;
} interrupt_RP6SBstatus_t;&lt;br /&gt;
extern interrupt_RP6SBstatus_t interrupt_RP6SBstatus;&lt;br /&gt;
&lt;br /&gt;
typedef union {&lt;br /&gt;
	uint16_t word;&lt;br /&gt;
	struct {&lt;br /&gt;
		unsigned pwr_i2c     :1;		// I/O 0.0 (Output)&lt;br /&gt;
		unsigned pwr_sharp_f :1;		// I/O 0.1 (Output)&lt;br /&gt;
		unsigned pwr_sharp_r :1;		// I/O 0.2 (Output)&lt;br /&gt;
		unsigned rdy_busbuff :1;		// I/O 0.3 (Input)&lt;br /&gt;
		unsigned en_leddriv  :1;		// I/O 0.4 (Output)&lt;br /&gt;
		unsigned pwr_cam_if  :1;		// I/O 0.5 (Output)&lt;br /&gt;
		unsigned pd_gyro     :1;		// I/O 0.6 (Output)&lt;br /&gt;
		unsigned st_gyro     :1;		// I/O 0.7 (Output)&lt;br /&gt;
		unsigned en_busbuff  :1;		// I/O 1.0 (Output)&lt;br /&gt;
		unsigned io_k19_3    :1;		// I/O 1.1 (Input)&lt;br /&gt;
		unsigned io_k19_1    :1;		// I/O 1.2 (Input)&lt;br /&gt;
		unsigned oen_servo   :1;		// I/O 1.3 (Output)&lt;br /&gt;
		unsigned pwr_servo   :1;		// I/O 1.4 (Output)&lt;br /&gt;
		unsigned drdy_magacc :1;		// I/O 1.5 (Input)&lt;br /&gt;
		unsigned io1_i2c     :1;		// I/O 1.6 (Output)&lt;br /&gt;
		unsigned io2_i2c     :1;		// I/O 1.7 (Input)&lt;br /&gt;
	};&lt;br /&gt;
} max7311IOs_t;&lt;br /&gt;
extern max7311IOs_t inport;&lt;br /&gt;
extern max7311IOs_t outport;&lt;br /&gt;
extern uint8_t readyBusbuff;&lt;br /&gt;
extern uint8_t pressedButton;&lt;br /&gt;
&lt;br /&gt;
void MAX7311_write_cfg(uint16_t);&lt;br /&gt;
void task_checkINTs(void);&lt;br /&gt;
void task_RP6SensorBoard(void);&lt;br /&gt;
void MAX7311_update(void);&lt;br /&gt;
void MAX7311_write(uint16_t);&lt;br /&gt;
void MAX7311_init(void);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Real Time Clock (RTC DS1339):&lt;br /&gt;
&lt;br /&gt;
// Registers:&lt;br /&gt;
#define DS1339_SECONDS					0&lt;br /&gt;
#define DS1339_MINUTES					1&lt;br /&gt;
#define DS1339_HOURS					2&lt;br /&gt;
#define DS1339_DAY						3&lt;br /&gt;
#define DS1339_DATE						4&lt;br /&gt;
#define DS1339_MONTH_CENTURY			5&lt;br /&gt;
#define DS1339_YEAR						6&lt;br /&gt;
#define DS1339_ALARM1_SECONDS			7&lt;br /&gt;
#define DS1339_ALARM1_MINUTES			8&lt;br /&gt;
#define DS1339_ALARM1_HOURS				9&lt;br /&gt;
#define DS1339_ALARM1_DAY_DATE			10&lt;br /&gt;
#define DS1339_ALARM2_MINUTES			11&lt;br /&gt;
#define DS1339_ALARM2_HOURS				12&lt;br /&gt;
#define DS1339_ALARM2_DAY_DATE			13&lt;br /&gt;
#define DS1339_CONTROL					14&lt;br /&gt;
#define DS1339_STATUS					15&lt;br /&gt;
#define DS1339_TRICKLE_CHARGER			16&lt;br /&gt;
&lt;br /&gt;
// Control register bitmasks:&lt;br /&gt;
#define DS1339_CONTROL_DEFAULT			0		// Power on default&lt;br /&gt;
#define DS1339_CONTROL_A1IE				1&lt;br /&gt;
#define DS1339_CONTROL_A2IE				2&lt;br /&gt;
#define DS1339_CONTROL_INTCN			4&lt;br /&gt;
#define DS1339_CONTROL_RS1				8&lt;br /&gt;
#define DS1339_CONTROL_RS2				16&lt;br /&gt;
#define DS1339_CONTROL_BBSQI			32&lt;br /&gt;
#define DS1339_CONTROL_EOSC				128&lt;br /&gt;
&lt;br /&gt;
// Trickle Charger register bitmasks:&lt;br /&gt;
#define DS1339_TRICKLE_CHARGER_DEFAULT	0b10101010 // One diode, 2k resistor&lt;br /&gt;
#define DS1339_TRICKLE_CHARGER_ROUT0	1&lt;br /&gt;
#define DS1339_TRICKLE_CHARGER_ROUT1	2&lt;br /&gt;
#define DS1339_TRICKLE_CHARGER_DS0		4&lt;br /&gt;
#define DS1339_TRICKLE_CHARGER_DS1		8&lt;br /&gt;
#define DS1339_TRICKLE_CHARGER_TCS0		16&lt;br /&gt;
#define DS1339_TRICKLE_CHARGER_TCS1		32&lt;br /&gt;
#define DS1339_TRICKLE_CHARGER_TCS2		64&lt;br /&gt;
#define DS1339_TRICKLE_CHARGER_TCS3		128&lt;br /&gt;
&lt;br /&gt;
enum RTCWEEKDAYS {&lt;br /&gt;
	R_MO = 1, R_TU, R_WE, R_TH, R_FR, R_SA, R_SU&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
typedef struct {&lt;br /&gt;
	uint16_t         year;				// Year&lt;br /&gt;
	uint8_t          month;				// Month   [1..12]&lt;br /&gt;
	enum RTCWEEKDAYS weekday;			// Weekday [1..7 = R_MO..R_SU]&lt;br /&gt;
	uint8_t          day;				// Day     [1..31]&lt;br /&gt;
} rtcdate_t;&lt;br /&gt;
rtcdate_t rtc_date;&lt;br /&gt;
&lt;br /&gt;
typedef struct {&lt;br /&gt;
	uint8_t dst;						// Daylight-saving-time (time zone)&lt;br /&gt;
	uint8_t hour;						// Hour    [0..23]&lt;br /&gt;
	uint8_t minute;						// Minute  [0..59]&lt;br /&gt;
	uint8_t second;						// Second  [0..59]&lt;br /&gt;
} rtctime_t;&lt;br /&gt;
rtctime_t rtc_time;&lt;br /&gt;
&lt;br /&gt;
uint8_t BCD2DEC(uint8_t);&lt;br /&gt;
uint8_t DEC2BCD(uint8_t);&lt;br /&gt;
void DS1339_write_cfg(uint8_t);&lt;br /&gt;
void DS1339_init(void);&lt;br /&gt;
#define CALC_DST						// Time zone will be calculated&lt;br /&gt;
void DS1339_read(void);&lt;br /&gt;
void DS1339_write(void);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Temperature Sensor (LM75B):&lt;br /&gt;
&lt;br /&gt;
// Registers:&lt;br /&gt;
#define LM75B_TEMP						0&lt;br /&gt;
#define LM75B_CONF						1&lt;br /&gt;
#define LM75B_THYST						2&lt;br /&gt;
#define LM75B_TOS						3&lt;br /&gt;
&lt;br /&gt;
// Conf register bitmasks:&lt;br /&gt;
#define LM75B_CONF_DEFAULT				0		// Power on default&lt;br /&gt;
#define LM75B_CONF_SHUTDOWN				1&lt;br /&gt;
#define LM75B_CONF_OS_COMP_INT			2&lt;br /&gt;
#define LM75B_CONF_OS_POL				4&lt;br /&gt;
#define LM75B_CONF_OS_F_QUE0			8&lt;br /&gt;
#define LM75B_CONF_OS_F_QUE1			16&lt;br /&gt;
&lt;br /&gt;
extern double temperature;&lt;br /&gt;
&lt;br /&gt;
void LM75B_write_cfg(uint8_t);&lt;br /&gt;
#define LM75B_shutdown() {LM75B_write_cfg(LM75B_CONF_SHUTDOWN);}&lt;br /&gt;
#define LM75B_init() {LM75B_write_cfg(LM75B_CONF_DEFAULT);}&lt;br /&gt;
extern uint8_t temperature_low;&lt;br /&gt;
extern uint8_t temperature_high;&lt;br /&gt;
#define getTemperatureHigh() (temperature_high)&lt;br /&gt;
#define getTemperatureLow() (temperature_low)&lt;br /&gt;
void LM75B_read(void);&lt;br /&gt;
double LM75B_calculate(void);&lt;br /&gt;
double LM75B_measure(void);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Servo Controller (PCA9685):&lt;br /&gt;
&lt;br /&gt;
// Registers:&lt;br /&gt;
#define PCA9685_MODE1					0&lt;br /&gt;
#define PCA9685_MODE2					1&lt;br /&gt;
#define PCA9685_SUBADR1					2&lt;br /&gt;
#define PCA9685_SUBADR2					3&lt;br /&gt;
#define PCA9685_SUBADR3					4&lt;br /&gt;
#define PCA9685_ALLCALLADR				5&lt;br /&gt;
#define PCA9685_LED0_ON_L				6&lt;br /&gt;
#define PCA9685_LED0_ON_H				7&lt;br /&gt;
#define PCA9685_LED0_OFF_L				8&lt;br /&gt;
#define PCA9685_LED0_OFF_H				9&lt;br /&gt;
#define PCA9685_LED1_ON_L				10&lt;br /&gt;
#define PCA9685_LED1_ON_H				11&lt;br /&gt;
#define PCA9685_LED1_OFF_L				12&lt;br /&gt;
#define PCA9685_LED1_OFF_H				13&lt;br /&gt;
#define PCA9685_LED2_ON_L				14&lt;br /&gt;
#define PCA9685_LED2_ON_H				15&lt;br /&gt;
#define PCA9685_LED2_OFF_L				16&lt;br /&gt;
#define PCA9685_LED2_OFF_H				17&lt;br /&gt;
#define PCA9685_LED3_ON_L				18&lt;br /&gt;
#define PCA9685_LED3_ON_H				19&lt;br /&gt;
#define PCA9685_LED3_OFF_L				20&lt;br /&gt;
#define PCA9685_LED3_OFF_H				21&lt;br /&gt;
#define PCA9685_LED4_ON_L				22&lt;br /&gt;
#define PCA9685_LED4_ON_H				23&lt;br /&gt;
#define PCA9685_LED4_OFF_L				24&lt;br /&gt;
#define PCA9685_LED4_OFF_H				25&lt;br /&gt;
#define PCA9685_LED5_ON_L				26&lt;br /&gt;
#define PCA9685_LED5_ON_H				27&lt;br /&gt;
#define PCA9685_LED5_OFF_L				28&lt;br /&gt;
#define PCA9685_LED5_OFF_H				29&lt;br /&gt;
#define PCA9685_LED6_ON_L				30&lt;br /&gt;
#define PCA9685_LED6_ON_H				31&lt;br /&gt;
#define PCA9685_LED6_OFF_L				32&lt;br /&gt;
#define PCA9685_LED6_OFF_H				33&lt;br /&gt;
#define PCA9685_LED7_ON_L				34&lt;br /&gt;
#define PCA9685_LED7_ON_H				35&lt;br /&gt;
#define PCA9685_LED7_OFF_L				36&lt;br /&gt;
#define PCA9685_LED7_OFF_H				37&lt;br /&gt;
#define PCA9685_LED8_ON_L				38&lt;br /&gt;
#define PCA9685_LED8_ON_H				39&lt;br /&gt;
#define PCA9685_LED8_OFF_L				40&lt;br /&gt;
#define PCA9685_LED8_OFF_H				41&lt;br /&gt;
#define PCA9685_LED9_ON_L				42&lt;br /&gt;
#define PCA9685_LED9_ON_H				43&lt;br /&gt;
#define PCA9685_LED9_OFF_L				44&lt;br /&gt;
#define PCA9685_LED9_OFF_H				45&lt;br /&gt;
#define PCA9685_LED10_ON_L				46&lt;br /&gt;
#define PCA9685_LED10_ON_H				47&lt;br /&gt;
#define PCA9685_LED10_OFF_L				48&lt;br /&gt;
#define PCA9685_LED10_OFF_H				49&lt;br /&gt;
#define PCA9685_LED11_ON_L				50&lt;br /&gt;
#define PCA9685_LED11_ON_H				51&lt;br /&gt;
#define PCA9685_LED11_OFF_L				52&lt;br /&gt;
#define PCA9685_LED11_OFF_H				53&lt;br /&gt;
#define PCA9685_LED12_ON_L				54&lt;br /&gt;
#define PCA9685_LED12_ON_H				55&lt;br /&gt;
#define PCA9685_LED12_OFF_L				56&lt;br /&gt;
#define PCA9685_LED12_OFF_H				57&lt;br /&gt;
#define PCA9685_LED13_ON_L				58&lt;br /&gt;
#define PCA9685_LED13_ON_H				59&lt;br /&gt;
#define PCA9685_LED13_OFF_L				60&lt;br /&gt;
#define PCA9685_LED13_OFF_H				61&lt;br /&gt;
#define PCA9685_LED14_ON_L				62&lt;br /&gt;
#define PCA9685_LED14_ON_H				63&lt;br /&gt;
#define PCA9685_LED14_OFF_L				64&lt;br /&gt;
#define PCA9685_LED14_OFF_H				65&lt;br /&gt;
#define PCA9685_LED15_ON_L				66&lt;br /&gt;
#define PCA9685_LED15_ON_H				67&lt;br /&gt;
#define PCA9685_LED15_OFF_L				68&lt;br /&gt;
#define PCA9685_LED15_OFF_H				69&lt;br /&gt;
#define PCA9685_ALL_LED_ON_L			250&lt;br /&gt;
#define PCA9685_ALL_LED_ON_H			251&lt;br /&gt;
#define PCA9685_ALL_LED_OFF_L			252&lt;br /&gt;
#define PCA9685_ALL_LED_OFF_H			253&lt;br /&gt;
#define PCA9685_PRE_SCALE				254&lt;br /&gt;
#define PCA9685_TESTMODE				255&lt;br /&gt;
&lt;br /&gt;
// Mode1 register bitmasks:&lt;br /&gt;
#define PCA9685_MODE1_ALLCALL			1&lt;br /&gt;
#define PCA9685_MODE1_SUB3				2&lt;br /&gt;
#define PCA9685_MODE1_SUB2				4&lt;br /&gt;
#define PCA9685_MODE1_SUB1				8&lt;br /&gt;
#define PCA9685_MODE1_SLEEP				16&lt;br /&gt;
#define PCA9685_MODE1_AI				32&lt;br /&gt;
#define PCA9685_MODE1_EXTCLK			64&lt;br /&gt;
#define PCA9685_MODE1_RESTART			128&lt;br /&gt;
&lt;br /&gt;
// Mode2 register bitmasks:&lt;br /&gt;
#define PCA9685_MODE2_OUTNE01_DEFAULT	0&lt;br /&gt;
#define PCA9685_MODE2_OUTDRV			4&lt;br /&gt;
#define PCA9685_MODE2_OCH				8&lt;br /&gt;
#define PCA9685_MODE2_INVRT				16&lt;br /&gt;
&lt;br /&gt;
#define F_PCA9685						25000000.0	// Int. Clock: 25 MHz&lt;br /&gt;
&lt;br /&gt;
void PCA9685_init(uint16_t);&lt;br /&gt;
#define initServo(__FREQ__) {PCA9685_init(__FREQ__);}&lt;br /&gt;
uint8_t servo(uint8_t);&lt;br /&gt;
void PCA9685_set(uint8_t, uint16_t);&lt;br /&gt;
#define setServo(__SERVO__,__POS__) {PCA9685_set(servo(__SERVO__),__POS__);}&lt;br /&gt;
void PCA9685_shutdown(void);&lt;br /&gt;
void PCA9685_restart(void);&lt;br /&gt;
void setServoPower(uint8_t);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C LED Driver (TCA6507):&lt;br /&gt;
&lt;br /&gt;
// Registers:&lt;br /&gt;
#define TCA6507_SELECT0				0&lt;br /&gt;
#define TCA6507_SELECT1				1&lt;br /&gt;
#define TCA6507_SELECT2				2&lt;br /&gt;
#define TCA6507_FADEON_TIME			3&lt;br /&gt;
#define TCA6507_FULLYON_TIME		4&lt;br /&gt;
#define TCA6507_FADEOFF_TIME		5&lt;br /&gt;
#define TCA6507_1ST_FULLYOFF_TIME	6&lt;br /&gt;
#define TCA6507_2ND_FULLYOFF_TIME	7&lt;br /&gt;
#define TCA6507_MAXIMUM_INTENSITY	8&lt;br /&gt;
#define TCA6507_MASTER_INTENSITY	9&lt;br /&gt;
#define TCA6507_INITIALIZATION		10&lt;br /&gt;
&lt;br /&gt;
// Output states:&lt;br /&gt;
#define STATE_OFF					0&lt;br /&gt;
#define STATE_PWM0					2&lt;br /&gt;
#define STATE_PWM1					3&lt;br /&gt;
#define STATE_ON					4&lt;br /&gt;
#define STATE_MINT					5&lt;br /&gt;
#define STATE_BLINK0				6&lt;br /&gt;
#define STATE_BLINK1				7&lt;br /&gt;
&lt;br /&gt;
extern uint8_t select[3];&lt;br /&gt;
&lt;br /&gt;
void TCA6507_write_cfg(uint8_t, uint8_t);&lt;br /&gt;
void TCA6507_update(void);&lt;br /&gt;
void TCA6507_set(uint8_t, uint8_t);&lt;br /&gt;
#define setLED(__LED__,__STATE__) {TCA6507_set(__LED__,__STATE__);}&lt;br /&gt;
void TCA6507_shutdown(void);&lt;br /&gt;
void TCA6507_restart(void);&lt;br /&gt;
void TCA6507_init(void);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C 3D Magnetometer &amp;amp; Accelerometer (LSM303DLHC):&lt;br /&gt;
&lt;br /&gt;
// LSM303DLHC accelerometer internal registers:&lt;br /&gt;
#define CTRL_REG1_A					0x20&lt;br /&gt;
#define CTRL_REG2_A					0x21&lt;br /&gt;
#define CTRL_REG3_A					0x22&lt;br /&gt;
#define CTRL_REG4_A					0x23&lt;br /&gt;
#define CTRL_REG5_A					0x24&lt;br /&gt;
#define CTRL_REG6_A					0x25&lt;br /&gt;
#define REFERENCE_A					0x26&lt;br /&gt;
#define STATUS_REG_A				0x27&lt;br /&gt;
#define OUT_X_L_A					0x28&lt;br /&gt;
#define OUT_X_H_A					0x29&lt;br /&gt;
#define OUT_Y_L_A					0x2a&lt;br /&gt;
#define OUT_Y_H_A					0x2b&lt;br /&gt;
#define OUT_Z_L_A					0x2c&lt;br /&gt;
#define OUT_Z_H_A					0x2d&lt;br /&gt;
#define FIFO_CTRL_REG_A				0x2e&lt;br /&gt;
#define FIFO_SRC_REG_A				0x2f&lt;br /&gt;
#define INT1_CFG_A					0x30&lt;br /&gt;
#define INT1_SOURCE_A				0x31&lt;br /&gt;
#define INT1_THS_A					0x32&lt;br /&gt;
#define INT1_DURATION_A				0x33&lt;br /&gt;
#define INT2_CFG_A					0x34&lt;br /&gt;
#define INT2_SOURCE_A				0x35&lt;br /&gt;
#define INT2_THS_A					0x36&lt;br /&gt;
#define INT2_DURATION_A				0x37&lt;br /&gt;
#define CLICK_CFG_A					0x38&lt;br /&gt;
#define CLICK_SRC_A					0x39&lt;br /&gt;
#define CLICK_THS_A					0x3a&lt;br /&gt;
#define TIME_LIMIT_A				0x3b&lt;br /&gt;
#define TIME_LATENCY_A				0x3c&lt;br /&gt;
#define TIME_WINDOW_A				0x3d&lt;br /&gt;
&lt;br /&gt;
// LSM303DLHC accelerometer register settings:&lt;br /&gt;
#define CTRL_REG1_A_10HZ			0b00100111	// 10Hz &amp;amp; all axes enable&lt;br /&gt;
#define CTRL_REG1_A_50HZ			0b01000111	// 50Hz &amp;amp; all axes enable&lt;br /&gt;
#define CTRL_REG4_A_DEFAULT			0b00000000	// Default (Normal mode)&lt;br /&gt;
#define CTRL_REG4_A_HR				0b00001000	// HR output mode&lt;br /&gt;
&lt;br /&gt;
// LSM303DLHC magnetometer internal registers:&lt;br /&gt;
#define CRA_REG_M					0x00&lt;br /&gt;
#define CRB_REG_M					0x01&lt;br /&gt;
#define MR_REG_M					0x02&lt;br /&gt;
#define OUT_X_H_M					0x03&lt;br /&gt;
#define OUT_X_L_M					0x04&lt;br /&gt;
#define OUT_Z_H_M					0x05&lt;br /&gt;
#define OUT_Z_L_M					0x06&lt;br /&gt;
#define OUT_Y_H_M					0x07&lt;br /&gt;
#define OUT_Y_L_M					0x08&lt;br /&gt;
#define SR_REG_MG					0x09&lt;br /&gt;
#define IRA_REG_M					0x0a&lt;br /&gt;
#define IRB_REG_M					0x0b&lt;br /&gt;
#define IRC_REG_M					0x0c&lt;br /&gt;
#define TEMP_OUT_H_M				0x31&lt;br /&gt;
#define TEMP_OUT_L_M				0x32&lt;br /&gt;
&lt;br /&gt;
// LSM303DLHC magnetometer register settings:&lt;br /&gt;
#define CRA_REG_M_15HZ				0b00010000	// Default (Data rate 15Hz)&lt;br /&gt;
#define CRA_REG_M_15HZ_T_EN			0b10010000	// 15Hz &amp;amp; temperature enable&lt;br /&gt;
#define CRB_REG_M_13GAUSS			0b00100000	// Gain +-1.3Gauss&lt;br /&gt;
#define MR_REG_M_CCM				0b00000000	// Continuous-conversion mode&lt;br /&gt;
#define MR_REG_M_SCM				0b00000001	// Single-conversion mode&lt;br /&gt;
#define MR_REG_M_SLEEP				0b00000011	// Default (Sleep-mode)&lt;br /&gt;
&lt;br /&gt;
extern int16_t x_axisa, y_axisa, z_axisa;&lt;br /&gt;
extern double pitch, roll;&lt;br /&gt;
extern double xa, ya, za;&lt;br /&gt;
extern double the, phi;&lt;br /&gt;
&lt;br /&gt;
extern int16_t x_axism, y_axism, z_axism;&lt;br /&gt;
extern int16_t headingm;&lt;br /&gt;
extern double xm, ym, zm;&lt;br /&gt;
#ifdef GET_TEMP_M&lt;br /&gt;
extern int16_t temperaturem;&lt;br /&gt;
extern double temperature_mag;&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
extern int16_t headingtc;&lt;br /&gt;
&lt;br /&gt;
void LSM303DLHC_A_init(void);&lt;br /&gt;
void readLSM303DLHC_A(void);&lt;br /&gt;
void normalizeLSM303DLHC_A(void);&lt;br /&gt;
void positionLSM303DLHC_A(void);&lt;br /&gt;
&lt;br /&gt;
void LSM303DLHC_M_init(void);&lt;br /&gt;
void readLSM303DLHC_M(void);&lt;br /&gt;
void normalizeLSM303DLHC_M(void);&lt;br /&gt;
int16_t headingLSM303DLHC_M(void);&lt;br /&gt;
&lt;br /&gt;
int16_t headingLSM303DLHC_TC(void);&lt;br /&gt;
&lt;br /&gt;
void LSM303DLHC_init(void);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Analog Yaw-Rate Gyroscope (LY330ALH):&lt;br /&gt;
&lt;br /&gt;
#define LY330ALH_MODE_NORMAL		0			// Power on default&lt;br /&gt;
#define LY330ALH_MODE_SLEEP			1&lt;br /&gt;
#define LY330ALH_MODE_SELFTEST		2&lt;br /&gt;
#define LY330ALH_MODE_POWERDOWN		3			// Shutdown mode&lt;br /&gt;
&lt;br /&gt;
extern int16_t z_axisg;&lt;br /&gt;
&lt;br /&gt;
void LY330ALH_set_mode(uint8_t);&lt;br /&gt;
uint16_t getRP6Base_ADC1(void);&lt;br /&gt;
int16_t LY330ALH_measure(void);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Hot Swappable 2-Wire Bus Buffer (TCA4311A):&lt;br /&gt;
&lt;br /&gt;
//extern uint8_t readyBusbuff;			// See &amp;quot;I2C I/O Port Expander&amp;quot; section&lt;br /&gt;
extern uint8_t errorBusbuff;&lt;br /&gt;
&lt;br /&gt;
#define getReadyBusbuff() (readyBusbuff)&lt;br /&gt;
uint8_t readReadyBusbuff(void);&lt;br /&gt;
void TCA4311A_shutdown(void);&lt;br /&gt;
void TCA4311A_reconnect(void);&lt;br /&gt;
void setRP6Base_PWR(uint8_t);&lt;br /&gt;
void setI2CModulePower(uint8_t);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Button:&lt;br /&gt;
&lt;br /&gt;
//extern uint8_t pressedButton;			// See &amp;quot;I2C I/O Port Expander&amp;quot; section&lt;br /&gt;
&lt;br /&gt;
#define getPressedButton() (pressedButton)&lt;br /&gt;
uint8_t readButton(void);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Status LED:&lt;br /&gt;
&lt;br /&gt;
void setStatusLED(uint8_t);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// RP6 Sensor Board initialisation and shutdown:&lt;br /&gt;
&lt;br /&gt;
void sensor_board_init(void);&lt;br /&gt;
void sensor_board_shutdown(void);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
/******************************************************************************&lt;br /&gt;
 * Additional info&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Changelog:&lt;br /&gt;
 * &lt;br /&gt;
 *  ---&amp;gt; changes are documented in the file &amp;quot;RP6M256_Sensor_BoardLib.c&amp;quot;&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=====Library Source=====&lt;br /&gt;
Datei: RP6M256_Sensor_BoardLib.c&lt;br /&gt;
&amp;lt;pre&amp;gt;/* ****************************************************************************&lt;br /&gt;
 *                           _______________________&lt;br /&gt;
 *                           \| RP6  ROBOT SYSTEM |/&lt;br /&gt;
 *                            \_-_-_-_-_-_-_-_-_-_/           &amp;gt;&amp;gt;&amp;gt; RP6 M256 WIFI&lt;br /&gt;
 * ----------------------------------------------------------------------------&lt;br /&gt;
 * ----------------------------- [c]2014 - Dirk -------------------------------&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * File: RP6M256_Sensor_BoardLib.c&lt;br /&gt;
 * Version: 1.0&lt;br /&gt;
 * Target: RP6 M256 WIFI - ATMEGA2560 @16.00MHz&lt;br /&gt;
 *         and a RP6 Sensor Board (CONRAD 1082384)&lt;br /&gt;
 * Author(s): Dirk&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Description:&lt;br /&gt;
 * This is our new Library that contains basic routines and functions for&lt;br /&gt;
 * accessing the hardwired components of the RP6 Sensor Board (CONRAD 1082384).&lt;br /&gt;
 * This library assumes the RP6 Sensor Board Revision 2.0 (04.07.13).&lt;br /&gt;
 *&lt;br /&gt;
 * There are more sensors and actors, that may be connected to the RP6 Sensor&lt;br /&gt;
 * Board: Many I2C components including a GPS module (CONRAD 1082385), servo&lt;br /&gt;
 *        motors, SHARP IR distance sensors, LEDs, a camera ...&lt;br /&gt;
 * This library doesn't contain functions for these sensors/actors, because&lt;br /&gt;
 * they are not HARDWIRED to the RP6 Sensor Board and may be connected&lt;br /&gt;
 * OPTIONALLY.&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// RP6 Sensor Board hardwired components:&lt;br /&gt;
// - I2C I/O Port Expander (MAX7311)&lt;br /&gt;
// - I2C Real Time Clock (RTC DS1339)&lt;br /&gt;
// - I2C Temperature Sensor (LM75B)&lt;br /&gt;
// - I2C Servo Controller (PCA9685)&lt;br /&gt;
// - I2C LED Driver (TCA6507)&lt;br /&gt;
// - I2C 3D Magnetometer &amp;amp; Accelerometer (LSM303DLHC)&lt;br /&gt;
// - Analog Yaw-Rate Gyroscope (LY330ALH)&lt;br /&gt;
// - Hot Swappable 2-Wire Bus Buffer (TCA4311A)&lt;br /&gt;
// - Button&lt;br /&gt;
// - Status LED&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Includes:&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6M256_Sensor_BoardLib.h&amp;quot; 		&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Variables:&lt;br /&gt;
&lt;br /&gt;
uint8_t registerBuf[13]; &lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C I/O Port Expander (MAX7311):&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Sends the configuration word to a MAX7311.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: config -&amp;gt; Config word for control&lt;br /&gt;
 *                  registers&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void MAX7311_write_cfg(uint16_t config)&lt;br /&gt;
{&lt;br /&gt;
#ifdef SAFE_CONFIG&lt;br /&gt;
	config |= 0b1010000000001000;&lt;br /&gt;
#endif&lt;br /&gt;
	I2CTWI_transmit3Bytes(I2C_SENSOR_PORTEXP_ADR, MAX7311_PORT1_CONFIG, config, (config&amp;gt;&amp;gt;8));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
interrupt_RP6SBstatus_t interrupt_RP6SBstatus;&lt;br /&gt;
&lt;br /&gt;
/** &lt;br /&gt;
 * This function checks all interrupt pins on&lt;br /&gt;
 * the XBUS (INT1..3, INTU).&lt;br /&gt;
 * This function must be called VERY frequently&lt;br /&gt;
 * out of the main loop.&lt;br /&gt;
 * Bigger delays result in slower reaction to&lt;br /&gt;
 * interrupt requests of the RP6 Sensor Board.&lt;br /&gt;
 * Interrupt function table:&lt;br /&gt;
 *   Int. : Function 1      IRQ  Function 2       IRQ&lt;br /&gt;
 *   -------------------------------------------------&lt;br /&gt;
 *   INT1 : LSM303DLHC INT1  H&lt;br /&gt;
 *   INT2 : MAX7311   INT_N  L&lt;br /&gt;
 *   INT3 : LSM303DLHC INT2  H   DS1339 SQW/INT_N  L&lt;br /&gt;
 *   INTU : not used&lt;br /&gt;
 * You can see in the &amp;quot;IRQ&amp;quot; column, which level&lt;br /&gt;
 * (H/L) means an ACTIVE INTERRUPT signal.&lt;br /&gt;
 * The interrupt pin levels (H=true/L=false) are&lt;br /&gt;
 * read into the global interrupt_RP6SBstatus&lt;br /&gt;
 * variable.&lt;br /&gt;
 *&lt;br /&gt;
 * Hints: - This function checks the interrupt&lt;br /&gt;
 *          signals by polling. This is NOT the&lt;br /&gt;
 *          best way to to this job. You will&lt;br /&gt;
 *          have to write your own task, if you&lt;br /&gt;
 *          want to use the Pin Change Interrupt&lt;br /&gt;
 *          function of the ATmega2560&lt;br /&gt;
 *          microcontroller.&lt;br /&gt;
 *        - You cannot use both interrupt sources&lt;br /&gt;
 *          for INT3! So you should not use INT2&lt;br /&gt;
 *          of the LSM303DLHC together with the&lt;br /&gt;
 *          alarm function of the DS1339 (RTC)!&lt;br /&gt;
 *        - Every interrupt signal of the Sensor&lt;br /&gt;
 *          Board may be cut off from the XBUS&lt;br /&gt;
 *          by opening a jumper (Jx):&lt;br /&gt;
 *          INT1 -&amp;gt; J3 (LSM303DLHC INT1)&lt;br /&gt;
 *          INT2 -&amp;gt; J4 (MAX7311 INT_N)&lt;br /&gt;
 *          INT3 -&amp;gt; J2 (DS1339 SQW/INT_N)&lt;br /&gt;
 *          INT3 -&amp;gt; J5 (LSM303DLHC INT2)&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *&lt;br /&gt;
 *   if (!interrupt_RP6SBstatus.portexp)&lt;br /&gt;
 *        writeString_P(&amp;quot;==&amp;gt; MAX7311 INT_N!!!&amp;quot;);&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void task_checkINTs(void)&lt;br /&gt;
{&lt;br /&gt;
	if(IO_SENSOR_INT1_PIN &amp;amp; IO_SENSOR_INT1_IN)	// XBUS INT1 -&amp;gt; PJ3 (PCINT12)&lt;br /&gt;
		interrupt_RP6SBstatus.int1 = true;&lt;br /&gt;
	else&lt;br /&gt;
		interrupt_RP6SBstatus.int1 = false;&lt;br /&gt;
	if(IO_SENSOR_INT2_PIN &amp;amp; IO_SENSOR_INT2_IN)	// XBUS INT2 -&amp;gt; PJ6 (PCINT15)&lt;br /&gt;
		interrupt_RP6SBstatus.int2 = true;&lt;br /&gt;
	else&lt;br /&gt;
		interrupt_RP6SBstatus.int2 = false;&lt;br /&gt;
	if(IO_SENSOR_INT3_PIN &amp;amp; IO_SENSOR_INT3_IN)	// XBUS INT3 -&amp;gt; PJ5 (PCINT14)&lt;br /&gt;
		interrupt_RP6SBstatus.int3 = true;&lt;br /&gt;
	else&lt;br /&gt;
		interrupt_RP6SBstatus.int3 = false;&lt;br /&gt;
//	if(IO_SENSOR_INTU_PIN &amp;amp; IO_SENSOR_INTU_IN)	// XBUS INTU -&amp;gt; PJ4 (PCINT13)&lt;br /&gt;
//		interrupt_RP6SBstatus.intu = true;&lt;br /&gt;
//	else&lt;br /&gt;
//		interrupt_RP6SBstatus.intu = false;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
max7311IOs_t inport;&lt;br /&gt;
uint8_t readyBusbuff;&lt;br /&gt;
uint8_t pressedButton;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function checks all I/O ports (I/O 0.0..1.7)&lt;br /&gt;
 * of the MAX7311 sequentially!&lt;br /&gt;
 * You must call this function frequently out of&lt;br /&gt;
 * the main loop.&lt;br /&gt;
 * The I/O port values (true/false) are read into&lt;br /&gt;
 * the global inport variable.&lt;br /&gt;
 * The global variables readyBusbuff (2-Wire Bus&lt;br /&gt;
 * Buffer: Enable) and pressedButton (Button S1:&lt;br /&gt;
 * Pressed) contain actual values (true/false)&lt;br /&gt;
 * after execution of this task.&lt;br /&gt;
 *&lt;br /&gt;
 * Examples:&lt;br /&gt;
 *&lt;br /&gt;
 *   if (inport.rdy_busbuff)&lt;br /&gt;
 *        writeString_P(&amp;quot;I/O 0.3: High&amp;quot;);&lt;br /&gt;
 *   else writeString_P(&amp;quot;I/O 0.3: Low&amp;quot;);&lt;br /&gt;
 *   if (!inport.drdy_magacc)&lt;br /&gt;
 *        writeString_P(&amp;quot;I/O 1.5: Low&amp;quot;);&lt;br /&gt;
 *   if (pressedButton)&lt;br /&gt;
 *        writeString_P(&amp;quot;Button pressed!&amp;quot;);&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void task_RP6SensorBoard(void)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmitByte(I2C_SENSOR_PORTEXP_ADR, MAX7311_INPUT_PORT1);&lt;br /&gt;
	I2CTWI_readBytes(I2C_SENSOR_PORTEXP_ADR, registerBuf, 2);&lt;br /&gt;
	inport.word = (registerBuf[1] &amp;lt;&amp;lt; 8) + registerBuf[0];&lt;br /&gt;
	readyBusbuff = inport.rdy_busbuff;&lt;br /&gt;
	pressedButton = inport.io2_i2c;&lt;br /&gt;
	pressedButton = !pressedButton;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
max7311IOs_t outport;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Updates the I/O ports with current value from&lt;br /&gt;
 * the global outport variable!&lt;br /&gt;
 * If one or more port pins were configured as&lt;br /&gt;
 * output before, they will be set (high) or&lt;br /&gt;
 * cleared (low).&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *&lt;br /&gt;
 *   outport.word = 0b0000000000001001;&lt;br /&gt;
 *   MAX7311_update();&lt;br /&gt;
 *   // This clears all I/O ports and sets&lt;br /&gt;
 *   // the ports I/O 0.0 and I/O 0.3!&lt;br /&gt;
 *&lt;br /&gt;
 *   // Other possibility:&lt;br /&gt;
 *   outport.pwr_sharp_f = true;&lt;br /&gt;
 *   MAX7311_update();&lt;br /&gt;
 *   // This sets I/O 0.1 and does not&lt;br /&gt;
 *   // affect any other I/O port!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void MAX7311_update(void)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmit3Bytes(I2C_SENSOR_PORTEXP_ADR, MAX7311_OUTPUT_PORT1, outport.word, (outport.word&amp;gt;&amp;gt;8));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Writes the 16-bit data to a MAX7311.&lt;br /&gt;
 * The data are output with those I/O ports that&lt;br /&gt;
 * were configured as output before.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: data -&amp;gt; Data word&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void MAX7311_write(uint16_t data)&lt;br /&gt;
{&lt;br /&gt;
	outport.word = data;&lt;br /&gt;
	MAX7311_update();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Initializes the I/O Port Expander after power&lt;br /&gt;
 * on.&lt;br /&gt;
 *&lt;br /&gt;
 * Hint: If USE_PD5 is defined in the&lt;br /&gt;
 *       configuration header file, this&lt;br /&gt;
 *       function uses the RP6M256 portpin,&lt;br /&gt;
 *       that is connected to plug I/O: Pin 9&lt;br /&gt;
 *       instead of MAX7311 I/O 1.0!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void MAX7311_init(void)&lt;br /&gt;
{&lt;br /&gt;
#ifdef USE_PD5&lt;br /&gt;
	MAX7311_write_cfg(MAX7311_CONFIG_USE_PD5);&lt;br /&gt;
	IO_SENSOR_TCA4311A_EN_DDR |= IO_SENSOR_TCA4311A_EN_IN;		// Output&lt;br /&gt;
	IO_SENSOR_TCA4311A_EN_PORT |= IO_SENSOR_TCA4311A_EN_IN;		// High&lt;br /&gt;
#else&lt;br /&gt;
	MAX7311_write_cfg(MAX7311_CONFIG_DEFAULT);&lt;br /&gt;
#endif&lt;br /&gt;
	MAX7311_write(MAX7311_OUTPUT_DEFAULT);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Real Time Clock (RTC DS1339):&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function converts a BCD to a DEC value.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
uint8_t BCD2DEC(uint8_t bcd)&lt;br /&gt;
{&lt;br /&gt;
	return ((bcd &amp;gt;&amp;gt; 4) * 10 + (bcd &amp;amp; 0x0f));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function converts a DEC to a BCD value.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
uint8_t DEC2BCD(uint8_t dec)&lt;br /&gt;
{uint8_t units = dec % 10;&lt;br /&gt;
	if (dec /= 10) {&lt;br /&gt;
		return (units + (DEC2BCD(dec) &amp;lt;&amp;lt; 4));&lt;br /&gt;
	}&lt;br /&gt;
	else {&lt;br /&gt;
		return units;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Sends the configuration byte to a DS1339.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: Config byte for control register&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void DS1339_write_cfg(uint8_t config)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_RTC_ADR, DS1339_CONTROL, config);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Initializes the DS1339 Trickle Charger&lt;br /&gt;
 * function to the default for the RP6 Sensor&lt;br /&gt;
 * Board: One diode and 2kOhm resistor.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void DS1339_init(void)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_RTC_ADR, DS1339_TRICKLE_CHARGER, DS1339_TRICKLE_CHARGER_DEFAULT);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Reads all data registers of the Real Time Clock (RTC).&lt;br /&gt;
 * They are stored in the time &amp;amp; date variables defined in&lt;br /&gt;
 * the library header.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void DS1339_read(void)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmitByte(I2C_SENSOR_RTC_ADR, DS1339_SECONDS);&lt;br /&gt;
	I2CTWI_readBytes(I2C_SENSOR_RTC_ADR, registerBuf, 7);&lt;br /&gt;
	rtc_time.second = BCD2DEC(registerBuf[0]);&lt;br /&gt;
	rtc_time.minute = BCD2DEC(registerBuf[1]);&lt;br /&gt;
	rtc_time.hour = BCD2DEC(registerBuf[2] &amp;amp; 0x3f);&lt;br /&gt;
	rtc_date.weekday = (registerBuf[3] &amp;amp; 0x07);&lt;br /&gt;
	rtc_date.day = BCD2DEC(registerBuf[4]);&lt;br /&gt;
	rtc_date.month = BCD2DEC(registerBuf[5] &amp;amp; 0x7f);&lt;br /&gt;
	if(registerBuf[5] &amp;amp; 0x80) rtc_date.year = 100;&lt;br /&gt;
	else rtc_date.year = 0;&lt;br /&gt;
	rtc_date.year += BCD2DEC(registerBuf[6]);&lt;br /&gt;
	rtc_date.year += 2000;&lt;br /&gt;
	rtc_time.dst = 0;&lt;br /&gt;
#ifdef CALC_DST&lt;br /&gt;
	// Calculate MESZ (DST):&lt;br /&gt;
	uint8_t wday = rtc_date.weekday;			// Weekday [1..7 = R_MO..R_SU]&lt;br /&gt;
	if(wday == 7) wday = 0;&lt;br /&gt;
	if(rtc_date.month &amp;lt; 3 || rtc_date.month &amp;gt; 10) {&lt;br /&gt;
		return;&lt;br /&gt;
	}&lt;br /&gt;
	if((rtc_date.day - wday &amp;gt;= 25)&lt;br /&gt;
	 &amp;amp;&amp;amp; (wday || rtc_time.hour &amp;gt;= 2)) {&lt;br /&gt;
		if(rtc_date.month == 10)&lt;br /&gt;
			return;&lt;br /&gt;
	}&lt;br /&gt;
	else {&lt;br /&gt;
		if(rtc_date.month == 3) {&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	rtc_time.dst = 1;&lt;br /&gt;
#endif&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Writes the time &amp;amp; date infos in the variables defined in&lt;br /&gt;
 * the library header to the Real Time Clock (RTC).&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void DS1339_write(void)&lt;br /&gt;
{&lt;br /&gt;
	registerBuf[0] = DS1339_SECONDS;&lt;br /&gt;
	registerBuf[1] = DEC2BCD(rtc_time.second);&lt;br /&gt;
	registerBuf[2] = DEC2BCD(rtc_time.minute);&lt;br /&gt;
	registerBuf[3] = DEC2BCD(rtc_time.hour);&lt;br /&gt;
	registerBuf[4] = rtc_date.weekday;&lt;br /&gt;
	registerBuf[5] = DEC2BCD(rtc_date.day);&lt;br /&gt;
	registerBuf[6] = DEC2BCD(rtc_date.month);&lt;br /&gt;
	registerBuf[7] = DEC2BCD(rtc_date.year - 2000);&lt;br /&gt;
	I2CTWI_transmitBytes(I2C_SENSOR_RTC_ADR, &amp;amp;registerBuf[0], 8);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Temperature Sensor (LM75B):&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Sends the configuration byte to a LM75B.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: Config byte for Conf register&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void LM75B_write_cfg(uint8_t config)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_TEMP_ADR, LM75B_CONF, config);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
uint8_t temperature_low;&lt;br /&gt;
uint8_t temperature_high;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Reads the two data registers of the temperature&lt;br /&gt;
 * sensor's Temp register.&lt;br /&gt;
 * They are stored in the variables temperature_low&lt;br /&gt;
 * and _high.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void LM75B_read(void)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmitByte(I2C_SENSOR_TEMP_ADR, LM75B_TEMP);&lt;br /&gt;
	I2CTWI_readBytes(I2C_SENSOR_TEMP_ADR, registerBuf, 2);&lt;br /&gt;
	temperature_high = registerBuf[0];&lt;br /&gt;
	temperature_low = registerBuf[1];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
double temperature;						// Temperature [°C]&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Calculates and returns the temperature value&lt;br /&gt;
 * by using the data read from the LM75B with&lt;br /&gt;
 * the function LM75B_read(). The sensor is&lt;br /&gt;
 * designed for 11 bit measurement and 0.125°C&lt;br /&gt;
 * resolution.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
double LM75B_calculate(void)&lt;br /&gt;
{&lt;br /&gt;
	int16_t tempraw = 0;&lt;br /&gt;
	double temp;&lt;br /&gt;
&lt;br /&gt;
	tempraw = (getTemperatureHigh() &amp;lt;&amp;lt; 8) | getTemperatureLow();&lt;br /&gt;
	tempraw &amp;gt;&amp;gt;= 5;&lt;br /&gt;
	if (tempraw &amp;amp; 1024)							// Calculate temperature&lt;br /&gt;
		tempraw = (tempraw &amp;amp; 1023) - 1024;&lt;br /&gt;
	else&lt;br /&gt;
		tempraw = tempraw &amp;amp; 1023;&lt;br /&gt;
	temp = tempraw * 0.125;&lt;br /&gt;
	return temp;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Performs a 11 bit measurement and returns the&lt;br /&gt;
 * temperature [°C]. The sensor has a measuring&lt;br /&gt;
 * cycle of 100ms. So it makes no sense calling&lt;br /&gt;
 * this function at a frequency above 10Hz.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
double LM75B_measure(void)&lt;br /&gt;
{&lt;br /&gt;
//	LM75B_init();&lt;br /&gt;
	LM75B_read();								// Read data&lt;br /&gt;
	return (LM75B_calculate());					// Calculate value&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Servo Controller (PCA9685):&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Call this once before using the servo function.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: PWM frequency [40..1000 Hz]&lt;br /&gt;
 *&lt;br /&gt;
 * Hints: - Default servo frequency is 50 Hz!&lt;br /&gt;
 *        - The servo power is NOT switched on by&lt;br /&gt;
 *          this function!&lt;br /&gt;
 *&lt;br /&gt;
 * There is also a macro initServo(freq), which&lt;br /&gt;
 * does exactly the same as this function.&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *   initServo(50);&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void PCA9685_init(uint16_t freq)&lt;br /&gt;
{&lt;br /&gt;
	outport.oen_servo = false;					// I/O 1.3: Low&lt;br /&gt;
	MAX7311_update();&lt;br /&gt;
	if ((freq &amp;lt; 40) || (freq &amp;gt; 1000)) freq = 50;&lt;br /&gt;
	I2CTWI_transmitByte(I2C_SENSOR_SERVO_ADR, PCA9685_MODE2);&lt;br /&gt;
	uint8_t last_mode = I2CTWI_readByte(I2C_SENSOR_SERVO_ADR);&lt;br /&gt;
	last_mode &amp;amp;= ~PCA9685_MODE2_INVRT;			// Clear INVRT bit&lt;br /&gt;
	last_mode |= PCA9685_MODE2_OUTDRV;			// Set OUTDRV bit&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_SERVO_ADR, PCA9685_MODE2, last_mode);&lt;br /&gt;
	I2CTWI_transmitByte(I2C_SENSOR_SERVO_ADR, PCA9685_MODE1);&lt;br /&gt;
	last_mode = I2CTWI_readByte(I2C_SENSOR_SERVO_ADR);&lt;br /&gt;
	last_mode |= PCA9685_MODE1_AI;				// Set AI bit&lt;br /&gt;
	uint8_t mode1 = last_mode;&lt;br /&gt;
	mode1 |= PCA9685_MODE1_SLEEP;				// Set SLEEP bit&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_SERVO_ADR, PCA9685_MODE1, mode1);&lt;br /&gt;
	uint8_t prescale = (uint8_t) (F_PCA9685 / 4096 / freq - 0.5);&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_SERVO_ADR, PCA9685_PRE_SCALE, prescale);&lt;br /&gt;
	last_mode &amp;amp;= ~PCA9685_MODE1_SLEEP;			// Clear SLEEP bit&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_SERVO_ADR, PCA9685_MODE1, last_mode);&lt;br /&gt;
	mSleep(1);&lt;br /&gt;
	last_mode |= PCA9685_MODE1_RESTART;			// Clear RESTART bit&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_SERVO_ADR, PCA9685_MODE1, last_mode);&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_SERVO_ADR, PCA9685_LED8_ON_H, 0x10);&lt;br /&gt;
	return;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/** &lt;br /&gt;
 * Returns the channel belonging to a servo number.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: number -&amp;gt; Servo number [1..8]&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
uint8_t servo(uint8_t number)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t channel;&lt;br /&gt;
&lt;br /&gt;
	switch (number) {&lt;br /&gt;
		case 1 :&lt;br /&gt;
			channel = CH_SERVO_1; break;&lt;br /&gt;
		case 2 :&lt;br /&gt;
			channel = CH_SERVO_2; break;&lt;br /&gt;
		case 3 :&lt;br /&gt;
			channel = CH_SERVO_3; break;&lt;br /&gt;
		case 4 :&lt;br /&gt;
			channel = CH_SERVO_4; break;&lt;br /&gt;
		case 5 :&lt;br /&gt;
			channel = CH_SERVO_5; break;&lt;br /&gt;
		case 6 :&lt;br /&gt;
			channel = CH_SERVO_6; break;&lt;br /&gt;
		case 7 :&lt;br /&gt;
			channel = CH_SERVO_7; break;&lt;br /&gt;
		case 8 :&lt;br /&gt;
			channel = CH_SERVO_8; break;&lt;br /&gt;
		default : channel = CH_SERVO_1;&lt;br /&gt;
	}&lt;br /&gt;
	return channel;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This is the servo position set function.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: channel -&amp;gt; Channel number [1..16]&lt;br /&gt;
 *        pos     -&amp;gt; Servo position [SERVOx_LT..SERVOx_RT]&lt;br /&gt;
 *&lt;br /&gt;
 * Hints: - A servo position of 205 means 1 ms servo impulse,&lt;br /&gt;
 *          a position of 410 means a 2 ms servo impulse!&lt;br /&gt;
 *          You may calculate the servo impulse length by:&lt;br /&gt;
 *          ==&amp;gt; Impulse [ms] = servo position / 204.8 &amp;lt;==&lt;br /&gt;
 *          (Formula only valid for a PWM of 50 Hz!)&lt;br /&gt;
 *&lt;br /&gt;
 * There is also a macro setServo(servo, pos), which&lt;br /&gt;
 * does nearly the same as this function, but the first&lt;br /&gt;
 * parameter is the servo and NOT the channel number.&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *   setServo(2,300);&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void PCA9685_set(uint8_t channel, uint16_t pos)&lt;br /&gt;
{&lt;br /&gt;
	if ((channel == 0) || (channel &amp;gt; 16))&lt;br /&gt;
		return;&lt;br /&gt;
	uint8_t reg = channel * 4 + 4;				// Register LEDx_OFF_L&lt;br /&gt;
	I2CTWI_transmit3Bytes(I2C_SENSOR_SERVO_ADR, reg, (pos &amp;amp; 0x00ff), (pos &amp;gt;&amp;gt; 8));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * If the servos are not moving for a while, the&lt;br /&gt;
 * servo function can be stopped with this&lt;br /&gt;
 * function (PCA9685 set to sleep mode).&lt;br /&gt;
 *&lt;br /&gt;
 * Hint: The servo power is NOT switched off by&lt;br /&gt;
 *       this function!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void PCA9685_shutdown(void)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_SERVO_ADR, PCA9685_ALL_LED_OFF_H, 0x10);&lt;br /&gt;
	I2CTWI_transmitByte(I2C_SENSOR_SERVO_ADR, PCA9685_MODE1);&lt;br /&gt;
	uint8_t mode1 = I2CTWI_readByte(I2C_SENSOR_SERVO_ADR);&lt;br /&gt;
	mode1 |= PCA9685_MODE1_SLEEP;				// Set SLEEP bit&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_SERVO_ADR, PCA9685_MODE1, mode1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * If the servo function was stopped with the&lt;br /&gt;
 * function PCA9685_shutdown() before, it can be&lt;br /&gt;
 * (re)started again with this function.&lt;br /&gt;
 *&lt;br /&gt;
 * Hint: The servo power is NOT switched on by&lt;br /&gt;
 *       this function!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void PCA9685_restart(void)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmitByte(I2C_SENSOR_SERVO_ADR, PCA9685_MODE1);&lt;br /&gt;
	uint8_t mode1 = I2CTWI_readByte(I2C_SENSOR_SERVO_ADR);&lt;br /&gt;
	if (mode1 &amp;amp; PCA9685_MODE1_RESTART) {		// RESTART bit set?&lt;br /&gt;
		mode1 &amp;amp;= ~PCA9685_MODE1_SLEEP;			// Clear SLEEP bit&lt;br /&gt;
		I2CTWI_transmit2Bytes(I2C_SENSOR_SERVO_ADR, PCA9685_MODE1, mode1);&lt;br /&gt;
		mSleep(1);&lt;br /&gt;
		mode1 |= PCA9685_MODE1_RESTART;			// Clear RESTART bit&lt;br /&gt;
		I2CTWI_transmit2Bytes(I2C_SENSOR_SERVO_ADR, PCA9685_MODE1, mode1);&lt;br /&gt;
		I2CTWI_transmit2Bytes(I2C_SENSOR_SERVO_ADR, PCA9685_ALL_LED_OFF_H, 0);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/** &lt;br /&gt;
 * With this function you can switch the servo&lt;br /&gt;
 * power on or off.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: pwr -&amp;gt; 0 (false) = servo power off&lt;br /&gt;
 *               &amp;gt;0 (true) = servo power on&lt;br /&gt;
 *&lt;br /&gt;
 * Hints: - If connected servos are not used, you&lt;br /&gt;
 *          should always switch the servo power off&lt;br /&gt;
 *          (default) to save energy!&lt;br /&gt;
 *        - The PCA9685 is NOT restarted or put into&lt;br /&gt;
 *          shutdown mode by this function!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void setServoPower(uint8_t pwr)&lt;br /&gt;
{&lt;br /&gt;
	if(pwr &amp;gt; 0)&lt;br /&gt;
		outport.pwr_servo = true;				// I/O 1.4: High&lt;br /&gt;
	else&lt;br /&gt;
		outport.pwr_servo = false;				// I/O 1.4: Low&lt;br /&gt;
	MAX7311_update();&lt;br /&gt;
}	&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C LED Driver (TCA6507):&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Sends the configuration byte to TCA6507's&lt;br /&gt;
 * internal registers.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: reg    -&amp;gt; Register address [0..10]&lt;br /&gt;
 *        config -&amp;gt; Config byte for internal&lt;br /&gt;
 *                  registers&lt;br /&gt;
 *&lt;br /&gt;
 * Hints: - With this function you can write to&lt;br /&gt;
 *          all internal registers of the LED&lt;br /&gt;
 *          driver, see &amp;quot;Registers:&amp;quot; in the&lt;br /&gt;
 *          library header file!&lt;br /&gt;
 *        - Mainly you will use this function&lt;br /&gt;
 *          for setting time (regs 3..7) and&lt;br /&gt;
 *          intensity (regs 8, 9) values.&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *   TCA6507_write_cfg(TCA6507_MAXIMUM_INTENSITY,0x77);&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void TCA6507_write_cfg(uint8_t reg, uint8_t config)&lt;br /&gt;
{&lt;br /&gt;
	if(reg &amp;gt; 10) reg = 0;&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_LEDDRIVER_ADR, reg, config);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
uint8_t select[3];&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Updates the LED driver select registers (0..2)&lt;br /&gt;
 * with the global select array!&lt;br /&gt;
 *&lt;br /&gt;
 * Hint: - Also have a look at Table 4 in the&lt;br /&gt;
 *         TCA6507 datasheet!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void TCA6507_update(void)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmit4Bytes(I2C_SENSOR_LEDDRIVER_ADR, (TCA6507_SELECT0 | 0x10), select[0], select[1], select[2]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This is the LED state set function.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: led   -&amp;gt; LED number [0..6]&lt;br /&gt;
 *        state -&amp;gt; LED state  [0..7]&lt;br /&gt;
 *&lt;br /&gt;
 * Hints: - Possible driver states [0..7] see&lt;br /&gt;
 *          &amp;quot;Output states:&amp;quot; in the library&lt;br /&gt;
 *          header file!&lt;br /&gt;
 *        - Also have a look at Table 4 in the&lt;br /&gt;
 *          TCA6507 datasheet!&lt;br /&gt;
 *&lt;br /&gt;
 * There is also a macro setLED(led, state), which&lt;br /&gt;
 * does exactly the same as this function.&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *   setLED(1,4);&lt;br /&gt;
 *   // Switches LED1 ON&lt;br /&gt;
 *   // ... OR ...&lt;br /&gt;
 *   setLED(LED1,STATE_ON);&lt;br /&gt;
 *   // does the same.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void TCA6507_set(uint8_t led, uint8_t state)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t i, mask;&lt;br /&gt;
&lt;br /&gt;
	if(led &amp;gt; 6) led = 0;&lt;br /&gt;
	led = 1 &amp;lt;&amp;lt; led;&lt;br /&gt;
	mask = 1;&lt;br /&gt;
	for(i = 0; i &amp;lt; 3; i++) {&lt;br /&gt;
		select[i] &amp;amp;= ~led;&lt;br /&gt;
		if(state &amp;amp; mask)&lt;br /&gt;
			select[i] |= led;&lt;br /&gt;
		mask &amp;lt;&amp;lt;= 1;&lt;br /&gt;
	}&lt;br /&gt;
	TCA6507_update();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * If the LEDs are not needed for a while, the&lt;br /&gt;
 * LED driver can be stopped with this function&lt;br /&gt;
 * (TCA6507 set to shutdown mode).&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void TCA6507_shutdown(void)&lt;br /&gt;
{&lt;br /&gt;
	outport.en_leddriv = false;					// I/O 0.4: Low&lt;br /&gt;
	MAX7311_update();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * If the LED driver was stopped with the&lt;br /&gt;
 * function TCA6507_shutdown() before, it can be&lt;br /&gt;
 * (re)started again with this function.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void TCA6507_restart(void)&lt;br /&gt;
{&lt;br /&gt;
	outport.en_leddriv = true;					// I/O 0.4: High&lt;br /&gt;
	MAX7311_update();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Initializes the LED driver after power on by&lt;br /&gt;
 * switching all LEDs off.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void TCA6507_init(void)&lt;br /&gt;
{&lt;br /&gt;
	select[0] = 0;&lt;br /&gt;
	select[1] = 0;&lt;br /&gt;
	select[2] = 0;&lt;br /&gt;
	TCA6507_update();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C 3D Magnetometer &amp;amp; Accelerometer (LSM303DLHC):&lt;br /&gt;
&lt;br /&gt;
// --------------------------------------------&lt;br /&gt;
// LSM303DLHC accelerometer functions:&lt;br /&gt;
int16_t x_axisa, y_axisa, z_axisa;&lt;br /&gt;
double pitch, roll;&lt;br /&gt;
double xa, ya, za;&lt;br /&gt;
double the, phi;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Call this once before using the 3D-Accelerometer.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void LSM303DLHC_A_init(void)&lt;br /&gt;
{&lt;br /&gt;
	// Set normal power mode, 10 Hz data rate, all axes enabled:&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_LSM303DLHC_A_ADR, CTRL_REG1_A, CTRL_REG1_A_10HZ);&lt;br /&gt;
	mSleep(10);&lt;br /&gt;
	// Set HD mode:&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_LSM303DLHC_A_ADR, CTRL_REG4_A, CTRL_REG4_A_HR);&lt;br /&gt;
	mSleep(10);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function reads the X-axis, Y-axis and Z-axis values&lt;br /&gt;
 * from the LSM303DLHC accelerometer and stores them in the&lt;br /&gt;
 * global variables x_axisa, y_axisa and z_axisa.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void readLSM303DLHC_A(void)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t readBuf[6];&lt;br /&gt;
&lt;br /&gt;
	I2CTWI_transmitByte(I2C_SENSOR_LSM303DLHC_A_ADR, (OUT_X_L_A | 0x80));&lt;br /&gt;
	I2CTWI_readBytes(I2C_SENSOR_LSM303DLHC_A_ADR, readBuf, 6); // Read  X-/Y-/Z-axis&lt;br /&gt;
	// xb = y:&lt;br /&gt;
	x_axisa = ((readBuf[OUT_Y_H_A - OUT_X_L_A] &amp;lt;&amp;lt; 8) + readBuf[OUT_Y_L_A - OUT_X_L_A]) / 16;&lt;br /&gt;
	// yb = x:&lt;br /&gt;
	y_axisa = ((readBuf[OUT_X_H_A - OUT_X_L_A] &amp;lt;&amp;lt; 8) + readBuf[OUT_X_L_A - OUT_X_L_A]) / 16;&lt;br /&gt;
	// zb = z:&lt;br /&gt;
	z_axisa = ((readBuf[OUT_Z_H_A - OUT_X_L_A] &amp;lt;&amp;lt; 8) + readBuf[OUT_Z_L_A - OUT_X_L_A]) / 16;&lt;br /&gt;
	mSleep(10);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function limits and normalizes the x-axisa,&lt;br /&gt;
 * y-axisa and z-axisa values read from the LSM303DLHC&lt;br /&gt;
 * accelerometer with the function readLSM303DLHC_A() and&lt;br /&gt;
 * stores them in the global double variables xa, ya and&lt;br /&gt;
 * za.&lt;br /&gt;
 * It also calculates the position in space in form of the&lt;br /&gt;
 * tilt angles (the = pitch, phi = roll) and stores them&lt;br /&gt;
 * in the global double variables the and phi.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void normalizeLSM303DLHC_A(void)&lt;br /&gt;
{&lt;br /&gt;
	// Limit raw values:&lt;br /&gt;
	if (x_axisa &amp;lt; MIN_X_A) x_axisa = MIN_X_A;&lt;br /&gt;
	if (x_axisa &amp;gt; MAX_X_A) x_axisa = MAX_X_A;&lt;br /&gt;
	if (y_axisa &amp;lt; MIN_Y_A) y_axisa = MIN_Y_A;&lt;br /&gt;
	if (y_axisa &amp;gt; MAX_Y_A) y_axisa = MAX_Y_A;&lt;br /&gt;
	if (z_axisa &amp;lt; MIN_Z_A) z_axisa = MIN_Z_A;&lt;br /&gt;
	if (z_axisa &amp;gt; MAX_Z_A) z_axisa = MAX_Z_A;&lt;br /&gt;
	xa = (double) x_axisa / 1000.0;&lt;br /&gt;
	ya = (double) y_axisa / 1000.0;&lt;br /&gt;
	za = (double) z_axisa / 1000.0;&lt;br /&gt;
	// Calculate Pitch and Roll:&lt;br /&gt;
	phi = asin(xa);								// Calculate the and phi&lt;br /&gt;
	the = asin(ya / cos(the));					//  from the raw values&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function calculates the position in space by&lt;br /&gt;
 * using the the and phi values (see function&lt;br /&gt;
 * normalizeLSM303DLHC_A()!). It stores the position&lt;br /&gt;
 * in the global double variables pitch and roll. &lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void positionLSM303DLHC_A(void)&lt;br /&gt;
{&lt;br /&gt;
	pitch = the * 180 / M_PI + OFFSET_PITCH_A;&lt;br /&gt;
	roll = phi * 180 / M_PI + OFFSET_ROLL_A;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// LSM303DLHC magnetometer functions:&lt;br /&gt;
int16_t x_axism, y_axism, z_axism;&lt;br /&gt;
int16_t headingm;&lt;br /&gt;
double xm, ym, zm;&lt;br /&gt;
#ifdef GET_TEMP_M&lt;br /&gt;
int16_t temperaturem;&lt;br /&gt;
double temperature_mag;&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
int16_t headingtc;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Call this once before using the 3D-Compass.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void LSM303DLHC_M_init(void)&lt;br /&gt;
{&lt;br /&gt;
#ifdef GET_TEMP_M&lt;br /&gt;
	// Set Data output rate to 15Hz, enable temperature sensor:&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_LSM303DLHC_M_ADR, CRA_REG_M, CRA_REG_M_15HZ_T_EN);&lt;br /&gt;
#else&lt;br /&gt;
	// Set Data output rate to 15Hz:&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_LSM303DLHC_M_ADR, CRA_REG_M, CRA_REG_M_15HZ);&lt;br /&gt;
#endif&lt;br /&gt;
	mSleep(10);&lt;br /&gt;
	// Set Gain to +-1.3Gauss:&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_LSM303DLHC_M_ADR, CRB_REG_M, CRB_REG_M_13GAUSS);&lt;br /&gt;
	mSleep(10);&lt;br /&gt;
	// Set Continuous-conversion mode:&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_LSM303DLHC_M_ADR, MR_REG_M, MR_REG_M_CCM);&lt;br /&gt;
	mSleep(10);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function reads the X-axis, Y-axis, Z-axis and&lt;br /&gt;
 * temperature values from the LSM303DLHC magnetometer&lt;br /&gt;
 * and stores them in the global variables x_axism,&lt;br /&gt;
 * y_axism, z_axism and temperaturem.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void readLSM303DLHC_M(void)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t readBuf[6];&lt;br /&gt;
&lt;br /&gt;
	I2CTWI_transmitByte(I2C_SENSOR_LSM303DLHC_M_ADR, OUT_X_H_M);&lt;br /&gt;
	I2CTWI_readBytes(I2C_SENSOR_LSM303DLHC_M_ADR, readBuf, 6); // Read  X-/Y-/Z-axis&lt;br /&gt;
	// xb = x:&lt;br /&gt;
	x_axism = (readBuf[OUT_X_H_M - OUT_X_H_M] &amp;lt;&amp;lt; 8) + readBuf[OUT_X_L_M - OUT_X_H_M];&lt;br /&gt;
	// yb = y:&lt;br /&gt;
	y_axism = (readBuf[OUT_Y_H_M - OUT_X_H_M] &amp;lt;&amp;lt; 8) + readBuf[OUT_Y_L_M - OUT_X_H_M];&lt;br /&gt;
	// zb = z:&lt;br /&gt;
	z_axism = (readBuf[OUT_Z_H_M - OUT_X_H_M] &amp;lt;&amp;lt; 8) + readBuf[OUT_Z_L_M - OUT_X_H_M];&lt;br /&gt;
	mSleep(10);&lt;br /&gt;
#ifdef GET_TEMP_M&lt;br /&gt;
	// Read temperature raw value:&lt;br /&gt;
	I2CTWI_transmitByte(I2C_SENSOR_LSM303DLHC_M_ADR, TEMP_OUT_H_M);&lt;br /&gt;
	readBuf[0] = I2CTWI_readByte(I2C_SENSOR_LSM303DLHC_M_ADR);&lt;br /&gt;
	I2CTWI_transmitByte(I2C_SENSOR_LSM303DLHC_M_ADR, TEMP_OUT_L_M);&lt;br /&gt;
	readBuf[1] = I2CTWI_readByte(I2C_SENSOR_LSM303DLHC_M_ADR);&lt;br /&gt;
	temperaturem = (readBuf[0] &amp;lt;&amp;lt; 8) | readBuf[1];&lt;br /&gt;
	temperaturem &amp;gt;&amp;gt;= 4;&lt;br /&gt;
	if (temperaturem &amp;amp; 2048)					// Calculate temperature&lt;br /&gt;
		temperaturem = (temperaturem &amp;amp; 2047) - 2048;&lt;br /&gt;
	else&lt;br /&gt;
		temperaturem = temperaturem &amp;amp; 2047;&lt;br /&gt;
	mSleep(10);&lt;br /&gt;
#endif&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function compensates hard iron effects and&lt;br /&gt;
 * scales the x-axism, y-axism and z-axism values read&lt;br /&gt;
 * from the LSM303DLHC magnetometer with the function&lt;br /&gt;
 * readLSM303DLHC_M() and stores them in the global&lt;br /&gt;
 * double variables xm, ym and zm.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void normalizeLSM303DLHC_M(void)&lt;br /&gt;
{&lt;br /&gt;
	// Add hard iron offsets:&lt;br /&gt;
	x_axism += OFFSET_X_M;&lt;br /&gt;
	y_axism += OFFSET_Y_M;&lt;br /&gt;
	z_axism += OFFSET_Z_M;&lt;br /&gt;
	// Scale raw values:&lt;br /&gt;
	xm = (x_axism - MIN_X_M) / (MAX_X_M - MIN_X_M) * 2 - 1;&lt;br /&gt;
	ym = (y_axism - MIN_Y_M) / (MAX_Y_M - MIN_Y_M) * 2 - 1;&lt;br /&gt;
	zm = (z_axism - MIN_Z_M) / (MAX_Z_M - MIN_Z_M) * 2 - 1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function calculates the heading by using the&lt;br /&gt;
 * normalized sensor values xm and ym (see function&lt;br /&gt;
 * normalizeLSM303DLHC_M()!). The heading is a value&lt;br /&gt;
 * from 0° to 359°. If the robot's front (and the&lt;br /&gt;
 * RP6 Sensor Board's front edge with the two&lt;br /&gt;
 * headlights) points to ...&lt;br /&gt;
 *   north -&amp;gt; heading is 0°,&lt;br /&gt;
 *   east  -&amp;gt; heading is 90°,&lt;br /&gt;
 *   south -&amp;gt; heading is 180°,&lt;br /&gt;
 *   west  -&amp;gt; heading is 270°.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
int16_t headingLSM303DLHC_M(void)&lt;br /&gt;
{&lt;br /&gt;
	double hdg = atan2(ym, xm) * 180 / M_PI + DECLINATION_M;&lt;br /&gt;
	if(hdg &amp;lt; 0.0) hdg += 360.0;&lt;br /&gt;
	return ((int16_t) hdg);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// --------------------------------------------&lt;br /&gt;
/**&lt;br /&gt;
 * This function calculates the TILT COMPENSATED&lt;br /&gt;
 * heading by using accelerometer (the, phi) AND&lt;br /&gt;
 * magnetometer (xm, ym, zm) data. The heading is a&lt;br /&gt;
 * value from 0° to 359°. If the robot's front (and&lt;br /&gt;
 * the RP6 Sensor Board's front edge with the two&lt;br /&gt;
 * headlights) points to ...&lt;br /&gt;
 *   north -&amp;gt; heading is 0°,&lt;br /&gt;
 *   east  -&amp;gt; heading is 90°,&lt;br /&gt;
 *   south -&amp;gt; heading is 180°,&lt;br /&gt;
 *   west  -&amp;gt; heading is 270°.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
int16_t headingLSM303DLHC_TC(void)&lt;br /&gt;
{&lt;br /&gt;
	double hdgtc, xh, yh;&lt;br /&gt;
&lt;br /&gt;
	xh = xm * cos(the) + zm * sin(the);&lt;br /&gt;
	yh = xm * sin(phi) * sin(the) + ym * cos(phi) - zm * sin(phi) * cos(the);&lt;br /&gt;
//	zh = -xm * cos(phi) * sin(the) + ym * sin(phi) + zm * cos(phi) * cos(the);&lt;br /&gt;
	hdgtc = atan2(yh, xh) * 180 / M_PI + DECLINATION_M;&lt;br /&gt;
	if(hdgtc &amp;lt; 0.0) hdgtc += 360.0;&lt;br /&gt;
	return ((int16_t) hdgtc);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// --------------------------------------------&lt;br /&gt;
/**&lt;br /&gt;
 * Call this once before using the LSM303DLHC.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void LSM303DLHC_init(void)&lt;br /&gt;
{&lt;br /&gt;
	LSM303DLHC_A_init();						// Accelerometer init&lt;br /&gt;
	LSM303DLHC_M_init();						// Magnetometer init&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Analog Yaw-Rate Gyroscope (LY330ALH):&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Sets the LY330ALH mode of operation.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: mode -&amp;gt; Mode [0..3]&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void LY330ALH_set_mode(uint8_t mode)&lt;br /&gt;
{&lt;br /&gt;
	outport.pd_gyro = false;					// I/O 0.6: Low&lt;br /&gt;
	outport.st_gyro = false;					// I/O 0.7: Low&lt;br /&gt;
	if(mode &amp;amp; 1) outport.pd_gyro = true;&lt;br /&gt;
	if(mode &amp;amp; 2) outport.st_gyro = true;&lt;br /&gt;
	MAX7311_update();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Reads the ADC1 value from the RP6Base.&lt;br /&gt;
 *&lt;br /&gt;
 * Hints: - The RP6Base input ADC1 has to be&lt;br /&gt;
 *          connected to the USRBUS: Pin 2 on&lt;br /&gt;
 *          the RP6 mainboard!&lt;br /&gt;
 *        - The RP6Base_I2CSlave program has to&lt;br /&gt;
 *          be loaded into the RP6Base&lt;br /&gt;
 *          microcontroller!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
uint16_t getRP6Base_ADC1(void)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_readRegisters(I2C_RP6_BASE_ADR, I2C_REG_ADC_ADC1_L, registerBuf, 2);&lt;br /&gt;
	return (registerBuf[0] + (registerBuf[1] &amp;lt;&amp;lt; 8));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int16_t z_axisg;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Performs a LY330ALH gyroscope measurement and&lt;br /&gt;
 * returns the angular rate (velocity).&lt;br /&gt;
 * Positive values mean an angular rate while&lt;br /&gt;
 * rotating LEFT and negative values while&lt;br /&gt;
 * rotating RIGHT!&lt;br /&gt;
 * The global integer variable z_axisg also&lt;br /&gt;
 * contains the measurement result.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
int16_t LY330ALH_measure(void)&lt;br /&gt;
{&lt;br /&gt;
	z_axisg = getRP6Base_ADC1();				// Read raw data&lt;br /&gt;
	z_axisg -= ADCVAL_ZERORATE_LEVEL;			// Calculate value&lt;br /&gt;
	return (z_axisg);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Hot Swappable 2-Wire Bus Buffer (TCA4311A):&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Reads the TCA4311A Ready output. &lt;br /&gt;
 * The function returns the state (true/false).&lt;br /&gt;
 * The global variable readyBusbuff is also&lt;br /&gt;
 * filled with the Ready output state.&lt;br /&gt;
 *&lt;br /&gt;
 * Hint: You don't have to use this function,&lt;br /&gt;
 *       if the task task_RP6SensorBoard() is&lt;br /&gt;
 *       called frequently out of the main&lt;br /&gt;
 *       loop, because readyBusbuff will be&lt;br /&gt;
 *       updated by this task!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
uint8_t readReadyBusbuff(void)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmitByte(I2C_SENSOR_PORTEXP_ADR, MAX7311_INPUT_PORT1);&lt;br /&gt;
	readyBusbuff = I2CTWI_readByte(I2C_SENSOR_PORTEXP_ADR);&lt;br /&gt;
	readyBusbuff &amp;amp;= RDY_BUSBUFF;&lt;br /&gt;
	return readyBusbuff;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
uint8_t errorBusbuff;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * If the I2C bus for the I2C-MODULE (SCLOUT,&lt;br /&gt;
 * SDAOUT) is not used or shall be isolated from&lt;br /&gt;
 * the RP6 I2C bus, this can be done with this&lt;br /&gt;
 * function.&lt;br /&gt;
 *&lt;br /&gt;
 * Hints: - The I2C-MODULE power is NOT switched&lt;br /&gt;
 *          off by this function!&lt;br /&gt;
 *        - If USE_PD5 is defined in the&lt;br /&gt;
 *          configuration header file, this&lt;br /&gt;
 *          function uses the RP6M256 portpin,&lt;br /&gt;
 *          that is connected to plug I/O: Pin 9&lt;br /&gt;
 *          instead of MAX7311 I/O 1.0!&lt;br /&gt;
 *        - If the global variable errorBusbuff&lt;br /&gt;
 *          returns true, the bus buffer could&lt;br /&gt;
 *          not be switched to shutdown mode!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void TCA4311A_shutdown(void)&lt;br /&gt;
{&lt;br /&gt;
	// Wait until the I2C bus is idle:&lt;br /&gt;
	while(I2CTWI_isBusy() || TWI_operation != I2CTWI_NO_OPERATION) task_I2CTWI();&lt;br /&gt;
#ifdef USE_PD5&lt;br /&gt;
	IO_SENSOR_TCA4311A_EN_PORT &amp;amp;= ~IO_SENSOR_TCA4311A_EN_IN; // Low&lt;br /&gt;
#else&lt;br /&gt;
	outport.en_busbuff = false;					// I/O 1.0: Low&lt;br /&gt;
	MAX7311_update();&lt;br /&gt;
#endif&lt;br /&gt;
	errorBusbuff = readReadyBusbuff();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * If the I2C bus for the I2C-MODULE (SCLOUT,&lt;br /&gt;
 * SDAOUT) was isolated from the RP6 I2C bus with&lt;br /&gt;
 * the function TCA4311A_shutdown() before, it&lt;br /&gt;
 * can be connected again with this function.&lt;br /&gt;
 *&lt;br /&gt;
 * Hints: - The I2C-MODULE power is NOT switched&lt;br /&gt;
 *          on by this function!&lt;br /&gt;
 *        - If USE_PD5 is defined in the&lt;br /&gt;
 *          configuration header file, this&lt;br /&gt;
 *          function uses the RP6M256 portpin,&lt;br /&gt;
 *          that is connected to plug I/O: Pin 9&lt;br /&gt;
 *          instead of MAX7311 I/O 1.0!&lt;br /&gt;
 *        - If the global variable errorBusbuff&lt;br /&gt;
 *          returns true, the bus buffer could&lt;br /&gt;
 *          not be switched to normal operation!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void TCA4311A_reconnect(void)&lt;br /&gt;
{&lt;br /&gt;
	// Wait until the I2C bus is idle:&lt;br /&gt;
	while(I2CTWI_isBusy() || TWI_operation != I2CTWI_NO_OPERATION) task_I2CTWI();&lt;br /&gt;
#ifdef USE_PD5&lt;br /&gt;
	IO_SENSOR_TCA4311A_EN_PORT |= IO_SENSOR_TCA4311A_EN_IN; // High&lt;br /&gt;
#else&lt;br /&gt;
	outport.en_busbuff = true;					// I/O 1.0: High&lt;br /&gt;
	MAX7311_update();&lt;br /&gt;
#endif&lt;br /&gt;
	errorBusbuff = !readReadyBusbuff();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Sets/clears the RP6Base signal PWR.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: pwr -&amp;gt; 0 (false) = PWR off&lt;br /&gt;
 *               &amp;gt;0 (true) = PWR on&lt;br /&gt;
 *&lt;br /&gt;
 * Hints: - The RP6Base signal PWR has to be&lt;br /&gt;
 *          connected to the USRBUS: Pin 3 on&lt;br /&gt;
 *          the RP6 mainboard!&lt;br /&gt;
 *        - The RP6Base_I2CSlave program has to&lt;br /&gt;
 *          be loaded into the RP6Base&lt;br /&gt;
 *          microcontroller!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void setRP6Base_PWR(uint8_t pwr)&lt;br /&gt;
{&lt;br /&gt;
	if(pwr &amp;gt; 0)&lt;br /&gt;
		I2CTWI_transmit2Bytes(I2C_RP6_BASE_ADR, 0, CMD_POWER_ON);&lt;br /&gt;
	else&lt;br /&gt;
		I2CTWI_transmit2Bytes(I2C_RP6_BASE_ADR, 0, CMD_POWER_OFF);&lt;br /&gt;
	while(I2CTWI_isBusy() || TWI_operation != I2CTWI_NO_OPERATION) task_I2CTWI();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/** &lt;br /&gt;
 * With this function you can switch the I2C-&lt;br /&gt;
 * MODULE (plug M1) power on or off.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: pwr -&amp;gt; 0 (false) = I2C-MODULE power off&lt;br /&gt;
 *               &amp;gt;0 (true) = I2C-MODULE power on&lt;br /&gt;
 *&lt;br /&gt;
 * Hints: - If the I2C-MODULE plug is not used,&lt;br /&gt;
 *          you should always switch the&lt;br /&gt;
 *          I2C-MODULE power off (default)!&lt;br /&gt;
 *        - The TCA4311A is NOT switched to&lt;br /&gt;
 *          normal operation (default) or&lt;br /&gt;
 *          shutdown mode by this function!&lt;br /&gt;
 *        - The RP6Base signal PWR has to be&lt;br /&gt;
 *          connected to the USRBUS: Pin 3 on&lt;br /&gt;
 *          the RP6 mainboard!&lt;br /&gt;
 *        - The RP6Base_I2CSlave program has to&lt;br /&gt;
 *          be loaded into the RP6Base&lt;br /&gt;
 *          microcontroller!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void setI2CModulePower(uint8_t pwr)&lt;br /&gt;
{&lt;br /&gt;
	if(pwr &amp;gt; 0) {&lt;br /&gt;
		setRP6Base_PWR(1);						// RP6Base PWR on&lt;br /&gt;
		outport.pwr_i2c = true;					// I/O 0.0: High&lt;br /&gt;
	}&lt;br /&gt;
	else&lt;br /&gt;
		outport.pwr_i2c = false;				// I/O 0.0: Low&lt;br /&gt;
	MAX7311_update();&lt;br /&gt;
}	&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Button:&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Reads the MAX7311 I/O port 1.7. &lt;br /&gt;
 * The function returns true, if  button S1 is&lt;br /&gt;
 * pressed (I/O 1.7: Low!) and false, if it is&lt;br /&gt;
 * not pressed (I/O 1.7: High!).&lt;br /&gt;
 * The global variable pressedButton is also&lt;br /&gt;
 * filled with the I/O 1.7 output state.&lt;br /&gt;
 *&lt;br /&gt;
 * Hint: You don't have to use this function,&lt;br /&gt;
 *       if the task task_RP6SensorBoard() is&lt;br /&gt;
 *       called frequently out of the main&lt;br /&gt;
 *       loop, because pressedButton will be&lt;br /&gt;
 *       updated by this task!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
uint8_t readButton(void)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmitByte(I2C_SENSOR_PORTEXP_ADR, MAX7311_INPUT_PORT2);&lt;br /&gt;
	pressedButton = I2CTWI_readByte(I2C_SENSOR_PORTEXP_ADR);&lt;br /&gt;
	pressedButton &amp;amp;= IO2_I2C;&lt;br /&gt;
	pressedButton = !pressedButton;&lt;br /&gt;
	return pressedButton;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Status LED:&lt;br /&gt;
&lt;br /&gt;
/** &lt;br /&gt;
 * Sets the status LED (D2) of the RP6 Sensor&lt;br /&gt;
 * Board.&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *   setStatusLED(1);&lt;br /&gt;
 *   // This switches the status LED on!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void setStatusLED(uint8_t on)&lt;br /&gt;
{&lt;br /&gt;
	if(on &amp;gt; 0)&lt;br /&gt;
		outport.io1_i2c = false;				// I/O 1.6: Low&lt;br /&gt;
	else&lt;br /&gt;
		outport.io1_i2c = true;					// I/O 1.6: High&lt;br /&gt;
	MAX7311_update();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// RP6 Sensor Board initialisation and shutdown:&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * You MUST call this function at the beginning of a&lt;br /&gt;
 * main program, that uses the RP6 Sensor Board. &lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void sensor_board_init(void)&lt;br /&gt;
{&lt;br /&gt;
	// I/O Port Expander:&lt;br /&gt;
	MAX7311_init();&lt;br /&gt;
	// RTC:&lt;br /&gt;
	DS1339_init();&lt;br /&gt;
	// Temperature Sensor:&lt;br /&gt;
	LM75B_init();&lt;br /&gt;
	// Servo Controller:&lt;br /&gt;
	PCA9685_init(50);							// Init PWM 50 Hz&lt;br /&gt;
	// LED Driver:&lt;br /&gt;
	TCA6507_init();&lt;br /&gt;
	// 3D Magnetometer &amp;amp; Accelerometer:&lt;br /&gt;
	LSM303DLHC_init();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * If you don't use any function of the RP6&lt;br /&gt;
 * Sensor Board, you can put the board into&lt;br /&gt;
 * &amp;quot;SHUTDOWN MODE&amp;quot;. In this mode the electric&lt;br /&gt;
 * power consumption is very low to save energy.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void sensor_board_shutdown(void)&lt;br /&gt;
{&lt;br /&gt;
	// Servo Controller:&lt;br /&gt;
	PCA9685_shutdown();							// Shutdown PCA9685&lt;br /&gt;
	// Temperature Sensor:&lt;br /&gt;
	LM75B_shutdown();							// Shutdown LM75B&lt;br /&gt;
	// I/O Port Expander:&lt;br /&gt;
	MAX7311_write(MAX7311_OUTPUT_SHUTDOWN);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&lt;br /&gt;
/******************************************************************************&lt;br /&gt;
 * Additional info&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Changelog:&lt;br /&gt;
 * - v. 1.0 TCA4311A reconnect problem fixed 10.04.2014 by Dirk&lt;br /&gt;
 * - v. 0.9 Interrupt status functions added 09.04.2014 by Dirk&lt;br /&gt;
 * - v. 0.8 (initial release) 17.03.2014 by Dirk&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Erklärung&lt;br /&gt;
&lt;br /&gt;
=====Demo=====&lt;br /&gt;
makefile:&lt;br /&gt;
&amp;lt;pre&amp;gt;...&lt;br /&gt;
TARGET = RP6M256_Sensor_Board_01&lt;br /&gt;
...&lt;br /&gt;
SRC += $(RP6_LIB_PATH)/RP6common/RP6I2CmasterTWI.c&lt;br /&gt;
&lt;br /&gt;
SRC += $(RP6_LIB_PATH)/RP6control_M256_WIFI/RP6M256_Sensor_BoardLib.c&lt;br /&gt;
...&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Datei: RP6M256_Sensor_Board_01.c&lt;br /&gt;
&amp;lt;pre&amp;gt;/* &lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * RP6 ROBOT SYSTEM - RP6 CONTROL M256 Examples&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Example: RP6M256 Sensor Board&lt;br /&gt;
 * Author(s): Dirk&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Description:&lt;br /&gt;
 * In this example we show a first test for the RP6 Sensor Board.&lt;br /&gt;
 * &lt;br /&gt;
 * ############################################################################&lt;br /&gt;
 * The Robot does NOT move in this example! You can simply put it on a table&lt;br /&gt;
 * next to your PC and you should connect it to the PC via the USB Interface!&lt;br /&gt;
 * You should also connect to it via WIFI.&lt;br /&gt;
 * ############################################################################&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Includes:&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6M256Lib.h&amp;quot; 				// The RP6 M256 Library. &lt;br /&gt;
										// Always needs to be included!&lt;br /&gt;
#include &amp;quot;RP6I2CmasterTWI.h&amp;quot;			// Include the I2C-Bus Master Library&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Include our new &amp;quot;RP6M256 Sensor Board library&amp;quot;:&lt;br /&gt;
// (This is the library for accessing the RP6 Sensor Board!)&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6M256_Sensor_BoardLib.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Variables:&lt;br /&gt;
&lt;br /&gt;
char dir[3];&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Returns a 2 character string for the eighth&lt;br /&gt;
 * parts of the direction calculated from the&lt;br /&gt;
 * heading value.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: heading -&amp;gt; Heading value [0..359]&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void calculateDir(char *dir, uint16_t heading)&lt;br /&gt;
{&lt;br /&gt;
	dir[1] = ' ';&lt;br /&gt;
	dir[2] = '\0';&lt;br /&gt;
	if ((heading &amp;lt;= 22) || (heading &amp;gt;=338)) dir[0] = 'N';&lt;br /&gt;
	if ((heading &amp;gt;= 23) &amp;amp;&amp;amp; (heading &amp;lt;= 67)) {dir[0] = 'N'; dir[1] = 'E';} &lt;br /&gt;
	if ((heading &amp;gt;= 68) &amp;amp;&amp;amp; (heading &amp;lt;= 112)) dir[0] = 'E';&lt;br /&gt;
	if ((heading &amp;gt;= 113) &amp;amp;&amp;amp; (heading &amp;lt;= 157)) {dir[0] = 'S'; dir[1] = 'E';}&lt;br /&gt;
	if ((heading &amp;gt;= 158) &amp;amp;&amp;amp; (heading &amp;lt;= 202)) dir[0] = 'S';&lt;br /&gt;
	if ((heading &amp;gt;= 203) &amp;amp;&amp;amp; (heading &amp;lt;= 247)) {dir[0] = 'S'; dir[1] = 'W';}&lt;br /&gt;
	if ((heading &amp;gt;= 248) &amp;amp;&amp;amp; (heading &amp;lt;= 292)) dir[0] = 'W';&lt;br /&gt;
	if ((heading &amp;gt;= 293) &amp;amp;&amp;amp; (heading &amp;lt;= 337)) {dir[0] = 'N'; dir[1] = 'W';}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Write a floating point number to the WIFI.&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *&lt;br /&gt;
 *			// Write a floating point number to the WIFI (no exponent):&lt;br /&gt;
 *			writeDouble_WIFI(1234567.890, 11, 3);&lt;br /&gt;
 *&lt;br /&gt;
 * The value of prec (precision) defines the number of decimal places.&lt;br /&gt;
 * For 32 bit floating point variables (float, double ...) 6 is&lt;br /&gt;
 * the max. value for prec (7 relevant digits).&lt;br /&gt;
 * The value of width defines the overall number of characters in the&lt;br /&gt;
 * floating point number including the decimal point. The number of&lt;br /&gt;
 * pre-decimal positions is: (width - prec - 1).&lt;br /&gt;
 */&lt;br /&gt;
void writeDouble_WIFI(double number, uint8_t width, uint8_t prec)&lt;br /&gt;
{char buffer[width + 1];&lt;br /&gt;
	dtostrf(number, width, prec, &amp;amp;buffer[0]);&lt;br /&gt;
	writeString_WIFI(&amp;amp;buffer[0]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Write a floating point number to the LCD.&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *&lt;br /&gt;
 *			// Write a floating point number to the LCD (no exponent):&lt;br /&gt;
 *			writeDoubleLCD(1234567.890, 11, 3);&lt;br /&gt;
 *&lt;br /&gt;
 * The value of prec (precision) defines the number of decimal places.&lt;br /&gt;
 * For 32 bit floating point variables (float, double ...) 6 is&lt;br /&gt;
 * the max. value for prec (7 relevant digits).&lt;br /&gt;
 * The value of width defines the overall number of characters in the&lt;br /&gt;
 * floating point number including the decimal point. The number of&lt;br /&gt;
 * pre-decimal positions is: (width - prec - 1).&lt;br /&gt;
 */&lt;br /&gt;
void writeDoubleLCD(double number, uint8_t width, uint8_t prec)&lt;br /&gt;
{char buffer[width + 1];&lt;br /&gt;
	dtostrf(number, width, prec, &amp;amp;buffer[0]);&lt;br /&gt;
	writeStringLCD(&amp;amp;buffer[0]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Error handler&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function gets called automatically if there was an I2C Error like&lt;br /&gt;
 * the slave sent a &amp;quot;not acknowledge&amp;quot; (NACK, error codes e.g. 0x20 or 0x30).&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void I2C_transmissionError(uint8_t errorState)&lt;br /&gt;
{&lt;br /&gt;
	writeString_P_WIFI(&amp;quot;\nI2C ERROR - TWI STATE: 0x&amp;quot;);&lt;br /&gt;
	writeInteger_WIFI(errorState, HEX);&lt;br /&gt;
	writeChar_WIFI('\n');&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Main function - The program starts here:&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
	initRP6M256();    // Always call this first! The Processor will not work&lt;br /&gt;
					  // correctly otherwise. &lt;br /&gt;
&lt;br /&gt;
	initLCD(); // Initialize the LC-Display (LCD)&lt;br /&gt;
			   // Always call this before using the LCD!&lt;br /&gt;
&lt;br /&gt;
	setLEDs(0b1111);&lt;br /&gt;
	mSleep(500);&lt;br /&gt;
	setLEDs(0b0000);&lt;br /&gt;
&lt;br /&gt;
	writeString_P_WIFI(&amp;quot;\n\nRP6 Sensor Board Selftest 1!\n&amp;quot;); &lt;br /&gt;
&lt;br /&gt;
	// IMPORTANT:&lt;br /&gt;
	I2CTWI_initMaster(100); // Initialize the TWI Module for Master operation&lt;br /&gt;
							// with 100kHz SCL Frequency&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	// Register the event handler:&lt;br /&gt;
	I2CTWI_setTransmissionErrorHandler(I2C_transmissionError);&lt;br /&gt;
&lt;br /&gt;
	setLEDs(0b1111);&lt;br /&gt;
&lt;br /&gt;
	// Write a text message to the LCD:&lt;br /&gt;
	showScreenLCD(&amp;quot;################&amp;quot;, &amp;quot;################&amp;quot;);&lt;br /&gt;
	mSleep(1500);&lt;br /&gt;
	showScreenLCD(&amp;quot;RP6v2-M256-WIFI &amp;quot;, &amp;quot;Example Program&amp;quot;);&lt;br /&gt;
	mSleep(2500); &lt;br /&gt;
	showScreenLCD(&amp;quot;RP6 Sensor Board&amp;quot;, &amp;quot;   Selftest 1&amp;quot;);&lt;br /&gt;
	mSleep(2500);&lt;br /&gt;
	clearLCD();&lt;br /&gt;
&lt;br /&gt;
	setLEDs(0b0000);&lt;br /&gt;
&lt;br /&gt;
	// ---------------------------------------&lt;br /&gt;
&lt;br /&gt;
	uint8_t onoff = 0;&lt;br /&gt;
	uint16_t servopos = SERVO1_LT;&lt;br /&gt;
	int16_t rate;&lt;br /&gt;
&lt;br /&gt;
	startStopwatch1();&lt;br /&gt;
	startStopwatch2();&lt;br /&gt;
&lt;br /&gt;
	// IMPORTANT:&lt;br /&gt;
	sensor_board_init();						// RP6 Sensor Board init!!!&lt;br /&gt;
	setServoPower(1);							// Servo power ON!&lt;br /&gt;
/*&lt;br /&gt;
	// ----------------------------------------------&lt;br /&gt;
	// Set RTC once (battery empty or not existing:&lt;br /&gt;
	rtc_time.second = 0;&lt;br /&gt;
	rtc_time.minute = 15;&lt;br /&gt;
	rtc_time.hour = 20;				// 20:15&lt;br /&gt;
	rtc_date.weekday = R_SU;&lt;br /&gt;
	rtc_date.day = 20;&lt;br /&gt;
	rtc_date.month = 4;&lt;br /&gt;
	rtc_date.year = 2014;			// Su, 20.4.2014&lt;br /&gt;
	DS1339_write();&lt;br /&gt;
	// Remove this, if RTC is set and running!!!&lt;br /&gt;
	// ----------------------------------------------&lt;br /&gt;
*/&lt;br /&gt;
	while(true) &lt;br /&gt;
	{&lt;br /&gt;
		if(getStopwatch1() &amp;gt; 1000) // 1s&lt;br /&gt;
		{&lt;br /&gt;
			if (onoff) onoff = 0;&lt;br /&gt;
			else onoff = 1;&lt;br /&gt;
&lt;br /&gt;
			// Interrupt status:&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nInterrupt Status:      &amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(interrupt_RP6SBstatus.byte, BIN, 8);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			// Inport status:&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;Inport Status: &amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(inport.word, BIN, 16);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			// Temperature sensor test:&lt;br /&gt;
			temperature = LM75B_measure();		// Measure&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;Temperature: &amp;quot;);&lt;br /&gt;
			writeDouble_WIFI(temperature, 7, 3);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;°\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			// LED driver test:&lt;br /&gt;
			if (onoff) {&lt;br /&gt;
				setLED(HEADLIGHT_R, STATE_ON);&lt;br /&gt;
				setLED(HEADLIGHT_L, STATE_OFF);&lt;br /&gt;
			}&lt;br /&gt;
			else {&lt;br /&gt;
				setLED(HEADLIGHT_L, STATE_ON);&lt;br /&gt;
				setLED(HEADLIGHT_R, STATE_OFF);&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			// Servo controller test (SERVO_1):&lt;br /&gt;
			setServo(1, servopos);&lt;br /&gt;
			servopos += 10;&lt;br /&gt;
			if (servopos &amp;gt; SERVO1_RT) servopos = SERVO1_LT;&lt;br /&gt;
&lt;br /&gt;
			// RTC test:&lt;br /&gt;
			DS1339_read();&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;RTC: &amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(rtc_time.hour, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;:&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(rtc_time.minute, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;:&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(rtc_time.second, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;  &amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(rtc_date.day, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;.&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(rtc_date.month, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;.&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(rtc_date.year, DEC, 4);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			// 3D Magnetometer &amp;amp; Accelerometer test:&lt;br /&gt;
			//  LSM303DLHC accelerometer:&lt;br /&gt;
			task_I2CTWI();&lt;br /&gt;
			readLSM303DLHC_A();					// Get sensor values&lt;br /&gt;
			task_I2CTWI();&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\n3D-Acceleration SENSOR -&amp;gt;\n&amp;quot;);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;X-axis: &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(x_axisa, DEC);&lt;br /&gt;
			writeChar_WIFI('\n');&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;Y-axis: &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(y_axisa, DEC);&lt;br /&gt;
			writeChar_WIFI('\n');&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;Z-axis: &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(z_axisa, DEC);&lt;br /&gt;
			writeChar_WIFI('\n');&lt;br /&gt;
			normalizeLSM303DLHC_A();			// Normalize data&lt;br /&gt;
			positionLSM303DLHC_A();				// Calculate position&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;POSITION: \n&amp;quot;);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;  Pitch [°]: &amp;quot;);&lt;br /&gt;
			writeDouble_WIFI(pitch, 6, 1);&lt;br /&gt;
			writeChar_WIFI('\n');&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;  Roll [°]:  &amp;quot;);&lt;br /&gt;
			writeDouble_WIFI(roll, 6, 1);&lt;br /&gt;
			writeChar_WIFI('\n');&lt;br /&gt;
&lt;br /&gt;
			//  LSM303DLHC magnetometer:&lt;br /&gt;
			task_I2CTWI();&lt;br /&gt;
			readLSM303DLHC_M();					// Get sensor values&lt;br /&gt;
			task_I2CTWI();&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\n3D-Compass SENSOR -&amp;gt;\n&amp;quot;);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;X-axis: &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(x_axism, DEC);&lt;br /&gt;
			writeChar_WIFI('\n');&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;Y-axis: &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(y_axism, DEC);&lt;br /&gt;
			writeChar_WIFI('\n');&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;Z-axis: &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(z_axism, DEC);&lt;br /&gt;
			writeChar_WIFI('\n');&lt;br /&gt;
			normalizeLSM303DLHC_M();			// Normalize data&lt;br /&gt;
			headingm = headingLSM303DLHC_M();	// Calculate heading&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;                 Heading [°]: &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(headingm, DEC);&lt;br /&gt;
			calculateDir(dir, headingm);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;  Direction: &amp;quot;);&lt;br /&gt;
			writeString_WIFI(dir);&lt;br /&gt;
			writeChar_WIFI('\n');&lt;br /&gt;
			headingtc = headingLSM303DLHC_TC();	// Calculate TILT COMPENSATED&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;TILT COMPENSATED heading [°]: &amp;quot;); // heading&lt;br /&gt;
			writeInteger_WIFI(headingtc, DEC);&lt;br /&gt;
			calculateDir(dir, headingtc);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;  Direction: &amp;quot;);&lt;br /&gt;
			writeString_WIFI(dir);&lt;br /&gt;
			writeChar_WIFI('\n');&lt;br /&gt;
#ifdef GET_TEMP_M&lt;br /&gt;
			temperature_mag = (double) temperaturem / 8.0 + OFFSET_TEMP_M;&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;Temperature [°]: &amp;quot;);&lt;br /&gt;
			writeDouble_WIFI(temperature_mag, 7, 2);&lt;br /&gt;
			writeChar_WIFI('\n');&lt;br /&gt;
#endif&lt;br /&gt;
			// Yaw-Rate Gyroscope test:&lt;br /&gt;
			rate = LY330ALH_measure();&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\n1D-Gyro SENSOR -&amp;gt;\n&amp;quot;);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;Z-axis: &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(rate, DEC);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			// RP6 Sensor Board shutdown (button &amp;amp; status LED test):&lt;br /&gt;
			if (pressedButton) {&lt;br /&gt;
				setStatusLED(1);&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;\nPress button again for RP6 Sensor Board SHUTDOWN!\n&amp;quot;);&lt;br /&gt;
				mSleep(2000);&lt;br /&gt;
				do {&lt;br /&gt;
					if(getStopwatch2() &amp;gt; 200) { // 0.2s&lt;br /&gt;
						if (onoff) onoff = 0;&lt;br /&gt;
						else onoff = 1;&lt;br /&gt;
						if (onoff) setStatusLED(1);&lt;br /&gt;
						else setStatusLED(0);&lt;br /&gt;
						setStopwatch2(0);&lt;br /&gt;
					}&lt;br /&gt;
					mSleep(1);&lt;br /&gt;
					task_I2CTWI();&lt;br /&gt;
				} while (!readButton());&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;\n\n\n\n\nPlease wait for RP6 Sensor Board SHUTDOWN...\n&amp;quot;);&lt;br /&gt;
				sensor_board_shutdown();&lt;br /&gt;
				mSleep(3000);&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;\n\n\nThe RP6 Sensor Board now is in SHUTDOWN MODE!!!\n&amp;quot;);&lt;br /&gt;
				mSleep(1000);&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;\nRESET the M256 microcontroller now...\n\n&amp;quot;);&lt;br /&gt;
				while(true) {};&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			setStopwatch1(0);&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		task_checkINTs();						// Read interrupt signals&lt;br /&gt;
		task_RP6SensorBoard();					// RP6 Sensor Board task&lt;br /&gt;
&lt;br /&gt;
		task_I2CTWI();&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Erklärung&lt;br /&gt;
&lt;br /&gt;
====Projekte====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===RP6 Xtra Module===&lt;br /&gt;
Die Dokumentation zu den RP6 Xtra Modulen befindet sich auf der mitgelieferten ''&amp;quot;RP6 Robot System Xtra Modules CD-ROM&amp;quot;''. Auf der CD-ROM sind auch Software-Beispiele zu finden.&lt;br /&gt;
&lt;br /&gt;
Die hier veröffentlichte Software zu den Xtra Modulen ist eine Eigenentwicklung in GCC:&lt;br /&gt;
* Arexx [[RP6_Sensor_Board_und_Xtra_Module#I2C_GPS_Empf.C3.A4nger_JM3-GPS_2|I2C GPS Empfänger JM3-GPS]]&lt;br /&gt;
* Arexx [[RP6_Sensor_Board_und_Xtra_Module#Gyro_Modul_JM3-GYRO_2|Gyro Modul JM3-GYRO]]&lt;br /&gt;
* Arexx [[RP6_Sensor_Board_und_Xtra_Module#3D_Accelerometer_Modul_JM3-3DA_2|3D Accelerometer Modul JM3-3DA]]&lt;br /&gt;
&lt;br /&gt;
====I2C GPS Empfänger JM3-GPS====&lt;br /&gt;
=====RP6M256 WiFi: I2C_GPS Library=====&lt;br /&gt;
Die nachfolgende RP6M256_I2C_GPSLib (GCC) dient zur Ansteuerung des I2C GPS Empfängers durch die RP6M256 WiFi.&lt;br /&gt;
 &lt;br /&gt;
======Libary Header======&lt;br /&gt;
Datei: RP6M256_I2C_GPSLib.h&lt;br /&gt;
&amp;lt;pre&amp;gt;/* ****************************************************************************&lt;br /&gt;
 *                           _______________________&lt;br /&gt;
 *                           \| RP6  ROBOT SYSTEM |/&lt;br /&gt;
 *                            \_-_-_-_-_-_-_-_-_-_/           &amp;gt;&amp;gt;&amp;gt; RP6 M256 WIFI&lt;br /&gt;
 * ----------------------------------------------------------------------------&lt;br /&gt;
 * ----------------------------- [c]2014 - Dirk -------------------------------&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * File: RP6M256_I2C_GPSLib.h&lt;br /&gt;
 * Version: 1.0&lt;br /&gt;
 * Target: RP6 M256 WIFI - ATMEGA2560 @16.00MHz&lt;br /&gt;
 * Author(s): Dirk&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Description:&lt;br /&gt;
 * Header file for new RP6 I2C GPS Receiver library.&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
#ifndef RP6M256_I2C_GPSLIB_H&lt;br /&gt;
#define RP6M256_I2C_GPSLIB_H&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// RP6 Sensor Board:&lt;br /&gt;
&lt;br /&gt;
// If you want to use the RP6 I2C GPS Receiver on the RP6 Sensor Board, you&lt;br /&gt;
// have to define SENSOR_BOARD (default)!&lt;br /&gt;
// If SENSOR_BOARD is NOT defined, this library assumes that the RP6 I2C GPS&lt;br /&gt;
// Receiver is used stand-alone.&lt;br /&gt;
// ------------------&lt;br /&gt;
#define SENSOR_BOARD&lt;br /&gt;
// ------------------&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Includes:&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6M256Lib.h&amp;quot;&lt;br /&gt;
#include &amp;quot;RP6I2CmasterTWI.h&amp;quot;&lt;br /&gt;
#ifdef SENSOR_BOARD&lt;br /&gt;
	#include &amp;quot;RP6M256_Sensor_BoardLib.h&amp;quot;&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// RP6 I2C GPS Receiver:&lt;br /&gt;
#define I2C_GPS_RECEIVER_ADR			0xc8	// Default&lt;br /&gt;
//#define I2C_GPS_RECEIVER_ADR			0xca&lt;br /&gt;
//#define I2C_GPS_RECEIVER_ADR			0xcc&lt;br /&gt;
//#define I2C_GPS_RECEIVER_ADR			0xce&lt;br /&gt;
//#define I2C_GPS_RECEIVER_ADR			0xd0	// DO NOT USE on Sensor Board!&lt;br /&gt;
//#define I2C_GPS_RECEIVER_ADR			0xd2&lt;br /&gt;
//#define I2C_GPS_RECEIVER_ADR			0xd4&lt;br /&gt;
//#define I2C_GPS_RECEIVER_ADR			0xd6&lt;br /&gt;
//#define I2C_GPS_RECEIVER_ADR			0xd8&lt;br /&gt;
//#define I2C_GPS_RECEIVER_ADR			0xda&lt;br /&gt;
//#define I2C_GPS_RECEIVER_ADR			0xdc&lt;br /&gt;
//#define I2C_GPS_RECEIVER_ADR			0xde&lt;br /&gt;
&lt;br /&gt;
// Read registers:&lt;br /&gt;
#define WHO_AM_I						0x20	// I2C address [0xc8..0xde]&lt;br /&gt;
#define LAT_DEG							0x21	// Degrees&lt;br /&gt;
#define LAT_MIN							0x22	// Minutes&lt;br /&gt;
#define LAT_MIN_D_L						0x23	// Minutes decimal part low&lt;br /&gt;
#define LAT_MIN_D_H						0x24	// Minutes decimal part high&lt;br /&gt;
#define LON_DEG							0x25	// Degrees&lt;br /&gt;
#define LON_MIN							0x26	// Minutes&lt;br /&gt;
#define LON_MIN_D_L						0x27	// Minutes decimal part low&lt;br /&gt;
#define LON_MIN_D_H						0x28	// Minutes decimal part high&lt;br /&gt;
#define STATUS							0x29	// Status flags&lt;br /&gt;
#define FIX_IND							0x2a	// FIX_IND&lt;br /&gt;
#define HDOP							0x2b	// HDOP&lt;br /&gt;
#define HDOP_D							0x2c	// HDOP_D&lt;br /&gt;
#define SAT_N							0x2d	// Number of satellites&lt;br /&gt;
#define COURSE_T_L						0x2e	// True heading low byte&lt;br /&gt;
#define COURSE_T_H						0x2f	// True heading high byte&lt;br /&gt;
#define COURSE_T_D						0x30	// Decimal part of course&lt;br /&gt;
#define SPEED_L							0x31	// Speed low byte&lt;br /&gt;
#define SPEED_H							0x32	// Speed high byte&lt;br /&gt;
#define SPEED_D							0x33	// Speed decimal part&lt;br /&gt;
#define ALT_L							0x34	// Altitude low byte&lt;br /&gt;
#define ALT_H							0x35	// Altitude high byte&lt;br /&gt;
#define ALT_DIF_L						0x36	// Differ. WGS-84 MSL low byte&lt;br /&gt;
#define ALT_DIF_H						0x37	// Differ. WGS-84 MSL high byte&lt;br /&gt;
#define UTC_H							0x38	// UTC hour&lt;br /&gt;
#define UTC_MIN							0x39	// UTC minute&lt;br /&gt;
#define UTC_S							0x3a	// UTC second&lt;br /&gt;
#define DAY								0x3b	// Day&lt;br /&gt;
#define YEAR_L							0x3c	// Year low byte&lt;br /&gt;
#define YEAR_H							0x3d	// Year high byte&lt;br /&gt;
#define MONTH							0x3e	// Month&lt;br /&gt;
#define PDOP							0x3f	// PDOP&lt;br /&gt;
#define PDOP_D							0x40	// PDOP_D&lt;br /&gt;
#define VDOP							0x41	// VDOP&lt;br /&gt;
#define VDOP_D							0x42	// VDOP_D&lt;br /&gt;
#define SAT_1							0x43	// SAT # 1&lt;br /&gt;
#define SAT_2							0x44	// SAT # 2&lt;br /&gt;
#define SAT_3							0x45	// SAT # 3&lt;br /&gt;
#define SAT_4							0x46	// SAT # 4&lt;br /&gt;
#define SAT_5							0x47	// SAT # 5&lt;br /&gt;
#define SAT_6							0x48	// SAT # 6&lt;br /&gt;
#define SAT_7							0x49	// SAT # 7&lt;br /&gt;
#define SAT_8							0x4a	// SAT # 8&lt;br /&gt;
#define SAT_9							0x4b	// SAT # 9&lt;br /&gt;
#define SAT_A							0x4c	// SAT # 10&lt;br /&gt;
#define SAT_B							0x4d	// SAT # 11&lt;br /&gt;
#define SAT_C							0x4e	// SAT # 12&lt;br /&gt;
#define SW_VERSION						0x4f	// SW_Version&lt;br /&gt;
#define HEARTBEAT						0x50	// Heartbeat&lt;br /&gt;
&lt;br /&gt;
// Status and Fix_Ind register bitmasks:&lt;br /&gt;
#define STATUS_NS						0b00000001&lt;br /&gt;
#define STATUS_EW						0b00000010&lt;br /&gt;
#define STATUS_SPU						0b00000100&lt;br /&gt;
#define STATUS_AUTON					0b00001000&lt;br /&gt;
#define FIX_IND_UI_FIX					0b10000000&lt;br /&gt;
&lt;br /&gt;
// Write registers:&lt;br /&gt;
#define INIT_CFG						0x90	// INIT CFG&lt;br /&gt;
#define SET_FIX_TIME					0x91	// Pos_Fix_Time&lt;br /&gt;
#define STBY							0x92	// STBY&lt;br /&gt;
#define FAC_RES							0x93	// Factory Reset&lt;br /&gt;
#define EN_JAM							0x94	// Jamming Remover&lt;br /&gt;
#define TEST_MODE						0x96	// Test Mode&lt;br /&gt;
&lt;br /&gt;
// Write register values (commands):&lt;br /&gt;
#define INIT_CFG_HOT_START				1		// Hot Start&lt;br /&gt;
#define INIT_CFG_WARM_START				2		// Warm Start init data loaded&lt;br /&gt;
#define INIT_CFG_WARM_START_EPH_CLR		3		// Warm Start Ephemeris cleared&lt;br /&gt;
#define INIT_CFG_COLD_START				4		// Cold Start&lt;br /&gt;
#define SET_FIX_TIME_1S					1		// Pos Fix Time 1 second&lt;br /&gt;
#define SET_FIX_TIME_2S					2		// Pos Fix Time 2 seconds&lt;br /&gt;
#define STBY_ENTER						1		// Standby (cleared after write)&lt;br /&gt;
#define FAC_RES_ENTER					1		// Factory Reset&lt;br /&gt;
#define EN_JAM_DISABLE					0		// Jamming Remover disable&lt;br /&gt;
#define EN_JAM_ENABLE					1		// Jamming Remover enable&lt;br /&gt;
#define TEST_MODE_INACTIVE				0		// Test Mode inactive&lt;br /&gt;
#define TEST_MODE_ACTIVE				0x15	// Test Mode active&lt;br /&gt;
&lt;br /&gt;
// Data structure (starts at LAT_DEG):&lt;br /&gt;
#define DATA_STRUCT						LAT_DEG	// Start&lt;br /&gt;
// All data from LAT_DEG to HEARTBEAT (48 bytes):&lt;br /&gt;
#define DATA_LENGTH						(HEARTBEAT - LAT_DEG + 1)&lt;br /&gt;
// Basic data from LAT_DEG to SAT_N (13 bytes):&lt;br /&gt;
#define DATA_BASIC						(SAT_N - LAT_DEG + 1)&lt;br /&gt;
&lt;br /&gt;
typedef union {&lt;br /&gt;
 	uint8_t byte;&lt;br /&gt;
	struct {&lt;br /&gt;
		unsigned ns    :1;				// 1: North 0: South&lt;br /&gt;
		unsigned ew    :1;				// 1: East 0: West&lt;br /&gt;
		unsigned spu   :1;				// 1: km/h 0: kn&lt;br /&gt;
		unsigned auton :1;				// 1: Data not valid 0: Autonomous&lt;br /&gt;
		unsigned fix0  :1;&lt;br /&gt;
		unsigned fix1  :1;&lt;br /&gt;
		unsigned stat0 :1;				// Invalid&lt;br /&gt;
		unsigned stat1 :1;				// GPS Com Error&lt;br /&gt;
	};&lt;br /&gt;
	struct {&lt;br /&gt;
		unsigned ns    :1;				// 1: North 0: South&lt;br /&gt;
		unsigned ew    :1;				// 1: East 0: West&lt;br /&gt;
		unsigned spu   :1;				// 1: km/h 0: kn&lt;br /&gt;
		unsigned auton :1;				// 1: Data not valid 0: Autonomous&lt;br /&gt;
		unsigned fix   :2;&lt;br /&gt;
		unsigned stat  :2;				// 00 -&amp;gt; Valid&lt;br /&gt;
										// 01 -&amp;gt; Invalid&lt;br /&gt;
										// 10 -&amp;gt; GPS Com Error&lt;br /&gt;
										// 11 -&amp;gt; n. def.&lt;br /&gt;
	};&lt;br /&gt;
} status_t;&lt;br /&gt;
&lt;br /&gt;
typedef union {&lt;br /&gt;
 	uint8_t byte;&lt;br /&gt;
	struct {							// Fix indicator:&lt;br /&gt;
		unsigned fix_0  :1;				//  1: GPS fix          2: DGPS fix&lt;br /&gt;
		unsigned fix_1  :1;				//  3: PPS fix          4: RTK&lt;br /&gt;
		unsigned fix_2  :1;				//  5: Float RTK        6: Dead reck.&lt;br /&gt;
		unsigned fix_3  :1;				//  7: Manual inp. mode 8: Simul. mode&lt;br /&gt;
		unsigned unused :3;&lt;br /&gt;
		unsigned ui_fix :1;				// HW signal from UC530&lt;br /&gt;
	};&lt;br /&gt;
	struct {&lt;br /&gt;
		unsigned fix    :4;				// See above &amp;quot;Fix indicator&amp;quot;!&lt;br /&gt;
		unsigned unused :3;&lt;br /&gt;
		unsigned ui_fix :1;				// HW signal from UC530&lt;br /&gt;
	};&lt;br /&gt;
} fix_ind_t;&lt;br /&gt;
&lt;br /&gt;
typedef union {&lt;br /&gt;
	struct {&lt;br /&gt;
		uint8_t   latDeg;&lt;br /&gt;
		uint8_t   latMin;&lt;br /&gt;
		uint16_t  latMinDec;&lt;br /&gt;
		uint8_t   lonDeg;&lt;br /&gt;
		uint8_t   lonMin;&lt;br /&gt;
		uint16_t  lonMinDec;&lt;br /&gt;
		status_t  status;&lt;br /&gt;
		fix_ind_t fixInd;&lt;br /&gt;
		uint8_t   hdop;&lt;br /&gt;
		uint8_t   hdopDec;&lt;br /&gt;
		uint8_t   satCount;&lt;br /&gt;
		uint16_t  course;&lt;br /&gt;
		uint8_t   courseDec;&lt;br /&gt;
		uint16_t  speed;&lt;br /&gt;
		uint8_t   speedDec;&lt;br /&gt;
		uint16_t  altitude;&lt;br /&gt;
		uint16_t  altDif;&lt;br /&gt;
		uint8_t   utcHour;&lt;br /&gt;
		uint8_t   utcMinute;&lt;br /&gt;
		uint8_t   utcSec;&lt;br /&gt;
		uint8_t   day;&lt;br /&gt;
		uint16_t  year;&lt;br /&gt;
		uint8_t   month;&lt;br /&gt;
		uint8_t   pdop;&lt;br /&gt;
		uint8_t   pdopDec;&lt;br /&gt;
		uint8_t   vdop;&lt;br /&gt;
		uint8_t   vdopDec;&lt;br /&gt;
		uint8_t   sat[12];&lt;br /&gt;
		uint8_t   swVersion;&lt;br /&gt;
		uint8_t   heartbeat;&lt;br /&gt;
	};&lt;br /&gt;
} gpsdata_t;&lt;br /&gt;
extern gpsdata_t gpsdata;&lt;br /&gt;
&lt;br /&gt;
void I2C_GPS_reset(void);&lt;br /&gt;
void I2C_GPS_write_cmd(uint8_t, uint8_t);&lt;br /&gt;
uint8_t I2C_GPS_read_reg(uint8_t);&lt;br /&gt;
void I2C_GPS_read(uint8_t);&lt;br /&gt;
void I2C_GPS_init(void);&lt;br /&gt;
void I2C_GPS_new_addr(uint8_t);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
/******************************************************************************&lt;br /&gt;
 * Additional info&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Changelog:&lt;br /&gt;
 * &lt;br /&gt;
 *  ---&amp;gt; changes are documented in the file &amp;quot;RP6M256_I2C_GPSLib.c&amp;quot;&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
======Libary Source======&lt;br /&gt;
Datei: RP6M256_I2C_GPSLib.c&lt;br /&gt;
&amp;lt;pre&amp;gt;/* ****************************************************************************&lt;br /&gt;
 *                           _______________________&lt;br /&gt;
 *                           \| RP6  ROBOT SYSTEM |/&lt;br /&gt;
 *                            \_-_-_-_-_-_-_-_-_-_/           &amp;gt;&amp;gt;&amp;gt; RP6 M256 WIFI&lt;br /&gt;
 * ----------------------------------------------------------------------------&lt;br /&gt;
 * ----------------------------- [c]2014 - Dirk -------------------------------&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * File: RP6M256_I2C_GPSLib.c&lt;br /&gt;
 * Version: 1.0&lt;br /&gt;
 * Target: RP6 M256 WIFI - ATMEGA2560 @16.00MHz&lt;br /&gt;
 *         and a RP6 I2C GPS Receiver (CONRAD 1082385)&lt;br /&gt;
 *         optionally on a RP6 Sensor Board (CONRAD 1082384)&lt;br /&gt;
 * Author(s): Dirk&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Description:&lt;br /&gt;
 * &lt;br /&gt;
 * This is our new Library that contains basic routines and functions for&lt;br /&gt;
 * accessing the RP6 I2C GPS Receiver JM3-GPS (CONRAD 1082385).&lt;br /&gt;
 * The library assumes the I2C GPS Receiver software (firmware) v1.2.&lt;br /&gt;
 * If the I2C GPS Receiver is located on the RP6 Sensor Board (CONRAD 1082384)&lt;br /&gt;
 * and connected to the I2C-MODULE plug M1, the RP6M256_Sensor_BoardLib has to&lt;br /&gt;
 * be included!&lt;br /&gt;
 * &lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Includes:&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6M256_I2C_GPSLib.h&amp;quot; 		&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Variables:&lt;br /&gt;
&lt;br /&gt;
uint8_t gpsdataBuf[DATA_LENGTH + 1]; &lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Software reset for the I2C GPS Receiver.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void I2C_GPS_reset(void)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_GPS_RECEIVER_ADR, 0, 0x06);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Writes a command cmd to a register reg of the&lt;br /&gt;
 * I2C GPS Receiver.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: reg -&amp;gt; Write register [0x90..0x96]&lt;br /&gt;
 *        cmd -&amp;gt; Command&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void I2C_GPS_write_cmd(uint8_t reg, uint8_t cmd)&lt;br /&gt;
{&lt;br /&gt;
	if((reg &amp;lt; INIT_CFG) || (reg &amp;gt; TEST_MODE)) return;&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_GPS_RECEIVER_ADR, reg, cmd);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Reads a single register reg from the I2C GPS&lt;br /&gt;
 * Receiver.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: reg -&amp;gt; Read register [0x20..0x50]&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
uint8_t I2C_GPS_read_reg(uint8_t reg)&lt;br /&gt;
{&lt;br /&gt;
	if((reg &amp;lt; WHO_AM_I) || (reg &amp;gt; HEARTBEAT)) reg = WHO_AM_I;&lt;br /&gt;
	I2CTWI_transmitByte(I2C_GPS_RECEIVER_ADR, reg);&lt;br /&gt;
	return (I2CTWI_readByte(I2C_GPS_RECEIVER_ADR));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
gpsdata_t gpsdata;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Reads the GPS data from the I2C GPS Receiver.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: length -&amp;gt; Number of data bytes [1..48]&lt;br /&gt;
 *&lt;br /&gt;
 * Hint: If length = DATA_BASIC, only basic GPS&lt;br /&gt;
 *       data are read. If length = DATA_LENGTH,&lt;br /&gt;
 *       ALL GPS data are read.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void I2C_GPS_read(uint8_t length)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t i;&lt;br /&gt;
&lt;br /&gt;
	if(length &amp;gt; DATA_LENGTH) length = DATA_LENGTH;&lt;br /&gt;
	I2CTWI_readRegisters(I2C_GPS_RECEIVER_ADR, DATA_STRUCT, gpsdataBuf, length);&lt;br /&gt;
	for(i = length; i &amp;lt; DATA_LENGTH; i++) {&lt;br /&gt;
		gpsdataBuf[i] = 0;&lt;br /&gt;
	}&lt;br /&gt;
	gpsdata.latDeg = gpsdataBuf[0];&lt;br /&gt;
	gpsdata.latMin = gpsdataBuf[1];&lt;br /&gt;
	gpsdata.latMinDec = gpsdataBuf[2] + (gpsdataBuf[3] &amp;lt;&amp;lt; 8);&lt;br /&gt;
	gpsdata.lonDeg = gpsdataBuf[4];&lt;br /&gt;
	gpsdata.lonMin = gpsdataBuf[5];&lt;br /&gt;
	gpsdata.lonMinDec = gpsdataBuf[6] + (gpsdataBuf[7] &amp;lt;&amp;lt; 8);&lt;br /&gt;
	gpsdata.status.byte = gpsdataBuf[8];&lt;br /&gt;
	gpsdata.fixInd.byte = gpsdataBuf[9];&lt;br /&gt;
	gpsdata.hdop = gpsdataBuf[10];&lt;br /&gt;
	gpsdata.hdopDec = gpsdataBuf[11];&lt;br /&gt;
	gpsdata.satCount = gpsdataBuf[12];&lt;br /&gt;
	if(length == DATA_BASIC) return;&lt;br /&gt;
	gpsdata.course = gpsdataBuf[13] + (gpsdataBuf[14] &amp;lt;&amp;lt; 8);&lt;br /&gt;
	gpsdata.courseDec = gpsdataBuf[15];&lt;br /&gt;
	gpsdata.speed = gpsdataBuf[16] + (gpsdataBuf[17] &amp;lt;&amp;lt; 8);&lt;br /&gt;
	gpsdata.speedDec = gpsdataBuf[18];&lt;br /&gt;
	gpsdata.altitude = gpsdataBuf[19] + (gpsdataBuf[20] &amp;lt;&amp;lt; 8);&lt;br /&gt;
	gpsdata.altDif = gpsdataBuf[21] + (gpsdataBuf[22] &amp;lt;&amp;lt; 8);&lt;br /&gt;
	gpsdata.utcHour = gpsdataBuf[23];&lt;br /&gt;
	gpsdata.utcMinute = gpsdataBuf[24];&lt;br /&gt;
	gpsdata.utcSec = gpsdataBuf[25];&lt;br /&gt;
	gpsdata.day = gpsdataBuf[26];&lt;br /&gt;
	gpsdata.year = gpsdataBuf[27] + (gpsdataBuf[28] * 100);&lt;br /&gt;
	gpsdata.month = gpsdataBuf[29];&lt;br /&gt;
	gpsdata.pdop = gpsdataBuf[30];&lt;br /&gt;
	gpsdata.pdopDec = gpsdataBuf[31];&lt;br /&gt;
	gpsdata.vdop = gpsdataBuf[32];&lt;br /&gt;
	gpsdata.vdopDec = gpsdataBuf[33];&lt;br /&gt;
	for(i = 34; i &amp;lt; 46; i++) {&lt;br /&gt;
		gpsdata.sat[i - 34] = gpsdataBuf[i];&lt;br /&gt;
	}&lt;br /&gt;
	gpsdata.swVersion = gpsdataBuf[46];&lt;br /&gt;
	gpsdata.heartbeat = gpsdataBuf[47];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * You MUST call this function at the beginning of a&lt;br /&gt;
 * main program, that uses the RP6 I2C GPS Receiver. &lt;br /&gt;
 * If SENSOR_BOARD is defined, the I2C-MODULE power&lt;br /&gt;
 * will be switched on with the function&lt;br /&gt;
 * setI2CModulePower() defined in the&lt;br /&gt;
 * RP6M256_Sensor_BoardLib, which will be included&lt;br /&gt;
 * then.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void I2C_GPS_init(void)&lt;br /&gt;
{&lt;br /&gt;
#ifdef SENSOR_BOARD&lt;br /&gt;
	// I2C-MODULE (plug M1) power on: &lt;br /&gt;
	setI2CModulePower(1);&lt;br /&gt;
#endif&lt;br /&gt;
	// Other init procedures here!&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Writes a new I2C address to the I2C GPS Receiver.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: addr -&amp;gt; New I2C address [0xc8..0xde]&lt;br /&gt;
 *&lt;br /&gt;
 * Hints: - Default I2C address is 0xc8.&lt;br /&gt;
 *        - You may choose a new I2C address in&lt;br /&gt;
 *          the range 0xc8..0xde.&lt;br /&gt;
 *        - After writing a new address you have&lt;br /&gt;
 *          to switch the I2C GPS Receiver off&lt;br /&gt;
 *          and on again.&lt;br /&gt;
 *        - Definition I2C_GPS_RECEIVER_ADR must&lt;br /&gt;
 *          be adapted to the new I2C address!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void I2C_GPS_new_addr(uint8_t addr)&lt;br /&gt;
{&lt;br /&gt;
	if((addr &amp;lt; 0xc8) || (addr &amp;gt; 0xde)) return;&lt;br /&gt;
	addr &amp;amp;= 0xfe;								// Clear R/W bit&lt;br /&gt;
	I2CTWI_transmit3Bytes(I2C_GPS_RECEIVER_ADR, 0, 0x04, addr);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&lt;br /&gt;
/******************************************************************************&lt;br /&gt;
 * Additional info&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Changelog:&lt;br /&gt;
 * - v. 1.0 (initial release) 21.04.2014 by Dirk&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Erklärung&lt;br /&gt;
&lt;br /&gt;
======Demo======&lt;br /&gt;
makefile:&lt;br /&gt;
&amp;lt;pre&amp;gt;...&lt;br /&gt;
TARGET = RP6M256_Sensor_Board_02&lt;br /&gt;
...&lt;br /&gt;
SRC += $(RP6_LIB_PATH)/RP6common/RP6I2CmasterTWI.c&lt;br /&gt;
&lt;br /&gt;
SRC += $(RP6_LIB_PATH)/RP6control_M256_WIFI/RP6M256_Sensor_BoardLib.c&lt;br /&gt;
SRC += $(RP6_LIB_PATH)/RP6control_M256_WIFI/RP6M256_I2C_GPSLib.c&lt;br /&gt;
...&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Datei: RP6M256_Sensor_Board_02.c&lt;br /&gt;
&amp;lt;pre&amp;gt;/* &lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * RP6 ROBOT SYSTEM - RP6 CONTROL M256 Examples&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Example: RP6M256 Sensor Board&lt;br /&gt;
 * Author(s): Dirk&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Description:&lt;br /&gt;
 * In this example we show a second test for the RP6 Sensor Board.&lt;br /&gt;
 * &lt;br /&gt;
 * ############################################################################&lt;br /&gt;
 * The Robot does NOT move in this example! You can simply put it on a table&lt;br /&gt;
 * next to your PC and you should connect it to the PC via the USB Interface!&lt;br /&gt;
 * You should also connect to it via WIFI.&lt;br /&gt;
 * ############################################################################&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Includes:&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6M256Lib.h&amp;quot; 				// The RP6 M256 Library. &lt;br /&gt;
										// Always needs to be included!&lt;br /&gt;
#include &amp;quot;RP6I2CmasterTWI.h&amp;quot;			// Include the I2C-Bus Master Library&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Include our new &amp;quot;RP6M256 I2C GPS Receiver library&amp;quot;:&lt;br /&gt;
// (This is the library for accessing the RP6 I2C GPS Receiver!)&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6M256_I2C_GPSLib.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Write a floating point number to the WIFI.&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *&lt;br /&gt;
 *			// Write a floating point number to the WIFI (no exponent):&lt;br /&gt;
 *			writeDouble_WIFI(1234567.890, 11, 3);&lt;br /&gt;
 *&lt;br /&gt;
 * The value of prec (precision) defines the number of decimal places.&lt;br /&gt;
 * For 32 bit floating point variables (float, double ...) 6 is&lt;br /&gt;
 * the max. value for prec (7 relevant digits).&lt;br /&gt;
 * The value of width defines the overall number of characters in the&lt;br /&gt;
 * floating point number including the decimal point. The number of&lt;br /&gt;
 * pre-decimal positions is: (width - prec - 1).&lt;br /&gt;
 */&lt;br /&gt;
void writeDouble_WIFI(double number, uint8_t width, uint8_t prec)&lt;br /&gt;
{char buffer[width + 1];&lt;br /&gt;
	dtostrf(number, width, prec, &amp;amp;buffer[0]);&lt;br /&gt;
	writeString_WIFI(&amp;amp;buffer[0]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Write a floating point number to the LCD.&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *&lt;br /&gt;
 *			// Write a floating point number to the LCD (no exponent):&lt;br /&gt;
 *			writeDoubleLCD(1234567.890, 11, 3);&lt;br /&gt;
 *&lt;br /&gt;
 * The value of prec (precision) defines the number of decimal places.&lt;br /&gt;
 * For 32 bit floating point variables (float, double ...) 6 is&lt;br /&gt;
 * the max. value for prec (7 relevant digits).&lt;br /&gt;
 * The value of width defines the overall number of characters in the&lt;br /&gt;
 * floating point number including the decimal point. The number of&lt;br /&gt;
 * pre-decimal positions is: (width - prec - 1).&lt;br /&gt;
 */&lt;br /&gt;
void writeDoubleLCD(double number, uint8_t width, uint8_t prec)&lt;br /&gt;
{char buffer[width + 1];&lt;br /&gt;
	dtostrf(number, width, prec, &amp;amp;buffer[0]);&lt;br /&gt;
	writeStringLCD(&amp;amp;buffer[0]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Error handler&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function gets called automatically if there was an I2C Error like&lt;br /&gt;
 * the slave sent a &amp;quot;not acknowledge&amp;quot; (NACK, error codes e.g. 0x20 or 0x30).&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void I2C_transmissionError(uint8_t errorState)&lt;br /&gt;
{&lt;br /&gt;
	writeString_P_WIFI(&amp;quot;\nI2C ERROR - TWI STATE: 0x&amp;quot;);&lt;br /&gt;
	writeInteger_WIFI(errorState, HEX);&lt;br /&gt;
	writeChar_WIFI('\n');&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Main function - The program starts here:&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
	initRP6M256();    // Always call this first! The Processor will not work&lt;br /&gt;
					  // correctly otherwise. &lt;br /&gt;
&lt;br /&gt;
	initLCD(); // Initialize the LC-Display (LCD)&lt;br /&gt;
			   // Always call this before using the LCD!&lt;br /&gt;
&lt;br /&gt;
	setLEDs(0b1111);&lt;br /&gt;
	mSleep(500);&lt;br /&gt;
	setLEDs(0b0000);&lt;br /&gt;
&lt;br /&gt;
	writeString_P_WIFI(&amp;quot;\n\nRP6 Sensor Board Selftest 2!\n&amp;quot;); &lt;br /&gt;
&lt;br /&gt;
	// IMPORTANT:&lt;br /&gt;
	I2CTWI_initMaster(100); // Initialize the TWI Module for Master operation&lt;br /&gt;
							// with 100kHz SCL Frequency&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	// Register the event handler:&lt;br /&gt;
	I2CTWI_setTransmissionErrorHandler(I2C_transmissionError);&lt;br /&gt;
&lt;br /&gt;
	setLEDs(0b1111);&lt;br /&gt;
&lt;br /&gt;
	// Write a text message to the LCD:&lt;br /&gt;
	showScreenLCD(&amp;quot;################&amp;quot;, &amp;quot;################&amp;quot;);&lt;br /&gt;
	mSleep(1500);&lt;br /&gt;
	showScreenLCD(&amp;quot;RP6v2-M256-WIFI &amp;quot;, &amp;quot;Example Program&amp;quot;);&lt;br /&gt;
	mSleep(2500); &lt;br /&gt;
	showScreenLCD(&amp;quot;RP6 Sensor Board&amp;quot;, &amp;quot;   Selftest 2&amp;quot;);&lt;br /&gt;
	mSleep(2500);&lt;br /&gt;
	clearLCD();&lt;br /&gt;
&lt;br /&gt;
	setLEDs(0b0000);&lt;br /&gt;
&lt;br /&gt;
	// ---------------------------------------&lt;br /&gt;
&lt;br /&gt;
	uint8_t onoff = 0;&lt;br /&gt;
	uint8_t i;&lt;br /&gt;
&lt;br /&gt;
	startStopwatch1();&lt;br /&gt;
	startStopwatch2();&lt;br /&gt;
&lt;br /&gt;
	// IMPORTANT:&lt;br /&gt;
	sensor_board_init();						// RP6 Sensor Board init!!!&lt;br /&gt;
	I2C_GPS_init();								// RP6 I2C GPS Receiver init&lt;br /&gt;
&lt;br /&gt;
	while(true) &lt;br /&gt;
	{&lt;br /&gt;
		if(getStopwatch1() &amp;gt; 1000) // 1s&lt;br /&gt;
		{&lt;br /&gt;
			if (onoff) onoff = 0;&lt;br /&gt;
			else onoff = 1;&lt;br /&gt;
&lt;br /&gt;
			// Show GPS data:&lt;br /&gt;
			I2C_GPS_read(DATA_LENGTH);			// Read data&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nLAT_DEG:     &amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.latDeg, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;° &amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.latMin, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;.&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.latMinDec, DEC, 4);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;' &amp;quot;);&lt;br /&gt;
			if(gpsdata.status.ns)&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;N&amp;quot;);&lt;br /&gt;
			else&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;S&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nLON_DEG:    &amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.lonDeg, DEC, 3);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;° &amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.lonMin, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;.&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.lonMinDec, DEC, 4);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;' &amp;quot;);&lt;br /&gt;
			if(gpsdata.status.ew)&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;E&amp;quot;);&lt;br /&gt;
			else&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;W&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nSTATUS:     &amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.status.byte, BIN, 8);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nFIX_IND:    &amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.fixInd.byte, BIN, 8);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nHDOP:       &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(gpsdata.hdop, DEC);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;.&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.hdopDec, DEC, 2);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nSAT_N:      &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(gpsdata.satCount, DEC);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nCOURSE_T:   &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(gpsdata.course, DEC);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;.&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.courseDec, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;°&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nSPEED:      &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(gpsdata.speed, DEC);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;.&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.speedDec, DEC, 2);&lt;br /&gt;
			if(gpsdata.status.spu)&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;km/h&amp;quot;);&lt;br /&gt;
			else&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;kn&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nALT:        &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(gpsdata.altitude, DEC);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;m\nALT_DIF:    &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(gpsdata.altDif, DEC);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;m\nUTC:        &amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.utcHour, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;:&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.utcMinute, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;:&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.utcSec, DEC, 2);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nDATE:       &amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.day, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;.&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.month, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;.&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.year, DEC, 4);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nPDOP:       &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(gpsdata.pdop, DEC);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;.&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.pdopDec, DEC, 2);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nVDOP:       &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(gpsdata.vdop, DEC);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;.&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.vdopDec, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			for(i = 0; i &amp;lt; gpsdata.satCount; i++) {&lt;br /&gt;
				if(i == 8) writeString_P_WIFI(&amp;quot;\n&amp;quot;);&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;  SAT_&amp;quot;);&lt;br /&gt;
				writeIntegerLength_WIFI(i + 1, HEX, 1);&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;: &amp;quot;);&lt;br /&gt;
				writeInteger_WIFI(gpsdata.sat[i], DEC);&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nSW_VERSION: &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(gpsdata.swVersion, DEC);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nHEARTBEAT:  &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(gpsdata.heartbeat, DEC);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			// RP6 Sensor Board shutdown (button &amp;amp; status LED test):&lt;br /&gt;
			if (pressedButton) {&lt;br /&gt;
				setStatusLED(1);&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;\nPress button again for RP6 Sensor Board SHUTDOWN!\n&amp;quot;);&lt;br /&gt;
				mSleep(2000);&lt;br /&gt;
				do {&lt;br /&gt;
					if(getStopwatch2() &amp;gt; 200) { // 0.2s&lt;br /&gt;
						if (onoff) onoff = 0;&lt;br /&gt;
						else onoff = 1;&lt;br /&gt;
						if (onoff) setStatusLED(1);&lt;br /&gt;
						else setStatusLED(0);&lt;br /&gt;
						setStopwatch2(0);&lt;br /&gt;
					}&lt;br /&gt;
					mSleep(1);&lt;br /&gt;
					task_I2CTWI();&lt;br /&gt;
				} while (!readButton());&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;\n\n\n\n\nPlease wait for RP6 Sensor Board SHUTDOWN...\n&amp;quot;);&lt;br /&gt;
				sensor_board_shutdown();&lt;br /&gt;
				mSleep(3000);&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;\n\n\nThe RP6 Sensor Board now is in SHUTDOWN MODE!!!\n&amp;quot;);&lt;br /&gt;
				mSleep(1000);&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;\nRESET the M256 microcontroller now...\n\n&amp;quot;);&lt;br /&gt;
				while(true) {};&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			setStopwatch1(0);&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		task_RP6SensorBoard();					// RP6 Sensor Board task&lt;br /&gt;
&lt;br /&gt;
		task_I2CTWI();&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Erklärung&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Gyro Modul JM3-GYRO====&lt;br /&gt;
=====Analoge Auswertung=====&lt;br /&gt;
Am Pin ''OUT'' des Gyro Moduls (siehe [http://www.rn-wissen.de/index.php/RP6_Sensor_Board_und_Xtra_Module#Anschluss-Schema Anschluss-Schema]!) liegt die Ausgangsspannung des Sensors (0..5V) an. Sie kann mit einem ADC-Eingang eines Microcontrollers gemessen werden.&lt;br /&gt;
Syntax mit den Libraries der RP6Base, M32 oder M256 WiFi (ADC Kanal 0):&lt;br /&gt;
 uint16_t result = readADC(0);&lt;br /&gt;
In der C-Control-Pro Umgebung der M128 sieht das z.B. in CompactC so aus (ADC Kanal 0):&lt;br /&gt;
 word result;&lt;br /&gt;
 ADC_Set(ADC_VREF_VCC, 0);&lt;br /&gt;
 ...&lt;br /&gt;
 result = ADC_Read();&lt;br /&gt;
Das Ergebnis ''result'' kann noch zur Weiterverarbeitung angepasst werden:&lt;br /&gt;
 #define ADCVAL_ZERORATE_LEVEL			511		// Zero rate Level&lt;br /&gt;
 ...&lt;br /&gt;
 int16_t z_axisg = result - ADCVAL_ZERORATE_LEVEL;&lt;br /&gt;
Dadurch zeigt ''z_axisg'' Null an, wenn keine Rotation anliegt und wird positiv, wenn nach LINKS gedreht wird und negativ bei RECHTS-Drehung. Die Definition ADCVAL_ZERORATE_LEVEL muss natürlich an den eigenen Sensor-Nullwert angepasst werden.&lt;br /&gt;
&lt;br /&gt;
Aus dem Absolutwert von ''z_axisg'' kann man die Drehrate (Drehgeschwindigkeit) auch bestimmen:&lt;br /&gt;
&lt;br /&gt;
In den [[RP6_Sensor_Board_und_Xtra_Module#Technische_Daten_3|Technischen Daten]] ist die Empfindlichkeit des Sensors mit '''10mV/dps''' (0,01V pro Grad und Sekunde) angegeben. Damit errechnet sich die Drehrate als:&lt;br /&gt;
 Drehrate [dps] = abs(z_axisg) * (5 / 1024 / 0.01) = abs(z_axisg) * 0.48828125&lt;br /&gt;
&lt;br /&gt;
=====Optionale Ansteuerung=====&lt;br /&gt;
Im [http://www.rn-wissen.de/index.php/RP6_Sensor_Board_und_Xtra_Module#Anschluss-Schema Anschluss-Schema] ist erkennbar, dass es noch 2 Steuerleitungen ''SLEEP/PD'' und ''ST'' gibt. Mit diesen Anschlüssen kann die Betriebsart des Gyro Moduls festgelegt werden, siehe nachfolgende Tabelle:&lt;br /&gt;
{|  {{Blauetabelle}} &lt;br /&gt;
|Betriebsart&lt;br /&gt;
|ST&lt;br /&gt;
|SLEEP/PD&lt;br /&gt;
|Stromverbrauch&lt;br /&gt;
|-&lt;br /&gt;
|Normal&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|4,2mA&lt;br /&gt;
|-&lt;br /&gt;
|Sleep&lt;br /&gt;
|0&lt;br /&gt;
|1&lt;br /&gt;
|2,2mA&lt;br /&gt;
|-&lt;br /&gt;
|Self-test&lt;br /&gt;
|1&lt;br /&gt;
|0&lt;br /&gt;
|4,2mA&lt;br /&gt;
|-&lt;br /&gt;
|Power-down&lt;br /&gt;
|1&lt;br /&gt;
|1&lt;br /&gt;
|'''5µA'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
Will man zwischen den Betriebsarten per Software umschalten, muss man die beiden Steuerleitungen mit I/O Portpins des Microcontrollers verbinden, die als Ausgänge konfiguriert sind. Braucht man diese Funktion nicht, reicht es, ''ST'' und ''SLEEP/PD'' mit GND zu verbinden (Betriebsart &amp;quot;Normal&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====3D Accelerometer Modul JM3-3DA====&lt;br /&gt;
Das 3D Accelerometer Modul kann über den I2C- oder den SPI-Bus angesteuert werden. Wird das Modul auf der RP6 CONTROL M32 Platine betrieben (es sitzt also auf dem Sockel IC5 für das 2. SPI-EEPROM), dann erfolgt die Ansteuerung über den SPI-Bus. Die SPI-Grundfunktionen befinden sich in der RP6ControlLib, die daher eingebunden werden muss.&lt;br /&gt;
&lt;br /&gt;
=====RP6 CONTROL M32: ACCSENS Library=====&lt;br /&gt;
Die nachfolgende RP6ControlACCSENSLib (GCC) dient zur Ansteuerung des 3D Accelerometer Moduls durch die RP6 CONTROL M32.&lt;br /&gt;
&lt;br /&gt;
======Configuration Header======&lt;br /&gt;
Vor dem Kompilieren der Library muss eine Anpassung des Configuration Headers an die eigenen Hardware-Voraussetzungen erfolgen.&lt;br /&gt;
Dazu gibt es im Configuration Header eine Definition:&lt;br /&gt;
* EXP_STACK_1 -&amp;gt; Die RP6 CONTROL M32 sitzt auf dem vorderen Platinenstapel 1 des RP6&lt;br /&gt;
Im nachfolgenden Listing ist die Definition EXP_STACK_1 NICHT aktiv (d.h. die M32 sitzt auf dem hinteren Platinenstapel 2!). Dies muss an die eigene Hardware angepaßt werden. Wenn die RP6 CONTROL M32 auf dem vorderen Platinenstapel 1 des RP6 sitzt, muss die Zeile mit &amp;quot;EXP_STACK_1&amp;quot; &amp;quot;aktiviert&amp;quot; werden. Dazu entfernt man &amp;quot;//&amp;quot; am Zeilenanfang:&lt;br /&gt;
 #define EXP_STACK_1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Bevor man den Beschleunigungssensor nutzen kann, muss man ihn kalibrieren:&lt;br /&gt;
&lt;br /&gt;
'''Accelerometer:'''&lt;br /&gt;
* Die X-Achse wird kalibriert, indem man den RP6 mit der rechten Seite nach unten hält und den Maximalwert in MAX_X_A einträgt. Dann neigt man ihn auf seine linke Seite und trägt den negativen Maximalwert in MIN_X_A ein.&lt;br /&gt;
* Die Y-Achse wird kalibriert, indem man den RP6 mit der Vorderseite nach oben hält und den Maximalwert in MAX_Y_A einträgt. Dann kippt man die Vorderseite nach unten und trägt den negativen Maximalwert in MIN_Y_A ein.&lt;br /&gt;
* Die Z-Achse wird kalibriert, indem man den RP6 normal waagerecht hält und den Maximalwert in MAX_Z_A einträgt. Dann dreht man den RP6 &amp;quot;auf den Kopf&amp;quot; und trägt den negativen Maximalwert in MIN_Z_A ein.&lt;br /&gt;
* Sollten die angezeigten Pitch- und Roll-Werte nach der Kalibrierung der Achsen und genau waagerecht stehendem Sensor bzw. RP6 vom Nullwert deutlich abweichen, kann man sie mithilfe der Definitionen OFFSET_PITCH_A und OFFSET_ROLL_A &amp;quot;nullen&amp;quot;. Die Einheit dieser Definitionen ist °.&lt;br /&gt;
Nach dem Eintragen der Kalibrierungswerte muss das Programm neu kompiliert werden!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Datei: RP6ControlACCSENS.h&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;/* ****************************************************************************&lt;br /&gt;
 *                           _______________________&lt;br /&gt;
 *                           \| RP6  ROBOT SYSTEM |/&lt;br /&gt;
 *                            \_-_-_-_-_-_-_-_-_-_/             &amp;gt;&amp;gt;&amp;gt; RP6 CONTROL&lt;br /&gt;
 * ----------------------------------------------------------------------------&lt;br /&gt;
 * ----------------------------- [c]2014 - Dirk -------------------------------&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * File: RP6ControlACCSENS.h&lt;br /&gt;
 * Version: 1.0&lt;br /&gt;
 * Target: RP6 CONTROL - ATMEGA32 @16.00MHz&lt;br /&gt;
 * Author(s): Dirk&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Description:&lt;br /&gt;
 * Configuration header file for new ACCSENS library.&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * THE CHANGELOG CAN BE FOUND AT THE END OF THIS FILE!&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
#ifndef RP6CONTROLACCSENS_H&lt;br /&gt;
#define RP6CONTROLACCSENS_H&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Sensor position on the RP6 robot:&lt;br /&gt;
// (If EXP_STACK_1 is defined, the RP6 CONTROL M32 is located on the front&lt;br /&gt;
//  stack for addon boards on the RP6 robot. If EXP_STACK_1 is NOT defined&lt;br /&gt;
//  (default), the RP6 CONTROL M32 is mounted on the rear stack.)&lt;br /&gt;
// -------------------&lt;br /&gt;
//#define EXP_STACK_1&lt;br /&gt;
// -------------------&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// The following sensor is used:&lt;br /&gt;
// - 3D Accelerometer Modul (CONRAD 1082387-62) with LIS302DLH 3-axis&lt;br /&gt;
//   accelerometer&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// LIS302DLH accelerometer calibration data:&lt;br /&gt;
#define MAX_X_A						32767		// Max. X-axis value&lt;br /&gt;
#define MIN_X_A						-32768		// Min. X-axis value&lt;br /&gt;
#define MAX_Y_A						32767		// Max. Y-axis value&lt;br /&gt;
#define MIN_Y_A						-32768		// Min. Y-axis value&lt;br /&gt;
#define MAX_Z_A						32767		// Max. Z-axis value&lt;br /&gt;
#define MIN_Z_A						-32768		// Min. Z-axis value&lt;br /&gt;
#define OFFSET_PITCH_A				0.0			// Offset Pitch [°]&lt;br /&gt;
#define OFFSET_ROLL_A				0.0			// Offset Roll [°]&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
/******************************************************************************&lt;br /&gt;
 * Additional info&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Changelog:&lt;br /&gt;
 * &lt;br /&gt;
 *  ---&amp;gt; changes are documented in the file &amp;quot;RP6ControlACCSENSLib.c&amp;quot;&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
======Library Header======&lt;br /&gt;
Datei: RP6ControlACCSENSLib.h&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;/* ****************************************************************************&lt;br /&gt;
 *                           _______________________&lt;br /&gt;
 *                           \| RP6  ROBOT SYSTEM |/&lt;br /&gt;
 *                            \_-_-_-_-_-_-_-_-_-_/             &amp;gt;&amp;gt;&amp;gt; RP6 CONTROL&lt;br /&gt;
 * ----------------------------------------------------------------------------&lt;br /&gt;
 * ----------------------------- [c]2014 - Dirk -------------------------------&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * File: RP6ControlACCSENSLib.h&lt;br /&gt;
 * Version: 1.0&lt;br /&gt;
 * Target: RP6 CONTROL - ATMEGA32 @16.00MHz&lt;br /&gt;
 * Author(s): Dirk&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Description:&lt;br /&gt;
 * This is the RP6ControlACCSENSLib header file.&lt;br /&gt;
 * You have to include this file, if you want to use the library&lt;br /&gt;
 * RP6ControlACCSENSLib.c in your own projects.&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * THE CHANGELOG CAN BE FOUND AT THE END OF THIS FILE!&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
#ifndef RP6CONTROLACCSENSLIB_H&lt;br /&gt;
#define RP6CONTROLACCSENSLIB_H&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Includes:&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6ControlLib.h&amp;quot; 		// The RP6 Control Library (v. 1.1 or higher). &lt;br /&gt;
#include &amp;quot;RP6ControlACCSENS.h&amp;quot;&lt;br /&gt;
#include &amp;lt;math.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&lt;br /&gt;
#define ACC_CS							MEM_CS2&lt;br /&gt;
#define DEVICE_IDENTIFIER				0x32&lt;br /&gt;
&lt;br /&gt;
// Registers:&lt;br /&gt;
#define WHO_AM_I						0x0f&lt;br /&gt;
#define CTRL_REG1						0x20&lt;br /&gt;
#define CTRL_REG2						0x21&lt;br /&gt;
#define CTRL_REG3						0x22&lt;br /&gt;
#define CTRL_REG4						0x23&lt;br /&gt;
#define CTRL_REG5						0x24&lt;br /&gt;
#define HP_FILTER_RESET					0x25&lt;br /&gt;
#define REFERENCE						0x26&lt;br /&gt;
#define STATUS_REG						0x27&lt;br /&gt;
#define OUT_X_L							0x28&lt;br /&gt;
#define OUT_X_H							0x29&lt;br /&gt;
#define OUT_Y_L							0x2a&lt;br /&gt;
#define OUT_Y_H							0x2b&lt;br /&gt;
#define OUT_Z_L							0x2c&lt;br /&gt;
#define OUT_Z_H							0x2d&lt;br /&gt;
#define INT1_CFG						0x30&lt;br /&gt;
#define INT1_SOURCE						0x31&lt;br /&gt;
#define INT1_THS						0x32&lt;br /&gt;
#define INT1_DURATION					0x33&lt;br /&gt;
#define INT2_CFG						0x34&lt;br /&gt;
#define INT2_SOURCE						0x35&lt;br /&gt;
#define INT2_THS						0x36&lt;br /&gt;
#define INT2_DURATION					0x37&lt;br /&gt;
&lt;br /&gt;
// Control Register bitmasks:&lt;br /&gt;
#define CTRL_REG1_POWERDOWN				0b00000000&lt;br /&gt;
#define CTRL_REG1_3D_DEFAULT			0b00000111&lt;br /&gt;
#define CTRL_REG1_3D_LOPWR_10HZ			0b11000111&lt;br /&gt;
#define CTRL_REG2_DEFAULT				0b00000000&lt;br /&gt;
#define CTRL_REG3_DEFAULT				0b00000000&lt;br /&gt;
#define CTRL_REG4_DEFAULT				0b00000000&lt;br /&gt;
#define CTRL_REG4_BDU_2G				0b10000000&lt;br /&gt;
#define CTRL_REG4_BDU_2G_STSIGN			0b10001000&lt;br /&gt;
#define CTRL_REG4_BDU_BLE_2G			0b11000000&lt;br /&gt;
#define CTRL_REG4_BDU_BLE_2G_STSIGN		0b11001000&lt;br /&gt;
#define CTRL_REG5_DEFAULT				0b00000000&lt;br /&gt;
&lt;br /&gt;
// Read/write address bitmasks:&lt;br /&gt;
#define READ_MASK						0b10000000&lt;br /&gt;
#define READ_AUTOINC_MASK				0b11000000&lt;br /&gt;
#define WRITE_MASK						0b01111111&lt;br /&gt;
&lt;br /&gt;
extern int16_t x_axisa, y_axisa, z_axisa;&lt;br /&gt;
extern double pitch, roll;&lt;br /&gt;
extern double xa, ya, za;&lt;br /&gt;
extern double the, phi;&lt;br /&gt;
&lt;br /&gt;
uint8_t SPI_ACCSENS_readByte(uint8_t regAddr);&lt;br /&gt;
void SPI_ACCSENS_readBytes(uint8_t startAddr, uint8_t *buffer, uint8_t length);&lt;br /&gt;
void SPI_ACCSENS_writeByte(uint8_t regAddr, uint8_t data);&lt;br /&gt;
uint8_t SPI_ACCSENS_getStatus(void);&lt;br /&gt;
&lt;br /&gt;
void SPI_ACCSENS_init(void);&lt;br /&gt;
void SPI_ACCSENS_shutdown(void);&lt;br /&gt;
void SPI_ACCSENS_read(void);&lt;br /&gt;
void SPI_ACCSENS_normalize(void);&lt;br /&gt;
void SPI_ACCSENS_position(void);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
/******************************************************************************&lt;br /&gt;
 * Additional info&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Changelog:&lt;br /&gt;
 * &lt;br /&gt;
 *  ---&amp;gt; changes are documented in the file &amp;quot;RP6ControlACCSENSLib.c&amp;quot;&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
======Library Source======&lt;br /&gt;
Datei: RP6ControlACCSENSLib.c&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;/* ****************************************************************************&lt;br /&gt;
 *                           _______________________&lt;br /&gt;
 *                           \| RP6  ROBOT SYSTEM |/&lt;br /&gt;
 *                            \_-_-_-_-_-_-_-_-_-_/             &amp;gt;&amp;gt;&amp;gt; RP6 CONTROL&lt;br /&gt;
 * ----------------------------------------------------------------------------&lt;br /&gt;
 * ----------------------------- [c]2014 - Dirk -------------------------------&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * File: RP6ControlACCSENSLib.c&lt;br /&gt;
 * Version: 1.0&lt;br /&gt;
 * Target: RP6 CONTROL - ATMEGA32 @16.00MHz&lt;br /&gt;
 *         with optional LC-Display 16x2 chars (CONRAD 190911-62)&lt;br /&gt;
 *         and a 3D Accelerometer Modul (CONRAD 1082387-62) (IC5)&lt;br /&gt;
 * Author(s): Dirk&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Description:&lt;br /&gt;
 * This is my RP6 Control ACCSENS Library. This library may be used to access&lt;br /&gt;
 * the basic functions of the 3D Accelerometer Modul. This RP6 Xtra module may&lt;br /&gt;
 * be placed on the IC5 socket on the RP6 CONTROL M32 instead of a second&lt;br /&gt;
 * EEPROM.&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * THE CHANGELOG CAN BE FOUND AT THE END OF THIS FILE!&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
 &lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Includes:&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6ControlACCSENSLib.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// SPI functions:&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Reads a single register from the 3D Accelerometer&lt;br /&gt;
 * Modul (ACCSENS).&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
uint8_t SPI_ACCSENS_readByte(uint8_t regAddr)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t data;&lt;br /&gt;
	regAddr |= READ_MASK;						// Read byte&lt;br /&gt;
	PORTB &amp;amp;= ~ACC_CS;&lt;br /&gt;
	writeSPI(regAddr);&lt;br /&gt;
	data = readSPI();&lt;br /&gt;
	PORTB |= ACC_CS;&lt;br /&gt;
	return data;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Reads &amp;quot;length&amp;quot; bytes into the buffer &amp;quot;buffer&amp;quot;&lt;br /&gt;
 * from startAddr on. &lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void SPI_ACCSENS_readBytes(uint8_t startAddr, uint8_t *buffer, uint8_t length)&lt;br /&gt;
{&lt;br /&gt;
	startAddr |= READ_AUTOINC_MASK;				// Read byte, auto increment&lt;br /&gt;
	PORTB &amp;amp;= ~ACC_CS;&lt;br /&gt;
	writeSPI(startAddr);&lt;br /&gt;
	readBufferSPI(&amp;amp;buffer[0], length);&lt;br /&gt;
	PORTB |= ACC_CS;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Write a single data byte to the specified sensor&lt;br /&gt;
 * address.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void SPI_ACCSENS_writeByte(uint8_t regAddr, uint8_t data)&lt;br /&gt;
{&lt;br /&gt;
	PORTB &amp;amp;= ~ACC_CS;&lt;br /&gt;
	writeSPI(regAddr);&lt;br /&gt;
	writeSPI(data);&lt;br /&gt;
	PORTB |= ACC_CS;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Returns sensor status register - for checking if&lt;br /&gt;
 * sensor is busy. &lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
uint8_t SPI_ACCSENS_getStatus(void)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t status;&lt;br /&gt;
	PORTB &amp;amp;= ~ACC_CS;&lt;br /&gt;
	writeSPI(STATUS_REG);&lt;br /&gt;
	status = readSPI();&lt;br /&gt;
	PORTB |= ACC_CS;&lt;br /&gt;
	return status;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// 3D accelerometer functions:&lt;br /&gt;
&lt;br /&gt;
int16_t x_axisa, y_axisa, z_axisa;&lt;br /&gt;
double pitch, roll;&lt;br /&gt;
double xa, ya, za;&lt;br /&gt;
double the, phi;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Initializes the sensor. You must call this&lt;br /&gt;
 * function at the beginning of a program, that&lt;br /&gt;
 * uses the 3D Accelerometer Modul.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void SPI_ACCSENS_init(void)&lt;br /&gt;
{&lt;br /&gt;
	// All axes enable, low power, 10Hz output data rate:&lt;br /&gt;
	SPI_ACCSENS_writeByte(CTRL_REG1, CTRL_REG1_3D_LOPWR_10HZ);&lt;br /&gt;
	// No update while reading, +- 2g, self-test minus:&lt;br /&gt;
	SPI_ACCSENS_writeByte(CTRL_REG4, CTRL_REG4_BDU_2G_STSIGN);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Sets the LIS302DLH power-down mode. If you&lt;br /&gt;
 * do not need the sensor, you can save energy&lt;br /&gt;
 * by using the sensor power-down mode.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void SPI_ACCSENS_shutdown(void)&lt;br /&gt;
{&lt;br /&gt;
	// LIS302DLH in power-down mode:&lt;br /&gt;
	SPI_ACCSENS_writeByte(CTRL_REG1, CTRL_REG1_POWERDOWN);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function reads the X-axis, Y-axis and Z-axis&lt;br /&gt;
 * values from the LIS302DLH accelerometer and stores&lt;br /&gt;
 * them in the global variables x_axisa, y_axisa and&lt;br /&gt;
 * z_axisa.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void SPI_ACCSENS_read(void)&lt;br /&gt;
{&lt;br /&gt;
#ifndef EXP_STACK_1&lt;br /&gt;
	// Default sensor position (M32 located on the RP6 rear stack):&lt;br /&gt;
	// xb = -y:&lt;br /&gt;
	x_axisa = SPI_ACCSENS_readByte(OUT_Y_L) | (SPI_ACCSENS_readByte(OUT_Y_H) &amp;lt;&amp;lt; 8);&lt;br /&gt;
	x_axisa *= -1;&lt;br /&gt;
	// yb = -x:&lt;br /&gt;
	y_axisa = SPI_ACCSENS_readByte(OUT_X_L) | (SPI_ACCSENS_readByte(OUT_X_H) &amp;lt;&amp;lt; 8);&lt;br /&gt;
	y_axisa *= -1;&lt;br /&gt;
	// zb = z:&lt;br /&gt;
	z_axisa = SPI_ACCSENS_readByte(OUT_Z_L) | (SPI_ACCSENS_readByte(OUT_Z_H) &amp;lt;&amp;lt; 8);&lt;br /&gt;
#else&lt;br /&gt;
	// Other sensor position (M32 located on the RP6 front stack):&lt;br /&gt;
	// xb = y:&lt;br /&gt;
	x_axisa = SPI_ACCSENS_readByte(OUT_Y_L) | (SPI_ACCSENS_readByte(OUT_Y_H) &amp;lt;&amp;lt; 8);&lt;br /&gt;
	// yb = x:&lt;br /&gt;
	y_axisa = SPI_ACCSENS_readByte(OUT_X_L) | (SPI_ACCSENS_readByte(OUT_X_H) &amp;lt;&amp;lt; 8);&lt;br /&gt;
	// zb = z:&lt;br /&gt;
	z_axisa = SPI_ACCSENS_readByte(OUT_Z_L) | (SPI_ACCSENS_readByte(OUT_Z_H) &amp;lt;&amp;lt; 8);&lt;br /&gt;
#endif&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function limits and normalizes the x-axisa,&lt;br /&gt;
 * y-axisa and z-axisa values read from the LIS302DLH&lt;br /&gt;
 * accelerometer with the function SPI_ACCSENS_read() and&lt;br /&gt;
 * stores them in the global double variables xa, ya and&lt;br /&gt;
 * za.&lt;br /&gt;
 * It also calculates the position in space in form of the&lt;br /&gt;
 * tilt angles (the = pitch, phi = roll) and stores them&lt;br /&gt;
 * in the global double variables the and phi.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void SPI_ACCSENS_normalize(void)&lt;br /&gt;
{&lt;br /&gt;
	// Limit raw values:&lt;br /&gt;
	if (x_axisa &amp;lt; MIN_X_A) x_axisa = MIN_X_A;&lt;br /&gt;
	if (x_axisa &amp;gt; MAX_X_A) x_axisa = MAX_X_A;&lt;br /&gt;
	if (y_axisa &amp;lt; MIN_Y_A) y_axisa = MIN_Y_A;&lt;br /&gt;
	if (y_axisa &amp;gt; MAX_Y_A) y_axisa = MAX_Y_A;&lt;br /&gt;
	if (z_axisa &amp;lt; MIN_Z_A) z_axisa = MIN_Z_A;&lt;br /&gt;
	if (z_axisa &amp;gt; MAX_Z_A) z_axisa = MAX_Z_A;&lt;br /&gt;
	xa = (double) x_axisa / 10000.0;&lt;br /&gt;
	ya = (double) y_axisa / 10000.0;&lt;br /&gt;
	za = (double) z_axisa / 10000.0;&lt;br /&gt;
	// Calculate Pitch and Roll:&lt;br /&gt;
	phi = asin(xa);								// Calculate the and phi&lt;br /&gt;
	the = asin(ya / cos(the));					//  from the raw values&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function calculates the position in space by&lt;br /&gt;
 * using the the and phi values (see function&lt;br /&gt;
 * SPI_ACCSENS_normalize()!). It stores the position&lt;br /&gt;
 * in the global double variables pitch and roll. &lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void SPI_ACCSENS_position(void)&lt;br /&gt;
{&lt;br /&gt;
	pitch = the * 180 / M_PI + OFFSET_PITCH_A;&lt;br /&gt;
	roll = phi * 180 / M_PI + OFFSET_ROLL_A;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/******************************************************************************&lt;br /&gt;
 * Additional info&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Changelog:&lt;br /&gt;
 * - v. 1.0 (initial release) 04.04.2014 by Dirk&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Erklärung&lt;br /&gt;
&lt;br /&gt;
======Demo======&lt;br /&gt;
makefile:&lt;br /&gt;
&amp;lt;pre&amp;gt;...&lt;br /&gt;
TARGET = RP6Control_01_ACCSENS&lt;br /&gt;
...&lt;br /&gt;
SRC += $(RP6_LIB_PATH)/RP6control/RP6ControlLib.c&lt;br /&gt;
SRC += $(RP6_LIB_PATH)/RP6common/RP6uart.c&lt;br /&gt;
SRC += $(RP6_LIB_PATH)/RP6control/RP6ControlACCSENSLib.c&lt;br /&gt;
...&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Datei: RP6Control_01_ACCSENS.c&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;// Uncommented Version of RP6Control_01_ACCSENS.c&lt;br /&gt;
// written by Dirk&lt;br /&gt;
// ------------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6ControlACCSENSLib.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void writeDouble(double number, uint8_t width, uint8_t prec)&lt;br /&gt;
{char buffer[width + 1];&lt;br /&gt;
	dtostrf(number, width, prec, &amp;amp;buffer[0]);&lt;br /&gt;
	writeString(&amp;amp;buffer[0]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void writeDoubleLCD(double number, uint8_t width, uint8_t prec)&lt;br /&gt;
{char buffer[width + 1];&lt;br /&gt;
	dtostrf(number, width, prec, &amp;amp;buffer[0]);&lt;br /&gt;
	writeStringLCD(&amp;amp;buffer[0]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
	initRP6Control();&lt;br /&gt;
&lt;br /&gt;
	writeString_P(&amp;quot;\n\nRP6Control SPI ACCSENS Test Program!\n&amp;quot;); &lt;br /&gt;
	setLEDs(0b1111);&lt;br /&gt;
	mSleep(50);&lt;br /&gt;
	initLCD(); &lt;br /&gt;
	showScreenLCD(&amp;quot;################&amp;quot;, &amp;quot;################&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
	showScreenLCD(&amp;quot;  SPI ACCSENS&amp;quot;, &amp;quot;  Test Program&amp;quot;);&lt;br /&gt;
	mSleep(1000);&lt;br /&gt;
	setLEDs(0b0000);&lt;br /&gt;
&lt;br /&gt;
	SPI_ACCSENS_init();&lt;br /&gt;
&lt;br /&gt;
	uint8_t whoami = SPI_ACCSENS_readByte(WHO_AM_I);&lt;br /&gt;
	writeString_P(&amp;quot;\nWHO AM I: &amp;quot;);&lt;br /&gt;
	writeInteger(whoami, HEX);&lt;br /&gt;
	writeChar('\n');&lt;br /&gt;
	mSleep(2000);&lt;br /&gt;
	&lt;br /&gt;
	startStopwatch1();&lt;br /&gt;
&lt;br /&gt;
	while(true) &lt;br /&gt;
	{&lt;br /&gt;
		if(getStopwatch1() &amp;gt; 1000)&lt;br /&gt;
		{&lt;br /&gt;
			SPI_ACCSENS_read();&lt;br /&gt;
			writeString_P(&amp;quot;\n3D Accelerometer SENSOR -&amp;gt;\n&amp;quot;);&lt;br /&gt;
			writeString_P(&amp;quot;X-axis: &amp;quot;);&lt;br /&gt;
			writeInteger(x_axisa, DEC);&lt;br /&gt;
			writeChar('\n');&lt;br /&gt;
			writeString_P(&amp;quot;Y-axis: &amp;quot;);&lt;br /&gt;
			writeInteger(y_axisa, DEC);&lt;br /&gt;
			writeChar('\n');&lt;br /&gt;
			writeString_P(&amp;quot;Z-axis: &amp;quot;);&lt;br /&gt;
			writeInteger(z_axisa, DEC);&lt;br /&gt;
			writeChar('\n');&lt;br /&gt;
			SPI_ACCSENS_normalize();&lt;br /&gt;
			SPI_ACCSENS_position();&lt;br /&gt;
			writeString_P(&amp;quot;POSITION: \n&amp;quot;);&lt;br /&gt;
			writeString_P(&amp;quot;  Pitch [°]: &amp;quot;);&lt;br /&gt;
			writeDouble(pitch, 6, 1);&lt;br /&gt;
			writeChar('\n');&lt;br /&gt;
			writeString_P(&amp;quot;  Roll [°]:  &amp;quot;);&lt;br /&gt;
			writeDouble(roll, 6, 1);&lt;br /&gt;
			writeChar('\n');&lt;br /&gt;
			setCursorPosLCD(0, 0);&lt;br /&gt;
			writeStringLCD_P(&amp;quot;P&amp;quot;);&lt;br /&gt;
			writeDoubleLCD(pitch, 6, 1);&lt;br /&gt;
			writeStringLCD_P(&amp;quot; &amp;quot;);&lt;br /&gt;
			setCursorPosLCD(0, 8);&lt;br /&gt;
			writeStringLCD_P(&amp;quot;R&amp;quot;);&lt;br /&gt;
			writeDoubleLCD(roll, 6, 1);&lt;br /&gt;
			writeStringLCD_P(&amp;quot; &amp;quot;);&lt;br /&gt;
			setCursorPosLCD(1, 0);&lt;br /&gt;
			writeStringLCD_P(&amp;quot;X&amp;quot;);&lt;br /&gt;
			writeIntegerLCD(x_axisa, DEC);&lt;br /&gt;
			writeStringLCD_P(&amp;quot;   &amp;quot;);&lt;br /&gt;
			setCursorPosLCD(1, 5);&lt;br /&gt;
			writeStringLCD_P(&amp;quot;Y&amp;quot;);&lt;br /&gt;
			writeIntegerLCD(y_axisa, DEC);&lt;br /&gt;
			writeStringLCD_P(&amp;quot;   &amp;quot;);&lt;br /&gt;
			setCursorPosLCD(1, 10);&lt;br /&gt;
			writeStringLCD_P(&amp;quot;Z&amp;quot;);&lt;br /&gt;
			writeIntegerLCD(z_axisa, DEC);&lt;br /&gt;
			writeStringLCD_P(&amp;quot;    &amp;quot;);&lt;br /&gt;
			mSleep(2000);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Erklärung&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Erfahrungsberichte==&lt;br /&gt;
&lt;br /&gt;
...in Arbeit...(kann aber gerne ergänzt werden)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Siehe auch==&lt;br /&gt;
* [[RP6v2]]&lt;br /&gt;
* [[RP6]]&lt;br /&gt;
* [[RP6 - Programmierung]]&lt;br /&gt;
* [[RP6 Kamera - Mitmach-Projekt]]&lt;br /&gt;
* [[RP6v2 I2C-Portexpander]]&lt;br /&gt;
* [[RP6v2 USB-RS232-Adapter]]&lt;br /&gt;
* [[RP6v2 Orientierung]]&lt;br /&gt;
* [[RP6 Multi IO Projekt]]&lt;br /&gt;
* [[RP6 Multi IO Projekt - Software]]&lt;br /&gt;
* [[Induktive_Ladestation_f%C3%BCr_den_RP6|Induktive Ladestation für den RP6]]&lt;br /&gt;
* [[IR-bake_f%C3%BCr_den_RP6|IR-bake für den RP6]]&lt;br /&gt;
* [[CCRP5]]&lt;br /&gt;
* [[Yeti]]&lt;br /&gt;
* [[Asuro]]&lt;br /&gt;
* [[C't-Bot]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Weblinks==&lt;br /&gt;
'''Siehe auch die Weblinks im [http://www.rn-wissen.de/index.php/RP6v2#Weblinks RP6v2] und im [http://www.rn-wissen.de/index.php/RP6#Weblinks RP6] Artikel!'''&lt;br /&gt;
&lt;br /&gt;
* [http://www.conrad.de/ce/de/product/1082384/Arexx-RP6-Sensor-Board-RP6-JM03-61 RP6 Sensor Board bei CONRAD]&lt;br /&gt;
* JM3 Engeneering: [http://www.jm3-engineering.com/rp6.htm RP6 Roboter Erweiterung]&lt;br /&gt;
* Ankündigung einer Sensorerweiterungsplatine für die RP6v2 M256 WiFi im [http://www.roboternetz.de/community/threads/63595-Neue-Hardware-f%C3%BCr-RP6%28v2%29?p=590129&amp;amp;viewfull=1#post590129 Roboternetz RP6 Forum]&lt;br /&gt;
* Erfahrungsbericht zum Sensor Board im [http://www.arexx.com/forum/viewtopic.php?f=19&amp;amp;t=2498 AREXX Support Forum] und im [http://www.roboternetz.de/community/threads/64414-RP6-Sensor-Board-Erster-Eindruck Roboternetz RP6 Forum]&lt;br /&gt;
* Erfahrungsbericht zum I2C GPS Empfänger im [http://www.arexx.com/forum/viewtopic.php?f=19&amp;amp;t=2509 AREXX Support Forum]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Kategorie:Robotikeinstieg]]	 &lt;br /&gt;
[[Kategorie:Praxis]]&lt;br /&gt;
&lt;br /&gt;
==Autoren==&lt;br /&gt;
--[[Benutzer:Dirk|Dirk]] 18:50, 14. Mai 2014 (CET)&lt;/div&gt;</summary>
		<author><name>Dirk NO2</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=RP6_Sensor_Board_und_Xtra_Module&amp;diff=24812</id>
		<title>RP6 Sensor Board und Xtra Module</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=RP6_Sensor_Board_und_Xtra_Module&amp;diff=24812"/>
				<updated>2014-07-08T15:13:44Z</updated>
		
		<summary type="html">&lt;p&gt;Dirk NO2: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Bild:RP6_Sensor_Board.jpg|Das RP6 Sensor Board|500px]]&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_Xtra_module.JPG|RP6 Xtra module|right|500px]]&lt;br /&gt;
&lt;br /&gt;
==Was bisher geschah==&lt;br /&gt;
'''Siehe auch &amp;quot;Was bisher geschah&amp;quot; im [http://www.rn-wissen.de/index.php/RP6v2#Was_bisher_geschah RP6v2] und im [http://www.rn-wissen.de/index.php/RP6#Was_bisher_geschah RP6] Artikel!'''&lt;br /&gt;
&lt;br /&gt;
Mit, 27. Nov 2013 - Ankündigung einer Sensorerweiterungsplatine, die an die RP6v2-M256-WIFI angeschlossen werden kann&amp;lt;br/&amp;gt;&lt;br /&gt;
Sam, 22. Feb 2014 - Auslieferungsbeginn des RP6 Sensor Boards, des I2C GPS Empfängers, des 3D Accelerometer Moduls und des Gyro Moduls&amp;lt;br/&amp;gt;&lt;br /&gt;
Mon, 17. Mär 2014 - Das RP6 Sensor Board ist &amp;quot;nicht lieferbar&amp;quot;, neuer Liefertermin angekündigt für den 12.06.2014 (!?)&amp;lt;br/&amp;gt;&lt;br /&gt;
Die, 25. Mär 2014 - Das RP6 Sensor Board ist wieder &amp;quot;sofort lieferbar&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Allgemein==&lt;br /&gt;
Dieser Artikel beschreibt die Grundlagen und Programmierung des RP6 Sensor Boards und der RP6 Xtra Module. Dieses Erweiterungs-Modul und die Xtra Module sind Teile des RP6-Systems, das in den RN-Wissen-Artikeln [[RP6]], [[RP6v2]] und [[RP6_-_Programmierung|RP6 - Programmierung]] ausführlich beschrieben wird. Ausgegliedert aus den &amp;quot;Haupt-Artikeln&amp;quot; habe ich diese Module, da sie m.E. zu einer neuen &amp;quot;Ära&amp;quot; des RP6-Systems gehören:&lt;br /&gt;
&lt;br /&gt;
Sie wurden nicht mehr von '''[[Benutzer:SlyD|SlyD]] (Dominik S. Herwald)''' in Zusammenarbeit mit '''[http://www.arexx.com/ AREXX]''' entwickelt, sondern nun von '''[http://jm3-engineering.com/ JM3 Engeneering] (Dipl.-Ing. Jürgen Maisel)'''. Ab Februar 2014 waren dann das '''RP6 Sensor Board RP6-JM03-61''' ([http://www.conrad.de/ce/de/product/1082384/Arexx-RP6-Sensor-Board-RP6-JM03-61 1082384]) und die drei RP6 Xtra Module '''I2C GPS Empfänger JM3-GPS''' ([http://www.conrad.de/ce/de/product/1082385/Arexx-IC-GPS-Empfaenger-JM3-GPS 1082385]), '''Gyro Modul JM3-GYRO''' ([http://www.conrad.de/ce/de/product/1082386/Arexx-Gyro-Modul-JM3-GYRO 1082386]) und '''3D Accelerometer Modul JM3-3DA''' ([http://www.conrad.de/ce/de/product/1082387/Arexx-3D-Accelerometer-Modul-JM3-3DA 1082387]) bei CONRAD lieferbar. Einen ersten Eindruck vom Sensor Board kann man im RoboterNetz und AREXX Support Forum bekommen,- siehe unter [[RP6_Sensor_Board_und_Xtra_Module#Weblinks|Weblinks]]!&lt;br /&gt;
&lt;br /&gt;
===RP6 Sensor Board===&lt;br /&gt;
Das [[RP6_Sensor_Board_und_Xtra_Module#RP6_Sensor_Board_2|RP6 Sensor Board]] gehört zu den &amp;quot;Erweiterungs-Modulen&amp;quot; des RP6-Systems. '''Andere &amp;quot;Erweiterungs-Module&amp;quot; werden im [[RP6v2#Erweiterungs-Module|RP6v2]] und im [[RP6#Erweiterungs-Module|RP6]] Artikel beschrieben!'''&lt;br /&gt;
&lt;br /&gt;
Das ''RP6 Sensor Board'' ist das erste &amp;quot;Erweiterungs-Modul&amp;quot;, das nicht über einen eigenen Microprozessor verfügt,- es ist also ein ''passives Modul'', das von einem Microprozessor-System (z.B. RP6v2, M32, M128, M256 Wifi) angesteuert werden muss. Es ist ebenfalls das erste Modul, das nicht mehr über die rautenförmige Einbuchtung an der Vorderkante verfügt, sondern komplett rechteckig ist. Damit passt es (montiert auf den Standard-Abstandbolzen) nur auf den vorderen Platinenstapel 1 des RP6.&lt;br /&gt;
&lt;br /&gt;
===RP6 Xtra Module===&lt;br /&gt;
Die [[RP6_Sensor_Board_und_Xtra_Module#RP6_Xtra_Module_2|RP6 Xtra Module]] gehören zu den &amp;quot;Zubehör- und Ersatzteilen&amp;quot; des RP6-Systems. '''Über die weiteren &amp;quot;Zubehör- und Ersatzteile&amp;quot; zum RP6 informiert der entsprechende Abschnitt im [[RP6v2#Zubeh.C3.B6r_und_Ersatzteile|RP6v2]] und im [[RP6#Zubehör und Ersatzteile|RP6]] Artikel!'''&lt;br /&gt;
&lt;br /&gt;
Die ''RP6 Xtra Module'' unterscheiden sich von den weiteren &amp;quot;Zubehör- und Ersatzteilen&amp;quot; dadurch, dass sie selbstständige Sensor-Platinen sind, die ideal zum RP6-System passen, aber auch mit anderen Microcontroller-Plattformen nutzbar sind.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==RP6 Sensor Board==&lt;br /&gt;
Das RP6 Sensor Board RP6-JM03-61 ([http://www.conrad.de/ce/de/product/1082384/Arexx-RP6-Sensor-Board-RP6-JM03-61 1082384]) wurde am 27.11.2013 von [[Benutzer:SlyD|SlyD]] angekündigt (siehe Weblink!).&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_Sensor_Board.jpg|Das RP6 Sensor Board]]&lt;br /&gt;
&lt;br /&gt;
===Beschreibung===&lt;br /&gt;
(Laut Online-Katalog der Firma CONRAD!)&lt;br /&gt;
&lt;br /&gt;
''&amp;quot;Das RP6 Sensor Board erweitert die Möglichkeiten aller RP6 Roboter um wesentliche Sensorsignale für Robotik-Anwendungen wie zum Beispiel Dreharten (Yaw-Gyro), Kipp- und Neigewinkel, Kompassrichtung oder aber auch Zeit und Datum.&lt;br /&gt;
Sie können einfach mit zusätzlichen Sharp Sensoren Abstände genau messen, z.B. für autonome Fahrrouten oder falls der Sensor nach unten gerichtet ist, kann er Treppenstufen oder ähnliches entdecken. Außerdem gibt es die Möglichkeit z.B. die Sharp Sensoren ein- bzw. auszuschalten um Strom zu sparen. Zusätzlich können bis zu 8 Servos angesteuert werden um z.B. einen Roboterarm zu bewegen, der auch mechanisch einfach zu montieren ist. Um die Möglichkeiten des RP6 Sensor Boards komplett ausnutzen zu können, wird ein RP6V2 und RP6Wifi Control Board empfohlen. Die ermöglicht den Roboter über Wifi fernzusteuern oder Sensordaten auf dem Kommandozentrum (PC) z.B Kompassdaten, Temperatur oder Kipp- und Neigewinkel anzeigen zu lassen.&amp;quot;''&lt;br /&gt;
&lt;br /&gt;
'''Ausstattung'''&lt;br /&gt;
* Magnetometer- und Accelerometer für Kompassfunktion&lt;br /&gt;
* Gyro Sensor (Yaw)&lt;br /&gt;
* Sharp-Sensor Schnittstelle&lt;br /&gt;
* LED Scheinwerfer&lt;br /&gt;
* LED Treiber mit Smart Funktionen&lt;br /&gt;
* I²C Bus mit max. 400 kHz Übertragungsrate; Hot Swap I²C-Bus Buffer&lt;br /&gt;
* Taster mit LED&lt;br /&gt;
* Echtzeit-Uhr RTC&lt;br /&gt;
* Backupbatterie (Aufladung während des Betriebs)&lt;br /&gt;
* Expansion Port z.B. für GPS-I²C Bus Modul&lt;br /&gt;
* 8 Servo-Ausgänge mit eigenem Schaltregler&lt;br /&gt;
* 8 PWM Ausgänge&lt;br /&gt;
* 5 LED Ausgänge und 2 Digital-I/O Ausgänge.&lt;br /&gt;
&lt;br /&gt;
'''Lieferumfang'''&lt;br /&gt;
* RP6 Sensor Board&lt;br /&gt;
* Montage-Kit&lt;br /&gt;
* Kabel&lt;br /&gt;
* Anleitung und CD mit Dokumentation.&lt;br /&gt;
&lt;br /&gt;
====Blockschaltbild====&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_Sensor_Board_BSP.png|RP6 Sensor Board Blockschaltbild]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Technische Daten===&lt;br /&gt;
{|  {{Blauetabelle}} &lt;br /&gt;
|'''Mikrocontroller:'''&lt;br /&gt;
|kein&lt;br /&gt;
|-&lt;br /&gt;
|'''Speicher:'''&lt;br /&gt;
|kein&amp;lt;br/&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|'''Programmierung:'''&lt;br /&gt;
|C++ (GCC, u.a.) über externes µC-System&lt;br /&gt;
|-&lt;br /&gt;
|'''Vorhandene Sensoren:'''&lt;br /&gt;
|Temperatur, 3D Magnetfeld (Kompass), 3D Beschleunigung, Yaw-Gyro&amp;lt;br/&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|'''Vorhandene Aktoren:'''&lt;br /&gt;
|LED Controller (2 LEDs on board, 5 freie LED Ports), Status LED,&amp;lt;br/&amp;gt;Button, Servo (PWM) Controller für 8 Servos und 8 PWM-Kanäle,&amp;lt;br/&amp;gt;Real Time Clock (RTC), 2 freie I/O Ports&lt;br /&gt;
|-&lt;br /&gt;
|'''Abmessungen:'''&lt;br /&gt;
|(L &amp;amp;times; B &amp;amp;times; H) 112 &amp;amp;times; 90 &amp;amp;times; 19 mm&amp;lt;br/&amp;gt;(B + 5 mm durch Scheinwerfer vorn)&lt;br /&gt;
|-&lt;br /&gt;
|'''Ausführung:'''&lt;br /&gt;
|Fertig aufgebautes Erweiterungsmodul&lt;br /&gt;
|-&lt;br /&gt;
|'''Stromversorgung:'''&lt;br /&gt;
|6 AA NiMH Akkus (über die RP6v2 Base)&amp;lt;br/&amp;gt;und optionaler Zusatzakku 7,2..10 V für Servo Power&lt;br /&gt;
|-&lt;br /&gt;
|'''Hersteller:'''&lt;br /&gt;
|Arexx Niederlande&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Umbau-Optionen===&lt;br /&gt;
Hier soll beschrieben werden, welche Umbau-Optionen es für das RP6 Sensor Board gibt. Im Text gibt es Verweise auf den Schaltplan des RP6 Sensor Boards (RP6_Sensor_Board_Rev2_Schema.pdf) in der Form: (SP2: Bauteil). Dies bedeutet, dass man das Bauteil auf Blatt 2 des Schaltplans finden kann. Beispielhaft sind im folgenden Text Bestell-Nummern der Firma [http://www.conrad.de/ce/ CONRAD] genannt. Natürlich kann man die Teile auch bei anderen Versendern beziehen.&lt;br /&gt;
&lt;br /&gt;
====USRBUS- und XBUS-Wannenstecker====&lt;br /&gt;
Der zweite Wannenstecker für den XBUS (SP3: K14) und USRBUS (SP3: K16) kann nachbestückt werden.&lt;br /&gt;
Man braucht dazu: &lt;br /&gt;
* 2 Wannenstecker 2x5-polig gerade RM 2,54mm (CONRAD [http://www.conrad.de/ce/de/product/741648/Stiftleiste-Print-Montage-gerade-Rastermass-254-mm-Pole-2-x-5-10120554-BKL-Electronic-Inhalt-1-St/ 741648])&lt;br /&gt;
Die Wannenstecker lötet man auf die eingezeichneten Positionen.&lt;br /&gt;
&lt;br /&gt;
'''USRBUS-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''USRBUS''' || '''Sensor Board-Funktion''' || '''Verwendung''' || '''I/O'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Y1 || &amp;quot;ADC0&amp;quot; || SHARP vorn || I&lt;br /&gt;
|-&lt;br /&gt;
| 2 || Y2 || &amp;quot;ADC1&amp;quot; || Yaw-Gyro || I&lt;br /&gt;
|-&lt;br /&gt;
| 3 || Y3 || PWR || Power für&amp;lt;br/&amp;gt;SHARPs, CAM_IF,&amp;lt;br/&amp;gt;I2C-MODULE || O&lt;br /&gt;
|-&lt;br /&gt;
| 4 || Y4 || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 5 || Y5 || &amp;quot;ADC4&amp;quot; || SHARP hinten ||I&lt;br /&gt;
|-&lt;br /&gt;
| 6..14 || Y6..Y14 || || keine ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
'''XBUS-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''XBUS''' || '''M256-Port''' ||'''M256-Funktion''' || '''Sensor Board-Funktion''' || '''Jumper''' || '''Verwendung''' || '''I/O'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || GND || || GND || GND || || ||&lt;br /&gt;
|-&lt;br /&gt;
| 2 || GND || || GND || GND || || ||&lt;br /&gt;
|-&lt;br /&gt;
| 3 || VDD || || VDD|| VDD_1 || || VDD +5V ||&lt;br /&gt;
|-&lt;br /&gt;
| 4 || +UB || || +UB || VSS_1 || || CAM_IF Power ||&lt;br /&gt;
|-&lt;br /&gt;
| 5 || VDD || || VDD || VDD_1 || || VDD +5V ||&lt;br /&gt;
|-&lt;br /&gt;
| 6 || +UB || || +UB || VSS_1 || || CAM_IF Power ||&lt;br /&gt;
|-&lt;br /&gt;
| 7 || INTU || PJ4 || PCINT13 || INTU || || keine || I&lt;br /&gt;
|-&lt;br /&gt;
| 8 || INT1 || PJ3 || PCINT12 || INT1 || 3 || LSM303DLHC: INT1 || I&lt;br /&gt;
|-&lt;br /&gt;
| 9 || INT3 || PJ5 || PCINT14 || INT3 || 2&amp;lt;br/&amp;gt;5 || DS1339: SQW/INT_N&amp;lt;br/&amp;gt;LSM303DLHC: INT2 || I&amp;lt;br/&amp;gt;I&lt;br /&gt;
|-&lt;br /&gt;
| 10 || SCL || PD0 || SCL || SCL_M || || I2C-Bus || O&lt;br /&gt;
|-&lt;br /&gt;
| 11 || INT2 || PJ6 || PCINT15 || INT2 || 4 || MAX7311: INT_N || I&lt;br /&gt;
|-&lt;br /&gt;
| 12 || SDA || PD1 || SDA || SDA_M || || I2C-Bus || I/O&lt;br /&gt;
|-&lt;br /&gt;
| 13 || MRESET || || MRESET || MRESET || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 14 || GND || || GND || GND || || ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====I/O-Patchfield_1====&lt;br /&gt;
Dieses 2x 5-polige &amp;quot;Patchfield_1&amp;quot; (SP3: K8), beschriftet mit &amp;quot;I/O&amp;quot; liegt neben dem Wannenstecker I/O und weist dieselbe Belegung auf. Möchte man auf dem Sensor Board Verbindungen über den Wannenstecker I/O zu einer angeschlossenen Microprozessor-Platine herstellen, dann kann man auf das &amp;quot;Patchfield_1&amp;quot; eine Stiftleiste löten.&lt;br /&gt;
Man braucht dazu: &lt;br /&gt;
* 2-reihige Stiftleiste RM 2,54mm (z.B. 2x40-polig [http://www.conrad.de/ce/de/product/741306/Doppelreihige-Stiftleiste-RM-254-gerade-Pole-2-x-40-10120173-BKL-Electronic-Inhalt-1-St 741306]) &lt;br /&gt;
Man trennt von der 2-reihigen Stiftleiste 2x5 Kontakte ab und lötet sie auf die Lötpunkte &amp;quot;I/O&amp;quot;. Zuvor muss man u.U. Lötzinnreste aus den Lötpunkten mit Entlötlitze bzw. Entlötsaugpumpe entfernen.&lt;br /&gt;
&lt;br /&gt;
'''Stecker I/O an M256 IO_PWM/T0/T1:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''M256-Port''' ||'''M256-Funktion''' || '''Sensor Board-Funktion''' || '''Verwendung''' || '''I/O'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || PD4 || ICP1 || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 2 || || GND || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 3 || PD6 || T1 || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 4 || PB7 || OC0A || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 5 || PG5 || OC0B || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 6 || PD7 || T0 || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 7 || PB5 || OC1A || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 8 || PK5 || ADC13 || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 9 || PB6 || OC1B || &amp;quot;PD5&amp;quot; || I2C Bus Buffer Enable || O&lt;br /&gt;
|-&lt;br /&gt;
| 10 || || VDD || || keine ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====ADC-Patchfield_2====&lt;br /&gt;
Dieses 2x 5-polige &amp;quot;Patchfield_2&amp;quot; (SP3: K9), beschriftet mit &amp;quot;ADC&amp;quot; liegt neben dem Wannenstecker ADC und weist dieselbe Belegung auf. Möchte man auf dem Sensor Board Verbindungen über den Wannenstecker ADC zu einer angeschlossenen Microprozessor-Platine herstellen, dann kann man auf das &amp;quot;Patchfield_2&amp;quot; eine Stiftleiste löten.&lt;br /&gt;
Man braucht dazu: &lt;br /&gt;
* 2-reihige Stiftleiste RM 2,54mm (z.B. 2x40-polig [http://www.conrad.de/ce/de/product/741306/Doppelreihige-Stiftleiste-RM-254-gerade-Pole-2-x-40-10120173-BKL-Electronic-Inhalt-1-St 741306]) &lt;br /&gt;
Man trennt von der 2-reihigen Stiftleiste 2x5 Kontakte ab und lötet sie auf die Lötpunkte &amp;quot;ADC&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
'''Stecker ADC an M256 ADC_IO2/CMP:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''M256-Port''' ||'''M256-Funktion''' || '''Sensor Board-Funktion''' || '''Jumper''' || '''Verwendung''' || '''I/O'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || PK0 || ADC8 || || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 2 || || GND || || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 3 || PK1 || ADC9 || &amp;quot;ADC4&amp;quot; || 6 || SHARP hinten || I&lt;br /&gt;
|-&lt;br /&gt;
| 4 || PE3 || OC3A/AIN1 || || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 5 || PK2 || ADC10 || || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 6 || || GND || || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 7 || PK3 || ADC11 || || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 8 || PE2 || XCK0/AIN0 || || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 9 || PK4 || ADC12 || || || keine ||&lt;br /&gt;
|-&lt;br /&gt;
| 10 || || VDD || || || keine ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Anschluss-Optionen===&lt;br /&gt;
Hier soll beschrieben werden, welche Anschluss-Optionen es für das RP6 Sensor Board gibt. In erster Linie geht es dabei um die Belegung der vorhandenen Stecker bzw. Stiftleisten.&lt;br /&gt;
&lt;br /&gt;
Allgemein kann man Anschlüsse an Stiftleisten mit entsprechenden Steckbuchsen erreichen. Solche Steckbuchsen sind z.B. bei ELV erhältlich:&lt;br /&gt;
* Steckbuchse, 2-polig, RM 2,54mm ([http://www.elv.de/steckbuchse-2-polig.html ELV 68-016635])&lt;br /&gt;
* Steckbuchse, 3-polig, RM 2,54mm ([http://www.elv.de/steckbuchse-3-polig.html ELV 68-022503])&lt;br /&gt;
* Steckbuchse, 5-polig, RM 2,54mm ([http://www.elv.de/steckbuchse-5-polig.html ELV 68-023073])&lt;br /&gt;
Die Crimpkontakte dieser Steckbuchse werden an Litzen angequetscht (oder angelötet) und zum entsprechenden Sensor bzw. Aktor geführt. &lt;br /&gt;
&lt;br /&gt;
====I2C-MODULE====&lt;br /&gt;
Der I2C-MODULE Anschluss (SP1: M1) auf dem Sensor Board besteht aus einer 9-poligen Präzisions-Buchsenleiste RM 2,54mm (z.B. [http://www.conrad.de/ce/de/product/741360/Praezisions-Buchsenleiste-RM-254-gerade-Pole-1-x-20-10120832-BKL-Electronic-Inhalt-1-St 741360]). Wenn man eigene I2C-Module hier anschliessen will, braucht man zur Kontaktierung:&lt;br /&gt;
* Präzisions-Stiftleiste, 9-polig, RM 2,54mm (z.B. [http://www.conrad.de/ce/de/product/741307/Praezisions-Stiftleiste-RM-254-gerade-Pole-1-x-20-10120536-BKL-Electronic-Inhalt-1-St 741307])&lt;br /&gt;
&lt;br /&gt;
'''I2C-MODULE-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''Sensor Board&amp;lt;br/&amp;gt;-Funktion (M1)''' || '''Verwendung''' || '''I/O''' |||| [[RP6_Sensor_Board_und_Xtra_Module#I2C_GPS_Empf.C3.A4nger_JM3-GPS|'''I2C GPS Empfänger]]&amp;lt;br/&amp;gt;-Funktion (K1)'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || VCC || +5V || |||| VCC_1&lt;br /&gt;
|-&lt;br /&gt;
| 2 || SCLOUT || Buffered I2C-Bus || O |||| SCL/SCK&lt;br /&gt;
|-&lt;br /&gt;
| 3 || SDAOUT || Buffered I2C-Bus || I/O |||| SDA/MOSI&lt;br /&gt;
|-&lt;br /&gt;
| 4 || NC || keine || ||||&lt;br /&gt;
|-&lt;br /&gt;
| 5 || I/O1 || Status LED || O ||||&lt;br /&gt;
|-&lt;br /&gt;
| 6 || I/O2 || Taster || I ||||&lt;br /&gt;
|-&lt;br /&gt;
| 7 || NC || keine || ||||&lt;br /&gt;
|-&lt;br /&gt;
| 8 || GND || GND (geschaltet!) || |||| GND&lt;br /&gt;
|-&lt;br /&gt;
| 9 || GND || GND (geschaltet!) || |||| GND&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====CAM_IF====&lt;br /&gt;
Der CAM_IF Anschluss (SP1: K28) ist eine 2x 3-polige Stiftleiste mit der folgenden Belegung:&lt;br /&gt;
&lt;br /&gt;
'''CAM_IF-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''Sensor Board&amp;lt;br/&amp;gt;-Funktion (K28)''' || '''Verwendung''' || '''I/O'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || GND || GND (geschaltet!) ||&lt;br /&gt;
|-&lt;br /&gt;
| 2 || VSS_1 || +7,2..10V (RP6: +UB) ||&lt;br /&gt;
|-&lt;br /&gt;
| 3 || SCLOUT || Buffered I2C-Bus || O&lt;br /&gt;
|-&lt;br /&gt;
| 4 || SDAOUT || Buffered I2C-Bus || I/O&lt;br /&gt;
|-&lt;br /&gt;
| 5 || SCL_M || I2C-Bus || O&lt;br /&gt;
|-&lt;br /&gt;
| 6 || SDA_M || I2C-Bus || I/O&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====IO_EXT====&lt;br /&gt;
Der IO_EXT Anschluss (SP1: K19) ist eine 2x 2-polige Stiftleiste mit der folgenden Belegung:&lt;br /&gt;
&lt;br /&gt;
'''IO_EXT-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''Sensor Board&amp;lt;br/&amp;gt;-Funktion (K19)''' || '''Verwendung''' || '''I/O'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || MAX7311: I/O1.2 || freier I/O Port || I/O&lt;br /&gt;
|-&lt;br /&gt;
| 2 || GND || ||&lt;br /&gt;
|-&lt;br /&gt;
| 3 || MAX7311: I/O1.1 || freier I/O Port || I/O&lt;br /&gt;
|-&lt;br /&gt;
| 4 || GND || ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====PWM_OUT====&lt;br /&gt;
Der PWM_OUT Anschluss (SP5: K12) ist eine 2x 4-polige Stiftleiste mit der folgenden Belegung:&lt;br /&gt;
&lt;br /&gt;
'''PWM_OUT-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''Sensor Board&amp;lt;br/&amp;gt;-Funktion (K12)''' || '''Verwendung''' || '''I/O'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || PCA9685: PWM0 || freier PWM Port || O&lt;br /&gt;
|-&lt;br /&gt;
| 2 || PCA9685: PWM1 || freier PWM Port || O&lt;br /&gt;
|-&lt;br /&gt;
| 3 || PCA9685: PWM2 || freier PWM Port || O&lt;br /&gt;
|-&lt;br /&gt;
| 4 || PCA9685: PWM3 || freier PWM Port || O&lt;br /&gt;
|-&lt;br /&gt;
| 5 || PCA9685: PWM4 || freier PWM Port || O&lt;br /&gt;
|-&lt;br /&gt;
| 6 || PCA9685: PWM5 || freier PWM Port || O&lt;br /&gt;
|-&lt;br /&gt;
| 7 || PCA9685: PWM6 || freier PWM Port || O&lt;br /&gt;
|-&lt;br /&gt;
| 8 || PCA9685: PWM7 || freier PWM Port || O&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====TP1====&lt;br /&gt;
Am Testpunkt TP1 (SP4: TP1) kann man das Signal SQW/INT_N der RTC (DS1339) prüfen/messen.&lt;br /&gt;
&lt;br /&gt;
====LEDs====&lt;br /&gt;
=====Rücklichter=====&lt;br /&gt;
Der Rücklichter Anschluss (SP1: K10) ist eine 2-polige Stiftleiste mit der folgenden Belegung:&lt;br /&gt;
&lt;br /&gt;
'''Rücklichter-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''Sensor Board&amp;lt;br/&amp;gt;-Funktion (K10)''' || '''Verwendung''' || '''I/O'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || TCA6507: P3 || Rücklicht rechts || O&lt;br /&gt;
|-&lt;br /&gt;
| 2 || TCA6507: P4 || Rücklicht links || O&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=====Display-Hintergrundbeleuchtung=====&lt;br /&gt;
Der Display-Hintergrundbeleuchtung Anschluss (SP1: K7) ist eine 2-polige Stiftleiste mit der folgenden Belegung:&lt;br /&gt;
&lt;br /&gt;
'''Display-Hintergrundbeleuchtung-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''Sensor Board&amp;lt;br/&amp;gt;-Funktion (K7)''' || '''Verwendung''' || '''I/O'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || TCA6507: P0 || Display-Hintergrundbeleuchtung || O&lt;br /&gt;
|-&lt;br /&gt;
| 2 || VDD_1 || +5V ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=====Freie Ausgänge=====&lt;br /&gt;
Der freie Ausgang 1 Anschluss (SP1: K4) ist eine 2-polige Stiftleiste mit der folgenden Belegung:&lt;br /&gt;
&lt;br /&gt;
'''Freier Ausgang 1-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''Sensor Board&amp;lt;br/&amp;gt;-Funktion (K4)''' || '''Verwendung''' || '''I/O'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || TCA6507: P1 || freier LED Port || O&lt;br /&gt;
|-&lt;br /&gt;
| 2 || VDD_1 || +5V ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Der freie Ausgang 2 Anschluss (SP1: K2) ist eine 2-polige Stiftleiste mit der folgenden Belegung:&lt;br /&gt;
&lt;br /&gt;
'''Freier Ausgang 2-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''Sensor Board&amp;lt;br/&amp;gt;-Funktion (K2)''' || '''Verwendung''' || '''I/O'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || TCA6507: P2 || freier LED Port || O&lt;br /&gt;
|-&lt;br /&gt;
| 2 || VDD_1 || +5V ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====SHARP Sensoren====&lt;br /&gt;
Das RP6 Sensor Board verfügt über zwei Stecker SHARP_F (SP1: K5) und SHARP_R (SP1: K3) zum Anschluß von analogen SHARP Infrarot-Distanz-Sensoren. Folgende SHARP Sensoren sind anschließbar:&lt;br /&gt;
* 1. SHARP Distanz-Sensor GP2Y0A41SK0F ([http://www.conrad.de/ce/de/product/504596/Distanz-Sensor-GP2Y0A41SK0F-Sharp-GP2Y0A41SK0F-Messbereiche-Erfassungsbereich-4-30-cm-5-VDC 504596]), Messbereich 4..30cm&lt;br /&gt;
* 2. SHARP Distanz-Sensor GP2Y0A21YK0F ([http://www.conrad.de/ce/de/product/504591/Distanz-Sensor-GP2Y0A21YK0F-Sharp-GP2Y0A21YK0F-Messbereiche-Erfassungsbereich-10-80-cm-5-VDC 504591]), Messbereich 10..80cm&lt;br /&gt;
* 3. SHARP Distanz-Sensor GP2Y0A02YK ([http://www.conrad.de/ce/de/product/185364/Distanz-Sensor-GP-2-Y0A-02-YK-Sharp-GP-2-Y0A-02-YK-Messbereiche-Erfassungsbereich-20-150-cm-5-VDC 185364]), Messbereich 20..150cm&lt;br /&gt;
* 4. SHARP Distanz-Sensor GP2Y0A710K0F ([http://www.conrad.de/ce/de/product/504597/Distanz-Sensor-GP2Y0A710K0F-Sharp-GP2Y0A710K0F-Messbereiche-Erfassungsbereich-100-550-cm-5-VDC 504597]), Messbereich 100..550cm&lt;br /&gt;
''Die Auswahl der geeigneten SHARP Sensoren hängt von der gewünschten Funktion ab: Zur Erkundung großer Räume eignet sich insbesondere der Typ 4 mit einer hohen Reichweite von 5,5m. Er ist aber ungeeignet, die Distanz von Objekten zu erkennen, die sich näher als 1m vor dem Sensor befinden. Ein guter Kompromiss zwischen Nahbereichsmessung und &amp;quot;Fernsicht&amp;quot; sind die Typen 2 (10..80cm) und 3 (20..150cm). Will man den Distanz-Sensor vor allem zur Vermeidung eins Sturzes von einer Treppe (Tiefenerkennung) oder nur zur Erkennung von Hindernissen direkt vor dem Roboter (Kollisionserkennung) benutzen, dann eignet sich insbesondere für den vorderen Sensor (SHARP_F) der Typ 1, da er im Nahbereich von 4 bis 30cm messen kann.''&lt;br /&gt;
&lt;br /&gt;
Für die Verbindung zwischen den beiden 3-poligen JST XH Steckern (K3, 5) auf dem Sensor Board und den SHARP-Sensoren braucht man auf der Sensor Board Seite folgende Stecker-/buchsenteile:&lt;br /&gt;
* 2x JST XH Gehäuse, 3-polig, RM 2,5mm ([http://www.conrad.de/ce/de/product/740583/Gehaeuse-RM-25-mm-Serie-XH-Rastermass-25-mm-Pole-3-Nennstrom-3-A-XHP-3-JST-Inhalt-1-St 740583])&lt;br /&gt;
* 6x JST XH Crimpkontakt f. RM 2,5mm ([http://www.conrad.de/ce/de/product/741112/Crimpkontakt-fuer-RM-25-mm-Serie-XH-Rastermass-25-mm-BXH-001T-P06-JST-Inhalt-1-St 741112])&lt;br /&gt;
Die Crimpkontakte dieser Steckbuchse werden an die meist 3-adrige Litze des Sensors angequetscht (oder angelötet). Zur Belegung des Sensor Anschlusses siehe das jeweilige Datenblatt!&lt;br /&gt;
&lt;br /&gt;
=====Vorn=====&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_Sensor_Board_SHARP_F.JPG|RP6 Sensor Board SHARP Sensor vorn|thumb]]&lt;br /&gt;
&lt;br /&gt;
Der vordere SHARP Sensor kann auch mechanisch am Sensor Board befestigt werden. Dazu gibt es an der Vorderkante der Platine zwei Befestigungslöcher.&lt;br /&gt;
&lt;br /&gt;
Das Bild rechts zeigt den SHARP Distanzsensor GP2Y0A02YK montiert vorn auf dem Sensor Board mit zwei M3 Gelenkbolzen ([http://www.conrad.de/ce/de/product/521043/Gelenkbolzen-1-x-Aussengewinde1-x-Innengewinde-Messing-vernickelt-Schluesselweite-55-mm/ 521043]) und passenden Schrauben/Muttern.&lt;br /&gt;
&lt;br /&gt;
'''Vorn-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''RP6v2-Port''' ||'''RP6v2-Funktion''' || '''Sensor Board&amp;lt;br/&amp;gt;-Funktion (K5)''' || '''Verwendung''' || '''I/O''' |||| '''SHARP Sensor&amp;lt;br/&amp;gt;-Funktion''' &lt;br /&gt;
|-&lt;br /&gt;
| 1 || PA0 || ADC0 || &amp;quot;ADC0&amp;quot; || SHARP vorn || I |||| Vo&lt;br /&gt;
|-&lt;br /&gt;
| 2 || || || VDD_1 || +5V || |||| Vcc&lt;br /&gt;
|-&lt;br /&gt;
| 3 || || || GND || GND (geschaltet!) || |||| GND&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=====Hinten=====&lt;br /&gt;
Der hintere SHARP Sensor kann z.B. an der Rückseite des RP6v2 Fahrgestells befestigt werden.&lt;br /&gt;
&lt;br /&gt;
'''Hinten-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''M256-Port''' ||'''M256-Funktion''' || '''Sensor Board&amp;lt;br/&amp;gt;-Funktion (K3)''' || '''Verwendung''' || '''I/O''' |||| '''SHARP Sensor&amp;lt;br/&amp;gt;-Funktion''' &lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| 1 || PK1 || ADC9 || &amp;quot;ADC4&amp;quot; || SHARP hinten || I |||| Vo&lt;br /&gt;
|-&lt;br /&gt;
| 2 || || || VDD_1 || +5V || |||| Vcc&lt;br /&gt;
|-&lt;br /&gt;
| 3 || || || GND || GND (geschaltet!) || |||| GND&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Servos====&lt;br /&gt;
=====Power=====&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_Sensor_Board_Servo-PWR.jpg|RP6 Sensor Board Servo-PWR Stecker|thumb]]&lt;br /&gt;
&lt;br /&gt;
An den SERVO_PWR Stecker (SP5: K1) muss ein Akku zur Stromversorgung der mit dem Sensor Board verbundenen Servos angeschlossen werden. Der Stecker hat folgende Belegung:&lt;br /&gt;
 &lt;br /&gt;
'''SERVO_PWR-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''Sensor Board&amp;lt;br/&amp;gt;-Funktion (K1)''' || '''Verwendung'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || GND_POWER || Servo Power GND&lt;br /&gt;
|-&lt;br /&gt;
| 2 || VSS_POWER || Servo Power Eingang +7,2..10V&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Der Akku zur Versorgung der Servos muss eine Nennspannung von 7,2..10V aufweisen. Der Schaltregler auf dem Sensor Board kann bei einer 5,0V Servo-Spannung Ströme bis 3,0A (Spitzen bis 5,0A) liefern. '''Die Polung des Akkus darf am Stecker SERVO_PWR nicht vertauscht werden.''' Siehe den oberen Teil der nebenstehende Abbildung! Ratsam ist es, eine Sicherung 3,15A in die Plusleitung zwischen Akku und SERVO_PWR Stecker zu legen.&lt;br /&gt;
&lt;br /&gt;
Für die Verbindung zwischen dem 2-poligen JST XH Stecker (SERVO_PWR, K1) auf dem Sensor Board und dem Akku braucht man auf der Sensor Board Seite folgende Stecker-/buchsenteile:&lt;br /&gt;
* JST XH Gehäuse, 2-polig, RM 2,5mm ([http://www.conrad.de/ce/de/product/740549/Gehaeuse-RM-25-mm-Serie-XH-Rastermass-25-mm-Pole-2-Nennstrom-3-A-XHP-2-JST-Inhalt-1-St 740549])&lt;br /&gt;
* 2x JST XH Crimpkontakt f. RM 2,5mm ([http://www.conrad.de/ce/de/product/741112/Crimpkontakt-fuer-RM-25-mm-Serie-XH-Rastermass-25-mm-BXH-001T-P06-JST-Inhalt-1-St 741112])&lt;br /&gt;
Die Crimpkontakte dieser Steckbuchse werden an die 2-adrige Litze zum Akku angequetscht (oder angelötet).&lt;br /&gt;
&lt;br /&gt;
Wenn man keinen separaten Akku zur Versorgung der Servos nehmen will, kann man auch +UB der RP6v2 Base dafür nutzen. An +UB liegt die Akkuspannung der Base (Nennspannung 7,2V) über eine Sicherung F1 3,15A (RP6v2) bzw. 2,5A (RP6) auf dem Mainboard an. +UB kann man z.B. am [[RP6#EXT_Anschlu.C3.9F|EXT Anschluß der Base]] entnehmen. Die nebenstehende Abbildung zeigt im unteren Teil, an welchen Pins man dort +UB kontaktieren kann!&lt;br /&gt;
&lt;br /&gt;
Dabei ist zu beachten, dass die Sicherung F1 auf dem RP6(v2) Mainboard den nutzbaren Strom für die Servos deutlich begrenzt: Durch diese Sicherung fließt ja nicht nur der Servo-Strom, sondern auch der Strom für den RP6 und alle darauf montierten Zusatzplatinen. Wenn der RP6 also herumfährt und z.B. noch die IRCOMM-Sendedioden nutzt, bleibt kaum noch Stromreserve für die Servos auf dem Sensor Board übrig.&lt;br /&gt;
'''Das bedeutet: Man sollte unbedingt einen separaten Akku für die Servos auf dem Sensor Board benutzen!'''&lt;br /&gt;
&lt;br /&gt;
======SERVO_PWR-EXT Verbindung======&lt;br /&gt;
Für die Verbindung zwischen dem 2-poligen JST XH Stecker (SERVO_PWR, K1) auf dem Sensor Board und dem 8-poligen JST XH Stecker (EXT) auf dem RP6v2 Mainboard braucht man folgende Stecker-/buchsenteile:&lt;br /&gt;
* JST XH Gehäuse, 2-polig, RM 2,5mm ([http://www.conrad.de/ce/de/product/740549/Gehaeuse-RM-25-mm-Serie-XH-Rastermass-25-mm-Pole-2-Nennstrom-3-A-XHP-2-JST-Inhalt-1-St 740549])&lt;br /&gt;
* JST XH Gehäuse, 8-polig, RM 2,5mm ([http://www.conrad.de/ce/de/product/740928/Gehaeuse-RM-25-mm-Serie-XH-Rastermass-25-mm-Pole-8-Nennstrom-3-A-XHP-8-JST-Inhalt-1-St 740928])&lt;br /&gt;
* 10x JST XH Crimpkontakt f. RM 2,5mm ([http://www.conrad.de/ce/de/product/741112/Crimpkontakt-fuer-RM-25-mm-Serie-XH-Rastermass-25-mm-BXH-001T-P06-JST-Inhalt-1-St 741112])&lt;br /&gt;
Mit einer 2-adrigen Litze, die beidseits mit den Crimpkontakten verquetscht (oder verlötet) wird, verbindet man dann den SERVO_PWR Stecker mit dem EXT Stecker, wie in der Abbildung oben gezeigt. ''Achtung: Plus (+) und Minus (-) nicht vertauschen!''&lt;br /&gt;
 Ein passendes Kabel soll zukünftig (*) mitgeliefert werden.&lt;br /&gt;
&lt;br /&gt;
Auf dem RP6 Mainboard ist der 8-polige EXT Stecker noch nicht bestückt. Wenn man ihn nachrüsten will, muss man noch bestellen:&lt;br /&gt;
* JST XH Stiftleiste gerade, 8-polig, RM 2,5mm ([http://www.conrad.de/ce/de/product/740105/Stiftleiste-gerade-RM-25-mm-Serie-XH-Rastermass-25-mm-Pole-8-Nennstrom-3-A-B8B-XH-A-LFSN-JST-Inhalt-1-St 740105])&lt;br /&gt;
Die Stiftleiste wird auf das RP6 Mainboard gelötet, dabei weisen die beiden Einkerbungen an einer Längsseite der Stiftleiste nach hinten zum Rand des Mainboards.&lt;br /&gt;
 Auch diese Stiftleiste soll zukünftig (*) zum Lieferumfang gehören.&lt;br /&gt;
'''Zu *)''' Meinem RP6 Sensor Board (bestellt am 1.3.2014) lag das konfektionierte Kabel und die Stiftleiste noch nicht bei!&lt;br /&gt;
&lt;br /&gt;
=====Stecker=====&lt;br /&gt;
An die acht 3-poligen Stiftleisten SERVO_1 bis SERVO_8 (SP5: K6, 11, 29..34) können Servos angeschlossen werden. Direkt aufstecken kann man Servo-Steckbuchsen mit der Belegung von CONRAD, Graupner/JR und Robbe/Futaba (Versorgungsspannung Plus am mittleren Pin). Auf der Sensor Board Platine kann man den Pin 3 (Servo Power GND) der 3-poligen Stiftleisten daran erkennen, dass er näher zum rechten Platinenrand (Seite mit dem XBUS Stecker) angeordnet ist als der zugehörige Pin 1 (Servo Signal).&lt;br /&gt;
&lt;br /&gt;
Wenn Servos mit nicht passender Steckbuchse angeschlossen werden sollen, dann braucht man auf der Sensor Board Seite folgende Stecker-/buchsenteile für jedes Servo:&lt;br /&gt;
* Steckbuchse, 3-polig, RM 2,54mm ([http://www.elv.de/steckbuchse-3-polig.html ELV 68-022503])&lt;br /&gt;
Die Crimpkontakte dieser Steckbuchse werden an die 3-adrige Litze des Servos angequetscht (oder angelötet). &lt;br /&gt;
&lt;br /&gt;
'''SERVO_1..8-Belegung:'''&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|-&lt;br /&gt;
| '''Stecker-Pin''' || '''Sensor Board&amp;lt;br/&amp;gt;-Funktion (K6,11,29..34)''' || '''Verwendung''' || '''I/O''' |||| '''Servo-&amp;lt;br/&amp;gt;Kabelfarben'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || PCA9685: PWM15..8 || Servo Signal || O |||| Weiß, Orange&lt;br /&gt;
|-&lt;br /&gt;
| 2 || Servo_PWR || Servo Power +5V (geschaltet!) || |||| Rot&lt;br /&gt;
|-&lt;br /&gt;
| 3 || GND_POWER || Servo Power GND || |||| Schwarz, Braun&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Roboterarm RA2-HOBBY====&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_Sensor_Board_RA2-MINI.JPG|RP6 Sensor Board mit Roboterarm RA2-MINI|thumb]]&lt;br /&gt;
&lt;br /&gt;
In der Anleitung zum RP6 Sensor Board ist der Arexx Roboterarm RA2-HOBBY bzw. RA2-MINI [http://www.conrad.de/ce/de/product/191534/Arexx-Mini-Roboterarm-RA2-MINI (191534)] abgebildet. Er ist dort ohne Grundgestell und Controller-Platine auf dem Sensor Board befestigt.&lt;br /&gt;
Das Sensor Board eignet sich sehr gut zur Ansteuerung der 6 Servos des Roboterarms.&lt;br /&gt;
&lt;br /&gt;
Zur Montage des RA2-MINI auf dem Sensor Board geht man so vor:&lt;br /&gt;
* Lösen der 4 Rundkopfschrauben M3x6, die die Servobodenplatte mit den Abstandbolzen M3x30 auf der Controller-Platine verbinden (siehe Anleitung zum RA2-MINI, Seite 19!)&lt;br /&gt;
* Lösen der Servobodenplatte vom Bodenservo (siehe Anleitung zum RA2-MINI, Seite 8!)&lt;br /&gt;
* Bohren der Befestigungslöcher in die Servobodenplatte:&lt;br /&gt;
** Rechts-Links Lochabstand 4,75cm, Vorn-Hinten Lochabstand 4,1cm&lt;br /&gt;
** Ungefähre Lage der Löcher siehe Abbildung in der Anleitung zum Sensor Board, Seite 4!&lt;br /&gt;
** Markierung der Bohrlöcher auf der Rückseite der Servobodenplatte:&lt;br /&gt;
*** 1. Mit einer Hilfslinie die Hinterkante des Servoausschnitts (das ist die kürzere Kante, die näher am Rand der Bodenplatte liegt!) nach beiden Seiten verlängern&lt;br /&gt;
*** 2. Eine 2. Hilfslinie parallel zur ersten im Abstand von 1,4cm zur Mitte der Servobodenplatte hin einzeichnen&lt;br /&gt;
*** 3. Auf dieser Linie jetzt die beiden hinteren Bohrlöcher symmetrisch im Abstand von 4,75cm markieren&lt;br /&gt;
*** 4. Für die vorderen Bohrlöcher eine 3. Hilfslinie im Abstand von 4,1cm parallel zur 2. Linie einzeichnen&lt;br /&gt;
*** 5. Auf dieser Linie die beiden vorderen Bohrlöcher symmetrisch im Abstand von 4,75cm markieren&lt;br /&gt;
*** 6. Kontrolle: Die 4 markierten Bohrlochpositionen bilden ein Rechteck mit 4,1cm seitlicher und 4,75cm vorderer/hinterer Kantenlänge&lt;br /&gt;
** Bohren der 4 Löcher (D = 3,2mm) in die Servobodenplatte&lt;br /&gt;
* Befestigen des Bodenservos auf der Servobodenplatte (siehe Anleitung zum RA2-MINI, Seite 8!)&lt;br /&gt;
* Anbringen des Roboterarms auf dem Sensor Board mit 4 Abstandbolzen M3 (L = 30..50mm) und passenden Schrauben/Muttern&lt;br /&gt;
&lt;br /&gt;
Die Servo-Steckbuchsen werden dann ''in der selben Reihenfolge (S1..S6) wie vorher auf der Controller-Platine des Roboterarms'' auf die Stiftleisten SERVO_1 bis SERVO_6 des Sensor Boards gesteckt.&lt;br /&gt;
'''Man sollte unbedingt einen separaten Akku für die Servos auf dem Sensor Board benutzen!'''&lt;br /&gt;
&lt;br /&gt;
====Grafik-Display====&lt;br /&gt;
Ob es mal ein Grafik-Display für das RP6 Sensor Board geben wird, ist ''pure Spekulation''. Allerdings gibt es drei Hinweise darauf, dass eine solche Hardware-Ergänzung kommen könnte:&lt;br /&gt;
* 1. Der vorbereitete Anschluss für eine [[RP6_Sensor_Board_und_Xtra_Module#Display-Hintergrundbeleuchtung|Display-Hintergrundbeleuchtung]]&lt;br /&gt;
* 2. Die 4 Befestigungslöcher in der Mitte des Sensor Boards&lt;br /&gt;
* 3. Eine Abbildung '''Grafik-Display 128x64''' bei JM3-Engeneering (siehe [[RP6_Sensor_Board_und_Xtra_Module#Weblinks|Weblinks]]!)&lt;br /&gt;
Wir werden sehen ...&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==RP6 Xtra Module==&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_Xtra_module.JPG|RP6 Xtra module|right|500px]]&lt;br /&gt;
&lt;br /&gt;
Von den '''AREXX RP6 Xtra Modulen''' sind bei [http://www.conrad.de/ce/ CONRAD] für den RP6v2 erhältlich:&lt;br /&gt;
* Arexx [[RP6_Sensor_Board_und_Xtra_Module#I2C_GPS_Empf.C3.A4nger_JM3-GPS|I2C GPS Empfänger JM3-GPS]] ([http://www.conrad.de/ce/de/product/1082385/Arexx-IC-GPS-Empfaenger-JM3-GPS 1082385])&lt;br /&gt;
* Arexx [[RP6_Sensor_Board_und_Xtra_Module#Gyro_Modul_JM3-GYRO|Gyro Modul JM3-GYRO]] ([http://www.conrad.de/ce/de/product/1082386/Arexx-Gyro-Modul-JM3-GYRO 1082386])&lt;br /&gt;
* Arexx [[RP6_Sensor_Board_und_Xtra_Module#3D_Accelerometer_Modul_JM3-3DA|3D Accelerometer Modul JM3-3DA]] ([http://www.conrad.de/ce/de/product/1082387/Arexx-3D-Accelerometer-Modul-JM3-3DA 1082387])&lt;br /&gt;
&lt;br /&gt;
===I2C GPS Empfänger JM3-GPS===&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_I2C_GPS_Empfänger.JPG|RP6 I2C GPS Empfänger|right|400px]]&lt;br /&gt;
&lt;br /&gt;
(Laut Online-Katalog der Firma CONRAD!)&lt;br /&gt;
&lt;br /&gt;
''&amp;quot;Universelles GPS-I²C-Bus Modul für RP6 Roboter. Der GPS Empfänger stellt die NMEA-0183 Datensätze GGA, RMC, GSA und VTG in den veschiedenen Registern zur Verfügung. Damit ist eine einfache Weiterverarbeitung möglich.&amp;quot;''&lt;br /&gt;
&lt;br /&gt;
====Beschreibung====&lt;br /&gt;
Der I2C GPS Empfänger ist eine kleine (38 x 23 mm) Zusatzplatine (RP6 Xtra Modul), die direkt auf das [[RP6_Sensor_Board_und_Xtra_Module#RP6_Sensor_Board_2|RP6 Sensor Board]] aufgesteckt werden kann. Sie kann aber auch überall eingesetzt werden, wo eine stabilisierte 5V Versorgungsspannung und ein 5V-I2C-Bus bis 400 kHz zur Verfügung steht.&lt;br /&gt;
&lt;br /&gt;
Die Platine ist bestückt mit dem &amp;quot;Fastrax GPS antenna module&amp;quot; [https://www.u-blox.com/de/positioning-antennas/gnss-antenna-modules/uc530.html UC530]. Als Backup-Batterie dient eine wieder aufladbare Lithium-Batterie ([http://www.farnell.com/datasheets/321180.pdf MS621FE]). Zur Kommunikation zwischen dem UC530 und dem I2C-Bus ist ein [http://www.atmel.com/Images/Atmel-8303-8-bit-AVR-Microcontroller-tinyAVR-ATtiny1634_Datasheet.pdf ATtiny1634] an Bord, der auch die Auswertung des [http://de.wikipedia.org/wiki/NMEA_0183 NMEA Protokolls] übernimmt. Die 3,3 V Versorgungsspannung wird auf der Platine durch einen Spannungsregler ([http://www.mouser.com/ds/2/405/lm3480-316799.pdf LM3480IM3-3.3]) erzeugt. Über den I2C-Bus können folgende Daten der NMEA-0183 Datensätze GGA, RMC, GSA und VTG auf einfache Weise gelesen werden:&lt;br /&gt;
&lt;br /&gt;
* Geograf. Breite&lt;br /&gt;
* Geograf. Länge&lt;br /&gt;
* GPS Status&lt;br /&gt;
* HDOP&lt;br /&gt;
* Satellitenzahl&lt;br /&gt;
* Kurs&lt;br /&gt;
* Geschwindigkeit&lt;br /&gt;
* Höhe&lt;br /&gt;
* UTC-Zeit&lt;br /&gt;
* Datum&lt;br /&gt;
* PDOP&lt;br /&gt;
* VDOP&lt;br /&gt;
* Satellit 1..12&lt;br /&gt;
&lt;br /&gt;
Der ATtiny1634 ist natürlich vorprogrammiert, kann aber über eine vorbereitete 6-polige ISP-Schnittstelle auf der Platine auch umprogrammiert werden.&lt;br /&gt;
&lt;br /&gt;
'''Lieferumfang'''&lt;br /&gt;
* I2C GPS Empfänger&lt;br /&gt;
* CD mit Anleitung und Software-Beispielen.&lt;br /&gt;
&lt;br /&gt;
====Technische Daten====&lt;br /&gt;
* Versorgungsspannung: 5,0 V +/- 5%&lt;br /&gt;
* Stromverbrauch: &amp;lt;= 20 mA (typ.)&lt;br /&gt;
* I2C-Bus Geschwindigkeit: &amp;lt;= 400 kHz&lt;br /&gt;
* GPS Antenne: eingebaut&lt;br /&gt;
* Backup Batterie: Lithium, im Betrieb wieder aufladbar&lt;br /&gt;
* Temperatur Bereich: -10 bis 65 °C&lt;br /&gt;
* Form Faktor: 38 x 23 mm&lt;br /&gt;
* Gewicht: ca. 6 g&lt;br /&gt;
* Empfänger Spezifikationen (UC530):&lt;br /&gt;
** Empfänger: GPS L1 C/A-Code, SPS&lt;br /&gt;
** Kanäle: 66/22 (Suche/Track)&lt;br /&gt;
** Tracking Empfindlichkeit: -165 dBm typ.&lt;br /&gt;
** Navigations Empfindlichkeit: -148 dbm typ (Kaltstart)&lt;br /&gt;
** Update Rate: 1 Sek.&lt;br /&gt;
** Positions Genauigkeit:&lt;br /&gt;
*** 3,0m (67%) typ. horizontal&lt;br /&gt;
*** 5,0m (67%) typ. vertikal&lt;br /&gt;
*** 0,02 m/s (50%) typ. Geschwindigkeit&lt;br /&gt;
** Zeit bis zum ersten Fix: typ. 31 Sek.&lt;br /&gt;
** Protokoll: NMEA-0183 Rev. 3.01&lt;br /&gt;
&lt;br /&gt;
====Anschluss-Schema====&lt;br /&gt;
Belegung des 9-poligen Anschluss-Steckers (K1) siehe in [[RP6_Sensor_Board_und_Xtra_Module#I2C-MODULE|dieser]] Tabelle!&lt;br /&gt;
&lt;br /&gt;
====Umbau-Optionen====&lt;br /&gt;
Wenn man den ATtiny1634 selbst programmieren will, muss man Stiftleisten auf die Platine löten.&lt;br /&gt;
&lt;br /&gt;
Man braucht dazu: &lt;br /&gt;
* 2-reihige Stiftleiste RM 2,54mm (z.B. 2x40-polig 741306) &lt;br /&gt;
&lt;br /&gt;
Man trennt von der 2-reihigen Stiftleiste 2x3 Kontakte ab und lötet sie auf die Punkte &amp;quot;ISP6&amp;quot;.&lt;br /&gt;
Mit einem ISP-Programmer kann dann eine neue Firmware geflasht werden. Die aktuelle Firmware des ATtiny1634 (Version 1.2) wird als .HEX mitgeliefert, leider ohne Source-Code.&lt;br /&gt;
&lt;br /&gt;
Vorsicht: Dabei kann der Prozessor im schlimmsten Fall nicht mehr ansprechbar sein oder der GPS Empfänger UC530 beschädigt werden. Man sollte diesen Umbau und die ISP-Programmierung nur machen, wenn man genau weiß, was man macht! &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Gyro Modul JM3-GYRO===&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_Gyro_Modul.JPG|RP6 Gyro Modul|right|200px]]&lt;br /&gt;
&lt;br /&gt;
(Laut Online-Katalog der Firma CONRAD!)&lt;br /&gt;
&lt;br /&gt;
''&amp;quot;Das universelle Gyro-Sensor Modul für RP6, RP6 V2, RP6 ATMEGA32 und das RP6 V2 Control M256 Wifi-Kit ist ideal zur Erkennung der Blockierung des Roboters in seiner Drehbewegung, sowie der Stabilisierung der Geradeausfahrt.&amp;quot;''&lt;br /&gt;
&lt;br /&gt;
====Beschreibung====&lt;br /&gt;
Das Gyro Modul ist eine kleine (19 x 17 mm) Zusatzplatine (RP6 Xtra Modul), die im RP6-System genutzt werden kann. Es gibt zwar keinen direkt passenden &amp;quot;Steckplatz&amp;quot; auf einer der Microcontroller-Plattformen (RP6v2, M32, M128, M256 Wifi), jedoch ist der Anschluß einfach:&lt;br /&gt;
Benötigt werden +5V und GND, sowie ein freier ADC-Kanal, der bis 5V messen kann. Damit kann das Gyro Modul sehr universell eingesetzt werden. Es misst die Drehrate um die Z-Achse (Hochachse oder Yaw).&lt;br /&gt;
&lt;br /&gt;
Die Platine ist bestückt mit dem analogen Gyro-Sensor [http://www.st.com/web/en/resource/technical/document/datasheet/CD00254111.pdf LY330ALH], dessen Ausgangsspannung durch zwei OP-Amps ([http://www.ti.com.cn/cn/lit/ds/symlink/lm321.pdf LM321], [http://www.produktinfo.conrad.com/datenblaetter/00000-24999/001072615-da-01-en-IC_AMP_PREC_LMP7731MF_NOPB_SOT_23_5_TID.pdf LMP7731MF]) in Ruhe bei 2,5 V liegt. Höhere Ausgangsspannungen (bis 5 V) bedeuten eine Drehgeschwindigkeit nach LINKS, niedrigere (bis 0 V) eine Drehgeschwindigkeit nach RECHTS. Die 3,3 V Versorgungsspannung des LY330ALH wird auf der Platine durch einen Spannungsregler ([http://www.mouser.com/ds/2/405/lm3480-316799.pdf LM3480IM3-3.3]) erzeugt.&lt;br /&gt;
&lt;br /&gt;
'''Lieferumfang'''&lt;br /&gt;
* Gyro Modul&lt;br /&gt;
* CD mit Anleitung und Software-Beispielen.&lt;br /&gt;
&lt;br /&gt;
====Technische Daten====&lt;br /&gt;
&lt;br /&gt;
* VDD: 5,0 V +/- 5%&lt;br /&gt;
* Vout(0): 2,5 V +/- 2% (ohne Bewegung)&lt;br /&gt;
* Vout: Vout(0) + 10mV / dps +/- 2%&lt;br /&gt;
* Messbereich: ca. 200 dps max.&lt;br /&gt;
&lt;br /&gt;
====Anschluss-Schema====&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_Gyro_Modul_SP.JPG|RP6 Gyro Modul - Anschluss-Schema]]&lt;br /&gt;
&lt;br /&gt;
====Umbau-Optionen====&lt;br /&gt;
Am Gyro Modul gibt es nichts umzubauen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===3D Accelerometer Modul JM3-3DA===&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_3D_Accelerometer_Modul.JPG|RP6 3D Accelerometer Modul|right|105px]]&lt;br /&gt;
&lt;br /&gt;
(Laut Online-Katalog der Firma CONRAD!)&lt;br /&gt;
&lt;br /&gt;
''&amp;quot;Universeller 3-Achsen Beschleunigungssensor für RP6, RP6 V2, RP6 ATMEGA32 und das RP6 V2 Control M256 WIFI-Kit. Ideal zur Winkelmessung (Neigung-, Kipp-Winkel) und vieles mehr.&amp;quot;''&lt;br /&gt;
&lt;br /&gt;
====Beschreibung====&lt;br /&gt;
&lt;br /&gt;
Das 3D Accelerometer Modul ist eine kleine (15 x 10 mm) Zusatzplatine (RP6 Xtra Modul), die direkt auf den EEPROM-Sockel (IC5) der Zusatzplatine [[RP6#RP6_CONTROL_M32_Platine|RP6 CONTROL M32]] gesteckt und über den SPI-Bus angesteuert werden kann. Das Accelerometer Modul kann aber auch mit allen Microcontroller-Plattformen betrieben werden, die eine stabilisierte 5V-Versorgungsspannung und einen SPI- oder I2C-Bus bieten.&lt;br /&gt;
&lt;br /&gt;
Die Platine ist bestückt mit dem 3D Beschleunigungs-Sensor [http://www.farnell.com/datasheets/1691680.pdf LIS302DLH]. Die 3,3 V Versorgungsspannung des LIS302DLH wird auf der Platine durch einen Spannungsregler ([http://www.mouser.com/ds/2/405/lm3480-316799.pdf LM3480IM3-3.3]) erzeugt.&lt;br /&gt;
&lt;br /&gt;
'''Lieferumfang'''&lt;br /&gt;
* 3D Accelerometer Modul&lt;br /&gt;
* CD mit Anleitung und Software-Beispielen.&lt;br /&gt;
&lt;br /&gt;
====Technische Daten====&lt;br /&gt;
&lt;br /&gt;
* VDD: 5,0 V +/- 5%&lt;br /&gt;
* Messbereiche: +-2 g, +-4 g, +-8 g&lt;br /&gt;
* Datenausgabe: 16 Bit&lt;br /&gt;
* Schnittstellen: I2C, SPI&lt;br /&gt;
&lt;br /&gt;
====Anschluss-Schema====&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_3D_Accelerometer_Modul_SP.JPG|RP6 3D Accelerometer Modul - Anschluss-Schema|350px]]&lt;br /&gt;
&lt;br /&gt;
====Umbau-Optionen====&lt;br /&gt;
&lt;br /&gt;
[[Bild:RP6_3D_Accelerometer_Modul_M32.JPG|RP6 3D Accelerometer Modul auf der M32|right|500px]]&lt;br /&gt;
&lt;br /&gt;
'''Will man das Modul auf der M32 einsetzen, muss man auf dem 3D Accelerometer Modul die Widerstände R2 und R3 (falls vorhanden!) auslöten (siehe Anleitung zum Modul, Seiten 4/5!)''' und einen IC-Sockel an Position IC5 und einen Kondensator an Position C19 auf der M32 einlöten, siehe [[RP6#Zweites_SPI-EEPROM|hier]]!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die Abbildung rechts zeigt das 3D Accelerometer Modul auf der M32.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Programmierung==&lt;br /&gt;
In diesem Abschnitt geht es um die Programmierung der Sensoren und Aktoren auf dem [[RP6_Sensor_Board_und_Xtra_Module#RP6_Sensor_Board_3|RP6 Sensor Board]] und auf den [[RP6_Sensor_Board_und_Xtra_Module#RP6_Xtra_Module_3|Xtra Modulen]]. Die hier veröffentlichte Software baut NICHT auf die mitgelieferten C++ Software-Beispiele auf der ''&amp;quot;RP6 Robot System Xtra Modules CD-ROM&amp;quot;'' auf, sondern basiert auf Eigenentwicklungen in GCC.&lt;br /&gt;
&lt;br /&gt;
===RP6 Sensor Board===&lt;br /&gt;
Das RP6 Sensor Board RP6-JM03-61 verfügt nicht über einen eigenen Microprozessor. Daher geht es hier eigentlich nicht um die Programmierung des Sensor Boards, sondern um die Programmierung der Microcontroller-Plattform, an die das Sensor Board angeschlossen ist. In der Regel wird das die RP6 M256 WiFi Zusatzplatine sein, aber auch die RP6v2 Base steuert (als I2C-Slave) in der vorgesehenen Konfiguration gewisse Funktionen des Sensor Boards an.&lt;br /&gt;
Prinzipiell kann das Sensor Board aber auch an der RP6 CONTROL M32 (''passende Library auf Anfrage beim Autor!'') oder der RP6 CCPRO M128 Zusatzplatine betrieben werden.&lt;br /&gt;
&lt;br /&gt;
====Dokumentation====&lt;br /&gt;
Die Dokumentation zum RP6 Sensor Board befindet sich auf der mitgelieferten ''&amp;quot;RP6 Robot System Xtra Modules CD-ROM&amp;quot;''.&lt;br /&gt;
&lt;br /&gt;
=====Manuals=====&lt;br /&gt;
Das Handbuch kann auch [http://www.produktinfo.conrad.com/datenblaetter/00000-24999/001082384-an-01-de-RP6_SENSOR_BOARD.pdf hier] eingesehen werden.&lt;br /&gt;
 ACHTUNG: Das Manual enthält aktuell noch teils irreführende Beschreibungen!&lt;br /&gt;
&lt;br /&gt;
=====Schematics=====&lt;br /&gt;
=====Datasheets=====&lt;br /&gt;
&lt;br /&gt;
====Demo-Programmme====&lt;br /&gt;
Demo-Programme zum RP6 Sensor Board befinden sich auf der mitgelieferten ''&amp;quot;RP6 Robot System Xtra Modules CD-ROM&amp;quot;''.&lt;br /&gt;
&lt;br /&gt;
====RP6 M256 WiFi: Sensor Board Library====&lt;br /&gt;
Die nachfolgende RP6M256_Sensor_BoardLib (GCC) dient zur Ansteuerung des Sensor Boards durch die RP6M256 WiFi.&lt;br /&gt;
&lt;br /&gt;
=====Configuration Header=====&lt;br /&gt;
Vor dem Kompilieren der Library muss eine Anpassung des Configuration Headers an die eigenen Hardware-Voraussetzungen erfolgen.&lt;br /&gt;
Dazu gibt es im Configuration Header eine Definition:&lt;br /&gt;
* USE_PD5 -&amp;gt; Die Sensor Board Funktion &amp;quot;PD5&amp;quot; steuert den TCA4311A Enable Pin (EN).&lt;br /&gt;
Im nachfolgenden Listing ist die Definition USE_PD5 NICHT aktiv (d.h. der TCA4311A Enable Pin (EN) wird vom MAX7311 I/O 1.0 Pin angesteuert!). Dies muss an die eigene Hardware angepaßt werden. Wenn &amp;quot;PD5&amp;quot; den TCA4311A Enable Pin (EN) steuern soll, muss die Zeile mit &amp;quot;USE_PD5&amp;quot; &amp;quot;aktiviert&amp;quot; werden. Dazu entfernt man &amp;quot;//&amp;quot; am Zeilenanfang:&lt;br /&gt;
 #define USE_PD5&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Bevor man Beschleunigungs-, Magnetfeldsensor und Gyroskop nutzen kann, muss man sie kalibrieren:&lt;br /&gt;
&lt;br /&gt;
* '''Accelerometer:'''&lt;br /&gt;
** Die X-Achse wird kalibriert, indem man den RP6 mit der rechten Seite nach unten hält und den Maximalwert in MAX_X_A einträgt. Dann neigt man ihn auf seine linke Seite und trägt den negativen Maximalwert in MIN_X_A ein.&lt;br /&gt;
** Die Y-Achse wird kalibriert, indem man den RP6 mit der Vorderseite nach oben hält und den Maximalwert in MAX_Y_A einträgt. Dann kippt man die Vorderseite nach unten und trägt den negativen Maximalwert in MIN_Y_A ein.&lt;br /&gt;
** Die Z-Achse wird kalibriert, indem man den RP6 normal waagerecht hält und den Maximalwert in MAX_Z_A einträgt. Dann dreht man den RP6 &amp;quot;auf den Kopf&amp;quot; und trägt den negativen Maximalwert in MIN_Z_A ein.&lt;br /&gt;
** Sollten die angezeigten Pitch- und Roll-Werte nach der Kalibrierung der Achsen und genau waagerecht stehendem Sensor bzw. RP6 vom Nullwert deutlich abweichen, kann man sie mithilfe der Definitionen OFFSET_PITCH_A und OFFSET_ROLL_A &amp;quot;nullen&amp;quot;. Die Einheit dieser Definitionen ist °.&lt;br /&gt;
 ''HINWEIS: Die internen Berechnungen werden durch diese Offset-Korrektur&lt;br /&gt;
 NICHT beeinflußt. Die Offset-Werte können also nicht dazu benutzt werden,&lt;br /&gt;
 eine Achsenabweichung zwischen Sensor und RP6 zu kompensieren!''&lt;br /&gt;
* '''Magnetometer:'''&lt;br /&gt;
** Zur Kalibrierung des Magnetfeldsensors stellt man den RP6 auf eine waagerechte Fläche. Es dürfen keine Elektrogeräte, Metallteile und stromführende Leitungen in der Nähe sein, die das Magnetfeld verändern können.&lt;br /&gt;
** Zunächst ist es möglich, die sogenannten &amp;quot;hard iron&amp;quot; Effekte auszugleichen. Dies sind feste Magnetfeldabweichungen, die durch das &amp;quot;Gerät&amp;quot; (in unserem Fall also durch den kompletten RP6) verursacht werden, in oder auf dem der Sensor angebracht ist. Mit den Definitionen OFFSET_X_M, OFFSET_Y_M und OFFSET_Z_M können diese Effekte ausgeglichen werden. Diese Kalibrierung wird hier aktuell (noch) nicht beschrieben, so dass man die Werte für diese Definitionen zunächst bei 0 belassen sollte.&lt;br /&gt;
** Die X-Achse und Y-Achse wird kalibriert, indem man den RP6 langsam mehrfach um die eigene (Z-)Achse dreht und die Maximalwerte in MAX_X_M und MAX_Y_M einträgt. Die negativen Maximalwerte trägt man in MIN_X_M und MIN_Y_M ein.&lt;br /&gt;
** Die Z-Achse wird kalibriert, indem man den RP6 auf die rechte oder linke Seite legt, ihn dann langsam mehrfach auf der Stelle (um seine Y-Achse) dreht und den Maximalwert in MAX_Z_M und den negativen Maximalwert in MIN_Z_M einträgt.&lt;br /&gt;
** Mit der Definition DECLINATION_M kann man zur Verbesserung der Genauigkeit der Richtungsangaben den magnetischen Deklinationswert [°] (d.h. die magnetische Missweisung) am aktuellen Standort festlegen. [http://www.ngdc.noaa.gov/geomag-web/#declination Hier] befindet sich ein &amp;quot;Deklinations-Rechner&amp;quot;, mit dem man den Deklinationswert für den eigenen Standort ermitteln kann. &lt;br /&gt;
** Wenn man den Temperaturwert des LSM303DLHC nutzen will, muss man die Definition GET_TEMP_M aktivieren (Standard!). Den Temperaturwert kann man noch eichen, indem man die Definition OFFSET_TEMP_M anpasst. Die Einheit von OFFSET_TEMP_M ist °C.&lt;br /&gt;
* '''Gyroskop:'''&lt;br /&gt;
** In Ruhelage des RP6 wird ein ADC-Wert von ca. 511 angezeigt, wenn die Definition ADCVAL_ZERORATE_LEVEL im Configuration Header (RP6M256_Sensor_Board.h) vor der ersten Kompilierung zunächst auf 0 gesetzt wurde. Die Kalibrierung des Gyroskops ist abgeschlossen, nachdem man den in Ruhelage angezeigten ADC-Wert als ADCVAL_ZERORATE_LEVEL eingetragen hat.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''HINWEISE ZUR KALIBRIERUNG:'''&lt;br /&gt;
* Das Demo-Programm ist nicht sehr gut geeignet, um die Kalibrierungen durchzuführen.&lt;br /&gt;
* Man sollte mit einem eigenen kurzen ''Kalibrierungs-Programm'' nur die Rohwerte der jeweiligen X-, Y- und Z-Achse z.B. zweimal pro Sekunde ausgeben.&lt;br /&gt;
* Die Rohwerte sind in Variablen x_axis..., y_axis..., z_axis... enthalten. Da die Rohwerte in den Funktionen normalizeLSM303DLHC_A() bzw. normalizeLSM303DLHC_M() ggf. verändert werden, müssen die Rohwerte VOR Durchlaufen dieser Funktionen ausgegeben werden.&lt;br /&gt;
* '''Ohne eine sorgfältige Kalibrierung wird die Kompass-Funktion (insbesondere die neigungskompensierte Ausgabe der Himmelsrichtung) nicht funktionieren!'''&lt;br /&gt;
* Nach dem Eintragen der Kalibrierungs-Werte in den Configuration Header (RP6M256_Sensor_Board.h) muss die ''Demo'' neu kompiliert werden. Vorher sollten die Compiler-Hilfsdateien der Sensor Board-Library (Dateiendungen .st und .o) im Programmverzeichnis gelöscht werden.&lt;br /&gt;
* Getestet wird das Ergebnis der Kalibrierung, indem die Ausgabewerte (Temperatur, Pitch, Roll, Heading, Neigungs-kompensiertes Heading) der ''Demo'' überprüft werden. Dazu kann man Vergleichswerte (Thermometer, Winkelmesser für Pitch, Roll und externer Kompass für Heading) heranziehen.&lt;br /&gt;
* Wenn die Ausgabewerte nicht den Erwartungen entsprechen, muss die Kalibrierung wiederholt werden.&lt;br /&gt;
* Eine Kalibrierung der Sensoren ist nur zuverlässig, solange die Position des jeweiligen Sensors und seine komplette Hardware-Umgebung (also der RP6 mit allen seinen Teilen!) nicht verändert wird. Gibt es trotzdem Veränderungen, z.B. durch weitere Aufbauten auf dem RP6, müssen diese Sensoren neu kalibriert werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Datei: RP6M256_Sensor_Board.h&lt;br /&gt;
&amp;lt;pre&amp;gt;/* ****************************************************************************&lt;br /&gt;
 *                           _______________________&lt;br /&gt;
 *                           \| RP6  ROBOT SYSTEM |/&lt;br /&gt;
 *                            \_-_-_-_-_-_-_-_-_-_/           &amp;gt;&amp;gt;&amp;gt; RP6 M256 WIFI&lt;br /&gt;
 * ----------------------------------------------------------------------------&lt;br /&gt;
 * ----------------------------- [c]2014 - Dirk -------------------------------&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * File: RP6M256_Sensor_Board.h&lt;br /&gt;
 * Version: 1.0&lt;br /&gt;
 * Target: RP6 M256 WIFI - ATMEGA2560 @16.00MHz&lt;br /&gt;
 * Author(s): Dirk&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Description:&lt;br /&gt;
 * Configuration header file for new RP6 Sensor Board library.&lt;br /&gt;
 * The RP6 Sensor Board (CONRAD 1082384) is connected to the RP6M256 with the&lt;br /&gt;
 * two plugs:&lt;br /&gt;
 *   Sensor Board &amp;lt;---&amp;gt; RP6M256&lt;br /&gt;
 *   --------------------------------&lt;br /&gt;
 *   I/O (K17)    &amp;lt;---&amp;gt; IO_PWM/T0/T1&lt;br /&gt;
 *   ADC (K18)    &amp;lt;---&amp;gt; ADC_IO2/CMP&lt;br /&gt;
 * The RP6 Sensor Board function &amp;quot;PD5&amp;quot; (IC6: EN) is now connected to RP6M256&lt;br /&gt;
 * OC1B (PB6) and the RP6 Sensor Board function &amp;quot;ADC4&amp;quot; (SHARP_R) to RP6M256&lt;br /&gt;
 * ADC9 (PK1).&lt;br /&gt;
 * On the RP6 Sensor Board the functions &amp;quot;ADC0&amp;quot;, &amp;quot;ADC1&amp;quot;, &amp;quot;PWR&amp;quot; and &amp;quot;ADC4&amp;quot; are&lt;br /&gt;
 * connected to the USRBUS. The USRBUS may be wired on the RP6 mainboard like&lt;br /&gt;
 * this:&lt;br /&gt;
 *   Function : Sensor Board - USRBUS: * &amp;lt;---&amp;gt; RP6 Mainboard&lt;br /&gt;
 *   --------------------------------------------------------&lt;br /&gt;
 *   SHARP_F  : &amp;quot;ADC0&amp;quot;       - Pin 1     &amp;lt;---&amp;gt; ADC0: Pin 3&lt;br /&gt;
 *   GYRO     : &amp;quot;ADC1&amp;quot;       - Pin 2     &amp;lt;---&amp;gt; ADC1: Pin 3&lt;br /&gt;
 *   PWRON ²  : &amp;quot;PWR&amp;quot;        - Pin 3     &amp;lt;---&amp;gt; PWR&lt;br /&gt;
 *   SHARP_R  : &amp;quot;ADC4&amp;quot;       - Pin 5     &amp;lt;---&amp;gt; Not connected!&lt;br /&gt;
 * At *) It is also possible not to use the USRBUS, but to connect the RP6&lt;br /&gt;
 *       Sensor Board directly to the RP6 mainboard with 3 single cables.&lt;br /&gt;
 * At ²) See RP6 manual &amp;quot;4.6.8. Stromsparfunktionen&amp;quot;! &lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
#ifndef RP6M256_SENSOR_BOARD_H&lt;br /&gt;
#define RP6M256_SENSOR_BOARD_H&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// RP6 Sensor Board hardwired components:&lt;br /&gt;
// - I2C I/O Port Expander (MAX7311)&lt;br /&gt;
// - I2C Real Time Clock (RTC DS1339)&lt;br /&gt;
// - I2C Temperature Sensor (LM75B)&lt;br /&gt;
// - I2C Servo Controller (PCA9685)&lt;br /&gt;
// - I2C LED Driver (TCA6507)&lt;br /&gt;
// - I2C 3D Magnetometer &amp;amp; Accelerometer (LSM303DLHC)&lt;br /&gt;
// - Analog Yaw-Rate Gyroscope (LY330ALH)&lt;br /&gt;
// - Hot Swappable 2-Wire Bus Buffer (TCA4311A)&lt;br /&gt;
// - Button&lt;br /&gt;
// - Status LED&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C I/O Port Expander (MAX7311):&lt;br /&gt;
#define I2C_SENSOR_PORTEXP_ADR			0x40	// Default&lt;br /&gt;
&lt;br /&gt;
// Interrupt I/O portpin definitions (RP6M256):&lt;br /&gt;
#define IO_SENSOR_INT1_IN				INT1_PI12 // PCINT12 PJ3  XBUS Pin 8&lt;br /&gt;
#define IO_SENSOR_INT1_DDR				DDRJ&lt;br /&gt;
#define IO_SENSOR_INT1_PIN				PINJ&lt;br /&gt;
#define IO_SENSOR_INT1_PORT				PORTJ&lt;br /&gt;
#define IO_SENSOR_INT2_IN				INT2_PI15 // PCINT15 PJ6  XBUS Pin 11&lt;br /&gt;
#define IO_SENSOR_INT2_DDR				DDRJ&lt;br /&gt;
#define IO_SENSOR_INT2_PIN				PINJ&lt;br /&gt;
#define IO_SENSOR_INT2_PORT				PORTJ&lt;br /&gt;
#define IO_SENSOR_INT3_IN				INT3_PI14 // PCINT14 PJ5  XBUS Pin 9&lt;br /&gt;
#define IO_SENSOR_INT3_DDR				DDRJ&lt;br /&gt;
#define IO_SENSOR_INT3_PIN				PINJ&lt;br /&gt;
#define IO_SENSOR_INT3_PORT				PORTJ&lt;br /&gt;
#define IO_SENSOR_INTU_IN				INTU_PI13 // PCINT13 PJ4  XBUS Pin 7&lt;br /&gt;
#define IO_SENSOR_INTU_DDR				DDRJ&lt;br /&gt;
#define IO_SENSOR_INTU_PIN				PINJ&lt;br /&gt;
#define IO_SENSOR_INTU_PORT				PORTJ&lt;br /&gt;
&lt;br /&gt;
// I/O PORT pin numbers:&lt;br /&gt;
#define PIN7							7&lt;br /&gt;
#define PIN6							6&lt;br /&gt;
#define PIN5							5&lt;br /&gt;
#define PIN4							4&lt;br /&gt;
#define PIN3							3&lt;br /&gt;
#define PIN2							2&lt;br /&gt;
#define PIN1							1&lt;br /&gt;
#define PIN0							0&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Real Time Clock (RTC DS1339):&lt;br /&gt;
#define I2C_SENSOR_RTC_ADR				0xd0	// Default&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Temperature Sensor (LM75B):&lt;br /&gt;
#define I2C_SENSOR_TEMP_ADR				0x90	// Default&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Servo Controller (PCA9685):&lt;br /&gt;
#define I2C_SENSOR_SERVO_ADR			0x88	// Default&lt;br /&gt;
&lt;br /&gt;
// Servo and PWM channels:&lt;br /&gt;
#define CH_SERVO_1						16		// At K6: 1  &amp;quot;SERVO_1&amp;quot;&lt;br /&gt;
#define CH_SERVO_2						15		// At K11: 1 &amp;quot;SERVO_2&amp;quot;&lt;br /&gt;
#define CH_SERVO_3						13		// At K29: 1 &amp;quot;SERVO_3&amp;quot;&lt;br /&gt;
#define CH_SERVO_4						14		// At K30: 1 &amp;quot;SERVO_4&amp;quot;&lt;br /&gt;
#define CH_SERVO_5						11		// At K31: 1 &amp;quot;SERVO_5&amp;quot;&lt;br /&gt;
#define CH_SERVO_6						12		// At K32: 1 &amp;quot;SERVO_6&amp;quot;&lt;br /&gt;
#define CH_SERVO_7						9		// At K33: 1 &amp;quot;SERVO_7&amp;quot;&lt;br /&gt;
#define CH_SERVO_8						10		// At K34: 1 &amp;quot;SERVO_8&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#define CH_PWM_OUT_1					1		// At K12: 1 &amp;quot;PWM_OUT&amp;quot;&lt;br /&gt;
#define CH_PWM_OUT_2					2		// At K12: 2&lt;br /&gt;
#define CH_PWM_OUT_3					3		// At K12: 3&lt;br /&gt;
#define CH_PWM_OUT_4					4		// At K12: 4&lt;br /&gt;
#define CH_PWM_OUT_5					5		// At K12: 5&lt;br /&gt;
#define CH_PWM_OUT_6					6		// At K12: 6&lt;br /&gt;
#define CH_PWM_OUT_7					7		// At K12: 7&lt;br /&gt;
#define CH_PWM_OUT_8					8		// At K12: 8&lt;br /&gt;
&lt;br /&gt;
// Servo left touch (LT), right touch (RT), middle position (MP) constants:&lt;br /&gt;
// (Hints: - Servo impulse length [ms] = Servo position value / 204.8&lt;br /&gt;
//           (Formula only valid for a PWM of 50 Hz!)&lt;br /&gt;
//         - Min. servo impulse (0,7 ms) = Servo position 143&lt;br /&gt;
//         - Mid. servo impulse (1,5 ms) = Servo position 307&lt;br /&gt;
//         - Max. servo impulse (2,3 ms) = Servo position 471&lt;br /&gt;
//         - !!! You should NOT use servo position values &amp;lt; 143 or &amp;gt; 471 !!!)&lt;br /&gt;
#define SERVO1_LT						205		// Servo impulse ~1ms&lt;br /&gt;
#define SERVO1_RT						410		// Servo impulse ~2ms&lt;br /&gt;
#define SERVO1_MP						((SERVO1_RT - SERVO1_LT) / 2 + SERVO1_LT)&lt;br /&gt;
#define SERVO2_LT						205&lt;br /&gt;
#define SERVO2_RT						410&lt;br /&gt;
#define SERVO2_MP						((SERVO2_RT - SERVO2_LT) / 2 + SERVO2_LT)&lt;br /&gt;
#define SERVO3_LT						205&lt;br /&gt;
#define SERVO3_RT						410&lt;br /&gt;
#define SERVO3_MP						((SERVO3_RT - SERVO3_LT) / 2 + SERVO3_LT)&lt;br /&gt;
#define SERVO4_LT						205&lt;br /&gt;
#define SERVO4_RT						410&lt;br /&gt;
#define SERVO4_MP						((SERVO4_RT - SERVO4_LT) / 2 + SERVO4_LT)&lt;br /&gt;
#define SERVO5_LT						205&lt;br /&gt;
#define SERVO5_RT						410&lt;br /&gt;
#define SERVO5_MP						((SERVO5_RT - SERVO5_LT) / 2 + SERVO5_LT)&lt;br /&gt;
#define SERVO6_LT						205&lt;br /&gt;
#define SERVO6_RT						410&lt;br /&gt;
#define SERVO6_MP						((SERVO6_RT - SERVO6_LT) / 2 + SERVO6_LT)&lt;br /&gt;
#define SERVO7_LT						205&lt;br /&gt;
#define SERVO7_RT						410&lt;br /&gt;
#define SERVO7_MP						((SERVO7_RT - SERVO7_LT) / 2 + SERVO7_LT)&lt;br /&gt;
#define SERVO8_LT						205&lt;br /&gt;
#define SERVO8_RT						410&lt;br /&gt;
#define SERVO8_MP						((SERVO8_RT - SERVO8_LT) / 2 + SERVO8_LT)&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C LED Driver (TCA6507):&lt;br /&gt;
#define I2C_SENSOR_LEDDRIVER_ADR		0x8a	// Default&lt;br /&gt;
&lt;br /&gt;
// LED numbers:&lt;br /&gt;
#define LED0							0		// At K7&lt;br /&gt;
#define DISPLAY_BACKLIGHT				0		// Display background light&lt;br /&gt;
#define LED1							1		// At K4&lt;br /&gt;
#define LED2							2		// At K2&lt;br /&gt;
#define LED3							3		// At K10: 1&lt;br /&gt;
#define BACKLIGHT_R						3		// Right backlight&lt;br /&gt;
#define LED4							4		// At K10: 2&lt;br /&gt;
#define BACKLIGHT_L						4		// Left backlight&lt;br /&gt;
#define LED5							5		// White LED (D3)&lt;br /&gt;
#define HEADLIGHT_R						5		// Right headlight&lt;br /&gt;
#define LED6							6		// White LED (D1)&lt;br /&gt;
#define HEADLIGHT_L						6		// Left headlight&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C 3D Magnetometer &amp;amp; Accelerometer (LSM303DLHC):&lt;br /&gt;
&lt;br /&gt;
// LSM303DLHC accelerometer:&lt;br /&gt;
#define I2C_SENSOR_LSM303DLHC_A_ADR 	0x32	// Default&lt;br /&gt;
&lt;br /&gt;
// LSM303DLHC accelerometer calibration data:&lt;br /&gt;
#define MAX_X_A						1037		// Max. X-axis value&lt;br /&gt;
#define MIN_X_A						-1030		// Min. X-axis value&lt;br /&gt;
#define MAX_Y_A						1030		// Max. Y-axis value&lt;br /&gt;
#define MIN_Y_A						-1019		// Min. Y-axis value&lt;br /&gt;
#define MAX_Z_A						1062		// Max. Z-axis value&lt;br /&gt;
#define MIN_Z_A						-1056		// Min. Z-axis value&lt;br /&gt;
#define OFFSET_PITCH_A				0.0			// Offset Pitch [°]&lt;br /&gt;
#define OFFSET_ROLL_A				0.0			// Offset Roll [°]&lt;br /&gt;
&lt;br /&gt;
// LSM303DLHC magnetometer:&lt;br /&gt;
#define I2C_SENSOR_LSM303DLHC_M_ADR		0x3c	// Default&lt;br /&gt;
&lt;br /&gt;
// LSM303DLHC magnetometer calibration data:&lt;br /&gt;
#define MAX_X_M						-111.0		// Max. X-axis value&lt;br /&gt;
#define MIN_X_M						-634.0		// Min. X-axis value&lt;br /&gt;
#define OFFSET_X_M					0			// Hard iron X-axis offset&lt;br /&gt;
#define MAX_Y_M						297.0		// Max. Y-axis value&lt;br /&gt;
#define MIN_Y_M						-215.0		// Min. Y-axis value&lt;br /&gt;
#define OFFSET_Y_M					0			// Hard iron Y-axis offset&lt;br /&gt;
#define MAX_Z_M						183.0		// Max. Z-axis value&lt;br /&gt;
#define MIN_Z_M						-214.0		// Min. Z-axis value&lt;br /&gt;
#define OFFSET_Z_M					0			// Hard iron Z-axis offset&lt;br /&gt;
#define DECLINATION_M				0.0			// E at local position [°]&lt;br /&gt;
&lt;br /&gt;
// LSM303DLHC temperature sensor definitions:&lt;br /&gt;
#define GET_TEMP_M								// Enable temperature sensor&lt;br /&gt;
#define OFFSET_TEMP_M				0.0			// Temperature offset [°C]&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Analog Yaw-Rate Gyroscope (LY330ALH):&lt;br /&gt;
&lt;br /&gt;
// LY330ALH gyroscope:&lt;br /&gt;
#define ADC_SENSOR_LY330ALH				ADC_1	// At USRBUS: 2 (RP6BASE)&lt;br /&gt;
&lt;br /&gt;
// LY330ALH gyroscope calibration data:&lt;br /&gt;
// (Higher values [505..1023] mean an angular velocity while rotating LEFT&lt;br /&gt;
//  and lower values [503..0] while rotating RIGHT!)&lt;br /&gt;
#define ADCVAL_MINRATE					0		// Min. rate value&lt;br /&gt;
#define ADCVAL_ZERORATE_LEVEL			504		// Zero rate level&lt;br /&gt;
#define ADCVAL_MAXRATE					1023	// Max. rate value&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Hot Swappable 2-Wire Bus Buffer (TCA4311A):&lt;br /&gt;
&lt;br /&gt;
// Define USE_PD5, if you want to control the TCA4311A enable pin (EN) with&lt;br /&gt;
// the RP6 Sensor Board function &amp;quot;PD5&amp;quot;. If USE_PD5 is NOT defined (default),&lt;br /&gt;
// the TCA4311A EN pin is controlled by the MAX7311 I/O 1.0 pin.&lt;br /&gt;
// ---------------&lt;br /&gt;
//#define USE_PD5&lt;br /&gt;
// ---------------&lt;br /&gt;
&lt;br /&gt;
#define IO_SENSOR_TCA4311A_EN_IN		OC1B_PI6 // At I/O: 9 (RP6M256)&lt;br /&gt;
#define IO_SENSOR_TCA4311A_EN_DDR		DDRB&lt;br /&gt;
#define IO_SENSOR_TCA4311A_EN_PIN		PINB&lt;br /&gt;
#define IO_SENSOR_TCA4311A_EN_PORT		PORTB&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Button:&lt;br /&gt;
&lt;br /&gt;
// (Button is connected to I/O 1.7 of the MAX7311!)&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Status LED:&lt;br /&gt;
&lt;br /&gt;
// (Status LED is connected to I/O 1.6 of the MAX7311!)&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Other ADC channel definitions:&lt;br /&gt;
&lt;br /&gt;
// (Depending on connections on the RP6 Sensor Board!)&lt;br /&gt;
#define ADC_SENSOR_SHARP_F				ADC_0	// At USRBUS: 1 (RP6BASE)&lt;br /&gt;
#define ADC_SENSOR_SHARP_R				ADC_9	// At ADC: 3    (RP6M256)&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
/******************************************************************************&lt;br /&gt;
 * Additional info&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Changelog:&lt;br /&gt;
 * &lt;br /&gt;
 *  ---&amp;gt; changes are documented in the file &amp;quot;RP6M256_Sensor_BoardLib.c&amp;quot;&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=====Library Header=====&lt;br /&gt;
Datei: RP6M256_Sensor_BoardLib.h&lt;br /&gt;
&amp;lt;pre&amp;gt;/* ****************************************************************************&lt;br /&gt;
 *                           _______________________&lt;br /&gt;
 *                           \| RP6  ROBOT SYSTEM |/&lt;br /&gt;
 *                            \_-_-_-_-_-_-_-_-_-_/           &amp;gt;&amp;gt;&amp;gt; RP6 M256 WIFI&lt;br /&gt;
 * ----------------------------------------------------------------------------&lt;br /&gt;
 * ----------------------------- [c]2014 - Dirk -------------------------------&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * File: RP6M256_Sensor_BoardLib.h&lt;br /&gt;
 * Version: 1.0&lt;br /&gt;
 * Target: RP6 M256 WIFI - ATMEGA2560 @16.00MHz&lt;br /&gt;
 * Author(s): Dirk&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Description:&lt;br /&gt;
 * Header file for new RP6 Sensor Board library.&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
#ifndef RP6M256_SENSOR_BOARDLIB_H&lt;br /&gt;
#define RP6M256_SENSOR_BOARDLIB_H&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// RP6 Sensor Board hardwired components:&lt;br /&gt;
// - I2C I/O Port Expander (MAX7311)&lt;br /&gt;
// - I2C Real Time Clock (RTC DS1339)&lt;br /&gt;
// - I2C Temperature Sensor (LM75B)&lt;br /&gt;
// - I2C Servo Controller (PCA9685)&lt;br /&gt;
// - I2C LED Driver (TCA6507)&lt;br /&gt;
// - I2C 3D Magnetometer &amp;amp; Accelerometer (LSM303DLHC)&lt;br /&gt;
// - Analog Yaw-Rate Gyroscope (LY330ALH)&lt;br /&gt;
// - Hot Swappable 2-Wire Bus Buffer (TCA4311A)&lt;br /&gt;
// - Button&lt;br /&gt;
// - Status LED&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Includes:&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6M256Lib.h&amp;quot;&lt;br /&gt;
#include &amp;quot;RP6I2CmasterTWI.h&amp;quot;&lt;br /&gt;
#include &amp;quot;RP6M256_Sensor_Board.h&amp;quot;&lt;br /&gt;
#include &amp;lt;math.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// RP6M256_I2CMasterLib definitions:&lt;br /&gt;
&lt;br /&gt;
#ifndef I2C_RP6_BASE_ADR&lt;br /&gt;
	#define I2C_RP6_BASE_ADR			10&lt;br /&gt;
#endif&lt;br /&gt;
#ifndef I2C_REG_ADC_ADC0_L&lt;br /&gt;
	#define I2C_REG_ADC_ADC0_L			23&lt;br /&gt;
#endif&lt;br /&gt;
#ifndef I2C_REG_ADC_ADC1_L&lt;br /&gt;
	#define I2C_REG_ADC_ADC1_L			25&lt;br /&gt;
#endif&lt;br /&gt;
#ifndef CMD_POWER_OFF&lt;br /&gt;
	#define CMD_POWER_OFF				0&lt;br /&gt;
#endif&lt;br /&gt;
#ifndef CMD_POWER_ON&lt;br /&gt;
	#define CMD_POWER_ON				1&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C I/O Port Expander (MAX7311):&lt;br /&gt;
&lt;br /&gt;
// Registers:&lt;br /&gt;
#define MAX7311_INPUT_PORT1				0&lt;br /&gt;
#define MAX7311_INPUT_PORT2				1&lt;br /&gt;
#define MAX7311_OUTPUT_PORT1			2&lt;br /&gt;
#define MAX7311_OUTPUT_PORT2			3&lt;br /&gt;
#define MAX7311_PORT1_POL_INV			4&lt;br /&gt;
#define MAX7311_PORT2_POL_INV			5&lt;br /&gt;
#define MAX7311_PORT1_CONFIG			6&lt;br /&gt;
#define MAX7311_PORT2_CONFIG			7&lt;br /&gt;
#define MAX7311_TIMEOUT					8&lt;br /&gt;
&lt;br /&gt;
// Port 1 configuration register bitmasks:&lt;br /&gt;
#define ST_GYRO							(1 &amp;lt;&amp;lt; PIN7)	// I/O 0.7 (Output)&lt;br /&gt;
#define PD_GYRO							(1 &amp;lt;&amp;lt; PIN6)	// I/O 0.6 (Output)&lt;br /&gt;
#define PWR_CAM_IF						(1 &amp;lt;&amp;lt; PIN5)	// I/O 0.5 (Output)&lt;br /&gt;
#define EN_LEDDRIV						(1 &amp;lt;&amp;lt; PIN4)	// I/O 0.4 (Output)&lt;br /&gt;
#define RDY_BUSBUFF						(1 &amp;lt;&amp;lt; PIN3)	// I/O 0.3 (Input)&lt;br /&gt;
#define PWR_SHARP_R						(1 &amp;lt;&amp;lt; PIN2)	// I/O 0.2 (Output)&lt;br /&gt;
#define PWR_SHARP_F						(1 &amp;lt;&amp;lt; PIN1)	// I/O 0.1 (Output)&lt;br /&gt;
#define PWR_I2C							(1 &amp;lt;&amp;lt; PIN0)	// I/O 0.0 (Output)&lt;br /&gt;
&lt;br /&gt;
// Port 2 configuration register bitmasks:&lt;br /&gt;
#define IO2_I2C							(1 &amp;lt;&amp;lt; PIN7)	// I/O 1.7 (Input)&lt;br /&gt;
#define IO1_I2C							(1 &amp;lt;&amp;lt; PIN6)	// I/O 1.6 (Output)&lt;br /&gt;
#define DRDY_MAGACC						(1 &amp;lt;&amp;lt; PIN5)	// I/O 1.5 (Input)&lt;br /&gt;
#define PWR_SERVO						(1 &amp;lt;&amp;lt; PIN4)	// I/O 1.4 (Output)&lt;br /&gt;
#define OEN_SERVO						(1 &amp;lt;&amp;lt; PIN3)	// I/O 1.3 (Output)&lt;br /&gt;
#define IO_K19_1						(1 &amp;lt;&amp;lt; PIN2)	// I/O 1.2 (Input)&lt;br /&gt;
#define IO_K19_3						(1 &amp;lt;&amp;lt; PIN1)	// I/O 1.1 (Input)&lt;br /&gt;
#define EN_BUSBUFF						(1 &amp;lt;&amp;lt; PIN0)	// I/O 1.0 (Output)&lt;br /&gt;
&lt;br /&gt;
// Port 1 &amp;amp; 2 register 16-bit bitmasks:&lt;br /&gt;
// (CONFIG: 1 = Input, 0 = Output)&lt;br /&gt;
#define MAX7311_CONFIG_DEFAULT			0b1010011000001000&lt;br /&gt;
#define MAX7311_CONFIG_USE_PD5			0b1010011100001000&lt;br /&gt;
// (OUTPUT: 1 = High/True, 0 = Low/False)&lt;br /&gt;
#define MAX7311_OUTPUT_DEFAULT			0b0100000100010000&lt;br /&gt;
#define MAX7311_OUTPUT_FULLPOWER		0b0001000100110111&lt;br /&gt;
#define MAX7311_OUTPUT_SHUTDOWN			0b0100100011000000&lt;br /&gt;
&lt;br /&gt;
// Safe configuration:&lt;br /&gt;
// (Ensures if activated, that I/Os 0.3, 1.5 and 1.7 cannot be configured&lt;br /&gt;
//  as output with the function MAX7311_write_cfg(). This may protect the&lt;br /&gt;
//  RP6 Sensor Board from hardware damage.)&lt;br /&gt;
// -------------------&lt;br /&gt;
#define SAFE_CONFIG&lt;br /&gt;
// -------------------&lt;br /&gt;
&lt;br /&gt;
typedef union {&lt;br /&gt;
 	uint8_t byte;&lt;br /&gt;
	struct {&lt;br /&gt;
		unsigned int1   :1;				// INT1  XBUS Pin 8&lt;br /&gt;
		unsigned int2   :1;				// INT2  XBUS Pin 11&lt;br /&gt;
		unsigned int3   :1;				// INT3  XBUS Pin 9&lt;br /&gt;
		unsigned intu   :1;				// INTU  XBUS Pin 7&lt;br /&gt;
		unsigned unused :4;&lt;br /&gt;
	};&lt;br /&gt;
	struct {&lt;br /&gt;
		unsigned magacc1     :1;		// INT1: LSM303DLHC INT1&lt;br /&gt;
		unsigned portexp     :1;		// INT2: MAX7311 INT_N&lt;br /&gt;
		unsigned magacc2_rtc :1;		// INT3: LSM303DLHC INT2&lt;br /&gt;
		unsigned noname      :5;		//       OR DS1339 SQW/INT_N&lt;br /&gt;
	};&lt;br /&gt;
} interrupt_RP6SBstatus_t;&lt;br /&gt;
extern interrupt_RP6SBstatus_t interrupt_RP6SBstatus;&lt;br /&gt;
&lt;br /&gt;
typedef union {&lt;br /&gt;
	uint16_t word;&lt;br /&gt;
	struct {&lt;br /&gt;
		unsigned pwr_i2c     :1;		// I/O 0.0 (Output)&lt;br /&gt;
		unsigned pwr_sharp_f :1;		// I/O 0.1 (Output)&lt;br /&gt;
		unsigned pwr_sharp_r :1;		// I/O 0.2 (Output)&lt;br /&gt;
		unsigned rdy_busbuff :1;		// I/O 0.3 (Input)&lt;br /&gt;
		unsigned en_leddriv  :1;		// I/O 0.4 (Output)&lt;br /&gt;
		unsigned pwr_cam_if  :1;		// I/O 0.5 (Output)&lt;br /&gt;
		unsigned pd_gyro     :1;		// I/O 0.6 (Output)&lt;br /&gt;
		unsigned st_gyro     :1;		// I/O 0.7 (Output)&lt;br /&gt;
		unsigned en_busbuff  :1;		// I/O 1.0 (Output)&lt;br /&gt;
		unsigned io_k19_3    :1;		// I/O 1.1 (Input)&lt;br /&gt;
		unsigned io_k19_1    :1;		// I/O 1.2 (Input)&lt;br /&gt;
		unsigned oen_servo   :1;		// I/O 1.3 (Output)&lt;br /&gt;
		unsigned pwr_servo   :1;		// I/O 1.4 (Output)&lt;br /&gt;
		unsigned drdy_magacc :1;		// I/O 1.5 (Input)&lt;br /&gt;
		unsigned io1_i2c     :1;		// I/O 1.6 (Output)&lt;br /&gt;
		unsigned io2_i2c     :1;		// I/O 1.7 (Input)&lt;br /&gt;
	};&lt;br /&gt;
} max7311IOs_t;&lt;br /&gt;
extern max7311IOs_t inport;&lt;br /&gt;
extern max7311IOs_t outport;&lt;br /&gt;
extern uint8_t readyBusbuff;&lt;br /&gt;
extern uint8_t pressedButton;&lt;br /&gt;
&lt;br /&gt;
void MAX7311_write_cfg(uint16_t);&lt;br /&gt;
void task_checkINTs(void);&lt;br /&gt;
void task_RP6SensorBoard(void);&lt;br /&gt;
void MAX7311_update(void);&lt;br /&gt;
void MAX7311_write(uint16_t);&lt;br /&gt;
void MAX7311_init(void);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Real Time Clock (RTC DS1339):&lt;br /&gt;
&lt;br /&gt;
// Registers:&lt;br /&gt;
#define DS1339_SECONDS					0&lt;br /&gt;
#define DS1339_MINUTES					1&lt;br /&gt;
#define DS1339_HOURS					2&lt;br /&gt;
#define DS1339_DAY						3&lt;br /&gt;
#define DS1339_DATE						4&lt;br /&gt;
#define DS1339_MONTH_CENTURY			5&lt;br /&gt;
#define DS1339_YEAR						6&lt;br /&gt;
#define DS1339_ALARM1_SECONDS			7&lt;br /&gt;
#define DS1339_ALARM1_MINUTES			8&lt;br /&gt;
#define DS1339_ALARM1_HOURS				9&lt;br /&gt;
#define DS1339_ALARM1_DAY_DATE			10&lt;br /&gt;
#define DS1339_ALARM2_MINUTES			11&lt;br /&gt;
#define DS1339_ALARM2_HOURS				12&lt;br /&gt;
#define DS1339_ALARM2_DAY_DATE			13&lt;br /&gt;
#define DS1339_CONTROL					14&lt;br /&gt;
#define DS1339_STATUS					15&lt;br /&gt;
#define DS1339_TRICKLE_CHARGER			16&lt;br /&gt;
&lt;br /&gt;
// Control register bitmasks:&lt;br /&gt;
#define DS1339_CONTROL_DEFAULT			0		// Power on default&lt;br /&gt;
#define DS1339_CONTROL_A1IE				1&lt;br /&gt;
#define DS1339_CONTROL_A2IE				2&lt;br /&gt;
#define DS1339_CONTROL_INTCN			4&lt;br /&gt;
#define DS1339_CONTROL_RS1				8&lt;br /&gt;
#define DS1339_CONTROL_RS2				16&lt;br /&gt;
#define DS1339_CONTROL_BBSQI			32&lt;br /&gt;
#define DS1339_CONTROL_EOSC				128&lt;br /&gt;
&lt;br /&gt;
// Trickle Charger register bitmasks:&lt;br /&gt;
#define DS1339_TRICKLE_CHARGER_DEFAULT	0b10101010 // One diode, 2k resistor&lt;br /&gt;
#define DS1339_TRICKLE_CHARGER_ROUT0	1&lt;br /&gt;
#define DS1339_TRICKLE_CHARGER_ROUT1	2&lt;br /&gt;
#define DS1339_TRICKLE_CHARGER_DS0		4&lt;br /&gt;
#define DS1339_TRICKLE_CHARGER_DS1		8&lt;br /&gt;
#define DS1339_TRICKLE_CHARGER_TCS0		16&lt;br /&gt;
#define DS1339_TRICKLE_CHARGER_TCS1		32&lt;br /&gt;
#define DS1339_TRICKLE_CHARGER_TCS2		64&lt;br /&gt;
#define DS1339_TRICKLE_CHARGER_TCS3		128&lt;br /&gt;
&lt;br /&gt;
enum RTCWEEKDAYS {&lt;br /&gt;
	R_MO = 1, R_TU, R_WE, R_TH, R_FR, R_SA, R_SU&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
typedef struct {&lt;br /&gt;
	uint16_t         year;				// Year&lt;br /&gt;
	uint8_t          month;				// Month   [1..12]&lt;br /&gt;
	enum RTCWEEKDAYS weekday;			// Weekday [1..7 = R_MO..R_SU]&lt;br /&gt;
	uint8_t          day;				// Day     [1..31]&lt;br /&gt;
} rtcdate_t;&lt;br /&gt;
rtcdate_t rtc_date;&lt;br /&gt;
&lt;br /&gt;
typedef struct {&lt;br /&gt;
	uint8_t dst;						// Daylight-saving-time (time zone)&lt;br /&gt;
	uint8_t hour;						// Hour    [0..23]&lt;br /&gt;
	uint8_t minute;						// Minute  [0..59]&lt;br /&gt;
	uint8_t second;						// Second  [0..59]&lt;br /&gt;
} rtctime_t;&lt;br /&gt;
rtctime_t rtc_time;&lt;br /&gt;
&lt;br /&gt;
uint8_t BCD2DEC(uint8_t);&lt;br /&gt;
uint8_t DEC2BCD(uint8_t);&lt;br /&gt;
void DS1339_write_cfg(uint8_t);&lt;br /&gt;
void DS1339_init(void);&lt;br /&gt;
#define CALC_DST						// Time zone will be calculated&lt;br /&gt;
void DS1339_read(void);&lt;br /&gt;
void DS1339_write(void);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Temperature Sensor (LM75B):&lt;br /&gt;
&lt;br /&gt;
// Registers:&lt;br /&gt;
#define LM75B_TEMP						0&lt;br /&gt;
#define LM75B_CONF						1&lt;br /&gt;
#define LM75B_THYST						2&lt;br /&gt;
#define LM75B_TOS						3&lt;br /&gt;
&lt;br /&gt;
// Conf register bitmasks:&lt;br /&gt;
#define LM75B_CONF_DEFAULT				0		// Power on default&lt;br /&gt;
#define LM75B_CONF_SHUTDOWN				1&lt;br /&gt;
#define LM75B_CONF_OS_COMP_INT			2&lt;br /&gt;
#define LM75B_CONF_OS_POL				4&lt;br /&gt;
#define LM75B_CONF_OS_F_QUE0			8&lt;br /&gt;
#define LM75B_CONF_OS_F_QUE1			16&lt;br /&gt;
&lt;br /&gt;
extern double temperature;&lt;br /&gt;
&lt;br /&gt;
void LM75B_write_cfg(uint8_t);&lt;br /&gt;
#define LM75B_shutdown() {LM75B_write_cfg(LM75B_CONF_SHUTDOWN);}&lt;br /&gt;
#define LM75B_init() {LM75B_write_cfg(LM75B_CONF_DEFAULT);}&lt;br /&gt;
extern uint8_t temperature_low;&lt;br /&gt;
extern uint8_t temperature_high;&lt;br /&gt;
#define getTemperatureHigh() (temperature_high)&lt;br /&gt;
#define getTemperatureLow() (temperature_low)&lt;br /&gt;
void LM75B_read(void);&lt;br /&gt;
double LM75B_calculate(void);&lt;br /&gt;
double LM75B_measure(void);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Servo Controller (PCA9685):&lt;br /&gt;
&lt;br /&gt;
// Registers:&lt;br /&gt;
#define PCA9685_MODE1					0&lt;br /&gt;
#define PCA9685_MODE2					1&lt;br /&gt;
#define PCA9685_SUBADR1					2&lt;br /&gt;
#define PCA9685_SUBADR2					3&lt;br /&gt;
#define PCA9685_SUBADR3					4&lt;br /&gt;
#define PCA9685_ALLCALLADR				5&lt;br /&gt;
#define PCA9685_LED0_ON_L				6&lt;br /&gt;
#define PCA9685_LED0_ON_H				7&lt;br /&gt;
#define PCA9685_LED0_OFF_L				8&lt;br /&gt;
#define PCA9685_LED0_OFF_H				9&lt;br /&gt;
#define PCA9685_LED1_ON_L				10&lt;br /&gt;
#define PCA9685_LED1_ON_H				11&lt;br /&gt;
#define PCA9685_LED1_OFF_L				12&lt;br /&gt;
#define PCA9685_LED1_OFF_H				13&lt;br /&gt;
#define PCA9685_LED2_ON_L				14&lt;br /&gt;
#define PCA9685_LED2_ON_H				15&lt;br /&gt;
#define PCA9685_LED2_OFF_L				16&lt;br /&gt;
#define PCA9685_LED2_OFF_H				17&lt;br /&gt;
#define PCA9685_LED3_ON_L				18&lt;br /&gt;
#define PCA9685_LED3_ON_H				19&lt;br /&gt;
#define PCA9685_LED3_OFF_L				20&lt;br /&gt;
#define PCA9685_LED3_OFF_H				21&lt;br /&gt;
#define PCA9685_LED4_ON_L				22&lt;br /&gt;
#define PCA9685_LED4_ON_H				23&lt;br /&gt;
#define PCA9685_LED4_OFF_L				24&lt;br /&gt;
#define PCA9685_LED4_OFF_H				25&lt;br /&gt;
#define PCA9685_LED5_ON_L				26&lt;br /&gt;
#define PCA9685_LED5_ON_H				27&lt;br /&gt;
#define PCA9685_LED5_OFF_L				28&lt;br /&gt;
#define PCA9685_LED5_OFF_H				29&lt;br /&gt;
#define PCA9685_LED6_ON_L				30&lt;br /&gt;
#define PCA9685_LED6_ON_H				31&lt;br /&gt;
#define PCA9685_LED6_OFF_L				32&lt;br /&gt;
#define PCA9685_LED6_OFF_H				33&lt;br /&gt;
#define PCA9685_LED7_ON_L				34&lt;br /&gt;
#define PCA9685_LED7_ON_H				35&lt;br /&gt;
#define PCA9685_LED7_OFF_L				36&lt;br /&gt;
#define PCA9685_LED7_OFF_H				37&lt;br /&gt;
#define PCA9685_LED8_ON_L				38&lt;br /&gt;
#define PCA9685_LED8_ON_H				39&lt;br /&gt;
#define PCA9685_LED8_OFF_L				40&lt;br /&gt;
#define PCA9685_LED8_OFF_H				41&lt;br /&gt;
#define PCA9685_LED9_ON_L				42&lt;br /&gt;
#define PCA9685_LED9_ON_H				43&lt;br /&gt;
#define PCA9685_LED9_OFF_L				44&lt;br /&gt;
#define PCA9685_LED9_OFF_H				45&lt;br /&gt;
#define PCA9685_LED10_ON_L				46&lt;br /&gt;
#define PCA9685_LED10_ON_H				47&lt;br /&gt;
#define PCA9685_LED10_OFF_L				48&lt;br /&gt;
#define PCA9685_LED10_OFF_H				49&lt;br /&gt;
#define PCA9685_LED11_ON_L				50&lt;br /&gt;
#define PCA9685_LED11_ON_H				51&lt;br /&gt;
#define PCA9685_LED11_OFF_L				52&lt;br /&gt;
#define PCA9685_LED11_OFF_H				53&lt;br /&gt;
#define PCA9685_LED12_ON_L				54&lt;br /&gt;
#define PCA9685_LED12_ON_H				55&lt;br /&gt;
#define PCA9685_LED12_OFF_L				56&lt;br /&gt;
#define PCA9685_LED12_OFF_H				57&lt;br /&gt;
#define PCA9685_LED13_ON_L				58&lt;br /&gt;
#define PCA9685_LED13_ON_H				59&lt;br /&gt;
#define PCA9685_LED13_OFF_L				60&lt;br /&gt;
#define PCA9685_LED13_OFF_H				61&lt;br /&gt;
#define PCA9685_LED14_ON_L				62&lt;br /&gt;
#define PCA9685_LED14_ON_H				63&lt;br /&gt;
#define PCA9685_LED14_OFF_L				64&lt;br /&gt;
#define PCA9685_LED14_OFF_H				65&lt;br /&gt;
#define PCA9685_LED15_ON_L				66&lt;br /&gt;
#define PCA9685_LED15_ON_H				67&lt;br /&gt;
#define PCA9685_LED15_OFF_L				68&lt;br /&gt;
#define PCA9685_LED15_OFF_H				69&lt;br /&gt;
#define PCA9685_ALL_LED_ON_L			250&lt;br /&gt;
#define PCA9685_ALL_LED_ON_H			251&lt;br /&gt;
#define PCA9685_ALL_LED_OFF_L			252&lt;br /&gt;
#define PCA9685_ALL_LED_OFF_H			253&lt;br /&gt;
#define PCA9685_PRE_SCALE				254&lt;br /&gt;
#define PCA9685_TESTMODE				255&lt;br /&gt;
&lt;br /&gt;
// Mode1 register bitmasks:&lt;br /&gt;
#define PCA9685_MODE1_ALLCALL			1&lt;br /&gt;
#define PCA9685_MODE1_SUB3				2&lt;br /&gt;
#define PCA9685_MODE1_SUB2				4&lt;br /&gt;
#define PCA9685_MODE1_SUB1				8&lt;br /&gt;
#define PCA9685_MODE1_SLEEP				16&lt;br /&gt;
#define PCA9685_MODE1_AI				32&lt;br /&gt;
#define PCA9685_MODE1_EXTCLK			64&lt;br /&gt;
#define PCA9685_MODE1_RESTART			128&lt;br /&gt;
&lt;br /&gt;
// Mode2 register bitmasks:&lt;br /&gt;
#define PCA9685_MODE2_OUTNE01_DEFAULT	0&lt;br /&gt;
#define PCA9685_MODE2_OUTDRV			4&lt;br /&gt;
#define PCA9685_MODE2_OCH				8&lt;br /&gt;
#define PCA9685_MODE2_INVRT				16&lt;br /&gt;
&lt;br /&gt;
#define F_PCA9685						25000000.0	// Int. Clock: 25 MHz&lt;br /&gt;
&lt;br /&gt;
void PCA9685_init(uint16_t);&lt;br /&gt;
#define initServo(__FREQ__) {PCA9685_init(__FREQ__);}&lt;br /&gt;
uint8_t servo(uint8_t);&lt;br /&gt;
void PCA9685_set(uint8_t, uint16_t);&lt;br /&gt;
#define setServo(__SERVO__,__POS__) {PCA9685_set(servo(__SERVO__),__POS__);}&lt;br /&gt;
void PCA9685_shutdown(void);&lt;br /&gt;
void PCA9685_restart(void);&lt;br /&gt;
void setServoPower(uint8_t);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C LED Driver (TCA6507):&lt;br /&gt;
&lt;br /&gt;
// Registers:&lt;br /&gt;
#define TCA6507_SELECT0				0&lt;br /&gt;
#define TCA6507_SELECT1				1&lt;br /&gt;
#define TCA6507_SELECT2				2&lt;br /&gt;
#define TCA6507_FADEON_TIME			3&lt;br /&gt;
#define TCA6507_FULLYON_TIME		4&lt;br /&gt;
#define TCA6507_FADEOFF_TIME		5&lt;br /&gt;
#define TCA6507_1ST_FULLYOFF_TIME	6&lt;br /&gt;
#define TCA6507_2ND_FULLYOFF_TIME	7&lt;br /&gt;
#define TCA6507_MAXIMUM_INTENSITY	8&lt;br /&gt;
#define TCA6507_MASTER_INTENSITY	9&lt;br /&gt;
#define TCA6507_INITIALIZATION		10&lt;br /&gt;
&lt;br /&gt;
// Output states:&lt;br /&gt;
#define STATE_OFF					0&lt;br /&gt;
#define STATE_PWM0					2&lt;br /&gt;
#define STATE_PWM1					3&lt;br /&gt;
#define STATE_ON					4&lt;br /&gt;
#define STATE_MINT					5&lt;br /&gt;
#define STATE_BLINK0				6&lt;br /&gt;
#define STATE_BLINK1				7&lt;br /&gt;
&lt;br /&gt;
extern uint8_t select[3];&lt;br /&gt;
&lt;br /&gt;
void TCA6507_write_cfg(uint8_t, uint8_t);&lt;br /&gt;
void TCA6507_update(void);&lt;br /&gt;
void TCA6507_set(uint8_t, uint8_t);&lt;br /&gt;
#define setLED(__LED__,__STATE__) {TCA6507_set(__LED__,__STATE__);}&lt;br /&gt;
void TCA6507_shutdown(void);&lt;br /&gt;
void TCA6507_restart(void);&lt;br /&gt;
void TCA6507_init(void);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C 3D Magnetometer &amp;amp; Accelerometer (LSM303DLHC):&lt;br /&gt;
&lt;br /&gt;
// LSM303DLHC accelerometer internal registers:&lt;br /&gt;
#define CTRL_REG1_A					0x20&lt;br /&gt;
#define CTRL_REG2_A					0x21&lt;br /&gt;
#define CTRL_REG3_A					0x22&lt;br /&gt;
#define CTRL_REG4_A					0x23&lt;br /&gt;
#define CTRL_REG5_A					0x24&lt;br /&gt;
#define CTRL_REG6_A					0x25&lt;br /&gt;
#define REFERENCE_A					0x26&lt;br /&gt;
#define STATUS_REG_A				0x27&lt;br /&gt;
#define OUT_X_L_A					0x28&lt;br /&gt;
#define OUT_X_H_A					0x29&lt;br /&gt;
#define OUT_Y_L_A					0x2a&lt;br /&gt;
#define OUT_Y_H_A					0x2b&lt;br /&gt;
#define OUT_Z_L_A					0x2c&lt;br /&gt;
#define OUT_Z_H_A					0x2d&lt;br /&gt;
#define FIFO_CTRL_REG_A				0x2e&lt;br /&gt;
#define FIFO_SRC_REG_A				0x2f&lt;br /&gt;
#define INT1_CFG_A					0x30&lt;br /&gt;
#define INT1_SOURCE_A				0x31&lt;br /&gt;
#define INT1_THS_A					0x32&lt;br /&gt;
#define INT1_DURATION_A				0x33&lt;br /&gt;
#define INT2_CFG_A					0x34&lt;br /&gt;
#define INT2_SOURCE_A				0x35&lt;br /&gt;
#define INT2_THS_A					0x36&lt;br /&gt;
#define INT2_DURATION_A				0x37&lt;br /&gt;
#define CLICK_CFG_A					0x38&lt;br /&gt;
#define CLICK_SRC_A					0x39&lt;br /&gt;
#define CLICK_THS_A					0x3a&lt;br /&gt;
#define TIME_LIMIT_A				0x3b&lt;br /&gt;
#define TIME_LATENCY_A				0x3c&lt;br /&gt;
#define TIME_WINDOW_A				0x3d&lt;br /&gt;
&lt;br /&gt;
// LSM303DLHC accelerometer register settings:&lt;br /&gt;
#define CTRL_REG1_A_10HZ			0b00100111	// 10Hz &amp;amp; all axes enable&lt;br /&gt;
#define CTRL_REG1_A_50HZ			0b01000111	// 50Hz &amp;amp; all axes enable&lt;br /&gt;
#define CTRL_REG4_A_DEFAULT			0b00000000	// Default (Normal mode)&lt;br /&gt;
#define CTRL_REG4_A_HR				0b00001000	// HR output mode&lt;br /&gt;
&lt;br /&gt;
// LSM303DLHC magnetometer internal registers:&lt;br /&gt;
#define CRA_REG_M					0x00&lt;br /&gt;
#define CRB_REG_M					0x01&lt;br /&gt;
#define MR_REG_M					0x02&lt;br /&gt;
#define OUT_X_H_M					0x03&lt;br /&gt;
#define OUT_X_L_M					0x04&lt;br /&gt;
#define OUT_Z_H_M					0x05&lt;br /&gt;
#define OUT_Z_L_M					0x06&lt;br /&gt;
#define OUT_Y_H_M					0x07&lt;br /&gt;
#define OUT_Y_L_M					0x08&lt;br /&gt;
#define SR_REG_MG					0x09&lt;br /&gt;
#define IRA_REG_M					0x0a&lt;br /&gt;
#define IRB_REG_M					0x0b&lt;br /&gt;
#define IRC_REG_M					0x0c&lt;br /&gt;
#define TEMP_OUT_H_M				0x31&lt;br /&gt;
#define TEMP_OUT_L_M				0x32&lt;br /&gt;
&lt;br /&gt;
// LSM303DLHC magnetometer register settings:&lt;br /&gt;
#define CRA_REG_M_15HZ				0b00010000	// Default (Data rate 15Hz)&lt;br /&gt;
#define CRA_REG_M_15HZ_T_EN			0b10010000	// 15Hz &amp;amp; temperature enable&lt;br /&gt;
#define CRB_REG_M_13GAUSS			0b00100000	// Gain +-1.3Gauss&lt;br /&gt;
#define MR_REG_M_CCM				0b00000000	// Continuous-conversion mode&lt;br /&gt;
#define MR_REG_M_SCM				0b00000001	// Single-conversion mode&lt;br /&gt;
#define MR_REG_M_SLEEP				0b00000011	// Default (Sleep-mode)&lt;br /&gt;
&lt;br /&gt;
extern int16_t x_axisa, y_axisa, z_axisa;&lt;br /&gt;
extern double pitch, roll;&lt;br /&gt;
extern double xa, ya, za;&lt;br /&gt;
extern double the, phi;&lt;br /&gt;
&lt;br /&gt;
extern int16_t x_axism, y_axism, z_axism;&lt;br /&gt;
extern int16_t headingm;&lt;br /&gt;
extern double xm, ym, zm;&lt;br /&gt;
#ifdef GET_TEMP_M&lt;br /&gt;
extern int16_t temperaturem;&lt;br /&gt;
extern double temperature_mag;&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
extern int16_t headingtc;&lt;br /&gt;
&lt;br /&gt;
void LSM303DLHC_A_init(void);&lt;br /&gt;
void readLSM303DLHC_A(void);&lt;br /&gt;
void normalizeLSM303DLHC_A(void);&lt;br /&gt;
void positionLSM303DLHC_A(void);&lt;br /&gt;
&lt;br /&gt;
void LSM303DLHC_M_init(void);&lt;br /&gt;
void readLSM303DLHC_M(void);&lt;br /&gt;
void normalizeLSM303DLHC_M(void);&lt;br /&gt;
int16_t headingLSM303DLHC_M(void);&lt;br /&gt;
&lt;br /&gt;
int16_t headingLSM303DLHC_TC(void);&lt;br /&gt;
&lt;br /&gt;
void LSM303DLHC_init(void);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Analog Yaw-Rate Gyroscope (LY330ALH):&lt;br /&gt;
&lt;br /&gt;
#define LY330ALH_MODE_NORMAL		0			// Power on default&lt;br /&gt;
#define LY330ALH_MODE_SLEEP			1&lt;br /&gt;
#define LY330ALH_MODE_SELFTEST		2&lt;br /&gt;
#define LY330ALH_MODE_POWERDOWN		3			// Shutdown mode&lt;br /&gt;
&lt;br /&gt;
extern int16_t z_axisg;&lt;br /&gt;
&lt;br /&gt;
void LY330ALH_set_mode(uint8_t);&lt;br /&gt;
uint16_t getRP6Base_ADC1(void);&lt;br /&gt;
int16_t LY330ALH_measure(void);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Hot Swappable 2-Wire Bus Buffer (TCA4311A):&lt;br /&gt;
&lt;br /&gt;
//extern uint8_t readyBusbuff;			// See &amp;quot;I2C I/O Port Expander&amp;quot; section&lt;br /&gt;
extern uint8_t errorBusbuff;&lt;br /&gt;
&lt;br /&gt;
#define getReadyBusbuff() (readyBusbuff)&lt;br /&gt;
uint8_t readReadyBusbuff(void);&lt;br /&gt;
void TCA4311A_shutdown(void);&lt;br /&gt;
void TCA4311A_reconnect(void);&lt;br /&gt;
void setRP6Base_PWR(uint8_t);&lt;br /&gt;
void setI2CModulePower(uint8_t);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Button:&lt;br /&gt;
&lt;br /&gt;
//extern uint8_t pressedButton;			// See &amp;quot;I2C I/O Port Expander&amp;quot; section&lt;br /&gt;
&lt;br /&gt;
#define getPressedButton() (pressedButton)&lt;br /&gt;
uint8_t readButton(void);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Status LED:&lt;br /&gt;
&lt;br /&gt;
void setStatusLED(uint8_t);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// RP6 Sensor Board initialisation and shutdown:&lt;br /&gt;
&lt;br /&gt;
void sensor_board_init(void);&lt;br /&gt;
void sensor_board_shutdown(void);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
/******************************************************************************&lt;br /&gt;
 * Additional info&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Changelog:&lt;br /&gt;
 * &lt;br /&gt;
 *  ---&amp;gt; changes are documented in the file &amp;quot;RP6M256_Sensor_BoardLib.c&amp;quot;&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=====Library Source=====&lt;br /&gt;
Datei: RP6M256_Sensor_BoardLib.c&lt;br /&gt;
&amp;lt;pre&amp;gt;/* ****************************************************************************&lt;br /&gt;
 *                           _______________________&lt;br /&gt;
 *                           \| RP6  ROBOT SYSTEM |/&lt;br /&gt;
 *                            \_-_-_-_-_-_-_-_-_-_/           &amp;gt;&amp;gt;&amp;gt; RP6 M256 WIFI&lt;br /&gt;
 * ----------------------------------------------------------------------------&lt;br /&gt;
 * ----------------------------- [c]2014 - Dirk -------------------------------&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * File: RP6M256_Sensor_BoardLib.c&lt;br /&gt;
 * Version: 1.0&lt;br /&gt;
 * Target: RP6 M256 WIFI - ATMEGA2560 @16.00MHz&lt;br /&gt;
 *         and a RP6 Sensor Board (CONRAD 1082384)&lt;br /&gt;
 * Author(s): Dirk&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Description:&lt;br /&gt;
 * This is our new Library that contains basic routines and functions for&lt;br /&gt;
 * accessing the hardwired components of the RP6 Sensor Board (CONRAD 1082384).&lt;br /&gt;
 * This library assumes the RP6 Sensor Board Revision 2.0 (04.07.13).&lt;br /&gt;
 *&lt;br /&gt;
 * There are more sensors and actors, that may be connected to the RP6 Sensor&lt;br /&gt;
 * Board: Many I2C components including a GPS module (CONRAD 1082385), servo&lt;br /&gt;
 *        motors, SHARP IR distance sensors, LEDs, a camera ...&lt;br /&gt;
 * This library doesn't contain functions for these sensors/actors, because&lt;br /&gt;
 * they are not HARDWIRED to the RP6 Sensor Board and may be connected&lt;br /&gt;
 * OPTIONALLY.&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// RP6 Sensor Board hardwired components:&lt;br /&gt;
// - I2C I/O Port Expander (MAX7311)&lt;br /&gt;
// - I2C Real Time Clock (RTC DS1339)&lt;br /&gt;
// - I2C Temperature Sensor (LM75B)&lt;br /&gt;
// - I2C Servo Controller (PCA9685)&lt;br /&gt;
// - I2C LED Driver (TCA6507)&lt;br /&gt;
// - I2C 3D Magnetometer &amp;amp; Accelerometer (LSM303DLHC)&lt;br /&gt;
// - Analog Yaw-Rate Gyroscope (LY330ALH)&lt;br /&gt;
// - Hot Swappable 2-Wire Bus Buffer (TCA4311A)&lt;br /&gt;
// - Button&lt;br /&gt;
// - Status LED&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Includes:&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6M256_Sensor_BoardLib.h&amp;quot; 		&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Variables:&lt;br /&gt;
&lt;br /&gt;
uint8_t registerBuf[13]; &lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C I/O Port Expander (MAX7311):&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Sends the configuration word to a MAX7311.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: config -&amp;gt; Config word for control&lt;br /&gt;
 *                  registers&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void MAX7311_write_cfg(uint16_t config)&lt;br /&gt;
{&lt;br /&gt;
#ifdef SAFE_CONFIG&lt;br /&gt;
	config |= 0b1010000000001000;&lt;br /&gt;
#endif&lt;br /&gt;
	I2CTWI_transmit3Bytes(I2C_SENSOR_PORTEXP_ADR, MAX7311_PORT1_CONFIG, config, (config&amp;gt;&amp;gt;8));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
interrupt_RP6SBstatus_t interrupt_RP6SBstatus;&lt;br /&gt;
&lt;br /&gt;
/** &lt;br /&gt;
 * This function checks all interrupt pins on&lt;br /&gt;
 * the XBUS (INT1..3, INTU).&lt;br /&gt;
 * This function must be called VERY frequently&lt;br /&gt;
 * out of the main loop.&lt;br /&gt;
 * Bigger delays result in slower reaction to&lt;br /&gt;
 * interrupt requests of the RP6 Sensor Board.&lt;br /&gt;
 * Interrupt function table:&lt;br /&gt;
 *   Int. : Function 1      IRQ  Function 2       IRQ&lt;br /&gt;
 *   -------------------------------------------------&lt;br /&gt;
 *   INT1 : LSM303DLHC INT1  H&lt;br /&gt;
 *   INT2 : MAX7311   INT_N  L&lt;br /&gt;
 *   INT3 : LSM303DLHC INT2  H   DS1339 SQW/INT_N  L&lt;br /&gt;
 *   INTU : not used&lt;br /&gt;
 * You can see in the &amp;quot;IRQ&amp;quot; column, which level&lt;br /&gt;
 * (H/L) means an ACTIVE INTERRUPT signal.&lt;br /&gt;
 * The interrupt pin levels (H=true/L=false) are&lt;br /&gt;
 * read into the global interrupt_RP6SBstatus&lt;br /&gt;
 * variable.&lt;br /&gt;
 *&lt;br /&gt;
 * Hints: - This function checks the interrupt&lt;br /&gt;
 *          signals by polling. This is NOT the&lt;br /&gt;
 *          best way to to this job. You will&lt;br /&gt;
 *          have to write your own task, if you&lt;br /&gt;
 *          want to use the Pin Change Interrupt&lt;br /&gt;
 *          function of the ATmega2560&lt;br /&gt;
 *          microcontroller.&lt;br /&gt;
 *        - You cannot use both interrupt sources&lt;br /&gt;
 *          for INT3! So you should not use INT2&lt;br /&gt;
 *          of the LSM303DLHC together with the&lt;br /&gt;
 *          alarm function of the DS1339 (RTC)!&lt;br /&gt;
 *        - Every interrupt signal of the Sensor&lt;br /&gt;
 *          Board may be cut off from the XBUS&lt;br /&gt;
 *          by opening a jumper (Jx):&lt;br /&gt;
 *          INT1 -&amp;gt; J3 (LSM303DLHC INT1)&lt;br /&gt;
 *          INT2 -&amp;gt; J4 (MAX7311 INT_N)&lt;br /&gt;
 *          INT3 -&amp;gt; J2 (DS1339 SQW/INT_N)&lt;br /&gt;
 *          INT3 -&amp;gt; J5 (LSM303DLHC INT2)&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *&lt;br /&gt;
 *   if (!interrupt_RP6SBstatus.portexp)&lt;br /&gt;
 *        writeString_P(&amp;quot;==&amp;gt; MAX7311 INT_N!!!&amp;quot;);&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void task_checkINTs(void)&lt;br /&gt;
{&lt;br /&gt;
	if(IO_SENSOR_INT1_PIN &amp;amp; IO_SENSOR_INT1_IN)	// XBUS INT1 -&amp;gt; PJ3 (PCINT12)&lt;br /&gt;
		interrupt_RP6SBstatus.int1 = true;&lt;br /&gt;
	else&lt;br /&gt;
		interrupt_RP6SBstatus.int1 = false;&lt;br /&gt;
	if(IO_SENSOR_INT2_PIN &amp;amp; IO_SENSOR_INT2_IN)	// XBUS INT2 -&amp;gt; PJ6 (PCINT15)&lt;br /&gt;
		interrupt_RP6SBstatus.int2 = true;&lt;br /&gt;
	else&lt;br /&gt;
		interrupt_RP6SBstatus.int2 = false;&lt;br /&gt;
	if(IO_SENSOR_INT3_PIN &amp;amp; IO_SENSOR_INT3_IN)	// XBUS INT3 -&amp;gt; PJ5 (PCINT14)&lt;br /&gt;
		interrupt_RP6SBstatus.int3 = true;&lt;br /&gt;
	else&lt;br /&gt;
		interrupt_RP6SBstatus.int3 = false;&lt;br /&gt;
//	if(IO_SENSOR_INTU_PIN &amp;amp; IO_SENSOR_INTU_IN)	// XBUS INTU -&amp;gt; PJ4 (PCINT13)&lt;br /&gt;
//		interrupt_RP6SBstatus.intu = true;&lt;br /&gt;
//	else&lt;br /&gt;
//		interrupt_RP6SBstatus.intu = false;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
max7311IOs_t inport;&lt;br /&gt;
uint8_t readyBusbuff;&lt;br /&gt;
uint8_t pressedButton;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function checks all I/O ports (I/O 0.0..1.7)&lt;br /&gt;
 * of the MAX7311 sequentially!&lt;br /&gt;
 * You must call this function frequently out of&lt;br /&gt;
 * the main loop.&lt;br /&gt;
 * The I/O port values (true/false) are read into&lt;br /&gt;
 * the global inport variable.&lt;br /&gt;
 * The global variables readyBusbuff (2-Wire Bus&lt;br /&gt;
 * Buffer: Enable) and pressedButton (Button S1:&lt;br /&gt;
 * Pressed) contain actual values (true/false)&lt;br /&gt;
 * after execution of this task.&lt;br /&gt;
 *&lt;br /&gt;
 * Examples:&lt;br /&gt;
 *&lt;br /&gt;
 *   if (inport.rdy_busbuff)&lt;br /&gt;
 *        writeString_P(&amp;quot;I/O 0.3: High&amp;quot;);&lt;br /&gt;
 *   else writeString_P(&amp;quot;I/O 0.3: Low&amp;quot;);&lt;br /&gt;
 *   if (!inport.drdy_magacc)&lt;br /&gt;
 *        writeString_P(&amp;quot;I/O 1.5: Low&amp;quot;);&lt;br /&gt;
 *   if (pressedButton)&lt;br /&gt;
 *        writeString_P(&amp;quot;Button pressed!&amp;quot;);&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void task_RP6SensorBoard(void)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmitByte(I2C_SENSOR_PORTEXP_ADR, MAX7311_INPUT_PORT1);&lt;br /&gt;
	I2CTWI_readBytes(I2C_SENSOR_PORTEXP_ADR, registerBuf, 2);&lt;br /&gt;
	inport.word = (registerBuf[1] &amp;lt;&amp;lt; 8) + registerBuf[0];&lt;br /&gt;
	readyBusbuff = inport.rdy_busbuff;&lt;br /&gt;
	pressedButton = inport.io2_i2c;&lt;br /&gt;
	pressedButton = !pressedButton;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
max7311IOs_t outport;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Updates the I/O ports with current value from&lt;br /&gt;
 * the global outport variable!&lt;br /&gt;
 * If one or more port pins were configured as&lt;br /&gt;
 * output before, they will be set (high) or&lt;br /&gt;
 * cleared (low).&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *&lt;br /&gt;
 *   outport.word = 0b0000000000001001;&lt;br /&gt;
 *   MAX7311_update();&lt;br /&gt;
 *   // This clears all I/O ports and sets&lt;br /&gt;
 *   // the ports I/O 0.0 and I/O 0.3!&lt;br /&gt;
 *&lt;br /&gt;
 *   // Other possibility:&lt;br /&gt;
 *   outport.pwr_sharp_f = true;&lt;br /&gt;
 *   MAX7311_update();&lt;br /&gt;
 *   // This sets I/O 0.1 and does not&lt;br /&gt;
 *   // affect any other I/O port!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void MAX7311_update(void)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmit3Bytes(I2C_SENSOR_PORTEXP_ADR, MAX7311_OUTPUT_PORT1, outport.word, (outport.word&amp;gt;&amp;gt;8));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Writes the 16-bit data to a MAX7311.&lt;br /&gt;
 * The data are output with those I/O ports that&lt;br /&gt;
 * were configured as output before.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: data -&amp;gt; Data word&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void MAX7311_write(uint16_t data)&lt;br /&gt;
{&lt;br /&gt;
	outport.word = data;&lt;br /&gt;
	MAX7311_update();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Initializes the I/O Port Expander after power&lt;br /&gt;
 * on.&lt;br /&gt;
 *&lt;br /&gt;
 * Hint: If USE_PD5 is defined in the&lt;br /&gt;
 *       configuration header file, this&lt;br /&gt;
 *       function uses the RP6M256 portpin,&lt;br /&gt;
 *       that is connected to plug I/O: Pin 9&lt;br /&gt;
 *       instead of MAX7311 I/O 1.0!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void MAX7311_init(void)&lt;br /&gt;
{&lt;br /&gt;
#ifdef USE_PD5&lt;br /&gt;
	MAX7311_write_cfg(MAX7311_CONFIG_USE_PD5);&lt;br /&gt;
	IO_SENSOR_TCA4311A_EN_DDR |= IO_SENSOR_TCA4311A_EN_IN;		// Output&lt;br /&gt;
	IO_SENSOR_TCA4311A_EN_PORT |= IO_SENSOR_TCA4311A_EN_IN;		// High&lt;br /&gt;
#else&lt;br /&gt;
	MAX7311_write_cfg(MAX7311_CONFIG_DEFAULT);&lt;br /&gt;
#endif&lt;br /&gt;
	MAX7311_write(MAX7311_OUTPUT_DEFAULT);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Real Time Clock (RTC DS1339):&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function converts a BCD to a DEC value.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
uint8_t BCD2DEC(uint8_t bcd)&lt;br /&gt;
{&lt;br /&gt;
	return ((bcd &amp;gt;&amp;gt; 4) * 10 + (bcd &amp;amp; 0x0f));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function converts a DEC to a BCD value.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
uint8_t DEC2BCD(uint8_t dec)&lt;br /&gt;
{uint8_t units = dec % 10;&lt;br /&gt;
	if (dec /= 10) {&lt;br /&gt;
		return (units + (DEC2BCD(dec) &amp;lt;&amp;lt; 4));&lt;br /&gt;
	}&lt;br /&gt;
	else {&lt;br /&gt;
		return units;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Sends the configuration byte to a DS1339.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: Config byte for control register&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void DS1339_write_cfg(uint8_t config)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_RTC_ADR, DS1339_CONTROL, config);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Initializes the DS1339 Trickle Charger&lt;br /&gt;
 * function to the default for the RP6 Sensor&lt;br /&gt;
 * Board: One diode and 2kOhm resistor.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void DS1339_init(void)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_RTC_ADR, DS1339_TRICKLE_CHARGER, DS1339_TRICKLE_CHARGER_DEFAULT);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Reads all data registers of the Real Time Clock (RTC).&lt;br /&gt;
 * They are stored in the time &amp;amp; date variables defined in&lt;br /&gt;
 * the library header.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void DS1339_read(void)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmitByte(I2C_SENSOR_RTC_ADR, DS1339_SECONDS);&lt;br /&gt;
	I2CTWI_readBytes(I2C_SENSOR_RTC_ADR, registerBuf, 7);&lt;br /&gt;
	rtc_time.second = BCD2DEC(registerBuf[0]);&lt;br /&gt;
	rtc_time.minute = BCD2DEC(registerBuf[1]);&lt;br /&gt;
	rtc_time.hour = BCD2DEC(registerBuf[2] &amp;amp; 0x3f);&lt;br /&gt;
	rtc_date.weekday = (registerBuf[3] &amp;amp; 0x07);&lt;br /&gt;
	rtc_date.day = BCD2DEC(registerBuf[4]);&lt;br /&gt;
	rtc_date.month = BCD2DEC(registerBuf[5] &amp;amp; 0x7f);&lt;br /&gt;
	if(registerBuf[5] &amp;amp; 0x80) rtc_date.year = 100;&lt;br /&gt;
	else rtc_date.year = 0;&lt;br /&gt;
	rtc_date.year += BCD2DEC(registerBuf[6]);&lt;br /&gt;
	rtc_date.year += 2000;&lt;br /&gt;
	rtc_time.dst = 0;&lt;br /&gt;
#ifdef CALC_DST&lt;br /&gt;
	// Calculate MESZ (DST):&lt;br /&gt;
	uint8_t wday = rtc_date.weekday;			// Weekday [1..7 = R_MO..R_SU]&lt;br /&gt;
	if(wday == 7) wday = 0;&lt;br /&gt;
	if(rtc_date.month &amp;lt; 3 || rtc_date.month &amp;gt; 10) {&lt;br /&gt;
		return;&lt;br /&gt;
	}&lt;br /&gt;
	if((rtc_date.day - wday &amp;gt;= 25)&lt;br /&gt;
	 &amp;amp;&amp;amp; (wday || rtc_time.hour &amp;gt;= 2)) {&lt;br /&gt;
		if(rtc_date.month == 10)&lt;br /&gt;
			return;&lt;br /&gt;
	}&lt;br /&gt;
	else {&lt;br /&gt;
		if(rtc_date.month == 3) {&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	rtc_time.dst = 1;&lt;br /&gt;
#endif&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Writes the time &amp;amp; date infos in the variables defined in&lt;br /&gt;
 * the library header to the Real Time Clock (RTC).&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void DS1339_write(void)&lt;br /&gt;
{&lt;br /&gt;
	registerBuf[0] = DS1339_SECONDS;&lt;br /&gt;
	registerBuf[1] = DEC2BCD(rtc_time.second);&lt;br /&gt;
	registerBuf[2] = DEC2BCD(rtc_time.minute);&lt;br /&gt;
	registerBuf[3] = DEC2BCD(rtc_time.hour);&lt;br /&gt;
	registerBuf[4] = rtc_date.weekday;&lt;br /&gt;
	registerBuf[5] = DEC2BCD(rtc_date.day);&lt;br /&gt;
	registerBuf[6] = DEC2BCD(rtc_date.month);&lt;br /&gt;
	registerBuf[7] = DEC2BCD(rtc_date.year - 2000);&lt;br /&gt;
	I2CTWI_transmitBytes(I2C_SENSOR_RTC_ADR, &amp;amp;registerBuf[0], 8);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Temperature Sensor (LM75B):&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Sends the configuration byte to a LM75B.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: Config byte for Conf register&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void LM75B_write_cfg(uint8_t config)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_TEMP_ADR, LM75B_CONF, config);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
uint8_t temperature_low;&lt;br /&gt;
uint8_t temperature_high;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Reads the two data registers of the temperature&lt;br /&gt;
 * sensor's Temp register.&lt;br /&gt;
 * They are stored in the variables temperature_low&lt;br /&gt;
 * and _high.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void LM75B_read(void)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmitByte(I2C_SENSOR_TEMP_ADR, LM75B_TEMP);&lt;br /&gt;
	I2CTWI_readBytes(I2C_SENSOR_TEMP_ADR, registerBuf, 2);&lt;br /&gt;
	temperature_high = registerBuf[0];&lt;br /&gt;
	temperature_low = registerBuf[1];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
double temperature;						// Temperature [°C]&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Calculates and returns the temperature value&lt;br /&gt;
 * by using the data read from the LM75B with&lt;br /&gt;
 * the function LM75B_read(). The sensor is&lt;br /&gt;
 * designed for 11 bit measurement and 0.125°C&lt;br /&gt;
 * resolution.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
double LM75B_calculate(void)&lt;br /&gt;
{&lt;br /&gt;
	int16_t tempraw = 0;&lt;br /&gt;
	double temp;&lt;br /&gt;
&lt;br /&gt;
	tempraw = (getTemperatureHigh() &amp;lt;&amp;lt; 8) | getTemperatureLow();&lt;br /&gt;
	tempraw &amp;gt;&amp;gt;= 5;&lt;br /&gt;
	if (tempraw &amp;amp; 1024)							// Calculate temperature&lt;br /&gt;
		tempraw = (tempraw &amp;amp; 1023) - 1024;&lt;br /&gt;
	else&lt;br /&gt;
		tempraw = tempraw &amp;amp; 1023;&lt;br /&gt;
	temp = tempraw * 0.125;&lt;br /&gt;
	return temp;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Performs a 11 bit measurement and returns the&lt;br /&gt;
 * temperature [°C]. The sensor has a measuring&lt;br /&gt;
 * cycle of 100ms. So it makes no sense calling&lt;br /&gt;
 * this function at a frequency above 10Hz.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
double LM75B_measure(void)&lt;br /&gt;
{&lt;br /&gt;
//	LM75B_init();&lt;br /&gt;
	LM75B_read();								// Read data&lt;br /&gt;
	return (LM75B_calculate());					// Calculate value&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Servo Controller (PCA9685):&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Call this once before using the servo function.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: PWM frequency [40..1000 Hz]&lt;br /&gt;
 *&lt;br /&gt;
 * Hints: - Default servo frequency is 50 Hz!&lt;br /&gt;
 *        - The servo power is NOT switched on by&lt;br /&gt;
 *          this function!&lt;br /&gt;
 *&lt;br /&gt;
 * There is also a macro initServo(freq), which&lt;br /&gt;
 * does exactly the same as this function.&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *   initServo(50);&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void PCA9685_init(uint16_t freq)&lt;br /&gt;
{&lt;br /&gt;
	outport.oen_servo = false;					// I/O 1.3: Low&lt;br /&gt;
	MAX7311_update();&lt;br /&gt;
	if ((freq &amp;lt; 40) || (freq &amp;gt; 1000)) freq = 50;&lt;br /&gt;
	I2CTWI_transmitByte(I2C_SENSOR_SERVO_ADR, PCA9685_MODE2);&lt;br /&gt;
	uint8_t last_mode = I2CTWI_readByte(I2C_SENSOR_SERVO_ADR);&lt;br /&gt;
	last_mode &amp;amp;= ~PCA9685_MODE2_INVRT;			// Clear INVRT bit&lt;br /&gt;
	last_mode |= PCA9685_MODE2_OUTDRV;			// Set OUTDRV bit&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_SERVO_ADR, PCA9685_MODE2, last_mode);&lt;br /&gt;
	I2CTWI_transmitByte(I2C_SENSOR_SERVO_ADR, PCA9685_MODE1);&lt;br /&gt;
	last_mode = I2CTWI_readByte(I2C_SENSOR_SERVO_ADR);&lt;br /&gt;
	last_mode |= PCA9685_MODE1_AI;				// Set AI bit&lt;br /&gt;
	uint8_t mode1 = last_mode;&lt;br /&gt;
	mode1 |= PCA9685_MODE1_SLEEP;				// Set SLEEP bit&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_SERVO_ADR, PCA9685_MODE1, mode1);&lt;br /&gt;
	uint8_t prescale = (uint8_t) (F_PCA9685 / 4096 / freq - 0.5);&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_SERVO_ADR, PCA9685_PRE_SCALE, prescale);&lt;br /&gt;
	last_mode &amp;amp;= ~PCA9685_MODE1_SLEEP;			// Clear SLEEP bit&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_SERVO_ADR, PCA9685_MODE1, last_mode);&lt;br /&gt;
	mSleep(1);&lt;br /&gt;
	last_mode |= PCA9685_MODE1_RESTART;			// Clear RESTART bit&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_SERVO_ADR, PCA9685_MODE1, last_mode);&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_SERVO_ADR, PCA9685_LED8_ON_H, 0x10);&lt;br /&gt;
	return;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/** &lt;br /&gt;
 * Returns the channel belonging to a servo number.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: number -&amp;gt; Servo number [1..8]&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
uint8_t servo(uint8_t number)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t channel;&lt;br /&gt;
&lt;br /&gt;
	switch (number) {&lt;br /&gt;
		case 1 :&lt;br /&gt;
			channel = CH_SERVO_1; break;&lt;br /&gt;
		case 2 :&lt;br /&gt;
			channel = CH_SERVO_2; break;&lt;br /&gt;
		case 3 :&lt;br /&gt;
			channel = CH_SERVO_3; break;&lt;br /&gt;
		case 4 :&lt;br /&gt;
			channel = CH_SERVO_4; break;&lt;br /&gt;
		case 5 :&lt;br /&gt;
			channel = CH_SERVO_5; break;&lt;br /&gt;
		case 6 :&lt;br /&gt;
			channel = CH_SERVO_6; break;&lt;br /&gt;
		case 7 :&lt;br /&gt;
			channel = CH_SERVO_7; break;&lt;br /&gt;
		case 8 :&lt;br /&gt;
			channel = CH_SERVO_8; break;&lt;br /&gt;
		default : channel = CH_SERVO_1;&lt;br /&gt;
	}&lt;br /&gt;
	return channel;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This is the servo position set function.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: channel -&amp;gt; Channel number [1..16]&lt;br /&gt;
 *        pos     -&amp;gt; Servo position [SERVOx_LT..SERVOx_RT]&lt;br /&gt;
 *&lt;br /&gt;
 * Hints: - A servo position of 205 means 1 ms servo impulse,&lt;br /&gt;
 *          a position of 410 means a 2 ms servo impulse!&lt;br /&gt;
 *          You may calculate the servo impulse length by:&lt;br /&gt;
 *          ==&amp;gt; Impulse [ms] = servo position / 204.8 &amp;lt;==&lt;br /&gt;
 *          (Formula only valid for a PWM of 50 Hz!)&lt;br /&gt;
 *&lt;br /&gt;
 * There is also a macro setServo(servo, pos), which&lt;br /&gt;
 * does nearly the same as this function, but the first&lt;br /&gt;
 * parameter is the servo and NOT the channel number.&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *   setServo(2,300);&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void PCA9685_set(uint8_t channel, uint16_t pos)&lt;br /&gt;
{&lt;br /&gt;
	if ((channel == 0) || (channel &amp;gt; 16))&lt;br /&gt;
		return;&lt;br /&gt;
	uint8_t reg = channel * 4 + 4;				// Register LEDx_OFF_L&lt;br /&gt;
	I2CTWI_transmit3Bytes(I2C_SENSOR_SERVO_ADR, reg, (pos &amp;amp; 0x00ff), (pos &amp;gt;&amp;gt; 8));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * If the servos are not moving for a while, the&lt;br /&gt;
 * servo function can be stopped with this&lt;br /&gt;
 * function (PCA9685 set to sleep mode).&lt;br /&gt;
 *&lt;br /&gt;
 * Hint: The servo power is NOT switched off by&lt;br /&gt;
 *       this function!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void PCA9685_shutdown(void)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_SERVO_ADR, PCA9685_ALL_LED_OFF_H, 0x10);&lt;br /&gt;
	I2CTWI_transmitByte(I2C_SENSOR_SERVO_ADR, PCA9685_MODE1);&lt;br /&gt;
	uint8_t mode1 = I2CTWI_readByte(I2C_SENSOR_SERVO_ADR);&lt;br /&gt;
	mode1 |= PCA9685_MODE1_SLEEP;				// Set SLEEP bit&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_SERVO_ADR, PCA9685_MODE1, mode1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * If the servo function was stopped with the&lt;br /&gt;
 * function PCA9685_shutdown() before, it can be&lt;br /&gt;
 * (re)started again with this function.&lt;br /&gt;
 *&lt;br /&gt;
 * Hint: The servo power is NOT switched on by&lt;br /&gt;
 *       this function!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void PCA9685_restart(void)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmitByte(I2C_SENSOR_SERVO_ADR, PCA9685_MODE1);&lt;br /&gt;
	uint8_t mode1 = I2CTWI_readByte(I2C_SENSOR_SERVO_ADR);&lt;br /&gt;
	if (mode1 &amp;amp; PCA9685_MODE1_RESTART) {		// RESTART bit set?&lt;br /&gt;
		mode1 &amp;amp;= ~PCA9685_MODE1_SLEEP;			// Clear SLEEP bit&lt;br /&gt;
		I2CTWI_transmit2Bytes(I2C_SENSOR_SERVO_ADR, PCA9685_MODE1, mode1);&lt;br /&gt;
		mSleep(1);&lt;br /&gt;
		mode1 |= PCA9685_MODE1_RESTART;			// Clear RESTART bit&lt;br /&gt;
		I2CTWI_transmit2Bytes(I2C_SENSOR_SERVO_ADR, PCA9685_MODE1, mode1);&lt;br /&gt;
		I2CTWI_transmit2Bytes(I2C_SENSOR_SERVO_ADR, PCA9685_ALL_LED_OFF_H, 0);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/** &lt;br /&gt;
 * With this function you can switch the servo&lt;br /&gt;
 * power on or off.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: pwr -&amp;gt; 0 (false) = servo power off&lt;br /&gt;
 *               &amp;gt;0 (true) = servo power on&lt;br /&gt;
 *&lt;br /&gt;
 * Hints: - If connected servos are not used, you&lt;br /&gt;
 *          should always switch the servo power off&lt;br /&gt;
 *          (default) to save energy!&lt;br /&gt;
 *        - The PCA9685 is NOT restarted or put into&lt;br /&gt;
 *          shutdown mode by this function!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void setServoPower(uint8_t pwr)&lt;br /&gt;
{&lt;br /&gt;
	if(pwr &amp;gt; 0)&lt;br /&gt;
		outport.pwr_servo = true;				// I/O 1.4: High&lt;br /&gt;
	else&lt;br /&gt;
		outport.pwr_servo = false;				// I/O 1.4: Low&lt;br /&gt;
	MAX7311_update();&lt;br /&gt;
}	&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C LED Driver (TCA6507):&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Sends the configuration byte to TCA6507's&lt;br /&gt;
 * internal registers.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: reg    -&amp;gt; Register address [0..10]&lt;br /&gt;
 *        config -&amp;gt; Config byte for internal&lt;br /&gt;
 *                  registers&lt;br /&gt;
 *&lt;br /&gt;
 * Hints: - With this function you can write to&lt;br /&gt;
 *          all internal registers of the LED&lt;br /&gt;
 *          driver, see &amp;quot;Registers:&amp;quot; in the&lt;br /&gt;
 *          library header file!&lt;br /&gt;
 *        - Mainly you will use this function&lt;br /&gt;
 *          for setting time (regs 3..7) and&lt;br /&gt;
 *          intensity (regs 8, 9) values.&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *   TCA6507_write_cfg(TCA6507_MAXIMUM_INTENSITY,0x77);&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void TCA6507_write_cfg(uint8_t reg, uint8_t config)&lt;br /&gt;
{&lt;br /&gt;
	if(reg &amp;gt; 10) reg = 0;&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_LEDDRIVER_ADR, reg, config);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
uint8_t select[3];&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Updates the LED driver select registers (0..2)&lt;br /&gt;
 * with the global select array!&lt;br /&gt;
 *&lt;br /&gt;
 * Hint: - Also have a look at Table 4 in the&lt;br /&gt;
 *         TCA6507 datasheet!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void TCA6507_update(void)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmit4Bytes(I2C_SENSOR_LEDDRIVER_ADR, (TCA6507_SELECT0 | 0x10), select[0], select[1], select[2]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This is the LED state set function.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: led   -&amp;gt; LED number [0..6]&lt;br /&gt;
 *        state -&amp;gt; LED state  [0..7]&lt;br /&gt;
 *&lt;br /&gt;
 * Hints: - Possible driver states [0..7] see&lt;br /&gt;
 *          &amp;quot;Output states:&amp;quot; in the library&lt;br /&gt;
 *          header file!&lt;br /&gt;
 *        - Also have a look at Table 4 in the&lt;br /&gt;
 *          TCA6507 datasheet!&lt;br /&gt;
 *&lt;br /&gt;
 * There is also a macro setLED(led, state), which&lt;br /&gt;
 * does exactly the same as this function.&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *   setLED(1,4);&lt;br /&gt;
 *   // Switches LED1 ON&lt;br /&gt;
 *   // ... OR ...&lt;br /&gt;
 *   setLED(LED1,STATE_ON);&lt;br /&gt;
 *   // does the same.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void TCA6507_set(uint8_t led, uint8_t state)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t i, mask;&lt;br /&gt;
&lt;br /&gt;
	if(led &amp;gt; 6) led = 0;&lt;br /&gt;
	led = 1 &amp;lt;&amp;lt; led;&lt;br /&gt;
	mask = 1;&lt;br /&gt;
	for(i = 0; i &amp;lt; 3; i++) {&lt;br /&gt;
		select[i] &amp;amp;= ~led;&lt;br /&gt;
		if(state &amp;amp; mask)&lt;br /&gt;
			select[i] |= led;&lt;br /&gt;
		mask &amp;lt;&amp;lt;= 1;&lt;br /&gt;
	}&lt;br /&gt;
	TCA6507_update();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * If the LEDs are not needed for a while, the&lt;br /&gt;
 * LED driver can be stopped with this function&lt;br /&gt;
 * (TCA6507 set to shutdown mode).&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void TCA6507_shutdown(void)&lt;br /&gt;
{&lt;br /&gt;
	outport.en_leddriv = false;					// I/O 0.4: Low&lt;br /&gt;
	MAX7311_update();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * If the LED driver was stopped with the&lt;br /&gt;
 * function TCA6507_shutdown() before, it can be&lt;br /&gt;
 * (re)started again with this function.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void TCA6507_restart(void)&lt;br /&gt;
{&lt;br /&gt;
	outport.en_leddriv = true;					// I/O 0.4: High&lt;br /&gt;
	MAX7311_update();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Initializes the LED driver after power on by&lt;br /&gt;
 * switching all LEDs off.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void TCA6507_init(void)&lt;br /&gt;
{&lt;br /&gt;
	select[0] = 0;&lt;br /&gt;
	select[1] = 0;&lt;br /&gt;
	select[2] = 0;&lt;br /&gt;
	TCA6507_update();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C 3D Magnetometer &amp;amp; Accelerometer (LSM303DLHC):&lt;br /&gt;
&lt;br /&gt;
// --------------------------------------------&lt;br /&gt;
// LSM303DLHC accelerometer functions:&lt;br /&gt;
int16_t x_axisa, y_axisa, z_axisa;&lt;br /&gt;
double pitch, roll;&lt;br /&gt;
double xa, ya, za;&lt;br /&gt;
double the, phi;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Call this once before using the 3D-Accelerometer.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void LSM303DLHC_A_init(void)&lt;br /&gt;
{&lt;br /&gt;
	// Set normal power mode, 10 Hz data rate, all axes enabled:&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_LSM303DLHC_A_ADR, CTRL_REG1_A, CTRL_REG1_A_10HZ);&lt;br /&gt;
	mSleep(10);&lt;br /&gt;
	// Set HD mode:&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_LSM303DLHC_A_ADR, CTRL_REG4_A, CTRL_REG4_A_HR);&lt;br /&gt;
	mSleep(10);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function reads the X-axis, Y-axis and Z-axis values&lt;br /&gt;
 * from the LSM303DLHC accelerometer and stores them in the&lt;br /&gt;
 * global variables x_axisa, y_axisa and z_axisa.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void readLSM303DLHC_A(void)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t readBuf[6];&lt;br /&gt;
&lt;br /&gt;
	I2CTWI_transmitByte(I2C_SENSOR_LSM303DLHC_A_ADR, (OUT_X_L_A | 0x80));&lt;br /&gt;
	I2CTWI_readBytes(I2C_SENSOR_LSM303DLHC_A_ADR, readBuf, 6); // Read  X-/Y-/Z-axis&lt;br /&gt;
	// xb = y:&lt;br /&gt;
	x_axisa = ((readBuf[OUT_Y_H_A - OUT_X_L_A] &amp;lt;&amp;lt; 8) + readBuf[OUT_Y_L_A - OUT_X_L_A]) / 16;&lt;br /&gt;
	// yb = x:&lt;br /&gt;
	y_axisa = ((readBuf[OUT_X_H_A - OUT_X_L_A] &amp;lt;&amp;lt; 8) + readBuf[OUT_X_L_A - OUT_X_L_A]) / 16;&lt;br /&gt;
	// zb = z:&lt;br /&gt;
	z_axisa = ((readBuf[OUT_Z_H_A - OUT_X_L_A] &amp;lt;&amp;lt; 8) + readBuf[OUT_Z_L_A - OUT_X_L_A]) / 16;&lt;br /&gt;
	mSleep(10);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function limits and normalizes the x-axisa,&lt;br /&gt;
 * y-axisa and z-axisa values read from the LSM303DLHC&lt;br /&gt;
 * accelerometer with the function readLSM303DLHC_A() and&lt;br /&gt;
 * stores them in the global double variables xa, ya and&lt;br /&gt;
 * za.&lt;br /&gt;
 * It also calculates the position in space in form of the&lt;br /&gt;
 * tilt angles (the = pitch, phi = roll) and stores them&lt;br /&gt;
 * in the global double variables the and phi.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void normalizeLSM303DLHC_A(void)&lt;br /&gt;
{&lt;br /&gt;
	// Limit raw values:&lt;br /&gt;
	if (x_axisa &amp;lt; MIN_X_A) x_axisa = MIN_X_A;&lt;br /&gt;
	if (x_axisa &amp;gt; MAX_X_A) x_axisa = MAX_X_A;&lt;br /&gt;
	if (y_axisa &amp;lt; MIN_Y_A) y_axisa = MIN_Y_A;&lt;br /&gt;
	if (y_axisa &amp;gt; MAX_Y_A) y_axisa = MAX_Y_A;&lt;br /&gt;
	if (z_axisa &amp;lt; MIN_Z_A) z_axisa = MIN_Z_A;&lt;br /&gt;
	if (z_axisa &amp;gt; MAX_Z_A) z_axisa = MAX_Z_A;&lt;br /&gt;
	xa = (double) x_axisa / 1000.0;&lt;br /&gt;
	ya = (double) y_axisa / 1000.0;&lt;br /&gt;
	za = (double) z_axisa / 1000.0;&lt;br /&gt;
	// Calculate Pitch and Roll:&lt;br /&gt;
	phi = asin(xa);								// Calculate the and phi&lt;br /&gt;
	the = asin(ya / cos(the));					//  from the raw values&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function calculates the position in space by&lt;br /&gt;
 * using the the and phi values (see function&lt;br /&gt;
 * normalizeLSM303DLHC_A()!). It stores the position&lt;br /&gt;
 * in the global double variables pitch and roll. &lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void positionLSM303DLHC_A(void)&lt;br /&gt;
{&lt;br /&gt;
	pitch = the * 180 / M_PI + OFFSET_PITCH_A;&lt;br /&gt;
	roll = phi * 180 / M_PI + OFFSET_ROLL_A;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// LSM303DLHC magnetometer functions:&lt;br /&gt;
int16_t x_axism, y_axism, z_axism;&lt;br /&gt;
int16_t headingm;&lt;br /&gt;
double xm, ym, zm;&lt;br /&gt;
#ifdef GET_TEMP_M&lt;br /&gt;
int16_t temperaturem;&lt;br /&gt;
double temperature_mag;&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
int16_t headingtc;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Call this once before using the 3D-Compass.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void LSM303DLHC_M_init(void)&lt;br /&gt;
{&lt;br /&gt;
#ifdef GET_TEMP_M&lt;br /&gt;
	// Set Data output rate to 15Hz, enable temperature sensor:&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_LSM303DLHC_M_ADR, CRA_REG_M, CRA_REG_M_15HZ_T_EN);&lt;br /&gt;
#else&lt;br /&gt;
	// Set Data output rate to 15Hz:&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_LSM303DLHC_M_ADR, CRA_REG_M, CRA_REG_M_15HZ);&lt;br /&gt;
#endif&lt;br /&gt;
	mSleep(10);&lt;br /&gt;
	// Set Gain to +-1.3Gauss:&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_LSM303DLHC_M_ADR, CRB_REG_M, CRB_REG_M_13GAUSS);&lt;br /&gt;
	mSleep(10);&lt;br /&gt;
	// Set Continuous-conversion mode:&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_SENSOR_LSM303DLHC_M_ADR, MR_REG_M, MR_REG_M_CCM);&lt;br /&gt;
	mSleep(10);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function reads the X-axis, Y-axis, Z-axis and&lt;br /&gt;
 * temperature values from the LSM303DLHC magnetometer&lt;br /&gt;
 * and stores them in the global variables x_axism,&lt;br /&gt;
 * y_axism, z_axism and temperaturem.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void readLSM303DLHC_M(void)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t readBuf[6];&lt;br /&gt;
&lt;br /&gt;
	I2CTWI_transmitByte(I2C_SENSOR_LSM303DLHC_M_ADR, OUT_X_H_M);&lt;br /&gt;
	I2CTWI_readBytes(I2C_SENSOR_LSM303DLHC_M_ADR, readBuf, 6); // Read  X-/Y-/Z-axis&lt;br /&gt;
	// xb = x:&lt;br /&gt;
	x_axism = (readBuf[OUT_X_H_M - OUT_X_H_M] &amp;lt;&amp;lt; 8) + readBuf[OUT_X_L_M - OUT_X_H_M];&lt;br /&gt;
	// yb = y:&lt;br /&gt;
	y_axism = (readBuf[OUT_Y_H_M - OUT_X_H_M] &amp;lt;&amp;lt; 8) + readBuf[OUT_Y_L_M - OUT_X_H_M];&lt;br /&gt;
	// zb = z:&lt;br /&gt;
	z_axism = (readBuf[OUT_Z_H_M - OUT_X_H_M] &amp;lt;&amp;lt; 8) + readBuf[OUT_Z_L_M - OUT_X_H_M];&lt;br /&gt;
	mSleep(10);&lt;br /&gt;
#ifdef GET_TEMP_M&lt;br /&gt;
	// Read temperature raw value:&lt;br /&gt;
	I2CTWI_transmitByte(I2C_SENSOR_LSM303DLHC_M_ADR, TEMP_OUT_H_M);&lt;br /&gt;
	readBuf[0] = I2CTWI_readByte(I2C_SENSOR_LSM303DLHC_M_ADR);&lt;br /&gt;
	I2CTWI_transmitByte(I2C_SENSOR_LSM303DLHC_M_ADR, TEMP_OUT_L_M);&lt;br /&gt;
	readBuf[1] = I2CTWI_readByte(I2C_SENSOR_LSM303DLHC_M_ADR);&lt;br /&gt;
	temperaturem = (readBuf[0] &amp;lt;&amp;lt; 8) | readBuf[1];&lt;br /&gt;
	temperaturem &amp;gt;&amp;gt;= 4;&lt;br /&gt;
	if (temperaturem &amp;amp; 2048)					// Calculate temperature&lt;br /&gt;
		temperaturem = (temperaturem &amp;amp; 2047) - 2048;&lt;br /&gt;
	else&lt;br /&gt;
		temperaturem = temperaturem &amp;amp; 2047;&lt;br /&gt;
	mSleep(10);&lt;br /&gt;
#endif&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function compensates hard iron effects and&lt;br /&gt;
 * scales the x-axism, y-axism and z-axism values read&lt;br /&gt;
 * from the LSM303DLHC magnetometer with the function&lt;br /&gt;
 * readLSM303DLHC_M() and stores them in the global&lt;br /&gt;
 * double variables xm, ym and zm.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void normalizeLSM303DLHC_M(void)&lt;br /&gt;
{&lt;br /&gt;
	// Add hard iron offsets:&lt;br /&gt;
	x_axism += OFFSET_X_M;&lt;br /&gt;
	y_axism += OFFSET_Y_M;&lt;br /&gt;
	z_axism += OFFSET_Z_M;&lt;br /&gt;
	// Scale raw values:&lt;br /&gt;
	xm = (x_axism - MIN_X_M) / (MAX_X_M - MIN_X_M) * 2 - 1;&lt;br /&gt;
	ym = (y_axism - MIN_Y_M) / (MAX_Y_M - MIN_Y_M) * 2 - 1;&lt;br /&gt;
	zm = (z_axism - MIN_Z_M) / (MAX_Z_M - MIN_Z_M) * 2 - 1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function calculates the heading by using the&lt;br /&gt;
 * normalized sensor values xm and ym (see function&lt;br /&gt;
 * normalizeLSM303DLHC_M()!). The heading is a value&lt;br /&gt;
 * from 0° to 359°. If the robot's front (and the&lt;br /&gt;
 * RP6 Sensor Board's front edge with the two&lt;br /&gt;
 * headlights) points to ...&lt;br /&gt;
 *   north -&amp;gt; heading is 0°,&lt;br /&gt;
 *   east  -&amp;gt; heading is 90°,&lt;br /&gt;
 *   south -&amp;gt; heading is 180°,&lt;br /&gt;
 *   west  -&amp;gt; heading is 270°.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
int16_t headingLSM303DLHC_M(void)&lt;br /&gt;
{&lt;br /&gt;
	double hdg = atan2(ym, xm) * 180 / M_PI + DECLINATION_M;&lt;br /&gt;
	if(hdg &amp;lt; 0.0) hdg += 360.0;&lt;br /&gt;
	return ((int16_t) hdg);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// --------------------------------------------&lt;br /&gt;
/**&lt;br /&gt;
 * This function calculates the TILT COMPENSATED&lt;br /&gt;
 * heading by using accelerometer (the, phi) AND&lt;br /&gt;
 * magnetometer (xm, ym, zm) data. The heading is a&lt;br /&gt;
 * value from 0° to 359°. If the robot's front (and&lt;br /&gt;
 * the RP6 Sensor Board's front edge with the two&lt;br /&gt;
 * headlights) points to ...&lt;br /&gt;
 *   north -&amp;gt; heading is 0°,&lt;br /&gt;
 *   east  -&amp;gt; heading is 90°,&lt;br /&gt;
 *   south -&amp;gt; heading is 180°,&lt;br /&gt;
 *   west  -&amp;gt; heading is 270°.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
int16_t headingLSM303DLHC_TC(void)&lt;br /&gt;
{&lt;br /&gt;
	double hdgtc, xh, yh;&lt;br /&gt;
&lt;br /&gt;
	xh = xm * cos(the) + zm * sin(the);&lt;br /&gt;
	yh = xm * sin(phi) * sin(the) + ym * cos(phi) - zm * sin(phi) * cos(the);&lt;br /&gt;
//	zh = -xm * cos(phi) * sin(the) + ym * sin(phi) + zm * cos(phi) * cos(the);&lt;br /&gt;
	hdgtc = atan2(yh, xh) * 180 / M_PI + DECLINATION_M;&lt;br /&gt;
	if(hdgtc &amp;lt; 0.0) hdgtc += 360.0;&lt;br /&gt;
	return ((int16_t) hdgtc);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// --------------------------------------------&lt;br /&gt;
/**&lt;br /&gt;
 * Call this once before using the LSM303DLHC.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void LSM303DLHC_init(void)&lt;br /&gt;
{&lt;br /&gt;
	LSM303DLHC_A_init();						// Accelerometer init&lt;br /&gt;
	LSM303DLHC_M_init();						// Magnetometer init&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Analog Yaw-Rate Gyroscope (LY330ALH):&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Sets the LY330ALH mode of operation.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: mode -&amp;gt; Mode [0..3]&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void LY330ALH_set_mode(uint8_t mode)&lt;br /&gt;
{&lt;br /&gt;
	outport.pd_gyro = false;					// I/O 0.6: Low&lt;br /&gt;
	outport.st_gyro = false;					// I/O 0.7: Low&lt;br /&gt;
	if(mode &amp;amp; 1) outport.pd_gyro = true;&lt;br /&gt;
	if(mode &amp;amp; 2) outport.st_gyro = true;&lt;br /&gt;
	MAX7311_update();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Reads the ADC1 value from the RP6Base.&lt;br /&gt;
 *&lt;br /&gt;
 * Hints: - The RP6Base input ADC1 has to be&lt;br /&gt;
 *          connected to the USRBUS: Pin 2 on&lt;br /&gt;
 *          the RP6 mainboard!&lt;br /&gt;
 *        - The RP6Base_I2CSlave program has to&lt;br /&gt;
 *          be loaded into the RP6Base&lt;br /&gt;
 *          microcontroller!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
uint16_t getRP6Base_ADC1(void)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_readRegisters(I2C_RP6_BASE_ADR, I2C_REG_ADC_ADC1_L, registerBuf, 2);&lt;br /&gt;
	return (registerBuf[0] + (registerBuf[1] &amp;lt;&amp;lt; 8));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int16_t z_axisg;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Performs a LY330ALH gyroscope measurement and&lt;br /&gt;
 * returns the angular rate (velocity).&lt;br /&gt;
 * Positive values mean an angular rate while&lt;br /&gt;
 * rotating LEFT and negative values while&lt;br /&gt;
 * rotating RIGHT!&lt;br /&gt;
 * The global integer variable z_axisg also&lt;br /&gt;
 * contains the measurement result.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
int16_t LY330ALH_measure(void)&lt;br /&gt;
{&lt;br /&gt;
	z_axisg = getRP6Base_ADC1();				// Read raw data&lt;br /&gt;
	z_axisg -= ADCVAL_ZERORATE_LEVEL;			// Calculate value&lt;br /&gt;
	return (z_axisg);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Hot Swappable 2-Wire Bus Buffer (TCA4311A):&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Reads the TCA4311A Ready output. &lt;br /&gt;
 * The function returns the state (true/false).&lt;br /&gt;
 * The global variable readyBusbuff is also&lt;br /&gt;
 * filled with the Ready output state.&lt;br /&gt;
 *&lt;br /&gt;
 * Hint: You don't have to use this function,&lt;br /&gt;
 *       if the task task_RP6SensorBoard() is&lt;br /&gt;
 *       called frequently out of the main&lt;br /&gt;
 *       loop, because readyBusbuff will be&lt;br /&gt;
 *       updated by this task!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
uint8_t readReadyBusbuff(void)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmitByte(I2C_SENSOR_PORTEXP_ADR, MAX7311_INPUT_PORT1);&lt;br /&gt;
	readyBusbuff = I2CTWI_readByte(I2C_SENSOR_PORTEXP_ADR);&lt;br /&gt;
	readyBusbuff &amp;amp;= RDY_BUSBUFF;&lt;br /&gt;
	return readyBusbuff;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
uint8_t errorBusbuff;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * If the I2C bus for the I2C-MODULE (SCLOUT,&lt;br /&gt;
 * SDAOUT) is not used or shall be isolated from&lt;br /&gt;
 * the RP6 I2C bus, this can be done with this&lt;br /&gt;
 * function.&lt;br /&gt;
 *&lt;br /&gt;
 * Hints: - The I2C-MODULE power is NOT switched&lt;br /&gt;
 *          off by this function!&lt;br /&gt;
 *        - If USE_PD5 is defined in the&lt;br /&gt;
 *          configuration header file, this&lt;br /&gt;
 *          function uses the RP6M256 portpin,&lt;br /&gt;
 *          that is connected to plug I/O: Pin 9&lt;br /&gt;
 *          instead of MAX7311 I/O 1.0!&lt;br /&gt;
 *        - If the global variable errorBusbuff&lt;br /&gt;
 *          returns true, the bus buffer could&lt;br /&gt;
 *          not be switched to shutdown mode!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void TCA4311A_shutdown(void)&lt;br /&gt;
{&lt;br /&gt;
	// Wait until the I2C bus is idle:&lt;br /&gt;
	while(I2CTWI_isBusy() || TWI_operation != I2CTWI_NO_OPERATION) task_I2CTWI();&lt;br /&gt;
#ifdef USE_PD5&lt;br /&gt;
	IO_SENSOR_TCA4311A_EN_PORT &amp;amp;= ~IO_SENSOR_TCA4311A_EN_IN; // Low&lt;br /&gt;
#else&lt;br /&gt;
	outport.en_busbuff = false;					// I/O 1.0: Low&lt;br /&gt;
	MAX7311_update();&lt;br /&gt;
#endif&lt;br /&gt;
	errorBusbuff = readReadyBusbuff();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * If the I2C bus for the I2C-MODULE (SCLOUT,&lt;br /&gt;
 * SDAOUT) was isolated from the RP6 I2C bus with&lt;br /&gt;
 * the function TCA4311A_shutdown() before, it&lt;br /&gt;
 * can be connected again with this function.&lt;br /&gt;
 *&lt;br /&gt;
 * Hints: - The I2C-MODULE power is NOT switched&lt;br /&gt;
 *          on by this function!&lt;br /&gt;
 *        - If USE_PD5 is defined in the&lt;br /&gt;
 *          configuration header file, this&lt;br /&gt;
 *          function uses the RP6M256 portpin,&lt;br /&gt;
 *          that is connected to plug I/O: Pin 9&lt;br /&gt;
 *          instead of MAX7311 I/O 1.0!&lt;br /&gt;
 *        - If the global variable errorBusbuff&lt;br /&gt;
 *          returns true, the bus buffer could&lt;br /&gt;
 *          not be switched to normal operation!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void TCA4311A_reconnect(void)&lt;br /&gt;
{&lt;br /&gt;
	// Wait until the I2C bus is idle:&lt;br /&gt;
	while(I2CTWI_isBusy() || TWI_operation != I2CTWI_NO_OPERATION) task_I2CTWI();&lt;br /&gt;
#ifdef USE_PD5&lt;br /&gt;
	IO_SENSOR_TCA4311A_EN_PORT |= IO_SENSOR_TCA4311A_EN_IN; // High&lt;br /&gt;
#else&lt;br /&gt;
	outport.en_busbuff = true;					// I/O 1.0: High&lt;br /&gt;
	MAX7311_update();&lt;br /&gt;
#endif&lt;br /&gt;
	errorBusbuff = !readReadyBusbuff();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Sets/clears the RP6Base signal PWR.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: pwr -&amp;gt; 0 (false) = PWR off&lt;br /&gt;
 *               &amp;gt;0 (true) = PWR on&lt;br /&gt;
 *&lt;br /&gt;
 * Hints: - The RP6Base signal PWR has to be&lt;br /&gt;
 *          connected to the USRBUS: Pin 3 on&lt;br /&gt;
 *          the RP6 mainboard!&lt;br /&gt;
 *        - The RP6Base_I2CSlave program has to&lt;br /&gt;
 *          be loaded into the RP6Base&lt;br /&gt;
 *          microcontroller!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void setRP6Base_PWR(uint8_t pwr)&lt;br /&gt;
{&lt;br /&gt;
	if(pwr &amp;gt; 0)&lt;br /&gt;
		I2CTWI_transmit2Bytes(I2C_RP6_BASE_ADR, 0, CMD_POWER_ON);&lt;br /&gt;
	else&lt;br /&gt;
		I2CTWI_transmit2Bytes(I2C_RP6_BASE_ADR, 0, CMD_POWER_OFF);&lt;br /&gt;
	while(I2CTWI_isBusy() || TWI_operation != I2CTWI_NO_OPERATION) task_I2CTWI();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/** &lt;br /&gt;
 * With this function you can switch the I2C-&lt;br /&gt;
 * MODULE (plug M1) power on or off.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: pwr -&amp;gt; 0 (false) = I2C-MODULE power off&lt;br /&gt;
 *               &amp;gt;0 (true) = I2C-MODULE power on&lt;br /&gt;
 *&lt;br /&gt;
 * Hints: - If the I2C-MODULE plug is not used,&lt;br /&gt;
 *          you should always switch the&lt;br /&gt;
 *          I2C-MODULE power off (default)!&lt;br /&gt;
 *        - The TCA4311A is NOT switched to&lt;br /&gt;
 *          normal operation (default) or&lt;br /&gt;
 *          shutdown mode by this function!&lt;br /&gt;
 *        - The RP6Base signal PWR has to be&lt;br /&gt;
 *          connected to the USRBUS: Pin 3 on&lt;br /&gt;
 *          the RP6 mainboard!&lt;br /&gt;
 *        - The RP6Base_I2CSlave program has to&lt;br /&gt;
 *          be loaded into the RP6Base&lt;br /&gt;
 *          microcontroller!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void setI2CModulePower(uint8_t pwr)&lt;br /&gt;
{&lt;br /&gt;
	if(pwr &amp;gt; 0) {&lt;br /&gt;
		setRP6Base_PWR(1);						// RP6Base PWR on&lt;br /&gt;
		outport.pwr_i2c = true;					// I/O 0.0: High&lt;br /&gt;
	}&lt;br /&gt;
	else&lt;br /&gt;
		outport.pwr_i2c = false;				// I/O 0.0: Low&lt;br /&gt;
	MAX7311_update();&lt;br /&gt;
}	&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Button:&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Reads the MAX7311 I/O port 1.7. &lt;br /&gt;
 * The function returns true, if  button S1 is&lt;br /&gt;
 * pressed (I/O 1.7: Low!) and false, if it is&lt;br /&gt;
 * not pressed (I/O 1.7: High!).&lt;br /&gt;
 * The global variable pressedButton is also&lt;br /&gt;
 * filled with the I/O 1.7 output state.&lt;br /&gt;
 *&lt;br /&gt;
 * Hint: You don't have to use this function,&lt;br /&gt;
 *       if the task task_RP6SensorBoard() is&lt;br /&gt;
 *       called frequently out of the main&lt;br /&gt;
 *       loop, because pressedButton will be&lt;br /&gt;
 *       updated by this task!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
uint8_t readButton(void)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmitByte(I2C_SENSOR_PORTEXP_ADR, MAX7311_INPUT_PORT2);&lt;br /&gt;
	pressedButton = I2CTWI_readByte(I2C_SENSOR_PORTEXP_ADR);&lt;br /&gt;
	pressedButton &amp;amp;= IO2_I2C;&lt;br /&gt;
	pressedButton = !pressedButton;&lt;br /&gt;
	return pressedButton;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Status LED:&lt;br /&gt;
&lt;br /&gt;
/** &lt;br /&gt;
 * Sets the status LED (D2) of the RP6 Sensor&lt;br /&gt;
 * Board.&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *   setStatusLED(1);&lt;br /&gt;
 *   // This switches the status LED on!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void setStatusLED(uint8_t on)&lt;br /&gt;
{&lt;br /&gt;
	if(on &amp;gt; 0)&lt;br /&gt;
		outport.io1_i2c = false;				// I/O 1.6: Low&lt;br /&gt;
	else&lt;br /&gt;
		outport.io1_i2c = true;					// I/O 1.6: High&lt;br /&gt;
	MAX7311_update();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// RP6 Sensor Board initialisation and shutdown:&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * You MUST call this function at the beginning of a&lt;br /&gt;
 * main program, that uses the RP6 Sensor Board. &lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void sensor_board_init(void)&lt;br /&gt;
{&lt;br /&gt;
	// I/O Port Expander:&lt;br /&gt;
	MAX7311_init();&lt;br /&gt;
	// RTC:&lt;br /&gt;
	DS1339_init();&lt;br /&gt;
	// Temperature Sensor:&lt;br /&gt;
	LM75B_init();&lt;br /&gt;
	// Servo Controller:&lt;br /&gt;
	PCA9685_init(50);							// Init PWM 50 Hz&lt;br /&gt;
	// LED Driver:&lt;br /&gt;
	TCA6507_init();&lt;br /&gt;
	// 3D Magnetometer &amp;amp; Accelerometer:&lt;br /&gt;
	LSM303DLHC_init();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * If you don't use any function of the RP6&lt;br /&gt;
 * Sensor Board, you can put the board into&lt;br /&gt;
 * &amp;quot;SHUTDOWN MODE&amp;quot;. In this mode the electric&lt;br /&gt;
 * power consumption is very low to save energy.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void sensor_board_shutdown(void)&lt;br /&gt;
{&lt;br /&gt;
	// Servo Controller:&lt;br /&gt;
	PCA9685_shutdown();							// Shutdown PCA9685&lt;br /&gt;
	// Temperature Sensor:&lt;br /&gt;
	LM75B_shutdown();							// Shutdown LM75B&lt;br /&gt;
	// I/O Port Expander:&lt;br /&gt;
	MAX7311_write(MAX7311_OUTPUT_SHUTDOWN);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&lt;br /&gt;
/******************************************************************************&lt;br /&gt;
 * Additional info&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Changelog:&lt;br /&gt;
 * - v. 1.0 TCA4311A reconnect problem fixed 10.04.2014 by Dirk&lt;br /&gt;
 * - v. 0.9 Interrupt status functions added 09.04.2014 by Dirk&lt;br /&gt;
 * - v. 0.8 (initial release) 17.03.2014 by Dirk&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Erklärung&lt;br /&gt;
&lt;br /&gt;
=====Demo=====&lt;br /&gt;
makefile:&lt;br /&gt;
&amp;lt;pre&amp;gt;...&lt;br /&gt;
TARGET = RP6M256_Sensor_Board_01&lt;br /&gt;
...&lt;br /&gt;
SRC += $(RP6_LIB_PATH)/RP6common/RP6I2CmasterTWI.c&lt;br /&gt;
&lt;br /&gt;
SRC += $(RP6_LIB_PATH)/RP6control_M256_WIFI/RP6M256_Sensor_BoardLib.c&lt;br /&gt;
...&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Datei: RP6M256_Sensor_Board_01.c&lt;br /&gt;
&amp;lt;pre&amp;gt;/* &lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * RP6 ROBOT SYSTEM - RP6 CONTROL M256 Examples&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Example: RP6M256 Sensor Board&lt;br /&gt;
 * Author(s): Dirk&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Description:&lt;br /&gt;
 * In this example we show a first test for the RP6 Sensor Board.&lt;br /&gt;
 * &lt;br /&gt;
 * ############################################################################&lt;br /&gt;
 * The Robot does NOT move in this example! You can simply put it on a table&lt;br /&gt;
 * next to your PC and you should connect it to the PC via the USB Interface!&lt;br /&gt;
 * You should also connect to it via WIFI.&lt;br /&gt;
 * ############################################################################&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Includes:&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6M256Lib.h&amp;quot; 				// The RP6 M256 Library. &lt;br /&gt;
										// Always needs to be included!&lt;br /&gt;
#include &amp;quot;RP6I2CmasterTWI.h&amp;quot;			// Include the I2C-Bus Master Library&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Include our new &amp;quot;RP6M256 Sensor Board library&amp;quot;:&lt;br /&gt;
// (This is the library for accessing the RP6 Sensor Board!)&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6M256_Sensor_BoardLib.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Variables:&lt;br /&gt;
&lt;br /&gt;
char dir[3];&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Returns a 2 character string for the eighth&lt;br /&gt;
 * parts of the direction calculated from the&lt;br /&gt;
 * heading value.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: heading -&amp;gt; Heading value [0..359]&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void calculateDir(char *dir, uint16_t heading)&lt;br /&gt;
{&lt;br /&gt;
	dir[1] = ' ';&lt;br /&gt;
	dir[2] = '\0';&lt;br /&gt;
	if ((heading &amp;lt;= 22) || (heading &amp;gt;=338)) dir[0] = 'N';&lt;br /&gt;
	if ((heading &amp;gt;= 23) &amp;amp;&amp;amp; (heading &amp;lt;= 67)) {dir[0] = 'N'; dir[1] = 'E';} &lt;br /&gt;
	if ((heading &amp;gt;= 68) &amp;amp;&amp;amp; (heading &amp;lt;= 112)) dir[0] = 'E';&lt;br /&gt;
	if ((heading &amp;gt;= 113) &amp;amp;&amp;amp; (heading &amp;lt;= 157)) {dir[0] = 'S'; dir[1] = 'E';}&lt;br /&gt;
	if ((heading &amp;gt;= 158) &amp;amp;&amp;amp; (heading &amp;lt;= 202)) dir[0] = 'S';&lt;br /&gt;
	if ((heading &amp;gt;= 203) &amp;amp;&amp;amp; (heading &amp;lt;= 247)) {dir[0] = 'S'; dir[1] = 'W';}&lt;br /&gt;
	if ((heading &amp;gt;= 248) &amp;amp;&amp;amp; (heading &amp;lt;= 292)) dir[0] = 'W';&lt;br /&gt;
	if ((heading &amp;gt;= 293) &amp;amp;&amp;amp; (heading &amp;lt;= 337)) {dir[0] = 'N'; dir[1] = 'W';}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Write a floating point number to the WIFI.&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *&lt;br /&gt;
 *			// Write a floating point number to the WIFI (no exponent):&lt;br /&gt;
 *			writeDouble_WIFI(1234567.890, 11, 3);&lt;br /&gt;
 *&lt;br /&gt;
 * The value of prec (precision) defines the number of decimal places.&lt;br /&gt;
 * For 32 bit floating point variables (float, double ...) 6 is&lt;br /&gt;
 * the max. value for prec (7 relevant digits).&lt;br /&gt;
 * The value of width defines the overall number of characters in the&lt;br /&gt;
 * floating point number including the decimal point. The number of&lt;br /&gt;
 * pre-decimal positions is: (width - prec - 1).&lt;br /&gt;
 */&lt;br /&gt;
void writeDouble_WIFI(double number, uint8_t width, uint8_t prec)&lt;br /&gt;
{char buffer[width + 1];&lt;br /&gt;
	dtostrf(number, width, prec, &amp;amp;buffer[0]);&lt;br /&gt;
	writeString_WIFI(&amp;amp;buffer[0]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Write a floating point number to the LCD.&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *&lt;br /&gt;
 *			// Write a floating point number to the LCD (no exponent):&lt;br /&gt;
 *			writeDoubleLCD(1234567.890, 11, 3);&lt;br /&gt;
 *&lt;br /&gt;
 * The value of prec (precision) defines the number of decimal places.&lt;br /&gt;
 * For 32 bit floating point variables (float, double ...) 6 is&lt;br /&gt;
 * the max. value for prec (7 relevant digits).&lt;br /&gt;
 * The value of width defines the overall number of characters in the&lt;br /&gt;
 * floating point number including the decimal point. The number of&lt;br /&gt;
 * pre-decimal positions is: (width - prec - 1).&lt;br /&gt;
 */&lt;br /&gt;
void writeDoubleLCD(double number, uint8_t width, uint8_t prec)&lt;br /&gt;
{char buffer[width + 1];&lt;br /&gt;
	dtostrf(number, width, prec, &amp;amp;buffer[0]);&lt;br /&gt;
	writeStringLCD(&amp;amp;buffer[0]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Error handler&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function gets called automatically if there was an I2C Error like&lt;br /&gt;
 * the slave sent a &amp;quot;not acknowledge&amp;quot; (NACK, error codes e.g. 0x20 or 0x30).&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void I2C_transmissionError(uint8_t errorState)&lt;br /&gt;
{&lt;br /&gt;
	writeString_P_WIFI(&amp;quot;\nI2C ERROR - TWI STATE: 0x&amp;quot;);&lt;br /&gt;
	writeInteger_WIFI(errorState, HEX);&lt;br /&gt;
	writeChar_WIFI('\n');&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Main function - The program starts here:&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
	initRP6M256();    // Always call this first! The Processor will not work&lt;br /&gt;
					  // correctly otherwise. &lt;br /&gt;
&lt;br /&gt;
	initLCD(); // Initialize the LC-Display (LCD)&lt;br /&gt;
			   // Always call this before using the LCD!&lt;br /&gt;
&lt;br /&gt;
	setLEDs(0b1111);&lt;br /&gt;
	mSleep(500);&lt;br /&gt;
	setLEDs(0b0000);&lt;br /&gt;
&lt;br /&gt;
	writeString_P_WIFI(&amp;quot;\n\nRP6 Sensor Board Selftest 1!\n&amp;quot;); &lt;br /&gt;
&lt;br /&gt;
	// IMPORTANT:&lt;br /&gt;
	I2CTWI_initMaster(100); // Initialize the TWI Module for Master operation&lt;br /&gt;
							// with 100kHz SCL Frequency&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	// Register the event handler:&lt;br /&gt;
	I2CTWI_setTransmissionErrorHandler(I2C_transmissionError);&lt;br /&gt;
&lt;br /&gt;
	setLEDs(0b1111);&lt;br /&gt;
&lt;br /&gt;
	// Write a text message to the LCD:&lt;br /&gt;
	showScreenLCD(&amp;quot;################&amp;quot;, &amp;quot;################&amp;quot;);&lt;br /&gt;
	mSleep(1500);&lt;br /&gt;
	showScreenLCD(&amp;quot;RP6v2-M256-WIFI &amp;quot;, &amp;quot;Example Program&amp;quot;);&lt;br /&gt;
	mSleep(2500); &lt;br /&gt;
	showScreenLCD(&amp;quot;RP6 Sensor Board&amp;quot;, &amp;quot;   Selftest 1&amp;quot;);&lt;br /&gt;
	mSleep(2500);&lt;br /&gt;
	clearLCD();&lt;br /&gt;
&lt;br /&gt;
	setLEDs(0b0000);&lt;br /&gt;
&lt;br /&gt;
	// ---------------------------------------&lt;br /&gt;
&lt;br /&gt;
	uint8_t onoff = 0;&lt;br /&gt;
	uint16_t servopos = SERVO1_LT;&lt;br /&gt;
	int16_t rate;&lt;br /&gt;
&lt;br /&gt;
	startStopwatch1();&lt;br /&gt;
	startStopwatch2();&lt;br /&gt;
&lt;br /&gt;
	// IMPORTANT:&lt;br /&gt;
	sensor_board_init();						// RP6 Sensor Board init!!!&lt;br /&gt;
	setServoPower(1);							// Servo power ON!&lt;br /&gt;
/*&lt;br /&gt;
	// ----------------------------------------------&lt;br /&gt;
	// Set RTC once (battery empty or not existing:&lt;br /&gt;
	rtc_time.second = 0;&lt;br /&gt;
	rtc_time.minute = 15;&lt;br /&gt;
	rtc_time.hour = 20;				// 20:15&lt;br /&gt;
	rtc_date.weekday = R_SU;&lt;br /&gt;
	rtc_date.day = 20;&lt;br /&gt;
	rtc_date.month = 4;&lt;br /&gt;
	rtc_date.year = 2014;			// Su, 20.4.2014&lt;br /&gt;
	DS1339_write();&lt;br /&gt;
	// Remove this, if RTC is set and running!!!&lt;br /&gt;
	// ----------------------------------------------&lt;br /&gt;
*/&lt;br /&gt;
	while(true) &lt;br /&gt;
	{&lt;br /&gt;
		if(getStopwatch1() &amp;gt; 1000) // 1s&lt;br /&gt;
		{&lt;br /&gt;
			if (onoff) onoff = 0;&lt;br /&gt;
			else onoff = 1;&lt;br /&gt;
&lt;br /&gt;
			// Interrupt status:&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nInterrupt Status:      &amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(interrupt_RP6SBstatus.byte, BIN, 8);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			// Inport status:&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;Inport Status: &amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(inport.word, BIN, 16);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			// Temperature sensor test:&lt;br /&gt;
			temperature = LM75B_measure();		// Measure&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;Temperature: &amp;quot;);&lt;br /&gt;
			writeDouble_WIFI(temperature, 7, 3);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;°\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			// LED driver test:&lt;br /&gt;
			if (onoff) {&lt;br /&gt;
				setLED(HEADLIGHT_R, STATE_ON);&lt;br /&gt;
				setLED(HEADLIGHT_L, STATE_OFF);&lt;br /&gt;
			}&lt;br /&gt;
			else {&lt;br /&gt;
				setLED(HEADLIGHT_L, STATE_ON);&lt;br /&gt;
				setLED(HEADLIGHT_R, STATE_OFF);&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			// Servo controller test (SERVO_1):&lt;br /&gt;
			setServo(1, servopos);&lt;br /&gt;
			servopos += 10;&lt;br /&gt;
			if (servopos &amp;gt; SERVO1_RT) servopos = SERVO1_LT;&lt;br /&gt;
&lt;br /&gt;
			// RTC test:&lt;br /&gt;
			DS1339_read();&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;RTC: &amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(rtc_time.hour, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;:&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(rtc_time.minute, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;:&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(rtc_time.second, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;  &amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(rtc_date.day, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;.&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(rtc_date.month, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;.&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(rtc_date.year, DEC, 4);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			// 3D Magnetometer &amp;amp; Accelerometer test:&lt;br /&gt;
			//  LSM303DLHC accelerometer:&lt;br /&gt;
			task_I2CTWI();&lt;br /&gt;
			readLSM303DLHC_A();					// Get sensor values&lt;br /&gt;
			task_I2CTWI();&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\n3D-Acceleration SENSOR -&amp;gt;\n&amp;quot;);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;X-axis: &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(x_axisa, DEC);&lt;br /&gt;
			writeChar_WIFI('\n');&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;Y-axis: &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(y_axisa, DEC);&lt;br /&gt;
			writeChar_WIFI('\n');&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;Z-axis: &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(z_axisa, DEC);&lt;br /&gt;
			writeChar_WIFI('\n');&lt;br /&gt;
			normalizeLSM303DLHC_A();			// Normalize data&lt;br /&gt;
			positionLSM303DLHC_A();				// Calculate position&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;POSITION: \n&amp;quot;);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;  Pitch [°]: &amp;quot;);&lt;br /&gt;
			writeDouble_WIFI(pitch, 6, 1);&lt;br /&gt;
			writeChar_WIFI('\n');&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;  Roll [°]:  &amp;quot;);&lt;br /&gt;
			writeDouble_WIFI(roll, 6, 1);&lt;br /&gt;
			writeChar_WIFI('\n');&lt;br /&gt;
&lt;br /&gt;
			//  LSM303DLHC magnetometer:&lt;br /&gt;
			task_I2CTWI();&lt;br /&gt;
			readLSM303DLHC_M();					// Get sensor values&lt;br /&gt;
			task_I2CTWI();&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\n3D-Compass SENSOR -&amp;gt;\n&amp;quot;);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;X-axis: &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(x_axism, DEC);&lt;br /&gt;
			writeChar_WIFI('\n');&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;Y-axis: &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(y_axism, DEC);&lt;br /&gt;
			writeChar_WIFI('\n');&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;Z-axis: &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(z_axism, DEC);&lt;br /&gt;
			writeChar_WIFI('\n');&lt;br /&gt;
			normalizeLSM303DLHC_M();			// Normalize data&lt;br /&gt;
			headingm = headingLSM303DLHC_M();	// Calculate heading&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;                 Heading [°]: &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(headingm, DEC);&lt;br /&gt;
			calculateDir(dir, headingm);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;  Direction: &amp;quot;);&lt;br /&gt;
			writeString_WIFI(dir);&lt;br /&gt;
			writeChar_WIFI('\n');&lt;br /&gt;
			headingtc = headingLSM303DLHC_TC();	// Calculate TILT COMPENSATED&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;TILT COMPENSATED heading [°]: &amp;quot;); // heading&lt;br /&gt;
			writeInteger_WIFI(headingtc, DEC);&lt;br /&gt;
			calculateDir(dir, headingtc);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;  Direction: &amp;quot;);&lt;br /&gt;
			writeString_WIFI(dir);&lt;br /&gt;
			writeChar_WIFI('\n');&lt;br /&gt;
#ifdef GET_TEMP_M&lt;br /&gt;
			temperature_mag = (double) temperaturem / 8.0 + OFFSET_TEMP_M;&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;Temperature [°]: &amp;quot;);&lt;br /&gt;
			writeDouble_WIFI(temperature_mag, 7, 2);&lt;br /&gt;
			writeChar_WIFI('\n');&lt;br /&gt;
#endif&lt;br /&gt;
			// Yaw-Rate Gyroscope test:&lt;br /&gt;
			rate = LY330ALH_measure();&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\n1D-Gyro SENSOR -&amp;gt;\n&amp;quot;);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;Z-axis: &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(rate, DEC);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			// RP6 Sensor Board shutdown (button &amp;amp; status LED test):&lt;br /&gt;
			if (pressedButton) {&lt;br /&gt;
				setStatusLED(1);&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;\nPress button again for RP6 Sensor Board SHUTDOWN!\n&amp;quot;);&lt;br /&gt;
				mSleep(2000);&lt;br /&gt;
				do {&lt;br /&gt;
					if(getStopwatch2() &amp;gt; 200) { // 0.2s&lt;br /&gt;
						if (onoff) onoff = 0;&lt;br /&gt;
						else onoff = 1;&lt;br /&gt;
						if (onoff) setStatusLED(1);&lt;br /&gt;
						else setStatusLED(0);&lt;br /&gt;
						setStopwatch2(0);&lt;br /&gt;
					}&lt;br /&gt;
					mSleep(1);&lt;br /&gt;
					task_I2CTWI();&lt;br /&gt;
				} while (!readButton());&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;\n\n\n\n\nPlease wait for RP6 Sensor Board SHUTDOWN...\n&amp;quot;);&lt;br /&gt;
				sensor_board_shutdown();&lt;br /&gt;
				mSleep(3000);&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;\n\n\nThe RP6 Sensor Board now is in SHUTDOWN MODE!!!\n&amp;quot;);&lt;br /&gt;
				mSleep(1000);&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;\nRESET the M256 microcontroller now...\n\n&amp;quot;);&lt;br /&gt;
				while(true) {};&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			setStopwatch1(0);&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		task_checkINTs();						// Read interrupt signals&lt;br /&gt;
		task_RP6SensorBoard();					// RP6 Sensor Board task&lt;br /&gt;
&lt;br /&gt;
		task_I2CTWI();&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Erklärung&lt;br /&gt;
&lt;br /&gt;
====Projekte====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===RP6 Xtra Module===&lt;br /&gt;
Die Dokumentation zu den RP6 Xtra Modulen befindet sich auf der mitgelieferten ''&amp;quot;RP6 Robot System Xtra Modules CD-ROM&amp;quot;''. Auf der CD-ROM sind auch Software-Beispiele zu finden.&lt;br /&gt;
&lt;br /&gt;
Die hier veröffentlichte Software zu den Xtra Modulen ist eine Eigenentwicklung in GCC:&lt;br /&gt;
* Arexx [[RP6_Sensor_Board_und_Xtra_Module#I2C_GPS_Empf.C3.A4nger_JM3-GPS_2|I2C GPS Empfänger JM3-GPS]]&lt;br /&gt;
* Arexx [[RP6_Sensor_Board_und_Xtra_Module#Gyro_Modul_JM3-GYRO_2|Gyro Modul JM3-GYRO]]&lt;br /&gt;
* Arexx [[RP6_Sensor_Board_und_Xtra_Module#3D_Accelerometer_Modul_JM3-3DA_2|3D Accelerometer Modul JM3-3DA]]&lt;br /&gt;
&lt;br /&gt;
====I2C GPS Empfänger JM3-GPS====&lt;br /&gt;
=====RP6M256 WiFi: I2C_GPS Library=====&lt;br /&gt;
Die nachfolgende RP6M256_I2C_GPSLib (GCC) dient zur Ansteuerung des I2C GPS Empfängers durch die RP6M256 WiFi.&lt;br /&gt;
 &lt;br /&gt;
======Libary Header======&lt;br /&gt;
Datei: RP6M256_I2C_GPSLib.h&lt;br /&gt;
&amp;lt;pre&amp;gt;/* ****************************************************************************&lt;br /&gt;
 *                           _______________________&lt;br /&gt;
 *                           \| RP6  ROBOT SYSTEM |/&lt;br /&gt;
 *                            \_-_-_-_-_-_-_-_-_-_/           &amp;gt;&amp;gt;&amp;gt; RP6 M256 WIFI&lt;br /&gt;
 * ----------------------------------------------------------------------------&lt;br /&gt;
 * ----------------------------- [c]2014 - Dirk -------------------------------&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * File: RP6M256_I2C_GPSLib.h&lt;br /&gt;
 * Version: 1.0&lt;br /&gt;
 * Target: RP6 M256 WIFI - ATMEGA2560 @16.00MHz&lt;br /&gt;
 * Author(s): Dirk&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Description:&lt;br /&gt;
 * Header file for new RP6 I2C GPS Receiver library.&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
#ifndef RP6M256_I2C_GPSLIB_H&lt;br /&gt;
#define RP6M256_I2C_GPSLIB_H&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// RP6 Sensor Board:&lt;br /&gt;
&lt;br /&gt;
// If you want to use the RP6 I2C GPS Receiver on the RP6 Sensor Board, you&lt;br /&gt;
// have to define SENSOR_BOARD (default)!&lt;br /&gt;
// If SENSOR_BOARD is NOT defined, this library assumes that the RP6 I2C GPS&lt;br /&gt;
// Receiver is used stand-alone.&lt;br /&gt;
// ------------------&lt;br /&gt;
#define SENSOR_BOARD&lt;br /&gt;
// ------------------&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Includes:&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6M256Lib.h&amp;quot;&lt;br /&gt;
#include &amp;quot;RP6I2CmasterTWI.h&amp;quot;&lt;br /&gt;
#ifdef SENSOR_BOARD&lt;br /&gt;
	#include &amp;quot;RP6M256_Sensor_BoardLib.h&amp;quot;&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// RP6 I2C GPS Receiver:&lt;br /&gt;
#define I2C_GPS_RECEIVER_ADR			0xc8	// Default&lt;br /&gt;
//#define I2C_GPS_RECEIVER_ADR			0xca&lt;br /&gt;
//#define I2C_GPS_RECEIVER_ADR			0xcc&lt;br /&gt;
//#define I2C_GPS_RECEIVER_ADR			0xce&lt;br /&gt;
//#define I2C_GPS_RECEIVER_ADR			0xd0	// DO NOT USE on Sensor Board!&lt;br /&gt;
//#define I2C_GPS_RECEIVER_ADR			0xd2&lt;br /&gt;
//#define I2C_GPS_RECEIVER_ADR			0xd4&lt;br /&gt;
//#define I2C_GPS_RECEIVER_ADR			0xd6&lt;br /&gt;
//#define I2C_GPS_RECEIVER_ADR			0xd8&lt;br /&gt;
//#define I2C_GPS_RECEIVER_ADR			0xda&lt;br /&gt;
//#define I2C_GPS_RECEIVER_ADR			0xdc&lt;br /&gt;
//#define I2C_GPS_RECEIVER_ADR			0xde&lt;br /&gt;
&lt;br /&gt;
// Read registers:&lt;br /&gt;
#define WHO_AM_I						0x20	// I2C address [0xc8..0xde]&lt;br /&gt;
#define LAT_DEG							0x21	// Degrees&lt;br /&gt;
#define LAT_MIN							0x22	// Minutes&lt;br /&gt;
#define LAT_MIN_D_L						0x23	// Minutes decimal part low&lt;br /&gt;
#define LAT_MIN_D_H						0x24	// Minutes decimal part high&lt;br /&gt;
#define LON_DEG							0x25	// Degrees&lt;br /&gt;
#define LON_MIN							0x26	// Minutes&lt;br /&gt;
#define LON_MIN_D_L						0x27	// Minutes decimal part low&lt;br /&gt;
#define LON_MIN_D_H						0x28	// Minutes decimal part high&lt;br /&gt;
#define STATUS							0x29	// Status flags&lt;br /&gt;
#define FIX_IND							0x2a	// FIX_IND&lt;br /&gt;
#define HDOP							0x2b	// HDOP&lt;br /&gt;
#define HDOP_D							0x2c	// HDOP_D&lt;br /&gt;
#define SAT_N							0x2d	// Number of satellites&lt;br /&gt;
#define COURSE_T_L						0x2e	// True heading low byte&lt;br /&gt;
#define COURSE_T_H						0x2f	// True heading high byte&lt;br /&gt;
#define COURSE_T_D						0x30	// Decimal part of course&lt;br /&gt;
#define SPEED_L							0x31	// Speed low byte&lt;br /&gt;
#define SPEED_H							0x32	// Speed high byte&lt;br /&gt;
#define SPEED_D							0x33	// Speed decimal part&lt;br /&gt;
#define ALT_L							0x34	// Altitude low byte&lt;br /&gt;
#define ALT_H							0x35	// Altitude high byte&lt;br /&gt;
#define ALT_DIF_L						0x36	// Differ. WGS-84 MSL low byte&lt;br /&gt;
#define ALT_DIF_H						0x37	// Differ. WGS-84 MSL high byte&lt;br /&gt;
#define UTC_H							0x38	// UTC hour&lt;br /&gt;
#define UTC_MIN							0x39	// UTC minute&lt;br /&gt;
#define UTC_S							0x3a	// UTC second&lt;br /&gt;
#define DAY								0x3b	// Day&lt;br /&gt;
#define YEAR_L							0x3c	// Year low byte&lt;br /&gt;
#define YEAR_H							0x3d	// Year high byte&lt;br /&gt;
#define MONTH							0x3e	// Month&lt;br /&gt;
#define PDOP							0x3f	// PDOP&lt;br /&gt;
#define PDOP_D							0x40	// PDOP_D&lt;br /&gt;
#define VDOP							0x41	// VDOP&lt;br /&gt;
#define VDOP_D							0x42	// VDOP_D&lt;br /&gt;
#define SAT_1							0x43	// SAT # 1&lt;br /&gt;
#define SAT_2							0x44	// SAT # 2&lt;br /&gt;
#define SAT_3							0x45	// SAT # 3&lt;br /&gt;
#define SAT_4							0x46	// SAT # 4&lt;br /&gt;
#define SAT_5							0x47	// SAT # 5&lt;br /&gt;
#define SAT_6							0x48	// SAT # 6&lt;br /&gt;
#define SAT_7							0x49	// SAT # 7&lt;br /&gt;
#define SAT_8							0x4a	// SAT # 8&lt;br /&gt;
#define SAT_9							0x4b	// SAT # 9&lt;br /&gt;
#define SAT_A							0x4c	// SAT # 10&lt;br /&gt;
#define SAT_B							0x4d	// SAT # 11&lt;br /&gt;
#define SAT_C							0x4e	// SAT # 12&lt;br /&gt;
#define SW_VERSION						0x4f	// SW_Version&lt;br /&gt;
#define HEARTBEAT						0x50	// Heartbeat&lt;br /&gt;
&lt;br /&gt;
// Status and Fix_Ind register bitmasks:&lt;br /&gt;
#define STATUS_NS						0b00000001&lt;br /&gt;
#define STATUS_EW						0b00000010&lt;br /&gt;
#define STATUS_SPU						0b00000100&lt;br /&gt;
#define STATUS_AUTON					0b00001000&lt;br /&gt;
#define FIX_IND_UI_FIX					0b10000000&lt;br /&gt;
&lt;br /&gt;
// Write registers:&lt;br /&gt;
#define INIT_CFG						0x90	// INIT CFG&lt;br /&gt;
#define SET_FIX_TIME					0x91	// Pos_Fix_Time&lt;br /&gt;
#define STBY							0x92	// STBY&lt;br /&gt;
#define FAC_RES							0x93	// Factory Reset&lt;br /&gt;
#define EN_JAM							0x94	// Jamming Remover&lt;br /&gt;
#define TEST_MODE						0x96	// Test Mode&lt;br /&gt;
&lt;br /&gt;
// Write register values (commands):&lt;br /&gt;
#define INIT_CFG_HOT_START				1		// Hot Start&lt;br /&gt;
#define INIT_CFG_WARM_START				2		// Warm Start init data loaded&lt;br /&gt;
#define INIT_CFG_WARM_START_EPH_CLR		3		// Warm Start Ephemeris cleared&lt;br /&gt;
#define INIT_CFG_COLD_START				4		// Cold Start&lt;br /&gt;
#define SET_FIX_TIME_1S					1		// Pos Fix Time 1 second&lt;br /&gt;
#define SET_FIX_TIME_2S					2		// Pos Fix Time 2 seconds&lt;br /&gt;
#define STBY_ENTER						1		// Standby (cleared after write)&lt;br /&gt;
#define FAC_RES_ENTER					1		// Factory Reset&lt;br /&gt;
#define EN_JAM_DISABLE					0		// Jamming Remover disable&lt;br /&gt;
#define EN_JAM_ENABLE					1		// Jamming Remover enable&lt;br /&gt;
#define TEST_MODE_INACTIVE				0		// Test Mode inactive&lt;br /&gt;
#define TEST_MODE_ACTIVE				0x15	// Test Mode active&lt;br /&gt;
&lt;br /&gt;
// Data structure (starts at LAT_DEG):&lt;br /&gt;
#define DATA_STRUCT						LAT_DEG	// Start&lt;br /&gt;
// All data from LAT_DEG to HEARTBEAT (48 bytes):&lt;br /&gt;
#define DATA_LENGTH						(HEARTBEAT - LAT_DEG + 1)&lt;br /&gt;
// Basic data from LAT_DEG to SAT_N (13 bytes):&lt;br /&gt;
#define DATA_BASIC						(SAT_N - LAT_DEG + 1)&lt;br /&gt;
&lt;br /&gt;
typedef union {&lt;br /&gt;
 	uint8_t byte;&lt;br /&gt;
	struct {&lt;br /&gt;
		unsigned ns    :1;				// 1: North 0: South&lt;br /&gt;
		unsigned ew    :1;				// 1: East 0: West&lt;br /&gt;
		unsigned spu   :1;				// 1: km/h 0: kn&lt;br /&gt;
		unsigned auton :1;				// 1: Data not valid 0: Autonomous&lt;br /&gt;
		unsigned fix0  :1;&lt;br /&gt;
		unsigned fix1  :1;&lt;br /&gt;
		unsigned stat0 :1;				// Invalid&lt;br /&gt;
		unsigned stat1 :1;				// GPS Com Error&lt;br /&gt;
	};&lt;br /&gt;
	struct {&lt;br /&gt;
		unsigned ns    :1;				// 1: North 0: South&lt;br /&gt;
		unsigned ew    :1;				// 1: East 0: West&lt;br /&gt;
		unsigned spu   :1;				// 1: km/h 0: kn&lt;br /&gt;
		unsigned auton :1;				// 1: Data not valid 0: Autonomous&lt;br /&gt;
		unsigned fix   :2;&lt;br /&gt;
		unsigned stat  :2;				// 00 -&amp;gt; Valid&lt;br /&gt;
										// 01 -&amp;gt; Invalid&lt;br /&gt;
										// 10 -&amp;gt; GPS Com Error&lt;br /&gt;
										// 11 -&amp;gt; n. def.&lt;br /&gt;
	};&lt;br /&gt;
} status_t;&lt;br /&gt;
&lt;br /&gt;
typedef union {&lt;br /&gt;
 	uint8_t byte;&lt;br /&gt;
	struct {							// Fix indicator:&lt;br /&gt;
		unsigned fix_0  :1;				//  1: GPS fix          2: DGPS fix&lt;br /&gt;
		unsigned fix_1  :1;				//  3: PPS fix          4: RTK&lt;br /&gt;
		unsigned fix_2  :1;				//  5: Float RTK        6: Dead reck.&lt;br /&gt;
		unsigned fix_3  :1;				//  7: Manual inp. mode 8: Simul. mode&lt;br /&gt;
		unsigned unused :3;&lt;br /&gt;
		unsigned ui_fix :1;				// HW signal from UC530&lt;br /&gt;
	};&lt;br /&gt;
	struct {&lt;br /&gt;
		unsigned fix    :4;				// See above &amp;quot;Fix indicator&amp;quot;!&lt;br /&gt;
		unsigned unused :3;&lt;br /&gt;
		unsigned ui_fix :1;				// HW signal from UC530&lt;br /&gt;
	};&lt;br /&gt;
} fix_ind_t;&lt;br /&gt;
&lt;br /&gt;
typedef union {&lt;br /&gt;
	struct {&lt;br /&gt;
		uint8_t   latDeg;&lt;br /&gt;
		uint8_t   latMin;&lt;br /&gt;
		uint16_t  latMinDec;&lt;br /&gt;
		uint8_t   lonDeg;&lt;br /&gt;
		uint8_t   lonMin;&lt;br /&gt;
		uint16_t  lonMinDec;&lt;br /&gt;
		status_t  status;&lt;br /&gt;
		fix_ind_t fixInd;&lt;br /&gt;
		uint8_t   hdop;&lt;br /&gt;
		uint8_t   hdopDec;&lt;br /&gt;
		uint8_t   satCount;&lt;br /&gt;
		uint16_t  course;&lt;br /&gt;
		uint8_t   courseDec;&lt;br /&gt;
		uint16_t  speed;&lt;br /&gt;
		uint8_t   speedDec;&lt;br /&gt;
		uint16_t  altitude;&lt;br /&gt;
		uint16_t  altDif;&lt;br /&gt;
		uint8_t   utcHour;&lt;br /&gt;
		uint8_t   utcMinute;&lt;br /&gt;
		uint8_t   utcSec;&lt;br /&gt;
		uint8_t   day;&lt;br /&gt;
		uint16_t  year;&lt;br /&gt;
		uint8_t   month;&lt;br /&gt;
		uint8_t   pdop;&lt;br /&gt;
		uint8_t   pdopDec;&lt;br /&gt;
		uint8_t   vdop;&lt;br /&gt;
		uint8_t   vdopDec;&lt;br /&gt;
		uint8_t   sat[12];&lt;br /&gt;
		uint8_t   swVersion;&lt;br /&gt;
		uint8_t   heartbeat;&lt;br /&gt;
	};&lt;br /&gt;
} gpsdata_t;&lt;br /&gt;
extern gpsdata_t gpsdata;&lt;br /&gt;
&lt;br /&gt;
void I2C_GPS_reset(void);&lt;br /&gt;
void I2C_GPS_write_cmd(uint8_t, uint8_t);&lt;br /&gt;
uint8_t I2C_GPS_read_reg(uint8_t);&lt;br /&gt;
void I2C_GPS_read(uint8_t);&lt;br /&gt;
void I2C_GPS_init(void);&lt;br /&gt;
void I2C_GPS_new_addr(uint8_t);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
/******************************************************************************&lt;br /&gt;
 * Additional info&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Changelog:&lt;br /&gt;
 * &lt;br /&gt;
 *  ---&amp;gt; changes are documented in the file &amp;quot;RP6M256_I2C_GPSLib.c&amp;quot;&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
======Libary Source======&lt;br /&gt;
Datei: RP6M256_I2C_GPSLib.c&lt;br /&gt;
&amp;lt;pre&amp;gt;/* ****************************************************************************&lt;br /&gt;
 *                           _______________________&lt;br /&gt;
 *                           \| RP6  ROBOT SYSTEM |/&lt;br /&gt;
 *                            \_-_-_-_-_-_-_-_-_-_/           &amp;gt;&amp;gt;&amp;gt; RP6 M256 WIFI&lt;br /&gt;
 * ----------------------------------------------------------------------------&lt;br /&gt;
 * ----------------------------- [c]2014 - Dirk -------------------------------&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * File: RP6M256_I2C_GPSLib.c&lt;br /&gt;
 * Version: 1.0&lt;br /&gt;
 * Target: RP6 M256 WIFI - ATMEGA2560 @16.00MHz&lt;br /&gt;
 *         and a RP6 I2C GPS Receiver (CONRAD 1082385)&lt;br /&gt;
 *         optionally on a RP6 Sensor Board (CONRAD 1082384)&lt;br /&gt;
 * Author(s): Dirk&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Description:&lt;br /&gt;
 * &lt;br /&gt;
 * This is our new Library that contains basic routines and functions for&lt;br /&gt;
 * accessing the RP6 I2C GPS Receiver JM3-GPS (CONRAD 1082385).&lt;br /&gt;
 * The library assumes the I2C GPS Receiver software (firmware) v1.2.&lt;br /&gt;
 * If the I2C GPS Receiver is located on the RP6 Sensor Board (CONRAD 1082384)&lt;br /&gt;
 * and connected to the I2C-MODULE plug M1, the RP6M256_Sensor_BoardLib has to&lt;br /&gt;
 * be included!&lt;br /&gt;
 * &lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Includes:&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6M256_I2C_GPSLib.h&amp;quot; 		&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Variables:&lt;br /&gt;
&lt;br /&gt;
uint8_t gpsdataBuf[DATA_LENGTH + 1]; &lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Software reset for the I2C GPS Receiver.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void I2C_GPS_reset(void)&lt;br /&gt;
{&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_GPS_RECEIVER_ADR, 0, 0x06);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Writes a command cmd to a register reg of the&lt;br /&gt;
 * I2C GPS Receiver.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: reg -&amp;gt; Write register [0x90..0x96]&lt;br /&gt;
 *        cmd -&amp;gt; Command&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void I2C_GPS_write_cmd(uint8_t reg, uint8_t cmd)&lt;br /&gt;
{&lt;br /&gt;
	if((reg &amp;lt; INIT_CFG) || (reg &amp;gt; TEST_MODE)) return;&lt;br /&gt;
	I2CTWI_transmit2Bytes(I2C_GPS_RECEIVER_ADR, reg, cmd);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Reads a single register reg from the I2C GPS&lt;br /&gt;
 * Receiver.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: reg -&amp;gt; Read register [0x20..0x50]&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
uint8_t I2C_GPS_read_reg(uint8_t reg)&lt;br /&gt;
{&lt;br /&gt;
	if((reg &amp;lt; WHO_AM_I) || (reg &amp;gt; HEARTBEAT)) reg = WHO_AM_I;&lt;br /&gt;
	I2CTWI_transmitByte(I2C_GPS_RECEIVER_ADR, reg);&lt;br /&gt;
	return (I2CTWI_readByte(I2C_GPS_RECEIVER_ADR));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
gpsdata_t gpsdata;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Reads the GPS data from the I2C GPS Receiver.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: length -&amp;gt; Number of data bytes [1..48]&lt;br /&gt;
 *&lt;br /&gt;
 * Hint: If length = DATA_BASIC, only basic GPS&lt;br /&gt;
 *       data are read. If length = DATA_LENGTH,&lt;br /&gt;
 *       ALL GPS data are read.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void I2C_GPS_read(uint8_t length)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t i;&lt;br /&gt;
&lt;br /&gt;
	if(length &amp;gt; DATA_LENGTH) length = DATA_LENGTH;&lt;br /&gt;
	I2CTWI_readRegisters(I2C_GPS_RECEIVER_ADR, DATA_STRUCT, gpsdataBuf, length);&lt;br /&gt;
	for(i = length; i &amp;lt; DATA_LENGTH; i++) {&lt;br /&gt;
		gpsdataBuf[i] = 0;&lt;br /&gt;
	}&lt;br /&gt;
	gpsdata.latDeg = gpsdataBuf[0];&lt;br /&gt;
	gpsdata.latMin = gpsdataBuf[1];&lt;br /&gt;
	gpsdata.latMinDec = gpsdataBuf[2] + (gpsdataBuf[3] &amp;lt;&amp;lt; 8);&lt;br /&gt;
	gpsdata.lonDeg = gpsdataBuf[4];&lt;br /&gt;
	gpsdata.lonMin = gpsdataBuf[5];&lt;br /&gt;
	gpsdata.lonMinDec = gpsdataBuf[6] + (gpsdataBuf[7] &amp;lt;&amp;lt; 8);&lt;br /&gt;
	gpsdata.status.byte = gpsdataBuf[8];&lt;br /&gt;
	gpsdata.fixInd.byte = gpsdataBuf[9];&lt;br /&gt;
	gpsdata.hdop = gpsdataBuf[10];&lt;br /&gt;
	gpsdata.hdopDec = gpsdataBuf[11];&lt;br /&gt;
	gpsdata.satCount = gpsdataBuf[12];&lt;br /&gt;
	if(length == DATA_BASIC) return;&lt;br /&gt;
	gpsdata.course = gpsdataBuf[13] + (gpsdataBuf[14] &amp;lt;&amp;lt; 8);&lt;br /&gt;
	gpsdata.courseDec = gpsdataBuf[15];&lt;br /&gt;
	gpsdata.speed = gpsdataBuf[16] + (gpsdataBuf[17] &amp;lt;&amp;lt; 8);&lt;br /&gt;
	gpsdata.speedDec = gpsdataBuf[18];&lt;br /&gt;
	gpsdata.altitude = gpsdataBuf[19] + (gpsdataBuf[20] &amp;lt;&amp;lt; 8);&lt;br /&gt;
	gpsdata.altDif = gpsdataBuf[21] + (gpsdataBuf[22] &amp;lt;&amp;lt; 8);&lt;br /&gt;
	gpsdata.utcHour = gpsdataBuf[23];&lt;br /&gt;
	gpsdata.utcMinute = gpsdataBuf[24];&lt;br /&gt;
	gpsdata.utcSec = gpsdataBuf[25];&lt;br /&gt;
	gpsdata.day = gpsdataBuf[26];&lt;br /&gt;
	gpsdata.year = gpsdataBuf[27] + (gpsdataBuf[28] * 100);&lt;br /&gt;
	gpsdata.month = gpsdataBuf[29];&lt;br /&gt;
	gpsdata.pdop = gpsdataBuf[30];&lt;br /&gt;
	gpsdata.pdopDec = gpsdataBuf[31];&lt;br /&gt;
	gpsdata.vdop = gpsdataBuf[32];&lt;br /&gt;
	gpsdata.vdopDec = gpsdataBuf[33];&lt;br /&gt;
	for(i = 34; i &amp;lt; 46; i++) {&lt;br /&gt;
		gpsdata.sat[i - 34] = gpsdataBuf[i];&lt;br /&gt;
	}&lt;br /&gt;
	gpsdata.swVersion = gpsdataBuf[46];&lt;br /&gt;
	gpsdata.heartbeat = gpsdataBuf[47];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * You MUST call this function at the beginning of a&lt;br /&gt;
 * main program, that uses the RP6 I2C GPS Receiver. &lt;br /&gt;
 * If SENSOR_BOARD is defined, the I2C-MODULE power&lt;br /&gt;
 * will be switched on with the function&lt;br /&gt;
 * setI2CModulePower() defined in the&lt;br /&gt;
 * RP6M256_Sensor_BoardLib, which will be included&lt;br /&gt;
 * then.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void I2C_GPS_init(void)&lt;br /&gt;
{&lt;br /&gt;
#ifdef SENSOR_BOARD&lt;br /&gt;
	// I2C-MODULE (plug M1) power on: &lt;br /&gt;
	setI2CModulePower(1);&lt;br /&gt;
#endif&lt;br /&gt;
	// Other init procedures here!&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Writes a new I2C address to the I2C GPS Receiver.&lt;br /&gt;
 *&lt;br /&gt;
 * Input: addr -&amp;gt; New I2C address [0xc8..0xde]&lt;br /&gt;
 *&lt;br /&gt;
 * Hints: - Default I2C address is 0xc8.&lt;br /&gt;
 *        - You may choose a new I2C address in&lt;br /&gt;
 *          the range 0xc8..0xde.&lt;br /&gt;
 *        - After writing a new address you have&lt;br /&gt;
 *          to switch the I2C GPS Receiver off&lt;br /&gt;
 *          and on again.&lt;br /&gt;
 *        - Definition I2C_GPS_RECEIVER_ADR must&lt;br /&gt;
 *          be adapted to the new I2C address!&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void I2C_GPS_new_addr(uint8_t addr)&lt;br /&gt;
{&lt;br /&gt;
	if((addr &amp;lt; 0xc8) || (addr &amp;gt; 0xde)) return;&lt;br /&gt;
	addr &amp;amp;= 0xfe;								// Clear R/W bit&lt;br /&gt;
	I2CTWI_transmit3Bytes(I2C_GPS_RECEIVER_ADR, 0, 0x04, addr);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&lt;br /&gt;
/******************************************************************************&lt;br /&gt;
 * Additional info&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Changelog:&lt;br /&gt;
 * - v. 1.0 (initial release) 21.04.2014 by Dirk&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Erklärung&lt;br /&gt;
&lt;br /&gt;
======Demo======&lt;br /&gt;
makefile:&lt;br /&gt;
&amp;lt;pre&amp;gt;...&lt;br /&gt;
TARGET = RP6M256_Sensor_Board_02&lt;br /&gt;
...&lt;br /&gt;
SRC += $(RP6_LIB_PATH)/RP6common/RP6I2CmasterTWI.c&lt;br /&gt;
&lt;br /&gt;
SRC += $(RP6_LIB_PATH)/RP6control_M256_WIFI/RP6M256_Sensor_BoardLib.c&lt;br /&gt;
SRC += $(RP6_LIB_PATH)/RP6control_M256_WIFI/RP6M256_I2C_GPSLib.c&lt;br /&gt;
...&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Datei: RP6M256_Sensor_Board_02.c&lt;br /&gt;
&amp;lt;pre&amp;gt;/* &lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * RP6 ROBOT SYSTEM - RP6 CONTROL M256 Examples&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Example: RP6M256 Sensor Board&lt;br /&gt;
 * Author(s): Dirk&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Description:&lt;br /&gt;
 * In this example we show a second test for the RP6 Sensor Board.&lt;br /&gt;
 * &lt;br /&gt;
 * ############################################################################&lt;br /&gt;
 * The Robot does NOT move in this example! You can simply put it on a table&lt;br /&gt;
 * next to your PC and you should connect it to the PC via the USB Interface!&lt;br /&gt;
 * You should also connect to it via WIFI.&lt;br /&gt;
 * ############################################################################&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Includes:&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6M256Lib.h&amp;quot; 				// The RP6 M256 Library. &lt;br /&gt;
										// Always needs to be included!&lt;br /&gt;
#include &amp;quot;RP6I2CmasterTWI.h&amp;quot;			// Include the I2C-Bus Master Library&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Include our new &amp;quot;RP6M256 I2C GPS Receiver library&amp;quot;:&lt;br /&gt;
// (This is the library for accessing the RP6 I2C GPS Receiver!)&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6M256_I2C_GPSLib.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Write a floating point number to the WIFI.&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *&lt;br /&gt;
 *			// Write a floating point number to the WIFI (no exponent):&lt;br /&gt;
 *			writeDouble_WIFI(1234567.890, 11, 3);&lt;br /&gt;
 *&lt;br /&gt;
 * The value of prec (precision) defines the number of decimal places.&lt;br /&gt;
 * For 32 bit floating point variables (float, double ...) 6 is&lt;br /&gt;
 * the max. value for prec (7 relevant digits).&lt;br /&gt;
 * The value of width defines the overall number of characters in the&lt;br /&gt;
 * floating point number including the decimal point. The number of&lt;br /&gt;
 * pre-decimal positions is: (width - prec - 1).&lt;br /&gt;
 */&lt;br /&gt;
void writeDouble_WIFI(double number, uint8_t width, uint8_t prec)&lt;br /&gt;
{char buffer[width + 1];&lt;br /&gt;
	dtostrf(number, width, prec, &amp;amp;buffer[0]);&lt;br /&gt;
	writeString_WIFI(&amp;amp;buffer[0]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Write a floating point number to the LCD.&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *&lt;br /&gt;
 *			// Write a floating point number to the LCD (no exponent):&lt;br /&gt;
 *			writeDoubleLCD(1234567.890, 11, 3);&lt;br /&gt;
 *&lt;br /&gt;
 * The value of prec (precision) defines the number of decimal places.&lt;br /&gt;
 * For 32 bit floating point variables (float, double ...) 6 is&lt;br /&gt;
 * the max. value for prec (7 relevant digits).&lt;br /&gt;
 * The value of width defines the overall number of characters in the&lt;br /&gt;
 * floating point number including the decimal point. The number of&lt;br /&gt;
 * pre-decimal positions is: (width - prec - 1).&lt;br /&gt;
 */&lt;br /&gt;
void writeDoubleLCD(double number, uint8_t width, uint8_t prec)&lt;br /&gt;
{char buffer[width + 1];&lt;br /&gt;
	dtostrf(number, width, prec, &amp;amp;buffer[0]);&lt;br /&gt;
	writeStringLCD(&amp;amp;buffer[0]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// I2C Error handler&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function gets called automatically if there was an I2C Error like&lt;br /&gt;
 * the slave sent a &amp;quot;not acknowledge&amp;quot; (NACK, error codes e.g. 0x20 or 0x30).&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void I2C_transmissionError(uint8_t errorState)&lt;br /&gt;
{&lt;br /&gt;
	writeString_P_WIFI(&amp;quot;\nI2C ERROR - TWI STATE: 0x&amp;quot;);&lt;br /&gt;
	writeInteger_WIFI(errorState, HEX);&lt;br /&gt;
	writeChar_WIFI('\n');&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Main function - The program starts here:&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
	initRP6M256();    // Always call this first! The Processor will not work&lt;br /&gt;
					  // correctly otherwise. &lt;br /&gt;
&lt;br /&gt;
	initLCD(); // Initialize the LC-Display (LCD)&lt;br /&gt;
			   // Always call this before using the LCD!&lt;br /&gt;
&lt;br /&gt;
	setLEDs(0b1111);&lt;br /&gt;
	mSleep(500);&lt;br /&gt;
	setLEDs(0b0000);&lt;br /&gt;
&lt;br /&gt;
	writeString_P_WIFI(&amp;quot;\n\nRP6 Sensor Board Selftest 2!\n&amp;quot;); &lt;br /&gt;
&lt;br /&gt;
	// IMPORTANT:&lt;br /&gt;
	I2CTWI_initMaster(100); // Initialize the TWI Module for Master operation&lt;br /&gt;
							// with 100kHz SCL Frequency&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	// Register the event handler:&lt;br /&gt;
	I2CTWI_setTransmissionErrorHandler(I2C_transmissionError);&lt;br /&gt;
&lt;br /&gt;
	setLEDs(0b1111);&lt;br /&gt;
&lt;br /&gt;
	// Write a text message to the LCD:&lt;br /&gt;
	showScreenLCD(&amp;quot;################&amp;quot;, &amp;quot;################&amp;quot;);&lt;br /&gt;
	mSleep(1500);&lt;br /&gt;
	showScreenLCD(&amp;quot;RP6v2-M256-WIFI &amp;quot;, &amp;quot;Example Program&amp;quot;);&lt;br /&gt;
	mSleep(2500); &lt;br /&gt;
	showScreenLCD(&amp;quot;RP6 Sensor Board&amp;quot;, &amp;quot;   Selftest 2&amp;quot;);&lt;br /&gt;
	mSleep(2500);&lt;br /&gt;
	clearLCD();&lt;br /&gt;
&lt;br /&gt;
	setLEDs(0b0000);&lt;br /&gt;
&lt;br /&gt;
	// ---------------------------------------&lt;br /&gt;
&lt;br /&gt;
	uint8_t onoff = 0;&lt;br /&gt;
	uint8_t i;&lt;br /&gt;
&lt;br /&gt;
	startStopwatch1();&lt;br /&gt;
	startStopwatch2();&lt;br /&gt;
&lt;br /&gt;
	// IMPORTANT:&lt;br /&gt;
	sensor_board_init();						// RP6 Sensor Board init!!!&lt;br /&gt;
	I2C_GPS_init();								// RP6 I2C GPS Receiver init&lt;br /&gt;
&lt;br /&gt;
	while(true) &lt;br /&gt;
	{&lt;br /&gt;
		if(getStopwatch1() &amp;gt; 1000) // 1s&lt;br /&gt;
		{&lt;br /&gt;
			if (onoff) onoff = 0;&lt;br /&gt;
			else onoff = 1;&lt;br /&gt;
&lt;br /&gt;
			// Show GPS data:&lt;br /&gt;
			I2C_GPS_read(DATA_LENGTH);			// Read data&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nLAT_DEG:     &amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.latDeg, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;° &amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.latMin, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;.&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.latMinDec, DEC, 4);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;' &amp;quot;);&lt;br /&gt;
			if(gpsdata.status.ns)&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;N&amp;quot;);&lt;br /&gt;
			else&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;S&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nLON_DEG:    &amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.lonDeg, DEC, 3);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;° &amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.lonMin, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;.&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.lonMinDec, DEC, 4);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;' &amp;quot;);&lt;br /&gt;
			if(gpsdata.status.ew)&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;E&amp;quot;);&lt;br /&gt;
			else&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;W&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nSTATUS:     &amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.status.byte, BIN, 8);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nFIX_IND:    &amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.fixInd.byte, BIN, 8);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nHDOP:       &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(gpsdata.hdop, DEC);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;.&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.hdopDec, DEC, 2);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nSAT_N:      &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(gpsdata.satCount, DEC);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nCOURSE_T:   &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(gpsdata.course, DEC);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;.&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.courseDec, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;°&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nSPEED:      &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(gpsdata.speed, DEC);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;.&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.speedDec, DEC, 2);&lt;br /&gt;
			if(gpsdata.status.spu)&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;km/h&amp;quot;);&lt;br /&gt;
			else&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;kn&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nALT:        &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(gpsdata.altitude, DEC);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;m\nALT_DIF:    &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(gpsdata.altDif, DEC);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;m\nUTC:        &amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.utcHour, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;:&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.utcMinute, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;:&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.utcSec, DEC, 2);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nDATE:       &amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.day, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;.&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.month, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;.&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.year, DEC, 4);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nPDOP:       &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(gpsdata.pdop, DEC);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;.&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.pdopDec, DEC, 2);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nVDOP:       &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(gpsdata.vdop, DEC);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;.&amp;quot;);&lt;br /&gt;
			writeIntegerLength_WIFI(gpsdata.vdopDec, DEC, 2);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			for(i = 0; i &amp;lt; gpsdata.satCount; i++) {&lt;br /&gt;
				if(i == 8) writeString_P_WIFI(&amp;quot;\n&amp;quot;);&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;  SAT_&amp;quot;);&lt;br /&gt;
				writeIntegerLength_WIFI(i + 1, HEX, 1);&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;: &amp;quot;);&lt;br /&gt;
				writeInteger_WIFI(gpsdata.sat[i], DEC);&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nSW_VERSION: &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(gpsdata.swVersion, DEC);&lt;br /&gt;
&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\nHEARTBEAT:  &amp;quot;);&lt;br /&gt;
			writeInteger_WIFI(gpsdata.heartbeat, DEC);&lt;br /&gt;
			writeString_P_WIFI(&amp;quot;\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			// RP6 Sensor Board shutdown (button &amp;amp; status LED test):&lt;br /&gt;
			if (pressedButton) {&lt;br /&gt;
				setStatusLED(1);&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;\nPress button again for RP6 Sensor Board SHUTDOWN!\n&amp;quot;);&lt;br /&gt;
				mSleep(2000);&lt;br /&gt;
				do {&lt;br /&gt;
					if(getStopwatch2() &amp;gt; 200) { // 0.2s&lt;br /&gt;
						if (onoff) onoff = 0;&lt;br /&gt;
						else onoff = 1;&lt;br /&gt;
						if (onoff) setStatusLED(1);&lt;br /&gt;
						else setStatusLED(0);&lt;br /&gt;
						setStopwatch2(0);&lt;br /&gt;
					}&lt;br /&gt;
					mSleep(1);&lt;br /&gt;
					task_I2CTWI();&lt;br /&gt;
				} while (!readButton());&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;\n\n\n\n\nPlease wait for RP6 Sensor Board SHUTDOWN...\n&amp;quot;);&lt;br /&gt;
				sensor_board_shutdown();&lt;br /&gt;
				mSleep(3000);&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;\n\n\nThe RP6 Sensor Board now is in SHUTDOWN MODE!!!\n&amp;quot;);&lt;br /&gt;
				mSleep(1000);&lt;br /&gt;
				writeString_P_WIFI(&amp;quot;\nRESET the M256 microcontroller now...\n\n&amp;quot;);&lt;br /&gt;
				while(true) {};&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			setStopwatch1(0);&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		task_RP6SensorBoard();					// RP6 Sensor Board task&lt;br /&gt;
&lt;br /&gt;
		task_I2CTWI();&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Erklärung&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Gyro Modul JM3-GYRO====&lt;br /&gt;
=====Analoge Auswertung=====&lt;br /&gt;
Am Pin ''OUT'' des Gyro Moduls (siehe [http://www.rn-wissen.de/index.php/RP6_Sensor_Board_und_Xtra_Module#Anschluss-Schema Anschluss-Schema]!) liegt die Ausgangsspannung des Sensors (0..5V) an. Sie kann mit einem ADC-Eingang eines Microcontrollers gemessen werden.&lt;br /&gt;
Syntax mit den Libraries der RP6Base, M32 oder M256 WiFi (ADC Kanal 0):&lt;br /&gt;
 uint16_t result = readADC(0);&lt;br /&gt;
In der C-Control-Pro Umgebung der M128 sieht das z.B. in CompactC so aus (ADC Kanal 0):&lt;br /&gt;
 word result;&lt;br /&gt;
 ADC_Set(ADC_VREF_VCC, 0);&lt;br /&gt;
 ...&lt;br /&gt;
 result = ADC_Read();&lt;br /&gt;
Das Ergebnis ''result'' kann noch zur Weiterverarbeitung angepasst werden:&lt;br /&gt;
 #define ADCVAL_ZERORATE_LEVEL			511		// Zero rate Level&lt;br /&gt;
 ...&lt;br /&gt;
 int16_t z_axisg = result - ADCVAL_ZERORATE_LEVEL;&lt;br /&gt;
Dadurch zeigt ''z_axisg'' Null an, wenn keine Rotation anliegt und wird positiv, wenn nach LINKS gedreht wird und negativ bei RECHTS-Drehung. Die Definition ADCVAL_ZERORATE_LEVEL muss natürlich an den eigenen Sensor-Nullwert angepasst werden.&lt;br /&gt;
&lt;br /&gt;
Aus dem Absolutwert von ''z_axisg'' kann man die Drehrate (Drehgeschwindigkeit) auch bestimmen:&lt;br /&gt;
&lt;br /&gt;
In den [[RP6_Sensor_Board_und_Xtra_Module#Technische_Daten_3|Technischen Daten]] ist die Empfindlichkeit des Sensors mit '''10mV/dps''' (0,01V pro Grad und Sekunde) angegeben. Damit errechnet sich die Drehrate als:&lt;br /&gt;
 Drehrate [dps] = abs(z_axisg) * (5 / 1024 / 0.01) = abs(z_axisg) * 0.48828125&lt;br /&gt;
&lt;br /&gt;
=====Optionale Ansteuerung=====&lt;br /&gt;
Im [http://www.rn-wissen.de/index.php/RP6_Sensor_Board_und_Xtra_Module#Anschluss-Schema Anschluss-Schema] ist erkennbar, dass es noch 2 Steuerleitungen ''SLEEP/PD'' und ''ST'' gibt. Mit diesen Anschlüssen kann die Betriebsart des Gyro Moduls festgelegt werden, siehe nachfolgende Tabelle:&lt;br /&gt;
{|  {{Blauetabelle}} &lt;br /&gt;
|Betriebsart&lt;br /&gt;
|ST&lt;br /&gt;
|SLEEP/PD&lt;br /&gt;
|Stromverbrauch&lt;br /&gt;
|-&lt;br /&gt;
|Normal&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|4,2mA&lt;br /&gt;
|-&lt;br /&gt;
|Sleep&lt;br /&gt;
|0&lt;br /&gt;
|1&lt;br /&gt;
|2,2mA&lt;br /&gt;
|-&lt;br /&gt;
|Self-test&lt;br /&gt;
|1&lt;br /&gt;
|0&lt;br /&gt;
|4,2mA&lt;br /&gt;
|-&lt;br /&gt;
|Power-down&lt;br /&gt;
|1&lt;br /&gt;
|1&lt;br /&gt;
|'''5µA'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
Will man zwischen den Betriebsarten per Software umschalten, muss man die beiden Steuerleitungen mit I/O Portpins des Microcontrollers verbinden, die als Ausgänge konfiguriert sind. Braucht man diese Funktion nicht, reicht es, ''ST'' und ''SLEEP/PD'' mit GND zu verbinden (Betriebsart &amp;quot;Normal&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====3D Accelerometer Modul JM3-3DA====&lt;br /&gt;
Das 3D Accelerometer Modul kann über den I2C- oder den SPI-Bus angesteuert werden. Wird das Modul auf der RP6 CONTROL M32 Platine betrieben (es sitzt also auf dem Sockel IC5 für das 2. SPI-EEPROM), dann erfolgt die Ansteuerung über den SPI-Bus. Die SPI-Grundfunktionen befinden sich in der RP6ControlLib, die daher eingebunden werden muss.&lt;br /&gt;
&lt;br /&gt;
=====RP6 CONTROL M32: ACCSENS Library=====&lt;br /&gt;
Die nachfolgende RP6ControlACCSENSLib (GCC) dient zur Ansteuerung des 3D Accelerometer Moduls durch die RP6 CONTROL M32.&lt;br /&gt;
&lt;br /&gt;
======Configuration Header======&lt;br /&gt;
Vor dem Kompilieren der Library muss eine Anpassung des Configuration Headers an die eigenen Hardware-Voraussetzungen erfolgen.&lt;br /&gt;
Dazu gibt es im Configuration Header eine Definition:&lt;br /&gt;
* EXP_STACK_1 -&amp;gt; Die RP6 CONTROL M32 sitzt auf dem vorderen Platinenstapel 1 des RP6&lt;br /&gt;
Im nachfolgenden Listing ist die Definition EXP_STACK_1 NICHT aktiv (d.h. die M32 sitzt auf dem hinteren Platinenstapel 2!). Dies muss an die eigene Hardware angepaßt werden. Wenn die RP6 CONTROL M32 auf dem vorderen Platinenstapel 1 des RP6 sitzt, muss die Zeile mit &amp;quot;EXP_STACK_1&amp;quot; &amp;quot;aktiviert&amp;quot; werden. Dazu entfernt man &amp;quot;//&amp;quot; am Zeilenanfang:&lt;br /&gt;
 #define EXP_STACK_1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Bevor man den Beschleunigungssensor nutzen kann, muss man ihn kalibrieren:&lt;br /&gt;
&lt;br /&gt;
'''Accelerometer:'''&lt;br /&gt;
* Die X-Achse wird kalibriert, indem man den RP6 mit der rechten Seite nach unten hält und den Maximalwert in MAX_X_A einträgt. Dann neigt man ihn auf seine linke Seite und trägt den negativen Maximalwert in MIN_X_A ein.&lt;br /&gt;
* Die Y-Achse wird kalibriert, indem man den RP6 mit der Vorderseite nach oben hält und den Maximalwert in MAX_Y_A einträgt. Dann kippt man die Vorderseite nach unten und trägt den negativen Maximalwert in MIN_Y_A ein.&lt;br /&gt;
* Die Z-Achse wird kalibriert, indem man den RP6 normal waagerecht hält und den Maximalwert in MAX_Z_A einträgt. Dann dreht man den RP6 &amp;quot;auf den Kopf&amp;quot; und trägt den negativen Maximalwert in MIN_Z_A ein.&lt;br /&gt;
* Sollten die angezeigten Pitch- und Roll-Werte nach der Kalibrierung der Achsen und genau waagerecht stehendem Sensor bzw. RP6 vom Nullwert deutlich abweichen, kann man sie mithilfe der Definitionen OFFSET_PITCH_A und OFFSET_ROLL_A &amp;quot;nullen&amp;quot;. Die Einheit dieser Definitionen ist °.&lt;br /&gt;
Nach dem Eintragen der Kalibrierungswerte muss das Programm neu kompiliert werden!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Datei: RP6ControlACCSENS.h&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;/* ****************************************************************************&lt;br /&gt;
 *                           _______________________&lt;br /&gt;
 *                           \| RP6  ROBOT SYSTEM |/&lt;br /&gt;
 *                            \_-_-_-_-_-_-_-_-_-_/             &amp;gt;&amp;gt;&amp;gt; RP6 CONTROL&lt;br /&gt;
 * ----------------------------------------------------------------------------&lt;br /&gt;
 * ----------------------------- [c]2014 - Dirk -------------------------------&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * File: RP6ControlACCSENS.h&lt;br /&gt;
 * Version: 1.0&lt;br /&gt;
 * Target: RP6 CONTROL - ATMEGA32 @16.00MHz&lt;br /&gt;
 * Author(s): Dirk&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Description:&lt;br /&gt;
 * Configuration header file for new ACCSENS library.&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * THE CHANGELOG CAN BE FOUND AT THE END OF THIS FILE!&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
#ifndef RP6CONTROLACCSENS_H&lt;br /&gt;
#define RP6CONTROLACCSENS_H&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Sensor position on the RP6 robot:&lt;br /&gt;
// (If EXP_STACK_1 is defined, the RP6 CONTROL M32 is located on the front&lt;br /&gt;
//  stack for addon boards on the RP6 robot. If EXP_STACK_1 is NOT defined&lt;br /&gt;
//  (default), the RP6 CONTROL M32 is mounted on the rear stack.)&lt;br /&gt;
// -------------------&lt;br /&gt;
//#define EXP_STACK_1&lt;br /&gt;
// -------------------&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// The following sensor is used:&lt;br /&gt;
// - 3D Accelerometer Modul (CONRAD 1082387-62) with LIS302DLH 3-axis&lt;br /&gt;
//   accelerometer&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// LIS302DLH accelerometer calibration data:&lt;br /&gt;
#define MAX_X_A						32767		// Max. X-axis value&lt;br /&gt;
#define MIN_X_A						-32768		// Min. X-axis value&lt;br /&gt;
#define MAX_Y_A						32767		// Max. Y-axis value&lt;br /&gt;
#define MIN_Y_A						-32768		// Min. Y-axis value&lt;br /&gt;
#define MAX_Z_A						32767		// Max. Z-axis value&lt;br /&gt;
#define MIN_Z_A						-32768		// Min. Z-axis value&lt;br /&gt;
#define OFFSET_PITCH_A				0.0			// Offset Pitch [°]&lt;br /&gt;
#define OFFSET_ROLL_A				0.0			// Offset Roll [°]&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
/******************************************************************************&lt;br /&gt;
 * Additional info&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Changelog:&lt;br /&gt;
 * &lt;br /&gt;
 *  ---&amp;gt; changes are documented in the file &amp;quot;RP6ControlACCSENSLib.c&amp;quot;&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
======Library Header======&lt;br /&gt;
Datei: RP6ControlACCSENSLib.h&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;/* ****************************************************************************&lt;br /&gt;
 *                           _______________________&lt;br /&gt;
 *                           \| RP6  ROBOT SYSTEM |/&lt;br /&gt;
 *                            \_-_-_-_-_-_-_-_-_-_/             &amp;gt;&amp;gt;&amp;gt; RP6 CONTROL&lt;br /&gt;
 * ----------------------------------------------------------------------------&lt;br /&gt;
 * ----------------------------- [c]2014 - Dirk -------------------------------&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * File: RP6ControlACCSENSLib.h&lt;br /&gt;
 * Version: 1.0&lt;br /&gt;
 * Target: RP6 CONTROL - ATMEGA32 @16.00MHz&lt;br /&gt;
 * Author(s): Dirk&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Description:&lt;br /&gt;
 * This is the RP6ControlACCSENSLib header file.&lt;br /&gt;
 * You have to include this file, if you want to use the library&lt;br /&gt;
 * RP6ControlACCSENSLib.c in your own projects.&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * THE CHANGELOG CAN BE FOUND AT THE END OF THIS FILE!&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
#ifndef RP6CONTROLACCSENSLIB_H&lt;br /&gt;
#define RP6CONTROLACCSENSLIB_H&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Includes:&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6ControlLib.h&amp;quot; 		// The RP6 Control Library (v. 1.1 or higher). &lt;br /&gt;
#include &amp;quot;RP6ControlACCSENS.h&amp;quot;&lt;br /&gt;
#include &amp;lt;math.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&lt;br /&gt;
#define ACC_CS							MEM_CS2&lt;br /&gt;
#define DEVICE_IDENTIFIER				0x32&lt;br /&gt;
&lt;br /&gt;
// Registers:&lt;br /&gt;
#define WHO_AM_I						0x0f&lt;br /&gt;
#define CTRL_REG1						0x20&lt;br /&gt;
#define CTRL_REG2						0x21&lt;br /&gt;
#define CTRL_REG3						0x22&lt;br /&gt;
#define CTRL_REG4						0x23&lt;br /&gt;
#define CTRL_REG5						0x24&lt;br /&gt;
#define HP_FILTER_RESET					0x25&lt;br /&gt;
#define REFERENCE						0x26&lt;br /&gt;
#define STATUS_REG						0x27&lt;br /&gt;
#define OUT_X_L							0x28&lt;br /&gt;
#define OUT_X_H							0x29&lt;br /&gt;
#define OUT_Y_L							0x2a&lt;br /&gt;
#define OUT_Y_H							0x2b&lt;br /&gt;
#define OUT_Z_L							0x2c&lt;br /&gt;
#define OUT_Z_H							0x2d&lt;br /&gt;
#define INT1_CFG						0x30&lt;br /&gt;
#define INT1_SOURCE						0x31&lt;br /&gt;
#define INT1_THS						0x32&lt;br /&gt;
#define INT1_DURATION					0x33&lt;br /&gt;
#define INT2_CFG						0x34&lt;br /&gt;
#define INT2_SOURCE						0x35&lt;br /&gt;
#define INT2_THS						0x36&lt;br /&gt;
#define INT2_DURATION					0x37&lt;br /&gt;
&lt;br /&gt;
// Control Register bitmasks:&lt;br /&gt;
#define CTRL_REG1_POWERDOWN				0b00000000&lt;br /&gt;
#define CTRL_REG1_3D_DEFAULT			0b00000111&lt;br /&gt;
#define CTRL_REG1_3D_LOPWR_10HZ			0b11000111&lt;br /&gt;
#define CTRL_REG2_DEFAULT				0b00000000&lt;br /&gt;
#define CTRL_REG3_DEFAULT				0b00000000&lt;br /&gt;
#define CTRL_REG4_DEFAULT				0b00000000&lt;br /&gt;
#define CTRL_REG4_BDU_2G				0b10000000&lt;br /&gt;
#define CTRL_REG4_BDU_2G_STSIGN			0b10001000&lt;br /&gt;
#define CTRL_REG4_BDU_BLE_2G			0b11000000&lt;br /&gt;
#define CTRL_REG4_BDU_BLE_2G_STSIGN		0b11001000&lt;br /&gt;
#define CTRL_REG5_DEFAULT				0b00000000&lt;br /&gt;
&lt;br /&gt;
// Read/write address bitmasks:&lt;br /&gt;
#define READ_MASK						0b10000000&lt;br /&gt;
#define READ_AUTOINC_MASK				0b11000000&lt;br /&gt;
#define WRITE_MASK						0b01111111&lt;br /&gt;
&lt;br /&gt;
extern int16_t x_axisa, y_axisa, z_axisa;&lt;br /&gt;
extern double pitch, roll;&lt;br /&gt;
extern double xa, ya, za;&lt;br /&gt;
extern double the, phi;&lt;br /&gt;
&lt;br /&gt;
uint8_t SPI_ACCSENS_readByte(uint8_t regAddr);&lt;br /&gt;
void SPI_ACCSENS_readBytes(uint8_t startAddr, uint8_t *buffer, uint8_t length);&lt;br /&gt;
void SPI_ACCSENS_writeByte(uint8_t regAddr, uint8_t data);&lt;br /&gt;
uint8_t SPI_ACCSENS_getStatus(void);&lt;br /&gt;
&lt;br /&gt;
void SPI_ACCSENS_init(void);&lt;br /&gt;
void SPI_ACCSENS_shutdown(void);&lt;br /&gt;
void SPI_ACCSENS_read(void);&lt;br /&gt;
void SPI_ACCSENS_normalize(void);&lt;br /&gt;
void SPI_ACCSENS_position(void);&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
/******************************************************************************&lt;br /&gt;
 * Additional info&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Changelog:&lt;br /&gt;
 * &lt;br /&gt;
 *  ---&amp;gt; changes are documented in the file &amp;quot;RP6ControlACCSENSLib.c&amp;quot;&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
======Library Source======&lt;br /&gt;
Datei: RP6ControlACCSENSLib.c&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;/* ****************************************************************************&lt;br /&gt;
 *                           _______________________&lt;br /&gt;
 *                           \| RP6  ROBOT SYSTEM |/&lt;br /&gt;
 *                            \_-_-_-_-_-_-_-_-_-_/             &amp;gt;&amp;gt;&amp;gt; RP6 CONTROL&lt;br /&gt;
 * ----------------------------------------------------------------------------&lt;br /&gt;
 * ----------------------------- [c]2014 - Dirk -------------------------------&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * File: RP6ControlACCSENSLib.c&lt;br /&gt;
 * Version: 1.0&lt;br /&gt;
 * Target: RP6 CONTROL - ATMEGA32 @16.00MHz&lt;br /&gt;
 *         with optional LC-Display 16x2 chars (CONRAD 190911-62)&lt;br /&gt;
 *         and a 3D Accelerometer Modul (CONRAD 1082387-62) (IC5)&lt;br /&gt;
 * Author(s): Dirk&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Description:&lt;br /&gt;
 * This is my RP6 Control ACCSENS Library. This library may be used to access&lt;br /&gt;
 * the basic functions of the 3D Accelerometer Modul. This RP6 Xtra module may&lt;br /&gt;
 * be placed on the IC5 socket on the RP6 CONTROL M32 instead of a second&lt;br /&gt;
 * EEPROM.&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * THE CHANGELOG CAN BE FOUND AT THE END OF THIS FILE!&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
 &lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// Includes:&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6ControlACCSENSLib.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// SPI functions:&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Reads a single register from the 3D Accelerometer&lt;br /&gt;
 * Modul (ACCSENS).&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
uint8_t SPI_ACCSENS_readByte(uint8_t regAddr)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t data;&lt;br /&gt;
	regAddr |= READ_MASK;						// Read byte&lt;br /&gt;
	PORTB &amp;amp;= ~ACC_CS;&lt;br /&gt;
	writeSPI(regAddr);&lt;br /&gt;
	data = readSPI();&lt;br /&gt;
	PORTB |= ACC_CS;&lt;br /&gt;
	return data;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Reads &amp;quot;length&amp;quot; bytes into the buffer &amp;quot;buffer&amp;quot;&lt;br /&gt;
 * from startAddr on. &lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void SPI_ACCSENS_readBytes(uint8_t startAddr, uint8_t *buffer, uint8_t length)&lt;br /&gt;
{&lt;br /&gt;
	startAddr |= READ_AUTOINC_MASK;				// Read byte, auto increment&lt;br /&gt;
	PORTB &amp;amp;= ~ACC_CS;&lt;br /&gt;
	writeSPI(startAddr);&lt;br /&gt;
	readBufferSPI(&amp;amp;buffer[0], length);&lt;br /&gt;
	PORTB |= ACC_CS;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Write a single data byte to the specified sensor&lt;br /&gt;
 * address.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void SPI_ACCSENS_writeByte(uint8_t regAddr, uint8_t data)&lt;br /&gt;
{&lt;br /&gt;
	PORTB &amp;amp;= ~ACC_CS;&lt;br /&gt;
	writeSPI(regAddr);&lt;br /&gt;
	writeSPI(data);&lt;br /&gt;
	PORTB |= ACC_CS;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Returns sensor status register - for checking if&lt;br /&gt;
 * sensor is busy. &lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
uint8_t SPI_ACCSENS_getStatus(void)&lt;br /&gt;
{&lt;br /&gt;
	uint8_t status;&lt;br /&gt;
	PORTB &amp;amp;= ~ACC_CS;&lt;br /&gt;
	writeSPI(STATUS_REG);&lt;br /&gt;
	status = readSPI();&lt;br /&gt;
	PORTB |= ACC_CS;&lt;br /&gt;
	return status;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// 3D accelerometer functions:&lt;br /&gt;
&lt;br /&gt;
int16_t x_axisa, y_axisa, z_axisa;&lt;br /&gt;
double pitch, roll;&lt;br /&gt;
double xa, ya, za;&lt;br /&gt;
double the, phi;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Initializes the sensor. You must call this&lt;br /&gt;
 * function at the beginning of a program, that&lt;br /&gt;
 * uses the 3D Accelerometer Modul.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void SPI_ACCSENS_init(void)&lt;br /&gt;
{&lt;br /&gt;
	// All axes enable, low power, 10Hz output data rate:&lt;br /&gt;
	SPI_ACCSENS_writeByte(CTRL_REG1, CTRL_REG1_3D_LOPWR_10HZ);&lt;br /&gt;
	// No update while reading, +- 2g, self-test minus:&lt;br /&gt;
	SPI_ACCSENS_writeByte(CTRL_REG4, CTRL_REG4_BDU_2G_STSIGN);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Sets the LIS302DLH power-down mode. If you&lt;br /&gt;
 * do not need the sensor, you can save energy&lt;br /&gt;
 * by using the sensor power-down mode.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void SPI_ACCSENS_shutdown(void)&lt;br /&gt;
{&lt;br /&gt;
	// LIS302DLH in power-down mode:&lt;br /&gt;
	SPI_ACCSENS_writeByte(CTRL_REG1, CTRL_REG1_POWERDOWN);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function reads the X-axis, Y-axis and Z-axis&lt;br /&gt;
 * values from the LIS302DLH accelerometer and stores&lt;br /&gt;
 * them in the global variables x_axisa, y_axisa and&lt;br /&gt;
 * z_axisa.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void SPI_ACCSENS_read(void)&lt;br /&gt;
{&lt;br /&gt;
#ifndef EXP_STACK_1&lt;br /&gt;
	// Default sensor position (M32 located on the RP6 rear stack):&lt;br /&gt;
	// xb = -y:&lt;br /&gt;
	x_axisa = SPI_ACCSENS_readByte(OUT_Y_L) | (SPI_ACCSENS_readByte(OUT_Y_H) &amp;lt;&amp;lt; 8);&lt;br /&gt;
	x_axisa *= -1;&lt;br /&gt;
	// yb = -x:&lt;br /&gt;
	y_axisa = SPI_ACCSENS_readByte(OUT_X_L) | (SPI_ACCSENS_readByte(OUT_X_H) &amp;lt;&amp;lt; 8);&lt;br /&gt;
	y_axisa *= -1;&lt;br /&gt;
	// zb = z:&lt;br /&gt;
	z_axisa = SPI_ACCSENS_readByte(OUT_Z_L) | (SPI_ACCSENS_readByte(OUT_Z_H) &amp;lt;&amp;lt; 8);&lt;br /&gt;
#else&lt;br /&gt;
	// Other sensor position (M32 located on the RP6 front stack):&lt;br /&gt;
	// xb = y:&lt;br /&gt;
	x_axisa = SPI_ACCSENS_readByte(OUT_Y_L) | (SPI_ACCSENS_readByte(OUT_Y_H) &amp;lt;&amp;lt; 8);&lt;br /&gt;
	// yb = x:&lt;br /&gt;
	y_axisa = SPI_ACCSENS_readByte(OUT_X_L) | (SPI_ACCSENS_readByte(OUT_X_H) &amp;lt;&amp;lt; 8);&lt;br /&gt;
	// zb = z:&lt;br /&gt;
	z_axisa = SPI_ACCSENS_readByte(OUT_Z_L) | (SPI_ACCSENS_readByte(OUT_Z_H) &amp;lt;&amp;lt; 8);&lt;br /&gt;
#endif&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function limits and normalizes the x-axisa,&lt;br /&gt;
 * y-axisa and z-axisa values read from the LIS302DLH&lt;br /&gt;
 * accelerometer with the function SPI_ACCSENS_read() and&lt;br /&gt;
 * stores them in the global double variables xa, ya and&lt;br /&gt;
 * za.&lt;br /&gt;
 * It also calculates the position in space in form of the&lt;br /&gt;
 * tilt angles (the = pitch, phi = roll) and stores them&lt;br /&gt;
 * in the global double variables the and phi.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void SPI_ACCSENS_normalize(void)&lt;br /&gt;
{&lt;br /&gt;
	// Limit raw values:&lt;br /&gt;
	if (x_axisa &amp;lt; MIN_X_A) x_axisa = MIN_X_A;&lt;br /&gt;
	if (x_axisa &amp;gt; MAX_X_A) x_axisa = MAX_X_A;&lt;br /&gt;
	if (y_axisa &amp;lt; MIN_Y_A) y_axisa = MIN_Y_A;&lt;br /&gt;
	if (y_axisa &amp;gt; MAX_Y_A) y_axisa = MAX_Y_A;&lt;br /&gt;
	if (z_axisa &amp;lt; MIN_Z_A) z_axisa = MIN_Z_A;&lt;br /&gt;
	if (z_axisa &amp;gt; MAX_Z_A) z_axisa = MAX_Z_A;&lt;br /&gt;
	xa = (double) x_axisa / 10000.0;&lt;br /&gt;
	ya = (double) y_axisa / 10000.0;&lt;br /&gt;
	za = (double) z_axisa / 10000.0;&lt;br /&gt;
	// Calculate Pitch and Roll:&lt;br /&gt;
	phi = asin(xa);								// Calculate the and phi&lt;br /&gt;
	the = asin(ya / cos(the));					//  from the raw values&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This function calculates the position in space by&lt;br /&gt;
 * using the the and phi values (see function&lt;br /&gt;
 * SPI_ACCSENS_normalize()!). It stores the position&lt;br /&gt;
 * in the global double variables pitch and roll. &lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
void SPI_ACCSENS_position(void)&lt;br /&gt;
{&lt;br /&gt;
	pitch = the * 180 / M_PI + OFFSET_PITCH_A;&lt;br /&gt;
	roll = phi * 180 / M_PI + OFFSET_ROLL_A;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/******************************************************************************&lt;br /&gt;
 * Additional info&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 * Changelog:&lt;br /&gt;
 * - v. 1.0 (initial release) 04.04.2014 by Dirk&lt;br /&gt;
 *&lt;br /&gt;
 * ****************************************************************************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************/&lt;br /&gt;
// EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Erklärung&lt;br /&gt;
&lt;br /&gt;
======Demo======&lt;br /&gt;
makefile:&lt;br /&gt;
&amp;lt;pre&amp;gt;...&lt;br /&gt;
TARGET = RP6Control_01_ACCSENS&lt;br /&gt;
...&lt;br /&gt;
SRC += $(RP6_LIB_PATH)/RP6control/RP6ControlLib.c&lt;br /&gt;
SRC += $(RP6_LIB_PATH)/RP6common/RP6uart.c&lt;br /&gt;
SRC += $(RP6_LIB_PATH)/RP6control/RP6ControlACCSENSLib.c&lt;br /&gt;
...&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Datei: RP6Control_01_ACCSENS.c&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;// Uncommented Version of RP6Control_01_ACCSENS.c&lt;br /&gt;
// written by Dirk&lt;br /&gt;
// ------------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;RP6ControlACCSENSLib.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void writeDouble(double number, uint8_t width, uint8_t prec)&lt;br /&gt;
{char buffer[width + 1];&lt;br /&gt;
	dtostrf(number, width, prec, &amp;amp;buffer[0]);&lt;br /&gt;
	writeString(&amp;amp;buffer[0]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void writeDoubleLCD(double number, uint8_t width, uint8_t prec)&lt;br /&gt;
{char buffer[width + 1];&lt;br /&gt;
	dtostrf(number, width, prec, &amp;amp;buffer[0]);&lt;br /&gt;
	writeStringLCD(&amp;amp;buffer[0]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
	initRP6Control();&lt;br /&gt;
&lt;br /&gt;
	writeString_P(&amp;quot;\n\nRP6Control SPI ACCSENS Test Program!\n&amp;quot;); &lt;br /&gt;
	setLEDs(0b1111);&lt;br /&gt;
	mSleep(50);&lt;br /&gt;
	initLCD(); &lt;br /&gt;
	showScreenLCD(&amp;quot;################&amp;quot;, &amp;quot;################&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
	showScreenLCD(&amp;quot;  SPI ACCSENS&amp;quot;, &amp;quot;  Test Program&amp;quot;);&lt;br /&gt;
	mSleep(1000);&lt;br /&gt;
	setLEDs(0b0000);&lt;br /&gt;
&lt;br /&gt;
	SPI_ACCSENS_init();&lt;br /&gt;
&lt;br /&gt;
	uint8_t whoami = SPI_ACCSENS_readByte(WHO_AM_I);&lt;br /&gt;
	writeString_P(&amp;quot;\nWHO AM I: &amp;quot;);&lt;br /&gt;
	writeInteger(whoami, HEX);&lt;br /&gt;
	writeChar('\n');&lt;br /&gt;
	mSleep(2000);&lt;br /&gt;
	&lt;br /&gt;
	startStopwatch1();&lt;br /&gt;
&lt;br /&gt;
	while(true) &lt;br /&gt;
	{&lt;br /&gt;
		if(getStopwatch1() &amp;gt; 1000)&lt;br /&gt;
		{&lt;br /&gt;
			SPI_ACCSENS_read();&lt;br /&gt;
			writeString_P(&amp;quot;\n3D Accelerometer SENSOR -&amp;gt;\n&amp;quot;);&lt;br /&gt;
			writeString_P(&amp;quot;X-axis: &amp;quot;);&lt;br /&gt;
			writeInteger(x_axisa, DEC);&lt;br /&gt;
			writeChar('\n');&lt;br /&gt;
			writeString_P(&amp;quot;Y-axis: &amp;quot;);&lt;br /&gt;
			writeInteger(y_axisa, DEC);&lt;br /&gt;
			writeChar('\n');&lt;br /&gt;
			writeString_P(&amp;quot;Z-axis: &amp;quot;);&lt;br /&gt;
			writeInteger(z_axisa, DEC);&lt;br /&gt;
			writeChar('\n');&lt;br /&gt;
			SPI_ACCSENS_normalize();&lt;br /&gt;
			SPI_ACCSENS_position();&lt;br /&gt;
			writeString_P(&amp;quot;POSITION: \n&amp;quot;);&lt;br /&gt;
			writeString_P(&amp;quot;  Pitch [°]: &amp;quot;);&lt;br /&gt;
			writeDouble(pitch, 6, 1);&lt;br /&gt;
			writeChar('\n');&lt;br /&gt;
			writeString_P(&amp;quot;  Roll [°]:  &amp;quot;);&lt;br /&gt;
			writeDouble(roll, 6, 1);&lt;br /&gt;
			writeChar('\n');&lt;br /&gt;
			setCursorPosLCD(0, 0);&lt;br /&gt;
			writeStringLCD_P(&amp;quot;P&amp;quot;);&lt;br /&gt;
			writeDoubleLCD(pitch, 6, 1);&lt;br /&gt;
			writeStringLCD_P(&amp;quot; &amp;quot;);&lt;br /&gt;
			setCursorPosLCD(0, 8);&lt;br /&gt;
			writeStringLCD_P(&amp;quot;R&amp;quot;);&lt;br /&gt;
			writeDoubleLCD(roll, 6, 1);&lt;br /&gt;
			writeStringLCD_P(&amp;quot; &amp;quot;);&lt;br /&gt;
			setCursorPosLCD(1, 0);&lt;br /&gt;
			writeStringLCD_P(&amp;quot;X&amp;quot;);&lt;br /&gt;
			writeIntegerLCD(x_axisa, DEC);&lt;br /&gt;
			writeStringLCD_P(&amp;quot;   &amp;quot;);&lt;br /&gt;
			setCursorPosLCD(1, 5);&lt;br /&gt;
			writeStringLCD_P(&amp;quot;Y&amp;quot;);&lt;br /&gt;
			writeIntegerLCD(y_axisa, DEC);&lt;br /&gt;
			writeStringLCD_P(&amp;quot;   &amp;quot;);&lt;br /&gt;
			setCursorPosLCD(1, 10);&lt;br /&gt;
			writeStringLCD_P(&amp;quot;Z&amp;quot;);&lt;br /&gt;
			writeIntegerLCD(z_axisa, DEC);&lt;br /&gt;
			writeStringLCD_P(&amp;quot;    &amp;quot;);&lt;br /&gt;
			mSleep(2000);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Erklärung&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Erfahrungsberichte==&lt;br /&gt;
&lt;br /&gt;
...in Arbeit...(kann aber gerne ergänzt werden)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Siehe auch==&lt;br /&gt;
* [[RP6v2]]&lt;br /&gt;
* [[RP6]]&lt;br /&gt;
* [[RP6 - Programmierung]]&lt;br /&gt;
* [[RP6 Kamera - Mitmach-Projekt]]&lt;br /&gt;
* [[RP6v2 I2C-Portexpander]]&lt;br /&gt;
* [[RP6v2 USB-RS232-Adapter]]&lt;br /&gt;
* [[RP6v2 Orientierung]]&lt;br /&gt;
* [[RP6 Multi IO Projekt]]&lt;br /&gt;
* [[RP6 Multi IO Projekt - Software]]&lt;br /&gt;
* [[Induktive_Ladestation_f%C3%BCr_den_RP6|Induktive Ladestation für den RP6]]&lt;br /&gt;
* [[IR-bake_f%C3%BCr_den_RP6|IR-bake für den RP6]]&lt;br /&gt;
* [[CCRP5]]&lt;br /&gt;
* [[Yeti]]&lt;br /&gt;
* [[Asuro]]&lt;br /&gt;
* [[C't-Bot]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Weblinks==&lt;br /&gt;
'''Siehe auch die Weblinks im [http://www.rn-wissen.de/index.php/RP6v2#Weblinks RP6v2] und im [http://www.rn-wissen.de/index.php/RP6#Weblinks RP6] Artikel!'''&lt;br /&gt;
&lt;br /&gt;
* [http://www.conrad.de/ce/de/product/1082384/Arexx-RP6-Sensor-Board-RP6-JM03-61 RP6 Sensor Board bei CONRAD]&lt;br /&gt;
* JM3 Engeneering: [http://www.jm3-engineering.com/rp6.htm RP6 Roboter Erweiterung]&lt;br /&gt;
* Ankündigung einer Sensorerweiterungsplatine für die RP6v2 M256 WiFi im [http://www.roboternetz.de/community/threads/63595-Neue-Hardware-f%C3%BCr-RP6%28v2%29?p=590129&amp;amp;viewfull=1#post590129 Roboternetz RP6 Forum]&lt;br /&gt;
* Erfahrungsbericht zum Sensor Board im [http://www.arexx.com/forum/viewtopic.php?f=19&amp;amp;t=2498 AREXX Support Forum] und im [http://www.roboternetz.de/community/threads/64414-RP6-Sensor-Board-Erster-Eindruck Roboternetz RP6 Forum]&lt;br /&gt;
* Erfahrungsbericht zum I2C GPS Empfänger im [http://www.arexx.com/forum/viewtopic.php?f=19&amp;amp;t=2509 AREXX Support Forum]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Kategorie:Robotikeinstieg]]	 &lt;br /&gt;
[[Kategorie:Praxis]]&lt;br /&gt;
&lt;br /&gt;
==Autoren==&lt;br /&gt;
--[[Benutzer:Dirk|Dirk]] 18:50, 14. Mai 2014 (CET)&lt;/div&gt;</summary>
		<author><name>Dirk NO2</name></author>	</entry>

	</feed>